Free tools

Small, focused browser tools for the moment you have a file and no good way to show it to anyone. They run entirely on your machine — nothing is uploaded unless you ask for a link.

See it

HTML viewer

Open the HTML viewer →

Paste HTML or drop an .html file and watch it render — CSS, JavaScript and charts included — in a sandboxed preview at desktop, tablet and mobile widths. This is the fastest way to check what a build artifact, a coverage report or an AI-generated page actually looks like before you send it on.

SVG viewer

Open the SVG viewer →

Paste SVG code or drop an .svg file and see it on a transparent, light or dark background, with the width, height and viewBox it actually declares and the first XML parse error if there is one. Export it to PNG at 1×, 2× or 4×, or copy it as a data URI. The file is loaded as an image, so any script inside it never runs.

Mermaid viewer

Open the Mermaid viewer →

Paste Mermaid code — or the whole fenced block an agent put in its reply — and watch the flowchart, sequence, class, ER, Gantt, pie or mindmap diagram draw as you type. A syntax error names the line while the last good render stays on screen; switch between the default, neutral, forest and dark themes, then download it as SVG or PNG, or publish it with the source kept underneath.

JSON viewer

Open the JSON viewer →

For a response too big to read as text. Browse it as a collapsible tree with child counts, search keys and values and watch only the matching branches open, then click any node to copy its JSONPath ($.checks[2].error) or the accessor you paste into JavaScript or jq. NDJSON is read as an array, and the shared link is the same folding tree built from plain HTML.

JUnit XML viewer

Open the JUnit XML viewer →

For the junit.xml or TEST-*.xml that CI left behind with no report. Drop it in and read the pass rate, every failure and error with its message and stack trace, the flaky tests Surefire retried, the slowest tests and each suite. Counts come from the test cases themselves, so a truncated run is flagged. Copy a Markdown summary for the pull request, or publish the report and put the link there instead.

SARIF viewer

Open the SARIF viewer →

For the .sarif file CodeQL, Semgrep, Trivy, Checkov or Snyk wrote, when the person who needs it can't open your code scanning tab. Drop it in and read the findings grouped by rule — severity from the security-severity score the way GitHub buckets it, the rule's description and docs link, and each finding's file, line, message and snippet. Suppressed results are counted, not listed. Copy a Markdown table for the pull request, or publish the report as a link.

npm audit viewer

Open the npm audit viewer →

For the JSON npm audit --json, pnpm audit --json or yarn audit --json wrote, when the terminal table has scrolled away and someone has to decide what to upgrade. Drop it in and read each GitHub advisory once — severity, CVSS, CWE and vulnerable range — with the transitive packages it reaches and what fixes it: npm audit fix, a breaking upgrade, or no patch yet. Copy a Markdown table for the pull request, or publish the report as a link.

pip-audit viewer

Open the pip-audit viewer →

For the JSON pip-audit -f json or osv-scanner --format json wrote, when a Python dependency scan needs a decision from someone who will not read CI logs. Drop it in and read each advisory once under its GHSA id, with CVE and PYSEC aliases, the vulnerable range and the version that fixes it. OSV-Scanner's CVSS score sets the severity; pip-audit's JSON has none, so those advisories are marked Unrated rather than guessed. Copy a Markdown table for the pull request, or publish the report as a link.

Trivy viewer

Open the Trivy viewer →

For the JSON trivy image --format json or grype -o json wrote, when an image scan printed hundreds of rows and someone has to decide whether it ships. Drop it in and read every CVE against the installed package — OS layer and lockfiles together — with the scanner's severity, the CVSS score and the version that fixes it. Distro CVEs marked will_not_fix or wont-fix read "No fix yet" instead of looking like an upgrade you forgot. Copy a Markdown table for the pull request, or publish the report as a link.

Terraform plan viewer

Open the Terraform plan viewer →

For the JSON terraform show -json tfplan (or tofu show -json) wrote, when a plan ran to two thousand lines and someone who can't run Terraform has to approve it. Every destroy and replace is listed first, with the reason in plain words. Then each update and create opens to a before/after table, and the attribute that forces a replacement is flagged. Sensitive values stay masked. Drift and output changes get their own sections. Copy a Markdown summary for the pull request, or publish the plan as a link.

