What's new
Changelog
Every update to csvdiff.app — new features, improvements, and fixes. Shipped continuously, documented here.
Join CSV files on a shared key
Open several CSV or JSON files as tabs, then join two of them on a shared key column — the browser equivalent of a VLOOKUP or a SQL join, with no formulas and no database. Pick inner, left, right, or outer to control what happens to unmatched rows, filter and chart the combined table, and export it as CSV or JSON. Like everything else, it runs entirely in your browser — nothing is uploaded. It lives at its own page now: /join-csv-files.
Clean messy columns with AI
Describe how you want a column tidied — in plain English — and AI turns it into a reusable find/replace rule. Strip Excel's ="…" formula wrappers, drop leading apostrophes, remove currency symbols and commas, trim stray whitespace, and more. You see a before → after preview on your real values before anything changes, and the rule applies to every cell and carries through to export. Like everything else, the request runs directly from your browser to your own AI key — no upload, no account.
Chart your data
A new Chart button opens any table as a bar, donut, or line chart — picked automatically from the shape of your columns. It plots the rows you're currently looking at, so filters and sorts carry through, and each chart comes with a plain-English one-line takeaway (which category leads, the trend over time, the split of a total). Everything renders in the browser like the rest of the viewer — no upload, no account.
Encoding detection & conversion
The viewer now detects the byte encoding of an uploaded file from its BOM — UTF-8, UTF-8 with BOM, or UTF-16 LE — and shows it as a badge in the header. On download you can re-encode to any of them from the export sheet. This also fixes a latent bug where UTF-16 files were mangled on open because the reader always assumed UTF-8.
JSON files export back as JSON
Open a .json file in the viewer, clean or edit it, and the download now round-trips to valid JSON — nested objects and arrays rebuilt — instead of silently becoming a CSV. The encoding picker is hidden for JSON, which is always UTF-8.
| id | name | role |
|---|---|---|
| 1 | Ada Khan | eng |
| 2 | Sara Malik | design |
[
{ "id": "1",
"name": "Ada Khan",
"role": "eng" },
{ "id": "2",
"name": "Sara Malik",
"role": "design" }
]Per-column text wrap
Wrap long text within a single column instead of truncating it, straight from the column menu (···). Handy for notes, descriptions, or any free-text field — the rest of the table stays compact.
Redesigned product pages
The Compare and View landing pages now each get their own feature grid tuned to what that tool actually does — merge & resolve for diff, clean & search for the viewer — plus a matching "how it works" flow and a smooth transition into the table.
Clean HTML & Render HTML column formats
Two new column format types for HTML-heavy data. Clean HTML strips tags and decodes entities to give you plain readable text. Render HTML displays the formatted output inline — auto-detected when a column contains markup. Both show in the Format menu (···) and respect the export formatted toggle.
Tech lead on the billing rewrite. Mentoring two junior engineers; up for promotion in Q3.
Tech lead on the billing rewrite. Mentoring two junior engineers; up for promotion in Q3.
Row preview: Render HTML & Show image toggles
In the row preview panel, HTML fields now show a "Render HTML / Show code" toggle. Image fields always show the toggle — even when the column is globally set to render as images — so you can quickly flip between the URL and the rendered image.
Column filters: text contains & numeric range
Filter high-cardinality columns like name or email by typing a substring. For numeric columns like salary or score, set a min/max range — csvdiff auto-detects numeric columns and switches to range mode.
2 values matched
"ayesha"7 values in range
50000 – 120000Blanks filter
Find rows with empty cells in any column. The blank entry now appears as a regular checkbox row at the top of the value list — consistent with the rest of the filter UI.
Export review in CSV Diff
The Review & Export sheet is now available in the diff tool. Preview resolved rows, toggle columns, and exclude rows before downloading the merged CSV.
| id | name | dept | salary | |
|---|---|---|---|---|
| 1 | Sara Ahmed | product | 98000 | |
| 2 | Usman Tariq | engineering | 130000 | |
| 3 | Hina Malik | product | 95000 |
Column stats bar
Click any column header in the viewer to see inline stats: unique count, blank count, min, max, and average for numeric columns — all computed client-side.
Ask your data
Use natural language to query your CSV. Ask "show rows where salary > 100k" or "which department has the most employees" and get instant answers — powered by your own API key, no data leaves the browser.
Group rows by department → Average salary per group → Sort descending
| department | avg_salary |
|---|---|
| engineering | $131,500 |
| product | $109,333 |
| data | $96,500 |
Dark mode
Full dark mode across the diff tool, viewer, and blog — respects system preference and can be toggled manually.
| name | department | salary |
|---|---|---|
| Sara Ahmed | product | 98000 |
| Usman Tariq | engineering | 130000 |
| Hina Malik | product | 95000 |
| name | department | salary |
|---|---|---|
| Sara Ahmed | product | 98000 |
| Usman Tariq | engineering | 130000 |
| Hina Malik | product | 95000 |
Color rules
Highlight cells based on rules: heatmap by value, category colors, above average, empty cells, or duplicates. Rules persist to export.
| name | department | salary |
|---|---|---|
| Sara Ahmed | product | $98,000 |
| Usman Tariq | engineering | $130,000 |
| Hina Malik | product | $95,000 |
| Zain Ali | data | $87,000 |
| John Smith | engineering | $155,000 |
Fill blanks & fill down
Fill empty cells from the cell above — useful for pivot-style exports where groups repeat only in the first row.
| region | name | sales |
|---|---|---|
| North | Alice | 12000 |
| empty | Bob | 8500 |
| empty | Carol | 11200 |
| South | Dave | 9800 |
| empty | Eve | 14300 |
| region | name | sales |
|---|---|---|
| North | Alice | 12000 |
| North | Bob | 8500 |
| North | Carol | 11200 |
| South | Dave | 9800 |
| South | Eve | 14300 |
Column formats
Format numeric columns as currency, percentage, or with custom decimal places. Format date columns to any locale. AI can suggest the right format for your column.
Bulk find & replace
Select values in a column filter and replace all matching cells in one click. Preview affected cells before applying.
CSV Diff — initial launch
Compare two CSV or JSON files side by side. Match rows by key column, filter to changed rows, resolve per-cell conflicts, and export a merged file. 100% client-side.
| Status | id | name | salary | department |
|---|---|---|---|---|
| Modified | 1 | Sara Ahmed | 92000→98000 | product |
| Added | 2 | Usman Tariq | 130000 | engineering |
| Removed | 3 | Old Employee | 75000 | data |
| Unchanged | 4 | Hina Malik | 95000 | product |
CSV Viewer — initial launch
Open a single CSV or JSON file as a clean paginated table. Search, sort, pin columns, hide columns, and export. No upload, no account.
| id | name | department | salary | |
|---|---|---|---|---|
| 1 | Sara Ahmed | sara@acme.co | product | 98000 |
| 2 | Usman Tariq | usman@acme.co | engineering | 130000 |
| 3 | Hina Malik | hina@acme.co | product | 95000 |
| 4 | Zain Ali | zain@acme.co | data | 87000 |