Changelog

What shipped, when — newest first.

Finetype v0.6.67 — every number and date type says how to print its values

What shipped. Every type whose cast yields a number, date, time or timestamp now carries a display block: a d3-format or d3-time-format specifier, plus money, currency, fraction and bytes flags where the label implies them. An accounting amount is (,.2f, a percentage is ~% read as a fraction, a year is d, and dmy_slash is %d/%m/%Y. finetype taxonomy -o json includes display on each label, and finetype profile -o datapackage writes it as x-finetype-display on each field, so a tool reading the profile can format a column without guessing.

Also changed. finetype check fails when a numeric or temporal definition lacks a valid display block, or when the block disagrees with the cast. Scale, precision, the currency symbol a file used and locale stay with the caller.

Finetype docs → · v0.6.67 release notes on GitHub →

Finetype v0.6.65 — forty-two more types validate by the sources that define them

What shipped. Forty-two more types' validation rules now accept what their defining source allows and reject what it does not define, which changes what finetype validate, the JSON Schema output and ft_validate_text report for them. Among the newly accepted forms are ::-compressed IPv6, CSS Color 4's space-separated rgb() and hsl(), 4- and 8-digit hex colours, polar UPS grid references in MGRS, Plus Codes in any case, geohashes of 1 to 20 characters, the USPS possession and military state codes, JSON and XML spread across lines, and CSV records with empty or quoted fields. Forms the sources forbid are now rejected, including ISO weeks 00 and 54 to 99, MGRS with an odd number of digits, invalid Plus Codes and SemVer with empty identifiers. No column in FineType's gold, representative or external evaluation sets changed type; the release notes list each change.

Also changed. A discrimination check now always applies on top of the published rule when FineType chooses a column's type, so a newly accepted form that looks like a neighbouring type (a bare 9-digit number as an EIN, 2024.1 as a CalVer version) does not pull a column toward it. ft_validate_text now applies the same per-value check as finetype validate: a value whose enum member differs only in letter-case conforms, and a right-shaped value with a bad check digit fails with the new constraint checksum. Boolean terms declare their Frictionless trueValues and falseValues. In DuckDB, these changes come with the extension builds attached to the v0.6.65 GitHub release; the build in DuckDB's community registry is not refreshed with each finetype release.

Finetype docs → · v0.6.65 release notes on GitHub →

Finetype v0.6.66 — a percentage column casts to a fraction

What shipped. A percentage column now casts to a fraction, as a rate column already does: 45% becomes 0.45 rather than 45, the value a spreadsheet holds for 45% and the one d3-format's % expects. This changes the cast's output for every column typed as a percentage, in finetype validate and in a vendored transform. A bare number in a percentage column is read as percentage points and divides too (50 becomes 0.5). The cast appends e-2 to the digits rather than dividing by 100, so 99.99% gives exactly 0.9999. The decompose column percent_value keeps the 0 to 100 number.

Also changed. The DuckDB extension's ft_cast returns the same fraction as text (95.5% gives 0.955), in the extension builds attached to the v0.6.66 GitHub release; the build in DuckDB's community registry is not refreshed with each finetype release.

Percentage type → · v0.6.66 release notes on GitHub →

Finetype v0.6.64 — thirteen types validate by the sources that define them, and every value gets a grade

What shipped. Thirteen types' validation rules now accept what their defining source allows and reject what it does not define, which changes what finetype validate, the JSON Schema output and ft_validate_text report for them. Upper- and mixed-case UUIDs are accepted (RFC 9562), so a column of uppercase UUIDs profiles as uuid rather than alphanumeric_id. File sizes follow NIST and IEC: 1 MB now casts to 1,000,000 bytes where it was 1,048,576, KiB to PiB and the bare letters K to P are binary, and 2 TB no longer casts to 2 bytes. Currency codes are ISO 4217's current list plus the codes withdrawn since 1999 (163 codes become 243, none removed), and tsid is rewritten to its real form of 13 Crockford base32 characters, so columns of 32-hex values are no longer typed tsid. Percentages, Boolean initials, locale codes, abbreviated months, RFC 3339 and ISO 8601 offset timestamps, usernames, blood types and NPI numbers change too; the release notes list each change.

Also changed. Validation now grades each value: it conforms, conforms with a note (such as non_canonical: lowercase or nonstandard), or fails. finetype validate adds a column_notes section with a count per kind of note and up to five examples, and its rejects are unchanged. ft_validate_text appends grade and note to its result, and valid still means the value did not fail. In DuckDB, these changes come with the extension builds attached to the v0.6.64 GitHub release; the build in DuckDB's community registry is not refreshed with each finetype release. The default model carries a snapshot of the validation rules as of 0.6.63, so fixing a published rule no longer changes the model's inputs. Library users should note that TableValidationResult gains column_notes and MultiBranchClassifier::from_bytes takes a trailing snapshot argument, so code that builds the first with a struct literal, or calls the second, needs updating.

Finetype docs → · v0.6.64 release notes on GitHub →

Arcform v0.2.2 — DuckDB 2.0

What shipped. Arcform moves onto DuckDB 2.0. It links DuckDB 2.0, runs a Protocol's SQL steps on DuckDB 2.0's duckdb command line, and works out what each step reads and makes from DuckDB's own parse of the SQL. curl -fsSL https://install.meridian.online/arc | bash installs it, and now also installs DuckDB 2.0.0's release build when no suitable duckdb is on your PATH. DuckDB 2.0 changes some results without an error, such as ~ matching part of a string, so arc run says when a Protocol last ran on a different DuckDB. A 1.x duckdb is refused: if you stay on DuckDB 1.5, stay on Arcform 0.2.1.

Arcform docs → · v0.2.2 release notes on GitHub →

Finetype v0.6.63 — agents connect through arcform, and the DuckDB extension is built for DuckDB 2.0

What shipped. Finetype's MCP server and its two agent skills are removed, which breaks an MCP client still configured for finetype mcp. The release points agents to arcform instead: arc mcp serves infer, profile, taxonomy, validate and generate by running the finetype binary. arc skills install, which finetype's notes name for the skills, is not in a released arcform yet (v0.2.1 is the latest as of 2026-10-23). finetype mcp is now a hidden stub that exits non-zero with a message naming arc mcp and arc skills install, and the finetype-mcp crate is no longer built or published, though the versions already on crates.io stay there. The DuckDB extension is built and tested for DuckDB 2.0.0 and still loads on 1.5, where nothing changes. On DuckDB 2.0, ft_profile and ft_detail take an aggregate ORDER BY, as in ft_profile(col ORDER BY col); on 1.5 the same statement still crashes the process, so the limitation stands there.

Also changed. The JSON Schema and Data Package emitters moved into finetype-core, so a library user keeps them without the server crate, and their output is unchanged. A release now starts from a tag named v and three dot-separated numbers, where any tag beginning with v started one before. A tag whose number is not the workspace version, or that has no non-empty CHANGELOG.md section, fails before a binary is built, and the release's notes are that section.

Finetype docs → · v0.6.63 release notes on GitHub →

Brightfield v0.1.7 — type SQL into a chart, and export a Protocol's report

What to try. Type SQL in the chart palette: its result previews first, and you then keep it as a step or as a filter. A filter or a sort can also be applied from the grid's cursor, and it is recorded as a step of the Protocol. An agent-written Protocol now opens with its charts drawn, and from the command line its report exports to PDF and each of its panels to PNG or data.

Also changed. A right-hand legend starts under its plot's title, so it no longer covers the title. The grid shows doubles, and the band shows its range, to two decimal places. The shelf's mark cell no longer shows a chevron, since it does not yet open a list. The EDGAR↔GLEIF crosswalk chart's colour legend is back, below the grid. A release whose packaged artifacts carry no DuckDB engine now fails before it is published, and rustls is at 0.23.46, for four TLS advisories. Still an early preview, macOS only, unsigned.

v0.1.7 release notes on GitHub →

Arcform v0.2.1 — FineType tools that work with finetype 0.6.62

What shipped. A patch release with two fixes. The arc mcp tools taxonomy and generate no longer offer a priority argument: finetype 0.6.62 removed the flag it was passed to, so any call that set it failed, and arc's CI now runs all five FineType tools against a pinned finetype release with every argument they advertise. And with ARC_SQL_READER=duckdb, a step holding a statement DuckDB warns about while parsing it, such as PRAGMA threads = 4, is read again instead of being refused as unreadable. curl -fsSL https://install.meridian.online/arc | bash installs it.

Arcform docs → · v0.2.1 release notes on GitHub →

Arcform v0.2.0 — the first release, with an install script and an MCP server for agents

What shipped. Arcform's first published release. curl -fsSL https://install.meridian.online/arc | bash installs arc for macOS or Linux, on x86_64 and aarch64, with DuckDB built in; cargo install arcform --locked --features mcp,bundled-duckdb builds the same from crates.io. arc mcp serves arc to an AI agent over the Model Context Protocol: an agent can create a Protocol, record SQL and command steps into it, run it, describe a table with table_describe and look at the results with sql_query, a read-only SELECT capped at 100 rows by default. What the agent leaves behind is a versioned arcform.yaml anyone can rerun, not a scratchpad. The same two looks are on the command line as arc table describe and arc sql query. Beside them: fetching and unpacking data, SQL modelling on DuckDB, operators for embeddings, UMAP maps, entity resolution, Parquet export and DuckLake publishing, FineType semantic types, Frictionless Data Package descriptors, and a history of every change to a Protocol that travels with it through git.

Arcform docs → · v0.2.0 release notes on GitHub →

Brightfield v0.1.6 — design the chart of the file you open, and keep its versions

What to try. Open a CSV or a Parquet, from the picker or the welcome screen's catalogue, and design its chart. A shelf band under the hero's header holds a cell for each channel: put a column from the Outline's list on x, y or colour by its chips, or with z and the channel, and u takes back the last one. Tab on a shelf entry turns its list to settings. An axis lists its scale, range, ticks, grid, zero, reverse, title and tick format, and a click on any part of an axis lands on its row. Colour lists its scheme, picked by eye from a strip of ramps, its scale (linear, diverging about a pivot, or steps), where its legend goes (right, below the plot, or nowhere), reverse and domain. The chart redraws on each change, and a field that cannot take what you typed says why. Save writes the chart into a file beside the Protocol, each edit on its own line, and the chart is drawn from it when the Protocol is reopened. Closing with unsaved edits asks whether to save and close, close without saving, or keep editing, and the Versions panel, the ledger's fifth, lists each saved version with what changed and steps the chart back to any of them.

Also new. The window takes the design system's square look, with line tabs on the rails and panes. A numeric column in the Outline's list shows its rug in place of its type. The grid has a cell cursor that moves with the grid's keys. A chart file can now carry tick formats for numbers and dates, fixed axis ends, zero and nice, reversed axes and gridlines left out, and the warning banner names any attribute this build does not read. Each release now installs the published Homebrew formula and runs the installed copy before it is called done. Still an early preview, macOS only, unsigned.

v0.1.6 release notes on GitHub →

Finetype v0.6.62 — one value is enough to read a duration, a time zone or a log timestamp

What shipped. finetype infer -i and ft_infer read a single value in its datetime category when its shape says so: PT30M is now an ISO 8601 duration, America/New_York an IANA zone, 04/Mar/2024:05:06:07 +00 a Common Log Format timestamp, and 04-03-24 a two-digit-year date, read the way DuckDB's CSV sniffer reads it. Before, the same values were read as an identifier, a continent, plain text and a time. The multi-symbol amount pattern now reads the amount to its end, so finetype validate no longer accepts R$ 1 apple as an amount. Common Log Format accepts the +00 and +00:00 offsets DuckDB writes and reads. release_priority leaves the taxonomy, with the --priority flag. And the CLDR tables gain each date-pattern locale's default numbering system, which says that ar-SA writes ١٥/١/٢٠٢٤, not 15/01/2024.

Finetype docs → · v0.6.62 release notes on GitHub →

Brightfield v0.1.5 — a welcome screen, a point map, and a protocol behind the file you open

What shipped. The first screen is now a welcome screen whose catalogue holds real datasets: the EDGAR↔GLEIF crosswalk in its two forms, and California Housing, which opens from a copy bundled in the app with no network. Opening a CSV or a Parquet also builds a one-step protocol that says what was opened, so the outline and inspector rails describe the file, and the ledger rail is now the run record (Log, Quality, Rows, Editor) with a Run control on its strip that runs the protocol. The canvas draws a hero pane and a grid pane side by side; the edge between them drags and the split comes back on the next open, and the grid can lay its columns out as brushable rows and move between the canvas and the ledger. A pair of longitude and latitude columns is drawn as one point map through a named projection with a graticule. A positional axis can be log or symlog, and a binned column bins in that space, so a long-tailed column can be spread across its bins. A histogram whose fill names a column stacks its categories, and a control on the plot reads them as shares within each bin. Resting the pointer on a mark reads the row beneath it out of the engine, a press inside a committed brush moves it, and the status band leads with a live count of selected rows out of the total. Opening a file is quicker: a small file is read into the engine once and every numeric column's distribution is counted in a single pass, and the remote start fetches on a worker so the window keeps answering. The banner that says the data changed on disk now offers Reload, and a saved protocol reopens to its data file from any working directory. Still an early preview, macOS only, unsigned.

v0.1.5 release notes on GitHub →

Finetype v0.6.61 — registry expressions return what they name, and ft_detail becomes an aggregate

What shipped. ft_detail is now a DuckDB aggregate that shares ft_profile's state, so the explanation it returns is of the verdict ft_profile gave over the same rows, where before it pooled a chunk and could explain a type ft_profile never gave. Its three scalar forms retire, which breaks callers of the removed forms: ft_detail(list(col)) becomes ft_detail(col). Each transform and decompose expression in the registry now returns a value on each of its own type's samples, and CI runs every expression on every sample to keep it that way. A REGEXP_EXTRACT with no group index had returned the whole match, so a URL's hostname read https://example.com, an ARN's partition read arn:aws:, and an E.164 number's country code read +614 for +61412345678. And the profile-eval accuracy measurement is re-run against the 0.6.60 release binary and written into a dated, tracked report.

Finetype docs → · v0.6.61 release notes on GitHub →

Finetype v0.6.60 — finetype validate verifies check digits, not only shape

What shipped. finetype validate now verifies a column's check digit and not only its shape, so a value that merely looks like an LEI or an ISBN no longer clears validation on the identifier columns crosswalks are joined on. A CSV sniff that could confirm itself against a file's own last line now requires a real data row to follow the one it lands on. profile's free-text classification is measured across repeated draws of real-world columns for whether the same label comes back twice, establishing the first stability baseline for that measurement. And invalid LEI values in the evaluation corpus are replaced with ones that pass the checksum they were meant to test.

Finetype docs → · v0.6.60 release notes on GitHub →

Finetype v0.6.59 — a release attaches the DuckDB extension and taxonomy catalogue, and the extension is stamped with its own build

What shipped. A tagged release now attaches the DuckDB extension and the taxonomy schema catalogue as downloadable, checksummed assets for every supported platform, alongside the existing CLI tarballs. The extension itself is now stamped with the version of the git ref it was built from, closing a gap where the previous build step silently skipped that stamp and the artifact carried whatever version happened to already be on disk.

Finetype docs → · v0.6.59 release notes on GitHub →

Brightfield v0.1.4 — open your own file, and the window is one arrangement

What shipped. Open a CSV or a Parquet from the front door and a dashboard is generated from it, a tile per column chosen from what the column means: a histogram that keeps the unfiltered total behind the brushed subset, ranked bars with the count inside the bar, a tile for a date column, and a scatter for a pair of numbers. Around it the window is now one arrangement: the protocol outline on the left, an inspector on the right where the Controls column was, Steps and the spec editor along the bottom, and rails that collapse. The chart canvas follows the theme, the command palette reaches the chart view, and the status rail says what a chart holds when nothing is running. The protocol viewer reads the same manifest rules as the tool that runs them. Still an early preview, macOS only, unsigned.

v0.1.4 release notes on GitHub →

Finetype v0.6.58 — constraints follow the declared type, and a CSV is sniffed before it is read

What shipped. Every field constraint is now routed by the type the field declares, so a declared type carries its own bounds rather than whichever ones the inference happened to pick. A CSV's shape is sniffed first and then read with the column list the sniff pinned, which is what stops a ragged or oddly quoted file from being read as a different table than the one on disk. Model training is reproducible at a seed, and the training criterion rejects a trainer that takes no step. The repository also gains a measurement of whether a static embedding changes what a 2D map looks like, with its two floors, which is the evidence behind the embedding work rather than a change to the extension.

Finetype docs → · v0.6.58 release notes on GitHub →

Finetype v0.6.57 — two classifier accuracy fixes: naics.title and jurisdiction

What shipped. Two classifier accuracy fixes: naics.title now reads the entity name, and jurisdiction now reads the postal code or state code — both were previously reading a mismatched field. The taxonomy's published sample for representation.identifier.numeric_code no longer looks like a NAICS code, since it isn't one. Every published sample in the taxonomy is now checked against the pattern it's meant to match.

Finetype docs → · v0.6.57 release notes on GitHub →

Brightfield v0.1.3 — a .dmg install alongside the tarball

What shipped. A second way to install: Brightfield.app inside a .dmg, for anyone who wants an icon in the Dock and a double-click launch rather than a terminal and a tarball. The tarball install is unchanged, and both downloads are the same build. Underneath, a navigation move now serves its domain facts from cache instead of re-deriving them, and a plot above the drawn-primitive ceiling samples itself rather than stalling.

v0.1.3 release notes on GitHub →

Brightfield v0.1.2 — sampled-plot domains corrected, crosshair clipped to its own plot

A correctness release for dashboards with more than one plot.

What shipped. A sampled plot's positional domain was being read from only its first mark; it now reads from all of them, so a sampled dashboard no longer clips series that should be visible. The same fix applies to a sampled plot's colour domain, which was previously refused rather than drawn. A spec's fixed-domain instruction is now honoured instead of overridden by the data. The hover crosshair no longer bleeds into a neighbouring plot — it clips to the plot the pointer is actually in. A bar cross-filter now draws only the part of each bar the selection produced, rather than the whole bar.

v0.1.2 release notes on GitHub →

Finetype v0.6.55 — the LEI pattern widens to ISO 17442's full range

What shipped. The LEI pattern now covers the full alphanumeric LOU-prefix range ISO 17442 defines, so more legal-entity identifiers classify correctly instead of falling through to a weaker type. The published docs are now checked against the CLI they document, with gates that fail on a claim the tool no longer backs.

Finetype docs → · v0.6.55 release notes on GitHub →

Brightfield v0.1.1 — cross-filter ink, a histogram shorthand, and a settled zoom

The second brightfield release, one week after v0.1.0.

What shipped. A committed cross-filter now leaves ink on the plot that produced it, instead of vanishing once the selection settles. x: {bin: col} with y: {count:} draws a histogram without a separate binning step. A navigation zoom now settles into a persisted extent and re-queries against it, and an interval slider drives that same zoom through a sustained drag. Confidence bands on a fit are dashed, distinct from the fit line itself, and a fit that has outlived its frame says so in the ink rather than staying silent. Every Arrow chunk of a mark now draws — previously only the first chunk did, so a large result could render as though it were partial. The CLI reports a real --version and --help, and refuses to run a build whose version doesn't match its release tag. First launch gets a returnable front door and chrome worth seeing before a spec is loaded.

v0.1.1 release notes on GitHub →

Finetype v0.6.54 — the value encoder halves in size

What shipped. The value encoder now stores in half precision: the shipped binary drops from 67.4 MB to 52.1 MB. The NAICS validator accepts the three official hyphenated sector ranges it previously rejected. A compact YYYYMMDD date is now validated by date range rather than by its eight-digit shape, so an eight-digit number that isn't a real date no longer passes as one.

Finetype docs → · v0.6.54 release notes on GitHub →

Brightfield v0.1.0 — the first public release

Brightfield — the native macOS app that renders Mosaic specs and protocol graphs on your GPU — is public. One command installs it:

curl -fsSL https://install.meridian.online/brightfield | bash

or, with Homebrew: brew install meridian-online/tap/brightfield.

Works today. It opens on a curated gallery of starts — bundled examples plus the EDGAR ↔ GLEIF crosswalk protocol graph — so there is something to render the moment it launches. A single binary, no server, no account. Every bundled example draws with the network switched off, and it reports nothing: no telemetry, no update check.

Not yet. Linux and Windows builds — the renderer is portable, and the Brightfield page takes your email if you want to hear the moment Linux lands. The deeper data work is also still ahead: pointing it at your own sources and shaping data in place.

Install Brightfield → · v0.1.0 release notes on GitHub →