Where teams go after App Engine's legacy runtimes and bundled services, from Cloud Run to platforms outside Google Cloud.
Google App Engine was one of the first platforms as a service, and many apps still deploy to it with gcloud app deploy and rely on its bundled Datastore, Memcache and Task Queues. Those apps keep running, but first-generation runtimes can no longer be deployed and Google points new apps to Cloud Run.
The bundled services are what tie an app to App Engine. Moving to a current runtime or to Cloud Run means replacing each one with a separate Google Cloud product, and that is the point where teams compare what else is available.
Reasons teams look for App Engine alternatives:
Encore combines the application code with the Google Cloud setup that App Engine used to bundle, so the database, the queues and the schedules are declared in TypeScript or Go next to the code that uses them. encore run starts the services, Postgres and Pub/Sub locally, and a deploy provisions Cloud Run or GKE, Cloud SQL and Pub/Sub in your own GCP project.

A typical App Engine pattern is a cron.yaml entry that hits a handler, which enqueues a push task to do the slow work. In Encore the same flow is a cron job that calls an endpoint, which publishes to a Pub/Sub topic with a subscriber and a retry policy:
import { api } from "encore.dev/api";
import { CronJob } from "encore.dev/cron";
import { Subscription, Topic } from "encore.dev/pubsub";
interface ReportRequested {
reportId: string;
}
// Replaces a push queue: SNS/SQS on AWS, Pub/Sub on GCP.
export const reportRequested = new Topic<ReportRequested>("report-requested", {
deliveryGuarantee: "at-least-once",
});
// Call it by hand locally to test what the schedule would do.
export const queueNightlyReport = api(
{ expose: true, method: "POST", path: "/reports/nightly" },
async (): Promise<{ reportId: string }> => {
const reportId = `nightly-${new Date().toISOString().slice(0, 10)}`;
await reportRequested.publish({ reportId });
return { reportId };
},
);
// Replaces a cron.yaml entry. Cron jobs run in the cloud, not under encore run.
const _ = new CronJob("nightly-report", {
title: "Queue the nightly report",
schedule: "0 2 * * *",
endpoint: queueNightlyReport,
});
// The report id is deterministic, so a redelivered message builds the same report.
const __ = new Subscription(reportRequested, "build-report", {
handler: async ({ reportId }) => {
console.log("building report", reportId);
},
retryPolicy: { minBackoff: "10s", maxBackoff: "5m", maxRetries: 5 },
});
Under encore run the topic and subscriber run on your machine, and calling POST /reports/nightly by hand returns {"reportId":"nightly-2026-10-26"} and logs the build in the subscriber, which is how you test what the schedule will do. Because the topic and the schedule are part of the code, an AI coding agent porting an App Engine handler can replace the cron.yaml entry and the task queue in the same change and check it locally.
Encore is not a host for an existing App Engine app as it is, because APIs and infrastructure go through Encore's TypeScript and Go SDKs, so moving is a code change, and Datastore entities have to move to Postgres. Teams usually start by moving one service or the background work, while the rest stays on App Engine in the same project until there is a reason to move it.
Run in your terminal to get started locally.
Cloud Run runs containers on managed infrastructure that scales to zero, and gcloud run deploy --source . builds the image for you, so an App Engine app on a current runtime can often move with little change to the code itself.
Cloud Run covers the compute, so the bundled services become separate products to set up and connect, with Cloud SQL or Firestore for data, Cloud Tasks for push queues, Pub/Sub for pull queues, Cloud Scheduler for cron and Memorystore for Memcache, each with its own IAM and configuration in Terraform or the console. The guide to deploying to GCP goes through that setup.
Firebase App Hosting builds Next.js and Angular apps from a GitHub repository with Cloud Build and runs them on Cloud Run behind Cloud CDN, in the Google Cloud project behind your Firebase project.
App Hosting is built for web frameworks with server-side rendering, so an App Engine backend with task queues and cron jobs still needs a home for that work, usually Cloud Run, Cloud Tasks and Cloud Scheduler set up separately. It requires the pay-as-you-go Blaze plan.
Render runs web services, background workers, cron jobs, managed Postgres and Redis-compatible Key Value instances, with git-based deploys and Blueprint files that describe each environment.
Render is close to the App Engine experience for small teams, but it runs on Render's infrastructure, so an app that keeps using Cloud Storage, BigQuery or other Google Cloud services reaches them over the internet with service account keys. Render has no managed message broker, so task queues become a worker reading from a database or Key Value. The Render alternatives guide compares it further.
Railway deploys services from a repository, an image or a template onto a project canvas, where databases such as Postgres are added as services next to the app, and billing follows resource usage.
Railway runs on its own infrastructure rather than in your Google Cloud project, and it has no managed queue, so App Engine task queues are replaced by a worker service and a database or Redis instance you run there. The Railway alternatives guide covers where it fits.
Fly.io runs apps as Fly Machines, which are Firecracker microVMs started from a container image, configured in fly.toml and deployed with fly deploy to one or more regions.
Fly.io gives more control over where an app runs, and with it more operational work, since volumes, scaling and failover across regions are yours to plan. It runs outside Google Cloud and has no managed queue or scheduler. The Fly.io alternatives guide covers the trade-offs.
Existing App Engine apps keep running, so there is time to move piece by piece, starting with whichever bundled service is hardest to keep. The quickstart walks through a first Encore service, and zero to GCP with TypeScript shows a full deploy to a GCP project.
Encore if you want services, Cloud SQL, Pub/Sub and cron jobs declared in code and provisioned in your own GCP project, with everything except the cron schedule running locally. Cloud Run is Google's own recommendation for new apps if you are happy to wire up the surrounding services yourself. Firebase App Hosting fits Next.js and Angular frontends, and Render, Railway and Fly.io are options if leaving Google Cloud is acceptable.
No. App Engine is still supported, but its first-generation runtimes such as Python 2.7, Java 8, Go 1.11 and PHP 5.5 were deprecated on January 31, 2026 and can no longer be deployed, although existing apps keep running. Google recommends Cloud Run for new Google Cloud users.
App Engine runs your code on language runtimes with app.yaml configuration and offers legacy bundled services such as Memcache, Task Queues and NDB. Cloud Run runs any container, or builds one from source, with request timeouts configurable up to 60 minutes, and it does not support the legacy bundled services, so those move to Memorystore, Cloud Tasks, Pub/Sub and Cloud NDB.
Google maps push queues to Cloud Tasks and pull queues to Pub/Sub, and cron.yaml schedules usually move to Cloud Scheduler. With Encore you declare a Topic, a Subscription and a CronJob in your code, and they are provisioned on Pub/Sub and run in your GCP project.
Declare a Topic and an api endpoint that publishes to it, then point a new CronJob with a schedule such as "0 2 * * *" at that endpoint, and handle the work in a Subscription with a retryPolicy. Cron jobs run in the cloud, not under encore run, so locally you call the endpoint by hand to test it.
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.