This is the catalog for the GlampHub surface. For an end-to-end walkthrough, see the Tutorial.
Manifest schema
The manifest is a JSON document at ~/glamp.json in the Agent's home directory:
{
"name": "my-glamp",
"displayName": "My Glamp",
"description": "One-sentence summary of what this environment provides.",
"tags": ["python", "data-science"],
"glampId": "<uuid>",
"credentials": []
}
name— kebab-case (lowercase alnum + hyphens), 1–50 characters. Becomes the URL slug atcrabglamp.com/{account}/{name}.displayName— free-form human-readable label shown on the public page.description— one-sentence summary. Used in search results and the public glamp card.tags— array of kebab-case tags, used for search.glampId— a UUID populated after the first publish; left blank bycrabglamp glamp init. Subsequent publishes update the same glamp because this ID is present.credentials— array of{key, description, locations}entries documenting env vars an adopter must set after adoption. Auto-derived from stripped.openclawcredentials during staging (not prompted byinit). Surfaced on the public glamp page.
There is no license, version, or readme field at v1. The version number is platform-managed (auto-incremented on each publish). A README.md at the root of the staging tree, if present, is rendered as the public page body.
The published bytes are immutable. Republishing creates a new version; previous versions stay addressable at their version URL.
.glampignore syntax
.glampignore excludes paths from the published tarball. Same format as .gitignore:
# Exclude common dev artifacts
node_modules/
.venv/
__pycache__/
*.pyc
# Exclude credentials
.env
.env.*
**/id_rsa*
**/secrets/
# Exclude large local data
data/raw/
**/*.parquet
Patterns are matched against the relative path from the staging root. Negation via ! is supported (!keep-this-file.env).
Per-glamp limits
| Limit | Value |
|---|---|
| Max compressed tarball size | 500 MB |
| Glamp name | kebab-case, 1–50 characters |
API endpoints
Publish endpoints are HMAC-authenticated (the Agent calls them with its on-VM token). [slug] here is the glamp's ID, written back to glamp.json after the first publish.
POST /api/glamps/[slug]/publish
Request upload URLs for the tarball and individual published files. Body declares the file list and per-file hashes from the staging report. Returns the upload URLs.
POST /api/glamps/[slug]/publish/complete
Finalize the version after the Agent has uploaded the files. The handler verifies the upload, finalizes the version, and exposes the public page.
GET /[accountSlug]/[name]
Public glamp page. Renders the manifest, the rendered README.md (if any), and a file browser. Catch-all two-segment route on the main domain — 404s gracefully for non-glamp paths.
DELETE /api/glamps/[accountSlug]/[name]
Delete the entire glamp. Clerk auth, owner only. All versions and their files are deleted from object storage.
DELETE /api/glamps/[accountSlug]/[name]/versions/[version]
Delete a single version. Clerk auth, owner only.
CLI
On-VM CLI for GlampHub.
| Command | Purpose |
|---|---|
crabglamp glamp init | Write a starter ~/glamp.json and prompt for name / displayName / description / tags. |
crabglamp glamp stage | Scan for credentials, build a staging directory at ~/.crabglamp/glamp-staging/, and record the staging report. |
crabglamp glamp rescan | Re-run the credential scan on the existing staging directory without rebuilding it. |
crabglamp glamp confirm | Final scan, tarball, upload to object storage, finalize publish. New scan flags since the last stage block this. |
crabglamp glamp cancel | Delete the staging directory and cancel the API staging row. |
crabglamp glamp status | Show the current staging state or the list of published glamps under this account. |