Your AI-powered opportunity navigator.
Full-stack implementation: Nuxt 3 frontend, FastAPI backend, Supabase (Postgres + pgvector + Auth) for data and auth, Groq for LLM reasoning, and a local fastembed model for semantic-search embeddings.
smartopportunities/
├── backend/ FastAPI app, Supabase schema, seed data
└── frontend/ Nuxt 3 app
- Create a project at supabase.com.
- Open SQL Editor and run
backend/supabase/schema.sql— this creates every table, enables Row Level Security, and installs pgvector plus thematch_opportunitiessemantic-search function. - In Authentication → Providers, enable Email, and optionally Google OAuth.
- Grab your keys from Project Settings → API:
Project URL→SUPABASE_URLanon publickey →SUPABASE_ANON_KEY(frontend uses this too)service_rolekey →SUPABASE_SERVICE_ROLE_KEY(backend only — never expose this to the frontend)- Project Settings → API → JWT Settings →
JWT Secret→SUPABASE_JWT_SECRET
cd backend
python -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
cp .env.example .env # fill in your Supabase + Groq keysGet a free Groq API key at console.groq.com → GROQ_API_KEY.
Seed the opportunity knowledge base (curated starter dataset, embedded locally):
python -m scripts.seed_opportunitiesRun the API:
uvicorn app.main:app --reload --port 8000Docs at http://localhost:8000/docs.
cd frontend
npm install
cp .env.example .env # fill in NUXT_PUBLIC_API_BASE + your Supabase URL/anon key
npm run devApp at http://localhost:8000/.
- Profile → Opportunity DNA (
POST /profile): Groq reads the raw profile and returns a structured summary — strengths, weaknesses, career interests, and recommended categories. Stored as JSON on theprofilesrow. - Opportunity embeddings: every opportunity is embedded locally (fastembed,
bge-small-en-v1.5, 384-dim) and stored in avector(384)pgvector column. - Matching (
POST /recommend): the user's profile is embedded, pgvector's cosine-distance operator (via thematch_opportunitiesRPC) pulls the top ~20 candidates, and Groq re-ranks/explains the top 5 with a match score, a plain-English reason, a missing skill (if any), and a concrete next step. - Roadmap (
POST /roadmap): Groq turns a stated goal into a month-by-month plan, optionally informed by the user's profile. - Career Coach (
POST /career-coach): Groq generates CV notes, a cover-letter draft, portfolio suggestions, skills to learn, interview tips, and a timeline — general, or targeted at one opportunity.
Per the original build plan: continuous web crawling, multi-agent workflows, social
features, messaging, company dashboards, a mobile app, a browser extension, complex
analytics, and payments. The seed dataset (20 real, well-known programs) stands in
for full-scale opportunity ingestion — a good next step is a scheduled scraper that
calls POST /opportunities for each new listing it finds (it embeds and indexes
automatically).
The frontend uses a "night navigator" visual theme — a dark chart-like background, a gold "signal/beacon" accent for primary actions, and a teal "charted route" accent for matches and progress — built around the idea of charting a course to an opportunity rather than just listing search results.
Hosted application is accessible at https://cityos-tau.vercel.app.