AI Job Scanner
Scan any job description to get an AI automation risk score across 6, 12, and 24-month horizons — plus a personalized upskilling roadmap.
Built for RNDLAB. Powered by Claude via OpenRouter.
What It Does
AI Job Scanner answers the question every knowledge worker is asking: "Will AI replace my job, and when?"
- Paste a job description (or just a role title)
- Get an AI Risk Score (0–100) with breakdowns by 6, 12, and 24-month horizons
- See task-level automation probabilities — which specific duties are at risk first
- Generate a personalized upskilling roadmap — phased, concrete, resource-linked
- Share your risk card — shareable link for each scan result
Data Sources
| Source | What it provides | How used |
|--------|-----------------|----------|
| OpenRouter API (anthropic/claude-sonnet-4.5) | AI automation risk analysis | Real-time LLM call per scan |
| User-provided job descriptions | Input for analysis | User-generated data (not mock) |
No external data feeds are consumed. All analysis is performed on-demand via Claude AI based on the user's input. Results are stored in SQLite for history/sharing.
When AI is unavailable: The UI shows a clear error message (503 AI service unavailable). No fake scores are generated as fallback.
Running Locally
# 1. Install dependencies
npm install
# 2. Configure environment
cp .env.example .env
# Edit .env — set OPENROUTER_API_KEY
# 3. Start
npm start
# Visit: http://localhost:4711/ai-job-scanner
```
API Endpoints
| Method | Path | Description |
|--------|------|-------------|
| GET | /ai-job-scanner/health | Health check |
| POST | /ai-job-scanner/api/analyze | Analyze a job role |
| GET | /ai-job-scanner/api/scan/:id | Get scan by ID |
| GET | /ai-job-scanner/api/share/:token | Get scan by share token |
| GET | /ai-job-scanner/api/scans/recent | Recent scans (public) |
| GET | /ai-job-scanner/api/scans/top-risk | Highest risk roles scanned |
| POST | /ai-job-scanner/api/roadmap/:scanId | Generate upskilling roadmap |
| GET | /ai-job-scanner/api/roadmap/:scanId | Get existing roadmap |
| GET | /ai-job-scanner/api/stats | Platform statistics |
POST /api/analyze
{
"role_title": "Data Analyst",
"job_description": "Optional full JD text..."
}
Response:
``json``
{
"id": "uuid",
"share_token": "abc123def456",
"analysis": {
"role_title": "Data Analyst",
"industry": "Finance",
"overall_risk_score": 68,
"risk_summary": "...",
"risk_horizons": {
"6mo": { "score": 35, "label": "Low", ... },
"12mo": { "score": 58, "label": "Medium", ... },
"24mo": { "score": 82, "label": "High", ... }
},
"task_breakdown": [...],
"human_moat": [...],
"comparable_roles": { "safer": [...], "riskier": [...] }
}
}
Environment Variables
| Variable | Required | Description |
|----------|----------|-------------|
| PORT | No | HTTP port (default: 4711) |
| NODE_ENV | No | Environment (production/development) |
| OPENROUTER_API_KEY | Yes | OpenRouter API key for Claude access |
| DATABASE_PATH | No | SQLite DB path (default: ./data.db) |
Stack
- Runtime: Node.js >=22 (ESM)
- Server: Express 4.x
- Database: better-sqlite3 (WAL mode)
- AI: OpenRouter → anthropic/claude-sonnet-4.5
- Frontend: Vanilla JS SPA, dark theme
- Security: helmet, no auth required (open by design)