mantish/ product / features
Join the waitlist

Every capability,
with the diff it makes.

What Mantish does to a pull request, one capability at a time — and then the complete list of classifiers underneath.

features, annotated

This page exists so a claim is never only a claim — the views below are the real product, and the rule list at the end is the one the engine actually ships.

Semantic diff

ast · cross-file

Every change is classified by what it did: moved, extracted, renamed, modified, added, deleted. Matching runs across files, not only inside one, so a method that left one class and arrived in another is one move rather than a deletion and an addition.

- class OrderService { decimal ApplyDiscount(…) }
+ class PricingPolicy { decimal ApplyDiscount(…) }
mantish · semantic diff

A line diff cannot say those two halves are the same method, so you read it twice and then compare them in your head to be sure. That comparison is the work Mantish already did.

Structure view

outline · folded

Collapsed to its declarations by default; expanding one shows its diff without leaving the outline. It is not only for code — a YAML pipeline, a JSON manifest, a CSS or HTML file all fold into their own structure, which is usually the fastest way to see that forty shifted lines were one renamed block.

▾ PricingPolicy
~ ApplyDiscount(Order, Customer)
+ ValidateTier(Customer)
mantish · structure view

The outline is the navigation: nothing opens until you ask for it, and closing it puts you back where you were.

Diagram view

references

The same change set drawn as relationships instead of a list: which changed files reference which, which cluster together, and which are on their own. Clicking a node navigates to it.

mantish · diagram view

Group changes

by category

Whitespace, reordered imports, a file whose content did not really change — you look at all of it anyway, because it is in the list and you cannot tell from the outside that it is nothing. Banded by category, each of those is one decision for the whole band instead of one per file.

rename ×6 · formatting ×48 · logic ×2
mantish · group changessample
20 files in 5 bands · every file under its highest tag0 / 20 cleared
Models/Cart.csModels/Coupon.csModels/Ledger.csModels/Money.csModels/Payment.csModels/Refund.csModels/Shipment.csModels/Tier.csModels/Voucher.csModels/Warehouse.cs

The time a review costs is mostly spent on changes that were never going to change the answer.

Identical changes

dedup · bulk

A dependency bump, a namespace move, a signature that every call site had to follow: the change is the same in every file it touched. Mantish compares them, groups the ones that match, and shows the diff once with the list of files it stands for.

3 changes · 18 files · 3 diffs to read
mantish · identical changessample
3 changes repeated across 18 files — one diff to read each0 / 18 read

Each card is one change Mantish found byte-for-byte in every file under it. Pick a file to read it in its own context, tick it off when you have — or clear the whole group in one go.

New packageVersion="3.1.1"Version="4.0.0"10 files
Shop.Core.csprojlines 2022
2020 <PackageReference Include="FluentValidation" Version="11.9.0" />
21· <PackageReference Include="Serilog" Version="3.1.1" />
·21+ <PackageReference Include="Serilog" Version="4.0.0" />
2222 <PackageReference Include="MediatR" Version="12.4.0" />
Applied to 10 files · 0 read
Import changesShop.Billing.InvoicesShop.Invoicing5 files
InvoiceBuilder.csBilling/lines 24
22 using System.Globalization;
3·using Shop.Billing.Invoices;
·3+using Shop.Invoicing;
44 using Shop.Core.Money;
Applied to 5 files · 0 read
CascadeApplyDiscount(order)ApplyDiscount(order, customer)3 files
OrderService.csServices/lines 8890
8888 var customer = await _customers.Get(order.CustomerId);
89· var discount = policy.ApplyDiscount(order);
·89+ var discount = policy.ApplyDiscount(order, customer);
9090 order.Total = subtotal - discount;
Applied to 3 files · 0 read

Grouped on the changes themselves, not on file names — files that merely look alike do not end up together.

Auto-mute noise

built-in tags

Every change carries the tags the classifier gave it. The ones you have already accepted a thousand times fold away until you ask for them — nothing is dropped, and expanding a group gives you its full line diff.

- var custDiscount = policy.Apply(o, c);
+ var customerDiscount = policy.Apply(o, c);

usually muted

rarely muted

your call

↓ folded until you ask
Rename

Symbol renamed without logic changes

No example available

Nothing here is fixed. Turn a classifier off for one review and back on for the next, or write your own when the built-in list does not describe your noise.

Spotlights

tag-driven

Auto-mute decides what folds away; a spotlight decides what cannot. A spotlighted change is pulled into a section of its own, marked in the file list and accented in the diff, however large the pull request around it is. The shortlist below is what ships — every other classifier can be spotlighted too, and you can write your own the same way you write a mute rule.

