<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Vercel on ICE-ICE-BEAR-BLOG</title><link>https://ice-ice-bear.github.io/tags/vercel/</link><description>Recent content in Vercel on ICE-ICE-BEAR-BLOG</description><generator>Hugo -- gohugo.io</generator><language>en</language><lastBuildDate>Wed, 22 Apr 2026 00:00:00 +0900</lastBuildDate><atom:link href="https://ice-ice-bear.github.io/tags/vercel/index.xml" rel="self" type="application/rss+xml"/><item><title>The Economics of Migrating to Fly.io — Three Case Studies</title><link>https://ice-ice-bear.github.io/posts/2026-04-22-fly-migration-economics/</link><pubDate>Wed, 22 Apr 2026 00:00:00 +0900</pubDate><guid>https://ice-ice-bear.github.io/posts/2026-04-22-fly-migration-economics/</guid><description>&lt;img src="https://ice-ice-bear.github.io/" alt="Featured image of post The Economics of Migrating to Fly.io — Three Case Studies" /&gt;&lt;h2 id="overview"&gt;Overview
&lt;/h2&gt;&lt;p&gt;Three sources — two GeekNews translations and one Korean developer deep-dive — all argue the same case this week: &lt;strong&gt;Fly.io is cheaper, operationally simpler, and more capable than either a hand-rolled EC2 server or a paid-by-the-function PaaS for the small-to-medium production workload.&lt;/strong&gt; Read together, they converge on a decision framework worth writing down.&lt;/p&gt;
&lt;pre class="mermaid" style="visibility:hidden"&gt;graph TD
 Start["App to deploy"] --&gt; Type{"Workload shape?"}
 Type --&gt;|Static SSR frontend| Vercel["Vercel&lt;br/&gt;still best"]
 Type --&gt;|Simple REST + DB| Small{"Monthly traffic?"}
 Type --&gt;|GPU inference| RunPod["RunPod / Modal"]
 Type --&gt;|Heavy always-on| EC2{"Need deep AWS services?"}
 Small --&gt;|"&lt;100k req/mo"| Fly["Fly.io hobby&lt;br/&gt;~$5/mo"]
 Small --&gt;|"100k-10M req/mo"| FlyPro["Fly.io scale&lt;br/&gt;~$20-100/mo"]
 Small --&gt;|"&gt;10M req/mo"| Reevaluate["Reevaluate EC2 vs Fly"]
 EC2 --&gt;|yes| EC2Big["EC2 or Fargate"]
 EC2 --&gt;|no| Fly&lt;/pre&gt;&lt;h2 id="case-1-go-project-ec2--flyio-9mo-saved"&gt;Case 1: Go Project, EC2 → Fly.io, $9/mo Saved
&lt;/h2&gt;&lt;p&gt;The benhoyt.com post (&lt;a class="link" href="https://news.hada.io/topic?id=8604" target="_blank" rel="noopener"
 &gt;GeekNews topic 8604&lt;/a&gt;) migrated two Go side-projects from EC2 to Fly.io. Numbers:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;~500 lines of Ansible + config files deleted.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;$9/mo saved&lt;/strong&gt; (not huge in absolute terms, but 100% of the old bill).&lt;/li&gt;
&lt;li&gt;CDN for static assets replaced with &lt;code&gt;go:embed&lt;/code&gt; + ETag caching.&lt;/li&gt;
&lt;li&gt;Cron replaced with a background goroutine.&lt;/li&gt;
&lt;li&gt;Config files replaced with env vars.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The architecture didn&amp;rsquo;t change: Go &lt;code&gt;net/http&lt;/code&gt; server + SQLite DB. What changed is the operational surface. The EC2 setup required Caddy for SSL and upgrades; Fly.io bundles TLS termination and HTTPS by default. &lt;strong&gt;Three VMs are free; additional VMs are $2/month each&lt;/strong&gt; at 1 shared CPU / 256 MB RAM — enough for most Go servers.&lt;/p&gt;
&lt;p&gt;The takeaway is specific: the saving is partly dollars and mostly &lt;em&gt;time&lt;/em&gt;. 500 lines of Ansible represents weeks of accumulated ops toil. Fly&amp;rsquo;s promise isn&amp;rsquo;t &amp;ldquo;cheaper compute&amp;rdquo; per se; it&amp;rsquo;s &amp;ldquo;no ops for the kinds of apps that don&amp;rsquo;t need ops.&amp;rdquo;&lt;/p&gt;
&lt;h2 id="case-2-openstatus-vercel--flyio"&gt;Case 2: OpenStatus, Vercel → Fly.io
&lt;/h2&gt;&lt;p&gt;The openstatus.dev post (&lt;a class="link" href="https://news.hada.io/topic?id=12081" target="_blank" rel="noopener"
 &gt;GeekNews topic 12081&lt;/a&gt;) is the opposite direction — not EC2 refugees but Vercel escapees. Their reasoning:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Lightweight server needed.&lt;/strong&gt; Vercel&amp;rsquo;s Next.js server is heavy for a monitoring API. They switched to &lt;strong&gt;Hono + Bun&lt;/strong&gt; hosted on Fly. Startup time: 0.19 ms. Memory: 91 MB.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Multi-region monitoring needs predictable cost.&lt;/strong&gt; Vercel bills per CPU-time, which scales unpredictably with user count; Fly&amp;rsquo;s per-VM pricing is cheaper for their shape.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Migration friction was honest:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Docker image 2GB → 700MB&lt;/strong&gt; after optimization.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fly deploys often time out&lt;/strong&gt;, requiring increased timeout values.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No fast rollback to a previous version&lt;/strong&gt; — a real gap versus Vercel.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bun runtime bugs&lt;/strong&gt; — request failures increased; &lt;code&gt;keepalive: false&lt;/code&gt; was the workaround.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The conclusion is nuanced: &lt;em&gt;&amp;ldquo;We still love Vercel — it&amp;rsquo;s optimal for Next.js apps. For hosting applications other than Next.js, it may not be the best choice.&amp;rdquo;&lt;/em&gt; This framing matters. Fly.io&amp;rsquo;s wedge isn&amp;rsquo;t &amp;ldquo;Vercel is bad&amp;rdquo;; it&amp;rsquo;s &amp;ldquo;Vercel is specialized for one shape, and when your shape is different the economics flip.&amp;rdquo;&lt;/p&gt;
