Commands
Everything spry does. spry --help prints a shorter version of this.
npm install -g spryloom
Where a command takes an app, it takes the app's slug — the first part of its
address, and the app.slug in its manifest. spry apps lists them.
Signing in
spry login --email you@yourcompany.com
Signs this terminal in. Prints a short code and waits; Spryloom emails you a link, and the page it opens shows the same code. Confirm it and the terminal finishes.
Check the code. A link on its own approves whichever sign-in it was made for, including one somebody else started.
spry whoami
Who this terminal is signed in as, and which workspace.
spry logout
Forgets the token on this machine. Other machines are unaffected.
spry logout --all
Signs out everywhere, this terminal included, by revoking every token you hold. What you reach for when a laptop is lost.
Publishing
spry publish [folder]
Publishes the app in the folder. Defaults to the current directory.
Also takes a zip of the folder, or a GitHub repository:
spry publish ./expense-notes.zip
spry publish github.com/you/expense-notes
spry publish github.com/you/expense-notes@a-branch # also #a-branch
Both are read on your machine and become a folder before anything is uploaded.
For a private repository set GITHUB_TOKEN; it is sent to GitHub and nowhere
else.
| Option | |
|---|---|
--description <text> |
Required when the folder has no spryloom.yaml. |
--name <text> |
What to call the app. Defaults to the folder, the repository, or the zip. |
Publishing again keeps the address, the data, and the database, and raises the version number.
spry rollback <app> [--to N]
Returns the app to an earlier version — the previous one, or the one you name. The version being replaced is retired only once the earlier one is answering.
Your data is untouched. Rolling back changes which code is running, nothing else.
spry restart <app>
Starts an app that has stopped, using the version already there. What you reach for when an app has run out of memory or crashed.
Do not publish again to recover from a crash: the code has not changed, and rebuilding risks a different result from a dependency that moved since.
spry delete <app> <app>
Removes an app and everything made for it: the machine it ran on, its database and the data in it, its secrets, and its record. It tells you what went.
The name goes in twice. That is not politeness, it is the confirmation: this is the one command that destroys something nobody can get back, and typing the name again is how you say you meant this app rather than the one next to it in the list.
spry delete expense-notes expense-notes
If you only want it to stop costing you anything, you do not need this. An app that nobody is using is asleep, and asleep costs close to nothing: no machine is running and its database is suspended. Delete is for when the data should be gone, not for tidying up.
Sharing
spry invite <app> --email someone@yourcompany.com
Lets somebody use an app. Repeat --email for several people.
Anybody who cannot use the app is not invited and is not emailed, and is listed with the reason. Inviting somebody who already has access is not an error.
Data
spry secrets <app>
What is set on the app, and when. Never the values — nothing can read one back.
spry secrets <app> set NAME=value
Gives the app a value nobody can read back. Repeat for several.
Secrets reach the app when it is published, so publish again afterwards. An app cannot be given one before it exists.
spry secrets <app> remove NAME
Removes it. Publish again so the running app stops seeing it.
Looking
spry apps
Every app in your workspace: whether it is running, its address, how many people use it, who it is shared with, and which version.
Whether it is running is asked of the platform, not remembered — an app that has stopped says so.
spry logs <app> [--lines N]
What the app printed. Defaults to 100 lines.
Before you publish
spry check [folder]
Shows what Spryloom sees in the folder and whether it could publish it. Changes nothing. Worth running when a publish has failed and you want to know why before trying again.
spry init [folder] --description "what it does"
Writes a spryloom.yaml without publishing, so you can read and edit it first.
| Option | |
|---|---|
--description <text> |
Required. One sentence your coworkers will read. |
--name <text> |
App name. Defaults to package.json, then the folder. |
--visibility <who> |
private, invited, company, or link. Defaults to private. |
--domain <domain> |
Email domain. Required when visibility is company. |
--admin <email> |
Grant admin. Repeatable. |
--table <name> |
A table the app stores. Repeatable. Shown to your coworkers. |
--no-database |
This app stores nothing, whatever its dependencies suggest. |
--force |
Overwrite an existing spryloom.yaml. |
From your coding agent
spry skill [folder]
Writes the Spryloom skill into .claude/skills/spryloom/, so the agent working
in this project writes apps that publish: listening on the port it is given,
committing a lockfile, declaring a manifest.
This is where a first-attempt publish is won or lost. Every failure the platform can report is something the skill teaches an agent to avoid, and the two are kept in step by a test.
It will not overwrite a skill that is already there, since yours may have been
edited. --force if you mean it.
Codex and Cursor have no skill format. They get the same guidance from the tool descriptions, which needs nothing written to disk.
spry mcp
Serves the agent tools on standard input and output. You do not run this yourself; your agent starts it.
claude mcp add spryloom -- spry mcp
It acts as whoever this terminal is signed in as, and refuses to start when nobody is — a tool that appears and fails on first use is worse than one that is not there.
Everywhere
| Option | |
|---|---|
--no-color |
Plain output, for a log or a pipe. |
-h, --help |
The short version of this page. |
-v, --version |
Which spry this is. |
| Environment | |
|---|---|
SPRYLOOM_URL |
Which Spryloom to talk to. |
SPRYLOOM_TOKEN |
A token to use instead of the signed-in one, for continuous integration. |
SPRYLOOM_CONFIG |
Where the session file lives. |
GITHUB_TOKEN |
For publishing from a private repository. Sent to GitHub only. |
The tools your agent gets
The same things, as tools: publish, status, logs, rollback, invite.
Ask your agent to publish and it will use them.