Posts

The full series. Start at the bottom if you like a story with a beginning.

Colophon: how the code on this blog can't lie

Tech blogs rot. You copy a snippet from a two-year-old post, paste it in, and it doesn't compile — the API moved on and the prose didn't. I refuse to do that to you.

So every Rust sample here is a real file in the repository — an examples/*.rs program or a benches/*.rs harness — that CI compiles on every push. At build time the site copies those exact files in and renders them. There's no hand-typed code on this blog; if a snippet is here, it built. Benchmarks are real criterion harnesses too; the numbers are a dated sample run you can reproduce with one just command.

  1. Read your writes: opt-in replica routing via Sentinel
    Part 8 of 8

    Routing read-only queries to replicas is a correctness decision, not just a throughput knob. Here's why we made it opt-in, per-client and per-query.

  2. Production-grade: retries, tracing spans, metrics, and error hints
    Part 7 of 8

    Opt-in retries that never duplicate a write, OpenTelemetry-aligned tracing with a privacy-safe query fingerprint, bounded metrics, and errors that tell you how to fix them.

  3. Typed mapping with serde, and temporal values that do real math
    Part 6 of 8

    Deserialize rows straight into your own structs with serde, and decode FalkorDB date/time/duration values into types with a checked, type-safe algebra.

  4. Batteries included: an embedded FalkorDB you can cargo run
    Part 5 of 8

    Spin up a real FalkorDB from your Rust process — auto-provisioned module, cached or downloaded, or embedded at build time for fully offline runtime.

  5. Async all the way down: streaming results and connection multiplexing
    Part 4 of 8

    Result sets that are Streams you compose with the futures toolbox, and a multiplexed connection strategy — with a real pooled-vs-multiplexed benchmark.

  6. Rows that don't lie: header-aware, fallible result iteration
    Part 3 of 8

    A result API where every row is a FalkorResult<Row>, columns are read by name, and a value that fails to parse is an Err you can handle — not a panic.

  7. Stop hand-quoting Cypher: type-safe, injection-proof parameters
    Part 2 of 8

    Bound query parameters that take real Rust values, encode them correctly, and make Cypher injection a compile-time non-event.

  8. Why I keep betting on Rust for a graph database client
    Part 1 of 8

    Kicking off a dev log about the FalkorDB Rust client — the vision, the Rust bet, and a promise: every snippet on this blog compiles in CI.