+ if (order is null) throw new ArgumentNullException(…);
01BreakingA signature left the public surface — someone downstream compiles against itbreaking
02Error handlingA catch, a throw or a null check moved; the failure path changed with iterror-handling
03Disabled testA test stopped running. Nothing else in the diff will tell youdisabled-test
04TODO addedWork the author knowingly deferred, in the pull request that deferred ittodo
05New packageA dependency arrived. Licence, size and supply chain all came with itnewpackage
06Version bumpA version moved — visible immediately instead of buried in a manifestversion-bump
07Type changesA signature or annotation changed shape, not just its bodytype-change
08RenameOrdinary noise most days, and the whole review when an API is being renamedrename

A dependency that moved a major version can be the first thing you see rather than the last — or spotlight whatever this particular project cannot afford to miss.

Files tree & tags tree

triage

The same changed files, filed two ways: by where they live, and by what they are. Tags are assigned automatically, so a large pull request can be triaged — security first, generated last — before you read a single line of it. Either tree keeps track of where you got to: tick off one file, a whole folder, an entire tag band, or the pull request in a single action, and a half-read folder says so rather than pretending either way. Both trees are below; switch between them.

mantish · files tree & tags treesample
18 files changed · the same pull request, two ways in0 / 18 read

Where the change landed. Folders fold away, and every file carries the tag it was given automatically — no one labelled these by hand. Tick off a file, a folder, or the whole pull request.

build.ymlInfrastructure
DockerfileInfrastructure
pricing-rules.mdDocumentation
CartController.csLogic changes
OrderController.csError handling
OpenApi.g.csGenerated
OrderService.csError handling
DiscountRules.csLogic changes
PricingPolicy.csBreaking changes
20260812_AddCustomerTier.csMigrations
ShopContext.csLogic changes
PasswordHasher.csSecurity-sensitive
TokenIssuer.csSecurity-sensitive
CheckoutFlowTests.csTests
OrderServiceTests.csDisabled tests
PricingPolicyTests.csTests
package-lock.jsonGenerated
README.mdDocumentation

One file, one band: a file is filed under its most significant tag, so the bands add up to the pull request rather than double-counting it.

Watched paths

cross-repo

Watch a path: a folder, a glob, a single file. Mantish matches it against the open pull requests in every repository you have connected and lists the ones that touch it. Being left off the reviewer list stops being the reason you find out after the merge.

