Install
$ agentstack add skill-petercha90-link-bookmark-link-bookmark ✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ✓ Network access No
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
Verified badge
Passed review? Show it. Paste this badge into your README, it links to the public security report.
Reliability & compatibility
Declared compatibility
Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.
We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.
How agent discovery & health will work →About
Link Bookmark
Overview
Link Bookmark is a lightweight Hermes skill for turning links shared in chat into a clean unread bookmark digest. It is useful for Slack, Discord, Telegram, or any other channel where people drop links that should be collected, summarized, and reviewed later.
The skill uses a simple JSON file as the source of truth. Each channel gets its own bookmark file under ~/.hermes/link_bookmarks/ by default. Hermes reads the file, filters unread items, groups them by broad category, re-numbers them for display, and renders a concise report. Items are marked read only when the user explicitly asks.
This skill intentionally does not require Slack/Discord history APIs. If Hermes cannot search channel history, add links from messages that are delivered to Hermes, from URLs supplied by the user, or from manually edited JSON.
When to Use
Use this skill when the user asks for things like:
- "show bookmarks" / "bookmarks"
- "책갈피 보여줘" / "책갈피"
- "show unread links"
- "summarize unread links"
- "add this link to the bookmark list"
- "mark 1 and 3 as read"
- "1번 읽음 처리해줘"
- "전부 읽음 처리해줘"
Do not use this skill for:
- Browser bookmark synchronization
- Full RSS/news monitoring from external feeds
- Tasks that require live Slack/Discord history access when the gateway does not expose those APIs
Data Location
Recommended default path:
~/.hermes/link_bookmarks/.json
For backward compatibility with older link-report setups, you may also read from:
~/.hermes/link_reports/.json
Use one JSON file per channel/context so read state is independent.
JSON Schema
{
"channel_id": "example-channel",
"source": "slack",
"items": [
{
"id": 1,
"status": "unread",
"category": "AI·Tools",
"title": "Example AI Tool",
"url": "https://example.com",
"source_type": "web",
"date": "2026-06-16 09:00",
"summary": "A concise summary of the link.",
"key_points": ["Point 1", "Point 2"]
}
],
"read_items": [],
"updated_at": "2026-06-16T09:00:00+09:00",
"notes": "Optional operating notes."
}
Required item fields are id, url, and title. The other fields improve rendering and organization. Keep id stable forever; display numbers are temporary and are re-created on every report.
Report Formatting
Default report format:
:bookmark_tabs: *Unread Link Bookmark*
`AI`
**1. Example AI Tool**
Added: 2026-06-16
A concise summary of the link.
[Link](https://example.com)
Korean report format when the user is using Korean or says 책갈피:
:bookmark_tabs: *읽지 않은 책갈피*
`AI`
**1. Example AI Tool**
등록일: 2026-06-16
A concise summary of the link.
[Link](https://example.com)
Formatting rules:
- Show only unread items.
- Re-number unread items from 1 to N every time, even if underlying stable JSON IDs have gaps.
- Group by broad category.
- Render categories as code labels, e.g. `
AI`. - Render titles in bold.
- Use
[Link](url)labels instead of raw URLs. - Show the original registration date as
Added: YYYY-MM-DDor등록일: YYYY-MM-DDwhen available. - Keep output concise.
Category Normalization
Normalize detailed categories to broad scan-friendly labels by splitting on common separators and keeping the first segment.
Examples:
| Raw category | Display category | | --- | --- | | AI·Tools | AI | | AI·Research/Industry | AI | | Development·Workflow | Development | | Business·Strategy | Business | | 생산성·노트 | 생산성 |
If no category exists, use Other for English output or 기타 for Korean output.
Operating Procedure
Show unread bookmarks
- Identify the current channel/context ID.
- Read
~/.hermes/link_bookmarks/.json. If absent and a legacy file exists, read~/.hermes/link_reports/.json. - Filter items where
status == "unread"and the stableidis not inread_items. - Normalize categories.
- Group items by category while preserving item order.
- Re-number displayed items from 1 to N across the whole unread list.
- Render the clean Markdown report.
- Do not mark anything read unless the user explicitly asks.
Add a link
- Extract URL, title, source type, and date from the user message or channel metadata.
- If web access is available, fetch the URL and write a concise summary.
- Assign the next stable integer ID:
max(existing ids) + 1. - Set
statustounread. - Store a useful category. It can be more detailed than the display category.
- Update
updated_at. - Save the JSON with UTF-8 and two-space indentation.
Mark items read
Only mark read when the user explicitly requests it.
- Treat user-facing numbers as the current displayed unread positions, not stable JSON IDs, unless the user explicitly says
by idorraw id. - Map display positions back to stable JSON IDs.
- Add those stable IDs to
read_items. - Set matching item
statustoread. - Update
updated_at. - Confirm briefly.
Helper Script
This repository includes scripts/link_bookmark.py for deterministic operations:
python scripts/link_bookmark.py show ~/.hermes/link_bookmarks/my-channel.json
python scripts/link_bookmark.py show ~/.hermes/link_bookmarks/my-channel.json --locale ko
python scripts/link_bookmark.py add ~/.hermes/link_bookmarks/my-channel.json --title "Example" --url "https://example.com" --category "AI·Tools" --summary "Short summary"
python scripts/link_bookmark.py mark-read ~/.hermes/link_bookmarks/my-channel.json 1 3 5
python scripts/link_bookmark.py mark-read ~/.hermes/link_bookmarks/my-channel.json --by-id 42
Common Pitfalls
- Marking items read just because a report was shown. Showing a report does not mean the user read the links. Mark read only after explicit instruction.
- Confusing display numbers with stable IDs. User-facing numbers are temporary unread-list positions. Stable IDs stay inside JSON.
- Depending on Slack history APIs. Hermes gateway sessions may not expose channel history. Use delivered messages, user-provided URLs, or the JSON store.
- Raw URL spam. Use
[Link](url)labels so chat output stays clean.
- Overly narrow display categories. Store detailed categories if useful, but display broad categories for scanning.
- Renumbering JSON IDs. Never rewrite stable IDs when items become read. Only display numbers should change.
Verification Checklist
- [ ] JSON file exists for the channel/context or is created on first add
- [ ] Every item has a stable integer
id - [ ] Report includes only unread items
- [ ] Display numbers are sequential from 1 to N
- [ ] Mark-read maps display numbers back to stable IDs
- [ ] Each item shows an added/registration date when available
- [ ] Categories are broad and rendered as code labels
- [ ] Titles are bold and links use
[Link](url)labels - [ ] No item is marked read unless explicitly requested
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: PeterCha90
- Source: PeterCha90/link-bookmark
- License: MIT
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet, be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.