The platform

Twelve surfaces. One binary.

Most "observability" vendors are three products in a trench coat — metrics you bought, logs you bought again, traces you'll buy next year, alerts as an add-on, on-call sold separately. PulseBoard is one MIT-licensed edge runtime that does the whole job, plus the cloud-poller fleet that brings AWS, Azure and Google Cloud into the same UI.

PulseBoard dashboard in light theme
Metrics

Live metric pipeline with full PromQL.

The edge runtime accepts Prometheus remote_write, OTLP/HTTP, Loki push and a native JSON ingest API on the same port. Every sample is deduplicated, attributed to a workspace, label-relabelled and written into the in-process engine. PromQL evaluation — rate(), avg by(), joins, subqueries — runs in milliseconds against the local index, or transparently delegates to a Mimir back-end when you point --mimir-url at one.

Inline-labels series model

Labels live inline in the metric name as a Prometheus series string (http_requests_total{service="checkout"}). One canonical string keys storage, the index, queries, alerts and cost attribution.

Mimir-compatible

Point at any Mimir/Cortex back-end for long-term storage and unbounded cardinality. PulseBoard handles tenant headers, query proxying, ingestion buffering and graceful fallback to local storage on outage.

Logs

LogQL-compatible logs in the same pane.

Push from Promtail, Alloy, Vector or PulseAgent at /loki/api/v1/push. Query at /api/loki/api/v1/query_range with the same bearer token. Logs sit next to metrics in dashboards: the same time range, the same label selectors, the same workspace scope.

Traces

OTLP traces, automatic service map, waterfalls.

PulseAgent (or any OTel SDK pointed at /v1/traces) ships spans in OTLP/HTTP. The edge extracts caller→callee edges, span error rates and duration histograms. The Traces view renders a service map plus a per-trace waterfall — error spans highlighted, exceptions inlined as events.

OTLP/HTTP & JSON

Both binary protobuf and the JSON encoding are accepted on the same path. No collector required.

Step Functions waterfall

EventBridge → Firehose → PulseBoard turns AWS Step Functions executions into spans with task children and exception events — no instrumentation in your state machine.

Tracer SDKs

Branded Node and Python tracer wrappers (@pulseboard/tracer, pulseboard-tracer) for one-line bootstrapping in Cloud Functions, Lambda, AWS App Runner and your own containers.

Alerts

Full PromQL rule engine with on-call built in.

The embedded rule engine evaluates full PromQL — rate(), avg by(), arithmetic, joins — entirely in-process. No external Alertmanager required: routing, grouping, mute windows, inhibition rules and silences are all native. The routing config is Alertmanager-compatible, so any existing YAML drops in unchanged.

Notification receivers

Webhook, Slack, Discord, Teams, PagerDuty, OpsGenie, SendGrid, Mailgun, SES, Twilio SMS, Jira. Plus a dead-letter queue for failed sends.

On-call catalog

Users, rotation schedules with configurable shifts, override windows, multi-step escalation policies — no PagerDuty subscription required.

Inline runbooks

Attach Markdown step-by-step runbooks to any rule. Incident analytics surface MTTR per fingerprint and your most-skipped steps.

Alerts docs →   On-call docs →

Synthetic uptime

HTTP, TCP, DNS probes from one or more regions.

Schedule probes per check, per region, per interval. Results are stored as a real pulse_synthetic_up{check="..."} series so they compose with everything else: dashboards, alert rules, status pages. There's no "synthetics product" sold separately — they're metrics with a probing scheduler attached.

POST /api/synthetics
{
  "name": "Checkout API",
  "kind": "http",
  "target": "https://api.acme.com/health",
  "intervalMs": 60000,
  "timeoutMs": 5000,
  "regions": ["us-east-1", "eu-west-2"],
  "enabled": true
}
Public status pages

Branded /status/<slug> pages, served by the edge.

Each component is mapped to a metric threshold or a synthetic check. Uptime percentage is calculated over a configurable look-back window. Active firing rules become incident banners. Auto-refreshing every 30s, no JavaScript framework — just the same edge runtime, no extra hosting.

