PricingSign inGet startedDashboard →

← Blog

Switching

Moving a Mac app's website off Vercel in a day: AI Grammatic on Belov Cloud

October 25, 2026

AI Grammatic's website does more than market an app: it sells the subscriptions, issues the licenses, forwards every rewrite to the AI provider and hands each installed copy its updates. Here's how all of it moved from Vercel, Supabase and GitHub to one Node service on Belov Cloud — and what the move taught us about our own platform.

AI Grammatic is a writing assistant for the Mac: select text in any app, press ⌘⌥E, and it's rewritten the way a native speaker would put it — grammar, tone and translation in one shortcut. It's built by the same group as Belov Cloud, so read this as a field report rather than a testimonial: what went smoothly, and the three things in our platform it exposed.

Before the move, the site was a Vite single-page app with Vercel Serverless Functions behind it: the Stripe checkout and webhook, license checks, device registration and the proxy that sends each rewrite to OpenAI, Anthropic, Google or DeepSeek. Its data lived in Supabase, and the app's downloads and Sparkle update files were GitHub release assets. Two things forced the move. Vercel's free Hobby plan is for non-commercial use, and AI Grammatic sells subscriptions. Then the GitHub account holding the release files was suspended, so the download link and every update in the appcast started returning 404 — installed copies could no longer update.

  1. 1 · One Node service instead of a platform
    A small Hono server serves the built site and mounts each former function as a route, passing the raw request through untouched — so the Stripe webhook signature still verifies and AI responses still stream. It runs as a Node service with a health check, built from its repository in Belov Git on every push.
  2. 2 · Releases served by the site itself
    The DMG and the Sparkle update archive moved into the site's own public/releases folder, and the appcast points there. The archive is byte-for-byte the one that was signed, so its EdDSA signature still verifies: copies already installed picked up updates as soon as DNS switched, with no new app release and no change to the feed address.
  3. 3 · Supabase to managed Postgres
    A managed PostgreSQL database was attached to the app, which receives it as DATABASE_URL. Queries moved to postgres.js, the one stored procedure became a single INSERT … ON CONFLICT that returns the new totals, and a copy script moved the data — then ran once more after the DNS switch to pick up the last writes on the old host.
  4. 4 · The small Vercel-isms
    Euro prices for EU visitors used Vercel's geolocation header; they now read Cloudflare's CF-IPCountry. Unknown URLs used to fall back to the home page with a 200 — a soft 404 — and now return the prerendered 404 page with a real 404 status.
  5. 5 · Switch DNS, nothing else
    With the domain attached in the panel, the site went live by itself a minute or two after the records resolved here. The preview address kept working the whole time, which is where everything was checked before the cutover.
What it costs
An app with a managed database runs in a full-stack slot: $39 a month, or $390 billed yearly. That covers the database, SSH into the app, push-to-deploy with health checks and rollbacks, and backups. Without a database it would be a front-end slot at $15 a month.

What it exposed in our platform. A real migration under a deadline is the best test we get, and this one found three problems we fixed the same weekend. A push that landed while a build was running used to be dropped; it now queues one more deploy for right after. A new release used to replace the running container before booting, so every deploy meant errors for as long as the app took to start; releases now start next to the running one and take over only once healthy, and a release that fails its health check never interrupts traffic. And attaching a custom domain left the app's short preview address answering blank; it now keeps working. We also switched off Cloudflare's email obfuscation, which had been rewriting e-mail addresses in customers' HTML.

Moving a Node.js or Next.js app — or a pile of serverless functions — off Vercel? Bring the repository: it runs as one service with push-to-deploy, rollbacks and a managed database.

Node.js hosting →

← All posts