Defuddle - Web Content Extraction

Local, zero-API web page content extractor that outputs clean Markdown with Obsidian-native formatting. By Kepano (Obsidian creator), 6.7K+ GitHub stars. Used as fallback when Jina Reader or Firecrawl are unavailable.

What It Does

Defuddle takes a URL or HTML, finds the main content, strips clutter (comments, sidebars, headers, footers, ads), and returns cleaned HTML or Markdown. It was created for the Obsidian Web Clipper but runs anywhere - browser, Node.js, or CLI.

Key advantages over Mozilla Readability: more forgiving extraction (removes fewer uncertain elements), consistent output for footnotes/math/code blocks, uses mobile styles to detect unnecessary elements, and extracts richer metadata including schema.org data.

Role in the Stack

Defuddle is the fallback web page reader, used when primary tools are unavailable:

  1. Primary: Jina Reader (curl -s "https://r.jina.ai/URL") - zero-config, fast, cloud-hosted
  2. Primary (automations): Firecrawl MCP - used by cloud Cursor Automations
  3. Fallback: Defuddle (npx defuddle parse URL --markdown) - local, no API dependency

Use defuddle when Jina returns errors, rate-limits, or is down. Also preferred when metadata extraction (author, published date, description, schema.org) is needed alongside content.

CLI Usage

npx defuddle parse URL --markdown          # Markdown output to stdout
npx defuddle parse URL --json              # JSON with metadata + content
npx defuddle parse URL -m -o output.md     # Save to file
npx defuddle parse URL -p title            # Extract single property
npx defuddle parse page.html --markdown    # Parse local HTML file

Metadata Returned (JSON mode)

Field Description
title Article title
author Author name
published Publication date
description Summary/description
domain Website domain
image Main image URL
language BCP 47 language code
wordCount Word count
schemaOrgData Raw schema.org structured data

Obsidian-Native Output

Defuddle's Markdown output aligns with Obsidian conventions:

  • Callouts> [!info] format (GitHub alerts, Bootstrap alerts all standardized)
  • Footnotes → standard [^1] inline references
  • Code blocks → language tags preserved, line numbers stripped
  • Math → MathML with LaTeX data-latex attribute
  • Headings → H1 removed if matches title, remaining H1s converted to H2

Timeline