The smallest agent is the one that fits in your head
There is a certain kind of project that exists only because it refuses to be complicated.
Omo is 500 lines of TypeScript. No framework abstractions. No elaborate state machines. Just a readline loop, a streaming API call, and a system prompt you can read in one sitting. It was extracted from a larger project called Moltbot—stripped down to the parts that actually matter.
The architecture is embarrassingly simple: load some markdown files from a workspace/ directory and inject them into the system prompt. The agent reads what you've written about yourself and remembers it.
const session = createAgentSession(config);
const result = await session.send(prompt, (chunk) => {
process.stdout.write(chunk);
});That is the whole API. Send a message, stream the response. History is just an array that grows.
The interesting decision was the bootstrap files. Instead of a database or a config file, Omo reads plain markdown:
| File | Purpose |
|---|---|
SOUL.md |
Core persona—defines who your agent is |
USER.md |
Your preferences |
MEMORY.md |
Long-term memory |
AGENTS.md |
Agent behavior guidelines |
TOOLS.md |
Tool usage guidance |
You edit these files in your text editor, and the next conversation reflects the change. No restart required. No migration script.
Under the hood, it uses @mariozechner/pi-coding-agent for the core loop, SQLite with vector search for memory, and session transcripts stored as JSONL. But you do not need to know any of that to use it.
npm install
cp .env.example .env
npm run chatThree commands. You are talking to your agent.
This is the opposite of a product. It is a working theory about how simple an agent can be before it stops being useful.
The answer, so far: surprisingly simple.