High Cheese for iPhone and Android

A whole game, scored with one thumb.

Three apps, one download, and they only make sense standing next to each other.

  • The scorecard. A scorekeeping instrument that takes a game pitch by pitch and asks nothing at all of the signal at a field that has none.
  • Free agents. A deck of players near you, because the ninth man has always had to come from somewhere and that somewhere has historically been the parking lot.
  • The Wire. Where the league talks to itself: roster moves, tryouts, tournament entries, the final that posts itself the second a book is finalized, and one unresolved argument about a call from June.

Underneath the three of them, quietly, your profile, your roster, your lineup, your season, and every at bat you ever took, on the account you already have here.

The Android app is on Google Play. iPhone builds still go out through internal distribution while the last of it is finished. Make the account now: everything you fill in on the web is already there when the app opens.

The scorecard in the app: the scoreboard slat, the field with all nine fielders on it, and the five pitch keys.
The field, the slat, and five keys. Nothing else is competing for the space.
Scoring

Five keys. That is the whole instrument.

Ball, called strike, swinging strike, foul, and ball in play. Four of them commit the instant you press them. Only ball in play asks a second question. They sit at the bottom of the screen because that is the part of a phone a thumb reaches without the other hand getting involved, they are large, and they never move, so you can find them by feel while you watch the thing you came to watch.

Try the keys

Nobody out, nobody on. Press a key.

Nobody presses a key called walk or strikeout. Three strikes is an out and four balls is a base, and the count resolves itself. The phone records pitches; the arithmetic belongs to the server, so two people scoring the same game cannot drift apart on it.

Ball in play, in five steps that collapse

  1. ContactGround ball, line drive, fly ball, pop up, bunt. One tap.
  2. ResultOnly the results that can follow that contact. A pop up is not offered as a triple.
  3. LocationTouch the field where it landed. Optional, always, and a game scored without a single one is still correctly scored.
  4. FieldersWho handled it, in order, for anything that ended in an out or a misplay. A clean single asks nobody.
  5. RunnersWhere everyone finished, on the server preview rather than your arithmetic.

A home run never asks where the runners went. A play with the bases empty skips that step entirely. Five is the ceiling, not the ritual.

The rest of baseball is one tap deeper

Hit by pitch
The at bat is over and he is standing on first.
Intentional walk
Four fingers, no pitches to record.
Dropped third strike
The row says which one it is before you press it: reached first, or out anyway because first was occupied with fewer than two away.
Balk
Everybody moves up and nobody swung.
Wild pitch
Charged to the arm.
Passed ball
Charged to the mitt.

Runners are tapped where they stand

Stole the base
Safe, and it counts as a steal.
Caught stealing
Thrown out going for it.
Picked off
Retired at the base he was standing on.
Took the base
Nobody made a throw, so no steal is credited.

The base he is leaving is never sent from the phone. The server reads it from the game, so a screen that has fallen a play behind cannot advance a man from a bag he left two pitches ago.

Changes, with the reasons attached

Pinch hit from the batter row, go to the bullpen from the pitcher row. The bench and the arms come back already settled: ejections, re-entry, and who has been used are rules with exactly one home, and it is not this phone.

A player who cannot come in is still listed, with the reason written beside him. Somebody scanning for a name that simply is not there has no way to tell a rule from a bug.

The field

Grass, dirt, chalk, and nine names.

An earlier version drew the field in three shades of navy on a navy screen. Defensible on a monitor, unreadable at a chain link fence in July, where the whole thing collapsed into one blue smear. So it is a ballfield: mown green, tan infield, white lines, and the dark surround exists to make it the brightest thing you are holding.

  • Pinch to zoom and drag to pan, because a phone is smaller than a ballpark.
  • Fielders carry their own names and faces, and the mound follows the game rather than the lineup.
  • The batter stands in the box he actually hits from. A switch hitter changes sides when the pitcher changes.
  • Runners ride the bags. An occupied base is gold, and gold on this screen only ever means live.
  • Touch where a ball landed and it is stored as angle and distance, so the mark still means the same thing after the field art is redrawn.
  • Every category on the spray chart carries a shape as well as a fill, so the chart still reads for anyone the colours do not separate for.