&lt;h2 id="case-3-davids-blog--full-a-to-z"&gt;Case 3: David&amp;rsquo;s Blog — Full A-to-Z
&lt;/h2&gt;&lt;p&gt;&lt;a class="link" href="https://blog.jangdaw.it/posts/fly-io/" target="_blank" rel="noopener"
 &gt;blog.jangdaw.it&lt;/a&gt;&amp;rsquo;s guide is the most complete walkthrough — Go + Gin + Docker, through &lt;code&gt;fly launch&lt;/code&gt;, &lt;code&gt;fly.toml&lt;/code&gt;, staged deploys, Grafana metrics (free, bundled), scale-in/out, env vars, Fly Postgres, Upstash Redis integration, and LiteFS for SQLite replication. A few non-obvious details:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;3 free VMs, 160 GB outbound&lt;/strong&gt; — the inbound is unlimited.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Under $5/month is not billed.&lt;/strong&gt; Practically, a low-traffic side project costs zero.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tokyo (nrt) is the closest region&lt;/strong&gt; to Korea — no Seoul region yet (as of the original post).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;fly.toml&lt;/code&gt;&amp;rsquo;s &lt;code&gt;auto_stop_machines&lt;/code&gt; / &lt;code&gt;auto_start_machines&lt;/code&gt;&lt;/strong&gt; combo is the critical line: it scales your machines to zero when idle and spins them back up on the first request.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The LiteFS section is particularly interesting — SQLite replicated across regions means you can run a read-replica architecture on a file-based DB, which is a pattern that only becomes feasible once the platform can ship writes between machines.&lt;/p&gt;
&lt;h2 id="reading-these-together"&gt;Reading These Together
&lt;/h2&gt;&lt;p&gt;Three distinct migrations, three different source points of comparison, but the same shape of argument:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;The interesting competitor is &amp;ldquo;no PaaS&amp;rdquo; (EC2) for ops-heavy setups, and &amp;ldquo;Next.js-specialized PaaS&amp;rdquo; (Vercel) for non-Next apps.&lt;/strong&gt; Fly.io wins both comparisons because it abstracts the right things (TLS, regions, secrets, Dockerfile-based deploy) without forcing a framework choice.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pricing is about the shape of your traffic, not the unit price.&lt;/strong&gt; Vercel&amp;rsquo;s per-request pricing is great for static-heavy, cheap for small, and unpredictable for high-volume API workloads. Fly&amp;rsquo;s per-machine pricing is the opposite.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Migration cost is mostly Dockerfile and fly.toml correctness.&lt;/strong&gt; All three posts describe the actual compute migration as a few hours; the long tail is domains, secrets, env vars, and rollback tooling.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="when-flyio-doesnt-win"&gt;When Fly.io Doesn&amp;rsquo;t Win
&lt;/h2&gt;&lt;p&gt;Worth saying what these posts don&amp;rsquo;t: &lt;strong&gt;Fly.io is not a replacement for AWS at scale.&lt;/strong&gt; If you need DynamoDB, specific VPC peering, or IAM-federated services, you&amp;rsquo;re back to AWS. GPU workloads are better on RunPod or Modal. And as OpenStatus flagged, &lt;strong&gt;fast rollback&lt;/strong&gt; is genuinely harder on Fly than on Vercel — something to factor in if your team ships hotfixes frequently.&lt;/p&gt;
&lt;h2 id="insights"&gt;Insights
&lt;/h2&gt;&lt;p&gt;The three-case pattern is: &lt;strong&gt;a small team, a small project, and a strong opinion that infrastructure should not be a full-time job.&lt;/strong&gt; Fly.io&amp;rsquo;s competitive moat is specifically this segment — developers who would otherwise reach for either too much (EC2 + Ansible) or too little (a function-per-request PaaS that breaks at higher traffic). The $9/mo savings in the Go case isn&amp;rsquo;t the point; the &lt;strong&gt;500 lines of Ansible deleted&lt;/strong&gt; is. The right way to frame Fly.io for your own team is not &amp;ldquo;how much cheaper&amp;rdquo; but &amp;ldquo;what operational complexity disappears.&amp;rdquo; And once you&amp;rsquo;re running GPU + API + frontend on the same platform — as we are with popcon — the economic gravity gets strong enough that alternatives have to clear a high bar.&lt;/p&gt;</description></item></channel></rss>