Repository navigation
Releases: amroja-biz/rockysurf
Release list
v0.1.6
Rocky Surf 0.1.6 fixes the Connect GitHub button. Install or upgrade with one command:
npx -y rockysurfRocky Surf needs Node 24 or newer.
What changed
- Connect GitHub works as soon as you save the client ID. Saving OAuth App client ID on Settings said the value was applied, but the button stayed disabled until Rocky Surf restarted. Two things were wrong: the routes behind the button kept reading the configuration Rocky Surf started with, and the Settings page never asked again after a save. Both are fixed, so the button enables the moment the save lands, with no restart and no page refresh. (#510, #511)
- The setup steps no longer say to restart, and the self-hosting guide says which value to paste: the one labelled Client ID on your OAuth App's page, not the number in that page's address. (#510, #511)
Everything else
Features, the Provider capability matrix, the security posture, and the roadmap are in the v0.1.0 release notes and are unchanged by this release.
v0.1.5
Rocky Surf 0.1.5 puts herdr on every box. Install or upgrade with one command:
npx -y rockysurfRocky Surf needs Node 24 or newer.
What changed
- herdr is part of every Surge Pack. herdr is a terminal workspace for coding agents: sessions live in a background server on the box, survive a dropped SSH connection, and each agent pane shows working, blocked or idle. It joins the base toolchain every pack installs, pinned to a tagged release and checked against the vendor's digests. tmux stays alongside it. (#498, #503)
- Each agent gets its herdr integration. Claude Code, Codex, OpenCode, Grok Build, Cursor CLI, OMP and Pi each carry a Tool that wires the agent's status into herdr's pane list, so a box shows what its agents are doing without you opening each one. Amp has no target in herdr 0.9.0 and gets herdr alone. (#498, #503)
- The Kitchen Sink Surge Pack. One box with every shipped terminal agent, herdr, and every integration, for the case of one server running several agents that you manage from one herdr window. Twelve packs now ship in the box. (#498, #503, #504)
- Attach a box in one copy. Once a Server is running, its page shows
herdr machine add rocky@<ip> --label <name>, ready to paste on your own machine, with a note about the SSH key. The HTTP API and the MCP server return the same string, so an agent that created a Server can hand you the attach command. Several boxes across several clouds then show up in one local herdr window. (#500, #501) - Every pack guide has a Herdr section, covering reattaching on the box and attaching it from your machine. (#498, #503)
- The shared base toolchain has its own file. The fourteen Tools every pack references moved out of the Claude Code pack into
packs/base.yaml. A mistake in one agent's pack file no longer empties the pack picker, and a community pack author no longer finds curl defined under "Claude Code". No pack's install plan changed. (#499, #502) - A changelog.
CHANGELOG.mdrecords every release, newest first, and the Help page links it. (#505)
Everything else
Features, the Provider capability matrix, the security posture, and the roadmap are in the v0.1.0 release notes and are unchanged by this release.
v0.1.4
Rocky Surf 0.1.4 is a fix release on top of 0.1.3. Install or upgrade with one command:
npx -y rockysurfRocky Surf needs Node 24 or newer.
What changed
- hono 4.13.1 to 4.13.5. The web framework under the HTTP API picks up two upstream security fixes. One stops query-string parsing at the URL fragment, so an installation behind a reverse proxy can no longer read a parameter the proxy never saw. The other is in a static site generation function Rocky Surf does not use. (#492)
- The READMEs say how to pick a port.
npx -y rockysurf --port 3080has worked since 0.1.0, and now both READMEs say so. (#496) - The READMEs name the cloud CLIs as prerequisites. AWS, Azure, and Google Cloud need their CLI installed and signed in. Hetzner needs only an API token. (#496)
Everything else
Features, the Provider capability matrix, the security posture, and the roadmap are in the v0.1.0 release notes and are unchanged by this release.
v0.1.3
Rocky Surf 0.1.3 is a fix release on top of 0.1.2. Install or upgrade with one command:
npx -y rockysurfRocky Surf needs Node 24 or newer.
What changed
- The npm page links to rockysurf.com. The package's homepage was the GitHub README, so npmjs.com showed two links to the same place. Homepage is now the site, Repository is still GitHub. (#493)
- The npm README is shorter. It now leads with the web app, frames MCP as the way to manage Servers from inside a coding agent, and drops the contributor material that lives in the repository. (#493)
No code changed in this release.
Everything else
Features, the Provider capability matrix, the security posture, and the roadmap are in the v0.1.0 release notes and are unchanged by this release.
v0.1.2
Rocky Surf 0.1.2 is a fix release on top of 0.1.1. Install or upgrade with one command:
npx -y rockysurfRocky Surf needs Node 24 or newer.
What changed
- The New Server page has a Personal tab under Surge Pack. A pack you uploaded or wrote yourself used to appear under Community, next to packs installed from the Shop, and the Surge Packs page disagreed. The picker now has the same three tabs as that page: Official, Community, Personal. "Launch a server with this pack" opens on whichever tab holds the pack. (#487)
- The README starts over. The opening now says what Rocky Surf is for, in the words from rockysurf.com, followed by install, features, MCP setup, and the Agent Skills. The npm page carries the same opening instead of contributor notes. (#488)
- The backup section says what a backup holds. It never held cloud credentials; Rocky Surf does not store them. It holds the SSH keys Rocky Surf generates for your Servers and a GitHub token if you connected one, encrypted, next to the key that decrypts them.
Everything else
Features, the Provider capability matrix, the security posture, and the roadmap are in the v0.1.0 release notes and are unchanged by this release.
v0.1.1
Rocky Surf 0.1.1 is a fix release on top of 0.1.0. Install or upgrade with one command:
npx -y rockysurfRocky Surf needs Node 24 or newer.
What changed
npx -y rockysurfon an older Node now tells you what to do. On Node 20 and 22, npm's version picker skipped 0.1.0 and ran an empty placeholder package, which failed with "could not determine executable to run". 0.1.1 prints "rockysurf needs Node 24 or newer" with the install command instead. (#470)- The setup wizard sets things up. Choosing a cloud now shows that cloud's fields in place, saves them, and checks the credentials, showing "ready" or the exact reason it is not. Every step has Back. There is a "Your SSH key" step for people who already have a key. Nothing in the wizard refers to a config file or a documentation path. (#474)
- "Use my current IP" on the SSH allow-list field, in the wizard and on Settings.
- Region and zone fields validate as you type, and Save waits until they look right.
- AWS is called AWS. Providers are named by the account you sign in to: AWS, Azure, Google Cloud, Hetzner Cloud, DigitalOcean.
Everything else
Features, the Provider capability matrix, the security posture, and the roadmap are in the v0.1.0 release notes and are unchanged by this release.
v0.1.0
Rocky Surf creates a Linux server on a cloud account you own, installs your coding agents on it,
and hands you an SSH command. It is one process you run on your own computer, and installing it is
one command: npx -y rockysurf.
What's in 0.1.0
- Create a server, watch it build, then SSH in. You pick a cloud, a machine size and a software
bundle. Rocky Surf launches the machine, installs the software over SSH, streams the install log
to your browser, and gives you the SSH command at the end. - Four clouds ship with the release. Hetzner Cloud, AWS, Azure and Google Cloud. Every cloud is
off until you switch it on, and each one authenticates with credentials you already have. - Surge Packs are the software bundles. A Surge Pack is a YAML file listing tools and install
scripts, so you can read the whole thing before you trust it. Eleven ship in the release,
covering Claude Code, Codex CLI, Amp, OpenCode, Gas Town, Pi and others. - Stop a box tonight, start it tomorrow. Your repositories, branches and shell history are
where you left them. On most clouds a stopped machine costs storage rather than compute, and the
stop dialog names the clouds that keep charging. - Three ways to drive it. A web UI on
127.0.0.1, an HTTP API, and a command line. - An MCP server, so a coding agent can do the work.
rockysurf mcpexposes the server
lifecycle as tools. What an agent may do comes from your config file, not from the agent's
launch command, and the default grant is read and stop only. - Guardrails enforced on the server. A maximum number of servers, a limit on creates per hour,
and a monthly spend cap. They apply to the web UI, the command line and the MCP tools alike. - Clone your GitHub repositories onto a new box. Public URLs clone anonymously. Private ones
use a token you paste or a GitHub account you connect, and a box receives only the tokens its own
repositories need. - Personal Providers. A cloud Rocky Surf does not ship can be an npm package you install under
your data directory and name in the config file. DigitalOcean is the worked example. - A Shop tab. Community Surge Packs and Providers can be installed from a registry inside the
app, with every install script shown to you first. - Backup and Restore on the Settings page. The backup holds encrypted rows and no key to them.
- Bring your own cloud, keys and repositories. Rocky Surf resells nothing and proxies nothing.
The cloud account and the bill are yours, and you sign your agents in yourself.
Providers
| Provider | Status | Notes |
|---|---|---|
| Hetzner Cloud | Ships in the CLI | An API token read from an environment variable. No cloud firewall in 0.1, so SSH is reachable from anywhere and protected by key-only login and a pinned host key. |
| AWS | Ships in the CLI | The standard AWS credential chain. sshAllowedCidr is required and has no default. A server's public address changes when you stop and start it. |
| Azure | Ships in the CLI | A service principal, a managed identity, or az login. sshAllowedCidr is required. Needs a resource group you create yourself. |
| Google Cloud | Ships in the CLI | Application Default Credentials, or a service-account key file. sshAllowedCidr is required. A server's public address changes when you stop and start it. |
| DigitalOcean | Personal provider, installed separately | Not bundled in the CLI. Install @rockysurf/provider-digitalocean from npm under your data directory and name it in your config file. Its README has the steps. DigitalOcean bills for a droplet that is stopped. |
Full capability details are in docs/providers/capability-matrix.md, which marks every value as
measured against a real cloud or reasoned from vendor documentation.
Packages on npm
rockysurfis whatnpx rockysurfinstalls, and the only package with a command.@rockysurf/coreis the control plane, for someone building their own composition root.@rockysurf/provider-sdkis the frozen v0 contract a provider implements.@rockysurf/provider-awsis the AWS provider.@rockysurf/provider-azureis the Azure provider.@rockysurf/provider-gcpis the Google Cloud provider.@rockysurf/provider-hetzneris the Hetzner Cloud provider.@rockysurf/provider-conformanceis the acceptance suite a provider runs against itself.@rockysurf/provider-digitaloceanis the personal DigitalOcean provider, published because
installing it is the only way to have it.
Security
SECURITY.md is the full statement, including the residual risks. The short version:
- Nothing is hosted and nothing is reported. One process, one SQLite file, one admin, no
accounts to sign up for and no telemetry. It listens on127.0.0.1by default and has no TLS of
its own, so widening that should be paired with a reverse proxy or a firewall. - Rocky Surf stores no cloud credentials. There is no database table for them, and the setup
route refuses a credential by name. Each cloud authenticates through its own path, and the config
file names an environment variable rather than holding a value. - Stored secrets are encrypted. AES-256-GCM under a local master key, with each row's identity
bound into the authentication data. No HTTP route returns decrypted secret material. There is one
audited exception, the private-key download for a server you own, and a test enforces the rule
rather than review. - Session tokens are opaque and only their hash is stored. A database leak yields hashes, not
live sessions. The admin password is stored as a scrypt hash. - The MCP server has no privileges of its own. It speaks to the control plane over the same
HTTP API a browser uses, so every limit applies to it by construction. It authenticates with a
token you mint, and the token is not a capability. Scopes live in your config file, default to
read and stop, and are re-checked when a tool is called. - SSH is opened to networks you name. AWS, Azure and Google Cloud require
sshAllowedCidrand
refuse to load without it. Opening SSH to the whole internet needs a second, separate setting.
Hetzner has no cloud firewall in this release. - Host keys are pinned with no trust-on-first-use window. Core mints the host keypair before
the instance exists and injects it, so the first connection is verified against a key it
generated.rockysurf sshpins too, and refuses to downgrade silently. - Every package is published from CI with provenance. npm trusted publishing lets the registry
accept a publish only from this repository's release workflow, authenticated by a short-lived
token GitHub mints for the run. No npm token exists anywhere, and each release waits for a human
approval.
Known limitations
- The MCP token is a full admin session valid for a year. Revoking it means signing out
everywhere, which drops every session. - Scopes are a guardrail against mistakes and prompt injection, not a sandbox. An agent that can
run shell commands on the same machine can read the token and call the API directly. The
server-side limits are what still stop it. - The spend cap is an estimate from bundled price data, not a bill. An offering your cloud quotes
no price for spends money the cap cannot see. Reaching the cap blocks new servers without
stopping running ones. - Repositories attach only when a server is created. There is no way to add one to a running box,
so the remedy is to terminate and recreate. - Backup and Restore are on the Settings page only. There are no command-line wrappers yet.
- Connect GitHub works with github.com, not with GitHub Enterprise Server.
- Master key rotation is not implemented. Rotating the key means recreating servers.
- Region choice is not exposed for every cloud yet.
- Rocky Surf is deliberately small. There are no devcontainers, no throwaway per-task sandboxes, no
Windows support, and no multi-tenancy.
Roadmap
Tracked in issues #243 and #131.
- A project website, and launch videos covering an overview, creating a Surge Pack, adding one to
the Shop, and writing a Provider. - Serving the Help pages over MCP, so an agent can learn how to drive Rocky Surf on its own.
- Signing the Surge Pack registry index, so trusting a community pack no longer rests on write
access to the registry repository. - Per-token MCP scopes, so a token can be narrower than a full admin session.
- Adding a repository to a server that is already running.
- Command-line wrappers for Backup and Restore.
- Region support for the clouds that still lack it, and an approximate-cost note everywhere a price
is shown. - A shared tool library that no Surge Pack owns, so one bad file stops cascading into every pack
that references it.
Install
Requires Node 24 or newer.
npx -y rockysurfIt prints an admin password once on first boot, so save it. Open http://127.0.0.1:3000 and sign
in. With no cloud configured it runs an in-memory provider, so you can create a server, watch it
boot and terminate it before pasting a real token.
Docker Compose, the agent quick start and the per-cloud setup pages are in the
README.