shark-movies.net
a curated database of shark cinema — the classics, the rip-offs, the straight-to-streaming disasters — designed and built end to end as a solo project.
- role
- design and build, self-initiated
- scope
- product, data pipeline and interactive features
- astro 6
- typescript
- tailwind v4
- cloudflare workers
- d1
- drizzle
- github actions
- tmdb
- turnstile
- vitest
01 the idea
not another movie listing. a reference site that claims a category and defends it — a published methodology page setting out what counts as a shark movie, and a catalogue sorted into the ones that hold up, the ones that are gloriously bad, and the documentaries that are somehow worse.
02 the look
a bespoke retro-broadcast design system in tailwind v4, carried across seventeen components: self-hosted display and mono faces, scanline and glow treatments, an on-screen-display clock, custom logo and favicon.
03 the data
the catalogue is git: one versioned json file per title — 451 and counting — refreshed weekly by a scheduled github actions job that sweeps tmdb (discovery by keyword, watch providers, trailers) and commits the diff, so streaming data stays current without me touching anything. a build step merges facts with editorial through a single publish gate and prerenders every movie page. slugs are permanent (/movie/jaws-1975) with 301s from legacy ids, so urls survive title edits and any change of data provider — the catalogue itself started life in an edge database and moved to files without breaking a single link.
04 curation as code
threat levels, shark screen time and curator notes are editorial, not facts, so they live in version-controlled json the weekly refresh can never overwrite. an ai-assisted workflow drafts the curation for each new title into a quarantine the build never reads — nothing reaches the site until i've reviewed it and merged it myself, and the two kinds of data never contaminate each other.
05 no accounts, no tracking
the tribunal is a public vote on whether contested titles even count as shark movies, with objections and atomic aggregate counters, one vote per browser on the honour system. there's a watchlist, a survival record, and a form for reporting films i've missed. the vote tallies are the only database left — two tables, snapshotted to git weekly — and all of it works with no sign-up and no cookies: the interesting features didn't need to know who anyone is.
06 speed and hardening
nearly every page ships as a prerendered static asset; the few that stay dynamic are served from a hand-rolled edge cache on cloudflare workers. every push deploys through a gate — typecheck, twenty-five unit-test suites, then a smoke test that waits for the new build id on a health endpoint and rolls back automatically if the live site misbehaves. hardened security headers, per-ip rate limiting and turnstile on all three forms; json-ld, open graph images and a dynamic sitemap for the search engines and answer engines.
07 the constraint
tmdb's free tier forbids making money from the site, so every monetisation idea is explicitly parked behind a planned move to a commercially-licensed data provider — written down as a roadmap rather than shipped now and unpicked later. the catalogue schema already carries the fields the new provider will fill.