Overview
Deploy any React app, vanilla JS site, or static bundle to a Canvas app. Upload a.zip of your build output and Mixpeek handles hosting, CDN distribution, and versioning — no infrastructure needed.
Every deploy creates an immutable version record with a commit message, asset manifest, and content hashes. See Version History for the full version control system.
Quickstart
Zip the output directory
index.html at the root (or inside a single top-level folder). Mixpeek auto-detects the entry point.Get a presigned upload URL
upload_url for the next step and bundle_s3_key for the deploy request.https://{slug}.mxp.co within seconds of a successful build.
Environments
Each app supports two independent environments with separate URLs and asset prefixes:| Environment | URL pattern | Deploy field |
|---|---|---|
| Production | {slug}.mxp.co | "environment": "production" |
| Staging | staging-{slug}.mxp.co | "environment": "staging" |
Deploying to staging
https://staging-{slug}.mxp.co.
Promoting staging to production
Once you’ve verified staging, promote it to production by deploying the same bundle to the production environment, or use the restore endpoint to point production at the staging version:Deploy lifecycle
| Stage | Description |
|---|---|
queued | Bundle uploaded, deploy queued |
building | Mixpeek is validating, packaging, and uploading assets |
complete | Deploy complete — new version is live |
failed | Deploy failed — previous version stays live, error returned |
Check deploy status
GET /v1/apps/{app_id}/deploys/{deploy_id} returns the current status of a deploy:
status field will be one of: queued, building, complete, or failed.
Stream build logs
GET /v1/apps/{app_id}/deploys/{deploy_id}/logs/stream returns a Server-Sent Events (SSE) stream of build logs in real time. Use this to monitor progress or debug failed deploys:
complete or failed.
Multi-file output
Your zip can contain any number of files — HTML, JS, CSS, images, fonts. The only requirement is anindex.html at the root. All files are uploaded to S3 and served with appropriate cache headers:
index.html— no-cache (always fresh)- Content-hashed files (e.g.,
app-a1b2c3.js) — immutable, permanent cache - Other assets — standard cache headers
Canvas SDK
Your app runs inside the Mixpeek canvas runtime. Call Mixpeek APIs through the built-in/api proxy — credentials are injected server-side, so your API key never reaches the browser:
Use
/api/v1/... (relative path) instead of https://api.mixpeek.com/v1/... — the canvas proxy injects Authorization and X-Namespace headers automatically, avoiding CORS and keeping API keys out of your bundle.Pre-deploy validation
Mixpeek runs automatic checks on every bundle before deploying:| Check | What it catches |
|---|---|
| index.html exists | Missing entry point (zip structure wrong) |
| Script tags present | Blank page (no executable code) |
| Asset references valid | Broken src/href links in index.html |
No bare process.env | Runtime crash in browser (use window.__MIXPEEK__ instead) |
| Bundle size < 50 MB | Accidentally included node_modules or large assets |
| JS bundles non-empty | Failed build that produced empty files |
Deploy via Studio
In the App details page, drag & drop your.zip file onto the Deploy panel and click Deploy. The build is queued immediately and status updates in real time.
Rollback
Every deploy is versioned. You have two rollback options: Quick rollback — restore the previous config:Source files
When you includesource_files in your deploy request, those files are stored alongside the version record. This enables:
- Source-level diffs — compare actual source code between versions, not just built output
- Download and re-deploy — download a version’s source files and deploy modified code

