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
| 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.
-
Asks once per project.
Nothing runs in a project until you allow checks there. Taking that back is one button.
-
Installs nothing. Does not touch the network.
A program it needs and cannot find ends as Tool not found, with nothing installed.
-
Only when you press the button.
Only the checks the Change lists, in its own project folder.
-
Never elevates.
It runs as you, with your own permissions and never administrator rights. The exact command is under Technical.
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>.
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.
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.
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.