§ Project
per/frame
Film prices compared by cost per frame, across pack sizes and stores.

perframe.app is our answer to a deceptively hard problem: photographic film is sold in a dozen incompatible packagings (single rolls, 3- and 5-packs, 120, sheet film, 100-foot bulk rolls), so the price on the sticker tells you almost nothing. perframe normalizes all of it into one comparable metric, cost per frame, and ranks every pack size so the genuinely cheapest option is obvious.
What it does
- One honest number. Every listing across every vendor is converted to cost per frame. For 35mm that’s exposures per roll; for sheet film a sheet is a frame; a 100ft bulk roll becomes ~18 rolls of 36. 120 film even recomputes per camera format, since a 6x4.5 back squeezes 16 frames from a roll where 6x7 gets 10.
- Cross-vendor comparison. Prices are scraped and refreshed daily from multiple vendors, so each film shows a pack ladder ranked by real value. Out-of-stock offers stay visible but clearly labeled.
- Pack-size intelligence. Bulk isn’t always cheaper. The per-frame ranking exposes when a cheap single roll beats the pro pack, and when the 100ft roll genuinely wins.
- Instant, client-side browsing. The whole catalog ships as one JSON blob; grouping, filtering, sorting, and faceting all happen in the browser with zero backend latency.
How we built it
The system is deliberately simple and cheap to run:
- SQLite is the source of truth: the film catalog, listings, vendors, and an append-only
price_observationstable that forms a longitudinal price history. - Thin vendor importers collect and parse product data per vendor; shared matching, dedup, and out-of-stock logic lives in one tested core, so adding a vendor takes an afternoon.
- A static export step builds one
prices.jsonplus pre-rendered SEO pages, deployed to Cloudflare Pages. No servers, no database in the request path. - The frontend is vanilla JS: no framework, no build step. Designed to be legible to both shoppers and the AI agents that increasingly shop on their behalf.
Why it matters
perframe is Slova’s engineering philosophy in miniature: take a messy, fragmented data problem, normalize it into something honest, and ship it as a fast, maintainable system that costs almost nothing to operate.