Capture a web link, summarize it, and save to Obsidian vault. Use when the user wants to save a URL to their knowledge base.
80
Quality
76%
Does it follow best practices?
Impact
Pending
No eval scenarios have been run
Optimize this skill with Tessl
npx tessl skill review --optimize ./skills/capture/SKILL.mdCapture a web link, summarize it, and save to Obsidian vault.
/capture <url>
/capture <url> --context "Why this is interesting"/capture https://example.com/article-about-llms
/capture https://x.com/user/status/123 --context "Good prompting tips"When the user invokes /capture, follow these steps:
Read config.json from the engram project root to get the vault path:
{
"vault_path": "~/Documents/Obsidian/WebCapture"
}Use the vault_path value as {VAULT_PATH} in all paths below. Expand ~ to the user's home directory.
Extract the URL from the command. If --context is provided, store it as user_context.
Use WebFetch to retrieve the page content:
WebFetch url=<url> prompt="Extract the following from this page:
1. Title
2. Author (if available)
3. Main content/body text
4. Publication date (if available) - this is the date the content was originally published, NOT today's date
5. Key topics/themes
Return as structured data."Important: The published date is when the original content was created/posted. The captured date is always today (when the user saves the link). These are separate fields. Always try to extract the real publication date from the page. If unavailable, set published to null.
Based on the URL and content, classify as one of:
article - Blog posts, news articles, long-form contentvideo - YouTube, Vimeo, video contenttool - Product pages, SaaS tools, appsresearch - Academic papers, arxiv, technical researchx_post - Twitter/X posts and threadsphoto - Screenshots, photos, infographics, diagrams, visual content where the image IS the main content (not just an article with images)quick - Everything elseURL patterns and signals to help:
youtube.com, vimeo.com -> videox.com, twitter.com -> x_post (but if user_context says it's mainly a photo/screenshot, use photo)arxiv.org, *.edu, papers -> research.png, .jpg, .webp), or posts where user says "screenshot" / "photo" / "image" -> photoCategorize into one of these topics based on content:
ai-ml - AI, ML, LLMs, agents, promptingdev-tools - Developer tools, IDEs, CLIproduct-ideas - Business, startups, productsdesign - UI/UX, design systemsproductivity - Workflows, productivity systems_inbox - If unsure, use inboxCreate:
--context or queue) as seedsclaude-code over software, prefer llm-prompting over ai)If user_context was provided, use it to guide which aspects to emphasize.
After enriching tags, detect intent:
share_twitter: true, add tag share-twitter and set share_intent: "twitter" on the index entrydeep_learn: true, add tag deep-learn and set deep_learn: true on the index entryAuto-detection fallback (for items without checkboxes):
user_context contains phrases like "post on X", "post on twitter", "share on twitter", "postable on X", "tweet this", "share this", set share_intent: "twitter"user_context contains phrases like "learn", "study", "deep dive", "important", "reread", "want to learn", "understand this", set deep_learn: true7a: Find Related Notes
Read {VAULT_PATH}/_system/index.json and search for related notes:
7b: Add Bidirectional Links For each related note found:
## Connections section, add a wiki-link with one-sentence context woven into prose. Example:
This pairs well with [[content/dev-tools/article-writing-a-good-claude-md|Writing a Good CLAUDE.md]] which covers the practical side of agent configuration.## Connections section (create the section if it doesn't exist). Use the same prose style.Important: If no related notes are found (e.g., first note in a new topic), add a comment: <!-- No connections yet - will be linked as more notes are captured -->
Create the note at: {VAULT_PATH}/content/{topic}/{type}-{slug}.md
Use the appropriate template from _system/templates/ and fill in:
## Connections section with the wiki-links from Step 7bRead {VAULT_PATH}/_system/index.json and:
notes array with all fields including:
related: array of [{"path": "...", "reason": "shared tags / theme overlap"}] from Step 7arelated arrays on the related notes' index entries to include the new notestats.total_notesstats.unreadstats.by_type.{type}stats.by_topic.{topic}stats.total_connections (count of all related pairs across all notes)stats.isolated_notes (count of notes with empty related array)last_updated timestampstats.twitter_queue (count of notes with share_intent == "twitter" and twitter_posted != true)stats.learning_resources (count of notes with deep_learn == true)New optional fields on index entries:
share_intent: "twitter" or null (default null)deep_learn: true or false (default false)twitter_posted: true or false (default false)twitter_posted_at: ISO date or nullRead {VAULT_PATH}/content/{topic}/_topic.md and:
## Notes section as a wiki-link entry:
- [{type}] [[content/{topic}/{filename}|{title}]] - {one-line summary}## Threads section with a brief description of the thread.After updating the index, regenerate the 4 view files from index.json data:
views/by-date.md - List all notes sorted by capture date (newest first). Group by date (e.g., "## 2026-02-05"). Each entry: - [{type}] [[{note_path}|{title}]] - {summary snippet}
views/by-type.md - Group notes by content type (article, video, photo, x_post, tool, research, quick). Under each heading, list notes sorted by date.
views/unread.md - List only notes where read: false in the index, sorted by date. Each entry includes title, type, topic, and capture date.
views/favorites.md - List only notes where favorite: true in the index, sorted by date.
views/twitter-queue.md - Notes with share_intent: "twitter" and twitter_posted != true. Each entry: title with source URL link, 1-2 sentence summary, suggested tweet angle based on key_points/user_context, tags for hashtag inspiration. Header shows count.
views/learnings.md - Notes with deep_learn: true, grouped by topic. Each topic group shows: topic name with note count, each note with title/summary/connections to other learning resources. Footer suggests reading order.
For each view file, read _system/index.json, filter/sort the notes array, and write the complete markdown file. Use Obsidian wiki-links ([[path|title]]) for note references.
Tell the user:
content/{topic}/{filename}After all files are written, push vault changes to git:
cd {VAULT_PATH}
git add -A
git commit -m "vault: captured {slug} ({date})"
git push origin mainIf the vault is not a git repo yet, skip this step silently.
{VAULT_PATH}/_system/index.jsondata/queue.json{VAULT_PATH}/CLAUDE.md for vault conventionsed688ad
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.