# sebastien-chami/career-ops architecture

> Architecture diagram of the GitHub repository sebastien-chami/career-ops, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-11-13). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/sebastien-chami/career-ops
- Repository: https://github.com/sebastien-chami/career-ops

## Overview

career-ops is a local-first AI job-search agent with a web interface and terminal dashboard. The main journey is to bring in or discover a posting, check whether it is open and a fit, review it in a tracked pipeline, prepare tailored application materials, and submit manually. Follow-up tracking, analytics, and extensible job-board integrations are meaningful branches. The README establishes the user workflow; the source index and excerpts identify core modules, but many runtime connections are unsampled, so uncertain links are omitted or dashed.

Main entry points: [`tracker-utils.mjs`](https://github.com/sebastien-chami/career-ops/blob/main/tracker-utils.mjs) (Application Tracker), [`rank-pipeline.mjs`](https://github.com/sebastien-chami/career-ops/blob/main/rank-pipeline.mjs) (Pipeline Ranking), [`scan.mjs`](https://github.com/sebastien-chami/career-ops/blob/main/scan.mjs) (Job Scanner), [`role-matcher.mjs`](https://github.com/sebastien-chami/career-ops/blob/main/role-matcher.mjs) (Fit Evaluation)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_discovery["Job Discovery"]
  node_scan["Job Scanner<br/>[scan.mjs]"]
  node_providers["Board Providers"]
  node_http["HTTP Utilities<br/>[_http.mjs]"]
  node_pluginengine["Plugin Engine<br/>[_engine.mjs]"]
  node_jobintake["Job Intake<br/>[jd-capture.mjs]"]
  node_urlkey["Posting URL Keys<br/>[url-key.mjs]"]
end

subgraph group_evaluation["Fit Evaluation"]
  node_fit["Fit Evaluation<br/>[role-matcher.mjs]"]
  node_cvfacts["CV Fact Checks"]
  node_archive["Job Archive Checks"]
end

subgraph group_pipeline["Search Management"]
  node_pipeline["Pipeline Ranking<br/>[rank-pipeline.mjs]"]
  node_tracker["Application Tracker<br/>[tracker-utils.mjs]"]
  node_trackerparse["Tracker Parsing<br/>[tracker-parse.mjs]"]
  node_followups["Follow-up Cadence"]
  node_funnel["Funnel Analytics"]
  node_paths["Workspace Paths<br/>[path-resolver.mjs]"]
  node_lock["Pipeline Lock<br/>[pipeline-lock.mjs]"]
  node_yaml["YAML Documents<br/>[yaml-document.mjs]"]
  node_verify["System Verification"]
end

subgraph group_application["Application Preparation"]
  node_cv["CV Tailoring<br/>[openai-tailor.mjs]"]
  node_latex["CV Generation<br/>[generate-latex.mjs]"]
  node_apply["Application Preparation"]
  node_answers["Application Answers"]
end

subgraph group_interfaces["User Interfaces"]
  node_web["Web Experience"]
  node_dashboard["Terminal Dashboard<br/>[main.go]"]
  node_cli["CLI Flags<br/>[cli-flags.mjs]"]
end

node_candidate(("Candidate"))

node_candidate -->|"provides posting"| node_jobintake
node_candidate -.->|"uses"| node_web
node_candidate -.->|"uses"| node_dashboard
node_jobintake -.->|"submits for scan"| node_scan
node_scan -.->|"retrieves listings"| node_providers
node_providers -->|"fetches feeds"| node_http
node_pluginengine -.->|"extends sources"| node_providers
node_scan -.->|"evaluates fit"| node_fit
node_fit -.->|"checks availability"| node_archive
node_fit -.->|"returns evaluation"| node_pipeline
node_pipeline -.->|"updates records"| node_tracker
node_tracker -->|"parses records"| node_trackerparse
node_pipeline -->|"locks pipeline"| node_lock
node_tracker -->|"resolves paths"| node_paths
node_tracker -->|"loads YAML"| node_yaml
node_tracker -.->|"tracks next steps"| node_followups
node_tracker -.->|"summarizes progress"| node_funnel
node_pipeline -.->|"selects role"| node_cv
node_cv -->|"checks facts"| node_cvfacts
node_cv -.->|"generates document"| node_latex
node_pipeline -.->|"prepares application"| node_apply
node_apply -.->|"drafts answers"| node_answers
node_candidate -->|"submits manually"| node_apply
node_scan -.->|"normalizes postings"| node_urlkey
node_verify -->|"checks tracker"| node_trackerparse
node_cli -.->|"configures command"| node_scan

click node_web "https://github.com/sebastien-chami/career-ops/tree/main/web/src/app"
click node_dashboard "https://github.com/sebastien-chami/career-ops/blob/main/dashboard/main.go"
click node_scan "https://github.com/sebastien-chami/career-ops/blob/main/scan.mjs"
click node_providers "https://github.com/sebastien-chami/career-ops/tree/main/providers"
click node_http "https://github.com/sebastien-chami/career-ops/blob/main/providers/_http.mjs"
click node_pluginengine "https://github.com/sebastien-chami/career-ops/blob/main/plugins/_engine.mjs"
click node_jobintake "https://github.com/sebastien-chami/career-ops/blob/main/jd-capture.mjs"
click node_fit "https://github.com/sebastien-chami/career-ops/blob/main/role-matcher.mjs"
click node_cvfacts "https://github.com/sebastien-chami/career-ops/blob/main/verify-cv-facts.mjs"
click node_archive "https://github.com/sebastien-chami/career-ops/blob/main/check-jd-archive.mjs"
click node_pipeline "https://github.com/sebastien-chami/career-ops/blob/main/rank-pipeline.mjs"
click node_tracker "https://github.com/sebastien-chami/career-ops/blob/main/tracker-utils.mjs"
click node_trackerparse "https://github.com/sebastien-chami/career-ops/blob/main/tracker-parse.mjs"
click node_followups "https://github.com/sebastien-chami/career-ops/blob/main/followup-cadence.mjs"
click node_funnel "https://github.com/sebastien-chami/career-ops/blob/main/funnel-velocity.mjs"
click node_cv "https://github.com/sebastien-chami/career-ops/blob/main/openai-tailor.mjs"
click node_latex "https://github.com/sebastien-chami/career-ops/blob/main/generate-latex.mjs"
click node_apply "https://github.com/sebastien-chami/career-ops/blob/main/prepare-application.mjs"
click node_answers "https://github.com/sebastien-chami/career-ops/blob/main/application-answers.mjs"
click node_cli "https://github.com/sebastien-chami/career-ops/blob/main/lib/cli-flags.mjs"
click node_paths "https://github.com/sebastien-chami/career-ops/blob/main/path-resolver.mjs"
click node_lock "https://github.com/sebastien-chami/career-ops/blob/main/pipeline-lock.mjs"
click node_yaml "https://github.com/sebastien-chami/career-ops/blob/main/lib/yaml-document.mjs"
click node_urlkey "https://github.com/sebastien-chami/career-ops/blob/main/url-key.mjs"
click node_verify "https://github.com/sebastien-chami/career-ops/blob/main/verify-pipeline.mjs"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_scan,node_providers,node_http,node_pluginengine,node_jobintake,node_urlkey toneBlue
class node_fit,node_cvfacts,node_archive toneAmber
class node_pipeline,node_tracker,node_trackerparse,node_followups,node_funnel,node_paths,node_lock,node_yaml,node_verify toneMint
class node_cv,node_latex,node_apply,node_answers toneRose
class node_web,node_dashboard,node_cli,node_candidate toneIndigo
```

## Components

### Job Discovery

- [Job Scanner](https://github.com/sebastien-chami/career-ops/blob/main/scan.mjs): `scan.mjs`
- [Board Providers](https://github.com/sebastien-chami/career-ops/tree/main/providers): `providers`
- [HTTP Utilities](https://github.com/sebastien-chami/career-ops/blob/main/providers/_http.mjs): `providers/_http.mjs`
- [Plugin Engine](https://github.com/sebastien-chami/career-ops/blob/main/plugins/_engine.mjs): `plugins/_engine.mjs`
- [Job Intake](https://github.com/sebastien-chami/career-ops/blob/main/jd-capture.mjs): `jd-capture.mjs`
- [Posting URL Keys](https://github.com/sebastien-chami/career-ops/blob/main/url-key.mjs): `url-key.mjs`

### Fit Evaluation

- [Fit Evaluation](https://github.com/sebastien-chami/career-ops/blob/main/role-matcher.mjs): `role-matcher.mjs`
- [CV Fact Checks](https://github.com/sebastien-chami/career-ops/blob/main/verify-cv-facts.mjs): `verify-cv-facts.mjs`
- [Job Archive Checks](https://github.com/sebastien-chami/career-ops/blob/main/check-jd-archive.mjs): `check-jd-archive.mjs`

### Search Management

- [Pipeline Ranking](https://github.com/sebastien-chami/career-ops/blob/main/rank-pipeline.mjs): `rank-pipeline.mjs`
- [Application Tracker](https://github.com/sebastien-chami/career-ops/blob/main/tracker-utils.mjs): `tracker-utils.mjs`
- [Tracker Parsing](https://github.com/sebastien-chami/career-ops/blob/main/tracker-parse.mjs): `tracker-parse.mjs`
- [Follow-up Cadence](https://github.com/sebastien-chami/career-ops/blob/main/followup-cadence.mjs): `followup-cadence.mjs`
- [Funnel Analytics](https://github.com/sebastien-chami/career-ops/blob/main/funnel-velocity.mjs): `funnel-velocity.mjs`
- [Workspace Paths](https://github.com/sebastien-chami/career-ops/blob/main/path-resolver.mjs): `path-resolver.mjs`
- [Pipeline Lock](https://github.com/sebastien-chami/career-ops/blob/main/pipeline-lock.mjs): `pipeline-lock.mjs`
- [YAML Documents](https://github.com/sebastien-chami/career-ops/blob/main/lib/yaml-document.mjs): `lib/yaml-document.mjs`
- [System Verification](https://github.com/sebastien-chami/career-ops/blob/main/verify-pipeline.mjs): `verify-pipeline.mjs`

### Application Preparation

- [CV Tailoring](https://github.com/sebastien-chami/career-ops/blob/main/openai-tailor.mjs): `openai-tailor.mjs`
- [CV Generation](https://github.com/sebastien-chami/career-ops/blob/main/generate-latex.mjs): `generate-latex.mjs`
- [Application Preparation](https://github.com/sebastien-chami/career-ops/blob/main/prepare-application.mjs): `prepare-application.mjs`
- [Application Answers](https://github.com/sebastien-chami/career-ops/blob/main/application-answers.mjs): `application-answers.mjs`

### User Interfaces

- [Web Experience](https://github.com/sebastien-chami/career-ops/tree/main/web/src/app): `web/src/app`
- [Terminal Dashboard](https://github.com/sebastien-chami/career-ops/blob/main/dashboard/main.go): `dashboard/main.go`
- [CLI Flags](https://github.com/sebastien-chami/career-ops/blob/main/lib/cli-flags.mjs): `lib/cli-flags.mjs`

### Other components

- **Candidate**

## Connections

- Candidate → Job Intake: provides posting (evidence: `README.md`)
- Candidate → Web Experience: uses
- Candidate → Terminal Dashboard: uses
- Job Intake → Job Scanner: submits for scan
- Job Scanner → Board Providers: retrieves listings
- Board Providers → HTTP Utilities: fetches feeds (evidence: `providers/wp-job-manager.mjs`)
- Plugin Engine → Board Providers: extends sources
- Job Scanner → Fit Evaluation: evaluates fit (evidence: `README.md`)
- Fit Evaluation → Job Archive Checks: checks availability (evidence: `README.md`)
- Fit Evaluation → Pipeline Ranking: returns evaluation (evidence: `README.md`)
- Pipeline Ranking → Application Tracker: updates records (evidence: `rank-pipeline.mjs`)
- Application Tracker → Tracker Parsing: parses records (evidence: `tracker-utils.mjs`)
- Pipeline Ranking → Pipeline Lock: locks pipeline (evidence: `rank-pipeline.mjs`)
- Application Tracker → Workspace Paths: resolves paths (evidence: `tracker-utils.mjs`)
- Application Tracker → YAML Documents: loads YAML (evidence: `tracker-utils.mjs`)
- Application Tracker → Follow-up Cadence: tracks next steps (evidence: `README.md`)
- Application Tracker → Funnel Analytics: summarizes progress (evidence: `README.md`)
- Pipeline Ranking → CV Tailoring: selects role (evidence: `README.md`)
- CV Tailoring → CV Fact Checks: checks facts
- CV Tailoring → CV Generation: generates document (evidence: `README.md`)
- Pipeline Ranking → Application Preparation: prepares application (evidence: `README.md`)
- Application Preparation → Application Answers: drafts answers (evidence: `README.md`)
- Candidate → Application Preparation: submits manually (evidence: `README.md`)
- Job Scanner → Posting URL Keys: normalizes postings
- System Verification → Tracker Parsing: checks tracker (evidence: `verify-pipeline.mjs`)
- CLI Flags → Job Scanner: configures command
