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…

What is this?OpenLore is a self-hosted, agent-native knowledge server: point it at a folder of Markdown and every agent on the team (Claude Code, Codex, Cursor, CI jobs) reads the same files over SSH and MCP, with control over who can see and change what.
Is this a library I import, or a server I run?It is a server you run: it serves a Markdown folder over SSH on port 2222 and over MCP/web on port 8080, rather than being an SDK, vector store, or ingestion pipeline.
How do I get OpenLore running and connect an agent to it?Install via Homebrew on macOS/Linux, a downloadable Linux/Windows release, go install, or build from source, then run it pointed at a docs folder and connect an agent over SSH or MCP; a bundled setup skill can also let an agent do the whole configuration.
Do I need a database or SDK to use it?No - knowledge stays as ordinary Markdown files with no vector database, ingestion pipeline, or SDK required; building from source only needs Go 1.26+, otherwise prebuilt binaries work standalone.
Can an agent connected to OpenLore run arbitrary shell commands like bash or curl?No - the shell exposed to agents is a pure in-memory Go interpreter, not a real OS shell, so there is no shell escape, arbitrary process execution, or ambient network access in a normal session.
Is this for a single developer or for teams running multiple agents?It's built for multi-agent or multi-person setups; a single agent working in a single repository can just keep Markdown in git, but OpenLore is for when several agents, repos, or people need the same governed knowledge.
How does OpenLore control who can read or write which docs?Access is identity-scoped: each person or agent is granted role-based read-only, publish, or read-write permissions per docset, plus path aliases and private home directories, all enforced through RBAC.
Is it safe to let agents write back into the knowledge base?Writable deployments route every change through a single policy-controlled path where writes are whole-file atomic swaps, protected by compare-and-swap against stale edits, and optionally validated by plugins before committing; by default OpenLore is read-only.
What is OKF and how does OpenLore use it?OKF (Open Knowledge Format) is Google's open standard for packaging knowledge bundles; OpenLore can validate docsets and Agent Skills against OKF conventions close to the write path.
Which transports can an agent or human use to connect?The same virtual filesystem is exposed over SSH, SFTP/SSHFS (with direct VS Code editing), MCP, and a web view, so you can pick whichever interface fits the client.
Can I ship docs as a single self-contained binary?Yes - place Markdown under assets/lore/ and build; the resulting binary embeds the docs and serves them read-only at /docs with no external folder needed.
Creator
aakarim
Size
4.8 MB
Stars
1.3K
Age
3mo
Commits · 90 Days