Twitter Bookmark Digest with Hermes
Build a reusable skill bundle library that turns X bookmarks into briefings.
Introduction
30 Second Summary
You save dozens of bookmarks on X every week. Interesting threads, linked articles, hot takes from people you follow. But you never go back and read them. The insights pile up and become irrelevant before you ever act on them.
In this project, you will build a personal skill bundle library for Hermes Agent that scrapes your X/Twitter bookmarks, identifies the recurring themes across everything, and delivers a short briefing of what actually matters.
What You'll Build
A git-tracked external skills directory wired into Hermes Agent, containing three instruction-only skills orchestrated by a single bundle command that turns your X bookmarks into a synthesized research briefing.
By the end of this project, you'll have:
- A git-tracked external skills library at ~/skills-library/ configured as an external skill source for Hermes.
- Three instruction-only skills (twitter-bookmark-fetch, content-synthesizer, digest-delivery) following Hermes best practices for progressive disclosure and reusability.
- A twitter-digest bundle that orchestrates all three skills into a single /twitter-digest command producing a real synthesized briefing from your bookmarks.
- Secret Mission: Build a second /posthog-digest bundle that reuses your existing skills with a new data source, proving the composability of your skill library.
Are there any prerequisites?
This project assumes you already have Hermes Agent installed and running with OpenRouter configured. You also need Chrome on macOS and a free Firecrawl account.
Before We Start
Before We Start...
Configure Hermes for Browser and Web Tools
Your skill bundle needs two core capabilities from Hermes. It needs browser automation to navigate your authenticated X bookmarks page. It also needs web extraction to expand t.co links into full article content.
In this step, you'll wire up both capabilities by adding your Firecrawl API key and enabling the browser toolset for Chrome DevTools Protocol access.
In this step, get ready to:
- Add your Firecrawl API key to Hermes configuration.
- Enable the browser and web toolsets.
- Test browser connect to verify Hermes can see your Chrome instance.
Add your Firecrawl API key to Hermes
Hermes uses web_extract to pull content from URLs as markdown. When a FIRECRAWL_API_KEY is present in the environment, Hermes routes extraction through Firecrawl's browser rendering. This handles JavaScript-rendered pages and Cloudflare-protected sites that a simple HTTP fetch would miss.
- Open your Hermes environment file by running:
open ~/.hermes/.env
- Add the following line to the file, replacing your-firecrawl-api-key-here with the actual API key from your Firecrawl account:
FIRECRAWL_API_KEY=your-firecrawl-api-key-here
- Save and close the file.
Why Firecrawl for link expansion?
Your X bookmarks contain t.co shortened links that point to articles, threads, and resources across the web. Many of those destinations are JavaScript-rendered or behind anti-bot protections.
Firecrawl handles real browser rendering under the hood, so web_extract can pull the actual content from those links. The free tier gives you 500 credits per month, which is plenty for a typical 20-bookmark digest.
Not sure where your Firecrawl key is?
Log into your Firecrawl dashboard and find the API key on the overview or settings page. If you haven't created an account yet, sign up at firecrawl.dev. The free tier is all you need.
help me find my Firecrawl API key
Enable the browser and web toolsets
Hermes organizes its capabilities into toolsets that can be toggled on or off. You need two: the web toolset (for web_extract and web_search) and the browser toolset (for browser_navigate, browser_snapshot, and the other browser automation tools).
- Enable both toolsets by running these commands:
hermes tools enable browser
hermes tools enable web
What do these commands do?
Each command persists the toolset to your config.yaml so Hermes loads those tools automatically in future sessions. The browser toolset includes browser_navigate, browser_snapshot, browser_click, browser_scroll, and more.
The web toolset provides web_search and web_extract. Since your FIRECRAWL_API_KEY is in the .env file, Hermes auto-detects Firecrawl as the web backend.
- Verify both toolsets are active by running:
hermes tools --summary
- You should see browser and web listed among the enabled toolsets in the output.
Don't see browser or web in the summary?
Try running hermes tools without any arguments. This opens an interactive curses-based UI where you can toggle toolsets on and off per platform. Make sure both browser and web are checked for the CLI platform.
help me enable the browser and web toolsets in Hermes
Test browser connect
The /browser connect command attaches Hermes to your running Chrome instance via CDP. This lets Hermes use your existing cookies and session, which is exactly what you need to access authenticated pages like your X bookmarks.
- Open Chrome on your Mac.
- Navigate to https://x.com and confirm you are logged in.
- Start a Hermes chat session with both toolsets by running:
hermes chat --toolsets "web,browser"
Why pass toolsets on the command line?
The --toolsets flag enables specific toolsets for this session. Even though you enabled them globally in the previous substep, passing them explicitly guarantees they are active for this test session.
- Inside the Hermes chat session, type the following command and press Enter:
/browser connect
What happens when you run /browser connect?
Hermes looks for a running Chromium-family browser with remote debugging enabled. If Chrome isn't already running with a debug port, Hermes will attempt to auto-launch it with --remote-debugging-port=9222. Once connected, all browser tools (browser_navigate, browser_click, etc.) operate on your live Chrome instance.
- Verify the connection by running:
/browser status
- You should see output confirming Hermes is connected to your Chrome instance. The status will show the CDP endpoint (typically ws://localhost:9222) and that the connection is active.
Browser connect failed?
If Hermes can't find Chrome, make sure Chrome is actually open (not minimized to the dock with no windows). If you see a connection error, try quitting Chrome completely and letting Hermes auto-launch it with the debug port.
Remember that /browser connect is a CLI-only command. It only works when you start Hermes from the terminal with hermes chat. It will not work from a gateway, WebUI, or messaging platform.
help me connect Hermes to my Chrome browser
Your Hermes environment is ready with browser and web tools. Next up, you'll create the external skills library that houses your reusable skill files.
Create the External Skills Library
In the last step, you configured Hermes with browser and web toolsets. Hermes can now navigate your Chrome instance and extract web content on command.
Right now, Hermes stores its skills inside ~/.hermes/skills/. That works for agent-created skills, but it mixes your custom work with bundled defaults and makes version control messy. In this step, you'll create a separate, Git-tracked library that Hermes scans alongside its built-in skills.
In this step, get ready to:
- Create a git-tracked ~/skills-library/ directory.
- Wire it into Hermes via config.yaml.
- Write a reusable SKILL.md template for future skills.
Create the directory structure
Each Hermes skill lives in its own directory containing a SKILL.md file. Your library will follow this same convention, with one folder per skill.
- Navigate to your home directory by running this command:
cd ~
- Create the skills-library directory and initialize it as a git repository by running these commands:
mkdir skills-library
cd skills-library
git init
What do these commands do?
- mkdir skills-library creates the folder that will hold all your custom skills.
- cd skills-library moves you into the new directory.
- git init turns it into a Git repository so you can version-control every change to your skills.
- Confirm the directory was created and initialized by running:
ls -la
You should see a .git folder listed in the output. This confirms Git is tracking the directory.
Don't see the .git folder?
- Make sure you ran git init while inside the skills-library directory. Run pwd to check your current location.
- If ls -la doesn't show hidden files, try ls -a instead.
Help me troubleshoot my git init in ~/skills-library/.
Wire it into Hermes config
Hermes needs to know about your new library so it scans it alongside its built-in skills. You do this by adding an external_dirs entry to the skills section of ~/.hermes/config.yaml.
- Open your Hermes config file by running:
hermes config edit
- Find the skills: section in the file. If one doesn't exist yet, add it at the bottom.
- Add the external_dirs entry so it looks like this:
skills:
external_dirs:
- ~/skills-library
What does external_dirs do?
The external_dirs setting tells Hermes to scan additional folders for skills alongside the default ~/.hermes/skills/ directory.
Paths support ~ expansion. External skills get full integration. They appear in the system prompt index, skills_list, skill_view, and as /skill-name slash commands.
- Save and close the config file.
- Verify Hermes can see the new library by running:
hermes chat --toolsets skills -q "What skills do you have?"
You should see Hermes list its known skills. The library is empty right now, so no new skills appear yet. The important thing is that the command runs without errors about your config.
Seeing a config error?
- Check that your YAML indentation uses spaces, not tabs. The external_dirs key must be indented under skills: with exactly 2 spaces.
- Make sure the list item starts with - ~/skills-library (dash, space, then the path). A missing space after the dash breaks YAML parsing.
- Run hermes config check to validate your config file for syntax issues.
Help me fix my Hermes config.yaml after adding external_dirs.
Create the SKILL.md template
Every skill you build follows the same structure: YAML frontmatter for metadata, then markdown sections for the agent's instructions. A template file saves you from recreating this skeleton each time.
- Make sure you're in the skills-library directory by running:
cd ~/skills-library
- Create the template file by running:
cat > TEMPLATE.md << 'EOF'
---
name: skill-name-here
description: One-line description of when this skill should trigger. Write in third person.
version: 1.0.0
author: Your Name
platforms: [macos, linux]
metadata:
hermes:
tags: [Category, Subcategory]
requires_toolsets: []
---
# Skill Title
Brief intro explaining what this skill does.
## When to Use
Trigger conditions — describe exactly when the agent should load this skill.
## Procedure
Step-by-step instructions the agent follows.
## Pitfalls
Known failure modes and how to handle them.
## Verification
How the agent confirms it worked.
EOF
What does this template include?
- The YAML frontmatter (between the --- fences) declares the skill's name, description, version, and which toolsets it needs.
- The description field is critical. Hermes uses it at Level 0 (the skill list) to decide whether to load the full skill. A clear, trigger-focused description means the agent picks the right skill at the right time.
- The requires_toolsets field controls visibility. If a skill requires the browser toolset, it only appears when browser tools are active.
- The body sections (When to Use, Procedure, Pitfalls, Verification) give the agent everything it needs to execute the skill correctly.
What is progressive disclosure?
Hermes loads skills in stages to save tokens. At Level 0, only the name and description appear in the skill list. At Level 1, the full SKILL.md content loads when the skill is invoked. This means your description must be specific enough to trigger correctly, while the body can be detailed without bloating every conversation.
- Confirm the file was created by running:
ls
You should see TEMPLATE.md listed in the output.
TEMPLATE.md not showing up?
- Run pwd to confirm you're in ~/skills-library/. If not, run cd ~/skills-library first and retry the cat command.
- Make sure you copied the entire cat > TEMPLATE.md << 'EOF' block including the closing EOF on its own line.
Help me create TEMPLATE.md in my skills-library directory.
✔️ Awesome, I've got everything!
Great. Double check you've saved TEMPLATE.md and that your config.yaml includes the external_dirs entry.
ⓧ I'd like to double check the full code
Here's what ~/skills-library/TEMPLATE.md should contain:
---
name: skill-name-here
description: One-line description of when this skill should trigger. Write in third person.
version: 1.0.0
author: Your Name
platforms: [macos, linux]
metadata:
hermes:
tags: [Category, Subcategory]
requires_toolsets: []
---
# Skill Title
Brief intro explaining what this skill does.
## When to Use
Trigger conditions — describe exactly when the agent should load this skill.
## Procedure
Step-by-step instructions the agent follows.
## Pitfalls
Known failure modes and how to handle them.
## Verification
How the agent confirms it worked.
And your ~/.hermes/config.yaml should include this entry (it may appear alongside other settings):
skills:
external_dirs:
- ~/skills-library
Your skills library is wired up and ready to receive skills. Next up, you'll author the three skills that power the Twitter bookmark digest workflow.
Author the Twitter Bookmark Skills
Your skills library directory is wired into Hermes and ready to receive skills. Now you need to fill it with the actual instructions that tell Hermes how to do each part of the bookmark digest workflow.
Each skill is a SKILL.md file inside its own directory. You'll write three skills: one to fetch bookmarks from X, one to synthesize the content into themes, and one to deliver the final briefing.
In this step, get ready to:
- Create a bookmark-fetching skill that uses browser automation to extract your X bookmarks.
- Create a content synthesis skill that identifies key themes across extracted content.
- Create a delivery skill that formats and saves the briefing as a markdown file.
Create the twitter-bookmark-fetch skill
The first skill handles data collection. It instructs Hermes to use browser_navigate and browser_snapshot to scroll through your bookmarks page, extract post content, and then expand any t.co links via web_extract.
- Create the skill directory by running this command:
mkdir ~/skills-library/twitter-bookmark-fetch
- Create the SKILL.md file inside it by running:
touch ~/skills-library/twitter-bookmark-fetch/SKILL.md
- Open ~/skills-library/twitter-bookmark-fetch/SKILL.md in your text editor and paste the following content:
---
name: twitter-bookmark-fetch
description: Fetch and extract content from the authenticated user's X/Twitter bookmarks. Use when asked to retrieve, export, read, or digest Twitter/X bookmarks.
version: 1.0.0
author: NextWork Learner
platforms: [macos, linux]
metadata:
hermes:
tags: [social-media, data-extraction, bookmarks]
requires_toolsets: [browser, web]
---
# Twitter Bookmark Fetch
Extract bookmarks from the authenticated user's X/Twitter account using browser automation.
## When to Use
- User asks to fetch, read, export, or digest their X/Twitter bookmarks
- User invokes the twitter-digest bundle
- User asks what they've bookmarked recently
## Procedure
1. Confirm the browser toolset is connected to a local Chrome instance via /browser connect. If not connected, instruct the user to run /browser connect first.
2. Navigate to https://x.com/i/bookmarks using browser_navigate.
3. Use browser_snapshot to capture the current page state. Identify bookmark entries from the accessibility tree.
4. For each visible bookmark entry, extract:
- Post author (display name and @handle)
- Post text content (full text)
- Post timestamp
- Any embedded links (t.co URLs)
- Engagement metrics if visible (likes, reposts, replies)
5. Scroll down using browser_scroll to load more bookmarks. Repeat steps 3-4 for each new batch. Continue until either:
- 20 bookmarks have been collected (default batch size), OR
- The user specified a different number, OR
- No new bookmarks load after scrolling
6. For each t.co link found in bookmark posts, use web_extract to resolve the URL and pull the linked content (article title, summary, key points). If web_extract fails on a link, note it as "link could not be expanded" and continue.
7. Compile all extracted data into a structured format:
- Each bookmark as a separate entry
- Post content, author, timestamp, and expanded link content grouped together
- Output as a JSON-like structure for downstream processing
## Pitfalls
- If x.com shows a login prompt instead of bookmarks, the user is not logged into Chrome. Instruct them to log in manually and retry.
- X may rate-limit scrolling. If the page stops loading new content, wait 3-5 seconds between scrolls.
- Some bookmarks may be deleted posts showing "This post is unavailable." Skip these with a note.
- The browser_snapshot accessibility tree may truncate very long posts. Use browser_click on "Show more" elements if present.
- t.co links may resolve to paywalled content. web_extract will return whatever is publicly accessible. Note partial extractions.
## Verification
- Confirm at least 1 bookmark was successfully extracted with full content.
- Confirm t.co link expansion was attempted for all links found.
- Report the total count: "Extracted N bookmarks, expanded M links, K links failed."
What does this skill do?
This skill is a set of procedural instructions that Hermes follows when you ask it to fetch bookmarks. It does not contain any executable code.
- The requires_toolsets: [browser, web] field means this skill only appears when those toolsets are active.
- The Procedure section gives Hermes a step-by-step playbook for navigating X, extracting posts, and expanding links.
- The Pitfalls section helps Hermes handle edge cases (login prompts, rate limits, deleted posts) without getting stuck.
- Save the file.
- Confirm the file exists by running:
ls ~/skills-library/twitter-bookmark-fetch/
You should see SKILL.md listed in the output.
Don't see SKILL.md?
- Make sure you created the directory first with mkdir before creating the file inside it.
- Check the path is exact: ~/skills-library/twitter-bookmark-fetch/SKILL.md (note the hyphens, not underscores).
- help me find why my SKILL.md file wasn't created in the right location
✔️ Awesome, I've got everything!
Great. Make sure you've saved the file before moving on to the next skill.
ⓧ I'd like to double check the full code
---
name: twitter-bookmark-fetch
description: Fetch and extract content from the authenticated user's X/Twitter bookmarks. Use when asked to retrieve, export, read, or digest Twitter/X bookmarks.
version: 1.0.0
author: NextWork Learner
platforms: [macos, linux]
metadata:
hermes:
tags: [social-media, data-extraction, bookmarks]
requires_toolsets: [browser, web]
---
# Twitter Bookmark Fetch
Extract bookmarks from the authenticated user's X/Twitter account using browser automation.
## When to Use
- User asks to fetch, read, export, or digest their X/Twitter bookmarks
- User invokes the twitter-digest bundle
- User asks what they've bookmarked recently
## Procedure
1. Confirm the browser toolset is connected to a local Chrome instance via /browser connect. If not connected, instruct the user to run /browser connect first.
2. Navigate to https://x.com/i/bookmarks using browser_navigate.
3. Use browser_snapshot to capture the current page state. Identify bookmark entries from the accessibility tree.
4. For each visible bookmark entry, extract:
- Post author (display name and @handle)
- Post text content (full text)
- Post timestamp
- Any embedded links (t.co URLs)
- Engagement metrics if visible (likes, reposts, replies)
5. Scroll down using browser_scroll to load more bookmarks. Repeat steps 3-4 for each new batch. Continue until either:
- 20 bookmarks have been collected (default batch size), OR
- The user specified a different number, OR
- No new bookmarks load after scrolling
6. For each t.co link found in bookmark posts, use web_extract to resolve the URL and pull the linked content (article title, summary, key points). If web_extract fails on a link, note it as "link could not be expanded" and continue.
7. Compile all extracted data into a structured format:
- Each bookmark as a separate entry
- Post content, author, timestamp, and expanded link content grouped together
- Output as a JSON-like structure for downstream processing
## Pitfalls
- If x.com shows a login prompt instead of bookmarks, the user is not logged into Chrome. Instruct them to log in manually and retry.
- X may rate-limit scrolling. If the page stops loading new content, wait 3-5 seconds between scrolls.
- Some bookmarks may be deleted posts showing "This post is unavailable." Skip these with a note.
- The browser_snapshot accessibility tree may truncate very long posts. Use browser_click on "Show more" elements if present.
- t.co links may resolve to paywalled content. web_extract will return whatever is publicly accessible. Note partial extractions.
## Verification
- Confirm at least 1 bookmark was successfully extracted with full content.
- Confirm t.co link expansion was attempted for all links found.
- Report the total count: "Extracted N bookmarks, expanded M links, K links failed."
Create the content-synthesizer skill
The second skill is the analysis engine. Instead of summarizing each bookmark individually, it looks across all extracted content to find recurring themes and key concepts.
Why synthesis instead of summaries?
A list of 20 bookmark summaries is just as overwhelming as 20 bookmarks. Synthesis finds the signal: what patterns are emerging, what ideas keep coming up, and what actually matters for your work.
- Create the skill directory by running:
mkdir ~/skills-library/content-synthesizer
- Create and open the SKILL.md file by running:
touch ~/skills-library/content-synthesizer/SKILL.md
- Open ~/skills-library/content-synthesizer/SKILL.md in your text editor and paste the following content:
---
name: content-synthesizer
description: Synthesize raw extracted content into key themes, concepts, and actionable insights. Use when processing fetched data into a briefing that highlights what matters rather than listing everything.
version: 1.0.0
author: NextWork Learner
platforms: [macos, linux]
metadata:
hermes:
tags: [productivity, synthesis, research-assistant]
requires_toolsets: []
---
# Content Synthesizer
Act as a research analyst. Identify the key themes, recurring concepts, and actionable insights across all extracted content. Produce a short briefing of what matters — not a list of summaries.
## When to Use
- After fetching content from any source (bookmarks, analytics, feeds)
- User asks to synthesize, distill, or find the key ideas in extracted content
- Used as the analysis step in digest bundles (twitter-digest, posthog-digest, etc.)
## Procedure
1. Read through ALL extracted content from the upstream fetch step. Do not summarize each item individually yet. First, understand the full landscape of what was captured.
2. Identify 3-5 KEY THEMES or recurring concepts that appear across multiple items. A theme is a pattern, not a category.
3. For each identified theme, synthesize a BRIEFING PARAGRAPH (3-5 sentences) that states the core insight, references supporting sources, explains why it matters, and notes any disagreements.
4. Identify STANDALONE HIGHLIGHTS — individual items that don't fit a theme but are too valuable to skip. Limit to 2-3 max.
5. Generate a single TOP TAKEAWAY — one sentence capturing the most important thing across all content.
6. Assign a signal strength to each theme: 🔥 ACT ON THIS, 🧠 KNOW THIS, or 👀 WATCH THIS.
7. Output the structured synthesis: Top Takeaway, Themes (3-5), Standalone Highlights (2-3 max).
## Pitfalls
- Do NOT produce a list of per-item summaries.
- If fewer than 5 items total, produce 1-2 themes and the top takeaway.
- Do not hallucinate connections.
- Items with expanded link content should carry MORE weight than bare tweets.
## Verification
- Output contains exactly 1 Top Takeaway sentence.
- Output contains 3-5 themes each with a briefing paragraph and signal strength.
- Output contains 0-3 Standalone Highlights.
- Every theme states a specific insight, not just a category label.
What makes this skill reusable?
Notice that requires_toolsets is empty. This skill uses pure reasoning with no browser or web tools.
It also doesn't mention Twitter or bookmarks anywhere in its instructions. It accepts raw content from any source, which means you can pair it with different fetch skills (PostHog, RSS feeds, Slack channels) without changing a single line.
- Save the file.
- Confirm the file exists by running:
ls ~/skills-library/content-synthesizer/
You should see SKILL.md listed in the output.
File not showing up?
- Confirm the directory name is content-synthesizer (hyphens, not underscores or camelCase).
- Make sure you saved the file after pasting the content.
- help me troubleshoot my content-synthesizer SKILL.md file creation
✔️ Awesome, I've got everything!
Great. One more skill to go.
ⓧ I'd like to double check the full code
---
name: content-synthesizer
description: Synthesize raw extracted content into key themes, concepts, and actionable insights. Use when processing fetched data into a briefing that highlights what matters rather than listing everything.
version: 1.0.0
author: NextWork Learner
platforms: [macos, linux]
metadata:
hermes:
tags: [productivity, synthesis, research-assistant]
requires_toolsets: []
---
# Content Synthesizer
Act as a research analyst. Identify the key themes, recurring concepts, and actionable insights across all extracted content. Produce a short briefing of what matters — not a list of summaries.
## When to Use
- After fetching content from any source (bookmarks, analytics, feeds)
- User asks to synthesize, distill, or find the key ideas in extracted content
- Used as the analysis step in digest bundles (twitter-digest, posthog-digest, etc.)
## Procedure
1. Read through ALL extracted content from the upstream fetch step. Do not summarize each item individually yet. First, understand the full landscape of what was captured.
2. Identify 3-5 KEY THEMES or recurring concepts that appear across multiple items. A theme is a pattern, not a category.
3. For each identified theme, synthesize a BRIEFING PARAGRAPH (3-5 sentences) that states the core insight, references supporting sources, explains why it matters, and notes any disagreements.
4. Identify STANDALONE HIGHLIGHTS — individual items that don't fit a theme but are too valuable to skip. Limit to 2-3 max.
5. Generate a single TOP TAKEAWAY — one sentence capturing the most important thing across all content.
6. Assign a signal strength to each theme: 🔥 ACT ON THIS, 🧠 KNOW THIS, or 👀 WATCH THIS.
7. Output the structured synthesis: Top Takeaway, Themes (3-5), Standalone Highlights (2-3 max).
## Pitfalls
- Do NOT produce a list of per-item summaries.
- If fewer than 5 items total, produce 1-2 themes and the top takeaway.
- Do not hallucinate connections.
- Items with expanded link content should carry MORE weight than bare tweets.
## Verification
- Output contains exactly 1 Top Takeaway sentence.
- Output contains 3-5 themes each with a briefing paragraph and signal strength.
- Output contains 0-3 Standalone Highlights.
- Every theme states a specific insight, not just a category label.
Create the digest-delivery skill
The final skill handles output. It takes the synthesized briefing and formats it as a dated markdown file, saves it to disk, and presents the key takeaways directly in chat.
- Create the skill directory by running:
mkdir ~/skills-library/digest-delivery
- Create the SKILL.md file by running:
touch ~/skills-library/digest-delivery/SKILL.md
- Open ~/skills-library/digest-delivery/SKILL.md in your text editor and paste the following content:
---
name: digest-delivery
description: Format a synthesized briefing into a markdown file and save it to the filesystem. Use when a briefing is ready to be written as a file and delivered to the user.
version: 1.0.0
author: NextWork Learner
platforms: [macos, linux]
metadata:
hermes:
tags: [productivity, output, delivery]
requires_toolsets: [file]
config:
- key: digest.output_dir
description: Directory where digest files are saved
default: "~/digests"
prompt: "Where should digest files be saved?"
---
# Digest Delivery
Format and save a synthesized briefing as a dated markdown file, and present the key takeaways directly to the user.
## When to Use
- After the content-synthesizer skill has produced themes and insights
- User asks to save, export, or write a briefing to a file
- Final step in any digest bundle workflow
## Procedure
1. Create the output directory if it does not exist. Default: ~/digests/
2. Format the briefing as markdown with Top Takeaway, Themes, and Standalone Highlights sections.
3. Name the file: [source]-briefing-YYYY-MM-DD.md
4. Write the file using write_file to the output directory.
5. Present the briefing directly to the user in chat.
## Pitfalls
- Expand ~ to full home path before writing.
- If file exists, append a counter.
- Chat presentation is the primary delivery.
## Verification
- Confirm file written by reading back first 5 lines with read_file.
- Report the file path.
- Full briefing presented in chat.
What does the config section do?
The config field under metadata.hermes declares a setting that Hermes stores in config.yaml at skills.config.digest.output_dir.
The default value provides a fallback (~/digests) so the skill works without any manual config. Hermes prompts the user to set a custom value the first time the skill runs.
- Save the file.
- Confirm the file exists by running:
ls ~/skills-library/digest-delivery/
You should see SKILL.md listed in the output.
- Now verify that Hermes can discover all three skills by running:
hermes skills list
You should see twitter-bookmark-fetch, content-synthesizer, and digest-delivery listed alongside any other skills you have installed.
How does progressive disclosure work here?
When Hermes starts a session, it only loads the name and description from each skill (Level 0). This keeps the system prompt small.
The full SKILL.md content (Procedure, Pitfalls, Verification) only loads when a skill is actually invoked (Level 1). Writing a clear, trigger-optimized description field is what helps Hermes pick the right skill at the right time.
Skills not appearing in the list?
- Make sure the directory names match the name field in each SKILL.md frontmatter exactly.
- Verify that ~/.hermes/config.yaml still has the external_dirs entry pointing to ~/skills-library/.
- Check that each SKILL.md has valid YAML frontmatter (the --- delimiters must be on their own lines with no leading spaces).
- help me figure out why Hermes can't find my external skills
✔️ Awesome, I've got everything!
All three skills are created and discoverable. Make sure you've saved all files.
ⓧ I'd like to double check the full code
---
name: digest-delivery
description: Format a synthesized briefing into a markdown file and save it to the filesystem. Use when a briefing is ready to be written as a file and delivered to the user.
version: 1.0.0
author: NextWork Learner
platforms: [macos, linux]
metadata:
hermes:
tags: [productivity, output, delivery]
requires_toolsets: [file]
config:
- key: digest.output_dir
description: Directory where digest files are saved
default: "~/digests"
prompt: "Where should digest files be saved?"
---
# Digest Delivery
Format and save a synthesized briefing as a dated markdown file, and present the key takeaways directly to the user.
## When to Use
- After the content-synthesizer skill has produced themes and insights
- User asks to save, export, or write a briefing to a file
- Final step in any digest bundle workflow
## Procedure
1. Create the output directory if it does not exist. Default: ~/digests/
2. Format the briefing as markdown with Top Takeaway, Themes, and Standalone Highlights sections.
3. Name the file: [source]-briefing-YYYY-MM-DD.md
4. Write the file using write_file to the output directory.
5. Present the briefing directly to the user in chat.
## Pitfalls
- Expand ~ to full home path before writing.
- If file exists, append a counter.
- Chat presentation is the primary delivery.
## Verification
- Confirm file written by reading back first 5 lines with read_file.
- Report the file path.
- Full briefing presented in chat.
Your three skills are written and Hermes knows about them. Next up, you'll wire them together into a bundle so a single /twitter-digest command runs the entire pipeline.
Create the Bundle and Test
You now have three standalone skills that each handle one piece of the digest workflow: fetching bookmarks, synthesizing themes, and delivering the briefing.
A skill bundle ties multiple skills together into a single invocable command. Instead of running each skill separately and passing context between them, you create one YAML file that tells Hermes to run them as a pipeline.
In this step, get ready to:
- Create the twitter-digest bundle YAML that chains all three skills.
- Run the full end-to-end workflow with a single command.
- Iterate on the output and commit your changes to git.
Create the twitter-digest bundle
Hermes looks for bundle definitions as YAML files inside ~/.hermes/skill-bundles/. Each bundle declares which skills to load and provides an instruction that describes the overall workflow cadence.
- Create the skill-bundles directory by running this command:
mkdir -p ~/.hermes/skill-bundles
- Create a new file at ~/.hermes/skill-bundles/twitter-digest.yaml and paste in this content:
name: twitter-digest
description: Fetch X/Twitter bookmarks and synthesize a briefing of key themes and insights.
skills:
- twitter-bookmark-fetch
- content-synthesizer
- digest-delivery
instruction: |
Execute these skills as a pipeline: first fetch bookmarks from X using the
browser (user must have /browser connect active and be logged into x.com),
then synthesize the extracted content into key themes and insights (do NOT
just list summaries — find the patterns and what matters), then format and
save as a dated briefing file AND present the key takeaways directly in chat.
If browser is not connected, prompt the user to run /browser connect first.
What does this bundle do?
The skills list tells Hermes which skills to load into context when the bundle is invoked. The instruction block gives Hermes the high-level orchestration logic: run the skills as a sequential pipeline, not in parallel.
Missing skills are skipped with a note rather than crashing the bundle. This makes bundles resilient to incomplete setups.
- Save the file.
- Verify Hermes can see the bundle by running:
hermes bundles list
You should see twitter-digest appear in the output with its description.
Bundle not showing up?
- Check that your file is saved to ~/.hermes/skill-bundles/twitter-digest.yaml (not skill-bundles without the hyphen).
- Make sure the YAML is valid. Indentation matters. The skills list items must start with - (two spaces, dash, space).
- Try hermes bundles reload to force a rescan of the bundles directory.
help me troubleshoot my Hermes bundle YAML
✔️ Awesome, I've got everything!
Great. Double check you've saved the file, then move on to the next substep.
ⓧ I'd like to double check the full code
name: twitter-digest
description: Fetch X/Twitter bookmarks and synthesize a briefing of key themes and insights.
skills:
- twitter-bookmark-fetch
- content-synthesizer
- digest-delivery
instruction: |
Execute these skills as a pipeline: first fetch bookmarks from X using the
browser (user must have /browser connect active and be logged into x.com),
then synthesize the extracted content into key themes and insights (do NOT
just list summaries — find the patterns and what matters), then format and
save as a dated briefing file AND present the key takeaways directly in chat.
If browser is not connected, prompt the user to run /browser connect first.
Run the full workflow
This is the moment of truth. You will start a Hermes session with browser and web toolsets active, connect to your Chrome window, and invoke the bundle to watch the entire pipeline run.
- Make sure Chrome is open and you are logged into x.com.
- Start a Hermes session with the required toolsets by running:
hermes chat --toolsets "web,browser"
Why these toolsets?
The twitter-bookmark-fetch skill requires both browser (for navigating x.com) and web (for expanding t.co links with web_extract). The digest-delivery skill needs the file toolset, which is always available by default.
- Inside the Hermes session, connect to your Chrome browser by typing:
/browser connect
Hermes should confirm it connected to your Chrome instance via Chrome DevTools Protocol.
- Invoke the full digest pipeline by typing:
/twitter-digest
Watch as Hermes works through the pipeline. It will navigate to your bookmarks page, scroll through posts, expand linked articles, synthesize themes, and then present the briefing directly in chat.
What should I see?
The process takes a few minutes depending on how many bookmarks you have and how many links need expanding. You will see Hermes narrate each step: navigating, scrolling, extracting posts, calling web_extract on links, then producing the synthesized output.
The final output should include a Top Takeaway, 3-5 themes with signal strengths, and 0-3 standalone highlights. It will also report a saved file path like ~/digests/twitter-briefing-2026-06-04.md.
Seeing a login prompt instead of bookmarks?
This means your Chrome session is not logged into x.com. Switch to your Chrome window, navigate to x.com, and log in manually. Then return to Hermes and type /twitter-digest again.
help me debug why Hermes can't access my X bookmarks
Iterate on the output and commit to git
Your first run is a starting point. Review the briefing and decide if the synthesis depth, theme detection, or output format needs adjustment.
- Open the generated briefing file to review it by running:
cat ~/digests/twitter-briefing-*.md
- If themes are too shallow, open ~/skills-library/content-synthesizer/SKILL.md and add more detail to the Procedure section about what counts as a meaningful theme.
- If the output format does not match your preference, adjust the markdown template in ~/skills-library/digest-delivery/SKILL.md.
- If bookmark extraction was incomplete, review ~/skills-library/twitter-bookmark-fetch/SKILL.md and adjust the scroll count or extraction rules in the Procedure section.
Skills are just text files
Every change you make to a SKILL.md file takes effect on the next Hermes session. There is no build step or compilation. Edit, save, and re-run /twitter-digest to see the difference.
- Once you are happy with the output, commit everything to your skills library by running:
cd ~/skills-library
git add .
git commit -m "Add twitter-digest skills and refine instructions"
Your skills library is now version-controlled. You can track changes over time as you refine instructions across runs.
Secret mission
Build a PostHog Digest Bundle
Your skill library is already proving its value with one bundle. But the real power of composable skills is reuse. Can you build a second digest bundle that pulls from PostHog analytics instead of X bookmarks, reusing the same content-synthesizer and digest-delivery skills without touching them?
Clean Up Your Resources
Clean Up Your Resources
This project runs entirely locally, so there are no ongoing costs. Decide whether to keep your skills library for future use or remove everything.
Resources you used:
- ~/skills-library/ directory (git repository with your skill files). Free, local files.
- ~/.hermes/skill-bundles/twitter-digest.yaml and ~/.hermes/skill-bundles/posthog-digest.yaml (bundle definitions). Free, local files.
- ~/digests/ directory (generated briefing files). Free, local files.
- Configuration entries in ~/.hermes/config.yaml and ~/.hermes/.env. Free, local config.
- Firecrawl API usage for web_extract calls. Covered by free tier (500 credits/month). No recurring charges.
Keep everything running
No action needed. Your skills library and bundle files persist between Hermes sessions. They are just files on disk with zero cost.
- Your skills remain available as slash commands (/twitter-digest, /posthog-digest) in every future Hermes session.
- Generated briefings stay in ~/digests/ for reference.
- Firecrawl free tier renews monthly. No billing unless you upgrade.
Pause - I'll come back to this later
Nothing is actively running. There are no processes to stop, no servers to shut down, and no cloud resources consuming credits.
Your skills library, bundles, and config entries will be exactly where you left them whenever you return.
Delete - I don't want to use this again
Remove all project resources and start fresh. This deletes your skills library, bundle definitions, generated briefings, and the config entries that wire them together.
- Delete the skills library by running:
rm -rf ~/skills-library/
- Delete the bundle YAML files by running:
rm ~/.hermes/skill-bundles/twitter-digest.yaml
rm ~/.hermes/skill-bundles/posthog-digest.yaml
- Delete the generated briefings by running:
rm -rf ~/digests/
- Remove the external_dirs entry from ~/.hermes/config.yaml. Open the file in your editor and delete the line that points to ~/skills-library/.
- Remove the FIRECRAWL_API_KEY line from ~/.hermes/.env if you no longer need Firecrawl for other Hermes workflows.
That's a Wrap!
That's a Wrap!
Nice work! You've built a personal skill bundle library that turns your X bookmarks into a synthesized briefing with a single command.
You've learned how to:
- Create a git-tracked external skills library and wire it into Hermes via external_dirs in config.yaml so your skills are portable, version-controlled, and auto-discovered every session.
- Author instruction-only skills using the SKILL.md format with progressive disclosure, trigger-optimized descriptions, and toolset requirements.
- Build a skill bundle that orchestrates multiple skills as a pipeline, from browser-based data extraction through theme synthesis to dated briefing delivery.
- Built a second posthog-digest bundle that reuses content-synthesizer and digest-delivery without modification, proving the composability of your skill library.
Ready to quiz yourself?