Findings from building the Frictionless Data Explorer
A research artefact — what we found in 2026, against
frictionless 5.19.0 on Pyodide 0.27.7
Does the Frictionless ecosystem do what we expect — and where does it creak?
frictionless CLI runs entirely in the
browser. No servers, no accounts.
Try it: the IDE lives at /playground/ alongside these
slides.
Frictionless fits — with well-articulated caveats.
utf-8-sig); semicolon and tab delimiters auto-detect
with no hint.
describe/validate on a package URL follow
relative paths and resolve foreign keys across CSVs at the same
prefix. File/URL polymorphism is invisible.
frictionless validate file.csv with no schema returns
VALID — even on garbage semantic data.
--schema it runs only structural
checks: column counts, "does it parse as CSV".
required, unique,
foreign keys — all need a schema.
validate with an
explicit schema. The default mode is a parser check, not
a correctness check.
Promoted to a top-level section in lesson 3.
price_eur
9,50 → inferred as geopoint (!)
9,50 infers price_eur as
geopoint — the comma reads as a
coordinate separator.
{ "type": "number", "decimalChar": "," }.
primaryKey string vs array.
"primaryKey": "id" is accepted in a
package schema but rejected inside an
inquiry-embedded schema (must be ["id"]).
"schema": "schema.json"
works in a resource descriptor but fails inside an
inquiry task — embed the schema inline there.
unique-error and primary-key
— one fix clears both, but a literal reading over-counts.
transform in v5.19. The
most-mentioned Frictionless verb is the only one without a CLI —
you drop into the Python transform() function.
row-filter formulas operate on raw strings.
published_year >= 1970 raises TypeError;
the working form is int(published_year) >= 1970.
field-remove
takes names (plural); siblings take name.
There is no field-rename — you use
field-update with descriptor.name.
Most version-fragile lesson in the curriculum — pin Frictionless and re-walk lesson 6 on any upgrade.
/file.csv "not safe" — the worker
chdirs into the workspace and passes relative paths.
These are delivery constraints of running in-browser — not Frictionless limitations.
| # | Lesson | Verdict | Headline finding |
|---|---|---|---|
| 1 | Describe | Clean | Cleanest surface; integer not year by default |
| 2 | Schema | Clean | Hand-readable; primaryKey ≠ field unique |
| 3 | Validate | Caveat | No-schema validate returns VALID on bad data |
| 4 | Package | Strong | Foreign-key reports are excellent; paths are cwd-relative |
| 5 | Dialect | Caveat | BOM/delimiter sniffing good; 9,50 → geopoint |
| 6 | Transform | Fragile | No CLI; raw-string formulas; inconsistent steps |
| 7 | Inquiry | Caveat | Stricter than packages; embed schemas inline |
| 8 | Publish | Strong | Remote consumption "just works"; tutorial URLs often dead |
Does Frictionless fit our domain — maritime acoustics?
v1 deliberately used stub CSVs. The fitness question owns v1.1:
v1 built the foundation; v1.1 turns it into a domain-fitness assessment. This is the most important remaining question.
Adopt Frictionless for tabular description, schema and validation — with eyes open.
transform across versions.
Evidence: eight lessons' Notes & Observations and
docs/limitations.md.
frictionless in your browserREADME.md Findings & docs/limitations.md — the full catalogue"This is what we found in 2026." — a dated, reproducible reference build.