HOSTING GUIDE
Publish your first app
Pipe Hosting serves static files and runs WebAssembly HTTP apps with a persistent SQLite database. Each site gets its own HTTPS address at your-site.apps.pipedev.network.
Try the starter
- Open Hosting, sign in, and enable your free account.
- Create a site with a unique name.
- Download the deployment ZIP, then choose it under Upload a bundle.
- Choose Apply migrations to create the starter’s database tables.
- Choose Publish release, then Open site. The first HTTPS visit may take a few seconds while its certificate is issued.
The starter is a public notes demo. Anyone with its URL can use it. Add authentication in your app before storing private customer data.
Build your own app
Download the starter source. It includes Rust HTTP routes, HTML/CSS/JavaScript, SQLite migrations, and a bundle tool. Install Rust and Python 3.10 or later, then run these commands from the extracted starter folder:
rustup target add wasm32-wasip1 --toolchain 1.95.0 python3 pipe.py bundle # Upload dist/pipe-app.zip in Hosting.
Edit html/ for your frontend, src/lib.rs for HTTP routes, and migrations/sqlite/ for numbered database migrations. Rebuild and upload a new bundle after each change. The bundle tool creates the manifest and integrity hashes.
Static files are served directly. Routes under /api/ run in Spin. This service runs WebAssembly apps built for the Spin host interfaces; Node.js processes, Docker images, and arbitrary server executables belong on a VM.
Deploy from CI or your terminal
Create a deployment key under Deploy from your terminal or CI in Hosting. Enable deployment permission. Store the returned key as PIPE_HOST_TOKEN in your secret manager. A key is scoped to your hosting account and expires after 90 days.
export PIPE_HOST_URL='https://api.pipedev.network/control-api/v1/hosting' # Read the site ID and current active_release: curl "$PIPE_HOST_URL/sites" \ -H "Authorization: Bearer $PIPE_HOST_TOKEN" # Set SITE_ID to your site's UUID, then upload: curl --fail-with-body "$PIPE_HOST_URL/sites/$SITE_ID/releases" \ -H "Authorization: Bearer $PIPE_HOST_TOKEN" \ -H 'Content-Type: application/zip' \ --data-binary @dist/pipe-app.zip
The upload returns a release_id. Apply migrations, then publish using the same request body. Replace RELEASE_ID with that value and expected_active with the current release ID, or null for a new or unpublished site.
curl --fail-with-body "$PIPE_HOST_URL/sites/$SITE_ID/migrations" \
-H "Authorization: Bearer $PIPE_HOST_TOKEN" \
-H 'Content-Type: application/json' \
--data '{"release_id":"RELEASE_ID","expected_active":null}'
curl --fail-with-body "$PIPE_HOST_URL/sites/$SITE_ID/activate" \
-H "Authorization: Bearer $PIPE_HOST_TOKEN" \
-H 'Content-Type: application/json' \
--data '{"release_id":"RELEASE_ID","expected_active":null}'If a response is lost, list the site and releases before retrying. Uploading identical bundle bytes reuses the release. Publishing uses expected_active to prevent overwriting a concurrent deployment; a conflict means you should reload the current site state.
Data, releases, and limits
Your SQLite database persists across deployments, sleeping workers, and host restarts. Migrations run once and are checked against their original contents. Use additive migrations that work with both old and new releases. Rolling back a release changes the code; it does not undo database migrations.
Bundles can be up to 32 MiB compressed. Each site starts with up to 50 MB of SQLite allocation. To change it, unpublish the site, update its allocation under Runtime logs & storage, then publish again. Allocations across your sites must fit your plan.
Workers sleep when idle and start on the next dynamic request. Requests have a 15-second deadline. Runtime memory and concurrent work are bounded; heavy computation and long-running jobs belong on a VM. Customer apps have no general outbound network access or filesystem mounts. SQLite is the supported managed database for this launch.
Custom domains
Starter and Pro include custom domains. Add a domain to your site, create the displayed CNAME and TXT records, then choose Verify DNS. Use DNS-only records when using Cloudflare. The hostname must continue to point to Pipe and retain its verification TXT record; verification is renewed periodically. Publish the site before opening the custom URL.
Plans and billing
Free includes 2 sites, 100,000 dynamic requests, 5 GB transfer, and 100 MB SQLite allocation. Starter costs 5 USDC for 30 days and includes 5 sites, 1 million requests, 50 GB transfer, and 1 GB SQLite. Pro costs 19 USDC for 30 days and includes 20 sites, 10 million requests, 250 GB transfer, and 5 GB SQLite.
Plans use your shared Pipe credit. There is no automatic renewal or usage overage charge. Renewals and plan changes queue after your current paid term. Usage cycles run every 30 days from account creation; purchasing a plan does not reset usage. When paid service expires, Free limits apply and data remains stored. Reduce allocations and site count or renew to restore service.