Fly.io deploys containers to edge locations worldwide. You write a Dockerfile and a fly.toml configuration, then run fly deploy. Your container runs on Fly's infrastructure across their global network.
This is useful when you want containers running close to users, or when you have existing Docker images to deploy. Add databases with fly postgres create.
Encore provisions infrastructure in your cloud account based on your application code. You define databases, Pub/Sub, and other resources as TypeScript or Go objects. When you deploy, Encore creates the corresponding AWS or GCP resources.
This is useful when you want infrastructure ownership, need native cloud services (RDS, SQS, S3), or want built-in observability. Resources run in your own AWS or GCP account.
The main difference is where your infrastructure lives. Fly.io manages everything on their network. Encore provisions resources in an AWS or GCP account you control.
With Encore, you can see your databases in the AWS Console, set up VPC peering, configure IAM policies, and use any AWS/GCP service alongside your Encore resources. Your data stays in accounts you own.
With Fly.io, infrastructure is abstracted away. This is simpler if you don't need direct cloud access, but limits options if you need specific AWS/GCP features or compliance controls.
Learn more about infrastructure ownership →Fly.io local development typically involves running Docker containers or proxying to remote Fly databases. You manage local infrastructure yourself.
Encore runs encore run and automatically provisions local PostgreSQL, Pub/Sub emulation, and cron scheduling. A local dashboard shows distributed tracing and architecture diagrams.
Encore's approach is significantly faster to set up and includes observability out of the box.
Learn more about local development →Fly.io requires you to set up infrastructure separately. Need a database? Run fly postgres create and configure connection strings. Need Redis? Set up Upstash or another provider.
Encore provisions infrastructure from your code. Declare a database as a TypeScript object, and Encore creates RDS or Cloud SQL when you deploy. Same for Pub/Sub, cron jobs, and object storage.
import { SQLDatabase } from "encore.dev/storage/sqldb";
const db = new SQLDatabase("users", {
migrations: "./migrations",
});
// Encore provisions RDS/Cloud SQL automaticallyDatabases, Pub/Sub, Cron Jobs, Object Storage, and more. See all primitives →
Fly.io provides basic metrics through their dashboard. For distributed tracing, you'd integrate Datadog, Honeycomb, or similar tools yourself.
Encore includes distributed tracing, metrics, and structured logging out of the box. Every request is traced across services automatically. No instrumentation code needed.
This works locally too. Run your app and get full tracing in the local development dashboard.
See observability docs →With Fly.io, infrastructure lives in separate Dockerfiles, YAML configs, and deployment scripts. AI agents like Cursor and Claude Code lack context about how these relate to your application code, leading to drift, hallucinations, and configs that are hard to review.
Encore defines infrastructure as TypeScript objects alongside your application code. AI agents see everything in one context: your APIs, databases, queues, and how they connect. This makes AI-generated code accurate, reviewable, and safe to deploy.
Built-in guardrails, auto-documentation, and observability ensure your systems stay maintainable, even when AI writes most of the code.
Learn about AI-assisted development →See how teams are shipping faster with Encore.
"Encore is our foundation for all new development. Since adopting it, we've seen a 2-3x increase in development speed."

"Encore is an unfair advantage. At Pave we've moved 2x faster than we did at Monzo."

"We've reduced time spent on DevOps by 95%, and we're now on track to save $60K annually."

See how Encore and Fly.io differ across key capabilities.

Common questions about Encore vs Fly.io.
Encore provisions infrastructure in your own AWS or GCP account with built-in observability, automatic IAM, and infrastructure-from-code. Fly.io runs Docker containers on their managed platform, meaning you don't own your infrastructure and need to configure observability separately.
Encore is purpose-built for backend development with built-in databases, Pub/Sub, cron jobs, and distributed tracing out of the box. Fly.io is a general-purpose container platform that requires manual setup for each of these features. For TypeScript or Go backends, Encore provides a significantly better developer experience.
No, Fly.io runs all infrastructure on their own platform, creating vendor lock-in. Encore deploys to your own AWS or GCP account, giving you full ownership, compliance control, and the ability to use native cloud services like RDS, SQS, and S3.
Encore provides automatic local development with databases, Pub/Sub, and distributed tracing included with a single command. Fly.io has no built-in local development solution, requiring you to set up Docker containers and manage your development environment manually.
Encore provides infrastructure ownership in your cloud account, built-in observability with distributed tracing, automatic IAM policies, type-safe APIs, and auto-generated documentation. Fly.io requires manual configuration for all of these features and locks you into their platform.
Encore is designed specifically for microservices with automatic service discovery, type-safe API calls, distributed tracing across services, and auto-generated architecture diagrams. Fly.io requires manual configuration for service communication, IAM policies, and observability setup.