Project Info
Elevator pitch SportsMom is the support team a self-managed athlete never had: a network of Fetch.ai agents that turns a voice note, a notebook photo, or a text dump into overtraining flags, performance trends, opponent scouting reports, sponsorship drafts, and fully-booked tournament trips all from a single ASI:One chat.
Inspiration
Pro athletes have a coach, a physio, a data analyst, an agent, and a travel manager. Everyone else has a notebook and a dream. Take tennis. Only about the top 150 players in the world break even financially, and even among the top junior prospects, barely a third ever turn a profit over an entire career. The other 99%, the kid grinding ITF W15s, the club runner, the amateur fighter, are self-funded and on their own. And the cruel part is that they're not short on data. They track training loads, match notes, and how the knee felt this morning. They're drowning in it. They just do almost nothing with it, because turning scattered notes into decisions is a full-time job nobody is paying them to do. So we wanted to give a solo athlete that entire backroom team as a swarm of agents. Not one chatbot pretending to be five experts, but five real specialists that each own their domain, talk to each other, and reach the athlete wherever they already are: a chat window. You dump. They handle the rest.
What it does
The athlete sends raw input: a voice note after practice, a photo of a handwritten notebook page, or typed text. From there, a team of seven uAgents takes over: Everything lands in Supabase and surfaces two ways at once: as ASI:One chat replies, and on a React "Aurora Glass" dashboard. The chat-only flow and the dashboard always show the same truth.
How we built it
Fetch.ai uAgents + Agentverse all seven agents run as mailbox agents on Agentverse, registered through the Almanac and reachable by a stable handle. Every one implements the Agent Chat Protocol, which is what makes the whole system usable from ASI:One with no custom frontend at all. Agent-to-agent orchestration the Logistics agent collaborates with two independently operated Flights and Hotels agents on the open marketplace, purely through natural language, across organizational boundaries. Anthropic Claude Haiku 4.5 for high-volume classification, Sonnet 4.6 for the specialists' reasoning and synthesis, and Claude vision for reading handwritten notebook photos. Deepgram nova-3 pre-recorded and live-streaming voice transcription. Browserbase + Stagehand natural-language browser automation for ITF tournament search and opponent scouting, with no hardcoded selectors. Redis (RedisVL + LangCache) KNN vector retrieval and semantic answer caching behind the RAG chat endpoint. Supabase (Postgres) system of record for every table. Stripe a real test-mode Checkout gate, implementing the Fetch.ai Payment Protocol on the tournament-entry flow. FastAPI + React 18 / Vite / Tailwind v4 the data layer and the dashboard.
Challenges we ran into
Making specialists collaborate without a god-agent. The Orchestrator had to fan a single log out to multiple specialists and correlate their replies into one coherent answer, instead of dumping five disconnected blobs on the athlete. Cross-org agent negotiation. Getting Logistics to plan a trip by talking to Flights and Hotels agents we don't own over natural language alone meant designing for ambiguity, timeouts, and partial answers rather than a clean API contract. A real payment gate, not a mock. Wiring a live Stripe test-mode Checkout into a multi-turn agent conversation (search → pick within a 10-minute window → pay → review) without ever auto-submitting an actual ITF entry. Graceful degradation everywhere. If Redis is down, retrieval falls back to recency. No Browserbase key? Scout/Logistics use whatever is already in Supabase. No Stripe key? The payment step is simply skipped. A demo should never go dark. Keeping two front-ends honest. The ASI:One chat flow and the React dashboard read the same data, so an insight generated in chat has to show up on the dashboard and vice versa with no drift.
Accomplishments we're proud of
A genuine multi-agent system seven specialists, not one prompt wearing five hats that runs end-to-end from a single ASI:One chat with zero custom frontend required. True agent-to-agent commerce: planning a real tournament trip by negotiating with independent third-party agents and closing it with a live payment. A multimodal front door: voice, handwritten photo, or text all collapse into the same clean pipeline. The whole thing fails soft every external dependency degrades gracefully instead of crashing the demo.
What we learned
Multi-agent systems live or die on the boundaries between agents, not the intelligence inside any one of them. The hard, interesting work was in routing, correlation, and negotiation — deciding who handles what, how partial answers get stitched together, and how agents that have never met cooperate over plain language. We also learned that the chat protocol is a genuine product surface: when an athlete can run the entire workflow from one conversation, the "app" almost disappears.
What's next
More sports beyond tennis: running, combat sports, and other self-managed individual disciplines. A proactive coach: agents that reach out before you ask, when the data crosses a line. Wearable ingestion (Whoop, Garmin, Apple Health) feeding Recovery and Performance directly. A real send-path for Sponsorship outreach, behind explicit human approval. Athlete-to-athlete agents: sparring-partner matching and shared-travel coordination across the marketplace. Shared Chat Link: https://asi1.ai/shared-chat/d678e3ed-5c6f-4326-887d-6dbb704c8099 Try our SportsMom agent here: https://asi1.ai/ai/agent1qg4n8h6w54c4uapkpa040gatncmdz2lqmswy2w9295unzlnjvm2yqevmg3y @agent1qg4n8h6w54c4u Others: sportsmom-orchestrator: main ASI:One coordinator, intent router, and demo entrypoint sportsmom-librarian: classifies raw voice, photo, and text dumps into dashboard sections sportsmom-recovery: flags overtraining, fatigue patterns, and injury risk with wellness-safe language sportsmom-performance: tracks win/loss trends, skill progression, and recommends training focus sportsmom-sponsorship: matches athletes to brand fits and drafts approval-gated outreach emails sportsmom-scout: researches opponents and generates tactical game plans via live web scraping sportsmom-logistics: finds flights, hotels, and ITF tournaments with calendar sync and a payment gate Built with fetch.ai · agentverse · uagents · asi:one · agent-chat-protocol · anthropic · claude · deepgram · browserbase · stagehand · redis · redisvl · supabase · postgres · stripe · fastapi · python · react · typescript · vite · tailwindcss · ocr
SportsMom
SportsMom: Multi-Agent Sports Analytics OS
SportsMom is a network of specialist uAgents that acts as the support team a self-managed individual-sport athlete (tennis first) doesn't have. The athlete dumps a voice note, a photo of a handwritten notebook page, or typed text, and the agent network transcribes it, classifies it, files it, and turns it into overtraining flags, performance trends, opponent scouting reports, sponsorship drafts, and fully researched tournament trips, all reachable through a single ASI:One chat session, with a React dashboard on top for the days you'd rather look than talk.
- Raw input (voice / photo / text) is normalized to plain text.
- The Librarian classifies and files it into structured journal entries.
- The Orchestrator routes intent to the right specialist agent(s).
- Specialists (Recovery, Performance, Scout, Sponsorship, Logistics) reason over the athlete's data and return insights or drafts.
- Outcomes land in Supabase and surface through the dashboard, ASI:One replies, and (for Logistics) a real Stripe-gated tournament-entry flow.
Agent roles and responsibilities
1) Orchestrator Agent
- The single ASI:One / Agentverse entry point for the whole system.
- Classifies every incoming message into one of three intents:
log,ask, oraction. log→ Librarian → fan-out to specialists → correlates results into one reply.ask→ routes to thePOST /chatRAG endpoint and relays the grounded answer.action→ routes straight to the named specialist (Recovery / Performance / Sponsorship / Logistics / Scout).- Falls back to inline Claude calls when no worker addresses are configured, so a demo never goes dark.
2) Librarian Agent
- The front door for every raw dump.
- Uses Claude Haiku 4.5 to split a dump into entries across nine sections: training, performance, match_results, recovery, coaching, logistics, sponsorship, goals, media_notes.
- Writes each entry to Supabase via
POST /entriesand notifies whichever specialists care about what just got filed. - Runs in two modes: standalone (replies directly over ASI:One) and orchestrator-driven (returns a
classify_resultenvelope).
3) Recovery Agent
- Pulls the last 60 journal entries plus 14 days of recovery logs, training sessions, and metrics.
- Asks Claude Sonnet 4.6 for a risk level (none / low / medium / high), affected body parts, a recommended action, and a behavioral pattern summary (e.g. a burnout arc).
- Suggests which agent to open next, surfaced as text rather than auto-dispatched.
- A 72-hour deduplication guard prevents duplicate alerts from the same passive sweep.
4) Performance Agent
- Reads the last 10 matches plus recent training sessions and 20 recent metrics.
- Returns a trend (improving / stable / declining), the athlete's strongest and weakest area, and a recommended focus.
- Triggers automatically whenever a match result, training log, or performance entry is filed.
- Output lands in the same
agent_outputstable the dashboard reads from.
5) Scout Agent
- Takes a match log or an opponent's name and sends Browserbase + Stagehand out to research them on the open web.
- Has Claude synthesize the research into patterns, strengths, weaknesses, and a tactical recommendation.
- Files the report as both a coaching journal entry and an
agent_outputscard. - Triggers automatically whenever a match result comes in.
6) Sponsorship Agent
- Reads the athlete's profile, recent matches, metrics, and media notes.
- Has Claude pick a brand fit and score it, then drafts a cold outreach email.
- Status always stays "drafted"; nothing sends itself. The frontend's draft → approve → send flow is the only path an email can actually leave through.
7) Logistics Agent
- Runs as a 3-stage interactive conversation rather than a single request/reply.
- Search: parallel fan-out to an external Flights agent and an external Hotels agent on the open Agentverse marketplace, plus a live ITF W15/W25 tournament scrape via Browserbase; resolved dates create a Google Calendar event.
- Pick: the athlete replies with a number to choose a tournament (10-minute window).
- Payment gate (optional): a Stripe TEST mode Checkout Session ($5.00 fee); on confirmation shows the ITF entry review screen, but never auto-submits the actual entry.
Protocols and standards used
- Fetch.ai Agent Chat Protocol: implemented by all seven agents, which is what makes the whole workflow usable directly from an ASI:One conversation with no custom frontend required.
- Fetch.ai Agentverse: every agent runs as a mailbox agent, registered and reachable by a stable handle/address through the Almanac.
- ASI:One: the user-facing conversational entry point and bonus-track router.
- Fetch.ai Payment Protocol: implemented via the Logistics agent's Stripe Checkout step.
- Agent-to-agent orchestration: Logistics collaborates with two independently operated Flights/Hotels agents purely through natural language, across organizational boundaries.
- Anthropic Claude: Haiku 4.5 for high-volume classification, Sonnet 4.6 for synthesis/reasoning (Recovery, Performance, Scout, Sponsorship, Logistics), and Claude vision for notebook-photo OCR.
- Deepgram nova-3: pre-recorded REST transcription and live streaming mic transcription.
- Browserbase + Stagehand: natural-language browser automation for ITF tournament search and opponent research, no hardcoded selectors.
- Redis (RedisVL + LangCache): KNN vector retrieval and semantic answer caching behind the RAG chat endpoint.
- Supabase (Postgres): the database every table (entries, matches, recovery_logs, metrics, agent_outputs, sponsorship_opportunities, calendar_events) writes to.
- Sentry (optional): error monitoring and performance tracing, initialized only if
SENTRY_DSNis set.
High-level workflow
- Athlete sends a voice note, notebook photo, or typed text.
- Voice →
POST /convert/voice(Deepgram nova-3); Photo →POST /convert/photo(Claude vision); Text needs no conversion. POST /ingestruns the full pipeline: transcribe/OCR → classify (Librarian) → embed → store (Supabase).- Orchestrator classifies intent and routes to the Librarian, the RAG chat endpoint, or a named specialist.
- Specialist agents read from Supabase, reason with Claude, and write results to
agent_outputs(orsponsorship_opportunities/calendar_eventsfor Sponsorship and Logistics). - Frontend dashboard and ASI:One replies both read the same underlying data, so the chat-only flow and the dashboard flow always stay in sync.
- For Logistics, a confirmed tournament pick can optionally pass through a real Stripe test-mode payment gate before showing (never submitting) the ITF entry review.
Project structure
TeamUP/
├── AGENTS.md # Frontend design system spec ("Aurora Glass")
├── Backend/
│ ├── agents/
│ │ ├── orchestrator.py # Intent router and conductor
│ │ ├── librarian.py # Classification and filing
│ │ ├── recovery.py # Overtraining / wellness detection
│ │ ├── performance.py # Trend analysis
│ │ ├── scout.py # Opponent research
│ │ ├── sponsorship.py # Brand matching + email drafting
│ │ └── logistics.py # Travel, tournaments, calendar, payment
│ ├── common/ # Shared chat/config/backend-client helpers
│ ├── integrations/ # Browserbase/Stagehand, Stripe, Google Calendar, Deepgram
│ ├── processing/ # voicetotext.py, phototext.py: input normalization
│ ├── readmes/ # Agentverse Overview READMEs, one per agent
│ ├── authorize_gcal/ # Google Calendar OAuth flow
│ ├── calandar_client.py
│ ├── config.py
│ ├── database.py
│ ├── main.py # FastAPI backend (Supabase-backed)
│ ├── mock_backend.py # Local mock backend for offline/seeded demos
│ ├── rag.py # RAG / chat pipeline (Redis + Claude)
│ ├── run_local.py # One-command Bureau run of all agents locally
│ ├── send_dump.py # Test client: sends a raw dump to a deployed agent
│ ├── asi_ping.py # ASI:One connectivity probe
│ └── requirements.txt
├── Frontend/ # React 18 + TS + Vite + Tailwind v4 dashboard ("Aurora Glass")
├── requirements.txt
└── README.md
Quick start
1) Install dependencies
python3 -m venv Backend/venv
source Backend/venv/bin/activate
pip install -r Backend/requirements.txt
cd Frontend
npm install
cd ..
2) Configure environment
cp Backend/.env.example Backend/.env
At minimum:
ANTHROPIC_API_KEY: Claude classification, synthesis, and vision OCRAGENTVERSE_KEY: mailbox registration for all seven agentsDEEPGRAM_API_KEY: voice transcription (REST + live mic)SUPABASE_URL/SUPABASE_KEY: persistence layer
Optional, depending on which flows you want live rather than gracefully skipped:
ASI_ONE_API_KEY: ASI:One bonus routerBROWSERBASE_API_KEY/BROWSERBASE_PROJECT_ID: Scout + Logistics browser automationSTRIPE_SECRET_KEY: real test-mode Checkout gate (omit to skip the payment gate entirely)GOOGLE_CALENDARcredentials: viaBackend/authorize_gcalSENTRY_DSN: backend error monitoringLIBRARIAN_ADDRESS/RECOVERY_ADDRESS/LOGISTICS_ADDRESS: filled in after first boot, so the Orchestrator can route to already-running agents instead of falling back to inline Claude calls
3) Start backend, agents, and frontend
# Backend (FastAPI data layer)
cd Backend
source venv/bin/activate
uvicorn main:app --host 0.0.0.0 --port 8000
# Agents: all seven in one local Bureau (new terminal)
cd Backend
source venv/bin/activate
python run_local.py
# Frontend (new terminal)
cd Frontend
npm run dev
Frontend: http://localhost:5173
Backend/API: http://localhost:8000
Agent ports (local Bureau): Librarian 8001 · Recovery 8002 · Orchestrator 8003 (others assigned per Backend/config.py)
Useful endpoints
POST /convert/photo: notebook image to OCR textPOST /convert/voice: audio to transcriptPOST /ingest: full pipeline, transcribe/OCR to classify to embed to storePOST /entries/GET /entries: journal entry CRUDGET /metrics,/match_results,/training_sessions,/recovery_logs: read tablesPOST /agent_outputs/GET /agent_outputs: specialist insight cardsPOST /sponsorship_opportunities: sponsorship draft storagePOST /calendar/add: calendar event storageGET /dashboard/*: pre-shaped dashboard reads (overview, performance, recovery, matches, training, logistics, sponsorship)POST /chat: RAG question answering, grounded in the athlete's own dataPOST /admin/seed//admin/clear//admin/backfill: demo data management
Submission details
Public ASI:One shared chat session URL showing the complete workflow: [ ]
Agentverse Agent Profile URL(s) for each submitted agent:
- Orchestrator: [ ]
- Librarian: [ ]
- Recovery: [ ]
- Performance: [ ]
- Scout: [ ]
- Sponsorship: [ ]
- Logistics: [ ]
Public GitHub repository URL: [ ]
Short demo video: [ ]
Brief description of the problem, target user, and outcome produced by the agent: [ ]
Agentverse submission checklist
- Add this repo link + public URL in the CalHacks AI submission fields.
- Keep each agent's Agentverse Overview README (
Backend/readmes/) written as plain-English capability copy: what it does, example queries, sample responses, since that's what ASI:One's agent search actually uses, not technical documentation. - Confirm every agent (not just the Orchestrator) has
mailbox=Trueand includes the chat protocol withpublish_manifest=True. - For a full demo submission, include a live code link, a 3–5 minute demo video, and any required API keys or setup notes for judges (non-secret placeholders only).
- Treat the no-custom-frontend ASI:One flow as a hard demo requirement: the full dump → classify → route → specialist → reply loop should work end to end from a single ASI:One chat session, independent of the dashboard.
Deployment notes
Backend/run_local.pyspins up all seven agents in a single local Bureau for offline/dev demos; deployed agents instead register individually as mailbox agents on Agentverse.- Browser real-time updates come from dashboard polling against the FastAPI endpoints above; ASI:One updates arrive as chat replies from the Orchestrator.
- Supabase is the system of record for entries, matches, recovery logs, metrics, agent outputs, sponsorship opportunities, and calendar events.
- Redis (RedisVL + LangCache) sits in front of the RAG chat endpoint; if Redis is unreachable, retrieval falls back to a recency query instead of failing.
- The Stripe payment gate and Browserbase automation degrade gracefully: without
STRIPE_SECRET_KEYthe payment step is simply skipped, and without Browserbase credentials Scout/Logistics fall back to whatever data is already in Supabase. - Sentry is optional and only initializes if
SENTRY_DSNis set.
License
MIT
Analysis
View
Metric
- 24
- 18
- 16
- 13
Figures cover GitHub contributors during the hackathon window. A co-authored commit counts in full for each author, so per-member totals add up to more than the whole-team figures.
Technology
- AnthropicIn code
- CSSIn code
- FastAPIIn code
- HTMLIn code
- OpenAIIn code
- PythonIn code
- ReactIn code
- SQLIn code
- SupabaseIn code
- Tailwind CSSIn code
- TypeScriptIn code
- RedisClaimed
11 of 12 appear in the indexed code. 1 claimed on Devpost could not be matched to code, which may simply mean the tool leaves no trace in the repository.
AI coding agents
- CodexConfig
Detected from committed agent config files and commit authorship. Absence of a signal is not proof an agent was unused.
Codebase size
Source size
937 KB
Source files
121
Counts recognized source files only; vendored directories, binaries and lockfiles are excluded, so this is smaller than the repository on disk.
Repository
JayaniSND/TeamUP
144 files · 7.3 MB · @ 2e6e838
Structure
Interface
44 files · 31%Screens, components and styles rendered to the user.
Application logic
62 files · 43%Domain rules, services and shared utilities.
Data & schema
1 file · 1%Schema definitions, migrations and data access.
Supporting
Layers are inferred from where files sit in the tree, not from reading the code. A project that names its directories unconventionally will read oddly here — open the file browser to check anything the diagram implies.
Languages
- Python41%
- TypeScript38%
- Markdown20%
- CSS1%
- SQL1%
- HTML0%
Share of indexed source by file size. Binary and vendored files are excluded.
Dependencies
Backend/requirements.txt
pypi · 22- anthropic
- browserbase
- deepgram-sdk
- fastapi
- google-api-python-client
- google-auth
- google-auth-httplib2
- google-auth-oauthlib
- httpx
- openai
- playwright
- python-dotenv
- python-multipart
- redisvl
- sentence-transformers
- sentry-sdk[fastapi]
- sounddevice
- stagehand
- +4 more
Frontend/package.json
npm · 21- @react-three/drei
- @react-three/fiber
- @types/three
- clsx
- framer-motion
- gsap
- lucide-react
- react
- react-dom
- react-router-dom
- recharts
- tailwind-merge
- three
- +8 more
requirements.txt
pypi · 21- annotated-types
- anyio
- certifi
- cffi
- charset-normalizer
- deepgram-sdk
- h11
- httpcore
- httpx
- idna
- pycparser
- pydantic
- pydantic_core
- python-dotenv
- requests
- sounddevice
- stripe
- typing_extensions
- +3 more
Frontend/requirements.txt
pypi · 17- annotated-types
- anyio
- certifi
- cffi
- deepgram-sdk
- h11
- httpcore
- httpx
- idna
- pycparser
- pydantic
- pydantic_core
- python-dotenv
- sounddevice
- typing_extensions
- typing-inspection
- websockets
Declared in the repository’s manifests at the indexed commit. A declared package is not proof it is used, and runtime dependencies are listed first.
This project’s features have not been analysed yet.
Export this project's context (description, README, evidence, key source files) to chat with an AI agent elsewhere.