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.56.1

Oct 19, 2026
Site
  • On the landing and /features, the VS Code section is dark too: with the themes section above it, everything about your editor now sits in one dark stretch, and the recording of VS Code is no longer a dark block on a light page
  • The landing no longer draws a line straight under “no signup · …”, and the paste field’s shadow is the light theme’s own — the one drawn for the dark site laid a grey smear across the page under the field, on every tool page too

v3.56.0

Oct 19, 2026
Site
  • The public pages are light now — the landing, every tool page, the docs, the notes, the error pages, pricing, privacy and this changelog. They wear Paper, the app’s light theme, whatever your preference in the app says, and the browser’s address bar is light with them. A page is light from its first frame, with or without JavaScript
  • The themes section on the landing went the other way: it is now the page’s one dark band, so the dark palette still has somewhere to be seen. The app itself is unchanged — it wears the theme you chose in Preferences, and Auto still follows your system

v3.55.0

Oct 16, 2026
Privacy
  • The app now sends one count, and the privacy page and Preferences › Privacy say so before it does. When you open /editor on a day, a week or a month this browser has not been counted for yet, it sends one small request with a word for each: how long since its last visit, and on how many of the last 28 days it came. Which days those were stays in this browser’s storage and is never sent. No id, no page, nothing about your text, your files or your tabs; Preferences sends nothing
  • It counts a browser, not you: how many came back this week can be told, never which. Global Privacy Control and Do Not Track are honoured — nothing is sent and nothing is written — and Erase everything removes the stored days with the rest

v3.54.1

Oct 5, 2026
Site
  • robots.txt carries the Content-Signal line again — search yes, AI answers from the pages yes, AI training no. It left in v3.33 because Bing’s robots.txt tester flagged it as unknown syntax; that is a warning in a dashboard, not a change in what any crawler reads — a crawler parses the records it knows and leaves the rest standing — and the line is what an agent-readiness scan looks for
  • llms.txt said the same preference was also stated in the AI catalog, which never stated it, and the agents index pointed at a robots.txt that carried no signal. Both now name the line that exists

v3.54.0

Sep 13, 2026
Site
  • The page counts now include a press of a door to the VS Code extension — the install button, the Marketplace, Open VSX — so a fifth total joins the four on each page. The extension itself still reports nothing: it makes no network request and has no telemetry, so a press of the door is the last thing anyone can see
  • Each count also carries one word for where the visit came from: google, youtube, a link from another site we know by name, a link from our own pages, no referrer at all, or other. The address you arrived from is turned into that word in your browser and never sent — the list is fixed, so nothing else can be stored there. The privacy page says exactly this, and everything it said before is unchanged: no cookie, no id, no session, no third-party script, and nothing at all from the app

v3.53.1

Sep 13, 2026
Site
  • On a phone, the three /features rows that show a recording drew it inside the 150px card meant for a drawing, so the clip ran over the sentence under it. The recording now takes its own height — the full width at 16:9 — and the text follows it
  • Between a phone and about 840px wide, the footer’s six links did not fit on the row with the mark and could not wrap, which made the whole page scroll sideways. They wrap onto a second line now, each link whole

v3.53.0

Sep 8, 2026
Site
  • The Pro licence can be bought. Lemon Squeezy finished reviewing the store, so /pricing and the VS Code page draw the buy door — $19, one time, one licence for VS Code and the web — in place of the line that said sales were not open yet. Nothing about the free app changed: every job it does today it still does, with no account
  • In the app, a dimmed Pro control’s “Get Pro · $19” opens the checkout itself rather than the pricing page, and so does the same door in Preferences › Privacy. The licence key is still typed once, checked from your browser and kept there

v3.51.0

Sep 7, 2026
App
  • JSON Schema, Zod, Pydantic and Go struct read a number as you wrote it: 149.00 is a number — float64, z.number(), float — and 149 an integer. The parsed value alone could not tell them apart, so each number now keeps its spelling from the text — a JSON or YAML document’s, an NDJSON line’s, a CSV cell’s

