Badland Book Club
Social book club platform with EPUB and audiobook hosting, real-time reading progress tracking, and section-level comments. In progress.
Overview
Badland Book Club is a social reading platform where users create book clubs, upload EPUBs and audiobooks, and read together. The platform tracks everyone's reading progress in real time, so you can see exactly where your friends are in the book. Section-level comments let readers leave thoughts that appear contextually as others reach that part of the story.
Built as a standalone Turborepo monorepo sharing authentication with Badland AI Chat. All content is stored in the cloud via AWS S3 with optional local caching through the PWA's IndexedDB layer for offline reading.
Architecture
- Frontend: React 19 SPA with Vite, TanStack Query for data fetching, tRPC client for type-safe API calls, epub.js for in-browser EPUB rendering, and react-router-dom for navigation.
- Backend: Express 5 API with tRPC router, MongoDB via Mongoose for persistence, AWS S3 for file storage with presigned URLs for secure uploads/downloads.
- Real-time: WebSocket server (ws) for live presence updates and reading progress synchronization across connected clients.
- Auth: Shared JWT authentication with Badland — same token, same session. No separate login required.
- Offline: PWA with vite-plugin-pwa. Books can be cached locally in IndexedDB (via idb) for offline reading on mobile or desktop.
- Deployment: Frontend on Cloudflare Pages (books.badland.ai), API on Hetzner (api-books.badland.ai).
Key Features
EPUB Reader
Full in-browser EPUB reading powered by epub.js. Supports pagination, font sizing, and bookmarking. Your reading position syncs across devices in real time via the API.
Audiobook Hosting
Upload audiobook files to a club. Members can stream individual tracks or download the entire audiobook as a zip file. Tracks are stored on S3 and served via presigned URLs.
Real-Time Presence
See where every member of your book club is in the book right now. Progress updates push instantly via WebSockets — no polling, no refresh needed.
Section-Level Comments
Leave comments tied to specific sections of the book. Other readers see them when they reach that point — no spoilers, just contextual discussion that unfolds as you read.
Additional Features
- Create multiple book clubs with invite-based membership
- Cloud storage with local caching for offline reading
- PWA installable on mobile and desktop
- Shared authentication with Badland ecosystem (JWT)
- PDF support via pdf.js