Brakeman Report Visualizer

Inspect Brakeman scan reports directly in your browser. All analysis runs locally — no report data is sent to any server.

Drag & Drop your report

Or select your local brakeman-report.json or Brakeman output file.

No report at hand? The sample report lets you explore the dashboard right away.

Report Dashboard

Total Warnings

0

High Confidence

0

Medium Confidence

0

Weak Confidence

0

Security Index

A+

Excellent posture

100%
Scan Date: N/A
Rails: N/A
Brakeman: N/A
Duration: N/A

Compare with a previous scan

Load an older Brakeman report to see which warnings are new, fixed or unchanged. Warnings are matched by fingerprint, so code that only moved is not reported as new.

Triage and brakeman.ignore

0 of 0 active warnings triaged

Open each warning's file at the right line, in your editor or on your repository.

Identified Vulnerabilities

0 found

When a warning title has focus, press J / K or ↓ / ↑ to move to the next or previous warning.

Guide: Visualizing Brakeman Security Reports

How to generate a Brakeman JSON report

Brakeman (opens in new window) is a static analysis security scanner for Ruby on Rails applications. It reads your source code without running it, so it can be used from the very first line of code.

  1. Install the gem globally, or add it to the development group of your Gemfile (Rails 7.2+ applications ship with it by default):

    gem install brakeman
  2. From the root of your Rails application, run a scan and write the results to a JSON file. The format is inferred from the .json extension:

    brakeman -o brakeman-report.json
  3. Drop brakeman-report.json into the upload area above, or click Browse File.

Useful variants for CI pipelines and existing projects:

# With Bundler, forcing the JSON format and a quiet output
bundle exec brakeman -q -f json -o brakeman-report.json

# Write the report without failing the build when warnings are found
brakeman -o brakeman-report.json --no-exit-on-warn

# Review warnings interactively and mute false positives in config/brakeman.ignore
brakeman -I

Compare scans and triage warnings

