works on you cloud

Stop Deploying on Infrastructure You Don't Own

Avatar
Brook
21 Apr, 2026
devops

Most developers think deployment is a solved problem. Push to main, the app is live. The reality underneath is messier — and the platform making it feel simple is usually the one holding the keys.


The Vercel Problem

Vercel is excellent. Fast, zero config, great developer experience. But when you deploy on Vercel, your application runs on their servers, under their privacy policy, subject to their pricing decisions. When their terms change, you adapt. When they deprecate a runtime, you migrate — on their schedule.

You are a tenant. The building belongs to them.

For side projects this is fine. For products handling real user data or anything compliance-sensitive, you've handed control of your deployment environment to a third party. That matters more than most teams realize until something forces the conversation.


Self-Hosting Without Tooling

The instinct to take back control is right. But owning a server and deploying to it reliably are two different problems.

Without tooling, deployment is a manual ritual. SSH in, pull the new image, restart the container, watch the logs. That context — which server runs what, how to roll back, what the restart procedure is — lives in one person's head. When they're unavailable, deployments wait. When something breaks, recovery is another manual process.

Teams start slowing their release cadence not because the code isn't ready, but because deploying has become a stressful, manual event. That's the real cost.


Deploying on AWS

AWS is battle-tested and globally available. But the distance between you and a running application is significant.

You start with IAM — writing JSON policies to grant the right permissions to the right roles. Too restrictive and your deploy fails with a vague Access Denied error. Then your container image needs to live in ECR, which means authenticating Docker, building, tagging, and pushing on every new version. Then you choose a compute service — EC2, ECS Fargate, App Runner. App Runner was the simplest option. AWS deprecated it, and teams who built on it are now forced to migrate.

Networking, load balancers, SSL certificates, secrets management — each is a separate configuration step with its own surface area for things to go wrong. And once all of that is done, you still need a deployment pipeline on top. A GitHub Actions workflow that authenticates to AWS, pushes the image, updates the task definition, and triggers the deployment. With rollback logic. With health checks. Maintained by whoever last touched it.


Deploying on GCP

GCP is more consistent than AWS, and Cloud Run is a genuinely good product. But the path looks the same.

Create a project, enable billing, then enable each API you need individually — Cloud Run, Artifact Registry, Secret Manager. Miss one and your deploy fails in a way that isn't obvious. Create a Service Account, assign roles, generate a JSON key file that you now need to keep secure and rotate. Push your image to Artifact Registry. Deploy to Cloud Run — which works well for stateless workloads but has constraints around cold starts and execution model. If your app doesn't fit, you move to GKE and start managing Kubernetes.

Then the pipeline. Same problem as AWS — you write it, you own it, you fix it when it breaks.


How dFlow Resolves This

dFlow is a deployment management layer that sits on top of infrastructure you already own. You connect your own AWS account or GCP project. Your servers, your billing, your security policies. dFlow handles everything that happens on top.

Push to your branch and dFlow builds the image, pushes it to your registry, runs health checks, and deploys with zero downtime — automatically. No SSH. No pipeline YAML to write or maintain. No manual image tagging. Every deploy is versioned, and rolling back is one click from the dashboard.

Environment variables are managed per service and per environment directly in dFlow. Staging and production stay in sync.

The deployment experience feels like a managed platform. The infrastructure is yours.


You built the application. You should own where it runs — without it becoming a second job.

dflow.sh