My startup
ROUND
I'm building a service for sports clubs and grassroots competitions, bringing brackets, registration, and match results together.
256The most participants one bracket can hold
- Period
- 2026.09 ~ Present
- Organization
- Firstage
- Role
- Planning, development, and operations (solo)
- Links
- Key features
- Start by making a bracket without an account. When correcting a result, you can review its effect on later matches.
- Work and results
- Single and double elimination brackets for 2 to 256 participants
- Duplicate requests handled without recording a result twice
- Corrections affecting completed matches reviewed before being applied
- Preview release (0.6.0) ahead of the official launch
- Tech stack
- Next.js
- NestJS
- PostgreSQL
- NATS
- React
- TypeScript
- React-Konva
- Cloudflare Workers
Context
I’m building ROUND for grassroots competitions in sports such as badminton, tennis, and table tennis. The goal is to help students and club players find a match, take part, record their results, and continue with their next challenge.
I’ve built Quick for making brackets without an account, and hosted event features for registration, review, and results. I handle planning, frontend, backend, and deployment.
Decisions and implementation
- A deterministic kernel generates brackets. It supports single and double elimination for 2 to 256 entries, and a bye never produces a fake result or loser. The rule for dropping into the losers’ bracket carries a version.
- Results come in only as commands with a unique ID and an expected version. A repeated request applies once, and a correction that would invalidate an already finished later match is appended only after its impact list has been reviewed.
- Quick runs entirely in the browser without an account. A bracket document is the initial entries plus a list of commands, so recalculating it always gives the same result, and it can be exported and imported as JSON.
- The bracket canvas never changes the data directly. An equivalent view that works with a keyboard and screen readers sits alongside it.
- Each event separates operator, scorer, viewer, finance, and division operator roles, and the server strips private details from public bracket responses.
- Before migrating the production database, I restore a backup locally and confirm that existing data is preserved.
Current state
ROUND is a 0.6.0 prelaunch preview. Search indexing and anonymous bracket publishing are still off, and entry-fee payments and settlement, the mobile app, and match scheduling with court assignment are not built yet.