Dice Easy Apply Automation
by @ralyodio
Automate Dice.com Easy Apply searches and applications with Puppeteer/Chromium, resume and cover-letter uploads, remote-role filtering, and conservative appl...
clawhub install dice-easy-apply-automationπ About This Skill
name: dice-easy-apply description: Automate Dice.com Easy Apply searches and applications with Puppeteer/Chromium, resume and cover-letter uploads, remote-role filtering, and conservative application guardrails. when_to_use: Use when you need an AI agent to search Dice.com jobs and submit Dice Easy Apply applications from a verified resume and cover letter. license: MIT metadata: supported_agents: - claude-code - openclaw - hermes - codex - cursor - windsurf - goose - aider - roo-code - cline tags: [jobs, dice, automation, puppeteer, easy-apply]
Dice Easy Apply Automation
This skill helps an AI coding/operations agent build and run a repeatable Dice.com Easy Apply workflow.
It is intentionally public and credential-free. It contains no usernames, passwords, cookies, private profile paths, or user-specific secrets.
What it does
Safety rules
Recommended search URL
Use Dice's remote filter directly, not a radius search:
https://www.dice.com/jobs?filters.workplaceTypes=Remote&filters.easyApply=true&q=
For contract/direct-hire filtered searches, add Dice's employment and employer filters:
https://www.dice.com/jobs?filters.easyApply=true&filters.employmentType=CONTRACTS&filters.employerType=Direct+Hire&filters.workplaceTypes=Remote&q=
Useful query set:
gen ai engineer
generative ai engineer
llm engineer
ai full stack engineer
frontend ai engineer
web developer
full stack engineer
node react engineer
javascript engineer
typescript engineer
react developer
node.js developer
svelte developer
software engineer
Environment variables
RESUME_PDF=/absolute/path/to/resume.pdf
COVER_PDF=/absolute/path/to/cover.pdf
CHROME_PROFILE=$HOME/.cache/dice-chrome
STATE_DIR=/tmp/dice-easyapply-daily
MAX_SCAN=120
MAX_APPLY=15
DRY_RUN=1
SEARCHES='gen ai engineer|llm engineer|full stack engineer|react developer'
EMPLOYMENT_FILTER=CONTRACTS
EMPLOYER_TYPE='Direct Hire'
Puppeteer launch pattern
const puppeteer = require('puppeteer');const browser = await puppeteer.launch({
headless: false,
executablePath: process.env.CHROME_BIN || '/snap/bin/chromium',
userDataDir: process.env.CHROME_PROFILE || ${process.env.HOME}/.cache/dice-chrome,
defaultViewport: null,
args: ['--no-sandbox', '--disable-setuid-sandbox', '--disable-dev-shm-usage', '--start-maximized']
});
let page = await browser.newPage();
page.setDefaultTimeout(30000);
page.on('dialog', async d => {
try {
if (d.type() === 'beforeunload') await d.accept();
else await d.dismiss();
} catch {}
});
Core workflow
1. Verify local files exist:
test -f "$RESUME_PDF"
test -f "$COVER_PDF"
2. Open Dice with a persistent browser profile and verify login.
3. Search remote Easy Apply roles using the query list.
4. Extract Dice job IDs from /job-detail/ URLs.
5. Open each job detail page and inspect only the main job description, not footer/recommended-job/sidebar text.
6. Skip explicit onsite/hybrid/local/travel/clearance constraints.
7. Open the wizard:
https://www.dice.com/job-applications//wizard
8. Replace any stale/default resume with the verified resume PDF. 9. Upload the cover-letter PDF where Dice supports it. 10. Continue to the review screen. 11. Confirm expected filenames and work authorization are visible. 12. Submit only if no unknown required questions remain. 13. Append a JSONL audit row and save state.
Suggested state
{
"seen": {},
"applied": {},
"skipped": {},
"alreadySubmitted": {}
}
Write state and logs to:
/tmp/dice-easyapply-daily/state.json
/tmp/dice-easyapply-daily/results.jsonl
Skip reasons
Common skip reasons:
not_remote_only_or_has_hybrid_location_textoutside_resume_wheelhouseexternal_ats_not_approvedunknown_required_questioncaptcha_or_verification_requiredcould_not_attach_resumecould_not_attach_cover_letteralready_submittedReporting
Report concise results:
Submitted:
Title β Company β URL Skipped:
Title β Company β URL β reason State: /tmp/dice-easyapply-daily/state.json
Log: /tmp/dice-easyapply-daily/results.jsonl
Pitfalls
beforeunload dialogs; register a Puppeteer dialog handler and accept beforeunload dialogs.Target closed, Session closed, or frame was detached, create a fresh page, re-register the dialog handler, and continue from state.