TicketBook beta
I’ve just released the third beta version of my Ticket To Ride scorekeeping app on TestFlight. This post documents the app and its features.
General information
In Ticket to Ride, players compete to connect cities with rail lines and assemble their connections into longer multi-city routes. City-to-city connections are color-coded and have associated lengths and point values; players spend train cars to claim them. Routes also have point values. To get the points for a route, a player must commit to completing it, risking deduction of the points from their score if they fail.
Here’s what a typical game board looks like.
Ticket to Ride comes in many versions with maps for the United States, Europe, France, Japan, and India, and more. For my app, I tackled only the U.S. map.
App features
Game setup
Here’s how you set up player names and colors:
Game management
The main game screen contains a status display for each player: their score, longest route, and how many train cars they have left. (The first player to get down to 2 or fewer cars triggers the end of the game, so the train count is really nice to see at a glance. Counting piles of train cars is a pain.)
There’s a screen to add a new connection by selecting the two adjacent cities. Certain connections come in multiple color variations (the colors of connections are separate from the player colors).
Game scoring
Counting player scores is quite a process. At the end of all our games, we typically realized that we’d forgotten to keep track of scores as players added city connections, so we first had to recalculate all of those. After that, there are two additional calculations:
Completed and incomplete routes. For each of a player’s routes, you inspect the board to verify there’s a way to use the player’s connections to travel between its two endpoint cities. Add a route’s point value if it’s completed, and deduct them if not.
Longest continuous route bonus. Find the longest path between two cities via each player’s connections. The player(s) with the longest route get a ten point bonus.
TicketBook does all this work for you—all you have to do is enter your completed and incomplete routes.
Game state details
Even with the app, it’s easy to let things get out of whack. During the game, you can use a player’s detail view to see their current longest continuous route and a complete list of connections.
And if you want to validate that the game is consistent with the state of the board, you can view the connections organized by city and check them off as you inspect the board.
Game history
When you complete a game, it’s saved in the history. You can inspect the details of any past game.
What’s left before release
The app is basically feature complete, and the UX is settled. The main remain work is design-related.
A good app icon. I threw something together using stock SF Symbols, but it’s pretty rough.
Refinements to the UI design. Overall I’m pleased with the general layout, but it’s not polished yet—it could use better spacing and color, at the very least.
App Store-related stuff. Before it’s published, I have to assemble official screenshots and put together all the other materials, such as marketing language and a web page.
Testing
You can get the latest TicketBook beta on TestFlight. If you play Ticket to Ride, please check it out. You can give me feedback through TestFlight or by using my email contact information at the bottom of the page.
A note on vibe coding
I started this project as an experiment in LLM-assisted iOS coding, and I spent a good chunk of the past week mostly working manually to clean up the code and make some sizable upgrades. I could have used Claude Code to do this phase, but I decided to work on my own—partially for the fun of it, and partially because I knew the changes were substantial and complex. Complex coding requirements require 1) a lot of work to set up a detailed prompt, and 2) extensive back-and-forth with the LLM. Beyond all of that, you’re more likely to run into issues or go down the wrong path. I’m unsure if I would have saved much time using Claude Code for this phase.