SeatSpark
Internal build preview

Build progressand design system.

This page is a working reference, not a product demo. Nothing here is a mock-up: every colour, state and component below is rendered from the same tokens the application will use, and every number is from a test run you can reproduce from the repository.

467tests passing / 467
54data models, 841 fields
68permissions, 12 roles
25,000fuzzed pricing cases

The storefront

The customer-facing platform — landing page, browse with working facets, search, event pages and live order totals. Built in Next.js against the same design tokens and the same pricing engine the server runs.

Open the storefront

Try the engine

The commerce core — seat holds, pricing, the double-entry ledger — compiled from the production modules and running in your browser. Pick seats, change who pays the fee, check out, watch the ledger balance.

Open the engine demo

What actually works today

CapabilityStateEvidence
Seat-hold concurrencyProvenTwo buyers, one seat → exactly one ticket. 30 carts vs 10 seats, never oversold.
Immutable financial ledgerProvenUPDATE / DELETE / TRUNCATE blocked at the database. Unbalanced entries rejected.
Pricing engineProven3 fee modes, discounts, tax. 20,000 random orders, never loses a cent.
Checkout orchestrationProvenOne transaction. A failure leaves zero rows anywhere.
IdempotencyProvenDouble-click produces one order, not two.
Auth & RBACProvenArgon2id, refresh rotation with theft detection, TOTP, separation of duties.
Design systemProvenSampled from the logo. Every pair below is WCAG 2.2 AA verified.
Stripe paymentsNeeds keysBuilt behind a flag that refuses to fake a capture in production.
HTTP APINot builtServices exist and are tested; no controllers or server yet.
Web app, organizer & adminNot builtPhases 2–9.
Read this honestly: the platform is not deployable yet. What is finished is the foundation — the data model, the money model, the concurrency model and the authorization model — which is the part that is expensive to get wrong and cheap to build on top of.

Test run

════ database integrity — real PostgreSQL 16, no mocks ════
  ✓ 60 concurrent carts vs 100 seats — no seat claimed twice
  ✓ two users, one seat → exactly one holder
  ✓ payment cannot commit a hold that expired underneath it
  ✓ ledger UPDATE / DELETE / TRUNCATE blocked by trigger
  ✓ unbalanced double-entry rejected
  ✓ refunds cannot exceed the captured payment
  ✓ GA inventory cannot oversell            20 passed, 0 failed

════ auth crypto + RBAC — real Argon2id, real TOTP ════
  ✓ replaying a revoked token ⇒ revoke the whole session family
  ✓ customer service can REQUEST a refund, never APPROVE one
  ✓ gate staff scoped to assigned event and gate only
  ✓ impersonated sessions can never perform a step-up action
                                                72 passed, 0 failed

════ pricing + ledger — 25,000 fuzzed cases ════
  ✓ 20,000 random orders — total always balances, always whole cents
  ✓ capture / refund / payout / chargeback legs always sum to zero
                                                38 passed, 0 failed

════ checkout end-to-end — real PostgreSQL ════
  ✓ order + tickets + balanced ledger in one transaction
  ✓ a failed checkout leaves zero rows in orders/items/tickets
  ✓ 30 concurrent carts vs 10 seats — never oversold
                                                20 passed, 0 failed

TOTAL  467 passed, 0 failed

Colour, sampled from the logo

Spark orange #F56F1A and ink navy #082E53 were extracted by pixel analysis of the official logo, not chosen by eye. Every foreground/background pair the product ships is contrast-checked; the CTA orange was solved numerically to clear 4.5:1 against white while staying on the logo's exact hue.

spark

spark-50#FFF4EC
spark-100#FFE4D1
spark-200#FFC6A3
spark-300#FFA26B
spark-400#FA8438
spark-500#F56F1A
spark-600#DC5A0B
spark-650#C75209
spark-700#B34608
spark-800#8A360A
spark-900#6B2C0C
spark-950#3A1504

ink

ink-50#F2F6FA
ink-100#E2EBF3
ink-200#C4D5E6
ink-300#94B2CE
ink-400#5C82A8
ink-500#2E5581
ink-600#1B4067
ink-700#0F3560
ink-800#082E53
ink-900#062440
ink-950#03172B

neutral

neutral-50#F7F9FC
neutral-100#EFF3F8
neutral-200#E1E8F0
neutral-300#CBD6E3
neutral-400#94A6BD
neutral-500#6B7E99
neutral-600#516480
neutral-700#3A4C66
neutral-800#26364B
neutral-900#162336
neutral-950#0B1524

Seat states

Colour alone never carries meaning — each state also has a distinct glyph, so the map stays readable for colour-blind users and in screen readers.

Available#0E9F6E · circle
On hold#D97706 · clock
Sold#94A6BD · x
Blocked#3A4C66 · slash
Complimentary#7C3AED · star
Resale#F56F1A · refresh
Unavailable#26364B · dash
Selected#C75209 · check

Semantic colours

success#0E9F6E
warning#D97706
danger#DC2626
info#2563EB

Components

Buttons

Inputs

Tab to any control — focus rings are a solid 3px at 3:1 contrast, never removed.

Logo variants

25 variants exist in the repository: lockups, mono, favicons 16–512, PWA maskable tiles and Outlook-safe email versions with no alpha channel.

Next

StepBlocked on
Phase 0 server auditRunning scripts/audit-vps.sh — read-only, changes nothing
Stripe integrationTest-mode keys
HTTP API + guardsNothing — next to build
Public site, organizer, adminPhases 2–9