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 · SVG viewer · Mermaid viewer · JSON viewer · JUnit XML viewer · SARIF viewer · npm audit viewer · pip-audit viewer · Trivy viewer · Terraform plan viewer · Checkov viewer · Coverage viewer
- Convert it: HTML to PDF · HTML to image · HTML inliner · Markdown to HTML · HTML to Markdown · Excel to HTML table · CSV to HTML table · CSV to chart · JSON to HTML table · JSON to chart · HTML table to CSV · Sortable HTML table · Markdown table generator · CSV to JSON · JSON to CSV · YAML to JSON · XML to JSON
- Clean it up: HTML formatter · JSON formatter · HTML diff · JSON diff · YAML diff
- Encode or decode it: HTML escape · URL encoder · Image to Base64 · JWT decoder · Cron explainer
See it
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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)
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)
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
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
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
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
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
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
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
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
For markup you need to show rather than render, and for text that arrived
with <p> 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
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
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
- Open an HTML file online — the article version of the viewer
- Share an HTML report — publishing walkthrough
- Host an HTML file — when you need a URL, not a preview
- Fix a report with broken CSS — assets missing after upload
- Report types — the publishing guide for every tool that emits HTML