Argo CD is the default GitOps controller for Kubernetes, and it still leaves you writing and maintaining every manifest it syncs. The main alternatives, from Flux to Spinnaker to push-based pipelines, and when to skip manifests entirely.
Argo CD solved the question of how a Kubernetes cluster stays in sync with Git: a controller in the cluster watches a repository and applies what it finds, drift gets corrected, and the web UI shows what is running where. What it does not change is the amount of YAML behind it. Every service needs its deployment, service, ingress, config and secrets defined in manifests or charts, and the database or queue the service depends on lives in yet another tool. Teams look at alternatives either for a different GitOps model or to cut that layer down.
Encore is infrastructure from code for TypeScript and Go, with a platform that provisions and deploys into your own AWS or GCP account. With Kubernetes chosen as the compute platform, Encore provisions a new GKE or EKS Fargate cluster or deploys to an existing one, and generates a namespace per environment, a deployment per service with resource requests, limits and health checks, ingress with TLS, and Kubernetes Secrets bound to the service accounts that need them, as described in the Kubernetes docs. The Git repository holds application code rather than manifests, and each push to an environment's branch triggers a deploy through the GitHub integration.

The resources a service uses outside the cluster are declared next to its endpoints. An inventory service with a database and an hourly sync job:
// inventory/inventory.ts
import { api } from "encore.dev/api";
import { CronJob } from "encore.dev/cron";
import { SQLDatabase } from "encore.dev/storage/sqldb";
const db = new SQLDatabase("inventory", { migrations: "./migrations" });
export const stock = api(
{ expose: true, method: "GET", path: "/stock/:sku" },
async ({ sku }: { sku: string }): Promise<{ sku: string; quantity: number }> => {
const row = await db.queryRow<{ quantity: number }>`
SELECT quantity FROM stock WHERE sku = ${sku}
`;
return { sku, quantity: row?.quantity ?? 0 };
},
);
export const syncSuppliers = api({}, async (): Promise<void> => {
// Pull supplier stock levels and update the stock table here.
});
const _ = new CronJob("sync-suppliers", {
title: "Sync supplier stock",
every: "1h",
endpoint: syncSuppliers,
});
The migration in inventory/migrations/1_create_stock.up.sql creates the table:
CREATE TABLE stock (
sku TEXT PRIMARY KEY,
quantity INT NOT NULL DEFAULT 0
);
Run in your terminal to get started locally.
encore run starts the service with a local Postgres and applies the migrations, though cron jobs only run in cloud environments. On deploy, the database becomes Cloud SQL or RDS, the cron job is scheduled by Encore, and the service runs as a deployment in the cluster. Environments can require infrastructure approval so an admin signs off on infrastructure changes before a deploy proceeds, which covers the review step teams often use GitOps pull requests for.
Best fit: teams on GKE or EKS who want to stop maintaining manifests, charts and a separate tool for databases and queues.
Flux, the other CNCF graduated GitOps project, runs as a set of controllers in the cluster: the source controller fetches Git repositories, Helm repositories and OCI artifacts, the kustomize and helm controllers apply them, the notification controller handles alerts and webhooks, and image automation controllers can update image tags in Git. Everything is configured through Kubernetes resources and the flux CLI, which suits teams that manage clusters as code end to end. The core project has no web UI like Argo CD's, so visibility comes from the CLI, Kubernetes dashboards or third-party UIs, and multi-tenancy is set up through namespaces and service accounts rather than Argo's projects.
Best fit: platform teams that want GitOps built from Kubernetes-native pieces.
Spinnaker, created at Netflix, is a continuous delivery platform built around pipelines with stages for baking, deploying, manual judgment and verification. It deploys to Kubernetes and to cloud VMs across AWS, GCP and Azure, and supports canary analysis and red/black deployments. It is push-based rather than GitOps, and it is heavy to operate, with several microservices to run and upgrade, which mostly makes sense for large organizations with complex multi-cloud releases.
Best fit: large engineering organizations with multi-stage, multi-cloud release processes.
A common alternative is to skip a GitOps controller and deploy from CI. A workflow builds the image, pushes it to a registry and runs kubectl apply or helm upgrade, using OIDC to get short-lived cloud credentials and GitHub environments with required reviewers for production. It is simple and keeps the logic in one place, while CI holds credentials for the cluster and nothing corrects drift between deploys.
Best fit: small teams with one or two clusters.
Jenkins pipelines can deploy to Kubernetes the same way, with plugins for Kubernetes agents, Helm and credentials. For organizations that already run Jenkins it avoids adding another system, though the controller, plugins and agents all need upkeep, and like any push-based setup it has no drift correction.
Best fit: teams with existing Jenkins infrastructure and pipelines.
If GitOps itself is the goal and the issue is Argo CD's model, Flux is the direct swap. If releases span many clouds and need staged approvals and canary analysis, Spinnaker covers that at the cost of operating it. For a small team, a push-based workflow in GitHub Actions is often enough. If the cost is the manifests, charts and separate infrastructure tooling behind every service, Encore deploys to GKE or EKS from the application code.
Flux CD is the closest alternative, a CNCF graduated GitOps project that reconciles Kubernetes clusters from Git with a set of controllers and no built-in UI. Teams that want to stop maintaining manifests altogether can use Encore, which generates the Kubernetes resources from application code and deploys to GKE or EKS on each push.
Both are pull-based GitOps tools that run in the cluster and sync it to a Git repository. Argo CD ships a web UI and an Application resource model that works as a deployment dashboard, while Flux is a set of composable controllers configured entirely through Kubernetes resources and the CLI.
Not necessarily, since push-based pipelines that run kubectl or helm from CI work and are simpler to start with, at the cost of giving CI credentials to the cluster and losing continuous drift correction.
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.