The scorecard in the app: the scoreboard slat, the field with all nine fielders on it, and the five pitch keys.
Mown green, tan dirt, white chalk, and every man standing on it named.
No signal

The field has no bars. That is the normal case.

Nothing in the app treats being offline as a failure. Every play is written to a real database on the phone before a request is ever attempted, so a dead battery costs you nothing that was already recorded, and a game scored in a river valley drains to the server when you get back to the car.

SavedThe server has it. Nothing is waiting.
Offline11 plays on this phone, going out the moment there is a bar. This is a normal state, not an error.
Needs reviewThe server refused one, in its own words, and a person decides whether to keep it or throw it away.

Write first, send second

The local log is SQLite, chosen because this needs transactions and ordered reads. Losing one row here loses a play off somebody’s scorecard, which is the single failure the whole design exists to prevent.

Retry forever, safely

Each play carries its own identifier, so a resend whose first attempt actually landed comes back as a duplicate instead of scoring the run twice. The phone never has to work out whether it already succeeded.

No conflict is settled quietly

A play the server refuses stops being the sync loop’s problem and becomes yours, with the server’s own sentence attached. Dropping it silently would lose a play. Forcing it silently would corrupt a game.

The books

Everybody keeps their own. The majority is the record.

A game gets as many books as it gets scorekeepers: staff on both sides, a player sitting out with a hamstring, somebody’s father in a folding chair. You finalize yours. Nobody approves it, nobody else waits on you, and there is no step after that one.

  • Two books say single and one says error, so it was a single.
  • One book on a game is its own majority, and that is a complete answer.
  • Finalizing a month late is normal and costs nothing. The book joins the consensus that day and the record moves with it.
  • You can reopen your own book. You can never arbitrate somebody else’s account of what they saw.

A box score that refuses to lie: an inning nobody batted in prints a dash rather than a nought, and a rate with no denominator prints a dash rather than .000. Both come back empty from the server precisely so the screen cannot round them into something that reads like a fact.

The box score in the app: the line score by inning with runs, hits and errors, then one side's batting with AB, R, H, RBI, BB, SO and average, with pitching, fielding and spray a tap away.
One book, finalized. Where several disagree, the majority is what the record keeps.
Discovery

Nine spots. You have six, and one of them is a maybe.

Discovery is the part that fixes that, and it holds four things: Swing, Explore, Chat and On Deck. Everyone in there is an adult who still wants to play, which is a narrower and far more useful population than any general purpose network will hand you.

Swing, on actual humans

A deck of players near you, drawn as holographic cards with position, bats, throws, age and background on the back. Pass, mark interest, or spend a star on somebody you really want. The last five swipes can be taken back, which is more forgiveness than the sport itself offers.

Explore, when a deck is too slow

Browse members, tournaments and equipment by category. Filter members by bats, throws and primary position; filter gear by price, colour and brand. Free agents get their own switch.

On Deck

Two lists and no ambiguity: who has expressed interest in you, and who you are still waiting on. Nothing sits in a feed pretending to be both.

Chat, then a real invitation

Message anyone you have matched with. When it turns serious, send a roster invitation from inside the thread with the team, the membership tier and the title attached, and they accept or decline it there.

Discovery in the app: one player's holographic card, undo, pass, all-star, interest and share beneath it, and Swing, Explore, Chat and On Deck along the bottom of the screen.
The deck itself, off a phone. Interest both ways sets off a home run, and both ways with a star is a grand slam.
The Wire

What the league is saying, in one column.

Players post, and so do teams and league offices. Rows are separated by a hairline rather than boxed into cards, because a feed read with a thumb is a column of text and stacked rectangles are borders arguing with the words inside them.

  • League is your own. Nearby is whoever is playing within range of you. National is deliberately everything outside your league. Following is only the accounts you asked for.
  • Each scope is its own question to the server, so switching one clears the rows rather than leaving another league’s posts under your league’s tab.
  • A finalized game posts itself, with the runs, hits and errors on both sides, so a result reaches the league without anyone typing it out.
  • Reply, relay, like, save, share. Teams and league offices wear a monogram instead of a face, and a manager or an officer wears the chip that says so.
  • Write in one field, 280 characters, with a finalized game or a photo or a clip attached. Tournaments carry whether registration is still open.
  • An empty league says so in its own words rather than showing a blank page.
