Download

Interlinked docs: the CLI, MCP, webhooks and the REST API

✓Everything the account page does, from a terminal, signed in as yousession · not a key
01 · Run itSign in once
ifile auth login
# On a machine with a browser:
ifile auth login
#   Code:  WDJB-MJHT
#   Open:  https://www.interlinkedfiles.com/device
#   Waiting... approved as [email protected]

# Headless, on a build box:
ifile auth login [email protected] --password "$ILK_PASS"

# Several accounts stay on the shelf; switch between them:
ifile auth accounts
ifile auth switch work

The device grant is RFC 8628, so the machine typing the command never sees the password: it prints a short code, you approve it on any device already signed in, and the token lands on the shelf. Every login is kept, so a work address and a personal one can both stay signed in and `switch` changes which one this machine acts as. The CLI and the desktop app on the same machine follow that switch together.

There is nothing to configure after this. Every command below uses the token on the shelf, so a build box that has run ifile auth login once needs no environment variable and no key pasted into CI.

02 · Run itInstall it
Install it

bun add -g @interlinked/cli

or npm install -g @interlinked/cli, or take the desktop app, which carries the CLI.

One command in detail

ifile <command> --help

And ifile on its own prints this whole reference in the terminal, alongside sign-in, the MCP server and the search verbs.

Standing in a project

ifile status

Naming the project is optional for most commands: run them inside its folder and that is the one they mean.

03 · Run itKeys
ifile auth keys
ifile auth keys --team tm_3kQ9vX2pL7
#   NAME              SCOPES                         EXPIRES
#   acme-review-bot   project:read status:write      2026-12-16

ifile auth keys new ci-reader --team tm_3kQ9vX2pL7 --can project:read --days 365
#   ilk_live_7Kq2mZ0aXvT1_9pXsWqB3nK7vLmF2dRj8HcYzQ4tE6u
#   THIS IS THE ONLY TIME IT IS SHOWN.

ifile auth keys rotate 7Kq2mZ0aXvT1
ifile auth keys revoke 7Kq2mZ0aXvT1

A key is made at one place: `--org` (the organization's people and bill), `--team <id>` (the team's projects, for its admins) or `--project <id>` (that one project, for whoever manages it). `--can` takes the scopes comma separated, `--permission` is read or write for a team or project key, and `--days` defaults to 90 and caps at 365. `rotate` gives a key a new secret, shown once. A revoked key stops working on its next request, not at the end of a cache window.

The fastest of the five ways to get a key, and the only one that also lists the keys you already have from the same place you make them.

04 · Run itWebhooks
ifile auth webhooks
ifile auth webhooks --project 8c1d4f2ab77e4d1e9f03c6a1b5d82e40
#   No webhooks on this project.

ifile auth webhooks add https://acme.example/hooks/interlinked \
  --project 8c1d4f2ab77e4d1e9f03c6a1b5d82e40 \
  --events version.pushed --format interlinked
#   Signing secret: whsec_... (shown once)

ifile auth webhooks deliveries ep_9f0c2a
#   SENT                 EVENT            YOU ANSWERED
#   2026-09-18 11:04:02  version.pushed   200
#   2026-09-18 10:12:55  version.pushed   503  retry in 4m

These call `/api/webhooks`, which is gated by your website session rather than by a key, so a person is never asked to mint a key just to point an endpoint at their own service. `--format` takes `interlinked`, `discord` or `slack`; only `interlinked` carries a signature, because the other two are formatters for one named target. Leave `--events` off and the endpoint gets every event, including ones added later. If your firewall lets in a known list of addresses only, add `--fixed-address` (`fixed_address: true` in the API): that endpoint's deliveries are then sent from 83.228.246.38 (2001:1600:18:201::f9 for a receiver with no IPv4 address) and from nowhere else.

Everything the account page does for webhooks, without the account page. The delivery log is the useful one: it is what you read when a customer says they never got the event.

05 · Run itEvery hosting command

Signing in

Once per machine. Everything below it uses the token that lands on the shelf, so there is no key in an environment variable anywhere.

