A hosted, multi-tenant career-intelligence product: proactive job discovery, explainable AI-assisted scoring, values screening, and alerting — fully customizable by every user through friendly surfaces, across role families from engineering to product, design, research, data, and beyond.
Built on a proven discovery-and-scoring engine refined through thousands of live postings, re-architected from day one for tenancy, safety, and user-facing customization.
Status: M0–M3 complete; M4 (tenant-aware pipeline & fairness) in progress. The full poll →
filter → score → notify chain now runs for real (poll/, pipeline.py, ADR-0025): two ATS
adapters ported from the source repo (Greenhouse, Lever) feeding a pipeline that wires every
subsystem this milestone built — due-work scheduling (ADR-0018), notify decisions (ADR-0019),
source-yield tracking (ADR-0020) — together, verified against live GitLab job data as well as
recorded fixtures. The adapter library has since grown to 48 (ADR-0031): generic ATS/job-board
platform clients (Workday, iCIMS, ADP, Oracle Recruiting Cloud, and more), several fallback
strategies for boards with no dedicated adapter (sitemap mining, embedded-JSON-state walking, a
Bedrock-backed LLM extractor, a Playwright JS-render scraper), and a handful of approved
niche community job boards — each individually reviewed and, where needed, redacted before
porting; see that ADR for exactly what was ported, redacted, or excluded and why.
Infrastructure-as-code landed (infra/, CDK v2): data-plane DynamoDB tables
(ADR-0021), control-plane Cognito identity boundary (ADR-0022), a real DynamoDB Store adapter
(ADR-0023), and the first live API route — GET /me behind a Cognito JWT authorizer (ADR-0024).
A per-user watchlist service (ADR-0026) feeds that pipeline real org entries, and
scheduled_poll.py (ADR-0027) now connects it all the way to due-work scheduling and
fair-share dispatch — end to end, tested: add an org, it gets scheduled, dispatched, polled,
and its cadence adapts automatically. Alerts now actually render and send through SES
(ADR-0028), gated correctly on verdict/channel/dry-run/quiet-hours. Scoring has a real
implementation too — BedrockScorer (ADR-0029) calls a Bedrock Claude model and validates
every field of its response before trusting it, the same untrusted-content discipline this
product already applies to user input. No live Bedrock call has been made yet, and nothing
wires a real caller to use it instead of StubScorer.
The first UI exists: web/ (ADR-0030) — Cognito Hosted UI sign-in via PKCE, landing on a page
that calls GET /me. generateCodeChallenge is verified against RFC 7636's own official test
vector; nothing has run against a real deployed Cognito pool or API yet. What's left to run the
backend chain unattended is a compute trigger (EventBridge + Lambda), pure infra wiring at this
point. Still open: a batched digest email, resolving real per-user to_email/from_email for
delivery, and (roadmap M8) hardening the web app against XSS-based token theft
(docs/THREAT-MODEL.md T11).
- Product roadmap (Path B: multi-tenant SaaS):
docs/OPENJOBRADAR-ROADMAP.md - Architecture decision records:
docs/adr/ - License: AGPL-3.0
- Zero person-specific facts in code — configuration is the only place identity lives.
- Tenant isolation is enforced in the data layer and proven by an adversarial test suite.
- Every new user starts in DRY_RUN; nothing sends or spends until explicitly armed.
- Progressive disclosure: presets → forms → expert YAML, so "customize everything" stays usable.
Per the portfolio STANDARDS/ set; registration lives in the private applicability registry
(registered 2026-08-22 at repo genesis, before first public push). No blank rows, no silent skips.
| Standard | State |
|---|---|
| Code Quality | Applies — ruff/mypy/pytest + coverage floor via make verify; ADRs from day one |
| Security & Supply-Chain | Applies — bandit + gitleaks + pip-audit/Dependabot armed; initial threat model landed M2.7 (docs/THREAT-MODEL.md), extended at each new trust boundary; vault/isolation/fairness defects are P1 by declaration (SECURITY.md) |
| CI/CD | Applies — merge-blocking gates on PR and main (.github/workflows/ci.yml) |
| Observability | Applies — Tier C today (library); Tier A+B controls land with the first hosted surface (roadmap M4) |
| Accessibility | Applies as of web/ (ADR-0030) — human-facing HTML now exists. No axe/Lighthouse gate wired into CI yet; tracked for roadmap M5 alongside the settings hub/onboarding UI this minimal slice will grow into |
| Internationalization | Applies — consumer-facing US product; English-only at M1, declared in docs/I18N.md with a GA target |
| AI Evaluation | Applies — LLM scoring is the core feature; untrusted-prompt contract in ADR-0009 precedes any model call |
| Quality & Metrics | Applies — values ledger in docs/ROADMAP.md |
| Documentation | Applies — README/ADRs/CHANGELOG/SECURITY/CONTRIBUTING current at HEAD |
| Release & Versioning | N/A — no versioned artifact released yet; trusted-main signed-tag pipeline lands with the first tag (docs/adr/0011-no-versioned-release-yet.md) |
| Responsible-Tech Framework | Applies — artifact schedule in docs/RESPONSIBLE-TECH-AUDITS.md |
| Performance | Applies as of GET /me (ADR-0024) and web/ (ADR-0030) — a real hosted route and shipped HTML both now exist. No load/latency budget measured yet; nothing is deployed to measure it against |
| Incident Response | Applies — severity anchors in docs/incidents/README.md |
| Data Governance | Applies — per-user data by design; L0 inventory at M0, classification matures with the schema work (M2) |
| AI Development Measurement | Applies — tracked under the Quality & Metrics scope |
make setup # .venv + runtime + dev tooling
make verify # ruff + mypy + pytest (coverage-gated)Infrastructure (infra/, CDK v2 TypeScript) and the web app (web/, Astro) are each their own
toolchain — make infra-setup / make infra-verify (see infra/README.md),
and npm ci / npm test / npm run build in web/ (see web/README.md).