v3.50.0

Sep 7, 2026
Site
  • A JSONPath tester at /tools/jsonpath: paste JSON, type a path, and see exactly what it selects — “2 of 44 nodes match · $.items[*].sku”, the matches drawn as the tree they sit in with the branches that hold them, and Copy or Convert over just those values. Convert opens them in the app as one JSON array with the Convert tool already up
  • A path the engine refuses turns the field red and says what to fix — “a JSONPath starts at the root — try $.items[*].sku” — once you pause on it; until a path reads, the whole document is drawn and nothing is selected

v3.49.0

Sep 7, 2026
App
  • Convert writes four more things a document can become: a JSON Schema (draft 2020-12), a Zod schema, Pydantic v2 models and Go structs — each key typed from the value it holds, arrays from every element, a key missing in some elements optional, a date-time string and a whole number recognised only when every value seen was one. One output per target, no options; the Foot says what it wrote and its size
  • Four tool pages — JSON to JSON Schema, JSON to Zod schema, JSON to Pydantic model, JSON to Go struct — answer on the page with the proof line counted by the engine: “draft 2020-12 · 34 properties · 7 objects · 2.9 kb”
  • A field that is only ever null in the sample is typed as a nullable string — the one guess these targets make, said on their pages. TypeScript keeps the literal null it always wrote

v3.48.0

Sep 7, 2026
App
  • Compare over a CSV, NDJSON or log asks by which field: a “by” row under the doors names every field of this file as a key with its measure — “id · unique in 1,284 of 1,284”, “sku · 41 of 1,284” — the engine’s own key already chosen, and “line by line” last. Pick another before the second file arrives, or after, from the Tools row’s “by id ▾”. Free, as comparing by key has always been
  • The records diff lands in three groups with their counts — CHANGED · ADDED · REMOVED — one row per record: its key, then each changed field as before → after; an added or removed record shows its first fields. The unchanged fold under one line (“1,268 unchanged”). The Head reads “→ orders.v2.csv · 12 changed · 3 added · 1 removed · by id”, the Foot the three counts and esc
  • When no field is unique enough to key on, the diff says so above the rows and compares by position — the same honest fallback, now stated where it applies

v3.47.0

Sep 7, 2026
App
  • Big files: a CSV, NDJSON or log over 25 mb is read in a worker instead of the tab — the receipt shows the name, the size, the line count and a measured progress line while it reads, then how long it took (“read in 0.4 s”). This tab stays yours: nothing freezes, nothing is uploaded. Free opens it as text (“Keep as text”); reading it as records is Pro
  • The records view over a big file draws the first 10,000 rows and says so above the table; the level chips, the Foot (“NDJSON · 1,204,331 records”) and every filter count over all of them — Filter and Find run in the worker. Convert, Compare and Share dim over a file this size with the reason; the source pane opens folded
  • A file larger than a tab can hold asks first — “This file is larger than this tab can hold — 2.1 gb. Keep the first 200 mb?” — and the kept part ends on a whole line. Sizes print in gb from here on
  • A multi-megabyte file dropped and reloaded within a second no longer comes back empty: the browser store’s writes land one at a time, in order — an earlier, smaller write could finish after the file’s and drop it

v3.46.0

