A Piral application has two independent deployment streams, and keeping them separate is the whole point:
The app shell is a static site. You build it once and host the dist/release/ output like any SPA. It changes rarely.
Pilets are published to a feed service, not bundled into the shell. They ship continuously, on each team's own schedule, without ever redeploying the shell.
This page covers both, plus the server configuration and caching that make it reliable.
Two independent pipelines: the shell deploys as a static site, pilets publish to the feed — and they meet only in the browser.
npm run build produces dist/release/ — plain static files (HTML, JS, CSS, assets). Serve them from any static host or web server. There is one hard requirement: because routing is client-side, the server must fall back to index.html for any path that isn't a real file, so deep links and refreshes work.
For IIS, add a rewrite rule in web.config that maps non-file requests to /index.html. The principle is identical: real files are served as-is, everything else returns the shell.
The feed stores the bundle on your CDN and records the new version; the next feed response includes it. Where the feed lives — Piral Cloud or a custom feed service — doesn't change the publish step.
Because the shell only knows the feed URL, rolling back a pilet never touches the shell. Point the feed at the previous version and users pick it up on their next load: