Claude Code, Codex, Cursor and Gemini CLI write the code — Ocul-PM keeps the record. Each finished task lands as a markdown journal entry in your repo with its diff attached, and turns into standups, PR bodies and retros. No server, no account, no telemetry.
I built this because I stopped being able to read my own codebase.
Most of my code gets written by agents now. That part works fine. The problem shows up
about two weeks later, when I open a file and have no idea why it looks the way it does.
I didn't write it. git blame says "refactor auth" and that's the whole story.
Everything else — what was broken, what we tried first, why we went this way — was in a
chat window. Chat windows close.
I tried keeping notes myself. Lasted about a week. Turns out people skip documentation
not because they're lazy but because it costs something at exactly the moment they're
done and want to move on.
So I stopped asking myself to do it. Ocul-PM drops one rules file (AGENTS.md) into the
project, and the agent writes the entry when it finishes a task. Markdown, in your repo,
under .oculpm/journal/. The app reads those files and gives you a timeline, a morning
brief, the diff attached to each entry, and retros. Standups and PR bodies come out of
the same data.
The thing I care about most is boring: the source of truth is plain markdown sitting in
your repository. It commits with your code. It's readable without the app. If I get hit
by a bus and this project dies, your record is still there. SQLite is just a cache and
can be rebuilt from the files.
Two things I didn't expect to build, but had to:
The diff. I assumed recording was enough. It wasn't — trusting an entry that says "fixed
it" turned out to be the riskiest part. So every entry carries the diff from that moment,
sitting right next to it. It also flags files an agent touched but never wrote up.
Running claude inside the app (via Agent Client Protocol). The reason isn't convenience,
it's that the permission card can show you the actual command and the actual diff before
you approve. I'd been clicking Allow on titles for months.
There's more in there — code map, three search modes, an editor with LSP and a debugger,
a terminal — but that's the part I'd defend.
On privacy: no server, no account, no telemetry. The only outbound traffic is LLM API
calls you make yourself and an update check. Keys live in the OS keychain. Secrets that
slip into a journal get redacted before it's written.
What's not true yet: macOS on Apple Silicon only. Not notarized, so the first launch may
need `xattr -dr com.apple.quarantine /Applications/Ocul-PM.app`. No team sync. It's me,
so things happen in order.
Tauri 2 rather than Electron, which is why the dmg is under 60MB. Rust backend, React 19
front end. MIT, free, and I intend to keep it that way.
Last thing: this app's own repo is tracked by the app. Open .oculpm/journal/ and you'll
find the entries the agents left while building it.
If you run several agents a day, I'd like to know what you lose track of first. That's
usually what I end up building.