A bring-your-own-rules linting toolkit. The image carries four complementary engines; none of them ship opinions about your content — you supply the style rules and config at run time.
Most writing-quality tooling is either a single engine or a hosted service. This container bundles the four open-source engines that, together, cover the distinct layers of prose quality, and keeps them offline and deterministic (no runtime model downloads, no network calls):
| Engine | Layer | Rules live… |
|---|---|---|
| Vale | configurable style / usage / terminology | in your .vale.ini + StylesPath (mounted) |
| LanguageTool | grammar / spelling / punctuation | built into the engine (offline) |
| proselint | opinionated prose style (clichés, hedging, redundancy) | built into the engine |
| textstat | readability metrics (Flesch-Kincaid, Gunning fog, SMOG…) | n/a (pure measurement) |
The key design point for Vale: the image contains the engine only. Vale
reads a user-supplied .vale.ini and a StylesPath directory of .yml rule
files, mounted at run time (--config or VALE_CONFIG_PATH). So you can encode
any house style — a documentation team's terminology, a publication's voice, a
brand's banned-words list — entirely in files you control, and this image never
needs to know what they are.
vale --config /work/.vale.ini /work/draft.md,
--output=JSON for machine consumption. No rules bundled.proselint --json /work/draft.md.~500 MB (the JRE + the LanguageTool distribution are the bulk; Vale is ~20 MB, the Python libs are small).
make prose-lint
make prose-lint R=1 # build + run smoke tests
make prose-lint I=1 # interactive shell
Run Vale against your own mounted style. The linters are CLIs, so driving them
is a shell + jq job (shell mode), not a Python one:
vale --output=JSON --config /work/.vale.ini /work/draft.md | jq .
A combined one-pass gate (the three CLI linters → one JSON verdict via jq) is
shown in fraglet/shell-guide.md. Readability (textstat) is a Python library, so
it lives in the default Python mode (fraglet/default-guide.md).
Register a flat-file tool that runs the CLI linters over a mounted draft + style
— a shell-mode gate (vale/languagetool/proselint piped through jq):
operon run ofthemachine/prose-lint prose_gate.sh \
--file draft=<md-ref>:/work/draft.md \
--file vale_config=<ini-ref>:/work/.vale.ini \
--record-ref tooling/prose/gate
operon tool register tools/prose/gate --from-code tooling/prose/gate
operon invoke tools/prose/gate --file draft=<md-ref>:/work/draft.md ...
Your style package (the .vale.ini + StylesPath/) is supplied as mounted
FILE refs — it stays in your workspace, never in this image.
Content type
Image
Digest
sha256:d8fc348dd…
Size
414.9 MB
Last updated
19 days ago
docker pull ofthemachine/prose-lint