๐Ÿ“š MediaLog Case Study

Building a Modern Media Tracker Through Human-AI Collaboration

7.5 Hours Total
5 Versions
782 Books
50 Movies
10 Pages

The Journey: From Concept to Production

MediaLog is a personal media tracking application that combines Letterboxd (movies) and Goodreads (books) data into a single, beautiful dashboard. This case study documents the complete development process, from initial concept to production deployment, built entirely through human-AI collaboration over the course of a single day (February 9, 2026).

What makes this project interesting isn't just what was builtโ€”it's how it was built. Every line of code, every design decision, and every feature was created through iterative dialogue between a human (Thomas Hunt) and an AI assistant (Claude by Anthropic). No traditional coding. No frameworks. Just conversation, iteration, and rapid prototyping.

~3,500
Lines of Code
40+
Features
$84
Annual Cost
100%
AI-Assisted

๐Ÿ—‚๏ธ Version History

Version 1.0: Foundation & Data Integration

February 9, 2026 - Morning Session โฑ๏ธ 2 hours

๐ŸŽฏ The Challenge

Create a centralized dashboard to track personal media consumption from multiple sources. The existing setup involved checking Letterboxd for movies and Goodreads for books separatelyโ€”no unified view, no analytics, no insights.

๐Ÿ’ก The Solution

Build a custom web application that aggregates data from both platforms into a MySQL database, providing a single source of truth for all media consumption.

๐Ÿ—„๏ธ Database Design

Created MySQL schema with posts table supporting multiple content types:

  • Universal fields (title, date, rating)
  • Books: author, pages, full reviews
  • Movies: director, runtime, genres
  • Images and URLs from CDNs

๐Ÿ“ฅ Data Scraping

Built scrapers for two platforms:

  • Goodreads: 782 books with reviews
  • Letterboxd: 50 movies with ratings
  • Metadata: dates, images, descriptions

๐ŸŽจ Basic Interface

Initial dashboard with essential features:

  • Simple list view of all items
  • Basic stats (total books/movies)
  • Individual item pages
  • Purple gradient aesthetic

โš™๏ธ Configuration

Production-ready setup:

  • DigitalOcean droplet deployment
  • MySQL database configured
  • PHP backend with PDO
  • Clean URLs with routing

๐Ÿ”„ Key Changes in v1.0

  • Created: Database schema from scratch
  • Imported: 832 total items (782 books + 50 movies)
  • Built: 4 core pages (index, books, movies, individual views)
  • Deployed: Live on 1n2.org/hunt-hq
๐Ÿ˜ PHP 8.x
๐Ÿ—„๏ธ MySQL 8.0
๐ŸŽจ Pure CSS
โ˜๏ธ DigitalOcean
๐Ÿ”ง PDO
๐Ÿ“Š No Framework

๐Ÿ“ˆ Results

By the end of Session 1, we had a working application with a complete database of personal media history. The foundation was solid: clean separation of concerns, efficient queries, and a scalable architecture ready for enhancement.

Version 2.0: Advanced Analytics & Insights

February 9, 2026 - Midday Session โฑ๏ธ 1.5 hours

๐ŸŽฏ The Challenge

Having raw data wasn't enough. Users (me!) wanted deeper insights: reading patterns, viewing habits, projections for year-end goals, and meaningful statistics beyond simple counts.

๐Ÿ’ก The Solution

Enhance the application with three dedicated analytics pages, each providing unique insights into consumption patterns, trends, and future projections.

๐Ÿ“Š Statistics Page

Comprehensive stats across all media:

  • Books by year (2010-2025)
  • Movies by decade (1950s-2020s)
  • Rating distributions (โ˜… to โ˜…โ˜…โ˜…โ˜…โ˜…)
  • Average pages per book
  • Top rated items

๐Ÿ“š Book Insights

Reading-specific analytics:

  • Current pace (books/day, pages/day)
  • Longest reading streak detection
  • Year-end projections
  • Monthly reading patterns
  • Completion rate analysis

