OpenLore README

The project's README from github.com/aakarim/OpenLore. As one markdown file: README.md.

📜 OpenLore

Release Go Reference

Sponsored by Oiya

Serve your docs to AI agents over SSH and MCP.

Point OpenLore at a folder of Markdown and every agent on your team reads the same files, whether it's Claude Code, Codex, Cursor or a CI job. Agents use the tools they already know, like cat, grep and find. You decide who can see and change what.

Claude Code, Codex and a CI job connect to one OpenLore server, which checks each identity's access and serves the same folder of Markdown

Quick start

Install and serve a folder:

brew install --cask aakarim/tap/lore
openlore ./docs

SSH runs on port 2222. The web view and MCP share port 8080. The contents of ./docs appear at /.

Connect an agent:

# Claude Code
claude mcp add --transport http openlore http://localhost:8080/mcp

# Codex
codex mcp add openlore --url http://localhost:8080/mcp

# Anything with a shell
ssh -p 2222 localhost "grep -r 'retry' /"

Tell your agents when to use it:

ssh -p 2222 localhost agents >> AGENTS.md

Or let your agent do the whole setup:

ssh openlore.sh teach | claude

Not on Homebrew? See Installation for Linux, Windows and Go.

Why not just keep Markdown in your repo?

For one agent in one repository, do that.

OpenLore is for when several agents, repositories or people need the same knowledge, and you need to say who can read, write or publish what. Update a file once and every agent sees the new version on its next read.

There's no vector database, ingestion pipeline or SDK. Your knowledge stays as ordinary Markdown.

Guides

Features

Use Cases

How It Works

OpenLore is built on Wish for SSH transport. A connection is handled entirely against a virtual filesystem:

  1. Authenticate — connect keylessly or resolve an SSH key, certificate, passkey, or OAuth login to an identity.
  2. Compose a view — mount only the docsets and paths granted to that identity.
  3. Explore — run shell commands implemented as pure Go functions over that view, or use the equivalent MCP shell tool.
  4. Contribute safely — if writing is enabled, authorise and validate a whole-file change before committing it atomically.

OAuth clients use delegated identities, so durable write provenance distinguishes direct work by adil from work performed as adil/[email protected]. Delegates can inherit no more authority than their principal and can be narrowed by docset and capability deny lists. CIMD clients can additionally authenticate with vendor-hosted metadata and private_key_jwt; see Authenticated OAuth Clients.

The normal shell cannot invoke bash, exec, curl, or arbitrary host processes. Embedded documentation is always read-only. Explicitly trusted identities can be granted narrowly scoped asynchronous processing through the spawn capability.

Governed Writing

OpenLore is read-only by default. Writable deployments keep a single, policy-controlled write path for redirects, append, tee, patch, sed -i, file moves, publishing, and trusted external jobs.

echo "# Research" | publish /backend/findings.md
cat change.diff | patch /backend/api.md
sed -i 's/old/new/g' /backend/runbook.md

Writes are whole-object atomic swaps. Compare-and-swap protection rejects stale edits by default, docset grants constrain the target, and plugins can validate or defer a write before it commits.

See Writing and publishing for user-facing setup and Write system internals for the implementation model.

Installation

Install with Homebrew

Homebrew is supported on macOS and Linux:

brew install --cask aakarim/tap/lore

Install a Linux release

Download and install the latest x86-64 release:

curl -L https://github.com/aakarim/OpenLore/releases/latest/download/openlore_linux_amd64.tar.gz | tar xz
sudo install openlore /usr/local/bin/openlore

Arm64 archives are published as openlore_linux_arm64.tar.gz.

Install a Windows release

Download and extract the latest 64-bit Windows release from PowerShell:

Invoke-WebRequest `
  -Uri https://github.com/aakarim/OpenLore/releases/latest/download/openlore_windows_amd64.zip `
  -OutFile openlore.zip
Expand-Archive openlore.zip -DestinationPath .
.\openlore.exe version

Install with Go

