About UW Compass

A CSS 382 (Intro to AI) project that helps UW students find the right campus resource by describing their situation in plain language.

Overview & motivation

UW has more support services than most students know about — tutoring, counseling, food security, transportation, study spaces, career help, financial aid. The problem isn't availability; it's fragmentation. Each office runs its own site, its own intake form, its own vocabulary. A student in trouble usually knows what's going wrong ("I'm overwhelmed and behind in math"), not which office to email.

UW Compass closes that gap. You type your situation in your own words. The app extracts the underlying needs, matches them against a curated set of 46 official UW resources, and gives you ranked recommendations with a short action plan.

UW community impact

The students hit hardest by resource fragmentation are usually the ones with the least time to navigate it: first-year students, transfer students, commuters, and students juggling academic, financial, and wellness pressure at once. UW Compass benefits them by:

  • reducing the time students spend searching for help;
  • making existing UW services easier to discover;
  • letting students describe needs in plain language instead of office names;
  • providing short summaries and direct next-step recommendations;
  • supporting students who are overwhelmed and need a clearer path to action.

UW Compass does not replace official UW resources. Every recommendation links out to the corresponding UW office or page. It's a routing layer, not a service of its own. For emergencies, students are pointed at SafeCampus and the Husky HelpLine (24/7).

Architecture

One Next.js application. The frontend is a client-side React form; the backend is a set of API routes running on Node. The curated resource set and its precomputed embeddings live in the deploy bundle as a JSON file. Anonymously shared queries and feedback votes are stored in Supabase (Postgres) and accessed via the gallery and feedback API routes.

Browser (Client)
POST /api/recommend { input, campus, two_pass?, use_ai_ranker?, … }
app/api/recommend/route.ts
Parallel Processing
lib/ai.ts
OpenAI text-embedding-3-small
(input embedding)
lib/ai.ts
OpenAI gpt-4o-mini + tool
(need extraction)
Wait
Ranking
lib/db.ts
data/resources.embedded.json
(precomputed embeddings)
lib/recommend.ts
Cosine + Tags + Diversify
optional: AI re-rank via GPT-4o-mini
lib/ai.ts
OpenAI gpt-4o-mini + tool
(per-resource why + next steps)
{ needs, recommendations[5], next_steps[2-4] } → iCal download
Browser (UI Render)

Supabase (Postgres) — gallery & feedback

GET /api/gallery
gallery_queries
10 most recent shared queries → chips shown on page load
POST /api/feedback
feedback
one row per helpful / not-helpful vote

Note: Three OpenAI calls per request: 1 embedding + 2 chat completions. The first two run in parallel. Optional two_pass and use_ai_ranker flags add 1–2 extra calls. Resource embeddings are computed once at seed time, never per request. Supabase writes (gallery, feedback) are fire-and-forget and do not block the response. A GitHub Actions CI workflow runs typecheck, lint, tests, and a full build on every push and PR.

Tech stack

  • FrontendNext.js 16 (App Router), React 18, Tailwind CSS
  • APINext.js Route Handlers (Node runtime)
  • EmbeddingsOpenAI text-embedding-3-small (1536 dim)
  • Need extractionOpenAI gpt-4o-mini + function calling (Zod-typed)
  • StorageResources: static JSON in deploy bundle · Gallery & feedback: Supabase (Postgres)
  • TestingVitest — 83 tests across 7 files (ranker, schema, scenarios, i18n, iCal, rate limiter, campus filter)
  • HostingVercel (frontend + serverless API)
  • QualityGitHub Actions CI on every push & PR; weekly automated link-health check

How the AI works

1Need extraction

The student's free-text input is sent to GPT-4o-mini with a typed tool definition. The model must return structured needs — each one with a category, an intensity (1–5), the supporting evidence from the input, fine-grained tags (snake_case), and an urgent boolean for safety-critical situations. No free-form JSON, no parsing fragility.

2Semantic retrieval

The same input is also embedded into a 1536-dimensional vector. Every resource has a precomputed embedding (name + category + description + tags). We compute cosine similarity between the input and every resource — fast because we only have 46 resources, no vector database needed.

3Multi-signal ranking

The final score combines four signals:

  • 0.50 × Semantic matchNormalized cosine similarity
  • 0.25 × Category matchDoes the category match an extracted need?
  • 0.15 × Tag overlapShare of extracted tags present in resource
  • 0.10 × Urgency boostStudent is urgent AND resource is urgent

After scoring, the top 5 are picked with category diversification (max 2 from any one category) so a student with multiple needs doesn't get a homogeneous result list.

4Per-resource explanations + next steps

The top 5 resources plus the extracted needs go back to GPT-4o-mini (again with a typed tool) which produces a 1–2 sentence explanation per resource and a 2–4 step ordered action plan referencing the student's words.

5Advanced options: two-pass critique, AI re-rank & iCal export

Three optional flags extend the core pipeline. two_pass sends a second GPT-4o-mini call right after need extraction — the model reviews its own output to catch false-urgent flags and missed categories. use_ai_ranker replaces the cosine ranker with an LLM pass that reads the full need list and selects the best-fitting resources directly (useful for comparing against the classical ranker). Once results arrive, the generated action plan can be downloaded as a standards-compliant .ics calendar file, scheduling each step automatically in any calendar app.

User guide

  1. Go to the home page.
  2. Describe what's going on in your own words. Be honest about what's hard — "I'm stressed and behind in math" works better than "I need tutoring."
  3. Click Find resources. The first request takes ~3–5 seconds (three OpenAI calls).
  4. Read the What we heard section first — that's the AI's interpretation. If it's off, rephrase and try again.
  5. Click any recommendation to go to the official UW page. The Your next steps list is the recommended order to act on them.
This isn't a crisis service.

For emergencies call 911. For mental-health support call the Husky HelpLine (24/7). For safety concerns contact SafeCampus.

Categories we cover

  • Tutoring & Academic Support
  • Wellness & Counseling
  • Food & Basic Needs
  • Transportation & Commuter
  • Study Spaces
  • Career & Campus Jobs
  • Financial Support

Built by

CSS 382 — Introduction to AI · Spring 2026 · A two-person DYOP team. Source code on GitHub.