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
I'll be posting updates on this Bluesky thread to share my progress, but this is usable right now on https://bookhive.buzz.
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
Have a feature request? Open an issue!
To install dependencies:
bun installCopy .env.template to .env and fill in the values.
To run:
bun run dev# Run all tests
bun run test
# Run tests
bun run test:run- 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
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- Requires
EXPORT_SHARED_SECRETto be set - Request header:
Authorization: Bearer <EXPORT_SHARED_SECRET> - Returns a
.tgzcontainingdb.sqlite,kv.sqlite(with auth tables excluded), andmanifest.json
- Requires
- Workflow:
.github/workflows/database-export.yml- Configure GitHub repo secrets:
BOOKHIVE_EXPORT_URL(e.g.https://bookhive.example.com/admin/export)BOOKHIVE_EXPORT_SHARED_SECRET
- Configure GitHub repo secrets:
