"Find yourself in the pages."
BiblioDrift is a cozy, visual-first book discovery platform designed to make finding your next read feel like wandering through a warm, quiet bookstore rather than scrolling through a database.
- "Zero UI Noise": No popups, no aggressive metrics. Just calm browsing.
- Tactile Interaction: 3D books that you can pull from the shelf and flip over.
- Vibe-First: Search for feelings ("rainy mystery"), not just keywords.
- Interactive 3D Books: Hover to pull, click to flip and expand.
- Virtual Library: Realistic wooden shelves to save your "Want to Read", "Currently Reading", and "Favorites" list (Persistent via LocalStorage).
- Glassmorphism UI: A soothing, modern interface that floats above the content.
- AI-Powered Recommendations (Planned): All book recommendations must be generated exclusively by AI.
No manual curation, static lists, or hardcoded recommendations are permitted. - Dynamic Popups: Click a book to see an expanded view with AI-generated blurbs.
- Curated Tables: Horizontal scrolling lists based on moods like "Monsoon Reads".
| Frontend
|
API & Data
|
Backend & AI
|
To maintain our strict AI-driven model, BiblioDrift utilizes a decoupled flow where the backend acts as the "Curator" and the frontend acts as the "Librarian."
graph TD
A[Vanilla JS Frontend] -->|Vibe Query| B[Flask Backend]
B -->|Prompt Engineering| C[AI Service / LLM]
C -->|Generated Blurb| B
B -->|JSON Response| A
A -->|Book Details| D[Google Books API]
A -->|Persistence| E[LocalStorage]
style A fill:#f9f,stroke:#333,stroke-width:2px
style C fill:#000,stroke:#fff,stroke-width:2px,color:#fff
BIBLIODRIFT/
BIBLIODRIFT/
β
βββ backend/ # Python backend logic
β βββ app.py
β βββ ai_service.py
β βββ cache_service.py
β βββ config.py
β βββ error_responses.py
β βββ models.py
β βββ security_utils.py
β βββ validators.py
β β
β βββ mood_analysis/ # mood-based recommendation logic
β βββ purchase_links/ # purchase link generation
| βββ price_tracker/
β
βββ frontend/ # UI (client-side)
β βββ pages/ # HTML files
β β βββ index.html
β β βββ auth.html
β β βββ chat.html
β β βββ library.html
β β βββ profile.html
β β βββ 404.html
β β
β βββ js/ # JavaScript
β β βββ app.js
β β βββ chat.js
β β βββ config.js
β β βββ footer.js
β β βββ library-3d.js
β β
β βββ css/ # Styles
β β βββ style.css
β β βββ style_main.css
β β βββ style-responsive.css
β β
β βββ assets/ # Images, sounds
β β βββ images/
β β βββ sounds/
β β
β βββ script/ # extra JS (header scroll etc.)
β
βββ config/ # βοΈ Configuration
β βββ .env.development
β βββ .env.example
β βββ .env.testing
β βββ requirements.txt
β βββ runtime.txt
β
βββ docs/ # π Documentation
β βββ contributing.md
β βββ Open-Source-Event-Guidelines.md
β βββ TUTORIAL.md
β βββ page.png
β
βββ tests/ # π§ͺ Test files
β βββ test_api.py
β βββ test_llm.py
β βββ test_validation.py
β
βββ .gitignore
βββ README.md
βββ LICENSE
βββ netlify/ # deployment config
βββ script/ (if any left)
βββ venv/
βββ .vscode/
BiblioDrift follows a strict AI-only recommendation model.
- All recommendations must be generated dynamically using AI/LLMs.
- Manual curation, editor picks, static mood lists, or hardcoded book mappings are not allowed.
- AI outputs should be based on abstract signals such as:
- Vibes
- Mood descriptors
- Emotional tone
- Reader intent
This ensures discovery stays organic, scalable, and aligned with BiblioDriftβs philosophy of vibe-first exploration.
- Clone the repository:
git clone https://github.com/devanshi14malhotra/bibliodrift.git
- Open
index.htmlin your browser.- That's it! No build steps required for the vanilla frontend.
Planned implementation using Python Flask.
- Netlify should serve the static frontend from the generated
dist/bundle. - The Flask backend, database, Redis, and AI services are not hosted by Netlify.
- To make the API work in production, deploy the backend separately and point the frontend
MOOD_API_BASEto that host.
To keep the frontend and backend synced, use the following mapping:
| Feature | Frontend Call (app.js) |
API Endpoint (app.py) |
Logic Provider (ai_service.py) |
|---|---|---|---|
| Book Vibe | POST /api/v1/generate-note |
handle_generate_note() |
generate_book_note() |
- Endpoint:
POST /api/v1/generate-note - Logic: Processed by
ai_service.py
Method: POST
URL: /api/v1/generate-note
Description: Generates an AI-powered "bookseller note" based on the book's vibe, mood, and metadata.
Headers
{
"Content-Type": "application/json"
}Body
{
"title": "The Night Circus",
"author": "Erin Morgenstern",
"mood": "mysterious, magical, slow-burn romance"
}Success (200 OK)
{
"status": "success",
"note": "A dreamlike duel unfolds in a wandering circus of shadows and light. Perfect for readers who crave atmospheric magic and quiet intensity."
}Error (400 Bad Request)
{
"status": "error",
"message": "Missing required fields: title or mood"
}- Frontend sends a POST request from
app.jsto/api/v1/generate-note. - The Flask backend (
app.py) receives the request viahandle_generate_note(). - Input data (title, author, mood) is validated.
- The request is passed to
generate_book_note()inai_service.py. - The AI model generates a contextual "bookseller note".
- The backend returns the generated note as a JSON response.
- Frontend displays the note in the book popup UI.
We welcome contributions to make BiblioDrift cozier!
- Fork the repo.
- Create a feature branch such as
feature/cozy-mode. - Make your changes and test them locally.
- Push your branch and open a Pull Request.
See CONTRIBUTING.md for the fuller workflow and contribution rules.
MIT License.
Built by Devanshi Malhotra and contributors, with β and code.
If you like this project, please consider giving the repository a β STAR β.

