The Rigbox app catalog provides curated, pre-packaged applications that you can install into any workspace with a single API call. Each catalog app is configured with the correct port, subdomain, and systemd service — no manual setup required.
How It Works
When you install a catalog app:
Rigbox downloads and configures the app inside your workspace
A systemd service is created so the app starts automatically and restarts on failure
An app route is created, mapping the app’s port to a *.rigbox.dev subdomain
The app is immediately accessible once installation completes
You manage installed catalog apps with the same endpoints you use for any other app — start, stop, restart, delete, and change visibility.
Available Apps
Browse the catalog to see what’s available.
curl -s https://api.rigbox.dev/api/app-catalog \
-H "Authorization: Bearer $RIGBOX_API_KEY " | jq
See Browse Catalog for the full response schema.
Catalog Reference
App Catalog ID Port Subdomain Description VS Code Server vscode8443 vscodeBrowser-based VS Code with full extension support Jupyter Lab jupyter8888 jupyterInteractive notebooks for Python, Julia, R Marimo marimo8000 marimoReactive Python notebooks Streamlit streamlit8501 streamlitPython data app framework for dashboards File Browser filebrowser8080 filesWeb-based file manager with upload/download Excalidraw excalidraw3000 excalidrawCollaborative whiteboard and diagramming PGWeb pgweb8081 pgwebPostgreSQL web client with query builder Chat Starter chat3000 chatMinimal chat UI template with OpenAI integration
Subdomains are prefixed with the workspace name. For example, if your workspace app is named my-ws-vscode, the full URL would be https://my-ws-vscode.rigbox.dev.
Installing a Catalog App
Install an app by sending the catalog ID. The endpoint returns a job ID you can use to track installation progress.
Start the installation
curl -X POST https://api.rigbox.dev/api/workspaces/ $WORKSPACE_ID /install-app \
-H "Authorization: Bearer $RIGBOX_API_KEY " \
-H "Content-Type: application/json" \
-d '{
"catalog_id": "vscode"
}'
See Install Catalog App for the full request/response schema.
Track installation progress
Poll the job endpoint to check progress.
curl -s https://api.rigbox.dev/api/workspaces/ $WORKSPACE_ID /jobs/ $JOB_ID \
-H "Authorization: Bearer $RIGBOX_API_KEY " | jq
See Get Job Status for the response schema.
Access the installed app
Once completed, the app is running and accessible at its subdomain URL.
Managing Installed Apps
After installation, catalog apps behave like any other app. Use the standard app endpoints to manage them.
Start and Stop
cURL (stop)
cURL (start)
cURL (restart)
curl -X POST https://api.rigbox.dev/api/apps/ $APP_ID /stop \
-H "Authorization: Bearer $RIGBOX_API_KEY "
See Start App , Stop App , and Restart App for details.
Change Visibility
Catalog apps are private by default. Make them public or share with specific people.
curl -X PUT https://api.rigbox.dev/api/apps/ $APP_ID /visibility \
-H "Authorization: Bearer $RIGBOX_API_KEY " \
-H "Content-Type: application/json" \
-d '{"visibility": "public"}'
See App Visibility for all visibility options.
Delete
Deleting an installed app removes both the route and the systemd service inside the workspace.
curl -X DELETE https://api.rigbox.dev/api/apps/ $APP_ID \
-H "Authorization: Bearer $RIGBOX_API_KEY "
See Delete App for details.
App Details
VS Code Server
A full browser-based VS Code instance with extension support, integrated terminal, and file editing. Runs code-server .
curl -X POST https://api.rigbox.dev/api/workspaces/ $WORKSPACE_ID /install-app \
-H "Authorization: Bearer $RIGBOX_API_KEY " \
-H "Content-Type: application/json" \
-d '{"catalog_id": "vscode"}'
VS Code Server supports installing extensions from the Open VSX registry. Search and install extensions directly from the browser UI.
Jupyter Lab
Interactive notebooks for Python, Julia, R, and more. Supports inline visualizations, markdown cells, and kernel management.
curl -X POST https://api.rigbox.dev/api/workspaces/ $WORKSPACE_ID /install-app \
-H "Authorization: Bearer $RIGBOX_API_KEY " \
-H "Content-Type: application/json" \
-d '{"catalog_id": "jupyter"}'
Marimo
Reactive Python notebooks where cells automatically re-execute when dependencies change. An alternative to Jupyter with a focus on reproducibility.
curl -X POST https://api.rigbox.dev/api/workspaces/ $WORKSPACE_ID /install-app \
-H "Authorization: Bearer $RIGBOX_API_KEY " \
-H "Content-Type: application/json" \
-d '{"catalog_id": "marimo"}'
Streamlit
Build interactive data dashboards and web apps in Python. Write a Python script and Streamlit renders it as a web application.
curl -X POST https://api.rigbox.dev/api/workspaces/ $WORKSPACE_ID /install-app \
-H "Authorization: Bearer $RIGBOX_API_KEY " \
-H "Content-Type: application/json" \
-d '{"catalog_id": "streamlit"}'
File Browser
A web-based file manager with drag-and-drop upload, download, and file editing. Useful for managing files inside the workspace without SSH.
curl -X POST https://api.rigbox.dev/api/workspaces/ $WORKSPACE_ID /install-app \
-H "Authorization: Bearer $RIGBOX_API_KEY " \
-H "Content-Type: application/json" \
-d '{"catalog_id": "filebrowser"}'
Excalidraw
A collaborative whiteboard for sketching diagrams, wireframes, and architecture drawings. Runs locally inside the workspace — no external dependencies.
curl -X POST https://api.rigbox.dev/api/workspaces/ $WORKSPACE_ID /install-app \
-H "Authorization: Bearer $RIGBOX_API_KEY " \
-H "Content-Type: application/json" \
-d '{"catalog_id": "excalidraw"}'
PGWeb
A web-based PostgreSQL client with a query editor, table browser, and export functionality. Useful for inspecting databases running inside the workspace.
curl -X POST https://api.rigbox.dev/api/workspaces/ $WORKSPACE_ID /install-app \
-H "Authorization: Bearer $RIGBOX_API_KEY " \
-H "Content-Type: application/json" \
-d '{"catalog_id": "pgweb"}'
Chat Starter
A minimal chat UI template with OpenAI API integration. Use it as a starting point for building conversational AI applications.
curl -X POST https://api.rigbox.dev/api/workspaces/ $WORKSPACE_ID /install-app \
-H "Authorization: Bearer $RIGBOX_API_KEY " \
-H "Content-Type: application/json" \
-d '{"catalog_id": "chat"}'
Chat Starter requires Node.js, which is available in the base, dev, and full images but not in openclaw. Check your workspace image before installing.
Image Compatibility
Most catalog apps work on all images, but some have dependencies that not every image provides.
App base dev full openclaw VS Code Server Yes Yes Yes Yes Jupyter Lab Yes Yes Yes No (needs Python) Marimo Yes Yes Yes No (needs Python) Streamlit Yes Yes Yes No (needs Python) File Browser Yes Yes Yes Yes Excalidraw Yes Yes Yes Yes PGWeb Yes Yes Yes Yes Chat Starter Yes Yes Yes No (needs Node.js)
The base image has pre-warmed npm caches for Jupyter, Marimo, Streamlit, and Excalidraw. Installation on base is significantly faster than on other images because dependencies are already downloaded.
Complete Example: Install VS Code and Jupyter
This walkthrough installs both VS Code and Jupyter Lab into a single workspace.
import requests
import time
API_URL = "https://api.rigbox.dev/api"
HEADERS = { "Authorization" : f "Bearer { api_key } " }
workspace_id = "your-workspace-id"
# Install VS Code
vscode_result = requests.post(
f " { API_URL } /workspaces/ { workspace_id } /install-app" ,
headers = HEADERS ,
json = { "catalog_id" : "vscode" },
).json()
print ( f "VS Code install started — job: { vscode_result[ 'job_id' ] } " )
# Install Jupyter
jupyter_result = requests.post(
f " { API_URL } /workspaces/ { workspace_id } /install-app" ,
headers = HEADERS ,
json = { "catalog_id" : "jupyter" },
).json()
print ( f "Jupyter install started — job: { jupyter_result[ 'job_id' ] } " )
# Wait for both to complete
for name, job_id in [( "VS Code" , vscode_result[ "job_id" ]), ( "Jupyter" , jupyter_result[ "job_id" ])]:
while True :
job = requests.get(
f " { API_URL } /workspaces/ { workspace_id } /jobs/ { job_id } " ,
headers = HEADERS ,
).json()
if job[ "status" ] == "completed" :
print ( f " { name } installed successfully" )
break
elif job[ "status" ] == "failed" :
print ( f " { name } installation failed: { job.get( 'message' , '' ) } " )
break
time.sleep( 3 )
print ( "Both apps installed and accessible at their subdomain URLs." )
Next Steps