The built-in brakeman -o report.html output is a static list. This dashboard adds the triage loop around it:

  1. Compare with a previous scan. Load the report of your main branch or of the last release as a baseline. Every warning is tagged new, unchanged or fixed. Brakeman fingerprints do not depend on line numbers, so code that only moved is not reported as new.

    # On main
    brakeman -q --no-exit-on-warn -o baseline.json
    # On your branch
    brakeman -q --no-exit-on-warn -o brakeman-report.json
  2. Triage each warning. Open a warning and set its status: To fix, False positive or Accepted risk, with a note explaining why, and its severity for your application. The location (Controller#action), the user input highlighted in the code snippet and the CWE / OWASP Top 10:2025 category help you decide. Set Links to your code to open each file at the right line in VS Code or on GitHub / GitLab.

    Narrow the list by type, folder or triage status and sort it by severity or by file. The filters are kept in the page address, so a view can be bookmarked; the part of the address holding them is never sent to any server.

  3. Export config/brakeman.ignore. False positives and accepted risks are written in Brakeman's own ignore format, with your note as justification. Brakeman's JSON report does not include the notes of already ignored warnings, so load your current config/brakeman.ignore first: its entries and notes are kept as they are in the export.

    # Replace the ignore file, review the diff, commit it
    mv ~/Downloads/brakeman.ignore config/brakeman.ignore
    git diff config/brakeman.ignore

100% client-side privacy guarantee

Security reports reveal file paths, code snippets and weaknesses of your application. Unlike hosted platforms, this visualizer has no backend, so you can use it on confidential client projects:

  • Zero report data sent to any server: the file is read with the browser FileReader API and never uploaded, stored or logged.
  • All parsing happens locally: JSON parsing, scoring, filtering and remediation guidance run entirely in JavaScript on your device.
  • The report never persists: reports, baselines and ignore files are never written to cookies or browser storage. Closing or reloading the tab clears them from memory.
  • Only your triage decisions are kept, in this browser: the status, severity and note you give a warning are saved in local storage, keyed by the warning fingerprint (a hash computed by Brakeman). They are dropped once the warning appears in config/brakeman.ignore. Use Reset triage to delete them all. The code link setting (editor and project path or repository URL) is saved the same way.
  • Exports are generated locally: the brakeman.ignore file is built in JavaScript and downloaded straight from the page.
  • Verifiable: once the page is loaded, you can disconnect from the network and the dashboard keeps working.

Understanding confidence levels and the Security Index

Brakeman assigns a confidence level to each warning. It expresses how certain Brakeman is that the warning is a real vulnerability, not how severe the vulnerability would be.

High
User input flows directly into a dangerous method, for example params interpolated into a SQL query. Treat it as a confirmed issue and fix it first.
Medium
A dangerous pattern uses a value that is probably, but not certainly, user-controlled, such as a model attribute rendered without escaping. Review it carefully.
Weak
A risky construct was found but Brakeman could not link it to user input. It is often a false positive, yet still worth a quick review.

How the Security Index is calculated

The Security Index starts at 100 and deducts points for each active warning. Warnings muted in config/brakeman.ignore and warnings you triaged as false positive are listed but not scored. The score never drops below 0.

Confidence is not severity: when you set a severity on a warning during triage, it replaces the confidence in the calculation.

Points deducted per active warning
Severity set in triage Otherwise, Brakeman confidence Deduction
Critical—−15 points
HighHigh−10 points
MediumMedium−4 points
LowWeak−1 point
Grades associated with the score
Score Grade Meaning
95 – 100A+Excellent posture
90 – 94AVery secure
80 – 89BMinor warnings
70 – 79CAction required
50 – 69DVulnerable profile
0 – 49FCritical issues present

Common Rails vulnerabilities detected by Brakeman

SQL Injection

User input interpolated into ActiveRecord query strings, like where("name = '#{params[:name]}'"). Use hash conditions or ? placeholders instead.

Remote Code Execution

User-controlled values passed to eval, constantize or unsafe deserialization, allowing attackers to run arbitrary Ruby code on the server.

Mass Assignment

Request parameters assigned to models without Strong Parameters, or with permit!, letting attackers overwrite attributes they should not control.

Cross-Site Scripting (XSS)

Unescaped output in views through raw or html_safe, enabling script injection into your users' browsers.

Command Injection

User parameters passed to system, exec, %x or Open3 without shell escaping, letting attackers run arbitrary operating system commands. Pass arguments as an array instead of a single string.

Brakeman also detects open redirects, dynamic render paths, unsafe file access and many more. See the full list of Brakeman warning types (opens in new window).

Frequently asked questions

Is my Brakeman report uploaded to a server?

No. The report is read and parsed entirely in your browser. No report data is sent to any server, stored or logged.

Which Brakeman output format does the visualizer accept?

The visualizer accepts the standard Brakeman JSON report, generated with brakeman -o brakeman-report.json or brakeman -f json. The file must contain a warnings or ignored_warnings array.

How are ignored warnings handled?

Warnings muted in config/brakeman.ignore appear under the Ignored filter. They are excluded from the confidence counters and the Security Index. Brakeman's JSON report does not include their justification notes: load your config/brakeman.ignore in the Triage card to display them.

How does the comparison between two scans work?

Load an older report as baseline. Warnings are matched by their Brakeman fingerprint, which does not depend on line numbers: a warning that only moved in the file stays unchanged, a warning missing from the new report is marked as fixed.

Where are my triage decisions stored?

In your browser's local storage only, keyed by warning fingerprint: the status and the note you typed, never the report. They are not sent anywhere. The Reset triage button deletes them.

Can I edit config/brakeman.ignore from the visualizer?

Yes. Mark warnings as false positive or accepted risk, then export brakeman.ignore. The file uses Brakeman's format and keeps every entry of your current ignore file when you load it first, so you can replace config/brakeman.ignore and review the change with git diff.

Is Brakeman confidence the same as severity?

No. Confidence indicates how likely a warning is to be a real issue. A Weak confidence SQL injection can still be critical if it turns out to be exploitable.

Does a perfect Security Index mean my Rails application is secure?

No. Brakeman is a static analysis tool: it cannot detect business logic flaws, misconfigured infrastructure or vulnerable dependencies. Combine it with bundler-audit, code reviews and penetration testing.

Can I try the dashboard without a report?

Yes. Click Load Sample Report to open a realistic example report with High, Medium and Weak confidence warnings, plus an ignored warning. Then click Use sample baseline to try the comparison between two scans.