02 / iOS app2026In TestFlight

Tournify

The phone never decides who won.

RoleSolo. Bracket logic, realtime sync, organiser UX.
Built withExpo, Supabase, Deno, Realtime
Where it isIn TestFlight, no tournament run through it yet

Why I built it

Local tournaments fall apart in the same place: the scores. Someone reports a result twice, someone reports it wrong, and the bracket on the whiteboard stops agreeing with the bracket in the chat.

Organisers do not need another bracket generator. They need one place where a result is written once and everyone sees the same thing a second later, including the person who just lost.

What I built

One write path

Every result goes through a single edge function that checks the row version before advancing anyone. Two people submitting the same match get the same outcome, not two.

Signups that are not a spreadsheet

Teams register in the app, so the bracket is generated from real rosters and a late drop out reseeds instead of leaving a ghost in round one.

Built for the person at the front

The organiser view assumes one hand and a loud room. Large targets, no nested menus, and the next unreported match always at the top.

The hard part

Deciding what is allowed to be undone

Reversing a reported score after the next round has started is either a rollback or a lie. The bracket keeps an event trail, so a correction shows up as a visible amendment rather than a silent rewrite.

What I would do next

Run one. The build is in TestFlight but no tournament has gone through it yet, which means everything above is a design decision rather than a result, and a loud room is the only thing that can tell me which of them hold. Offline reporting comes after that, because gym wifi is worse than anyone plans for and a queued write would remove the last reason to fall back to paper.

NextTiny Challenges