A local-first ebook reader, writer and library for your own machine. EPUB, PDF, Markdown, comics, Word, FictionBook and plain text — 33 file types, one library. Find books online, write your own, export five ways. Linux, macOS and Windows.
Eevee scans folders you choose, builds a library out of whatever it finds, and gets out of the way. Nothing is uploaded, no account is needed, and it works with the network unplugged. It runs as a Node server with a browser front end, so it opens in its own desktop window on the machine it runs on — and, if you want, from a phone on the same network.
It is built to be light. There is no Electron, no bundler and no build step: the browser loads ES modules directly. That keeps the install small enough to be comfortable on a Raspberry Pi.
Most readers show a grid of cover thumbnails. Eevee shows spines, because that is what a library actually looks like.
Each spine takes its colour from the book's own cover art, sampled once in the browser. Height follows length and width follows file size, so a row is uneven the way a real shelf is. Reading progress rises up the spine like a ribbon left in place, which means you can see how far through you are on every book at once rather than one badge at a time. Hovering tips a book out and shows its cover.
Books flow onto stacked shelves as the window allows, so a library of five hundred fills the page like a bookcase instead of scrolling sideways forever. A cover grid and a dense list are one keystroke away if you would rather see the art.
| Family | Extensions | Notes |
|---|---|---|
| EPUB | .epub |
EPUB 2 and 3 via epub.js. Nav docs and NCX, five cover fallbacks |
.pdf |
pdf.js, lazily rendered with byte-range fetches. Full-text search | |
| Markdown | .md .markdown .mdown .mkd .mkdn .mdx .qmd .rmd |
YAML front matter, GFM tables, highlighted code |
| Comics | .cbz .cbr .cb7 .cbt |
Single, spread or continuous strip. Reads ComicInfo.xml |
| Plain text | .txt .text .log .nfo .me .asc |
Infers chapters; strips Project Gutenberg boilerplate |
| HTML | .html .htm .xhtml .xht |
Extracts the article, drops navigation and banners |
| FictionBook | .fb2 .fb2z |
Poetry, epigraphs and inline images preserved |
| Word | .docx |
Styles mapped to semantic HTML |
| Rich text | .rtf |
Paragraphs, emphasis and Unicode escapes |
| Kindle | .mobi .azw .azw3 .prc .kfx |
Metadata and covers read directly; converts to EPUB with Calibre |
.cbr and .cb7 need unar or p7zip-full. Kindle conversion needs
calibre. Everything else works out of the box.
Discover searches five services at once, with no key needed for four of them:
| Source | What it gives you |
|---|---|
| Project Gutenberg | 70,000 public-domain books, downloaded as EPUB straight into your library |
| MangaDex | Manga, a chapter at a time, packed as CBZ that Eevee already reads |
| Google Books | Huge catalogue; public-domain volumes download. Rate-limits without a free key |
| AniList | The light novel and manga index — volumes, status, what exists |
| Open Library | Nearly everything published, with links to borrow or read free at the Internet Archive |
Sources that only catalogue a work link out to it. Eevee does not pretend to host what it cannot legitimately fetch.
Remote covers are proxied through Eevee, so the page keeps img-src 'self'
and browsing Discover does not report what you are looking at to five CDNs.
The Studio is a Markdown editor with a live typeset preview. Books save into your library as ordinary files, so they are immediately readable, searchable and reopenable.
Export to EPUB (built here, with a real contents list), PDF (via WeasyPrint), standalone HTML, Markdown or plain text.
Off until you configure it, and you bring your own endpoint and key: Anthropic, OpenAI, OpenRouter, Z.ai, Groq, a local Ollama, or anything OpenAI-compatible. Base URL, key and model are per provider; models are fetched live and there is a Test button so you can tell a bad key from an outage.
- Summarise a book. A 67,000-word novel is read in passes and comes back as two accurate paragraphs.
- Ask questions answered only from the book's text — if it is not in there, Eevee says so.
- Explain a difficult passage.
- Write a book: describe it, review the plan, then watch chapters land.
Keys are stored on the machine and are never sent back to the browser.
- Typography that applies live — Literata, Atkinson Hyperlegible (designed by the Braille Institute for low vision), Public Sans, Fraunces or your system faces; size, leading, measure, margins, letter spacing, justification and hyphenation.
- Five reading surfaces — paper, sepia, grey, slate and true black.
- Pages or scroll, one column or a two-page spread.
- Highlights and notes in five colours, with bookmarks, exportable to Markdown, JSON or plain text. Your words never get stuck in here.
- Full-text search inside any book.
- Read aloud, a sentence at a time, through your device's own voices or an online service with 301 of them. Chunking is the point: a whole chapter in one utterance is flat, cannot be paused mid-paragraph, and takes an age to start.
- Reading statistics — time, words, streaks and ninety days of activity.
- Command palette on Ctrl+K for every book and every command.
- Progress, position and notes are saved continuously and survive a crash.
Needs Node 18 or newer. Works on Linux, macOS and Windows, per-user, with no administrator rights.
git clone https://github.com/gammadevv/eevee
cd eevee
npm install
node bin/eevee.js installThat adds Eevee to your applications menu, installs an eevee command,
registers the ebook and comic types your system has no entry for, and makes
Eevee the default for .epub, FictionBook, comics and Kindle files.
Two platform notes, because they are not Eevee's choice:
- macOS cannot have its default handler set from a script. Install
duti(brew install duti) and rerun, or set it once via Get Info. - Windows does not let an application silently become the default for a type another program owns. Eevee registers itself properly and appears in Open with; you tick "Always use this app" once per format.
It deliberately does not take over .pdf, .txt, .html, .docx or
.rtf — those already have an application you chose. Eevee still appears in
"Open with" for them. Pass --all if you want it to claim those too, or
--no-default to change no associations at all.
Everything Eevee stores lives in one folder, ~/.eevee — findable,
backup-able and deletable in one go. An older install is migrated on first
start.
Remove it with eevee uninstall, or eevee uninstall --purge to delete your
library index and notes too. Your book files are never touched.
eevee # open the library
eevee ~/Books/tidewrack.epub # open a book straight away
eevee --no-window # serve only; print the address
eevee --host 0.0.0.0 # reach it from a phone on your network
eevee --port 4000
eevee install add it to this machine
eevee uninstall [--purge] remove it
eevee update [--check] pull a newer version from the repository
eevee --helpOpening a book while Eevee is already running hands it to the window that is already open rather than starting a second copy.
| Ctrl+K | Command palette |
| / | Search the library |
| Ctrl+D | Find books online |
| Ctrl+E | Write a book |
| S G L | Shelf, grid, list |
| → ← Space | Turn the page |
| T | Contents |
| N | Highlights and notes |
| A | Text settings |
| D | Bookmark this spot |
| V | Read aloud |
| F | Fullscreen |
| Ctrl+F | Search in this book |
| ? | Every shortcut |
bin/eevee.js CLI: arguments, the app window, single-instance handoff
src/config.js XDG paths and defaults
src/server/
index.js Express app, CSP, WebSocket for live library updates
routes/ library, book, progress, annotations, settings, stats
library/ JSON store with atomic writes, scanner, cover cache
formats/ one adapter per family, registered by extension
sources/ the online catalogues, one module each
ai/ providers, prompts, text extraction, saving
export.js Markdown, text, HTML, EPUB and PDF out
update.js git-based self-update
util/ zip, HTML sanitiser, logger
src/web/
index.html the shell and the icon sprite
css/ tokens, base, components, library, reader
js/ plain ES modules: readers, views, state, router
vendor/ committed third-party client libraries and fonts
install/ cross-platform installer: linux, macos, windows
test/ 81 tests over the adapters, shortcuts and the whole API
Book content is untrusted, so it is sanitised on the server before it reaches
the page — scripts, event handlers, javascript: URLs and any CSS that could
escape the reading column are stripped — and a Content Security Policy without
unsafe-inline backs that up. The server binds to loopback unless you tell it
otherwise, and says so out loud when you do.
SPEC.md is the interface contract every module is written against.
npm run fixtures # build the test corpus
npm test # 81 tests, plus static checks
npm run check # every client import resolves, nothing used unimported
npm run serve # run without opening a window
npm run vendor # refresh vendored client libraries from node_modules
node scripts/make-icons.js
node scripts/probe-formats.js # run every adapter over the corpusEevee will not scrape a pirate mirror, and there is no source in it that does. The honest answer to "where do I read this light novel" is the publisher, and where a service only catalogues a work, Eevee links out to it rather than pretending otherwise.
MIT.
0 comments
log in to comment.