Calibre as a personal e-book server: connecting Kindle and Kobo over USB and Wi-Fi (and why COPS matters)

You have an EPUB collection somewhere on your Mac — bought from various stores, downloaded from public domain sites, converted from PDFs, ripped from your own books with Calibre and a USB scanner. You want them on your Kindle (or Kobo, or your phone, or your partner’s iPad), updated whenever you add to the library, without paying Amazon to “deliver” each one.

Calibre is the answer almost everyone settles on, and it’s good. But the default workflow (“plug Kindle in, drag-and-drop, unplug”) is a chore that nobody actually maintains. The version where you set up Calibre as a server, expose its catalog over Wi-Fi, and let every device pull from it — that’s the version worth knowing.

The two ways Kindles and Kobos accept books

  • USB. Plug the e-reader into the computer, copy files to /documents on the Kindle (Mac shows it as a USB drive). Works for every Kindle ever made, including the ones too old to take Wi-Fi sideloads. Calibre’s “Send to device” button does this automatically with format conversion (your EPUB becomes AZW3 for Kindle on the way over).
  • Wi-Fi via OPDS. The e-reader fetches books from a server over the same Wi-Fi network — like a podcast app fetching new episodes. Calibre’s built-in content server speaks OPDS. Modern Kobos have OPDS support natively in their browser. Modern Kindles don’t, but you can route through a bridge.

The Wi-Fi path is the better long-term workflow because the e-reader pulls when you say so, you don’t have to plug anything in, and the same server feeds every device in the house.

Step 1 — install Calibre, point it at your library

# macOS
brew install --cask calibre

# Linux
sudo apt install calibre  # or the upstream installer for newer versions

# Windows
# Download from https://calibre-ebook.com/download_windows

On first run, Calibre asks for a library folder. Point it at ~/Books or wherever your EPUBs already live. It’ll index existing files. Drag-drop new ones into the Calibre window to add them; metadata gets auto-fetched from Google Books / Open Library / Amazon based on title + author.

Step 2 — start the content server

Calibre → Connect/shareStart Content Server. Defaults: port 8080, no auth. The server is now serving your library at http://<your-mac-ip>:8080/.

Set a username/password before exposing it anywhere: Preferences → Sharing over the net → Require username/password. Add a user. Now you can hit http://<mac-ip>:8080 from any device on the network, see your library in a built-in web UI, and download books in any format.

Step 3 — connecting devices

Kobo (Libra, Sage, Clara, Forma — pretty much all current models): open the Kobo’s built-in browser. Visit http://<mac-ip>:8080/opds. It treats the OPDS feed as a downloadable catalog. Tap a book → tap “Download” → file lands in the Kobo’s library and shows up on the home screen.

Kindle is more involved because Amazon doesn’t include a real browser:

  • Email-to-Kindle path. Calibre’s “Send to device” can email books to your Kindle’s address (your-name@kindle.com) via SMTP. Set this up once in Preferences → Sharing books by email. The book appears in the Kindle’s library within ~5 minutes, no USB cable.
  • USB path with auto-conversion. When you plug the Kindle in, Calibre detects it. Highlight books in Calibre → Send to device → choose AZW3 format. It converts and copies in one step.
  • Send-to-Kindle with KFX (newer Kindles). Recent Kindles render KFX better than AZW3. The KFX Output Calibre plugin (from the community) converts EPUB → KFX. Optional but worth it for layout-fidelity.

Phones / iPads: install Marvin 3 on iOS or Moon+ Reader on Android. Both have OPDS clients built in. Add your server URL + credentials. The catalog appears as a remote library; tap books to download.

Why COPS instead of Calibre’s built-in server

Calibre’s bundled content server requires Calibre to be running. It uses ~150 MB of RAM and a Python process whether you’re using it or not. For an always-on home server, that’s heavy.

COPS — “Calibre OPDS PHP Server” — is a small PHP app that reads Calibre’s metadata.db SQLite file directly, exposes the same OPDS feed and a slick web UI, and uses about 5 MB of RAM. You point it at your Calibre library directory, deploy it under a web server you already run, and now your library is web-accessible without keeping the Calibre desktop app open.

# On a Linux server with PHP and Apache/nginx:
cd /var/www/
git clone https://github.com/seblucas/cops.git
chmod -R o+r cops/

# config — edit cops/config.php (or use config_local.php to override):
# <?php
# $config['calibre_directory'] = '/srv/calibre-library/';
# $config['cops_title_default'] = "My library";
# $config['cops_basic_authentication'] = ['username'=>'me','password'=>'set-something'];

# Visit http://server-ip/cops/ — you should see your books

The OPDS endpoint at /cops/feed.php is the URL you give to Kobo, Marvin, Moon+ Reader. The web UI at /cops/index.php is a clean reading-list interface that works on phones — far better than Calibre’s built-in.

The architecture that actually settles

  • Calibre on your Mac — the editor. Where you add books, edit metadata, convert formats, manage tags. Closed when you’re not using it.
  • Library directory on a server — synced from your Mac via Syncthing (one-way: Mac → server). The Calibre metadata.db + the PDF/EPUB files live here.
  • COPS — running on the server, reading the directory, serving OPDS + web UI. Always-on, low memory.
  • E-readers + phones — pull from COPS over Wi-Fi, never touch the source-of-truth.

End-state: you add a book to Calibre on your Mac at 8 PM. By 8:01 PM, Syncthing has copied it to the server. By 8:01:30, COPS has indexed it. Your Kobo, when you open it next morning, sees the new book in its OPDS catalog and offers to download it. You tap once. The cable is in a drawer.

Photo: E-reader on textured fabric by Caio on Pexels.

Leave a Comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.