Agent skill

Link Curator Dashboard Maintainer

by dodo-reach in dodo-reach/hermes-link-curator

Maintains and debugs the FastAPI-based link-curator web dashboard on port 8090, a separate process from the official Hermes dashboard.

MITAuto-check passedBackend & APIs

Install Link Curator Dashboard Maintainer

skills CLI
$ npx skills add dodo-reach/hermes-link-curator --skill link-curator-dashboard -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install dodo-reach/hermes-link-curator link-curator-dashboard --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/dodo-reach/hermes-link-curator.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skill-link-curator-dashboard .claude/skills/link-curator-dashboard && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
link-curator-dashboard
GitHub stars
142
Token cost
~2.6k tokens
SKILL.md length
1,184 words
Files
6 (incl. references)
Skills in repo
2
Repo updated
First seen
Licence
MIT

At a glance

Maintains and debugs the FastAPI-based link-curator web dashboard on port 8090, a separate process from the official Hermes dashboard.

  • Works in 3 steps: On every request, get_all_entries()… → If the file hasn't changed → returns… → If the file was modified (new entries…
  • Debugging why the link-curator dashboard is not reflecting new vault entries
  • SKILL.md covers Service overview, Process inventory, Key paths and Endpoints, plus 11 more sections
  • Calls curl, python3 and uvicorn

What it does

The skill documents a read-only FastAPI dashboard that reads curated links from a vault directory and serves them on port 8090, distinct from the official Hermes dashboard on port 9119, with both able to run side by side. It lists the key paths, the app entry point, the vault parser and the templates folder, and the full set of endpoints, covering the UI itself, a health check, tag and date statistics, cache reload, calendar and search views, per-tag and per-day entry views, and a force-directed graph view backed by D3.js.

Caching is automatic and based on the modification time of INDEX.md: every request checks whether that file changed, serving the cached entries when it has not and silently re-reading and rebuilding the cache when it has, so the dashboard always reflects the current vault state without manual steps. The only exception is when the file cannot be read at all, in which case the last valid cache keeps serving and a warning is logged. The excerpt breaks off before further maintenance details.

When your agent uses it

  • Debugging why the link-curator dashboard is not reflecting new vault entries
  • Finding the right endpoint to query tags, dates or the link graph
  • Confirming which dashboard process, link-curator or Hermes, is running on a given port

Example prompts

  • “Check which process is listening on port 8090 and confirm it is the link-curator dashboard.”
  • “Why isn't the dashboard showing the links I just saved to the vault?”
  • “Show me the endpoint to get the graph-json data for the force-directed view.”

Requirements

  • A running link-curator FastAPI app with an initialized vault

Workflow steps

3 steps, taken from the first numbered list in SKILL.md.

  1. On every request, get_all_entries() checks the mtime of INDEX.md
  2. If the file hasn't changed → returns cached entries (fast)
  3. If the file was modified (new entries saved) → silently re-reads and rebuilds the cache

What it can do on your machine

Read from SKILL.md and the folder at commit 5bd4d5a. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • curl
    • python3
    • uvicorn

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md. Its commands use curl, which can reach the network depending on how they are called.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Link Curator Dashboard Maintainer loads about 2.6k tokens when it runs, and up to ~4.7k if it reads all its reference files. Until then it costs about 35 tokens; SKILL.md has 1,184 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~35
When it runs · the whole SKILL.md, loaded when a task matches
~2.6k
With references · SKILL.md plus every file in references/, read only if the agent opens them
~4.7k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from dodo-reach/hermes-link-curator at commit 5bd4d5a, republished under its MIT licence (© dodo-reach). 1,184 words, ~2,603 tokens.

