Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 7 additions & 7 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

14 changes: 7 additions & 7 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -54,20 +54,20 @@ members = ["crates/*"]
default-members = [".", "crates/*"]

[workspace.package]
version = "2.4.0"
version = "3.0.0"
edition = "2024"
rust-version = "1.85"
license = "MIT"
repository = "https://github.com/execution-associates/isb"
homepage = "https://github.com/execution-associates/isb"

[workspace.dependencies]
isb-core = { path = "crates/isb-core", version = "=2.4.0" }
isb-server = { path = "crates/isb-server", version = "=2.4.0" }
isb-apps = { path = "crates/isb-apps", version = "=2.4.0" }
isb-daemon = { path = "crates/isb-daemon", version = "=2.4.0" }
isb-tui = { path = "crates/isb-tui", version = "=2.4.0" }
isb-egress = { path = "crates/isb-egress", version = "=2.4.0" }
isb-core = { path = "crates/isb-core", version = "=3.0.0" }
isb-server = { path = "crates/isb-server", version = "=3.0.0" }
isb-apps = { path = "crates/isb-apps", version = "=3.0.0" }
isb-daemon = { path = "crates/isb-daemon", version = "=3.0.0" }
isb-tui = { path = "crates/isb-tui", version = "=3.0.0" }
isb-egress = { path = "crates/isb-egress", version = "=3.0.0" }

