DocsGet started
Quick start
This guide shows how to run Checkend, connect an app with a Sentry SDK, and read the errors.
You need:
- Node 22.18 or later
- a clone of the Checkend repository, with
npm cidone - for a deploy: a Cloudflare account and
npx wrangler login
1Run Checkend on your computer#
Create the local database tables:
Terminalnpx wrangler d1 migrations apply DB --localMake an admin token, and put it in
.dev.vars(this file is git-ignored):Terminalecho "ADMIN_TOKEN=$(openssl rand -hex 32)" > .dev.varsStart the Worker:
Terminalnpm run devCheck that it runs:
Terminalcurl http://localhost:8787/healthThe response has
"status": "ok". See Settings and health for the other fields.
2Or deploy it to your Cloudflare account#
To run Checkend without Cloudflare, in Docker, on Node, or on a server over SSH, see Run without Cloudflare.
The first path is ce server install cloudflare (see
the ce CLI). It makes the Worker and the D1 database on your
account, with a Cloudflare API token. It installs only a signed
server release, shows the plan and asks first, and ends with the
setup link of the web UI:
ce server install cloudflareOr do the steps below by hand.
Caution: a deploy uses resources in your Cloudflare account. On the Workers Free plan, also
set D1_DAILY_ROW_LIMIT (see Budget mode).
Create a D1 database. Wrangler prints its
database_id.Terminalnpx wrangler d1 create checkendCopy
wrangler.jsonctowrangler.<name>.jsonc, for examplewrangler.mine.jsonc. In the copy, set your Workername, and add thedatabase_idto theDBentry. Files with the namewrangler.*.jsoncare git-ignored, so your resource IDs stay out of the repository.Apply the migrations and deploy:
Terminalnpx wrangler d1 migrations apply DB --remote --config wrangler.mine.jsonc npx wrangler deploy --config wrangler.mine.jsoncSet the admin token as a Worker secret. Until the secret is set, the API answers
401.Terminalnpx wrangler secret put ADMIN_TOKEN --config wrangler.mine.jsonc
For a project with many users, also add a rate limiting rule in front of ingest: see Protect the ingest path.
Apply the migrations before each deploy. Wrangler records each applied migration and skips it, so it is safe to run the command again.
3Create a project and get a DSN#
A project is one app. Each project has a DSN: the address that the Sentry SDK sends errors to.
$ npm run project -- create --name "My App" --platform nodeCreated project 4821937065 (my-app).DSN: https://8c1f4d0e9b7a42f6a3e5d2c1b0f9e8d7@checkend.example.workers.dev/4821937065Put the DSN in your Sentry SDK: Sentry.init({ dsn: "..." }).export CHECKEND_URL=https://<your-worker> # or http://localhost:8787
export CHECKEND_ADMIN_TOKEN=<your ADMIN_TOKEN>
npm run project -- create --name "My App" --platform nodeThe command prints the project ID and the DSN. To see all projects and their DSNs later:
npm run project -- listAdd --json to either command for JSON output.
https:// 8c1f4d0e9b7a42f6a3e5d2c1b0f9e8d7public key@ checkend.example.workers.devyour Worker host/ 4821937065project ID
4Connect your app#
Use any Sentry SDK. Put the Checkend DSN in Sentry.init. For example, in Node:
import * as Sentry from "@sentry/node";
Sentry.init({ dsn: "https://<key>@<your-worker>/<project-id>" });Browser SDKs work too: the ingest endpoints allow requests from other origins (CORS).
Checkend keeps error events only (exceptions and captureMessage). It drops sessions,
transactions, client reports and attachments. See Send errors.
5Read the errors#
curl -H "Authorization: Bearer $CHECKEND_ADMIN_TOKEN" "$CHECKEND_URL/v1/issues"Each issue is a group of events with the same cause. To see one issue and its events:
curl -H "Authorization: Bearer $CHECKEND_ADMIN_TOKEN" "$CHECKEND_URL/v1/issues/1"
curl -H "Authorization: Bearer $CHECKEND_ADMIN_TOKEN" "$CHECKEND_URL/v1/issues/1/events"See API for all endpoints.
$ curl -s -H "Authorization: Bearer $CHECKEND_ADMIN_TOKEN" "$CHECKEND_URL/v1/issues?limit=1" | jq{ "data": [ { "id": 1, "project_id": 4821937065, "title": "TypeError: Cannot read properties of undefined (reading 'id')", "culprit": "loadUser (src/users.ts)", "type": "TypeError", "level": "error", "platform": "node", "status": "unresolved", "times_seen": 42, "stored_events": 42, "events_24h": 42, "events_7d": 42, "users_affected": 2, "priority": 198.462, "first_seen": "2026-10-10T14:02:11.087Z", "last_seen": "2026-10-10T15:47:03.412Z", "first_release": "my-app@1.4.0", "last_release": "my-app@1.4.0", "fingerprint": "5d41402abc4b2a76b9719d911017c592", "fingerprint_version": 1, "merged_into": null, "claim": null, "trust": "high" } ], "next_cursor": "WyIyMDI2LTEwLTEwVDE1OjQ3OjAzLjQxMloiLDFd", "ingest": { "mode": "full", "rows_written_today": 509, "daily_row_limit": null, "events_received_today": 42, "write_failures_today": 0, "retry_after_seconds": 0 }}6Give your coding agent a read-only token#
Do not give the admin token to an agent. Create a token that can only read issues:
curl -X POST "$CHECKEND_URL/v1/tokens" \
-H "Authorization: Bearer $CHECKEND_ADMIN_TOKEN" \
-H "Content-Type: application/json" \
-d '{"name": "claude-code", "scopes": ["issues:read"]}'The response has the token (ck_...). Copy it now: Checkend shows it only once. Give it to the
agent as its bearer token. To revoke it later, use DELETE /v1/tokens/:id.
If the agent must also resolve, ignore or merge issues, create its token with
"scopes": ["issues:read", "issues:write"].
7Connect your coding agent with MCP#
Add the Checkend MCP server to your agent with the read-only token. For Claude Code:
claude mcp add --transport http checkend "$CHECKEND_URL/mcp" \
--header "Authorization: Bearer <token>"Then ask the agent, for example: "Fix the top unresolved error in Checkend." The agent calls
list_issues, then get_issue_brief. See MCP server for the tools and the issue
brief.
To let Checkend check in production that the fixes work, report your deploys. See Verify fixes.