Personal project · AI-Powered Web App
PosterOCR
Concert and festival posters pack in a lineup, dates, venue, and location that aren't easy to search or save. PosterOCR turns a photo of a poster into structured, searchable event data using Claude's vision model, with caching to keep repeat lookups fast and cheap.
Context
Music posters are dense with information — lineup, set times, dates, venue, ticket links — but that information only exists as an image. I built PosterOCR so anyone can drop in a photo of a poster and get that information back as structured, usable data instead of squinting at a flyer.
The problem
Reading a poster reliably means handling wildly inconsistent layouts (festival lineups vs. single-band flyers), extracting a specific shape of data (headliners, support acts, one or more dates, venue, location) rather than just transcribing text, and doing it without exposing an API key to the browser or re-paying for the same poster every time someone uploads it again.
What I built
- A server function on Cloudflare Workers (TanStack Start) that sends the uploaded image to Claude’s vision model with a structured JSON schema, so extraction returns typed fields — headliners, full artist list, venue, location, dates, set times, ticket info, genres — rather than freeform text. The Anthropic SDK and API key stay server-side.
- A two-tier cache in D1 and R2: poster extractions are keyed by a SHA-256 hash of the image bytes, so re-uploading the same poster skips the vision call entirely; artist enrichments (bio, genres, top songs, official links, sourced via Claude + web search) are cached by normalized name with a 30-day TTL, so recurring acts are looked up once.
- An upload-and-review UI built with React and TanStack Query, plus a “suggest an edit” flow (protected by Cloudflare Turnstile) so users can flag incorrect extractions.
- An admin review queue at
/admin, gated by Cloudflare Access, where an owner can apply community-submitted corrections to a poster’s stored data or triage artist-info suggestions.
Outcome
The result is a working pipeline from photo to structured, cached event data — the posters table doubles as a persistent store that other views (like a poster gallery) can build on without needing a rigid, upfront schema.