01 · the starting point
A site that did not open on a phone.
She arrived with a previous build she liked the look of and could not use: no backend, and on a phone the hero name rendered at near-zero opacity while the navigation collided with itself. The first job was to measure it, not to guess at it.
02 · the studio
She runs it. From her phone.
An installable Studio, private to her, where the archive gets built the way she actually works: drop a batch of photos and get private drafts without being forced to file them, then write, arrange, and publish when she is ready.
- 01Drop the photosA batch of images becomes a batch of private drafts in an Unfiled bucket. Uploading never forces a filing decision she has not made.
- 02Write about the workQueues for needs-writing, drafts, and unfiled, with search across all of it and a caption per image.
- 03Arrange the home page by handA control rail whose sliders write the CSS variables the live stylesheet reads. What she arranges is the site, with a separate arrangement for the phone.
- 04PublishDrafts stay private by default. Publishing is her decision, per piece.
03 · privacy
Enforced in the database, not the interface.
An anonymous visitor can only ever read published, filed work, and the rule lives in the database rather than in the front end. Verified with the public key: the anonymous client sees none of the draft probes and cannot write.
04 · what went wrong, and what it taught
A blank page with no error.
Bumping the local database version hung the page forever while another tab held the old version. It rendered blank with zero console output, the same symptom as her original complaint. It is now handled explicitly, with a visible error state, and the lesson is that a silent failure is the worst kind.
