Features Pricing Docs Blog

Observability your coding agent can read.

When something breaks, the answer is already in your telemetry. Bilis keeps your logs, traces and metrics on hardware you own, with no per-gigabyte bill, and gets you from “something is wrong” to the exact line or span that explains it in seconds. Your coding agent gets the same view: connect Claude Code, Cursor or any MCP client in one line, and it can search production while it works in the code that produced it.

Live proof, not a mockup
Live
1284 lines
  1. Invoice finalized for team acme-inc (amount: 4900)
  2. Cache miss for plan:pro — reading from SQLite
  3. POST /v1/subscriptions 201 in 91ms
  4. Job "export-csv" restarted after OOM kill
  5. Out of memory processing job "export-csv" (2048MB limit)
  6. Heartbeat ok, queue depth 0
  7. GET /v1/logs?window=1h 200 in 142ms
  8. Session refreshed for user 4821
  9. Processed 1 job in 8ms (queue: default)
  10. POST /v1/checkout 500: Undefined array key "currency"
  11. Accepted 247 log records for project acme-web
  12. Batch contained 3 malformed records, skipped

See the whole request.
Then find the line that explains it.

One trace id joins the waterfall and the stream. The investigation stays in one place, and each view is one click from the other.

Traces

Where the request spent its time

Every span in order, durations to scale, services separated, and the failure marked. Select a span to inspect its attributes or jump straight to its logs.

A trace waterfall in Bilis: a deploy request across three services — keel-api, keel-db and keel-worker — with each span's duration drawn to scale and a detail panel listing the selected span's attributes.
The Bilis log viewer: severity-coloured log lines under a volume histogram, with full-text search, scope, time-window and severity filters above the stream.

Logs

What the code said about it

Search every line, narrow by time, project, service or severity, and leave a live tail open while the deploy goes out. Every search is a URL you can share.

Works with the stack you already run.

If your tooling speaks OpenTelemetry — and most already does — sending logs and traces to Bilis is a configuration change, not a project. No agents to deploy, no SDK to adopt, nothing to rewrite.

Plain JSON covers everything else. Existing Sentry SDKs can report straight to Bilis too.

Request
# One log line, no collector, no SDK.
curl -X POST https://bilis.app/api/v1/ingest \
  -H "Authorization: Bearer bilis_…" \
  -H "Content-Type: application/json" \
  -d '{"severity":"error","service":"billing","message":"Stripe webhook timed out"}'

# Or the OTLP endpoint your exporter already knows.
OTEL_EXPORTER_OTLP_LOGS_ENDPOINT=https://bilis.app/api/v1/logs
Response 202 Accepted
{"accepted":1,"skipped":0}

Ingest never blames the client: malformed records are skipped with a count rather than failing the batch. Writes are queued asynchronously, so a success means accepted, not yet durable.

Your coding agent counts too

Claude Code speaks OpenTelemetry out of the box. A few lines of configuration put every prompt, tool call, token and dollar it spends beside the application it is editing — no plugin, nothing in between.

Point Claude Code at Bilis →

One key, one project

Revocable in a click, and useless for anything but writing telemetry to that project. Access stays under your thumb.

A Bilis project's API keys panel, showing three issued keys with their creation and last-used dates.

Keep the data.
Lose the telemetry tax.

Bilis is built for the team that owns the box, reads its own incidents, and does not want observability to become another platform to operate.

Your data never leaves the building
You own the box, so you own the logs — all of them, for as long as your disk allows. Retention costs storage you already pay for, not a metered bill that punishes a noisy deploy.
Small enough to run yourself
One app and one database is the entire deployment — a stack you can hold in your head, deploy in an afternoon, and keep healthy without a platform team.
Open, so you're never stuck
Standard OpenTelemetry in, standard tables underneath. Your scripts, queries and AI tools work on the data today, and walking away is a SELECT, not a migration. The code is public.

Logs. Traces. Metrics.
Then software that acts.

Bilis keeps logs, traces and metrics on your box today, with logs and traces linked so each explains the other. The direction is alerting and AI that helps fix what the signals reveal. Self-hosting stays first-class through all of it.

In the product today

  • OTLP, plain JSON, and Sentry-compatible ingest
  • Fast full-text search across every log body
  • Distributed traces drawn as a span waterfall
  • Logs and traces linked in both directions
  • OTLP metrics, charted as rates, levels and percentiles
  • Live tail, teams, projects, and revocable keys
  • Open, portable telemetry tables

Where it is heading

  • Alerting, so the stack tells you when to look
  • Dashboards and saved searches
  • AI that spots, explains, and helps fix errors

eBPF collection, S3 tiering, and replication stay a bigger platform's job.

Bilis is early.
The product is not hypothetical.

Run it on your own box today, or sign up on bilis.app — the Free plan has published limits and no card. Self-hosting stays the first-class way to use Bilis. See pricing.

The whole thing is open on GitHub, so you can read exactly what it does with your telemetry before you point anything at it.