Kotbusta
A modern web application for browsing, searching, and downloading books from personal digital libraries in INPX format. Built with Kotlin/Ktor backend and Preact frontend.
Install / Use
/learn @Heapy/KotbustaREADME
Kotbusta - Digital Books Library
A modern web application for browsing, searching, and downloading books that using Flibusta (MyHomeLib) digital library format. Built with Kotlin/Ktor backend and Preact frontend.
Features
- 📚 Browse Books: View books with covers, metadata, and descriptions
- 🔍 Advanced Search: Search by title, author, genre, and language
- ⭐ Favorites: Star books and create personal collections
- 📝 Notes & Comments: Add private notes and public comments
- 📥 Format Conversion: Download books in FB2, EPUB, or MOBI formats
- 🔐 Google OAuth: Secure authentication with Google accounts
- 📱 Responsive Design: Works on desktop and mobile devices
Technology Stack
Backend:
- Kotlin + Ktor
- SQLite database with jOOQ
- Google OAuth authentication
- RESTful API design
Frontend:
- Preact (no bundler)
- Modern CSS with CSS Grid/Flexbox
- Native ES modules
- Progressive Web App features
Infrastructure:
- Docker & Docker Compose
- Pandoc-based conversion service
- Read-Only Volume mounts for book data
Quick Start
Prerequisites
- Docker and Docker Compose
- Your digital library in Flibusta format (FB2 files and INPX metadata)
- Google OAuth credentials
Deployment
-
Clone the repository
git clone https://github.com/Heapy/kotbusta.git cd kotbusta -
Set up environment variables
cp .env.example .envEdit
.envand configure the following required variables:KOTBUSTA_GOOGLE_CLIENT_ID- Your Google OAuth client IDKOTBUSTA_GOOGLE_CLIENT_SECRET- Your Google OAuth client secretKOTBUSTA_GOOGLE_REDIRECT_URI- OAuth redirect URI (e.g.,https://yourdomain.com/callback)KOTBUSTA_SESSION_SIGN_KEY- Session signing key (will be auto-generated if not provided)KOTBUSTA_SESSION_ENCRYPT_KEY- Session encryption key (will be auto-generated if not provided)KOTBUSTA_ADMIN_EMAIL- Your admin email addressKOTBUSTA_DB_PATH- Path to SQLite database file (optional, defaults tokotbusta.db)KOTBUSTA_BOOKS_DATA_PATH_LOCAL- Local path to your Flibusta book archives
-
Prepare your Flibusta data
# Create directory for book data if it doesn't exist mkdir -p /path/to/flibusta/books # Your directory should contain: # - fb2-*.zip archives with books # - flibusta_fb2_local.inpx metadata file -
Run the application
docker compose -f deploy/prod/docker-compose.yml up -d -
Monitor the startup
# Check logs to ensure services started correctly docker compose -f deploy/prod/docker-compose.yml logs -f # Verify containers are running docker compose -f deploy/prod/docker-compose.yml ps -
Initial setup
- Navigate to your configured URL (e.g.,
https://yourdomain.com) - Login with Google using your admin email
- Go to the Admin panel
- Run the import process to index your book collection
- The import may take some time depending on your collection size
- Navigate to your configured URL (e.g.,
-
Verify installation
- Check that books appear in the catalog
- Test search functionality
- Try downloading a book in different formats
Development Setup
-
Clone the repository
git clone git@github.com:Heapy/kotbusta.git cd kotbusta -
Set up environment
cp .env.example .env # Edit .env -
Configure Google OAuth
- Go to Google Console
- Create a new project or select existing
- Create OAuth 2.0 credentials
- Add authorized redirect URI:
http://localhost:8080/callback - Copy Client ID and Secret to
.env - Add your email address as ad
-
Prepare book data
# Create directory for your Flibusta data mkdir books-data # Copy your FB2 archives and INPX files here # Structure should match: books-data/fb2-*.zip, books-data/flibusta_fb2_local.inpx -
Start the application in IDEA
- Run Kotbusta run-configuration
- The SQLite database will be created automatically on first run
-
Access the application
- Open http://localhost:8080
- Click "Login with Google" to authenticate
- Go to "Admin" and run import
- Start browsing your digital library!
API Endpoints
Public Endpoints
GET /login- Redirects to/oauth/googleGET /oauth/google- Redirect to Google OAuth login pageGET /callback- Google OAuth callbackGET /logout- Logout clearing session data
Authenticated Endpoints
GET /api/user/info- Get current user informationGET /api/books- List books with paginationGET /api/books/search- Search booksGET /api/books/{id}- Get book detailsGET /api/books/{id}/cover- Get book cover imageGET /api/books/{id}/similar- Get similar booksGET /api/books/{id}/download/{format}- Download bookPOST /api/books/{id}/star- Star a bookDELETE /api/books/{id}/star- Unstar a bookGET /api/books/starred- Get starred booksGET /api/books/{id}/comments- Get book commentsPOST /api/books/{id}/comments- Add commentPUT /api/comments/{id}- Update commentDELETE /api/comments/{id}- Delete commentPOST /api/books/{id}/notes- Add/update noteDELETE /api/books/{id}/notes- Delete noteGET /api/activity- Get recent activity
Admin Endpoints
GET /api/admin/status- Check admin rights statusPOST /api/admin/import- Start book import processGET /api/admin/jobs- Get all import jobs and their status
Development
Running Locally
-
Backend development
Start `Kotbusta` run-configuration in IDEA # Navigate to http://localhost:8080` -
Frontend development
- Edit files in
src/main/resources/static/ - No build process needed, Kotbusta uses native ES modules
- Reload browser to see changes
- Edit files in
Database Schema
The application uses SQLite with the following main tables:
books- Book metadata and file pathsauthors- Author informationseries- Book seriesgenres- Genre informationlanguages- Language informationusers- User accounts (from Google OAuth)user_stars- User's starred booksuser_comments- Public commentsuser_notes- Private notesdownloads- Download historyimport_jobs- Background import job tracking
File Structure
kotbusta/
├── src/main/kotlin/io/heapy/kotbusta/
│ ├── Application.kt # Main application entry point
│ ├── ApplicationModule.kt # Dependency injection and bean configuration
│ ├── coroutines/ # Coroutine utilities and context
│ ├── dao/ # Data access objects (deprecated, being migrated to repository)
│ ├── database/ # Database setup and transaction management
│ ├── jooq/ # jOOQ generated code (tables, records, enums)
│ ├── ktor/ # Ktor routes and HTTP modules
│ ├── mapper/ # Data mapping utilities
│ ├── model/ # Domain models and DTOs
│ ├── parser/ # FB2/INPX file parsers
│ ├── repository/ # Repository layer for data access
│ └── service/ # Business logic and services
├── src/main/resources/
│ ├── static/ # Frontend files (HTML, CSS, JS)
│ └── logback.xml # Logging configuration
└── .env # Application configuration
Documentation
- INP File Format - Detailed documentation about the INP/INPX file format used by Flibusta for metadata cataloging
Configuration
Environment Variables
Edit the .env file to configure all aspects of the application.
Ktor Configuration
Edit src/main/resources/application.conf to add additional ktor modules and adjust ktor configuration.
Logs
# Follow logs in real-time
docker-compose logs -f
Contributing
- Fork the repository
- Create a feature branch
- Make your changes
- Add tests if applicable
- Submit a pull request
License
This project is licensed under the AGPL-3.0 - see the LICENSE file for details.
Acknowledgments
- Flibusta for the original digital library format
- Pandoc for format conversion
- Preact team for the lightweight framework
- Ktor team for the excellent Kotlin framework
