It does not know your code
A generic bot cannot tell you that you already have a helper for this, or that your team banned that pattern. Lens learns your repo and your rules before its first review.
personal, not genericLens learns your repo first. Then it reviews every pull request four ways at once, runs your app to reproduce bugs, and posts one review with only what matters.
changes requestedRefunds can be paid twice on retry. The new formatter repeats one you already have. About 140 lines can go.
Reproduced. Calling refund/2 twice with the same key creates two refunds. Steps: seed one paid invoice, call twice, count rows.
This repeats Billing.Format.money/2. Call that and delete this module.
One implementation behind an interface. Inline it. 96 lines go.
the problem
The same bot reviews every company the same way. It does not know your code, so it comments on everything, and you pay for it per developer.
A generic bot cannot tell you that you already have a helper for this, or that your team banned that pattern. Lens learns your repo and your rules before its first review.
personal, not genericA bot that flags every style choice trains your team to ignore it. Lens posts blockers and things to fix before merge. Small stuff only appears when there is little else to say.
signal over volumePer-seat pricing charges you for headcount, not for work done. Lens is one flat price per runner. Hire ten more developers and the bill stays the same.
flat, not per headgetting started
No dashboard to configure and no pipeline to write. Lens sets itself up and asks you to approve the result.
Choose which repos Lens may see. It asks for read access to code and write access to reviews. Nothing else.
about 2 minutesLens reads the repo, starts your app, and opens a pull request with what it learned. Correct anything that is wrong, then merge.
nothing is reviewed until you mergePaste an API key from your AI provider and choose a preset. Reviews are billed to that account, at your provider's price.
stored encrypted, used only by your runnerAdd Lens: what I learned about this repo
lens-bot wants to merge 1 commit into main
After that, your next pull request gets a review.
what is in that pull request
A reviewer who does not know your codebase can only give generic advice. Lens reads the repo once and writes down what it learned, in a file you can read and correct.
# .lens/repo.md · written by Lens, edited by you ## How to start the app docker compose up -d db mix setup && mix phx.server # port 4000 ## Test data mix run priv/repo/seeds.exs # tenant "acme" ## What already exists - money formatting Billing.Format - permission checks Auth.Policy - background jobs Oban, never Task.async ## House rules - every query is scoped to one customer - no new file over 1,000 lines ## Packages core, security, migrations
Lens finds the commands, the ports and the test data, then proves it by starting the app. This is what lets the Runtime lens test a change.
It maps your helpers and shared modules. This is how the Reuse lens knows that a new function repeats an old one.
It reads your contributor guide, your linter settings and your past reviews, and turns them into rules it will check.
Dismiss a finding with a reason and Lens proposes a change to the file. You approve it like any other pull request.
the four lenses
One reviewer trying to catch everything catches little. Lens runs four at the same time. Each one has a single job and its own instructions.
Did you write something you already had? Is this easy to use wrong?
What can be deleted? It hunts for code written for a future that has not arrived.
The strict one. It asks whether the whole change could be built in a simpler way.
It does not read. It runs. Your app starts in a sandbox with test data, and the lens tries to break what changed.
how it runs
This is the real pipeline. Each run gets a fresh machine, and the four lenses work side by side. If one lens fails, the other three still report.
All findings arrive as a single review with inline comments. Not a stream of separate bot messages.
Lens can request changes or comment. It cannot approve. A person decides what merges.
Two lenses often spot the same line. You see it once, with the clearer wording and the higher severity.
Anything that breaks correctness, data or security sets the review to REQUEST_CHANGES. Everything else is a comment.
packages
The four lenses are the base. Packages add checks for one subject each. Turn them on per repo.
The four lenses: reuse, simplify, structure, runtime.
The mistakes that turn into incidents.
Schema changes that lock tables or lose data.
Whether the tests would catch a real break.
Changes that break the people calling you.
Measured on the running app, not guessed.
Checked on the real screens.
What a new package brings with it.
The rules only your team has, written by you.
Only Core review exists today. Pick the ones you want and we will build those first.
under the hood
No black box. Each lens is a plain text file of instructions, checked into your repository. If the review is wrong for your team, you change the file.
# .lens/lenses/simplify.md # Lens: Simplify Hunt complexity to delete. Analysis only; no fixes. ## Categories - delete: dead code, unused flexibility, speculative features - stdlib: hand-rolled behavior the language already provides - yagni: abstraction with one implementation, configuration nobody sets - shrink: same behavior in fewer lines ## Review Questions - What can be deleted outright? - What code exists only to support a hypothetical future case?
Too strict about file length? Edit the line. The change is reviewed and versioned like any other code.
Write one more text file for what your team cares about: accessibility, migrations, your own API rules. Add one line to the pipeline.
Each lens can use a different model, so the expensive one only runs where it earns its cost. See the presets.
A payments service and a marketing site need different checks. Each repo lists the packages it uses, in the same folder.
hosted, but yours
Self-hosting gives you control and a low bill, and costs you the upkeep. Lens keeps the first two and takes the upkeep.
Lenses, repo notes and packages are files in a .lens/ folder. Change them with a pull request.
One machine for your company only. Nothing shared. You choose the region.
Reviews use your key and the models you pick. Your provider bills you. We add nothing on top.
Read the full log of any review: what it ran, what it found, what it used.
Take the same files and the same machine image to your own cloud. Nothing to rewrite.
models
Lens does not resell AI. You connect your own key, choose which model each lens uses, and your provider bills you directly.
Pick the ones you have a key for. Only Anthropic works today; tell us what you use and we add it next.
You pay your provider's price for every token. Lens earns nothing from how much the model is used.
Every review shows what each lens used. If one lens costs too much, move it to a smaller model.
Your code is sent under your own agreement with your provider, including any no-training or data-location terms you have.
safety
A reviewer should not be able to change what it reviews. Lens gets the smallest set of permissions that still lets it post a review, and they are written in a file you can read.
| What | Access | Why |
|---|---|---|
| code | read | to see the change |
| pull requests | write | to post the review |
| issues | read | to read the linked ticket |
| push, merge, settings | none |
case study: in parallel
This is our own story. The numbers are from our main repository.
We are a small team that ships a lot. AI agents write much of our code, so our main repo gets about 737 pull requests a month. That is around 25 a day, and they arrive in bursts.
We used CodeRabbit on the Team plan. It is a good product. It was not built for that volume.
So pull requests waited in line for a review, and the people and agents who wrote them waited too. We wanted a reviewer with no queue, and we wanted to decide which model reads our code.
“0 reviews are currently available.”From the bot, on one of our pull requests, 2026-09-18. It put our allowance at 3 reviews per hour.
Three reviews an hour is fine for a team that opens a few pull requests a day. We open more than that before lunch.
A review that arrives after you have moved on is a review nobody reads. We wanted it back while the change was still in our heads.
New models arrive every few months. We wanted to pick ours, switch when a better one ships, and pay the provider directly.
what happened after we switched it on
2026-09-22 to 2026-09-27, one repository, read from GitHub on 2026-09-27. Both reviewers still run on the same pull requests, so we compare them every day.
pricing
You pay for a runner, the way you would pay for a build machine. Everyone on the team can use it.
Lens uses your AI key. Your provider bills you for what each review uses, at their price. We add nothing on top, and you see the usage of every review. Choose your models.
Want to run the machine too? Take the same files to your own cloud and pay for compute only.
questions
Then it tells you what it tried and what failed, and you add the missing step to the repo notes. Until the app starts, the other three lenses still run.
Delete the .lens folder or remove the GitHub app. There is nothing else installed and nothing to migrate back.
It happens once, before the first review. After that Lens only re-reads what changed.
The lenses run at the same time, so a review takes as long as the slowest one. Each lens stops after 30 minutes at most. Most finish much sooner.
The ones you pick, with your own key. Today that means Claude models from Anthropic. Other providers are planned; tell us which you use.
That is planned. Anything that speaks the common chat API will work, so the code never has to leave your network.
No. Lens reports. Where the fix is obvious it attaches a suggestion you can accept with one click, but it never pushes to your branch.
Not yet. Today it posts to GitHub. Tell us where your code lives when you sign up.
Yes. That is how we run it. Lens posts as its own reviewer and does not touch other reviews.
Lens is in early access. Leave your email and we will set it up on one of your repos with you.
We use your email to reply to you and nothing else. Privacy policy.