Joshua Shay Kricheli NeuroSymbolic AI
v2 v1

Release · v3.14.20

Serve the site's own images from the site, not the…

perf(assets): serve the site's own images from the site, not the database

perf v3.14.20 August 17, 2026 Joshua Shay Kricheli 66d1f6d

Details

The portrait, the favicon and the three stills the v1 rotator cycles through
are static site chrome. They never vary per request and they are not row data,
so resolving them through `db://` bought nothing and cost the whole free-tier
egress budget.
They now ship in `assets/img/` and are referenced directly, which takes them
off the Supabase bill entirely and lets GitHub Pages serve them.
Measured on a real build, at 1440 wide, Supabase bytes per cold page load:
  /      7041.3 KiB -> 140.6 KiB  (50x)
  /v1/   6917.8 KiB ->  31.4 KiB
  /v2/   7029.3 KiB -> 142.8 KiB
Storage requests per page load go to zero.
The rotator derives its file names from whatever `src` the template rendered
rather than hard-coding a path, so it survives a non-empty `baseurl`, and it
warms the other three stills after load so a rotation never shows an empty
frame mid-flip.
The v2 portrait deliberately keeps no width/height attributes: its frame sets
`aspect-ratio: 4 / 5` with `object-fit: cover`, so an intrinsic square ratio
would be overridden anyway and stating one would only mislead.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DAJJ63FFnLoD5XLpu6yJaG

Files changed (7)

frontend/client/ts/components/profile-rotator.ts +35 −15
frontend/jekyll/_includes/v2/hero.html +6 −1
frontend/jekyll/_includes/v3/hero.html +1 −1
frontend/jekyll/_layouts/changelog.html +1 −1
frontend/jekyll/_layouts/default.html +2 −2
frontend/jekyll/_layouts/v2.html +1 −1
frontend/jekyll/_layouts/v3.html +1 −1