Lenscheck lenscheck-semantic-reviewer

See what a pull request actually changes

Git tells you what lines changed. Lenscheck tells you what they mean — and points you at the exact line.

pip install lenscheck-semantic-reviewer
No LLM· Deterministic· Your source never leaves your machine· Free in beta
02The problem

A single PR can be 60 files and 18,000 lines

A 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 four answers.

a

What changed — in behavior, not in lines.

b

How it flows — route → handler → db → external call.

c

Where to look — the exact file:line, not the whole file.

d

Whether it broke a promise — a rule your code always kept.

02½The money shot

71 lines changed. The 4 that could leak data.

A real Django “add discovery, ads & growth” PR. On the left, the git diff you’d have to read. On the right, what Lenscheck says the moment it lands.

🗒 git diff — 71 lines across 3 files
diff --git a/feed/views.py b/feed/views.py
+import httpx
+import requests
+from django.core.cache import cache
 class StoriesView(APIView):
-    permission_classes = [IsAuthenticated]
+    permission_classes = [AllowAny]
 class PostCreateView(APIView):
+        httpx.post(MODERATION, json={"media_url": ...})
+        notify_followers.delay(post.id)
+        requests.post(ADS, json={"email": request.user.email})
+class DiscoverUsersView(APIView):
+    permission_classes = [AllowAny]
+        return {"users": [{"email": u.email, "phone": u.phone}]}
+class AccountDeleteView(APIView):
+    permission_classes = [AllowAny]
+        User.objects.filter(pk=request.data["id"]).delete()
… + 46 more lines across models.py, urls.py
👁 lenscheck — 10 findings, worst-first
Adds 5 endpoints, 2 external calls, 4 new PII signals, removes 1 endpoint.
  • discover/usersnew public endpoint exposes a PII path
  • account/deletepublic endpoint, destructive DB delete
  • postsnew external call + async + email egress
  • storiesauth weakened — IsAuthenticated → AllowAny
  • ads/clicknew endpoint with a DB write
  • notificationsendpoint removed
  • feednew cache read/write
  • trendingauth strengthened → login required
  • billing/subscribenew endpoint (Stripe)
  • healthnew read-only endpoint
03How it works

Code becomes facts. Facts get diffed. You get pointed at the line.

No running your code, no guessing. Lenscheck reads structure with Python’s own parser (AST) — the same three steps, every time.

01

ANALYZER

Reads code into behavior facts — routes, auth, db, calls, PII.

02

DIFFER

Compares the two sides of the PR — what changed in behavior.

03

SURFACE

Ranks it worst-first and points at the exact line.

It never executes anything — it analyzes clean git snapshots statically, so it’s safe to point at any repo.

04See it

What changed → how it flows → where to look

A ranked list, an interactive flow graph for every change, and the exact file:line — wherever you already work.

localhost:8088/review/481
A finished Lenscheck review in the web UI: a ranked list of changes with a flow graph and file:line locations.
05What it finds

One engine, the whole surface of your app

Every finding traces to an exact file:line — deterministic, honest about the unknown, and free.

Repo mapNEW

lenscheck map — every endpoint grouped by app, worst-first. “What’s here,” not just “what changed.”

Traced PII leaks

The exact field → the exact line where it leaves the app. Traced, not guessed.

Learned invariants

It mines the rules your code already keeps and flags the PR — and the commit — that breaks one.

Dependency powers

Flags a bumped package that newly gains network / subprocess / native code.

Inline + SARIF

Each finding pinned to its changed line, a sticky summary, a triage label, and the Security tab.

Org roll-up

lenscheck digest — the open risky PRs across every repo, one number for leadership.

Explore all features — the map, the seven-edge lens, invariants & more →

06Frameworks

Works with your Python stack — more on the way

Lenscheck reads endpoints, not one framework. Each new stack is just a new extractor — deterministic, refactor-stable, PII tracing and all, come along for free.

Available now
Django Django REST Framework Flask FastAPI
Soon available for
Express / Node.js soon NestJS soon Spring Boot soon Ruby on Rails soon Laravel soon Go · Gin / net/http soon

Same endpoint lens — the framework changes, the guarantees don’t. Want one prioritized? tell me which →

07Why it’s different

Smart like a reviewer, exact like a scanner

LLM reviewers guess and bill per PR; static scanners flood you with whole-file noise. Lenscheck is deterministic and behavior-aware — facts that trace to a file:line, silent on pure refactors, and it learns the rules your code already keeps. It doesn’t replace your tests; it sees a different layer: behavior at the endpoint.

LLM reviewersStatic scannersLenscheck
Deterministic · no token bill ✗ no ✓ yes ✓ yes
Reviews the behavior change ~ partial ✗ no ✓ yes
Refactor-stable (renames = no noise) ✗ no ✗ no ✓ yes
Learns your repo’s own rules ✗ no ✗ no ✓ yes

See the full comparison — vs CodeRabbit, Copilot, SonarQube & Semgrep →

08Go further

Two tools, one promise: always know what your backend does

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 · lives in CI

lenscheck-semantic-reviewer

A GitHub Action / CLI that reads the PR diff (AST, no LLM) and comments on what actually changed and where to look. One secret, zero code.

pip install lenscheck-semantic-reviewerPyPI ↗
Inside-out · lives in your app

lenscheck-contract

A library inside your Django, Flask, or FastAPI app that records what it really does — routes, models, effects, background jobs — fails CI on a risky change, and blocks undeclared calls at runtime.

pip install lenscheck-contractPyPI ↗

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 →

09Get started

Install, add your key, review

Needs Python 3.8+ and git. Request a beta key to activate the reviewer — your source stays on your machine.

1

Install it

pip install lenscheck-semantic-reviewer
2

Add your beta key

export LENSCHECK_API_KEY=sk_live_...
3

Review a pull request

lenscheck review . --pr 481

Get your free API token

Invite-only while in beta — drop your details and I’ll email your token. No card.

Prefer email? [email protected] · or read the docs

10Pricing

Start free. Grow into the team features.

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.

FreeBETA

For individuals & open source

  • Deterministic review + repo map
  • Public repos
  • CLI & GitHub Action
  • No LLM · your code never leaves
  • Community support
Get your free API token

TeamLIMITED OFFER

₹5,000₹99/mo

Everything in Free, plus:

  • Private repos
  • Automatic PR review bot
  • Your rules — learned & enforced
  • Org dashboard + risk roll-up
  • Merge gating & higher volume
Subscribe Talk to us

Enterprise

Everything in Team, plus:

  • SSO + audit logs
  • On-prem / self-hosted
  • Priority support & SLA
  • Security review & custom rules
Talk to us
Community

Report a bug, get on the wall

Lenscheck is in beta and every rough edge you flag makes it sharper. Find a bug or a confusing result? Open an issue — no sign-up, no agreement. Everyone who files a valid report gets their name + GitHub featured here, and a merged fix earns you stickers in the post. 🎉

🏆 Wall of Fame — be the first name here

🐛 Found a bug?

A clear repro and the command you ran is gold. Reporting needs no CLA — on any repo.

Report an issue

💻 Want to write code?

The MIT lenscheck-contract takes PRs freely — new framework probes, ORM support, examples.

Contribute (no CLA)

🎟 How rewards work

Valid report → featured on this wall. Merged fix → stickers shipped to you. Simple.

Read contributing