Featured

Deploy OpenClaw in 60 seconds — 20% off logoDeploy OpenClaw in 60 seconds — 20% off

Launch OpenClaw on Hostinger in about 60 seconds and keep your agent live 24/7. Our referral link gives you 20% off, no coupon code needed.

Launch on Hostinger
Run your Hermes agent on Hostinger, fully managed logoRun your Hermes agent on Hostinger, fully managed

Launch Hermes on Hostinger in one click, fully managed, no VPS knowledge needed. Use code ZACAARON10 for 10% off.

Launch on Hostinger
Crawl and scrape any site into clean data, 10% off logoCrawl and scrape any site into clean data, 10% off

Firecrawl crawls and scrapes any site into clean markdown for your agent. Get 1,000 free credits, and new users get 10% off their first purchase.

Try Firecrawl free
Your own AI agent, running 24/7 with QwikClaw logoYour own AI agent, running 24/7 with QwikClaw

QwikClaw sets up and runs an always-on OpenClaw agent for you. One click, no config files, no server setup.

Deploy now
One API to scrape, enrich, and extract the internet. logoOne API to scrape, enrich, and extract the internet.

Context.dev gives your agents a single API to scrape, enrich, and extract live web data — no proxies, no parsers, no maintenance.

Start building free
SetupClaw: done-for-you OpenClaw for founders & exec teams logoSetupClaw: done-for-you OpenClaw for founders & exec teams

White-glove OpenClaw for founders and exec teams (4–50+ employees): we install, harden, integrate your tools, and maintain it — secured from day one.

Get it set up for you
SEO data APIs for your agent, $1 free credit logoSEO data APIs for your agent, $1 free credit

DataForSEO gives your agent live access to SERP results, keyword data, backlinks, and on-page SEO data through one API. New accounts get a $1 credit, good for up to 20,000 keyword or backlink lookups.

Try DataForSEO free
Reach 47,000+ AI builders

A flat monthly placement in front of developers actively installing AI tools. No lock-in, cancel anytime.

Advertise here

Works with

Claude CodeClaude DesktopCursorVS CodeClineCodex CLIOpenClaw+ any MCP client

Install to Claude Code

This server doesn't publish a one-line install command. Follow the setup in the source repository.

Summary

Enables AI agents to search, read, and manage offline knowledge from ZIM files (Kiwix archives) with full-text search, language support, and library management.

README.md

Zimi

