Skip to content

Releases: ohad6k/emulo

Emulo v0.5.0 — Ditto is now Emulo

Choose a tag to compare

@ohad6k ohad6k released this 16 Jul 10:37

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_HOME is still honored (EMULO_HOME wins if both are set)
  • an existing ~/.ditto home 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-profile id 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

Choose a tag to compare

@ohad6k ohad6k released this 14 Jul 22:28

Antigravity prompts were invisible to Ditto. v0.3.8 adds them as a first-class local source.

What changed

  • --source antigravity reads local Google Antigravity transcripts from ~/.gemini/antigravity/brain.
  • Auto-detection now includes Antigravity.
  • Ditto keeps only USER_INPUT records marked USER_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@ditto

Native Codex plugin pinned to this release:

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

Then 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.py release bytes and is covered by the release runtime hash test.

Full change record: CHANGELOG.md

Ditto v0.3.7

Choose a tag to compare

@ohad6k ohad6k released this 14 Jul 17:51
5f4008b

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

Choose a tag to compare

@ohad6k ohad6k released this 13 Jul 09:04

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, or shared. 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.md is 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:write picks 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@ditto

Native Codex plugin:

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

Flat 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

Choose a tag to compare

@ohad6k ohad6k released this 11 Jul 19:47

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@ditto

Then 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 --json

The 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

  • 127 unit tests, the Codex plugin validator, the bootstrap skill validator, CLI help checks, JSON parsing, and git diff --check pass on the local release candidate.
  • Separate spec-compliance and Python safety/quality reviews both returned PASS.
  • Codex CLI 0.142.5 discovered 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,968 actual sessions and 3,284,544 selected source tokens. It produced 147 validated reports, 846 validated evidence items, and one strong reducer. The activated profile version is e61ae342557034ff9a9b, 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 147 segments cached.
  • Against the unchanged private calibration, full history recovered 12/22 requirements: work 5/10, design 5/5, and writing 2/7. That materially beats quick preview's 5/22, but it is not complete recall.
  • Redaction happens locally before selected text reaches the user-chosen model. ditto.py makes 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/22 frozen traits. The release must not imply that a full mine guarantees a complete personal model.
  • Additional failed or aborted compatibility attempts occurred around the 147 successful 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

Choose a tag to compare

@ohad6k ohad6k released this 08 Jul 17:27

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 --yes is passed
  • AGENTS.md and GEMINI.md installs use a marked ditto block instead of deleting existing content
  • Cursor installs get proper .mdc frontmatter
  • --dry-run previews destination paths without writing

verified:

  • local unittest suite
  • GitHub Actions tests workflow

ditto v0.1.1

Choose a tag to compare

@ohad6k ohad6k released this 08 Jul 17:22

trust upgrade for ditto.

new:

  • python ditto.py --dry-run previews what ditto will read/write without creating ditto-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

Choose a tag to compare

@ohad6k ohad6k released this 08 Jul 16:43

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.