Missed Mix

Someone out there has your playlist.

Missed Mix matches people on what they listen to. Build a profile, send a vibration.

  1. 01

    Build a profile

    Basic info and your favourite artists, albums and songs.

    You pick the artists and tracks yourself. Share as much or as little as you want to.

  2. 02

    See who else is here

    Everyone else on Missed Mix, and their profiles.

    Read what somebody listens to and decide for yourself whether you want to reach out.

  3. 03

    Send a vibration

    A quiet nudge. Accept one and a private conversation opens.

    A vibration is a nudge, not a message. Whoever receives it reads your profile and decides. Nothing opens until they accept, and either of you can walk away without a conversation ever starting.

Decisions, not defaults

What Missed Mix runs on

FrameworkReact Router
Every page is rendered on the server and arrives as complete HTML, rather than being assembled in the browser once JavaScript loads. Forms are ordinary form posts, so they still submit if it never loads at all.ADR 0001
StylingTailwind CSS
The styling framework I build with. Utility-first, popular, well documented, and flexible.
DatabaseMongoDB
A document database. A profile and its taste picks are one record, so rendering a profile is a single read rather than several tables joined together. Uniqueness is enforced by an index rather than a prior lookup, which is what makes two simultaneous signups safe.ADR 0009
ValidationZod
Every value arriving from outside is parsed against a schema before anything uses it: form fields, query strings, cookies, and responses from the Spotify API. One definition produces both the runtime check and the TypeScript type.
HostingCloudflare Pages
Server-rendered at the edge on Cloudflare's network. Requests run in whichever location is nearest, and every read on a page shares one database connection rather than opening a fresh one each time.ADR 0002
LanguageTypeScript
Everything here is written in TypeScript. Types run from the database read through to the rendered component, so a change to a stored shape fails the build rather than the page.
Quality gatesAutomated checks
Every pull request runs CI: formatting, type checks, unit tests, a production build, a dependency audit, a Lighthouse audit, and a size budget that fails the build if the client bundle grows past 125 KB.ADR 0003
Back to my site.