Product North Star
The canonical product thesis, including the role of JobCache, AI and the open
strategic questions, is
architecture/PRODUCT-THESIS.md. This
page is the concise contributor contract.
CareerVector is a free, no-auth, collaborative job-search workspace. Its core surface is the job-market matrix: tracked opportunities plus facts, judgments, pipeline state, scores, notes, and application outputs.
It is not primarily a CV generator. CV/CL/PDF generation exists to support the workspace and the user's job search.
Non-Negotiables
- Free for users. No accounts, paywalls, sign-up, captcha, or feature gates.
- Link is identity. Sharing the workspace URL is the trust decision.
- Collaborators are peers. There is no helper/seeker role system inside a workspace.
- Browser UI, REST API, and MCP are all first-class. Agent workflows must not be degraded copies of human workflows.
- Cost discipline is survival. Push work to client/browser/free tiers whenever possible, and avoid duplicate LLM/scrape/provider calls.
- Monetization, when it exists, is buyer-side and must pass the trust test: the user should be comfortable being told what is collected and why.
CareerVector And Jobcache
CareerVector is the user-facing workspace and application workflow.
Jobcache is the corpus layer: a global body of ads and derived role facts. It exists to reduce repeated scrape/LLM cost, support RADAR/search, and eventually provide B2B data/API value.
The intended relationship is bidirectional:
- CV to jobcache: when a user adds or enriches a job URL, public ad/role facts can flow upward into the shared corpus.
- jobcache to CV: when a workspace renders or imports an ad, public facts can flow downward so the workspace does not re-scrape/re-extract what the corpus already knows.
Workspace-private data never flows up: evaluations, notes, CV/CL content, collaborator activity, tailored docs, and user corrections remain in the workspace layer unless explicitly anonymized/aggregated under a future policy.
Data Model
The final vocabulary is:
role hidden shared aggregate
ad source listing for one URL/posting
job workspace-local tracked item exposed to users/APIs
Workspace storage:
workspace.jobs[job_id] = { url, attributes }
Read order for an attribute:
workspace.jobs[job_id].attributes[attr]
?? ad.attributes[attr]
?? role.attributes[attr]
?? null
Each layer is sparse. Store a value only where that layer has something to say.
ad_id is derived from normalized URL. role_id may start equal to ad_id
until matching proves multiple ads describe the same role. The URL hash contract
is immutable once shipped.