0.1 · editor skeleton · macOS 26 (Tahoe) · Apple Silicon

Messy spreadsheet in.
Print-ready dashboard out.

A Mac dashboard tool for people who'd rather not learn a BI platform. Drop in a CSV or XLSX, let the cleaner flag the weird rows, assemble the dashboard with a small chart DSL (or the visual editor, if you'd rather), and export a PDF that looks like something a client would accept. The file format is Markdown, on purpose — so your work outlives the app that made it.

Local-first, on-device· 11 chart types· Open file format (CC BY 4.0)· One-time purchase
Open format
The .flexstats bundle is a macOS package with dashboard.md as the source of truth. Full spec published under CC BY 4.0.
Respectful cleaner
Merged headers, footnote rows, subtotals, currency-as-text — all flagged with confidence scores and one-click fixes. No formulas, ever.
Swift Charts native
Eleven chart types, six palettes, eight themes. Chart3D on macOS 26 for scatter3d, bar3d, and surface plots.
Print-ready PDF
Vector export via PDFKit. The deliverable is a document a client would accept, not a screenshot of a web app.

What flexStats is about

Three opinions that shape the app.

01

Respect for messy real-world data

Spreadsheets have merged headers, footnote rows, subtotals, currency-formatted text, and multiple tables on one sheet. flexStats shows you what it found and lets you fix it visually — no formulas, no scripting, no "clean this first and come back." The cleaner flags issues with confidence scores, offers suggestions, and every change is reversible with one click.

02

The file is Markdown, on purpose

A `.flexstats` document is a macOS package with `dashboard.md` at its heart. Users never need to know that — it opens and saves like any other file. But when flexStats eventually outlives its welcome, your dashboards don't. A human can read them. Git can diff them. Another tool can learn the format from the open spec.

03

Print-ready, not app-bound

The first-class output is a PDF that looks like something you'd hand a client. Swift Charts renders natively, PDFKit draws to vector where it can, and the typography is loaded with the same care a real document deserves. The app is the author; the PDF is the deliverable.

Where the app is, right now

v0.1: the document skeleton shipped. The rest is on the way.

v0.1 lets you open, edit, and save `.flexstats` bundles. The Markdown editor has a live preview of prose — headings, paragraphs, lists, tables. Chart, table, and KPI blocks show as placeholders today; they're parsed and preserved on save, and rendering lands in v0.3+. The screenshot up there is the v0.5 target, not the v0.1 reality. We'd rather say that out loud than put a \"coming soon\" badge on it.

See the full roadmap →
  • Today (v0.1)

    Open, edit, save .flexstats. Live preview of prose. Round-trip tested.

  • Next (v0.2)

    CSV + XLSX import, detector framework, visual cleaning UI.

  • Then (v0.3–v0.5)

    Chart rendering (11 types), form editor, KPI/table/grid blocks, 8 themes.

  • After (v0.6–v0.8)

    Print-quality PDF, iOS viewer, data refresh with schema diffs.

  • v1.0

    On-device intelligence, Liquid Glass, sample documents, open format spec.

Features on the roadmap to v1.0

Nine of the 22 that define the v1.0 shape.

The full list below spans what's shipped in v0.1 and what's committed through v1.0. Each one is anchored to a specific pipeline stage or block type from the open file format — not a feature matrix someone wrote to fill a page.

Import

CSV and XLSX import

CSV via Apple's TabularData — mixed quoting, escaping, and null detection handled correctly. XLSX via CoreXLSX (pure Swift, read-only). `.xls` is rejected with a helpful message asking you to resave as `.xlsx`; we don't pretend to handle file formats Microsoft itself has moved on from.

The spreadsheet Apple can read, flexStats can read.

Import

Drag-and-drop onto anywhere

Drop a `.csv`, `.tsv`, `.xls`, or `.xlsx` onto the app icon, onto an open dashboard, or onto an empty-state view. flexStats picks the right import pipeline and surfaces the cleaner for you.

The drop target is wherever you're pointing.

Import

Structure detection

A composable detector framework looks at your file and finds the header row, the data rows, the footnotes, the subtotals, and any blank-row-separated second table on the same sheet. Each detector reports a confidence score; ambiguity surfaces as a choice, not a guess.

The messy top and bottom of a spreadsheet stop being the user's problem.

Import

Type inference with confidence

Every column is typed as string, number, date, currency, percent, or boolean with a confidence score. Mixed-type columns get flagged. Currency symbols are recognised. Date columns match common patterns. Dates-as-text get promoted automatically when the pattern is unambiguous.

The data arrives as data, not as strings you have to rescue later.

Cleaning

Visual cleaning UI

A table view with highlighted issues and inline suggestions. "This column looks like dates stored as text — fix?" "This row looks like a footnote — remove?" Every suggestion is a one-click accept or reject; "I don't know" is a valid answer and the cleaner asks rather than guesses.

Fix the file the way you'd fix it in your head.

Cleaning

Original preserved alongside cleaned data

When you import, the original file is copied into the bundle at `data/<name>-original.<ext>` and the cleaned version is written to `data/<name>-clean.csv`. Rerun the pipeline any time — your cleaning isn't a one-way transform.

