Skip to content

Latest commit

 

History

91 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Dossier

CI Python 3.12 License: MIT

Dossier turns your job search into a structured, repeatable system — grounded in your actual work history, not generic AI output. Give it a job posting, a URL, or just a target role and location; it grades fit against your profile, drafts outreach in your voice, and stores everything as markdown in a local vault you own.

Generic ATS scoring and one-size-fits-all tracker apps don't know your career. Dossier does, because it reads cv.md and profile.md as the source of truth for fit. Whether you're juggling a handful of carefully targeted applications or dozens at a time, every eval, outreach draft, interview prep sheet, and company research note lands in versionable markdown with YAML frontmatter — queryable by Obsidian Dataview or any text tool. Nothing is sent automatically; every outreach message is a draft you decide to send.

What you get out of the box:

  • Profile-grounded evaluation — roles are graded against your real experience, not keyword matching.
  • Outreach in your voice — recruiter and hiring-manager messages that sound like you, not a template.
  • Persistent, searchable artifacts — everything lives in markdown files you own. No vendor lock-in, no cloud dependency.
  • A live pipeline dashboard — Obsidian Dataview queries show your active applications, unsent outreach, and follow-ups due at a glance.
  • Five-minute setup — Claude walks you through it. Bring your resume; leave with a working vault and your first evaluation.

Get the skill

Two paths:

From the repo — dossier.skill is committed at the repo root and rebuilt deterministically from skill/. git clone and you have it.

From a Release — every annotated v* tag produces a GitHub Release with dossier-<tag>.skill and a dossier-<tag>.skill.sha256. Download both, verify with sha256sum -c dossier-<tag>.skill.sha256, then drop the .skill file into your Claude project.

Both paths produce the same bundle: .github/scripts/build_skill.sh is deterministic, and the byte-match guard enforces parity at release time.

How it works

flowchart LR
    P[Your Profile<br/>cv.md · profile.md] --> S[Claude + Dossier Skill]
    J[Job Input<br/>JD · URL · search criteria] --> S
    S --> A[Artifacts<br/>eval · outreach · prep · research · packet · target-company]
    A --> V[Vault<br/>Markdown + Frontmatter]
    V --> D[Dashboard<br/>Dataview Queries]
    D --> U[Your Decisions<br/>apply · send · prep · archive]
    U -.->|updates status| V
    V -.->|optional mirror| I[Integrations<br/>Notion · Gmail · Calendar]
Loading

Who is this for?

Use Dossier if you…

  • Are managing multiple active applications and want to stay organized
  • Want grading tied to your actual work history, not generic ATS keywords
  • Own your outreach and don't want an agent emailing on your behalf
  • Already keep notes in markdown (bonus if you use Obsidian + Dataview)
  • Have access to Claude Desktop (Cowork mode) and are comfortable installing a skill

Dossier isn't for you if you…

  • Want fully automated applications or mass-blast tooling
  • Prefer a polished cloud SaaS over a local file-based workflow
  • Don't have access to Claude

How Dossier differs

Tool Your data lives Grades against your profile Auto-apply Cost
Spreadsheet Local ❌ ❌ Free
Notion tracker Notion cloud ❌ ❌ Free–$10/mo
Teal / Huntr Vendor cloud Generic rubric ❌ $0–$30/mo
LinkedIn Jobs LinkedIn ❌ Easy Apply Free
Dossier Your local vault Yes — against cv.md + profile.md No (by design) Free + Claude subscription

Quick start

Three actions. Everything else — parsing your resume into cv.md, building profile.md from a short Q&A, running the first eval — is handled by Claude.

