Claude codes.
DevLog remembers.

Every Claude Code session ends and forgets: which approach you rejected and why, which bug was fixed and how, where the work stopped. DevLog captures it from three short lines at the end of each response, hands it back to Claude before it repeats a mistake, and stops it at the moments that matter — no release with open work behind it, no dependency installed unchecked. On a local dashboard, without you writing a line of it.

Claude Code — end of response
… Finished building the login screen and wiring it to the API. -(built) login screen with field validation -(todo) add a "forgot password" flow -(bug fix) #12 — token check ran before the cookie was parsed
Three lines at the end of a response — DevLog captures them silently and your dashboard updates live
The problem

Anyone who works with Claude daily knows it

🌫️

"What did I do last week?"

The session ends and the context evaporates with it. You open the project days later and neither you nor Claude remembers where you stopped.

📝

Tasks live in the chat — and die with it

"We'll get back to it later" gets said in one session and forgotten in the next. Nothing holds anyone accountable.

🚢

A release ships with open work behind it

A discovered bug left unfixed, a plan step never finished — and the release went out because nothing stood in its way.

🔁

"It proposed the fix we rejected last month"

Claude wasn't in the conversation that settled the decision; it only reads the code — and the reason isn't in the code.

How it works

Three steps — all of them automatic

No commands to memorize, no files to write, and your history never enters your repo. You work with Claude exactly as you always do.

Claude ends its response with short tags

The protocol reaches Claude automatically at the start of every session, so it closes its work with lines like -(built), -(todo) and -(bug fix) #7.

The hook captures them silently

At the end of every response, DevLog reads the tags and posts them to the local server. Zero noise in your conversation context; your history lives in DevLog's own data directory, not in your repo.

The dashboard updates live

Open 127.0.0.1:7777 and watch all your projects: activity, plans, releases, vulnerabilities — moving in real time over WebSocket.

The real difference

Not a logger that writes and stays quiet — an accountability system that refuses

Ordinary trackers record and watch. DevLog enforces discipline on Claude itself — 19 guards that refuse instead of warn; here are three of them.

Closure Discipline
Claude: -(built) login system ✓

✗ this work matches open item #14
✗ response rejected — close it with -(done) #14
Release Guard
$ gh release create v2.0.0

✗ command intercepted before execution:
open bug #9 + two unfinished plan steps
+ the project's tests haven't passed on this code
✓ close the items first — or bypass deliberately, yourself
Install Gate
$ bun add zod

✗ intercepted — blind install, no pinned version
advisor: zod@3.23.8 — newest mature stable, OSV-clean
✓ re-run with the pinned version and it passes

Claude finished work that matches an open task and didn't close it? The response is rejected until it does. Someone tries to ship a release with items still open or tests that haven't passed? The command is intercepted before it runs. Claude tries to install a dependency blind? The command is blocked with the safe version to pin — the newest stable at least 7 days old and clean in OSV. Nothing slips through — not because someone was paying attention, but because the system doesn't allow it.

Features

Everything you need — in one process on your machine

A live dashboard for all your projects

Every project Claude touches appears automatically: what was built, opened, closed — updating in real time, no refresh.

Trackable plans driven from chat

Plans with phases and checkboxes that persist across sessions: Claude says "step done" and the ☑ flips on your dashboard.

Real vulnerability scanning (CVE)

Built-in scanning against the OSV.dev database — no API key, no external service — including transitive dependencies.

Outdated-dependency checks across 5 registries

npm, crates.io, PyPI, Go and Packagist — compares your versions against the latest official release and flags anything newer than 7 days.

One-command releases — and only green ones

-(release) is enough: DevLog runs your project's own checks (typecheck, lint, tests) in the background and records the release once they pass. Then it writes the release report, bumps the version in your manifest, and runs the post-release steps you declared (mirror to the public checkout, then build). Any failure reaches you on the next response, and a release that went out wrong can be rolled back.

Session memory for Claude itself

Each session starts with a compact injected context: what was done before and what's still open — so Claude never reinvents what it built yesterday.

File-change tracking with diffs

Every edit Claude makes is recorded with its full diff — per file, per session, reviewable from the dashboard.

Ready-made documents from chat

Reports, analyses and plans written as Markdown and served as styled HTML — without Claude hand-writing a web page.

Client-language feature inventory — and a shareable report

Every user-visible capability is recorded as one plain-language line, and a polished client report is generated from the inventory whenever you need it.

Recall from the log instead of rediscovering

Claude asks "have we solved this before?" and gets stored decisions and fixes back in the same turn — and a new bug resembling a closed one automatically surfaces its old fix.

