# What is Belvador

> Error tracking, traces, logs, cron and uptime monitoring for your apps, with the data on your workspace's own Hetzner server, set up and maintained by Belvador.

Belvador catches the errors your apps throw — a crash in the browser, a failed server request, an exception you report yourself — groups them into issues and tells your team. Next to errors it keeps OpenTelemetry traces and logs, watches your cron jobs, checks your URLs and tracks SLOs. The difference from other error trackers: **this data is stored on a server in your own Hetzner Cloud account**, and Belvador sets up and maintains that server for you.

## How it fits together

```text
your app ──(SDK + DSN)──▶ ingest.belvador.dev ──▶ your node, in your Hetzner project
                                                        ▲
your browser ──▶ Belvador app ──▶ edge.belvador.dev ────┘  signed read tickets
```

1. **Your app** sends errors with a Belvador SDK. The project's **DSN** tells the SDK where to send them.
2. **The ingest edge** at `https://ingest.belvador.dev` checks the DSN key and your limits, then forwards each error to your node. If the node is briefly unreachable, the edge keeps the data encrypted to your node's own key — Belvador cannot read it — and delivers it when the node is back.
3. **Your node** is a small server in your Hetzner project. It scrubs sensitive fields a second time, groups errors into issues and stores them.
4. **The Belvador app** shows issues, the Fleet overview and node health. Your browser reads error data straight from your node through `edge.belvador.dev` with signed tickets that expire within minutes. Belvador's own database only keeps account, project and configuration metadata.

## What you do and what Belvador does

| You | Belvador |
|---|---|
| Create a Hetzner Cloud account, a dedicated project and an API token | Picks, creates and hardens the server, sets the firewall and installs the node software |
| Pay Hetzner directly for the server | Checks node health, installs signed updates and runs daily encrypted backups once [backup storage](https://belvador.dev/en/docs/node/backups) is set up |
| Create a project per app and install the SDK | Receives, scrubs and groups errors, sends alerts |
| Decide who holds the backup decryption key | Keeps the key in the Belvador vault — or never sees it, if you keep a recovery kit yourself |

You do not need SSH, Docker or a server login to get started. Setup and maintenance happen from the Belvador app.

## What Belvador captures — and what it does not

- **Errors from the Belvador SDKs, traces and logs from OpenTelemetry.** The 0.x SDKs send error events and cron check-ins; their own tracing, session replay, logs and profiling are dropped inside your app before anything leaves it. Traces and logs come from the standard OpenTelemetry SDKs with a project ingest key and are stored on your node as well. See [Traces and logs](https://belvador.dev/en/docs/otel/overview).
- **Automatic capture is what you wire up.** In the browser, uncaught errors and unhandled promise rejections are captured as soon as the SDK starts. React error boundaries and root hooks, the TanStack Start router and middleware, and the Cloudflare Workers wrapper each capture their own part once added. See [Choose an SDK](https://belvador.dev/en/docs/sdk/overview).
- **Handled errors stay handled.** An error your code catches and deals with is not sent unless you call `captureException` yourself.
- **Sensitive data is filtered twice** — by the SDK and again on the node. Filtering works by field names and patterns, so it reduces risk but cannot recognise every secret. See [Data protection](https://belvador.dev/en/docs/privacy).

> [!NOTE]
> The DSN is public by design. Anyone who sees it can send errors to the project, so it is protected by rate limits and allowed origins, not by secrecy. Never put a secret in it.

## What is available today

| Available now | Not available yet |
|---|---|
| SDKs for the browser, React 18/19, TanStack Start (Lovable apps) and Cloudflare Workers — version 0.6.1 | Performance dashboards and profiling |
| Node.js and Python through the official Sentry SDKs | Session replay |
| Issues with search, filters, assignment, resolve and archive | GitHub, Linear and status-page integrations |
| [Traces and logs](https://belvador.dev/en/docs/otel/overview) from OpenTelemetry SDKs, linked to errors | Your own ingest hostname |
| [Cron monitors](https://belvador.dev/en/docs/monitors/overview) and [uptime checks](https://belvador.dev/en/docs/uptime/quickstart) | |
| [SLOs](https://belvador.dev/en/docs/slos/alerts) with error-budget alerts | |
| Fleet overview of every project in a workspace | |
| Managed node: setup, health, backups, updates, resize, rebuild, delete | |
| Alerts to your own Telegram bot, Slack webhook, email sender or [webhook](https://belvador.dev/en/docs/alerts/webhooks) | |
| [REST API](https://belvador.dev/en/docs/reference/api) with personal and service tokens, or OAuth sign-in from apps you approve (beta) | MCP server |

Belvador is in beta and free during the beta; you pay Hetzner for the server. Belvador does not bill per event.

## Where to go next

- **New here?** Follow the [Quickstart](https://belvador.dev/en/docs/quickstart) — from sign-up to your first issue.
- **Installing in an app?** Start with [Choose an SDK](https://belvador.dev/en/docs/sdk/overview).
- **Setting up the server?** Read [Connect Hetzner and set up your node](https://belvador.dev/en/docs/node/connection).
- **Using an AI coding agent?** Give it the [Guide for AI agents](https://belvador.dev/en/docs/ai-agents).
- **Something not showing up?** See [Troubleshooting](https://belvador.dev/en/docs/troubleshooting).
