ollie is a 9p-based generative agent surface
Go to file
Levi Neely 92ba860644 doc: use ctl kill instead of rm -r for session teardown
rm -r is blocked by sandbox patterns. echo kill > s/{id}/ctl
achieves the same result safely.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-14 23:15:42 +02:00
9p@b8c23dd7b6 chore: update 9p submodule 2026-04-14 22:56:46 +02:00
agents cleanup agents 2026-04-14 19:38:03 +02:00
core@655b9e7060 fix: error handling, sandbox env, file tool enforcement 2026-04-14 22:52:10 +02:00
doc doc: add env.sample; update help.md (OLLIE, m/, idx files, backend vars) 2026-04-14 21:57:39 +02:00
el@fa13794468 chore: update el submodule 2026-04-14 23:03:52 +02:00
prompts doc: use ctl kill instead of rm -r for session teardown 2026-04-14 23:15:42 +02:00
sandbox rename OLLIE_9MOUNT → OLLIE throughout; update submodules 2026-04-14 17:39:48 +02:00
skills@9e7f499088 chore: update skills submodule 2026-04-14 23:11:22 +02:00
tools fix: error handling, sandbox env, file tool enforcement 2026-04-14 22:52:10 +02:00
toys rename workdir to cwd in docs, toys, and submodule refs 2026-04-13 15:51:58 +02:00
tui@9a113a0c42 chore: update tui submodule; remove stale backup and test files 2026-04-14 22:53:44 +02:00
.gitmodules submodules: add agent-skills 2026-04-11 16:13:47 +02:00
README.md README: expand Observed Benefits section 2026-04-14 20:54:20 +02:00
mkfile prompts: split session/filesystem into 01_ollie.md; shift 01-04 → 02-05; clean prompts dir on install 2026-04-14 19:57:56 +02:00

README.md

ollie

What happens if agent primitives are exposed as an ordinary filesystem? How much can be subtracted from AI agent implementations without reducing their usefulness? These are some of the motivating questions behind ollie.

  • The core system provides a public library of AI agent primitives.
  • The 9p filesystem server (Go) creates a virtual filesystem exposing the important state and behaviors as ordinary files and operations.
  • A reference TUI implementation proves that it is possible to build a functioning and user-friendly terminal front-end using only the Go standard library.
  • And, just because I like my Emacs friends, a reference Emacs interface front-end implementation.

Project Structure

  • core/:
  • tui/:
  • 9p/:
  • el/:

Getting Started

Clone with submodules:

git clone --recurse-submodules https://github.com/lneely/ollie.git

Or after cloning:

git submodule update --init --recursive

Building

Build everything from the monorepo root:

mk

Or build specific components:

mk core    # Build core library
mk tui     # Build terminal UI
mk 9p      # Build 9p filesystem server

For Emacs Lisp, copy el/ollie.el into your own Emacs configuration directory, and:

(require 'ollie)

Configuration

Environment: ~/.config/ollie/env

OLLIE_BACKEND=openai           # ollama | openai | openrouter | anthropic | copilot | kiro (default: ollama)
OLLIE_OLLAMA_URL=              # base URL for Ollama (default: http://localhost:11434)
OLLIE_OPENAI_URL=https://openrouter.ai/api
OLLIE_OPENAI_KEY=sk-or-...
OLLIE_ANTHROPIC_KEY=sk-ant-...
OLLIE_COPILOT_TOKEN=...
OLLIE_KIRO_TOKEN=...           # bearer token or sqlite:// path (auto-detected from Kiro CLI if unset)
OLLIE_MODEL=qwen/qwen3-235b-a22b
OLLIE_TOOLS_PATH=~/.config/ollie/tools    # directory for execute_tool scripts
OLLIE_MEMORY_PATH=~/.config/ollie/memory  # directory for memory files (ollie/m)

Shell environment variables take precedence over the env file.

Development

Update all submodules to latest:

git submodule update --remote

Observed Benefits

Filesystem as interface — if you know how to operate a filesystem, you know how to operate ollie. Any tool that reads and writes files — ed, vim, Python, cat, a shell script — is already a fully capable ollie client. No SDK, no API, no protocol to learn.

Simple front-ends — building a front-end is just reading and writing files. A TUI reads chat, writes prompt, polls state. The protocol surface is zero because the protocol is the filesystem.

Crash resiliency — Memory (m/) and plans (pl/) are written to persistent storage outside the session. If a session crashes or is killed mid-task, neither is lost — a fresh session picks up where the previous one left off.

Code execution tool — Anthropic describes code execution as "a foundational primitive for building high-performance agents." ollie takes that literally: execute_code is the base layer, and execute_tool and execute_pipe build directly on top of it. New capabilities are added by dropping a script into t/ and a skill in sk/ — the tools provide the capability, and the skill tells the agent when and how to use them.

Radical transparency — The rendered system prompt for any session is a plain file: cat s/{id}/systemprompt — the prompt the agent is actually running with, not a reconstruction. The prompt parts that compose it are readable in p/; the agent can read its own instructions but cannot modify them. The filesystem is the abstraction layer — you need only know how to read and write files.

Discoverability — The filesystem is self-documenting. ls s/{id}/ shows every control surface. cat t/idx and cat sk/idx show available tools and skills. When you forget the interface, cat help tells you.

Composability — Agents can be composed by piping reply into another session's prompt. Tools can be composed via execute_pipe, chaining execute_code and execute_tool steps the same way Unix pipes chain programs. Both work because the interface is files.

Credits

Many sources of inspiration:

  • Plan 9 from Bell Labs — for an interesting system
  • @9fans — for the Plan 9 port
  • Suckless — for articulating good software development principles
  • @simonfxr — for a solid agent baseline to "borrow" from, and other nifty ideas
  • @aws — for a solid open-source agent implementation

License

GPLv3