M

Music AI

Control panel

One sign-in covers production and development. The password is never stored — only a session that expires after 12 hours, in this browser.

M

Music AI — Control

not connected
Monitor

Usage

Jobs over time

Completed and failed, by period.

Completed Failed

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.

A bad value here affects every split immediately. Change one thing at a time.

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.

Write only. A key can be set here but never read back, so nothing on this page can reveal an existing value. Leave a field blank to keep what is already there.

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.