Get started
How it works
The four-step flow from first command to shareable proof URL.
The flow
Initialize
Create a Treeship -- a trust domain with a name and an Ed25519 keypair.
treeship initOne Treeship covers your entire workflow. Many agents, many workflows, one set of keys and one governance model.
Run your workflow
Wrap any command or attest any action. Issue approvals before sensitive steps.
treeship wrap -- python agent.py
treeship attest approval --approver human://rezo --description "approve payment"
treeship wrap -- node pay.jsEvery step produces a signed artifact linked to the previous one via a content-addressed parent ID.
Share the proof
Bundle your artifacts and push to the Hub.
treeship bundle create --artifacts art_a1b2,art_c3d4 --tag deploy-v1.2
treeship dock push art_bundle_id
# -> https://treeship.dev/verify/art_xxxWhat gets signed
Every artifact is a DSSE envelope containing a Treeship statement:
DSSE envelope
└── payloadType: application/vnd.treeship.action.v1+json
└── payload (base64):
{
type: "treeship/action/v1",
timestamp: "2026-03-26T21:00:00Z",
actor: "agent://researcher",
action: "document.analyze",
parentId: "art_previousstep",
approvalNonce: "nce_7f8e9d0a", <- must match approval.nonce
meta: { ... }
}
└── signatures:
[{ keyid: "key_9f8e7d6c", sig: "base64url(ed25519_sig)" }]How verification works
treeship verify art_f7e6d5c4The verifier is deterministic and runs entirely on your machine. No network call, no server trust required.
The verifier:
- Derives the expected artifact ID from
sha256(PAE_bytes)[..16] - Compares against the stored ID -- tampered content fails immediately
- Verifies the Ed25519 signature
- Validates the statement schema
- Walks the parent chain recursively
- Checks
action.approvalNonce == approval.nonceif present - Returns pass / fail with reasons
Exit 0 = clean chain. Exit 1 = something failed.