iwe update — frontmatter schema inference, djot support, and semantic line breaks
A few weeks back I posted an intro to iwe — a single Rust binary that treats a folder of .md files as a queryable database: Mongo-style filters over frontmatter, graph operators over links, bulk update/delete with --dry-run. No daemon, no database, just files.
Since then a few releases landed, plus there's one command I never showed. The parts this sub might care about:
iwe schema — what's actually in your frontmatter? After a corpus grows for a year, nobody remembers which fields exist, which are always set, and what values they hold. schema scans every file and reports per-field types, coverage, and value distribution:
$ iwe schema
| Field | Types | Coverage | Distinct | Values |
| -------- | ------------------------ | ---------- | -------- | ----------------------------------- |
| created | date (100%) | 214 (100%) | 89 | 2026-06-12 (6), 2026-05-30 (5), ... |
| priority | number (94%), null (6%) | 214 (100%) | 9 | 5 (61), 3 (48), 8 (22), ... |
| status | string (100%) | 187 (87%) | 4 | done (95), draft (51), Draft (3)... |
| owner | string (71%), null (29%) | 132 (62%) | 12 | alice (40), bob (31), ... |
--field status drills into one field; -f json for scripting; the same --filter flags scope it to a subset. It closes the loop with the query side — schema shows you that status holds both draft and Draft, then:
iwe update --filter 'status: Draft' --set status=draft
djot support. Set format = "djot" in the config and the whole toolchain — normalize, find, export, new — reads and writes djot (.dj files) instead of markdown.
Semantic line breaks survive the formatter. If you write one sentence per line (great for git diff), iwe normalize used to join them into a single paragraph line. New preserve_newlines config option keeps your line structure while still fixing headers, lists, and link titles.
Wiki-link path rewriting. wiki_link_path = "short" makes normalize rewrite every wiki link to the shortest unambiguous suffix; "full" expands to complete paths; "preserve" (default) leaves them as typed. One corpus-wide pass, consistent links.
Formatter hardening. Escaped literals (\*not emphasis\*) survive normalization, [X] task markers lowercase to [x], list items with code blocks or tables render loose instead of glued together, and a config option gives MkDocs-style 4-space list indentation if that's your ecosystem.
Install: cargo install iwe (or brew install iwe-org/iwe/iwe). Repo: <https://github.com/iwe-org/iwe>
Curious what people here would want from the schema side — validation against a declared schema is the obvious next step, but I'd rather hear real use cases first.