Guides

Cloud API

Optional hosted rendering, persistent history, team collaboration, and multi-channel alerting. The CLI is fully self-hostable — the cloud is for teams that want managed infrastructure.

Cloud API

The Frontguard CLI is fully self-hostable — it renders locally, stores baselines in your own git repo, and never requires an account. The Cloud API is an optional managed layer for teams that want hosted rendering, persistent history, shared baselines, and team collaboration.

You never need the cloud to use Frontguard. Reach for it when you want a team to share baselines and history, or want rendering to run off your machines.

Architecture

The cloud is a Hono service deployed on Cloudflare Workers:

  • Runs are submitted to the API and executed in an ephemeral Daytona sandbox (Playwright pre-installed).
  • Persistent storage uses Cloudflare D1 (SQLite) for run/monitor/team metadata and R2 for screenshot blobs.
  • Auth is GitHub OAuth (for the dashboard) plus hashed API keys (for CI), with per-key rate limiting.

Authentication

Sign in to the dashboard with GitHub, then create an API key for CI use. Pass it as a bearer token on every request.

export FRONTGUARD_API_KEY=fg_live_…
curl -H "Authorization: Bearer $FRONTGUARD_API_KEY" https://api.frontguard.dev/v1/usage

Key endpoints

Method & pathPurpose
POST /v1/runSubmit a visual regression run (async)
GET /v1/runs/:idCheck run status
GET /v1/runsList runs
GET /v1/reports/:idFetch the HTML report
POST /v1/baselines/:runId/approveApprove a run's screenshots as baselines
GET /v1/screenshots/:runIdList screenshot metadata for a run
GET /v1/usageCurrent usage against plan limits
GET/POST /v1/monitorsManage production monitors
GET/POST /v1/teamsManage teams and members

Alerting

Production monitors deliver alerts to multiple channels, with deduplication and snooze so a single ongoing regression doesn't page you every cron cycle.

ChannelConfigure withNotes
Slackalerts.slack (incoming webhook URL)Block Kit message
Emailalerts.email (array of addresses)Via Resend
PagerDutyalerts.pagerduty (Events API v2 routing key)Opens an incident; dedup_key groups identical regression sets
  • Deduplication: alerts are fingerprinted by the set of affected route+viewport pairs. An identical regression set won't alert twice; a different set always does.
  • Snooze: POST /v1/monitors/:id/snooze suppresses alerts for N hours.
  • Test: POST /v1/monitors/:id/test-alert sends a sample to every configured channel (bypasses dedup/snooze).
A monitor with all three channels
curl -X POST https://api.frontguard.dev/v1/monitors \
  -H "Authorization: Bearer $FRONTGUARD_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Checkout",
    "url": "https://shop.example.com",
    "routes": ["/checkout"],
    "intervalMinutes": 30,
    "alertThreshold": 0.01,
    "alerts": {
      "slack": "https://hooks.slack.com/services/…",
      "email": ["[email protected]"],
      "pagerduty": "R0UT1NGK3Y…"
    }
  }'

Plans & limits

PlanRuns/moScreenshots/moHistoryTeamMonitorsProd monitoring
Free505007 days11
Pro5005,00030 days1010
BusinessUnlimitedUnlimited90 days50Unlimited

Billing is handled through Stripe. Teams add shared baselines, role-based access (viewer / reviewer / admin), approval workflows, and an activity feed.

On this page