Git tells you what lines changed. Lenscheck tells you what they mean — and points you at the exact line to read.
A deterministic semantic PR reviewer for Python web apps. No AI black box, no LLM token bill — and your source never leaves your machine (only an abstract facts graph is sent to be ranked). Same PR in, same review out, every time.
pip install lenscheck-semantic-reviewer
pip install lenscheck-contract
Lenscheck looks at your backend from both sides — the diff from the outside and the running app from the inside. Each catches what the other structurally can't.
Outside-in. A GitHub Action / CLI that reads the PR diff (AST, no LLM) and comments on what actually changed and where to look. Lives in your CI — one secret, zero code.
pip install lenscheck-semantic-reviewer · PyPI ↗
Inside-out. A library inside your Django app that records what it really does — routes, models, effects — fails CI on a risky change, and blocks undeclared calls at runtime.
pip install lenscheck-contract · PyPI ↗
Together they close the loop: the contract exports your app's real rules, and the reviewer enforces them on every PR — so a brand-new domain sneaking into a diff becomes a 🔴 critical alert grounded in fact, not a hunch. Explore lenscheck-contract →
A normal line-diff buries the one change that matters — "user email now leaves the server" — under thousands of mechanical edits. You don't need to read all of it. You need to know what changed in behavior, how it flows, where to look, and whether it broke a promise.
# 17,841 lines changed → 3 things to actually look at 🔴 NEW ENDPOINT /api/companions/payment why: new endpoint exposes a PII path with open/unspecified auth flow: /api/companions/payment → CompanionPayment → {Order:write} → ext: PayTM investigate: payment_views.py:90 email → requests.post @ services.py:9 🟠 CHANGED /api/orders/invoice why: new external call: razorpay.post · money path 🟢 REFACTOR /api/users/profile handler renamed, semantics unchanged — nothing to see
No running your code. No guessing. Just Python's own parser (AST) reading structure — the same three boxes, small.
code → behavior facts
facts → what changed
rank + point at the line
A ranked list, an interactive flow graph for every change, and the exact file:line locations — in the terminal, a web UI, a PR comment, or your Security tab.

LLM reviewers guess and bill per PR; static scanners flood you with whole-file noise. Lenscheck is deterministic and behavior-aware — it reports facts that trace to a file:line, stays silent on pure refactors, and learns the rules your code already keeps. It doesn't replace your tests — it sees a different layer: behavior at the endpoint.
| LLM reviewers | Static scanners | Lenscheck | |
|---|---|---|---|
| Deterministic · no token bill | ✗ | ✓ | ✓ |
| Reviews the behavior change | ~ | ✗ | ✓ |
| Refactor-stable (renames = no noise) | ✗ | ✗ | ✓ |
| Learns your repo's own rules | ✗ | ✗ | ✓ |
See the full comparison — vs CodeRabbit, Copilot, SonarQube & Semgrep →
Every finding traces to an exact file:line — deterministic, honest about the unknown, and free.
lenscheck map — every endpoint grouped by app, worst-first. "What's here," not just "what changed."
The exact field → the exact line where it leaves the app. Traced, not guessed.
It mines the rules your code already keeps and flags the PR — and the commit — that breaks one.
Flags a bumped package that newly gains network / subprocess / native code.
Each finding pinned to its changed line, a sticky summary, a triage label, and the Security tab.
lenscheck digest — the open risky PRs across every repo, one number for leadership.
Explore all features — the map, the seven-edge lens, invariants & more →
Lenscheck is free during the beta — request a token and go. Teams add private repos, the auto PR bot, and your own rules enforced across every repo.
For individuals & open source.
Everything in Free, plus:
Everything in Team, plus:
Invite-only while in beta — drop your details and I'll email your token. No card.
Prefer email? [email protected] · or read the docs
Needs Python 3.8+ and git. Request a beta key to activate the reviewer — your source stays on your machine.
pip install lenscheck-semantic-reviewer
export LENSCHECK_API_KEY=sk_live_...
lenscheck review . --pr 481