Usage
Jobs over time
Completed and failed, by period.
Stem choice
Which split people actually pick.
Extras used
How often lyrics and chord analysis are asked for. Both add processing time, so this is worth watching.
Processing time by stem count
Average for a completed job. More stems means more GPU time, which is where the cost actually goes.
What people upload
Length and size of the tracks being sent. Longer tracks cost more to process, so a shift here shows up in the bill before it shows up anywhere else.
Free against paid
iOS against Android
Usage spread, last 24 hours
How many devices ran how many jobs. A healthy day is almost all ones and twos; a row appearing at the top end is what is worth acting on.
Recent jobs
Newest first. This is where you look when someone reports a split that never arrived — find it by id and see what actually happened to it.
Everything for a tier in one place: which endpoint it runs on, and what it is allowed to do. Changes take about a minute to reach every location — no app release.
Applies to both tiers
Network
Nobody browses from a server rack, so traffic from DigitalOcean, OVH, Hetzner and the like is a VPN, a proxy or a script. Reads the network operator only — no location is involved.
Signed URL lifetime
How long the one-time links the app uses to reach storage stay valid. The app holds no storage keys, so these links are how it moves audio at all.
Granted when a song is sent. The clock is on starting the upload, not finishing it — a slow transfer that began in time still completes.
Granted when finished stems are fetched. Must stay above 10 minutes: the app reuses a listing for that long before asking again.
Model parameters
These used to be compiled into the app, so a retune meant an App Store release. Now they are sent with each job from here.
What users are told
The exact text shown when a request is refused, per language. Editable
here, so wording changes never need an App Store release.
{placeholders} are filled in.
Busy handling
When RunPod's queue is deep, turn new jobs away with the busy message rather than queueing them behind a backlog the user cannot see.
Off by default. A queue is normal, and refusing work is a bigger decision than it looks — but a job never submitted costs nothing, and being told beats a spinner. If the health check cannot be reached the job goes through anyway.
Service keys
Rotate the credentials the backend uses to reach storage and RunPod. Saved immediately — no redeploy.
Storage
Which bucket the backend signs against. The app parses stored paths generically, so changing this does not strand songs saved under the old bucket.
A wrong region breaks every signature and reports only a 403, so check it with the button below after changing it.
Because these can be changed from here, the admin token now protects them too — make it
long and random, and rotate it if it is ever exposed. Clearing a field falls back to the
value deployed with wrangler secret put.
Kill switch
Refuses every request from the app until switched back. Takes effect worldwide within about a minute.