Branch per journal entry. Tag on merge. The git workflow maps to the journal lifecycle:
journaling→ branch exists, deployed to your per-user namespace. You see it live. Nobody else does.shipped→ merged to main, tagged, snapshot deployed tos3://bucket/tags/<tag>/. Permanent.
Time travel
Every shipped journal entry has a tag. Every tag has a deployed snapshot. The journal index becomes a timeline. Click any shipped entry → see the site as it was when that feature landed.
Not every commit. Just the intentional moments — the ones you chose to mark by shipping a journal entry.
The tester handoff
Assign a tester to your branch: update their JWT claim (or a config file) to point at your branch prefix. They see your work at the same URL. No staging link to share. No subdomain. Just identity → namespace.
When testing is done, remove the assignment. They see main again.
Multiple people, same URL
Each person's JWT determines what they see. Person A sees their branch. Person B sees theirs. The tester sees whoever's branch they're assigned to. Everyone else sees main. One URL. Per-user namespaces. Plan 9.
The journey
prev: one-url-per-branch next: per-user-namespaces The one-url-per-branch post used subdomains. This sharpens it: no subdomains needed. Per-user namespaces via JWT. Branch per journal, tag on merge. The site becomes a time machine through its own history.