๐ŸŽฌ Movie Insights

Viewing-specific analytics:

  • Movies per month trends
  • Genre preferences
  • Release year distribution
  • Runtime statistics
  • Rating patterns

๐Ÿ”ฎ Predictions

Smart forecasting features:

  • Year-end book/movie projections
  • Pace sustainability analysis
  • Comparison to previous years
  • Goal tracking suggestions

๐Ÿ”„ Key Changes in v2.0

  • Added: 3 new analytics pages (stats.php, insights.php, movie-insights.php)
  • Implemented: Streak detection algorithm for consecutive days
  • Created: Year-end projection calculations based on current pace
  • Enhanced: Database queries with complex GROUP BY and aggregations

โŒ Before v2.0

  • Simple count: "You have 782 books"
  • No trends or patterns
  • No year-over-year comparison
  • No predictive analytics

โœ… After v2.0

  • Rich insights: "At current pace, you'll read 125 books this year"
  • Streak tracking: "Your longest streak was 14 consecutive days"
  • Trends: "You read 40% more in 2020 than 2019"
  • Decade analysis: "You prefer 2010s movies (60%)"

๐Ÿ’ป Technical Implementation

// Example: Year-end projection calculation $daysInYear = 365; $daysPassed = date('z') + 1; $daysRemaining = $daysInYear - $daysPassed; $booksPerDay = $booksThisYear / $daysPassed; $projectedBooks = $booksThisYear + ($booksPerDay * $daysRemaining); // Smart rounding for realistic projections $projected = round($projectedBooks);

๐Ÿ“ˆ Results

Analytics transformed the application from a simple tracker to a powerful insights tool. Users could now understand their consumption patterns, set realistic goals, and discover interesting trends in their viewing/reading habits.

Version 3.0: Modern 3-Column Homepage Redesign

February 9, 2026 - Afternoon Session โฑ๏ธ 2 hours

๐ŸŽฏ The Challenge

The existing homepage was functional but boring: just a simple list of recent items. We wanted something more engagingโ€”a dashboard that felt personal, highlighted memories, and made rediscovering content easy.

๐Ÿ’ก The Solution

Complete homepage redesign with a modern 3-column layout, hero stats section, and an innovative "On This Day" feature that surfaces memories from previous years.

๐ŸŽจ Hero Section

Eye-catching stats display:

  • Large gradient background
  • 4 live stat badges
  • Welcome message
  • Glass morphism effects

๐Ÿ“… On This Day

Smart memory feature with fallback:

  • Shows items from same date, previous years
  • Searches backward if empty (max 365 days)
  • Visual indicator for fallback dates
  • Mix of books and movies

โฐ Recent Activity

Latest consumption timeline:

  • 6 most recent items
  • Mixed books and movies
  • Color-coded badges
  • Consumption dates shown

๐ŸŽฒ Random Picks

Rediscovery feature:

  • 6 random items per visit
  • Refreshes on reload
  • Helps rediscover favorites
  • Equal book/movie mix

๐Ÿ–ผ๏ธ Visual Gallery

Image-first design:

  • Grid of 8 poster images
  • Hover effects with overlay
  • Title and rating on hover
  • Gradient overlays

๐Ÿงญ Navigation

Sticky top navigation:

  • Glass morphism effect
  • Gold accent on active page
  • Links to all pages
  • Responsive wrapping

๐Ÿ“ฑ Mobile Responsive

Full mobile optimization:

  • 3 columns โ†’ 2 โ†’ 1 on small screens
  • No horizontal scroll
  • Touch-friendly targets
  • Optimized font sizes

โœจ Animations

Smooth interactions:

  • Card hover elevations
  • Fade transitions
  • Scale effects
  • 0.3s timing

๐Ÿ”„ Key Changes in v3.0

  • Redesigned: Complete homepage overhaul from list to dashboard
  • Implemented: "On This Day" with 365-day fallback algorithm
  • Added: Visual gallery with poster images from CDNs
  • Fixed: Mobile horizontal scroll issues
  • Enhanced: Book/movie link parsing for proper navigation

