Get ThruLine

Security · Local-first

ThruLine sends nothing on its own.

It reads the session logs Claude Code and Codex already write on this machine, and keeps what it builds from them here too. The engine that reads them and reaches each verdict makes no network calls. Three things can reach the network, and each one waits for you to say so. The source is public, so you can read exactly what runs on your machine.

01 · On your disk

What stays on your disk

Everything ThruLine makes from your session logs is written to this machine, and read back from it. Its records live in one folder; your approvals live in your project.

  • The record

    What each session said and what actually ran, per project. Every fact on screen traces to a file and line in your own logs.

    [RECORDS FOLDER]
  • The runs

    Every check you run, and how it ended.

    The same folder as the record, listed there as “what was run”
  • The receipts

    A receipt is a signed record of exactly what ran. You can check one with no network at all.

    [RECEIPTS LOCATION]
  • The decision files

    One per approval, inside your project, naming the one version — the exact commit — you approved.

    .thruline/decisions/<version>.json

Exporting your own records needs no licence. What a licence does unlock

02 · What can leave

What can leave, and only when you say so

The engine makes zero network calls. These three are the only things that can reach the network, and each one waits for you.

No telemetry.

Nothing about how you use ThruLine is sent anywhere — no usage counts, no crash reports.

No model decides a verdict. The same record always gives the same answer. More in the FAQ

Row by row
What Only when Where it goes
The licence file It unlocks approving a version. Nothing else needs it. When you download it in your browser; ThruLine itself never contacts us. Renewal is pull, not push: you download the next one when you choose. thrulinehq.com Carries: [WHAT A LICENCE REQUEST SENDS]
The narrator Optional. Off by default. Only if you turn it on, and only after the verdict. It puts findings into plain English; it never decides one. A local model (Ollama) on localhost — this machine. It refuses any other address. Carries: [WHAT THE NARRATOR IS SENT]
This website’s contact form The website, not the product. Only if you fill it in and send it. The person who built ThruLine, through [CONTACT FORM HANDLER] Carries what you type: name, email, what you build with, message. Privacy

03 · What it runs

What ThruLine runs

Check it again re-runs a check from the interface, on the version in front of you. It runs only the checks listed for the Change — the feature, fix or refactor you are deciding whether to accept.

  1. Asks once per project.

    Nothing runs in a project until you allow checks there. Taking that back is one button.

  2. Installs nothing. Does not touch the network.

    A program it needs and cannot find ends as Tool not found, with nothing installed.

  3. Only when you press the button.

    Only the checks the Change lists, in its own project folder.

  4. Never elevates.

    It runs as you, with your own permissions and never administrator rights. The exact command is under Technical.

thruline ui · checkout-web · Fix double-applied discount on checkout total · demo record

Check it again

Close
What will run
This project's tests.
Where
In ~/checkout-web, with the programs ThruLine was started with.
What it can tell you
Whether the tests pass on the files as they are now, for version e71c5b0.
What it cannot tell you
That the change does what was asked, or anything the tests don't cover. A run that selects no tests proves nothing.

Allow checks in this project

ThruLine runs only the checks this Change lists, in this project folder, and only when you press the button. You are asked once for this project.

It does not install anything and does not touch the network.

Allow and run the check Cancelling stops it and everything it started. It settles nothing.
Technical
Command
cargo test
What to notice: the sheet asks once for the whole project, says what a run cannot tell you, and writes its promise on the sheet itself.

Every run ends in one of six outcomes, said in words: Passed · Failed · Ran, checked nothing (not a pass) · Cancelled by you · Interrupted · Tool not found. Only a pass reads as a pass. In this version the button starts one check, cargo test; any other test command is recorded when you run it through thruline check -- <command>.

The six stages of a Change, from Define to Approve

04 · The record

Why you can trust the record

Every fact on screen traces to a line in your own logs. Three properties keep that trail honest.

  • Append-only.

    The rows that record what happened — events, runs, decisions — are only ever added: the database itself refuses an edit or a delete of them. What is derived from them, like the graph, is rebuilt from them.

  • Hash-chained.

    Each entry carries a fingerprint (a hash) of the one before, so a changed byte breaks the chain.

  • Signed receipts.

    A receipt — a signed record of exactly what ran — comes in a DSSE envelope, a standard wrapper holding a statement and the signature over it. The statement is in-toto: an open format for saying what ran, on what, and how it ended.

receipt.json real output · synthetic project · sample key

DSSE envelope · payloadType application/vnd.in-toto+json

_type
https://in-toto.io/Statement/v1
predicateType
https://thrulinehq.com/attestation/execution-check/v0.2
subject
gitTree 900ad6fa6e8a96db17eae3e2120d42f65d752afc
kind
accepted_requirements
state
verified
check
pytest · argv python3 -m pytest -q
run
acceptance-evt_01M1WRC89HSS5XM6J4R302Z3QD
exit_code
0
counts
passed 2 · failed 0 · skipped 0 · total 2
chain_head
sha256:a2d1ecf0f906d3fc92d2c337180d4c04f83f6249fe7294e1807cbd17449493f8
contract
sha256:a77d28622af5c4acbaa11990af853e0d64650274a59c5d0b48e5fcadf09c290d
producer
sha256:0655f10ef05df654b88672604b3f60f42aaccaa42322851808fa7263528d6b4b
signature
keyid sha256:e0f549f57ffdda1592ba0e7fdbf1b30f3aeec1efb8dbb6a1015442745a411358
envelope sha256
43c845f11e984c56a5180699904317da46a186bb9ff1a9c32dd0208dd45feeef

Check it yourself, offline

thruline verify-receipt receipt.json --key signing.pub --offline --json

It checks the signature on this machine, against the public key you hand it — the half of a key pair that can check a signature but cannot make one. Nothing is looked up online.

Real output of ThruLine’s qualification run on a synthetic Python test project, signed with a sample key that is not a production identity.

See where a receipt sits in a chain: A file changed after the run

05 · Approval

What approval does, and does not do

Approval is a person’s decision about one version, written down. That is all it is.

It is also the one thing a licence unlocks. Recording, every read, re-checks, withdrawing an approval, stopping a run, linking evidence and exporting your own records need none. How the licence works

It does

  • Names exactly one version.

    Approvede71c5b0
  • Writes one file into your project.

    .thruline/decisions/<version>.json
  • Refuses a moved version.

    Approval names one version and refuses a moved one. It never carries over to a later commit.

  • Records a withdrawal, too.

    Taking an approval back is its own recorded event. Nothing is edited; nothing is deleted.

It does not

  • Merge.
  • Push.
  • Deploy.
  • Tell the agent anything.

Approving records; it does not merge. A person decides; ThruLine never approves for you.

06 · Storage

What it keeps, as a real number

ThruLine says, in plain words and a real number, what it is storing on this machine.

thruline ui · status bar
checkout-web · 4 sessions · recording ThruLine is keeping [n] GB of records on this machine see what
What to notice: the size is every file in ThruLine’s folder, added up, and “see what” shows what it is made of.

Removing what you no longer need, told first what would be lost, arrives in a later version. Nothing in this version removes any of it.