ZENCO
1
How it's built
2
When things fail
3
Not losing money
4
Who can do what
5
What it costs
how to read
glossary
replay
Stages
1
Architecture
2
Why it is asynchronous
3
Request lifecycle
4
Data model
5
Where guarantees stop
6
What Create returns
how a song gets made
1
2
3
4
5
You press Create
generateSong() → queueSong() · src/actions/generation.ts
playing
Browser
›
React 19 · holds no authority
/
· home feed
/create
· song-panel
/favorites
· liked songs
/customer-portal
· billing
sound-bar
· player store
Next.js 16 — web tier
›
request-scoped · stateless · dies with the response
server actions — "use server"
generateSong() getPlayUrl()
recordListen() toggleLikeSong()
renameSong() setPublishedStatus()
getUserLikedSongs()
· every export is a public endpoint
route handlers
/api/inngest
/api/auth/[...all]
· Inngest re-enters
· the app here
lib
auth.ts better-auth
s3.ts getPresignedUrl
products.ts
· s3.ts is import "server-only"
Inngest — generate-song
›
durable · at-least-once · concurrency limit 1, key event.data.userId
prepare-request
reserve-credit
set-status-processing
step.fetch(endpoint)
update-song-result
failure paths: set-status-no-credits refund-credit + set-status-failed onFailure(event) — terminal, after retries
Modal — MusicGenServer
›
L40S · scaledown_window=10 · ephemeral · no DB access
@modal.fastapi_endpoint · requires_proxy_auth
generate_from_description
generate_with_lyrics
generate_with_described_lyrics
@modal.enter() load_model
ACEStepPipeline /models · bfloat16
Qwen2-7B-Instruct prompt/lyrics/tags
SDXL-Turbo 2 steps · gs 0.0
Polar
›
checkout() · webhooks
· credits: { increment }
Postgres
›
Song User Like Category
Session Account Verification
Song.status 5 values
Song.creditReserved refund gate
Song.creditRefunded replay gate
S3
›
objects
{uuid}.wav audio
{uuid}.png cover art
read path
GetObjectCommand
getSignedUrl(expiresIn: 3600)
· a bearer capability:
· anyone holding the URL
· can read for one hour