Every branch gets a full-stack preview — backend, database, queues, anything in your docker-compose. Shareable URL, torn down automatically when the PR closes.
No credit card. Bring your own Docker compose.
$ git push origin feature/checkout-v2
Total 12 (delta 8), reused 0 (delta 0)
To github.com:your-org/your-app.git
▲ envloft build #87 ── feature/checkout-v2 ── 31s
✓ cloned · built · launched · DB seeded
→ https://feature-checkout-v2-web-7a9c.preview.envloft.com
Most preview platforms break the moment two people want the same base branch. Envloft scopes every launch to its own token — distinct hostnames, distinct databases, distinct containers — so your whole team can iterate in parallel.
App env launched by
Alex
https://checkout-v2-web-7a9c.preview.envloft.com
Own database. Own queue. Own bundle baked with Alex's sister URLs.
App env launched by
Sam
https://payments-v3-web-3f12.preview.envloft.com
Own database. Own queue. Own bundle baked with Sam's sister URLs.
Both Alex and Sam are working on the web project against the same main api branch. Envloft gives each launch its own token-suffixed hostnames, its own image builds, and its own data volumes. Hitting Alex's web hits Alex's api. Hitting Sam's web hits Sam's api. Always.
Three steps. Bring your existing Docker stack.
Install the Envloft GitHub App, pick which repos it can see, and link them. Group multiple repos into one App when their previews need to come up together.
Every push kicks off a build with your existing docker-compose. Templated env vars resolve to the right per-launch URL at compose-build time.
A unique URL per launch — your teammate's preview can never overwrite yours. Bookmark, share, or auto-comment it on the PR.
Predictable, copy-pasteable, never reused. Bookmark it once.
The git ref you pushed. Slug-safe — slashes become hyphens.
Which repo's container is on the other end. Set when you link the project.
Unique per launch. Stops two AppEnvs sharing the same branch from colliding on Caddy.
Caddy routes by hostname end-to-end — the URL is the address, not a redirect. .preview.localhost works on every dev machine without an /etc/hosts edit, and .preview.envloft.com works for everyone else.
Every build and every launch is its own page. The org dashboard rolls them up into a live feed with attribution and per-resource status.
Recent activity
live · refreshingcompose build exit 1
The boring stuff is solved: routing, secrets, teardown, hooks, isolation.
Anything that fits in a docker-compose.yml — Postgres, Redis, Celery workers, FastAPI, Next.js. Your stack runs the same in preview as it does in prod.
Token-scoped hostnames, per-launch images, namespaced volumes. Two devs on the same base branch never trample each other — each launch is its own sealed stack.
Reference one project's URL from another via {{ sisters.<slug>.url }} — Envloft bakes the right per-launch URL into each bundle at compose-build time.
Import a SQL dump, seed a DB, warm a cache. Set a service + command on the project — it runs after every launch, in your container.
Every build and every app env has its own URL with the log streaming in. Auto-tails in flight, shareable when something breaks.
See who launched what, when, from which commit. Across every project in the org, in one live feed on the dashboard.
Project secrets are encrypted with PyNaCl SecretBox before they hit Postgres. Master key lives off-disk in production.
Close a PR, the env is destroyed. Push a fix, the URL reloads with the new bundle. Nothing rots in the background.
Concurrent envs is the cost driver — pick the tier that fits your team's burst. Upgrade or downgrade any time.
Kick the tires. One repo, two envs.
Small teams running multiple repos with real previews.
Growing teams. Unlimited apps + projects.
Self-hosted runner, SSO, custom caps.
Prices in EUR, VAT not included. All plans run on the same EU infrastructure.
Envloft is in early access. Bring a real app and we'll get it running.