Signing in: every command, with what it does
ifile auth loginApprove in a browser. Prints a short code, works on a headless box: RFC 8628, so the machine typing this never sees the password.
ifile auth login <email> --password PHeadless, for CI. No browser and no code to approve.
ifile auth create <email> [--name N] [--password P]Make a NEW account and sign this machine in, no browser. Generates a password if you do not give one.
ifile auth statusWho this machine is signed in as, and who else is stored on it.
ifile auth accountsEvery account stored here. Several logins live side by side.also ifile auth list
ifile auth switch <email>Act as another stored login. The CLI and the desktop app on this machine follow it together.
ifile auth logout [<email>] [--all]Forget the current login, a named one, or every one.
ifile auth email <address>Change the signed-in account's address.
ifile auth verify [<code>]Mail a six-digit code to the signed-in address, or confirm with it. A confirmed address hosts; an unconfirmed one does not.

Keys for other people's tools

The only thing on this page that crosses to the other door: a key is what somebody else authenticates with.

Keys for other people's tools: every command, with what it does
ifile auth keys --org | --team <id> | --project <id>One place's integration keys, with their scopes and expiry, to that place's admins. Never the secret.
ifile auth keys new <name> --org | --team <id> | --project <id> --can <scopes> [--permission read|write] [--days N]Make one at that place, owned by it. --days defaults to 90 and caps at 365. Printed ONCE and never again.
ifile auth keys rotate <id>A new secret for the same key, printed once; the old one stops working at once.
ifile auth keys revoke <id>Kill one. It stops working on its next request, not at the end of a cache window.

Webhooks

These call /api/webhooks with your session, so pointing an endpoint at your own service never asks you to mint a key first.

Webhooks: every command, with what it does
ifile auth webhooks --project <id>Every endpoint on that project, and whether it is failing.
ifile auth webhooks add <url> --project <id>Point one at your service. https only. --format interlinked | discord | slack, --events to narrow it, --fixed-address to send from our fixed addresses. Signing secret printed once.
ifile auth webhooks remove <id>Stop the deliveries. Answering 410 Gone from your side does the same thing.
ifile auth webhooks deliveries <id> [--since <date>]What was sent there, what came back, and when the retry is due. This is what you read when somebody says they never got the event. The history runs up to two minutes behind.
ifile auth webhooks test <id>Send one test event now. Answers at once with what your service said.
ifile auth webhooks redeliver <id> <event id>Send one recorded event there again, exactly as it was recorded.
ifile auth webhooks resend <id> --since <date>Send every recorded event since then again, oldest first.
ifile auth webhooks enable <id>Switch one back on after a 410 or five days of failing switched it off.

Apps

Linear and Jira: a save that names an issue is written onto it. A tracker is connected to a team, once, by its admins, or to one project; never to a person, so it goes on working when they leave.

Apps: every command, with what it does
ifile auth apps --team <id> | --project <id>What is connected there, whether it still is, and the workspace's team keys an issue is matched against.
ifile auth apps connect linear|jira --team <id> | --project <id>Prints the address to approve it at, in a browser, at the tracker's own consent screen.
ifile auth apps check <id>Does it still reach its workspace. Reads the workspace's team keys again.
ifile auth apps disconnect <id>Give the connection up. Saves stop being written to its issues.
ifile auth apps settings linear|jira --project <id> [--key ENG] [--off]A project's own: the one tracker team its saves belong to, or that it sends nothing. Its writers set it.

The MCP server

Wires the same verbs into the AI clients on this machine. Nineteen are known; it only touches the ones installed.

The MCP server: every command, with what it does
ifile mcp add [--dry-run]Register it with every AI client found here. --dry-run prints what it would change and writes nothing.
ifile mcp listWhat is connected, and where its config lives.
ifile mcp removeTake it back out of every client that has it.

Add --json to any of them for machine-readable output, and ifile <command> --help for one in detail. The other half of the CLI is sharing folders as versioned links, which is a different subject with its own reference: every sharing command, further down this tab.

06 · Run itEvery sharing command

All 83 of them, in 12 groups, and 30 aliases on top: the same list ifile commands prints in a terminal, generated from the CLI rather than typed here. Every one runs the same on Windows, macOS and Linux. These need no account and touch nothing hosted until you push.

Many agents, one project

