# ReadAny: a local-first AI e-book reader with RAG chat and semantic search

> ReadAny is a TypeScript e-book reader for macOS, Windows, Linux, iOS and Android that runs embeddings and a vector store locally, adds hybrid vector plus BM25 retrieval, and syncs through WebDAV. The install path is a signed binary, not a server.

**codedogQBY/ReadAny** — AI-powered cross-platform e-book reader with semantic search, RAG chat, local vector store, notes, TTS, and WebDAV sync.

- Repository: https://github.com/codedogQBY/ReadAny
- Website: https://codedogqby.github.io/ReadAny/
- Stars: 2,687 · Forks: 216
- Language: TypeScript
- License: NOASSERTION
- Published: 2026-09-10 · Updated: 2026-09-10 · Language: en
- Canonical page: https://hysenlabs.com/projects/codedogqby-readany

## The problem ReadAny targets: reading that leaves no retrievable trace

Most e-book readers treat a book as a document to render. ReadAny treats it as a corpus to query. The README states the motivation directly: "Why do I forget what I read? Why are my notes scattered? Why can I only search by keywords?" Each of those maps to a feature. Semantic search replaces keyword matching, highlights and notes replace scattered annotation, and chat replaces the reader hunting through a book for an answer.

The intended user is someone with a local library, usually EPUB or PDF, who reads on more than one device and wants the same annotations everywhere. The README lists macOS, Windows, Linux, iOS and Android, and the Quick Start table offers a .dmg for Apple Silicon and Intel, an .msi for Windows, an .AppImage for Linux, a TestFlight link for iOS and an .apk for Android. That is a consumer application distribution model, not a self-hosted service.

Where it differs from a plain reader is the retrieval layer. The comparison table in the README puts AI chat, semantic search, a local vector store, TTS, reading stats, WebDAV sync and a skills system in ReadAny's column and marks most of them absent for Calibre, KOReader and Apple Books. Treat that table as the maintainer's positioning, not an independent benchmark.

## How the retrieval and chat pipeline is put together

The README describes the search path as "Hybrid vector retrieval + BM25 search". Two retrievers run over the same book: a dense vector index built from embeddings, and a sparse lexical index in the BM25 family. Hybrid retrieval matters because embeddings alone handle paraphrase well and rare proper nouns poorly, while BM25 does the reverse. Combining them is the standard fix, and the README does not document the weighting between the two.

Embeddings are computed locally, and the vector store is local. The repository topics list sqlite, embeddings and vector-search, and the README's privacy row says "Local vector store, fully offline capable". Offline capability depends on which model provider you configure. Local embeddings plus a local model such as Ollama can run without network access; OpenAI, Claude, Gemini and DeepSeek cannot.

Chat is grounded in reading context. The README states the AI "knows your position, selected text, and highlights", so the retrieval query is assembled from where you are in the book plus any selection, rather than from a blank prompt. Answers are described as grounded in that context and as locating their sources.

The repository is a pnpm workspace. The root package.json defines scripts that fan out to packages: dev and build target app, test targets @readany/core, and there are separate cli, tauri and expo targets. Desktop builds go through Tauri, mobile through Expo. The root also carries patchedDependencies for @langchain/core and react-native-track-player@4.1.2, which tells you the LLM plumbing sits on LangChain and that the mobile audio path needed a patch to work as intended.

## Installing ReadAny on macOS with Homebrew and opening a first book

The README's Quick Start points at release binaries first. On macOS there is also a Homebrew cask. The commands below are copied from the README; the tap name and cask name are exactly as published there.

```bash
brew tap codedogQBY/readany
brew install --cask readany
```

After the cask installs, the application appears in the usual macOS applications location. The README does not document a post-install step, so the first launch is the point at which you find out whether the build is signed for your machine.

The README's own three-step flow is import, read, then configure AI. Importing is drag and drop into the library, and opening a book is a double-click. AI configuration is explicitly optional, which means the reader is usable before any provider is set up.

```bash
pnpm install
pnpm dev
```

Those two commands are from the repository rather than the README prose: the root package.json defines dev as pnpm --filter app dev, so pnpm dev starts the desktop app in development mode. The workspace pins pnpm@9.15.0 through the packageManager field, so a different pnpm major may not resolve the same way. Running from source also means building the Tauri shell, which the root script exposes as pnpm tauri.

## Where ReadAny gets in the way

Format coverage is narrower than the headline suggests. The README claims "10+ formats" and lists EPUB, PDF, MOBI, AZW, AZW3, FB2, FBZ, CBZ, TXT and UMD. It then adds a sentence that changes the picture: TXT and UMD are imported by converting them to EPUB first. So two of the ten are not read natively, and conversion is a lossy step for anything with structure the converter does not model. Calibre, by the same table, lists 15+ formats.

