The Crate
BetaApp · iOS · Android · Web
A music ranking and concert discovery app. You sort the music you love into tiers, then use that crate to compare taste with friends and find concerts by those artists near you.
Free on the web, in the App Store and on Google Play, with its first users. I still change it several times a month, and some things are unfinished, such as push alerts on iPhone.
Part of The Crate. The other part: The ingest pipeline
What it is
You keep three lists, one each for artists, albums and songs. Each record can go into one of four tiers: S for Essential, A for Loved, B for Great and C for Good. You can also order the records inside a tier. Five ranking games help with a long list. Sort It deals records one at a time so you can tier them fast, and The Bracket runs a head-to-head knockout to crown your number one. The crate is drawn in 3D as a wooden record crate, and a tapped record turns over to show its tier.
Once you set your city, the Shows tab lists upcoming concerts by the artists in your crate, in 31 US metro areas. It has a map of venues and a list of festivals. You can mark a show Going or Interested and see which friends are going. Alerts can tell you by push or email when an artist in your crate plays near you.
Your crate can have a public page at your @handle. Comparing crates with a friend lists the records you share and the ones only one of you has. It also gives a match score and the shows you would both like. People who follow each other can send direct messages with records attached. A connector for Claude and ChatGPT lets an assistant read and edit your crate after you sign in with your Crate account. Its show lookups cover Pittsburgh and Philadelphia only.
The Crate has been on the web since June 2026 and in both app stores since July 2026. It is free and has its first users. Concert listings cover those 31 US metro areas only, and outside them the Shows tab offers the nearest covered one. In the 30 days before 4 November 2026, the app's code changed on five days and the concert listings refreshed on 29.
What it looks like