Several agents, and the people with them, on one project at once. Every agent that connects through the MCP is told the same.

  1. 01Work apart, or together. Each agent on its own branch (ifile branch <project> new <name>), or everyone on main: a clash keeps both versions, and anyone settles it later.
  2. 02Look before you save. ifile since --mine before you start and before every save: what others landed that touches the files you changed and have not saved, so a clash shows before your save, not at the push. ifile since alone: everything since your last sync.
  3. 03Tag what you touch. An agent's tags go under ai and its own name by default. A tag is kept unless you give it a time: work in progress gets a short one (--expires 48h), knowledge none. --parent <person> when you act for one. Tags are the fastest shared memory: read ifile tags --parents before inventing a word.
  4. 04Hand off to a person. When unsure, tag the file needs-human (no time: a hand-off must not expire) and say why. The app and the web viewer show it as its own chip; ifile files --any-tag needs-human lists them.
  5. 05Say who did the work. Save with --by person when a person did the work and you only saved it. ifile log --session <id> lists what one conversation saved.

WHERE AM I, AND WHAT IS THERE

the five layers, plus this index

WHERE AM I, AND WHAT IS THERE: every command, with what it does
ifile commands [<command>]this list; with a name, that one command in detailalso ifile help
ifile spacesevery space, what is in none, and whether it follows your account
ifile listevery project and its folderalso ifile projects
ifile branch [<project>]its lines of work; add a name to start onealso ifile versions
ifile log [<project>] [<path>] [--by person|agent] [--session <id>]its saves, newest first; --by: an agent's or a person's; --session: the saves one agent session madealso ifile history, ifile saves, ifile commits, ifile filelog

STARTING A PROJECT

STARTING A PROJECT: every command, with what it does
ifile new [<name>]start an EMPTY project
ifile init <folder>start versions for a folder you already have; copies nothingalso ifile adopt
ifile collect <folder> <path>...make a project and move those paths into it
ifile duplicate [<project>] --to <folder>a whole second project, its history replayed into italso ifile mirror, ifile fork
ifile clone <link>take someone else's share in as your own projectalso ifile receive
ifile pull [<project>|<link>]a PROJECT (or the one you are in): same as sync. A LINK: copy it to a plain directory

SAVING, AND MOVING THROUGH HISTORY

git-shaped: a save is local until you push

SAVING, AND MOVING THROUGH HISTORY: every command, with what it does
ifile commit [<project>] -m "..."record a version of the folder as it standsalso ifile save
ifile status [<project>]what is changed and not in a version yet
ifile unsent [<project>]saves made and not pushed yet
ifile switch [<project>] <version>move onto another versionalso ifile checkout
ifile sync [<project>]bring down what the other side pushed; git pull, and `pull` works
ifile since [<project>] [--cursor <c>] [--mine] [--first editing,branch,author:<name>]what others landed since this copy last synced (saves, the files they changed, tags, superpositions), changing nothing on disk; --mine: only what touches your unsaved files; --cursor: since an earlier answer
ifile catchup [<project>]after a rewind, move to the newest save keeping your edits
ifile rewind [<project>] <version>put the WHOLE folder back to a versionalso ifile reset
ifile restore [<project>] [<path>]one file back, or a deleted project (30 days)also ifile restorefile
ifile merge [<project>] <version>merge that version into the one you are on (the project must be published); a file changed on both sides is kept in two versions, settled later with resolve
ifile resolve [<project>] mine|theirs|kept|other|both|file [<path>...]settle a superposition, any time later: keep one version, both as two files, or the file as it is now
ifile swap <path> [--to <name>|kept] [--beside] [--in <project>]swap which version of a superposed file sits at its path, on this machine only (never a save), or bring the other in beside it; no path lists what is in superposition

SHARING IT

the first three publish to the internet unless you pass --private

SHARING IT: every command, with what it does
ifile share [<folder>|<project>]folder in, link out, one step; a folder already versioned is published as it standsalso ifile quick-share, ifile quick, ifile quickshare
ifile push [<folder>]send your saves up (the project you are in, or one named); a project not yet in the cloud is published, a bare folder becomes a link
ifile publish [<project>]publish a project that already exists here: put it on our hosting and print its link
ifile connect [<project>]print the link that keeps two copies in sync
ifile visibility [<project>] public|org|private [--confirm <address>]change who can open it; opening it wider takes its address typed
ifile stop [<project>]take the link offline; files on disk untouched
ifile retract [<name>]the same, for a link made by push; no name means stop for the project you are in
ifile disconnect [<project>]keep it here, unbind the cloud copy (which KEEPS serving)
ifile republish [<project>] --yespublish again as a NEW cloud copy
ifile delete [<project>] --yesremove the cloud copy for everyone; restorable 30 days (--yes confirms it by its address)
ifile autopush [<project>] on|offon: every save also pushes

