Skip to content
Closed
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
3 changes: 2 additions & 1 deletion .claude/rules/agent-default-models.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
**Source of truth for the default LLM each agent uses via OpenRouter.**
When updating an agent's default model, update BOTH the code and this file. This prevents regressions from stale model IDs.

Last verified: 2026-03-13
Last verified: 2026-06-02

| Agent | Default Model | How It's Set |
|---|---|---|
Expand All @@ -16,6 +16,7 @@ Last verified: 2026-03-13
| Junie | _(provider default)_ | `JUNIE_OPENROUTER_API_KEY` β€” model selection handled by Junie natively |
| Cursor CLI | _(provider default)_ | `--endpoint https://openrouter.ai/api/v1` + `CURSOR_API_KEY` β€” model selection via `--model` flag or `/model` in-session |
| Pi | _(provider default)_ | `OPENROUTER_API_KEY` β€” model selection via `/model` in-session |
| T3 Code | _(inherited by child agents)_ | Wraps Claude Code + Codex as subprocesses; OpenRouter via inherited `ANTHROPIC_BASE_URL` / `OPENAI_BASE_URL` env vars on the children |

## When to update

Expand Down
2 changes: 1 addition & 1 deletion .claude/rules/discovery.md
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ To add: same steps as before (manifest.json entry, matrix entries, implement on

## 4. Respond to GitHub issues

Check `gh issue list --repo OpenRouterTeam/spawn --state open` for user requests:
Check `gh issue list --repo OpenRouterLabs/spawn --state open` for user requests:
- If someone requests an agent or cloud, implement it and comment with the PR link
- If something is already implemented, close the issue with a note
- If a bug is reported, fix it
Expand Down
2 changes: 1 addition & 1 deletion .claude/rules/git-workflow.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ Before editing ANY files:
```
5. **Open a draft PR, then merge when done:**
```bash
gh pr create --draft --repo OpenRouterTeam/spawn
gh pr create --draft --repo OpenRouterLabs/spawn
gh pr ready NUMBER && gh pr merge --squash NUMBER
```
6. **Clean up** the worktree:
Expand Down
4 changes: 2 additions & 2 deletions .claude/rules/shell-scripts.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,8 @@ macOS ships bash 3.2. All scripts MUST work on it:
- `#!/bin/bash` + `set -eo pipefail` (no `u` flag)
- Use `${VAR:-}` for all optional env var checks (`OPENROUTER_API_KEY`, cloud tokens, etc.)
- Primary script URL: `https://openrouter.ai/labs/spawn/{path}` (CDN proxy, maps to repo `sh/`, e.g., `{cloud}/{agent}.sh`)
- Fallback script URL: `https://raw.githubusercontent.com/OpenRouterTeam/spawn/main/sh/{path}`
- Version check URL: `https://github.com/OpenRouterTeam/spawn/releases/download/cli-latest/version` (GitHub release artifact)
- Fallback script URL: `https://raw.githubusercontent.com/OpenRouterLabs/spawn/main/sh/{path}`
- Version check URL: `https://github.com/OpenRouterLabs/spawn/releases/download/cli-latest/version` (GitHub release artifact)
- All env vars documented in the cloud's `sh/{cloud}/README.md`

## Use Bun + TypeScript for Inline Scripting β€” NEVER python/python3
Expand Down
2 changes: 1 addition & 1 deletion .claude/scripts/collaborator-gate.sh
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ set -eo pipefail

_COLLAB_CACHE_FILE="/tmp/spawn-collaborators-cache"
_COLLAB_CACHE_TTL=600 # 10 minutes
_COLLAB_REPO="OpenRouterTeam/spawn"
_COLLAB_REPO="OpenRouterLabs/spawn"

# Refresh the collaborator cache if stale or missing
_refresh_collaborator_cache() {
Expand Down
2 changes: 1 addition & 1 deletion .claude/scripts/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,6 @@
"type": "module",
"version": "0.0.1",
"dependencies": {
"valibot": "^1.0.0"
"valibot": "1.2.0"
}
}
2 changes: 1 addition & 1 deletion .claude/skills/pcl/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ git branch -r --format='%(refname:short) %(committerdate:relative)' | grep -v 'o
### Step 4: Get branches with open PRs (protected)

```bash
gh pr list --repo OpenRouterTeam/spawn --state open --json headRefName --jq '.[].headRefName'
gh pr list --repo OpenRouterLabs/spawn --state open --json headRefName --jq '.[].headRefName'
```

Any branch with an open PR MUST be skipped. Never delete a branch that has an open PR.
Expand Down
4 changes: 2 additions & 2 deletions .claude/skills/setup-spa/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ Subsequent thread replies in tracked threads auto-trigger new Claude Code runs.
| `SLACK_BOT_TOKEN` | Bot User OAuth Token (`xoxb-...`) |
| `SLACK_APP_TOKEN` | App-Level Token for Socket Mode (`xapp-...`) |
| `SLACK_CHANNEL_ID` | Channel ID to listen in (e.g. `C0123456789`) |
| `GITHUB_REPO` | Target repo context (default: `OpenRouterTeam/spawn`) |
| `GITHUB_REPO` | Target repo context (default: `OpenRouterLabs/spawn`) |
| `REPO_ROOT` | Working directory for Claude Code (default: cwd) |

GitHub auth uses the `gh` CLI β€” run `gh auth login` before starting.
Expand All @@ -59,7 +59,7 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
export SLACK_BOT_TOKEN="xoxb-YOUR-BOT-TOKEN"
export SLACK_APP_TOKEN="xapp-YOUR-APP-TOKEN"
export SLACK_CHANNEL_ID="C0000000000"
export GITHUB_REPO="OpenRouterTeam/spawn"
export GITHUB_REPO="OpenRouterLabs/spawn"
export REPO_ROOT="$(cd "${SCRIPT_DIR}/../../.." && pwd)"

exec bun run "${SCRIPT_DIR}/main.ts"
Expand Down
2 changes: 1 addition & 1 deletion .claude/skills/setup-spa/main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ type SlackClient = InstanceType<typeof App>["client"];

const SLACK_BOT_TOKEN = process.env.SLACK_BOT_TOKEN ?? "";
const SLACK_APP_TOKEN = process.env.SLACK_APP_TOKEN ?? "";
const GITHUB_REPO = process.env.GITHUB_REPO ?? "OpenRouterTeam/spawn";
const GITHUB_REPO = process.env.GITHUB_REPO ?? "OpenRouterLabs/spawn";
const TRIGGER_SECRET = process.env.TRIGGER_SECRET ?? "";
const GROWTH_TRIGGER_URL = process.env.GROWTH_TRIGGER_URL ?? "";
const GROWTH_REPLY_SECRET = process.env.GROWTH_REPLY_SECRET ?? "";
Expand Down
4 changes: 2 additions & 2 deletions .claude/skills/setup-spa/spa.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -332,10 +332,10 @@ describe("extractToolHint", () => {
it("extracts command from input", () => {
const block: Record<string, unknown> = {
input: {
command: "gh issue list --repo OpenRouterTeam/spawn",
command: "gh issue list --repo OpenRouterLabs/spawn",
},
};
expect(extractToolHint(block)).toBe("gh issue list --repo OpenRouterTeam/spawn");
expect(extractToolHint(block)).toBe("gh issue list --repo OpenRouterLabs/spawn");
});

it("extracts pattern from input", () => {
Expand Down
2 changes: 1 addition & 1 deletion .claude/skills/update-metadata/update.ts
Original file line number Diff line number Diff line change
Expand Up @@ -183,7 +183,7 @@ async function refreshIconsFor(
const contentType = res.headers.get("content-type")?.split(";")[0] ?? "";
const ext = EXT_MAP[contentType] ?? src.ext;
const outPath = resolve(ROOT, `${assetDir}/${id}.${ext}`);
const rawUrl = `https://raw.githubusercontent.com/OpenRouterTeam/spawn/main/${assetDir}/${id}.${ext}`;
const rawUrl = `https://raw.githubusercontent.com/OpenRouterLabs/spawn/main/${assetDir}/${id}.${ext}`;

if (dryRun) {
console.log(` [dry-run] ${id}: would download ${src.url} β†’ ${outPath}`);
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/agent-tarballs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ jobs:
- name: Install Bun
uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2
with:
bun-version: "1.3.11"
bun-version: "1.3.9"

- name: Install agent under /root
env:
Expand Down
2 changes: 1 addition & 1 deletion CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ All cloud provisioning and agent setup logic lives in TypeScript under `packages
When you encounter bugs, stale references, broken functionality, or architectural issues that are **outside the scope of your current task**, file a GitHub issue immediately rather than ignoring them or trying to fix everything at once:

```bash
gh issue create --repo OpenRouterTeam/spawn --title "bug: <brief description>" --body "<details>"
gh issue create --repo OpenRouterLabs/spawn --title "bug: <brief description>" --body "<details>"
```

Examples of when to file:
Expand Down
37 changes: 19 additions & 18 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

Launch any AI agent on any cloud with a single command. Coding agents, research agents, self-hosted AI tools β€” Spawn deploys them all. All models powered by [OpenRouter](https://openrouter.ai). (ALPHA software, use at your own risk!)

**9 agents. 7 clouds. 63 working combinations. Zero config.**
**10 agents. 8 clouds. 79 working combinations. Zero config.**

## Install

Expand Down Expand Up @@ -332,21 +332,22 @@ If an agent fails to install or launch on a cloud:
- **Rerun last session**: `spawn last` or `spawn rerun`
- **Check version**: `spawn version` shows CLI version and cache status
- **Update spawn**: `spawn update` checks for the latest version
- **Report bugs**: Open an issue at https://github.com/OpenRouterTeam/spawn/issues
- **Report bugs**: Open an issue at https://github.com/OpenRouterLabs/spawn/issues

## Matrix

| | [Local Machine](sh/local/) | [Hetzner Cloud](sh/hetzner/) | [AWS Lightsail](sh/aws/) | [DigitalOcean](sh/digitalocean/) | [GCP Compute Engine](sh/gcp/) | [Daytona](sh/daytona/) | [Sprite](sh/sprite/) |
|---|---|---|---|---|---|---|---|
| [**Claude Code**](https://claude.ai) | βœ“ | βœ“ | βœ“ | βœ“ | βœ“ | βœ“ | βœ“ |
| [**OpenClaw**](https://github.com/openclaw/openclaw) | βœ“ | βœ“ | βœ“ | βœ“ | βœ“ | βœ“ | βœ“ |
| [**Codex CLI**](https://github.com/openai/codex) | βœ“ | βœ“ | βœ“ | βœ“ | βœ“ | βœ“ | βœ“ |
| [**OpenCode**](https://github.com/sst/opencode) | βœ“ | βœ“ | βœ“ | βœ“ | βœ“ | βœ“ | βœ“ |
| [**Kilo Code**](https://github.com/Kilo-Org/kilocode) | βœ“ | βœ“ | βœ“ | βœ“ | βœ“ | βœ“ | βœ“ |
| [**Hermes Agent**](https://github.com/NousResearch/hermes-agent) | βœ“ | βœ“ | βœ“ | βœ“ | βœ“ | βœ“ | βœ“ |
| [**Junie**](https://www.jetbrains.com/junie/) | βœ“ | βœ“ | βœ“ | βœ“ | βœ“ | βœ“ | βœ“ |
| [**Cursor CLI**](https://cursor.com/cli) | βœ“ | βœ“ | βœ“ | βœ“ | βœ“ | βœ“ | βœ“ |
| [**Pi**](https://pi.dev) | βœ“ | βœ“ | βœ“ | βœ“ | βœ“ | βœ“ | βœ“ |
| | [Local Machine](sh/local/) | [Local Sandbox](sh/sandbox/) | [Hetzner Cloud](sh/hetzner/) | [AWS Lightsail](sh/aws/) | [DigitalOcean](sh/digitalocean/) | [GCP Compute Engine](sh/gcp/) | [Daytona](sh/daytona/) | [Sprite](sh/sprite/) |
|---|---|---|---|---|---|---|---|---|
| [**Claude Code**](https://claude.ai) | βœ“ | βœ“ | βœ“ | βœ“ | βœ“ | βœ“ | βœ“ | βœ“ |
| [**OpenClaw**](https://github.com/openclaw/openclaw) | βœ“ | βœ“ | βœ“ | βœ“ | βœ“ | βœ“ | βœ“ | βœ“ |
| [**Codex CLI**](https://github.com/openai/codex) | βœ“ | βœ“ | βœ“ | βœ“ | βœ“ | βœ“ | βœ“ | βœ“ |
| [**OpenCode**](https://github.com/anomalyco/opencode) | βœ“ | βœ“ | βœ“ | βœ“ | βœ“ | βœ“ | βœ“ | βœ“ |
| [**Kilo Code**](https://github.com/Kilo-Org/kilocode) | βœ“ | βœ“ | βœ“ | βœ“ | βœ“ | βœ“ | βœ“ | βœ“ |
| [**Hermes Agent**](https://github.com/NousResearch/hermes-agent) | βœ“ | βœ“ | βœ“ | βœ“ | βœ“ | βœ“ | βœ“ | βœ“ |
| [**Junie**](https://www.jetbrains.com/junie/) | βœ“ | βœ“ | βœ“ | βœ“ | βœ“ | βœ“ | βœ“ | βœ“ |
| [**Cursor CLI**](https://cursor.com/cli) | βœ“ | βœ“ | βœ“ | βœ“ | βœ“ | βœ“ | βœ“ | βœ“ |
| [**Pi**](https://pi.dev) | βœ“ | βœ“ | βœ“ | βœ“ | βœ“ | βœ“ | βœ“ | βœ“ |
| [**T3 Code**](https://github.com/pingdotgg/t3code) | βœ“ | β€” | βœ“ | βœ“ | βœ“ | βœ“ | βœ“ | βœ“ |

### How it works

Expand All @@ -362,7 +363,7 @@ Scripts work standalone (`bash <(curl ...)`) or through the CLI.
## Development

```bash
git clone https://github.com/OpenRouterTeam/spawn.git
git clone https://github.com/OpenRouterLabs/spawn.git
cd spawn
git config core.hooksPath .githooks
```
Expand Down Expand Up @@ -400,7 +401,7 @@ Pick any agent + cloud combination from the matrix and try it out:
spawn claude hetzner # or any combination
```

If something breaks, hangs, or behaves unexpectedly, open an issue using the [bug report template](https://github.com/OpenRouterTeam/spawn/issues/new?template=bug_report.yml). Include:
If something breaks, hangs, or behaves unexpectedly, open an issue using the [bug report template](https://github.com/OpenRouterLabs/spawn/issues/new?template=bug_report.yml). Include:

- The exact command you ran
- The cloud provider and agent
Expand All @@ -411,9 +412,9 @@ If something breaks, hangs, or behaves unexpectedly, open an issue using the [bu

Want to see a specific cloud provider or agent supported? Use the dedicated templates:

- [Request a cloud provider](https://github.com/OpenRouterTeam/spawn/issues/new?template=cloud_request.yml)
- [Request an agent](https://github.com/OpenRouterTeam/spawn/issues/new?template=agent_request.yml)
- [Request a CLI feature](https://github.com/OpenRouterTeam/spawn/issues/new?template=cli_feature_request.yml)
- [Request a cloud provider](https://github.com/OpenRouterLabs/spawn/issues/new?template=cloud_request.yml)
- [Request an agent](https://github.com/OpenRouterLabs/spawn/issues/new?template=agent_request.yml)
- [Request a CLI feature](https://github.com/OpenRouterLabs/spawn/issues/new?template=cli_feature_request.yml)

Requests with real-world use cases get prioritized.

Expand Down
Loading
Loading