Our Stack

Our platform, the stuff that actually runs apps for our customers, is built on Rust and Go. Developers on all of our platform teams switch-hit between those two languages. We love them both, and that’s an attribute we’re looking for in platform devs.

When a user aims their browser at an app hosted on Fly.io, they’re talking to fly-proxy, a Rust / Tokio / Hyper proxy that powers our Anycast network. fly-proxy uses attache, our Go SQLite Consul cache, and corrosion, our Rust SWIM-based state replication service, to route requests to the right worker and VM.

Those VMs were booted up by flyd, our Go orchestrator. Persistent encrypted storage for the VMs was provisioned by vold, another orchestration component. flyd leverages the Go-based containerd ecosystem to convert Docker containers into root filesystems for our VMs.

The VMs themselves run under firecracker, Amazon’s Rust-based hypervisor (and the engine behind Lambda and Fargate). Our hardware! Amazon’s hypervisor code.

Inside the VM, our code gets control again: we own the init that spins things up in the VM. init is Rust. More and more of our fun VM tricks are features of our init.

To tell us what containers to boot up, our customers talk to our GraphQL API. The backend for that API is a Rails app, running on Postgres.

Most of our developer UX happens in flyctl, our Go-based CLI. We’re a CLI-first company.

Fancy customer UI stuff? Elixir! We love Elixir and sponsor the Phoenix project. Generally, new UI stuff at Fly.io happens in Elixir/Phoenix/LiveView. LiveView screams on Fly.io.