"Find yourself in the pages."
A calm, immersive, AI-powered book discovery experience.
Most platforms make reading feel like:
- β Endless scrolling
- β Algorithm overload
- β No emotional connection
BiblioDrift is different.
It feels like:
π Walking into a quiet bookstore
β Picking a book based on mood
π§οΈ Letting the atmosphere guide you
- π§ Zero UI Noise β No clutter, no distractions
- π Vibe-First Discovery β Search by feeling, not metadata
- π Tactile Interaction β Books behave like real objects
- π€ AI as a Bookseller β Not recommendations, but conversations
- 3D books you can pull, flip, and explore
- Shelf-based organization (Want / Reading / Favorites)
- Mood-based recommendations (e.g., βrainy mysteryβ)
- Dynamic AI-generated blurbs
- Conversational assistant β Elara, the Bookseller
- Glassmorphism interface
- Ambient sounds (rain, fireplace)
- Emotion-based tagging system
- Skeleton loaders (smooth loading)
- LocalStorage persistence
- Seamless interactions
| Layer | Technology |
|---|---|
| Frontend | HTML5, CSS3 (3D), Vanilla JS |
| API | Google Books API |
| Backend | Flask, SQLAlchemy, JWT cookies |
| AI | LLM-powered notes, chat, and mood analysis |
| Storage | LocalStorage |
BiblioDrift follows a strict rule:
- β No hardcoded lists
- β No manual curation
- β 100% AI-generated discovery
- Mood
- Emotional tone
- Intent
- Vibe
- π€ AI-powered recommendations (core)
- π§ Conversational librarian (Elara)
- π§οΈ Mood-based discovery engine
- π§ Ambient environments
- π Emotion analytics (future)
Frontend = Librarian
Backend = Curator
graph TD
A[Frontend UI] -->|Mood Query| B[Flask Backend]
B -->|Prompt Engineering| C[LLM / AI Service]
C -->|Generated Insight| B
B -->|JSON Response| A
A -->|Book Data| D[Google Books API]
A -->|Persistence| E[LocalStorage]
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: bash git clone https://github.com/devanshi14malhotra/bibliodrift.git
-
Open index.html in your browser.
- That's it! No build steps required for the vanilla frontend.
The Flask backend powers authentication, library sync, AI blurbs, chat, mood analysis, and other API flows.
- 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_BASE to 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
json { "Content-Type": "application/json" }
Body
json { "title": "The Night Circus", "author": "Erin Morgenstern", "mood": "mysterious, magical, slow-burn romance" }
Success (200 OK)
json { "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)
json { "status": "error", "message": "Missing required fields: title or mood" }
- Frontend sends a POST request from app.js to /api/v1/generate-note.
- The Flask backend (app.py) receives the request via handle_generate_note().
- Input data (title, author, mood) is validated.
- The request is passed to generate_book_note() in ai_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 β.