serde = { version = "1", features = ["derive"] }
serde_json = "1"
Expand Down
23 changes: 9 additions & 14 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,18 +36,13 @@ domains with certificates, a web UI, and an MCP server for AI agents.
<b>Agents and MCP</b><br>
<a href="docs/guides/agents.md">Agents and MCP →</a>
</td>
<td width="33%" align="center" valign="top">
<a href="docs/assets/readme/workspace.webp"><img src="docs/assets/readme/workspace.webp" alt="An org's workspace with its web terminal attached to a herdr session"></a><br>
<b>Workspaces for agents</b><br>
<a href="docs/concepts/workspaces.md">Workspaces →</a>
</td>
</tr>
<tr>
<td width="33%" align="center" valign="top">
<a href="docs/assets/readme/deploy.webp"><img src="docs/assets/readme/deploy.webp" alt="A deployment triggered by a GitHub push: its stages, live URLs and build log"></a><br>
<b>Deploy from an image or git</b><br>
<a href="docs/guides/deploy-apps.md">Deploy apps →</a>
</td>
</tr>
<tr>
<td width="33%" align="center" valign="top">
<a href="docs/assets/readme/templates.webp"><img src="docs/assets/readme/templates.webp" alt="The template catalog searched for n8n, with isb's, Dokploy's and Coolify's templates side by side"></a><br>
<b>Templates, with Dokploy's and Coolify's catalogs</b><br>
Expand All @@ -60,30 +55,30 @@ domains with certificates, a web UI, and an MCP server for AI agents.
<b>Preview deployments</b><br>
<a href="docs/guides/previews.md">Previews →</a>
</td>
</tr>
<tr>
<td width="33%" align="center" valign="top">
<a href="docs/assets/readme/secrets.webp"><img src="docs/assets/readme/secrets.webp" alt="An org's secrets with their labels and the stacks using them, and 1Password below"></a><br>
<b>Secrets, local or from 1Password</b><br>
<a href="docs/guides/secrets.md">Secrets →</a>
</td>
</tr>
<tr>
<td width="33%" align="center" valign="top">
<a href="docs/assets/readme/domains.webp"><img src="docs/assets/readme/domains.webp" alt="An app's domains, each serving with its certificate issued"></a><br>
<b>Domains with HTTPS</b><br>
<a href="docs/guides/domains.md">Domains and ingress →</a>
</td>
<td width="33%" align="center" valign="top">
<a href="docs/assets/readme/ssh.webp"><img src="docs/assets/readme/ssh.webp" alt="herdr attached to an org's workspace over isb's SSH"></a><br>
<a href="docs/assets/readme/ssh.webp"><img src="docs/assets/readme/ssh.webp" alt="herdr attached to an org's stack replica over isb's SSH"></a><br>
<b>SSH and herdr</b><br>
<a href="docs/guides/ssh.md">SSH and herdr →</a>
</td>
</tr>
<tr>
<td width="33%" align="center" valign="top">
<a href="docs/assets/readme/databases.webp"><img src="docs/assets/readme/databases.webp" alt="Backups: an S3 destination, a nightly Postgres schedule and a restore"></a><br>
<b>Databases and backups</b><br>
<a href="docs/guides/databases.md">Databases →</a>
</td>
</tr>
<tr>
<td width="33%" align="center" valign="top">
<a href="docs/assets/readme/uptime.webp"><img src="docs/assets/readme/uptime.webp" alt="Uptime monitors with their latency and uptime"></a><br>
<b>Uptime monitoring</b><br>
Expand Down Expand Up @@ -152,8 +147,8 @@ $ isb app create web --project shop --image docker:traefik/whoami -p 127.0.0.1:8
- [Overview](docs/index.md): what isb is, who it is for, and why
- [Getting started](docs/getting-started/index.md): install, your first
sandbox, your first org and app, the web UI
- [Concepts](docs/concepts/index.md): sandboxes, orgs, apps, stacks,
workspaces, the security model, users and roles
- [Concepts](docs/concepts/index.md): sandboxes, orgs, apps, stacks, the
security model, users and roles
- [Guides](docs/guides/index.md): deploying apps, builds, databases and
backups, domains, secrets, agents and MCP, SSH, dev environments
- [Reference](docs/reference/index.md): the CLI, `isb.yaml`, MCP tools, the
Expand Down
34 changes: 14 additions & 20 deletions SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@ description: >
MCP tools (org MCP at /orgs/ORG/mcp, or the superadmin /mcp). Use when you need
an isolated Linux machine to run untrusted code, a sandbox for a task, a dev
server per branch or worktree, to deploy or inspect apps, stacks, databases,
secrets or domains in an isb org, when you are inside an org's workspace
(/run/isb/token, $ISB_URL, $ISB_ORG, $ISB_TOKEN), when a project has an
secrets or domains in an isb org, when you hold an org API token with
$ISB_URL, $ISB_ORG and $ISB_TOKEN set, when a project has an
isb.yaml, or when the user mentions isb, incus sandboxes, `isb up`, `isb exec`,
`isb stack`, `isb app`, `isb serve`, or isb-sdk.
---
Expand All @@ -23,7 +23,7 @@ and serves all of it as MCP tools.

**If the isb MCP server is connected, you do not need this skill.** Its
instructions carry the rules, and its `guide` tool (topics `start`, `safety`,
`sandboxes`, `apps`, `inspect`, `data`, `workspace`, `admin`, `cli`) is this
`sandboxes`, `apps`, `inspect`, `data`, `admin`, `cli`) is this
manual. Call `guide` with `topic: start` first. Keep reading here when you
have only the CLI on a host.

