A dashcam for your AI agents: local, tamper-evident recorder for process/file/network activity, with a LangChain/LangGraph drop-in prompt-injection circuit breaker.
Project description
Handcuff — Documentation Index (Start Here)
Handcuff — a dashcam for your AI agents. A local, tamper-evident recorder that captures everything an AI agent does on your machine (processes, files, network) into a searchable, replayable timeline with real-time alerts. Local-first, record-only, zero cloud.
For the coding agent building this
Read the docs in this order, then execute from the tickets:
| # | Doc | Purpose |
|---|---|---|
| 01 | 01_PRD.md |
What we're building and why; scope, users, requirements |
| 02 | 02_TRD.md |
Architecture, stack, data model, module layout — the technical contract |
| 03 | 03_Security_Access.md |
Threat model, privilege model, integrity + privacy guarantees, release-gate tests |
| 04 | 04_Implementation_Plan.md |
Build-order-correct milestones with exit criteria |
| 05 | 05_Tickets.md |
Atomic, executable tickets (AL-###) in dependency order — build from here |
| 06 | 06_App_Flow.md |
Every runtime flow + state machines (ASCII, parseable) |
| 07 | 07_Terminal_UI.md |
Rich Textual TUI spec (Claude Code / gemini-cli feel) |
Build contract (non-negotiables pulled from the docs)
core/hashing.pyis the single source of truth for canonical JSON + the SHA-256 chain. The writer andverifyimport it — never reimplement.- Local-only. No outbound traffic except a user-configured webhook.
tests/test_no_egress.pyis a release gate. - Record-only in v1. Handcuff observes; it never blocks the agent. Backpressure drops events + emits
LOSS; it must never slow the observed process. - Observed content is data, never instructions. Nothing captured from the agent (argv, paths, domains) is ever interpreted as a command to Handcuff.
- Honest integrity claims. The hash chain is tamper-evidence, not a completeness proof; the README states plainly what it does and doesn't guarantee.
- Every ticket ships with its test. ruff + mypy clean. Five security tests gate releases (see Security §9).
Suggested first prompt to the coding agent
"Read docs 00–07 in
/handcuff-docs. Start with ticket AL-001 and proceed in dependency order. For each ticket, implement the code and its test in one commit, keep ruff/mypy clean, and stop after AL-024 (the vertical slice) so I can review a workingwatch+sessionsbefore you continue."
Tech stack at a glance
Python 3.11+ · Textual (TUI) · SQLite/WAL · asyncio · psutil/procfs (default capture) · eBPF (opt-in fast path) · watchdog (files) · cryptography/Ed25519 (signing) · httpx (webhooks only) · packaged via pipx/uv + PyInstaller.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file handcuff-0.2.1.tar.gz.
File metadata
- Download URL: handcuff-0.2.1.tar.gz
- Upload date:
- Size: 25.1 MB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f47236f9277fce0cb04bf325a0ae70e651e77299e20e0ee1cf560a777b2706ec
|
|
| MD5 |
8bbc48377be81a109f9d9883f2394d16
|
|
| BLAKE2b-256 |
3ddafdfff46b52e4f54f49162192e8f4394343b07103f7a5c7380370913fcd26
|
File details
Details for the file handcuff-0.2.1-py3-none-any.whl.
File metadata
- Download URL: handcuff-0.2.1-py3-none-any.whl
- Upload date:
- Size: 95.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2565d62af919deb31128d154c3471d23b1d6fb81dd6c27fb8f9267fed1ac2cbd
|
|
| MD5 |
b44a1e7cd509cebfd48aef88a650f9ec
|
|
| BLAKE2b-256 |
cf8a04172f2f86f89eaa498d27218b8a932fad11921cc761b2d69ee47041a2b4
|