A professional, real-time Dutch auction platform built for high-stakes transactions.
Built for startup M&A, equity dispute resolution, and cap table clean-up. No spreadsheets, no back-and-forth emails β just one transparent session with a documented outcome.
- Co-founder Buyouts: Resolve equity disputes with a transparent price-discovery mechanism.
- Cap Table Clean-up: Efficiently handle secondary share sales among investors.
- Startup M&A: Streamline asset sales or pro-rata allocations in oversubscribed rounds.
- B2B Procurement: Enable supplier bid-down on contracts with real-time feedback.
β Go for live usage (latest QA pass found no launch blockers).
See:
SECURITY_HARDENING_AUDIT.md(Security-first architecture)LAUNCH_RUNBOOK.md(Operational readiness)
This app runs a descending-price (Dutch) auction where participants accept the current price to win. It is designed to be "operator-friendly" with both technical and non-technical configuration paths.
Remote mode is powered by Supabase Realtime.
- Room metadata:
rooms - Participant claims:
room_participants - Room state:
auction_rooms(includes last event, status, and full state snapshot) - Event log:
auction_events - Room snapshots: full state (price, history, config, participants) persisted for late-joiner sync and authoritative state recovery
- Descending-price auction flow
- Configurable start price, floor price, decrement amount, and tick interval (seconds or minutes with quick presets: 10s, 30s, 1m, 5m)
- Host-only remote controls (start/reset)
- Participant claim locks (no duplicate slot claims)
- Start gating until all required participants are claimed
- Winner capture at click-time price with bid price-lock protection
- Real-time participant presence (join/leave toasts) and connection status indicators
- Participant readiness visibility (READY/PASSED states)
- Floor-reached / no-deal terminal state with clear UI
- Authoritative room state snapshots (ensures late joiners sync correctly)
- Auction history view
- Sound cues (start, drop, bid, end)
- Setup modal for runtime reconfiguration
- Configurable participant initials (comma-separated)
- In-app toasts for user-facing errors
You can configure auction behavior in two ways.
Use the Setup button in the header to adjust:
- start price
- floor price
- decrement amount
- drop interval (seconds or minutes, with presets: 10s, 30s, 1m, 5m)
- number of participants
- participant initials (comma-separated)
Validation enforces:
- floor price must be less than start price
- decrement amount must not exceed price range (start - floor)
- participant initials count must match participant count
- all numeric values must be positive
Set startup defaults before the app loads:
window.AUCTION_SETUP = {
// Supabase public config (safe client-side)
supabaseUrl: 'https://<project-ref>.supabase.co',
supabaseAnonKey: 'sb_publishable_...',
startPrice: 20000,
floorPrice: 1000,
decrementAmount: 1000,
dropIntervalMs: 10000,
participantCount: 3,
participants: [
{ id: '1', name: 'EF', color: 'bg-rose-500' },
{ id: '2', name: 'EG', color: 'bg-indigo-500' },
{ id: '3', name: 'AG', color: 'bg-emerald-500' },
],
};If participantCount is greater than participants.length, extra participants are generated automatically.
- React 19
- TypeScript
- Vite
- Tailwind CSS (CDN)
- Supabase (Postgres + Realtime + Anonymous Auth)
.
βββ App.tsx
βββ constants.ts
βββ types.ts
βββ components/
β βββ Ticker.tsx
β βββ FounderButton.tsx
βββ services/
β βββ soundService.ts
β βββ syncService.ts
βββ public/
β βββ setup.js
β βββ favicon.ico
β βββ favicon.png
βββ supabase_phase0.sql
βββ SECURITY_HARDENING_AUDIT.md
βββ LAUNCH_RUNBOOK.md
βββ .github/workflows/
βββ deploy-pages.yml
- Node.js 18+ (Node 20 recommended)
- npm
VITE_SUPABASE_URL=...
VITE_SUPABASE_ANON_KEY=...syncService supports both:
VITE_SUPABASE_*env varswindow.AUCTION_SETUP.supabaseUrl+supabaseAnonKey
npm install
npm run devnpm run build
npm run preview- Enable Anonymous Auth.
- Run
supabase_phase0.sqlin Supabase SQL Editor. - Verify tables are in publication
supabase_realtime.
Workflow:
.github/workflows/deploy-pages.yml
Setup:
- Settings β Pages β Source = GitHub Actions
- Settings β Secrets and variables β Actions
VITE_SUPABASE_URLVITE_SUPABASE_ANON_KEY
- Push to
main
Site URL:
https://<username>.github.io/<repo-name>/
This project and its documentation are for technical and informational purposes only and do not constitute legal advice. Legal enforceability and compliance obligations vary by jurisdiction and use case. Consult qualified legal counsel before relying on this software for legally binding transactions.
Pull requests and issues are welcome.
This project is licensed under the MIT License - see the LICENSE file for details.
