Releases: tma1-ai/openfuse
v1.0.0-alpha.2
Second alpha. This release focuses on ingestion throughput and correctness on the GreptimeDB write path. The product, public APIs, SDKs, and read-path parity are unchanged from v1.0.0-alpha.1 (still based on upstream Langfuse v3.184.1).
Highlights
- Faster, stall-free ingestion drain. The live drain no longer stalls under load and is ~4× faster (~27 → ~108 traces/s in our 60k-trace benchmark). Three independent fixes: the protobuf encode + gRPC write moved to a
worker_threadspool (off the worker event loop that was starving every job'sraw_eventsread); a table-scopedraw_eventsflush keeps the per-event point read on prunable SSTs (~20× faster read); and a per-entity Redis watermark coalesces redundant rebuilds when draining a backlog. - No-delete EAV writes. The per-rebuild EAV
DELETEis replaced by a read-time generation filter — reads keep only an entity's current generation, so a dropped key is excluded without a delete. Less write amplification on a single GreptimeDB. - Correctness fixes.
- EAV generation is now unique within a millisecond — a same-millisecond re-append could otherwise collide and leave a stale EAV key visible.
- Cold start no longer leaves observation cost empty: the worker waits for the schema/model-price seeding before it begins ingesting, so generations always get their cost computed.
- The Sessions list query no longer 500s — the
session_tagssubquery now projectseav_generationso the generation-correlated tag join resolves.
For measured drain / query-latency / storage numbers vs upstream Langfuse on ClickHouse, see the benchmark report; for the new tuning knobs see operations.
Images
Published to Docker Hub, all tagged 1.0.0-alpha.2:
tma1ai/openfuse-webtma1ai/openfuse-workertma1ai/openfuse-standalone— web + worker in one container, for single-node self-hosting
This is a pre-release, so latest does not move — pin the explicit tag.
Quickstart
git clone https://github.com/tma1-ai/openfuse.git
cd openfuse
git checkout v1.0.0-alpha.2
cp .env.quickstart.example .env
docker compose -f docker-compose.standalone.yml up -dFull changelog: v1.0.0-alpha.1...v1.0.0-alpha.2
v1.0.0-alpha.1
First public preview. Openfuse is a fork of Langfuse v3.184.1 that swaps the analytics store from ClickHouse to GreptimeDB. The Langfuse product, public APIs, and SDKs stay the same — GreptimeDB becomes the source of truth for traces, observations, scores, and the analytics behind dashboards.
LLM traces are observability data: timestamped wide events with high-cardinality context. That's exactly GreptimeDB's data model. Running Langfuse on it instead of a single-purpose columnar store buys two things today: start on a single container and scale to a cluster without losing data, and cheap long retention via object-storage-native tiered storage plus a plain-SQL TTL (LANGFUSE_GREPTIME_TTL) — where configurable retention is an Enterprise feature on ClickHouse-backed Langfuse.
What works
- Ingestion — the public ingestion API and the OTel endpoint write to
raw_events; the worker replays the full event history into merged projections. - Reads — traces, observations, scores, sessions, dashboards/metrics, datasets, experiments, daily metrics, exports, and the public GET endpoints all read from GreptimeDB.
- Dashboards — the metrics query engine runs on GreptimeDB, including metadata, tag, and tool filters and breakdowns. Output is checked byte-for-byte against upstream Langfuse: 199 parity cases PASS, 0 FAIL (parity report).
- Mutations, deletion, replay — UI edits and deletions append synthetic events to
raw_events, so replay rebuilds the merged (or soft-deleted) state instead of resurrecting or losing it. - Automatic migrations — the web and standalone containers migrate both Postgres and the GreptimeDB schema on startup. No manual bootstrap.
Images
Published to Docker Hub, all tagged 1.0.0-alpha.1:
tma1ai/openfuse-webtma1ai/openfuse-workertma1ai/openfuse-standalone— web + worker in one container, for single-node self-hosting
This is a pre-release, so latest does not move — pin the explicit tag.
Quickstart
git clone https://github.com/tma1-ai/openfuse.git
cd openfuse
git checkout v1.0.0-alpha.1
cp .env.quickstart.example .env
docker compose -f docker-compose.standalone.yml up -dOpen http://localhost:3000 and log in as demo@example.com / langfuse-dev, or point any Langfuse SDK at the bundled keys (pk-lf-1234567890 / sk-lf-1234567890). These are insecure dev defaults — for a real deployment start from .env.prod.example and set your own secrets, including GREPTIME_PASSWORD to enforce auth on the analytics store. Full guide: deployment.
Known limitations
This is an alpha — read Known limitations before depending on it. The short list:
- Indexed full-text search is whole-term only — substring matching on indexed fields differs from upstream.
- GreptimeDB migrations are idempotent DDL with no ledger — re-applied in full on every start, serialised by advisory lock, fail-closed.
- Object storage is optional, not gone — media, the OTel carrier, and the eval blob store default to local filesystem; opt-in batch/blob exports still need an S3-compatible bucket.
dataset_run_itemsdeletion is a projection hard-delete — the one source-of-truth exception to the replay model.
Compatibility
Based on upstream Langfuse v3.184.1. Existing Langfuse SDKs and the public ingestion/REST APIs work unchanged. Postgres migrations are upstream's and apply as-is; the GreptimeDB schema is fork-specific and migrates automatically on startup. The few intentional divergences are all cases where the fork is equal or more correct — see the parity ledger.
Openfuse is a community fork and is not affiliated with or endorsed by Langfuse.
What's next
Beta. And a direction a single-purpose store can't follow — PromQL-native metrics, logs ↔ traces correlation, OTLP-native ingestion, Flow continuous aggregation. Directional, not delivered; tracked in #8. Try it on real workloads and open issues — that's what gets it to beta.
What's Changed
- feat(greptimedb): ingestion write path on GreptimeDB (design 02) by @killme2008 in #1
- feat(greptimedb): 04 read-path foundation (SQL dialect + row contract + dataset_run_items projection) by @killme2008 in #2
- feat(greptimedb): 04 P1 core entity reads on GreptimeDB by @killme2008 in #3
- feat(greptimedb): P2 — UI rollup read path on GreptimeDB (traces/sessions/observations tables + dashboards) by @killme2008 in #4
- feat(greptimedb): P3 — events *FromEvents collapse + dashboard executeQuery engine on GreptimeDB by @killme2008 in #5
- feat(greptimedb): GAP-MUT write path for tRPC UI mutations + read-path fixes by @killme2008 in #6
- feat(greptimedb): P4 — complete dataset/experiment read-path migration to GreptimeDB by @killme2008 in #9
- feat(greptime): P5 — public API + streaming export + obs-from-events collapse by @killme2008 in #10
- fix(greptime): dedupe relation measure in two-level dashboard query (home page 500) by @killme2008 in #11
- P6 — worker cleaners, retention TTL, blob-file-log removal, export-to-sink → GreptimeDB by @killme2008 in #13
- feat(media): add local file storage backend by @killme2008 in #12
- feat(greptime): P7 — delete the ClickHouse client (GreptimeDB-only cutover) by @killme2008 in #14
- feat(greptime): isolate batch write failures via group bisection by @killme2008 in #15
- feat(greptime): score source-of-truth, project-delete guard, reconciliation by @killme2008 in #16
- GreptimeDB query correctness: eval experiment join, obs filter pushdown, dashboard measures, experiment-LIST preagg by @killme2008 in #17
- chore(greptime): P7 residual cleanup — remove dead ClickHouse code, drop @clickhouse/client, delete EE package, DB-neutral renames by @killme2008 in #19
- GreptimeDB audit follow-up + index tier-1 (PR-A) by @killme2008 in #20
- Remove v4-beta preview + events-backed v2 observations (PR-B) by @killme2008 in #21
- GreptimeDB deployment track + CI/Docker fixes (PR-C) by @killme2008 in #22
- feat: make MinIO/S3 optional — zero object storage by default by @killme2008 in #26
- fix: self-hosted compose deploy fixes found in MinIO-optional smoke by @killme2008 in #27
- Remove web/src/ee (Langfuse commercial Enterprise Edition) by @killme2008 in #29
- GreptimeDB database-level retention (default 730d) by @killme2008 in #30
- Drop orphaned v2-observations public-API readers by @killme2008 in #32
- docs: GreptimeDB data-layer docs + CI speedups by @killme2008 in #31
- F5: long-tail usage/cost key aggregation via an observation EAV table by @killme2008 in #34
- perf(traces): COUNT(*) trace observations instead of fetching rows to size them by @killme2008 in #35
- Post-merge cleanup: v2-obs types, retention env validation, dead UI + workflows by @killme2008 in #33
- feat(greptime): fleet-wide reconciliation backfill orchestrator by @killme2008 in #38
- perf(greptime): write only custom usage/cost keys to EAV table by @killme2008 in #36
- feat(brand): rename user-visible UI from Langfuse to Openfuse by @killme2008 in #37
- F5 perf: GreptimeDB SST metrics, by-type join skip, compaction runbook by @killme2008 in #40
- feat(greptime): bulk Arrow Flight backfill for reconciliation by @killme2008 in #41
- ci: Docker Hub image publishing + workflow cleanup by @killme2008 in #42
- fix(greptime): metrics output parity with ClickHouse + Quality Gate C harness by @killme2008 in #44
- feat(greptime): tool-name EAV tables for dashboard tool filters + breakdowns by @killme2008 in #45
- docs: alpha-ready README, governance, and user-facing docs by @killme2008 in #46
- feat(standalone): single-container image + automatic in-container GreptimeDB migration by @killme2008 in #47
- docs: professionalize README + docs, ship 1.0.0-alpha.1 by @killme2008 in #49
- feat(greptime): def...