
SoundPrint
A shareable musical profile with no account and no database
Why it exists
I wanted a quick and easy way to showcase musical abilities, skill levels and share them across the internet. Whether that was in health competition with others, to keep a record of my achievements publically, or to share with a teacher, student or potential band.
In these cases you don’t want a CV or something huge, just a “no fluff” type of “here’s what I can do”. You fill a form, get a shareable link and share that how you see fit!

No account, no database
The interesting part isn’t the form, it’s what happens after you submit it. There’s no backend storing profiles. The data is serialised, gzip-compressed and base64url-encoded straight into the URL. Opening /profile/[token] decodes it back into a profile server-side and renders it. The link is the data.
That has consequences that shape the rest of the product:
- Editing a profile always produces a new link. The old one still resolves, because it’s still valid data, it just won’t reflect the edit.
- There’s no way to recover a lost link. If you lose it, you lose the profile. The FAQ says this plainly rather than pretending otherwise.
- Anything shared via the link is, by definition, public to whoever holds it. There’s nothing private about the storage because there’s no storage.

Keeping the links short
Gzip and base64 both cost bytes, so the wire format matters more than it would with a normal API payload. Rather than shipping the profile as JSON with its field names intact, the schema is walked with Zod’s own introspection and compacted into positional tuples, no keys, enums stored as indices. A new or renamed field falls out of the schema automatically; nothing in the encoder needs to change.
The one thing that can’t be derived automatically is a lossy transform, truncating a full date down to year and month, for example. Those fields are tagged with .meta({ wireCompact: "yearMonthDate" }) and the transform registered once. Field order in the schema is otherwise permanent. Reordering would reshuffle tuple positions and quietly corrupt every link already issued, so new fields are appended, never inserted.
What it covers
A profile is a name plus whatever subset of instruments, qualifications, bands and highlights applies. Everything past the name is optional, and each list is capped at five entries by design, it’s meant to be a highlight reel only. Instruments can carry a skill level and a small repertoire of tracks per genre, which is the part that ends up making a profile feel like a person rather than a form submission.

There’s also an import flow: paste a previously generated link back into the builder and it decodes into the form, ready to edit into a new one.
Try it
The demo is live at soundprint.jordanalec.co.uk. No sign-in, nothing to install, just build a profile and share the link it gives you back.
If your interested in the code you can check that out on GitHub.
I have a few things I want to improve so feel free to come back, have a look and play!