Download SKILL.mdSave it as .claude/skills/link-curator-dashboard/SKILL.md (or your agent's skills folder). This skill also uses 5 other files; get the full folder from GitHub.
name
link-curator-dashboard
description
Maintain and debug the link-curator web dashboard (port 8090). Separate process from the official Hermes dashboard.
triggers
archive dashboard not loading, port 8090, archive-dashboard, graph view, d3 force graph

Service overview

The link-curator dashboard is a FastAPI app running on port 8090, separate from the official Hermes dashboard (hermes dashboard, default port 9119). It reads from the vault at <profile-dir>/vault/ and exposes a read-only web UI.

Process inventory

bash
# Find all dashboard processes
lsof -nP -iTCP:8090 -sTCP:LISTEN

# Check the command
ps -p <pid> -o pid,command

# Check working directory (macOS)
lsof -a -p <pid> -d cwd

# Check working directory (Linux)
readlink /proc/<pid>/cwd

Current layout (verify with ps aux | grep "8090"):

  • The dashboard process typically runs uvicorn main:app --port 8090 from <profile-dir>/dashboard/
  • The process working directory is authoritative — do not assume the path matches the skill's description if multiple dashboard instances exist
  • This dashboard is a separate process from the official Hermes dashboard (the hermes dashboard command, default port 9119). They are independent and can run side-by-side.

Key paths

ComponentPath
Dashboard app<profile-dir>/dashboard/
Main app entry<profile-dir>/dashboard/main.py
Vault parser<profile-dir>/dashboard/archive.py
Templates<profile-dir>/dashboard/templates/
Vault<profile-dir>/vault/

Endpoints

EndpointPurpose
GET /Dashboard UI
GET /healthHealth check + entry count
GET /statsTag counts, date distribution
GET /reload-cacheForce-clear and reload vault cache
GET /calendarCalendar view
GET /search?q=...Search entries
GET /tag/{tag}Entries for a specific tag
GET /day/YYYY-MM-DDEntries for a specific day
GET /day-json/YYYY-MM-DDJSON feed for a day
GET /graphForce-directed graph view (HTML + D3.js)
GET /graph-jsonGraph dataset as {nodes, links} JSON

Caching — automatic

archive.py uses mtime-based invalidation — no lru_cache, no manual invalidation needed:

  1. On every request, get_all_entries() checks the mtime of INDEX.md
  2. If the file hasn't changed → returns cached entries (fast)
  3. If the file was modified (new entries saved) → silently re-reads and rebuilds the cache

This means the dashboard always reflects the current vault state without any manual intervention. The only time you need to act is when the file can't be read (permissions, disk error) — in that case the last valid cache is served and a warning is logged.

/reload-cache still exists for edge cases (corrupted mtime, network mounts with broken stat) — it's a manual force-refresh that clears the cache and re-reads immediately.

Dashboard went offline — restart procedure

The dashboard has no watchdog and dies silently (e.g. after a system reboot). Unlike the official Hermes dashboard which can be supervised by hermes gateway install, the link-curator dashboard must be manually restarted when the process exits. See "Dashboard went offline — restart procedure" below.

bash
cd <profile-dir>/dashboard
./start.sh 8090

For a background process:

bash
cd <profile-dir>/dashboard
mkdir -p ../logs
nohup ./start.sh 8090 > ../logs/dashboard.log 2>&1 &

After starting, verify readiness:

bash
sleep 2 && curl -s --max-time 3 http://localhost:8090/health

Expected: {"status":"healthy","total_entries":N,...}

If health fails, check the background process output:

bash
tail -50 <profile-dir>/logs/dashboard.log

Validate

bash
cd <profile-dir>/dashboard && python3 validate.py

Pitfall: The profile root at <profile-dir>/ also has a validate.py — it is a DIFFERENT file. Running python3 validate.py from the wrong directory gives wrong results or errors. See references/validate-path.md for the correct path, common wrong paths, and exit code meanings.

Double---- separator trap

When removing a malformed entry from INDEX.md (e.g. one with a wrong header level like # Index instead of ### Title), you may leave behind a dangling --- separator. Combined with the next entry's ---, this creates a double separator pattern (---\n\n---) which produces an empty entry chunk. The validator reports it as ERROR: Missing or malformed ### title line at chunk N.

Fix: After removing a bad entry, check the surrounding context in both INDEX.md and the relevant daily note file (e.g. vault/2026-MM-DD.md). Ensure only ONE --- separates entries, not two. The validator will catch this (Has errors: 1, ERROR: Missing or malformed ### title line) — re-check and patch the orphaned separator.

Why patch misses it: The malformed entry sits in a section of the file where many entries share identical string patterns (e.g. - **Summary**: ... lines). patch reports Found N matches for old_string and refuses to guess. Use Python direct file manipulation instead:

python
python3 - <<'EOF'
path = "<profile-dir>/vault/INDEX.md"
with open(path) as f:
    lines = f.readlines()
# Find the target line and insert/delete as needed
for i, line in enumerate(lines):
    if line.startswith("### TARGET ENTRY"):
        # remove: del lines[i-1:i+6]  (separator + entry)
        # insert: lines.insert(i, new_entry_text)
        break
with open(path, "w") as f:
    f.writelines(lines)
EOF

Diagnostic checklist — "dashboard shows fewer entries than expected"

Use this sequence before assuming server-side problems:

  1. curl http://localhost:8090/health — get total_entries count
  2. curl http://localhost:8090/day-json/YYYY-MM-DD — check specific days; returns JSON array of entries
  3. curl http://localhost:8090/ | grep 'entry-card'` — count entry cards in raw HTML
  4. If API returns correct count but browser UI doesn't → browser cache, try Ctrl+Shift+R or incognito window
  5. If health count is fine but dashboard still shows fewer entries → possible INDEX.md chunk corruption. See obsidian skill → INDEX.md Health Check section for the Python chunk analysis one-liner that catches merged entries and double---- separators in seconds.

Quick health check (always run after INDEX.md edits):

bash
cd <profile-dir>/dashboard && python3 validate.py

Expected: Has errors: 0, Fully valid: N matching vault entry count.

Key signal: total_entries from /health matches vault count → server is fine, client cache is the issue.

Show full SKILL.md (482 more words)Show less

Graph view

The /graph endpoint renders a D3.js force-directed graph over the vault. Data is built by get_graph_data() in archive.py and exposed via /graph-json.

Data shape (tag-graph, two node kinds):

  • nodes: {id, label, kind: "tag"|"entry", count, type?, url?}
  • links: {source: tag_id, target: entry_id} — bipartite, no entry↔entry edges

Why tag-graph instead of entry-graph: with 100+ entries, an entry↔entry similarity graph becomes a hairball. Tag hubs collapse shared topics into a readable cluster, the way Obsidian's native graph view does. Entry count is O(entries × avg_tags), link count is O(tag_appearances).

Filtering rule: tags with count < 2 are dropped (reduces noise from one-off tags) and entries that share zero active tags are omitted as orphans. With 103 entries this produces ~78 tag nodes + ~101 entry nodes + ~400 links.

Front-end interactions (D3 v7 via CDN, no npm install):

  • drag to reposition, scroll to zoom (0.3×–5×), background dblclick to reset
  • click a tag node → highlight that cluster, dim the rest (click again to clear)
  • dblclick an entry node → open its URL in a new tab

See references/graph-view.md for the full D3 template, force tuning, color map, and a reusable starter at templates/force-graph.html (copy + change the data endpoint to reuse for a different graph).

Adding new routes (pattern)

For any new page that needs the same nav + footer as the rest of the dashboard:

  1. Add the route in main.py (HTML response) + matching -json for data
  2. Add current_page string in the template context
  3. Add a nav link in templates/base.html (use {% if current_page == '<name>' %})
  4. Add CSS to the bottom of base.html if it needs styles
  5. Add a function in archive.py if it parses the vault
  6. Validate + restart

Common failure modes

  1. Dashboard shows fewer entries than expected — run validate.py; if health count matches vault count, the server is fine — the issue is browser-side
  2. Old process still running on 8090 — new start fails because port is occupied. Always kill first.
  3. Browser cache — after any fix, always try Ctrl+Shift+R or incognito. The dashboard is read-heavy and browsers aggressively cache it.
  4. INDEX.md entries missing (root cause: write_file overwrite) — the link-curator agent may have used write_file directly on INDEX.md without reading it first, wiping all previous entries. If only June entries show, May is gone. Fix: rebuild from daily notes using scripts/rebuild_index.py (see below). Prevention: use save_entry.py from the obsidian skill for all new saves — it does atomic read+patch, never full overwrite.

Rebuild INDEX.md from daily notes

If INDEX.md was overwritten and entries are missing, rebuild from the daily notes:

bash
cd <profile-dir>/skills/note-taking/obsidian/scripts
python3 rebuild_index.py

Then validate:

bash
cd <profile-dir>/dashboard && python3 validate.py
curl http://localhost:8090/reload-cache
  • obsidian — vault entry format, save workflow, validate.py
  • camofox — for browser-session fetching on sites that block simple extraction

References

  • references/validate-path.md — validate.py location, exit codes, what it checks
  • references/proc_pid_working_dir.md — how to resolve "which process is actually running on this port"
  • references/vault-dashboard-discrepancy.md — troubleshooting missing entries: always verify INDEX.md Added field vs dashboard grouping
  • references/graph-view.md — D3 force-directed graph: data shape, force tuning, color map, interaction patterns

© dodo-reach, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 5 other files (references) in skill-link-curator-dashboard of dodo-reach/hermes-link-curator.

  • SKILL.md
  • references/graph-view.md
  • references/proc_pid_working_dir.md
  • references/validate-path.md
  • references/vault-dashboard-discrepancy.md
  • templates/force-graph.html

Open the folder on GitHubat commit 5bd4d5a

Compare with similar skills

Link Curator Dashboard Maintainer next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Link Curator Dashboard Maintainer compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Link Curator Dashboard Maintainer this skilldodo-reach/hermes-link-curator142—~2.6kAutomated safety check: PassMIT
Fastcrudbenavlabs/fastcrud1.6k—~5kAutomated safety check: PassMIT
Readme Generator Probeizhi23/README-Generator-Pro113—~472Automated safety check: NotesNone
FastAPI Project Templateswshobson/agents40k11 repos~901Automated safety check: PassMIT
Fastapi REST API Designopen-edge-platform/anomalib6.2k—~838Automated safety check: PassApache-2.0
Cognee Local Server Setuptopoteretes/cognee32k—~702Automated safety check: NotesApache-2.0

Similar skills

  • Fastcrud

    benavlabs/fastcrud

    A skill your agent uses when building or modifying CRUD endpoints with FastCRUD (the fastcrud PyPI package) in a FastAPI project — covers FastCRUD, crudrouter, EndpointCreator, FilterConfig…

    1.6k GitHub stars~5k tokensUpdated today
    Backend & APIsAuto-check passed
  • Readme Generator Pro

    beizhi23/README-Generator-Pro

    Generate, modify, and render professional README.md files and project introduction HTML pages using the bundled README Generator Pro FastAPI application.

    113 GitHub stars~472 tokensUpdated 3 mo ago
    Backend & APIsAuto-check: notes
  • Scaffolds FastAPI projects with a layered app layout, dependency injection through Depends, async handlers and database access, middleware and pytest setup.

    40k GitHub starsUsed in 11 repos~901 tokens
    Backend & APIsAuto-check passed
  • Fastapi REST API Design

    open-edge-platform/anomalib

    Designs and reviews REST APIs for FastAPI services using consistent resource naming, HTTP semantics, validation, security, and error handling patterns.

    6.2k GitHub stars~838 tokensUpdated yesterday
    Backend & APIsAuto-check passed
  • Cognee Local Server Setup

    topoteretes/cognee

    Starts the cognee API server and web UI on your own machine, checks its health, connects the SDK or CLI to it and helps you pick between multi-tenant and single-user auth.

    32k GitHub stars~702 tokensUpdated yesterday
    Backend & APIsAuto-check: notes
  • Accept Agent Payments

    circlefin/skills

    A skill your agent uses when a developer wants to monetize an API, endpoint, service, model, dataset, tool, or agent-facing resource with Circle USDC pay-per-call payments, Gateway Nanopayments…

    155 GitHub stars~2.6k tokensUpdated yesterday
    Backend & APIsAuto-check: warnings

More from dodo-reach/hermes-link-curator

  • Link Curator Obsidian Vault

    dodo-reach/hermes-link-curator

    Archives links a user sends into a profile's Obsidian-style vault with a save script and replies with a one-word confirmation instead of a summary.

    142 GitHub stars~2.8k tokensUpdated 4 mo ago
    Auto-check passed

Works with

Categories

Questions about Link Curator Dashboard Maintainer

What does Link Curator Dashboard Maintainer do?

Maintains and debugs the FastAPI-based link-curator web dashboard on port 8090, a separate process from the official Hermes dashboard. The skill documents a read-only FastAPI dashboard that reads curated links from a vault directory and serves them on port 8090, distinct from the official Hermes dashboard on port 9119, with both able to run side by side.js.

When should I use Link Curator Dashboard Maintainer?

Link Curator Dashboard Maintainer fits situations like: debugging why the link-curator dashboard is not reflecting new vault entries; finding the right endpoint to query tags, dates or the link graph; confirming which dashboard process, link-curator or Hermes, is running on a given port.

How do I install Link Curator Dashboard Maintainer in Claude Code?

Run `npx skills add dodo-reach/hermes-link-curator --skill link-curator-dashboard -a claude-code`. Or copy the skill folder (skill-link-curator-dashboard in dodo-reach/hermes-link-curator) into .claude/skills/link-curator-dashboard in your project. Claude Code loads it when a task matches its description.

How do I install Link Curator Dashboard Maintainer in Codex?

Run `npx skills add dodo-reach/hermes-link-curator --skill link-curator-dashboard -a codex`. Or copy the skill folder (skill-link-curator-dashboard in dodo-reach/hermes-link-curator) into .agents/skills/link-curator-dashboard in your project. Codex loads it when a task matches its description.

Can I use Link Curator Dashboard Maintainer in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add dodo-reach/hermes-link-curator --skill link-curator-dashboard -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/link-curator-dashboard, .gemini/skills/link-curator-dashboard, .github/skills/link-curator-dashboard and .opencode/skills/link-curator-dashboard in your project.

What does Link Curator Dashboard Maintainer need to run?

Going by SKILL.md and its folder, Link Curator Dashboard Maintainer needs the command-line tools its instructions call (curl, python3 and uvicorn). Our summary lists: A running link-curator FastAPI app with an initialized vault.

Does Link Curator Dashboard Maintainer access the network?

SKILL.md contains no URLs. Its commands use curl, which can reach the network depending on how they are called. This is read from the text; nothing was executed.

Is Link Curator Dashboard Maintainer safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Link Curator Dashboard Maintainer use?

Link Curator Dashboard Maintainer is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Link Curator Dashboard Maintainer use?

About 2.6k tokens (SKILL.md is roughly 10k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 2.1k tokens, read only when the agent opens those files.

What are the alternatives to Link Curator Dashboard Maintainer?

Skills that share tags, products or a category with Link Curator Dashboard Maintainer: Fastcrud (benavlabs/fastcrud, 1.6k stars), Readme Generator Pro (beizhi23/README-Generator-Pro, 113 stars), FastAPI Project Templates (wshobson/agents, 40k stars) and Fastapi REST API Design (open-edge-platform/anomalib, 6.2k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Link Curator Dashboard Maintainer?

dodo-reach (a GitHub user) maintains it in dodo-reach/hermes-link-curator, which has 142 GitHub stars. The repository holds 2 skills in this directory. The repository was last updated on June 6, 2026.

Source: dodo-reach/hermes-link-curator on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.