Find the songs in your mix
Every song start in your mix, a tracklist to paste under your upload, a .m4a your phone skips song by song, and a signed cue sheet.
Built on: Song starts in long audio, Signed record
Loading the tool…
Use it your way
Use it from your codeThe hosted API with your key, and prompts to paste into a coding agent
Get an API key
- Call the mix cue sheet API from your own code in minutes.
- Every model answer carries a signed receipt.
- Nothing to install; we run the models.
Run it yourself, on request
- The same open models and app, on Any CPU; no GPU.
- Data never leaves your machines, and there are no Decosa charges.
- One prompt for Claude Code or Codex assembles the whole stack.
- Early access: the container images are not public yet and the source needs access; the prompt says how to ask.
Build with it
Paste one of these into Claude Code, Codex or another coding agent. The first wires your project to the hosted API with your DECOSA_API_KEY. The second pulls our containers and runs the same stack on your own GPU, with no Decosa charges.
- Base URL
- https://api.decosa.ai
- Auth
Authorization: Bearer $DECOSA_API_KEY(or a demo session token)- Tool id
- mix-cue-sheet
Use the hosted API
# Decosa Find the songs in your mix: use the hosted API
You are wiring Decosa's mix cue sheet into this project. It takes a long recording (a DJ mix, a radio show), an
optional tracklist (titles, with or without times) and optional track files (the songs that were played), and returns
every song's start, a timestamped tracklist, a chaptered .m4a (one MP4 chapter per song) and a signed cue sheet that
names the audio's SHA-256. It runs on CPU with no model call and no outside service. It never names a song it was given
no title or file for. Use only what is listed below. If you need something else, stop and ask me.
- Base URL: `https://api.decosa.ai`
- Health check: `GET https://api.decosa.ai/healthz`.
- Retention on the hosted API: the mix and track files are deleted when the run ends; the chaptered .m4a is kept for
one hour (or until `DELETE /cue/runs/{id}`); the song list and cue sheet (no audio) for 24 hours, for the token or key
that made the run.
## Auth: API key (or a demo session)
1. Preferred: an API key (`dk_…`) from "Get an API key" on the tool page. Keep it in an environment variable,
`DECOSA_API_KEY`, never in code. Send `Authorization: Bearer $DECOSA_API_KEY`.
2. Without a key: `POST https://api.decosa.ai/demo/session` with `{"vertical": "mix-cue-sheet"}` returns `{"token", "expires_at", "budget"}`.
a limited number of sessions per network per hour (the current limits are in `demo_sessions` of GET /healthz). Over a limit: HTTP 429 with `Retry-After`.
3. One run at a time per demo token (409 otherwise); 429 with `Retry-After` when the service is busy.
## Endpoints
- Upload each file first, in chunks (the public edge caps request bodies, so always chunk):
`POST /cue/uploads {"kind": "mix"|"ref", "bytes": <size>, "filename": "..."}` -> 201 `{upload_id, chunk_bytes, bytes, kind, expires_s}`,
then `PUT /cue/uploads/{upload_id}?offset=<bytes sent so far>` with the raw bytes (`Content-Type: application/octet-stream`,
at most 16 MB per chunk) -> `{received, bytes, complete}`. A 409 says the offset the server expects; resume from it.
Limits: a mix up to 150 MB and 2 hours; up to 30 track files of up to 40 MB and 15 minutes each.
- `POST /cue/mark` `{"audio": "<mix upload_id>", "tracklist"?: "...", "refs"?: [{"upload": "<ref upload_id>", "title": "Artist - Title"}], "title"?: "...", "stream"?: true}`,
or `{"sample": "demo-1"}` for a demo mix. Tracklist: one song per line in play order, `12:30 Artist - Title` or just
`Artist - Title`; up to 400 lines and 20,000 characters.
- With `"stream": true` (or `Accept: text/event-stream`) it streams `run` `{run_id, poll}`, `stage`
`{stage: features|refs|resolve|chapters, progress: 0..1}`, then `done` (the run, below) or `error`, then `budget`.
With `"stream": false`: 202 `{run_id, poll}`; poll `GET /cue/runs/{run_id}` until `status` is `done` or `error`.
- The run: `{id, status, markers: [{start, title, source, confidence}], songs, method, detector, duration_s, audio_sha256, timing, tracklist, downloads: {tracklist, m4a, record}, audio_expires_s, record_signed, inputs_deleted}`.
`source`: `tracklist` (your time, used as written), `own_refs` (found from your track file), `guess` or `detector`
(placed from the audio). `confidence`: `identified` or `estimated`; show estimated starts as "check by ear".
- `GET /cue/runs/{id}/tracklist.txt` (`0:00 Title` per line), `GET /cue/runs/{id}/chapters.m4a` (410 once deleted),
`GET /cue/runs/{id}/record` (the signed cue sheet), `DELETE /cue/runs/{id}` (deletes the chaptered audio now).
- `POST /record/verify` (no token) `{"record": {...}}` -> `{ok, summary, bad}`.
- `GET /cue/info`, `GET /cue/samples`, `GET /cue/samples/{id}/audio`, `GET /attest/signing-key` (no token).
- Errors: 400 (the message says what is wrong, including audio that cannot be decoded or is too long), 402 budget,
404 unknown upload or run, 409 wrong offset or a run already going, 413 too large, 429 busy.
## Example: mark a mix and save the files (Python, `pip install httpx`)
```python
import httpx, os, pathlib, time
API = "https://api.decosa.ai"
H = {"Authorization": f"Bearer {os.environ['DECOSA_API_KEY']}"}
def upload(path, kind):
data = pathlib.Path(path).read_bytes()
u = httpx.post(f"{API}/cue/uploads", headers=H, json={"kind": kind, "bytes": len(data), "filename": pathlib.Path(path).name}).json()
step, off = min(u["chunk_bytes"], 16 * 1024 * 1024), 0
while off < len(data):
r = httpx.put(f"{API}/cue/uploads/{u['upload_id']}", params={"offset": off}, headers={**H, "Content-Type": "application/octet-stream"},
content=data[off:off + step], timeout=120)
r.raise_for_status()
off = r.json()["received"]
return u["upload_id"]
body = {"audio": upload("mix.mp3", "mix"), "tracklist": pathlib.Path("tracklist.txt").read_text(),
"refs": [{"upload": upload(p, "ref"), "title": pathlib.Path(p).stem} for p in ["track1.mp3", "track2.flac"]],
"stream": False}
run = httpx.post(f"{API}/cue/mark", headers=H, json=body, timeout=60).json()
while (v := httpx.get(f"{API}{run['poll']}", headers=H).json())["status"] not in ("done", "error"):
time.sleep(2)
for m in v["markers"]:
print(m["start"], m["title"], m["source"], m["confidence"])
for key, name in [("tracklist", "tracklist.txt"), ("m4a", "mix-chapters.m4a"), ("record", "cue-sheet.json")]:
if v["downloads"].get(key):
pathlib.Path(name).write_bytes(httpx.get(f"{API}{v['downloads'][key]}", headers=H, timeout=300).content)
```
## Honest limits
- It names only songs it is given a title or a file for; the hosted API does no catalogue lookup.
- Titles without a time or a file are placed from the audio alone and marked `estimated`; on long beat-matched blends
they can be off. Track files place their songs from the audio itself.
- The learned transition detector is off on the hosted API (its training audio has no dataset licence).
Run it yourself (containers)
On request. The container images and the compose file aren’t public yet. Ask for self-host access and Decosa sends the registry (DECOSA_REGISTRY) and the compose file’s URL (DECOSA_COMPOSE_URL) these steps use. They are the steps we tested end to end on a fresh machine.
# Decosa Find the songs in your mix: run it yourself (containers)
You are setting up Decosa's mix cue sheet on this machine, so mixes, unreleased edits and track files never leave it. It
finds every song's start in a long recording from an optional tracklist, optional track files and the audio itself,
writes a chaptered .m4a (one MP4 chapter per song) and a timestamped tracklist, and signs a cue sheet with this box's
own key. It runs on CPU: no GPU and no model server. Nothing is sent to Decosa's hosted API.
Status: the container images (${DECOSA_REGISTRY}/decosa-*) and the compose file are on request while self-host is in early access (not on a public registry yet): ask at https://decosa.ai/contact?topic=self-host, and Decosa sends the registry as DECOSA_REGISTRY, the compose file URL as DECOSA_COMPOSE_URL, and pull access. If a pull fails with
"not found", "denied" or "unauthorized", stop and tell me. Do not substitute other images.
Ask me before any command that needs sudo, and show me the command first.
## Step 0: set up with a coding agent, rehearse on mock data, then go private
This prompt is for a coding agent running on the machine that will host the service. We recommend Claude Code with
Claude Opus 5.5; any capable coding agent works. Work in this order:
1. Set up on mock data only. During the whole setup you (the agent) work with the synthetic sample bundle below and
nothing else. Do not ask me for real data, and do not open, read, list or copy files that hold real data, even to
"test with something realistic".
2. Rehearse. When the steps below are done and the service is healthy, fetch the mock-data bundle for this tool,
https://decosa.ai/samples/mix-cue-sheet.zip (1 KB, 12 checks, synthetic or openly licensed: see `licence` in expected.json),
show me what is in it, and run the rehearsal against the local API:
`docker compose exec api python scripts/rehearse.py mix-cue-sheet` (the api image carries the same bundle under /app/rehearsal/mix-cue-sheet/;
with no key set, the script asks the local API for a short demo token). From a decosa-api checkout instead:
`python scripts/rehearse.py mix-cue-sheet --bundle mix-cue-sheet.zip --base-url http://127.0.0.1:<PORT>`.
It sends the mock inputs to the local API and prints PASS or FAIL for each expected property (for example: "the run finishes", "eight songs are found", "the first song is Mirrorball Sunday at 0:00"). Show me
the full output. Every check must pass. If one fails, fix the install and run it again; never edit `expected.json`
to make a check pass.
3. Stop there. Once the rehearsal passes, tell me, and I will run my own data against the local API myself, on this
machine.
For the person running this: a coding agent that runs in the cloud sees everything in its context, including files it
reads, command output and anything pasted into the chat. Keep real data out of the chat and out of anything the agent
can read. Switch to your own data only after the rehearsal has passed and the agent's work is done.
## Steps
1. Docker: if `docker compose version` fails, install Docker Engine and the compose plugin using Docker's official
instructions for this distribution (docs.docker.com/engine/install). No NVIDIA toolkit is needed.
2. Fetch the compose file:
`mkdir -p ~/decosa && cd ~/decosa && curl -fsSL "${DECOSA_COMPOSE_URL}" -o compose.yaml`
Read it. Keep only the `api` service (drop `llm` and every GPU service: this tool calls no model). Keep its named
`/data` volume and bind every port to 127.0.0.1. Leave `DECOSA_CUE_DETECTOR` unset (off).
3. Pull and start: `docker compose pull api && docker compose up -d api`.
4. Check: `curl -fsS http://127.0.0.1:<PORT>/cue/info` shows `detector.mode: "off"` and the limits;
`GET /attest/signing-key` shows this box's public key. Show me the key: it is what others pin to verify my cue sheets.
5. Smoke test: get a token with `POST /demo/session {"vertical":"mix-cue-sheet"}` and run
`POST /cue/mark {"sample": "demo-1", "stream": false}`, then poll `GET /cue/runs/{run_id}` until `status` is `done`.
Expect one marker per line of the sample's tracklist (`GET /cue/samples`), in order, the first at 0:00, and
`record_signed: true`. `GET /cue/runs/{id}/chapters.m4a` must download and show one chapter per song
(`ffprobe -show_chapters`). Then `POST /record/verify` with the record from `GET /cue/runs/{id}/record`: `ok` must be
true; change one song's `start_ms` in it and verify again: it must fail.
6. Your own mix: upload in chunks (`POST /cue/uploads {kind: "mix", bytes, filename}`, then
`PUT /cue/uploads/{id}?offset=N` with at most 16 MB per chunk), then `POST /cue/mark {"audio": "<upload_id>", "tracklist": "..."}`.
Add your track files as `kind: "ref"` uploads and `"refs": [{"upload", "title"}]` for exact starts.
7. Report back: the public key and key id, the song list and how long the run took.
## Options (off by default)
- Learned transition detector: `DECOSA_CUE_DETECTOR=onnx` and `DECOSA_CUE_DETECTOR_PATH=/data/cue/detector.onnx` with a
weights file you are comfortable using. The v1 weights were trained on the DJ Mix Dataset (YouTube-sourced, no dataset
licence), which is why the hosted tool keeps it off; a licence-clean retrain is planned.
- Song lookup for untitled songs: `DECOSA_MIXCUE_SELFHOST=1` and your own `DECOSA_CUE_AUDD_TOKEN`. This sends a
compressed copy of the mix to AudD (audd.io), a paid third-party service under its own terms. Ask me before turning it on.
Off. This tool uses no GPU, so there is nothing to offer the network from this box.
Run it on your own hardwareWhat it needs, and the prompt that sets it up
Run it on your own GPU
Same app, same pinned models, your hardware. Nothing goes to our servers and there are no Decosa charges.
Hardware check
Check your own hardware- CPU only, 64 GB RAMbest tierRuns
The standard tier fits (0 of 0 GB). The best tier fits too.
- GeForce RTX 4090best tierRuns
The standard tier fits (0 of 24 GB). The best tier fits too.
- GeForce RTX 5090best tierRuns
The standard tier fits (0 of 32 GB). The best tier fits too.
- 2x GeForce RTX 5090best tierRuns
The standard tier fits (0 of 64 GB). The best tier fits too.
- L40Sbest tierRuns
The standard tier fits (0 of 48 GB). The best tier fits too.
- H100 80 GB (SXM)best tierRuns
The standard tier fits (0 of 80 GB). The best tier fits too.
- RTX PRO 6000 Blackwell 96 GBbest tierRuns
The standard tier fits (0 of 96 GB). The best tier fits too.
- 2x RTX PRO 6000 Blackwell 96 GBbest tierRuns
The standard tier fits (0 of 192 GB). The best tier fits too.
- Apple M3 Ultra (Mac Studio), 96 GBbest tierRuns
The standard tier fits (0 of 72 GB). The best tier fits too.
- Apple M5 Max, 64 GBbest tierRuns
The standard tier fits (0 of 48 GB). The best tier fits too.
Memory per component comes from measured footprints, the tool's stack.json, or an estimate from its parameter count, and each is labelled that way below. Only an RTX PRO 6000 and an M3 Ultra Mac Studio have actually been run.
On request. The container images and the compose file aren’t public yet. Ask for self-host access and Decosa sends the registry (DECOSA_REGISTRY) and the compose file’s URL (DECOSA_COMPOSE_URL) these steps use. They are the steps we tested end to end on a fresh machine.
- 1
Check the GPU, Docker and the NVIDIA Container Toolkit
The driver must see the GPU, and Docker must be able to pass it into a container.
nvidia-smi docker compose version docker run --rm --gpus all ubuntu nvidia-smi
- 2
Fetch the compose file
One file describes the API and the language model as services.
mkdir -p ~/decosa && cd ~/decosa curl -fsSL "${DECOSA_COMPOSE_URL}" -o compose.yaml - 3
Pull and start
The first start downloads pinned model weights, tens of gigabytes.
docker compose pull docker compose up -d
- 4
Check health
Wait until the API reports ok with the language model loaded. Then point your app at the local base URL.
curl -fsS http://localhost:<PORT>/healthz # {"ok": true, "llm": true, ...} curl -fsS -X POST http://localhost:<PORT>/demo/session \ -H 'Content-Type: application/json' -d '{"vertical":"mix-cue-sheet"}'
Set up with a coding agent, rehearse on mock data, then go private
- Set up with a coding agent. Paste the self-host prompt into a coding agent on the machine that will run the service. We recommend Claude Code with Claude Opus 5.5; any capable coding agent works.
- Rehearse on mock data. The agent runs the tool on a bundle of synthetic inputs and checks each answer against the bundle's
expected.json. Every check must print PASS. - Go private. Only then do you run your own data against the local API, yourself, on that machine. Never give the agent real data during setup: a coding agent that runs in the cloud sees everything in its context, so keep real data out of the chat and out of the files it reads.
docker compose exec api python scripts/rehearse.py mix-cue-sheet
Download the mock-data bundle (1 KB, 12 checks)expected.json
A 6-minute mix of eight songs made with Decosa Studio's Make a song, joined with cuts, crossfades and bass-swap blends, plus the eight track files that were played. The run must place all eight songs in order, each within 6 s of where it really starts, write a chaptered .m4a and a timestamped tracklist, and end in a signed cue sheet that verifies and fails once edited. The same mix with its tracklist as titles only must also give eight songs in order.
What the rehearsal checks
- the run finishes
- eight songs are found
- the first song is Mirrorball Sunday at 0:00
- Rapid Orchard starts near 0:36
- the cut to Slap Happy is placed near 4:31
- Chop Shop Groove starts near 5:17
- every song was placed from its own track file
- the mix and the track files were deleted when the run ended
- the tracklist starts with the first song at 0:00
- the signed cue sheet verifies
- an edited cue sheet fails
- with titles only, eight songs are found in the tracklist's order
Licence: All audio is Decosa's own: eight songs generated with Make a song (ACE-Step 1.5, MIT licence; each cleared by the similarity check) and mixed by Decosa. It is served by the API itself (GET /cue/samples/demo-1/audio), so this bundle has no input files.
Prompt for your coding agent
# Decosa Find the songs in your mix: run it yourself (containers)
You are setting up Decosa's mix cue sheet on this machine, so mixes, unreleased edits and track files never leave it. It
finds every song's start in a long recording from an optional tracklist, optional track files and the audio itself,
writes a chaptered .m4a (one MP4 chapter per song) and a timestamped tracklist, and signs a cue sheet with this box's
own key. It runs on CPU: no GPU and no model server. Nothing is sent to Decosa's hosted API.
Status: the container images (${DECOSA_REGISTRY}/decosa-*) and the compose file are on request while self-host is in early access (not on a public registry yet): ask at https://decosa.ai/contact?topic=self-host, and Decosa sends the registry as DECOSA_REGISTRY, the compose file URL as DECOSA_COMPOSE_URL, and pull access. If a pull fails with
"not found", "denied" or "unauthorized", stop and tell me. Do not substitute other images.
Ask me before any command that needs sudo, and show me the command first.
## Step 0: set up with a coding agent, rehearse on mock data, then go private
This prompt is for a coding agent running on the machine that will host the service. We recommend Claude Code with
Claude Opus 5.5; any capable coding agent works. Work in this order:
1. Set up on mock data only. During the whole setup you (the agent) work with the synthetic sample bundle below and
nothing else. Do not ask me for real data, and do not open, read, list or copy files that hold real data, even to
"test with something realistic".
2. Rehearse. When the steps below are done and the service is healthy, fetch the mock-data bundle for this tool,
https://decosa.ai/samples/mix-cue-sheet.zip (1 KB, 12 checks, synthetic or openly licensed: see `licence` in expected.json),
show me what is in it, and run the rehearsal against the local API:
`docker compose exec api python scripts/rehearse.py mix-cue-sheet` (the api image carries the same bundle under /app/rehearsal/mix-cue-sheet/;
with no key set, the script asks the local API for a short demo token). From a decosa-api checkout instead:
`python scripts/rehearse.py mix-cue-sheet --bundle mix-cue-sheet.zip --base-url http://127.0.0.1:<PORT>`.
It sends the mock inputs to the local API and prints PASS or FAIL for each expected property (for example: "the run finishes", "eight songs are found", "the first song is Mirrorball Sunday at 0:00"). Show me
the full output. Every check must pass. If one fails, fix the install and run it again; never edit `expected.json`
to make a check pass.
3. Stop there. Once the rehearsal passes, tell me, and I will run my own data against the local API myself, on this
machine.
For the person running this: a coding agent that runs in the cloud sees everything in its context, including files it
reads, command output and anything pasted into the chat. Keep real data out of the chat and out of anything the agent
can read. Switch to your own data only after the rehearsal has passed and the agent's work is done.
## Steps
1. Docker: if `docker compose version` fails, install Docker Engine and the compose plugin using Docker's official
instructions for this distribution (docs.docker.com/engine/install). No NVIDIA toolkit is needed.
2. Fetch the compose file:
`mkdir -p ~/decosa && cd ~/decosa && curl -fsSL "${DECOSA_COMPOSE_URL}" -o compose.yaml`
Read it. Keep only the `api` service (drop `llm` and every GPU service: this tool calls no model). Keep its named
`/data` volume and bind every port to 127.0.0.1. Leave `DECOSA_CUE_DETECTOR` unset (off).
3. Pull and start: `docker compose pull api && docker compose up -d api`.
4. Check: `curl -fsS http://127.0.0.1:<PORT>/cue/info` shows `detector.mode: "off"` and the limits;
`GET /attest/signing-key` shows this box's public key. Show me the key: it is what others pin to verify my cue sheets.
5. Smoke test: get a token with `POST /demo/session {"vertical":"mix-cue-sheet"}` and run
`POST /cue/mark {"sample": "demo-1", "stream": false}`, then poll `GET /cue/runs/{run_id}` until `status` is `done`.
Expect one marker per line of the sample's tracklist (`GET /cue/samples`), in order, the first at 0:00, and
`record_signed: true`. `GET /cue/runs/{id}/chapters.m4a` must download and show one chapter per song
(`ffprobe -show_chapters`). Then `POST /record/verify` with the record from `GET /cue/runs/{id}/record`: `ok` must be
true; change one song's `start_ms` in it and verify again: it must fail.
6. Your own mix: upload in chunks (`POST /cue/uploads {kind: "mix", bytes, filename}`, then
`PUT /cue/uploads/{id}?offset=N` with at most 16 MB per chunk), then `POST /cue/mark {"audio": "<upload_id>", "tracklist": "..."}`.
Add your track files as `kind: "ref"` uploads and `"refs": [{"upload", "title"}]` for exact starts.
7. Report back: the public key and key id, the song list and how long the run took.
## Options (off by default)
- Learned transition detector: `DECOSA_CUE_DETECTOR=onnx` and `DECOSA_CUE_DETECTOR_PATH=/data/cue/detector.onnx` with a
weights file you are comfortable using. The v1 weights were trained on the DJ Mix Dataset (YouTube-sourced, no dataset
licence), which is why the hosted tool keeps it off; a licence-clean retrain is planned.
- Song lookup for untitled songs: `DECOSA_MIXCUE_SELFHOST=1` and your own `DECOSA_CUE_AUDD_TOKEN`. This sends a
compressed copy of the mix to AudD (audd.io), a paid third-party service under its own terms. Ask me before turning it on.
Off. This tool uses no GPU, so there is nothing to offer the network from this box.
Help me customise for my hardware
Pick your GPU or Mac, or enter its memory. You get the tier that fits, the model swaps it needs, measured speed where we have it, and a setup prompt with those choices written in.
GeForce RTX 5090: 32 GB GDDR7, 1,792 GB/s, FP8 and NVFP4. NVIDIA product page
RunsMix cue sheet on GeForce RTX 5090: use the Best · adds the learned transition detector (self-host only) tier
The standard tier fits (0 of 32 GB). The best tier fits too.
Best · adds the learned transition detector (self-host only): what changes
Nothing: it runs as listed in the stack.
Memory per component
- Song starts: decosa-cue engine (decosa_api/cue). CPU. Runs on CPU (vram_gb 0 in stack.json).
- Finds each of your own track files in the mix...: Landmark matcher for your own track files (decosa_api/verticals/clearance fingerprinter). CPU. Runs on CPU (vram_gb 0 in stack.json).
- Transition detector v1: Transition detector v1 (ONNX). CPU. Runs on CPU (vram_gb 0 in stack.json).
Expected speed
Not measured.
Not measured on this hardware. The only measured setups are an RTX PRO 6000 Blackwell and a Mac Studio M3 Ultra.
Setup prompt for this hardware
The self-host prompt for Mix cue sheet, with a hardware plan for GeForce RTX 5090 added after Step 0. Loading the full prompt; until then it points your agent at the prompt's URL.
# Set up Mix cue sheet on my hardware Fetch https://decosa.ai/prompts/mix-cue-sheet-selfhost.md and follow it (including Step 0: rehearse on mock data first), with the hardware plan below applied. ## Hardware plan for this machine (from https://decosa.ai/self-host/hardware?use=mix-cue-sheet) Target machine: GeForce RTX 5090 (32 GB of GPU memory; CUDA, FP8 and NVFP4). Quality tier: Best · adds the learned transition detector (self-host only) (best). Fit check: runs, about 0 GB of 32 GB used. First, check the machine: run `nvidia-smi` (or `rocm-smi`, or `sysctl hw.memsize` on a Mac) and confirm the GPUs and free memory match the line above. If they do not, stop and tell me before pulling anything. Use these components (the setup below describes the standard tier; change it to match): - Song starts: decosa-cue engine (decosa_api/cue), CPU - Finds each of your own track files in the mix...: Landmark matcher for your own track files (decosa_api/verticals/clearance fingerprinter), CPU - Transition detector v1: Transition detector v1 (ONNX), CPU During the rehearsal, watch GPU memory. If a model fails to load or runs out of memory, lower its --max-model-len and --max-num-seqs first, then its memory share, and tell me what you changed. The stack's own component list and compose layout: https://decosa.ai/prompts/mix-cue-sheet-assemble.md
The proof
How we tested itEval results and end-to-end checks, hosted and self-hosted, with dates
Verified end to end
Hosted: verified 29 Sep 2026 · measured 29 Sep 2026: · p50 7.0 s · p95 7.3 s (5 runs) · ~$0 per run · 0 receipts
Loading the nightly status…
Self-host: not yet verified
Measured cost to run: about $0 per mix (CPU only, no model calls) (hosted, 29 Sep 2026). Self-hosting is free: the code is open and the models are open-weight. You pay only for your own hardware and power.
Known limits (4)
- It names only songs you give a title or a file for; there is no catalogue lookup on the hosted tool.
- Titles without times or files are placed from the audio alone and marked estimated: 84 of 105 within 10 s on held-out synthetic mixes, but 61 of 190 on real DJ mixes with long blends.
- Audio alone, with no titles and no files, finds few starts (19 of 105 within 10 s); it is not offered as a mode on its own.
- The learned transition detector is off on the hosted tool (unlicensed training audio).
How it's builtThe steps, the models and what each one checks
Get an API key
- Call the mix cue sheet API from your own code in minutes.
- Every model answer carries a signed receipt.
- Nothing to install; we run the models.
Run it yourself, on request
- The same open models and app, on Any CPU; no GPU.
- Data never leaves your machines, and there are no Decosa charges.
- One prompt for Claude Code or Codex assembles the whole stack.
- Early access: the container images are not public yet and the source needs access; the prompt says how to ask.
Drop in a mix and every song start appears: click to jump, paste the tracklist under your upload, and download a file your phone skips song by song.
Upload a DJ mix or any long recording, with its tracklist if you have one (titles, with or without times) and, if you like, the track files you played. You get every song's start on a timeline you can click through, a timestamped tracklist for a YouTube, Mixcloud or SoundCloud description, a chaptered .m4a (one chapter per song, so the Cue iPhone app and any chapter-aware player skip song by song) and a signed cue sheet that names the audio's SHA-256. Your times are used as written; your track files are found in the mix from the audio; titles with neither are placed at the strongest change in the music and marked estimated. It runs on CPU with no model call, and it never names a song you gave it no title or file for.
- Deployment
- Hosted or self-host
- Regulatory
- Checked 29 Sep 2026. It marks where songs start in audio you upload; it does not identify, license or clear music. Whether you may publish a mix of other people's recordings depends on your rights and the licences of the platform you post to, which this tool does not check. The optional song lookup on a self-hosted server sends a compressed copy of the mix to AudD (audd.io), a paid third-party service under its own terms, only when you set your own token; it is off by default and never used by the hosted tool. The optional transition detector is off on the hosted tool because its training audio (the DJ Mix Dataset, sourced from YouTube) carries no dataset licence; a self-hosted server can turn it on with its own weights file. Engine licence: Apache-2.0 (decosa-cue, ported from an MIT-licensed original); the track-file matcher is decosa-api code (AGPL-3.0-or-later).
Text description
A mix, an optional tracklist and optional track files go to decosa-api, on your own machine when self-hosted. The decosa-cue engine (Apache-2.0, numpy, CPU) decodes the audio with ffmpeg and computes spectral features and a novelty curve of where the music changes. A landmark matcher (AGPL-3.0, CPU) finds each of your track files in the mix. An optional transition detector (a 846 KB ONNX network) runs only on a self-hosted server that turns it on, because its training audio is unlicensed. The resolver uses your times first, then your track files, and places any other title at the strongest change in the audio, marked estimated. ffmpeg writes one MP4 chapter per song and the server signs a cue sheet with the starts and the audio's SHA-256. Outputs: clickable song starts, a timestamped tracklist, a chaptered .m4a and a signed cue sheet checkable at /record/verify. No model is called.
At a glance
- Data retention
- Your mix and track files are deleted when the run ends. The chaptered .m4a is kept for one hour for download, or until you delete it. The song list and the signed cue sheet (no audio) stay in memory for 24 hours.
- What leaves the box
- Nothing. There is no model call and no lookup service on the hosted tool; the audio is processed on Decosa's own server. Self-hosted: nothing, unless you set your own AudD token for song lookup.
- Limits
- A mix up to 150 MB and 2 hours; up to 30 track files of up to 40 MB and 15 minutes each; a tracklist of up to 400 lines.
- What it can't do
- Name a song you gave it no title or file for. Without times or files, starts on long beat-matched blends are rough: they are marked estimated.
- Output
- Every song's start and how it was found; a tracklist (0:00 Title per line); a chaptered .m4a, one chapter per song; and a signed cue sheet naming the audio's SHA-256, checkable at /record/verify.
Pick the tier for the quality you need
Same app at every tier. What changes is the models, the hardware they need, and whether receipts are signed. Scores are measured with the source named, or marked not measured.
- In the hosted demo
Lite
titles and times only, any CPU
Your tracklist and the audio's change points: times you give are used as written, other titles are placed at the strongest change and marked estimated. No track files.
- Models
- decosa-cue engine (decosa_api/cue)
- Hardware
- Any CPU
- Quality evidence
- Song starts within 1 / 5 / 10 s, titles only (held-out synthetic mixes)15/105 / 51/105 / 84/105decosa-api docs/evals/mix-cue-sheet.md, 2026-09-29 (held out: 20 synthetic mixes of Decosa's own songs, 105 song starts, run once with thresholds frozen on a dev split)
- Song starts within 10 / 20 / 30 s, titles only, detector off, 8 real DJ mixes61 / 75 / 86 of 190 (5 s: 40)decosa-api docs/evals/mix-cue-sheet.md, 2026-09-29 (8 public DJ mixes, 190 song starts; development numbers, not held out)
- Latency
- measured: seconds for the demo mix with titles only, on our server's CPU.
- Verification
- No proof yetNo model call; the cue sheet is signed by the instance.
- In the hosted demo
Standard
adds your own track files (hosted)
Everything in Lite, plus up to 30 of your own track files found in the mix from the audio, so their songs start where the music does, not where a guess puts them.
- Models
- decosa-cue engine (decosa_api/cue)
- Landmark matcher for your own track files (decosa_api/verticals/clearance fingerprinter)
- Hardware
- Any CPU
- Quality evidence
- Song starts within 1 / 5 / 10 s, with your track files (held-out synthetic mixes)24/105 / 92/105 / 105/105, with 105 starts predicteddecosa-api docs/evals/mix-cue-sheet.md, 2026-09-29 (held out: 20 synthetic mixes of Decosa's own songs, 105 song starts, run once with thresholds frozen on a dev split)
- By join (within 5 s / 10 s, of 35 each), with your track filescuts 23 / 31, crossfades 31 / 35, blends 33 / 35decosa-api docs/evals/mix-cue-sheet.md, 2026-09-29 (held out: 20 synthetic mixes of Decosa's own songs, 105 song starts, run once with thresholds frozen on a dev split)
- Time per 5-minute mix with track files (engine, held-out set)p50 4.46 s, p95 6.26 sdecosa-api docs/evals/mix-cue-sheet.md, 2026-09-29 (held out: 20 synthetic mixes of Decosa's own songs, 105 song starts, run once with thresholds frozen on a dev split)
- Latency
- measured: seconds for the demo mix with its track files, a little longer than titles only, on our server's CPU.
- Verification
- No proof yetNo model call; the cue sheet is signed by the instance.
Best
adds the learned transition detector (self-host only)
Everything in Standard, with the transition detector in place of the novelty curve for titles without a time or a file. Off on the hosted tool: its training audio (DJ Mix Dataset, YouTube-sourced) has no dataset licence, so turn it on only with weights you are comfortable using (DECOSA_CUE_DETECTOR=onnx). A licence-clean retrain is planned.
- Models
- decosa-cue engine (decosa_api/cue)
- Landmark matcher for your own track files (decosa_api/verticals/clearance fingerprinter)
- Transition detector v1 (ONNX)
- Hardware
- Any CPU
- Quality evidence
- Held-out synthetic mixes, detector on: song starts within 10 s, titles only / with track files61/105 / 85/105 (not better on short synthetic songs)decosa-api docs/evals/mix-cue-sheet.md, 2026-09-29 (held out: 20 synthetic mixes of Decosa's own songs, 105 song starts, run once with thresholds frozen on a dev split)
- Titles, the detector and a fingerprint service's identifications, 8 real DJ mixes (helps on real long mixes)99 / 123 / 144 of 190 within 10 / 20 / 30 s (1 s: 26, 5 s: 74; 277 predicted starts); detector off: 70 / 95 / 146decosa-api docs/evals/mix-cue-sheet.md, 2026-09-29 (8 public DJ mixes, 190 song starts; development numbers, not held out)
- Audio only (no titles), detector on, 8 real DJ mixes78 / 104 / 129 of 190 within 10 / 20 / 30 s (358 predicted starts)decosa-api docs/evals/mix-cue-sheet.md, 2026-09-29 (8 public DJ mixes, 190 song starts; development numbers, not held out)
- Latency
- not measured yet
- Verification
- No proof yetSelf-host onlyNo model call; the cue sheet records that the detector was used.
Every model in the stack
| Model | Tiers | Params · VRAM | Verification | Details |
|---|---|---|---|---|
Song starts: spectral features and a novelty curve from the audio, a tracklist parser, and a resolver that turns your times, your track-file matches and the audio's change points into one start per song; writes the chapters (no model; CPU)decosa-cue engine (decosa_api/cue) 0 GBNo proof yet | LiteStandardBest | 0 GB | No proof yet | |
| ||||
Finds each of your own track files in the mix from the audio (landmark pairs, searched across tempo changes of up to 6% and the pitch shift that comes with them) so its song gets an exact start (no model; CPU)Landmark matcher for your own track files (decosa_api/verticals/clearance fingerprinter) 0 GBNo proof yet | StandardBest | 0 GB | No proof yet | |
| ||||
Transition detector v1: a small dilated 1-D CNN that scores where one track hands over to the next, used in place of the novelty curve (self-host only, off by default)Transition detector v1 (ONNX) 0 GBNo proof yet | Best | 0 GB | No proof yet | |
| ||||
Tools, services and hardware
Tools
- ffmpeg (opens in a new tab)LGPL-2.1+ / GPL-2.0+ (run as a separate program)
Decodes the mix and your track files, and writes the chaptered .m4a (the audio is copied as it is when it is already AAC; otherwise it is encoded once to AAC at 160 kbit/s).
- AudD (audd.io) (opens in a new tab)Commercial API under its own terms
Optional song lookup on a self-hosted server only, when you set your own token (DECOSA_CUE_AUDD_TOKEN). Off by default; never called by the hosted tool.
Services
- decosa-api:8445
${DECOSA_REGISTRY}/decosa-api:<tag>GET /cue/info and /cue/samples; POST /cue/uploads and PUT /cue/uploads/{id}?offset= (16 MB chunks); POST /cue/mark (SSE or 202 and poll); GET /cue/runs/{id}, /tracklist.txt, /chapters.m4a and /record; DELETE /cue/runs/{id}. Deletes the mix and track files when the run ends; keeps the chaptered .m4a for one hour and the song list and signed cue sheet in memory for 24 hours. Needs ffmpeg (in the image).
Hardware
- Any CPU Fits
No GPU and no model server. Measured on our server (29 Sep 2026): the 6-minute demo mix took 7.0 s end to end with titles only and 12.0 s with its eight track files, most of it writing the chaptered .m4a (the demo mix is Opus, so it is encoded to AAC once) and matching the track files.
Latency per lane
- The 6-minute demo mix, titles only (8 songs), hosted settings7.0 s
Measuredmeasured on our server 2026-09-29: p50 6.96 s, p95 7.34 s over 5 runs; the engine itself took about 1.6 s, the rest is writing the chaptered .m4a and signing
- The same mix with its 8 track files12.0 s
Measuredmeasured on our server 2026-09-29: p50 12.01 s, p95 13.25 s over 5 runs; finding the track files took about 5 s
Notes
- It only names songs you give it: a title in the tracklist or a track file. There is no catalogue lookup on the hosted tool, so an untitled song in the mix is not named.
- Your times always win: a tracklist with times is used as written. Track files are placed from the audio. A title with neither goes to the strongest change in the music near where it should be, and is marked estimated.
- On the demo mix (a development example, one mix): with the eight track files, all 7 song changes land within 5 s of the real cut; with titles only, 4 of 7 within 5 s and 6 of 7 within 10 s.
- The chaptered .m4a plays in any chapter-aware player (the Cue iPhone app, VLC and others). The tracklist is plain text: 0:00 Title per line, the format YouTube reads as chapters when it starts at 0:00.
- The learned transition detector is off on the hosted tool because its training audio has no dataset licence. A licence-clean retrain is planned.
- The engine is open source (Apache-2.0) and publishing soon as a separate package.
Run this exact stack on your machine
Paste into Claude Code / Codex to assemble this stack locally. The prompt checks your GPU, pulls the pinned models, writes the compose file and runs a smoke test.
# Assemble Decosa's "Find the songs in your mix" on this machine
You are setting up a mix cue sheet service for a DJ, a radio station or an app. It takes a long recording (a DJ mix, a
radio show), an optional tracklist (titles, with or without times) and optional track files (the songs that were
played), and returns every song's start, a timestamped tracklist, a chaptered .m4a (one MP4 chapter per song, so
chapter-aware players skip song by song) and a cue sheet signed by this box's own key that names the audio's SHA-256.
Work step by step, show me each command before you run anything with `sudo`, and stop to ask if a check fails.
## Step 0: set up with a coding agent, rehearse on mock data, then go private
This prompt is for a coding agent running on the machine that will host the service. We recommend Claude Code with
Claude Opus 5.5; any capable coding agent works. Work in this order:
1. Set up on mock data only. During the whole setup you (the agent) work with the synthetic sample bundle below and
nothing else. Do not ask me for real data, and do not open, read, list or copy files that hold real data, even to
"test with something realistic".
2. Rehearse. When the steps below are done and the service is healthy, fetch the mock-data bundle for this tool,
https://decosa.ai/samples/mix-cue-sheet.zip (1 KB, 12 checks, synthetic or openly licensed: see `licence` in expected.json),
show me what is in it, and run the rehearsal against the local API:
`docker compose exec api python scripts/rehearse.py mix-cue-sheet` (the api image carries the same bundle under /app/rehearsal/mix-cue-sheet/;
with no key set, the script asks the local API for a short demo token). From a decosa-api checkout instead:
`python scripts/rehearse.py mix-cue-sheet --bundle mix-cue-sheet.zip --base-url http://127.0.0.1:<PORT>`.
It sends the mock inputs to the local API and prints PASS or FAIL for each expected property (for example: "the run finishes", "eight songs are found", "the first song is Mirrorball Sunday at 0:00"). Show me
the full output. Every check must pass. If one fails, fix the install and run it again; never edit `expected.json`
to make a check pass.
3. Stop there. Once the rehearsal passes, tell me, and I will run my own data against the local API myself, on this
machine.
For the person running this: a coding agent that runs in the cloud sees everything in its context, including files it
reads, command output and anything pasted into the chat. Keep real data out of the chat and out of anything the agent
can read. Switch to your own data only after the rehearsal has passed and the agent's work is done.
## 0. Ground rules and licences
- Everything runs on CPU in decosa-api: the decosa-cue engine (`decosa_api/cue`, Apache-2.0, numpy; ported from an
MIT-licensed original) and, for track files, the landmark fingerprinter from the sample clearance block (AGPL-3.0-or-later).
ffmpeg (LGPL/GPL, run as a separate program) decodes audio and writes the chapters. No model server, no GPU.
- By default nothing leaves this machine: no model call and no lookup service. Bind every port to 127.0.0.1.
- The service deletes the mix and track files when a run ends, keeps the chaptered .m4a for one hour and the song list
and cue sheet (no audio) in memory for 24 hours; keep it that way.
- It names only songs it is given a title or a file for. Titles without a time or a file are placed from the audio and
marked `estimated`: show them to people as "check by ear".
- It marks where songs start; it does not identify, license or clear music.
## 1. Check the machine
1. CPU and disk: a few cores; room in the data volume for the largest mix you will upload (up to 150 MB) plus its
chaptered copy while a run is going.
2. `docker --version` and `docker compose version`. If Docker is missing, install it from Docker's official
repositories after asking me. No NVIDIA driver or container toolkit is needed.
## 2. Image
- `${DECOSA_REGISTRY}/decosa-api:<tag>` (**publishing soon**). If the pull fails, build from source:
`git clone <decosa-api source: on request at https://decosa.ai/contact?topic=self-host>` (access required), check out a release that contains
`decosa_api/cue/` and `decosa_api/verticals/mixcue/`, and run `docker build -f docker/api/Dockerfile -t decosa-api:local .`
(the image includes ffmpeg and the `cue` extra: numpy, onnxruntime). The demo mixes ship inside the package.
- The engine is also being published as a standalone open-source package (publishing soon); until then, use decosa-api.
## 3. docker-compose.yml
Write this in `~/decosa/mixcue/`:
```yaml
name: decosa-mixcue
services:
api:
image: ${DECOSA_REGISTRY}/decosa-api:<tag> # or decosa-api:local
ports: ["127.0.0.1:8445:8445"]
environment:
DECOSA_HOST: 0.0.0.0
DECOSA_PORT: "8445"
DECOSA_DATA_DIR: /data
DECOSA_MIXCUE_SELFHOST: "1" # this box is yours; the hosted-only restrictions are lifted
DECOSA_MIXCUE_MAX_CONCURRENT: "2" # runs at once; each one reads a whole mix
# DECOSA_CUE_DETECTOR: onnx # optional, see section 6
# DECOSA_CUE_DETECTOR_PATH: /data/cue/detector.onnx
# DECOSA_CUE_AUDD_TOKEN: ... # optional, sends audio to AudD; see section 6
volumes: ["decosa-data:/data"] # a named volume: the image runs as uid 10001, so a root-owned bind mount fails
healthcheck:
test: ["CMD", "python", "-c", "import urllib.request; urllib.request.urlopen('http://127.0.0.1:8445/healthz', timeout=4)"]
interval: 30s
retries: 10
volumes:
decosa-data: {}
```
Start it: `docker compose up -d`. On first start the api service creates this box's Ed25519 key in the volume under
`attest/` (mode 0600); back the volume up and never print the key.
## 4. Check it
1. `curl -s localhost:8445/cue/info | jq '{engine, detector, limits}'` shows the engine version, `detector.mode: "off"`
and the limits (mix 150 MB and 2 hours, 30 track files of 40 MB and 15 minutes, 400 tracklist lines).
2. `curl -s localhost:8445/attest/signing-key`: show me the public key and key id; others pin it to verify cue sheets.
## 5. Smoke test
1. Token: `T=$(curl -s -XPOST localhost:8445/demo/session -H 'content-type: application/json' -d '{"vertical":"mix-cue-sheet"}' | jq -r .token)`.
2. `RUN=$(curl -s -XPOST localhost:8445/cue/mark -H "authorization: Bearer $T" -H 'content-type: application/json' -d '{"sample":"demo-1","stream":false}' | jq -r .run_id)`
3. Poll `curl -s localhost:8445/cue/runs/$RUN -H "authorization: Bearer $T" | jq '{status, songs, method, markers}'` until
`status` is `done`. Expect one marker per line of the sample's tracklist (`curl -s localhost:8445/cue/samples`), in
order, the first at 0:00, and `record_signed: true`.
4. `curl -s localhost:8445/cue/runs/$RUN/chapters.m4a -H "authorization: Bearer $T" -o mix.m4a && ffprobe -v error -show_chapters mix.m4a`
lists one chapter per song. `curl -s localhost:8445/cue/runs/$RUN/tracklist.txt -H "authorization: Bearer $T"` prints
`0:00 Title` lines.
5. `curl -s localhost:8445/cue/runs/$RUN/record -H "authorization: Bearer $T" | jq '{record: .}' | curl -s -XPOST localhost:8445/record/verify -H 'content-type: application/json' -d @-`
must say `ok: true`. Change one song's `start_ms` in the record and verify again: it must fail.
6. Your own mix: `POST /cue/uploads {"kind":"mix","bytes":<size>,"filename":"mix.mp3"}`, then
`PUT /cue/uploads/<upload_id>?offset=<n>` with at most 16 MB of raw bytes per chunk (`application/octet-stream`),
then `POST /cue/mark {"audio":"<upload_id>","tracklist":"...","refs":[{"upload":"<ref id>","title":"Artist - Title"}]}`.
Time it and tell me how long a one-hour mix takes on this box.
## 6. Options (off by default)
- Learned transition detector: set `DECOSA_CUE_DETECTOR=onnx` and put a weights file at `DECOSA_CUE_DETECTOR_PATH`.
Decosa's v1 weights (846 KB) were trained on the DJ Mix Dataset, which is sourced from YouTube and has no dataset
licence; that is why the hosted tool keeps it off and a licence-clean retrain is planned. Use weights you are
comfortable with, and tell me before turning it on.
- Song lookup for songs you have no title for: `DECOSA_CUE_AUDD_TOKEN` (with `DECOSA_MIXCUE_SELFHOST=1`). It sends a
compressed copy of the mix to AudD (audd.io), a paid third-party service under its own terms. Ask me first.
## 7. Point your app at the local API
Send mixes to `POST /cue/mark` as above and show estimated starts as "check by ear". Keep the tracklist and the signed
cue sheet with the mix; download the chaptered .m4a within the hour. For the site, set
`NEXT_PUBLIC_DECOSA_API=http://127.0.0.1:8445` in `.env.local`. Contract: `API_CONTRACT.md`, section "Find the songs
in your mix".
Not relevant here: this tool uses no GPU. If I ask for it later, on a machine with a GPU, follow the provider guide at
`/provide` on the site instead of improvising.Technical detailsModels, where it runs, labels
In short
Last reviewed
- What it is
- Make a DJ mix tracklist with times from the audio: upload the mix with the titles you played, and optionally the track files, and get every song start, a chaptered .m4a and a signed cue sheet.
- Who it's for
- DJs who publish mixes, radio and podcast editors who cut long shows, and developers who need song starts in long audio.
- Where it runs
- Hosted or self-host
- Key numbers
105 of 105 song starts within 10 s (92 within 5 s) when you add the track files you played; 84 of 105 within 10 s from titles alone. Held-out synthetic mixes of 60-second generated songs; real DJ mixes with long blends are harder (61 of 190 within 10 s from titles alone on eight public mixes).
- 105/105 (92/105 within 5 s, 24/105 within 1 s) Song starts within 10 s, with your track files (test split, n = 105)
- 84/105 (51/105 within 5 s, 15/105 within 1 s) Song starts within 10 s, titles only (the hosted default) (test split, n = 105)
- 3/105 / 10/105 / 19/105 Song starts within 1 / 5 / 10 s, audio only (test split, n = 105)
- 7.0 s Median end-to-end run, hosted (QA sweep 2026-09-29)
- Models
- No model call: the decosa-cue engine (numpy, Apache-2.0) and a landmark matcher for your own track files, both on CPU
- Where
- Hosted or self-host
- Checks
- Signed cue sheet naming the audio's SHA-256, checkable at /record/verify
- Industry
- Music · Creative and media
- Output
- Structured data · Media
- Data
- Confidential business data
- Hardware
- CPU, no GPU
- Licence
- Permissive (Apache-2.0, MIT)
- Part of
- Decosa Studio: Music
- Runs in
- Decosa hosted · Self-host
- Built from
- Song starts in long audio · Signed record
Questions people ask
How do I make a DJ mix tracklist with timestamps?
Upload the mix and paste the titles you played, with or without times. Times you give are used as written; titles without a time are placed at the strongest change in the music and marked estimated. Add the track files you played and those songs are found in the mix from the audio. You get 0:00 Title lines to paste under your upload.
How accurate are the song starts?
On 20 held-out synthetic mixes of 60-second songs, 105 of 105 starts landed within 10 s (92 within 5 s) with the track files you played, and 84 of 105 within 10 s from titles alone. Real DJ mixes with long blends are harder: 61 of 190 within 10 s from titles alone on eight public mixes. DJs' own timestamps disagree by about 9 s.
Does it identify songs I don't list?
No. It only names songs you give it a title or a track file for; the hosted tool does no catalogue lookup. A self-hosted server can turn on an AudD lookup with your own token.
What is the chaptered .m4a for?
It is your mix with one MP4 chapter per song, so the Cue iPhone app, VLC and other chapter-aware players skip song by song.
Does my mix leave Decosa's server?
No. There is no model call and no lookup service on the hosted tool. Your mix and track files are deleted when the run ends; the chaptered .m4a is kept for one hour.
What is the signed cue sheet?
A JSON record of the song starts, how each was found and the SHA-256 of the audio it describes, signed by the server. Anyone can check it on the record page (decosa.ai/tools/developer/record) or by posting it to the API's /record/verify; changing one start makes the check fail.
Ask a question or leave feedbackWe read every message and publish useful answers
Ask about Mix cue sheet
We read every message. Questions, comments and our answers show here once we have reviewed and approved them.
Loading questions…