{"id":50839959,"url":"https://github.com/otto-haus/otto","last_synced_at":"2026-06-17T09:01:13.458Z","repository":{"id":364682694,"uuid":"1268755911","full_name":"otto-haus/otto","owner":"otto-haus","description":"Your agents forget every correction. otto makes them stick.","archived":false,"fork":false,"pushed_at":"2026-06-16T08:21:51.000Z","size":58101,"stargazers_count":5,"open_issues_count":59,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-06-16T08:24:30.766Z","etag":null,"topics":["agent-culture","agent-governance","agent-memory","agent-skills","agentic-workflow","ai-agent","ai-agents","autonomous-agents","behavior-layer","claude-code","codex","coding-agents","desktop-app","electron","guardrails","human-in-the-loop","letta","local-first","skills","typescript"],"latest_commit_sha":null,"homepage":"https://otto.haus","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/otto-haus.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":"SECURITY.md","support":"SUPPORT.md","governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-06-13T22:41:31.000Z","updated_at":"2026-06-16T08:22:18.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/otto-haus/otto","commit_stats":null,"previous_names":["otto-haus/otto"],"tags_count":8,"template":false,"template_full_name":null,"purl":"pkg:github/otto-haus/otto","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/otto-haus%2Fotto","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/otto-haus%2Fotto/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/otto-haus%2Fotto/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/otto-haus%2Fotto/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/otto-haus","download_url":"https://codeload.github.com/otto-haus/otto/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/otto-haus%2Fotto/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34441285,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-17T02:00:05.408Z","response_time":127,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["agent-culture","agent-governance","agent-memory","agent-skills","agentic-workflow","ai-agent","ai-agents","autonomous-agents","behavior-layer","claude-code","codex","coding-agents","desktop-app","electron","guardrails","human-in-the-loop","letta","local-first","skills","typescript"],"created_at":"2026-06-14T06:05:40.668Z","updated_at":"2026-06-17T09:01:13.357Z","avatar_url":"https://github.com/otto-haus.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# otto\n\n**Your agents forget every correction you give them. otto makes them stick.**\n\notto is the behavior layer for persistent AI agents. You correct an agent once — *don't call it done without the proof; never cut that corner* — and otto turns the correction into a check it has to pass on every task after. The lesson holds instead of evaporating.\n\nA lesson isn't culture until it changes what happens next. That's the whole job.\n\n**[otto.haus](https://otto.haus) · [Discord](https://discord.gg/hab9ZvbPH) · [Watch the demo](demo/README.md)**\n\n\u003e For the product story, see **[otto.haus](https://otto.haus)**. This README is the clone-and-run path for engineers and contributors.\n\n---\n\n## Direction: otto is becoming a Paperclip plugin\n\notto is pivoting from a standalone Electron app into an extension of\n[Paperclip](https://github.com/paperclipai/paperclip) — the open-source app for running teams of\nAI agents. Paperclip is the office; otto is the behavior/culture layer; Letta is the memory/runtime.\n\n- **v1 (in progress): use Letta from Paperclip.** A `letta_local` external **adapter**\n  (`packages/paperclip-letta-adapter`) drives an existing local Letta agent from a Paperclip issue,\n  preserving memory continuity. Provider keys stay in Letta. Proof target: a **local** Paperclip host\n  + an existing **local** Letta runtime on the same Mac.\n- **v2: culture updates.** The otto governance loop (corrections → proposals → ratification →\n  Standards/Practices → receipts) ships as a Paperclip **plugin** that posts receipts back to issues.\n- **v3: the rest, only if it earns its keep.**\n\nThe Electron desktop shell (`apps/desktop/`) is **kept as the internal lab / Letta console** — it\nvalidated the local Letta + chat + receipt loop. The adapter is built in a separate package\n(`packages/paperclip-letta-adapter`). Archive shell surfaces only **after** the Paperclip adapter has\ncompleted one real issue round-trip — not before.\n\n---\n\n\u003ca id=\"see-it\"\u003e\u003c/a\u003e\n\n## See it\n\notto Desktop — a chat workspace with pinned threads, a model selector, and honest runtime connection state.\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://github.com/otto-haus/otto/releases/latest/download/otto-v01-desktop.mp4\"\u003e\n    \u003cimg src=\".github/assets/otto-desktop.png\" alt=\"otto desktop — chat workspace with pinned threads, model selector, and runtime connection state\" width=\"920\" /\u003e\n  \u003c/a\u003e\n  \u003cbr /\u003e\n  \u003ca href=\"https://github.com/otto-haus/otto/releases/latest/download/otto-v01-desktop.mp4\"\u003e\n    \u003cimg src=\"docs/assets/desktop-demo.gif\" alt=\"otto v0.1 desktop walkthrough — Remotion re-enactment of setup, chat, and behavior surfaces\" width=\"820\" /\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\n▶ **45-second desktop walkthrough** — a Remotion re-enactment, not a live screen capture ([`demo/README.md`](demo/README.md)).\n\n---\n\n## Quick start\n\n**Default — This Mac (one app).** [Download otto](https://github.com/otto-haus/otto/releases/latest) and open it. otto bundles and supervises its own embedded Letta runtime ([`@letta-ai/letta-code`](https://www.npmjs.com/package/@letta-ai/letta-code), Apache-2.0 — otto is **powered by Letta**), so there's no separate Letta install. Provider keys live in Letta, not otto. See [`docs/v1/embedded-letta-bundle.md`](docs/v1/embedded-letta-bundle.md) and [`THIRD_PARTY_NOTICES.md`](THIRD_PARTY_NOTICES.md).\n\n**Advanced — existing local Letta.** Already running Letta Desktop? Switch to *Existing local Letta* in **Settings → General**. otto won't silently fall back to it — the embedded runtime is the default.\n\n**From source (developers).** You'll need [Bun](https://bun.sh) and [go-task](https://taskfile.dev):\n\n```bash\nbrew install go-task                 # macOS\ngit clone https://github.com/otto-haus/otto.git \u0026\u0026 cd otto\nbun install\nbun run install-extension            # Letta Code commands → ~/.letta/extensions/\ntask electron                        # dev app  (task staging for an isolated build)\n```\n\nLive chat only unlocks after `session.initialize()` succeeds against a real Letta agent. In This Mac mode that agent comes from the embedded runtime; fix any blockers in **Settings → General**.\n\n---\n\n## Culture CI\n\nEvery correction can become a regression test.\n\nYour agent claims \"done\" with no proof. You correct it once. otto proposes a Check; you ratify it; from then on every \"done\" has to pass it — acceptance criteria mapped to the work, evidence attached, a receipt written.\n\n```\nPattern:        \"done\" claimed without evidence\nProposed rule:  completion requires receipts mapped to acceptance criteria\nResult:         future \"done\" claims must attach test output, logs, or artifacts\nGate:           you ratify before it becomes canon\n```\n\nSearch finds pages. Memory remembers facts. otto changes behavior. Full walkthrough: [`docs/v1/demo-culture-ci.md`](docs/v1/demo-culture-ci.md).\n\n---\n\n## North star\n\n```\ncorrection → proposal → ratification → standard / practice / routine → receipt → better next action\n```\n\nIf a feature doesn't gate irreversibility or make behavior compound, it probably isn't otto.\n\n**Primitives.** Reversibility is the unit of trust. Approve doors, not steps. Receipts over claims. Files are truth, memory is lessons, the UI is a workspace.\n\n---\n\n## What otto is not\n\n- **Not a memory engine.** Letta owns canonical agent memory; otto owns the culture loop around it.\n- **Not an orchestrator.** Work routing is a reference stack (Paperclip), not v0.1 ship.\n- **Not a chat app or RAG product.** otto Shell is a workspace for behavior, approvals, and receipts.\n- **Not a values poster.** A value that cannot refuse you is decoration.\n\n---\n\n## Core concepts\n\n| Concept | Meaning |\n| --- | --- |\n| **Standards** | Canon: what the agent rewards, refuses, and does under pressure. |\n| **Practices** | Repeatable behaviors worth preserving; executable culture. |\n| **Checks** | Executable regressions compiled from ratified Standards — failed Checks write blocked Receipts. |\n| **Routines** | Bundles of Practices; recurring activation needs approval. |\n| **Charters** | Operating contracts: objective, acceptance criteria, plan, gates, receipts. |\n| **Approvals** | Scoped human ratification for one-way doors. |\n| **Receipts** | Proof artifacts. No artifact, no progress. |\n| **Curation** | The proposal-and-ratification engine (desktop Ship tier; spine still maturing — see [`SPEC_COMPLIANCE.md`](SPEC_COMPLIANCE.md)). |\n| **otto Desktop** | A workspace over runtime readiness, chat, approvals, receipts, and surfaces. |\n\n---\n\n## Status — v0.1.3\n\nEarly, local-first, file-backed.\n\n**Ship (Labs off):** chat, settings, desktop shell, Practices, Charters, Standards, Routines, Checks, Receipts, Skills — with honest limits (live chat needs Letta; some surfaces are file-backed or re-enactment demos).\n\n**Labs (Settings → Labs):** Knowledge, Channels, the worker loop, Letta Cloud — not part of public v0.1 claims.\n\nThe desktop \"done\" test: otto Shell launches over Letta and truthfully reports *connected, blocked, stale,* or *ready* — never \"connected\" unless `session.initialize()` succeeds.\n\nTruth tables: [`docs/v1/ship-tier-matrix.md`](docs/v1/ship-tier-matrix.md) · [`docs/v1/labs.md`](docs/v1/labs.md) · [`RELEASE_CHECKLIST.md`](RELEASE_CHECKLIST.md) · [`SPEC_COMPLIANCE.md`](SPEC_COMPLIANCE.md)\n\n---\n\n## Install\n\n**Humans:** start with [`docs/install/getting-started.md`](docs/install/getting-started.md) — paths, Letta prerequisites, and troubleshooting.\n\n**Agents:** [`INSTALL_FOR_AGENTS.md`](INSTALL_FOR_AGENTS.md).\n\n**Quick macOS bootstrap** (clone or use cwd, `bun install`):\n\n```bash\nbash scripts/install-otto.sh\n# optional: OTTO_INSTALL_EXTENSION=1 bash scripts/install-otto.sh\n```\n\nDevelopers need [Bun](https://bun.sh) and [go-task](https://taskfile.dev). For desktop chat, otto uses an **embedded Letta CLI by default** — you do not need a separate Letta Desktop install unless you choose **Existing Letta** in Settings.\n\n```bash\n# macOS\nbrew install go-task\n\ngit clone https://github.com/otto-haus/otto.git\ncd otto\nbun install\n```\n\n**Letta Code extension**\n\n```bash\nbun run install-extension\n# then run /reload in Letta Code\n```\n\nOptional skills (needs an agent memory dir):\n\n```bash\nMEMORY_DIR=/path/to/agent/memory bun run install-extension\n```\n\n**Desktop launch paths**\n\n```bash\ntask electron     # dev Electron; preflight + Letta CLI discovery\ntask staging      # isolated /Applications/otto-staging.app\ntask staging:main # fetch origin/main then refresh otto-staging.app (#338)\n```\n\nSet `OTTO_HOME` or `XDG_STATE_HOME` for clean-profile runs; `LETTA_CLI_PATH` when Letta lives outside the default macOS app path. Update `/Applications/otto.app` only from a published GitHub Release — never from `task refresh` or a local branch build.\n\n**Connect to Letta.** This Mac (default) starts the embedded runtime and bootstraps a local agent — no setup. Existing local Letta (advanced): point otto at your own in **Settings → General**. If it's disconnected, **Settings → General** shows the blocker. Provider credentials stay in Letta.\n\n---\n\n## Verify\n\n```bash\nbun run typecheck \u0026\u0026 bun test \u0026\u0026 bun run verify:v0\nbun run --cwd apps/desktop typecheck\nbun run --cwd apps/desktop electron:typecheck\ntask release:gate\nOTTO_AGENT_ID=\u003cagent-id\u003e task smoke:cli   # disposable conversation; never the default\nbun packages/practices/src/cli.ts         # validate Practices\ntask docs:dev                             # Mintlify preview (devex/)\n```\n\n`task smoke:cli` reports SKIP rather than faking success until a real local agent exists.\n\n---\n\n## Repo map\n\n```\notto/\n  packages/       shared contracts + PracticeSpec tooling\n  apps/desktop/   otto Desktop: Vite + Electron workspace shell\n  extension/      Letta Code commands and permission gates\n  skill/          Charter and Routine skills\n  practices/      practice.yaml specs\n  standards/      canon, precedents, registry\n  demo/           Remotion feature demos (re-enactments)\n  docs/           architecture, install, runtime, v1 tier truth\n  devex/          Mintlify contributor docs\n  AGENTS.md       operating notes for AI coding agents\n  receipts/       proof artifacts\n  SHIP_CHECKS/    per-surface acceptance checks\n```\n\n---\n\n## Roadmap\n\n- **Now:** otto Shell over Letta; Practices, Charters, Standards, receipts.\n- **Next:** Curation hardening, approval records, a work-state bridge (reference — not v0.1 ship).\n- **Then:** intake for AI-chat exports, packaged install.\n\nEach step has to make behavior compound or gate irreversibility.\n\n---\n\n## Community\n\n- Website: \u003chttps://otto.haus\u003e\n- Discord: \u003chttps://discord.gg/hab9ZvbPH\u003e\n- GitHub: \u003chttps://github.com/otto-haus/otto\u003e\n\n---\n\n## License\n\n[MIT](LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fotto-haus%2Fotto","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fotto-haus%2Fotto","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fotto-haus%2Fotto/lists"}