Retrospectives and deep studies

"What keeps breaking?" — a retrospective of every bug and vulnerability ever, with ages and files, plus a full-history study saved as a document that measures progress since the last one. Every fix is closed with its cause and a failure class from a fixed list (condition, timing, silent failure…), so you see which kind keeps recurring — and a bug that comes back is linked to the old one with ⟲.

A standards library that grows with you

Rules captured from your corrections, pulled by language or app type only when you ask — Claude never pulls them on its own, so they never get in the way of a project they don't fit. A rule written inside a project stays there; the global: prefix promotes it to all your projects — so Claude never repeats the same mistake in another project.

The file's dossier before touching it

-(ask:why) hands Claude a file's full history — its purpose, the decisions that shaped it, every bug that touched it and how it ended — before any big edit. -(ask:map) ranks files by how much depends on them.

The load-bearing wall gate

The first time Claude touches a file five or more files depend on, it's stopped once: "this is a load-bearing wall — here's what sits on it." It doesn't prevent demolition; it prevents unaware demolition.

"What happened last?"

-(ask:recent) summarizes past sessions by time: their tags, files, commands and which failed. And your literal request is stored with every batch — so "why was this asked for?" is answered in your words.

The session's story — turning points only

After a batch that closes items, one nudge asks for the turning points: an approach that failed, a change of direction, a deliberate deferral — stamped by an evidence check: a claim with no trace in the session is marked unsupported.

"Why this library?"

A page for every dependency in your project: why it's there, its official description, its security status. Overriding a warning is recorded as an open security item — it doesn't vanish.

Model comparison from your record

Which model opens more bugs, whose fixes hold, who ships without tests — numbers from your real work; every tag carries the name of the model that wrote it.

The tool measures itself

Before/after effect of every rule, a hit counter per guard (a silent guard vs a dead one), and a "backed / no trace" stamp on every "I did X" claim — with no built-in AI.

Nothing gets deleted

Old data is archived compressed, undo keeps a copy first — and if the copy can't be written the deletion is refused. Export any project as one file and import it on another machine.

Your project is recognized wherever you move it

Move or rename a project folder and its history follows. A copy of the folder, or two folders with the same name, become separate projects whose records never mix — via a random id in .devlog/project.json that stays out of git.

Privacy

Not an added feature — it's the design itself

100% local

All your data stays on your machine. The server listens on 127.0.0.1 only — nothing leaves for the internet.

Zero runtime dependencies

Bun and Node built-ins only. No supply chain to worry about, no unknown package to audit.

No telemetry, no accounts

No sign-up, no tracking, no cloud. The only outbound calls are dependency lookups — package names and versions to the official registries and OSV.dev, plus an update check to GitHub Releases. Metadata only, never your code or history; each one has its own off switch.

Production-grade security

Built-in defenses against DNS rebinding, XSS and path traversal; API keys, passwords and tokens are scrubbed from the command log before it's stored — covered by 2,500+ automated tests.

Install

Two commands inside Claude Code — and you're done

/plugin marketplace add fmaaakcode/devlog
/plugin install devlog@devlog

That's everything: the hooks, the protocol and the server all ship inside the plugin, and the server starts on its own with your first session. Open http://127.0.0.1:7777 and watch your dashboard. The only requirement: Bun on your machine.

FAQ

Before you ask

Does it add files to my repos or pollute them?

Almost none. Tags are captured straight from Claude's responses and the history is stored in DevLog's own directory (~/.devlog/data) outside your projects. What DevLog does write into a project is one .devlog/ folder: a tiny identity file (project.json, kept out of git automatically), plus generated docs, release pages and the DEVLOG_STATUS.md mirror when those features are used. Add it to .gitignore or commit it; nothing else in your tree is touched.

Does it eat Claude's context or slow it down?

The session-start injection is compact and conditional (it only appears when needed), and tag capture adds a fraction of a second at the end of a response — a small price for real enforcement.

Does it need an internet connection?

Not for its core work — capture, dashboard, guards and recall all run offline. Three things go online, all opt-out: the dependency freshness/vulnerability check (official registries + OSV.dev, package names and versions only), the library advisor behind -(ask:lib) and the install gate, and an hourly update check against GitHub Releases. Kill switches: DEVLOG_REGISTRY_CHECK_DISABLED=1, DEVLOG_VULN_CHECK_DISABLED=1, DEVLOG_VERSION_CHECK_DISABLED=1.

What if I need an emergency release while items are still open?

The release guard can be bypassed consciously with an environment variable (DEVLOG_RELEASE_GUARD=0) — the decision stays yours, but nothing ever slips through by accident.