Niro Code Review

Trace the blast radius across repos

Multiple reviewer agents trace every change across every repo you connect, checked against your team's rules and recent commits. Each finding cites the real call chain from Niro's graph, and lands on its exact line with a fix.

Request access Follow a real review ↓
Niro consoleReview of PR #88, 21 findings from multiple reviewer agents
Niro console showing the finished review of PR 88: has blockers, multiple reviewer agents, 21 findings, with the goal, what changed and the mismatch

Set up in three steps

  1. Install the GitHub App

    Pick the repositories. Niro never runs on one you didn't choose.

  2. Niro indexes the repo

    It builds the call graph once, then keeps it current as your branches move.

  3. Choose the role

    Advisor comments and never blocks.
    Guardian blocks the merge on a blocker.

One pull request, start to finish

Every screen is a real capture of one review. Scroll through the steps, or pick one.

    GitHub
      Blast radius

      What the rename actually breaks

      The PR renamed score to riskScore. Niro traced who still depends on it, and cited each call chain on the finding so a reviewer can check it.

      The change
      Still uses the old name
      Where it ends up

      What each reviewer checks for

      These are findings from the same pull request, matched to the agent by the evidence each one cites.

      Graph impactP0

      Field renamed from score to riskScore

      Names the two callers outside the diff, RiskGrpcService.assess and RiskEventConsumer.onLoanApplied, that still depend on the old field.

      RiskAssessmentDto.java:5
      HistoryP0

      Reverted risk rejection fix

      Quotes the commit "fix(risk): reject loans with a non-positive amount" that this PR quietly undoes.

      DefaultRiskAssessor.java:18
      Patch driftP0

      Configuration property rename mismatch

      The key was renamed to cutoff in application.yml, but the @Value annotation still reads threshold.

      DefaultRiskAssessor.java:14
      Use caseP0

      Risk assessment logic changed

      The check moved from <= to <, while the description says "No API or behaviour change".

      DefaultRiskAssessor.java:18
      SecurityP0

      Path traversal vulnerability

      The report name goes straight into a file path. Three reviewers flagged the same lines.

      RiskController.java:32
      ComplianceP0

      PII logged in plain text

      Names, emails and national IDs written to logs. Cites GDPR Art. 5(1)(f) and Art. 32.

      AnalystController.java:23
      Infra levelP0

      Exposed management endpoints

      Every actuator endpoint exposed, with environment values shown in full.

      application.yml:35
      GuidelinesP1

      Field injection used

      Quotes the repo rule: "Use constructor injection. Do not use field injection with @Autowired."

      AnalystController.java:23
      Code redundancyP1

      Reinvented JSON serialization

      Hand-built JSON by string concatenation, where Jackson already does the job.

      RiskEventProducer.java:22
      Console

      A history of every review

      GitHub gets the verdict. The console keeps the history, the trends, and the controls.

      Niro consoleInsights across every reviewed pull request
      Insights: trends across every reviewed PR

      Trends across every reviewed PR

      Critical and major findings per week, how many PRs were reviewed, which reviewers find the most, and how verdicts split.

      Screenshots are from Niro's review of a sample pull request on 2 October 2026. The live view is from #87, the same change opened a few minutes earlier.

      FAQ

      Which platforms does PR review support?

      GitHub only, for now. Niro installs as a GitHub App on the repositories you choose, rather than as a bot account holding a seat.

      Will it flood our pull requests?

      Multiple reviewer agents read the diff in parallel, then a verifier tries to refute every finding before delivery. When it is uncertain it leans refuted, because a false alarm costs more than a dropped maybe. Dispute a finding on the PR and it is re-checked against your doubt without folding to it. Every capability is also flag-gated and defaults off, so adoption is a decision rather than a surprise: you turn on the passes that earn their place.

      Does this replace human review?

      No. It reads the graph behind the diff and reports the call paths a diff view cannot show you, including which of them no test covers. Deciding what to do about them is still a reviewer's job.

      Does our diff reach your logs, or a model provider directly?

      Neither. No source, no diff content and no prompts are written to logs. Logs carry paths and counts only, a rule written into the service principles rather than bolted on afterwards. Every model call goes through one gateway, so what leaves is auditable in a single place.

      Know what a PR breaks before it merges

      Install Niro on one repository. Its agents review your next pull request and hand your team the blast radius across every repo you connect.

      Request access