Troubleshooting
Common problems and how to fix them. If you hit something not listed here, open an issue with the relevant lines from the server’s stdout/stderr.
Error: spawn npm ENOENT on Windows
This came from the cross-platform development launcher trying to execute the Unix-style npm command instead of Windows’ npm shim. Current versions invoke npm through Node and do not have this problem.
If you are on an older checkout, update OperaLibre or start the two development processes in separate Command Prompt or PowerShell windows:
npm run dev:server
npm run dev:web
Both windows need to remain open only for this source-development setup. The downloadable combined release uses the background launcher instead.
A downloaded release will not start
First confirm that you extracted the entire archive. The launcher and server must remain together with server.config; they will not work correctly from inside a ZIP preview.
Windows warns about an unrecognized app
OperaLibre releases are not code-signed yet, so Windows may show a Microsoft Defender SmartScreen warning. Confirm that the file came from the official OperaLibre releases page, choose More info, then Run anyway.
If Windows Defender Firewall asks, allow access on Private networks. Public-network access is not needed for normal home use.
macOS says the developer cannot be verified
OperaLibre releases are not Apple-notarized yet. Follow the one-time quarantine removal steps in Install a Release, then open Open OperaLibre.app again.
The browser did not open
Browse to http://localhost:4920 yourself. If that address does not load, check data/server.log and LAUNCH-ERROR.txt in the OperaLibre folder. A common cause is another program already using port 4920.
Is OperaLibre still running?
The combined package runs in the background. Closing the browser does not stop it. Use the included Stop action when you want to shut it down, or use the Open action again to return to it.
The library is empty
- Confirm
library_rootinserver.configpoints at the folder you expect, with an absolute path. - Check the server process can read the path — permissions are a common culprit on Linux when the binary runs as a service user.
- Files at the root of
library_rootonly count if they are themselves audio files. Loose.pdfor.txtfiles are ignored unless they sit beside a same-stem audio file. - After moving files, hit Rescan library in the UI, or
POST /api/library/rescan.
A book is missing chapters
- For
.m4b/.m4afiles, the server reads MP4 chapter tracks. If your file doesn’t have them, you can add them with mp4chaps orMP4Box. - For MP3s, the server reads ID3
CHAPframes. Most ID3 editors don’t expose these; Mp3Tag can. - For multi-file folder books, each audio file becomes one chapter automatically — sorted by filename, so use zero-padded prefixes (
01,02, …).
Cover art doesn’t show up
- Verify the audio file actually has embedded art (Mp3Tag or
ffprobewill tell you). Covers come from the embedded tags only — a loosecover.jpgbeside the tracks is not read. - If the art is missing, embed it with a tag editor and choose Rescan library.
- Hard-refresh the browser; covers are cached by the browser.
Readalong companion isn’t matched
- Check the matching rules. Folder books prefer a same-name file; single-file books require a same-stem companion in
library_root. - Confirm the extension is one of
.epub,.pdf,.txt,.html,.htm(lowercase).
Seeking is broken or the audio rebuffers constantly
- Make sure the client is talking to the server over HTTP/1.1 or HTTP/2, not a proxy that strips
Rangeheaders. - If you’re fronting with nginx or Caddy, see the reverse proxy notes —
proxy_buffering offand forwardingRangeare required. - On slow LANs, large
.m4bfiles can briefly stall — but seeking should still snap to the new position immediately.
“Address already in use”
Another process is on port. Either change port in server.config or stop the other process.
lsof -i :4920 # find the offender
I forgot the admin password
See Resetting a forgotten admin password.
“Libation not configured” or downloads fail
Everyone was signed out
Sessions are stored in the server database (data/operalibre.db) and survive restarts, but they expire 30 days after sign-in. If everyone was signed out at once, check whether the database was deleted or the data directory changed.
CORS errors in the browser console
The easiest fix is to serve the built web app from OperaLibre itself by setting web_dist_dir in server.config; then the site and API use one address. If you intentionally host them on different addresses, put the web app’s full origin (for example https://books.example.com) in the comma-separated allowed_origins setting and restart the server. See Configuration.
Where are the logs?
Release installations started with the Open launcher or the installer’s helper scripts write to data/server.log inside the installation folder. When you run the binary yourself, the server logs to stdout/stderr. With systemd:
journalctl -u operalibre -f
With launchd, route logs in the plist:
<key>StandardOutPath</key><string>/Users/you/operalibre/server.log</string>
<key>StandardErrorPath</key><string>/Users/you/operalibre/server.err</string>
Filing a bug
Useful info to include:
- Operating system and architecture
- The installed version — shown under Administration → Overview and in the installation’s
VERSION.txt(or the commit hash you built from) - Relevant
server.config(redact paths if needed) - The first few hundred lines of server output around the failure
- A minimal example of the library layout that triggers the bug