Install
$ agentstack add skill-galiprandi-job-seeker-onboarding ✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ✓ Network access No
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ● Environment & secrets Used
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
Verified badge
Passed review? Show it. Paste this badge into your README, it links to the public security report.
Reliability & compatibility
Declared compatibility
Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.
We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.
How agent discovery & health will work →About
Onboarding
Steps
- Verify
nodeandnpx .gitignore:.browser-profile/,.playwright-cli/,.env,node_modules/npm init -y && npm install pg && npm install --save-dev @types/pg- Ask user about browser visibility preference. Present these options and save the answer to
preferencesbefore opening any browser:
headless— Headless always. The agent works without showing the browser. Manual login/2FA remains headed (Gold Rule 5)headed— Headed always. The user sees everything the agent does on screenheaded_logins_only— Headed only for logins/2FA, headless for everything else (default)ask_each_time— The agent asks before each browser session whether the user wants to see it or not
Save the preference: ``bash node scripts/db.js "INSERT INTO preferences (user_id, category, key, value, confidence, source) VALUES (1, 'tooling', 'browser_mode', '', 1.0, 'explicit_statement') ON CONFLICT (user_id, category, key) DO UPDATE SET value = EXCLUDED.value, updated_at = NOW()" --write ` The agent must respect this preference in **all flows** that use the browser. Load it at every pre-flight: `bash node scripts/db.js "SELECT value FROM preferences WHERE user_id = 1 AND category = 'tooling' AND key = 'browser_mode' AND status = 'active'" ` If no preference exists, default to headedloginsonly`. 4b. Ask user about job search strategy level. Present the situation and ask which fits (see AGENTS.md "Strategy levels"):
passive— Employed, open to opportunities. No auto-apply, only monitors alertsselective— Employed, looking for something better. Applies to Must-matches, 5 per sessionactive— Unemployed or about to be. Applies to Must+Strong, 10 per session, faster follow-upsaggressive— Needs a job now. Applies to all matches, 15 per session, relaxes Must-haves (remote, manager)
Ask these questions to help the user decide:
- Are you currently employed?
- How urgent is your search? (no urgency / in the coming months / now / desperate)
- Would you accept IC roles or only Manager?
- Would you accept hybrid if the project is really good?
- Do you want me to apply automatically or just show you options?
Based on answers, propose a level. Allow the user to confirm or adjust. Then save: ``bash # Save level to preferences node scripts/db.js "INSERT INTO preferences (user_id, category, key, value, confidence, source) VALUES (1, 'workflow', 'strategy_level', '', 1.0, 'explicit_statement') ON CONFLICT (user_id, category, key) DO UPDATE SET value = EXCLUDED.value, updated_at = NOW()" --write # Save detailed parameters to users.data.strategy node scripts/db.js "UPDATE users SET data = jsonb_set(data, '{strategy}', ''::jsonb) WHERE id = 1" --write ` The strategy JSON should contain all parameters (see AGENTS.md "Strategy levels" for the schema per level). If the user customizes any parameter, override the default for that level. If no strategy is set, default to selective`. 4c. Ask user about interview availability preferences. This saves time later when scheduling links arrive in emails or LinkedIn messages. Ask:
- What time slot do you prefer for interviews? (e.g: "13:00 to 16:00 AR")
- Are there any fixed blocked days/times? (e.g: "Tuesday 14:00 to 15:00, English class")
- What is your timezone? (default: America/Argentina/Buenos_Aires)
Save to users.data.availability: ``bash node scripts/db.js "UPDATE users SET data = jsonb_set(data, '{availability}', '{\"preferred_hours\":\"- AR\",\"timezone\":\"\",\"blocked\":{\"\":\"- ()\"}}') WHERE id = 1" --write ``
The news flow uses this to filter available slots from scheduling links (Calendly, SmartRecruiters, etc.) without asking the user each time.
- Open browser respecting the preference from step 4. For manual login it's always headed (Gold Rule 5). Use the wrapper (see AGENTS.md "Browser session"):
node scripts/browser.js open --headed - Ask for email. Navigate to provider login (Gmail → accounts.google.com, Outlook → outlook.live.com). Fill email with
fill, click Next, wait for manual auth + 2FA - Validate session: navigate to inbox, confirm URL doesn't redirect to login
- Ask if user has a connection string or wants to create a DB on Neon
- If create: navigate to console.neon.tech, login with Google (reuse session), "New project", name
job-seeker, nearest region, Create. Read connection string (Show password + eval to extract) - Save connection string to
.envasDATABASE_URL - Ask for user's name
- Create
userstable and insert record via the db CLI (scripts/db.js):
``bash node scripts/db.js "CREATE TABLE IF NOT EXISTS users (id SERIAL PRIMARY KEY, name TEXT NOT NULL, email TEXT NOT NULL UNIQUE, data JSONB DEFAULT '{}')" --write node scripts/db.js "INSERT INTO users (name, email, data) VALUES ('', '', '{}'::jsonb) ON CONFLICT (email) DO UPDATE SET name = EXCLUDED.name" --write ``
- Navigate to linkedin.com/login. Wait for manual auth + 2FA
- Validate session: navigate to linkedin.com/feed/
- Save LinkedIn profile URL to
users.data.linkedin_profilevia db CLI:
``bash node scripts/db.js "UPDATE users SET data = jsonb_set(data, '{linkedin_profile}', '\"\"') WHERE id = 1" --write ``
- Collect user info from all logged-in sites (LinkedIn, Gmail/Google): name, photo, phone, email. Save to
users.dataas JSONB via db CLI (jsonb_set). Useful for aligning profiles on other job platforms - Check if profiles need updating (inconsistent data across sites). Report to user
- Close browser
Rules
- Full autonomy. Only ask for intervention to: data that can't be inferred, manual login, 2FA
- Email login first, LinkedIn second
- Validate session after each login
.envnot tracked- Custom schema: only create tables when needed
- JSONB for semi-structured data in
users.data - Single user (repo owner)
- Browser mode preference is set in step 4 and stored in
preferencestable. All subsequent flows must load and respect it. Manual login/2FA is always headed regardless of preference (Gold Rule 5)
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: galiprandi
- Source: galiprandi/job-seeker
- License: MIT
- Homepage: https://galiprandi.github.io/job-seeker/
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet, be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.