{"id":50983319,"url":"https://github.com/thinkwright/threadmark","last_synced_at":"2026-06-19T16:34:14.984Z","repository":{"id":359021189,"uuid":"1242079076","full_name":"thinkwright/threadmark","owner":"thinkwright","description":"Local handoff and continuity for Claude Code, Codex, and AI coding agents.","archived":false,"fork":false,"pushed_at":"2026-05-20T05:00:27.000Z","size":427,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-20T06:11:22.592Z","etag":null,"topics":["ai-agents","ai-coding","claude-code","codex","coding-agents","continuity","developer-tools","go","handoff","hooks","local-first","multi-agent"],"latest_commit_sha":null,"homepage":null,"language":"Go","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/thinkwright.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":null,"security":"SECURITY.md","support":null,"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-05-18T05:39:29.000Z","updated_at":"2026-05-20T04:59:57.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/thinkwright/threadmark","commit_stats":null,"previous_names":["thinkwright/threadmark"],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/thinkwright/threadmark","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thinkwright%2Fthreadmark","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thinkwright%2Fthreadmark/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thinkwright%2Fthreadmark/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thinkwright%2Fthreadmark/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/thinkwright","download_url":"https://codeload.github.com/thinkwright/threadmark/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thinkwright%2Fthreadmark/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34539888,"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-19T02:00:06.005Z","response_time":61,"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":["ai-agents","ai-coding","claude-code","codex","coding-agents","continuity","developer-tools","go","handoff","hooks","local-first","multi-agent"],"created_at":"2026-06-19T16:34:14.113Z","updated_at":"2026-06-19T16:34:14.972Z","avatar_url":"https://github.com/thinkwright.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Threadmark\n\n[![Go 1.24+](https://img.shields.io/badge/Go-1.24%2B-00ADD8?logo=go\u0026logoColor=white)](./go.mod)\n[![CI](https://github.com/thinkwright/threadmark/actions/workflows/ci.yml/badge.svg)](https://github.com/thinkwright/threadmark/actions/workflows/ci.yml)\n[![Release](https://img.shields.io/github/v/release/thinkwright/threadmark?label=release)](https://github.com/thinkwright/threadmark/releases/latest)\n[![Homebrew](https://img.shields.io/badge/brew%20install-thinkwright%2Ftap%2Fthreadmark-fbb040?logo=homebrew\u0026logoColor=white)](https://github.com/thinkwright/homebrew-tap)\n[![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](./LICENSE)\n[![Status: pre-release](https://img.shields.io/badge/status-pre--release-f59e0b.svg)](#limits)\n[![Adapters: Claude Code + Codex](https://img.shields.io/badge/adapters-Claude%20Code%20%2B%20Codex-4b5563.svg)](#what-it-does)\n[![Local storage](https://img.shields.io/badge/local--storage-yes-16a34a.svg)](#limits)\n\nThreadmark is a shared continuity substrate for software developers who work\nsimultaneously with Claude Code and Codex in the same repository.\n\nClaude Code and Codex can keep their own interfaces, models, transcripts,\nassumptions, and working styles. Threadmark's sidecar runs beside them, receives\nlive work events through hooks, accumulates activity while work is active, holds\na pending checkpoint until the work reaches a useful boundary, writes a short\njournal entry when that checkpoint fires, and gives the next agent a compact\nstartup packet for the same project.\n\nIt is not a transcript archive, semantic search layer, or general agent memory\nsystem. Threadmark is narrower: it preserves enough situated context for\nindependent agents to stay on the same line of work without inheriting one\nanother's entire sessions.\n\n## How It Works\n\nEach harness keeps doing the coding work. Threadmark receives live work events\nthrough Claude Code or Codex hooks and lets the daemon handle state, triggers,\nreflection, and startup context.\n\n![Threadmark runtime flow](./docs/assets/threadmark-flow.svg)\n\nThe main pieces are:\n\n- **Adapters** translate Claude Code and Codex hook payloads into a neutral event schema.\n- **Hook bridge** is the `threadmark hook ...` command. It is fast, forwards events to the daemon, and auto-starts the daemon when needed.\n- **Daemon** is `threadmarkd`, a per-user process that owns state, trigger classification, debounce, pending checkpoints, reflection, and journal writes.\n- **Core engine** decides when a line of work has reached a checkpoint: commit, stop, idle gap, safety net, user checkpoint, or pre-compaction.\n- **Reflector** is a separate model call that turns a best-effort redacted event excerpt into a short first-person journal entry.\n- **Journal store** writes append-only Markdown per project under `~/.threadmark/projects/\u003cproject-hash\u003e/`.\n- **SessionStart surfacing** injects a startup packet into a new agent session: current git facts first, an optional Project Card second, and selected journal entries third.\n\nSee [HOW_IT_WORKS.md](./HOW_IT_WORKS.md) for the mechanics.\n\n## What It Does\n\nMany developers already move between Claude Code and Codex on the same\ncheckout: one agent explores, another edits, another reviews, and the human\nkeeps steering. Each harness has its own transcript and assumptions. Threadmark\nadds the shared thread those separate sessions do not naturally have.\n\nWhile you work, Threadmark watches Claude Code and Codex lifecycle events:\nprompts, tool calls, edits, commits, stops, and compactions. It keeps\nper-project state, accumulates activity, and suppresses empty lifecycle noise so\nopening and closing an agent does not create fake progress. When a real\ncheckpoint appears, it can reflect a best-effort redacted excerpt into a short\njournal entry. Stop and pre-compaction checkpoints fire immediately after\nsubstantive work because they are handoff boundaries.\n\nWhen another agent enters the repo, Threadmark can give it a startup packet with\na Workspace Snapshot, optional Project Card, and selected recent entries. That\npacket is meant to answer the practical cross-agent questions: where are we,\nwhat changed recently, what was brittle, what did the previous agent think\nmattered, and what should be checked before moving again?\n\nYou still keep control. `threadmark doctor` and `threadmark status` explain what\nthe sidecar sees, daemon lifecycle commands are available for troubleshooting\nand upgrades, `THREADMARK_NO_JOURNAL=true` supports testing or sensitive sessions,\nand project disable/enable plus purge commands let you stop or remove local\nThreadmark state.\n\n## Limits\n\n- Threadmark is distributed as two command-line binaries, `threadmark` and `threadmarkd`; install with Homebrew, `go install`, or build from source.\n- The reflector backend is the Claude CLI (`claude -p`) in convenience or bare mode.\n- Journal mode sends a best-effort redacted checkpoint excerpt to the configured reflector model; launch the agent with `THREADMARK_NO_JOURNAL=true` for sensitive sessions.\n- Redaction is not a security guarantee.\n- OpenCode and Pi adapters are not included.\n- Threadmark does not sync journals across machines.\n- Threadmark does not do semantic retrieval over the journal.\n- Threadmark does not persist raw transcripts or raw tool outputs.\n\n## Quick Start\n\nInstall Threadmark, then activate the project you want it to observe:\n\n```sh\nbrew install --cask thinkwright/tap/threadmark\ncd ~/code/my-project\nthreadmark activate\n```\n\n`threadmark activate` installs project hooks and makes the per-user daemon\nready. Then start your agent normally:\n\n```sh\nclaude\n```\n\nor:\n\n```sh\ncodex\n```\n\nFor Codex project hooks, run `/hooks` once inside Codex and trust the Threadmark hooks.\n\nFor the full setup path, see [QUICKSTART.md](./QUICKSTART.md).\nFor Homebrew and source-checkout paths, see [INSTALL.md](./INSTALL.md).\n\n## Documentation\n\n- [QUICKSTART.md](./QUICKSTART.md) - current setup and first-use guide\n- [INSTALL.md](./INSTALL.md) - installation, upgrade, uninstall, and health checks\n- [HOW_IT_WORKS.md](./HOW_IT_WORKS.md) - implementation mechanics\n- [SECURITY.md](./SECURITY.md) - security and privacy posture\n- [CONTRIBUTING.md](./CONTRIBUTING.md) - contribution guidelines\n\n## Development\n\nCommon checks:\n\n```sh\ngo test ./...\ngo vet ./...\ngit diff --check\n```\n\nLocal binaries are built into `bin/`, which is ignored by git.\n\n## License\n\nMIT. See [LICENSE](./LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthinkwright%2Fthreadmark","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fthinkwright%2Fthreadmark","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthinkwright%2Fthreadmark/lists"}