Introducing opentine
Every agent framework can show you a stream of activity. The harder question is what remains when the process exits.
Editor's note - August 17, 2026: This introduction predates the repository, Surface, and Interop & Adoption releases. Its model example remains current in v0.7; the shipped surface now includes v3 repository commands, OpenTelemetry import/export and OTLP push, live LangChain/LangGraph capture, and no-code
tine run --modelcapture.
I built opentine because an agent run should be a first-class artifact: something you can inspect, verify, move, fork, replay, and compare.
The run is the unit of work
An opentine run is stored as a content-addressed graph of model calls, tool calls, outputs, errors, cache provenance, and transcript state. Save it as a .tine file and the history travels with the result.
from opentine import Agent
from opentine.models.anthropic import Anthropic
agent = Agent(model=Anthropic("claude-sonnet-5"))
run = agent.run_sync("What is opentine?")
run.save("result.tine")
The CLI gives that artifact a small set of graph operations:
tine show result.tine
tine verify result.tine
tine fork result.tine --from-step 0 --save forked.tine
tine replay result.tine --mode cache
tine diff result.tine forked.tine
Why a file matters
If history exists only inside a hosted dashboard, the dashboard owns the useful representation. A local artifact changes the boundary. You decide where it lives, who receives it, and which tools inspect it.
The .tine format records enough state for supported replay and scoped resumption workflows. It does not claim every external trace can be converted into a fully resumable runtime. The capability depends on what the producer recorded and which runtime or harness is available.
Why content addressing matters
Steps are identified from canonical immutable payloads. Parent links make the artifact a graph rather than a flat log. Shared prefixes can be reused, integrity can be checked, and a diff can identify the point where two branches diverged.
A focused primitive
opentine does not try to replace every orchestration framework. It provides a portable provenance layer for native agents, scoped external CLI harnesses, live LangChain/LangGraph callbacks, and supported post-hoc trace imports. Those paths do not all promise the same completeness or resumability, so each boundary remains explicit.
That narrower promise is the point. Trust starts with saying exactly what an artifact contains and exactly which operations have been validated.
Every run should leave behind more than stdout. It should leave an artifact.