๐Ÿ’ป The "On This Day" Algorithm

// Smart fallback: never show empty if (empty($onThisDay)) { for ($daysBack = 1; $daysBack <= 365; $daysBack++) { $checkDate = date('m-d', strtotime("-{$daysBack} days")); // Query for items on this historical date $fallback = queryItemsByDate($checkDate); if (!empty($fallback)) { $onThisDay = $fallback; $onThisDayDate = date('F j', strtotime("-{$daysBack} days")); break; // Exit on first match } } }

โŒ Before v3.0

  • Simple vertical list
  • No visual hierarchy
  • Text-heavy interface
  • Mobile scroll issues
  • No memory features

โœ… After v3.0

  • Modern 3-column dashboard
  • Clear visual hierarchy with hero
  • Image-first design
  • Perfect mobile experience
  • "On This Day" memories

๐Ÿ“ˆ Results

The redesign transformed user engagement. The "On This Day" feature became the most-used feature, encouraging daily visits. The visual gallery made browsing enjoyable, and the 3-column layout maximized information density without feeling cluttered.

Version 4.0: Directors Page & Enhanced Metadata

February 9, 2026 - Late Afternoon โฑ๏ธ 1 hour

๐ŸŽฏ The Challenge

The application had an Authors page for books but nothing equivalent for movies. We wanted symmetry: if we can track favorite authors, why not favorite directors? Plus, the movie data lacked critical metadata like runtime, genres, and director information.

๐Ÿ’ก The Solution

Build a comprehensive Directors page mirroring the Authors functionality, and create a metadata scraper to enrich movie data from Letterboxd with directors, genres, and runtime information.

๐ŸŽฌ Directors Page

New analytics page for filmmakers:

  • List all directors watched
  • Count of films per director
  • Years watched for each
  • Poster grids for each director
  • Sorted by watch count

๐Ÿ•ท๏ธ Metadata Scraper

Letterboxd data extraction:

  • Fetches canonical film pages
  • Extracts director from meta tags
  • Captures genres from links
  • Parses runtime in minutes
  • Handles multi-director films

๐Ÿ‘ฅ Multi-Director Support

Smart director parsing:

  • Splits comma-separated directors
  • Removes "et al" suffix
  • Credits each director individually
  • Same film appears under all directors

๐Ÿ“Š Director Stats

Summary metrics displayed:

  • Total unique directors
  • Total movies tracked
  • Average films per director
  • Most-watched director

๐Ÿ”„ Key Changes in v4.0

  • Created: directors.php page parallel to authors.php
  • Built: Letterboxd metadata scraper (scraper-final.php)
  • Enhanced: Database with director, genres, runtime_minutes columns
  • Populated: 41 out of 50 movies with complete metadata
  • Added: Directors link to navigation on all pages

๐Ÿ’ป Scraper Implementation

// Convert user URL to canonical film URL $canonicalUrl = preg_replace( '/letterboxd\.com\/[^\/]+\/film/', 'letterboxd.com/film', $movie['url'] ); // Extract director from meta tag if (preg_match('/

โŒ Before v4.0

  • Authors page for books only
  • Movies had no director data
  • No genre information
  • Missing runtime data
  • Asymmetric feature set

โœ… After v4.0

  • Directors page mirrors authors
  • 41 directors cataloged
  • Genres for all movies
  • Runtime data populated
  • Symmetrical book/movie features

๐ŸŽจ Director Card Design

Each director card displays their name, film count, years watched, and a grid of poster images for every film they directed. The cards are sorted by watch count, putting your most-watched directors at the top.

๐Ÿ“ˆ Results

The Directors page became immediately useful, revealing interesting patterns: "I've watched 5 films by Christopher Nolan" or "I only discovered Greta Gerwig in 2023." The metadata enrichment also enabled future features like filtering by genre and runtime-based analytics.

Version 5.0: MediaLog Rebrand & Professional Polish

February 9, 2026 - Evening Session โฑ๏ธ 1 hour

