Changelog
What changed, in plain words
No “various bug fixes and improvements”. If it changed how the app behaves, it’s here. An entry with no date is in the build but has not been cut as a release.
v3.15.0
Sep 5, 2026
Samples- The four samples on the empty state are the files people actually have: an API response, a service log, a Kibana export, a webhook to fix
- The Kibana export is a real Discover CSV — ECS columns, ISO times, and the JSON a service logged inside the message cell, which Unpack opens in the fields panel
- The webhook to fix is a Stripe-shaped payment_intent.succeeded event pasted out of a Python log — unquoted keys, single quotes, True / False / None, trailing commas, a missing comma — and Fix all repairs every one
- A CSV whose level column is spelled log.level reads its levels; a Kibana export always is
v3.14.0
Sep 5, 2026
Tabs- The “+N” counter opens a list of every open tab — the hidden ones first, then the row’s — with a filter box, ↑↓ to move, ⏎ to switch, esc to leave
- Each row in that list has its own ×, and the foot offers “Close the N hidden” in one click
- Picking a hidden tab brings it onto the row as the active tab; the row’s rightmost inactive tab takes its place in the counter, so the row never grows
v3.13.0
Sep 5, 2026
Formats- A Markdown table opens as rows with no question asked — the |---| row under the header is the whole signature; the verdict reads “6 rows · read as a Markdown table”, a cell holding JSON unpacks in the fields panel, and a title above the table is kept as text and counted
- Convert gains Markdown: any rows — a CSV, a log, the one list of records in a JSON document — written as a pipe table you can paste into a README or a ticket; the download is .md
- The records Foot names the format with the count — “CSV · 1,284 rows”, “Markdown table · 6 rows” — the way a document’s reads “JSON · 24 kb”
- Tabs never shrink to an ellipsis: the ones that do not fit collapse into a “+N” button that lists them, the active tab always stays on the row, and ⌘K lists every open tab as “Switch to …”
- A table’s text columns keep at least 120px — the fields panel folds before a message is cut to three letters
v3.12.0
Sep 5, 2026
Brand- The product is unstringify — the reverse of stringify — at unstringify.com; the mark is two quote strokes, the second running on into a node, and it is the same object at 96px and at 14px
- The landing says so: “Open the app” in the nav, “Unstringify” on the paste field, “Unstringify something” as the closing call, and hello@unstringify.com in the footer
- A config exported by the old name still imports; your saved preferences and open tabs are untouched
v3.11.0
Sep 5, 2026
Search- Every public page names its own address (a canonical link), carries its own title and description on the share card and the tweet — with the card image, which /features had lost — and points at its markdown twin for agents
- The pages describe themselves to search engines in schema.org terms: the site, the organisation, the product as a free developer application in the browser, each docs page as an article with its breadcrumb
- A web app manifest: unstringify installs as an app, in Ink, opening on the editor
v3.10.0
Sep 5, 2026
Tabs- One row, always. With one file the Head shows its name, its dot and a +; with several, the names become tabs in that same place — each with its own verdict dot — and nothing else on the row moves
- The active tab keeps its full name and its ×; the others give way first
v3.9.0
Sep 5, 2026
Pixels- The text pane is on the design’s grid: 12.5px type on 21px lines, a 52px gutter with the problem dot before the line number and the number itself in the mark’s colour — no squiggles, no cursor-line highlight, no gutter hairline, and indent guides off unless you turn them on
- Sizes read “24 kb”, “1.2 kb”, “412 b” everywhere; the recents rail says “2h”, “yesterday”, “3 days”
- Twelve icons are re-traced to the design’s own paths, so a chevron on the left strip mirrors the one on the right
- A CSV cell that holds JSON is drawn as “{ … }” in the accent — the detail opens it; a table’s resize handles sit between columns only; the rows are 12px
- The Head says “1 packed value” while the file holds one, offers Undo after an unpack, and the Foot offers ⌥Z beside “wrap on”
- Fix all lands on your text with Undo and Open as tree beside it — from the problems list too
- Compare keeps “an open tab ▾” in place, dimmed with the reason, when no other tab is open
- Preferences: export · import are words in the Foot, Undo · Redo is one row, the Auto tile shows the seam through one line, toggles carry no word, and the theme tiles sit closer
v3.8.0
Sep 5, 2026
Site- The landing, Features, Docs and every other public page are Ink — always. The theme you pick in Preferences dresses the app, not the site, and the browser chrome around the site is dark with it
v3.7.0
Sep 5, 2026
Detail- A click on a record or a row only selects it; a double-click opens the detail beside the list, a second double-click or esc closes it — the selection stays
- While a row is selected and the detail is closed, a strip on the right carries the row’s name — “BRD-OAK-002” for a table, “record 3” for a log — and a click on it opens the detail; with nothing selected there is nothing on the right
v3.6.0
Sep 5, 2026
Design- The folded text strip says “source” — the one word; the Foot carries the count
- Find and Filter are never up together: opening one closes the other, and a closed Filter bar clears its filter as it always did
- The record-fields door, closed, is a “detail” strip on the right — a pane never disappears; click it and the panel reopens on the row it last showed
- “reading: … ▾” appears only over a log read by a pattern — a CSV or NDJSON file has no menu there, and ⌘K keeps “reading” for the question
- The focus strip is one bar: the path, the branch’s size, and “Back to everything · esc” as its tooltip — the sentence about what is hidden is gone
v3.5.0
Sep 5, 2026
Foot- The Foot says one fact and one key — “JSON · 24.0kb” · “⌘J”, “lines 2, 4, 8” · “⌘.”, “5 lines changed” · “⌘Z”, “record 1 of 1,284” · “j k · ⏎” — and never a sentence
- The verdict is a dot; its words are the tooltip, and the actions beside it say what to do
- Convert’s Foot is what the pane drew, measured: “TypeScript · 1.2kb”
- One file shows a + beside its name; two files show the tab row
- A table’s row is titled by its first cell — “BRD-OAK-002” — where it used to say “row 1”
- The problems list opens with “6 problems”, the reading question with “Pattern found · checked against 200 lines”, and the rest of the chrome’s sentences are gone with them
- The Tools row goes icon-only when its five verbs would not fit the pane — the labels become tooltips, and nothing is pushed off the edge
- One pill after Filter reads “Unpack 3” while the file holds packed values and “Pack 3” once they are open; over a document it rewrites the text and the pack ledger is the way back, over records it opens them in the panel and changes nothing
- A packed cell — a CSV column or a log field holding JSON — opens in the fields panel as nested rows, on every format; the source cell stays the string the file wrote, and u on the row opens or closes it
- The fields panel folds to a strip on the right when the table needs the width; click the strip and the panel opens anyway
- The Foot names the packed field the panel has open — “row 1 of 1,284 · attrs · line 2” · “u”
v3.4.0
Sep 5, 2026
Focus- Focused on a branch, the tools act on that branch: Convert converts it (every target, not just TypeScript), Share opens on it with the document one click away, and Find counts only the matches you can see
- The Convert pane says which branch it is converting — “of items · to YAML …” — since the focus strip is off screen while it is open
v3.3.1
Sep 5, 2026
Gutter- The line-number gutter is 40px, not 69: three characters of numbers that grow with the file, the marks’ dots, and no fold-arrow margin — the text gets the rest
v3.3.0
Sep 5, 2026
Strips- A folded strip opens the way it closed: its inner edge is a resize handle, and pulling it opens Both at the width you pull to — no click; pull it back and it folds again
v3.2.0
Sep 5, 2026
Filter- A gear ends every Head and opens Preferences — no more reaching it through ⌘K alone
- Filter is one bar under the tools, in Find’s shape, and everything that filters lives in it: words, field=value or /regex/ in the box, the level chips as a track you can light several of, broken only, and the count
- The Foot says what a filter is doing — “2 of 5 · two levels · the other 3 are hidden, not gone” — and esc clears it
- The record fields panel is a door: a records file opens as its list alone; click a row to open the panel, another row to move it, the same row to close it
- Keep dragging a divider past where it stops and the pane on that side folds to its strip instead — and it folds from the width you had, not from the sliver
v3.1.0
Sep 5, 2026
Panes- A pane never disappears: once the tree is open, Source folds it to a strip on the right that says what is behind it (“tree · 44 nodes”), the way Tree folds the text on the left — the strip or ⌘J brings it back, and the view switch stays
- Both opens at half — the text and the result meet in the middle — and double-clicking the divider comes back there
- The record fields panel is half of the result and has its own divider: 50 · 50 in Rows or Records, 50 · 25 · 25 in Both, remembered per file
- Dragging a pane under 180px folds it to its strip instead of squeezing it; the divider keeps its place for when it comes back
- The view switch says Rows for a table, as the button that opened it already did
- Preferences says less: nothing under a title, one hint on six rows, Privacy & plan is Privacy, and the shortcut rows are labels — the one conflict reads “also Filter”
- Where your data goes is four lines — this tab · this browser · the URL itself · none — and the plan is one
v3.0.0
Sep 5, 2026
Redesign- Your text stays on the left, editable, for the whole session — the tree is added beside it when you ask
- Nothing is reformatted on the way in: what you paste is the text you see, byte for byte, until you ask for a change
- Broken files show dots on the bad lines and one Fix all; the list is a right pane, not a screen
- Fix all rewrites only the lines it names, greens them, and Undo puts the original bytes back
- Logs and CSVs ask how to be read beside your text, with a live preview
- Find, Compare, Convert and Share act on the result, inside the result
- One screen: the sidebar and the separate Repair, Diff and Search pages are gone, and their old links open the app with that tool already up
- Editing a value in the tree changes only that value’s characters in your text — your formatting survives
- Tabs appear at the second file, not before
- Five themes, with One Dark, Dracula and Catppuccin matched to their published hex; Auto follows the system
- Monaco is bundled locally — no request leaves the tab
- The URL field and the AI stub are gone; nothing in the app fetches anything on your behalf
- Convert no longer rewrites your text; the in-place version lives in ⌘K and says so
- Preferences is six rows and an Advanced five, on three screens: General, Shortcuts, Privacy & plan. Simple/Pro, density and the reading defaults are gone — a file is read the way you answered when it opened
- Switching tabs is ⌃1–⌃9: the browser keeps ⌘1–⌘9, and a chord we cannot deliver is refused with a reason instead of listed
- Docs: a page for every format and every tool, with each format’s repair steps read from the engine that runs them
- The list of formats on the site is generated from the engine, so it can never name a format the app cannot open, or miss one it can
v0.9.4
Sep 1, 2026
Coherence- One banner at a time — notices follow a priority ladder, and the ones that lose become chips you can promote
- Every segmented control answers the same question in the same place; three that duplicated another control were removed
- A CSV with a JSON column opens as a CSV, and a pasted JSON body no longer opens as a two-column table
- Repair stops pre-checking fixes that change meaning — the YAML Norway quote is yours to opt into
- Repair previews exactly the fixes you kept, and the Apply button counts them
- Esc leaves the repair review without applying, which the status bar had claimed for four versions
- Diff reads both sides with the format you chose, instead of re-guessing one of them
v0.9.3
Aug 31, 2026
Formats- CSV, TSV and raw text logs join as first-class formats
- Log files without a grammar get one — a detected pattern or your own regex, with unmatched lines kept and counted
- Everything reduced to two shapes, so search, diff, repair and convert work the same on all seven formats
- The format bar states how a file was read, and every part of that reading is editable
v0.9.2
Aug 31, 2026
Records- Search across records with values extraction and numeric aggregates
- Diff logs by record key instead of line order, so a reshuffle is not a thousand changes
- Repair broken records grouped by cause, not one at a time
v0.9.1
Aug 31, 2026
Layout- Drag the separator; snap to 30/50/70, double-click to reset
- Source / Split / Tree — hide the editor once you are done with it
- YAML and XML lint and repair, including the Norway problem
- NDJSON reads real shipper output — docker, kubectl and syslog prefixes, pino levels, ECS keys, truncated tails