// the find
kepano/defuddle
Get the main content of any page as Markdown.
Defuddle strips the chrome off a web page and hands you clean HTML or Markdown — the content-extraction engine behind Obsidian Web Clipper, usable standalone in the browser, Node, or as a CLI. It's aimed at anyone building a clipper, read-it-later app, or RAG pipeline that needs reliable article text instead of a full DOM dump.
The test suite is the real signal here: hundreds of fixture/expected pairs covering specific real-world breakage (Substack notes, arXiv equation tables, ChatGPT exports, lazy-loaded images, Lean/Verso code blocks) rather than a handful of happy-path checks. It ships site-specific extractors for ~20 platforms (Reddit, HN, Bluesky, GitHub issues/PRs, ChatGPT, Claude, Gemini) so structured conversational content doesn't get mangled the way generic Readability-style scoring would mangle it. Debug mode returns the actual removal log — step, selector, reason, snippet — so when extraction goes wrong you can see why instead of guessing at a black-box heuristic. Standardizing footnotes, callouts, and math (MathJax/KaTeX → MathML) into one consistent shape is genuinely useful if you're piping output into something like Obsidian that expects a fixed format.
The README says outright it's 'very much a work in progress' — the core approach is still scoring-based heuristics (removeLowScoring, partial selector matching), so it inherits Readability's basic failure mode of occasionally eating or keeping the wrong block on a layout it hasn't seen a fixture for. parseAsync will silently call a third-party API (FxTwitter) when it can't find local content, which is a surprising default for a library billed as running anywhere — fine until you're processing pages you don't want leaving your process, and you have to know to pass useAsync: false. The CLI needing a custom --user-agent flag to dodge 403s is a tell that it has no real anti-bot-detection story, so scraping protected sites will need your own fetch layer anyway. Bundle choice is a real decision, not a formality — picking core vs full changes math fidelity, so you have to read the docs table instead of just npm installing and moving on.