[{"data":1,"prerenderedAt":349},["ShallowReactive",2],{"blog-en-paid-convenience-vs-agent":3,"header-blog-translations-/en/blog/paid-convenience-vs-agent":346},{"id":4,"title":5,"author":6,"body":7,"date":328,"description":329,"draft":330,"extension":331,"image":332,"meta":333,"navigation":334,"path":335,"seo":336,"stem":337,"tags":338,"translationKey":344,"__hash__":345},"blog_en/blog/en/paid-convenience-vs-agent.md","Vercel Makes a Lot of Things Easy. Turns Out Agents Do Too.","Patrick Hofmann",{"type":8,"value":9,"toc":314},"minimark",[10,14,22,25,30,33,40,43,47,58,69,75,78,82,89,96,100,103,106,109,113,125,136,140,143,194,197,201,208,214,231,241,244,248,259,262,266,269,272,276,279,282,292,295,298,301],[11,12,13],"p",{},"I didn't have to outsource. I wanted to.",[11,15,16,17,21],{},"For a long time Vercel was the best answer to a question I didn't want to answer myself: ",[18,19,20],"em",{},"how do I get frictionless CI — for tests and for production alike?"," That's not a question with an obvious answer. Vercel delivers out of the box something that is hard to even define: commit-push → tests → preview deploy per branch → green production URL, without having to invent the flow first. It was great. It was easy. It was even free for a long time, and when I eventually moved to the paid tier I did it for a good reason: I got what I paid for.",[11,23,24],{},"What changed isn't Vercel. What changed is me — or more precisely: what I put to work at my desk today.",[26,27,29],"h2",{"id":28},"what-vercel-was-for-me","What Vercel was for me",[11,31,32],{},"Vercel turned a pile of moving parts into a pipeline you can operate without friction. Commit-push → build → deploy → CDN → URL, with preview deployments, automatic rollbacks, built-in metrics. No writing nginx config yourself, no provisioning certificates, no building deploy scripts, no coordinating secret management, no setting up monitoring.",[11,34,35,36,39],{},"I could have done all of that myself. I didn't, because the sum of those steps booked as ",[18,37,38],{},"too much attention"," in time — and because Vercel really does it well. Anyone who knows what Vercel does also knows how tedious it is to build something like that yourself — and that the work is never done once. It comes back, at the wrong moment, without warning.",[11,41,42],{},"I paid gladly for having that taken off my hands. I still stand by that today.",[26,44,46],{"id":45},"what-changed","What changed",[11,48,49,50,53,54,57],{},"Between ",[18,51,52],{},"back then"," and ",[18,55,56],{},"now",", one thing happened faster than most subscription invoices kept up with: agents got good.",[11,59,60,61,64,65,68],{},"Not usable. Not entertaining. ",[18,62,63],{},"Good",". Good in the sense that the many steps Vercel took off my hands are now run by my agent. The pipeline Vercel built reliably can also be driven yourself with a good agent setup — in the same time, with the same hit rate, with the same ",[18,66,67],{},"it just works",". Vercel makes a lot of things easy. Turns out agents do too.",[70,71,72],"blockquote",{},[11,73,74],{},"I didn't pay for infrastructure. I paid for the attention infrastructure demands. That attention I can now delegate without paying an invoice for it.",[11,76,77],{},"The difference isn't ideological, it's simply practical: two paths now lead to the same result, and one of them gives me more control.",[26,79,81],{"id":80},"the-agent-thinks-along","The agent thinks along",[11,83,84,85,88],{},"Another point only became clear while working: the agent doesn't build the CI/CD chain once and then it stands. It builds it on the way. I say once ",[18,86,87],{},"\"this is how I want to deploy it\""," — spontaneously, informally, maybe incompletely — and it sets up a tailored script. When it later turns out I need an extra health check, a different rollback trigger, a branch-specific build step, it adapts the script. It doesn't rethink everything each time; it extends and modifies.",[11,90,91,92,95],{},"Embrace the change. When the requirements change, the chain changes. No ",[18,93,94],{},"the pipeline stands now, the config is frozen now, now we move within what made sense six months ago",". The agent thinks along, and it doesn't force me into a box.",[26,97,99],{"id":98},"what-the-agent-cant-do","What the agent can't do",[11,101,102],{},"One thing the agent can't take off my hands: a global CDN and real edge scaling.",[11,104,105],{},"That's not convenience, that's engineering work at a layer you don't solve in an afternoon. A network of edge nodes, cache invalidation, DDoS mitigation, smart routing — that's not a deploy-script problem. That's infrastructure-in-the-real-sense, which you don't replace with local tools and an agent.",[11,107,108],{},"When I reach the point where one of my projects sees real user numbers and my VM can't serve that in a default state anymore, I'd pay again any day. Not back, because the move was a mistake, but forward — with a clear sense of what exactly I'm paying Vercel for then. Not for the convenience, but for the scaling.",[26,110,112],{"id":111},"the-second-trigger","The second trigger",[11,114,115,116,120,121,124],{},"The domain migration was on the table anyway — the long-term answer to why a German domain carries a project whose audience is international. ",[117,118,119],"code",{},"openape.at"," → ",[117,122,123],{},"openape.ai",", with GitHub org, IdP and everything attached.",[11,126,127,128,131,132,135],{},"When you plan a domain migration you touch DNS, SSL, nginx vhosts, mail routing and service discovery anyway. The moment I'm touching the ",[117,129,130],{},".ai"," subdomains regardless, it costs barely any extra effort to choose the target freely. The migration was operations either way. The choice of ",[18,133,134],{},"where"," the services live was then free — and I chose my own VM.",[26,137,139],{"id":138},"what-moved","What moved",[11,141,142],{},"A VM, runs at my place. What lives there now:",[144,145,146,156,164,178,186],"ul",{},[147,148,149,155],"li",{},[150,151,152],"strong",{},[117,153,154],{},"id.openape.ai"," — the identity provider. The one that signs JWTs. The one with all the sensitive secrets.",[147,157,158,163],{},[150,159,160],{},[117,161,162],{},"docs.openape.ai"," — the documentation.",[147,165,166,171,172,177],{},[150,167,168],{},[117,169,170],{},"mail.openape.ai"," / ",[150,173,174],{},[117,175,176],{},"proxy.openape.ai"," — transport layer. Mail sender for IdP notifications, proxy for agent webhook flows.",[147,179,180,185],{},[150,181,182],{},[117,183,184],{},"www.openape.ai"," — the landing.",[147,187,188,193],{},[150,189,190],{},[117,191,192],{},"delta-mind.at"," (this blog) — moved too. rsync + nginx. Auto-deploy via GitHub Action that pushes the build artifacts over SSH onto the VM.",[11,195,196],{},"On top of that came a dedicated service user, systemd units per service, an auto-deploy script for every push, logrotate and health-check rules. All work I wouldn't have done before. All work the agent next to me wrote most of.",[26,198,200],{"id":199},"what-i-learned-during-the-move","What I learned during the move",[11,202,203,204,207],{},"Self-hosting isn't free of cost — only free of ",[18,205,206],{},"other"," costs. Three things I noticed:",[11,209,210,213],{},[150,211,212],{},"Silent failures become visible."," Vercel never told me when a mail wasn't delivered — the Resend call went through, the response was 2xx, the mail didn't arrive. On my own VM I built the delivery-failure surfacing in explicitly: when Resend rejects a delivery, the IdP request comes back with a visible error, not silently swallowed. I should have done it the same way on Vercel. I didn't, because the whole system felt invisible — and invisible systems are rarely hardened.",[11,215,216,219,220,53,223,226,227,230],{},[150,217,218],{},"Ops hygiene becomes your responsibility."," On Vercel I had no reason to ask whether my ",[117,221,222],{},"users",[117,224,225],{},"shapes"," tables exist on the service's first start. On my own VM that's exactly one of the first bugs I hit: the IdP doesn't start on a fresh setup because the table isn't there. Fix: auto-create on startup. No magic. But now ",[18,228,229],{},"my"," job, not someone else's.",[11,232,233,236,237,240],{},[150,234,235],{},"Stack pre-checks cleanly."," OAuth codes, refresh tokens, JTIs, signing keys — all things that sat on Vercel as environment variables or in the KV store, worked, and were never questioned. During the move I put them all in the same sequence: ",[18,238,239],{},"service start → check tables → check keys → check JTIs → finish starting."," There was no single place for that before. Now there is one.",[11,242,243],{},"These aren't new lessons. They were just invisible because the platform made them invisible — which is no accusation, but exactly the posture you use a platform for.",[26,245,247],{"id":246},"the-financial-side-effect","The financial side effect",[11,249,250,251,254,255,258],{},"I deliberately put this in the middle and not at the start, because it wasn't the main driver: with rising usage — many test projects, higher iteration, more builds — a platform bill naturally becomes less predictable. A fixed VM has a fixed price. In a phase where I'm actively trying new things, ",[18,252,253],{},"fixed per month"," plans more safely than ",[18,256,257],{},"the more I iterate, the more builds, the more expensive the attempt",".",[11,260,261],{},"That's a nice side effect of the decision. It's not the reason.",[26,263,265],{"id":264},"the-bigger-thing","The bigger thing",[11,267,268],{},"I built a project that deals with how control over decisions sits in the right place. OpenApe pulls the policy decision from the agent to the user, because the agent doesn't have the workflow context. The same principle, just at a different layer, holds for your own infrastructure: whoever controls the platform controls the decisions made on it.",[11,270,271],{},"As long as a platform fits you, that's a good deal. Vercel fit me for a long time and still fits many projects. But for a project that itself builds identity and grants in order to make such structures transparent and revocable, it eventually gets inconsistent not to take the structure above it into your own hands. That's not a turn away from managed platforms. That's a consequence of what I'm building right now.",[26,273,275],{"id":274},"what-this-isnt","What this isn't",[11,277,278],{},"It's not a recommendation for self-hosting as a default.",[11,280,281],{},"For a new project that needs a fast launch in the next three months, Vercel is still the right way. The first hundred users matter more than your own nginx stack. That hasn't changed.",[11,283,284,285,288,289,258],{},"What changed is the line at which self-hosting becomes a realistic option again. It used to sit at ",[18,286,287],{},"large scale + dedicated ops team",". Now it sits at ",[18,290,291],{},"one developer with a good agent setup and an afternoon per service",[11,293,294],{},"I build my services edge-compatible for my own instance anyway now. When the point comes where I seriously need CDN and edge scaling, I'm one domain TTL back on Vercel — then for exactly what Vercel is really built for.",[11,296,297],{},"I didn't switch because Vercel got worse. I switched because the agent now does what I used to outsource to Vercel. Vercel makes a lot of things easy. Turns out agents do too. And for what Vercel makes easier than any agent — CDN, edge, scaling at a level no weekend setup will ever reach — I'd pay again any day.",[299,300],"hr",{},[11,302,303],{},[18,304,305,306,313],{},"Setup: a single VM, Debian, nginx, systemd, rsync-based deploy per service. The services are the ones listed above. Code for the IdP: ",[307,308,312],"a",{"href":309,"rel":310},"https://github.com/openape-ai/openape",[311],"nofollow","github.com/openape-ai/openape",", MIT-licensed. The actual server config lives in the private ops repo — not because it's secret, but because it's mine.",{"title":315,"searchDepth":316,"depth":316,"links":317},"",2,[318,319,320,321,322,323,324,325,326,327],{"id":28,"depth":316,"text":29},{"id":45,"depth":316,"text":46},{"id":80,"depth":316,"text":81},{"id":98,"depth":316,"text":99},{"id":111,"depth":316,"text":112},{"id":138,"depth":316,"text":139},{"id":199,"depth":316,"text":200},{"id":246,"depth":316,"text":247},{"id":264,"depth":316,"text":265},{"id":274,"depth":316,"text":275},"2026-04-23","I moved my stack off Vercel. Not because Vercel got worse — Vercel is still great. But because the agent now runs exactly the CI steps Vercel used to take off my hands out of the box.",false,"md",null,{},true,"/blog/en/paid-convenience-vs-agent",{"title":5,"description":329},"blog/en/paid-convenience-vs-agent",[339,340,341,342,343],"Infrastructure","Platform Sovereignty","AI Agents","Self-Hosting","Building in Public","paid-convenience-vs-agent","NYxAECVfKAhb9j1HsfOj4KMNLDO7JHQCk4-yB3tsWwk",{"en":347,"de":348},"/en/blog/paid-convenience-vs-agent","/de/blog/die-convenience-die-ich-bezahlt-habe",1779001887012]