The Wire in the app: the League, Nearby, National and Following scopes, and two posts from a manager with reply, relay, like, save and share under each.
Four scopes, and each one is a different question rather than a different filter.
Your team

The roster, and the order you keep rewriting.

Sort the roster by number, name, position, bats or throws. Build the batting order by hand, name a designated hitter, set the pitchers and the bench, and save it. Every man in the order needs a position before it will save, which is a rule that exists because somebody always forgets the left fielder.

  • Pick both sides on a blank card straight from the league, and the second side opens on the same league because both teams in a game are in one.
  • Lists are drawn in the sheet with dividers and a scrollable column, never behind an opaque native menu.
  • Send roster invitations by tier and title, and see who has not answered yet.
The batting order sheet in the app: nine slots with each man's position and number, a designated hitter marked, the starting pitcher named underneath, and Save Lineup.
Hold a name and drag it where it belongs. The designated hitter is marked, and the man on the mound is named underneath.
Schedule

A month at a time, and every game keeps its paperwork.

The calendar knows which game is yours today, which is why signing in lands you on the field with the right card already open rather than on a menu asking you to go and find it.

  • A card per day, with the month and the time zone both named. A day with nothing on it says so rather than being quietly left out of the list.
  • Every game reads first pitch, status, the fixture written away at home, and the age bracket it is played under. Today wears a badge.
  • Start a game, call one off, or delete one, each with a reason recorded.
  • Finalized games keep their logs: play by play with the factual sentence first and the commentary underneath it, plus the full box score.
  • Newest play first during a game, because the last thing that happened is the thing anyone is looking for.
The schedule in the app: August 2026 in America/Chicago, a card per day, today badged, and two scheduled games with their first pitch and age bracket.
A day with nothing on it says so, rather than being left out of the month.
Your record

A profile that outlives the season that made it.

Headshot, positions, bats and throws, height and weight, where you played before, and whether you are looking. Fill it in and the Scouting Passport unlocks, which is the app’s way of saying a manager can now read your whole card without messaging you first.

  • Set how far you are willing to travel, and the age range you want to play in.
  • Your card is holographic on the front and a full scouting page on the back.
  • Membership tiers run Rookie, Veteran, All-Star and Hall of Fame, bought through the native payment sheet and changed through the billing portal.
  • Delete the account from inside the app. No email, no waiting on anyone.

Reading the current prices from Stripe.

Hosting a tournament

Five steps, in this order, and you can leave halfway through: Identity, Dates, Fees, Branding, Contact. Regional or national, open, closed or invite only, with your own logo on the card that goes out into everybody else’s deck.

Scouting PassportHC-4K7QP2
90%
  • Headshot20
  • Primary position15
  • Bats / Throws10
  • Location20
  • Baseball background15
  • Background history10
  • Team / Free agent status10

Ten points from a gem that unlocks nothing you can buy. It says a manager can read your whole card without having to message you first, which is the only currency that matters here.

Seven things, a hundred points, and a gem at the end of it.
Every screen

Have a look around.

Nine of the screens you will spend your season in, seven of them straight off a phone. Tap through them.

What it runs on

The specification, without the marketing adjectives.

iPhone and AndroidOne codebase, both platforms, portrait. Expo 56 on React Native 0.85.
SQLite on the deviceThe outbox is a real database with real transactions, not a key value store holding your afternoon.
Google or emailSign in with Google, or an address and a password. Eighteen and over, confirmed by email.
Location, if you allow itOnly to sort the deck by how far away somebody is. Deny it and the app still works.
HapticsThe keys answer your thumb, because you are looking at the game rather than the glass.
StripeThe native payment sheet for a membership, and the billing portal for changing your mind.

Somewhere near you it is the bottom of the seventh and nobody wrote any of it down.

That is the part this fixes. Make the profile on the web, and the app opens with your season already in it.

Seven of the panels on this page are screenshots. The chat thread and the passport are drawn from the app’s own components, and the players named on those two are invented, so that nobody’s real batting average ends up in an advertisement.