Show HN: Offline AI assistant for Android (PDFs, Wikipedia, more)
Eva is a fully offline AI assistant for Android. It includes chat, offline maps, music player, document reader, image gallery, and more—all running on-device with no cloud dependency.
Notifications You must be signed in to change notification settings
Fork 0
Star 0
BranchesTags
Open more actions menu
Folders and files
NameName
Last commit message
Last commit date
Latest commit
History
46 Commits
46 Commits
.github/workflows
.github/workflows
android/mbedtls/arm64-v8a
android/mbedtls/arm64-v8a
binary
binary
cactus-engine
cactus-engine
cactus-graph
cactus-graph
cactus-kernels
cactus-kernels
cactus
cactus
docs
docs
flutter/example
flutter/example
python
python
.gitignore
.gitignore
CACTUS_VERSION
CACTUS_VERSION
LICENSE
LICENSE
README.md
README.md
models.json
models.json
probe.pt
probe.pt
zapstore.yaml
zapstore.yaml
Repository files navigation
Eva is a fully offline AI assistant for Android. The language model, speech recognition, text‑to‑speech, document search, maps, music and Wikipedia all run on the phone. No account, no cloud, nothing leaves the device.
⬇ Download the latest APK (arm64‑v8a) — or run binary/get-latest-apk.sh.
What Eva does
Eva is a chat assistant and an offline media/knowledge hub. The home screen has four tabs — Chat, Images, Music, Docs — and music keeps playing in the background with lock‑screen controls while you use the rest.
Chat, grounded in your data
Offline maps & navigation
Full music player
Offline Wikipedia reader
Music sorted by LLM genre
Documents categorised by the LLM
Photo gallery + tags
Online radio
Per‑area settings
Features
💬 Chat & assistant
On‑device chat with selectable models (LFM2.5, Qwen3, vision models), downloaded on demand or sideloaded from a folder.
Grounded answers: Eva fuses three sources — your documents (hybrid vector
full‑text retrieval), the offline Wikipedia, and the model's own knowledge — and cites them. Tap a citation to open the source at the passage.
Digital assistant: set Eva as the phone's assistant and invoke it with a power‑button hold — it listens, answers, and speaks the reply.
Voice in/out: offline streaming speech‑to‑text (English) or the phone's recognizer (many languages), plus spoken replies.
Vision: attach a photo and ask about it (with a vision model selected).
Persistent chat history with a conversation drawer; reply‑length control; each answer shows how long it took.
🗺️ Offline maps & navigation
Ask "where is X" / "show me X on a map" → an expandable map tile in chat that opens full‑screen with your live GPS dot and a distance/bearing readout.
"route to X" draws a walking path from your position to the destination.
Streets and satellite layers, cached on demand to a folder you choose, so places and routes you've viewed keep working offline. "Save this area offline" caches a region for later.
🎵 Music — a full offline player
Browse Favourites (most played), Folders, and Artists.
Folders are grouped by an LLM‑assigned genre → subgenre (so bands without a genre tag still get sorted — e.g. alternative rock, black metal, funk).
A "+" on every track adds it to the playlist; tap the now‑playing bar to open a full player: seek bar, transport, shuffle/random, and the current queue (jump / remove). Save, load and delete named playlists.
Background playback with lock‑screen / notification controls.
📚 Docs — an e‑reader
Wikipedia: read the offline encyclopedia with search‑as‑you‑type (ranked by article popularity), a random article, the main page, and a recently‑viewed list.
Folders: documents categorised by the LLM into genre → subcategory, with live progress, reusing the already‑extracted text.
Favourites: recently read, starred, and often‑read documents.
PDFs resume at the last page ("Page X of Y"); Word/EPUB/text render in full and resume your scroll position with a "% read".
Index PDFs, Word, PowerPoint, Excel and EPUB — fully on‑device.
🖼️ Images — a gallery
Search by the on‑device caption (a vision pass labels photos while charging) and by your own tags; filter by category (photos / screenshots / memes), group by day, and view GPS‑located photos on the map.
📻 Radio · ⏰ Reminders
Online radio stations with play counts/favourites; "play radio …" from chat.
Timed reminders — "remind me … in 15 minutes" / "at 7pm" (EN/PT) — fire as system notifications even when Eva is closed.
⚙️ Settings & storage
Settings organised into per‑area panels (Appearance, Language model, Voice, Documents, Photos, Music, Radio, Wikipedia, Maps, Reminders, Storage).
One unified storage folder for all data (models, Wikipedia, documents, map cache); choosing a new folder (e.g. an SD card) moves everything so nothing has to be re‑downloaded.
Everything stays on the device
Eva is built to work with no connectivity. The model, embeddings, speech, the document index (a sharded int8 vector index fused with full‑text search), the ZIM‑backed Wikipedia, GPS, cached map tiles and your media all live on the phone. Internet is only used for optional on‑demand downloads (a model, a Wikipedia edition, a map tile, lyrics, a radio stream) — never for your data.
Architecture
Flutter app (flutter/example/lib/) talking over FFI to:
the Cactus inference engine (libcactus.so) for the LLM/VLM/embeddings,
libzim (libzimffi.so) for the offline Wikipedia.
A background isolate runs inference; gated background passes (photo captioning, document & music categorisation) use the model while charging / idle and yield instantly to chat.
Native libraries are content‑addressed and built by a Gradle hook (an NDK is only needed when engine sources change).
Repository layout
flutter/example/ — the Eva Flutter app (lib/), its native FFI builds (native/, native_zim/) and on‑device integration tests.
cactus/, cactus-engine/, cactus-graph/, cactus-kernels/ — the Cactus inference engine sources compiled into libcactus.so (see LICENSE).
python/ — the host‑side transpiler that converts HuggingFace models into loadable bundles (used by CI; the phone only loads pre‑transpiled bundles).
.github/workflows/android-release.yml — CI: transpiles missing model bundles and publishes the APK to the GitHub release.
binary/ — convenience script to fetch the latest released APK.
Building
cd flutter/example flutter build apk --release --target-platform android-arm64
The native library is built (or restored from a local cache) automatically by a Gradle hook; an Android NDK is only needed when engine sources actually change.
Credits
Built on the Cactus inference engine (Cactus Compute, Inc. — see LICENSE). Eva is maintained by Geogram.
About
Offline personal assistant
Resources
Readme
License
View license
Uh oh!
There was an error while loading. Please reload this page.
Activity
Custom properties
Stars
0 stars
Watchers
0 watching
Forks
0 forks
Report repository
Releases 4
Eva v2.3
Latest
Jun 15, 2026
+ 3 releases
Packages 0
Uh oh!
There was an error while loading. Please reload this page.
Contributors
Uh oh!
There was an error while loading. Please reload this page.
Languages
C++ 44.0%
C 27.8%
Python 20.8%
Dart 5.5%
Objective-C++ 0.7%
Makefile 0.4%
Other 0.8%