Sep 7, 2026
App
  • Batch: two or more files dropped on the window — or a folder — offer Batch beside Open as tabs; so do Choose a file / Browse… when they take several, and ⌘K’s “Batch files…” and “Batch a folder…”. A batch is a tab of its own kind on the tab row (“batch · 40 files”), the left pane a strip named for the files, the right the list: every file with the verdict its own tab would give it, its size, and what an action did to it
  • One action over every file, Pro on the web: Fix all, Convert to (JSON · YAML · CSV · NDJSON · TypeScript · Markdown), Unpack. Each button says how many files it can act on; the Foot counts the run (“14 of 40 · 0.8 s”) and esc stops it — what landed stays. A file the action could not take says why (“skipped · 7 fixable”); a file with nothing to fix reads “unchanged”. Download hands back the whole drop as one zip, named after the folder, the fixed or converted files in place — built in the browser, nothing uploaded
  • No ceiling of ours: a file over 25 mb keeps its row, its verdict is the reason (“48 mb · over 25 mb — opens on its own”), it sits out of the actions, and Open as tabs still takes it. The list and the verdicts are free; a file opened from a batch after Fix all opens with the fix as its own — ⌘Z undoes it there
  • One dropped file lands in the empty tab again, with its own format — a dropped .csv used to mint a second tab and wear the JSON icon until it was selected

v3.45.0

Sep 7, 2026
App
  • One Pro licence, VS Code and the web: the key from your order email is entered once in Preferences › Privacy, checked against the licence service from your browser (never activated — the web takes none of the licence’s three seats) and kept in this browser; “Deactivate on this browser” forgets it, and it is a row under “on this device” while kept. Pro on the web is only what is new; everything the app does today stays free
  • Pricing is a page: the web app is free — every job, forever, no account, no ads, nothing leaves your browser; Pro is one licence, once, for VS Code and the web; every VS Code install starts 14 days of everything. The footer links it. “Free while in alpha” is retired everywhere — free is forever

v3.44.0

Sep 7, 2026
App
  • The site and the app work offline once they have loaded: a service worker keeps every page and what it loaded — the app is whole offline once it has been opened — and a deploy still shows at once while there is a network. Preferences › Privacy has an Offline row that says what this browser holds (“kept”, “installed”, or “not yet”), and the Foot says “offline” beside the key while there is no network
  • A docs page for the MCP server: npx -y @unstringify/mcp runs the engine as six tools — fix_json, validate, convert, read_records, unpack, compare — for Claude Code, Cursor and any MCP client, as a local process that makes no network request
  • The VS Code page’s lists follow extension 0.5.0: Unpack this value (the hover’s first door, one value in place) is free; Unpack all — the file, or across the workspace — is Pro

v3.43.0

Sep 7, 2026
App
  • A records table column is no longer sized only from its longest value: the grid track now floors at what the column's own header needs — the hover hide button and its gap included — so a short-valued, long-named column no longer clips its own name while a sibling column sits on space it never uses
  • ⌥Z / ⌘K "Wrap long lines" now reaches the records table, the log list and the fields panel, not only the text pane: a long cell wraps onto as many lines as it needs instead of ellipsis-truncating, and the row grows to fit

v3.42.1

Sep 6, 2026
Site
  • On the landing, a paste and a sample chip now land in the field instead of opening the app at once — you see what arrived, and the Unstringify button is the one door. On a tool page a chip fills the field and the page answers under it, as a paste does

v3.42.0

Sep 6, 2026
Site
  • The paste field on the landing and every tool page grows with what you paste — three lines empty, one line per line up to twelve, then a scrollbar — at the code size, instead of a three-line box at 16px that scrolled from the second line
  • A sample chip under the field opens the app on that sample at once; the field and the answer on the page are for what you paste

v3.41.0

