# farzamhejazik/claude-linkedin-assistant architecture

> Architecture diagram of the GitHub repository farzamhejazik/claude-linkedin-assistant, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-06-16). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/farzamhejazik/claude-linkedin-assistant
- Repository: https://github.com/farzamhejazik/claude-linkedin-assistant

## Overview

1. This repo is a **Claude Code command pack** for job search automation, not a conventional app. The architecture is centered on **slash commands in `.claude/commands/`** that Claude Code loads and executes inside the desktop client.

2. The main orchestration boundary is the **`/jobs` command family**. `jobs.md` is the entry point, while the subcommands in `.claude/commands/jobs/` split the workflow into setup, discovery, tracking, outreach, daily orchestration, and Indeed-specific setup.

3. The system has a very small state model built around **local files**. The primary sources of truth are:
   - `resumes/` for user identity, target roles, skills, and pitch material
   - `job_tracker.csv` for all job records and status
   - optional `resumes/search_profile.md` for preference filtering
   - `outreach/*.md` for per-company outreach logs

4. The **job tracker CSV is the central operational datastore**. It holds job metadata, status transitions, referral flags, deadlines, and URLs. The README explicitly says status updates are edited directly in the spreadsheet/CSV rather than through a separate app layer.

5. The **resume folder is an input analysis layer**. Claude reads all resume variants to infer the user’s name, target roles, skills, and outreach pitch. This drives both platform verification and job matching, so the resume content affects multiple downstream flows.

6. The **search profile is an optional policy layer** that narrows discovery. It adds user preferences such as remote-only, salary floor, or deal-breakers. This is read fresh by `/jobs find`, so it acts as a lightweight config file rather than a persistent settings system.

7. The repo depends on **Claude in Chrome + the Claude Code desktop app** as the execution runtime. Claude Code handles the commands, while the Chrome extension is the browser automation bridge. That browser bridge is essential because LinkedIn and Indeed interactions happen through real browser sessions, not APIs.

8. The external service boundary is primarily **LinkedIn**, with **Indeed** as optional discovery support and **web search** as an additional source for finding roles. LinkedIn automation is intentionally limited to safe, repetitive actions: search, profile inspection, connection requests, and first-message drafts/sends.

9. The **daily flow is the top-level pipeline**. `/jobs daily` coordinates setup checks, dashboard review, job discovery, manual add capture, outreach for companies needing referrals, and a final git commit. This makes the repo’s operational shape “check → find → add → outreach → commit.”

10. There is a strong **human-in-the-loop boundary**. Claude is allowed to do repetitive work and update the tracker, but replies, application submission, file uploads, and other judgment-heavy or fragile actions stay manual. The architecture is deliberately conservative to reduce risk with LinkedIn limits and account safety.

11. Privacy is handled by **local-only artifacts and gitignore boundaries**. Resumes and outreach logs are excluded from version control by default, while the committed `resumes/README.md` and the tracker template document expected local structure.

12. In diagram terms, this repo is best modeled as: **Claude Code commands** at the center, **local filesystem state** on one side, and **browser-driven external services** on the other side, with `job_tracker.csv` as the main shared data store and `/jobs daily` as the orchestration entrypoint.

