Skip to content

Files & data

TweakCSV

A spreadsheet-grade CSV editor that runs in a tab, for the files you shouldn't upload to a stranger's server.

Runs at
forhadkhan.github.io
Cost
Free · MIT licensed
Your data
Stays in your browser
React AG Grid Papa Parse IndexedDB

Open a CSV in Excel and it mangles the thing. Leading zeros drop off postcodes, long numbers turn into scientific notation, and dates get reinterpreted according to whatever locale the machine is set to. Open it in an online editor instead and you’ve uploaded the file to someone’s server.

TweakCSV is the third option: a real grid, in your browser, file staying on your machine.

What it does

Drag a CSV in and edit cells directly in an AG Grid table, the same grid component that shows up in a lot of commercial data tools. Sort and filter per column, find and replace across the sheet, undo and redo. Several files at once in a tabbed workspace.

Ctrl+S writes back to the file on disk through the File System Access API where the browser supports it, and you get an unsaved-changes warning before closing a tab. Export goes to CSV, Excel, JSON or a Markdown table, and there’s a dark theme.

That Markdown export is the feature I actually built it for. Turning a spreadsheet into documentation is a routine job with no good tool anywhere.

Your data doesn’t move

Parsing happens in the page through Papa Parse, state lives in IndexedDB in your browser, and there’s no server component at all. The whole app is static files on GitHub Pages, and it makes no network request with your file in it.

For CSVs specifically that’s the point rather than a nicety. Exports from a CRM, a payment processor or a WooCommerce store routinely carry customer names, addresses and email addresses. Uploading that to a free online converter is a data-protection problem and frequently a contractual one too.

Open the network tab and confirm it for yourself. Nothing goes out.

How it’s built

React and Vite, with AG Grid for the table, Papa Parse for CSV, SheetJS for the Excel export and IndexedDB for persistence.

Unlike LiveMarkup and LiveMarkdown, this one genuinely needs a framework. Editable grids with sorting, filtering and undo are a real state-management problem, and hand-rolling that in vanilla JS would have been worse code and a lot more of it. Reaching for AG Grid is the only reason the project took a weekend instead of a month.

Where it struggles

Large files will strain it, since everything sits in memory and renders through a browser grid. Tens of thousands of rows are fine. Millions are not, and you want a real database or csvkit at that point.

Ctrl+S needs the File System Access API, so a Chromium browser. Firefox and Safari fall back to a download. Import is CSV only, with Excel as an export target rather than an input. And there are no formulas, because this is a data editor rather than a spreadsheet and there’s no calculation engine in it.

Three things people ask

Unusual delimiters are generally fine. Papa Parse auto-detects the common ones including semicolons and tabs, which covers most European exports.

State persists in IndexedDB, so reopening the tab usually restores what you had. Clearing site data removes it. Save or export anything important, though the original file on disk stays untouched unless you explicitly save over it.

And yes, the case it’s built for is exactly the work machine with data you’re not allowed to upload. Nothing is transmitted. Verify that in the network tab yourself before relying on it, because you shouldn’t take a stranger’s word about your own compliance obligations.