READING IT, WITHOUT CHANGING ANYTHING

READING IT, WITHOUT CHANGING ANYTHING: every command, with what it does
ifile files [<project>] [<path>]what is on disk, marking what will never be shared
ifile info [<project>]its links, published or not, and who can read themalso ifile remote
ifile diff [<project>] <path>what changed inside ONE file between two versions
ifile changed [<project>] <from> <to>which files changed between two versions
ifile show [<project>] <path> <commit>that file as it was, from the local historyalso ifile showat
ifile commitfiles [<project>] <revision>the files in one save you have not pulled yet
ifile commitfiles <project> <revision>the files in one save you have not pulled yet
ifile view [<project>]which folders this copy takes in

RULES AND ACCESS

RULES AND ACCESS: every command, with what it does
ifile people [<project>] [<person>] [--role read|write] [--branches all|a,b --history full|own|latest --download yes|no --people yes|no] [--team <name>]everyone with access, their rung and what each sees; set a guest's or a team's
ifile ignore [<project>]the never-share listalso ifile ignorerules
ifile viewrules [<project>]CHANGE which folders this copy takes in
ifile clean [<project>]delete what sits on disk OUTSIDE the view; --yes does it, without it a sized listalso ifile prune
ifile presetsthe preset names both rule lists accept
ifile subprojects [list|new|add|remove] [<project>] ...SUBPROJECTS: the projects placed inside this one's folders, each opened under its own access; one you cannot open is a closed, empty folder. For keys and private files (a subproject only your admins open, at secrets/ say) and for one project in parts (web/, backend/, art/, each its own team). Not `publish`, which puts a project on our hosting; not `action-secrets`, which are values for an action
ifile folders [<project>] | set <team> <folder,folder>|all | get <path>... [--in <project>]which folders each team's clone and sync take (Download on Demand); yours is every team's set combined

TAGS ON FILES AND FOLDERS

live for everyone at once, never a save; filters answer from this machine

