skills/pdf-form-filler/SKILL.md
Fill static PDF forms (without fillable fields) using text search for text-based PDFs or Claude Vision for image-based/scanned PDFs. Use when: (1) User wants to fill out a PDF form, (2) PDF has no fillable form fields, (3) User asks to fill in or complete a PDF form. Auto-detects PDF type and uses appropriate method.
npx skillsauth add ericmjl/skills pdf-form-fillerInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Fill static PDF forms by detecting PDF type and using the appropriate method:
# Option 1: Text-based PDF (fast, uses label search)
uv run scripts/fill_pdf.py form.pdf filled.pdf "Label:?=value"
# Option 2: VLM-guided (works for ANY PDF, iteratively verifies placement)
uv run scripts/fill_pdf_vlm.py form.pdf filled.pdf --fields '{"Field": "value"}'
This is how pixel-perfect filling works:
Instead of guessing x/y coordinates, we:
page.search_for("Label:")x = rect.x1 + offset (right edge of label + small offset)┌─────────────────────────────────────┐
│ Student's name: ________________ │
│ ↑ │
│ rect.x1 (right edge) │
│ + 5px offset │
│ = insertion point │
└─────────────────────────────────────┘
Code pattern:
areas = page.search_for("Student's name:")
if areas:
rect = areas[0]
x = rect.x1 + 5 # right edge + small offset
y = rect.y0 # top of the text
page.insert_text((x, y + fontsize * 0.8), "Philip Ma", fontsize=11)
Why this works:
# Detect PDF type
uv run scripts/fill_pdf.py --detect form.pdf
# Extract text to find labels
uv run scripts/fill_pdf.py --extract form.pdf
# Fill using label?=value format
uv run scripts/fill_pdf.py form.pdf filled.pdf \
"Student's name:?=John Doe" \
"Total:?=1500.00"
For complex forms or when text search fails:
Uses Claude Vision to:
┌──────────────────────────────────────────┐
│ PDF Page │
│ ┌─────────────────────────────────────┐ │
│ │ Print Name │ │
│ │ ══════════════════════════════════ │ │
│ │ ↑ VLM sees: "above line!" │ │
│ │ Date │ │
│ │ ══════════════════════════════════ │ │
│ └─────────────────────────────────────┘ │
│ │
│ VLM: "Print Name should be ABOVE line" │
│ → Corrects y-position automatically │
└──────────────────────────────────────────┘
# Requires ANTHROPIC_API_KEY
export ANTHROPIC_API_KEY=sk-...
uv run scripts/fill_pdf_vlm.py form.pdf filled.pdf --fields '{
"Student Name": "Philip Ma",
"Print Name (first)": "Eric Ma",
"Date (first)": "March 08, 2026",
"Print Name (second)": "Nan Li",
"Date (second)": "March 08, 2026"
}'
--max-iter times (default: 5)--- Page 1: Discovering ---
'Student Name' at (134, 84)
'Print Name (p1)' at (306, 763)
=== Iteration 1 (11 pending) ===
Page 1:
OK 'Student Name'
FIX 'Print Name (p1)': (306,763) -> (306,749) - Text should be ABOVE signature line
=== Iteration 2 (10 pending) ===
Page 1:
OK 'Print Name (p1)'
All verified after 2 iterations!
Each iteration makes ~1 API call per page for verification. Most forms complete in 2-3 iterations.
ANTHROPIC_API_KEY: Required for VLM-guided mode (fill_pdf_vlm.py)development
Create animated videos using Remotion from topics, product URLs, Google reviews, talking-head videos, or CSV data. Supports 5 video types: educational explainers, product launch demos, testimonial/social proof, avatar video overlays, and data visualization dashboards. Each follows a 2-step workflow: research/scrape/analyze then design and animate with spring animations, SVG diagrams, and count-up effects. Requires the Remotion best practices skill (install with `npx skills add remotion-dev/skills`). Use when the user asks to create a Remotion video, explainer video, educational video, product demo video, testimonial video, video with animated overlays, data visualization video, animated dashboard, or short-form vertical video for mobile.
development
Comprehensive YouTube operations using yt-dlp - download videos/audio, extract transcripts and subtitles, get metadata, work with playlists, download thumbnails, and inspect available formats. Use this for any YouTube content processing task.
data-ai
Ingest YouTube videos into the vault. Triggers when user pastes a YouTube URL (youtube.com/watch or youtu.be). Fetches transcript using yt-dlp, extracts metadata, creates transcript note and summary note. User may provide additional context about the video.
tools
Advanced negotiation and communication advisor grounded in Chris Voss's tactical empathy methodology (Never Split the Difference, The Black Swan Group). Use this skill whenever the user needs help with any interpersonal situation involving influence, persuasion, or navigating difficult dynamics. This includes but is not limited to: analyzing conversations, call transcripts, or email threads; preparing for negotiations (salary, vendor, client, partner); drafting tactful responses; handling pushback, objections, or conflict; navigating difficult workplace conversations; preparing for performance reviews or raises; buying a car, house, or any big purchase; dealing with landlords, contractors, or service providers; resolving personal disagreements; practicing negotiation through role-play; or any situation where the user says things like "how should I respond to this", "they're pushing back", "I need to have a tough conversation", "how do I ask for...", "they ghosted me", "I'm not sure how to handle this person", "counter-offer", "pricing", "deal", "objection", or "difficult conversation". Activate broadly — most interpersonal communication benefits from tactical empathy whether or not the user frames it as "negotiation." This skill integrates FBI hostage negotiation techniques (93% success rate) with behavioral economics (Kahneman's Prospect Theory) and neuroscience (amygdala hijacking, loss aversion).