A calm, fast desktop library for e-books that reads and writes calibre libraries. Written in Go with MyGo's native UI: no webview, no cgo, one binary.
Design: Figma — Dalibre
go tool mygo dev ./cmd/dalibre # run with live reload
go test ./... # unit + view tests (no window needed)
go run ./cmd/seed "testdata/Sample Library" # a sample library to play withPoint the app at a library with DALIBRE_LIBRARY (PowerShell:
$env:DALIBRE_LIBRARY="C:\path\to\Library"); otherwise it opens the last one
used, then the one calibre itself uses.
View tests can save screenshots: DALIBRE_SHOTS=<folder> go test ./internal/app.
Build a release (exe + installer in cmd/dalibre/build):
go tool mygo build ./cmd/dalibreDalibre updates itself from this repository's GitHub releases. Releases
are signed with the update key of go tool mygo keygen, which is the
MYGO_UPDATER_PRIVATE_KEY secret of the repository; keep a copy in a
password manager, as installed apps only accept updates it signs.
- Bump
versionincmd/dalibre/mygo.json, and add its## <version>section to CHANGELOG.md: the update window shows it. - Commit, then tag and push:
git tag v0.2.0 && git push origin v0.2.0. - The Release workflow builds every platform into a draft release. Publish the draft, and installed apps update to it.
The workflow signs the macOS app with the Developer ID and notarizes it,
from the MACOS_CERTIFICATE and MACOS_CERTIFICATE_PASSWORD secrets, and
an App Store Connect API key in APPLE_API_KEY, APPLE_API_KEY_ID and
APPLE_API_ISSUER (see the top of the workflow). mygo.json
leaves signing out, so local builds are signed ad hoc.
cmd/
dalibre/ the app: main.go, mygo.json, resources/icon.png
seed/ creates a sample calibre library for development
dalibre-plugin/ CLI for plugin authors (npm: dalibre-plugin): init, check, dev, docs, pack, install
plugins/
gutenberg/ Project Gutenberg, built into the app (dalibre.gutenberg)
googlebooks/ Google Books metadata lookup, built into the app (dalibre.googlebooks)
neodb/ NeoDB metadata lookup, built into the app (dalibre.neodb)
sdk/ for plugin authors: dalibre.d.ts, plugin.schema.json, template
internal/
calibre/ calibre library access: schema, SQL functions its
triggers need, naming rules, CRUD, OPF
ebookmeta/ title/authors/cover from EPUB, MOBI/AZW3 and file names
catalog/ search, filters, sorting and sidebar counts (no UI)
plugin/ plugins: manifest, sandboxed JS runtime, consent, packages
mcp/ the MCP server: tools, call log, stdio bridge
settings/ user settings persisted as JSON
thumbs/ on-disk cover thumbnails
app/ state, actions and views of the window
theme/ design tokens (Radix Colors, spacing, radii) and fonts
icons/ Lucide icons
widgets/ the Figma library's components
Get books (in the sidebar) searches and browses book sources and adds
what you pick to your library. Project Gutenberg is built in; anyone can
add a source as a plugin: a plugin.json and a JavaScript file, run
sandboxed inside Dalibre. See
Writing Dalibre plugins, also in the CLI
(npx dalibre-plugin@latest docs), and the
design.
Your own agents (Claude Code, Claude Desktop, Cursor…) can use the open library over MCP: search it, edit metadata, add books, and convert formats with their own tools. See Using Dalibre with your agents and the design.
- New libraries use calibre's own
metadata.dbschema (user_version 28). - Dalibre registers the SQL functions calibre's triggers call (
title_sort,uuid4, …), so writes behave as calibre's do. - Book folders and files follow calibre's naming (
Author/Title (id)/Title - Author.ext, transliterated to ASCII), and move when the title or first author changes. - Edits write
metadata.opfand mark the book inmetadata_dirtied, so calibre refreshes it next time. - Removed books go to the system Recycle Bin.
internal/calibre/metadata_sqlite.sql comes from calibre (GPL-3.0). Fonts
(Inter, Geist Mono) are under the SIL Open Font License; icons
are Lucide (ISC); colors are Radix Colors (MIT).