๐ŸŽฏ The Challenge

The application was functionally complete but lacked a cohesive identity. The name "Hunt HQ" was generic and didn't convey the purpose. We also had edge cases with empty 2026 data showing zeros, and the overall polish needed refinement for public presentation.

๐Ÿ’ก The Solution

Complete rebrand to "MediaLog" with professional polish across all pages. Implement smart year fallbacks, create shared design systems, add comprehensive documentation, and prepare for production deployment as a portfolio piece.

๐Ÿท๏ธ MediaLog Branding

New identity across 10 pages:

  • Name: "MediaLog" (clean, descriptive)
  • Tagline: "Your Letterboxd + Goodreads tracker"
  • Directory renamed: hunt-hq โ†’ medialog
  • Navigation updated everywhere

๐Ÿ“… Smart Year Fallback

Never show empty data:

  • Checks if current year has items
  • Falls back to 2025 if 2026 is empty
  • Applied to homepage, stats, insights
  • Automatic switchover when data arrives

๐ŸŽจ Design System

Professional consistency:

  • Shared CSS variables created
  • Color tokens documented
  • Spacing standards set
  • Typography hierarchy defined

๐Ÿ“ Footer Component

Reusable attribution:

  • Credits Letterboxd + Goodreads
  • Links to 1n2.org
  • Shows total books/movies
  • Human + AI collaboration noted

๐ŸŒ 1n2.org Homepage

Portfolio integration:

  • MediaLog featured prominently
  • Development timeline added
  • 5 sessions documented
  • Stats showcase

๐Ÿ“š Documentation

Comprehensive guides created:

  • Deployment instructions
  • Feature documentation
  • Polish plan (multi-pass)
  • Version history

๐Ÿ”’ Zero-Data Protection

Graceful degradation:

  • Division-by-zero checks
  • Empty array handling
  • Null value guards
  • Helpful empty states

โœ… Production Ready

Deployment preparation:

  • All pages tested locally
  • Mobile responsive verified
  • Database optimized
  • Documentation complete

๐Ÿ”„ Key Changes in v5.0

  • Rebranded: All 10 pages from "Hunt HQ" to "MediaLog"
  • Implemented: Year fallback logic (shows 2025 when 2026 empty)
  • Created: Shared CSS framework and footer component
  • Updated: 1n2.org homepage with MediaLog feature and timeline
  • Documented: Complete development history and deployment guide

๐Ÿ’ป Year Fallback Implementation

// Check if current year has any data $currentYear = date('Y'); $stmt = $pdo->query(" SELECT COUNT(*) as total FROM posts WHERE (site_id = 6 OR site_id = 7) AND YEAR(publish_date) = {$currentYear} "); $currentYearCount = $stmt->fetch()['total']; // Fallback to previous year if current year is empty if ($currentYearCount == 0) { $currentYear = $currentYear - 1; }

๐ŸŽจ Brand Evolution

Name: Hunt HQ โ†’ MediaLog

Moved from generic to descriptive. "MediaLog" clearly communicates purpose: logging media consumption.

Tagline: "Dashboard" โ†’ "Letterboxd + Goodreads tracker"

Specific attribution to data sources. Users immediately understand what it does and where data comes from.

Directory: /hunt-hq/ โ†’ /medialog/

Cleaner URLs and better SEO. Aligns with branding and makes purpose clear in the URL itself.

โŒ Before v5.0

  • Inconsistent branding (Hunt HQ)
  • 2026 stats show zeros
  • No shared design system
  • Missing documentation
  • Not portfolio-ready

โœ… After v5.0

  • Professional MediaLog brand
  • Smart year fallback (shows 2025)
  • CSS variables and components
  • Complete documentation
  • Production-ready portfolio piece

๐Ÿ“ˆ Results

Version 5.0 transformed MediaLog from a personal tool to a showcase project. The rebrand gave it identity, the polish made it portfolio-worthy, and the documentation made it a valuable case study for human-AI collaboration. The application was now ready for public presentation and deployment.