Music Forest · architecture guide

The wires, the boundaries, and the doors.

One app, four ways in. In plain words is the whole privacy story for anyone. Map 1 follows your data outward — the protocol on every wire and the line your notebook never crosses in the clear. The codebase lists what’s in the source. Map 2 is a flowchart of what a person actually does.


Plain words

What is Music Forest?

No tech knowledge needed — what the app is, and whether your information is safe.

Find music, write notes. Every day, Music Forest brings you the records released on this date — any year — one at a time. You meet a record and keep the ones that stay with you, or set the rest aside. If you want to write something down about one, you can — whatever it is — in a private notebook that’s yours alone. No feed, no algorithm, no ads.

Is my information safe?

That private notebook is the part people ask about. Here’s the whole story, in three steps.

STEP 1

You write. It locks.

Jot down whatever you want about a record. Your own device locks it up right away, like a diary that snaps shut on its own.

STEP 2

We keep it — but can’t read it.

We hold your locked notes safe so you never lose them. Only you have the key. Not us, not the company that stores it, not anyone.

STEP 3

You listen where you already do.

When you want to play an album, it opens in Spotify, Apple Music, or wherever you listen. Music Forest just points you there — it never passes along anything about you.

No ads. Ever. Nothing on this page is trying to sell you anything.
No tracking. We don’t follow you around the web or build a profile of you.
Only your email. The single personal detail we keep — just so you can sign in. Nothing else.
Nothing to sell. We never sell your information — we can’t even read the private part.
Leave anytime. Change your mind and delete everything in one step. It’s truly gone.

That’s the whole deal. Come for the music; your business stays your business.


Map 1

Data flow, protocols & trust boundaries

Four places your data can be, top (closest to you) to bottom (farthest out). Between each pair is the wire that joins them — a two-way arrow with the protocol it speaks and what rides it in each direction.

Zone 1 · yours alone Your device · browser / installed PWA plaintext lives only here

The one place your words exist in the clear. Encryption happens here with libsodium — Argon2id stretches your passphrase into a key that wraps the data key; the passphrase and keys stay in memory and are wiped on reload.

Decrypted notebook — your notes & what you keep Encryption key & passphrase in memory Guest buffer + prefs localStorage Biometric unlock WebAuthn, device-local
HTTPS / TLS · REST + JSON · Bearer JWT ⇅ both ways. Down: your requests & sealed writes. Up: records, art, and your sealed rows back. Signing in uses a separate direct wire to Supabase Auth (HTTPS) — the only thing that carries your email.
Code in: push to GitHub main → Render auto-deploys build-time · not your data
Zone 2 · same origin Render · musicforest.lol

Flask + gunicorn. Serves the app, reads the public catalog for you, and relays your sealed rows onward. It never holds the key, so it can’t read your notebook.

