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.
How it works
Enable preview environments for your app
Flip the toggle in your app settings. Choose TTL duration, database strategy, and resource limits.
Push a PR branch
Open a pull request on GitHub, GitLab, or Gitea. sh0 receives the webhook and starts building.
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.
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
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? +
What happens when the PR is merged? +
Can I set a TTL? +
Do preview environments share the database? +
Can I disable preview environments for specific apps? +
Is the build pipeline identical to production? +
Review code in production conditions
Every PR gets its own isolated environment with a unique URL. Merge with confidence.