Features Pricing Docs Blog

Your logs and traces. On your own box.

When something breaks, the answer is already in your telemetry. Bilis gets you from “something is wrong” to the exact log line — or the exact span — that explains it, in seconds, on hardware you own, with no per-gigabyte bill for the privilege. And it is only the start: Bilis is growing into a self-hosted observability stack where AI reads alongside you, spotting what matters and helping you fix 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.
Then software that acts.

Bilis keeps two signals on your box today, linked so each explains the other. The direction is metrics 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
  • Live tail, teams, projects, and revocable keys
  • Open, portable telemetry tables

Where it is heading

  • Metrics on the same box and open standards
  • 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.