You can always get back to the data you started with.

Cleaning

Never shows you a formula

No formula bar, no column expression language, no "let's write a small DSL to fix your dates." The cleaning UI is a table with buttons. Advanced users get power features behind a toggle; first-time users never see them.

Nothing between you and the fix.

Charts

Eleven chart types

bar, line, area, scatter, pie, donut, heatmap, waterfall — plus three 3D types on macOS 26 (scatter3d, bar3d, surface) via Chart3D. Waterfall draws running totals with colour-coded positive and negative bars. Donut takes a configurable inner radius.

Enough chart types to cover 90% of dashboards; not so many you forget which one you want.

Charts

A small chart DSL you control

`flexchart` blocks are YAML: `type`, `data`, `x`, `y`, optional `color`, `size`, `filter`, `sort`, `format`, `aggregate`, `height`. Field expressions can be bare column names (`revenue`) or aggregates (`sum(revenue)`, `mean(price)`). No JavaScript, no formula language — every addition needs a documented use case.

A language small enough to learn in one sitting, precise enough to not surprise you.

Who it's for

Five people the v1.0 flexStats is built for.

Turning a quarterly export into a PDF

Drop the `.xlsx` the finance team emailed you. Accept the cleaner's suggestions on the footnote rows and the currency columns. Pick the Executive theme, add a cover page, drop three KPI cards above two charts. Export PDF. Hand it over. They never ask which BI tool you used.

A recurring dashboard against a moving file

Import the first month. Save the `.flexstats`. Next month, drop the new file on top and hit Refresh from Original. Schema diffs flag `price` → `unit_price`; fix the one chart it affects. Everything else updates automatically.

Editing a dashboard in a Git review

Your teammate opens the `.flexstats` in Finder. You edit the `dashboard.md` inside the bundle directly, diff it in Git, and leave review comments on the chart spec the way you would on any Markdown file. No export, no import, no "I'll rebuild it."

A survey deck with mixed content

Headings, paragraphs, two flexgrid blocks of side-by-side bar charts, one scatter, a few inline KPI cards, and a closing paragraph of commentary. Markdown for the prose, the DSL for the data, PDFKit for the handoff. The same document holds the argument and the evidence.

A small 3D visualisation on macOS 26

A terrain of three variables. Pick `surface`, map `x`, `y`, and `z` to your columns, drop in an `scatter3d` next to it for the raw points. Rotation and zoom are built into Chart3D; the result reads in the preview the same way it reads in print.

Questions we get a lot

The short answers to the common asks.

What can I do with v0.1 today? +

Open, edit, and save `.flexstats` bundles. The Markdown editor has a live preview of prose — headings, paragraphs, lists, tables. Chart, table, and KPI blocks show placeholders; they're parsed and preserved on save, but rendering lands in v0.3+. Data import, chart rendering, and PDF export arrive in v0.2–v0.6.

Is the file format open? +

Yes. `FILE_FORMAT.md` is published under CC BY 4.0. Any tool can read or write `.flexstats` bundles in any language. The format is a macOS package with `dashboard.md` as the source of truth and CSV data under `data/` — no proprietary container.

Does my data stay on my Mac? +

Yes. No cloud, no telemetry on file contents, no column names leaving the device, no third-party analytics. All AI features (when they land) run through Apple's Foundation Models framework on-device. If a file goes somewhere, it's because you sent it.

Can I edit the Markdown directly? +

Yes. `.flexstats` is a package — Finder shows it as one file, but it's a folder with `dashboard.md` inside. Power users can edit the Markdown in any editor, diff it in Git, and commit it. Round-trip is tested: parse → serialize → parse yields an identical AST.

Is this a replacement for Tableau, Power BI, or Excel? +

No. flexStats is a dashboard authoring tool for people who don't want to learn a BI platform — not a live-data dashboarding service, not a multi-user collaboration suite, and not an Excel competitor. It's the tool for people who stare at a quarterly report and wish they could just "make it look good."

What chart types are supported? +

Eleven: bar, line, area, scatter, pie, donut, heatmap, waterfall — plus scatter3d, bar3d, and surface on macOS 26 via Chart3D. Six palettes, eight themes. Multi-series, tooltips, and responsive sizing across every chart view.

What macOS version do I need? +

macOS 26 (Tahoe) for the v1.0 build. The app uses Chart3D, Foundation Models, and Liquid Glass — all of which require macOS 26. Earlier builds may run on older systems, with 3D charts and on-device AI hidden where not supported.

What about Windows, Linux, or the web? +

No. flexStats is a macOS-first app using Swift, SwiftUI, Swift Charts, and PDFKit. The file format is open — a Windows implementation could exist; we just won't be the ones to write it.

v0.1 is real. v1.0 is the aim. Want to test along the way?

Tell us the spreadsheet you're stuck staring at — the quarterly report, the survey export, the finance team's pivot-heavy nightmare. We'll put you on the list, and send builds as pipeline stages land.

No waitlist form. No tracking. No cloud, not at any version.