Job Engine

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

methodpathwhat it does
GET/healthliveness + job count
GET/metricspipeline counters and response rate
GET/jobsall ads with fit scores
GET/jobs/:ida single ad
GET/jobs/:id/packthe finished application pack
POST/jobs/:id/applymark as applied
POST/jobs/:id/statusmove status (reply, interview…)
POST/importimport a new ad from text

Data

Limits — what this demo does not do

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.