Vercel is a great product — push, build, preview, approve, ship. But not every project needs the full suite.

This site runs on a much simpler deploy pipeline. One command, sixty lines of bash.

npm run deploy

What it does:

  1. Vite production build
  2. SSH upload via tar (excluding vendor, node_modules, .git, .env)
  3. OPcache reset (via HTTP)
  4. Smoke test (HTTP 200 check)

Average time: 18 seconds.

Why not Vercel

  • No PHP runtime. Our backend is PHP on LiteSpeed.
  • DB is extra. Hostinger bundles MariaDB; Vercel doesn't.
  • Monthly cost. A Hostinger year = two Vercel months.

Vercel is great for client products. For a studio's own site, overkill.

Anatomy

Three things matter:

  • SSH key auth. Passwordless via ~/.ssh/config alias.
  • Tar + SSH pipe. Faster than rsync, parallel compress/decompress.
  • Exclude list. node_modules, vendor, .git, .env out.

OPcache reset

PHP OPcache serves stale bytecode unless reset. opcache_reset() from CLI doesn't affect PHP-FPM — each process has its own cache. Solution: drop a temp _reset.php, curl it, delete it.

Smoke test

STATUS=$(curl -sk -o /dev/null -w '%{http_code}' "$SITE_URL/?cb=$(date +%s)")
[ "$STATUS" = "200" ] || exit 1

?cb=timestamp busts CDN cache.

80/20

No CI/CD, no preview URLs, no rollback process beyond git revert. For a solo-maintained studio site, that's exactly enough.

When the team scales or we need preview URLs, we evolve toward GitHub Actions. Until then, npm run deploy is the product.