Skip to content
Hooney
한국어

Products · Preview

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

Period
2026.09 ~ Present
Organization
Firstage
Role
Planning, development, and operations (solo)
The ROUND home screen, with the headline 'From brackets to registration, run the event in one place.' beside a sample bracket for a top 8.

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

  • Next.js
  • React
  • TypeScript
  • React-Konva
  • NestJS
  • PostgreSQL
  • NATS
  • Cloudflare Workers

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.