src/Shop.Core/Pricing/** 3 open pull requests

Matching runs against the pull requests themselves, across repositories — including the ones you would never have opened.

Ignore rules

globs · load time

A pattern list decides which files sit out of the change counters, out of identical-changes grouping and out of auto-mute. There is no reason to compare package-lock.json against every other file in the pull request looking for a group nobody wanted — so it is skipped, and the review opens on the files you are actually here for. The list arrives prefilled with the lockfiles every ecosystem generates and is yours from then on: delete a line and it never comes back.

**/package-lock.json
**/*.lock
[group,mute] **/Migrations/*.cs

Ignoring never hides a file from the tree. It drops the file's contribution to three things; the file itself is still there when you want it.

Global and project level

team · versioned

Your rules are a plain text file — open it in any editor, no settings dialog required. A repository can carry its own .mantish/ignore next to the code, checked in and reviewed like any other file, so a new reviewer clones the repository and already has the team's rules. The two layers stack: the project's rules apply on top of yours, not instead of them.

global ignore file on your machine every repository
project .mantish/ignore, in git this repository

The project file is read from the pull request's own branch, so a rule arrives together with the change that needed it.

Structural analysis

roslyn · own engine

C# runs on Roslyn — the compiler's own parser and a full semantic model, so a symbol is followed rather than guessed at. Every other language is our own implementation: the parse, the facts read off it and the matching that turns them into moves, extracts and renames are the engine's work rather than a step handed to something generic. Files outside the list still diff — they just diff by line.

C#On the full semantic model
TypeScriptIncluding .tsx
JavaScriptIncluding .jsx
GoFunctions, types, interfaces
PythonClasses, functions, decorators
JavaClasses, methods, annotations
C / C++Functions, types, structs
CSSSelectors, rules, variables
JSONKeys and structure

Any file your git host serves gets a line diff with word-level highlights. The languages above also get structural analysis — classes, methods, functions — which is what the structure view and the move, extract and rename detection are built on.

Works with every host

4 hosts

Pull requests, branches, iterations and comment threads behave the same on all four. A team split across two hosts reviews in one place, with one set of rules.

Review before you push

working tree · agent hand-off

A local repository reviews like a pull request: the working tree against HEAD, a linked git worktree, or any base…head pair — a branch, or one commit. The comments you leave are a review session kept inside the repository, rendered as a review.md checklist with each comment's file, line range and snippet. Copy the prompt, give it to your coding agent, and it works through the list and ticks the boxes; Mantish reads those ticks back and re-anchors comments whose file has moved on underneath them.

- [x] Pricing/PricingPolicy.cs:88-94 discount applied before tax
- [ ] Orders/OrderService.cs:141 null customer reaches the policy

The review that used to wait for a pull request happens before you push — and what the agent changes comes back as a diff you review the same way as any other.

Every surface, one engine

desktop · terminal · vs code · jetbrains

What differs between the four is the shell. The classifier, the tags and the rules are the same binary underneath, and analysis runs on your machine in all of them. The JetBrains plugin is one plugin for the IntelliJ platform, so Rider, IntelliJ IDEA, GoLand, PyCharm and WebStorm all load it.

People and AI, told apart

threads · people vs ai

A pull request with tooling on it arrives as one column holding two different things: what a colleague actually asked, and what a bot or an AI reviewer suggested. Mantish recognises the automated authors and files their threads separately, so answering your reviewers is not an exercise in scrolling past a coverage report. Both lists carry the same open, pending and resolved filters — the split is who wrote it, not what you can do with it.

people 3 open · 2 resolved
ai tools 41 open · 6 resolved

Recognition is by author, not by tone: the [bot] accounts every host issues, plus the review tools by name.

Themes, yours to change

editor · portable

Start from a built-in palette and change what you disagree with: the chrome, the diff tints, the status colours, and the syntax highlighting token by token. A theme is a file you can export, so a palette that suits your team travels to the rest of it instead of being described in a chat message.

If a theme is nearly right, it is a copy away from being yours — the built-ins are starting points, not a menu.

Colour-blind modes

a11y

Change highlights, badges and diff markers all switch together, so additions stay distinguishable from deletions without relying on red and green.

Code anonymization

privacy

Names become positional stand-ins on the way out: types read as Type1, methods as Method1, parameters and locals as var1. Framework and language names stay, because they say nothing about your product. Identifiers inside string literals are replaced too, and comments can travel anonymised, untouched, or be dropped entirely — whichever you set.

- decimal CalculateTotal(Order order)
+ decimal Method1(Type2 var1)

One name maps to one stand-in, on both sides of the diff and in every file — so the analysis still sees the same symbol move. It just never learns what you called it.

The full classifier list.

Grouped the way a reviewer meets them. Every one of these can be muted or pinned as a spotlight — the grouping is habit, not a setting you are stuck with.

01FormattingWhitespace, indentation, or code style changesusually muted
02WhitespaceBlank lines or spacing changes onlyusually muted
03CommentCode comment added, removed, or modifiedusually muted
04Import changesImport/using statements added, removed, or reorderedusually muted
05RenameSymbol renamed without logic changesusually muted
06RefactoringStructural refactoring without behaviour changeusually muted
07CascadeSame token replacement repeated across call sitesusually muted
08IndentationCode re-indented (wrapped/unwrapped in a block)usually muted
09ReorderLines reordered without content changeusually muted
10AnnotationAttributes, decorators, or annotations added/changedusually muted
11Copyright headerCopyright year or license header text changedusually muted
12Version bumpVersion number or metadata field updatedusually muted
13LogicFunctional or behavioural changerarely muted
14BreakingPublic API signatures removed or changedrarely muted
15Error handlingTry/catch, null checks, or error propagation changesrarely muted
16PerformancePerformance optimizations (caching, async, pooling)rarely muted
17Dependency injectionDI wiring, constructor params, or service registrationrarely muted
18Access modifierVisibility keywords changed (public/private/internal)rarely muted
19Type changesType annotations or signatures changedrarely muted
20LoggingLogging statements added, removed, or modifiedrarely muted
21New packageNuGet package reference added or version changedrarely muted
22TODO addedA TODO, FIXME, HACK or XXX marker was addedrarely muted
23Disabled testA test was skipped or ignored rather than fixedrarely muted
24Doc commentXML doc comments, JSDoc/TSDoc, Go doc commentsrarely muted
25Custom C# ruleDefine your own mute logic in C# — full Roslyn AST accessyour call
26AI-classifiedDescribe what's noise — AI decides per changeyour call

Or skip the list entirely: describe what noise means to you and let an AI-classified rule decide per change — after the snippet has been anonymised locally.

Your PR is bigger than your change.

Mantish is launching in 2026. Join the waitlist to get early access.

One email when it ships. No drip campaign.