dadjoketoday.com
A new joke every 12 to 24 hours!

I wanted to create some clean fun for the internet. Anonymous voting adds a social aspect without privacy concerns.
- Serves a new joke every 12-24 hours via a time-boxed survey model, with anonymous thumbs-up/down voting tied to a SHA-256 fingerprint of IP + user-agent - no accounts, no cookies required to vote
- Dynamic social-share images generated per joke, with punchline-aware truncation so the preview teases the setup without spoiling the punchline
- Web push notifications (PWA install, VAPID keys, service worker) alert subscribers when a new joke goes live
- RSS/Atom feed of jokes at /rss and /feed
- Admin dashboard behind Google OAuth for authoring jokes and phrases, and reviewing survey results, without touching Firestore directly
- Bulk joke import pipeline for seeding the question bank from CSV/JSON sources
Go backend using chi for routing and Templ for server-side HTML templating, compiled to a single static binary and deployed as a Docker container on Cloud Run with autoscaling.
Firestore is the sole datastore - jokes, phrases, surveys, fingerprint votes, and push subscriptions are all Firestore documents, queried directly from Go via the Firestore client, no ORM.
A Google Cloud Tasks queue drives the joke rotation: a bootstrap script schedules the next survey-creation task at a randomized 12-24 hour interval, which calls back into the service's internal API to close the current survey and open the next one - eliminates always-on cron infrastructure in favor of pay-per-invocation serverless scheduling.
Anonymous voting integrity relies on a stateless SHA-256 fingerprint (IP + User-Agent) rather than accounts or persistent cookies, trading perfect vote-dedup accuracy for zero-friction, privacy-preserving participation.
Frontend is pure CSS with vanilla JS - no framework - server-rendered Templ components handle all markup, keeping the client bundle minimal.