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
- Checks the system: Linux or macOS, x86_64 or arm64. Anything else is refused by name, before anything is downloaded.
- Checks the machine has curl or wget, and minisign. Each one missing is refused with the command that installs it.
- Shows the public key it carries inside it. Compare it with the one on the home page, which reaches you by another route.
- Downloads install.sh and its signature, and checks it. A signature that doesn't verify stops everything, with no retry.
- 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.
- Puts the binary at ~/.local/bin/tramad and the licence text beside it, as tramad.LICENSE.
- 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.
- 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.
| Name | Default | What it changes |
|---|---|---|
TRAMA_VERSION | latest | A published version, such as 0.5.0, instead of the latest. |
TRAMA_PREFIX | ~/.local/bin | Where the binary and the licence go. The folder is created if it doesn't exist. |
TRAMA_FORCE | no | With 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 folder | Where 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.