@hostasis/cli
v0.2.0
Published
Upload files to Swarm and update feeds with client-side stamping
Maintainers
Readme
Hostasis CLI
Command-line interface for uploading files to Swarm and managing feeds with client-side stamping.
Quick Start - GitHub Actions (Easiest Way!)
Deploy your web app to Swarm with just 3 lines:
- uses: hostasis/hostasis-cli@v1
with:
batch-id: ${{ secrets.HOSTASIS_BATCH_ID }}
key: ${{ secrets.HOSTASIS_KEY }}
path: ./distComplete Workflow Example
name: Deploy to Swarm
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
- name: Build
run: npm ci && npm run build
- name: Deploy to Swarm
uses: hostasis/hostasis-cli@v1
with:
batch-id: ${{ secrets.HOSTASIS_BATCH_ID }}
key: ${{ secrets.HOSTASIS_KEY }}
path: ./dist
project: my-app # Optional: separate feed for this project
spa: true # Enable for React, Vue, Angular, etc.Action Inputs
| Input | Required | Default | Description |
|-------|----------|---------|-------------|
| batch-id | Yes | - | Your postage batch ID |
| key | Yes | - | Your vault private key |
| path | Yes | dist | Path to built files |
| project | No | - | Project name (derives feed key from vault key) |
| gateway | No | https://bzz.sh | Swarm gateway URL |
| index-document | No | index.html | Index file for websites |
| spa | No | false | Enable SPA mode |
Action Outputs
| Output | Description | Example |
|--------|-------------|---------|
| reference | Swarm reference hash | abc123... |
| url | Full URL to content | https://bzz.sh/bzz/abc123... |
| cid | Content ID | bah5... |
| feed-url | Feed URL (always latest) | https://bzz.sh/bzz/owner/topic |
Using Outputs
- name: Deploy to Swarm
id: deploy
uses: hostasis/hostasis-cli@v1
with:
batch-id: ${{ secrets.HOSTASIS_BATCH_ID }}
key: ${{ secrets.HOSTASIS_KEY }}
path: ./dist
- name: Use deployment URL
run: echo "Deployed to ${{ steps.deploy.outputs.url }}"Required Secrets
Add these in repository settings: Settings → Secrets and variables → Actions
HOSTASIS_BATCH_ID: Your postage batch ID (get from Hostasis app)HOSTASIS_KEY: Your vault private key (use "Export Reserve Key" button)
⚠️ Security Note: Your vault key can upload to your batch and update your feed. Store it securely in GitHub Secrets, never commit it!
Framework Examples
See complete workflow examples in examples/workflows/:
Installation
npm install -g @hostasis/cliPrerequisites
You'll need:
- A postage batch on Swarm
- Your vault private key (exported from Hostasis web app)
Commands
hostasis upload
Upload files or directories to Swarm with client-side stamping.
Basic usage:
hostasis upload ./dist \
--batch-id 0xYOUR_BATCH_ID \
--key 0xYOUR_KEYOptions:
--batch-id <id>(required): Your postage batch ID (hex)--key <key>(required): Your vault private key for stamping (hex)--project <name>: Project name (derives feed signing key from vault key)--gateway <url>: Swarm gateway URL (default:https://bzz.sh)--index-document <file>: Index document for websites (default:index.html)--spa: Enable Single Page App mode (routes all 404s to index.html)--feed: Automatically update feed after upload--feed-index <number>: Feed index for update (auto-fetches next index if not specified)--depth <number>: Batch depth (auto-fetches from batch if not specified)--quiet: Suppress progress output, only show reference--output <format>: Output format:jsonortext(default:text)
Environment Variables:
You can set these instead of passing as flags:
HOSTASIS_BATCH_ID: Your postage batch IDHOSTASIS_PRIVATE_KEY: Your vault private keyHOSTASIS_PROJECT: Your project name
Smart Defaults:
- If
--depthis not specified, the CLI automatically queries your batch to get the correct depth - If
--feed-indexis not specified with--feed, the CLI automatically queries the current feed state to determine the next index
Examples:
# Upload a single file
hostasis upload ./file.txt \
--batch-id 0x... \
--key 0x...
# Upload a website directory
hostasis upload ./dist \
--batch-id 0x... \
--key 0x... \
--index-document index.html
# Upload a React/Vue SPA
hostasis upload ./build \
--batch-id 0x... \
--key 0x... \
--spa
# Upload with project-specific feed
hostasis upload ./dist \
--batch-id 0x... \
--key 0x... \
--project my-blog \
--feed
# Quiet mode (for scripts)
hostasis upload ./dist \
--batch-id 0x... \
--key 0x... \
--quiet
# JSON output
hostasis upload ./dist \
--batch-id 0x... \
--key 0x... \
--output json
# Upload and automatically update feed (auto-fetches depth and next index)
hostasis upload ./dist \
--batch-id 0x... \
--key 0x... \
--feed
# Upload and update feed at specific index (manual override)
hostasis upload ./dist \
--batch-id 0x... \
--key 0x... \
--feed \
--feed-index 5 \
--depth 20
# Use environment variables
export HOSTASIS_BATCH_ID=0x...
export HOSTASIS_PRIVATE_KEY=0x...
export HOSTASIS_PROJECT=my-portfolio
hostasis upload ./dist --feedhostasis feed update
Update a Swarm feed to point to new content.
Basic usage:
hostasis feed update \
--reference 0xSWARM_HASH \
--key 0xYOUR_KEY \
--batch-id 0xYOUR_BATCH_IDOptions:
--reference <hash>(required): Content reference (Swarm hash)--key <key>(required): Your vault private key for stamping (hex)--batch-id <id>(required): Your postage batch ID (hex)--project <name>: Project name (derives feed signing key from vault key)--gateway <url>: Swarm gateway URL (default:https://bzz.sh)--index <number>: Feed index (auto-fetches next index if not specified)--topic <hex>: Feed topic (defaults to NULL_TOPIC)--depth <number>: Batch depth (auto-fetches from batch if not specified)--quiet: Suppress progress output
Environment Variables:
You can set these instead of passing as flags:
HOSTASIS_BATCH_ID: Your postage batch IDHOSTASIS_PRIVATE_KEY: Your vault private keyHOSTASIS_PROJECT: Your project name
Smart Defaults:
- If
--depthis not specified, the CLI automatically queries your batch to get the correct depth - If
--indexis not specified, the CLI automatically queries the current feed state to determine the next index
Examples:
# Update feed to new content (auto-fetches depth and next index)
hostasis feed update \
--reference 0xabcd1234... \
--key 0x... \
--batch-id 0x...
# Update project-specific feed
hostasis feed update \
--reference 0xabcd1234... \
--key 0x... \
--batch-id 0x... \
--project my-blog
# Specify custom index and depth (manual override)
hostasis feed update \
--reference 0xabcd1234... \
--key 0x... \
--batch-id 0x... \
--index 5 \
--depth 20
# Use environment variables
export HOSTASIS_BATCH_ID=0x...
export HOSTASIS_PRIVATE_KEY=0x...
export HOSTASIS_PROJECT=my-app
hostasis feed update --reference 0xabcd...GitHub Actions Integration
Complete Workflow Example
name: Deploy to Swarm
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
- name: Install dependencies
run: npm install
- name: Build
run: npm run build
- name: Upload to Swarm and update feed
run: |
# Upload with client-side stamping and auto-update feed
npx @hostasis/cli upload ./dist \
--batch-id ${{ secrets.HOSTASIS_BATCH_ID }} \
--key ${{ secrets.HOSTASIS_KEY }} \
--project my-app \
--gateway https://bzz.sh \
--index-document index.html \
--spa \
--feed \
--output json > upload.json
# Display results
REFERENCE=$(jq -r .reference upload.json)
FEED_URL=$(jq -r .feedUrl upload.json)
echo "✓ Deployed to feed!"
echo "Reference: $REFERENCE"
echo "Feed URL: $FEED_URL"Required Secrets
Add these to your repository secrets (Settings > Secrets and variables > Actions):
HOSTASIS_BATCH_ID: Your postage batch ID (from Hostasis app)HOSTASIS_KEY: Your private key (from "Export Reserve Key" in Hostasis)
Multi-Project Support
You can manage multiple projects (websites, apps) using a single vault key and batch by specifying a --project name. Each project gets its own derived feed key.
How it works:
- Your vault key pays for stamping (owns the batch)
- Each project gets a derived key for feed signing
- The project key is deterministically derived:
keccak256(vaultKey || projectSlug) - Each project has its own feed URL
Benefits:
- Use one batch for multiple projects
- Each project has a separate feed URL
- Organized, isolated deployments
- No key management overhead
Example: Managing 3 projects with one key
# Deploy blog
hostasis upload ./blog/dist --project my-blog --feed
# Deploy portfolio
hostasis upload ./portfolio/dist --project my-portfolio --feed
# Deploy docs
hostasis upload ./docs/dist --project my-docs --feedEach project will have its own feed URL that always points to the latest version.
Getting Your Key
- Go to Hostasis app
- Navigate to your Reserves page
- Click "Export Reserve Key" for the vault you want to use
- Authenticate with your passkey
- Copy the private key
- Store it securely in your CI/CD secrets
⚠️ Security Note: This key can upload to your batch and update your feed. Store it securely!
How It Works
Client-Side Stamping
Unlike traditional Swarm uploads where the gateway stamps chunks, Hostasis uses client-side stamping:
- Reserve keys are derived from your passkey (one per vault)
- Each vault key owns its postage batch
- The CLI uses your vault key to sign chunks locally
- Chunks are uploaded pre-signed to the gateway
Benefits:
- No need to trust the gateway with your keys
- Works with any Swarm gateway
- Keys are safe to export for CLI/CI/CD use
- Full control over your uploads
Feed Updates
Feeds are mutable pointers that you control:
- Each project gets a derived key that owns the feed (specify with
--project) - Feed updates are Single-Owner Chunks (SOCs) signed by the project key
- You can update the feed to point to new content anytime
- Users always get the latest version via the feed URL
- The vault key still stamps chunks (pays for storage)
Project-Based Keys
When you specify a --project name:
- The project name is normalized to a slug (lowercase, hyphens, alphanumeric)
- A project key is derived:
projectKey = keccak256(vaultKey || projectSlug) - The vault key still stamps chunks (pays for storage)
- The project key signs feed updates (owns the feed)
This allows you to manage multiple projects with a single vault key while keeping their feeds separate.
Troubleshooting
"Invalid batch ID format"
Make sure your batch ID is a 64-character hex string. You can include or omit the 0x prefix.
"Stamp did not propagate to gateway"
The CLI automatically waits for your batch to propagate to the gateway. If this fails:
- Ensure your batch has sufficient balance
- Try a different gateway with
--gateway - Wait a few minutes and try again
"Feed update failed"
For feed updates, you need:
- The same vault key that owns the batch
- A valid postage batch ID
- The batch must be recognized by the gateway
"Invalid project slug"
Project names are normalized to slugs:
- Lowercase letters and numbers only
- Hyphens allowed (no spaces or underscores)
- Max 50 characters
- Examples:
my-blog,portfolio-2024,docs
License
MIT
