Cross-session memory for Claude Code — a structured development journal that doesn't hallucinate, doesn't spam, and doesn't rewrite your notes.
Claude Code loses context between sessions. You come back to a project after a week and Claude doesn't know what was decided, what's blocked, or what's next. You end up re-explaining the same things every time.
dev-tracker fixes that with four files, each with a clear owner:
| File | Purpose | Who writes it |
|---|---|---|
TODO.md |
Raw notes, rough ideas | You — Claude never rewrites it automatically |
DEVLOG.md |
Timestamped session log with Done / Decisions / Blockers / Next | Claude |
DECISIONS.md |
Architecture decisions in ADR-lite format (D-001, D-002…) |
Claude |
CLAUDE.md |
Durable conventions that Claude Code auto-loads every session | Claude (with strict size discipline) |
There are a few out there. This one is different because it:
- Refuses to hallucinate git output. No invented commits, no fake file-change counts. If git isn't available, it says so and uses conversation context only.
- Has explicit anti-fragmentation. One DEVLOG entry per session, with session boundaries defined by hard triggers — not by "how long was the pause".
- Has explicit anti-overlogging for decisions. Under-logging is recoverable via
/dev-tracker audit. Over-logging silently pollutesDECISIONS.mdand degrades it forever. So the default is: when in doubt, don't write to DECISIONS. - Treats
TODO.mdas user-owned. Never rewrites, translates, or clears it automatically. - Treats
CLAUDE.mdas context tax. Has a size warning because every byte there is paid on every future session. - Handles corrections properly. Wrong past entries get appended corrections, not silent rewrites. The audit trail stays intact.
- Speaks your language. Tracker prose follows your working language; keys like
D-001,Status: activestay in English.
Four rounds of iteration went into this (v1 → v2 → v3 → v3.1 → v3.2), each driven by real use on production projects. See CHANGELOG for the full story including the v2 release bug that got fixed in v3.
In Claude Code:
/plugin marketplace add printagram/skill-dev-tracker
/plugin install dev-tracker@printagram-skills
# User-level (available in all projects)
git clone https://github.com/printagram/skill-dev-tracker.git
mkdir -p ~/.claude/skills
cp -r skill-dev-tracker/plugins/dev-tracker ~/.claude/skills/
# Or project-local (scoped to one project)
cp -r skill-dev-tracker/plugins/dev-tracker .claude/skills/Restart Claude Code after either option.
You: session start
You: session start db_assistant # with a project alias
You: save progress
You: session end
You: what did we do last time?
/dev-tracker Write/update current session entry
/dev-tracker status Show last entry, blockers, next steps
/dev-tracker context Full context restore after a break (read-only)
/dev-tracker init Create DEVLOG.md, DECISIONS.md, TODO.md
/dev-tracker decisions Show active decisions grouped by status
/dev-tracker diff Summarize changes since last entry
/dev-tracker audit Find undocumented decisions
Create a .dev-tracker-projects.json in a parent directory listing your projects. See project-registry.example.json. Then:
You: session start WebUI
You: session start API
Each alias gets its own DEVLOG / DECISIONS / TODO. Supports monorepos (one repo, multiple tracked sub-projects) and non-git directories.
A session-end entry looks like this:
## 2026-03-18 14:40 CET — Access ODBC field name mismatch
### Done
- discovered sync failures were caused by code using `id_Order`
while Access exposes the field as `idx_Order`
- replaced all 14 occurrences across sync_access_to_supabase.py,
sync_schema.py, mod_sync.bas
- re-ran sync, 523/523 orders synced clean
- updated CLAUDE.md with the correct field name
### Decisions
- canonical field name in all sync code is `idx_Order` (see D-003)
### Next
1. write remediation script for the `201\` corrupted folders
2. document the sync lifecycle in CLAUDE.mdSee plugins/dev-tracker/examples/ for full examples of all four files.
| Tool | Scope | What it does well | Where dev-tracker fits |
|---|---|---|---|
Claude's built-in CLAUDE.md |
Auto-loaded conventions | Fast context | Too broad — mixes decisions, conventions, and narrative. dev-tracker splits these. |
| Generic "memory" plugins | Arbitrary state | Flexible | No discipline on what to record; drifts into noise. |
| Git commit messages | History of changes | Precise, timestamped | Describes what changed, not why or what's next. |
| Issue trackers | Work to be done | Team coordination | Too heavy for a solo developer's cross-session notes. |
dev-tracker fills the gap between "Claude remembers nothing between sessions" and "full-blown project management". It's a journal, not a tracker, not a wiki, not a commit history.
save progressis now a hard action — writes immediately, no "should I save?"/dev-tracker contextfor returning to a project after a break (read-only)- Anti-fragmentation formalized (one entry per session, explicit boundary rules)
- Anti-overlogging rule for DECISIONS
- Session title guidance with anti-patterns
- Recurring blockers detection
Full history in CHANGELOG.
Bug reports, feature requests, and PRs are welcome. See CONTRIBUTING.md for guidelines.
The skill is iterated with evals — see plugins/dev-tracker/evals/. If you add behavior, add a matching eval prompt.
MIT — see LICENSE. Use it, fork it, adapt it. If you improve it, consider upstreaming.
The ADR-lite decision format is adapted from Michael Nygard's original ADR pattern. Progressive-disclosure skill structure follows Anthropic's Agent Skills spec.
Built and iterated on real production work at Printagram — a printing, embroidery, and advertising company in Malta migrating from Microsoft Access to a modern cloud stack. If the rules feel opinionated, it's because they come from breakage.