Checkov report viewer

Open the Checkov report viewer →

For the JSON checkov -o json, tfsec --format json, trivy config or KICS wrote, when an IaC scan failed fifty checks in CI and the person who has to accept the risk will never read the job log. Every failed check is grouped by policy with its guideline link, and each resource shows its file, line and code block. Skipped and passed checks are counted, so the report says what was waived and how much was tested. Copy a Markdown table for the pull request, or publish the report as a link.

Code coverage viewer

Open the coverage viewer →

For the lcov.info, Cobertura coverage.xml or clover.xml your test run wrote, when nobody has genhtml installed or a seat in your coverage service. Drop it in and read line, branch and function coverage, a roll-up per directory, and every file sorted least-covered first with its uncovered line ranges. Percentages are recounted from the line-level records, and the same file repeated across LCOV runs is merged. Copy a Markdown summary for the pull request, or publish the report as a link.

Convert between formats

HTML to PDF

Open the HTML to PDF converter →

Paste HTML or drop an .html file, pick A4, Letter, Legal, A3 or A5 in portrait or landscape, and save it as a PDF with your browser's own engine — no server-side conversion, nothing uploaded. Background colors are kept, table rows and charts aren't sliced across page breaks, and anything matching a selector you give it (navigation, buttons, .no-print) is left out.

HTML to image

Open the HTML to image converter →

Paste HTML or drop an .html file and capture it as a PNG or JPEG — a 1200×630 social card, or a full-page screenshot at desktop, laptop, tablet or phone width, at 1×, 2× or 3×. The page's scripts run first, so canvas and SVG charts are in the image. Copy it to the clipboard or download it; the rendering happens in your tab, nothing is uploaded.

HTML inliner

Open the HTML inliner →

Drop the folder a report or build wrote — index.html plus its css/, js/ and img/ — and get one self-contained .html back, with every stylesheet, script, image and font embedded. Paths inside CSS resolve relative to the stylesheet, @import chains are flattened, CDN links are left as they are, and anything the page references but the folder lacks is listed. This is the fix for the page that loses its styles and pictures the moment you email it.

Markdown to HTML

Open the Markdown converter →

