Skip to content

Examples

Situations you will recognise.

Six things that happen to a codebase during AI-assisted work, and what Little Owl actually prints when they do.

“Your component reached 2,000 lines”

Three assistant passes each added a section to the same file. No single diff looked alarming.

little-owl check
🟠 #3   <CheckoutPage> is 2,014 lines
       src/app/checkout/page.tsx:18
       <CheckoutPage> is a very large component — it is probably
       doing several jobs at once.

NEXT STEP

  → little-owl explain 3   the full story of the first issue

Note. Components get their own budget, separate from plain functions, because they are legitimately longer.

“Your feature bypasses the architecture boundary”

A UI file started importing the database client directly, skipping the service layer entirely.

little-owl architecture --details
From your configuration:

  ui (app, components)
   ↓
  application (services)
   ↓
  infrastructure (lib/db)

Policy: a layer may only use the layer directly below it

⚠ Boundary issues:

  ✗ ui → infrastructure  (1 import)
      src/components/Orders.tsx:4 → src/lib/db/client.ts

Note. If Little Owl inferred your layers rather than reading them from config, it says so in the output.

“A dependency is no longer used”

A refactor removed the last import of a package, but the package stayed in package.json.

little-owl dependencies
14 declared   11 imported

ℹ Declared but never imported (may be used via config or at runtime)

  date-fns
  lodash

3 packages (type definitions, linters, build tooling) do their job
without being imported and are not counted above.

Note. Build tooling is filtered out automatically. What is left is short enough to actually check.

“A change affects 17 modules”

You are about to edit a shared auth helper and want to know what it reaches before you start.

little-owl impact src/lib/auth/session.ts
Potentially affected

  HIGH  (6 files)
    src/app/login/page.tsx
    src/components/panel/AdminGate.tsx
    ... and 4 more

  MEDIUM  (11 files)

Routes
  /login    src/app/login/page.tsx
  /panel    src/app/(app)/panel/layout.tsx

Risk: high    Confidence: medium
Some dynamic imports could not be resolved, so more files may be
affected than listed.

Note. Risk is about reach, not correctness. A trivial change to a widely-imported module is still a wide change.

“Your codebase accumulated new complexity”

Nothing broke. The scores just moved, and you want to know exactly what moved them.

little-owl review
✓ 12 files changed   +486 -73, 3 areas
  uncommitted changes vs HEAD
✓ Compared with the baseline recorded 2 days ago

Health   89 → 83   ↓ -6

This change introduced something that needs fixing before release.

🔴   1  critical    Fix before your app goes live.
🟠   3  important   Fix soon — this gets more expensive the longer it waits.

Note. Every point of movement resolves to a count. There is no score you cannot explain.

“A database URL ended up in your client bundle”

You asked for a profile card and got one. It imports a helper, the helper imports the data layer, and the data layer reads a key — three reasonable files, and a credential any visitor can read.

little-owl check
🔴 #1   A secret can reach the browser through this component
       src/components/panel/AdminGate.tsx
       Following the imports out of AdminGate.tsx leads to code
       that reads a password or key from your environment — and
       everything on that path is sent to the browser.

       src/components/panel/AdminGate.tsx
          ↓
       src/lib/auth/session.ts
          ↓
       src/lib/db/client.ts
       reads process.env.DATABASE_URL

Note. No single file is wrong, so a linter cannot see it. Little Owl walks the import graph — and its guidance says to rotate the credential too, because a deployed secret is already public.

“An assistant duplicated an existing helper”

The helper already existed two directories away. The assistant could not see it, so it wrote another one.

little-owl check
🟠 #2   formatCurrency() is implemented in 3 places
       src/lib/format.ts
       This usually happens when an assistant writes a helper it
       could not find, because a version already existed somewhere
       else. Now there are two, and they will drift apart.

       src/lib/format.ts
       src/components/cart/price.ts
       src/features/billing/money.ts

NEXT STEP

  → little-owl explain 2   what this issue actually means

Note. This describes a structural pattern. It says nothing about who or what wrote the code — and Little Owl never claims to know.

Found something it got wrong?

False positives are the thing that kills a tool like this. There is an issue template specifically for them, and they are treated as bugs.