Skip to content
Trama

Install the core

What the command does, what you can change about it, and how to take the core off a machine. Checked against the published installer and the 0.5.0 code.

curl -fsSL https://downloads.trama.sh/bootstrap.sh | sh

What the command does, in order

  1. Checks the system: Linux or macOS, x86_64 or arm64. Anything else is refused by name, before anything is downloaded.
  2. Checks the machine has curl or wget, and minisign. Each one missing is refused with the command that installs it.
  3. Shows the public key it carries inside it. Compare it with the one on the home page, which reaches you by another route.
  4. Downloads install.sh and its signature, and checks it. A signature that doesn't verify stops everything, with no retry.
  5. Downloads tramad for your platform and its signature, and checks it. Up to here nothing has been written outside a temporary folder, which is deleted on every exit — a refusal included.
  6. Puts the binary at ~/.local/bin/tramad and the licence text beside it, as tramad.LICENSE.
  7. Registers the core as a user service — systemd on Linux, launchd on macOS — and only says it installed once it has seen the service running.
  8. If ~/.local/bin isn't on your PATH, prints the line that puts it there — it doesn't edit your ~/.profile for you. It never asks for a password.

Every refusal has two lines: what's wrong, and what to do (fix). A signature that doesn't verify isn't a download glitch to retry: stop and tell us, with the version and the platform.

Options

Three environment variables and one option. With none of them, the installer puts the latest version in ~/.local/bin.

NameDefaultWhat it changes
TRAMA_VERSIONlatestA published version, such as 0.5.0, instead of the latest.
TRAMA_PREFIX~/.local/binWhere the binary and the licence go. The folder is created if it doesn't exist.
TRAMA_FORCEnoWith yes, replaces a tramad already at the destination that didn't come from a published release — one built from source, say. Without it, the installer stops rather than overwrite, because what was there can't be brought back.
--work-root <dir>work, inside the core's data folderWhere the core clones its projects' repositories. See below.

Variables go before sh; the option goes after sh -s --:

curl -fsSL https://downloads.trama.sh/bootstrap.sh | TRAMA_VERSION=0.5.0 shcurl -fsSL https://downloads.trama.sh/bootstrap.sh | sh -s -- --work-root /srv/trama/work

Where the core clones repositories

On a server you usually want the repositories on a data disk, or in a folder the deploy user owns. The core checks the folder before it registers the service, and stops, naming the folder and the reason, if it:

  • isn't an absolute path;
  • can't be created, or is a file;
  • can't be written to — the core writes a file there and removes it, because permissions say nothing about a full disk or a read-only mount;
  • is inside the core's credentials or configuration folder.

Each project gets its own copy at <dir>/<client>/<project>-<hash>. The hash comes from the project's identity, so two projects with the same name never share a copy. An option the installer doesn't know is refused, not ignored.

After installing

With ~/.local/bin on your PATH. Without it, use the full path, ~/.local/bin/tramad.

tramad health
The core's state, in the shape the panel reads.
tramad service status
Whether the service is installed, running, or can't be told — which is a third answer, not a silence.
tramad service log --lines 200
The last lines of the log, saying where they came from.
tramad service restart
Stops and starts it again. There are also stop and start.

The install schedules no backup. tramad backup run makes one now, and tramad backup schedule prints this machine's schedule for you to install; automatic backups start once it is installed.

Remember what the core needs to work, beyond what the installer checks: Claude Code signed in on the machine and, on Linux, bubblewrap. For the service to keep running with no session open on Linux, an administrator has to run loginctl enable-linger for your user.

Uninstalling

The service first, which the core itself knows how to remove — it stops the process and deletes the registration (the systemd unit or the launchd plist). Then the binary and the licence:

tramad service uninstallrm ~/.local/bin/tramad ~/.local/bin/tramad.LICENSE

What stays

The core's data isn't deleted: the database, the credentials, the deciders, any backups and — without --work-root — the repository copies. In the default places:

Linux

  • ~/.local/share/trama
  • ~/.config/trama
  • ~/.local/state/trama
  • ~/.cache/trama

macOS

  • ~/Library/Application Support/trama
  • ~/Library/Logs/trama
  • ~/Library/Caches/trama

On Linux, XDG_DATA_HOME, XDG_CONFIG_HOME and XDG_STATE_HOME move these, when set. With --work-root, the copies are in the folder you chose.

Deleting these folders deletes the database, the credentials and the backups, for good. A repository copy may hold work no turn delivered: look before you delete.

Updating

Don't use tramad update on 0.5.0, even though it shows in tramad --help: the published binary shipped without the key it checks a new version with, and it refuses before replacing anything. It isn't a fault in your install. The update path is being fixed for the next version, and goes here once it has been proven on a machine.

What's in 0.5.0

The version the command installs today. From the release notes, for the people using it.

One core, many projects
Each project with its own board, repository, agents, schedules and client. A core with the old configuration keeps reading it as it is.
An entry column
A project can name the column that admits work, and only the cards a person moved there are worked. Every card left out says why.
Where to clone is your call
--work-root at install, and each project with its own copy.
Schedules and loops per client
Set once, they apply to all of the client's projects.
One ceiling for every task
The number of tasks at once counts every kind of turn, and the panel can set it. Lowering it never cuts short what is already running.
A signed prompt
An agent's prompt can be text, signed with the agent, and the core only runs a turn with the text a decider signed.
Subagents with their own model
A policy per agent — Sonnet writes and Opus reviews, for example.
The model is checked when signed
A model that isn't the agent's provider's is refused there and then, not when a turn runs.
Loops pause and resume
From where they stopped, on the same branch, with everything they had spent and done.
A credential per site
Two Jira sites, or a self-hosted GitLab beside gitlab.com, on one core.
The delivery opens the merge request
The delivery opens the commit's merge request, and the card's comment carries the link. It never decides the verdict: the build does.
A board in Portuguese
The comments the core leaves on a card come out in Portuguese when the project asks; otherwise in English, as before.
Active sprint and cycle
A Jira board can be worked from its active sprints only, and a Linear one from its active cycle.

Fixed

  • Jira Cloud is read again: Atlassian removed the search the core used.
  • GitHub, GitLab and Linear boards longer than one page are read up to Jira's cap, a thousand cards, and say when they stop there.
  • The core no longer picks up again, every cycle, a card waiting on a person's answer or approval.
  • A card that reached a build verdict gets a comment saying which.
  • On macOS, a turn's output is no longer held open by another process the core started at the same moment.