Inspiration
Bracket maker apps are an old, crowded category, and that is exactly why I built one. Every time I needed to run a tournament, I tried the existing apps and hit the same walls: designs that look ten years old, byes that break the bracket (10 teams getting 6 byes, a "BYE" slot eating a real team), double elimination that crashes with 17+ teams, purchases stuck on "Please wait", zoom that fights you on a big bracket, and a Swiss system that is either missing or awkward to run.
It was not just me. I pulled and sorted 700 App Store reviews of the two leading apps: more than half were negative, and the biggest clusters were aggressive paywalls, crashes and lost data, broken byes and formats, and ads. So instead of hunting for an empty niche, I decided to build the top-notch version of an app people already search for: a modern design, brackets that are always correct, and zero friction.
What it does
Bracket Pad lets an organizer set up a tournament in under a minute, run it by tapping winners and share a clean bracket image with everyone. Only the organizer needs the app.
- Five formats: single elimination, double elimination, round robin, groups + playoffs, and Swiss with Buchholz tiebreaks, each for 2 to 256 participants.
- Fast setup: paste a whole list of names at once, drag participants to set seeds, or shuffle people into random teams.
- One-tap scoring: tap a winner or enter a score and the next match is ready. Undo clears only the matches that depended on it.
- A bracket you can actually read: smooth pinch zoom from fit-to-screen up to 2.5x, plus 150% / 100% / 50% / Fit all presets.
- Share: export the bracket as PNG or PDF, always rendered at full size whatever the zoom.
- Private by design: no account, no ads, works fully offline. Tournaments stay on the device, with an iCloud Drive mirror that survives a reinstall.
- Make it yours: light and dark themes, nine main colors plus a custom picker, and 30 languages you can switch in Settings.
- Play again: rerun a finished tournament with the same participants in one tap.
How I built it
Bracket Pad is a Kotlin Multiplatform app with a Compose Multiplatform UI. The bracket engine, UI, navigation, persistence and billing are one shared codebase; the iOS and Android apps are thin shells.
- Bracket engine in pure Kotlin: seeding, byes, double elimination drops, group-to-playoff seeding and Swiss pairing, all covered by tests.
- Room + SQLite, storing each tournament as a versioned JSON document, so a file from a newer format never crashes an older build: it is quarantined instead.
- RevenueCat KMP (
purchases-kmp) for every purchase: one entitlement, the same Kotlin code for the App Store and Google Play. - Firebase Crashlytics, Remote Config (forced updates) and Analytics through GitLive's multiplatform bindings.
- fastlane and small Python tools for store metadata in 36 locales, localized screenshots and worldwide price sync.
How it makes money
The first tournament is free, with every feature, and stays usable forever. The paywall appears only when you tap New tournament after that, before any data is entered, so nobody loses work to it. Three options unlock the same thing, unlimited tournaments:
- Lifetime, $24.99, for clubs and regular organizers who do not want a subscription;
- Yearly, $14.99, the best value per month;
- Tournament Pass, $4.99 for 30 days, not a subscription, for someone running a single event.
Prices outside the US follow income bands (1x, 0.6x or 0.3x of the US price), so the app is fair in India or Ukraine, not only in the US.
Challenges I ran into
- Swiss pairing. Pairing within score groups, floating a player down when a group is odd and avoiding rematches is a search that can fail (16 players asked for 15 rounds cannot avoid repeats), so the engine has to degrade gracefully. Counting a bye in Buchholz fixed a measured 2.5-5 point penalty for players who sat out, and correcting an earlier result rebuilds the later rounds deterministically.
- A 30-day pass the stores cannot express. Neither store sells "one purchase, 30 days of access", so the pass is a non-renewing product the app times itself: each purchase extends access to max(now, passUntil) + 30 days, and RevenueCat restores it after a reinstall.
- Worldwide pricing via API. Changing one country re-posts the whole schedule of 130 prices, and a new US base price silently wipes every per-country price, so the order of operations matters.
- Right-to-left languages. An Arabic layout mirrored the bracket itself; the canvas is now pinned left to right while the rest of the UI follows the locale.
- Colors that always pass contrast. The main-color generator matches luminance in OKLab, so any custom color keeps every text and accent readable.
Accomplishments that I'm proud of
Bracket Pad launched on the App Store on September 3, 2026. In under three weeks it reached 450 first-time downloads, and people in six countries have already paid for it: the United States, France, Germany, Japan, Thailand and Chile. All three products sell. In a category full of long-established and free apps, that is the proof I wanted: a better-made app wins buyers even when alternatives already exist.
What I learned
A crowded category is not a closed one. People do not need another bracket app, they need one that works: correct byes, no lost data, a purchase that goes through and a design that feels current. Reading hundreds of competitor reviews before writing code told me exactly what to build and what never to do: ads, surprise paywalls, and a subscription as the only option.
What's next for Bracket Pad
The Android release on Google Play, the Swiss system reaching every user with version 1.2, and more tournament tools driven by what organizers ask for.
Built With
- android-studio
- apple-search-ads
- compose-multiplatform
- crashlytics
- fastlane
- firebase
- firebase-remote-config
- icloud
- kotlin
- kotlin-multiplatform
- python
- revenuecat
- room
- sqlite
- swift
- xcode

Log in or sign up for Devpost to join the conversation.