A collection of custom skills for Claude Code, Anthropic’s CLI tool for AI-assisted software development.
Skills are reusable modules that extend Claude Code’s capabilities. Each skill provides:
SKILL.md file with instructions Claude reads to understand how to use the skillOne recording becomes a week of posts, locally, no subscription:
interview-transcript: YouTube or X video in, cleaned speaker-labelled transcript out (Kindle delivery optional)repurpose: transcript in, X thread + LinkedIn post + newsletter section outhumanizer: every draft checked against 400+ AI-writing tells before you see itcurl -fsSL https://smorrel1.github.io/claude-code-skills/install.sh | bash -s -- interview-transcript repurpose humanizer
See it on a real episode: repurpose/examples holds the unedited thread, LinkedIn post and newsletter section produced from the David Senra x Travis Kalanick interview.
Works with skills.sh tooling in Claude Code, Codex CLI and compatible agents:
npx skills add smorrel1/claude-code-skills@ce-to-510k # FDA 510(k) porting, written from a real clearance
npx skills add smorrel1/claude-code-skills@after-meeting # transcript -> summary -> follow-up drafts
npx skills add smorrel1/claude-code-skills@email # multi-account Gmail with draft-safety guards
Or install everything with one command (non-destructive, symlinks into ~/.claude/skills):
curl -fsSL https://smorrel1.github.io/claude-code-skills/install.sh | bash
These skills come from daily use running a regulated medical-AI company solo: the ce-to-510k skill was written from an actual FDA clearance, the email and meeting skills run a real CEO workload every day. Feedback and issues welcome.
| Skill | Description | Setup Required |
|---|---|---|
| apple-notes | Export Apple Notes to markdown | None (macOS only) |
| gmail | Read, search, draft Gmail emails | OAuth setup |
| gsheet | Read/write Google Sheets | OAuth setup (uses Gmail creds) |
| gcal | Google Calendar CRUD operations | OAuth setup (uses Gmail creds) |
| docx-editor | Word document character normalization | None |
| interview-transcript | YouTube/X.com transcript to Kindle EPUB | yt-dlp + Calibre |
| monthly-report | Monthly board report generation | Custom paths + OAuth |
| ce-to-510k | Port CE Mark / UKCA technical files to FDA 510(k) for AI/ML SaMD | None |
| docx-delta | Compare two Word documents, redline with tracked changes | python-docx |
| cmux | Manage many parallel Claude Code sessions in cmux workspaces | cmux |
| todo-agent | Two-way channel between an Apple Notes To Do list and your agents | macOS + cmux |
# Option A: Clone the repo
git clone https://github.com/YOUR_USERNAME/claude-code-skills.git ~/.claude/skills
# Option B: Copy individual skills
cp -r path/to/skill ~/.claude/skills/
Most skills auto-install dependencies on first run, but you can pre-install:
pip install google-auth google-auth-oauthlib google-api-python-client
For Gmail, Google Sheets, and Google Calendar skills:
credentials.json and place in ~/.claude/skills/gmail/Export all Apple Notes to markdown files. Fast Python-based exporter that reads directly from the Notes SQLite database.
Requirements: macOS with Apple Notes
Usage:
python3 ~/.claude/skills/apple-notes/scripts/export_notes.py
python3 ~/.claude/skills/apple-notes/scripts/export_notes.py --output ~/Documents/notes
Output: Organized markdown files by folder with date-prefixed filenames.
Read, search, and draft emails using the Gmail API.
Setup:
credentials.json in ~/.claude/skills/gmail/Usage:
# Search emails
python3 ~/.claude/skills/gmail/scripts/gmail_utils.py search --query "from:john@example.com" --max 5
# Read specific email
python3 ~/.claude/skills/gmail/scripts/gmail_utils.py read --id "message_id"
# Create draft
python3 ~/.claude/skills/gmail/scripts/gmail_utils.py draft --to "user@example.com" --subject "Hello" --body "Message body"
# Reply to thread
python3 ~/.claude/skills/gmail/scripts/gmail_utils.py draft --reply-to "message_id" --body "Reply text"
Read and write Google Sheets data.
Setup: Uses credentials from Gmail skill. Requires separate OAuth authorization for Sheets scope.
Usage:
# List sheets
python3 ~/.claude/skills/gsheet/scripts/read_gsheet.py "SPREADSHEET_URL" --list-sheets
# Read data
python3 ~/.claude/skills/gsheet/scripts/read_gsheet.py "SPREADSHEET_URL" --sheet "Sheet1" --rows 10
# Update cell
python3 ~/.claude/skills/gsheet/scripts/read_gsheet.py "SPREADSHEET_URL" --sheet "Sheet1" --edit "A1" --value "New Value"
CRUD operations for Google Calendar.
Setup: Uses credentials from Gmail skill. Requires separate OAuth authorization for Calendar scope.
Usage:
# List calendars
python3 ~/.claude/skills/gcal/scripts/cal_utils.py calendars
# List upcoming events
python3 ~/.claude/skills/gcal/scripts/cal_utils.py list --days 7
# Create event
python3 ~/.claude/skills/gcal/scripts/cal_utils.py create --summary "Meeting" --start "2025-01-15 10:00"
# Check availability
python3 ~/.claude/skills/gcal/scripts/cal_utils.py availability 2025-01-15
Download and transcribe interviews/talks from YouTube and X.com (Twitter), clean them up, and convert to Kindle-ready EPUBs with cover images and clickable table of contents.
Features:
Setup:
brew install yt-dlp calibre
pip install jinja2
# Optional (X.com fallback): brew install whisper-cpp ffmpeg
Usage:
# Download transcript
python3 ~/.claude/skills/interview-transcript/scripts/youtube_transcript.py --url "https://youtube.com/watch?v=VIDEO_ID"
# Clean filler words
python3 ~/.claude/skills/interview-transcript/scripts/youtube_transcript.py --clean transcript.txt
# Convert to EPUB with cover
python3 ~/.claude/skills/interview-transcript/scripts/youtube_transcript.py --to-epub structured.txt \
--title "Interview Title" --author "Speaker" --youtube-cover "https://youtube.com/watch?v=VIDEO_ID"
Or just use it as a Claude Code skill: /interview-transcript <URL>
Utilities for working with Word documents, particularly fixing character encoding issues that break find-and-replace.
Usage:
# Normalize special characters
python3 ~/.claude/skills/docx-editor/scripts/fix_docx_chars.py "Text with "smart quotes""
Note: This is a personal workflow skill. Fork and customize paths in config.py for your own use.
Generates monthly board reports by:
External Dependency: This skill expects Fireflies.ai meeting transcripts to be downloaded to a local directory. Set up a cron job to periodically sync transcripts from Fireflies to your configured FIREFLIES_DIR path.
Example cron setup:
# Edit crontab
crontab -e
# Add jobs to download and format transcripts every 5 minutes
*/5 * * * * /path/to/fireflies_downloader/run_script.sh fireflies_downloader.py
7,12,17,22,27,32,37,42,47,52,57 * * * * /path/to/fireflies_downloader/run_script.sh format_transcripts.py
Example run_script.sh wrapper (handles conda/venv activation):
#!/bin/bash
echo "=== Job started at $(date) ===" >> "$HOME/fireflies_downloader/cron_log.txt"
source "$HOME/.bash_profile"
conda activate your-env # or: source venv/bin/activate
cd "$HOME/fireflies_downloader"
python "$1" >> "$HOME/fireflies_downloader/cron_log.txt" 2>&1
echo "=== Job ended at $(date) with status $? ===" >> "$HOME/fireflies_downloader/cron_log.txt"
See monthly-report/SKILL.md for detailed workflow documentation.
Port CE Mark / UKCA medical device technical documentation into an FDA 510(k) submission package for AI/ML SaMD (Software as a Medical Device). Distilled from a real 2023 AI/ML SaMD 510(k) clearance including the full Additional Information Request and Interactive Feedback cycle. Generalises across imaging, signal-processing, clinical decision support and other AI/ML domains.
What it produces:
Highest-value content: references/06-fda-ai-ml-deficiencies.md, a categorised catalogue of the AI/ML deficiency question patterns FDA uses during AINN and Interactive Feedback rounds, with a 16-item pre-empt checklist you can paste into your draft.
Usage: invoke via the Skill tool or by mentioning any of: 510(k), FDA submission, Q-Sub, pre-sub, predicate device, substantial equivalence, CE to FDA, MDR to FDA, AI/ML 510k. Give Claude the path to your CE Mark / UKCA technical file root and your device details; the skill works through eight phases and produces deliverables on disk.
Not suitable for: De Novo, PMA, IVD CLIA, EUA, IDE, drug applications.
Disclaimer: procedural guidance only, not legal or regulatory advice. Verify all FDA guidance citations against current FDA publications before submission.
See ce-to-510k/README.md and ce-to-510k/SKILL.md for details.
~/.claude/skills/your-skill-name/SKILL.md file with:
name and descriptionscripts/ subdirectory---
name: my-skill
description: Brief description that helps Claude know when to use this skill.
---
# My Skill
## Usage
\`\`\`bash
python3 scripts/my_script.py [options]
\`\`\`
## Examples
...
.gitignore excludes credentials.json, token.json, and similar filestoken.json and re-authenticateMIT License - feel free to use, modify, and share.
Skills that carry user-specific configuration (accounts, addresses, personal file paths, private workflow rules) keep the public SKILL.md generic. The private version lives in SKILL.local.md in the same skill directory, which is gitignored (*.local.md). Each participating SKILL.md opens with a pointer instructing the agent to read SKILL.local.md INSTEAD when it exists, so the private version takes full precedence at load time while never reaching the repository. To personalise a skill: cp SKILL.md SKILL.local.md inside the skill folder and edit the local copy.
Compare two Word documents and get a delta view. Replaces Word’s Review Compare feature and LibreOffice’s headless compare, which is unreliable to automate.
D=~/.claude/skills/docx-delta/scripts/docx_delta.py
python3 $D old.docx new.docx # counts only
python3 $D old.docx new.docx -o delta.docx # redline with real tracked changes
python3 $D old.docx new.docx -o delta.html # side by side, for reading
python3 $D old.docx new.docx --md # unified text diff
The .docx output carries genuine w:ins and w:del markup, so Word’s Review
pane shows the changes and Accept and Reject work.
Paragraphs are aligned first, then words are compared inside each changed paragraph, so a single edited figure is visible in a long paragraph.
What it compares: body paragraphs and table cell text. Footnotes, endnotes, comments, headers and footers are counted and named in the output, not compared. Images and styling are not compared.
Requires: python-docx (pip install python-docx). No Word, no LibreOffice.
Manage dozens of parallel Claude Code sessions running in cmux workspaces: find which session owns a topic, hand work to another session and prove it started, restart every session by its own id after an update, and roll up what each one is doing.
python3 ~/.claude/skills/cmux/scripts/send_task.py --workspace "grant applications" "task text"
python3 ~/.claude/skills/cmux/scripts/restart_sessions.py # verify, by session id
python3 ~/.claude/skills/cmux/scripts/refresh_registry.py # regenerate the registry
send_task.py exists because cmux send fills the input box without submitting it: a
multi-line paste arrives with a “paste again to expand” hint, so the first Enter only expands
it and the task stays there looking delivered. It sends one short line pointing at a spooled
brief, presses Enter until the target is running, and exits non-zero if it never started.
Workspaces are addressed by NAME; numbers drift on every reorder and have misrouted briefs.
Copy references/registry-durable.example.md to registry-durable.md and fill in your own
workspaces. The generated registry.md and the task spool are gitignored.
Turns an Apple Notes To Do list into a two-way channel with your agents. Any bullet that opens
with claude (the @ is optional) is picked up within five minutes, handed to a chief-of-staff
session, and ticked with the outcome. Agents write follow-ups back near the TOP of the note,
because a long list is only read down to the first page.
python3 ~/.claude/skills/todo-agent/scripts/todo_agent.py scan --dry-run
python3 ~/.claude/skills/todo-agent/scripts/todo_agent.py prepend --heading "Call follow-ups" --items items.json
python3 ~/.claude/skills/todo-agent/tests/test_trigger.py
Most of the code exists to handle undocumented Apple Notes behaviour: every whole-body write multiplies font sizes by 1.2 and it compounds, a note’s name comes from its first line so copies shadow the original, and Notes fragments your markup so markers must be matched against stripped text. Writes go to a note pinned by Core Data id and are backed up first.
Requires macOS (Apple Notes) and cmux. Note bodies, delivery state and logs are gitignored.