Deploy Elixir to servers you own.
Potions turns a DigitalOcean or Hetzner server into a home for Elixir: native Mix releases, zero-downtime deploys, SSL, PostgreSQL, backups and a live IEx console. The servers stay in your cloud account, and your apps keep running if you ever cancel.
- Phoenix 1.7+
- DigitalOcean or Hetzner
- No Dockerfile
A replay of the Potions setup wizard: connect a cloud provider, create a server, add an Elixir app from GitHub and deploy it.
Connect DigitalOcean with OAuth, or paste a Hetzner API token. Potions only ever works inside your own account.
Yours to keep
Cancel Potions. Your apps keep running.
Servers, databases and certificates live in your DigitalOcean or Hetzner account. Visitors reach Caddy on your server directly, never through us. Potions connects over SSH to deploy, monitor and back up, and that's all it does.
- a month to start
- $5
- a month to start
- cold starts
- 0
- cold starts
- to walk away
- $0
- to walk away
Two connections reach your server. Only one is Potions. Potions is gone. cauldron is still answering 200 OK.
What you get
The parts of production you'd rather not build.
Your cloud. Your servers.
Potions creates servers in your own DigitalOcean or Hetzner account and sets them up for Elixir: PostgreSQL, Caddy with automatic SSL, a firewall and fail2ban. You keep full SSH access.
Read the docs →Add order export just now
Fix cart totals 2h ago
Zero-downtime deploys.
Each deploy builds a native Mix release, starts it on the idle slot and health-checks it before Caddy moves traffic over. Turn on auto-deploy and a push is all it takes.
Read the docs →Raise the pool size 1m ago
Bad deploys never go live.
A release that fails its health check is stopped while the current one keeps serving. The failed deploy comes with a plain-language read of what broke, and rolling back rebuilds nothing.
Read the docs →The BEAM, within reach.
Open IEx on the running node from your browser, stream live logs, and connect nodes over Erlang distribution so PubSub and Presence work across servers.
Read the docs →Grows into a cluster.
Move the database to its own server, put a Caddy load balancer in front and add nodes. Deploys roll across them one at a time over your private network.
Read the docs →Backups you can restore.
Daily PostgreSQL backups with the retention you choose, copied to an S3-compatible bucket you own. SQLite apps can stream every change there with Litestream.
Read the docs →Built for Elixir. Only Elixir.
Made for the BEAM, not bolted onto it.
Written by hand, with Tidewave, Claude Code, Cursor or Codex: Potions builds it as a native Mix release, and Phoenix 1.7+ apps work out of the box. Pick the Elixir and OTP versions per app.
- Elixir 1.17–1.20
- OTP 27–29
- Phoenix 1.7+
- LiveView
- Ecto + PostgreSQL
- Ecto + SQLite
- Oban
- Umbrellas & monorepos
- esbuild + Tailwind
PaaS convenience. VPS control.
The trade-off, without the trade-off.
| PaaS easy, but rented | DIY VPS owned, but you're the ops team | Potions owned, with the ops handled | |
|---|---|---|---|
| You own the servers | no | yes | yes |
| Push-to-deploy | yes | build it yourself | yes |
| Zero-downtime deploys | sometimes | build it yourself | yes, health-gated |
| No cold starts | paid tiers | yes | yes |
| SSL certificates | yes | configure and renew | automatic |
| SSH and IEx on the node | varies | yes | yes, plus IEx in the browser |
| Elixir-native | generic | whatever you script | built for it |
| Pricing | per app + usage | the server | flat + the server |
| One more app | one more bill | $0, same server | $0, same server |
Server costs are paid directly to your cloud provider.
14-day free trial on every plan
Flat pricing. Unlimited apps.
Compare plans →Unlimited apps per server. You pay your provider for the servers. Cancel anytime, and your apps keep running.
FAQ
Questions people ask first.
What happens to my apps if I cancel, or Potions has an outage?
They keep running. Your servers, apps and databases live in your own cloud account, and requests go straight to Caddy on your servers, never through us. Cancelling costs you the dashboard and automated deploys, not your apps.
Can I still SSH into my servers?
Yes. You get full SSH access as the deploy user. Potions manages your servers, it doesn't lock you out of them.
Do I need Docker?
No. Potions builds native Mix releases and deploys them directly. No Dockerfiles, no container registries, no orchestration layer.
How is this different from Fly.io, Render or Gigalixir?
Those platforms run your app on their infrastructure and bill you for each app or machine you run. With Potions you deploy to servers in your own cloud account and pay your provider for the server directly. A server runs as many apps as fit on it, so another app doesn't mean another bill, and nothing sleeps between requests, so there are no cold starts.
How do you keep my servers secure?
Potions connects over SSH using keys generated per server. Cloud tokens and environment variables are encrypted with AES-256-GCM at rest. Every server ships with fail2ban, UFW firewall rules and unattended security upgrades.
Which plan do I need?
Every plan runs unlimited apps per server. Plans differ in how many servers you get and a few extras: uptime checks from Solo, and clusters, offsite backups and scheduled tasks from Team.
Your next deploy is one push away.
Connect DigitalOcean or Hetzner, connect GitHub, create a server and deploy. The quick start takes under ten minutes, and the first 14 days are on us.
No app handy? Deploy our starter, cauldron:
$git clone https://github.com/potionsio/cauldron