What we do
We build and run everything between a seller listing an item and a buyer walking out with it. Internally the platform is called GEMS, the Global Event Management System. Here's what that breaks down into.
The systems we run
- Bidding engineThe hub for everything that happens during a live event: bid ordering, increments, timers, and the outcome of each lot.Go
- Negotiation serviceThe "haggle" itself. Durable negotiation sessions with full transcripts and operation replay, plus the pricing rules that decide what counters are allowed.Go, Postgres, Redis
- Event managerCreating and cataloguing events and lots, with search across all of it.OpenSearch
- Pickup and shippingWhat happens after the gavel: pickup queues at the venue, and shipping for everything else.Go, Postgres
- BillingInvoices and payments, wired to external payment providers and to the rest of the platform over queues.Node.js, Postgres, SQS
- IdentitySign-up, sign-in and the API around it, deployed as infrastructure-as-code.Cognito, Lambda, Terraform
- Web and mobileThe buyer-facing web app and the native iOS and Android app.Next.js, React, Expo
- Data and automationCustomer data, reporting, and the internal automations that keep the operations team out of spreadsheets.Databricks, n8n
How we work
- Everyone touches production
- We're small enough that there is no separate ops team. If you build it, you deploy it, you watch it, and you get the page.
- Boring where it can be, sharp where it must be
- Most of the platform is ordinary services on ordinary AWS. The bidding engine and negotiation service are where the hard problems live, and that's where we spend our care.
- Write it down
- Decisions, incidents and runbooks go in writing. Some of that writing ends up on this site.
- Real money, real clocks
- An auction has a countdown and a winner. Correctness and latency aren't nice-to-haves, and we test for both.
