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
Currently displaying the Sample ReportTotal Warnings
High Confidence
Medium Confidence
Weak Confidence
Security Index
Excellent posture
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.
Compared with the scan of N/A.
- 0 new
- 0 fixed
- 0 unchanged
Triage and brakeman.ignore
0 of 0 active warnings triaged
Links to your code
Open each warning's file at the right line, in your editor or on your repository.
Identified Vulnerabilities
0 foundWhen 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.
-
Install the gem globally, or add it to the
developmentgroup of yourGemfile(Rails 7.2+ applications ship with it by default):gem install brakeman -
From the root of your Rails application, run a scan and write the results to a JSON file. The format is inferred from the
.jsonextension:brakeman -o brakeman-report.json -
Drop
brakeman-report.jsoninto 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:
-
Compare with a previous scan. Load the report of your
mainbranch 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 -
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.
-
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 currentconfig/brakeman.ignorefirst: 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
FileReaderAPI 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.ignorefile 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
paramsinterpolated 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.
| Severity set in triage | Otherwise, Brakeman confidence | Deduction |
|---|---|---|
| Critical | — | −15 points |
| High | High | −10 points |
| Medium | Medium | −4 points |
| Low | Weak | −1 point |
| Score | Grade | Meaning |
|---|---|---|
| 95 – 100 | A+ | Excellent posture |
| 90 – 94 | A | Very secure |
| 80 – 89 | B | Minor warnings |
| 70 – 79 | C | Action required |
| 50 – 69 | D | Vulnerable profile |
| 0 – 49 | F | Critical 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.