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:

PlatformFileSigned 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:

PlatformState 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, then trace-commons-contributor daemon uninstall to 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-AppxPackage takes 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.