ScholarMatch is an AI-powered scholarship discovery platform that matches students to scholarships they're most likely to win β using resume parsing, smart profiling, and Gemini-powered personalization.
"Don't find scholarships. Let scholarships find you."
ScholarMatch simplifies the scholarship application process by aggregating opportunities tailored to each student. Instead of spending hours searching through dozens of websites, students upload their resume or fill out a quick profile β and our AI engine handles the rest. ScholarMatch scrapes real scholarship data, scores each opportunity against the student's profile, and surfaces the ones they're statistically most likely to win.
Whether you're a first-year undergraduate or a graduate student looking for financial aid, ScholarMatch gives you a personalized roadmap to funding your education.
- π AI-Powered Matching β Our engine scores every scholarship against your GPA, program, location, academic level, and financial need to surface your best opportunities.
- π Resume Parsing β Upload your resume and let Gemini AI extract your profile automatically.
- π€ AI Scholarship Advisor β Ask our Gemini-powered chatbot anything β essay help, eligibility checks, next steps, and more.
- π Dashboard & Roadmap β Visualize your application progress and see exactly what you need to improve to unlock more scholarships.
- π Application Tracker β Track deadlines and submission statuses across all your scholarships in one place.
- π Secure Auth β Auth0-powered login keeps your profile safe and persistent across sessions.
- βοΈ Cloud File Storage β Resumes and transcripts are securely stored via Cloudinary.
| Layer | Technology |
|---|---|
| Frontend | React, Tailwind CSS, React Router, React Three Fiber |
| Backend | Python, FastAPI, Uvicorn |
| Database | Supabase (PostgreSQL) |
| Authentication | Auth0 |
| AI | Google Gemini API |
| File Storage | Cloudinary |
| Scraping | BeautifulSoup, Requests |
| Deployment | Vultr, Docker |
- Node.js 18+
- Python 3.11+
- A Supabase project
- An Auth0 application
- A Cloudinary account
- A Google Gemini API key
git clone https://github.com/cogniera/scholarmatch.git
cd scholarmatchcd src/backend
python -m venv venv
# Windows
venv\Scripts\activate
# Mac/Linux
source venv/bin/activate
pip install -r requirements.txtCreate src/backend/.env:
SUPABASE_URL=your-supabase-url
SUPABASE_KEY=your-supabase-anon-key
AUTH0_DOMAIN=your-auth0-domain
AUTH0_AUDIENCE=https://scholarmatch-api
GEMINI_API_KEY=your-gemini-api-keyStart the backend:
uvicorn app.main:app --reload
# Runs at http://localhost:8000
# API docs at http://localhost:8000/docscd src/frontend
npm installCreate src/frontend/.env:
VITE_CLOUDINARY_CLOUD_NAME=your-cloudinary-cloud-name
VITE_CLOUDINARY_UPLOAD_PRESET=your-upload-preset
VITE_API_URL=http://localhost:8000
VITE_AUTH0_DOMAIN=your-auth0-domain
VITE_AUTH0_CLIENT_ID=your-auth0-client-id
VITE_AUTH0_AUDIENCE=https://scholarmatch-apiStart the frontend:
npm run dev
# Runs at http://localhost:5173Run the following in your Supabase SQL Editor to create the required tables:
CREATE TABLE public.users (
id uuid NOT NULL,
name text,
email text,
gpa double precision,
program text,
location text,
academic_level text,
financial_need boolean,
extracurriculars text,
resume_url text,
transcript_url text,
CONSTRAINT users_pkey PRIMARY KEY (id)
);
CREATE TABLE public.scholarships (
id integer NOT NULL DEFAULT nextval('scholarships_id_seq'::regclass),
title text,
provider text,
amount integer,
deadline date,
eligibility text,
location text,
program text,
gpa_requirement double precision,
financial_need_required boolean DEFAULT false,
academic_level text,
link text,
CONSTRAINT scholarships_pkey PRIMARY KEY (id),
CONSTRAINT scholarships_title_provider_unique UNIQUE (title, provider)
);
CREATE TABLE public.matches (
user_id uuid,
scholarship_id integer,
match_score double precision,
ai_explanation text
);To populate the scholarships table with real scraped data:
cd src/scraper
pip install -r requirements.txtCreate src/scraper/.env:
GEMINI_API_KEY=your-gemini-api-key
SUPABASE_URL=your-supabase-url
SUPABASE_KEY=your-supabase-anon-keyRun the scraper:
python scraper.py # Scrapes scholarship pages
python save_to_supabase.py # Saves results to SupabaseIn your Auth0 dashboard:
- Allowed Callback URLs:
http://localhost:5173 - Allowed Logout URLs:
http://localhost:5173 - Allowed Web Origins:
http://localhost:5173 - Create an API with identifier
https://scholarmatch-api - Authorize your application to use that API
scholarmatch/
βββ src/
β βββ backend/ # FastAPI backend
β β βββ app/
β β βββ api/routes/ # profile, scholarships, uploads
β β βββ core/ # Auth0 JWT verification
β β βββ database/ # Supabase client
β β βββ models/ # Pydantic schemas
β β βββ services/ # Gemini AI, matching engine
β βββ frontend/ # React frontend
β β βββ src/
β β βββ components/ # UI components
β β βββ context/ # App state (reducer)
β β βββ pages/ # Route pages
β β βββ services/ # API calls
β βββ scraper/ # Scholarship web scraper
βββ docker-compose.yml
MIT
Create src/frontend/.env:
VITE_CLOUDINARY_CLOUD_NAME=your-cloudinary-cloud-name
VITE_CLOUDINARY_UPLOAD_PRESET=your-upload-preset
VITE_API_URL=http://localhost:8000
VITE_AUTH0_DOMAIN=your-auth0-domain
VITE_AUTH0_CLIENT_ID=your-auth0-client-id
VITE_AUTH0_AUDIENCE=https://scholarmatch-apiStart the frontend:
npm run dev
# Runs at http://localhost:5173Run the following in your Supabase SQL Editor to create the required tables:
CREATE TABLE public.users (
id uuid NOT NULL,
name text,
email text,
gpa double precision,
program text,
location text,
academic_level text,
financial_need boolean,
extracurriculars text,
resume_url text,
transcript_url text,
CONSTRAINT users_pkey PRIMARY KEY (id)
);
CREATE TABLE public.scholarships (
id integer NOT NULL DEFAULT nextval('scholarships_id_seq'::regclass),
title text,
provider text,
amount integer,
deadline date,
eligibility text,
location text,
program text,
gpa_requirement double precision,
financial_need_required boolean DEFAULT false,
academic_level text,
link text,
CONSTRAINT scholarships_pkey PRIMARY KEY (id),
CONSTRAINT scholarships_title_provider_unique UNIQUE (title, provider)
);
CREATE TABLE public.matches (
user_id uuid,
scholarship_id integer,
match_score double precision,
ai_explanation text
);To populate the scholarships table with real scraped data:
cd src/scraper
pip install -r requirements.txtCreate src/scraper/.env:
GEMINI_API_KEY=your-gemini-api-key
SUPABASE_URL=your-supabase-url
SUPABASE_KEY=your-supabase-anon-keyRun the scraper:
python scraper.py # Scrapes scholarship pages
python save_to_supabase.py # Saves results to SupabaseIn your Auth0 dashboard:
- Allowed Callback URLs:
http://localhost:5173 - Allowed Logout URLs:
http://localhost:5173 - Allowed Web Origins:
http://localhost:5173 - Create an API with identifier
https://scholarmatch-api - Authorize your application to use that API
scholarmatch/
βββ src/
β βββ backend/ # FastAPI backend
β β βββ app/
β β βββ api/routes/ # profile, scholarships, uploads
β β βββ core/ # Auth0 JWT verification
β β βββ database/ # Supabase client
β β βββ models/ # Pydantic schemas
β β βββ services/ # Gemini AI, matching engine
β βββ frontend/ # React frontend
β β βββ src/
β β βββ components/ # UI components
β β βββ context/ # App state (reducer)
β β βββ pages/ # Route pages
β β βββ services/ # API calls
β βββ scraper/ # Scholarship web scraper
βββ docker-compose.yml
MIT