This repo contains three active Codex workspaces:
/Users/sethtipton/Documents/Sites/skills/capture-website-assets/Users/sethtipton/Documents/Sites/skills/daily-frontend-study-guide/Users/sethtipton/Documents/Sites/skills/job-watch
The automation-heavy workspaces are repo-first. Their scripts, prompts, skills, config, and versioned automation files live here and should stay aligned with the live Codex app automation files in ~/.codex/automations/.
skills/
├── AGENTS.md
├── capture-website-assets/
├── daily-frontend-study-guide/
└── job-watch/
Purpose:
- collect fresh front-end signals
- build a dated brief
- generate exactly four lessons
- validate and persist the lesson outputs
- write a standalone dated HTML report
Scheduled behavior:
- unattended
- deterministic collection only
- no Playwright, DevTools, browser fallback, or report-opening dependency
Primary docs:
Purpose:
- build a candidate profile
- fetch broadly from deterministic allowed sources
- verify, hard-gate, score, and report jobs
- keep dated artifacts that make unattended auditing possible
Two modes:
- scheduled-safe deterministic workflow for the 8 AM unattended run
- separate manual browser-assisted enrichment workflow for repair or extra coverage
Primary docs:
Repo versions to keep current:
Live app-managed files:
- /Users/sethtipton/.codex/automations/daily-frontend-study/automation.toml
- /Users/sethtipton/.codex/automations/job-watch/automation.toml
Daily study:
cd /Users/sethtipton/Documents/Sites/skills/daily-frontend-study-guide
npm install
npm run study-collect -- --date YYYY-MM-DD
npm run study-brief -- --date YYYY-MM-DD
npm run daily-study -- --date YYYY-MM-DD --input-markdown-file /absolute/path/to/draft.mdIn the Codex app, Run now should execute the same deterministic daily-study path and write the same dated artifacts.
Daily thread command:
Run the daily front-end study workflow using daily-frontend-study-guide/prompts/deep.md
Job watch scheduled-safe:
cd /Users/sethtipton/Documents/Sites/skills/job-watch
npm install
JOB_WATCH_EXECUTION_POLICY=scheduled_safe npm run job-watchIn the Codex app, Run now should execute the same scheduled-safe deterministic path, not the manual browser-assisted one.
Job watch manual browser-assisted enrichment:
cd /Users/sethtipton/Documents/Sites/skills/job-watch
npm run browser:codex-profile
npm run job-import -- --input /absolute/path/to/import.json
npm run job-evaluate
npm run job-reportBefore that manual enrichment run:
- sign into LinkedIn in the dedicated browser window opened by
npm run browser:codex-profile - keep that browser window open while Codex uses the manual browser-assisted prompt
Daily thread commands:
Run the job watch using job-watch/prompts/deep.mdRun the manual browser-assisted job-watch enrichment using job-watch/prompts/manual-browser-assist.md
Credential-dependent scheduled-safe sources:
- USAJOBS needs
USAJOBS_API_KEYplusUSAJOBS_USER_AGENTorJOB_WATCH_CONTACT_EMAIL - Adzuna needs
ADZUNA_APP_IDandADZUNA_APP_KEY
For a given URL, it will:
- open the page in isolated headless Chromium
- set the browser viewport before capture
- wait for the page to settle
- try to remove common cookie banners, popups, and chat widgets
- scroll once to trigger lazy-loaded content
- save a full-page screenshot as optimized WebP
- save a top-section crop as optimized WebP
- resize outputs to your target width
Install dependencies inside the skill folder:
cd /Users/sethtipton/Documents/Sites/skills/capture-website-assets
npm install
npx playwright install chromiumOptional: expose the skill to Codex directly from this repo with a symlink:
ln -s /Users/sethtipton/Documents/Sites/skills/capture-website-assets \
/Users/sethtipton/.codex/skills/capture-website-assetsRun from the skill directory:
cd /Users/sethtipton/Documents/Sites/skills/capture-website-assets
npm run capture -- "https://example.com"Default behavior:
- viewport width:
1440 - viewport height:
1100 - top crop height:
1000 - output width for both images:
1200 - output format:
webp
Default output folder:
./screenshots/<slug>/
Example output names for https://example.com:
example-comhome-full.webp
example-comhome-top.webp
Use these flags:
--browser-width <px>: viewport width before capture--browser-height <px>: viewport height before capture--theme <mode>: browser color scheme for sites that respond toprefers-color-scheme; uselight,dark, orauto
Example:
npm run capture -- "https://example.com" \
--browser-width 1440 \
--browser-height 1100 \
--theme darkUse --browser-width to control the layout breakpoint. This is the main setting for how the site renders.
Use --browser-height to control the initial visible viewport. This can affect sticky headers, lazy-loading, and how some popups appear.
There are two screenshots:
- the full-page image: captures the entire rendered page height automatically
- the top-section image: crops the top part of the page using
--top-height
Use:
--top-height <px>: crop height for the top screenshot before resize
Example for a top 1000px crop:
npm run capture -- "https://example.com" \
--browser-width 1440 \
--browser-height 1100 \
--theme dark \
--top-height 1000Example for a taller hero crop:
npm run capture -- "https://example.com" \
--browser-width 1600 \
--browser-height 1200 \
--theme light \
--top-height 1400Use these flags:
--output-width <px>: set both output images to the same width--full-output-width <px>: override width for full-page only--top-output-width <px>: override width for top crop only
Example, both outputs at 1200px wide:
npm run capture -- "https://example.com" \
--browser-width 1440 \
--top-height 1000 \
--output-width 1200Example, full-page at 1600px wide and top crop at 1200px wide:
npm run capture -- "https://example.com" \
--browser-width 1600 \
--browser-height 1200 \
--top-height 1000 \
--full-output-width 1600 \
--top-output-width 1200Use these flags:
--slug <value>: folder and default file-name base--output-dir <path>: custom output folder--full-name <name>: full-page file name stem--top-name <name>: top-image file name stem
Example:
npm run capture -- "https://example.com" \
--slug example-home \
--output-dir ./screenshots/example-home \
--full-name example-home-full \
--top-name example-home-topThis will produce:
./screenshots/example-home/example-home-full.webp
./screenshots/example-home/example-home-top.webp
cd /Users/sethtipton/Documents/Sites/skills/capture-website-assets
npm run capture -- "https://example.com" \
--browser-width 1440 \
--browser-height 1100 \
--top-height 1000 \
--output-width 1200 \
--slug example-homenpm run capture -- "https://example.com" \
--browser-width 1600 \
--browser-height 1200 \
--top-height 1200 \
--full-output-width 1600 \
--top-output-width 1200 \
--slug example-desktopnpm run capture -- "https://example.com" \
--browser-width 1440 \
--browser-height 1100 \
--top-height 1000 \
--output-width 1200 \
--full-name example-fullpage \
--top-name example-hero \
--output-dir ./screenshots/example-case-studyThe script already removes many common selectors, but some sites need custom rules.
Use:
--wait-ms <ms>: extra wait time after load and cleanup--config <path>: JSON file with custom selectors and blocked request patterns
Example with extra wait:
npm run capture -- "https://example.com" \
--browser-width 1440 \
--top-height 1000 \
--wait-ms 1500Example config file:
{
"blockRequestPatterns": ["intercom", "drift"],
"hideSelectors": [".newsletter-popup", ".sticky-chat-button"],
"clickSelectors": [".cookie-accept", ".modal-close"],
"waitForSelectors": ["main"],
"waitForTimeoutMs": 1000
}Save that as site-overrides.json, then run:
npm run capture -- "https://example.com" \
--browser-width 1440 \
--top-height 1000 \
--config ./site-overrides.jsonSee also:
npm run capture -- "<url>" \
--browser-width <px> \
--browser-height <px> \
--theme <light|dark|auto> \
--top-height <px> \
--output-width <px> \
--full-output-width <px> \
--top-output-width <px> \
--quality <0-100> \
--wait-ms <ms> \
--slug <value> \
--output-dir <path> \
--config <path> \
--full-name <name> \
--top-name <name>Because the skill is linked into ~/.codex/skills, you can prompt Codex with requests like:
Use capture-website-assets to capture https://example.com at 1440px browser width, 1100px browser height, with a 1000px top crop. Save both outputs at 1200px wide.
Or:
Use capture-website-assets to capture https://example.com. If cookie banners or chat widgets remain, create a site override config and rerun.
cd /Users/sethtipton/Documents/Sites/skills/capture-website-assets
npm run capture -- "https://example.com" \
--browser-width 1440 \
--browser-height 1100 \
--top-height 1000 \
--output-width 1200 \
--slug example-home