Install Trace Commons
Everything here runs on your own machine. Nothing is sent anywhere until
you run submit, and submit --dry-run shows you
exactly what would go before anything does.
1. Install it
Two ways in, and on all three platforms the app is the shorter one. It does the same work in a window: it watches for new sessions, shows you what each would send, and waits for you to approve it. The CLI does the same from a terminal and remains the complete story if you would rather not run a background application at all.
The desktop app
On macOS:
brew tap TraceCommons/tap
brew trust tracecommons/tap
brew install --cask trace-commons
Or take TraceCommons-0.4.6.dmg
directly. It is a universal build, so it runs on both Apple silicon and
Intel, and it is notarized and stapled — it opens without a Gatekeeper
prompt even offline.
On Windows:
Add-AppxPackage -AppInstallerFile https://storage.googleapis.com/tracecommons-flatpak/windows/TraceCommons.appinstaller
That installs the signed MSIX and, unlike the zip below, leaves Windows
responsible for keeping it current: the .appinstaller it was
installed from is checked on launch, at most once every eight hours, and a
newer version is fetched in the background. The package is
Iqlusion.TraceCommons, published as
CN=Iqlusion Inc — Windows will show you that publisher before
it installs anything, and it is worth reading rather than clicking past.
Or unzip it and keep a folder instead, which is the same application with no update mechanism attached:
Expand-Archive trace-commons-app-windows-x86_64-0.4.6.zip -DestinationPath .
.\TraceCommons-0.4.6\TraceCommons.exe
Take trace-commons-app-windows-x86_64-0.4.6.zip
and unzip it anywhere. There is nothing to install first: the .NET runtime
and the Windows App SDK are bundled inside, so it is a folder you keep
rather than something that writes into the system. TraceCommons.exe
is Authenticode-signed by Iqlusion Inc and timestamped, and the same
Get-AuthenticodeSignature check shown below works on it —
check the subject, not just that a signature exists.
Both assets sit on the release too, the MSIX as
TraceCommons.App_0.4.6.0_x64.msix.
Installing that file directly works and gets you no updates: the update
address lives in the .appinstaller, so a bare MSIX is the zip
with extra steps. Note also that the release carries a second Windows zip,
trace-commons-windows-x86_64-0.4.6.zip — that one is
the command-line contributor, not this app, and the names differ by one
word.
As of 0.3.0 the Windows app submits. It enrols you, takes your scopes, queues what it finds, opens the same preview the other two shells do, and contributes when you approve — with an undo window until the watcher's next sweep. Approving is deliberately awkward in one specific way: the Contribute button is inert until the transcript has actually been on screen and you have ticked the acknowledgement by hand, and there is no approve control on a queue row, because approving from the row is approving without looking. Nothing reachable from the tray icon or a notification approves or sends anything either.
On Linux, as a flatpak:
flatpak install --from \
https://storage.googleapis.com/tracecommons-flatpak/ai.tracecommons.Contributor.flatpakref
The OSTree repo behind that is GPG-signed and flatpak verifies it as part
of the install. The app is confined: it asks for read-only access to
~/.claude/projects and ~/.codex/sessions and
nothing wider, which you can check with
flatpak info --show-permissions ai.tracecommons.Contributor.
All three now carry the whole path on their own: each enrols you — an invite by paste or by clicking the link — lets you choose your consent scopes, previews what a session would send, submits it when you approve, and shows you the receipt. None of them needs the CLI at any step, so the steps below are an alternative rather than a requirement on any platform. Windows is the newest of the three and is still missing pieces around the edges: bulk withdrawal is absent by design (a bulk call cannot report what happened to each trace, and reporting a generic “withdrawn” is exactly what the withdrawal contract forbids — withdraw per row instead), and the watcher knobs, the connection section and most of the tray menu's vocabulary are not drawn yet.
Or the contributor CLI
On macOS or Linux, one command:
curl -fsSL https://raw.githubusercontent.com/TraceCommons/trace-commons-server/main/scripts/install.sh -o install.sh
sh install.sh
It works out which build you need, checks it, and puts it in
~/.local/bin. No sudo, and nothing outside your
home directory. The download-then-run form is written out rather than piped
into sh so you can read the script first, which we would rather
you did — it is under 200 lines.
The script refuses to install anything it cannot verify: the published checksum has to match, and on macOS the signature has to be valid and name our identity. There is no flag to skip that. If a check fails it tells you which one and installs nothing.
Or on macOS, from our Homebrew tap:
brew tap TraceCommons/tap
brew trust tracecommons/tap
brew install trace-commons-contributor brew trust is not optional. Homebrew refuses to load a formula
from a third-party tap until you say you trust it, and without it the
install stops at “Refusing to load formula … from untrusted tap”.
On Windows, in PowerShell:
irm https://raw.githubusercontent.com/TraceCommons/trace-commons-server/main/scripts/install.ps1 -OutFile install.ps1
.\install.ps1
Same policy as the unix installer: it verifies the published checksum and
requires the Authenticode signature to be valid and name us, with no
flag to skip either, and installs to
%LOCALAPPDATA%\Programs\TraceCommons without needing
administrator rights. Reopen your terminal afterwards so the updated
PATH applies.
Or do it by hand on Windows
$exe = "trace-commons-contributor-x86_64-pc-windows-msvc.exe"
$base = "https://github.com/TraceCommons/trace-commons-server/releases/download/contributor-v0.4.6"
Invoke-WebRequest "$base/$exe" -OutFile $exe
Invoke-WebRequest "$base/$exe.sha256" -OutFile "$exe.sha256"
# The published checksum must match.
$want = ((Get-Content "$exe.sha256") -split '\s+')[0]
$got = (Get-FileHash $exe -Algorithm SHA256).Hash
if ($got -ne $want) { throw "checksum mismatch: got $got, published $want" }
# The signature must be valid AND ours.
$sig = Get-AuthenticodeSignature $exe
if ($sig.Status -ne "Valid") { throw "signature not valid: $($sig.StatusMessage)" }
if ($sig.SignerCertificate.Subject -notmatch "O=Iqlusion Inc") {
throw "unexpected signer: $($sig.SignerCertificate.Subject)"
}
# Somewhere on your PATH, under your own profile -- no admin rights needed.
$dir = "$env:LOCALAPPDATA\Programs\TraceCommons"
New-Item -ItemType Directory -Force $dir | Out-Null
Move-Item -Force $exe "$dir\trace-commons-contributor.exe"
[Environment]::SetEnvironmentVariable(
"Path", [Environment]::GetEnvironmentVariable("Path", "User") + ";$dir", "User") Get-AuthenticodeSignature is built into Windows PowerShell —
unlike signtool, it needs no Visual Studio or SDK install.
Checking the subject and not merely Status -eq "Valid" is the
part that matters: a validly signed binary from somebody else would pass
the status check on its own.
Or take a binary straight from contributor-v0.4.6, the current CLI release:
| Platform | File | Signed by |
|---|---|---|
| macOS, Apple silicon | …-aarch64-apple-darwin | Developer ID, notarized |
| macOS, Intel | …-x86_64-apple-darwin | Developer ID, notarized |
| Windows, x86_64 | …-x86_64-pc-windows-msvc.exe | Authenticode, timestamped |
| Linux, x86_64 | …-x86_64-unknown-linux-gnu | not signed |
On macOS and Linux a downloaded binary needs chmod +x and
somewhere on your PATH; on Windows use the PowerShell steps
above. A .sha256 sits beside each file if you want to check the
download arrived intact.
Confirming who built it
The signature is checkable offline, against Apple's and Microsoft's roots rather than against us — so it still means something if the file was mirrored, re-hosted, or served by someone other than GitHub.
# macOS
codesign -dvvv trace-commons-contributor-aarch64-apple-darwin 2>&1 | grep Authority
# Authority=Developer ID Application: Iqlusion Inc (KXSWJN7WY8)
# Authority=Developer ID Certification Authority
# Authority=Apple Root CA
# Windows, in PowerShell -- no SDK needed
$sig = Get-AuthenticodeSignature trace-commons-contributor-x86_64-pc-windows-msvc.exe
$sig.Status # Valid
$sig.SignerCertificate.Subject # CN=Iqlusion Inc, O=Iqlusion Inc, L=Santa Clara, S=California, C=US The Windows certificate is deliberately short-lived — the one that signed 0.1.0 was valid for three days — because Azure Trusted Signing issues a fresh certificate per signing job. The signature stays verifiable long after that window through its RFC3161 timestamp, which records that the signing happened while the certificate was live. An expiry date in the past is expected here and is not a sign of anything wrong.
The Linux binary carries no signature, so the checksum is the only check available for it. The Linux desktop app is distributed as a GPG-signed flatpak instead.
2. Enrol
In the macOS, Linux and Windows apps alike this step is the second onboarding screen: paste the invite there, or click the link and it opens the app. Steps 3 to 5 below have their equivalents in all three windows — the preview is step 3, approving is step 4, and claiming a handle is on the profile panel. What follows is the CLI form of the same sequence.
The pilot is invite-only. With an invite link from the operator:
trace-commons-contributor login --invite <url> \
--scopes debugging_evaluation,public_attribution
Scopes are yours to choose. public_attribution is what lets you
claim a handle and appear on the leaderboard;
leave it off and you contribute unlisted. Everything else the instance
permits is listed when you run login interactively.
3. See what would be sent
trace-commons-contributor submit --dry-run --since 7d
This discovers local Claude Code and Codex sessions, redacts them, and
reports what each envelope would contain — without uploading. Use
--project <path> to scope discovery to one repository
rather than everything you have worked on this week. Read the list before
you submit: it is the point at which you decide, and the only one.
4. Submit
trace-commons-contributor submit --since 7d
Each session is judged on novelty and substance. Not everything is
accepted, and an accepted submission earns credit only if it clears the
scoring floor — status shows you what happened to each one.
5. Claim a handle
trace-commons-contributor profile --handle <name> --no-bio
Setting a handle replaces your whole public profile, so you have to say
whether you want a bio (--bio <text>) or not
(--no-bio). profile --withdraw removes your public
attribution; the row goes at the next snapshot.
Building from source instead
Still supported, and necessary on any platform not in the table above — Linux on arm64, for instance. It needs a Rust toolchain.
git clone https://github.com/TraceCommons/trace-commons-server
cd trace-commons-server
cargo build --release --bin trace-commons-contributor
./target/release/trace-commons-contributor --help Uninstalling
Two separate things come off: the local state — device key,
config, receipts, the daemon's queue and history — and the
installed program. Start with the state, because
logout also stops a running daemon before it wipes the
credentials that daemon uploads with:
trace-commons-contributor logout
Uninstalling is not withdrawal. Traces you have already submitted stay on
the server; daemon withdraw <submission-id>, or
--all-quarantined, is what removes them — and it needs the
account session, so do any withdrawing before you log out.
logout empties the state directory but leaves the directory
itself. Remove it to finish the job:
| Platform | State directory |
|---|---|
| Linux | ~/.config/trace-commons |
| macOS | ~/Library/Application Support/trace-commons |
| Windows | %LOCALAPPDATA%\trace-commons (CLI and app share it) |
| Linux flatpak app | ~/.var/app/ai.tracecommons.Contributor/config/trace-commons |
If you set TRACE_COMMONS_CONTRIBUTOR_DIR, that path wins over
all of these.
Then remove the program itself, by however you installed it:
# CLI, install.sh
rm ~/.local/bin/trace-commons-contributor # or $TC_INSTALL_DIR, or --dir
# CLI, Homebrew
brew uninstall trace-commons-contributor
# Desktop app, Homebrew cask (macOS)
brew uninstall --cask trace-commons
# Desktop app, flatpak (Linux) -- --delete-data also removes ~/.var/app state
flatpak uninstall --delete-data ai.tracecommons.Contributor
# and, if you want the tap gone too
brew untap TraceCommons/tap # CLI, install.ps1
Remove-Item -Recurse "$env:LOCALAPPDATA\Programs\TraceCommons"
# install.ps1 appended that directory to your user PATH; take it back out
$p = [Environment]::GetEnvironmentVariable('Path','User') -split ';' |
Where-Object { $_.TrimEnd('\') -ine "$env:LOCALAPPDATA\Programs\TraceCommons" }
[Environment]::SetEnvironmentVariable('Path', ($p -join ';'), 'User')
# Desktop app, MSIX / .appinstaller -- also ends the update subscription
Get-AppxPackage Iqlusion.TraceCommons | Remove-AppxPackage Autostart registrations are the part an uninstall is easiest to leave behind:
- Linux, CLI daemon.
systemctl --user disable --now trace-commons-contributor.service, thentrace-commons-contributor daemon uninstallto remove the unit file. - macOS app. Registered through
SMAppService. Turn off “Run at login” in Settings before deleting the app, or clear the leftover entry in System Settings → General → Login Items. - Windows, MSIX app. A packaged startup task;
Remove-AppxPackagetakes it with the package. - Windows, portable app. The portable build uses the
per-user Run key instead, which deleting the folder does not touch:
Remove-ItemProperty -Path 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Run' -Name 'Trace Commons'.
The macOS app itself is TraceCommons.app in
/Applications when it came from the DMG rather than the cask;
quit it, then move it to the Trash. The Windows portable build is just the
unzipped folder — delete it.
What leaves your machine
A redacted envelope, and nothing else. Secret scrubbing runs locally before anything is sent and covers message text, tool calls, tool results and structured payloads alike — raw content is never sent out to be scrubbed elsewhere. The data policy sets out what is stored and what the aggregate figures do and do not protect.