Install
openclaw skills install dice-easy-apply-automationAutomate Dice.com Easy Apply searches and applications with Puppeteer/Chromium, resume and cover-letter uploads, remote-role filtering, and conservative appl...
openclaw skills install dice-easy-apply-automationThis 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.
Use Dice's remote filter directly, not a radius search:
https://www.dice.com/jobs?filters.workplaceTypes=Remote&filters.easyApply=true&q=<QUERY>
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=<QUERY>
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
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'
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 {}
});
test -f "$RESUME_PDF"
test -f "$COVER_PDF"
/job-detail/<id> URLs.https://www.dice.com/job-applications/<job-id>/wizard
{
"seen": {},
"applied": {},
"skipped": {},
"alreadySubmitted": {}
}
Write state and logs to:
/tmp/dice-easyapply-daily/state.json
/tmp/dice-easyapply-daily/results.jsonl
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_submittedReport 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
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.