How adrianhajdin/jsm_bookified works
Bookified is a Next.js app for browsing a book library and turning uploaded PDFs into searchable, voice-interactive companions. The primary flow is upload and parse a PDF, store book metadata and text segments, open the book, then start a Vapi conversation whose sessions are checked against subscription limits and recorded. The README also describes persona previews, summaries, transcripts, authentication, and subscriptions. Some of those capabilities are documented but their implementation is not shown in the excerpts, so their connections are marked unverified or omitted.
Main entry points: book.actions.ts Book Operations · useVapi.ts Call Lifecycle · page.tsx Library Page · UploadForm.tsx PDF Upload Form
Components 26
Library and Upload
- Library Page
app/(root)/page.tsx - Library Search
components/Search.tsx - Book Card
components/BookCard.tsx - New Book Page
app/(root)/books/new/page.tsx - PDF Upload Form
components/UploadForm.tsx - PDF Parsing
lib/utils.ts - Blob Upload Handler
app/api/upload/route.ts
Voice Conversations
- Book Detail
app/books/[slug]/page.tsx - Voice Controls
components/VapiControls.tsx - Call Lifecycle
hooks/useVapi.ts - Live Transcript
components/Transcript.tsx - Book Context Search
app/api/vapi/search-book/route.ts
Book and Session Data
- Book Operations
lib/actions/book.actions.ts - Session Operations
lib/actions/session.actions.ts - Book Records
database/models/book.model.ts - Text Segments
database/models/book-segment.model.ts - Voice Sessions
database/models/voice-session.model.ts - MongoDB Connection
database/mongoose.ts
Identity and Plans
- Clerk Identity
- Plan Limits
hooks/useSubscription.ts - Server Plan Lookup
lib/subscription.server.ts - Subscription Page
app/(root)/subscriptions/page.tsx
Other components
- Reader
- Vercel Blob
- Vapi Voice Service
- ElevenLabs Voices
Connections 29
- Reader → Library Page: browses
- Library Page → Book Operations: loads books
app/(root)/page.tsx - Library Page → Library Search: renders
app/(root)/page.tsx - Library Page → Book Card: renders
app/(root)/page.tsx - Reader → New Book Page: uploads book
- New Book Page → PDF Upload Form: renders
app/(root)/books/new/page.tsx - PDF Upload Form → PDF Parsing: parses PDF
components/UploadForm.tsx - PDF Upload Form → Blob Upload Handler: requests upload
components/UploadForm.tsx - Blob Upload Handler → Vercel Blob: stores PDF
- PDF Upload Form → Book Operations: creates book
components/UploadForm.tsx - Book Operations → Text Segments: inserts segments
lib/actions/book.actions.ts - Book Operations → Book Records: reads and writes
lib/actions/book.actions.ts - Book Operations → MongoDB Connection: connects to
lib/actions/book.actions.ts - Reader → Book Detail: opens book
- Book Detail → Book Operations: loads book
app/books/[slug]/page.tsx - Book Detail → Voice Controls: renders
app/books/[slug]/page.tsx - Voice Controls → Call Lifecycle: controls calls
components/VapiControls.tsx - Voice Controls → Live Transcript: renders
components/VapiControls.tsx - Call Lifecycle → Vapi Voice Service: starts voice calls
- Call Lifecycle → Session Operations: records sessions
hooks/useVapi.ts - Call Lifecycle → Plan Limits: checks limits
hooks/useVapi.ts - Call Lifecycle → ElevenLabs Voices: selects voice
- Book Context Search → Book Operations: searches context
app/api/vapi/search-book/route.ts - Session Operations → Voice Sessions: reads and writes
lib/actions/session.actions.ts - Session Operations → MongoDB Connection: connects to
lib/actions/session.actions.ts - Session Operations → Server Plan Lookup: checks plan
lib/actions/session.actions.ts - Plan Limits → Clerk Identity: reads plan
hooks/useSubscription.ts - Server Plan Lookup → Clerk Identity: looks up plan
- Reader → Subscription Page: manages subscription