Selected Work

Bookwormia

Co-founder & Developer

A virtual library that knows which physical shelf the book is actually on, plus reading progress, friends, and a feed filtered by the genres you care about.

Visit live site ↗2025 - present
Bookwormia preview
Role
Co-founder & Developer
Status
Live in production
Database
Convex (realtime)
Commits
254

Problem

Book tracking apps treat a library as a list. They will tell you that you own a book, but not where it physically is, not how far through it you are, and not what the people you actually know thought of it.

Cataloguing is also tedious enough that most people abandon it. Typing title, author, publisher and cover for every book is not a hobby.

Approach

Adding a book is one field: an ISBN-10 or ISBN-13. Full metadata comes back from the Google Books API, so a shelf can be catalogued as fast as the barcodes can be typed.

From there the library is social and physical at once. Books get room-based storage locations defined in Settings, like Bedroom 1 or Study 1, with shelf row and column, so the app answers "where is my copy" and not just "do I own it".

Architecture decisions

Convex rather than Postgres. The product is fundamentally reactive: a friend accepting a request, a like landing on a post, a rating syncing between your library and your reading list. Convex's realtime queries and server functions make synchronisation the default behaviour rather than a subscription layer built on top of a request/response database.

Ratings are universal per book, not per list. A book rated from the library card, the detail panel or the reading list is the same rating everywhere, which removes an entire class of "why does this say 4 stars here and 3 there" bug.

Library and Wishlist are mutually exclusive by construction. Adding a wishlisted book to your library removes the wishlist entry in the same operation, so the two collections cannot drift into disagreement.

Reading status transitions automatically as pages are updated, rather than asking the user to also remember to move a book from Reading to Completed.

Feature surface

Reading list with To Read, Reading and Completed tabs, plus page bookmarking. Book groups with genre tags and Public, Friends-only or Private visibility. A social feed with text posts, video posts and star-rated reviews, with likes, comments and cursor-based pagination. An interest-filtered home feed driven by selected genres.

Friends by @username with request accept, decline and cancel. Any user's library is browsable at /users/:id/library with search, sort, status filter tabs and a readonly detail panel. Full JSON export, and account deletion that actually deletes.

Stack

Next.js 16 App Router, TypeScript, Tailwind. Clerk for auth with social login. Convex as the realtime cloud database and server function layer. shadcn/ui on Radix primitives, dnd-kit for drag interactions, Knock for notifications, Upstash for rate limiting, DiceBear for generated avatars.

Built with

  • Next.js 16
  • · Convex
  • · Clerk
  • · Google Books API
  • · shadcn/ui
  • · dnd-kit