Options for teams that want to keep building on AWS without Amplify's GraphQL and DynamoDB model or its cloud sandbox.
AWS Amplify is the AWS toolkit for frontend teams, and in Gen 2 you describe auth, data, storage and functions in TypeScript files that it turns into CDK and CloudFormation in your account. It works well while the app fits a GraphQL API on AppSync, DynamoDB tables and Lambda resolvers.
It gets harder when the backend grows past that, with relational queries, background workers, scheduled jobs or several services that call each other. Local development also runs through a cloud sandbox, so each change is a deploy to AWS rather than a process on your laptop.
Amplify Gen 2 reached general availability in 2024 with a TypeScript, code-first backend model. Reasons teams look for Amplify alternatives:
npx ampx sandbox deploys a CloudFormation stack per developer to your AWS account, and changing a DynamoDB global secondary index in the sandbox recreates the table.Encore combines a TypeScript backend with the AWS resources it uses, so instead of a schema that generates AppSync resolvers you write ordinary API endpoints and declare the Postgres database, Pub/Sub topics and buckets next to them. The same declarations run locally under encore run and become RDS, SNS/SQS and S3 in your own AWS account when you deploy.

File uploads are a common reason Amplify apps reach for Amplify Storage. With Encore, a bucket and a topic are declared in the service that uses them, and the endpoint hands the browser a signed URL so the file goes straight to the bucket:
import { api } from "encore.dev/api";
import { Bucket } from "encore.dev/storage/objects";
import { Topic } from "encore.dev/pubsub";
// An S3 bucket on AWS, a local bucket under encore run.
export const photos = new Bucket("photos", { versioned: false });
export const photoUploaded = new Topic<{ key: string }>("photo-uploaded", {
deliveryGuarantee: "at-least-once",
});
// The browser uploads straight to the bucket with the signed URL.
export const uploadUrl = api(
{ expose: true, method: "POST", path: "/photos/:id/upload-url" },
async ({ id }: { id: string }): Promise<{ url: string }> => {
const { url } = await photos.signedUploadUrl(`${id}.jpg`, { ttl: 300 });
return { url };
},
);
export const markUploaded = api(
{ expose: true, method: "POST", path: "/photos/:id/uploaded" },
async ({ id }: { id: string }): Promise<void> => {
await photoUploaded.publish({ key: `${id}.jpg` });
},
);
encore run and become S3 and SNS/SQS on AWS.Thumbnailing or virus scanning then lives in a subscriber on the photo-uploaded topic, in the same service or another one, instead of an S3 trigger wired up in a custom CDK stack. The local development environment runs the bucket, the topic and Postgres on your machine with tracing for each request, so the edit and test loop does not wait on a CloudFormation deploy. An AI coding agent that adds the upload endpoint declares the bucket in the same change and can call it locally before anything is deployed.
Encore is a backend for your APIs and infrastructure, not a frontend host or a set of client SDKs for auth and realtime data, so the frontend usually moves to Amplify Hosting, Vercel or another host and calls the Encore API, and Encore can generate a typed TypeScript client for it. Moving data out of DynamoDB into Postgres means remodeling single-table items into relational tables and backfilling them, and the Amplify to AWS migration guide walks through doing it step by step.
Run in your terminal to get started locally.
SST is an open-source framework where sst.config.ts defines AWS resources through high-level components such as functions, buckets, queues, Postgres and Next.js sites. Since v3 the components are built on Pulumi and Terraform providers rather than CDK and CloudFormation.
sst dev deploys the stage and proxies Lambda invocations to your machine.sst dev runs Lambda functions on your machine through a stub in AWS, so code changes reload without a deploy.SST is close to Amplify in one respect, since the databases, queues and buckets used during sst dev are real resources deployed to a stage in your AWS account, and you still write and maintain the resource definitions. It suits teams who are happy to own sst.config.ts. The SST alternatives guide compares it with other options.
Many teams used Amplify mainly through Amplify Hosting for a Next.js or React frontend. Vercel covers that part with git-based deploys, preview URLs per branch and Vercel Functions for server-side code.
Vercel runs on its own infrastructure rather than in your AWS account, and its functions are request-scoped, so long-running workers, queues and scheduled jobs that need IAM access to AWS usually end up in a separate backend. That split works when the backend has a clear home, and the Vercel alternatives guide covers the trade-offs.
Firebase is the closest match to Amplify's original idea, with Firestore, Authentication, Cloud Storage, Cloud Functions and hosting behind client SDKs for web and mobile.
Firebase replaces Amplify by leaving AWS for Google Cloud, and Firestore is a document database, so the NoSQL modeling trade-offs of DynamoDB stay. Anything outside Firebase's services is set up in Google Cloud separately. The Firebase alternatives guide compares it with options that keep relational data.
Supabase gives you a Postgres database with auto-generated APIs, authentication, file storage, realtime subscriptions and edge functions, and it is the usual pick for Amplify users who want relational data instead of DynamoDB.
Supabase runs on its own platform rather than in your AWS account unless you self-host it, and backend logic outside the database lives in edge functions or a separate service. The Supabase alternatives guide goes through where teams go when the backend grows.
AWS CDK defines AWS resources in TypeScript and synthesizes them into CloudFormation, which is what Amplify Gen 2 does behind its higher-level definitions. Teams that keep running into Amplify's limits sometimes drop down to plain CDK and define AppSync, DynamoDB, Lambda, SQS and RDS themselves.
cdk diff shows the CloudFormation changes before a deploy.CDK gives full control and makes you responsible for all of it, including networking, IAM, environments and a local setup for testing, and CloudFormation deploys are what you wait on during development. The AWS CDK alternatives guide covers tools that generate more of this for you.
sst.config.ts.Amplify does not have to go all at once, since the frontend can stay on Amplify Hosting while new backend work moves to an Encore service in the same AWS account, and the quickstart walks through a first one.
Encore if you want backend APIs, Postgres, Pub/Sub and object storage declared in TypeScript, running locally and provisioned in your own AWS account. SST if you want to define AWS resources yourself in TypeScript with a fast Lambda dev loop. Vercel for frontend hosting paired with a separate backend, Firebase or Supabase for a hosted backend-as-a-service, and raw AWS CDK if you want full control of what Amplify generates.
Yes. Amplify Gen 2 defines the backend in TypeScript files under the amplify/ folder and deploys them as CloudFormation stacks generated with AWS CDK. Resources Amplify does not cover can be added with CDK constructs in a custom stack created with backend.createStack.
Amplify Data deploys a GraphQL API on AWS AppSync backed by Amazon DynamoDB by default. It can also connect to an existing PostgreSQL database, and custom logic runs in AWS Lambda functions that are attached as resolvers or handlers.
Amplify Gen 2 uses a cloud sandbox. Running npx ampx sandbox deploys a per-developer CloudFormation stack into your AWS account and redeploys it as you change files, using CDK hot swapping where it can. Some changes, such as modifying a DynamoDB global secondary index, recreate the table in the sandbox.
Both host frontends such as Next.js with git-based deploys. Amplify also generates a backend in your AWS account, while Vercel hosts on its own infrastructure and leaves the backend to you, so teams moving the frontend to Vercel usually pair it with a separate backend on AWS.
Declare a bucket with new Bucket("photos") from encore.dev/storage/objects and return photos.signedUploadUrl(key, { ttl: 300 }) from an api endpoint, so the browser uploads straight to the bucket. encore run serves a local bucket, and a deploy to AWS creates an S3 bucket in your account.
Deploy to your cloud on AWS and Google Cloud
without managing infrastructure
Encore lets developers and agents define application infrastructure directly in code, then automatically provisions it from local development to production in your AWS or GCP account.