Changelog
A running log of notable updates. This site is actively being built by a solo indie developer — things change often.
Changelog
A running log of notable updates to the site. Updated roughly as things land.
April 2, 2026 — Security & performance hardening, UX polish
Security
- Admin authentication — All
/admin/*endpoints now require a secret API key; requests without it are rejected with 401. - Security headers — Every response now includes
Content-Security-Policy,X-Frame-Options: DENY,X-Content-Type-Options: nosniff, andReferrer-Policy. - CSRF protection — Report submission forms are now protected with HMAC-based CSRF tokens.
- Rate limiting — Report submissions capped at 5 per IP per hour; analytics tracking capped at 30 per IP per minute.
- URL validation — Discussion thread URLs are now validated as proper HTTP/HTTPS URLs before being stored.
- Ratings constraint — Database now enforces that rating scores must be between 1 and 5.
Performance
- Sitemap caching — Sitemap responses are now cached in memory for one hour instead of querying the database on every crawl request.
- Genre cache TTL — The search genre list now expires after 30 minutes, matching the browse sidebar.
- Rating sort index — Added a database expression index on rating count to speed up rating-sorted browse pages.
- Creator enricher — Switched from
OFFSET-based pagination to keyset pagination for faster enrichment runs on large datasets. - Database connection pool — Pool size, overflow, and timeout are now explicitly configured via environment variables.
- Reduced redundant fetches — Analytics stats are now fetched once per homepage request instead of twice.
- Paginated creator API —
GET /api/v1/creator/{slug}now acceptspage/per_pageto avoid unbounded responses for prolific creators.
Bug fixes & missing features
- Error pages — 404 and 500 errors now render the proper error template instead of a bare JSON response.
- Picks correctness — The Picks page now matches items by both slug and media type, preventing the wrong item from showing when two types share a slug.
- Browse tag sidebar — Tag browse pages now populate the genre and decade filter sidebar.
- Stale ingestion logs — Any ingestion job that was left in
"running"state from a crash is now reset to"error"on startup. - Ingester resilience — Each item upsert in all four ingesters (movies, TV, books, games) is now wrapped in a database savepoint so one bad record can't abort the entire batch.
- Analytics auth on popular-by-country — The popular-by-country page now sends signed auth headers when fetching analytics data.
- Reload content without restart — New
POST /admin/reload-contentendpoint reloads blog posts and picks from disk without requiring a process restart.
UX / Frontend
- Breadcrumbs — Media detail, creator, and browse pages now show visible HTML breadcrumb navigation.
- Creator type tabs — Creator pages now have filterable type tabs (Movies / TV / Books / Games) with pagination when a type is selected.
- Language display names — The browse sidebar now shows full language names (e.g. "Japanese") instead of raw ISO codes.
- Loading indicator — A slim indigo progress bar appears across the top of the page during navigation.
- No ratings yet — Media pages without any ratings now show an explicit "No ratings yet" message.
- Favicon — Site now has an SVG favicon.
April 2, 2026 — Creator discovery improvements & content filtering
Creator browsing (/creators)
- Role filter — Filter the creator listing by role (Director, Writer, Author, Developer, etc.) using a dropdown populated from live data.
- Nationality filter — Filter creators by nationality; dropdown auto-populates from available values.
- "Recently added" sort — New sort option surfaces creators that were most recently added to the database.
- Breadcrumbs — Visible breadcrumb navigation and JSON-LD
BreadcrumbListadded to the listing page.
Creator detail (/creator/{slug})
- Full role breakdown — The stats bar now shows a complete tally of every role (e.g. "Director · 14, Writer · 3") instead of a single primary role label.
- "Known for" genres — Top genres across all of a creator's works are shown as chip links below the stats bar.
- Collaborators — A strip of the six creators who appear most frequently alongside this person is shown on their profile.
- Decade filter — Works can now be filtered to a specific decade via pills derived from the creator's career span.
- Works sort — Works list can be sorted oldest-first or newest-first.
Search & discovery
- Creator match strip — When a search query matches a creator's name, a highlight strip showing up to three matching creator cards appears above the media results.
- Creator autocomplete API — New
GET /api/v1/creators/autocomplete?q=endpoint returns matching creators with name, image, and work count for use in typeahead UIs. - "Notable creators" on browse pages — Genre and tag browse pages now surface up to 12 notable creators (by work count) in a card strip above the media grid.
Content filtering
- Explicit genre blocklist — A curated blocklist of adult/explicit genre slugs is now applied at every genre query (browse sidebar, tag pages, search filter dropdown), preventing them from appearing in the UI.
- Ingestion-time filtering — All four ingesters (movies, TV, books, games) now skip genre associations matching the blocklist, preventing new explicit genres from being written during future ingestion runs.
- Database cleanup migration — Migration
0009removes existing explicit genre records and their media associations from the database.
March 29, 2026
- WIP banner & movie data notice — Added a site-wide banner letting visitors know the site is new and actively being built. Movie browse page now shows a callout about ongoing data improvements.
- Mobile navigation — Improved responsiveness and layout adjustments across small screens.
- Tailwind CSS — Migrated to compiled Tailwind CSS via a dedicated Docker build stage.
- RSS feeds — Blog RSS now includes full post HTML instead of just the excerpt.
March 26–28, 2026
- Ratings & discussion links — Media items now surface community ratings and links to discussions.
- Public API — Full API documentation published for the FollowTheCredits data API.
- Picks updated — New TV show, movie, and game recommendations added to the Picks page.
March 24–25, 2026
- Movie data overhaul — Completely rebuilt movie ingestion pipeline with year-based pagination, retry logic on SPARQL failures, and checkpointing so interrupted runs can resume.
- Language & nationality enrichment — Movies now carry original language data; creators now have nationality. Both sourced from Wikidata.
- Creator Wikipedia links — Creator profiles now link out to Wikipedia where available.
- Data reporting & manual corrections — Added an internal system for flagging and correcting bad data without waiting for a full re-ingest.
- Search performance — Genre filters and search queries now use caching and optimised joins; search timing is logged for monitoring.
- Docker improvements — Tailwind CSS compiled in a separate build stage; Nginx rate limiting configured.
March 23, 2026 — Big feature day
- Blog launched — Markdown-based posts served from
content/posts/. - Picks page launched — Curated personal recommendations with notes.
- Creator browsing — New
/creatorspage with stats, nationality, and related works per creator. - Browse filters overhauled — Multi-select genres, decade/year filter, platform filter, and sortable results.
- Game platform support — Xbox, Nintendo Switch, and Windows platform variants all recognised.
- Media type icons — Emoji icons added to media cards throughout the site.
- Genre quality — Genre filter tightened to only show genres with enough entries; whitelist cleaned up.
- Performance — Full-text search indexes added; sidebar genres/decades/platforms now cached; browse queries rewritten with subqueries.
- Alembic auto-migration — Database migrations now run automatically on app startup.
March 22, 2026
- Affiliate links — Purchase/stream links added across all media types: Amazon, Audible, and Bookshop.org for books; platform store links for games; streaming links for movies and TV.
March 20–21, 2026
- Book data enriched — Descriptions and subjects now fetched from Open Library and cached; genre handling uses subjects from the detail endpoint.
- Docker & Nginx — Port configuration corrected; Nginx proxy settings stabilised.
March 18–19, 2026 — Initial launch
- Site goes live with ingestion pipelines for movies, TV, books, and games.
- SEO groundwork: meta tags, Open Graph, sitemap generation.
- Analytics proxy and "Popular by Country" page added.
- Authentication scaffolding set up.
- Nginx configured for static file serving and request proxying.