Canon: A Personal Tracker for Creator Content Consumption

A gamified system for tracking your progress through your favorite creators' complete bodies of work.

April 7, 2026

What Is It?

A personal tracker for consuming your favorite creators' work. Add a creator, ingest their canon, curate what you want, track your progress. Gamified completionism for intentional consumption.

Core loop: Browse creators → see % complete → pick something to read/watch → mark done → watch the number go up.

Core Concepts

ConceptDescription
CreatorA person or entity whose work you follow (blogger, YouTuber, podcaster, docs maintainer)
WorkA single piece of content (article, video, episode, doc page)
CanonThe full set of works by a creator — discovered via sitemap, RSS, scraping, or manual entry
QueueWorks you've approved/curated from the catalog — the ones you actually want to consume
Progress% of queued works marked done, per creator

Data Model

creators table

ColumnTypePurpose
idTEXT PKUUID
nameTEXT NOT NULLDisplay name ("Kent C. Dodds")
urlTEXT NOT NULL UNIQUEHomepage URL
descriptionTEXTWhy you follow them
image_urlTEXTHeadshot or avatar
typeTEXT DEFAULT 'author'author / docs / youtube / podcast / newsletter
created_atTEXTWhen added

works table

ColumnTypePurpose
idTEXT PKUUID
creator_idTEXT FKReferences creators.id
urlTEXT NOT NULL UNIQUEDirect link to the work
titleTEXT NOT NULLTitle of the work
descriptionTEXTSubtitle, excerpt, or scraped summary
statusTEXT DEFAULT 'candidate'candidatequeueddonedropped
difficultyTEXTlight / medium / dense (optional, user-set)
topicsTEXT (JSON)Tags like ["react", "testing", "patterns"]
noteTEXTYour personal annotation
ratingINTEGER1–5, set after reading
read_countINTEGER DEFAULT 0Times consumed (re-reads/rewatches count)
discovered_atTEXTWhen ingested from catalog
queued_atTEXTWhen approved into queue
last_read_atTEXTLast consumption timestamp

Indexes

  • idx_works_creator on works(creator_id)
  • idx_works_status on works(status)

Computed Stats (queries, not stored)

  • Canon % = COUNT(status='done') / COUNT(status IN ('queued','done')) per creator
  • Total works = all works for a creator
  • Queued = approved but not yet consumed
  • Re-read favorites = ORDER BY read_count DESC, rating DESC
  • Latest unread = next queued work by discovered_at

Ingestion Strategy (priority order)

When you paste a creator's URL, try these in order:

  1. RSS feed — auto-discover via <link rel="alternate"> in HTML head. Richest data: title, URL, description, date.
  2. Sitemap — fetch /sitemap.xml. Gives all URLs, sometimes with lastmod dates. No titles (derive from URL path).
  3. llms.txt — fetch /llms.txt. Newer convention, curated page list. Growing adoption.
  4. Scrape links — fetch the page, extract all internal <a> hrefs, dedupe, filter obvious non-content (assets, auth, etc.).

All ingested works start as candidate. Approval UI lets you bulk-select which ones to queue.

Pages & Views

/canon — Main page

The hero view. Grid of creator cards.

Each card shows:

  • Creator image/avatar
  • Name + description
  • Progress ring (circular % indicator)
  • Stats line: "34/51 read · 3 favorites · 14 queued"
  • "Next up" — title of the next queued work, clickable
  • "Random" button — pick a random queued work
  • "Top picks" — 2-3 most re-read or highest-rated works

Sorted by: most recently active, or lowest % (motivational), user choice.

/canon/[creatorId] — Creator detail

Full catalog view for one creator:

  • Creator header (image, name, description, big progress ring, stats)
  • Filter bar: status (queued/done/candidate/all), difficulty, topic tags
  • Works list: cards or compact rows, each with title, status badge, difficulty, rating stars, read count
  • Bulk actions: "Queue all candidates", "Mark selected as done"

/canon/discover — Add a creator

  • Paste a URL
  • App tries RSS → sitemap → llms.txt → scrape
  • Shows results: "Found 47 articles from kentcdodds.com"
  • Creator name/description fields (pre-filled if possible)
  • Approval grid: checkboxes on each discovered work
  • "Queue selected" / "Queue all" buttons

Route Structure

src/app/canon/
  page.tsx                    # Main grid of creator cards
  canon.module.css            # Styles for main page
  [creatorId]/
    page.tsx                  # Creator detail / catalog view
  discover/
    page.tsx                  # Add new creator + ingest

Server Actions

  • addCreator(name, url, description, imageUrl, type) — insert into creators
  • ingestWorks(creatorId, works[]) — bulk insert discovered works as candidates
  • updateWorkStatus(workId, status) — queue, done, drop
  • markRead(workId) — increment read_count, set last_read_at, set status=done if first read
  • rateWork(workId, rating) — set rating
  • bulkQueueWorks(workIds[]) — move candidates to queued

Build Order

  1. Tables — create creators + works in Turso
  2. Data layersrc/lib/reading.ts with types + query functions
  3. Server actionssrc/actions/reading.ts
  4. Discover page — paste URL, ingest, approve works
  5. Main page — creator cards with progress rings
  6. Creator detail page — full catalog, filters, mark done
  7. Sidebar link — add to nav
  8. Polish — random button, re-read tracking, stats

Future Ideas (not building now)

  • YouTube/podcast support (different embed/player)
  • Spotify Wrapped-style "year in review" stats
  • Public profile: "biggest fan" leaderboard per creator
  • Import from Pocket/Instapaper/browser bookmarks
  • Browser extension: "Add to Canon%" from any page
  • AI summaries of articles you've read
  • Spaced repetition: resurface articles you rated highly after N days