One artwork. Three files. Change the size to see what travels over the network.
Queen Louise · Elizabeth S. Tucker
4.1 kB
160 × 294 px
A 160-pixel derivative for the small artwork tile. The request matches the place the image will appear.
Original JPEG88.3 kB
Tile · AVIF4.1 kB
Detail · AVIF14.4 kB
One bundled JPEG, resized without enlargement through Sharp 0.35.5. The detail stays at the 339 px source width. AVIF quality 55, effort 2. Encoded file sizes; excludes HTTP overhead. This is a reproducible sample, not the historical page benchmark.
Make the image path part of search.
A result is not ready while its image is still empty.
Request
The product requests 160, 320, 640 or 1280 pixels and tries AVIF, WebP and JPEG. Decoding is asynchronous, with responsive sizes and an explicit unavailable state.
Prepare
The container build prepares 120 opening previews through the same pipeline used at runtime. Other museum images arrive as needed.
Bound
Three simultaneous transforms, a pending-work limit, remote timeouts and a source-size budget prevent an image burst from becoming unlimited work.
Recover
Matching requests share work. Format fallback and source backoff bound retries when the museum source fails.
A graph belongs to a corpus. A derivative belongs to a source, a size, a format and a pipeline version.
01
Corpus
Download & hash
02
Graph
Load compatible snapshot
03
Derivative
Read disk or generate
04
Browser
Store the response
A prepared graph saves construction, not transfer. The browser still loads the corpus and checks compatibility. An uncached derivative needs a transform.
Illustrated request behavior from the release code. This diagram issues no live requests.
The release’s cache policies
Resource
Identity
HTTP behavior
Corpus / graph
Checksum + encoder version
Revalidate before reuse
HTML / pack manifest
Current release / active pack
Do not store
Local artwork
Versioned pack URL
One year · immutable
Local derivative
Source + size/mtime + width + format
One year · immutable
Remote derivative
Source + daily bucket + width + format
One day
Other modules
File size / mtime ETag
Five minutes unless filename is hashed
Fresh, validated and persistent are different.
Fresh
A fresh immutable response can avoid a request entirely. Changing its URL is essential when the underlying pack changes.
Validated
A matching conditional request can return 304. It still made a trip to the server.
Persistent
A disk cache needs a persistent mount to survive container replacement. The Dockerfile alone does not establish that configuration.
The walkthrough above opens up individual decisions. These captures show how they come together in Needle.
Actual Needle release captured locally, 4 October 2026 · revision baa50f2 · query: Queen Louise. This capture does not measure the public host.
Stack, limits and verification.
10,000Catalog records
120Opening previews
3Simultaneous transforms
96Retained decoded sources
My role
Product design and performance engineering: search initialization, image delivery, cache identity and rendering budgets.
Search model
Field-weighted museum metadata and hybrid retrieval in this release. The case study does not claim the experimental neural retrieval system.
The graph still has to arrive.
Cold visit
Precomputation moves work earlier. A worker moves it away from the interface. The corpus and graph still have to cross the network.
Public host
Host startup is a separate clock from browser initialization. Local captures do not establish public-host latency or uptime.
Evidence with a boundary.
Verified source
The manifest declares 10,000 records and 120 opening images. The graph checksum matches the corpus. The mechanisms above are linked to the pinned release.
Image sample
The encoded file sizes are reproducible from one bundled artwork. They do not establish a whole-page transfer reduction.
Historical performance
The original before/after artifacts are absent from the public package. Startup, LCP, heap, scroll and slow-network gains are not quantified here.