Low tail latency
Designed to keep p99/p999 predictable under load, with aggregate throughput second. QUIC gives multiplexed streams without head-of-line blocking, and explicit backpressure stops one slow path cascading into the rest.

Felix is a low-latency distributed data backend that serves streams, caches and work queues from one replicated log, over a single QUIC-based transport layer.
New here? Why Felix? explains in plain terms why you might run one system instead of a log, a cache and a queue, and who should not use it. The cards below make the same case for readers who already know the area.
Low tail latency
Designed to keep p99/p999 predictable under load, with aggregate throughput second. QUIC gives multiplexed streams without head-of-line blocking, and explicit backpressure stops one slow path cascading into the rest.
Unified primitives
One core log abstraction behind several semantics: streams (per-subscription fanout cursors), queues (shared consumer-group cursors with acks), and cache (key → value with TTL). You run one system instead of three.
QUIC from the ground up
Encrypted by default with TLS 1.3, multiplexed streams per connection, built-in flow control and congestion awareness, and resistance to head-of-line blocking.
Tunable, explicitly
Connection pooling, stream multiplexing, time- and count-bounded batching, flow-control window sizing, and optional per-stage telemetry. You set all of it; none of it is hidden behind defaults.
Each demo runs a real broker and real clients, and the slow-consumer, state-divergence and queue demos also assert the property they show as a test.
Felix uses a framed protocol (felix-wire) over QUIC streams to unify event
streaming and request/response caching, with explicit control over multiplexing,
batching, and flow control.
Streams, caches and queues are three ways of reading the same bytes. They share one durability path, one recovery path, one placement rule and one replication path.
Pub/Sub data flow
EventBatch frames with configurable batching.Cache data flow
request_id and are multiplexed over those streams.Queue data flow
Composed data flow
Because every semantic is a reading of one log, they compose. Each flow below covers something applications usually build by hand:
| Feature | What it gives you |
|---|---|
| QUIC transport | Modern, multiplexed, encrypted transport layer |
| High fanout | Efficient delivery to many subscribers, with isolation between them |
| Connection pooling | Reusable connections and streams, so hot paths skip setup cost |
| Batch processing | Time- and count-bounded batching for throughput |
| TTL support | Time-to-live on cache entries with lazy expiration |
| Work queues | Consumer groups with acknowledgements, redelivery and dead letters |
| Kafka compatibility | Kafka producers, and consumers that assign their own partitions, work against durable streams |
| Backpressure | Explicit flow control at six checkpoints to prevent cascade failures |
| Metrics | Prometheus-compatible metrics endpoint |
| Observability | Structured logging with optional per-stage telemetry |
Felix is a good fit today for:
See What Felix Is For for where Felix fits and where it does not.
Working today
Not built yet
Clone the repository.
git clone https://github.com/gabloe/felix.gitcd felixBuild the workspace.
cargo build --workspace --releaseRun a demo. Each one is self-contained and starts its own broker.
task demo:slow-consumertask demo:state-divergenceOr start a real cluster (control plane, credentials and three brokers) and publish through one broker to a shard another one owns.
cargo run --release -p felix-cluster -- up --nodes 3cargo run --release -p felix-cluster -- subscribe orders # second windowcargo run --release -p felix-cluster -- publish orders hi # thirdSee the Demos Overview or the Quickstart Guide for the full set.