Mobile is the weakest documented path. The README's v2.0 note says mobile apps are available, but the iOS route is a TestFlight link and the Android route is a direct .apk from the releases page. TestFlight builds expire. The README does not state a release cadence for the mobile channel, and the release history shows desktop-tagged versions (v1.3.4 through v1.3.6) without saying whether the mobile binaries track them.

Licensing is unresolved at the repository level. The GitHub metadata reports NOASSERTION for the licence, while the root package.json declares GPL-3.0-or-later. Those two signals disagree, and the LICENSE file is the only thing that settles it. If you plan to redistribute a build or link the core package into your own product, read that file rather than the badge.

Finally, the README does not document rollback, migration or what happens to a local vector index when the embedding model changes. If you switch from local embeddings to a hosted provider, the stored vectors are not comparable, and nothing in the README describes a reindex path.

## ReadAny against Calibre and KOReader

Calibre is the obvious comparison and the README makes it explicitly. Calibre is a library manager first: conversion pipelines, metadata editing, device transfer, a plugin ecosystem. It has no AI chat and no semantic search in the README's table. If your problem is organising ten thousand files, converting between formats and pushing them to a dedicated e-reader, Calibre is the mature answer and ReadAny is not competing there.

KOReader is the other end. It runs on e-ink hardware, which neither ReadAny nor Apple Books targets, and it is built for battery life and page-turn latency rather than retrieval. The README marks it as having limited TTS and no AI features. If you read on a Kindle or a Kobo, KOReader is the tool designed for that device, and ReadAny has no path onto it.

The real distinction is what happens after you finish a book. Calibre and KOReader both leave you with a file and whatever notes you exported. ReadAny keeps a queryable index over the text and your annotations, and it answers questions against that index. That is a different product category, and it is the reason to accept the narrower format list and the younger codebase.

## Maintenance, sync and upgrade cost

The repository is not archived, and the last push was on 2026-09-09. Recent releases are v1.3.4 on 2026-06-09, v1.3.5 on 2026-07-08 and v1.3.6 on 2026-08-16, which is roughly a monthly cadence across the summer. The README also carries a v2.0 note about mobile availability that the release tags do not reflect, so the version numbering in the README and the version numbering in the releases are not describing the same thing.

The upgrade cost sits in the vector store. Every version that changes the embedding model or the index schema forces a reindex of your library, and reindexing is the expensive operation in this design because it runs embeddings over every book. The README does not describe an incremental or versioned index, so plan on a full pass after a major upgrade.

Sync runs over WebDAV. The README lists auto sync and "smart merge for concurrent edits", which means the client resolves conflicts rather than the server. That shifts responsibility onto the app, and the README does not document the merge rules or what happens when the same highlight is edited on two devices offline. Test that path with two devices before trusting it with annotations you care about.

On licensing, the root package.json says GPL-3.0-or-later while the repository metadata says NOASSERTION. GPL-3.0-or-later is a copyleft licence, which has practical consequences for anyone embedding the core package in a distributed product. Confirm against the LICENSE file; this is a description of what the files say, not legal advice.

## Conclusion

ReadAny fits readers who already keep their books as files and want question answering over them without uploading the library to a service, and it is the wrong tool for anyone who needs a server-side shared index or a reader with no AI configuration at all. Before committing, check that the AI provider you intend to use is one of the five the README lists, that your WebDAV server handles the conflict merge the app performs, and that the licence terms in the repository match how you plan to distribute anything built on top of it.

## FAQ

### How do I install ReadAny on Windows?

The README's download table lists a .msi for Windows, linked from the latest GitHub release. There is no documented package manager route for Windows; the Homebrew cask is macOS only.

### Does ReadAny need an internet connection to work?

The README says local embeddings and a local vector store keep books, highlights and notes offline-capable. Chat still depends on the provider you configure, and only a locally hosted option such as Ollama avoids the network.

### Which AI providers can ReadAny connect to?

The README lists OpenAI, Claude, Gemini, Ollama, DeepSeek, and custom-compatible providers. Configuration is described as optional, so the reader works before any provider is set up.

### What formats does ReadAny support?

The README lists EPUB, PDF, MOBI, AZW, AZW3, FB2, FBZ, CBZ, TXT and UMD. It notes that TXT and UMD are imported by converting them to EPUB first.

## Sources

- [codedogQBY/ReadAny on GitHub](https://github.com/codedogQBY/ReadAny)
- [Issues](https://github.com/codedogQBY/ReadAny/issues)
- [Project website](https://codedogqby.github.io/ReadAny/)
- [README](https://github.com/codedogQBY/ReadAny/blob/main/README.md)
- [Releases](https://github.com/codedogQBY/ReadAny/releases)

---

Hysen Labs editorial analysis, written from the project's own repository and release notes. Cite the canonical page: https://hysenlabs.com/projects/codedogqby-readany
