Skills Static Website Hosting - Static.app
Deploy static websites to Static.app hosting. Use when the user wants to deploy, upload, or host a static site on Static.app. Triggers on phrases like "deploy to static.app", "upload to static", "host on static.app", "static.app deploy", or when working with the Static.app hosting service.
git clone https://github.com/openclaw/skills
T=$(mktemp -d) && git clone --depth=1 https://github.com/openclaw/skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/akellacom/static-app" ~/.claude/skills/clawdbot-skills-static-website-hosting-static-app && rm -rf "$T"
skills/akellacom/static-app/SKILL.mdStatic.app Deployment Skill
Deploy static websites and applications to Static.app hosting directly from OpenClaw.
Workspace Structure
All Static.app operations in your workspace use a dedicated folder structure:
workspace/ └── staticapp/ # Main folder for all Static.app operations ├── new-site/ # New sites created locally └── {pid}/ # Downloaded existing sites (by PID)
- New sites: Created in
subfolders before deploymentstaticapp/ - Downloaded sites: Extracted to
for editingstaticapp/{pid}/
How Static.app Handles Files
Static.app automatically creates clean URLs from your filenames:
| File | URL |
|---|---|
| (homepage) |
| |
| |
| |
No subdirectories needed! Just create
.html files in the root folder.
Project Structure
Simple Multi-Page Site
my-site/ ├── index.html # Homepage → / ├── about.html # About page → /about ├── portfolio.html # Portfolio → /portfolio ├── contact.html # Contact → /contact ├── style.css # Stylesheet ├── js/ # JavaScript files │ ├── main.js │ └── utils.js └── images/ # Images folder ├── logo.png └── photo.jpg
JavaScript App (React, Vue, etc.)
For JS apps, build first, then deploy the
dist (or build) folder:
# Build your app npm run build # Deploy the dist folder node scripts/deploy.js ./dist
Prerequisites
- Get API Key: Go to https://static.app/account/api and create an API key (starts with
)sk_ - Set Environment Variable: Store the API key in
env varSTATIC_APP_API_KEY
Usage
Deploy Multi-Page Site
# Create your pages echo '<h1>Home</h1>' > index.html echo '<h1>About</h1>' > about.html echo '<h1>Portfolio</h1>' > portfolio.html # Deploy node scripts/deploy.js
Deploy Specific Directory
node scripts/deploy.js ./my-site
Update Existing Site
node scripts/deploy.js . --pid olhdscieyr
List All Sites
node scripts/list.js
List Site Files
node scripts/files.js YOUR_PID
Options:
— Output raw JSON--raw
— Specify API key-k <key>
Delete Site
node scripts/delete.js YOUR_PID
Options:
— Skip confirmation prompt-f, --force
— Specify API key-k <key>
Download Site
Download an existing site to your workspace for editing:
node scripts/download.js YOUR_PID
This will:
- Fetch the download URL from Static.app API
- Download the site archive
- Extract it to
staticapp/{pid}/
Options:
— Site PID to download-p, --pid
— Custom output directory (default:-o, --output
)./staticapp/{pid}
— Specify API key-k <key>
— Output raw JSON response--raw
Example:
# Download site to default location node scripts/download.js abc123 # Download to custom folder node scripts/download.js abc123 -o ./my-site
Script Options
node scripts/deploy.js [SOURCE_DIR] [OPTIONS] Arguments: SOURCE_DIR Directory to deploy (default: current directory) Options: -k, --api-key API key (or set STATIC_APP_API_KEY env var) -p, --pid Project PID to update existing site -e, --exclude Comma-separated exclude patterns --keep-zip Keep zip archive after deployment
Default Exclusions
The following are automatically excluded from deployment:
node_modules
,.git.github*.mdpackage*.json.env.openclaw
Important Notes
✅ What Works
- Static HTML sites — Any number of
pages.html - CSS & JavaScript — Frontend frameworks, vanilla JS
- Images & Assets — Place in
folder or rootimages/ - JavaScript files — Place in
folder or rootjs/ - Built JS Apps — Deploy
ordist/
folder afterbuild/npm run build
❌ What Doesn't Work
- Node.js Server Apps — No server-side rendering, no Express.js, no API routes
- PHP, Python, Ruby — Static.app only serves static files
- Databases — Use client-side storage or external APIs
JavaScript Apps Workflow
# 1. Build your React/Vue/Angular app npm run build # 2. Deploy the build output node scripts/deploy.js ./dist --pid YOUR_PID
API Reference
Deploy Site
- Endpoint:
POST https://api.static.app/v1/sites/zip - Auth: Bearer token (API key)
- Body: Multipart form with
(zip file) and optionalarchivepid
List Sites
- Endpoint:
GET https://api.static.app/v1/sites - Auth: Bearer token (API key)
- Headers:
Accept: application/json
List Site Files
- Endpoint:
GET https://api.static.app/v1/sites/files/{pid} - Auth: Bearer token (API key)
- Headers:
Accept: application/json
Delete Site
- Endpoint:
DELETE https://api.static.app/v1/sites/{pid} - Auth: Bearer token (API key)
- Headers:
Accept: application/json
Download Site
- Endpoint:
GET https://api.static.app/v1/sites/download/{pid} - Auth: Bearer token (API key)
- Headers:
Accept: application/json - Response: Returns download URL for the site archive
Dependencies
— Zip archive creationarchiver
— Multipart form encodingform-data
— HTTP requestsnode-fetch
— Zip extractionadm-zip
Install with:
cd scripts && npm install
Response
On success, the script outputs:
✅ Deployment successful! 🌐 Site URL: https://xyz.static.app 📋 PID: abc123 STATIC_APP_URL=https://xyz.static.app STATIC_APP_PID=abc123
Workflow
- Check for
env var orSTATIC_APP_API_KEY--api-key - Create zip archive from source directory (with exclusions)
- Upload to Static.app API
- Parse response and output URLs
- Clean up temporary zip file
Error Handling
- Missing API key → Clear error with instructions
- Network issues → HTTP error details
- Invalid PID → API error message