From linkedin-apply
Initialize the LinkedIn Apply plugin — create vault candidate profile, install Playwright, and set up LinkedIn browser session. Triggers: "linkedin-apply-init" | "init linkedin apply" | "setup linkedin apply" | "linkedin apply setup".
How this skill is triggered — by the user, by Claude, or both
Slash command
/linkedin-apply:linkedin-apply-initThis skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
Set up everything needed to use `/linkedin-apply` for the first time. Run once before analyzing any job offers.
Set up everything needed to use /linkedin-apply for the first time. Run once before analyzing any job offers.
Let: VL := ~/.roxabi-vault/linkedin-apply/ BP := ~/.config/linkedin_browser_profile/
python3 --version → Python 3.10+ required.pip or uv available for package installation.which claude → claude CLI in PATH.¬prerequisite → stop + tell user what to install.
pip install playwright playwright-stealth jinja2 pyyaml
# or with uv:
uv pip install playwright playwright-stealth jinja2 pyyaml
python3 -c "from playwright.sync_api import sync_playwright; p = sync_playwright().start(); p.stop()" 2>/dev/null && echo "ok"
Error ∨ ¬installed → playwright install chromium.
Vault home: ~/.roxabi-vault/linkedin-apply/ (default) or $ROXABI_VAULT_HOME/linkedin-apply/.
¬VL/candidate.yaml:
mkdir -p ~/.roxabi-vault/linkedin-apply$CLAUDE_PLUGIN_ROOT/../../examples/candidate.example.yaml → VL/candidate.yamlpersonal.full_name, personal.email, personal.phone, professional.current_title, professional.years_experience, preferences.salary∃VL/candidate.yaml → show summary (name, title, email masked as a***@***.com).
ls ~/.config/linkedin_browser_profile/ 2>/dev/null | head -5
¬session:
python3 -c "
import asyncio
from playwright.async_api import async_playwright
async def open_browser():
async with async_playwright() as p:
ctx = await p.chromium.launch_persistent_context(
user_data_dir='$HOME/.config/linkedin_browser_profile',
headless=False,
viewport={'width': 1280, 'height': 900}
)
page = ctx.pages[0] if ctx.pages else await ctx.new_page()
await page.goto('https://www.linkedin.com/login')
print('Browser opened — log in to LinkedIn, then close the browser window.')
await page.wait_for_event('close', timeout=300000)
await ctx.close()
asyncio.run(open_browser())
"
∃session → tell user session profile already present (may still be valid).
✓ Python dependencies installed
✓ Playwright Chromium ready
✓ candidate.yaml: <path>
✓ LinkedIn session: <found/created>
Next steps:
1. Edit ~/.roxabi-vault/linkedin-apply/candidate.yaml with your real data
2. Run: /linkedin-apply <linkedin-job-url>
$ARGUMENTS
npx claudepluginhub roxabi/roxabi-plugins --plugin linkedin-applyAutomates filling job applications on Greenhouse, Lever, and Workday via browser automation with resume, cover letter, and personal data. Handles job URLs, recent jobs, or current tab.
Single-entry setup for Career Navigator: configures job search folder, builds user profile/ExperienceLibrary from existing docs, and walks through Indeed MCP, Apify, Gmail, Google Calendar, LinkedIn, and cloud storage connectors.
Generates personalized answers for job application forms, cover letters, and custom questions using profile.yml, resume.md, evaluations, and company research. Never auto-submits.