Entl — Bavarian/Austrian for "little duck".
Warning
Early and unstable. Entl is pre-release and under active design — the code, the CLI, the schema, and these docs all change without notice, and much of what's described below isn't built yet. Not ready for real use. Watch along if you're curious.
Entl pulls a repository's git history and forge activity — commits, diffs, pull requests, reviews, CI, events — into data you can actually work with. A Rust engine pulls continually and streams changes as they happen, exposed through a CLI, a Rust crate, and in-process language bindings. The data lands wherever you point it: a local DuckDB by default, or Postgres, SQLite, Parquet, Kafka — any major database, queried from any major language. It's read-only over your repo, and stays local unless you send it somewhere.
Full documentation — install, guides, the schema reference, and the design behind it — lives at entl.dev.
# install the CLI (Linux/macOS) — grab a release binary…
curl -fsSL https://raw.githubusercontent.com/zmaril/entl/main/install.sh | sh
# …or build it from source
cargo install --git https://github.com/zmaril/entl entl-cli
# pull a repo into a local DuckDB, then query it
entl load ./my-repo
entl query "SELECT number, title FROM gh_pull_requests WHERE state = 'OPEN'"Entl started with Powdermonkey. I wanted a supervisor agent that could look at all the recent merge conflicts across a repo, reason about them, and propose refactors that would keep them from recurring. Simple enough — except merge conflicts aren't recorded anywhere in git. They're derived: you need two commits and a direction to know whether one would even happen, and there's a combinatorial number of possible ones, so of course git doesn't store them. I needed to walk back through history and reconstruct every conflict that had (probably) occurred, and that turned out to be real work.
The same wall shows up everywhere. I kept wanting whole-repository analyses — the burndown charts from Hercules, the cityscape views of CodeCharta, churn, ownership, code age — and every time the hard part wasn't the question, it was the data wrangling: getting git and forge data into a shape you can actually query, join, and iterate over. I ran into the same problems working with git-as-data that everyone does.
Entl is my answer. Pull the history and forge activity down once, keep it current, and expose it as plain data — the raw objects plus a small algebra of operations over them (walk, diff, map, reduce, …) — from any language, into any database. It's mostly glue over gitoxide and the forge APIs, and deliberately low-tech: hand-written schemas, thin bindings, no magic. I'd like to solve working-with-git-as-data once, for everyone. The thinking is written up in notes/purpose.md and the design docs.
Entl is early and moving fast. If something's broken, missing, or you've got a git/forge question you wish you could just query — file an issue, join the Discord, or follow @ZackMaril on X.
To hack on entl locally, run scripts/dev.sh to build the Rust core and CLI; the language bindings and postgres sink have their own setup. PR titles follow Conventional Commits (type(scope): summary), enforced in CI.
Code is MIT.
The duckling art (assets/duckling.jpg) was generated with Midjourney.