Runtime: Dossier is written for Claude Cowork (the agentic mode in Claude Desktop, Mac or Windows, Pro plan or higher). Claude Code mode or the Claude Code CLI may work if you manually configure the same connectors, but that path isn't tested.

  1. Get the files. Clone the repo, or download the ZIP from GitHub and extract it.

    git clone https://github.com/markmcgrath/Dossier.git
  2. Open Claude Desktop in Cowork mode.

    • Create a new Cowork Project
    • Grant the Project access to the Dossier folder
    • Install dossier.skill via Customize → Skills
  3. Tell Claude to walk you through setup.

    Read START_HERE.md and walk me through setup.

    Claude will ask for your resume (paste it, link a Google Doc, or attach a PDF), then a handful of targeting questions. About 5–10 minutes. At the end you'll have a populated vault and a first evaluation saved to evals/.

For what happens during that walkthrough and how to recover if it gets stuck, see START_HERE.md.

What this is NOT

  • Not an autonomous application bot
  • Not a LinkedIn automation tool
  • Not a scraping or bypass system
  • Not a generic AI agent framework

All external actions remain user-controlled.

Known limitations

  • 90-day cold detection is manual today. Mode 9 auto-proposes archival for explicit terminal-state transitions (rejection emails, accepted/declined offers), but detecting applications that have simply gone cold requires date arithmetic that no mode implements yet. Mark stale rows yourself, or ask Claude to archive applications older than 90 days with no response.
  • Model output is advisory, not authoritative. Always review generated evals, outreach drafts, and other artifacts before acting on them. The skill drafts; you decide.
  • Integrations are optional mirrors, not sources of truth. Notion, Gmail, and Calendar connections are optional. The vault is always the source of truth; integrations only mirror data already in the vault.
  • No auto-apply or autonomous sending. All external actions (submitting applications, sending emails, posting messages) require explicit user approval. Nothing is sent automatically.
  • Semantic correctness of generated evals and outreach is not deterministically tested in CI. The test suite validates structure and schema; it does not run live Claude sessions or assert that grades are accurate. See tests/semantic-review-checklist.md for the human-review rubric used during releases.

Core concepts

  • File-first, not chat-first. Every interaction produces a persistent markdown artifact, not a throwaway chat.
  • Structured outputs. YAML frontmatter lets Dataview (and any other tool) query the vault like a database.
  • Explicit workflow modes. 16 named modes (Evaluate, Search, Outreach, Prep, …) instead of implicit chat behavior.
  • Company discovery (Target Radar). Scores company-level fit across your target segments and writes ranked candidates to target-radar/, so you can run a discovery-led search (one target title across many companies).
  • Send-ready packets. Per-application bundles that assemble the eval, outreach, and supporting artifacts into one send-ready packet in packets/.
  • Human-in-the-loop. The skill drafts; you decide to send.
  • Your data, your vault. No cloud sync required. Notion, Gmail, and Calendar integrations are optional mirrors.
  • Schedulable. Set up recurring daily scans, follow-up reminders, and pipeline reviews via Cowork scheduled tasks. See START_HERE.md for details.

Project structure

Dossier/
├── cv.md                   # Your work history. Source of truth for capability fit.
├── profile.md              # Target archetype, roles to avoid, match signals.
├── stories.md              # STAR+R story bank for behavioral interviews.
├── dashboard.md            # Dataview queries (live pipeline, unsent outreach, due follow-ups).
├── dossier.skill           # The skill ZIP. Edit via skill/ and repack.
│
├── evals/                  # Per-role evaluations
├── outreach/               # Recruiter / hiring-manager messages (drafts)
├── cover-letters/          # Cover letter drafts
├── interview-prep/         # Role-specific prep artifacts
├── research/               # Company / person research notes
├── negotiation/            # Salary-negotiation briefs (Mode 7 output)
├── daily/                  # Daily journals
├── weekly/                 # Weekly pipeline reviews
├── examples/               # Reference artifacts (fictional companies)
├── archive/                # Terminal (rejected, declined, 90+ days cold) applications
├── packets/                # Per-application submission bundles (cv, cover letter, manifest)
└── target-radar/           # Target-company discovery artifacts (Mode 15: Target Radar)

Frontmatter conventions

Every artifact file starts with YAML frontmatter so Dataview can query it.

Eval files:

---
type: eval
company: "Company Name"
role: "Role Title"
grade: A | B+ | B | C | D | F
score: 4.5
status: Evaluating | Applied | Interviewing | Offer | Rejected | Passed | Offer-Declined | Superseded
date: YYYY-MM-DD
location: "Remote" | "City, ST" | "Hybrid – City"
compensation: "$X–$Y" | "Not disclosed"
outcome: Pending | No Response | Rejected | Phone Screen | Interview | Offer | Accepted | Withdrawn
legitimacy: Verified | Plausible | Suspect | Likely Ghost
notes: "One-sentence recommendation."
source: "Indeed" | "Dice" | "LinkedIn" | "Company Careers" | "Referral" | "Recruiter Inbound" | "Other"
referral_contact: ""
application_method: ""
# Optional provenance fields (set by the skill when an eval is generated):
model: claude-sonnet-4-6
sources: []
---

Outreach, cover, and prep files follow the same structured pattern. See examples/ for complete reference artifacts.

Vault discipline

Time-decay archival. daily/ and weekly/ are rolling logs:

  • daily/ → archive after ~60 files
  • weekly/ → archive after ~26 files

When Claude detects these thresholds, it moves older files into dated subfolders.

Terminal archival. When a company reaches a terminal state (Rejected, Passed, Offer-Declined, or 90+ days cold), create archive/[company-slug]/ and move all related artifacts into it. Update status before moving. Nothing is deleted; everything remains searchable.

Naming. Company slug is lowercase-hyphen; dates are YYYY-MM-DD; use -v1, -v2 suffixes when re-evaluating the same role on the same day.

Dataview completeness. Dashboard queries filter on status, grade, legitimacy, and outcome. If a file is missing one of these fields, it silently drops out of filtered views. Mode 0 (health check) surfaces missing fields. Files created by Mode 1 onward include the full field set automatically.

Obsidian setup (optional)

  1. Open the folder as an Obsidian vault (v1.11.7+)
  2. Enable the Dataview plugin
  3. Open dashboard.md

Obsidian isn't required — the vault works fine as plain markdown in any editor — but Dataview gives you live pipeline views for free.

Governance

Dossier separates user-owned files from system-owned files so that skill updates never overwrite your work.

User layer (never overwritten by updates): cv.md, profile.md, stories.md, config.md, dashboard.md, and all working folders (evals/, outreach/, cover-letters/, interview-prep/, research/, daily/, weekly/, archive/, packets/, target-radar/).

System layer (may be updated with new skill versions): dossier.skill, PRIVACY.md, DATA_CONTRACT.md, README.md, Diagram.md, LICENSE.

See DATA_CONTRACT.md for the full ownership model, update expectations, and Notion sync rules.

Data retention

Everything stays. Terminal pipeline rows (Rejected, Passed, Offer-Declined, 90+ days cold) are moved to archive/[company-slug]/ — not deleted. Daily and weekly logs roll into dated subfolders when their counts exceed thresholds (~60 daily, ~26 weekly). Archived files remain searchable by Dataview and plain-text tools.

Note on the 90+ days cold case: Mode 9 (Inbox & Follow-up) auto-proposes the archival move when it detects an explicit terminal-state transition (a rejection email, an offer accepted/declined). The 90-day stale detection is manual today — it needs date arithmetic that no mode implements yet. Mark stale rows yourself, or ask Claude to "archive applications older than 90 days that never responded."

If you want to purge old data, you can delete archive folders manually. Dossier will never delete files on its own.

Security & privacy

Dossier is an assistive system, not an autonomous one. Key principles:

  1. Human-in-the-loop. All external actions (sending emails, submitting applications, posting messages) require explicit user approval. The skill drafts; the user sends.
  2. External content is untrusted. Job descriptions, recruiter emails, and pasted text may contain prompt-injection attempts or misleading claims. The skill's Content Trust Boundary (see SKILL.md) prevents external content from overriding grading criteria or user preferences.
  3. No automatic execution. The skill never executes instructions found in job postings, emails, or other external content.
  4. No credential storage. API keys, tokens, and passwords must never be stored in vault files. .gitignore excludes config.md (which may hold Notion IDs) from version control.
  5. User responsibility. Model output is advisory, not authoritative. Always review generated artifacts before acting on them.