Expand All @@ -34,8 +34,7 @@ Pick the way in that matches what you hold. Never go around it.
| You have | You are | Use |
|---|---|---|
| the incus socket on a Linux host (`incus info` works) | the host's operator | the `isb` CLI and `isb.yaml`; daemon commands go over its unix socket |
| `/run/isb/token` and `$ISB_URL` (inside an org's workspace) | that org's workspace actor | the org MCP at `$ISB_URL/orgs/$ISB_ORG/mcp`, or the `isb` CLI's daemon commands (they use `$ISB_URL` and `$ISB_TOKEN` when there is no local socket) |
| an MCP connector or an `isb_tok_` API token | a user (or an agent acting for one) in some orgs | the org MCP, `https://HOST/orgs/ORG/mcp`, or REST `POST /orgs/ORG/api/v1/tools/TOOL` |
| an MCP connector or an `isb_tok_` API token | a user (or an agent acting for one) in some orgs | the org MCP, `https://HOST/orgs/ORG/mcp`, or REST `POST /orgs/ORG/api/v1/tools/TOOL`; with `$ISB_URL`, `$ISB_ORG` and `$ISB_TOKEN` set, the `isb` CLI's daemon commands too (they use them when there is no local socket) |
| a superadmin token, tailnet or Access identity | the host's operator, remotely | the unbound `https://HOST/mcp`: every tool, every org, the host tools. It is root on the host; act as narrowly as an org token would |

```sh
Expand Down Expand Up @@ -79,9 +78,6 @@ isb manages: `isb machine status`, `isb machine init`, `isb machine start`.
would change on a sandbox someone else uses (a replaced mount is a remount
under their running processes). `isb prune` only lists what it would delete
until you add `-y`.
- **Disruptive workspace tools refuse without `confirm: true`** and say which
live sessions they would end. Read that answer before confirming: those
sessions may be people, or you.
- **Clean up and label.** Name what you create, label it
(`labels: {owner: my-task}`, then `isb ls --label owner=my-task`), and
delete it when done (`isb down`, `isb rm -f`, `sandbox_remove`).
Expand Down Expand Up @@ -193,8 +189,8 @@ cannot exec or read secrets.
capped at 256 KiB per stream), `sandbox_list`, `sandbox_extend`,
`sandbox_remove`. Remote callers' specs are refused privileged mode, raw
config, host bind mounts outside the bind roots and non-loopback ports.
From a workspace, put heavy or risky work in a sandbox, not in the
workspace itself.
`sandbox_settings` reads the org's defaults (`sandbox_expiry`,
`sandbox_idle`); org admins change them.
- **Apps:** `project_create`, `app_create` (an image, or a git repository and
a builder), `app_env_set` (`.env` text; `KEY=${{secret.NAME}}` for
secrets), `app_deploy` (`wait: true`), `app_deployment_log`,
Expand Down Expand Up @@ -226,8 +222,6 @@ cannot exec or read secrets.
`job_*`. **Secrets:** `secret_create`, `secret_set` (values base64; a new
version rolls the stacks using it), `secret_list` (no values).
- **Templates:** `template_list`, `template_deploy` (`dry_run: true` first).
- **The workspace:** `workspace_get`, `workspace_start`, `workspace_restart`
(`confirm`), `workspace_settings`.
- **What happened:** `events`, `history_query`, `audit_list` (owners and
admins), `metrics_query`, `overview`.

Expand All @@ -240,15 +234,15 @@ curl -fsS -H "Authorization: Bearer $ISB_TOKEN" -H 'Content-Type: application/js
"$ISB_URL/orgs/$ISB_ORG/api/v1/tools/sandbox_create"
```

## Inside a workspace
## A long-lived box in an org

An org's workspace is its long-lived machine. Its credential is an org
token (role `admin` by default) at `/run/isb/token`, also `$ISB_TOKEN` in
login shells, with `$ISB_URL` (the org bridge's listener), `$ISB_ORG` and
`$ISB_WORKSPACE`. It reaches that org and nothing else: no other org, no
host tools, no accounts or tokens. There is no incus socket inside: make
sandboxes with `sandbox_create`, not `isb create`. The token is never shown
by any tool; do not print or copy it.
A persistent dev box is a one-replica stack the org deploys (an image and a
volume at the home directory), reached with `isb ssh-config ORG/INSTANCE`.
Inside an org instance, isb answers at `http://<org bridge gateway>:8481`
(`/orgs/ORG/mcp` and `/orgs/ORG/api/v1/...`) with an org API token as
Bearer; whoever deploys the box sets `$ISB_URL`, `$ISB_ORG` and
`$ISB_TOKEN` (the token as a secret file). There is no incus socket inside:
make sandboxes with `sandbox_create`, not `isb create`.

## Stacks on a host

Expand Down
Loading
Loading