Free tool · runs in your browser
Bookmark export converter
Point it at a CSV or JSON export, check the column mapping it guessed, and get Markdown, CSV or JSON out. The file is read by this page and stays in this tab — the download is a Blob built in your browser, not a file fetched from a server.
- RFC 4180 CSV parsing
- Editable column mapping
- Download via Blob
Convert an export
Three steps: load, map, convert. Row and column counts are announced as they change.
1 · Your export
CSV or JSON. The file is never uploaded — this box and the file picker both stay local.
Nothing loaded yet.
Why the CSV parser matters here more than usual
A bookmark export is mostly post text, and post text is the worst possible CSV payload. It contains commas. It contains quotation marks. It contains newlines, because people write multi-line posts. Split a file like that on commas and newlines and you do not get an error — you get a table that looks plausible and is quietly wrong, with one post spread across four rows and a column of fragments.
So this reads CSV as a character-at-a-time state machine over RFC 4180. A field may be quoted; inside quotes, a doubled quote is a literal quote and the delimiter, carriage returns and newlines are all just data. Outside quotes, \n, \r\n and a bare \r all end a row. A leading byte-order mark — Excel writes one — is stripped, a trailing newline does not produce a phantom empty row, and a row whose field count does not match the header is reported rather than silently reshaped.
- Quoted fields
- `"a,b"` is one field containing a comma
- Escaped quotes
- `"he said ""hi"""` becomes `he said "hi"`
- Embedded newlines
- A quoted field may span lines; the row does not end there
- Line endings
- LF, CRLF and bare CR
- Delimiters
- Comma, tab, semicolon or pipe, sniffed outside quoted regions
- BOM
- Stripped before parsing
- Ragged rows
- Counted and reported; missing fields read as empty
Delimiter sniffing, not guessing
"CSV" from a European locale is often semicolon-separated, and spreadsheets export tabs. The delimiter is chosen by counting candidates outside quoted regions across the first few lines and preferring the one whose per-line count is consistent — so a post full of commas cannot outvote a genuine tab-separated file. You can override the choice if the sniff gets it wrong.
Column mapping is shown, never applied silently
Every export names its columns differently: full_text, text, content, tweet. The tool guesses a mapping from the column names and then shows you exactly what it guessed, as seven dropdowns you can change. Only the fields you map appear in the output, so an export with no category column produces output with no category field rather than an empty one. Nested JSON is flattened into dotted columns — author.username becomes its own selectable column — and arrays are joined with commas.
The three output shapes
- Markdown, bullet list. One bullet per bookmark with the handle, date, tags and canonical link underneath. Drops straight into a notes app.
- Markdown, grouped by category. An
h2per category, then its bookmarks. Useful when the export already has folders or categories. - Markdown table. Pipes are escaped and newlines become
<br>, because an unescaped pipe silently destroys a Markdown table. - CSV. Written back out RFC 4180-correct with CRLF endings, quoting only the fields that need it, so it round-trips through this same reader.
- JSON. A flat array of objects with only the mapped keys.
Caveats
- It converts, it does not fetch. This tool has no access to your X account, so it can only work on a file you already have. Getting that file is the part that needs the API.
- Big files are limited by your tab, not by us. Everything is in memory, so the practical ceiling is a few tens of megabytes. Files over 20 MB are refused rather than allowed to freeze the page.
- Dates are passed through unchanged. We do not reformat or re-timezone them, because guessing wrong about a date is worse than leaving it as the source had it.
- Links should stay canonical. If your export has an
x.compermalink column, map it — a saved post without a link back to the original is much less useful, and keeping the canonical link is a requirement anywhere X content is displayed.
If your export came from Sift, note that we cap user-initiated exports at 500 objects per day — that is X's developer policy, not our choice. The cost calculator explains the other side of the same coin: why the data was expensive to obtain in the first place.
Nothing you paste or open is uploaded.
The file picker hands the page a File object; the page reads it and holds the text in memory. The download is a Blob and an object URL created in your browser. There is no upload endpoint on this page to send it to. You can confirm it: open your browser's network panel and use the tool. The only requests you will see are for this page's own code and for pages you might click to next — none of them carries what you typed.
Other free tools
- X post character counterCounts a post the way X does — links are 23 characters, emoji and CJK count double.
- Thread splitterPaste long text and get a numbered thread split on sentence boundaries, never mid-word.
- Bookmark sync cost calculatorWhat reading N bookmarks actually costs on X's pay-per-use API, at the current published rates.
- X archive explorerOpen your official X data archive and search your posts and likes locally. Nothing leaves the tab.
Built by the people who sort your bookmarks for you
Sift imports your X bookmarks, sorts them into categories and emails you a digest. The free plan imports your newest 100 bookmarks — a cap, not a trial, because reading them costs real money.