Skip to main content
skill CX Codex

defuddle · agricidaniel — Claude Code skill: readable Markdown from web pages

Plans Defuddle extraction and retains already available local source files. No network cleaning ships with it — just the plan and the capture.

Install into Claude Code · Skills CLI (Vercel) All methods and platforms ↓
npx skills add AgriciDaniel/claude-obsidian --skill defuddle -a claude-code
Open on GitHub

What defuddle does

The skill runs in two modes. First, an inert plan for an HTTPS link: it takes the address, drops credentials, fragments and non-public hosts, then reports the normalized host, required network egress, redirect policy and execute: false. Second, a capture of an existing local HTML or Markdown file into the selected vault's inbox/.

No network request happens here. The reason is concrete: the Defuddle CLI follows redirects and enables asynchronous extraction, so even parsing a local HTML file can pull in third-party resources. Consent for the initial URL does not prove every eventual destination stays approved. A configured state means an executable was found without a bundled behavioral verifier — running it just because it turned up is the wrong move.

Capture goes through scripts/claude-obsidian.py: capture plan first, then capture apply with a pinned timestamp and operation ID, and --approved-plan-sha256 plus --apply for the write. Bytes land in create-only .raw/captured/ storage, and a repeated identical payload is a no-op. Cleaning HTML, verifying source metadata and synthesizing pages are separate operations.

What it helps with

  • strip page clutter and get readable Markdown from a web page
  • build an extraction plan for a URL without a network request
  • retain a local HTML or Markdown file in the vault as raw bytes
  • prepare a web source for later wiki ingestion
  • check which hosts and redirects an extraction would require

Example prompts for the agent

  • defuddle, clean this URL and show me the extraction plan
  • turn this web page into readable Markdown
  • retain the local file $VAULT/inbox/source.md in the vault

How to install defuddle

1Skills CLI (Vercel)

npx skills add AgriciDaniel/claude-obsidian --skill defuddle -a claude-code

2Manually: put the files in place

~/.claude/skills/defuddle/SKILL.md

Copy the whole skill folder; for one project use .claude/skills/defuddle/

Step by step, with commands for each platform: How to install skills in Claude Code: five ways

Questions about defuddle

How do I install defuddle in Claude?

Run npx skills add AgriciDaniel/claude-obsidian --skill defuddle -a claude-code. The skill lands at ~/.claude/skills/defuddle/SKILL.md.

What does defuddle do?

It builds an inert extraction plan for an HTTPS URL and retains already available local files in the vault. It does not perform network cleaning.

Why does URL extraction stop before running?

The Defuddle CLI follows redirects and enables asynchronous extraction, so checking the initial URL cannot guarantee approved destinations. The URL stays queued until an enforcing adapter is verified.

Source text

SKILL.md · MIT
---
name: defuddle
description: Plan optional Defuddle extraction and retain already available local source files through reviewed filesystem capture. Use for defuddle, clean this URL, strip page clutter, readable Markdown from a web page, or preparing a web source for later wiki ingestion. Network extraction remains unavailable until an enforcing adapter is verified.
---

# Defuddle

Treat Defuddle as an optional external extractor. This package supports inert
URL plans and filesystem capture; it does not ship an enforcing network cleaner.
Cleaning, raw capture, and wiki ingestion are separate operations.

Resolve the installed product root from this skill's own location, never from
the selected vault or process working directory:

```bash
PRODUCT_ROOT=/absolute/path/to/installed/claude-obsidian
CORE="$PRODUCT_ROOT/scripts/claude-obsidian.py"
test -f "$CORE"
```

Every `../wiki/references/` link in this file resolves the same way, relative
to this skill's own directory under `$PRODUCT_ROOT`, never relative to the
selected vault's `wiki/` directory.
Upstream flags may be checked in a separately installed `kepano/obsidian-skills`
reference, but do not override this package's privacy and transaction boundary.

## Inert URL plan

Accept HTTPS URLs only. Reject credentials, fragments, controls, sensitive query
parameters, and non-public hosts or IP addresses. Never interpolate a URL into a
shell string. Use one argv element when constructing a plan:

```bash
python3 "$CORE" capture external-plan url "HTTPS_URL"
python3 "$CORE" contracts --verify --capability defuddle --vault "$VAULT"
```

The plan executes no network request. Report the normalized host, required
network egress, redirect policy, optional dependency, and `execute: false`.
An `available` state means no executable was found. A `configured` state means
an executable was discovered without a bundled behavioral verifier. Identify
the manual executable and its reported reason; never run it merely because it
was found. Never relabel `configured` as `verified`.

## Why execution stops here

The upstream CLI inspected at commit
[`556d74e8c8fd68c49912d4b11a4ae9ec04d7b2b5`](https://github.com/kepano/defuddle/tree/556d74e8c8fd68c49912d4b11a4ae9ec04d7b2b5)
(checked 2026-10-17) follows redirects and enables asynchronous extraction.
Even parsing a local HTML file can request additional resources or third-party
fallbacks. Inspecting argv or obtaining consent for the initial URL cannot
prove that every eventual destination remains approved.

Do not execute the bare CLI against a URL or local HTML under this workflow.
Do not silently substitute a browser, fetcher, proxy, cookies, or another runner.
A future runnable adapter must enforce approved destinations after DNS and on
each redirect, disable uncontrolled async/fallback traffic, constrain proxy
behavior, and bound bytes, time, and subprocess output. It must retain original
and final locators, exact version, approved hosts, capture hash, and mode.
Behavioral tests must prove these limits before execution is offered. Consent
for each destination remains required even with an enforcing adapter.

Do not install tools or claim cleaning, extraction quality, or token savings.
Leave the URL queued, or accept an already available local file. A local file
may be retained as bytes without rendering HTML or running its scripts.

## Reviewable filesystem capture

When the user asks to retain an existing local HTML or Markdown file, place it
in the selected vault's `inbox/` first. Preview and apply the filesystem plan
with a pinned timestamp and operation ID:

```bash
python3 "$CORE" capture plan --vault "$VAULT" "$VAULT/inbox/source.md"
python3 "$CORE" capture apply --vault "$VAULT" "$VAULT/inbox/source.md" \
  --generated-at "$GENERATED_AT" --operation-id "$OPERATION_ID"
# Set APPROVAL_SHA256 to the reviewed approved_plan_sha256 from the dry run.
python3 "$CORE" capture apply --vault "$VAULT" "$VAULT/inbox/source.md" \
  --generated-at "$GENERATED_AT" --operation-id "$OPERATION_ID" \
  --approved-plan-sha256 "$APPROVAL_SHA256" --apply
```

This preserves source bytes in create-only `.raw/captured/` storage. It does not
clean HTML, verify source metadata, or synthesize pages. Inspect the actual
result and record extraction limitations. If already cleaned text is supplied,
retain its known extractor/version and locator without inventing missing fields.
Report the operation ID and exact changed paths. A repeated identical payload
is a no-op; never overwrite immutable raw state.

Use [operation-transactions.md](../wiki/references/operation-transactions.md)
for custom capture drafts. Read or analyze transiently when retention was not
requested. Invoke `wiki-ingest` only as a distinct requested operation.

© AgriciDaniel · MIT · AgriciDaniel/claude-obsidian

Similar skills

All skills for Agent setup: memory, context, orchestration →

defuddle by other authors comes first.

From the same set11

Project sponsors

Companies that keep this analytics open
Gold sponsor

Impressions, clicks and code copies — open statistics. We keep the numbers public for the same reason NeBlask itself is public. Become a sponsor