Releases: ohad6k/emulo
Release list
Emulo v0.5.0 — Ditto is now Emulo
Ditto has been renamed to Emulo.
The old name collided with several products already in this space: heyditto.ai (agent memory, same runtimes), ditto.live (edge-sync database), and a ditto skill already on ClawHub. Sharing a name with a bigger product in your own category is not a fight worth having, so the project renamed now, while it is small and the change is cheap.
Emulo is Latin for aemulor, "I emulate." Same tool: it mines your own AI coding sessions into a you.md working profile your agent reads before every task.
If you already use it, nothing breaks
This was the one thing the release had to get right:
DITTO_HOMEis still honored (EMULO_HOMEwins if both are set)- an existing
~/.dittohome keeps working in place — no data is moved - an existing
ditto-out/mining output directory is still found and used - old
<!-- ditto profile:start/end -->blocks in your CLAUDE.md / Cursor rules are still recognized, and upgrade to the new markers on the next write - the legacy
ditto-work-profileid still validates
Old repo links redirect automatically.
New installs
pip install emulo
# or
npx skills add ohad6k/emulo@emulo
The PyPI package is now emulo (it was ditto-cli, because ditto was taken). uvx emulo mcp runs the MCP server. The emulo-cli command is kept as a deprecated alias.
Also in this release
First release to ship the video domain (emulo:video), so mining now builds a fourth layer alongside work, design, and write.
If something breaks
If any part of your existing setup stops working after upgrading, that is a bug, not expected — please open an issue.
Ditto v0.3.8: Google Antigravity session mining
Antigravity prompts were invisible to Ditto. v0.3.8 adds them as a first-class local source.
What changed
--source antigravityreads local Google Antigravity transcripts from~/.gemini/antigravity/brain.- Auto-detection now includes Antigravity.
- Ditto keeps only
USER_INPUTrecords markedUSER_EXPLICIT. <USER_REQUEST>and injected<ADDITIONAL_METADATA>wrappers are removed before mining. Model and system records do not enter the corpus.- Conversation IDs are preserved in session labels so separate Antigravity sessions stay distinct.
- GitHub Actions are SHA-pinned, and the HOL plugin scanner is now an enforced check.
Antigravity only writes these transcripts when interaction logging is enabled in its privacy settings.
Install or update
Cross-agent bootstrap:
npx skills add ohad6k/ditto@dittoNative Codex plugin pinned to this release:
codex plugin marketplace add ohad6k/ditto --ref v0.3.8 --json
codex plugin add ditto@ditto --jsonThen ask your agent to run ditto. It will show the mining plan and cost before any model work.
Verification
- 180 unit tests passed on the tagged commit.
- GitHub unit-test and HOL scanner checks passed.
- The tagged bootstrap metadata pins the canonical
ditto.pyrelease bytes and is covered by the release runtime hash test.
Full change record: CHANGELOG.md
Ditto v0.3.7
Adds a GitHub Copilot-compatible plugin manifest at .github/plugin/plugin.json, exposing Ditto's mine, work, design, and write skills. Also keeps all release manifests, runtime metadata, bootstrap references, and integrity hashes aligned to v0.3.7.
Ditto v0.3.0 — voice registers
Ditto used to average every voice you use into one blend. Your reddit replies, your messages to the agent, your work emails, all mashed into a single "how you write." A user who ran it on ~120 sessions caught the cost: the drafted message to his boss came out too casual.
0.3.0 fixes that with voice registers.
What changed
- Every mined write evidence item and rule now carries a register:
casual,professional, orshared. Classified at mining time from the receipts: who the text addresses, the platform, the artifact type. Messages to the agent count as casual signal only, never professional. you-writer.mdis grouped into## Voice laws(always apply),## Casual register, and## Professional register. A rule keeps its evidence's register; mixed evidence reduces to a shared voice law. A rule can never claim a register its receipts don't show.ditto:writepicks the register from context instead of asking. Say "for my boss" and it wins; otherwise the pasted thread, recipient, or artifact type decides. The pick is stated in one correctable line. If the register you need was never mined, it loads voice laws only and tells you, instead of sending casual banter to a client.- Validation got stricter: write rules must cite write evidence that carries a register, and every rule must sit under its own register section in the profile. Mis-filed rules fail the pack.
- Schema bumps across the mining contract (report 2, prompt 2, reducer 2, scout 3, domain draft 2). Installed profiles keep loading; the next mining run re-mines under the new contract.
- New
docs/FEEDBACK.md: a running log of user feedback and what each item changed in the tool.
Upgrade
Cross-agent bootstrap:
npx skills add ohad6k/ditto@dittoNative Codex plugin:
codex plugin marketplace add ohad6k/ditto --ref v0.3.0 --json
codex plugin add ditto@ditto --jsonFlat writing profiles from 0.2.0 keep working unchanged. Re-mine to get registers.
Verified
- 141 unit tests pass, including new register validation, section membership, and render tests.
- Two review-confirmed validation holes were reproduced against the code and re-verified closed after the fix.
- The v0.3.0 tag was fetched live and both pinned runtime files hash-match the bootstrap manifest.
- Not yet claimed: a full real-history re-mine under the register contract. That proof run is next.
Ditto v0.2.0 — the native plugin
Your mined profile now splits into separate personal layers for work, design, and writing, with full-history mining as the quality default and incremental cached re-runs.
Works across agents: Claude Code and Codex install through the one-command bootstrap (Cursor and Gemini through the explicit adapters). Codex additionally gets a native plugin with automatic routing between the four skills.
Install
For the cross-agent bootstrap:
npx skills add ohad6k/ditto@dittoThen tell the agent run ditto. The bootstrap creates a read-only full-history plan, displays the exact selected source tokens and planned worker/reducer passes, and waits for approval before model work. It installs the approved core profile across supported agents; namespaced automatic routing requires the native plugin.
For native Codex routing:
codex plugin marketplace add ohad6k/ditto --ref v0.2.0 --json
codex plugin add ditto@ditto --jsonThe plugin adds ditto:mine, ditto:work, ditto:design, and ditto:write. Plugin installation itself scans no logs and schedules no mining passes.
Full profile or quick preview
Full-history mining is the quality default. It reads all eligible history, reuses validated caches, shows the exact remaining plan, and requires cost approval before any worker or reducer runs.
Quick preview is opt-in through run ditto quick preview or --preview. Quick preview creates a starter profile from selected history, not the full profile. The widest frozen bounded calibration recovered 5/22 required traits, so this release does not present preview as equivalent to a full mine.
Upgrade and migration
Re-run the install command to update. The v0.2.0 skills.sh runtime is pinned to exact SHA-256 values for both ditto.py and MINING_PROMPT.md; mutable main bytes are not accepted.
Existing classic you profiles can be staged, cut over, and rolled back. Cutover moves the legacy skill out of host discovery before the new active pointer is written. The isolated release proof restored the exact legacy bytes and prior pointer state after rollback.
Verification
127unit tests, the Codex plugin validator, the bootstrap skill validator, CLI help checks, JSON parsing, andgit diff --checkpass on the local release candidate.- Separate spec-compliance and Python safety/quality reviews both returned
PASS. - Codex CLI
0.142.5discovered exactly the four native skills. Uninstall/reinstall preserved isolated private state byte-for-byte. - A real full-history mine ran against a frozen, locally redacted snapshot of
1,968actual sessions and3,284,544selected source tokens. It produced147validated reports,846validated evidence items, and one strong reducer. The activated profile version ise61ae342557034ff9a9b, and work, design, and writing are active with five rules each. - The identical frozen-corpus update then planned zero workers and zero reducers with all
147segments cached. - Against the unchanged private calibration, full history recovered
12/22requirements: work5/10, design5/5, and writing2/7. That materially beats quick preview's5/22, but it is not complete recall. - Redaction happens locally before selected text reaches the user-chosen model.
ditto.pymakes zero network calls. Runtime download and hash verification occur before log discovery.
See the dogfood evidence, the security boundary, and the roadmap.
Known limits
- Full history remains the quality default relative to preview, but the first real run missed
10/22frozen traits. The release must not imply that a full mine guarantees a complete personal model. - Additional failed or aborted compatibility attempts occurred around the
147successful assigned reports while correcting Windows sandbox and oversize-input orchestration. Exact provider billing remains outside Ditto's measurement. - Native Codex routing was not uniformly clean when an older global Ditto profile competed with the plugin.
- Native Claude plugin packaging is not claimed in this release; the skills.sh bootstrap and direct adapter remain supported.
- Benchmarks, a leaderboard, and proof/launch videos are deferred to a separate later release.
To receive future release updates on GitHub, choose Watch -> Custom -> Releases. A star bookmarks the repository but does not subscribe to releases.
ditto v0.1.2
install upgrade for ditto.
new:
python ditto.py --install you.md --target codex--target claude--target cursor --repo .--target agents --repo .--target gemini --repo .
safety:
- refuses to overwrite existing profile files unless
--yesis passed - AGENTS.md and GEMINI.md installs use a marked ditto block instead of deleting existing content
- Cursor installs get proper
.mdcfrontmatter --dry-runpreviews destination paths without writing
verified:
- local unittest suite
- GitHub Actions tests workflow
ditto v0.1.1
trust upgrade for ditto.
new:
python ditto.py --dry-runpreviews what ditto will read/write without creatingditto-out/- synthetic tests for dry-run and redacted corpus output
- GitHub Actions test workflow + README badge
why it matters:
- users can audit counts and output paths before writing a private corpus
- CI now verifies the extractor behavior on every push
ditto v0.1.0
initial public release of ditto.
what's inside:
- local extractor for Claude Code and Codex JSONL sessions
- secret/PII redaction before writing output
- chunked corpus for agent fan-out mining
- mining prompt for building a
you.md - install paths for Claude Code, Codex, Cursor, AGENTS.md, Gemini, and other agents
this is not agent memory. memory stores what you told the model. ditto mines what your work already proved about you.