Main entry points: [`.claude/commands/jobs.md`](https://github.com/farzamhejazik/claude-linkedin-assistant/blob/main/.claude/commands/jobs.md) (Jobs entry), [`.claude/commands/jobs/find.md`](https://github.com/farzamhejazik/claude-linkedin-assistant/blob/main/.claude/commands/jobs/find.md) (Find), [`.claude/commands/jobs/daily.md`](https://github.com/farzamhejazik/claude-linkedin-assistant/blob/main/.claude/commands/jobs/daily.md) (Daily flow), [`.claude/commands/jobs/outreach.md`](https://github.com/farzamhejazik/claude-linkedin-assistant/blob/main/.claude/commands/jobs/outreach.md) (Outreach)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_commands["Claude commands"]
  node_jobs_entry["Jobs entry<br/>slash command<br/>[jobs.md]"]
  node_jobs_shared["Shared rules<br/>command helpers<br/>[_shared.md]"]
  node_jobs_setup["Setup<br/>slash command<br/>[setup.md]"]
  node_jobs_check["Check<br/>slash command<br/>[check.md]"]
  node_jobs_find["Find<br/>slash command<br/>[find.md]"]
  node_jobs_add["Add<br/>slash command<br/>[add.md]"]
  node_jobs_outreach["Outreach<br/>slash command<br/>[outreach.md]"]
  node_jobs_daily["Daily flow<br/>orchestrator<br/>[daily.md]"]
  node_jobs_indeed_setup["Indeed setup<br/>setup command<br/>[indeed-setup.md]"]
end

subgraph group_state["Local state"]
  node_tracker_csv[("Job tracker<br/>operational datastore<br/>[job_tracker.csv]")]
  node_resumes_dir["Resumes<br/>analysis inputs"]
  node_search_profile["Search profile<br/>preference policy"]
  node_outreach_dir["Outreach logs<br/>company notes"]
end

subgraph group_runtime["Runtime"]
  node_claude_code["Claude Code<br/>runtime<br/>[CLAUDE.md]"]
  node_chrome_bridge["Chrome bridge<br/>browser bridge"]
  node_human_review(("Manual steps<br/>human gate"))
end

subgraph group_services["External services"]
  node_linkedin{{"LinkedIn<br/>job platform"}}
  node_indeed{{"Indeed<br/>job platform"}}
  node_web_search{{"Web search<br/>discovery source"}}
  node_git{{"Git commit<br/>version control"}}
end

node_claude_code -->|"loads"| node_jobs_entry
node_jobs_entry -->|"inherits"| node_jobs_shared
node_jobs_entry -->|"routes"| node_jobs_setup
node_jobs_entry -->|"routes"| node_jobs_check
node_jobs_entry -->|"routes"| node_jobs_find
node_jobs_entry -->|"routes"| node_jobs_add
node_jobs_entry -->|"routes"| node_jobs_outreach
node_jobs_entry -->|"routes"| node_jobs_daily
node_jobs_entry -->|"routes"| node_jobs_indeed_setup
node_jobs_daily -->|"runs first"| node_jobs_check
node_jobs_daily -->|"continues to"| node_jobs_find
node_jobs_daily -->|"captures"| node_jobs_add
node_jobs_daily -->|"finishes with"| node_jobs_outreach
node_jobs_daily -->|"commits"| node_git
node_jobs_setup -->|"reads"| node_resumes_dir
node_jobs_setup -->|"initializes"| node_tracker_csv
node_jobs_check -->|"reads"| node_tracker_csv
node_jobs_find -->|"analyzes"| node_resumes_dir
node_jobs_find -->|"filters by"| node_search_profile
node_jobs_find -->|"searches"| node_linkedin
node_jobs_find -->|"supplements"| node_web_search
node_jobs_find -->|"optionally searches"| node_indeed
node_jobs_add -->|"writes"| node_tracker_csv
node_jobs_outreach -->|"reads/updates"| node_tracker_csv
node_jobs_outreach -->|"logs"| node_outreach_dir
node_jobs_outreach -->|"messages"| node_linkedin
node_jobs_indeed_setup -->|"prepares"| node_indeed
node_claude_code -->|"drives"| node_chrome_bridge
node_chrome_bridge -->|"opens"| node_linkedin
node_chrome_bridge -->|"opens"| node_indeed
node_human_review -.->|"handles edge cases"| node_linkedin
node_human_review -.->|"manual edits"| node_tracker_csv

click node_claude_code "https://github.com/farzamhejazik/claude-linkedin-assistant/blob/main/CLAUDE.md"
click node_jobs_entry "https://github.com/farzamhejazik/claude-linkedin-assistant/blob/main/.claude/commands/jobs.md"
click node_jobs_shared "https://github.com/farzamhejazik/claude-linkedin-assistant/blob/main/.claude/commands/jobs/_shared.md"
click node_jobs_setup "https://github.com/farzamhejazik/claude-linkedin-assistant/blob/main/.claude/commands/jobs/setup.md"
click node_jobs_check "https://github.com/farzamhejazik/claude-linkedin-assistant/blob/main/.claude/commands/jobs/check.md"
click node_jobs_find "https://github.com/farzamhejazik/claude-linkedin-assistant/blob/main/.claude/commands/jobs/find.md"
click node_jobs_add "https://github.com/farzamhejazik/claude-linkedin-assistant/blob/main/.claude/commands/jobs/add.md"
click node_jobs_outreach "https://github.com/farzamhejazik/claude-linkedin-assistant/blob/main/.claude/commands/jobs/outreach.md"
click node_jobs_daily "https://github.com/farzamhejazik/claude-linkedin-assistant/blob/main/.claude/commands/jobs/daily.md"
click node_jobs_indeed_setup "https://github.com/farzamhejazik/claude-linkedin-assistant/blob/main/.claude/commands/jobs/indeed-setup.md"
click node_tracker_csv "https://github.com/farzamhejazik/claude-linkedin-assistant/blob/main/job_tracker.csv"
click node_resumes_dir "https://github.com/farzamhejazik/claude-linkedin-assistant/tree/main/resumes"
click node_outreach_dir "https://github.com/farzamhejazik/claude-linkedin-assistant/tree/main/outreach"

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_jobs_entry,node_jobs_shared,node_jobs_setup,node_jobs_check,node_jobs_find,node_jobs_add,node_jobs_outreach,node_jobs_daily,node_jobs_indeed_setup toneBlue
class node_tracker_csv,node_resumes_dir,node_search_profile,node_outreach_dir toneAmber
class node_claude_code,node_chrome_bridge,node_human_review toneMint
class node_linkedin,node_indeed,node_web_search,node_git toneRose
```

## Components

### Claude commands

Slash commands loaded by Claude Code in the desktop client.

- [Jobs entry](https://github.com/farzamhejazik/claude-linkedin-assistant/blob/main/.claude/commands/jobs.md): slash command · Top-level /jobs command family entrypoint. · `.claude/commands/jobs.md`
- [Shared rules](https://github.com/farzamhejazik/claude-linkedin-assistant/blob/main/.claude/commands/jobs/_shared.md): command helpers · Common instructions and reusable behavior for the jobs command family. · `.claude/commands/jobs/_shared.md`
- [Setup](https://github.com/farzamhejazik/claude-linkedin-assistant/blob/main/.claude/commands/jobs/setup.md): slash command · Initializes the workflow and validates required local inputs. · `.claude/commands/jobs/setup.md`
- [Check](https://github.com/farzamhejazik/claude-linkedin-assistant/blob/main/.claude/commands/jobs/check.md): slash command · Reviews the current dashboard and tracker state before other actions. · `.claude/commands/jobs/check.md`
- [Find](https://github.com/farzamhejazik/claude-linkedin-assistant/blob/main/.claude/commands/jobs/find.md): slash command · Discovers new roles from LinkedIn, web search, and optional preferences. · `.claude/commands/jobs/find.md`
- [Add](https://github.com/farzamhejazik/claude-linkedin-assistant/blob/main/.claude/commands/jobs/add.md): slash command · Captures manually discovered jobs into the tracker. · `.claude/commands/jobs/add.md`
- [Outreach](https://github.com/farzamhejazik/claude-linkedin-assistant/blob/main/.claude/commands/jobs/outreach.md): slash command · Prepares or sends referral and first-message outreach for target companies. · `.claude/commands/jobs/outreach.md`
- [Daily flow](https://github.com/farzamhejazik/claude-linkedin-assistant/blob/main/.claude/commands/jobs/daily.md): orchestrator · End-to-end daily pipeline that sequences check, discovery, capture, outreach, and commit. · `.claude/commands/jobs/daily.md`
- [Indeed setup](https://github.com/farzamhejazik/claude-linkedin-assistant/blob/main/.claude/commands/jobs/indeed-setup.md): setup command · Configures Indeed-specific discovery behavior and account readiness. · `.claude/commands/jobs/indeed-setup.md`

### Local state

Repository files that act as working memory and operational data.

- [Job tracker](https://github.com/farzamhejazik/claude-linkedin-assistant/blob/main/job_tracker.csv): operational datastore · Central CSV ledger for jobs, statuses, deadlines, referral flags, and URLs. · `job_tracker.csv`
- [Resumes](https://github.com/farzamhejazik/claude-linkedin-assistant/tree/main/resumes): analysis inputs · Resume variants used to infer identity, roles, skills, and pitch material. · `resumes`
- **Search profile**: preference policy · Optional filtering policy for remote, salary, and deal-breaker preferences.
- [Outreach logs](https://github.com/farzamhejazik/claude-linkedin-assistant/tree/main/outreach): company notes · Per-company outreach history and referral tracking notes. · `outreach`

### Runtime

Claude Code plus the browser bridge and human-in-the-loop boundary.

- [Claude Code](https://github.com/farzamhejazik/claude-linkedin-assistant/blob/main/CLAUDE.md): runtime · Executes slash commands and coordinates the workflow inside the desktop app. · `CLAUDE.md`
- **Chrome bridge**: browser bridge · Browser automation layer used to interact with sites in real sessions.
- **Manual steps**: human gate · Actions that stay manual for safety or reliability, such as replies, uploads, and submissions.

### External services

Browser-reached systems used for search and outreach.

- **LinkedIn**: job platform · Primary external source for search, profile review, connections, and outreach drafts.
- **Indeed**: job platform · Optional secondary source for discovery and setup.
- **Web search**: discovery source · Supplemental source for finding roles outside the main platforms.
- **Git commit**: version control · Final persistence step for daily workflow changes.

## Connections

- Claude Code → Jobs entry: loads · Claude Code loads the slash command family.
- Jobs entry → Shared rules: inherits · The entry command relies on shared jobs guidance.
- Jobs entry → Setup: routes · Dispatches into setup behavior.
- Jobs entry → Check: routes · Dispatches into tracking review.
- Jobs entry → Find: routes · Dispatches into job discovery.
- Jobs entry → Add: routes · Dispatches into manual capture.
- Jobs entry → Outreach: routes · Dispatches into outreach work.
- Jobs entry → Daily flow: routes · Dispatches into the full daily orchestration.
- Jobs entry → Indeed setup: routes · Dispatches into Indeed-specific setup.
- Daily flow → Check: runs first · Daily flow begins with a status check.
- Daily flow → Find: continues to · Daily flow performs discovery next.
- Daily flow → Add: captures · Daily flow records manually found jobs.
- Daily flow → Outreach: finishes with · Daily flow handles outreach for referral targets.
- Daily flow → Git commit: commits · Daily flow ends with a repository commit.
- Setup → Resumes: reads · Setup verifies the resume inputs.
- Setup → Job tracker: initializes · Setup ensures the tracker exists and is ready.
- Check → Job tracker: reads · Check reviews the central job ledger.
- Find → Resumes: analyzes · Find uses resume content to infer fit and pitch.
- Find → Search profile: filters by · Find applies optional preference constraints.
- Find → LinkedIn: searches · Find uses LinkedIn as the main discovery source.
- Find → Web search: supplements · Find can supplement discovery with web search.
- Find → Indeed: optionally searches · Find can use Indeed when configured.
- Add → Job tracker: writes · Add appends or updates tracker entries.
- Outreach → Job tracker: reads/updates · Outreach consults the tracker and records status changes.
- Outreach → Outreach logs: logs · Outreach writes per-company notes and messages.
- Outreach → LinkedIn: messages · Outreach interacts with LinkedIn for connection and first-message workflows.
- Indeed setup → Indeed: prepares · Indeed setup readies the secondary platform.
- Claude Code → Chrome bridge: drives · Claude Code uses the browser bridge for site interaction.
- Chrome bridge → LinkedIn: opens · Browser automation reaches LinkedIn sessions.
- Chrome bridge → Indeed: opens · Browser automation reaches Indeed sessions.
- Manual steps → LinkedIn: handles edge cases · Human intervention covers fragile or judgment-heavy browser actions.
- Manual steps → Job tracker: manual edits · People may update the tracker directly when needed.
