Wed Jul 22 2026

Sourcebook

Next.js
React
Typescript
Tailwind
Supabase
SQL
PWA
Claude
Personal

Sourcebook is a Progressive Web App for capturing, tagging, and searching back through books, podcasts, and articles I have learned something from. It started as a way to stop losing good ideas to scattered apps and paper notebooks, and grew into a proper single-user product used daily by a handful of invited friends. The core of the app is a unified feed that merges notes and resources into one cursor-paginated, infinite-scrolling stream, with independent visibility toggles for each type. Retrieval was the feature I cared most about getting right: search runs through a Postgres RPC (search_entries) that ranks matches across notes and resources together, alongside tag-based filtering with autocomplete drawn from a dedicated tags table, so a saved idea is genuinely easy to find again months later. As a PWA, Sourcebook is installable to a phone home screen, works offline via a Serwist-managed service worker, and integrates with the OS share sheet so a page can be saved as a resource directly from another app without opening Sourcebook first. Authentication supports email/password and Google OAuth, with account security handled deliberately: server-side session management, a change-password flow that revokes other sessions, and a documented set of security trade-offs (docs/security-decisions.md) for what was and was not worth building yet for a small invite-only user base. Because the app now has real users relying on it, I added a role-guarded admin dashboard that only I can see, tracking notes/resources/tag growth and usage against Supabase's free-tier database cap so a quota surprise doesn't take the app down. I also leaned on an extensive automated test suite (Vitest, React Testing Library, MSW) to keep shipping features confidently as a single maintainer, and used Claude Code throughout to pair on everything from the retrieval redesign to fixing subtle pagination and cache-consistency bugs in the feed.

Objectives

  • 00
    Build a Progressive Web App with Next.js, installable to a home screen and working offline via a Serwist service worker
  • 01
    Design a Supabase Postgres schema with row-level security so each user's notes and resources stay scoped to them
  • 02
    Build a unified, cursor-paginated feed combining notes and resources with infinite scroll
  • 03
    Implement ranked full-text and tag-based search across notes and resources via a Postgres RPC
  • 04
    Add tag-based organisation with autocomplete and inline editing shared across notes and resources
  • 05
    Support capturing a resource directly from the OS share sheet using the PWA share target
  • 06
    Implement email/password and Google OAuth authentication with server-side session management
  • 07
    Add account security features, including a change-password flow that revokes other active sessions
  • 08
    Add JSON/CSV data export so users fully own a copy of what they have captured
  • 09
    Build a role-guarded admin dashboard tracking usage against Supabase's free-tier limits
  • 10
    Write an extensive automated test suite using Vitest, React Testing Library, and MSW
  • 11
    Explore day-to-day feature development and debugging using Claude Code

Images

Sourcebook marketing landing page explaining capture, connect, retrieve
Landing page
Sourcebook sign in page with Google OAuth and email/password options
Sign in page
Unified feed showing notes and resources for books, podcasts, and articles
Unified feed
Search results filtered by a text query across notes and resources
Search across notes and resources
Resource detail sheet showing a book and its linked notes
Resource detail with linked notes
Capture sheet for adding a new note or resource
Capturing a new resource
Settings page with dark mode toggle, data export, and change password
Settings, data export, and account security
Admin dashboard showing usage growth and per-account breakdown
Role-guarded admin dashboard
Unified feed shown in dark mode
Dark mode