Signals stacked and
left for someone to read.
Cairn OBS is an open-core, Kubernetes-native log aggregation platform — one query language over structured and full-text search, dashboards, alerting, multi-tenant RBAC, and AI-assisted query authoring. Built to compete with Splunk on features and win on cost-per-GB.
Explore
One page, six things worth reading about
Each section below stands on its own — jump to the piece you care about.
Features
Query language, dashboards, alerting, the cross-platform agent, multi-tenant RBAC, and AI-assisted queries — none held back for a paid tier.
See what's built →Architecture
How a log line actually moves: agent → transport → independent ClickHouse and Tantivy consumers → query API, plus how tenant isolation and deployment work.
See the pipeline →Stack
Rust, Go, ClickHouse, Tantivy, Redpanda, SvelteKit — boring, well-understood dependencies, picked for being proven rather than novel.
See the choices →License
AGPLv3, the whole thing, no exceptions — including multi-tenant RBAC and SSO. Self-host it, fork it, run it as a service.
Read the terms →About
What the name means, the cairn/Inuksuit symbolism behind it, and why this project exists in the first place.
Read the story →Demo
A live, read-only instance seeded with synthetic data — click around Search, Dashboards, Hosts, and Alerts with a shared login.
Try it →Features
Everything an incident-response tool needs, none of the license anxiety
A single platform for shipping, searching, visualizing, and alerting on logs — designed so no feature is held back for a paid tier.
One query language, two engines
Pipe syntax for the common case, raw SQL as an escape hatch — both compile to the same execution plan across ClickHouse and Tantivy. No performance tax for using one over the other.
Dashboards
Multi-panel dashboards built from saved queries — line charts, bar charts, single-stat, heatmaps, top-N — backed by the same query engine as the search bar, not a parallel path.
Alerting
Threshold and absence conditions, evaluated on an interval, delivered to Slack, a generic webhook, or PagerDuty — with delivery attempts logged, not fired-and-forgotten.
Cross-platform agent
A single statically-linked Rust binary. journald or plain files on Linux, Event Log and ETW on Windows — no glibc runtime dependency, ships as one file per host.
Multi-tenant RBAC
Per-tenant ClickHouse and Tantivy isolation enforced at the connection layer, not a row filter — including against the raw-SQL escape hatch. OIDC and SAML SSO, append-only audit logging.
AI-assisted queries
Translate a plain-English question into a structured query, get inline fix suggestions and autocomplete — self-hosted via Ollama by default, no cloud dependency required.
Architecture
A real transport layer, not a shortcut
Agents never write storage directly. Every record passes through a Kafka-API transport, keeping storage credentials off the edge and letting ClickHouse and Tantivy fail independently of each other.
agent → ingest → Redpanda → {ClickHouse-writer, Tantivy-indexer} → api → web
Query engine
Structured filters and full-text search, compiled once
A query like service=api status>=500 | stats count by host and a query like message:"connection refused" aren't two different code paths — the compiler routes each clause to whichever backend actually answers it.
query bar → compiler → IR → {ClickHouse, Tantivy} → merged results
Multi-tenancy
Isolation at the connection layer, not a row filter
Tenant isolation lives where it can't be bypassed by a clever query: each tenant gets its own ClickHouse connection pool and its own Tantivy index, resolved from the authenticated request identity — never a parameter a client can override. The raw-SQL escape hatch runs through the same scoped connection as everything else, so there's no query shape that reaches another tenant's data.
- OIDC and SAML SSO, verified against real identity providers
- Per-resource dashboard grants, not just tenant-wide roles
- Append-only, hash-chained audit log for every query
Deployment
docker-compose to a Kubernetes fleet
Start with a single docker compose up for a homelab or small team.
Move to a Kubernetes Operator and Helm chart when you need it — the same
Tenant custom resource drives per-tenant provisioning either way,
so growing past one node doesn't mean a rewrite.
- A Go controller-runtime Operator managing one CRD
- Helm chart covering every service, gated behind one flag
- Real credentials synced onto the CR, not placeholders
Tech stack
Boring, well-understood dependencies
Infrastructure software that operators need to trust — picked for being proven, not novel.
| Component | Choice | Why |
|---|---|---|
| Edge agent | Rust, musl | Statically linked, no glibc runtime dependency — one binary for any Linux distro or Windows (Event Log, ETW) today; IBM i (iSeries) and cloud-native collectors for AWS, Azure, and GCP on the roadmap. |
| Transport | Redpanda | Kafka-API compatible, keeps storage credentials off the edge agent entirely. |
| Ingest / API | Go | gRPC + REST, straightforward concurrency for the write and query paths. |
| Structured store | ClickHouse | Columnar, partitioned by day — built for exactly this access pattern. |
| Full-text index | Tantivy | Embedded Rust search library — no second service to operate. |
| Frontend | SvelteKit | Static-buildable, no server runtime required in production. |
| Orchestration | Kubernetes Operator + Helm | kubebuilder-based, one CRD, docker-compose for anything smaller. |
License
AGPLv3 — the whole thing, no exceptions
Every feature described on this site, including multi-tenant RBAC and SSO, ships under the same open license as core.
Self-host it, fork it, run it as a service — the license terms are the same for everyone, including us. There's no separate commercial edition and nothing held back behind a paid tier: the code you can read is the code that runs.
AGPLv3's network-use clause means that if you modify Cairn OBS and offer it to others over a network — including as a hosted service — you're required to make your modified source available to those users too. That's a deliberate choice, not an oversight: it's the same protection that keeps this project itself safe from being taken closed-source downstream.
Full license text
The complete AGPLv3 terms apply to every module in the repository — no per-component exceptions.
About the name
A cairn is a message left for
whoever comes after you.
Not a mascot. The actual working metaphor for what this platform does.
The name
Four stones, stacked so they can be read at a glance
A cairn is one of the oldest pieces of infrastructure humans build: a pile of stones, placed by hand, left standing on a trail so that someone who comes later — hours later, or years later, a stranger who never met the person who built it — can look at it and know someone was here, and this is the way through. Scottish hill-walkers use them. Nordic and Arctic travelers use Inuksuit for the same purpose. Long before GPS, a cairn was the original out-of-band signal: asynchronous, unattended, and legible to anyone who understood how to read one.
That is, almost exactly, what a log line is. A process writes it at 3 a.m., under conditions nobody is watching in real time, and walks away. Its only job is to still make sense hours or weeks later, to an engineer who wasn't there when it happened and is trying to reconstruct, stone by stone, what actually occurred. One log line is a pebble. A well-built observability platform is the cairn — the accumulated, load-bearing structure that turns a scatter of individually meaningless stones into something you can actually navigate by, especially in the exact conditions a cairn was designed for: poor visibility, bad weather, somebody trying to find their way through when it matters most.
Signals stacked, and left for someone to read.
The four tapering stones in the mark aren't decoration — they're the shape of the pipeline itself: an edge signal, carried through transport, landed in storage, stacked one layer on the next until there's enough structure to actually stand on. OBS is just what it says on the label: observability. The cairn part is the promise underneath it — that what gets built here is meant to outlast the moment it was written, and to still make sense to whoever's standing in front of it next.
Why this exists
Most logging tooling was designed for a world that doesn't exist anymore
A lot of the log-tooling landscape still runs on paradigms that are decades old — conventions built for a single machine writing to a local flat file, or enterprise platforms architected around one on-prem datacenter with a fixed number of boxes you could point at. Those tools didn't fail; they did exactly what they were built for. What's changed is everything around them. Workloads are now containers that live for minutes. Infrastructure spans multiple clouds plus whatever's still running on-prem, often inside the same organization, sometimes the same afternoon's incident. Failure modes are distributed by default, not "the one box that's down." And the old tools got bent, extended, and duct-taped to cover ground they were never designed to cover — because ripping out load-bearing logging infrastructure is exactly the kind of project nobody gets time or budget to do properly.
The mismatch shows up in specific, familiar ways:
- 01 Per-GB ingest pricing that punishes the verbose logging an incident actually needs, so teams quietly log less than they should.
- 02 "Which cloud, which datacenter" treated as an afterthought instead of a first-class dimension of every query.
- 03 Free-text search and structured querying sold as two different products instead of one query language over both.
- 04 Alerting and AI assistance bolted on as a separate, often unauditable paid layer instead of built into the query path itself.
One place, one format, one owner
Built for a fixed set of on-prem boxes, a single log format, and an operator who could SSH in and tail -f the one machine that mattered.
Everywhere, all the time, ephemeral
Cloud and on-prem side by side, containers that don't exist by the time you'd SSH in, and a search bar that needs to answer both a filter query and a full-text question in the same breath.
Cairn OBS starts from the present instead of retrofitting the past: cloud and on-prem logging as equally first-class inputs from day one, not a legacy on-prem product with a cloud add-on bolted on later, and not a cloud product that treats on-prem as an unsupported edge case. AI-assisted search and alerting live inside the same compiled query path every hand-written query already runs through — not a separate black-box service you have to trust blindly, and not a feature held back for a paid tier. The whole thing ships AGPLv3, on purpose, so the platform you're depending on during an incident is one you can actually read the source of.
Live demo
Try Cairn OBS, no signup required
A public instance, seeded with synthetic log data and pre-built dashboards, running the same code as the architecture section above describes — kept deliberately separate from any real deployment. It's read-only and resets nightly, so poke around freely.
demo.cairnobs.orgdemoCairnDemo_2026!The demo login has Viewer access only — it can run searches and browse dashboards, agents, hosts, and alerts, but every create/edit/delete action is rejected by the server, not just hidden in the UI. Every host, log line, and metric you'll see is synthetic, generated fresh each night — nothing here is real production data or a real fleet. Screenshots below, in case you'd rather look before you click through.
Landing screen
One query bar for filter/stats queries and free-text search, with quick links into the four main areas of the app.
Query bar
Pipe syntax or raw SQL, with a language toggle and an inline cheat sheet — the same bar drives filtering, full-text search, and stats.
Stats query results
A real stats count by host, service, severity query — the same one you can run yourself on the live instance.
Data sources
Every tenant's ClickHouse database and Tantivy index, provisioned together — nothing to hand-configure to get started.
That's the whole platform
AGPLv3, no feature gate — everything on this page is real and running. Go poke at it.
Open the live demo →