Skip to content

← WorkIndependent product · real time, multi-instance

Maison Dlala live sale room, buyer view

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

BROWSERSseller · buyers · visitors · camera phonesSocket.IO · websocket, polling fallbackAPI · AExpress + Socket.IOAPI · Bidentical codeREDIS PUB/SUBcarries, decides nothingMONGODB — THE AUTHORITYbids, prices, end times, status, winner, sale, payments, revevery state versioned (rev) — a late event never undoes a newer state
  1. 01

    MongoDB decides

    A bid is accepted by one atomic conditional update; so is a close, which records the sale in the same write.

  2. 02

    Redis carries

    The Socket.IO adapter relays emits between instances. Redis decides nothing, holds no lock, nothing financial depends on it.

  3. 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.

  4. 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

  1. 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.

  2. 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.

  3. 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.

  4. 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).

BrowserAPI · instance AAPI · instance BMongoDB✕

01 / 05

A bid of 5,500 is confirmed

One key is generated for this confirmation: k·7f3a.

Same key, different amount → 409 IDEMPOTENCY_KEY_REUSED, even under concurrency.

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.

CheckResult
Production public check (v2.6.2)22 / 22
Showroom check, every release29 / 29
axe accessibility — 6 pages, fr and ar0 violation
Layout shift, lot pageCLS 0,29 → 0
JavaScript for a French visitor496 → 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

Home — the object as the hero
Lot — price, bids and the server's countdown
Live, phone — one confirmation per bid
Arabic, right to left — outbid
Professional space — catalogue
Checkout — simulated in the showroom

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