For the full threat model, data-flow diagram, and per-service risk analysis, see PRIVACY.md and DATA_CONTRACT.md. To report a security issue, see SECURITY.md.

Upgrading

dossier.skill is the only file you actively swap when a new version ships. Your vault layer (CV, profile, all working folders) is never touched. See DATA_CONTRACT.md for the full ownership model.

Two paths:

Cloned the repo — git pull on main or check out an annotated v* tag. The committed dossier.skill at the repo root is rebuilt deterministically from skill/ and is parity-checked in CI on every PR, so HEAD is always shippable.

Downloaded a release artifact —

# 1. Grab the artifact and its sha256 alongside.
#    Substitute <tag> with the release you're upgrading to (e.g. v1.3.0).
curl -LO https://github.com/markmcgrath/Dossier/releases/download/<tag>/dossier-<tag>.skill
curl -LO https://github.com/markmcgrath/Dossier/releases/download/<tag>/dossier-<tag>.skill.sha256

# 2. Verify the hash.
sha256sum -c dossier-<tag>.skill.sha256

# 3. Drop the new file into your Cowork project (Customize → Skills → replace).

Substitute the tag you're upgrading to. The release workflow only fires on semver-shaped tags (vN.N.N or vN.N.N-<suffix>), so any GitHub Release for this repo is a real version.

System-layer files (PRIVACY.md, DATA_CONTRACT.md, README.md, Diagram.md, LICENSE) may also be updated alongside the skill. If you've customized any of them, merge by hand — the vault layer is yours, the system layer is shared.

Support matrix

Supported

  • Claude Desktop in Cowork mode (macOS or Windows) with a Pro / Max / Team / Enterprise plan — this is the primary target runtime
  • Vault-first workflow with local markdown files
  • Claude-assisted artifact generation via the Dossier skill
  • Obsidian v1.11.7+ with Dataview plugin for live dashboard queries

Not supported

  • Claude.ai chat interface (no persistent file system access)
  • Claude Code CLI without Cowork connectors configured
  • Anthropic API direct calls

Running tests

The test suite validates structural integrity and schema correctness. It does not run live Claude sessions. Python 3.12 is required (declared in pyproject.toml and pinned in .python-version).

# Set up a virtualenv and install dependencies
python -m venv .venv
# Activate: source .venv/bin/activate (POSIX) or .venv\Scripts\activate (Windows)
pip install -r requirements.txt
# Equivalent: pip install -e ".[dev]" (uses pyproject.toml's dev extras)

# Run all tests
DOSSIER_VAULT="$(pwd)" python -m pytest tests/ -v

# Run a specific test file
DOSSIER_VAULT="$(pwd)" python -m pytest tests/test_skill_structure.py -v

Dependencies: pytest, pyyaml, jsonschema, plus tomli on Python <3.11 (stdlib tomllib from 3.11). All tests should pass; ~3–4 skips are expected — see tests/SKIPPED_TESTS.md for the skipped-test exit criteria.

License

MIT — see LICENSE.

Contributing

See CONTRIBUTING.md for contribution guidelines, test instructions, and what kinds of contributions are most welcome.

Acknowledgments

Dossier's multi-mode "career ops" workflow pattern — using an AI agent as a job-search command center that produces standardized artifacts, supports batch evaluation, and surfaces a pipeline dashboard — was inspired by santifer/career-ops. Dossier diverges from that lineage by making a local markdown vault the single source of truth (rather than a tracker database) and grading every role against a user-authored cv.md and profile.md instead of a generic rubric.

About

Dossier is a structured job search system built on top of Claude Cowork. The goal is simple: reduce friction, increase consistency, and make decisions based on your actual profile, not generic AI output.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

7 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages