Teploy Observe

Everything that happened,
on a server you own.

Analytics, error tracking, APM, logs, session replay, monitoring, feature flags and experiments in one self-hosted binary. Click an error, see the trace, watch the session. Two processes, about 100 MB idle, on a $5 VPS.

$brew install useteploy/tap/observe
Read the docs
observe — acme.comlive
acme.com / last 24 hours
Visitors
0
+8.2%
Pageviews
0
+5.1%
Bounce
38%
-2.4
p95
42ms
stable
Errors
0.02%
-0.01
Live now
0
visitors
00:0006:0012:0018:00now
Top pages
/14,201
/pricing7,904
/docs/quick-start5,310
/blog/zero-downtime3,388
/changelog2,260
trace 7f3a19c2 — POST /api/checkout212ms
POST /api/checkout
auth.verify
db.select orders
stripe.charge
queue.publish
render
0ms106ms212ms
errors — acme.com34 users
TypeError: Cannot read properties of undefined (reading 'total')
checkout.tsx:142 · first seen 2h ago · release 9f3c21
at CartSummary (checkout.tsx:142:31)
at renderWithHooks (react-dom.js:1521)
at updateFunctionComponent (react-dom.js:2891)
trace 7f3a19c23 sessionsopen
replay — sess_a91f04:12
click · click · clickerror at 02:35

Four vendors, four dashboards, four bills, and the moment that matters falls between them. Observe keeps the error, the trace behind it, the log line inside it, and the session that hit it in one place, on hardware you already pay for.

The whole point

Everything connects

One data layer under every vertical, so a click carries you from the symptom to the cause without changing tools or copying an id.

error

TypeError in CartSummary

34 users since release 9f3c21. Grouped by type and in-app frames, source-mapped.

trace

POST /api/checkout, 212ms

The span that threw, the query before it, the Stripe call that ran long, the log lines inside each.

session

sess_a91f, error at 02:35

Watch what the user did before it broke. The error is a marker on the timeline.

What's inside

Every vertical, one install

analytics — funnel: pricing to signup
Viewed /pricing7,904
Clicked Start3,636
Created account2,450
First deploy1,739

Product analytics without the cookie banner

Pageviews, visitors, sessions, funnels, retention, journeys and goals. Cookie-free, so there is nothing to consent to.

  • Top pages, referrers, UTM and channel classification
  • Browser, OS, device, country, language
  • Custom events with property drill-down
  • Funnels, retention cohorts, user journeys, goals
  • Real-time active visitors
  • Web vitals with observe.trackVitals()
errors — issues3 new
TypeError: Cannot read 'total' of undefined342h
ECONNRESET upstream stripe125h
ValidationError: email required81d
RangeError: invalid array length23d

Grouped, searchable, and tied to the session that hit it

Automatic grouping by type and in-app frames, source-mapped stack traces, and a link from every error to the trace and the replay behind it.

  • Automatic grouping, release health, breadcrumbs
  • Stack trace viewer with source-map support
  • Full-text search across messages
  • Issue status: open, resolved, ignored
  • Error to session and error to trace correlation
  • Alert on new or regressed issues
apm — servicesRED
servicerateerrorsp95
api412/s0.02%42ms
worker88/s0.00%119ms
checkout31/s0.31%212ms
auth402/s0.01%18ms

OpenTelemetry in, RED metrics and waterfalls out

Point any OTLP exporter at Observe over HTTP. Traces, metrics and logs in protobuf or JSON, no collector required.

  • Service list with rate, errors, duration
  • Waterfall and flame-graph views
  • Dependency map
  • p50 / p95 / p99 latency per endpoint
  • Slow query detection
  • LLM calls: tokens, cost, latency, per model
logs — service:checkouttrace:7f3a19c2
14:02:11.204INFOorder created id=ord_8f2 total=49.99
14:02:11.219INFOstripe charge requested amount=4999
14:02:11.316WARNstripe latency 96ms above p95
14:02:11.331ERRORCartSummary total undefined for ord_8f2
14:02:11.332INFOsession sess_a91f flagged

Logs that know which trace they belong to

Level, service and trace-id correlation with full-text search, plus pipelines to shape what you keep.

  • Trace-id correlation from the log line to the span
  • Full-text search
  • Pipelines: JSON parse, regex extract, rename, mask, sample
  • Per-site rate limiting so one noisy site cannot starve another
  • WAL-backed ingest; crash recovery replays since the last checkpoint
