Bret Siers

Software that turns a thought into something you can play.

I build tools where the interesting part is not the model — it is what happens around it. Right now that is Unwritten: you write down a thought, it asks you the questions only you can answer, and it hands you back a recorded song.

liner-notes-six.vercel.appThe Unwritten homepage: a full-bleed dusk landscape behind the prompt 'The details are what make it yours', with a box to write a thought and a button reading 'Turn this into lyrics'.

Selected work

Things I have built far enough to have opinions about.

building

Unwritten

Turn a thought into personalised lyrics, then into a real recorded song. Anyone can write lyrics free and anonymously; recording needs an account, and every take is served as a 15-second preview until the song is unlocked. The console on this page is its desktop face.

Next.js 15Neon + DrizzleStripeLangfuseMCP

Open it →

archivedplaceholder

Placeholder project

Filler copy. Swap this for something you actually shipped, or delete the entry — it exists only so the grid is not a single lonely card.

TODO
archivedplaceholder

Placeholder project

Filler copy. Swap this for something you actually shipped, or delete the entry — it exists only so the grid is not a single lonely card.

TODO

How Unwritten works

Four moves, and the one in the middle is the one that matters — it asks before it writes.

  1. Write

    Say the thing plainly — a moment, a person, a thought you keep circling. No form to fill in.

  2. Answer

    The model reads it and asks three to six questions only you can answer. Who was in the passenger seat. What the room smelled like.

  3. Read

    Lyrics come back as a sheet, with structure tags where the chorus and the beat switch land. Your answers outweigh anything guessed.

  4. Record

    The brief goes to a music provider and comes back a full master. You hear the first fifteen seconds; unlocking serves the rest.

Write one →


Notes from building it

The decisions that cost real time to discover.

Pricing lives in one pure file

Every entitlement decision is a side-effect-free function. Swapping the whole storage layer for Postgres touched the service and left the logic untouched — and a complete pricing model change took one session.

Reserve before you spend

A render places a hold before the provider is called and commits only after it returns. A failed render costs the writer nothing, and two simultaneous renders cannot both claim the last take.

Previews are cut, not generated

You cannot generate a clip and extend it later — that is a different song. So the full master is always rendered and the 15-second preview is sliced out of it with byte math on the frame headers. No ffmpeg in the dependency tree.

The feature that got deleted

Per-song AI video shipped end to end, then came out: $0.13 per second against $0.95 of revenue per song. It worked. The arithmetic did not.