Requires Go 1.26 or later:

go install github.com/aakarim/go-openlore/cmd/openlore@latest

Build from source

git clone https://github.com/aakarim/go-openlore.git
cd go-openlore
go build -o openlore ./cmd/openlore

This normal Go build is backend-only and does not require Node. Release binaries and containers include the dashboard; see Dashboard build and distribution.

Embed docs in a binary

Place documentation in assets/lore/ and build. The resulting binary contains the docs and serves them read-only at /docs when run with no directory argument:

go build -o my-docs ./cmd/openlore

Build with the GitHub Action

Produce cross-platform binaries with your docs embedded:

- uses: aakarim/openlore@v1
  with:
    docs-dir: ./docs
    config: ./openlore.yml

See Ways to use OpenLore for direct VS Code editing, MCP stdio, MCPB desktop packaging, SSHFS, and Go library usage.

Create a customised deployment

Use the bundled setup skill to create <team>-lore, a small customer-owned repository containing openlore.yml, a thin Containerfile pinned to an official OpenLore release, and deployment artifacts. It builds a working local server and verifies HTTP, MCP, authenticated SSH, writes, and persistence before deployment:

ssh openlore.sh setup | amp

The generated repository keeps initial lore.json policy and SSH-visible files under gitignored .local/. The first deployment initialises an empty persistent volume from that state. Root openlore.yml remains the Git/IaC authority and is deployed separately to /var/lib/openlore/config/openlore.yml; it is not baked into the image. Later lore.json and filesystem edits on the server are authoritative and are never overwritten by image updates.

Additional instruction commands support the full lifecycle:

Provider deployments require HTTPS/MCP, authenticated OpenLore SSH, administrative shell access, and a persistent /var/lib/openlore volume. Where the provider supports it, deployment configures public port 22 to forward to OpenLore port 2222. Otherwise it reports the assigned port and recommends an external TCP forwarding system.

The published container contains only OpenLore. It deliberately contains no onboarding policy or server configuration. Before the service starts, the deployment must put openlore.yml and lore.json in the persistent config directory and run:

./out --config /var/lib/openlore/config/openlore.yml

This keeps configuration independently deployable: a simple deployment can copy openlore.yml onto the volume, while Kubernetes can project the same file from a ConfigMap. Use the deploy skill for Fly.io, Railway, AWS, Google Cloud, Azure, DigitalOcean, or custom infrastructure. The repository's Railpack and Fly files provide the image, persistent-volume, and port wiring; they do not seed or mutate configuration at process startup.

Railway assigns its SSH TCP proxy a public hostname and port. Standard SSH port 22 requires an external raw TCP load balancer. Fly.io can map public port 22 to OpenLore's internal port 2222 with a dedicated address. Raw SSH has no hostname or SNI routing, so one listener cannot route multiple domains on port 22.

The container workflow publishes latest from main; releases also publish VERSION, vVERSION, major, and minor image tags.

Documentation

Guide Contents
Changelog Current version, release notes, compatibility notes, and versioned docs
What is OpenLore Serve, connect, scope, govern and observe in one page
Claude Code with OpenLore Connect Claude Code over MCP and scope what it sees
Any agent with OpenLore over SSH Connect a coding agent or CI job over SSH and give it an identity
Let an agent publish into an inbox Accept contributions from an agent without letting it edit anything else
Ways to use OpenLore SSH, MCP, web, SSHFS, embedded binaries, GitHub Action, MCPB, and library usage
Editing OpenLore files Direct VS Code and SFTP editor setup without a local project mirror
Command reference Complete shell, introspection, publishing, syntax, CLI command, and flag reference
Configuration and identity openlore.yml, authentication, roles, docsets, aliases, homes, and host verification
openlore.yml reference Generated reference for every key openlore.yml accepts
HTTP inbox uploads Upload documents with bearer or HMAC credentials
Workload identity federation Authenticate CI and agents with short-lived external identity tokens
Writing and publishing Write modes, inboxes, conflict handling, approvals, and jobs
Plugins and knowledge formats Plugin installation, interfaces, OKF validation, lore validate, and lore meta
Folder rules .lore/config.yaml and lore.json rules, layering, permissions, rejection messages, and growth limits
Rules standard library Generated reference for compiled-in rule members and their parameters
Write system internals Filesystem layering, write seam, admission middleware, and async jobs
Security evaluation Threat model and security properties