Sep 6, 2026
App
  • A reply pasted whole from a model — a sentence, a ```json fence, a sentence after — is one fix: the block inside the fence becomes the document and the fix says how many lines it dropped. A fence that never closes (a reply cut at its token limit) is unwrapped and the cut closed; a key the cut left half-written is no longer given a colon per pass
  • The JSONL validator names the four things an upload refuses: a byte-order mark before line 1 (stripped), one record pretty-printed over several lines (joined onto one), a trailing comma or Python quotes on a line (fixed there), and a whole file that is one JSON array (written one record per line). A shipper prefix before a record is kept
  • Three notes: JSON from a model and the cut at max_tokens; SNS to SQS and why a Lambda parses twice; the fine-tuning file the upload refuses. Each prints what the engine measured on its own sample
  • New samples on three tool pages — a reply from a model on Fix invalid JSON, an SQS event on Unstringify JSON, a fine-tuning file on the JSONL validator — and the reply’s recording
  • “Made by” on the privacy page: who makes this, how it is released, and that the code is not open source

v3.40.0

Sep 6, 2026
Site
  • Seven new tool pages, each with the answer on the page and its own recording: JSON to NDJSON, NDJSON to JSON, NDJSON to CSV, Markdown table to CSV, CSV to Markdown table, TSV to JSON (a spreadsheet paste), and a JSONL validator that names each broken line and fixes it
  • Three error pages, one per JSON error people search for — trailing comma, Expecting ‘,’ delimiter, Unexpected end of JSON input — with what Node, Python and jq say about the same text, the fix measured, and where the parser points versus where the break is
  • The tools index in four groups: Fix, Read, Convert, Errors. The Python dict page prints the exact error strings it answers, and an apostrophe inside a string survives the quote fix
  • Convert on a tool page now writes NDJSON, CSV and JSON as well; a rows file converts to any of them on the page

v3.39.1

Sep 6, 2026
App
  • A double-click on a table row opens its detail again. The cell’s only · not · copy menu now waits a third of a second after the second click, so the two clicks of a double-click are not read as “click again”; a right-click still opens the menu at once

v3.39.0

Sep 6, 2026
Site
  • The docs pages say what fixing gets you — every problem named on its line, only those lines rewritten, undo to the byte — instead of listing the engine’s repair steps in the order they run. The docs index counts no steps; the JSON note lists the ways a paste breaks by where it came from
  • The CSV to JSON, JSON to Markdown table, JSON to TypeScript and JSON formatter recordings are re-made on the new Convert row

v3.38.0

Sep 6, 2026
Site
  • A tool page or a note links a docs page by that page’s own search title — “JSON — read, fix, browse and convert” — never as “JSON — docs”, which is what a search result had started to show
  • The docs verb pages are titled in the words people search with: JSON validation, JSON tree view, JSON diff, JSON search, format detection. Their headings keep the verb’s own name
  • Terms is “Terms of use”; the docs index is headed “Docs”; Features and Tools lead their headlines with the section’s name; the notes and tools index descriptions fit a result

v3.37.0

Sep 6, 2026
App
  • Convert’s targets are ordered by use — YAML · CSV · TypeScript · Markdown first — and a chip that does not fit the pane goes into a +N counter instead of scrolling under Copy · Download; the picked target always stays on the row
  • Share names three ways out of this tab, always: Copy link with the measured sizes, Download the file under its own name, Copy the text with its line or row count. Past the link limit the link row stays, dimmed with the reason, and the file becomes the button
  • The Filter bar completes as you type: the record’s keys with how many distinct values each holds, then the values with counts after = on a key with fifty or fewer. ⏎ commits a term as a tag; terms AND together; × removes one; key!=value and -word exclude
  • A cell’s menu: a second click on the selected row’s cell, or a right-click, offers only · not · copy — only and not land in the Filter bar as service=inventory / service!=inventory. The same menu is on a value in the fields panel
  • Columns: × on a header hides it; hidden columns collect in a +N at the end of the header row, which lists them to bring one back, or all. The Foot counts “4 of 6 columns”; Columns… in ⌘K opens the same list. Remembered per file
  • ⌥-click on a chevron folds or unfolds the whole subtree — on a top-level row, everything; ⌥← and ⌥→ from the keyboard. Folded, every branch is one line with its count
  • The tool pages say what you get and prove it with the engine’s numbers — the how-to steps and the “in code” blocks are gone

v3.36.0

Sep 6, 2026
App
  • Convert on a JSON document offers formatted — two spaces per level, the keys in their order — beside minified. The same format is not the same text; every other format still leaves itself out
  • The JSON formatter page carries its recording: the one-line order opens as Valid JSON, the tree is its structure, Convert → formatted writes it out and the Foot measures the result

v3.35.0

Sep 6, 2026
Site
  • A file — chosen with the new “Choose a file” button or dropped anywhere on the page — opens the app at once, on every page. A paste or a sample still answers on a tool page; a file is a document to work on
  • The paste field is drawn as the input it is: a visible box with no sentence in it, and a foot row with the file button first, the two samples and the verb. A paste over a megabyte shows its size and line count while it is stored
  • On a phone the landing has no field — three doors instead: Paste what you copied reads the clipboard and opens the app, the recording, and Send it to your desk, the phone’s own share sheet
  • The app on a phone: the Head without the +, the gear or the view switch; the text wrapped; after Fix all the row reads Undo · Copy — Copy is the way back to the chat the snippet came from

v3.34.0

Sep 6, 2026
Site
  • A tool page answers on the page: paste into the field and the verdict, the problems by line and Fix all, the unpacked document, the first rows of a records file or the converted text appear under it, with Copy, Download and Open in the app. The chips fill the field instead of leaving
  • A ninth tool page, JSON formatter and validator: Format, Minify, Validate — and Fix all, then format, when the text is broken
  • Every tool page carries a reference — the fixes by name, the four Python rules, the escape sequences, the log shapes the engine knows, what becomes a row, how a type is inferred — each example the engine’s own output, and the same job in code
  • Guessed addresses land: /tools/fix-invalid-json, /tools/json-to-markdown, /tools/jsonl-viewer, /tools/json-unescape and a few more redirect to the page that exists
  • Each tool page’s structured data states its dates and names the job as a WebApplication

v3.33.0

Sep 6, 2026
Site
  • A VS Code band on the landing and on Features, right after the theme band: what the extension does, Install in VS Code, the page behind it, the trial in one line, the quick-fix recording beside it. On a phone the button is the page
  • Every tool page ends its steps with “in VS Code” — the same job as the editor does it, one sentence, and the extension’s page
  • Preferences › Privacy names both products’ plans: the web app free while in alpha, the extension’s 14-day trial then Free and Pro
  • robots.txt no longer carries the Content-Signal line — Bing’s robots.txt tester refused it as unknown syntax; the same preference is stated in llms.txt

v3.32.0

Sep 6, 2026
Site
  • VS Code is in the nav and the footer. The extension’s page was linked from one page, and that page from none — a crawler following links never reached it
  • The sitemap’s dates are real: the newest release for the pages a release touches, a note’s own date for a note. They used to be the build clock, thirty-nine identical timestamps that moved on every deploy
  • /pricing is out of the sitemap and marked noindex — fifty-three unlinked words a crawler was being offered before better pages. It still lands for an old link

v3.31.0

Sep 6, 2026
Site
  • The docs page for Unpacking shows the thing itself: a JSON string inside a JSON document, opened in place from its row in the tree — the records panel it showed before was the wrong context
  • The features row about a row’s tools starts on the rows and its double-click lands on the packed cell; it used to open with a view switch and a click on nothing

v3.30.0

Sep 6, 2026
Site
  • A tool page no longer snaps between its first two screens. The door still fills the first and the recording the second, but the scroll is yours the whole way down — a short scroll from the recording was being pulled back onto it

v3.29.0

Sep 6, 2026
Site
  • A tool page opens on its door alone: the title and the paste field fill the first screen, the job’s recording fills the second, and the page snaps between the two before it scrolls as any page does — “See it done · 9 s” at the field’s foot is the way down
  • The paste field on a tool page names the text its job takes — “Paste your broken JSON”, “Paste the CSV” — and says one thing about what happens to it, in place of the landing’s “anything”
  • The docs pages for Reading, Fixing and Unpacking show the features recording of that verb under “In the app”

v3.28.0

Sep 6, 2026
Site
  • Every tool page and every note carries a recording of its own job — the whole screen, the site’s own sample, nothing zooming — and the three features rows that show a thing in motion carry a fixed frame of exactly that thing. The landing carries none; its paste field is the door
  • The VS Code page’s four recordings were re-shot at the editor’s own size, so the text reads in their boxes
  • The tool pages’ “How” steps now say what their recording does, step for step
  • In a record’s panel, a packed field’s Unpack stayed where the pointer could reach it: the hover’s Copy used to paint over it when the value filled the row — the recording of that row caught the click going to Copy

v3.27.0

Sep 6, 2026
Convert
  • Convert to CSV or a Markdown table reads a document the way pandas normalizes it: its main list of records is the rows — an order is one row per item — with the rest of the document on every row and nested keys as dotted columns (customer.id, items.sku); an object with no list is one row, a list of objects one row each. It used to write only the list it found, so an order came back as its items with the order itself missing. Focus a branch in the tree and only it converts, as before; NDJSON takes the records as they are
  • A table pasted from a spreadsheet ends every line with a separator; that separator is no longer read as one more, empty column, so the header stops growing a c4 and a Markdown table stops gaining an empty column

v3.26.0

Sep 6, 2026
Site
  • The pages show the thing itself: screen recordings of the real app — a broken webhook fixed, a log read as records, a response converted, a CSV to JSON, a packed cell unpacked — on the landing, on the features rows, and on every tool page for its job; four of VS Code running the extension on the VS Code page. Each is a muted video that plays while it is on screen, with its measured length under it, and a first-frame poster; under reduced motion it waits for a click
  • Every clip is made by a script from the built site and from VS Code for the Web running the extension from source, so what a page shows is what the app does that day — nothing is drawn or staged
  • The extension’s README carries the same four recordings as GIFs, for the Marketplace and Open VSX, which play no video

v3.25.0

Sep 6, 2026
Site
  • The VS Code page says how a fix is applied, the three ways the editor has: ⌘. lists the line’s fix and “Fix all N”, ⇧⌥. applies the line’s fix with no menu, and Fix All applies every fix — on save too, for those who write that one setting. That third door is extension 0.4.0, published as a release rather than a pre-release

v3.24.0

Sep 6, 2026
Convert
  • Focused on one row of a list — items[1] — CSV, NDJSON and the Markdown table write that row alone and say so: “one row · $.items[1]”. They used to fall back to the list the row sits in and write every row under a chip that named the focus; YAML, XML and TypeScript already converted the row
  • Focused on a value that is neither a record nor a list of records — a string, a list of numbers — the three rows targets dim with the branch named: “CSV needs a record or a list of records — $.items[1].sku is a string”. The document targets still convert the value
  • The rule is now pinned over JSON, YAML and XML sources, four focuses and every target

v3.23.0

Sep 6, 2026
Site
  • The VS Code page describes what the extension now does, where VS Code keeps such things: quick fixes on the lightbulb and in the Problems panel, CSV, NDJSON and logs read as records through the reading question as QuickPick steps, Compare by structure in the diff editor, a hover on a packed value, Copy JSON path, Sort keys, Minify, and Open on unstringify.com — which carries the text in the link’s fragment
  • The Free and Pro lists moved with it: Read as records, Copy path, Sort keys and Minify are free; Compare by structure joins Unpack in Pro; the records view of its own and the workspace fix stay named as coming
  • The install paragraph no longer names a version — the extension’s own changelog does

v3.22.0

Sep 6, 2026
Site
  • A page for the VS Code extension at /vscode: what it does, the 14-day trial and the Free / Pro split, the licence, and the same privacy sentence — and, until it is on the Marketplace, a plain statement that it is not yet
  • The pricing page says the one true thing about a price: the extension has a trial and a one-time Pro licence; the web app stays free
  • Later the same day, 0.1.0 reached the Visual Studio Marketplace and Open VSX, and /vscode gained its install button and the links to both listings

v3.21.0

Sep 5, 2026
Site
  • Five notes under /notes, on where the mess comes from: why a Python dict is not JSON, what a Kibana export’s message column holds, how JSON ends up inside a string twice, what a log parser needs from a line, and the ways a pasted JSON breaks — counted from the engine. Each ends with the tool pages it leads to, and the nav reads Features · Docs · Tools · Notes
  • Every docs tool page ends with “A worked example”: the engine run over the site’s own samples when the page was built — the tree’s node count, the fixes by kind, the diff’s added and changed paths, Find’s hit counts, Convert’s sizes per target

v3.20.0

Sep 5, 2026
Samples
  • A sample — from the arrival screen or a tool page — no longer asks how it should be read: it opens straight as records, beside its text, in Both. Your own files are asked as before, and ⌘K “Reinterpret as…” asks again for a sample too
  • Four more samples, each on the tool page whose job it fits: a European semicolon export with decimal commas, a Kibana Discover table copied as text, a Docker json-file log, and a paginated charges list whose fields do not all agree
  • “or drop a file” under the paste field is a button now: it opens the file dialog, and the file you pick opens the way a dropped one does
  • The engine’s WebMCP tools are registered on every page, not only the app; agents can also read what the site is from /.well-known/ — an agents index, an API catalog, two skills, a capability manifest — and /auth.md, all of which say the same thing: no API, no account, nothing leaves the browser

v3.19.0

Sep 5, 2026
Site
  • Eight tool pages under /tools, one per job — Fix invalid JSON, Python dict to JSON, Unstringify JSON, NDJSON viewer, Log parser, CSV to JSON, JSON to Markdown table, JSON to TypeScript — each the landing’s paste field with the two samples that fit, what the app does and will not do with that text, the sample, three steps, the questions, and the docs behind it. Every number on them is measured by the engine at build time
  • Three new samples: a Stripe event as pprint prints it, an SNS notification whose Message is a JSON string, and five JSON lines with one cut short
  • The nav reads Features · Docs · Tools; the format chips on the landing and /features open their docs pages, a row of tool links follows them, and five /features rows link the docs page behind their sentence
  • Every public page’s tab title names what the page does, and every docs page opens with what the tool looks like in the app
  • www.unstringify.com sends you to unstringify.com in one hop; the app screen itself no longer appears in search results — the landing does

v3.18.0

Sep 5, 2026
Reading
  • The reading question is one question per row, the default already chosen: for a log the pattern as chips, one line “matches 1,277 of 1,284 lines · 7 kept as raw”, and “times” UTC · Local; for a CSV “separator”, “first row”, and the split-decimal finding as a row of its own — the cell as its label, the count beside it, “read as 12.50” · “keep text”
  • The Tools row has no “reading: … ▾” slot any more; ⌘K’s “Reinterpret as…” reopens the question, and “Keep as text” is answered from there

v3.17.0

Sep 5, 2026
Head
  • With one file open, the verdict dot sits before the name — the same place it sits on a tab — instead of after it
  • With one file open, the Head carries the × a tab carries: the file closes from there too
  • The record-fields strip on the right drags open exactly as the source strip on the left does: pull its edge, the panel opens the moment it would stand, and keeps dragging to the width you want

v3.16.0

Sep 5, 2026
Site
  • The theme band on the landing is Paper and shows five cards — Ink and Paper under “Auto — follows your system”, One Dark, Dracula and Catppuccin under “Or pick one — matched to the published hex” — each painting the same seven lines of source in its own palette
  • The docs on a phone: the page list is a 44px row that opens as a sheet with every page and the current one marked; “on this page” sits under the lede; the two index tables read as two-line rows
  • The privacy note on a phone keeps every sentence and changes only its measure: an 18px gutter, a 24px title, 15px section heads, dash bullets
  • While the “+N” counter holds tabs, the Foot reads “⌃1 – ⌃9” where it read “⌘J” — the keys that switch tabs, and the ones the page actually receives
  • The sample chips drop the format suffix: “an API response”, like the other three
  • The New tab shortcut chip explains itself: no chord, because the browser keeps ⌘T and ⌘N — record one that is free

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