🧩 Supported ATS platforms
Job-application systems the Agent fills in directly without spending AI credits. A job whose URL matches one of these hosts is routed to a purpose-built form filler first.
➕ Add a company for the entire system
Every company here is scanned by the Agent and its jobs are matched and applied to for all active job seekers. Users can add companies too — those appear in this list automatically. Only an admin can deactivate or delete a company for the whole system; a user removing one only takes it out of their own account.
🏢 All companies in the pipeline
Deactivating stops the Agent scanning a company without losing its history. Deleting removes it permanently for everyone.
🩺 User health — who's struggling right now
📋 Admin application queue
Only jobs approved by the user appear here. Choose an account to manage its application requests. Account cards load first; jobs and application details load when opened. Railway discovers South African jobs only. US/global ATS company discovery is frozen; saved international records are retained. Admins complete all applications here. User-requested skipped jobs are labelled Queued for admin; uncertain earlier submissions must be checked before applying again.
Approved-only queue · admin-token-topup-v1
📋 Default Job Sources
These are pre-configured job sources that come with JobAgent. Each is filtered to South African jobs only (8am-4pm SA time daily). Users can individually disable any source in their settings. Admin cannot globally remove sources here — use the settings per-user instead.
📊 User Sources Summary
Overview of which users have each source enabled/disabled.
🔴 Master Agent Switch
The kill-switch for the entire Agent. When OFF, the Railway worker skips discovery runs for every user — no tokens spent, no jobs applied. Individual account pause/reactivate still works; this is the fleet-wide override on top of that. Default: OFF. Turn ON only when you're ready to serve real users.
⏰ Agent Time Window
When the Agent scans job boards (Adzuna, Jobmail, RemoteOK, etc.) for new matches. Watched-page discovery runs on its schedule regardless — this window only gates autonomous board search.
➕ Add New Job Source
Add a new job source that every user can enable in their settings. All sources are automatically country-filtered to South Africa and become available to all existing accounts on save.
Shared AI keys — 100-slot Groq vault
DigitalHouse-owned AI keys power the Agent for every JobAgent user — match scoring, CV/cover letter/motivational letter drafting, reading a user's Watched pages, and applying on their behalf. Users never see or manage this (they only ever see the word "Agent" in the app); the cost is recovered through their subscription, not billed to their own accounts.
Exactly 100 Groq key slots (K1–K100). Fill any number of slots. Every slot uses the same model selected below. The updated Railway worker rotates ready keys and skips keys that hit a limit.
Provider retry timing takes priority. Keys in the same organization can share limits. These keys are saved to your database, not this browser; restrict dispatch_settings to authorized admins and the worker.
All 100 slots use the selected model. Refresh to check live model availability.
Used for match scoring and reading a user's Watched pages. Anthropic retires older snapshots periodically — if scoring or page-reading stops working, pick a newer model here. Pick "Default" to let the agent use the current recommended model for your provider.
Settings are stored in dispatch_settings. For 100-key rotation, install migration_groq_hundred_slots.sql, updated aiMatch.js, and groqKeyPool.js, then redeploy the Railway worker. The admin page alone cannot rotate worker requests.
Agent instructions
Free-text guidance prepended to the prompt the Agent uses when it reads a user's Watched pages to work out which links are real job postings. Use this to steer judgement calls — e.g. what to treat as a "job posting" vs. navigation, how to handle listings with no clear title, or any site-specific quirks you've noticed. Leave blank to use the Agent's built-in default behaviour.