🐝 BookHive
Goodreads, but better, built on Bluesky.
- OAuth with Bluesky with session storage, and persistence
- Defined Lexicons for books (with reviews, ratings, etc)
- Displaying a feed of new books & reviews from the firehose
- Works without JavaScript, but has some dynamic features
- All data is stored in your PDS, and can be used by other apps
- Personal library — upload your ebooks (EPUB, MOBI, AZW3, FB2, CBZ) and serve them to your e-reader via an OPDS catalog
- E-reader sync — built-in KOSync server syncs reading progress from KOReader back to your BookHive books automatically
- iOS app — native iPhone app for managing your library on the go
📚 Vision
Goodreads has held the market for a long time, without improving their user experience, and with actively hampering their API access. I wanted to make a decentralized, Bluesky-based alternative to Goodreads.
The goal is to:
- Manage your read & want to read books
- Have a much nicer UI/UX than Goodreads
- "Buzz" about the books with friends with Bluesky comments
- Be decentralized, take your books to other apps if you want to!
- Host your personal ebook library and serve it to your e-reader over OPDS
- Sync reading progress from KOReader (and other KOSync-compatible readers) back to your BookHive books
🧑💻 Development
To install dependencies:
bun install
Copy .env.template to .env and fill in the values.
To run:
bun run dev
Running Tests
# Run all tests
bun run test
Run tests
bun run test:run
🏗️ Architecture
- Backend: Hono with AT Proto for OAuth
- Frontend: Mostly static HTML, with some Hono JSX for dynamic content (Fast as possible)
- Database: SQLite, with Kysely as the ORM
🗄️ Weekly database export (GitHub Actions artifact)
This repo includes a workflow that can fetch a sanitized SQLite export from your running BookHive instance and upload it as a GitHub Actions artifact (weekly cron + manual trigger).
- Server endpoint:
GET /admin/export
EXPORT_SHARED_SECRET to be set
- Request header: Authorization: Bearer
- Returns a .tgz containing db.sqlite, kv.sqlite (with auth tables excluded), and manifest.json
- Workflow:
.github/workflows/database-export.yml
BOOKHIVE_EXPORT_URL (e.g. https://bookhive.example.com/admin/export)
- BOOKHIVE_EXPORT_SHARED_SECRET