← WorkIndependent product · real time, multi-instance

Maison Dlala: live auctions where the server is always right
A four-language auction marketplace, Arabic included: idempotent bids inside one atomic write, a server-owned clock, live rooms spread across several instances.
Private showroom, v2.6 — fictional houses, lots and bidders, simulated payments
- Role
- Founder — product, architecture, validation, releases
- Period
- 2025 — 2026
- Status
- Live — maisondlala.com
- Tools
- Next.jsTypeScriptExpressMongoDBRedisSocket.IOLiveKit
01Overview
Selling valuable objects remotely, live, to buyers who must trust every bid: the same price for everyone, the same clock, no bid counted twice — and auction houses running their own catalogues, lots and sales.
An entrepreneurial project (France / Algeria). Version 2 adds professional auction houses alongside members' listings: catalogued, timed and live sales, consignment, settlement between buyer, house, consignor and platform. Four languages: French, Arabic (right to left), English, Spanish.
What I personally did
- 01Defined the product, business rules and roles (owner, manager, auctioneer, cataloguer, support).
- 02Made the architecture calls: MongoDB as the single authority, Redis as transport only, server-owned clock and price.
- 03Wrote the contracts and audits (idempotency, bid privacy, sale state machine, multi-instance) and validated every release.
- 04Ran the releases: tagged versions, showroom then production, public checks after every deployment.
What isn't mine —Implementation relied on AI coding assistants working from my specifications and under my review. So I present my role where it is real: product, architecture, decisions, validation and integration — not every line of code.
02Constraints
- The server owns the truth: the browser never decides a price, a clock or a winner.
- Standalone MongoDB, no multi-document transactions: every guarantee must fit in one atomic write.
- Professional-sale payments blocked for real money until legal and provider checks are done — the interface must not imply otherwise.
- Full right-to-left Arabic, down to mirrored gallery arrows.
03Architecture
- 01
MongoDB decides
A bid is accepted by one atomic conditional update; so is a close, which records the sale in the same write.
- 02
Redis carries
The Socket.IO adapter relays emits between instances. Redis decides nothing, holds no lock, nothing financial depends on it.
- 03
Clients reconcile
An event is a fast hint. Every state carries a version (`rev`): a late or duplicated event can never undo a newer state.
- 04
LiveKit for video
Computer camera plus a phone as second camera; tokens minted per request, no socket event triggers a video operation.
Real-time architecture principle — the code repository stays private.
04Implementation decisions
- 01
Idempotency inside the write that claims the price
Every bid confirmation carries a client key. The key is recorded in the same atomic update as the price: a key can claim only once, on any instance. A retry gets the original receipt; reusing a key for another amount is refused (409), even under concurrency.
- 02
Bid privacy at the server boundary
No bidder id, name, email or phone reaches a browser through a public payload. Bidders become “Bidder 004”: a per-sale rank, stable, not derived from the account id, with no secret to manage.
- 03
Plugging live sales into the existing money path
Two options: a direct order model (rewrite ~20 consumers, every payment provider included) or an adapter that creates, for a live result, the sale record those consumers already expect. Chosen: the adapter — not because it is shorter, but because the alternative rewrote the money path.
- 04
Several instances, one truth
The multi-instance audit found a per-process cache that went wrong after a bid on another instance (removed), an adapter attached after start-up that could fail silently (fixed), and a room join that accepted any name (fixed: a socket can no longer listen to another user's private events).
01 / 05
A bid of 5,500 is confirmed
One key is generated for this confirmation: k·7f3a.
05Challenges
The crash window
Without multi-document transactions, a crash between claiming the price and saving the bid left a raised price with no bid. The key, claimed atomically with the price, lets the next attempt settle it.
The disappearing video
Viewers lost the picture when the seller reloaded the control room. A watchdog re-subscribes the video after 4 seconds; the sequence that failed 4 out of 4 now passes 4 out of 4.
Promise nothing false
A transfer is never called “paid” until someone recorded or confirmed it; statuses separate owed, received, held, released, authorised, recorded and confirmed.
06Evaluation
Every version passes automated suites before it is tagged: backend suites in multi-instance mode, UI suites per journey (live room, bidding, mobile, reconnection), dedicated simulations (sale authorisation, seller-as-viewer), then public checks after deployment and an axe accessibility audit on six pages in French and Arabic.
| Check | Result |
|---|---|
| Production public check (v2.6.2) | 22 / 22 |
| Showroom check, every release | 29 / 29 |
| axe accessibility — 6 pages, fr and ar | 0 violation |
| Layout shift, lot page | CLS 0,29 → 0 |
| JavaScript for a French visitor | 496 → 290 kB |
Release reports, 1 November 2026.
07Outcomes
- v2.6.2 in production and showroom (November 2026): accounts, two-factor authentication, timed and live sales, consignment, role-based professional spaces, four languages.
- Bids that are idempotent, private and consistent across instances.
Limits
- No auction house is approved in production yet: professional sales show empty there. The showroom uses fictional data.
- Online payment is built but switched off; no real transaction is claimed.
- Live sales are not yet tested on real phones over the internet.
The product, for real
Lot photos: Wikimedia Commons, CC licences — full credits in the product.
08What I took from it
- 01Put the guarantee in the write, not around it: a key stored afterwards protects nothing.
- 02The smallest safe design beats the cleanest one when it touches money.
- 03An honest “built, switched off” status beats a feature that only looks like it works.
09Evidence
- Live product
- Public guide, screenshots of the real pages in four languages
- Engineering contracts and reports (DL-2001 to DL-2004)Private repository — walked through in interviews
