ROUND
I'm building a service that connects brackets, registration, and results for grassroots sports events in one flow.
256The most participants one bracket can hold
- 2026.09 ~ Present
- Firstage
- Planning, development, and operations (solo)

Core value
Anyone can make a bracket without signing up, and correcting a result never leaves past records and the next matches out of sync.
Outcomes
- Brackets for 2 to 256 participants, with single elimination or double elimination (out after two losses)
- Sending the same result twice records it only once
- A correction that affects matches already played is added to the record only after its impact is reviewed
- A preview release (0.6.0) before the official launch
Tech stack
Context
ROUND is for small grassroots competitions in sports like badminton, tennis, and table tennis. The goal is an experience where students and club players find a suitable match, take part, keep their results, and choose their next challenge. It has two parts: Quick, which builds a bracket instantly without an account, and hosted events, which cover registration, review, and results. I handle planning, frontend, backend, and deployment alone.
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.
