Ship your app. Skip the cloud console.

Launchd takes a single config file and turns it into running infrastructure: containers, databases, queues, buckets, and background jobs. The file you run locally is the exact one we deploy in production.

launchd.hcl
app "api" {
container {
path = "./api"
port = 8080
}
database "main" {}
bucket "uploads" {}
queue "emails" {}
env = {
DATABASE_URL = database.main.url
BUCKET_URL = bucket.uploads.url
QUEUE_URL = queue.emails.url
}
domain "api.acme.com" {
tls = "auto"
}
}
20 lines. One command. Ready to launch. $ launchd deploy

Why we built this.

We built infrastructure at NixLabs, and apps at SimpleLogic, and somewhere along the way we decided all existing tools sucked. So we built something better.

We were tired of becoming the platform team.

Every new project started the same way. Somebody disappears for a week setting up networking, IAM permissions, Terraform folders, registries, CI pipelines, secrets, and staging environments before a single feature ships. The rest of the team sits around waiting for infrastructure to exist. We kept rebuilding the same foundation over and over again and pretending that was normal.

We wanted local dev to feel exactly like production.

Most teams end up with one setup for local development and a completely different one in production. Things work on your laptop, break in staging, then break differently in production. Docker compose files slowly turn into random scripts and undocumented setup steps nobody remembers. We wanted one file that behaves the same way everywhere so the environment stops being part of the problem.

We wanted the bill to make sense.

Cloud invoices have turned into a joke. You deploy one app and suddenly you are paying separately for traffic, NAT gateways, logging, load balancers, storage operations, and ten other things nobody asked for. Half the time you do not even know what generated the charge. We wanted pricing that felt obvious. You should be able to look at your infrastructure and immediately understand what costs money and why.

We wanted a way out if we ever needed one.

A lot of platforms make migration painful on purpose. Custom runtimes, proprietary config formats, weird APIs, and features that only work inside their ecosystem. The longer you stay, the harder it gets to leave. We wanted to build around normal containers, standard networking, and boring infrastructure primitives so moving somewhere else later would not turn into a rewrite.

How we're different.

Railway, Vercel, Fly, and the big clouds all do good work, we used several of them ourselves, but we're a different shape. Here's what we mean by that.

Config is one file in your repo

Launchd
Railway
partial
Vercel
partial
Fly.io
AWS

Local dev mirrors production

Launchd
Railway
Vercel
partial
Fly.io
partial
AWS

Simple primitives

Launchd
Railway
partial
Vercel
partial
Fly.io
partial
AWS

Scheduled + one-off jobs in the same file

Launchd
Railway
partial
Vercel
Fly.io
AWS
partial

Egress between your services is free

Launchd
Railway
Vercel
Fly.io
AWS

Bring your own Postgres / S3

Launchd
Railway
Vercel
Fly.io
partial
AWS

Container images stay portable OCI

Launchd
Railway
Vercel
Fly.io
AWS

Pricing is per-second, one invoice

Launchd
Railway
partial
Vercel
Fly.io
partial
AWS
Comparison is current as of May 2026. We try to keep it honest. included  ·  partial = available with effort  ·  — not supported

Six primitives. One file.

Each primitive is the thing you'd reach for if you started over. Nothing here is a new query language, a proprietary protocol, or a mandatory SDK. If it looks boring, that's the point.

Containers

OCI · linux/amd64+arm64

Bring a Dockerfile or point at a directory. We build, sign, and push. No registry to set up.

container {
path = "./api"
port = 8080
}

Databases

Postgres 16 · MySQL 8 · Redis 7

Managed, backed up, point-in-time recoverable. Reference the URL by name from any container.

database "main" {
engine = "postgres"
version = 16
}

Queues + Jobs

Async data processing

Durable queues, scheduled jobs, and one-off workers — declared together. At-least-once delivery, DLQs, cron, retries.

queue "emails" {
retention = "14d"
dlq = true
}
job "nightly" {
schedule = "0 3 * * *"
reads = queue.emails
}

Buckets

S3-compatible · signed URLs

Encryption at rest, lifecycle rules, signed URLs. Egress between your services is free.

bucket "uploads" {
public = false
lifecycle = "30d"
}

Gateway

Routing · TLS · auth · rate-limit

One block routes traffic into your apps. Domains and certs auto-issued, JWT verification, per-route rate-limits, WAF.

gateway "edge" {
domain = "api.acme.com"
tls = "auto"
route "/v1/*" { to = app.api }
route "/jobs" { to = app.api, auth = "jwt" }
}

Secrets

Encrypted · per-env scoped

Stored encrypted, mounted at boot — never baked into the image. Rotate keys, scope by environment, audit every read.

secret "stripe_key" {
scope = "prod"
}

Your laptop runs the same file we do.