Paste Markdown or drop a .md file and get clean HTML: GitHub-flavored tables, fenced code blocks, lists, blockquotes, links and ```mermaid diagrams. Copy the fragment for a CMS or an email, download a standalone styled page, or publish it as a link. Useful for the output of an agent run, a meeting summary, or a README you need a non-Git audience to read.

HTML to Markdown

Open the HTML converter →

The same conversion in reverse, for when you already have HTML — an export, a page you saved, the output of a WYSIWYG editor — and need it back in the format READMEs, tickets and agent prompts speak. Structure survives: headings, nested lists, code blocks with their language, links, images and tables as pipe rows. Styling does not, which is exactly when you should publish the HTML instead.

Excel to HTML table

Open the Excel converter →

Drop an .xlsx, .xls or .ods workbook and get a clean HTML table without saving each sheet as CSV first. Values come through as Excel displays them — currency, percentages, dates — and you can convert one sheet or put every sheet on one page. The workbook is parsed in your browser; publish the result and it opens on any phone, no Excel required.

CSV to chart

Open the chart maker →

Paste a CSV or a spreadsheet range and get a bar, horizontal bar, line or pie chart. Currency, thousands separators and percentages are read as numbers, and the chart is plain SVG with no library or script — so it drops into a slide, works in email, and stays crisp in a published Comma link where readers comment on the bar they mean.

JSON to chart

Open the JSON chart maker →

Paste an API response, an array of objects or a Chart.js config and get a bar, line or pie chart without opening a notebook. {"data": [...]} envelopes are unwrapped, nested fields flatten to dot paths, and numbers stored as strings are read as numbers. Same static SVG as the CSV chart maker — publish it and readers comment on the bar they mean.

Sortable HTML table

Open the sortable table generator →

Paste a table, a whole page or a CSV and every table gets click-to-sort headers — money, percentages and dates order by value, not alphabetically — plus an optional filter box and sticky header. It is one small inline script with no library, so it keeps working from disk, in a CMS, and in a published Comma link.

CSV to HTML table

Open the CSV converter →

Paste CSV, TSV, or a range copied straight out of Excel or Google Sheets — the delimiter is detected for you — and get a clean HTML table with quoted fields handled properly, numeric columns right-aligned, and an optional stylesheet. Copy the markup for a page, take the Markdown version for a pull request, or publish it so people can comment on a specific row instead of describing it.

JSON to HTML table

Open the JSON converter →

Paste an API response, a JSON array or a file of NDJSON records and get a table a person can read: keys become columns in a stable order, nested objects flatten to owner.name dot paths, envelopes like {"data": [...]} are unwrapped, and a record missing a field leaves an empty cell instead of shifting the row. The fastest way to turn an agent's output or an endpoint's payload into something you can send to someone who does not read JSON.

HTML table to CSV

Open the table extractor →

The way back out. Paste a page — a report, a wiki, a BI export — and every <table> in it is found for you; pick one and take RFC 4180 CSV for Excel and Google Sheets, TSV that pastes straight into a cell, a Markdown pipe table, or JSON records for a script. The markup is parsed inertly: scripts never run and nothing is fetched.

Markdown table generator

Open the table generator →

Type into a grid, or paste a range from Excel or Google Sheets, a CSV, or a Markdown table that needs fixing. Set each column's alignment and copy a padded pipe table that lines up in the source as well as in the render — pipes inside cells escaped, line breaks written as <br> — or the same table as HTML.

CSV to JSON

Open the CSV to JSON converter →

For the export that has to become a fixture, a seed file or an API payload. Get an array of objects, arrays, a column map or NDJSON; numbers and booleans come out typed, but ZIP codes with leading zeros and IDs too long for a JavaScript number stay strings, customer.name headers become nested objects, and blank or duplicate headers are renamed instead of overwriting each other.

JSON to CSV

Open the JSON to CSV converter →

For the API response or agent output that someone wants in a spreadsheet. Nested objects become customer.name columns, the header is every key from every record rather than just the first one's, {"data": […]} envelopes and JSON Lines are unwrapped, and the download carries a UTF-8 BOM so Excel doesn't mangle accents — with a semicolon delimiter for European Excel and an optional guard against formula injection.

YAML to JSON (and back)

Open the YAML converter →

For the workflow, manifest or OpenAPI spec that is in the format your tool doesn't read. YAML is parsed by the 1.2 rules, so no stays Norway and a bare date stays the text you typed; multi-document streams become a JSON array; anchors and merge keys are resolved. Swap direction and the output becomes the input, which is the quickest round-trip check there is. A syntax error comes back with its line, column and reason.

XML to JSON (and back)

Open the XML converter →

For the SOAP response, RSS feed, Maven POM or legacy export that has to reach code that only reads JSON. Attributes become @keys, text beside child elements goes under #text, and repeated elements become arrays — with an "always use arrays" switch so a record with one <item> has the same shape as one with five. Namespace prefixes are kept or stripped, 00417 stays a string, and malformed XML comes back with the parser's error. Swap direction to write JSON back out as XML in the same convention.

Clean up, compare and validate

HTML formatter and minifier

Open the formatter →

For the blob that arrived on one line. Re-indent it with two spaces, four spaces or a tab and read the structure again — or go the other way and minify it back down, with comments stripped if you want them gone. Whitespace inside <pre>, <code>, <script>, <style> and <textarea> is left byte for byte, and markup that is already broken is left broken rather than silently re-nested somewhere you didn't intend.

JSON formatter and validator

Open the JSON formatter →

The same idea for the payload a parser just rejected. Beautify with two spaces, four spaces or a tab, minify back to a single line, or sort keys recursively so two exports of the same object diff down to the field that really changed. When it does not parse you get the line, the column, the offending line with a caret under the character, and a plain-English guess at which of the five usual mistakes it was — a trailing comma, single quotes, an unquoted key, a Python True/None, or a comment.

HTML diff

Open the diff →

Two versions, one question: what changed. Paste both and the differences show line by line with numbers on each side, unchanged stretches collapsed to three lines of context, and the result available as a unified patch. Minified markup is normalized with the same formatter first, so a re-indent doesn't report every line as changed and bury the one number that moved. Works on Markdown, CSV, JSON and plain text too.

JSON diff

Open the JSON diff →

For two configs or two API responses, where a line diff reports everything because the keys came back in another order. This compares the parsed data: every added, removed and changed path ($.replicas 2 → 6), with arrays of records matched by their id so an insert at the top is one addition, not a shifted list. The same difference comes out as an RFC 6902 JSON Patch you can apply.

YAML diff

Open the YAML diff →

For Helm values, Kubernetes manifests, Compose files and CI workflows, where reordered keys, edited comments, quote style and anchors make a text diff unreadable. Both files are parsed (YAML 1.2, merge keys and multi-document streams included) and compared as data: every changed key path, anchors expanded, env and containers lists matched by name, and a JSON Patch ready for kubectl patch --type=json.

Encode and decode

JWT decoder

Open the JWT decoder →

For the Bearer token behind a 401. Paste it and read the header and payload as formatted JSON, with iss, sub, aud and the exp/nbf/iat timestamps laid out as dates and how long until — or since — the token expires. Decoding happens in your browser and the token is never sent anywhere; signatures are deliberately not verified, because that needs a key you shouldn't paste into a web page.

Cron expression explainer

Open the cron explainer →

For the schedule in a crontab, a GitHub Actions on.schedule block or a Kubernetes CronJob that nobody can read at a glance. Paste 0 */6 * * 1-5 and get "At minute 0 past every 6th hour on Monday through Friday", a breakdown of all five fields, and the next eight runs in UTC or your own time zone. It catches the rule that surprises everyone — when both day fields are set, cron runs on days matching either — and says so when it sees Quartz-only syntax (a seconds field, ?, L, W, #) instead of guessing.

HTML escape and unescape

Open the escape tool →

For markup you need to show rather than render, and for text that arrived with &lt;p&gt; baked into it. Encode & < > " ' as entity references, or decode named, decimal and hexadecimal references back to the characters they stand for. Non-ASCII escaping is a toggle, and a counter tells you how many references are left — which is how you find out a string was double-escaped somewhere upstream.

URL encoder and decoder

Open the URL encoder →

For the link that broke on a space, and for the 400-character tracking URL nobody can read. Percent-encode a single query value or a whole URL — the distinction that decides whether an ampersand inside a value quietly becomes a second parameter — or decode %20 and %E2%80%99 back to text, one escape at a time so a malformed one stays visible instead of failing the string. Absolute URLs are broken down into scheme, host, path and a table of decoded query parameters.

Image to Base64

Open the Base64 converter →

The fix for a report whose images all break the moment you send it. Drop a PNG, JPEG, GIF, WebP, AVIF or SVG and get a data URI, a ready <img> tag with real dimensions, a CSS background-image rule, or a Markdown image — so the picture travels inside the document instead of pointing at a file that stayed on your machine. Paste Base64 to go the other way and download the file. Past a few hundred kilobytes it tells you to publish the image instead, because a data URI can't be cached.

Why the link is better than the file

Every tool here ends with the same option: turn what you're looking at into a Comma report.

  • One URL, not an attachment. Nobody has to download anything, unzip anything, or trust that their machine renders it the same way yours did.
  • Comments anchored in place. Readers select a paragraph, a table row or a chart and comment there, instead of writing "third chart, second bar" in a chat thread.
  • Revisions. Publish again and the old version is kept, so you can see what moved between Tuesday and Friday.
  • Access you control. Private, invite-only, or open to anyone with the link — changeable after the fact.

Comma is free: unlimited reports, unlimited commenters, no seat count.

Related