Release notes by Arif Aslam 9 min read

Changelog

The dates below come from the project's git history. The notes are written by hand from what those commits actually changed, which means they are shorter and more honest than a generated list of subject lines would be.

Around 350 commits sit behind this page. Most of them do not deserve a mention. What follows is the work that changed what the tool can do, plus the bugs that were bad enough to be worth admitting to.

Next

This is a public roadmap, which means it is a statement of intent and not a promise. It is honest about the fact that most of it is in progress right now, as a set of parallel workstreams rather than one linear plan.

  • Learn, glossary and engineering content. The pages you are reading. Fourteen troubleshooting guides, an 87-term glossary, five engineering write-ups and a set of comparison pages, all shipping together.
  • More sample data, wired into more places. Twenty sample files exist across twelve formats. They are under-used: most tool pages do not offer one, and a tool page with nothing to try is a dead end.
  • Recipes. Named, shareable pipeline presets that open pre-configured, so a common cleanup is one link rather than six clicks.
  • An RSS and Atom feed. Shipping with this release at /feed.xml, covering blog posts and engineering write-ups.
  • A service worker. The engine is entirely client-side and the app still does not work offline, which is an embarrassing gap rather than a hard problem.
  • Dashboard composition. Charts exist and can be exported individually. Arranging several of them into one saved layout does not.

Things deliberately not being built: accounts, cloud sync, a paid tier, and any feature that requires your data to leave the machine. Those are not roadmap gaps, they are the shape of the product.

September 2026

Grid: aggregates without floating point noise

Summing an integer column in DuckDB returns a HUGEINT, which Arrow hands to JavaScript as a big-number object rather than a plain number. Rendered naively, the cell showed a quoted digit string. Rendered eagerly as a number, values past the safe integer limit rounded. The grid now puts the decimal point back where the column's scale says it belongs, and keeps anything that outruns double precision as a string rather than silently losing digits.

Brand refresh

One consistent logo set with solid bars, a light variant for directory listings that use dark backgrounds, rewritten listing copy, and a demo GIF that shows a real file being loaded rather than a mockup.

August 2026

By some distance the busiest month: around 125 commits.

The quality pass

A deliberate stop-shipping-features month spent auditing what already existed. All forty operations were reviewed and fixed: fill now runs through null runs correctly, copy and split guard against name collisions, and bulk replace works on numeric and date columns rather than only text. A data-type consistency pass went through import, display, export and charts together, which is the only way that class of bug gets found, since each layer looks correct on its own.

PDF extraction got the most work. Dense-region column detection, page-furniture stripping, per-region lattice consumption, and an OCR path fixed for integer canvas dimensions and a wider merge threshold. The documentation generator for operation pages was switched off permanently so that thirty-six hand-written pages could stop being overwritten.

Two admissions from that month. Date cell edits were being silently discarded, because the editor had not been migrated to AG Grid v33's reactive API. And four blog posts failed their own content audit badly enough to be deleted outright, with 301 redirects to better replacements.

On-page converters, four waves of them

Until this point every converter page was a landing page with a link to the app. That is a bad trade for someone who wants one file converted. Four waves later, thirty-nine converter and utility pages convert in the page itself, with framework-free widgets and engines that load only when a file arrives.

  • Wave 1 put the widget on the eight original converters and added a tools hub.
  • Wave 2 added the Excel, XML and JSONL cluster.
  • Wave 3 added five utilities: splitter, diff, dedupe, text-to-CSV and the delimiter changer, along with a dual-input widget mode for the tools that take two files.
  • Wave 4 added the JSON formatter, CSV validator, JSONPath tester, Excel diff, CSV profiler, pivot table, the YAML cluster, CSV to SQL with four dialects, HTML table to CSV, and the Avro and SQLite readers.

Two bugs from that stretch worth recording. The widgets crashed on the built output but not in development, because CommonJS interop helpers had been welded into the app vendor chunk, so any converter page statically pulled the entire application bundle and executed it circularly. And a batch of converter pages carried FAQ answers stating a size cap that had not been true for months, which is its own kind of bug.

Charts rebuilt on ECharts

Ten chart types, statistics computed in SQL rather than in JavaScript, per-series aggregation, duplicate and rename, and honest warnings when a scale would mislead. The column explorer's minicharts were replaced with dependency-free SVG so that opening a column does not load a charting library.

The CSV loader, hardened

Encoding fallback, a lax-parse rescue chain, degenerate-result detection, and automatic skipping of the prose preamble that bank and brokerage exports put above their tables. And a real crash fixed: registering a file buffer with DuckDB transfers it to the worker, which detaches it, so any read of those bytes afterwards threw. The fix was to decode the sample text before registration rather than after.

Accessibility, SQL and identity

