Skip to content

WritingLint

Live · on‑device

A grammar linter for prose. This manuscript is an AI-written pitch for the project itself — every underline is a structural tell WritingLint caught. Edit it, or switch to the human-edited draft and watch the marks fall away. Everything runs in your browser.

Starting

Loading the dependency parser (~145 MB, one‑time). It runs entirely on your device.

Here is the fun part. Below are two descriptions of WritingLint that say the same thing. The first is the kind of copy an LLM produces. The second is what a human writes after editing it down. The linter above is loaded with the first one — every highlight is a structural tell it caught.

In today’s fast-moving landscape, WritingLint stands as a testament to a simple idea: that prose deserves the same rigor we give code. It’s not just a linter, it’s a paradigm shift in how we think about writing. Leveraging the rich tapestry of dependency-graph analysis, WritingLint delves into the intricate, nuanced, and multifaceted structure of every sentence. Studies suggest that structural tells are far more robust than surface patterns. Moreover, WritingLint boasts a diverse array of authorable rules. Ultimately, it empowers writers to craft clearer, sharper, and more compelling prose. Trust the graph, not the vibes.

WritingLint is a grammar linter for prose. Its rules match over a dependency parse of each sentence, not just a flat list of words or part-of-speech tags. That lets a rule target the real structure of a phrase — say, a coordinated “X, not Y” contrast — which regex and POS patterns tend to miss. The trade-off is speed: the parser is a real model, so it is slower than a pattern matcher. In exchange, you can write richer rules, and they keep working when someone rewords the sentence.

The AI version isn’t wrong — it’s just wearing every tell at once: corrective antithesis (“not just a linter, it’s a paradigm shift”), the rule of three (“intricate, nuanced, and multifaceted”), copula avoidance (“stands as a testament”), vague attribution (“Studies suggest”), promotional verbs (“boasts a diverse array”), and throat-clearing openers (“In today’s…”, “Moreover”, “Ultimately”). WritingLint flags each one by its structure, not by a word list — so the flags survive a synonym swap.

Most prose linters match regular expressions (Vale, proselint) or, at best, a linear part-of-speech stream (Harper’s Weir). That’s enough for “avoid the word utilize”, but it can’t see relationships between words.

WritingLint parses each sentence into a Universal-Dependencies graph — every word linked to its syntactic head with a labeled relation (nsubj, conj, advmod, …) — using nlpgraph, an offline ONNX parser that runs in Node and the browser. A rule can then match on structure: “a conj dependent coordinated by the word ‘not’” catches “Trust the graph, not the vibes” and “Choose clarity, not cleverness” — one rule, no word list, and it holds up when the sentence is reworded.

The pros. Rules can express things regex and POS matching simply can’t: coordinated contrasts, participial appendages, light-verb inflation, copula dressing. Structural tells are also more robust — they survive the surface edits that defeat a keyword linter.

The con. A real parser is heavier than a pattern matcher. The model is a few hundred milliseconds per parse, not microseconds — so WritingLint is slower than a regex linter. We think the richer rules are worth it, and the parse runs off the main thread so your editor stays responsive.

The editor above is one consumer. The engine is a library you can build on, published on npm as writinglint-core, writinglint-parser-node, writinglint-rulepack-ai-style, and the writinglint CLI:

  • Consume it in your own tool: new Linter(parser).lint(text, config) → structured problems. See Consume as a library.
  • Author your own rules with the ESLint-style defineRule API over the dependency graph. See Author a rule.
  • Run it from the CLI: npx writinglint lint README.md. See Command line.

The AI-writing rulepack is just the first pack. The core knows nothing about AI prose — it’s a general grammar-linting engine, and “AI style” is one rulepack among the ones you can write.