AgentStack
MCP verified MIT Self-run

Ditto

mcp-ohad6k-ditto · by ohad6k

Mine your Claude Code and Codex logs into a local you.md agent profile.

No reviews yet
0 installs
19 views
0.0% view→install

Install

$ agentstack add mcp-ohad6k-ditto

✓ scanned · ✓ verified — works with Claude Code, Cursor, and more.

Security review

✓ Passed

No issues found. Passed automated security review. · v0.1.0 How review works →

  • Prompt-injection patterns
  • Secret / credential exfiltration
  • Dangerous shell & filesystem operations
  • Untrusted network calls
  • Known-malicious package signatures

What it can access

  • Network access Used
  • Filesystem access No
  • Shell / process execution No
  • Environment & secrets No
  • Dynamic code execution No

From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.

View the full security report →

Verified badge

Passed review? Show it. Paste this badge into your README — it links to the public security report.

AgentStack Verified badge Links to your public security report.
[![AgentStack Verified](https://agentstack.voostack.com/badges/verified.svg)](https://agentstack.voostack.com/security/report/mcp-ohad6k-ditto)

Reliability & compatibility

Security review passed
0 installs to date
no reviews yet
19d ago

Declared compatibility

Claude CodeClaude DesktopCursorWindsurf

Compatibility is declared by the source manifest. End-to-end runtime verification is coming — see below.

Preview Execution monitoring

We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps — measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.

How agent discovery & health will work →
Are you the author of Ditto? Claim this listing to set pricing, connect Stripe payouts, and keep 70% of every sale.
Sign up to claim

About

Ditto

Your AI agents act like they just met you. Ditto fixes that.

Your real coding-agent sessions already contain the rules you never wrote down: what “done” means, what you reject on sight, how you debug, how you design UI, and how you write when you are actually working.

Ditto mines selected evidence from those sessions — Claude Code, Codex, Copilot CLI, OpenCode, and Google Antigravity logs out of the box — into a private working profile your agent reads before every task. Separate layers for work, design, and writing mean the right part of you loads for the right task.

Not memory

Memory is what you explicitly told the model.

Ditto mines what your work already proved about you: what you reject, what "done" means, when you ask for proof, how you talk when you're actually working, and the agent behaviors that make you stop the task.

That's why it reads raw session logs, not your CLAUDE.md or rules file.

A real run

One line to the same agent, twice: "help me post ditto on reddit." Once cold, once with the Ditto profile loaded.

🡒 agent 🡒 agent + ditto

Here's how I'd play it.

Subreddits: r/ClaudeAI and r/ChatGPTCoding are your core audience. r/LocalLLaMA fits the local angle. r/cursor, r/SideProject, r/opensource for reach. Don't blast all at once — post to one, tune the title, repost over a few days.

Title: I built a local tool that reads your AI coding logs and writes a "you.md" your agents read before every task

full reply

Titles (pick per sub):

  • I built a local tool that reads your AI coding logs and writes a "you.md" your agents read before every task
  • ditto: mine your own Claude Code history into a profile so your agent codes like you (local, open source)

Body: > Every fresh agent session starts from zero — it doesn't know how you work, so you re-explain yourself every time. All of that is already in your session logs. So I built ditto: it reads your history, mines how you decide and talk, and writes a you.md your agents read before every task. > - runs locally, your logs never leave your machine > - redacts secrets before processing > - open source: [link]

Also: open with the pain not the product, reply fast in the first hour, add a demo gif, and flair it correctly. Want me to write tuned variants for each subreddit?

the insight first: the mining number is your whole post. "i read 1,656 of my own sessions" is a confession, not a pitch, and nobody scrolls past a confession. lead with the mirror, not the mechanism.

one sub, not five — a skills sub, where people come looking for this instead of arguing about it.

Title: I built a Claude skill from 8 months of my own Claude Code sessions

the full post it wrote

body: I use claude code and codex every day. 8 months, solo. every session gets logged and i never really looked back at them.

then it hit me that those logs are probably the most honest record of how i actually work. not my CLAUDE.md, not my docs, not the rules i remembered to write down. the real sessions.

so i built ditto.

What I did: pulled every message i typed from my local claude/codex logs. stripped tool output, pasted errors, file dumps, and assistant replies. kept only my words. came out to around 1,656 sessions and almost 3M tokens of just me.

then i split it into chunks and had agents read each slice. each one pulled patterns like how i define done, what kind of code i reject, when i ask for proof, what makes me stop a task, and how i talk when i am actually working.

then i merged the repeated traits into one you.md.

the useful part is that it installs as a claude skill. so now instead of starting every task cold, claude reads my profile first and already knows how i work.

not memory exactly. memory is what you told the model. this is more like mining what your work already proved about you.

I posted it on r/ClaudeSkills, as written:

200 upvotes · 32 comments · 102K views from an account with no followers. The cold plan was reasonable. The loaded plan knew its user's voice — and it worked.

What it finds

The kind of rules a mine pulls out, each backed by dated verbatim receipts from real sessions:

> done means it runs live. never trust "done" off a code edit. show it working first. > > fix the one thing. rewriting or "cleaning up" code that isn't the problem gets rejected every time. > > builds faster than they understand what they built — then asks the agent to explain their own system back. > > gets frustrated by repeating the same ask until it lands, not by escalating.

Nobody wrote those rules down. They came out of one person's own history, with receipts.

> This is an example. Yours is mined from your logs and will read nothing like it.

The card

After mining, python ditto.py --card renders your profile as a shareable card: archetype, top laws ranked by distinct supporting session receipts, coverage stats, and one sharp truth.

Share the card or one short trait, never your full profile.

Quickstart

Install the cross-agent bootstrap — runs in Claude Code and Codex, and installs profiles for Cursor and Gemini through the explicit adapters:

npx skills add ohad6k/ditto@ditto

Then tell your agent:

run ditto

That installs the bootstrap and creates a read-only full-history mining plan. Your agent must show the cost and wait for approval before model work. It does not install native namespaced routing.

Native Codex plugin

The native plugin adds ditto:mine, ditto:work, ditto:design, and ditto:write:

codex plugin marketplace add ohad6k/ditto --ref v0.3.8 --json
codex plugin add ditto@ditto --json

The plugin-install command itself scans no logs, writes no private profile state, and schedules zero mining model calls. Asking an agent to install, run, or update Ditto still consumes that host interaction plus its normal system and tool overhead.

Native Claude Code plugin

The Claude Code plugin exposes the same four skills. Install it from inside Claude Code:

/plugin marketplace add ohad6k/ditto
/plugin install ditto@ditto

MCP server

Ditto also ships a Model Context Protocol (MCP) server, so any MCP client — Claude Desktop, Cursor, and other agents — can load your profile before a task. The server implements MCP over stdio and exposes one tool, load_ditto_profile, which returns your mined work, design, or writing profile over the Model Context Protocol.

Run it from the published package with uvx ditto-cli mcp, or from a checkout with python ditto.py mcp, and point an MCP client at it:

{
  "mcpServers": {
    "ditto": { "command": "uvx", "args": ["ditto-cli", "mcp"] }
  }
}

The MCP server is stdlib-only and serves the profile you already mined locally; it makes no network calls of its own.

What happens when you run it

Ditto first prints a read-only plan:

{
  "valid_sessions": "--",
  "post_dedupe_source_tokens": "--",
  "mode": "full",
  "profile_scope": "full_profile",
  "quality_default": true,
  "candidate_index": null,
  "selected_source_tokens": "--",
  "planned_worker_calls": "--",
  "planned_reducer_calls": "--"
}

The full-history quality default reads all eligible history. Ditto shows the exact plan first and waits for approval before any worker or reducer runs. Cached reports are reused, so the displayed remaining cost can fall over time.

If you explicitly want a cheaper first look, ask for run ditto quick preview or use --preview:

python ditto.py plugin preflight --preview

Quick preview creates a starter profile from selected history, not the full profile.

The quick-preview ladder is:

| Candidate | New source text | Maximum planned passes | |---|---:|---:| | 4 × 25K | 100K tokens | 4 workers + 1 reducer | | 6 × 25K | up to 150K tokens | up to 6 workers + 1 reducer | | 8 × 25K | 160K-token hard cap | up to 8 workers + 1 reducer |

The frozen calibration recovered only 5 of 22 required traits at the widest bounded candidate. Quick preview therefore cannot be described as the quality default unless a future run passes all 22 frozen requirements. The permanent non-private baseline is in tests/fixtures/bounded-calibration-baseline.json.

The first real full-history release mine recovered 12 of the same 22 frozen requirements: work 5/10, design 5/5, and writing 2/7. Full history remains the quality default because it materially improves recall over preview, not because it guarantees a complete personal model. The validated pack keeps only supported rules; missing traits require future mining improvements rather than a softened score.

On update, unchanged segment and evidence hashes are reused. An identical update plans zero additional Ditto mining passes. New history plans only affected full-history work plus one reducer.

These are selected source tokens and planned worker/reducer passes, not provider billing events. Ditto cannot measure provider system prompts, tool traffic, orchestration overhead, or a percentage of a proprietary subscription allowance.

Experimental adaptive recall

The receipt-salience and scout pipeline remains available to developers through explicit --stage A, but it is experimental and is not used by the Plugin release, quality-default setup, updates, or calibration.

What makes the result trustworthy

  • Only real user-authored .jsonl messages are mined. AGENTS.md, CLAUDE.md, memory files, and typed self-descriptions are rejected as source evidence.
  • Every bounded worker covers work, design, and writing in one validated report.
  • Quotes must be short, dated, verbatim receipts from known session IDs.
  • Inferred rules require at least two distinct sessions and, when available, two source/time strata.
  • One uncontradicted explicit instruction may survive as low-frequency evidence.
  • Generic filler, invented quotes, unresolved contradictions, partial profile packs, and corrupt caches fail closed.

The native loaders are deliberately separate:

| Skill | Loads | |---|---| | ditto:work | Core working profile | | ditto:design | Core + design taste | | ditto:write | Core + writing voice | | ditto:mine | Only explicit setup, update, or deepen requests |

Privacy

Ditto's extractor, redaction, caches, and generated profiles stay local. Selected redacted text is processed by the model provider you choose. With a local model, the entire mining flow can remain local.

ditto.py itself is one stdlib-only file and makes no network calls. The skills.sh command downloads the selected bootstrap. Outside a repository checkout, that bootstrap downloads only ditto.py and MINING_PROMPT.md from the exact release tag after SHA-256 verification. Those downloads happen before log discovery and read no session data.

Redaction is best-effort and runs before selected text is written to Ditto caches. Inspect private output before sharing it. Share the card or one short trait, never your full profile or receipt appendix.

See [SECURITY.md](SECURITY.md) for the exact boundary.

Raw one-file CLI

The legacy extractor remains available and backward compatible:

curl -O https://raw.githubusercontent.com/ohad6k/ditto/v0.3.8/ditto.py
python ditto.py --dry-run
python ditto.py --chunks 4 --out ditto-out

Manual adapters remain available:

python ditto.py --install you.md --target codex
python ditto.py --install you.md --target claude
python ditto.py --install you.md --target cursor --repo .
python ditto.py --install you.md --target agents --repo .
python ditto.py --install you.md --target gemini --repo .
python ditto.py --install you.md --target opencode

Support matrix

| Surface | Status in this release | |---|---| | Codex native plugin | Proven locally with four namespaced skills | | Codex skills.sh bootstrap | Supported | | Claude Code skills.sh/direct adapter | Supported | | Claude native plugin | Not claimed; host unavailable during validation | | Cursor / Gemini adapters | Supported through explicit install commands | | OpenCode | Both directions verified live: sessions mined from its SQLite store and legacy JSON layout (--source opencode), profile installed to its global rules (--target opencode) | | Google Antigravity | Mining verified live against a real local install (--source antigravity): typed prompts extracted from ~/.gemini/antigravity/brain transcripts, harness envelopes stripped. Antigravity only writes transcripts when interaction logging is enabled in its privacy settings | | OpenClaw / Hermes Agent | Profile skill discovery verified locally; [guide](docs/OPENCLAW_HERMES.md) |

Updating and notifications

Run update ditto to reuse stable caches and plan only changed work.

A GitHub star bookmarks the repository but does not subscribe you to releases. To receive release notifications, choose Watch → Custom → Releases on GitHub.

Limits

  • Ditto models how you work, design, and write. It does not make the underlying model smarter.
  • Sparse or repetitive histories can leave design or writing inactive. Ditto reports the exact targeted-deepen instruction instead of inventing a persona.
  • Provider token accounting remains outside Ditto's exact measurement.
  • Benchmarks, leaderboard results, and proof videos are a separate later release.

FAQ

The three things people push back on, answered once.

"Why not just ask Claude to summarize my logs?"

One pass can't do it. My history is 1,656 sessions, about 3M tokens after extraction, and the raw logs are mostly tool output, file dumps, and pasted errors. A single summarize call burns the window on that noise. Ditto keeps only the words you typed, gives each validated segment its own evidence pass, and requires distinct supporting sessions before an inferred rule can survive. The resulting profile keeps session receipts instead of an obsolete worker-count score.

"Claude already has memory. Why do I need this?"

Use both. Memory is what you told the model: curated notes, CLAUDE.md, and it stays inside one tool. Ditto reads supported raw sessions from Codex, Claude Code, Copilot CLI, OpenCode, and Google Antigravity and pulls out what you never wrote down: what you reject, what "done" means to you, and when you demand proof. The output is plain files you own and can load through supported agents.

"Claude only keeps 30 days of logs. Where did 9 months come from?"

Claude Code's retention is a setting (cleanupPeriodDays, 30 by default), and my longer history combines Claude Code, Codex, and Copilot CLI sessions plus archives. If you keep the default retention, older Claude sessions can roll off before Ditto sees them. Raise the retention, then mine what's left.

Roadmap

See [ROADMAP.md](ROADMAP.md) for what is intentionally deferred.

Community

License

MIT. Made by @ohad6k.

Source & license

This open-source MCP server is cataloged on AgentStack and links to its original source — we do not rehost the code.

  • Author: ohad6k
  • Source: ohad6k/ditto
  • License: MIT
  • Homepage: https://ditto-mauve.vercel.app

Install and usage instructions live in the source repository linked above.

Reviews

No reviews yet — be the first.

Versions

  • v0.1.0 Imported from the upstream source.