Skip to content

See how your business logic changes.

Kanjin collapses mechanical changes so you can focus on application behavior. Read the original code and expand any block when you need it.

The demo runs on a prepared example. No account, no repository connection, nothing of yours is sent anywhere. Kanjin is also a Mac application — download for Mac.

Supported first TypeScriptJavaScript Kanjin targets multiple languages. TypeScript and JavaScript come first; more follow later.
src/billing/rebate.ts +17 −15 4 visible · 3 collapsed · 27 lines hidden
Mechanical Import order and formatting · 8 lines hidden
Mechanical Rate table literal reformatted · 10 lines hidden
Business behavior Eligibility rule changed
18 21 export function isEligible(input: RebateInput): boolean {
20 23 const tenure = monthsBetween(account.contractStart, input.asOf);
21 − if (tenure < 12) {
24 + if (tenure < 6) {
22 25 return false;
23 26 }
28 + if (account.fleetSize < 5) {
29 + return false;
30 + }
25 32 return account.tier === 'fleet';
Business behavior Validation rule removed
30 37 export function computeRebate(input: RebateInput): Money {
33 − if (!account.taxIdVerified) {
34 − throw new ValidationError('TAX_ID_UNVERIFIED', account.id);
35 − }
37 40 const rate = TIER_RATES[account.tier];
Mixed change Block moved and behavior changed
40 − assertActiveContract(account);
41 43 const gross = account.monthlySpend * rate;
45 + assertActiveContract(account, { asOf: input.asOf });
43 47 if (gross <= 0) {
44 48 return zero(account.currency);
Mechanical Comment removal and local rename · 9 lines hidden
Uncertain Rounding behavior may change
62 64 const net = gross * rate;
63 − return { amount: Math.round(net * 100) / 100, currency: account.currency };
65 + return { amount: roundCurrency(net, account.currency), currency: account.currency };
A prepared example from a fictional repository. Collapsed blocks are hidden, not cleared.

The problem

One line decides who gets paid. It arrives with 213 others.

This pull request touches nine files. A formatter reflowed two of them, imports were reordered, a test helper was rewritten, and a JSON rate table was regenerated. Somewhere in there, the tenure requirement for a fleet rebate dropped from twelve months to six, and a tax-ID check disappeared.

Reading a diff top to bottom means reading the cleanup first. Most reviewers do it once carefully and skim after that — not from carelessness, but because the important lines look exactly like the unimportant ones.

Kanjin does not claim that moves, locking, error handling or configuration never matter. It claims that they are a different kind of reading, and that they should not come first.

The diff as it arrives
the rule
24 changed blocks, 9 files, 214 lines of mechanical edits. Two blocks change behavior.
The same diff, focused
Business
Business
Mixed
Uncertain
Other
Other
Other
No context
11 blocks stay visible: the two behavior changes, the mixed block, the uncertain one, and everything the classifier could not judge.

How it works

Provide a change. Its blocks get classified. Read the focused diff.

The code you read is always the original code, with its own line numbers. Kanjin changes what is on screen, never what is in the repository, and never rewrites a change into a summary.

1

Provide a change

A pull request from GitHub, Bitbucket or GitLab, or a folder the Mac application tracks on your machine. Kanjin takes the diff plus the surrounding source the classifier needs.

9 files · 214 mechanical lines
21− if (tenure < 12) {
24+ if (tenure < 6) {
22 return false;
2

Blocks get classified

Each changed block, with its context, is sent to the classifier, which returns a structured classification: what kind of change it is, what it touches, and how sure it is. Kanjin stores the answer; it does not write code.

Business behavioreligibility · high Mechanicalimport order · high Uncertainrounding · low Mixed changemoved and changed · medium
3

Read the focused diff

Only the blocks classified as behavior-preserving are collapsed, each with its category and line count. Uncertain, mixed, failed and unclassified blocks stay on screen — they are exactly the ones worth a second look.

Mechanical 18 lines hidden
21− if (tenure < 12) {
24+ if (tenure < 6) {

Business relevance and confidence are two different things. A block can be confidently classified as mechanical and still be worth reading; a low-confidence block is never hidden because Kanjin is unsure.

Reviewer control

Nothing is hidden from you. It is folded, and you hold the fold.

Every collapsed block names its category and how many lines it is holding, so you always know the size of what you are not reading. One click opens it. The same click closes it again, and your place in the file does not move.

  • Expand one block, or every block, from the same control
  • Switch to the full diff at any point, unified or side by side
  • Real line numbers, before and after, in every view
  • Keep a block visible for yourself, or correct its classification
Open the demo
src/billing/rebate.ts expanded · 18 lines restored · reading position kept
@@ -1,10 +1,13 @@
1−import { ValidationError } from '../errors';
1+import { Account, RebateTier } from '../types/account';
4+import { roundCurrency } from '../lib/currency';
11/** Rebates are settled monthly against the fleet contract. */
8−// TODO(2024): move tier rates into the pricing service
Light and dark are the same layout at inverted lightness. Diff colours keep their glyphs in both.

What stays visible

Kanjin supports your judgement. It does not stand in for it.

Three kinds of block are never collapsed, whatever the confidence attached to them: a changed rule, a block the classifier was unsure about, and a technical change that still moves behavior.

Business behavior

A changed rule

Eligibility, pricing, permissions, validation, and the state something ends up in. In this example: who qualifies for a fleet rebate, and a tax-ID check that no longer runs.

33− if (!account.taxIdVerified) {
34− throw new ValidationError(…);
Uncertain

A block the classifier was unsure about

Inline rounding replaced by a helper whose definition was not in the supplied context. The helper might round the same way. Kanjin will not decide that for you.

63− Math.round(net * 100) / 100
65+ roundCurrency(net, currency)
Other behavior

A technical change that still matters

Not a business rule, but not cleanup either: a timeout, a retry, a transaction boundary, an index. It stays visible, in its own category, so it is not mistaken for either.

18+CREATE INDEX idx_rebate_tier
19+ ON accounts (tier, fleet_size);

Fits your workflow

Connect your provider, or track a folder on your Mac.

Discussion stays where your team already has it. Kanjin links to the pull request for comments and does not add a second place to argue.

Signing in with GitHub identifies you. It does not let Kanjin read your repositories — each member links their own provider account, and the provider decides what that account can read.

Local folder · Mac application Track a working directory on your machine. No provider connection needed, ever.
Available
GitHub · pull requests Pick a pull request, choose which repositories Kanjin may read.
Available
Bitbucket · pull requests Workspace-scoped access, using Bitbucket's own authorization model.
Available
GitLab · merge requests Each provider has its own words and its own authorization model. Kanjin uses theirs, not a lowest common denominator.
Available
GitHub · Bitbucket · GitLab Pick a pull request or a merge request, choose which repositories Kanjin may read.
Available

Trust and limits

What Kanjin will not tell you.

Classification is a judgement made by a model on a block of code and the context around it. It can be wrong, and it can be missing. The design assumes that.

Read the trust page

Collapsed does not mean cleared

A collapsed block is one the classifier classified as behavior-preserving. That is a classification, not a proof. Kanjin never labels a change safe to merge, and has no approval action.

Nothing disappears on failure

If analysis fails, times out, or comes back partial, the affected code stays fully visible and the review says so. Missing classification removes collapsing, never code.

Analysis involves sending source

To classify a change, Kanjin sends the classifier the enclosing function in both versions, the imports it uses and the declarations it references. You see the file list and its size before anything private is submitted. Kanjin holds that input only while the analysis runs, and for one hour after a failed or partial one so a retry works. It keeps no other source code, with one exception: a block whose classification you correct. Everything Kanjin does keep — the judgments, and the source of a corrected block — is deleted after one year.

Sign-in is not repository access

Your login identifies you. Repository access is granted to a workspace, per repository, and shown on its own screen — with what it reads, who granted it, and how to remove it.

Questions

Answers, with the release-dependent ones marked.

What does Kanjin mean by business logic?

The rules that decide what your application does: who qualifies, what something costs, who may act, what counts as valid, and what state a thing ends up in. If a change alters one of those answers, it stays visible.

What kinds of changes can it collapse?

Only blocks the classifier classifies as behavior-preserving — reformatting, import order, renames of local names, removed comments and commented-out code, and regenerated files. Each collapsed block names its category and its hidden line count.

Can I inspect everything that it hides?

Yes. Expand any block in place, expand every block at once, or switch to the full diff. The original code and its line numbers are what you see in every view.

What happens when classification is uncertain or fails?

The code stays on screen. Uncertain, mixed and unclassified blocks are never collapsed, a partial analysis says which files were not classified, and a failed analysis leaves the whole diff visible with a retry.

Does Kanjin approve changes or find every bug?

No. It has no approval or merge action, it does not score quality, and it never marks a change safe to merge. It changes the order you read a diff in — the judgement stays yours.

Does it change the source code?

No. Kanjin only changes what is displayed. It writes nothing to your repository, proposes no fixes, and never edits a file.

Which languages and providers are supported?

TypeScript and JavaScript come first, and Kanjin is built to add more. GitHub, Bitbucket and GitLab all work in the first release, and the Mac application can track a folder on your machine with no provider connection at all.

Does source code leave my environment?

Yes, when you run an analysis: the enclosing function, its imports and the declarations it references are sent to the classifier. Kanjin shows you the file list and size before you submit anything private. Kanjin holds that input only while the analysis runs, and for one hour after a failed or partial one; it keeps no other source code except a block whose classification you correct, and everything it keeps is deleted after one year.

The storage location and the deletion guarantees still need legal sign-off. No local-only-processing claim may be made.

How is repository access granted and removed?

An administrator connects GitHub, Bitbucket or GitLab to the workspace, through the provider’s own authorization. Each member then links their own provider account, and Kanjin shows each member only what that account can read — it mirrors the provider and never grants access. Access is removed at the provider, or by unlinking the account or disconnecting the provider in Kanjin.

Read the behavior change first. Keep the whole diff one click away.

Try the prepared example now — nothing to install, nothing to connect. Sign-up is open, and the Mac application tracks a folder without any provider connection.

Try the demo Create account Download for Mac The Mac application needs macOS 26 or later.