Pro & Business Feature

Every PR gets its own environment

Push a branch, open a PR, get a live URL. sh0 builds, deploys, and tears down preview environments automatically. No scripts, no staging bottlenecks.

What you get

Preview environments that deploy themselves, isolate completely, and clean up when done.

Auto-deploy on PR
Every pull request triggers a fresh isolated deployment automatically
Unique subdomains
Each PR gets its own subdomain like pr-123.yourapp.sh0.app
TTL auto-cleanup
Environments are destroyed automatically after merge or TTL expiry
Per-app toggle
Enable or disable preview environments on a per-application basis
Branch isolation
Each branch runs in its own container with zero interference
Shared database option
Optionally share a staging database across preview environments

How it works

01

Enable preview environments for your app

Flip the toggle in your app settings. Choose TTL duration, database strategy, and resource limits.

02

Push a PR branch

Open a pull request on GitHub, GitLab, or Gitea. sh0 receives the webhook and starts building.

03

sh0 auto-deploys to pr-123.yourapp.sh0.app

The branch is built using your production pipeline and deployed to an isolated container with a unique subdomain.

04

TTL expires, environment auto-destroyed

When the PR is merged or closed -- or the TTL runs out -- sh0 tears down the container and frees all resources.

The preview pipeline

Git Push
Webhook
Build
Deploy to Isolated Container
Assign Subdomain
TTL Timer
Auto-Cleanup

From git push to live URL in under 2 minutes -- fully automated, zero configuration

Everything you need

Automatic PR detection

sh0 listens for GitHub, GitLab, and Gitea webhooks. New PR opened? Build starts immediately, no manual action needed.

Unique subdomain per branch

Every preview gets a URL like pr-42.myapp.sh0.app. Share it with reviewers, QA, or clients for instant feedback.

Configurable TTL

Set a time-to-live of 1 hour, 24 hours, 7 days, or custom. Environments are cleaned up automatically when time runs out.

Zero manual cleanup

Merged the PR? sh0 detects the close event and destroys the environment. No orphaned containers, no wasted resources.

Same build pipeline as production

Preview environments use the exact same Dockerfile, build steps, and runtime as your production deploy. No surprises at merge time.

Comment on PR with URL

sh0 posts a comment on your pull request with the live preview URL. Reviewers click once and see the running app.

The old way

  • x Deploy staging manually
  • x Share one staging env across the team
  • x Conflicts between PRs on staging
  • x Manual cleanup of old environments
  • x No isolated testing per branch
  • x Hope staging matches production

The sh0 way

  • Auto-deploy every PR
  • Isolated environment per branch
  • Unique subdomain automatic
  • Auto-cleanup on merge or TTL
  • Same build as production
  • Link posted to PR automatically

Questions & answers

How are preview URLs generated? +
sh0 creates a subdomain using the PR number and app name: pr-undefined.undefined.sh0.app. For custom domains, you can configure a wildcard like *.preview.yourdomain.com.
What happens when the PR is merged? +
sh0 receives the merge/close webhook, stops the preview container, removes the subdomain route, and frees all resources. Fully automatic, zero manual steps.
Can I set a TTL? +
Yes. You can configure a TTL per app (e.g., 24 hours, 7 days). If the PR stays open longer than the TTL, the environment is destroyed to save resources. Re-opening the PR or pushing a new commit recreates it.
Do preview environments share the database? +
By default, each preview gets its own isolated environment with no database. You can optionally connect previews to a shared staging database if your app requires persistent data for testing.
Can I disable preview environments for specific apps? +
Yes. Preview environments are enabled per app via a toggle in app settings. Apps without the toggle enabled are unaffected by PR webhooks.
Is the build pipeline identical to production? +
Exactly identical. sh0 uses the same stack detection, Dockerfile generation, build steps, and runtime configuration. The only difference is the subdomain and the TTL lifecycle.

Review code in production conditions

Every PR gets its own isolated environment with a unique URL. Merge with confidence.