A single-page photoblog that pulls photos from Flickr, shows them one per day with a queue system, and optionally cross-posts to Nostr. Pure static SPA — one HTML file with all CSS and JS inlined, no build step, no framework — served from Cloudflare Pages, with Pages Functions as the backend and Cloudflare KV for cache + admin state.
Each new photo is signed server-side and broadcast to a configurable Nostr relay set. Replies, reactions, and zap totals are pulled live from the relays on view. A daily queue picks one photo per calendar day — upload ten at once, and the extras wait their turn so readers never get a bulk drop.
Upload a burst to Flickr; the queue releases one per calendar day. Admin can pin, reorder, or force-live any photo on any date.
Each photo gets a cross-referenced set based on shared albums, tag overlap, and date proximity — rebuilt incrementally.
Replies, reactions, and zap totals fetched from configurable relays on view. All aggregated across every cross-posted photo and note.
Geotagged photos organized into a country → state → place tree via reverse-geocoded woeids. Incrementally built — 40 lookups per run.
EXIF aggregation grouped by camera body and lens. Pulls one photo's EXIF at a time, respecting Flickr rate limits.
Full Flickr photoset tree with cover photos. Only albums whose date_update changed re-fetch — 35 per background run.
Short-form notes with [photo:id] shortcode expansion. Published to the same RSS feed and auto-cross-posted as kind-1 Nostr events.
Admin-only batched analysis across every Nostr-posted item — per-hour and per-day breakdowns with a recommended optimal post time.
Perceptual-hash tool in admin that finds unlinked Nostr events matching a Flickr photo, so older posts can be retroactively linked.
VAPID-signed push notifications when a new photo drops. Subscribers opt in from the settings drawer — no email required.
Self-hosted page-view beacon — path + external referrer hostname + viewport width only. No cookies, no fingerprinting, no PII.
Drop Flickr entirely: migrate to R2 for images, D1 for metadata, Nominatim for geocoding. Migration plan lives in the repo.
HTML + inline CSS/JS frontend · Cloudflare Pages Functions
(Workers runtime) backend · Cloudflare KV for cache + config ·
@noble/curves for Nostr signing · VAPID Web Push ·
Flickr API · 0 recurring cost on Cloudflare's free tier.