![CI](https://github.com/epheterson/Zimi/actions/workflows/ci.yml) ![Tests](#) ![Lighthouse Accessibility](docs/plans/2026-04-26-accessibility.md) ![WCAG 2.1 AA](docs/plans/2026-04-26-accessibility.md) ![i18n](#languages) ![Docker Pulls](https://hub.docker.com/r/epheterson/zimi) ![PyPI](https://pypi.org/project/zimi/) ![License: MIT](LICENSE)

A modern experience for your ZIM files.

Kiwix packages the world's knowledge into ZIM files. Zimi makes them feel like the real internet with a rich web UI, fast JSON API, and an MCP server for AI agents. Everything works offline, in your language.

What is Zimi?

  • The offline internet. Entire websites, cross-ZIM linking, search engine and native browser experience.
  • Search that hits everything. One query, every source, 100M+ articles, the right answer on top. Fast.
  • Multilingual. Switch any article into any language it has. Ten UI languages built in.
  • A real library. 1,000+ archives one click away, auto-updates, collections, batch downloads, bookmarks and history.
  • Yours or everyone's. Serve the whole library openly, limit anonymous visitors to a chosen set of ZIMs, or require sign-in — with named accounts and per-ZIM access lists on top.
  • Your own network. Your machines find each other and pass ZIMs around at LAN speed, no internet needed.
  • A good citizen. Downloads arrive over BitTorrent and seed back to the Kiwix network. One switch makes you a full mirror.
  • Fresh daily. Picture of the Day, On This Day, a word, a quote, a comic, a live almanac sky. All computed locally, forever.
  • Accessible. If you browse by keyboard, listen by screen reader, or need high contrast, accessibility is built-in.
  • Anywhere. Docker, pip, a native macOS app, or your phone as a PWA.
  • Improving. Regular updates with ideas from the community, GitHub and creator keep Zimi fresh. Just ask!
  • For humans and machines. Web UI, JSON API, MCP server for AI agents.

Screenshots

| Homepage | Search Results | |----------|---------------| | !Homepage | !Search |

| Language Switching | Catalog | |-------------------|---------| | !Languages | !Catalog |

| Sharing | |---------| | !Sharing |

Languages

Not an afterthought. Language is deeply integrated into every aspect of Zimi so you can focus on your content and feel at home. Enjoy filtered lists, labeled sources, RTL support and no rock left unturned.

  • 10 languages. English, French, German, Spanish, Portuguese, Russian, Chinese, Arabic, Hindi, Hebrew.

Something not right? Open an issue. Found a security problem? See SECURITY.md — report it privately.

Sharing

Three switches in Server Settings control all of it:

  • BitTorrent (on by default). Downloads arrive via the Kiwix swarm and seed back, capped at a ratio you choose. 0 means never seed. The engine is in-process libtorrent: the desktop apps and Docker image bundle it, and pip install zimi pulls it automatically wherever a prebuilt wheel exists (CPython 3.9–3.13 on Linux, macOS, and Windows). If there's no wheel for your interpreter — Python 3.14+ has none yet — Zimi quietly falls back to plain HTTP and prints the one-line fix; pip install zimi[bt] forces the attempt. UPnP asks your router to open the port, and the settings panel shows whether it worked. Concurrent downloads and the peer-connection limit are tunable in the same panel.
  • Nearby (off by default). Flip it on and Zimi devices on your network find each other; a green pill on a catalog card means a neighbor already has that ZIM. Transfers stay on your LAN, never the internet.
  • Mirror (off). Lifts the seeding cap, for people who want to run a long-term Kiwix mirror.

Seeding needs no router setup: Zimi opens the BitTorrent port automatically (UPnP) and the settings show whether peers can reach you, with a retry when they can't. DHT is on too, so magnet links and trackerless swarms just work.

Install

macOS

brew tap epheterson/zimi && brew install --cask zimi

Or download from GitHub Releases.

Linux

sudo snap install zimi

Or grab the AppImage.

Docker

docker run --network host -v ./zims:/zims -v ./zimi-config:/config epheterson/zimi

/zims is where ZIM files live. /config persists cache, indexes, and settings. Open http://localhost:8899.

--network host is recommended so LAN peer discovery (mDNS) and BitTorrent seeding work out of the box. If you can't use host networking, see "Bridge mode" below.

<details> <summary>Docker Compose (recommended — host networking)</summary>

services:
  zimi:
    image: epheterson/zimi
    container_name: zimi
    restart: unless-stopped
    network_mode: host           # mDNS + BT seeding work without port plumbing
    volumes:
      - ./zims:/zims             # ZIM files go here
      - ./zimi-config:/config    # cache, indexes, settings

</details>

<details> <summary>Docker Compose (bridge mode — no LAN discovery)</summary>

services:
  zimi:
    image: epheterson/zimi
    container_name: zimi
    restart: unless-stopped
    ports:
      - "8899:8899"
      - "6881:6881/tcp"          # BitTorrent (TCP)
      - "6881:6881/udp"          # BitTorrent (UDP / DHT)
    volumes:
      - ./zims:/zims
      - ./zimi-config:/config

LAN peer discovery (_zimi._tcp) won't reach the LAN in bridge mode — multicast doesn't cross the docker bridge, and Zimi warns in the Nearby settings when it detects this. Use host networking, or set ip=<your host's LAN address> in ZIMI_NEARBY. BT seeding still works because libtorrent binds the mapped port. See docs/deployment-networking.md for the full discussion. </details>

Python

pip install zimi
ZIM_DIR=./zims zimi serve --port 8899

Environment Variables

Most people set nothing: every setting below has a sensible default or lives in the UI.

| Variable | Default | Description | |----------|---------|-------------| | ZIM_DIR | /zims | Path to ZIM files (scanned for .zim on startup) | | ZIMI_DATA_DIR | /config (Docker) or $ZIM_DIR/.zimi | Cache, indexes, and settings. Mount separately in Docker. | | ZIMI_MANAGE_PASSWORD | _(none)_ | Protect library management | | ZIMI_PUBLIC_ACCESS | open | What an anonymous visitor sees: open (whole library), limited (an admin-chosen allowlist), or private (sign-in required). Also a UI setting; the env var wins when set. | | ZIMI_BT | on | BitTorrent: off, or on,port=6881,ratio=2,up=2048,seed=on,mirror=off,upnp=on,dht=on,active=4,conns=200. seed, upnp, and dht default on. active caps concurrent downloads (the rest queue; governs HTTP too — legacy ZIMI_MAX_CONCURRENT_DOWNLOADS still works), conns is the global peer-connection limit. Fields you set are locked in the UI; fields you leave out stay UI-controlled. ratio=0 means never seed. | | ZIMI_NEARBY | off | LAN sharing: off, or on,name=my-zimi,public=off,ip=192.168.1.20. Controls serving and* fetching between your Zimi devices. Set ip= to your host's LAN address when running Docker in bridge mode. |

<details> <summary>Advanced</summary>

| Variable | Default | Description | |----------|---------|-------------| | ZIMI_MANAGE | 1 | Library manager. 0 to disable entirely. | | ZIMI_AUTO_UPDATE | 0 | Auto-update ZIMs (1 to enable; also a UI setting) | | ZIMI_UPDATE_FREQ | weekly | daily, weekly, or monthly | | ZIMI_RATE_LIMIT | 60 | Requests/min/IP for anonymous clients. 0 to disable. | | ZIMI_RATE_LIMIT_TRUSTED | 600 | Budget for logged-in clients (and private-network clients on passwordless instances). | | ZIMI_API_TOKEN | _(none)_ | Pin the API token instead of generating in the UI | | ZIMI_HOT_ZIMS | _(none)_ | Comma-separated ZIM names to pre-warm at startup |

</details>

API

| Endpoint | Description | |----------|-------------| | GET /search?q=...&limit=5&zim=...&fast=1&lang=... | Full-text search. fast=1 for title matches only. lang filters by language. | | GET /read?zim=...&path=...&max_length=8000 | Read article as plain text | | GET /chunks?zim=...&path=...&size=1200&overlap=120 | Deterministic, embedding-free article chunking for RAG clients | | GET /suggest?q=...&limit=10&zim=... | Title autocomplete | | GET /list | List all sources with metadata | | GET /article-languages?zim=...&path=... | All languages an article is available in | | GET /catalog?zim=... | PDF catalog for zimgit ZIMs | | GET /snippet?zim=...&path=... | Short text snippet | | GET /random?zim=... | Random article | | GET /collections | List collections | | POST /collections | Create/update a collection | | DELETE /collections?name=... | Delete a collection | | GET /resolve?url=... | Resolve external URL to ZIM path | | POST /resolve | Batch resolve: {"urls": [...]} | | GET /health | Health check with version | | GET /w/<zim>/<path> | Serve raw ZIM content | | GET /openapi.json | OpenAPI 3.1 description of the stable read API |

Examples

# Search across all sources
curl "http://localhost:8899/search?q=python+asyncio&limit=5"

# Search in French only
curl "http://localhost:8899/search?q=eau&lang=fr&limit=5"

# Find all languages for an article
curl "http://localhost:8899/article-languages?zim=wikipedia&path=A/Water"

# Read an article
curl "http://localhost:8899/read?zim=wikipedia&path=A/Water_purification"

MCP Server

Zimi includes an MCP server for AI agents.

{
  "mcpServers": {
    "zimi": {
      "command": "python3",
      "args": ["-m", "zimi.mcp_server"],
      "env": { "ZIM_DIR": "/path/to/zims" }
    }
  }
}

For Docker on a remote host:

{
  "mcpServers": {
    "zimi": {
      "command": "ssh",
      "args": ["your-server", "docker", "exec", "-i", "zimi", "python3", "-m", "zimi.mcp_server"]
    }
  }
}

Tools: search (with lang filter), read, get_chunks, suggest, list_sources, random, article_languages, read_with_links, deep_search, list_collections, manage_collection, manage_favorites

Integrations

  • SearXNG — route queries through Zimi from a self-hosted SearXNG metasearch instance.
  • OpenWebUI / generic AI — wire the MCP server into any AI client for offline research.

Long-requested, shipped here

Every issue filed against Zimi has been answered — #33 country holiday colors, #34 new-ZIM badges and recency filters, #36 Tailscale-friendly management, #37 library organization, #38 fragment links and stray-torrent confusion. And features the wider ZIM ecosystem has been asking for, available today:

  • Spelling suggestions — "did you mean?" on weak searches, fully offline (libzim #731)
  • Read-aloud — text-to-speech in the reader via the offline Web Speech API (kiwix-js #166)
  • Reader View — a clean, adjustable reading mode (themes, fonts, text size) for any article
  • Word lookup — tap a word in any article, get the dictionary entry from your own library
  • Resumable downloads — an interrupted ZIM download picks up where it left off, and updates reuse the unchanged pieces of the old file instead of re-downloading everything
  • User accounts — named logins with per-ZIM access lists, so one server can serve the whole house (or classroom)
  • A native Windows app — with the same auto-update channel as macOS
  • Give back — seed your downloads to the Kiwix swarm at a ratio you choose, or flip one switch and be a full mirror
  • Grab the file — a download button for any ZIM you're sharing on your network
  • Real article counts — articles, not raw entry counts, on library cards

Contributing

See CONTRIBUTING.md.

License

MIT. Desktop and Docker builds bundle libtorrent-rasterbar (BSD-3-Clause) for BitTorrent transfers — see THIRD_PARTY_NOTICES.md.

---

Built with ❤️ in California by @epheterson and Claude Code.

See related servers & alternatives →

Related MCP servers

Browse all →

Related guides

Hand-picked reading to help you choose and use Vector & Memory servers.