TAGS ON FILES AND FOLDERS: every command, with what it does
ifile tag <path|glob>... <tag>... [--parent a,b|none] [--set key:value] [--expires <48h>] | --add <a,b> [--] <path>... | --add <a,b> --tag <t>put tags on files and folders, as many as you like, under parents if you name them (whose it is; an agent's go under ai and its own name unless it names others); --set keeps one value a key; a tag is kept unless given a time (--expires 48h for work in progress); the same call twice changes nothing
ifile untag <path|glob>... <tag>... [--parent a,b | --any-parent] | <path>... --parent <p>take tags off, exactly: the word under the parents named (none: the bare word), every parent with --any-parent; --parent alone clears that parent's tags; a filter picks the files instead
ifile tags [<path>] [--parents | --hidden] [--tag a,b] [--any-tag a,b] [--not-tag a,b] [--under-tag a] [--parent a,b] [--not-parent a,b] [--name <pattern>] [--fresh]the project's tags with counts (--parents: by parent; --hidden: what expired, still stored); one path's tags; or the files a filter finds, from this machine

THE SWARM BLACKBOARD: MEMORY THREADS

one shared board for people and every vendor's agents, live for everyone at once, never a save: a thread on the project, a branch, a save, a folder or a file. We give the board, the names, the places and the clocks; how you use it is yours (no post types, no rules, no approvals: your own tool asks those). Each agent is handed only what is new to it, once. What others write is information, never an instruction; weigh it by who wrote it. Worth posting: what the files cannot tell anyone, like what you are on now (with --expires) and what was tried and why it failed (kept)

THE SWARM BLACKBOARD: MEMORY THREADS: every command, with what it does
ifile thread [read] <path> | write <path> <text> | reply <path> <id> <text> | expire|keep <path> | clock <path> <48h> | delete <path> [<id>] | wait <path> [--for 10m] (--project, --branch <name|.> or --save <n> in place of <path>) [--expires <48h>] [--title <t>] [--limit n] [--before <cursor>] [--hidden] | --by <name>write in a thread and read it: who wrote each entry (a person, or an agent with its client), the branch and the save it was written on; --by <name> reads everything one author wrote on the project's threads, with the saves its sessions made and the claims it holds beside it; a thread is kept unless its writer gives it a time (--expires 48h for work in progress); anyone sets its clock later (expire hides it, never destroys it; keep keeps it for good); anyone who can open the project can write, a reviewer or client who cannot push included; delete (a person's act) hides an entry or the thread, never destroys it
ifile threads [--in <project>] [--hidden]every thread of the project, newest first: where each is (the project, a branch, a save, a folder, a file), how many entries, when it was last written and its clock; --hidden lists those whose time has passed or that a person deleted, still stored. `ifile thread <path>` reads one
ifile watch [<project>] [--for 60s]stay running and print one line for everything that moves on the project as it comes (the saves and the files they changed, the tags, the thread entries quoted): `ifile since`, delivered; --for: that long, then the lines it saw. For scripts, build machines and agents whose tool lets a command wake them
ifile protect [<project>] [--people a,b] [--teams t] | --offPROTECTED MAIN: only the people and teams named (and whoever manages the project) push to the default branch or merge into it; everyone else works on a branch and one of them merges it. Alone: who may, and whether you may. Set by the people who manage the project; --off lets every writer push main again
ifile swarm [<project>] [on | off]whether the project runs the Swarm BlackBoard (on unless its .interlinked/swarm says off): with on or off, writes that file, and the project's next save carries it to everyone (a person who manages the project, as the vault checks at the push). Off: no threads, claims, shared presence or board lines in since and the hooks' news, for everyone; a write is refused saying so; tags stay; on again, everything comes back, since nothing was destroyed
ifile linkcode [<project>] [--code <code> | --code-from-env VAR | --no-code] [--expires 14d | none] [--confirm <address>]A LINK WITH A CODE AND AN END DATE: the project's link opens without an account for whoever has the code (8 to 64 characters, a letter and a digit), until the date; past it the link says it has run out. The project is private to everyone else while it has a code; people on the project open it as before. A first code takes the project's address typed (--confirm), as opening it wider does. For a client or a contractor who will never sign up. Alone: what the link asks now. Set by the people who manage the project; --no-code takes the code and the date off
ifile claim <ticket> [--release] [--for 8h] [--in <project>]claim a ticket (ENG-123) on the project before working it: first wins, the second is told it is taken and by whom. An agent's claim is its session's, kept alive by its hooks while it works and released at its end (nothing renewing it, it lapses in 20 minutes); a person's lasts 8 hours unless --for says. The claimant has the final call; others write on its thread. --release lets it go
ifile claims [<project>]the project's live claims: each ticket, who holds it (a person, or an agent by its name and tool) and until when
ifile export [<project>] [--out <file>]write every tag and every thread of the project to one file, hidden ones included (beside the project's folder by default): the memory is not in the folder when someone walks away with it

ACTIONS

a job that runs when a save lands: a file in the project, .interlinked/actions/<name>.yml, its script beside it

ACTIONS: every command, with what it does
ifile runs [log <n>] [--in <project>] [--action <name>] [--branch <name>]what the project's actions ran, newest first: in flight and waiting now, then what each run was (ok, failed, nothing, expired), the machine, the seconds and the save it made; log <n>: that run's log as its machine reported it, every secret's value shown as ***
ifile runner [start | stop] [--in <project> | --team <team>] [--name <name>] [--once]this machine as a runner of actions: start switches it on for a project or a team and runs what is offered until stopped (--once: what is offered now, then ends); stop switches it off; alone, the machines switched on there. Nothing runs on a machine nobody switched on
ifile action-secrets [set <NAME> | unset <NAME>] [--in <project> | --team <team>]an action's secrets: named values a run is given as environment variables, only when its action names them under needs.secrets; set per project or per team, sealed, never read back (the list is names and dates). FILES only some people may see go in a subproject instead (`subprojects`)
ifile actions [validate | run <name> [name=value ...]] [--in <project>] [--branch <name>]the project's actions, each checked (a mistake is named with its line); validate: the same, failing when one is not valid; run: start one now on the current tip. runs-on says where: maker (the machine that pushed, the default, nothing rented), team, a runner's name, or hosted

WHO YOU WORK WITH

A person, B team, C organization: the organization pays, a team opens what is on its list

WHO YOU WORK WITH: every command, with what it does
ifile org [create|show|invite|join|rename|remove|leave|rejoin|offer|take|withdraw|delete|restore|policies|activity|move|moves|accept|decline|cancel|pull-back] ...your organizations and what is shared with you; bring people in; move a project (and its bill), offer one, answer an offer, pull one back; read who did what (activity)also ifile orgs
ifile team [create|show|add|drop|grant|revoke|guests|rename|delete] ...teams inside an organization, the projects each one opens, and whether they may have guestsalso ifile teams

PROJECT ADMIN

PROJECT ADMIN: every command, with what it does
ifile rename [<project>] <new name>rename it here; the folder keeps its name
ifile relocate [<project>] <folder>move its FOLDER somewhere else on diskalso ifile move
ifile icon [<project>] [glyph]its glyph, one or two characters
ifile auto [<project>] on|offsave by itself when work goes quiet
ifile account [delete [--confirm <address>]]plan, storage and transfer used; delete: what goes, what is in the way, and with the address typed signed out now and gone in 30 days (signing in again keeps it)

THIS MACHINE

THIS MACHINE: every command, with what it does
ifile get <name> | <path> [<path>...] inside a projectput a cloud project of yours back on this machine; inside a project, bring down paths outside this copy's foldersalso ifile install
ifile offload [<project>]take it off this machine; the cloud keeps everythingalso ifile uninstall
ifile import [<project>] <path>...MOVE files into the project folder (NOT git add)also ifile add
ifile fetch [<project>]fetch its history now, so opening is instantalso ifile warm
ifile cachehow much disk the cache holds
ifile service [start | stop | status]the engine that keeps running with the app closed: one live connection per published project on this machine, so its tags stay current; start runs it (and at every sign-in), stop ends it, alone: whether it runs and what it hears
ifile hooks [install | remove | on | off | first <editing,branch,author:<name>|none>] [--command]the hooks in the agent tools on this machine (Claude Code, Gemini CLI, Cursor, Codex): at a session's start the agent is told what moved on its project, on an edit it is warned when the file is not only its own, at its end the person is told what is unsaved; they send the session, its project and the paths of project files it touches, never a prompt, output or code. off takes them out and keeps them out; alone, where they are
ifile hook <tool> [event]what an agent tool's hook runs (written by `ifile hooks`): reads the event, answers in the tool's own shape, always exits clean
ifile agent-session start | work | endwhat the MCP server runs (SWARM_V2 C10b): tells this machine's service its connection began, is working or ended, named by the client's own name, so an agent whose tool has no hooks is on the board too; always exits clean
ifile agentsthe agent sessions on this machine as their hooks report them: running, waiting (and on what: a permission, a question), done, the files each changed. A permission is answered in the agent's own tool, never here
ifile updateupdate the CLI and its engine to the latestalso ifile upgrade
07 · Run itSubprojects

A project can hold other projects at its folders, and each keeps its own access. One clone brings down every subproject you can open, in one folder tree. One you cannot open arrives as an empty, closed folder: never an error, never half the files, and none of its files or history reach you. Your saves never touch it, and if you are given access later, your next sync fills it in. Placing a subproject never widens anyone's access, and opening the parent never opens a subproject.

Keys and private files
API keys, .env files, certificates, contracts: a subproject only the admins open, at keys/ or any folder.
An admin
src/open
docs/open
keys/3 files
Everyone else
src/open
docs/open
keys/closed, empty
One project in parts
web/, backend/ and art/, each a subproject with its own team. One checkout for everyone, each person getting what their teams open.
On web and backend
web/open
backend/open
art/closed, empty
On all three
web/open
backend/open
art/open

Make one in a step: ifile subprojects new keys turns the folder into a project of its own, private, placed back where it was and following its branch; who opens it is then set like any project. Or place a project you already have: ifile subprojects add engine <project>, pinned to one save or following its branch. It is a project of its own, so it keeps its own ignore rules. In the app it is the project's Access, Subprojects. We give the tool and do not police it: nothing reads your files for keys.

Why a CLI when there is an API

A key pasted into CI is a key somebody has to rotate. A machine that signed in once needs no credential in its environment at all.

The device grant means the box running the command never sees a password, and the token it gets belongs to the account that approved it. For a build agent that is the difference between a secret in your CI settings and no secret anywhere. Several logins stay on the shelf at once, so one machine can act as a work account and a personal one without either being re-entered.

Who lives in a terminal
CI runnersBuild agentsRelease scriptsAir-gapped boxesLocal dev
One login · every hosting verb

Building something against this? Tell us which event or route you reached for first, and what was missing from it.

Get in touchWhat it costs