A keyboard and screen reader pass across the site chrome, the converter widgets and the editor. Manual SQL can now call its input table data, with the name reserved so a loaded file cannot claim it out from under a saved query. DATE columns render as dates instead of epoch numbers. And every blog post's fabricated publication date was replaced with the real date from git history, which cost some apparent freshness and was the right call.

May 2026

Advertising, and the mobile layout fight it caused

The site is free and ad-supported, and getting ads to coexist with a full-screen data application took two weeks and about twenty commits. Ad slots broke the mobile file upload layout, then filled inconsistently, then collapsed the data grid. The resolution was a unified full-height layout, a minimum slot height, a three-hundred-millisecond grace period before pushing a slot so that transient mounts are skipped, and twenty-six distinct slot identifiers so that performance is measurable per placement.

Production-grade PDF table detection

The rewrite that made PDF extraction worth using: a lattice pass that reads the drawing operations to find ruled cells, a stream pass for pages with no rules, and schema grouping to stitch a table that spans pages back together while keeping genuinely different tables apart.

April 2026

More formats in

Arrow, Feather, Avro, SQLite and compressed containers, all behind a unified multi-table picker so that a file with several tables asks which one you want instead of guessing. DuckDB import and export, Excel multi-sheet handling, and .doc support followed.

CSV parsing, simplified after several wrong turns

April contains a run of four consecutive commits all trying to fix the same CSV fallback behavior, which is a good sign that the design was wrong rather than the code. It ended at the right place: one parser, DuckDB's, with a strict attempt followed by progressively more forgiving retries, each of which tells you what it gave up.

Hardening and trust pages

SQL injection hardening, memory leak fixes, race conditions in export, an About page and a Contact page. Mobile responsiveness down to 375 pixels, including the iOS Safari auto-zoom-on-focus problem that every mobile web form eventually meets.

March 2026

First commit 22 March 2026. Around 147 commits in ten days.

The launch, and an architecture reversal

The first version was a React single-page application for everything, including the marketing pages. That was wrong for a site that wants to be found: crawlers saw an empty shell, and the workaround, a static HTML carbon copy of the React landing page, produced a week of commits about pixel-matching two implementations of the same page and cross-fading between them.

The fix was to stop doing that. Static HTML for every marketing, docs and blog page, vanilla JavaScript for the shared chrome, and React only for the application at /app. Multi-page Vite build, one nav registry injected at build time so that navigation exists without JavaScript. Every page on this site except the workbench is a real HTML file because of that decision.

The engine, and everything on top of it

DuckDB WebAssembly as the query engine, with an eh-to-mvp bundle fallback after Parquet failed in production. The pipeline: forty operations that each generate SQL, chained into a rebuildable chain. The column explorer with per-type visual summaries. Multi-file and multi-view tabs. IndexedDB persistence. Ten LLM providers for natural-language to SQL, with the generated SQL validated against the pipeline's output view before it is accepted as a step.

Content

Forty-nine documentation pages with search, sixty blog posts across five categories, and a guided product tour. Also a long tail of interface fixes that came out of a design review: focus-visible styling, reduced-motion support, tabular numerals, and touch targets raised to forty-four pixels.

How this page stays honest

A changelog that quietly stops being updated is worse than no changelog, because it implies nothing has happened. There is a script in the repository, scripts/seo/changelog-check.mjs, that reads the newest commit date from git, reads the newest dated entry on this page, and warns when they are more than thirty days apart. It runs on demand and it exits non-zero on drift, so it can be wired into a build if the drift ever becomes a habit.

Questions people actually ask

Where do these dates come from?

From the project's git history. I ran git log over the repository and grouped the commits by month, then wrote the notes by hand from what those commits actually did. The dates are commit dates, so they are the days the work landed, not the days it was announced.

Why is there a gap between May and August 2026?

Because there was one. Between mid-May and the start of August almost nothing shipped. I would rather show the gap than backfill it with invented releases, and a changelog that never has a quiet month is not a changelog.

Is every commit listed?

No. There are around 350 commits and most of them are not worth anyone's time. These notes cover the changes that altered what the tool can do or fixed something a person would have noticed.

How do I know this page is current?

A script in the repository compares the newest commit date against the last entry here and warns when they drift more than thirty days apart. It is not a guarantee, but it means a stale changelog fails loudly rather than quietly.

Is there a feed?

Yes. The Atom feed at /feed.xml carries blog posts and engineering write-ups. The changelog itself is a single page rather than a set of dated posts, so it is not in the feed.

AA

Arif Aslam

Staff engineer in Bangalore. By day at Mammoth Analytics; building ExploreMyData on the side. More on my author page or LinkedIn.

Try the current version

Everything on this page is live. No account, no upload, no trial.

Open the workbench