PivotPath AI: Project Story

Your career isn't ending. It's pivoting. Free tools, real paths, built for the people who need it most.


Inspiration

The starting point was a single line from Anthropic CEO Dario Amodei's essay, Machines of Loving Grace:

"I want to describe a world where powerful AI systems exist and are widely deployed... where all of this is accomplished through empowerment rather than replacement."

That word, empowerment, stuck. Because the uncomfortable truth about AI's economic impact is that it is not evenly distributed. The people losing work to automation are not, by and large, software engineers or knowledge workers with the capital to retrain. They are retail clerks, truck drivers, data entry operators, junior accountants: people for whom a $3,000 bootcamp is not a speed bump but a wall.

The World Economic Forum estimates that AI and automation will displace roughly 85 million jobs by 2025. Oxford's Martin School puts 47% of US occupations at high automation risk. And yet the market response to this crisis has been to build tools for people who are already doing fine.

We wanted to build for everyone else.


What We Built

PivotPath is a free, AI-powered career transition platform with two distinct tracks:

  • Professional Track: for workers facing displacement, focused on AI resilience, upskilling, and protecting income during a transition
  • Student Track: for students entering a workforce already shaped by AI, focused on building careers that grow with AI rather than against it

Users complete a short assessment, optionally upload a resume, and receive five personalised career paths ranked by:

  • Match score to existing skills
  • Automation risk (grounded in O*NET labour market data)
  • Realistic salary range
  • Time to job-readiness
  • Demand trend (growing / stable / declining)

Every path includes a month-by-month milestone plan with free courses, live job board links, and an AI coaching chat for follow-up questions.


How We Built It

Architecture

The application is a full-stack JavaScript project:

  • Frontend: React 18 with Recharts for data visualisation
  • Backend: Node.js + Express (ES Modules) serving the React build as static files
  • AI: Anthropic Claude (claude-sonnet-4-20250514) via the official SDK
  • Labour market data: O*NET Web Services REST API (Basic Auth)
  • Resume parsing: multer for uploads, pdf-parse for PDFs, mammoth for DOCX

Claude Integration

Claude is not a peripheral feature. It sits at the centre of every meaningful action in the app.

1. Resume and profile extraction When a user uploads a resume, Claude reads the raw text and returns structured JSON: current role, years of experience, skills list, education, and inferred strengths the user may not have thought to mention.

2. Stream-aware dual prompting Rather than a single generic system prompt, we wrote two detailed prompts (SYSTEM_PROMPT_PROFESSIONAL and SYSTEM_PROMPT_STUDENT), each with a different analytical lens. A getSystemPrompt(userType) function selects the correct one at request time. Both prompts append a shared RESPONSE_SCHEMA that enforces a strict JSON structure for the response.

3. O*NET-enriched path generation Before sending the user profile to Claude, the server queries the O*NET API for occupation data, wage statistics, and bright-outlook indicators. This real-world data is injected into the Claude prompt, so every salary range and demand trend is grounded rather than hallucinated.

Claude is instructed to return exactly five paths and target the upper range of realistic salaries, because we are not building a tool for pessimism.

4. AI coaching chat After results are delivered, users can ask follow-up questions. A key engineering decision here was context compression: rather than dumping the full results JSON (five paths, milestones, resources) into the system prompt (which consistently exceeded token limits and caused the endpoint to fail), we extract a compact summary object containing only the fields the coach actually needs. This reduced the system prompt size by roughly $60\text{--}70\%$ and made the chat endpoint reliable.

5. Interest and goal suggestions On the goals step of the assessment, Claude pre-generates personalised chip options (interestOptions[] and concernOptions[]) based on the user's background, so the form feels tailored rather than generic. Users can pick up to three chips per category:

$$|\text{selected}| \leq 3, \quad \text{selected} \subseteq \text{options}$$

O*NET Holland RIASEC Profiler

The app includes an embedded interest profiler based on the Holland RIASEC model. Users score themselves across six dimensions:

$$\text{RIASEC} = (R, I, A, S, E, C), \quad R, I, A, S, E, C \in [0, 10]$$

