A native macOS e-book library manager. Single-user, local-first. Native handling of language variants and a first-class device delivery workflow.
- Library on disk, not in a database.
Library/Author/Title (Year)/<author-title-year>.epubplus a sidecarmetadata.json. Survives the app being deleted; works inside iCloud Drive. - Language variants are first-class. Weighted-marker classifier per profile (
pt-PTvspt-BR,en-GBvsen-US, etc.), badges, bulk re-classify, manual override always wins. - Send to Kindle and Kobo over USB. Drag a book onto the device. For Kindle, EPUB→AZW3 conversion happens in-app — no Amazon round-trip, no Send-to-Kindle bundle, no
ebook-convert. The writer is its own Swift package: swift-azw3. For Kobo, EPUB and PDF pass through directly. - Sources are JS plugins. Search external book catalogues from inside the app. Install from the official registry (
pdrbrnd/tomo-plugins) or add your own — see docs/plugins.md. - Open Library cover lookup by ISBN, paste, or file picker.
brew install --cask pdrbrnd/tap/tomoRequires macOS 26+.
git clone https://github.com/pdrbrnd/tomo
cd tomo
open Tomo.xcodeprojXcode resolves Swift package dependencies on first build. ⌘R to run.
CLI:
xcodebuild -project Tomo.xcodeproj -scheme Tomo -configuration Debug build
xcodebuild -project Tomo.xcodeproj -scheme Tomo -destination 'platform=macOS' testPushing a tag matching vX.Y.Z (or vX.Y.Z-foo for pre-releases) to origin triggers .github/workflows/release.yml, which does the rest:
- Archives at Release config, signs with Developer ID, notarizes, staples
- Builds a DMG with
create-dmg - Signs the DMG with the Sparkle ed25519 key
- Creates a GitHub Release with auto-generated notes and attaches the DMG + SHA256
- Appends an
<item>todocs/appcast.xmland rewritesdocs/index.html's download link, commits tomain - Bumps
versionandsha256inpdrbrnd/homebrew-tapCasks/tomo.rb
git tag v1.5.0
git push origin v1.5.0Tomo's source-search system loads plugins from ~/Library/Application Support/com.pdrbrnd.tomo/plugins/. No plugins ship with the app — install from Settings → Plugins (registry-driven) or drop a .js file directly into the folder.
The official registry is pdrbrnd/tomo-plugins. See docs/plugins.md for the contract and host API; gutenberg.js over there is the canonical example.
Mostly written with Claude. This is my first Swift project. The design, architectural principles, product decisions, and on-disk contract are mine; the SwiftUI is almost exclusively model output. The CLAUDE.md is a good document to understand the opinions that shaped this project.
