ingest

Fetch a URL, workspace file, or attachment and integrate its content into the vault — one primary page plus cross-linked updates to related pages

6 stars

Best use case

ingest is best used when you need a repeatable AI agent workflow instead of a one-off prompt.

Fetch a URL, workspace file, or attachment and integrate its content into the vault — one primary page plus cross-linked updates to related pages

Teams using ingest should expect a more consistent output, faster repeated execution, less prompt rewriting.

When to use this skill

  • You want a reusable workflow that can be run more than once with consistent structure.

When not to use this skill

  • You only need a quick one-off answer and do not need a reusable workflow.
  • You cannot install or maintain the underlying files, dependencies, or repository context.

Installation

Claude Code / Cursor / Codex

$curl -o ~/.claude/skills/ingest/SKILL.md --create-dirs "https://raw.githubusercontent.com/lmorchard/decafclaw/main/src/decafclaw/skills/ingest/SKILL.md"

Manual Installation

  1. Download SKILL.md from GitHub
  2. Place it in .claude/skills/ingest/SKILL.md inside your project
  3. Restart your AI agent — it will auto-discover the skill

How ingest Compares

Feature / AgentingestStandard Approach
Platform SupportNot specifiedLimited / Varies
Context Awareness High Baseline
Installation ComplexityUnknownN/A

Frequently Asked Questions

What does this skill do?

Fetch a URL, workspace file, or attachment and integrate its content into the vault — one primary page plus cross-linked updates to related pages

Where can I find the source code?

You can find the source code on GitHub using the link provided at the top of the page.

SKILL.md Source

# Ingest

You are processing a single source into the vault. One source in, a handful of pages out. Stop when done — do not re-engage with the prior conversation unless the user asks in a new turn.

The source is in `$ARGUMENTS`. Parse it:

- Starts with `http://` or `https://` → URL.
- Starts with `workspace/`, or otherwise contains a `/` and therefore names a relative path → workspace file.
- No `$ARGUMENTS` at all, or a bare filename with no `/` → attachment. Call `list_attachments`; if there is exactly one, use it; if there are several, use the most recent and mention the choice; if none, report the error and stop.
- A ` — ` separator splits the source from an optional focus instruction (e.g. `https://... — focus on the security angle`). The focus shapes the content emphasis of what you write; it does NOT override the output folder.

Announce the source in one short line before you start (e.g. "Ingesting: https://example.com/article").

## Step 1: Fetch

Pick the right tool for the source type:

- **URL**: try `tabstack_extract_markdown` first. If it errors (rate limit, unsupported site, credits exhausted), fall back to `web_fetch`. Inspect the returned content — if it looks like an error page, a stub, or unrelated boilerplate, report the failure and stop. Do not fabricate content.
- **Workspace file**: `workspace_read(path=<path>)`. The `path` argument is relative to the workspace root — strip any leading `workspace/` prefix before calling. Example: `/ingest workspace/imports/paper.md` → `workspace_read(path="imports/paper.md")`.
- **Attachment**: `get_attachment(filename=<name>)`. For text files this returns the content. For images it returns media. For other binary formats (PDF, etc.) it returns only base64 metadata — in that case, report "binary attachment not directly ingestible — please extract text first" and stop.

For large sources, extract the core claims and notable details; don't try to mirror everything. A long paper becomes a page or two of distilled knowledge, not a wholesale copy.

## Step 2: Understand

Read the fetched content. Note:

- The primary topic (what the source is fundamentally about).
- Key entities (people, projects, tools, concepts) it references.
- Specific claims, findings, or recommendations worth preserving.
- Any focus instruction from `$ARGUMENTS` — let it shape what you foreground.

## Step 3: Search the vault

Use `vault_search` (and `vault_list` if you need to browse a folder) to find existing pages related to this source's topics. Cast a net wide enough to find:

- A page on the primary topic (may exist under a different slug).
- Pages on the major entities referenced.
- Pages on the broader concepts it touches.

**If a page on the exact source or its primary topic already exists under `agent/pages/`, treat it as the primary page and update in place.** If a strong match exists elsewhere in the vault (e.g. a user note), leave that page alone — Step 4 covers how to handle it.

## Step 4: Plan the updates

Decide what pages to touch:

**All writes from this skill stay under `agent/pages/` — do not write to admin pages, user pages, or anywhere else in the vault.** If `vault_search` surfaces a strong match that lives outside `agent/pages/`, do NOT edit it; instead create or update a page under `agent/pages/` that links to it.