launchd dev spins up real services locally, actual databases, actual S3-compatible storage, actual queues. Not mocks. Not stubs. Production reads the same HCL, runs the same containers, talks the same protocols.

  • Real services, not mocks.

    Postgres is Postgres. The bucket speaks S3. The queue speaks the same protocol production does. Your tests run against the real thing.

  • File-watcher per app.

    Edit, save, the container rebuilds incrementally. Migrations run in order. No daemon to restart, no terminal soup to manage.

  • One file, two environments.

    launchd dev and launchd deploy read the same launchd.hcl. Local overrides — credentials, ports, fixtures — live in dev.hcl, gitignored by default.

  • Reset in one command.

    launchd dev reset tears it all down. Snapshot the database first if you want; restore it later from any branch.

  • No compose file to maintain.

    We generate the underlying docker-compose if you ask. You don't have to look at it. Most teams never do.

What happens when you deploy?

Every deploy goes through the same five stages, in the same order. If any stage fails, the previous version keeps serving traffic and the deploy reverts cleanly.

01 / 05
push
git push

We watch the branch you tell us to watch. Or run launchd deploy from CI.

02 / 05
plan
compute the diff

Read the file. Diff against live. Show what's about to change, line by line.

03 / 05
build
build & sign

Reproducible OCI image, content-addressed, signed. SBOM included.

04 / 05
migrate
run migrations

Schema diffs apply in a transaction. Roll back if any statement fails.

05 / 05
cutover
rolling cutover

Health-checked. Old version keeps serving until the new one passes.

If you ever need to leave, you can.

We picked boring primitives on purpose. Postgres is Postgres. Your buckets speak the S3 API. Your containers are OCI images. None of that is going to change because we changed pricing.

We'd rather earn the next month than trap you in this one. launchd export generates the equivalent docker compose for your stack. Run it any time, no support ticket required.

# anywhere with docker + a database
$ launchd export ./out
$ cd ./out && docker compose up
# same app, no Launchd in the loop
portability checklist
export
launchd export

Writes a plain docker-compose.yml and a terraform/ directory matching your HCL. Drop it into any host. We don't track when you do this.

data
Take your data

pg_dump for the database. aws s3 sync for the bucket. We give you signed credentials and a checksum manifest. Nothing proprietary.

images
Take the images

Every container image lives in your account's OCI registry. docker pull, push to wherever you're going. They were always yours.

Export is in the open-source CLI. coming soon

About us.

Launchd started with two dreamers in Nashville and a small team across timezones. We grew up building software out of our bedrooms, teaching ourselves servers and infrastructure along the way. After watching every simple app turn into a cloud engineering project, we decided to build the platform we wished existed.

Our vision is small on purpose: be the boring, dependable layer between a developer's laptop and the internet. Boring like Postgres is boring. We don't think the world needs another opinionated framework. We think it needs fewer of them.
(see here)

We're funded by people who agreed not to push us toward enterprise sprawl. The plan is a real free tier, transparent pricing, and a code that stays OSS for as long as the company exists.

FOUNDERS & FOUNDING ENGINEERS
Jarett Harper

Director of day-to-day business operations.

co-founder, CEO
Owen Rummage

Vision of the company, directs infrastructure

co-founder, CIO
Nova Clement

Leads development of our entire software stack

founding eng, cto
Xavier Dillinger

Built our platform with his bare hands

founding eng
full team

Questions we get a lot.

01 Is the CLI open source?
Yes. MIT. The launchd CLI builds, plans, deploys, and exports. You can run launchd plan against any account, ours or not.
02 What's actually proprietary?
The control plane that schedules containers and brokers state. Everything you interact with — HCL, the CLI, the container images — is open or industry-standard.
03 Can I bring my own database?
Yes. database "main" { external = "postgres://…" } and reference it the same way. We don't proxy it, we don't read it, we just wire the connection string into your containers.
04 What if I outgrow you?
Your container is still an OCI image. Your config is still HCL. Your database is still Postgres. launchd export gives you docker-compose + terraform for the equivalent stack. Three commands and you're somewhere else.
05 Is there a free tier?
Yes. One app, one database, one bucket, one queue. Free forever. No credit card. We don't email you about it.
06 What regions are live?
Twelve today, three more by Q4. The full list is at status.launchd.sh. Pin an app to a region or let us pick.
07 How does pricing work?
Per-second of container time, per-GB of database, per-GB of egress out of our network. Egress between your own services is free. One invoice, one currency, no per-region multipliers.

Join the waitlist.

We're sending invites in small batches while we shake out the rough edges. Tell us a little about what you're building and we'll get you in as soon as it makes sense.

on the list2,147
invites this week40
median wait~ 3 weeks

We don't have a marketing sequence. You'll hear from us once when there's an invite, and probably never again unless you ask.

waitlist.launchd.sh
email
name
company or project
what are you building
team size
currently deploying with
when do you want to ship
We read every submission. Usually within a day.