Technical description
Node 20+, zero dependencies. Data lives in JSON/JSONL files; the program ships a CLI and a small HTTP server. Fit score and application packs are computed deterministically from the profile and the ad text — no model, no network.
How to run it
node src/cli.mjs serve # HTTP server (PORT, default 8795; this demo runs on 8797) node _qa/smoke.mjs # 9/9 checks PROFILE_FILE=data/profile.demo.json node src/cli.mjs serve # demo candidate # CLI, bez servera node src/cli.mjs jobs node src/cli.mjs pack --id <jobId>
API
| method | path | what it does |
|---|---|---|
GET | /health | liveness + job count |
GET | /metrics | pipeline counters and response rate |
GET | /jobs | all ads with fit scores |
GET | /jobs/:id | a single ad |
GET | /jobs/:id/pack | the finished application pack |
POST | /jobs/:id/apply | mark as applied |
POST | /jobs/:id/status | move status (reply, interview…) |
POST | /import | import a new ad from text |
Data
- data/jobs.json — ads (company, title, pay, requirements, link)
- data/profile.json — the candidate (skills, claims, roleFamilies); the demo uses data/profile.demo.json
- data/pipeline.jsonl — application pipeline, append-only
Limits — what this demo does not do
- No database — JSON files (enough for one candidate; a team needs Postgres).
- No authentication: anyone with the URL can change status. The demo is deliberately open.
- It does not send applications — no mail integration; the pack is copied by hand.
- It does not scrape job boards — an ad is imported as text (POST /import).
How it is deployed
One Node process behind nginx, a systemd unit, Let’s Encrypt. The recipe is in E:\poslovi\DEMO-REGISTAR.md — the same for every program.
The demo cannot spend money: no AI keys and no outbound calls.