- **One primary page** (required):
  - If a strong match under `agent/pages/` exists, update it. Keep the existing path.
  - Otherwise, create a new page under `agent/pages/`. Choose the subfolder based on content — prefer existing folders where they fit (`agent/pages/tools/`, `agent/pages/papers/`, `agent/pages/people/`, `agent/pages/projects/`, etc.). Create a new subfolder only when the topic is distinct and likely to grow.
- **Zero or more secondary pages** (optional): related pages under `agent/pages/` that should get a sentence or a cross-link added. Do not rewrite them wholesale. Skip any related page that lives outside `agent/pages/`.
- **Cap total pages at ~5** (primary + secondary). If more seem relevant, list them in the summary as candidates for the next garden pass rather than touching them this turn.

## Step 5: Write

For each planned update (all paths must start with `agent/pages/` — if you catch yourself about to write elsewhere, stop and reconsider):

- `vault_read` the existing page, then revise and `vault_write` the updated content. Keep the existing path (still under `agent/pages/`).
- For the new primary page, `vault_write(page=agent/pages/<subfolder>/<name>, content=...)` with:
  - YAML frontmatter:
    ```yaml
    ---
    tags: [ingested, <topic-tags>]
    summary: <one-line summary of the page>
    ---
    ```
  - Body that synthesizes the source in your own words. Add `[[wiki-links]]` to related pages you touched in this ingest.
  - `## Sources` section at the bottom with the URL or file path and the current date (use `current_time`).

Prefer synthesis over quotation. If you do quote, keep quotes short and attribute inline.

## Step 6: Summarize and stop

Deliver a change summary to the user in this shape:

```
Ingested: <source>
Primary page: [[Name]] (new | updated)
Secondary updates: [[A]], [[B]]
(Candidates for the next garden pass: [[C]], [[D]])
```

Only include the parenthetical line if there are deferred candidates.

Then stop. The user will tell you in a new turn if they want to expand a page, add more sources, or kick off a garden run.

Related Skills

mastodon-ingest

6
from lmorchard/decafclaw

Fetch recent Mastodon posts and record interesting content to the vault

linkding-ingest

6
from lmorchard/decafclaw

Fetch recent Linkding bookmarks, analyze their content in child agents, and record insights to the vault

vault

6
from lmorchard/decafclaw

Unified knowledge base — shared Obsidian-compatible vault for curated pages, journal entries, and user notes

tabstack

6
from lmorchard/decafclaw

Your primary tool for any web, PDF, or research task. More powerful than web_fetch — prefer this for all research, web reading, and data extraction. Triggers on: 'tell me about,' 'what is,' 'look up,' 'find out,' 'research,' 'summarize this article,' 'read this PDF,' 'check this site,' 'what does this page say,' 'extract data from,' 'find the price on,' 'compare X vs Y,' 'is it true that,' or any URL/link. Handles JavaScript-heavy websites, PDFs, structured data extraction, content transformation, multi-source research with citations, and multi-step browser automation.

project

6
from lmorchard/decafclaw

Structured project workflow: brainstorm, spec, plan, execute multi-step tasks

postmortem

6
from lmorchard/decafclaw

Structured blameless analysis of what went wrong in this conversation — identifies root causes and proposes minimal, specific fixes

newsletter

6
from lmorchard/decafclaw

Compose and deliver a narrative newsletter summarizing autonomous agent activity in the window.

mcp

6
from lmorchard/decafclaw

Admin tools for inspecting and restarting connected MCP servers — status, resources, prompts. Does NOT expose tools provided by MCP servers; those appear as mcp__server__tool and are fetched via tool_search.

health

6
from lmorchard/decafclaw

Show agent diagnostic status — process, MCP, heartbeat, tools, embeddings

garden

6
from lmorchard/decafclaw

Vault gardening sweep — merge, link, split, and tidy agent pages

dream

6
from lmorchard/decafclaw

Review recent journal entries and conversations, distill insights into vault pages

claude_code

6
from lmorchard/decafclaw

Delegate coding tasks to Claude Code as a subagent. Use when asked to fix bugs, add features, refactor code, write tests, review code, or do any work that requires reading and editing files in a codebase. Triggers on: 'fix this bug', 'add a feature', 'refactor', 'write a test', 'review this code', 'update the config', 'clean up', or any request involving code changes in a repository.