Uptime
Available
Private uptime console for scheduled HTTP(S), keyword, and heartbeat probes, with Base owner sign-in, installation-wide incident notifications, and portable product archives.
Uptime is available as MIT-licensed source for self-hosting. See its public source and release documents for setup. Run Edit Run installation and hosted service are not offered for this project.
For HappyToHelp: Assisted is in early access; Managed is waitlist only.
- Category
- monitoring
- Licence
- MIT
- Version
0.3.0- Requirements
- 21 clauses
- Release signature
- Signed by just-every · key
rer-ed25519-5a42fb9c9c4f8acb2b32386e9e40461c· statement - Target release
- v0.3.0 · published
- Publisher’s stage
- local-installer-and-owner-deploy-implemented-hosted-unverified
- Instead of
- UptimeRobot, Pingdom, Better Stack
Screenshots
Uptime v0.3.0 at 1440 pixels: a real scheduled local check and its recovered incident in Uptime Dev, from the screenshot named in RELEASE.json.
Outside services
The services the project declares it sends data to, each with its reason.
cloudflare- An owner-directed deployment sends the application, migrations, configured Worker bindings and secrets, resource settings, and health requests to the owner's Cloudflare account; Cloudflare hosts the Worker, D1 database, and scheduled Cron.
sendgrid-mail- SendGrid sends hosted sign-in, incident email and monitoring watch mail when selected as the Base mail adapter.
incident-webhook- Owner-configured webhook (custom-webhook) sends to custom destination owner-configured-json-receiver: deliver scheduled incident events to the owner's public HTTPS endpoint. The endpoint runs outside this installation.
slack-incoming-webhook- Slack (slack) sends to provider destination slack-incoming-webhook: post escaped notification content to the owner's incoming webhook. Slack runs outside this installation and accepts the configured remote request.
external-heartbeat- Owner-selected independent HTTPS heartbeat service; optional empty GET while self-check passes. The configured URL is a capability and its path is sent to that service.
runner-watch- Independent webhook or Slack notice configured only in the runner environment.
owner-app-readiness- The local setup/dev/preview lifecycle checks the selected Uptime application readiness endpoint; it may be local loopback or an owner-selected remote origin.
configured-dns-resolver- Private runners and owner tools use their configured DNS resolver. Hosted public checks validate A/AAAA answers through Cloudflare DNS over HTTPS; Workers fetch uses Cloudflare’s public Internet resolver and transport.
public-monitor-targets- The hosted Worker or an explicitly assigned private runner sends scheduled requests to the owner’s public target and optional canary URLs.
site-discovery- The runner performs bounded read-only discovery of the owner's chosen site, following its public redirects and crawling permitted pages and related API/status hosts.
isolated-browser-flow-targets- A fresh runner browser follows owner-defined flows through the filtering proxy; target pages and their public network dependencies receive ordinary browser requests.
runner-control-plane- The separately operated runner uses signed HTTPS requests to the configured Uptime Worker control plane for enrolment, claims, results, discovery, notification custody, and contact.
optional-identity-provider-setup- The shared setup CLI can read selected provider discovery documents. The completed local probe read dependency metadata, then failed at unmounted application dependency approval (404) before owner creation or any provider link request. Uptime does not mount linked-provider routes; runtime OIDC callback, token, JWKS and dependency exchange are unsupported.
optional-management-editor- An authenticated owner page may create the configured management editor iframe while the editor is hidden. This is an explicit private management integration, not a public embeddable widget. This is the explicit BASE-DATA-005 exception: the configured origin may belong to the author and receive opted-in requests; the native product has no operational dependency on this integration.
resend-mail- Resend sends hosted sign-in, incident email and monitoring watch mail when selected as the Base mail adapter.
cloudflare-mail- Cloudflare Email Sending sends hosted sign-in, incident email and monitoring watch mail when selected as the Base mail adapter.
Scope and limits
What it will not do
- Real provider or production target actions before explicit authority and verification
- Public communication, people paging, and independent geographic monitoring
- Fresh-account hosted operation and recipient acceptance remain unverified
Declared limits
- Status
- estimated-not-tested
- Public Requests Per Minute Per Ip
- Documents 180
- Health 180
- Authentication 120
- Setup 180
- Editor 180
- Redirects 180
- Heartbeats 600
- Runner 1,800
- Assets 600
- Development 600
- Drills 30
- Development assets 1,800
- Notes
- Owner-tunable source settings; each class shares one fixed 60-second D1 window per client. Production assets retain their own budget. Local Vite compiler assets use a separate budget for the unbundled browser graph: about 140 module requests per console load, with room for twelve loads per minute. These defaults are estimated, not load tested. Hosted CF-Connecting-IP must be a valid single IP; missing/malformed values share an unknown-client bucket. Local mode ignores all forwarding headers and uses one loopback bucket. Only keyed hashes of client identities are stored.
Requirements
All 21 clauses of Uptime’s CONTRACT.md. They say what the project must do; the handover and verification records say what is built and tested.
HTTP 1 clause
HTTP-001Signed HTTP monitoring Public hosted HTTP(S) and keyword checks run in the Cloudflare Worker; private checks use the separately scoped Node runner. They retain the exact immutable assertion bundle and bounded transport evidence, and require authenticated claims and signed results; the control plane must reject contradictory completion. See [Integrity and authority](#integrity-and-authority) and [Network and credentials](#network-and-credentials).
EVIDENCE 1 clause
EVIDENCE-001Immutable scheduled evidence Definitions, scheduled slots and every retry attempt retain revision, policy, fixed selected probes, runner identity, timings, status, assertions and error category; retries never erase failures, and observation/state/outbox commit atomically. See [Evidence and state](#evidence-and-state) and [Integrity and authority](#integrity-and-authority).
STATE 1 clause
STATE-001Fixed coverage and incident hysteresis Missing or expired passing coverage is Unknown, partial failure stays visible, independent-vantage agreement and scheduled confirmation determine Failing, and complete fresh scheduled passing evidence plus recovery threshold is required for recovery; manual checks and maintenance never rewrite observations or scheduled policy. See [Evidence and state](#evidence-and-state).
AUTHORITY 1 clause
AUTHORITY-001Server-side scoped authority Every private document, read, mutation and export requires server-side operator or scoped runner authority, missing configuration fails closed, browser mutations enforce configured origin, and expired/foreign attempts cannot alter current evidence, and duplicate attempt identities cannot overwrite it; a signature identifies a key holder rather than proving truthful observation. See [Integrity and authority](#integrity-and-authority).
NETWORK 1 clause
NETWORK-001Pinned bounded destination execution Every public DNS answer and redirect hop is validated fail closed; private-runner numeric sockets preserve Host and TLS identity, hosted checks use Cloudflare’s public Internet fetch transport, unsafe/mixed addresses and HTTPS downgrade are rejected, cross-origin redirects strip request authority, and synthetic grants and protected origin-bound local credential files retain their separate custody limits. See [Network and credentials](#network-and-credentials).
HEARTBEAT 1 clause
HEARTBEAT-001Revision-scoped receipt evaluation Hashed owner-issued tokens and increasing sequences protect server-time receipts, ingress cannot advance health, and scheduled signed completion must match its exact installation-local claim snapshot; stale, future, paused, foreign-revision or imported receipts cannot establish Healthy. See [Network and credentials](#network-and-credentials).
ARCHIVE 1 clause
ARCHIVE-001Inactive validated restore Bounded versioned archives require integrity and semantic validation before transactional restore into empty product data, preserve historical evidence, erasure receipts and the permanent anonymised action audit, create paused current revisions, interrupt leases and quarantine alerts; installation-local sessions, keys, grants, request credential values, heartbeat authority, contact, webhook and Slack URLs, and signing keys are excluded; destination definitions and retained notification histories are portable, and imported evidence cannot establish current health or replay events. The source erasure journal fences copies made before a later erasure when that journal accompanies the restore. A local CLI receiving checkout must run setup first to establish its owner and settings. The owner accepted this installation-authority and endpoint-credential archive policy on 2026-10-13; it is an intentional replacement, not BASE-DATA-001 equivalence. See [Portability and retention](#portability-and-retention) and [Integrity and authority](#integrity-and-authority).
IMPORT 1 clause
IMPORT-001Reviewed definition files and inactive imports Versioned monitor definition files are previewed without writes and validated with the editor’s rules. Applying a matching plan creates paused monitors or new revisions that preserve existing enablement, maintenance and runner assignments. Files carry no request secrets or installation authority and cannot enable monitors, issue heartbeat tokens or change notification destinations. Batch undo preserves history and reports revision conflicts. No real third-party export or hosted import has been measured.Presentation summary by Run Edit Run: Describe the reviewed definition-file workflow without claiming support proven against real data from a named product. No verified real-data importer record is available. The exact publisher clause remains in the signed manifest and CONTRACT.md. Exact publisher wording is in
CONTRACT.md.
RETENTION 1 clause
RETENTION-001Explicit storage custody Product and observation metadata and legacy development sign-in records have no automatic age/count deletion; operator erasure removes captures for the associated operator, and local reset clears the installation. Expired sessions, authentication/public rate-limit state and short-lived login-attempt counters are cleaned up. Expired or confirmed alert-drill links lose their capability material while drill history stays; retired destination secrets are scrubbed only after owner rotation/deletion and in-flight sends finish; a proven-unsent integration-attempt reservation can be removed while its delivery history remains. Other expired operational records, including discovery jobs, change status and remain stored unless an owner erases the associated entity or resets the installation. Raw target response bodies and probe-request secrets are not retained in observations, webhook and Slack endpoint URLs and signing keys remain installation-local, available email addresses travel as destination definitions, view/archive bounds are not deletion or capacity claims, and retention changes must never silently improve the fixed denominator or historical health. See [Portability and retention](#portability-and-retention).
ERASURE 1 clause
ERASURE-001Operator-directed entity erasure An owner can erase a monitor with its evidence and dependent notification/heartbeat records, a destination with its credential copies, or an operator while another active owner remains. Monitor erasure requires typing the current monitor name. Each completed erasure returns a receipt with entity kind, per-table counts and completion time, and returns it only after the transaction containing the erasure, audit entry and portability fence succeeds. Requests based on stale monitor or destination state cannot re-create erased rows. The last active owner cannot be erased: local installations userer reset --yes, while hosted installations require replacement by redeployment. Uptime has no R2 upload feature, so product erasure has no uploaded attachments to remove. Already downloaded archives, messages already sent to external recipients and requests already in progress remain outside local erasure. See [Erasure and audit](#erasure-and-audit).
AUDIT 1 clause
AUDIT-001Durable anonymised audit Destructive actions, automated notification attempts and operator authentication-mail sends record actor or feature, time, action, subject kind and an opaque subject reference. Audit history is portable and survives erasure of the subject; erasing an operator anonymises its prior actor references. The audit contains no monitor names, target URLs, email addresses or destination URLs. See [Erasure and audit](#erasure-and-audit) and [Portability and retention](#portability-and-retention).
PRESENCE 1 clause
PRESENCE-001Contact separate from health Only accepted scoped claims and signed results refresh server-time contact, the 120-second freshness threshold never proves process liveness or target health, and restart, unavailable reads and archive omission preserve that distinction. See [Contact, interface and delivery](#contact-interface-and-delivery).
INTERFACE 1 clause
INTERFACE-001Honest durable operator feedback Textual state/freshness/reasons, immutable history, labels, keyboard controls and responsive layout expose persisted evidence; failed reads show Unknown, action errors survive polling, busy reconciliation excludes controls and editing rejects assertion overrides. See [Contact, interface and delivery](#contact-interface-and-delivery).
NOTIFY 1 clause
NOTIFY-001Authorized installation-wide destinations An owner may configure email, signed JSON webhook, or Slack incoming webhook destinations for all monitors in one installation; only scheduled incident transitions generate automatic notifications, and a test send cannot change monitor evidence or incident state. The hosted Worker submits email through the configured Base mail adapter and sends webhooks and Slack without a private runner; a private runner can also claim notification work. Destination credentials are installation-local and are not restored from archives. See [Contact, interface and delivery](#contact-interface-and-delivery) and [Network and credentials](#network-and-credentials).
DELIVERY 1 clause
DELIVERY-001Bounded notification acknowledgement Each event and destination gets one automatic send attempt. A RER relay 429 with Retry-After confirms non-acceptance and queues another submission after that delay. HTTP 500, connection loss, timeout, and unknown outcomes remain uncertain and are not automatically sent again. Accepted means the configured provider or endpoint acknowledged the request; it does not mean a person received, read, or acted on it. See [Contact, interface and delivery](#contact-interface-and-delivery).
PUBLIC 2 clauses
PUBLIC-001Public landing and documentation At the app origin,/is the unauthenticated Lobby,/docsis public documentation,/setupis first-run setup, and the private operator console and editor are/appand/app/monitor; private documents require an owner session. The separate marketing site serveshttps://run-uptime.com/andhttps://run-uptime.com/run. The app Lobby at/and the marketing landing at the run-site/are distinct surfaces.PUBLIC-002Declared sessionless paths and rate limits Every sessionless route and emitted static path is declared inseed.jsonwith its authentication rule and rate-limit class. D1 applies owner-tunable per-client limits in fixed 60-second windows and returns 429 withRetry-Afterafter the class limit. A declaration does not bypass route-specific session, runner, heartbeat or development-key checks. Limit values are marked estimated and not load-tested. See [Public paths and rate limits](#public-paths-and-rate-limits) and [Integrity and authority](#integrity-and-authority).
BOUNDARY 1 clause
BOUNDARY-001Bounded delivery and operating claims Destinations apply to all monitors in the installation, while runners with the same network label remain one vantage. Provider acknowledgement and stored delivery state do not prove inbox receipt or human notification. Teams, Discord, SMS, on-call paging, incident escalation, and public status communication are outside the product; network isolation, browser execution, and accessibility conformance require separate evidence. See [Contact, interface and delivery](#contact-interface-and-delivery).
DRILL 1 clause
DRILL-001Recipient-reported alert drills An owner can run an alert drill on one destination: the existing test event with drill wording, sent once through the same path with no automatic resend, plus a one-time confirmation link (random capability, stored only as a bound hash, single use, 24-hour expiry, one drill and one destination). Opening the link shows a page; only a same-origin POST confirms, and unknown, used, expired and foreign links answer 404 alike. The console keeps Submitted, Acknowledged (or Uncertain/Failed with its code) and Recipient confirmed as separate lines, and does not measure whether anyone acted. A confirmed drill is a report by the recipient that one message reached a person at one time. It is never evidence of monitoring, a delivery guarantee or a human response, and it changes no monitor evidence, state or incident. Proof belongs to the destination's current credential: a new address or URL or a rotated secret makes it Never proven, and drill history stays with the installation, so a restored destination is Never proven. See [Alert drills](#alert-drills).
STARTUP 1 clause
STARTUP-001Required configuration diagnostics A shared configuration table validates required and conditional bindings for the Worker, scheduled entry point, local app, preview, setup, deployment and private runner before each begins work. Missing or malformed required values stop the entry point and name the variable without printing its value; a Worker configuration failure returns 503, including at/health. Hosted mode requires the selected Base mail provider and its sender configuration. See [Configuration diagnostics](#configuration-diagnostics).
FLOW 1 clause
FLOW-001One isolated browser flow (implementation only, outside the supported public feature set) A flow monitor is a revision like any other: a plain-language intent, a start URL under the public-target rules, an ordered list of steps from a closed vocabulary (go to a page, click, fill a field with a named runner-local credential, wait for or expect text, a URL or an element) and the required outcomes that must all be observed for a pass. It carries no script, expression or secret, and nothing is added to the bounded HTTP path. A runner that has a browser runs each flow in its own process with a fresh private profile, a sanitized environment, one flow at a time and a process-tree kill at the wall-clock limit; all browser traffic goes through one filtering door that enforces NETWORK-001. A runner without a browser reports that, and the flow is Unknown with that reason. Credentials stay on the runner. Each observation keeps an immutable, sanitized step trace and the digest of the revision it ran, and no screenshot or page body. Exceeding any stated bound is a failure naming the bound. A pass is evidence of that flow only. See [Flows](#flows) and [Network and credentials](#network-and-credentials).
Baseline
Selected ownership clauses from the 44 in the project’s BASELINE.md. They are declared requirements; evidence is recorded separately.
BASE-DATA-005Independence. The deployment makes no request to the marketplace or the seed author. There is no telemetry, phone-home, licence check, or kill switch.BASE-DATA-001Export and import.rer export --output FILEproduces every record and attachment;rer import --input FILE --yesrestores it into an empty deployment; export, import, export yields an archive with equivalent contents.BASE-DATA-004Outbound flows. User data leaves the deployment only through externals declared inseed.json → externals. No other outbound request carries user data.BASE-PUBLIC-001Privacy. Public surfaces (widgets, booking pages, forms, status pages) set no cookies, load nothing from third-party domains, and send no visitor data before the visitor's first interaction.BASE-SECRET-001No leakage. No secret appears in the client bundle, in logs, or in an error response.
View as agent
These publisher documents are copied unmodified from the release. Site presentation summaries and historical screenshots are attributed separately on this page. An agent evaluating Uptime can read them instead of the page.
seed.json- The manifest: capabilities, outside services, extension points, limits, operating cost and deployment needs.
CONTRACT.md- The requirements on this page, in source form.
AGENTS.md- Instructions for the coding agent that maintains an installation.
README.md- Source setup, available commands and implementation status.
BASELINE.md- The baseline requirements the project declares.
OPERATIONS.md- How the project is set up, operated and deployed.
ACCEPTANCE.md- What the publisher accepts as a finished release.
Every project, with its availability, is in /agents/catalogue.json; the agents page describes the machine-readable files.
