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 job applications on LinkedIn Easy Apply, Greenhouse, Ashby, Lever, Rippling, and Workday using browser automation. Extracts resume data into a reusable profile.
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.
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.