⬡ eben
Canonical Engineering Model for any software repository
Scan any repo and instantly get a structured understanding of its stack, architecture, and conventions — delivered as a unified dashboard, AI context files, a knowledge graph, and a benchmark that proves the value.
No AI during scanning · No network calls · Fully deterministic · Works offline
🔒 Your code never leaves your machine. eben makes zero outbound connections during scanning. No code, no metadata, and no credentials are ever sent anywhere — not to our servers, not to any LLM. No account required. Works fully air-gapped. Every line is open source.
What eben does
eben scans your repository once — deterministically, with no AI, no internet — and builds a Canonical Engineering Model (CEM): a structured representation of everything that matters about your codebase.
From that model it generates:
- 📊 Engineering Dashboard — dark-mode web UI with 7 sections, AI chat built in
- 🤖 AI Context Files —
CLAUDE.md,AGENTS.md,CURSOR.md,GEMINI.md,COPILOT.md - 🕸️ Knowledge Graph — interactive Cytoscape.js graph + DOT + Mermaid exports
- 📈 AI Readiness Score — letter grade across 9 engineering dimensions
- 🔬 Benchmark Engine — measures AI performance with vs without eben context
- 🗂️ Canonical JSON —
report.jsonas the single source of truth for everything
Quickstart
pip install eben
cd your-project
eben init .
open .eben/index.html
That's it. Eben scans the repo, builds the model, and opens a full engineering dashboard in your browser.
Every scan ends with an impact summary:
✓ Dashboard ready → .eben/index.html
──────────────────────────────────────────────
Your AI just got 31 facts about this repo.
Before eben: your AI knew nothing about my-service.
After eben: stack, architecture, conventions, dependencies — all loaded.
→ Write CLAUDE.md, AGENTS.md and more:
eben scan . --markdown
The fact count is real — every detected convention, dependency, layer, entry point, technology, and module counted from your actual repo.
Install
Recommended — install globally with pipx:
pipx install eben
That's it. eben is now available everywhere on your machine. No venv, no activation, no python3 eben.py.
# Then just run from any repo:
cd your-project
eben scan .
Don't have pipx?
brew install pipxon Mac orpip install pipxon Linux/Windows.
Optional extras:
pipx install eben[benchmark] # + benchmark engine
pipx install eben[all] # + all LLM providers
Or clone and run locally (for development):
git clone https://github.com/ebenhq/eben
cd eben
python3 -m venv .venv && source .venv/bin/activate
pip install --upgrade pip setuptools
pip install -e .
eben scan . # works like a global command while venv is active
Commands
| Command | What it does |
|---|---|
eben init . |
First-time setup — scan, create .eben/, update .gitignore |
eben init . --markdown |
First-time setup + generate AI context files |
eben scan . |
Full re-scan — rebuilds .eben/ and dashboard only |
eben scan . --markdown |
Re-scan + generate AI context files |
eben generate . |
Generate AI context files from existing .eben/ (no rescan) |
eben doctor . |
Validate .eben/ integrity and checksums |
eben benchmark --model <model> |
Benchmark AI with vs without eben |
eben benchmark show |
Show last benchmark summary |
eben benchmark score |
Manually score a benchmark run |
Scan flags
eben scan . --markdown # also generate AI context files
eben scan . --format json # JSON terminal output
eben scan . --no-color # no ANSI colours
eben scan . --max-depth 12 # deeper traversal
eben scan . --max-files 100000 # raise file limit
What gets generated
eben scan .
Everything goes into .eben/ — never the repo root:
.eben/
├── index.html ← Engineering Dashboard ← open this
├── report.json ← canonical report model
├── model.json ← Canonical Engineering Model (CEM)
├── technologies.json
├── architecture.json
├── conventions.json
├── dependencies.json
├── metadata.json
├── checksum.json
├── engineering-report.md
├── ai-readiness.json
├── graph.json
├── graph.mermaid
└── graph.dot
eben scan . --markdown or eben generate .
Also writes AI context files to the repo root (agents find them there automatically):
CLAUDE.md
AGENTS.md
CURSOR.md
GEMINI.md
COPILOT.md
Engineering Dashboard
One HTML file. No server needed. Works offline. Open it anywhere.
Seven sections:
| Section | What's inside |
|---|---|
| Dashboard | AI Readiness score, grade, architecture summary, module count, scan stats |
| Stack | Colour-coded badges across 14 technology categories |
| Architecture | Layers, modules, entry points, interactive knowledge graph |
| AI Readiness | Score breakdown across 9 dimensions with progress bars |
| Recommendations | Prioritised improvements with explanations |
| Generated Files | All artifacts with paths |
| Chat | Browser-based AI assistant — no server, works on GitHub Pages |
Built-in AI Chat
The Chat tab turns the dashboard into an interactive assistant that already knows your repo before you type a word.
- Reads context from the embedded
report.json - Supports 6 providers: Anthropic · OpenAI · Gemini · Mistral · Groq · Custom
- Custom provider accepts any OpenAI-compatible endpoint (Ollama, LM Studio, Azure, Together, Anyscale…)
- API key stays in browser memory only — gone when the tab closes
- Works on GitHub Pages (no backend)
What eben detects
35+ languages — Java, Python, TypeScript, Go, Rust, Kotlin, Swift, Dart, C#, C++, Ruby, PHP, Scala, Elixir, and more
60+ frameworks — Spring Boot, Django, FastAPI, React, Next.js, NestJS, Vue, Angular, Gin, Rails, Laravel, Axum, Flutter, PyTorch, LangChain, and more
Build tools — Maven, Gradle, Cargo, Go Modules, Make, Bazel, SBT, MSBuild
Package managers — npm, Yarn, pnpm, pip, Poetry, uv, Bundler, Composer, Pub
Databases — PostgreSQL, MySQL, MongoDB, Redis, Cassandra, Elasticsearch
Messaging — Kafka, RabbitMQ, NATS, ActiveMQ, Celery
Cloud — AWS, GCP, Azure, Vercel, Fly.io, Cloudflare, Render, Netlify
CI/CD — GitHub Actions, GitLab CI, Jenkins, CircleCI, Travis CI, Drone, Buildkite
Infrastructure — Terraform, Pulumi, Ansible, CloudFormation, AWS CDK, Serverless
Architecture patterns — Layered, hexagonal, MVC, microservices, monorepo, event-driven, serverless, library
AI Context Files
When you run eben generate ., eben writes five files to your repo root — one per major AI coding agent.
Each file uses a three-zone system:
<!-- eben:generated -->
## Stack
Languages: Java, Kotlin
Frameworks: Spring Boot
...
<!-- /eben:generated -->
<!-- eben:ai -->
AI agents write their notes here.
eben never touches this zone.
<!-- /eben:ai -->
<!-- eben:team -->
Humans write team context here.
eben never touches this zone.
<!-- /eben:team -->
| Zone | Owner | Behaviour |
|---|---|---|
eben:generated |
eben | Refreshed every eben generate or eben scan --markdown |
eben:ai |
AI agents | Never touched by eben |
eben:team |
Your team | Never touched by anyone |
⚠️ If a file already exists without zone markers, eben overwrites it entirely. Move your existing content into
<!-- eben:team -->first.
Benchmark Engine
Measures the real impact of eben on AI performance. Runs every task twice:
- Baseline — AI with no eben context
- Eben-assisted — AI with
.eben/report.jsoninjected
Metrics captured:
- ✅ Task success rate
- 🎯 Accuracy improvement
- 💰 Token and cost reduction
- ⚡ Latency reduction
- 🧠 Hallucination reduction
- 📈 ROI estimate
Outputs go to .benchmark/:
.benchmark/
├── index.html ← Benchmark Dashboard (7 sections)
├── benchmark.json ← full run data
├── benchmark.md ← markdown summary
└── results.json ← per-task detail
The benchmark dashboard includes a live ROI calculator — adjust your team size and session frequency in the browser.
Supported benchmark providers
| Provider | Key format | Default model |
|---|---|---|
| Anthropic | sk-ant-... |
claude-haiku-4-5 |
| OpenAI | sk-... |
gpt-4o-mini |
| Google Gemini | AIza... |
gemini-1.5-flash |
| Mistral | your key | mistral-small-latest |
| Groq | gsk_... |
llama3-8b-8192 |
| Ollama / Custom | none / any | your choice |
Architecture
eben/
├── core/ ← filesystem walker, detector base, CEM schema, zone system
├── detectors/ ← 8 detectors (one file each — add a detector = one new file)
├── writers/ ← CEM, markdown, terminal output
├── report/ ← Engineering Intelligence Report generator
├── readiness/ ← AI Readiness scoring engine + rules.yaml
├── graph/ ← knowledge graph builder
├── dashboard/ ← Engineering Dashboard (single HTML, no deps)
└── benchmark/ ← full benchmark system
└── providers/ ← 6 provider implementations (one file each)
Architecture rules:
- FileSystem walks once — all detectors share the same
fsinstance - Each detector returns a dict — merged by
ModelBuilder.deep_merge() - All outputs go to
.eben/— never the repo root - Agent markdown files go in root only with
--markdownflag report.jsonis the single source of truth — dashboard reads from itfrom __future__ import annotationsfirst line in every.py(Python 3.8 compat)
Contributing
macOS / Linux note: never run
pip installoutside a virtual environment — your OS will block it. Always activate the venv first.
git clone https://github.com/ebenhq/eben
cd eben
# Create and activate a virtual environment (one time)
python3 -m venv .venv
source .venv/bin/activate # Mac / Linux
# .venv\Scripts\activate # Windows
# Install dependencies (venv must be active — you'll see (.venv) in your prompt)
pip install pyyaml # core only
pip install pyyaml pydantic litellm rich typer # full install
# Run eben
python3 eben.py scan .
open .eben/index.html
Adding a detector = one new file in eben/detectors/. Adding a benchmark provider = one new file in eben/benchmark/providers/. Nothing else changes.
Built by ebenhq
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file eben-1.0.0.tar.gz.
File metadata
- Download URL: eben-1.0.0.tar.gz
- Upload date:
- Size: 95.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b570719f6fa62e8093304acf3771684c3b4c044a7a4ba8dff0f8fad677e7b809
|
|
| MD5 |
9fec85638a69c329076e16a98ab548ee
|
|
| BLAKE2b-256 |
08e127af6c6e8dda940086e6c68fc5d0bba1b31ef1b6643b2b49b2ea0975d9aa
|
Provenance
The following attestation bundles were made for eben-1.0.0.tar.gz:
Publisher:
release.yml on ebenhq/eben
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
eben-1.0.0.tar.gz -
Subject digest:
b570719f6fa62e8093304acf3771684c3b4c044a7a4ba8dff0f8fad677e7b809 - Sigstore transparency entry: 2429323349
- Sigstore integration time:
-
Permalink:
ebenhq/eben@685e6de354a7d35495ebf11d231449ced3046db1 -
Branch / Tag:
refs/tags/v1.0.0 - Owner: https://github.com/ebenhq
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@685e6de354a7d35495ebf11d231449ced3046db1 -
Trigger Event:
push
-
Statement type:
File details
Details for the file eben-1.0.0-py3-none-any.whl.
File metadata
- Download URL: eben-1.0.0-py3-none-any.whl
- Upload date:
- Size: 108.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c89e15b370991bd56e56023ed124728ff632355b6c4aa70649d8f63db2713666
|
|
| MD5 |
f79c171822fd254df12ec3b6efe8dcc8
|
|
| BLAKE2b-256 |
44954930c0452f7a491220040db1e992bcf42882e40a02892367a4fa8cdc864b
|
Provenance
The following attestation bundles were made for eben-1.0.0-py3-none-any.whl:
Publisher:
release.yml on ebenhq/eben
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
eben-1.0.0-py3-none-any.whl -
Subject digest:
c89e15b370991bd56e56023ed124728ff632355b6c4aa70649d8f63db2713666 - Sigstore transparency entry: 2429323386
- Sigstore integration time:
-
Permalink:
ebenhq/eben@685e6de354a7d35495ebf11d231449ced3046db1 -
Branch / Tag:
refs/tags/v1.0.0 - Owner: https://github.com/ebenhq
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@685e6de354a7d35495ebf11d231449ced3046db1 -
Trigger Event:
push
-
Statement type: