mcpField
D
doc-daily-digest

doc-daily-digest

github.com/molechowskiProductivity35 installs
Repository

About doc-daily-digest

A workflow skill for processing Obsidian daily notes: it classifies entries, gathers source material or research, creates structured notes, and replaces processed items with wikilinks. It is intended for users organizing links and ideas in an Obsidian vault.

Key features

  1. 01Classifies links, tweets, and ideas
  2. 02Fetches sources and researches ideas
  3. 03Creates structured Obsidian notes
  4. 04Replaces daily-note items with wikilinks
  5. 05Re-indexes the vault and reports results

Use cases

  1. 01Processing saved URLs in a daily note
  2. 02Turning loose ideas into research notes
  3. 03Reviewing and selecting items before processing
  4. 04Updating daily notes with links to captures

Install

Copy the command and run it in a terminal.

$npx skills add https://github.com/molechowski/claude-skills --skill doc-daily-digest

After installing, type/doc-daily-digestin Claude Code to confirm it loaded.

Details

From the project README

Daily Digest

Process an Obsidian daily note by classifying raw items, fetching/researching content, creating structured notes, and replacing raw items with wikilinks.

Prerequisites

SkillRequiredPurpose
doc-obsidianYesVault CRUD via notesmd-cli + search via qmd
res-xFor X/Twitter URLsFetch tweet content via xAI
res-deepFor loose ideasMulti-round research

Optional dependency: scrapling -- headless browser fallback for sites that block WebFetch (403, empty content, captcha pages). Install with: uv tool install 'scrapling[all]'

Workflow

Step 0: Setup → Step 1: Scan & Classify → Step 2: Process → Step 3: Create Notes → Step 4: Update Daily → Step 5: Re-index & Report

Step 0: Setup

Run all three checks:

# 1. Vault path
VAULT=$(notesmd-cli print-default --path-only)

# 2. Read daily note (today or user-specified date)
DATE=$(date '+%Y-%m-%d')
notesmd-cli print "$DATE"

# 3. xAI key (needed for res-x and res-deep full mode)
security find-generic-password -s "xai-api" -w ~/Library/Keychains/claude-keys.keychain-db 2>/dev/null && echo "XAI_AVAILABLE=true" || echo "XAI_AVAILABLE=false"

If user specifies a date, use that instead of today.

Step 1: Scan & Classify

Parse the daily note and classify every item. Items live in these sections: ## Notes, ## Log, ## Links.

Classification Rules
TypePatternAction
Skip[[wikilink]] anywhere in lineAlready processed — skip
SkipSection headers (##), frontmatter, empty lines, task checkboxesStructural — skip
X tweetURL matching https://(x\.com|twitter\.com)/\w+/status/\d+Fetch via res-x
X articleURL matching https://(x\.com|twitter\.com)/i/article/[\w-]+Fetch via res-x
GitHub repoURL matching https://github\.com/[\w-]+/[\w-]+WebFetch repo page
Web URLAny other https://... URLWebFetch page
Loose ideaNon-empty text that is not a URL, not a wikilink, not structuralDeep research via res-deep
Present Classification

Before processing, show the user a classification table:

## Daily Digest: {DATE}

| # | Section | Type | Item (truncated) | Action |
|---|---------|------|-------------------|--------|
| 1 | Links | X tweet | https://x.com/user/status/123... | res-x fetch |
| 2 | Notes | Loose idea | Train a model to click on... | res-deep |
| 3 | Links | GitHub | https://github.com/org/repo | WebFetch |
| 4 | Log | Skip | [[already-processed]] — ... | skip |

Ask user to confirm or exclude items before proceeding. User may:

  • Approve all
  • Exclude specific items by number
  • Change action for an item (e.g., skip an idea, or upgrade a URL to res-deep)

Step 2: Process Items

Process approved items. Run independent fetches in parallel where possible.

X/Twitter URLs

Requires xAI key (XAI_AVAILABLE=true).

uv run ~/.claude/skills/res-x/scripts/x_fetch.py fetch "URL1" "URL2" "URL3"

The script batches 3 URLs per API call. Extract from results:

  • Author handle and display name
  • Full tweet text
  • Engagement metrics (likes, reposts, replies, views)
  • Thread context and quoted tweets if present

If XAI_AVAILABLE=false, report that X URLs require xAI key and skip them.

GitHub URLs
WebFetch: https://github.com/{owner}/{repo}
Prompt: "Extract: repo name, description, star count, language, license, last update date, and a 2-3 sentence summary of what this project does based on the README."

Scrapling fallback: If WebFetch returns 403, empty content, a captcha page, or a blocked response, retry using the auto-escalation protocol from cli-web-scrape:

  1. scrapling extract get "URL" /tmp/scrapling-fallback.md → Read → validate content
  2. If content is thin (JS-only shell, no data) → scrapling extract fetch "URL" /tmp/scrapling-fallback.md --network-idle --disable-resources → Read → validate
  3. If still blocked → scrapling extract stealthy-fetch "URL" /tmp/scrapling-fallback.md --solve-cloudflare
  4. All tiers fail → note failure and move on
Web URLs
WebFetch: {URL}
Prompt: "Extract: page title, author if available, publication date if available, and a 3-5 sentence summary of the key content."

Scrapling fallback: If WebFetch returns 403, empty content, a captcha page, or a blocked response, retry using the auto-escalation protocol from cli-web-scrape:

  1. scrapling extract get "URL" /tmp/scrapling-fallback.md → Read → validate content
  2. If content is thin (JS-only shell, no data) → scrapling extract fetch "URL" /tmp/scrapling-fallback.md --network-idle --disable-resources → Read → validate
  3. If still blocked → scrapling extract stealthy-fetch "URL" /tmp/scrapling-fallback.md --solve-cloudflare
  4. All tiers fail → note failure and move on
Loose Ideas

Invoke res-deep skill with the idea text as the query. Use quick depth (1 round, 10-15 sources) unless user requests deeper research.

For ideas, the res-deep output becomes the note body directly.

Step 3: Create Notes

For each processed item, create an Obsidian note.

Note Naming
TypeNaming PatternExample
X tweet{topic}-{descriptor} from contentscrapling-undetectable-web-scraping
X article{author}-x-article-{date}irabukht-x-article-2026-02-23
GitHub repo{repo-name}scrapling or huggingface-skills-agent-plugins
Web page{topic}-{descriptor} from titlekubernetes-practical-learning-path
Loose idea{concept}-{descriptor}agent-sort-through-the-slop
Deep research{topic}-deep-researchscrapling-deep-research

All names: kebab-case, lowercase, no special characters.

Check for existing notes with same name before creating. If exists, append -2 or ask user.

Note Structure

For X tweets / web pages / GitHub repos (quick captures):

notesmd-cli create "NOTE_NAME" --content "---
tags: [TYPE_TAG]
source: SOURCE_URL
author: AUTHOR
date: DATE
---

# TITLE

## Key Points

- Point 1
- Point 2
- Point 3

## Summary

Brief paragraph summarizing the content.

## Source

- [Original](SOURCE_URL)"

Type tags: tweet for X, github for GitHub, web for web pages, idea for ideas.

For deep research (ideas):

The res-deep skill produces its own structured output. Create the note with that output as body, adding frontmatter:

notesmd-cli create "NOTE_NAME" --content "---
tags: [idea, research]
date: DATE
---

{res-deep output here}"

Step 4: Update Daily Note

For each processed item, replace the raw text in the daily note with a wikilink.

Wikilink Format by Section

## Links section (URLs from bookmarks/saves):

- [[note-name]] — @author: summary with key metrics (stars, likes, etc.)

## Notes section (ideas and thoughts):

- [[note-name]] — Brief: what the idea/research covers

## Log section (activity entries):

- [[note-name]] — Summary of what was captured
Edit Procedure
  1. Read the daily note: notesmd-cli print "$DATE"
  2. Resolve vault path: VAULT=$(notesmd-cli print-default --path-only)
  3. Use the Edit tool to replace each raw item with its wikilink line
  4. Replace one item at a time to avoid Edit conflicts
  5. Verify the final note by reading it again
Rules
  • Preserve existing wikilinks — never modify already-processed lines
  • Keep section structure intact (## headers, empty lines between items)
  • If an item spans multiple lines (e.g., a paragraph idea), replace all lines with one wikilink line
  • The wikilink summary should be concise (under 120 chars) but include key metrics when available

Step 5: Re-index & Report

Re-index Vault
qmd update && qmd embed
Summary Report

Present a summary table:

## Digest Complete: {DATE}

| # | Type | Note Created | Status |
|---|------|-------------|--------|
| 1 | X tweet | [[note-name]] | Created |
| 2 | Loose idea | [[note-name]] | Created (res-deep quick) |
| 3 | GitHub | [[note-name]] | Created |
| 4 | Web URL | — | Failed (403) |

Notes created: 3
Items skipped: 2 (already processed)
Items failed: 1
Vault re-indexed: Yes

Modes

Full (default)

Process all unprocessed items in the daily note.

"Process my daily note" / "Daily digest"

Selective

Process only specific items or sections.

"Process only the links in today's daily note" "Digest just the X URLs"

Date Override

Process a specific date's daily note.

"Process yesterday's daily note" "Digest 2026-02-20"

Dry Run

Classify and show the table (Step 1) without processing.

"What's unprocessed in my daily note?" "Show me what needs digesting"

Constraints

DO:

  • Always run Step 0 (vault path + daily note + xAI check) first
  • Present classification table and wait for user approval before processing
  • Process items in parallel where independent (multiple WebFetch calls, multiple X URLs in one batch)
  • Check for existing notes before creating to avoid duplicates
  • Read the daily note before editing — never guess content
  • Resolve vault path dynamically via notesmd-cli print-default --path-only

DON'T:

  • Process items the user excluded from the classification table
  • Modify already-processed wikilink lines
  • Hardcode vault paths
  • Skip the classification approval step
  • Run res-deep at default/deep depth unless user explicitly requests it — use quick for daily digest
  • Create notes without frontmatter

Comments

Markdown supported