One folder of Markdown that every agent on a team can read, with access rules.
- Needs your setup first
- ★ 1.7K GitHub stars
- Last commit 26 Oct 2026
What is OpenLore?
OpenLore is an open source server that shares a folder of Markdown with AI agents over MCP, SSH and the web, so several agents and people can read the same files with their own access rules.
OpenLore, by the GitHub user aakarim, serves a folder of Markdown files to agents so they all work from the same notes, runbooks and docs. Instead of a new search API, it gives them a small shell that understands the commands models already know, such as ls, cat, grep, find and jq, over a virtual file system. The same files are available over MCP, over SSH and in a web view.
The shell is written in Go and cannot run programs or reach your real disk. It is read-only by default; you can allow publishing into set folders or full writes per docset, and give each person or agent its own view. It runs as a server, so a team can host one copy and point every agent at it.
- Made by
- aakarim and contributors
- Licence
- Apache-2.0
- GitHub stars
- 1.7K
- Last commit
- 26 Oct 2026
- Tools
- 2
- Runs on
- Hosted
- Setup checked
- 27 Oct 2026
- Page updated
- 27 Oct 2026
Our check: It needs something our Linux test machine does not have (an account, a desktop app, a Mac or a running service), so on 27 Oct 2026 we read its tools from the source code instead of running this config. The shared database gave "npx openlore", an npm package by someone else for a different tool. OpenLore is a Go program installed from Homebrew or its GitHub releases.
MCP Shelf take
OpenLore needs something our Linux test machine does not have (an account, an app or a service), so on 27 Oct 2026 we read its source and counted 2 tools. 1 of the 2 only read; the other 1 can change things. Other directories point at a package with the same name that belongs to someone else; the config on this page installs the real one. It sits 14th of 16 in its category on our shelf by GitHub stars (1.7K).
What can OpenLore read and change?
It can read
- The files in the folders you serve, filtered by each identity's grants
It can change
- Served files, only where a docset allows publishing or writing
- Nothing on the machine outside the served folders
Safer setup: Keep it read-only, which is the default, or allow only publishing into an inbox folder so agents cannot overwrite existing documents.
What's in the pod
What tools does OpenLore have?
We found 2 tools in its source code on 27 Oct 2026. 1 only read. The rest can change things, so keep your app's "ask before each tool call" setting on for them.
How we tested it: Tool list read from the Go source at commit 8f6292a. It runs as an HTTP server you start yourself.
Changes things1 tool · Can create, edit, send or delete.
| Tool | What it is for |
|---|---|
lore_bash | Runs a command in OpenLore's restricted shell over the served files: ls, cat, grep, find, jq, sed and more, with pipes. Writes work only where the server allows them. |
Only reads1 tool · Looks things up and changes nothing.
| Tool | What it is for |
|---|---|
list_commands | Lists the commands the shell supports. |
Grouped and described by us. The README on GitHub lists the inputs each tool takes.
How do I install OpenLore?
Install steps from the OpenLore README
The project's own instructions, copied from its README on GitHub on 27 Oct 2026 under its Apache-2.0 licence. They are the source of truth; the ready-made configs further down are built from them. The rest of the README is in the README tab.
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 the Quickstart for Linux and Windows.
What you need first
- The openlore program, from Homebrew or the GitHub releases
- A folder of Markdown to serve
Steps
- Install it with "brew install --cask aakarim/tap/lore", or download a release for Linux or Windows from GitHub.
- Run "openlore ./docs" to serve a folder. MCP and the web view use port 8080, and SSH uses port 2222.
- Add the config below to your client. For Claude Code, run "claude mcp add --transport http openlore http://localhost:8080/mcp".
Add OpenLore to your app
Pick your app for a ready-to-paste snippet and where it goes, built from the steps above.
Where it goes: Your terminal, in the project folder
claude mcp add --transport http openlore http://localhost:8080/mcpThen tell your agents when to use it: ssh -p 2222 localhost agents >> AGENTS.md. Agents with a shell can also reach the same files over SSH without MCP.
Where it goes: ~/.cursor/mcp.json, or .cursor/mcp.json in a project
{
"mcpServers": {
"openlore": {
"url": "http://localhost:8080/mcp"
}
}
}Where it goes: Settings → Connectors → Add custom connector
http://localhost:8080/mcpPaste the URL and sign in if asked. Custom connectors depend on your plan.
Where it goes: .vscode/mcp.json in your project
{
"servers": {
"openlore": {
"type": "http",
"url": "http://localhost:8080/mcp"
}
}
}Where it goes: ~/.codeium/windsurf/mcp_config.json
{
"mcpServers": {
"openlore": {
"serverUrl": "http://localhost:8080/mcp"
}
}
}Where it goes: Not supported for a local copy
A server on localhost is not reachable from ChatGPT. A team deployment, for example with the project's Render button, serves MCP over HTTPS with OAuth sign-in.
Claude Code may mistake a command like grep -r / for a scan of your own disk, so allow mcp__openlore in its permissions and tell it in CLAUDE.md that / is the docs root. Running "ssh -p 2222 localhost agents" prints a ready-made note to add.
Checked against the project's own install docs on 27 Oct 2026: aakarim/OpenLore README.
New to this? See the setup guides for Claude Code, Cursor, Claude Desktop and ChatGPT.
OpenLore not working? Common fixes
- Claude Code blocks or keeps asking about grep -r /
- It thinks the command is for your own disk. Allow mcp__openlore in .claude/settings.json and tell it in CLAUDE.md that / is the OpenLore docs root.
- The dashboard returns 404
- Builds made with go install or a plain go build have no dashboard. Use Homebrew, a release download or make distribution.
- Agents do not know when to use it
- Run ssh -p 2222 localhost agents and add its output to AGENTS.md or CLAUDE.md.
How do I configure OpenLore?
Names are exactly as the project spells them. Required ones are marked.
| Setting | What it does |
|---|---|
openlore <folder>Command line flag · required | Serves that folder. Its contents appear at / to every agent that connects.openlore ./docs |
openlore.ymlConfig | Server settings such as the SSH port, the MCP path and whether it needs sign-in, which file types are served and inbox limits. An example ships in the repository. |
lore.jsonConfig | Roles and docsets: which folders make up each docset and who may read, publish or write it. |
OpenLore FAQ
How do I add OpenLore to Claude Code?
Install it with brew install --cask aakarim/tap/lore, serve a folder with openlore ./docs, then run claude mcp add --transport http openlore http://localhost:8080/mcp.
What is OpenLore for?
Sharing one set of Markdown files with several agents, repositories or people, each with its own access. Agents read it through MCP, SSH or the web view using grep, find and jq.
Does OpenLore use a vector database?
No. Agents find things with grep, find and jq over plain Markdown, so there is no embedding step and the files stay readable by people.
Is OpenLore free?
Yes. It is Apache 2.0 licensed. Running it locally costs nothing; a team deployment costs whatever your hosting provider charges.
Is OpenLore safe?
It is read-only by default. You can allow agents to publish only into an inbox folder so they cannot overwrite existing documents, and a team server signs people in with passkeys or OAuth.
Can OpenLore run on a server for a team?
Yes. The repository includes deployment guides, including a one-click Render deploy, and gives each person or agent its own sign-in and write provenance.
Why not just keep Markdown in my repository instead of OpenLore?
For one agent in one repository, that is simpler. OpenLore helps when several agents, repositories or people need the same files with different access.
Why does Claude Code keep asking about grep commands with OpenLore?
OpenLore's lore_bash tool runs commands such as grep -r / inside the shared folder, which Claude Code may flag. They run against OpenLore's files, not your disk, so you can allow them for that server.
OpenLore README
This is the project's own README from aakarim/OpenLore, written by aakarim and contributors, and shared under its Apache-2.0 licence. We copied it on 27 Oct 2026, so the version on GitHub may be newer.
📜 OpenLore
Give every AI agent on your team the same up-to-date knowledge.
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.
One-click hosted server. See Deploy OpenLore to Render.
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 the Quickstart for Linux and Windows.
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
- What is OpenLore
- Claude Code
- Codex
- Cursor
- OpenCode
- Meta Muse
- OpenAI dots
- Grok Bot
- Claude Duet
- LangChain
- Any agent over SSH
- Let an agent publish into an inbox
- Deploy to Render
- Prune a knowledge repository from its analytics
- Build an LLM wiki on OpenLore
- Share a coding style guide with every agent
- All documentation
Features
- Agent-native retrieval — Agents use the shell tools and composition patterns they already understand instead of learning a bespoke retrieval API.
- One knowledge surface, multiple transports — Serve the same virtual filesystem over SSH, SFTP/SSHFS (including direct VS Code browsing and editing), MCP, and a human-friendly web view.
- Live, governed knowledge — Keep content read-only, allow scoped publishing, or enable full writes per docset. Writes are atomic, conflict-aware and validated before they commit.
- Identity-scoped views — Give each person or agent only the docsets it
needs, with role-based
ro,publish, andrwgrants, path aliases, and private home directories. - Safe by construction — The shell is an in-memory Go interpreter, not a real operating-system shell. There is no shell escape, arbitrary process execution, or ambient network access in a normal session.
- Portable knowledge bundles — Embed docs into a self-contained binary, build cross-platform bundles with the GitHub Action, or package them as a desktop MCP extension.
- Structured knowledge without a new query language — Inspect frontmatter
as NDJSON with
lore meta, query it withjq, and validate Google's Open Knowledge Format (OKF) bundles and Agent Skills close to the write path. - Extensible policy and processing — Plugins can add validation, grants, read/write middleware, metadata, and post-commit processing while preserving the same filesystem interface.
Use Cases
- Continuous Learning repository - store sessions and learnings in one shared server. Add metrics so you can optimise. Allow agents to share learnings with each other while maintaining user isolation.
- Team Artifact Repository - share markdown, HTML, JSON, Excel etc. documents you've created while maintaining access controls. Much more natural than git, more agent-native than Confluence/Notion.
- Documentation for coding agents — Put internal API docs, runbooks, product context, and architecture notes behind a familiar, greppable interface.
- A shared live memory for teams of agents — Give agents separate or shared docsets so they can publish findings, hand off work, and accumulate durable context across sessions.
- Public docs site - add any files to your public docset, enable public access and it will be shown to any agent that stumbles across your site. Improves AEO/GEO with no need to edit your existing docs.
- Skills sharing — Publish Agent Skills into shared collections so every authorised agent can discover and use the same governed procedures.
- Agent Plugins repository — Version-pin Agent Plugins repos from GitHub and serve them to your team's agents. Skills packaged in the open standard stay current automatically.
- Governed knowledge contribution — Let contributors publish into inboxes while reserving existing documents for maintainers and preventing accidental overwrites.
- Artifact repository — Store and expose reports, logs, screenshots, and generated files through the browser or SSH without building a custom artifact viewer or granting access to the agent's machine.
- Identity-specific workspaces — Mount a private home for each agent plus shared team knowledge, all through one server and one authorisation model.
- Portable customer or project knowledge — Ship a versioned executable with the relevant docs embedded, or distribute the same knowledge as an MCPB desktop extension.
- Validated knowledge catalogues — Enforce frontmatter and bundle conventions, inspect metadata cheaply, and stop malformed knowledge at admission time.
How It Works
OpenLore is built on Wish for SSH transport. A connection is handled entirely against a virtual filesystem:
- Authenticate — connect keylessly or resolve an SSH key, certificate, passkey, or OAuth login to an identity.
- Compose a view — mount only the docsets and paths granted to that identity.
- Explore — run shell commands implemented as pure Go functions over that
view, or use the equivalent MCP
lore_bashtool. - 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/claude@claude.ai. 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
See the Quickstart for Homebrew, Linux and Windows releases, and which installations include the dashboard. To build OpenLore yourself, see Building from source.
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:
make dashboard-build # optional: include the web UI
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:
onboardingadds initial identities, roles, homes, and folders locally;deployselects Fly.io, Railway, AWS, Google Cloud, Azure, DigitalOcean, or a custom deployment and verifies a shared persistence/networking contract;upgradeprepares only the pinned base-image version change so existing CD can deploy it.
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.
For a quick hosted server without a customised repository, use the
Deploy to Render button. Unlike the Railpack and Fly files,
its start script writes a starter openlore.yml and lore.json to an empty
disk on first boot. Render serves HTTPS, MCP and the web view only; it has no
public TCP ingress for OpenLore SSH.
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
The same pages, in the same groups, are published at openlore.sh/docs.
Introduction
| Page | Contents |
|---|---|
| What is OpenLore | Serve, connect, scope, govern and observe in one page |
| Changelog | Current version, release notes, compatibility notes, and versioned docs |
Start
| Page | Contents |
|---|---|
| Quickstart | Install OpenLore, serve a folder, and connect an agent |
| Claude Code | Connect Claude Code over MCP and scope what it sees |
| Codex | Connect Codex over MCP |
| Cursor | Connect Cursor over MCP |
| OpenCode | Connect OpenCode over MCP |
| Meta Muse | Connect Meta Muse over MCP |
| OpenAI dots | Connect OpenAI dots over MCP |
| Grok Bot | Connect Grok Bot over MCP |
| Claude Duet | Connect Claude Duet over MCP |
| LangChain | Connect a LangChain agent over MCP and give it an identity |
| Any agent over SSH | Connect a coding agent or CI job over SSH and give it an identity |
Concepts
How OpenLore works: docsets, transports, identity, writes, rules, and observation.
| Page | Contents |
|---|---|
| Docsets | What a docset is, why access is organised around them, and how nesting, grants, aliases and fail-closed validation work |
| Transports | How SSH, SFTP, MCP, the JSON API and the web share one filesystem, the MCP tools, command results, sessions, and instruction commands |
| Auth | Authentication posture, how SSH keys, certificates, passkeys, OAuth tokens and inbox credentials resolve to an identity, roles, docsets, aliases, homes, and workload identity federation |
| Writing and publishing | Write modes, inboxes, conflict handling, what a successful write does and does not check, and jobs |
| Folder rules | .lore/config.yaml and lore.json rules, layering, permissions, rejection messages, and growth limits |
| Plugins and formats | Provider interfaces, Open Knowledge Format validation, lore validate, lore meta, and the Agent Skills plugin |
| Dashboard and metrics | Dashboard authentication, facts versus activity, and the file viewer |
How to
Task walkthroughs.
| Page | Contents |
|---|---|
| Ways to use OpenLore | Set up SSH, MCP over HTTP and stdio, the web view, SSHFS, embedded binaries, the GitHub Action, MCPB, and library usage |
| Configure the server | Create openlore.yml, precedence over embedded config and flags, HTTPS, analytics, and debug logging |
| Production checklist | What a shared server needs before cloud agents can reach it: a host with HTTPS out of the box, a pinned image on a volume, a public origin, a token on /mcp, passkeys |
| Let an agent publish into an inbox | Accept contributions from an agent without letting it edit anything else |
| Browse and edit from an editor | Direct VS Code and SFTP editor setup without a local project mirror |
| Run headlong / shellm | Use OpenLore over SSH from headlong's shellm engine, including its housekeeping skill |
| Build from source | Build the web UI and binary yourself, or build without the web UI |
| Deploy OpenLore to Render | One-click Render deployment, first passkey sign-in, upgrades, and custom domains |
Reference
Lookup material: commands, keys, endpoints, interfaces, and internals.
| Page | Contents |
|---|---|
| Command reference | Complete shell, introspection, publishing, syntax, CLI command, and flag reference |
| openlore.yml reference | Generated reference for every key openlore.yml accepts |
| Rules standard library | Generated reference for compiled-in rule members and their parameters |
| HTTP inbox API | POST /inbox/{docset} with bearer or HMAC credentials, and the token endpoints |
| OAuth clients | CIMD client identity, private_key_jwt, mTLS corroboration, and signing-key rotation |
| Write system internals | Filesystem layering, write seam, admission middleware, and async jobs |
| Build the dashboard | Frontend build and backend-only Go builds |
| Security evaluation | Threat model and security properties |
Security
- Commands run in a pure-Go interpreter, not through
os/exec. - The virtual filesystem cleans paths and enforces docset boundaries.
- Allowed file patterns and ignored directories keep secrets out of the view.
- RBAC controls reads, publishing, writes, approvals, and trusted capabilities.
- The web endpoint can publish the SSH host key over TLS to avoid blind trust on first use; SSH user and host certificates are also supported.
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.
Two peas, one chat
Chat with AI about OpenLore
Opens a chat primed with OpenLore’s README and setup docs from this page, or add it in Cursor to use its tools.
The Cursor button opens Cursor and asks before it adds the server. Fill in any keys it needs in Cursor’s MCP settings.
Peas in a pod
What are the alternatives to OpenLore?
How OpenLore lines up against its neighbours on the shelf. See every knowledge and work apps server.

OpenLoreThis pea
One folder of Markdown that every agent on a team can read, with access rules.
- Tools
- 2
- Runs on
- Hosted
- Licence
- Apache-2.0
- Stars
- 1.7K

Records and transcribes meetings on your device, then lets an assistant search them.
- Tools
- 34
- Runs on
- Your computer
- Licence
- MIT
- Stars
- 1.6K

Ask an assistant about your Garmin activities, sleep, recovery and training.
- Tools
- 20
- Runs on
- Your computer
- Licence
- MIT
- Stars
- 1.4K
Notion's own server: search, read and update pages and databases.
- Tools
- 24
- Runs on
- Hosted or your computer
- Licence
- MIT
- Stars
- 4.7K

MCP Atlassian (Jira and Confluence)
Jira issues and Confluence pages, Cloud or self-hosted.
- Tools
- 98
- Runs on
- Your computer
- Licence
- MIT
- Stars
- 6K

Long-term memory as plain Markdown files you own.
- Tools
- 27
- Runs on
- Your computer
- Licence
- AGPL-3.0-or-later
- Stars
- 4.4K
Something wrong on this page? Tell us.