The top two codes (e.g. $\arg\max_2(\text{RIASEC})$) are fed back into Claude's path generation, adding a psychological fit dimension to the career recommendations alongside the skills and labour market data.

Automation Risk

Every career path includes an automation risk score. We display this honestly, even when the number is uncomfortable, because users deserve accurate information, not reassurance. The visual encoding is:

$$\text{risk colour} = \begin{cases} \text{green} & \text{if risk} \leq 30\% \ \text{amber} & \text{if } 30\% < \text{risk} \leq 60\% \ \text{red} & \text{if risk} > 60\% \end{cases}$$


Challenges We Faced

1. Token limits in the chat endpoint

The first version of /api/chat injected the full results object into the system prompt using JSON.stringify(context). With five paths, each containing milestones, resources, and rich metadata, the payload was enormous. Claude would consistently fail with a context overflow error, and the UI would surface the unhelpful message: "Sorry, I couldn't process that question. Please try again."

The fix was to build a compactContext object on the server, extracting only the fields the coaching conversation actually needs, before constructing the system prompt. This was a good reminder that what you send to the model matters as much as what you ask it.

2. Keeping labour market data honest

Early prompts asked Claude to generate salary ranges freely. The results were plausible-sounding but not grounded. We solved this by querying the O*NET API first and injecting the actual wage percentiles into the prompt, then instructing Claude to treat this data as a constraint rather than a suggestion. The difference in output quality was immediate.

3. Designing for two very different users

A professional who has worked in logistics for 15 years and a 20-year-old computer science student have almost nothing in common except the anxiety of an AI-transformed workforce. Getting the tone, framing, and recommendations right for both, without building two separate products, required careful prompt engineering. The dual system prompt architecture took several iterations to feel genuinely differentiated rather than superficially relabelled.

4. The ethics of career advice at scale

We spent real time on a question that most AI tools skip: what happens when our advice is wrong? A misguided career pivot is not a minor inconvenience for someone who has already been displaced. We built in explicit uncertainty: automation risk scores are presented as estimates, not facts; timelines are described as realistic targets, not guarantees; and the AI coach is positioned as a guide, not an authority. The whyAIResilient field on each career path explains specifically why human elements in that role resist automation, so users understand the reasoning rather than just trusting a number.


What We Learned

  • Context compression is a first-class engineering concern when building LLM-powered features. What you don't send matters as much as what you do.
  • Real data transforms trust. The moment we grounded salary ranges in O*NET statistics, the recommendations went from feeling like AI guesses to feeling like research.
  • Empowerment and replacement are design choices. Every feature decision in PivotPath (free always, no account required, honest risk scores, coach not oracle) was a deliberate choice to put agency in the user's hands.
  • The people most affected by AI are the least represented in AI product conversations. Building for them requires actively resisting the temptation to optimise for the users who are easiest to build for.

What's Next

  • Deploy: Live on Railway at a public URL, one environment variable (ANTHROPIC_API_KEY) away from running anywhere
  • Open source: github.com/G-I-Dev-P/pivotpath, contributions welcome
  • Near-term: Multilingual support, local job market data by city, resume builder aligned to chosen path
  • Vision: Community college API partnerships, employer-side matching, progress tracking and credential verification

Built at UVICHacks 2026 — Track 3: Economic Empowerment and Education Inspired by Dario Amodei's "Machines of Loving Grace"

Built With

  • bright-outlook
  • cors-middleware
  • create-react-app-(react-scripts-5)
  • css3-frameworks-&-libraries-react-18
  • express.js
  • github-(version-control-and-open-source)-other-dotenv-(environment-config)
  • html5
  • image
  • languages-javascript-(es2022-with-es-modules)
  • libreoffice-(pdf-conversion-for-the-deck-qa)
  • mammoth
  • multer
  • npm-cloud-&-deployment-railway-(backend-+-frontend-serving)
  • o*net-web-services-rest-api-(occupation-data
  • pdf-parse
  • pdftoppm
  • poppler
  • pptxgenjs-ai-&-apis-anthropic-claude-api-(claude-sonnet-4-20250514)
  • recharts
  • riasec-profiler)-runtime-&-tooling-node.js
  • wages
Share this project:

Updates