Security

See SECURITY.md for the full security evaluation.

License

Apache License 2.0 — Copyright © 2026 Adil Karim

OpenLore bundles third-party open-source components. Their licences and required notices are listed in assets/legal/THIRD_PARTY_NOTICES.md, with full licence texts in assets/legal/licenses/. These are embedded in the binary and served by the running service at /legal.

OpenLore (aakarim/OpenLore)

Searching Database…

Что это?OpenLore — самохостящийся, дружелюбный к агентам сервер знаний: укажите ему папку с Markdown, и каждый агент команды (Claude Code, Codex, Cursor, CI-задачи) читает одни и те же файлы по SSH и MCP, с контролем того, кто что видит и меняет.
Это библиотека для импорта или сервер, который я запускаю?Это сервер, который вы запускаете: он раздаёт папку с Markdown по SSH на порту 2222 и по MCP/веб на порту 8080, а не является SDK, векторным хранилищем или конвейером загрузки данных.
Как запустить OpenLore и подключить к нему агента?Установите через Homebrew на macOS/Linux, скачиваемый релиз Linux/Windows, go install или соберите из исходников, затем запустите, указав папку с документами, и подключите агента по SSH или MCP; встроенный скилл установки может и вовсе доверить всю настройку агенту.
Нужна ли база данных или SDK, чтобы им пользоваться?Нет — знания остаются обычными Markdown-файлами, без векторной базы, конвейера загрузки или SDK; для сборки из исходников нужен только Go 1.26+, иначе готовые бинарники работают сами по себе.
Может ли подключённый к OpenLore агент выполнять произвольные команды shell вроде bash или curl?Нет — shell, открываемый агентам, это чистый интерпретатор Go в памяти, а не настоящий shell ОС, так что в обычной сессии нет выхода в системный shell, произвольного запуска процессов или фонового доступа к сети.
Это для одного разработчика или для команд с несколькими агентами?Он создан для сценариев с несколькими агентами или людьми; одиночному агенту в одном репозитории достаточно держать Markdown в git, а OpenLore нужен, когда несколько агентов, репозиториев или людей пользуются одними и теми же управляемыми знаниями.
Как OpenLore контролирует, кто какие документы читает или пишет?Доступ привязан к личности: каждому человеку или агенту выдаются ролевые права read-only, publish или read-write на каждый набор документов, плюс псевдонимы путей и приватные домашние каталоги, и всё это проводится через RBAC.
Безопасно ли позволять агентам писать обратно в базу знаний?В развёртываниях с записью каждое изменение идёт через единый контролируемый политиками путь, где записи — атомарная замена целых файлов, защищённая от устаревших правок через compare-and-swap и опционально проверяемая плагинами перед фиксацией; по умолчанию OpenLore работает только на чтение.
Что такое OKF и как OpenLore его использует?OKF (Open Knowledge Format) — открытый стандарт Google для упаковки наборов знаний; OpenLore может валидировать наборы документов и Agent Skills на соответствие конвенциям OKF рядом с путём записи.
Какими транспортами может подключаться агент или человек?Одна и та же виртуальная файловая система доступна по SSH, SFTP/SSHFS (с прямым редактированием в VS Code), MCP и веб-просмотром, так что можно выбрать любой подходящий клиенту интерфейс.
Можно упаковать документы в единый самодостаточный бинарник?Да — положите Markdown в assets/lore/ и соберите; полученный бинарник вмещает документы и раздаёт их read-only по /docs без внешней папки.
Creator
aakarim
Size
5 MB
Stars
1.5K
Age
3mo
Commits · 90 Days