# UpControl: full context for AI agents UpControl is two things: a public status page you create in one click, and the logging your coding agent installs with one npx package and any command you give it. Both are free on the Free plan, and paid plans start at $9 a month billed yearly. Technical uptime checks are the floor; the product correlates deploys, events and errors, so an incident arrives with "why", not just "down". Alerts land in Telegram, Slack, Discord and e-mail. Primary audience: apps written with or by coding agents. You describe in plain words what you want watched; the agent adds the observability the owner never wrote. ## One click: the status page On the landing, type an address and press Check, no account. Press Watch: a project named after the site, its checks and a public status page at `/status/` are created, unclaimed. That is the whole first click, and it needs no account. Press "Get alerts" and sign in (magic-link code by e-mail, or Google) to own it; then add channels under Alerts. Nothing alerts anyone until the page is claimed. Checks are Website (URL, optional "Page must contain" text, 1m/5m/30m/1h) or Heartbeat (a ping URL the job calls last, expected every 5 or 30 minutes, hourly, every 6 hours or daily; a ping that misses its window plus a grace of up to an hour opens an incident). Heartbeats are free and never count toward the plan's checks. Docs: https://upcontrol.io/docs/no-code ## One npx package: the logging `npx upcontrol` runs the `init` command, the default. It does three deterministic things and runs no AI: - installs the agent skill into `.claude/skills/upcontrol` and `.agents/skills/upcontrol` (`--copilot` adds `.github/skills/`), - pins `@upcontrol/sdk` in package.json at an exact version, - provisions a secret key into `.env`, only after `.gitignore` provably covers it, and without ever printing it. Key resolution, in order: `--token` (a one-time token from the dashboard's Connect page) → `--key` → `UPCONTROL_API_KEY` → `.env` → an anonymous project is minted; `--no-key` skips this. An anonymous project is claimed later via the printed link, with the same key. Run by an agent or in CI, `init` answers with one JSON line. Then any command will do: you tell your coding agent in plain words what you want watched. The agent reads the skill, places one-line `track()` points, and stages a diff for your review — the agent stages the diff, `init` does not. Works with Claude Code, Cursor, Codex, Gemini CLI, Copilot, Windsurf, Amp, Aider, Cline and opencode. The install is done when `npx upcontrol verify` proves data arrived: it polls until `install_verified` lands (exit 0), or exits 2 with no key, 3 unreachable, 4 when the key was rejected or nothing arrived within `--timeout` (120 s default). The command set is `init`, `verify`, `skills [topic]`, `status`, `board` (list a project's boards, read, append to or replace one, or create another; a board edited in the app waits for review instead of being overwritten). `npx upcontrol add` and `npx upcontrol run` are not commands: they print the help and exit 1. Docs: https://upcontrol.io/docs/install ## Event names Event names are free-form. A name unlocks nothing: detection runs on the level and the message fingerprint, so there is no fixed list of names to conform to. Two names have machinery: the `deploy` family (90 seconds of post-deploy quiet, the incident timeline) and `install_verified` (sent once by the SDK). The `uc.` prefix is reserved and refused with a `reserved_prefix` warning. Labels stay low-cardinality. The SDK is `@upcontrol/sdk` — zero dependencies, MIT. `track(name, labels)` never throws or blocks. `@upcontrol/sdk/auto` sends `app_started` and `unhandled_exception`. Strings are scrubbed client-side: keys, tokens, JWTs, card numbers, e-mails, passwords in URLs. An overflowing buffer reports `upcontrol_buffer_dropped`. Docs: https://upcontrol.io/docs/events · https://upcontrol.io/docs/api ## Ingest API `POST https://upcontrol.io/i` (`POST /v1/event` is an alias). The key travels in `X-Upcontrol-Key`, or `Authorization: Bearer`, or `?key=`, or a top-level `key` field. The body format is sniffed: NDJSON, a JSON array or object, plain text, syslog, OTLP, Sentry, Alertmanager, Loki. Sane input answers 200 with a receipt. 413 over 16 MiB. 503 `spool_full` with `Retry-After` under overload. No rate limit on secret keys. A byte-identical retry is deduplicated. Keys: up to 5 live keys per project. A secret key (`uc_live_`) lives in `.env`, sends logs and events, and reads, writes and creates dashboards. A public key (`uc_pub_`) is safe in a browser bundle: named events only, only from the origins listed on it, rate-limited. Revoke stops one key; "Rotate every key" keeps the old ones working for 24 hours. ## Alerts Channels: Telegram, e-mail, Slack, Discord. Telegram has two doors: "Connect Telegram" links you; "Create link" mints a one-time invite (7 days) for a person, a group or a channel. Bot commands: /status, /mute 30m|2h|1d, /unmute, /stop, /help, /id. E-mail recipients are people who signed in. Slack and Discord take a webhook URL. Per channel: "Website is down", error-log alerts (off / every new error / only repeating errors, with a 1–120 min window), and the 15-minute follow-up on paid plans. "Send test" on every row. ## Deploys Connect → Deploy hooks → Copy gives `https://upcontrol.io/hooks/`; anything that POSTs JSON is a source. Vercel: a team webhook with the deployment events. GitHub: a curl step at the end of the deploy job sending `{"event":"deploy"}` (a repository webhook arrives as `github_`, which does not count as a deploy). The URL is the credential. An incident's timeline carries the events from the 30 minutes before it; a deploy (any name starting with `deploy` or containing `deployment`) quiets error-rate alerts for 90 seconds. Deploys can be charted on the dashboard like any event. Docs: https://upcontrol.io/docs/integrations/deploy-hooks ## Status page and team The status page lives on our link at `/status/`, with a Network section toggle. The "Powered by UpControl" line stays on every plan; paid plans put the page on a subdomain of yours via CNAME. Team roles are Member and Admin, both free on every plan. The owner has no role control. ## The Free plan - Confirmation before an incident opens: 3 consecutive failures - SSL and domain expiry on every check - Alerts on new errors, with a repeat filter - Deploy and event correlation - The log slice frozen with an incident - Unlimited Slack, Discord and e-mail recipients - Free teammates The window is a line count (25,000 on Free, about 24 hours at a typical pace); raw log lines are kept for 31 days on every plan, so upgrading opens the older ones again. ## Pricing https://upcontrol.io/pricing Four plans, monthly price then per month billed yearly: Free $0; Indie $11 or $9; Growth $24 or $19; Agency $49 or $39. What scales, Free / Indie / Growth / Agency: - HTTP checks: 3 / 10 / 30 / 100 - Check frequency: every 5 minutes / every minute / every minute / every minute - Live log window: 24 h / 48 h / 7 days / 30 days - Dashboard history: 24 hours / 7 days / 31 days / 12 months - Dashboards per project: 1 / 1 / 3 / 5 - Incident history: 10 days / 12 months / 24 months / 48 months - Telegram destinations (people, groups and channels together): 3 / 10 / 20 / 30 - Telegram groups & channels: no / yes / yes / yes - Projects: 1 / 2 / 5 / 10 - 15-minute follow-up: no / yes / yes / yes - Status page: our link / your own domain ×3 The same on every plan: confirmation before an incident opens, SSL and domain expiry on every check, alerts on new errors with a repeat filter, deploy and event correlation, the log slice frozen with an incident, unlimited Slack, Discord and e-mail recipients, free teammates. Pricing is never by log lines and never by login. ## Self-host Self-hosting is free forever: `git clone`, `cd upcontrol/infra`, `./install.sh`; 1 GB RAM recommended. Docs: https://upcontrol.io/docs/self-host ## Source The core is AGPL-3.0 — the services, the detectors, the web app, the status pages. The SDK and CLI are MIT. What stays closed is the cloud around the core: billing, the hosted mail service, the multi-region probe fleet. The repository is github.com/upcontrol-io/upcontrol. A monitor on your own server dies with the server: point one hosted free check at it.