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".
npx claudepluginhub roxabi/roxabi-plugins --plugin linkedin-applyThis skill is limited to using the following tools:
Set up everything needed to use `/linkedin-apply` for the first time. Run once before analyzing any job offers.
Automates 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.
Generates personalized answers for job application forms, cover letters, and custom questions using profile.yml, resume.md, evaluations, and company research. Never auto-submits.
Automates LinkedIn interactions: check messages, view profiles, search people, send messages/connections using browser relay or cookies. For network automation.
Share bugs, ideas, or general feedback.
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