Maple이 출시되었습니다 — 무료 평가판 시작하기
Maple Local

Observability that runs on localhost

One Bun-compiled binary — OTLP ingest, an embedded ClickHouse, a query API, and the dashboard — running on 127.0.0.1. The same query engine and UI as hosted Maple, with no cloud, no Tinybird, and no auth.

curl -fsSL https://maple.dev/cli/install | sh
~/your-app local
maple start
🍁 maple · local mode
● listening on http://127.0.0.1:4318
OTLP/HTTP POST /v1/{traces,logs,metrics}
query POST /local/query
dashboard https://local.maple.dev
data ~/.maple/data
pid 48213 · stop with `maple stop`
  • port :4318
  • store chDB
  • signals traces · logs · metrics
  • deps none
01 Why local

The fastest way to look at OpenTelemetry data

Point any OTLP exporter at localhost, open the dashboard, and explore traces, logs, and metrics — no account, nothing to deploy. Everything is single-tenant: every row is stored under org_id = "local".

One binary, zero deps

A single Bun-compiled `maple` executable bundles OTLP ingest, the query API, and the dashboard. No runtime to install, no second language — it talks to ClickHouse in-process via libchdb.

Fully local, no auth

Everything runs on 127.0.0.1 — no cloud workspace, no account, no rate limits. Data persists in ~/.maple/data between runs, and `--offline` serves the UI from the binary with no internet at all.

Embedded ClickHouse

The same column store that powers hosted Maple, running in-process as chDB. Traces, logs, and metrics are queryable in sub-second time the moment they land.

OTLP-native

Speaks OTLP/HTTP on POST /v1/{traces,logs,metrics} — the protocol every OpenTelemetry SDK already exports. Point your app at :4318; no exporter changes, no auth header.

02 How it works

From exporter to dashboard, all on loopback

