solutions

Every pull request,
a full stack of its own.

A preview here is not a static build — it's the whole app running on its own Firecracker microVM, built from the PR's exact commit, with a branch of your database to migrate against. Merge or close the PR and it all disappears; leave it idle and it scales to zero.

$0
when nobody is looking
1 branch
of your database per PR
git push — zero-downtime deploy
lifecycle

The pull request does the driving.

Previews are opt-in per repository. Once a repo is enabled, PR events run the whole show — no CI config, no deploy scripts, no cleanup job to remember. One sticky comment on the PR tracks state: building, ready with the URL, or failed.

opened → built

Opening (or reopening) a PR provisions a preview from its head commit — the same pipeline as a regular app deploy — and posts the URL back on the pull request.

push → rebuilt

New commits rebuild the preview and edit the same comment in place. The URL is stable for the life of the PR, so the link never goes stale.

closed → gone

Merge or close tears the environment down. A reaper also removes previews with no push for 24 hours, so an abandoned PR can never leak a running stack — or comment @pandastack delete to end it early.

the database

Branch the data, review the migration for real.

Most preview systems stop at the frontend, so schema changes ship on faith. Here the database branches too: a clone is a brand-new database built from your real backups, so migrations get exercised against real data shape — not fixtures — and thrown away with the PR.

A database branch per PR

Cloning never touches the source — it works against running, hibernated, even failed databases. The branch gets fresh credentials and its own independent backup stream, and point-in-time restore lets you branch from any instant, like the moment before a bad migration landed.

source untouchedfresh credentialsown backup stream
python — pip install pandastack
from pandastack import Client

client = Client()

# Enable PR previews for the repo
client.apps.enable_preview_repo(123456789, repo_full_name="you/your-repo")

# Branch production data for the PR to migrate against
branch = client.databases.clone(prod_db_id, label="pr-142")
print(branch["connection_url"])   # a NEW database, cloned_from = source
scale to zero

A stack nobody clicks costs $0.

An idle preview hibernates — memory and disk snapshotted, active-compute billing stopped — and the next click wakes it transparently, typically sub-second for the app. So a real running stack per PR costs compute for the minutes it's actually reviewed, not 24/7.

PandaStack previewstatic build preview
What reviewers getthe whole app, running on its own microVMa frontend bundle
Server code & APIsdeployed, health-checked, servingmocked or absent
Databasea branch built from your real backupsfixtures and seed scripts
Schema migrationsrun for real, reviewed in the PRuntested until staging
Idle cost$0 — hibernated until the next clickfree, because nothing runs at all
built from

Composed from primitives you can use directly.

Preview environments aren't a separate product — they're apps, databases, and sandboxes wired to your pull requests. Everything those pages promise applies here.

Databases are never overcommitted — the guaranteed class, even in a preview.

Ship on the millisecond cloud.

Free tier with $5.40/mo usage credit. No card. Apache-2.0.