Private reading companion
Booktrace
A personal reading history for reviews, ratings, notes, and reading goals.

“I can design and ship a complete, reliable full-stack application around real user data.”
01
Problem
A basic book log could save titles and notes, but it did not yet feel like a trustworthy personal product. Readers needed private libraries, richer reading context, useful progress views, resilient discovery, and safe ownership rules for every mutation.
02
Role
Product direction, UX and visual design, full-stack architecture, database modeling, authentication, validation, external API integration, accessibility, testing, and deployment.
03
Constraints
Every library record must remain private to its owner, external book providers can be slow or unavailable, untrusted form data needs server-side validation, and database migrations must deploy safely without sacrificing responsive loading, empty, and error states.
04
Process
I rebuilt the project around Auth.js sessions and owner-scoped Prisma queries, expanded the data model for reading status, ratings, tags, favorites, dates, goals, and profile settings, and validated server actions with Zod. Search uses Google Books first and automatically falls back to Open Library, while saved metadata snapshots keep personal entries useful during provider outages.
05
Result
A production-ready private reading companion with authentication, personal libraries, five reading states, reviews and notes, yearly goals and statistics, resilient search, account controls, accessible responsive states, and automated validation and mapping tests.
Experience highlights
- Private accounts and libraries protected by Auth.js credential sessions
- Reading states, 1–5 ratings, tags, favorites, reviews, notes, and reading dates
- Annual goals, progress indicators, and library statistics
- Google Books discovery with timeouts, caching, and automatic Open Library fallback
- Profile settings and password-confirmed account deletion
Engineering & performance
- Next.js 16 server components and server actions keep private reads and mutations on the server
- Every Prisma library query is scoped by userId and the database enforces one entry per user and book
- Zod validates untrusted form data before mutations and bcrypt protects stored passwords
- Validated book snapshots decouple saved entries from external-provider availability
- Vitest and Testing Library cover domain validation, external-data mapping, and key interface behavior