The welcome screen, with a demo crate you can flip through before you sign up. 
Tap a record and it turns over to show its tier and its place in the crate. 
The first setup step after five picks. Each pick drops into the small crate at the top, and the wall fills with related artists.
Why I'm building it
Streaming apps guess your taste from what you play, and a streaming library is gone when you cancel. The Crate keeps the list you choose yourself, in the order you choose. You can export the whole crate as a file at any time.
It began on 1 June 2026 as a top 100 of albums and songs. Since then it has become a place to keep your favorites and share them. The ranking also tells the app which artists matter to you, so it can let you know when they play nearby. For shows, the goal is the social step, a friend seeing that you are going. Tickets are bought on the seller's own site.
The Crate is free and earns nothing. It has no ads and nothing for sale. If it earns money later, my rules allow affiliate links out to ticket sellers and streaming services. They rule out taking a cut of a ticket sale.
How it fits together
When you drop an album into a tier, the app saves the change on your device at once, so the crate works offline. It writes the crate to Firestore in one transaction 2.5 seconds after your last edit, and never more than 12 seconds after a change. Each device merges its copy with the cloud copy record by record. The newest edit to a record wins, and a deleted record stays deleted. A crate over 600 entries is stored as a manifest and 16 smaller documents. If your lists are public, your profile page updates 10 seconds after you stop editing.
Opening Shows starts from the city you set, which the app maps to one of the 31 metro areas. It downloads that metro's list of upcoming concerts as one static file and matches it against your crate on the device. The ranking favors artists you put in higher tiers and also brings in related artists. Those lists come from a separate pipeline with its own page, the Crate ingest pipeline, and a fresh copy lands in the repository most days.
Going and Interested are saved as RSVPs that only you can read. Friends see yours through a Cloud Function that first checks that you are friends. Alerts come from a server job that runs every hour. For everyone with alerts on, it checks the artists in their crate against the concert lists and against Ticketmaster and SeatGeek. It sends push alerts at 12:30 in each person's time zone and writes a weekly email digest, which I read before it goes out.
The hard parts
Building with AI coding agents
About 90% of the commits on main, 1,719 of the 1,903 that are not merges, list a Claude model as co-author. Several agent sessions can work on the repository at once. From 15 to 26 August 2026 the Shows tab was down on the live app. The fix was written the morning the first error report came in, but it stayed on the dev branch for 11 days. The scheduled agent that triages bug reports saw the fix on dev and counted the bug as handled.
Each session now works in its own copy of the code. A risk score sends risky changes to the dev site for my review before they reach the live app. A review queue holds the calls an agent should not make alone, and my answers there bind later sessions. A script lists any fix that has sat on dev for more than 48 hours without reaching main. Since 16 October 2026 the repository has a separate reviewer for pull requests, with a second reviewer that tries to disprove what the first one found. CI also fails a pull request that deletes or skips tests without a written reason. For now the reviewer advises and does not block.
Duplicates across music catalogs
A record can come in from MusicBrainz, from iTunes, from an old Spotify import or typed by name, and each path carries different ids or none. Duplicate checks written by hand put duplicates into real crates three times. In one crate an artist was in twice, once added by name only and once with a catalog id. When the AI connector was told to remove one copy, it matched by name and deleted the wrong one. It removed the copy in the top tier, the one marked as seen live.
Every add and every merge now uses one identity scheme. It prefers the MusicBrainz id, then iTunes, then Spotify, then a normalized name, and a name match never overrides two ids that disagree. Matches the code cannot settle go to a review queue for me to decide. Merges I approve there reach every app, and the first 55 went live on 28 September 2026. A data fix also needs a guard on the server, because older app builds keep running old code.
Spotify closed its API to small apps
Spotify import was meant to be the main way to fill a new crate. When I checked Spotify's rules on 23 June 2026, development mode was capped at 5 users. A higher quota needed a registered organization, a service that had already launched and 250,000 monthly active users. Individuals had not been able to apply since 15 May 2025.
That same day a wall of artists you tap to pick went live as the new first step. On 24 June 2026 I removed Spotify from the app. Search now runs on MusicBrainz and iTunes, and related artists come from Deezer and Last.fm. Other ways to bring in a library, such as a pasted playlist link or a screenshot of Spotify Wrapped, are still on the backlog.
The first App Store review
Apple turned down the first build on four points. Two of them were real album covers in the store screenshots and the phrase "free to start" in the description, which Apple asked me to explain.
Since then the store screenshots show made-up artists with covers drawn by a script, and the description says the app is completely free. I fixed the four points on 3 July 2026, and version 1.0 went live on 6 July 2026.
Store releases lag the web
Web changes reach the phone apps as a signed bundle that each app downloads and checks, so they do not wait for store review. The first Android build missed every one of them. Every bundle asked for app version 1.1, the build was 1.0, and it refused each update silently. A corrected bundle on 8 July 2026 got it updating again.
Native changes still need a store release. The iPhone app registered the wrong kind of push token, so Firebase Cloud Messaging rejected it and no push alert ever reached an iPhone. I fixed that on 2 October 2026, but the fix is native code. On 4 November 2026 the App Store still had version 1.3, from 9 July 2026. Failed pushes were also counted as sent, which used up a person's seven-day alert allowance, until a fix on 1 October 2026.
Crates far bigger than planned
I built the crate for about 100 records per list, and some real crates hold 1,000 to more than 2,100. In September 2026 a profile with 1,341 records was reported to crash the app on phones that opened it. Another crate had reached 1,001 KB of Firestore's 1,024 KB document limit, and past that limit every save fails.
On 30 September 2026 the 3D crate began drawing about 128 records in full and the rest as cheap copies. At 545 records it now uses 25 MB of memory for record images instead of 227 MB, and 92 draw calls a frame instead of 1,110. Saves are now batched and long lists load 60 rows at a time. Since 5 October 2026 a crate over 600 entries is split into a manifest and 16 smaller documents. Every size limit in the code now has to hold at 2,000 records.
What it runs on
| Layer | What | Notes |
|---|---|---|
| App | React 18, TypeScript and Vite | One web app runs in the browser and inside both phone apps. |
| Phone apps | Capacitor 8 for iOS and Android | The native code is about 860 lines of Swift and 750 of Java, and most of it is the update engine. |
| Updates | Signed over-the-air bundles | Web changes reach installed apps without a store release, and each app checks a bundle's Ed25519 signature before it applies it. |
| 3D crate | three.js | A big crate draws about 128 records in full and the rest as cheap copies. |
| Data | Firestore | Each device keeps its own copy of the crate and merges it with the cloud copy record by record. |
| Server | Cloud Functions on Node 22 | 28 functions, among them the music and ticket API proxies, show alerts, link previews and account deletion. |
| Sign-in | Firebase Auth and App Check | Email, Google and Apple accounts, with App Attest on iOS and Play Integrity on Android. |
| Music data | MusicBrainz, iTunes, Deezer and Last.fm | MusicBrainz ids anchor each record's identity, and Deezer and Last.fm supply related artists. |
| Concert data | Static feeds for 31 metro areas, plus Ticketmaster and SeatGeek | The feeds come from the separate ingest pipeline, and the ticket API keys stay on the server. |
| AI connector | An MCP server on Cloud Run, with OAuth 2.1 | It reuses the app's identity and merge code, so an edit from an assistant syncs like one made in the app. |
| Deploys and tests | GitHub Actions on a self-hosted Mac, Node's test runner, Firebase emulators and Playwright | A merge to main runs the full test suite and the build before anything deploys. |
- commits
- 2,379
- lines of source, tests included
- 249,735
- Cloud Functions
- 28
- test files
- 291
Counts read from the repository on 4 Nov 2026.
Links
- Privacy Policy · Last updated 1 October 2026.
- Terms of Service · Last updated 20 June 2026.
- Support · How to reach me, plus answers to common questions.
Other projects
Crate ingest pipeline
In developmentA pipeline that finds concerts on the venues' and promoters' own pages and in the ticketing feeds, and turns them into one clean record for each show. I am building it to feed the concert listings in The Crate, and later to offer as a dataset of its own.
Data pipeline
570 commitssince Oct 2026LampLit
BetaA phone app that works like a light on your porch. Turn your light on when you're up for company, and the friends who see it can knock or text you.
App · Android · iOS in review
539 commitssince Sep 2026MattressBuilder
PreviewA website for designing your own mattress in 3D. You stack layers of wool, latex, foam and coils, drag them into the order you want, and watch the bed and its price change as you go.
Web app
34 commitssince May 2026