Carrier
Workspaces

Team-Claude View

What this is

Team-Claude View lets you bring your team's Claude Code activity into Carrier. Once you set up a workspace, you can browse the Claude Code session transcripts and the shared memory that your team produces while working in a repository — all from inside Carrier, without digging through everyone's local ~/.claude directories.

A workspace is tied to a single repository. There are two ways to get a repo's Claude Code data into Carrier, and you pick one when you create the workspace:

Both modes end up in the same place: a workspace page in Carrier showing sessions and memory. The rest of this guide walks through each mode, compares them, and covers privacy and common questions.

Mode A — GitHub-linked

In GitHub-linked mode, Carrier holds a personal access token (PAT) for your repository and uses it to keep a private mirror of the shared Claude Code data up to date.

1. Create a fine-grained personal access token

Carrier needs read access to one repository's contents. Create a token at github.com/settings/personal-access-tokens/new and configure it like this:

Copy the token when GitHub shows it — you won't be able to see it again afterward.

Classic vs fine-grained PATs. A classic PAT (with the repo scope) also works, and Carrier will accept it. But because a classic token typically grants far broader access than Carrier needs, the workspace page shows an advisory banner recommending you switch to a fine-grained token. Fine-grained tokens let you limit access to exactly one repo with read-only contents, which is what we recommend.

2. Link the repo in Carrier

  1. From the Workspaces page, click Link a repo.
  2. Choose the GitHub tab.
  3. Fill in a name for the workspace, the repository URL (e.g. https://github.com/your-org/your-repo), and paste the PAT you just created.
  4. Click Create.

3. What the first sync does

When you create the workspace, Carrier immediately clones the repository and fetches its claude-team-share branch — the branch your team uses to publish shared Claude Code data. From that branch it reads the sessions/ and memory/ directories into a private server-side mirror.

If the claude-team-share branch doesn't exist yet, that's fine: the workspace is created and simply shows an empty state until the branch appears and the next sync picks it up. Nothing is broken — there's just nothing to show.

4. Staying up to date

Carrier polls the repository roughly every 30 seconds and re-syncs github-mode workspaces whose data has gone stale, so the page updates on its own as your team pushes new sessions and memory. If you want an immediate refresh, use the Re-sync now button on the workspace page.

Troubleshooting (Mode A)

Mode B — Manual upload

In manual mode, there's no GitHub connection. Instead, each developer runs a small Python client that bundles their local Claude Code cache and uploads it to Carrier with an API key.

1. Save the API key (shown once)

When you create a manual-mode workspace, Carrier displays an API key exactly once, right after creation. Copy and save it now — it is never recoverable. If you lose it, you'll need to recreate the workspace to get a new one (see FAQ).

The creation screen also shows the exact upload URL and a ready-to-paste configure command for that workspace.

2. Configure each machine once

On every machine that should contribute data, run the configure command once. It saves the upload URL and API key locally so subsequent syncs don't need them:

python3 scripts/team-claude-client/carrier_configure.py --url <upload-url> --key <api-key>

Use the exact --url and --key values shown in the create modal.

3. Sync

After configuring, push the current machine's Claude Code data with:

python3 scripts/team-claude-client/carrier_sync.py

The client packages your local sessions/ and memory/ directories into a gzip tarball and uploads it. On success it prints how many sessions and memory entries were uploaded.

4. Automate with a SessionEnd hook (recommended)

Running the sync by hand is easy to forget. Claude Code supports hooks in .claude/settings.json, including a SessionEnd hook that fires when a session ends. Wire the sync script in so every finished session is uploaded automatically:

{
  "hooks": {
    "SessionEnd": [
      {
        "hooks": [
          {
            "type": "command",
            "command": "python3 scripts/team-claude-client/carrier_sync.py"
          }
        ]
      }
    ]
  }
}

Adjust the path to the script if your repo lays it out differently. With this in place, each developer's machine uploads its latest data the moment a Claude Code session ends.

Troubleshooting (Mode B)

Comparing the modes

GitHub-linked (Mode A) Manual upload (Mode B)
Auth Fine-grained PAT (Contents: Read), encrypted at rest API key (shown once, bcrypt-hashed)
Cold-start Create token, paste into the GitHub tab Create workspace, save key, run carrier_configure.py per machine
Updates Automatic — Carrier polls ~every 30s; Re-sync now for immediate Run carrier_sync.py (or a SessionEnd hook) after each session
Works without GitHub No — requires a GitHub repo and the claude-team-share branch Yes — no GitHub repo needed
Hosting Data flows from GitHub to Carrier Data flows directly from your machines to Carrier
Storage Private server-side mirror of the claude-team-share branch Server-side mirror of the uploaded tarballs

Privacy & security

FAQ

How do multiple machines work together? In manual mode, every machine that runs the client contributes its own cache to the same workspace. Carrier derives the workspace slug from the repo-root basename (the folder name of the repository root), so all checkouts of the same repository — regardless of where each developer cloned it — map to the same workspace. Each machine's contribution is additive.

Can I share privately, without GitHub? Yes — that's exactly what Manual mode is for. The data travels straight from your developers' machines to Carrier over the API, with no GitHub repository in the loop.

How do I rotate a GitHub PAT? Create a new fine-grained token (see Mode A, step 1) and either re-link the repo or update the token on the existing workspace. The old token can then be revoked on GitHub.

How do I regenerate a manual-mode API key? There is currently no in-place regenerate. The current path is to delete the workspace and recreate it, which issues a fresh key (shown once). Then reconfigure each machine with carrier_configure.py using the new key.

What gets deleted when I remove a workspace? Its server-side mirror of sessions and memory is deleted. For github-mode workspaces, the encrypted PAT is deleted as well. After removal there is nothing left server-side for that workspace.