Portal Pair
Inspiration
Indiana proved smaller programs can win: ranked 72nd in talent, they won the College Football Playoff by finding players others overlooked. The problem? Recruiting sites like 247 Sports rely on high school ratings that never get updated after players develop. Coaches at smaller programs are left digging through stale data, trying to fill roster gaps with overlooked talent.
The transfer portal was supposed to level the field, but most tools are built for power programs. Coaches without massive analytics budgets want to know, in plain terms: "Who fits what I need, how much would they cost, and can they actually help my roster?" Portal Pair exists to answer exactly that question, in minutes instead of weeks: with opponent-adjusted stats, AI search, and budget-aware roster planning.
What it does
Portal Pair is a coach-first recruiting assistant for the transfer portal. A coach signs in with a .edu email, describes the player they need, and gets AI-powered matches with real impact and cost estimates.
It's built around decisions coaches actually make:
- Describe your need in plain language: "Fast RB from a smaller program, high yards per carry" or "highest passing yards QB"; the AI searches the player database and returns ranked matches instead of forcing manual filters.
- See the money, not just the stats: Set a roster budget and see per-player cost estimates (driven by player overalls, position, class). Budget bars show who fits in the team and who is not suitable for the team.
- Understand fit and upside: Each match shows overall (OVL) (current rating), potential (POT 2026 projection), and Pair Score (match %). Value score highlights cost vs fit.
- Track your board: "My Players" lets coaches bookmark prospects, add notes, and view a roster budget bar across everyone on their list.
- Drill into stats: Player profiles show seasonal trends and 2026 forecasts by position, plus bios (height, weight, hometown, etc.).
- Sort for the best: The coaches can see the top 100 rankings to see who's trending.
The outcome isn't just a search box; it's a coach-ready answer to "Who should I target, and can I afford them?"
How we built it
Backend (Node.js / Express): Handles auth, bookmarks, and API proxying. Spawns Python scripts for ChromaDB and AI workloads. Proxy env vars cleared when running coach chat to avoid 403s when loading sentence-transformers.
Vector store (ChromaDB + Python): FBS roster and usage data from College Football Data API (2020–2025), stored in ChromaDB. Supports semantic search and lookups by doc_id or athlete_id+team+season.
Coach AI (Cerebras + RAG): Coach queries are parsed for position, stat ranking (e.g. "highest rushing yards"), and physical constraints (weight, height). Stat-heavy queries fetch ranked players; semantic search runs over ChromaDB. Top matches are passed to Cerebras (llama3.1-8b) to generate concise recommendations. The system only suggests players that exist in the database, no hallucinated names.
Frontend (vanilla HTML/CSS/JS): Dashboard for search and chat, player cards with OVR/POT/VAL, budget bars, My Players with notes. Chart.js for seasonal stat and 2026 forecast charts on profile and stat-viewer pages.
Data pipeline (Python): pulls roster and usage from CFBD; expands each player into position-specific stats across seasons; embeds and loads data into ChromaDB.
Challenges we ran into
Node + ChromaDB integration
ChromaDB is Python-only. We orchestrated it by spawning Python scripts from Node, passing params via env vars, and parsing JSON from stdout. Kept the main server in Node while still using ChromaDB.Sentence-transformers behind proxies
Loading could fail with 403 when HTTP/HTTPS proxy env vars were set. We had to strip proxy vars before running coach chat so the model could load reliably.Semantic vs structured search
Queries like "highest passing yards" need ranking; "fast RB from smaller program" need semantic search. We added regex-based ranking detection so stat-heavy queries use ranked results and semantic search handles natural-language descriptions.Two bookmark layers
Server-side bookmarks (per-user, persistent) and client-side localStorage (for some flows) had to stay in sync. We normalized on a shared key and synced structure across both.
Accomplishments that we're proud of
End-to-end coach flow
A coach can go from describing a need to seeing AI matches, adding players to My Players, tracking cost and budget, and drilling into stats, all in one sitting, without calling a recruiting service.AI that only suggests real players
The coach chat pulls from ChromaDB and only recommends players with real stats and IDs, instead of inventing prospects.Filters that match how coaches talk
Position, weight, height, and stat rankings ("highest X") are parsed from natural language and applied correctly to both ranking and semantic search.Budget-aware recruiting
Roster budget and per-player cost estimates let coaches compare targets and plan before ever reaching out.
What we learned
Coaches care about fit and cost, not just raw ratings
A slightly lower-rated player who fits the scheme and budget often beats the "highest OVR" option.Hybrid search fits coach language
Stat-focused queries ("highest passing yards") want ranking; fit-focused queries ("fast RB, smaller program") want semantic search. Combining both in one interface covers both mental models.Trust comes from grounding in real data
The tool gains trust when it recommends actual players with real stats and teams, rather than generic "you might consider" answers.
What's next for Portal Pair
Deeper CFBD integration
Pull in more endpoints (portal status, injuries, eligibility) and keep data fresher.Stronger forecast modeling
Move from heuristic 2026 predictions to models that factor in usage, strength of schedule, and progression.Richer player context
Add portal status, eligibility, transfer history, and school-fit signals so coaches see more than raw stats.Coach-to-coach workflows
Share boards, export one-pagers for staff meetings, and generate materials for recruiting conversations.More data sources
Incorporate PFF or other grades where available to improve ratings and match quality.
Built With
- Node.js & Express – API server, auth, bookmarks, and Python script orchestration.
- ChromaDB – Vector store for player profiles and semantic search.
- sentence-transformers (all-MiniLM-L6-v2) – Embeddings for natural-language queries.
- Cerebras Cloud SDK – LLM for coach chat recommendations (llama3.1-8b).
- College Football Data API – Roster, usage, and stat data.
- Auth0 – Passwordless .edu email OTP for coach signup.
- Chart.js – Seasonal stat and 2026 forecast charts.
- Python – fetch_data, expand_seasons, vector_store, coach_chat, usage_history, get_player_profile.
Overview Link
https://docs.google.com/document/d/1lrvz1S68sRDLizq65bE1AAOLTAQOZawIPZScX107Mrw/edit?usp=sharing



Log in or sign up for Devpost to join the conversation.