replay — sessions with errors3
sess_a91fChrome · macOS · US04:121 error
sess_c22dSafari · iOS · DE01:481 error
sess_0b7eFirefox · Linux · UK06:031 error

Watch the session, not the screenshot

DOM snapshots with mouse, click, scroll and mutation recording. Scrub the timeline; errors are marked on it.

  • DOM snapshot plus interaction recording
  • Timeline scrubbing
  • Error markers on the timeline
  • Jump from an error group to its sessions
  • Feedback widget in one script tag
experiments — pricing-page-v2running
control3.1%
variant-b3.9%
probability to beat control96.4%
p-value0.031

The product tools that usually cost a second subscription

Feature flags, A/B experiments with real statistics, surveys, uptime and cron monitors, alerting with incident markers.

  • Boolean and multivariate flags, rollout %, user targeting
  • Experiments: frequentist p-value and Bayesian probability-to-beat
  • Surveys and custom dashboards with panels
  • HTTP uptime monitors and cron heartbeat monitors
  • Threshold alerts with cooldown and silence; a fired alert opens an incident marker
  • Jira, GitHub, PagerDuty, Slack, email, webhooks
Only here

Three things no competitor bundles

-- ask errors by release, last 7 days -- generated SELECT release, count(*) FROM errors WHERE ts > now() - '7 days' GROUP BY 1 ORDER BY 2 DESC

AI query assistant

English in, SQL out, on the read-only explorer. Your LLM key, your cost, and every call logged to the LLM-tracing table.

p95 latencyincident 14:02 - 14:31

Incident markers

When an alert fires, every time-series chart overlays the window. You stop guessing whether the spike and the page were the same thing.

daily-errors.csv
r2://acme-exports · 02:00 UTC
sent
weekly-revenue.json
s3://finance · Mon 06:00
sent
vitals-p75.csv
minio://ops · hourly
sent

Scheduled SQL exports

Any query, on a schedule, to any S3-compatible bucket. Your data warehouse gets Observe's tables without an ETL vendor.

Two processes.
~100 MB idle.
A $5 VPS.

A Go binary and Nucleus. That is the whole stack.

No Kafka, no ClickHouse cluster, no Kubernetes. Ingest is WAL-backed, per-site rate limited, and replays from the last checkpoint after a crash. Upgrades stage the new binary, require three healthy responses from the new version, and roll back on their own if they do not get them.

Install

One command, then one script tag

Homebrew, Docker Compose, or a signed install script that verifies the release checksum before it runs anything. First visit is the setup wizard; there is no default password because none exists until you choose one.

OTLP exporters point at /v1/traces, /v1/metrics, /v1/logs over HTTP. No collector required.

brew install useteploy/tap/observe observe # open http://localhost:3000
git clone https://github.com/useteploy/teploy-observe.git cd teploy-observe docker compose up # observe + nucleus
<script defer src="https://observe.acme.com/t/observe.js" data-site-id="YOUR_SITE_ID"></script> observe.track("signup", { plan: "pro" }); observe.revenue(49.99, "USD"); observe.trackVitals();
What the stack costs today

Four bills or none

5M events, 10 hosts, 50k errors a month

PostHogProduct analytics past the free tier~$200/mo
SentryErrors, Business plan$80/mo
DatadogAPM, 10 hosts$310/mo
UmamiWeb analytics, cloud$20/mo
four tools, four dashboards, data that does not connect~$610/mo
teploy Observe
every vertical, one dashboard
$0
self-hosted, any scale
  • One install, one dashboard, no per-seat pricing
  • Your server, your data, no event caps
  • Click an error, see the trace, watch the session
  • Flags, experiments and monitors included

Pricing verified for the two scales shown. Costs compound as events and hosts grow; Observe's cost is the box it runs on.

Comparison

How Observe compares

ObservePostHogSentryDatadogUmami
Web analyticsYesYesNoLimitedYes
APM and tracingYesNoLimitedYesNo
Error trackingYesNoYesLimitedNo
LogsYesNoLimitedYesNo
Session replayYesYesYesYesNo
Feature flags and experimentsYesYesNoNoNo
Self-hostedOne binaryYes, heavyYes, heavyNoYes
Cookie-freeYesNoN/AN/AYes
OTLP compatibleYesNoNoYesNo
One dashboard across all of itYesAnalytics onlyErrors onlyInfra focusAnalytics only

Run it yourself

One binary, your server. No accounts, no event caps, no per-seat pricing.