Deploy

GitPigeon is single-tenant: every blog deploys its own instance. All platforms share the same core; only the entry point changes.

Prerequisites

  1. A GitHub repository for comment data (can be separate from your blog repo)
  2. A Fine-grained PAT (see GitHub setup)
  3. Cloudflare Turnstile site key and secret (optional; setting both enables the captcha)
  4. A mail provider: Resend or MailPort (see Mail setup)

Vercel

  1. Import this repository
  2. Add every variable from Environment
  3. Set Framework Preset to Other, leave build and output settings empty
  4. After deploy, open /api/health

Netlify

  1. Import this repository
  2. netlify.toml already declares publish = "public" and the functions directory
  3. Add variables under Site settings → Environment variables
  4. Open /api/health

Cloudflare Workers

  1. Run npm run build to produce public/embed.js and public/review.js
  2. Deploy with wrangler deploy; wrangler.toml already points at the assets directory
  3. Use wrangler secret put for sensitive values
  4. Open https://<worker>.workers.dev/api/health

Cloudflare Pages

functions/api/[[path]].ts forwards /api/* to the shared router, and public/_routes.json makes only /api/* invoke functions while everything else is served statically.

  1. In the Cloudflare Dashboard → Workers & Pages → Create → Pages, connect this repository
  2. Set Build command to npm run build and Build output directory to public
  3. Add every variable from Environment under Settings → Environment variables
  4. Open https://<project>.pages.dev/api/health

Notes:

  • Pages requires a redeploy after changing environment variables
  • If your blog also runs on Pages, make sure its worker routes do not conflict with this system's /api/*
  • The Pages free tier has a daily function request limit; usually enough for a comment system

Local mode is for debugging and LAN use. It is not a recommended production setup: no TLS, no edge cache, a process that must stay resident, and no platform Git integration.

  1. Run npm run build
  2. Copy .env.example to .env and fill it in
  3. Run npm run serve:local
npm run build
npm run serve:local

The script bundles dev-server.mjs and starts a Node HTTP server on port 8787, overridable with PORT:

PORT=9000 npm run serve:local

Local mode uses a Web Request / Response adapter, so behavior matches edge platforms, but it has no platform-level caching or auth. Use Vercel / Netlify / Workers / Pages in production.

Post-deploy checklist

  • status is ok
  • git.readable is true
  • mail.configured is true when moderation is on
  • sameRepoWarning is null when you use a separate repository