One process owns the chDB connection and hosts OTLP ingest, the /local/query API, and the dashboard — all on one port. The CLI and the UI read your data over the very same HTTP contract.

  1. OTLP exporter your app / SDK
  2. POST /v1/* ingest · :4318
  3. chDB store ~/.maple/data
  4. POST /local/query query API
  5. dashboard · CLI read it back
One process owns the chDB connection; short-lived CLI commands and the dashboard read it back over the same /local/query HTTP contract — a complete loop that never leaves loopback.
03 The dashboard

The same dashboard, on your machine

Hosted Maple's UI, served straight from your binary. Every view below runs against the local /local/query API reading your embedded store — no data leaves the machine.

Traces

Full span trees with correlated logs

Search spans by service, duration, or error, then drill into any trace for its complete waterfall and the log lines emitted alongside it.

trace 9f3c · order fetch LIVE
edge GET /api/orders/8421 412ms
orders-api load_order 366ms
auth verify_jwt 38ms
orders-api fetch_line_items 184ms
postgres SELECT * FROM line_items 158ms
shipping rate_quote 96ms
fedex-api POST /rates 72ms
redis SET order:8421:rate 14ms
8 spans · 412ms wall queried 12.8B rows in 198ms
logs · volume · last 5hLIVE
14.0K logsin selected range
4 severities · 60 buckets · 5m eachwarn cluster 11:10–11:40 · error blip 11:50
logs · stream LIVE
12:04:18 INFO edge GET /api/orders/8421 200 412ms
12:04:18 INFO orders-api load_order order_id=8421 366ms
12:04:18 DEBUG auth verify_jwt iss=auth.maple.dev 38ms
12:04:18 INFO postgres SELECT line_items rows=12 158ms
12:04:18 INFO shipping rate_quote carrier=ups 96ms
12:04:18 WARN fedex-api POST /rates retried (1/3) 72ms
12:04:18 INFO redis SET order:8421:rate ttl=3600 14ms
12:04:19 INFO edge GET /api/cart 200 94ms
12:04:19 INFO cart-svc load_cart user=u_4109 58ms
12:04:19 DEBUG feature-flag evaluate fast_checkout=false
12:04:19 ERROR payments stripe.charge declined card=v•••4242 204ms
12:04:19 WARN payments fallback to authorize_only flow
12:04:19 INFO kafka produce orders.canceled offset=98041
12:04:20 INFO edge POST /webhooks/stripe 200 26ms
12:04:20 INFO events dispatch payment.failed → ops
12:04:20 DEBUG scheduler reschedule retry_at=12:04:25
12:04:20 INFO edge GET /api/inventory 200 41ms
12:04:20 INFO inventory lookup sku=SKU-9081 region=iad 23ms
12:04:20 WARN inventory stock low sku=SKU-9081 qty=3
12:04:21 INFO search query "red shoes" hits=412 82ms
12:04:21 INFO edge GET /api/recos 200 67ms
12:04:21 DEBUG recos model=v3.2 cohort=A2
12:04:21 INFO edge POST /api/feedback 201 18ms
12:04:21 INFO analytics track event=checkout_started
12:04:18 INFO edge GET /api/orders/8421 200 412ms
12:04:18 INFO orders-api load_order order_id=8421 366ms
12:04:18 DEBUG auth verify_jwt iss=auth.maple.dev 38ms
12:04:18 INFO postgres SELECT line_items rows=12 158ms
12:04:18 INFO shipping rate_quote carrier=ups 96ms
12:04:18 WARN fedex-api POST /rates retried (1/3) 72ms
12:04:18 INFO redis SET order:8421:rate ttl=3600 14ms
12:04:19 INFO edge GET /api/cart 200 94ms
12:04:19 INFO cart-svc load_cart user=u_4109 58ms
12:04:19 DEBUG feature-flag evaluate fast_checkout=false
12:04:19 ERROR payments stripe.charge declined card=v•••4242 204ms
12:04:19 WARN payments fallback to authorize_only flow
12:04:19 INFO kafka produce orders.canceled offset=98041
12:04:20 INFO edge POST /webhooks/stripe 200 26ms
12:04:20 INFO events dispatch payment.failed → ops
12:04:20 DEBUG scheduler reschedule retry_at=12:04:25
12:04:20 INFO edge GET /api/inventory 200 41ms
12:04:20 INFO inventory lookup sku=SKU-9081 region=iad 23ms
12:04:20 WARN inventory stock low sku=SKU-9081 qty=3
12:04:21 INFO search query "red shoes" hits=412 82ms
12:04:21 INFO edge GET /api/recos 200 67ms
12:04:21 DEBUG recos model=v3.2 cohort=A2
12:04:21 INFO edge POST /api/feedback 201 18ms
12:04:21 INFO analytics track event=checkout_started
14.2k events / minute retention 30d · structured
Logs

Search the stream, cluster the noise

Filter by service, severity, text, or trace ID — or run log-patterns to cluster lines into templates and surface the noisiest sources at a glance.

service map · last 60s LIVE
2.8k req/s edge req/s 12.4k err% 0.1% avg 8ms checkout-api req/s 4.2k err% 0.3% avg 24ms cart-svc req/s 8.1k err% 0.1% avg 18ms auth-svc req/s 4.2k err% 0.0% avg 6ms pricing req/s 2.8k err% 2.4% avg 142ms payments req/s 1.1k err% 0.5% avg 38ms redis DB calls/s 18.2k avg 2ms postgres DB calls/s 6.4k avg 14ms
8 services · 8 edges · 60s window pricing-svc · p99 +18% vs 1h ago
Service map

See how your services call each other

Dependency edges with call counts, error rates, and latency — reconstructed from the spans you've ingested, entirely on your machine.

04 The CLI

Drive it from your terminal

The same binary is also a query CLI. Every command runs against the running server and prints JSON by default — add --format table for an aligned table, or --debug to see the compiled SQL.

05 Install

Two files, one command

The installer detects your OS and architecture, downloads the matching bundle from the latest GitHub release, verifies its checksum, and drops the two files — maple and libchdb — into ~/.maple/bin, then symlinks maple onto your PATH.

  • Platforms macOS (Apple Silicon)
    Linux (x86_64 & arm64)
  • Bundle maple + libchdb
  • Installs to ~/.maple/bin
  • Data ~/.maple/data
  • Uninstall .../cli/uninstall | sh

명확한 관측을 시작하시겠습니까?

5분 이내에 트레이스, 로그, 메트릭 전송 시작.

maple.dev — 옵저버빌리티, 심플하게