PWA shell & service worker Read-only catalog albums.db · pool.sqlite Sync relay /api/sync/* — passes ciphertext Availability + art resolver cached
PostgreSQL wire · TLS · psycopg (pooled) ⇅ both ways. Down: store & fetch. Up: sealed rows + wrapped key back. Encrypted in both directions.
Zone 3 · the vault Supabase · Postgres + Auth

Durable storage with daily backups. Holds sealed rows, opaque keys, and your login — never anything readable from your notebook.

journal_rows — ciphertext user_keys — wrapped key, opaque auth.users — email & login invited_emails · access_requests feedback — team-readable, by design
HTTPS · third-party REST · server-side, cached Render always starts it. Down: a lookup by album title only. Up: availability, artwork, listen links. Nothing about you goes out.
Zone 4 · the doors External services

Spotify is the one keyed API (OAuth client token); the rest are keyless and best-effort. When you tap a listen link, your browser goes there directly — and still sends nothing that says it’s you.

Deezer Apple Music / iTunes Spotify YouTube Music Odesli MusicBrainz Cover Art Archive Discogs Bandcamp

What each colour means — the kind of thing that’s crossing

Your words, in the clear
Plaintext notebook + the key. On your device only.
Sealed
Ciphertext & wrapped keys. Moved & stored, never read.
Your identity
Email & login — the minimum to let you back in.
Public catalog & links
Records, dates, availability. Nothing about you.
Outward door
A pull to another service. You leave; nothing follows.
Sealed for good

Your notebook — your notes and what you keep — is encrypted in your browser. The server, the database, and the people who run Music Forest cannot read it — and no one can reset your password for you.

What is visible

Your email is visible — it’s how you sign in and how an invite reaches you. But nothing about what you write is ever tied to it in the clear.

The one open channel

Feedback you send is readable by the Music Forest team, on purpose, so it can be acted on. It’s the only thing you author that isn’t sealed.

No push, ever

Availability lookups carry album titles, not you. No profile, no tracking beacon, no “resurfacing.” Connections are pull-only and stay on your machine.


Part 2

What’s in the code

The repo behind it. How it reaches Render is drawn into Map 1 above (the dashed “code in” wire); the catalog databases are too big for git and rsync in on their own.

Private GitHub repository Flask + SQLite · no-build static PWA · single main branch
server.pyFlask app — JSON API, serves the PWA + cached art, /api/sync/*, security headers.
db.pyAll catalog SQL for albums.db — the one file to change for a different DB backend.
pooldb.pyReads the unified daily-pool: dedup, availability, confirmed platforms, the doors.
journal.pyThe local journal store; the hosted client mirrors it in static/journal-store.js.
auth.py · store.pyJWT verify + the SQLite-or-Postgres sync store (the Zone 2↔3 relay).
static/The PWA shell — app.js, index.html, style.css, sw.js, plus crypto + sync.
tools/Crawlers + pipeline: calendar warmer, prewarmers, MusicBrainz ingest, rsync_pool.sh.
data/Catalog + journal DBs (~5 GB) — gitignored, never committed; rsync’d in separately.

Map 2

What a person can do

A flowchart from first arrival to keeping a notebook. Rectangles are screens or steps; diamonds are decisions the app makes; a door is a pull-only exit that keeps your place and returns at zero cost.

Open musicforest.lol
Signed in already?
Yes
Unlock with password or Face ID → straight to Today, signed in (bottom).
no · guest
Screen you see
Today — the day’s records, one at a time
Each released on this calendar day, any year. You meet one record at a time — nothing is a contest, and nothing is lost.
doors from here
What is this? why this record? About the data ↥ Set-aside pile
Each keeps your place — close it and you’re back on Today.
meet a record
Screen you see
A record to sit with — keep it, or set it aside
Listen, reflect, or wander into it. Keep it and it goes to your notebook; set it aside into a pile you can reopen. Writing a note is optional and saves on your device until you start a notebook.
doors from here
▶ Listen on… out Album details story About the artist story Write a note saved on device
All optional, none pushed — and each returns you right here.
keep this
Have an invite?
No
Request access — you’re reviewed and invited by hand, later. Meanwhile, keep looking around.
yes · first time
Email a sign-in link → open it
The link signs you in and creates your account.
Set an encryption password
Only you ever know it. It can’t be reset — it’s what seals the notebook.
Save your recovery code
The one way back in if the password is ever lost.
Screen you see · signed in · tab 1
Today — the day’s records
You still land here each day, same as before. The difference: everything you keep, and every note, is saved now. The “already signed in” branch up top also lands here.
doors from here
Album story Artist ⤳ Trail Listen out
Today · Notebook · Explore — three tabs, switch anytime
Screen you see · signed in · tab 2
Notebook — your field notebook
Everything you’ve kept, in one place — the records you kept and the notes you wrote. You can write about any album on file here, not just today’s.
doors from here
✎ Write about any album Album story Export notebook Delete account
… and Explore, the third tab
Screen you see · signed in · tab 3
Explore — the whole catalog
Search any album, artist, or label — and write about anything you find, not only what today brought you. The forest grows from what you keep.
doors from here
Search Album story About the artist ✎ Write a note
The day returns — new records to meet each day, one at a time.
Screen you see A step in a flow A decision the app makes Start / repeat Door — pull-only, returns you here