Dashboards

26 panel types. Variables. Repeats. Export-as-code.

timeseries · stat · gauge · bargauge · table · logs · traces · flamegraph · nodegraph · heatmap · state-timeline · status-history · piechart · barchart · histogram · candlestick · xychart · geomap · trend · annolist · alertlist · dashlist · text · canvas · news. Variables and repeats so one dashboard template fans out per region, per cluster or per tenant.

Every dashboard exports to YAML or Terraform HCL via the </> Code button — paste it into your repo, let the GitOps reconciler keep it in sync, version-control it like the rest of your infrastructure.

Cost & cardinality killers

The runaway label, found and blocked.

Observability platforms famously bill by the byte but show you the bill in arrears. PulseBoard inverts that: every team, every series, every byte is attributed in real time, and the cardinality killer can refuse samples that would push you past your contract.

Per-team attribution

GET /api/admin/tenants/<id>/cost/teams — live per-series and per-team USD attribution, the same endpoint the pricing calculator uses.

Cardinality killer

Per-label-value caps. When a label crosses the cap, new values are dropped at ingest and the source is logged with the offending series. The bad user_id label never reaches storage.

Deploy correlation

The killer records the first time a label-value combination appeared. Cross-referenced with the CI deploy log, you get "this deploy introduced 12,400 new request_id values" before it costs you anything.

GitOps & export-as-code

Dashboards as code, reconciled like Terraform.

Point PulseBoard at a Git repo (HTTPS, PAT-authenticated) and a sub-directory. The reconciler polls on a configurable interval, applies new and changed files as create/update, and (when prune is on) deletes anything removed from Git. Every dashboard, rule group and routing config is exportable to YAML or HCL in one click.

# Environment / agent.toml
PULSE_GITOPS_URL=https://github.com/acme/observability
PULSE_GITOPS_BRANCH=main
PULSE_GITOPS_PATH=pulseboard/
PULSE_GITOPS_INTERVAL=60
PULSE_GITOPS_TOKEN_ENV=GH_TOKEN
PULSE_GITOPS_PRUNE=true
AI Explain

"Why did p99 spike?" — answered in-process.

The default analyser is deterministic, runs entirely in-process, and uses classical statistics (mean, standard deviation, single-step jump detection). Your samples never leave the edge. When you do want an LLM, swap in an IAiProvider implementation pointing at OpenAI, Azure OpenAI or any compatible API — including a private deployment.

Multi-tenancy & auth

Workspaces, RBAC, OIDC and federated workload identity.

The hosted cloud is multi-tenant by construction: GitHub OAuth + magic-link email sign-in for humans, workspace bearer tokens for ingest, and Workload Identity Federation against our public OIDC issuer for Azure and Google Cloud cross-account access. Self-host mode supports single-tenant (API-key-only) or full OIDC against any provider.

ScopeWhat it can do
adminFull access including tenant management and billing
queryRead metrics/logs/traces; manage dashboards and rules
ingestWrite-only ingest token, no read access
Cloud-poller fleet

One wizard, three hyperscalers.

The cloud-poller is a separate runtime that holds a fleet of per-account, per-kind, per-region leases in Postgres and atomically claims the next work item every tick. AWS uses STS AssumeRole with a server-minted ExternalId; Azure and GCP use Workload Identity Federation backed by our OIDC issuer so we never store client secrets.

AWS

CloudWatch · CloudWatch Logs · CloudTrail · Lambda · Step Functions waterfall

AWS deep-dive →

Azure

Azure Monitor across VMs, App Service, AKS, SQL, Cosmos, Service Bus, Key Vault…

Azure deep-dive →

Google Cloud

Cloud Monitoring · Cloud Logging · Cloud Billing · GKE · Cloud Run · Cloud Functions

GCP deep-dive →

Start with Basic, or self-host for free. Same software.

Create an account → Read the quickstart GitHub