Skip to main
Omar Nagy.

Client buildcase 08 / 08

Leyla Mozayen archive.

A working archive for a twenty-year experimental art practice, several hundred pieces, that the artist runs herself: she adds work, writes about it, arranges her own home page, and decides what publishes, from a private studio installed on her phone.

24msa 300-piece series, renderedVerify it live · leylamozayen.com

ES modules, no build stepSupabase Postgres + StorageRow-level securityPWA studioVercel

Leyla Mozayen archive: dark home page with her handwritten wordmark, a marionette in an arched frame, and three category tags along a hairline.

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.

Previous build, image lookup per piece108ms
Batched lookup, 300 pieces8ms
Full index of the archive5ms

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.

  1. 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.
  2. 02Write about the workQueues for needs-writing, drafts, and unfiled, with search across all of it and a caption per image.
  3. 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.
  4. 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.

L1Row-level security
L2Limits as database rules
L3Keepalive with a visible heartbeat
L4Stale-tab detection

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.

L1The symptom
L2The cause
L3The fix
L4The rule that came out of it

the receipts

24ms
a 300-piece series, rendered
13.5x
faster image lookup at scale
RLS
privacy in the database
Her domain
indexed under her name