diff --git a/airtable/SKILL.md b/airtable/SKILL.md
deleted file mode 100644
index 3fa1b0a..0000000
--- a/airtable/SKILL.md
+++ /dev/null
@@ -1,229 +0,0 @@
----
-name: airtable
-description: Airtable REST API via curl. Records CRUD, filters, upserts.
-version: 1.1.0
-author: community
-license: MIT
-platforms: [linux, macos, windows]
-prerequisites:
- env_vars: [AIRTABLE_API_KEY]
- commands: [curl]
-metadata:
- hermes:
- tags: [Airtable, Productivity, Database, API]
- homepage: https://airtable.com/developers/web/api/introduction
----
-
-# Airtable — Bases, Tables & Records
-
-Work with Airtable's REST API directly via `curl` using the `terminal` tool. No MCP server, no OAuth flow, no Python SDK — just `curl` and a personal access token.
-
-## Prerequisites
-
-1. Create a **Personal Access Token (PAT)** at https://airtable.com/create/tokens (tokens start with `pat...`).
-2. Grant these scopes (minimum):
- - `data.records:read` — read rows
- - `data.records:write` — create / update / delete rows
- - `schema.bases:read` — list bases and tables
-3. **Important:** in the same token UI, add each base you want to access to the token's **Access** list. PATs are scoped per-base — a valid token on the wrong base returns `403`.
-4. Store the token in `${HERMES_HOME:-~/.hermes}/.env` (or via `hermes setup`):
- ```
- AIRTABLE_API_KEY=pat_your_token_here
- ```
-
-> Note: legacy `key...` API keys were deprecated Feb 2024. Only PATs and OAuth tokens work now.
-
-## API Basics
-
-- **Endpoint:** `https://api.airtable.com/v0`
-- **Auth header:** `Authorization: Bearer $AIRTABLE_API_KEY`
-- **All requests** use JSON (`Content-Type: application/json` for any POST/PATCH/PUT body).
-- **Object IDs:** bases `app...`, tables `tbl...`, records `rec...`, fields `fld...`. IDs never change; names can. Prefer IDs in automations.
-- **Rate limit:** 5 requests/sec/base. `429` → back off. Burst on a single base will be throttled.
-
-Base curl pattern:
-```bash
-curl -s "https://api.airtable.com/v0/$BASE_ID/$TABLE?maxRecords=5" \
- -H "Authorization: Bearer $AIRTABLE_API_KEY" | python3 -m json.tool
-```
-
-`-s` suppresses curl's progress bar — keep it set for every call so the tool output stays clean for Hermes. Pipe through `python3 -m json.tool` (always present) or `jq` (if installed) for readable JSON.
-
-## Field Types (request body shapes)
-
-| Field type | Write shape |
-|---|---|
-| Single line text | `"Name": "hello"` |
-| Long text | `"Notes": "multi\nline"` |
-| Number | `"Score": 42` |
-| Checkbox | `"Done": true` |
-| Single select | `"Status": "Todo"` (name must already exist unless `typecast: true`) |
-| Multi-select | `"Tags": ["urgent", "bug"]` |
-| Date | `"Due": "2026-04-01"` |
-| DateTime (UTC) | `"At": "2026-04-01T14:30:00.000Z"` |
-| URL / Email / Phone | `"Link": "https://…"` |
-| Attachment | `"Files": [{"url": "https://…"}]` (Airtable fetches + rehosts) |
-| Linked record | `"Owner": ["recXXXXXXXXXXXXXX"]` (array of record IDs) |
-| User | `"AssignedTo": {"id": "usrXXXXXXXXXXXXXX"}` |
-
-Pass `"typecast": true` at the top level of a create/update body to let Airtable auto-coerce values (e.g. create a new select option on the fly, convert `"42"` → `42`).
-
-## Common Queries
-
-### List bases the token can see
-```bash
-curl -s "https://api.airtable.com/v0/meta/bases" \
- -H "Authorization: Bearer $AIRTABLE_API_KEY" | python3 -m json.tool
-```
-
-### List tables + schema for a base
-```bash
-curl -s "https://api.airtable.com/v0/meta/bases/$BASE_ID/tables" \
- -H "Authorization: Bearer $AIRTABLE_API_KEY" | python3 -m json.tool
-```
-Use this BEFORE mutating — confirms exact field names and IDs, surfaces `options.choices` for select fields, and shows primary-field names.
-
-### List records (first 10)
-```bash
-curl -s "https://api.airtable.com/v0/$BASE_ID/$TABLE?maxRecords=10" \
- -H "Authorization: Bearer $AIRTABLE_API_KEY" | python3 -m json.tool
-```
-
-### Get a single record
-```bash
-curl -s "https://api.airtable.com/v0/$BASE_ID/$TABLE/$RECORD_ID" \
- -H "Authorization: Bearer $AIRTABLE_API_KEY" | python3 -m json.tool
-```
-
-### Filter records (filterByFormula)
-Airtable formulas must be URL-encoded. Let Python stdlib do it — never hand-encode:
-```bash
-FORMULA="{Status}='Todo'"
-ENC=$(python3 -c 'import sys, urllib.parse; print(urllib.parse.quote(sys.argv[1], safe=""))' "$FORMULA")
-curl -s "https://api.airtable.com/v0/$BASE_ID/$TABLE?filterByFormula=$ENC&maxRecords=20" \
- -H "Authorization: Bearer $AIRTABLE_API_KEY" | python3 -m json.tool
-```
-
-Useful formula patterns:
-- Exact match: `{Email}='user@example.com'`
-- Contains: `FIND('bug', LOWER({Title}))`
-- Multiple conditions: `AND({Status}='Todo', {Priority}='High')`
-- Or: `OR({Owner}='alice', {Owner}='bob')`
-- Not empty: `NOT({Assignee}='')`
-- Date comparison: `IS_AFTER({Due}, TODAY())`
-
-### Sort + select specific fields
-```bash
-curl -s "https://api.airtable.com/v0/$BASE_ID/$TABLE?sort%5B0%5D%5Bfield%5D=Priority&sort%5B0%5D%5Bdirection%5D=asc&fields%5B%5D=Name&fields%5B%5D=Status" \
- -H "Authorization: Bearer $AIRTABLE_API_KEY" | python3 -m json.tool
-```
-Square brackets in query params MUST be URL-encoded (`%5B` / `%5D`).
-
-### Use a named view
-```bash
-curl -s "https://api.airtable.com/v0/$BASE_ID/$TABLE?view=Grid%20view&maxRecords=50" \
- -H "Authorization: Bearer $AIRTABLE_API_KEY" | python3 -m json.tool
-```
-Views apply their saved filter + sort server-side.
-
-## Common Mutations
-
-### Create a record
-```bash
-curl -s -X POST "https://api.airtable.com/v0/$BASE_ID/$TABLE" \
- -H "Authorization: Bearer $AIRTABLE_API_KEY" \
- -H "Content-Type: application/json" \
- -d '{"fields":{"Name":"New task","Status":"Todo","Priority":"High"}}' | python3 -m json.tool
-```
-
-### Create up to 10 records in one call
-```bash
-curl -s -X POST "https://api.airtable.com/v0/$BASE_ID/$TABLE" \
- -H "Authorization: Bearer $AIRTABLE_API_KEY" \
- -H "Content-Type: application/json" \
- -d '{
- "typecast": true,
- "records": [
- {"fields": {"Name": "Task A", "Status": "Todo"}},
- {"fields": {"Name": "Task B", "Status": "In progress"}}
- ]
- }' | python3 -m json.tool
-```
-Batch endpoints are capped at **10 records per request**. For larger inserts, loop in batches of 10 with a short sleep to respect 5 req/sec/base.
-
-### Update a record (PATCH — merges, preserves unchanged fields)
-```bash
-curl -s -X PATCH "https://api.airtable.com/v0/$BASE_ID/$TABLE/$RECORD_ID" \
- -H "Authorization: Bearer $AIRTABLE_API_KEY" \
- -H "Content-Type: application/json" \
- -d '{"fields":{"Status":"Done"}}' | python3 -m json.tool
-```
-
-### Upsert by a merge field (no ID needed)
-```bash
-curl -s -X PATCH "https://api.airtable.com/v0/$BASE_ID/$TABLE" \
- -H "Authorization: Bearer $AIRTABLE_API_KEY" \
- -H "Content-Type: application/json" \
- -d '{
- "performUpsert": {"fieldsToMergeOn": ["Email"]},
- "records": [
- {"fields": {"Email": "user@example.com", "Status": "Active"}}
- ]
- }' | python3 -m json.tool
-```
-`performUpsert` creates records whose merge-field values are new, patches records whose merge-field values already exist. Great for idempotent syncs.
-
-### Delete a record
-```bash
-curl -s -X DELETE "https://api.airtable.com/v0/$BASE_ID/$TABLE/$RECORD_ID" \
- -H "Authorization: Bearer $AIRTABLE_API_KEY" | python3 -m json.tool
-```
-
-### Delete up to 10 records in one call
-```bash
-curl -s -X DELETE "https://api.airtable.com/v0/$BASE_ID/$TABLE?records%5B%5D=rec1&records%5B%5D=rec2" \
- -H "Authorization: Bearer $AIRTABLE_API_KEY" | python3 -m json.tool
-```
-
-## Pagination
-
-List endpoints return at most **100 records per page**. If the response includes `"offset": "..."`, pass it back on the next call. Loop until the field is absent:
-
-```bash
-OFFSET=""
-while :; do
- URL="https://api.airtable.com/v0/$BASE_ID/$TABLE?pageSize=100"
- [ -n "$OFFSET" ] && URL="$URL&offset=$OFFSET"
- RESP=$(curl -s "$URL" -H "Authorization: Bearer $AIRTABLE_API_KEY")
- echo "$RESP" | python3 -c 'import json,sys; d=json.load(sys.stdin); [print(r["id"], r["fields"].get("Name","")) for r in d["records"]]'
- OFFSET=$(echo "$RESP" | python3 -c 'import json,sys; d=json.load(sys.stdin); print(d.get("offset",""))')
- [ -z "$OFFSET" ] && break
-done
-```
-
-## Typical Hermes Workflow
-
-1. **Confirm auth.** `curl -s -o /dev/null -w "%{http_code}\n" https://api.airtable.com/v0/meta/bases -H "Authorization: Bearer $AIRTABLE_API_KEY"` — expect `200`.
-2. **Find the base.** List bases (step above) OR ask the user for the `app...` ID directly if the token lacks `schema.bases:read`.
-3. **Inspect the schema.** `GET /v0/meta/bases/$BASE_ID/tables` — cache the exact field names and primary-field name locally in the session before mutating anything.
-4. **Read before you write.** For "update X where Y", `filterByFormula` first to resolve the `rec...` ID, then `PATCH /v0/$BASE_ID/$TABLE/$RECORD_ID`. Never guess record IDs.
-5. **Batch writes.** Combine related creates into one 10-record POST to stay under the 5 req/sec budget.
-6. **Destructive ops.** Deletions can't be undone via API. If the user says "delete all Xs", echo back the filter + record count and confirm before firing.
-
-## Pitfalls
-
-- **`filterByFormula` MUST be URL-encoded.** Field names with spaces or non-ASCII also need encoding (`{My Field}` → `%7BMy%20Field%7D`). Use Python stdlib (pattern above) — never hand-escape.
-- **Empty fields are omitted from responses.** A missing `"Assignee"` key doesn't mean the field doesn't exist — it means this record's value is empty. Check the schema (step 3) before concluding a field is missing.
-- **PATCH vs PUT.** `PATCH` merges supplied fields into the record. `PUT` replaces the record entirely and clears any field you didn't include. Default to `PATCH`.
-- **Single-select options must exist.** Writing `"Status": "Shipping"` when `Shipping` isn't in the field's option list errors with `INVALID_MULTIPLE_CHOICE_OPTIONS` unless you pass `"typecast": true` (which auto-creates the option).
-- **Per-base token scoping.** A `403` on one base while another works means the token's Access list doesn't include that base — not a scope or auth issue. Send the user to https://airtable.com/create/tokens to grant it.
-- **Rate limits are per base, not per token.** 5 req/sec on `baseA` and 5 req/sec on `baseB` is fine; 6 req/sec on `baseA` alone will throttle. Monitor the `Retry-After` header on `429`.
-
-## Important Notes for Hermes
-
-- **Always use the `terminal` tool with `curl`.** Do NOT use `web_extract` (it can't send auth headers) or `browser_navigate` (needs UI auth and is slow).
-- **`AIRTABLE_API_KEY` flows from `${HERMES_HOME:-~/.hermes}/.env` into the subprocess automatically** when this skill is loaded — no need to re-export it before each `curl` call.
-- **Escape curly braces in formulas carefully.** In a heredoc body, `{Status}` is literal. In a shell argument, `{Status}` is safe outside `{...}` brace-expansion context — but pass dynamic strings through `python3 urllib.parse.quote` before splicing into a URL.
-- **Pretty-print with `python3 -m json.tool`** (always present) rather than `jq` (optional). Only reach for `jq` when you need filtering/projection.
-- **Pagination is per-page, not global.** Airtable's 100-record cap is a hard limit; there is no way to bump it. Loop with `offset` until the field is absent.
-- **Read the `errors` array** on non-2xx responses — Airtable returns structured error codes like `AUTHENTICATION_REQUIRED`, `INVALID_PERMISSIONS`, `MODEL_ID_NOT_FOUND`, `INVALID_MULTIPLE_CHOICE_OPTIONS` that tell you exactly what's wrong.
diff --git a/apple-notes/SKILL.md b/apple-notes/SKILL.md
deleted file mode 100644
index 020f0d6..0000000
--- a/apple-notes/SKILL.md
+++ /dev/null
@@ -1,90 +0,0 @@
----
-name: apple-notes
-description: "Manage Apple Notes via memo CLI: create, search, edit."
-version: 1.0.0
-author: Hermes Agent
-license: MIT
-platforms: [macos]
-metadata:
- hermes:
- tags: [Notes, Apple, macOS, note-taking]
- related_skills: [obsidian]
-prerequisites:
- commands: [memo]
----
-
-# Apple Notes
-
-Use `memo` to manage Apple Notes directly from the terminal. Notes sync across all Apple devices via iCloud.
-
-## Prerequisites
-
-- **macOS** with Notes.app
-- Install: `brew tap antoniorodr/memo && brew install antoniorodr/memo/memo`
-- Grant Automation access to Notes.app when prompted (System Settings → Privacy → Automation)
-
-## When to Use
-
-- User asks to create, view, or search Apple Notes
-- Saving information to Notes.app for cross-device access
-- Organizing notes into folders
-- Exporting notes to Markdown/HTML
-
-## When NOT to Use
-
-- Obsidian vault management → use the `obsidian` skill
-- Bear Notes → separate app (not supported here)
-- Quick agent-only notes → use the `memory` tool instead
-
-## Quick Reference
-
-### View Notes
-
-```bash
-memo notes # List all notes
-memo notes -f "Folder Name" # Filter by folder
-memo notes -s "query" # Search notes (fuzzy)
-```
-
-### Create Notes
-
-```bash
-memo notes -a # Interactive editor
-memo notes -a "Note Title" # Quick add with title
-```
-
-### Edit Notes
-
-```bash
-memo notes -e # Interactive selection to edit
-```
-
-### Delete Notes
-
-```bash
-memo notes -d # Interactive selection to delete
-```
-
-### Move Notes
-
-```bash
-memo notes -m # Move note to folder (interactive)
-```
-
-### Export Notes
-
-```bash
-memo notes -ex # Export to HTML/Markdown
-```
-
-## Limitations
-
-- Cannot edit notes containing images or attachments
-- Interactive prompts require terminal access (use pty=true if needed)
-- macOS only — requires Apple Notes.app
-
-## Rules
-
-1. Prefer Apple Notes when user wants cross-device sync (iPhone/iPad/Mac)
-2. Use the `memory` tool for agent-internal notes that don't need to sync
-3. Use the `obsidian` skill for Markdown-native knowledge management
diff --git a/apple-reminders/SKILL.md b/apple-reminders/SKILL.md
deleted file mode 100644
index 4536644..0000000
--- a/apple-reminders/SKILL.md
+++ /dev/null
@@ -1,130 +0,0 @@
----
-name: apple-reminders
-description: "Apple Reminders via remindctl: add, list, complete."
-version: 1.0.0
-author: Hermes Agent
-license: MIT
-platforms: [macos]
-metadata:
- hermes:
- tags: [Reminders, tasks, todo, macOS, Apple]
-prerequisites:
- commands: [remindctl]
----
-
-# Apple Reminders
-
-Use `remindctl` to manage Apple Reminders directly from the terminal. Tasks sync across all Apple devices via iCloud.
-
-## Prerequisites
-
-- **macOS** with Reminders.app
-- Install: `brew install steipete/tap/remindctl`
-- Grant Reminders permission when prompted
-- Check: `remindctl status` / Request: `remindctl authorize`
-
-## When to Use
-
-- User mentions "reminder" or "Reminders app"
-- Creating personal to-dos with due dates that sync to iOS
-- Managing Apple Reminders lists
-- User wants tasks to appear on their iPhone/iPad
-
-## When NOT to Use
-
-- Scheduling agent alerts → use the cronjob tool instead
-- Calendar events → use Apple Calendar or Google Calendar
-- Project task management → use GitHub Issues, Notion, etc.
-- If user says "remind me" but means an agent alert → clarify first
-
-## Quick Reference
-
-### View Reminders
-
-```bash
-remindctl # Today's reminders
-remindctl today # Today
-remindctl tomorrow # Tomorrow
-remindctl week # This week
-remindctl overdue # Past due
-remindctl all # Everything
-remindctl 2026-01-04 # Specific date
-```
-
-### Manage Lists
-
-```bash
-remindctl list # List all lists
-remindctl list Work # Show specific list
-remindctl list Projects --create # Create list
-remindctl list Work --delete # Delete list
-```
-
-### Create Reminders
-
-```bash
-remindctl add "Buy milk"
-remindctl add --title "Call mom" --list Personal --due tomorrow
-remindctl add --title "Meeting prep" --due "2026-02-15 09:00"
-```
-
-### Due Time vs Alarm / Early Nudge
-
-`--due` and `--alarm` are different fields:
-
-- `--due` sets the reminder's due date/time.
-- `--alarm` sets the EventKit alarm/notification trigger. Timed due reminders may default to an alarm at the due time, but pass `--alarm` explicitly when the user asks for an earlier nudge.
-
-For a reminder due at 2:00 PM with a notification 30 minutes earlier:
-
-```bash
-remindctl add --title "Hairdresser" --due "2026-05-15 14:00" --alarm "2026-05-15 13:30"
-```
-
-To edit an existing reminder:
-
-```bash
-remindctl edit 87354 --due "2026-05-15 14:00" --alarm "2026-05-15 13:30"
-```
-
-The Reminders UI may show or group the item by the alarm time because that is when the notification fires. Verify with JSON instead of assuming the due time moved:
-
-```bash
-remindctl today --json
-```
-
-Expected shape:
-
-- `dueDate`: actual due time
-- `alarmDate`: notification / early nudge time
-
-Apple's public `EKReminder` docs list only reminder-specific properties. Alarm support comes from inherited `EKCalendarItem` behavior exposed by remindctl's `--alarm` flag.
-
-### Complete / Delete
-
-```bash
-remindctl complete 1 2 3 # Complete by ID
-remindctl delete 4A83 --force # Delete by ID
-```
-
-### Output Formats
-
-```bash
-remindctl today --json # JSON for scripting
-remindctl today --plain # TSV format
-remindctl today --quiet # Counts only
-```
-
-## Date Formats
-
-Accepted by `--due` and date filters:
-- `today`, `tomorrow`, `yesterday`
-- `YYYY-MM-DD`
-- `YYYY-MM-DD HH:mm`
-- ISO 8601 (`2026-01-04T12:34:56Z`)
-
-## Rules
-
-1. When user says "remind me", clarify: Apple Reminders (syncs to phone) vs agent cronjob alert
-2. Always confirm reminder content and due date before creating
-3. Use `--json` for programmatic parsing
diff --git a/architecture-diagram/SKILL.md b/architecture-diagram/SKILL.md
deleted file mode 100644
index 2c813c5..0000000
--- a/architecture-diagram/SKILL.md
+++ /dev/null
@@ -1,148 +0,0 @@
----
-name: architecture-diagram
-description: "Dark-themed SVG architecture/cloud/infra diagrams as HTML."
-version: 1.0.0
-author: Cocoon AI (hello@cocoon-ai.com), ported by Hermes Agent
-license: MIT
-dependencies: []
-platforms: [linux, macos, windows]
-metadata:
- hermes:
- tags: [architecture, diagrams, SVG, HTML, visualization, infrastructure, cloud]
- related_skills: [concept-diagrams, excalidraw]
----
-
-# Architecture Diagram Skill
-
-Generate professional, dark-themed technical architecture diagrams as standalone HTML files with inline SVG graphics. No external tools, no API keys, no rendering libraries — just write the HTML file and open it in a browser.
-
-## Scope
-
-**Best suited for:**
-- Software system architecture (frontend / backend / database layers)
-- Cloud infrastructure (VPC, regions, subnets, managed services)
-- Microservice / service-mesh topology
-- Database + API map, deployment diagrams
-- Anything with a tech-infra subject that fits a dark, grid-backed aesthetic
-
-**Look elsewhere first for:**
-- Physics, chemistry, math, biology, or other scientific subjects
-- Physical objects (vehicles, hardware, anatomy, cross-sections)
-- Floor plans, narrative journeys, educational / textbook-style visuals
-- Hand-drawn whiteboard sketches (consider `excalidraw`)
-- Animated explainers (consider an animation skill)
-
-If a more specialized skill is available for the subject, prefer that. If none fits, this skill can also serve as a general SVG diagram fallback — the output will just carry the dark tech aesthetic described below.
-
-Based on [Cocoon AI's architecture-diagram-generator](https://github.com/Cocoon-AI/architecture-diagram-generator) (MIT).
-
-## Workflow
-
-1. User describes their system architecture (components, connections, technologies)
-2. Generate the HTML file following the design system below
-3. Save with `write_file` to a `.html` file (e.g. `~/architecture-diagram.html`)
-4. User opens in any browser — works offline, no dependencies
-
-### Output Location
-
-Save diagrams to a user-specified path, or default to the current working directory:
-```
-./[project-name]-architecture.html
-```
-
-### Preview
-
-After saving, suggest the user open it:
-```bash
-# macOS
-open ./my-architecture.html
-# Linux
-xdg-open ./my-architecture.html
-```
-
-## Design System & Visual Language
-
-### Color Palette (Semantic Mapping)
-
-Use specific `rgba` fills and hex strokes to categorize components:
-
-| Component Type | Fill (rgba) | Stroke (Hex) |
-| :--- | :--- | :--- |
-| **Frontend** | `rgba(8, 51, 68, 0.4)` | `#22d3ee` (cyan-400) |
-| **Backend** | `rgba(6, 78, 59, 0.4)` | `#34d399` (emerald-400) |
-| **Database** | `rgba(76, 29, 149, 0.4)` | `#a78bfa` (violet-400) |
-| **AWS/Cloud** | `rgba(120, 53, 15, 0.3)` | `#fbbf24` (amber-400) |
-| **Security** | `rgba(136, 19, 55, 0.4)` | `#fb7185` (rose-400) |
-| **Message Bus** | `rgba(251, 146, 60, 0.3)` | `#fb923c` (orange-400) |
-| **External** | `rgba(30, 41, 59, 0.5)` | `#94a3b8` (slate-400) |
-
-### Typography & Background
-- **Font:** JetBrains Mono (Monospace), loaded from Google Fonts
-- **Sizes:** 12px (Names), 9px (Sublabels), 8px (Annotations), 7px (Tiny labels)
-- **Background:** Slate-950 (`#020617`) with a subtle 40px grid pattern
-
-```svg
-
-
` tags. Fetch the page with curl, then extract art with a small Python snippet.
-
-**URL pattern:** `https://ascii.co.uk/art/{subject}`
-
-**Step 1 — Fetch the page:**
-
-```bash
-curl -s 'https://ascii.co.uk/art/cat' -o /tmp/ascii_art.html
-```
-
-**Step 2 — Extract art from pre tags:**
-
-```python
-import re, html
-with open('/tmp/ascii_art.html') as f:
- text = f.read()
-arts = re.findall(r']*>(.*?)
', text, re.DOTALL)
-for art in arts:
- clean = re.sub(r'<[^>]+>', '', art)
- clean = html.unescape(clean).strip()
- if len(clean) > 30:
- print(clean)
- print('\n---\n')
-```
-
-**Available subjects** (use as URL path):
-- Animals: `cat`, `dog`, `horse`, `bird`, `fish`, `dragon`, `snake`, `rabbit`, `elephant`, `dolphin`, `butterfly`, `owl`, `wolf`, `bear`, `penguin`, `turtle`
-- Objects: `car`, `ship`, `airplane`, `rocket`, `guitar`, `computer`, `coffee`, `beer`, `cake`, `house`, `castle`, `sword`, `crown`, `key`
-- Nature: `tree`, `flower`, `sun`, `moon`, `star`, `mountain`, `ocean`, `rainbow`
-- Characters: `skull`, `robot`, `angel`, `wizard`, `pirate`, `ninja`, `alien`
-- Holidays: `christmas`, `halloween`, `valentine`
-
-**Tips:**
-- Preserve artist signatures/initials — important etiquette
-- Multiple art pieces per page — pick the best one for the user
-- Works reliably via curl, no JavaScript needed
-
-### Source B: GitHub Octocat API (fun easter egg)
-
-Returns a random GitHub Octocat with a wise quote. No auth needed.
-
-```bash
-curl -s https://api.github.com/octocat
-```
-
-## Tool 8: Fun ASCII Utilities (via curl)
-
-These free services return ASCII art directly — great for fun extras.
-
-### QR Codes as ASCII Art
-
-```bash
-curl -s "qrenco.de/Hello+World"
-curl -s "qrenco.de/https://example.com"
-```
-
-### Weather as ASCII Art
-
-```bash
-curl -s "wttr.in/London" # Full weather report with ASCII graphics
-curl -s "wttr.in/Moon" # Moon phase in ASCII art
-curl -s "v2.wttr.in/London" # Detailed version
-```
-
-## Tool 9: LLM-Generated Custom Art (Fallback)
-
-When tools above don't have what's needed, generate ASCII art directly using these Unicode characters:
-
-### Character Palette
-
-**Box Drawing:** `╔ ╗ ╚ ╝ ║ ═ ╠ ╣ ╦ ╩ ╬ ┌ ┐ └ ┘ │ ─ ├ ┤ ┬ ┴ ┼ ╭ ╮ ╰ ╯`
-
-**Block Elements:** `░ ▒ ▓ █ ▄ ▀ ▌ ▐ ▖ ▗ ▘ ▝ ▚ ▞`
-
-**Geometric & Symbols:** `◆ ◇ ◈ ● ○ ◉ ■ □ ▲ △ ▼ ▽ ★ ☆ ✦ ✧ ◀ ▶ ◁ ▷ ⬡ ⬢ ⌂`
-
-### Rules
-
-- Max width: 60 characters per line (terminal-safe)
-- Max height: 15 lines for banners, 25 for scenes
-- Monospace only: output must render correctly in fixed-width fonts
-
-## Decision Flow
-
-1. **Text as a banner** → pyfiglet if installed, otherwise asciified API via curl
-2. **Wrap a message in fun character art** → cowsay
-3. **Add decorative border/frame** → boxes (can combine with pyfiglet/asciified)
-4. **Art of a specific thing** (cat, rocket, dragon) → ascii.co.uk via curl + parsing
-5. **Convert an image to ASCII** → ascii-image-converter or jp2a
-6. **QR code** → qrenco.de via curl
-7. **Weather/moon art** → wttr.in via curl
-8. **Something custom/creative** → LLM generation with Unicode palette
-9. **Any tool not installed** → install it, or fall back to next option
diff --git a/ascii-video/SKILL.md b/ascii-video/SKILL.md
deleted file mode 100644
index 2a42e31..0000000
--- a/ascii-video/SKILL.md
+++ /dev/null
@@ -1,242 +0,0 @@
----
-name: ascii-video
-description: "ASCII video: convert video/audio to colored ASCII MP4/GIF."
-version: 1.0.0
-platforms: [linux, macos, windows]
----
-
-# ASCII Video Production Pipeline
-
-## When to use
-
-Use when users request: ASCII video, text art video, terminal-style video, character art animation, retro text visualization, audio visualizer in ASCII, converting video to ASCII art, matrix-style effects, or any animated ASCII output.
-
-## What's inside
-
-Production pipeline for ASCII art video — any format. Converts video/audio/images/generative input into colored ASCII character video output (MP4, GIF, image sequence). Covers: video-to-ASCII conversion, audio-reactive music visualizers, generative ASCII art animations, hybrid video+audio reactive, text/lyrics overlays, real-time terminal rendering.
-
-## Creative Standard
-
-This is visual art. ASCII characters are the medium; cinema is the standard.
-
-**Before writing a single line of code**, articulate the creative concept. What is the mood? What visual story does this tell? What makes THIS project different from every other ASCII video? The user's prompt is a starting point — interpret it with creative ambition, not literal transcription.
-
-**First-render excellence is non-negotiable.** The output must be visually striking without requiring revision rounds. If something looks generic, flat, or like "AI-generated ASCII art," it is wrong — rethink the creative concept before shipping.
-
-**Go beyond the reference vocabulary.** The effect catalogs, shader presets, and palette libraries in the references are a starting vocabulary. For every project, combine, modify, and invent new patterns. The catalog is a palette of paints — you write the painting.
-
-**Be proactively creative.** Extend the skill's vocabulary when the project calls for it. If the references don't have what the vision demands, build it. Include at least one visual moment the user didn't ask for but will appreciate — a transition, an effect, a color choice that elevates the whole piece.
-
-**Cohesive aesthetic over technical correctness.** All scenes in a video must feel connected by a unifying visual language — shared color temperature, related character palettes, consistent motion vocabulary. A technically correct video where every scene uses a random different effect is an aesthetic failure.
-
-**Dense, layered, considered.** Every frame should reward viewing. Never flat black backgrounds. Always multi-grid composition. Always per-scene variation. Always intentional color.
-
-## Modes
-
-| Mode | Input | Output | Reference |
-|------|-------|--------|-----------|
-| **Video-to-ASCII** | Video file | ASCII recreation of source footage | `references/inputs.md` § Video Sampling |
-| **Audio-reactive** | Audio file | Generative visuals driven by audio features | `references/inputs.md` § Audio Analysis |
-| **Generative** | None (or seed params) | Procedural ASCII animation | `references/effects.md` |
-| **Hybrid** | Video + audio | ASCII video with audio-reactive overlays | Both input refs |
-| **Lyrics/text** | Audio + text/SRT | Timed text with visual effects | `references/inputs.md` § Text/Lyrics |
-| **TTS narration** | Text quotes + TTS API | Narrated testimonial/quote video with typed text | `references/inputs.md` § TTS Integration |
-
-## Stack
-
-Single self-contained Python script per project. No GPU required.
-
-| Layer | Tool | Purpose |
-|-------|------|---------|
-| Core | Python 3.10+, NumPy | Math, array ops, vectorized effects |
-| Signal | SciPy | FFT, peak detection (audio modes) |
-| Imaging | Pillow (PIL) | Font rasterization, frame decoding, image I/O |
-| Video I/O | ffmpeg (CLI) | Decode input, encode output, mux audio |
-| Parallel | concurrent.futures | N workers for batch/clip rendering |
-| TTS | ElevenLabs API (optional) | Generate narration clips |
-| Optional | OpenCV | Video frame sampling, edge detection |
-
-## Pipeline Architecture
-
-Every mode follows the same 6-stage pipeline:
-
-```
-INPUT → ANALYZE → SCENE_FN → TONEMAP → SHADE → ENCODE
-```
-
-1. **INPUT** — Load/decode source material (video frames, audio samples, images, or nothing)
-2. **ANALYZE** — Extract per-frame features (audio bands, video luminance/edges, motion vectors)
-3. **SCENE_FN** — Scene function renders to pixel canvas (`uint8 H,W,3`). Composes multiple character grids via `_render_vf()` + pixel blend modes. See `references/composition.md`
-4. **TONEMAP** — Percentile-based adaptive brightness normalization. See `references/composition.md` § Adaptive Tonemap
-5. **SHADE** — Post-processing via `ShaderChain` + `FeedbackBuffer`. See `references/shaders.md`
-6. **ENCODE** — Pipe raw RGB frames to ffmpeg for H.264/GIF encoding
-
-## Creative Direction
-
-### Aesthetic Dimensions
-
-| Dimension | Options | Reference |
-|-----------|---------|-----------|
-| **Character palette** | Density ramps, block elements, symbols, scripts (katakana, Greek, runes, braille), project-specific | `architecture.md` § Palettes |
-| **Color strategy** | HSV, OKLAB/OKLCH, discrete RGB palettes, auto-generated harmony, monochrome, temperature | `architecture.md` § Color System |
-| **Background texture** | Sine fields, fBM noise, domain warp, voronoi, reaction-diffusion, cellular automata, video | `effects.md` |
-| **Primary effects** | Rings, spirals, tunnel, vortex, waves, interference, aurora, fire, SDFs, strange attractors | `effects.md` |
-| **Particles** | Sparks, snow, rain, bubbles, runes, orbits, flocking boids, flow-field followers, trails | `effects.md` § Particles |
-| **Shader mood** | Retro CRT, clean modern, glitch art, cinematic, dreamy, industrial, psychedelic | `shaders.md` |
-| **Grid density** | xs(8px) through xxl(40px), mixed per layer | `architecture.md` § Grid System |
-| **Coordinate space** | Cartesian, polar, tiled, rotated, fisheye, Möbius, domain-warped | `effects.md` § Transforms |
-| **Feedback** | Zoom tunnel, rainbow trails, ghostly echo, rotating mandala, color evolution | `composition.md` § Feedback |
-| **Masking** | Circle, ring, gradient, text stencil, animated iris/wipe/dissolve | `composition.md` § Masking |
-| **Transitions** | Crossfade, wipe, dissolve, glitch cut, iris, mask-based reveal | `shaders.md` § Transitions |
-
-### Per-Section Variation
-
-Never use the same config for the entire video. For each section/scene:
-- **Different background effect** (or compose 2-3)
-- **Different character palette** (match the mood)
-- **Different color strategy** (or at minimum a different hue)
-- **Vary shader intensity** (more bloom during peaks, more grain during quiet)
-- **Different particle types** if particles are active
-
-### Project-Specific Invention
-
-For every project, invent at least one of:
-- A custom character palette matching the theme
-- A custom background effect (combine/modify existing building blocks)
-- A custom color palette (discrete RGB set matching the brand/mood)
-- A custom particle character set
-- A novel scene transition or visual moment
-
-Don't just pick from the catalog. The catalog is vocabulary — you write the poem.
-
-## Workflow
-
-### Step 1: Creative Vision
-
-Before any code, articulate the creative concept:
-
-- **Mood/atmosphere**: What should the viewer feel? Energetic, meditative, chaotic, elegant, ominous?
-- **Visual story**: What happens over the duration? Build tension? Transform? Dissolve?
-- **Color world**: Warm/cool? Monochrome? Neon? Earth tones? What's the dominant hue?
-- **Character texture**: Dense data? Sparse stars? Organic dots? Geometric blocks?
-- **What makes THIS different**: What's the one thing that makes this project unique?
-- **Emotional arc**: How do scenes progress? Open with energy, build to climax, resolve?
-
-Map the user's prompt to aesthetic choices. A "chill lo-fi visualizer" demands different everything from a "glitch cyberpunk data stream."
-
-### Step 2: Technical Design
-
-- **Mode** — which of the 6 modes above
-- **Resolution** — landscape 1920x1080 (default), portrait 1080x1920, square 1080x1080 @ 24fps
-- **Hardware detection** — auto-detect cores/RAM, set quality profile. See `references/optimization.md`
-- **Sections** — map timestamps to scene functions, each with its own effect/palette/color/shader config
-- **Output format** — MP4 (default), GIF (640x360 @ 15fps), PNG sequence
-
-### Step 3: Build the Script
-
-Single Python file. Components (with references):
-
-1. **Hardware detection + quality profile** — `references/optimization.md`
-2. **Input loader** — mode-dependent; `references/inputs.md`
-3. **Feature analyzer** — audio FFT, video luminance, or synthetic
-4. **Grid + renderer** — multi-density grids with bitmap cache; `references/architecture.md`
-5. **Character palettes** — multiple per project; `references/architecture.md` § Palettes
-6. **Color system** — HSV + discrete RGB + harmony generation; `references/architecture.md` § Color
-7. **Scene functions** — each returns `canvas (uint8 H,W,3)`; `references/scenes.md`
-8. **Tonemap** — adaptive brightness normalization; `references/composition.md`
-9. **Shader pipeline** — `ShaderChain` + `FeedbackBuffer`; `references/shaders.md`
-10. **Scene table + dispatcher** — time → scene function + config; `references/scenes.md`
-11. **Parallel encoder** — N-worker clip rendering with ffmpeg pipes
-12. **Main** — orchestrate full pipeline
-
-### Step 4: Quality Verification
-
-- **Test frames first**: render single frames at key timestamps before full render
-- **Brightness check**: `canvas.mean() > 8` for all ASCII content. If dark, lower gamma
-- **Visual coherence**: do all scenes feel like they belong to the same video?
-- **Creative vision check**: does the output match the concept from Step 1? If it looks generic, go back
-
-## Critical Implementation Notes
-
-### Brightness — Use `tonemap()`, Not Linear Multipliers
-
-This is the #1 visual issue. ASCII on black is inherently dark. **Never use `canvas * N` multipliers** — they clip highlights. Use adaptive tonemap:
-
-```python
-def tonemap(canvas, gamma=0.75):
- f = canvas.astype(np.float32)
- lo, hi = np.percentile(f[::4, ::4], [1, 99.5])
- if hi - lo < 10: hi = lo + 10
- f = np.clip((f - lo) / (hi - lo), 0, 1) ** gamma
- return (f * 255).astype(np.uint8)
-```
-
-Pipeline: `scene_fn() → tonemap() → FeedbackBuffer → ShaderChain → ffmpeg`
-
-Per-scene gamma: default 0.75, solarize 0.55, posterize 0.50, bright scenes 0.85. Use `screen` blend (not `overlay`) for dark layers.
-
-### Font Cell Height
-
-macOS Pillow: `textbbox()` returns wrong height. Use `font.getmetrics()`: `cell_height = ascent + descent`. See `references/troubleshooting.md`.
-
-### ffmpeg Pipe Deadlock
-
-Never `stderr=subprocess.PIPE` with long-running ffmpeg — buffer fills at 64KB and deadlocks. Redirect to file. See `references/troubleshooting.md`.
-
-### Font Compatibility
-
-Not all Unicode chars render in all fonts. Validate palettes at init — render each char, check for blank output. See `references/troubleshooting.md`.
-
-### Per-Clip Architecture
-
-For segmented videos (quotes, scenes, chapters), render each as a separate clip file for parallel rendering and selective re-rendering. See `references/scenes.md`.
-
-## Performance Targets
-
-| Component | Budget |
-|-----------|--------|
-| Feature extraction | 1-5ms |
-| Effect function | 2-15ms |
-| Character render | 80-150ms (bottleneck) |
-| Shader pipeline | 5-25ms |
-| **Total** | ~100-200ms/frame |
-
-## References
-
-| File | Contents |
-|------|----------|
-| `references/architecture.md` | Grid system, resolution presets, font selection, character palettes (20+), color system (HSV + OKLAB + discrete RGB + harmony generation), `_render_vf()` helper, GridLayer class |
-| `references/composition.md` | Pixel blend modes (20 modes), `blend_canvas()`, multi-grid composition, adaptive `tonemap()`, `FeedbackBuffer`, `PixelBlendStack`, masking/stencil system |
-| `references/effects.md` | Effect building blocks: value field generators, hue fields, noise/fBM/domain warp, voronoi, reaction-diffusion, cellular automata, SDFs, strange attractors, particle systems, coordinate transforms, temporal coherence |
-| `references/shaders.md` | `ShaderChain`, `_apply_shader_step()` dispatch, 38 shader catalog, audio-reactive scaling, transitions, tint presets, output format encoding, terminal rendering |
-| `references/scenes.md` | Scene protocol, `Renderer` class, `SCENES` table, `render_clip()`, beat-synced cutting, parallel rendering, design patterns (layer hierarchy, directional arcs, visual metaphors, compositional techniques), complete scene examples at every complexity level, scene design checklist |
-| `references/inputs.md` | Audio analysis (FFT, bands, beats), video sampling, image conversion, text/lyrics, TTS integration (ElevenLabs, voice assignment, audio mixing) |
-| `references/optimization.md` | Hardware detection, quality profiles, vectorized patterns, parallel rendering, memory management, performance budgets |
-| `references/troubleshooting.md` | NumPy broadcasting traps, blend mode pitfalls, multiprocessing/pickling, brightness diagnostics, ffmpeg issues, font problems, common mistakes |
-
----
-
-## Creative Divergence (use only when user requests experimental/creative/unique output)
-
-If the user asks for creative, experimental, surprising, or unconventional output, select the strategy that best fits and reason through its steps BEFORE generating code.
-
-- **Forced Connections** — when the user wants cross-domain inspiration ("make it look organic," "industrial aesthetic")
-- **Conceptual Blending** — when the user names two things to combine ("ocean meets music," "space + calligraphy")
-- **Oblique Strategies** — when the user is maximally open ("surprise me," "something I've never seen")
-
-### Forced Connections
-1. Pick a domain unrelated to the visual goal (weather systems, microbiology, architecture, fluid dynamics, textile weaving)
-2. List its core visual/structural elements (erosion → gradual reveal; mitosis → splitting duplication; weaving → interlocking patterns)
-3. Map those elements onto ASCII characters and animation patterns
-4. Synthesize — what does "erosion" or "crystallization" look like in a character grid?
-
-### Conceptual Blending
-1. Name two distinct visual/conceptual spaces (e.g., ocean waves + sheet music)
-2. Map correspondences (crests = high notes, troughs = rests, foam = staccato)
-3. Blend selectively — keep the most interesting mappings, discard forced ones
-4. Develop emergent properties that exist only in the blend
-
-### Oblique Strategies
-1. Draw one: "Honor thy error as a hidden intention" / "Use an old idea" / "What would your closest friend do?" / "Emphasize the flaws" / "Turn it upside down" / "Only a part, not the whole" / "Reverse"
-2. Interpret the directive against the current ASCII animation challenge
-3. Apply the lateral insight to the visual design before writing code
diff --git a/baoyu-infographic/SKILL.md b/baoyu-infographic/SKILL.md
deleted file mode 100644
index 6206a5b..0000000
--- a/baoyu-infographic/SKILL.md
+++ /dev/null
@@ -1,237 +0,0 @@
----
-name: baoyu-infographic
-description: "Infographics: 21 layouts x 21 styles (信息图, 可视化)."
-version: 1.56.1
-author: 宝玉 (JimLiu)
-license: MIT
-platforms: [linux, macos, windows]
-metadata:
- hermes:
- tags: [infographic, visual-summary, creative, image-generation]
- homepage: https://github.com/JimLiu/baoyu-skills#baoyu-infographic
----
-
-# Infographic Generator
-
-Adapted from [baoyu-infographic](https://github.com/JimLiu/baoyu-skills) for Hermes Agent's tool ecosystem.
-
-Two dimensions: **layout** (information structure) × **style** (visual aesthetics). Freely combine any layout with any style.
-
-## When to Use
-
-Trigger this skill when the user asks to create an infographic, visual summary, information graphic, or uses terms like "信息图", "可视化", or "高密度信息大图". The user provides content (text, file path, URL, or topic) and optionally specifies layout, style, aspect ratio, or language.
-
-## Options
-
-| Option | Values |
-|--------|--------|
-| Layout | 21 options (see Layout Gallery), default: bento-grid |
-| Style | 21 options (see Style Gallery), default: craft-handmade |
-| Aspect | Named: landscape (16:9), portrait (9:16), square (1:1). Custom: any W:H ratio (e.g., 3:4, 4:3, 2.35:1) |
-| Language | en, zh, ja, etc. |
-
-## Layout Gallery
-
-| Layout | Best For |
-|--------|----------|
-| `linear-progression` | Timelines, processes, tutorials |
-| `binary-comparison` | A vs B, before-after, pros-cons |
-| `comparison-matrix` | Multi-factor comparisons |
-| `hierarchical-layers` | Pyramids, priority levels |
-| `tree-branching` | Categories, taxonomies |
-| `hub-spoke` | Central concept with related items |
-| `structural-breakdown` | Exploded views, cross-sections |
-| `bento-grid` | Multiple topics, overview (default) |
-| `iceberg` | Surface vs hidden aspects |
-| `bridge` | Problem-solution |
-| `funnel` | Conversion, filtering |
-| `isometric-map` | Spatial relationships |
-| `dashboard` | Metrics, KPIs |
-| `periodic-table` | Categorized collections |
-| `comic-strip` | Narratives, sequences |
-| `story-mountain` | Plot structure, tension arcs |
-| `jigsaw` | Interconnected parts |
-| `venn-diagram` | Overlapping concepts |
-| `winding-roadmap` | Journey, milestones |
-| `circular-flow` | Cycles, recurring processes |
-| `dense-modules` | High-density modules, data-rich guides |
-
-Full definitions: `references/layouts/.md`
-
-## Style Gallery
-
-| Style | Description |
-|-------|-------------|
-| `craft-handmade` | Hand-drawn, paper craft (default) |
-| `claymation` | 3D clay figures, stop-motion |
-| `kawaii` | Japanese cute, pastels |
-| `storybook-watercolor` | Soft painted, whimsical |
-| `chalkboard` | Chalk on black board |
-| `cyberpunk-neon` | Neon glow, futuristic |
-| `bold-graphic` | Comic style, halftone |
-| `aged-academia` | Vintage science, sepia |
-| `corporate-memphis` | Flat vector, vibrant |
-| `technical-schematic` | Blueprint, engineering |
-| `origami` | Folded paper, geometric |
-| `pixel-art` | Retro 8-bit |
-| `ui-wireframe` | Grayscale interface mockup |
-| `subway-map` | Transit diagram |
-| `ikea-manual` | Minimal line art |
-| `knolling` | Organized flat-lay |
-| `lego-brick` | Toy brick construction |
-| `pop-laboratory` | Blueprint grid, coordinate markers, lab precision |
-| `morandi-journal` | Hand-drawn doodle, warm Morandi tones |
-| `retro-pop-grid` | 1970s retro pop art, Swiss grid, thick outlines |
-| `hand-drawn-edu` | Macaron pastels, hand-drawn wobble, stick figures |
-
-Full definitions: `references/styles/
-
-
-
-
-