DeployProof needs two base URLs: the new preview deployment and the stable production site. It does not create deployments or require a hosted account. Run it after the provider reports that the preview is ready.
| Deployment flow | Recommended recipe |
|---|---|
| Provider creates GitHub deployment statuses | deployment-status.yml |
| Vercel CLI deploys from GitHub Actions | vercel.yml |
| Cloudflare Wrangler Action deploys the preview | cloudflare.yml |
| Netlify CLI deploys the preview | netlify.yml |
| A custom deploy job exposes a URL output | Pass that output directly to loke-dev/deployproof |
The generic deployment-status recipe is the preferred option when available.
It consumes the standard environment_url reported by GitHub and avoids
coupling the check to a provider-specific API.
Store the production base URL as a non-secret GitHub Actions variable named
PRODUCTION_URL. Keep provider credentials in GitHub Actions secrets. A
minimal deployproof.config.json can define the behavioral contract:
{
"routes": [
"/",
"/docs",
{
"path": "/api/health",
"method": "GET",
"expect": {
"status": 200,
"contentType": "application/json"
}
}
],
"timeoutMs": 10000,
"maxRedirects": 5,
"maxBodyBytes": 512000
}The Action's routes input is useful for simple setups. Routes from the input
are appended to routes in the configuration file.
The GitHub-hosted runner must be able to reach both targets. If a provider protects preview deployments, use the provider's documented automation bypass mechanism. DeployProof can send custom headers declared in the route configuration, but the same header set is intentionally sent to preview and production so the comparison remains valid.
Never commit bypass tokens. Inject secrets at workflow runtime and avoid printing configuration or command arguments containing secret values.
- Requests are read-only and limited to
GETandHEAD. - Preview and production receive the same route, method, and custom headers.
- Custom headers are dropped when a redirect crosses origins.
- Response bodies are read only for bounded HTML metadata extraction and are never included in reports.
- Cookie values and custom request-header values are never reported.
- Query values are replaced with deterministic fingerprints.
Review the repository's security policy before using private targets or sensitive automation credentials.