RosettaData Format Swiss-Army
What it does for you
Paste or drop JSON, CSV, YAML, TSV or JSON Lines, get the format detected, errors pinned to a line and column, and a clean conversion to any of the others.

Screenshots

In more detail
Rosetta is a browser tool that takes JSON, CSV, YAML, TSV, or JSON Lines, tells you what format it is, and converts it to any of the others. When the input is broken, it points at the exact line and column instead of just saying "parse error." It runs offline, so your data stays on your machine.
Honest limits
Everything converts on the main thread, so a very large file will freeze the page. The YAML parser is a subset: anchors and multi-document files are rejected with a clear error, not supported. I assumed YAML 1.2 rules, so yes and no stay strings in YAML while CSV inference treats them as booleans. It's tested with automated checks and screenshots, not hammered with real-world messy files.
How I built it
This was part of the bulk one-shot night. Claude Code built it from the shared brief (tested core, verify.mjs, serve.mjs on 5113, dark and light themes, ?demo=1 for screenshots) in about half an hour, running alongside other builders.
I set the scope: which five formats, the two-pane layout, the options, the rule that every error carries a line and column, and the rule that the shipped code is the tested code. Claude Code wrote formats.js and the 196 tests first, with no parsing libraries at all, then the UI on top.
It ran the test loop itself. The first run was 192 of 195. It traced the three failures to a wrong expectation, a missing message for single-quoted JSON keys, and a fixture that type inference correctly turned into null. Then it took headless Chrome screenshots, read them back, and caught two UI bugs from the images: the empty state drawing on top of the output, and the output pane stretching the layout on phones.
What I learned
- The
hiddenattribute is onlydisplay: nonein the browser's default styles, so any rule like.empty { display: grid }quietly beats it. A global[hidden] { display: none !important; }fixes it, and it belongs in every project from day one. - Delimiter sniffing should score consistency before volume. Prefer the delimiter with the same count on every row. A few commas inside semicolon-separated cells will fool a plain frequency count.
- A YAML emitter has to run the parser's own rules against every string it writes. If "007", "true", "12", or "null" would read back as something else, it has to be quoted, or a YAML to JSON to YAML trip changes types with no error.
- CSV round trips lose information in predictable places: empty string and null both become an empty cell. We wrote those into the tests as expected behavior instead of pretending the trip is perfect.
What carried forward
Same tested-core pattern as #9 to #12, one formats.js imported by the page and the tests. The [hidden] bug wasn't a one-off: #17 hit the exact same one that night, in a separate build, and landed on the same one-line fix. Hand-written RFC 4180 CSV parsing showed up again in #14, which wrote its own for importing pins.
If I took it further
I'd move parsing into a Web Worker so big files stream without locking the page, and add YAML anchors and multi-document support.
#013 Built with Claude Code September 19, 2026 196 automated checks