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.