ApplyFlow is a cross-platform job application tracker built with Expo and React Native. It helps you manage your application pipeline, visualize progress with analytics, and evaluate resume fit against job descriptions using secure AI-powered analysis.
ApplyFlow combines a modern mobile experience with a Supabase backend. Users sign in, track applications through each hiring stage, and receive structured AI feedback on how well a resume matches a role—without exposing API keys in the client.
Platform support: iOS, Android, and Web (via Expo)
- Create, read, update, and delete job applications
- Track company, role, status, applied date, and notes
- Pipeline statuses: Applied, Interview, Offer, Rejected
- Search and filter applications on the home screen
- Dashboard summary cards (total, interviews, offers, rejections)
- Application pipeline breakdown by status
- Visual progress indicators for hiring stages
- Compare resume text against a job description
- Match score with strengths, missing skills, and improvement suggestions
- Powered by Google Gemini via a Supabase Edge Function (
resume-match) - Gemini API key stored server-side as a Supabase secret (never shipped in the app)
- Loading skeletons, animated results, and auto-scroll to analysis
- Email/password auth with Supabase Auth
- Protected routes—app content requires a signed-in session
- Persistent cloud storage in Supabase Postgres (
jobstable, scoped per user) - One-time migration from legacy local AsyncStorage data
- Clean, modern React Native UI with card-based layouts
- Expo Router file-based routing with bottom tab navigation
- Stack screens for add/edit job flows
| Layer | Technology |
|---|---|
| Framework | Expo 54, React Native 0.81 |
| Language | TypeScript |
| Navigation | Expo Router 6 |
| Backend | Supabase (Auth, Postgres, Edge Functions) |
| AI | Google Gemini (gemini-2.5-flash) via Edge Function |
| Client SDK | @supabase/supabase-js |
| Local persistence | AsyncStorage (auth session + legacy migration) |
┌─────────────────────────────────────────────────────────┐
│ ApplyFlow (Expo / React Native) │
│ ┌─────────┐ ┌───────────┐ ┌─────────────────────────┐ │
│ │ Home │ │ Analytics │ │ Resume Match │ │
│ │ (CRUD) │ │ (stats) │ │ → services/ai.ts │ │
│ └────┬────┘ └─────┬─────┘ └───────────┬─────────────┘ │
│ │ │ │ │
│ └─────────────┴─────────────────────┘ │
│ │ │
│ context/auth-context · context/jobs-context │
│ │ │
│ lib/supabase.ts · lib/jobs-service.ts │
└─────────────────────┼─────────────────────────────────────┘
│
┌───────────┴───────────┐
▼ ▼
Supabase Postgres Supabase Edge Function
(jobs + RLS) (resume-match → Gemini API)
ApplyFlow/
├── app/ # Expo Router screens
│ ├── (tabs)/ # Tab navigator
│ │ ├── index.tsx # Home — job list & dashboard
│ │ ├── analytics.tsx # Pipeline analytics
│ │ └── resume-match.tsx # AI resume analysis
│ ├── add-job.tsx # Create application
│ ├── edit-job/[id].tsx # Edit application
│ └── _layout.tsx # Root layout & auth gate
├── components/ # UI components (forms, badges, auth)
├── context/ # Auth & jobs React context
├── lib/ # Supabase client, jobs API, DB types
├── services/ # AI service (Edge Function client)
├── supabase/
│ ├── functions/resume-match/ # Deno Edge Function (Gemini)
│ └── config.toml
├── constants/ # Theme tokens
└── assets/ # App icons & splash
- Node.js ≥ 20.19.4 (see
package.jsonengines) - npm
- Expo Go or iOS Simulator / Android Emulator
- A Supabase project
- A Google AI Studio API key (for Resume Match)
git clone <your-repo-url>
cd JobTrackerApp
npm installCreate a .env file in the project root (see .env.example):
EXPO_PUBLIC_SUPABASE_URL=https://your-project-ref.supabase.co
EXPO_PUBLIC_SUPABASE_PUBLISHABLE_KEY=your_supabase_publishable_keyRestart the Expo dev server after changing env vars:
npm start-
Create a Supabase project and enable Email auth.
-
Create a
jobstable with RLS policies so users can only access their own rows (user_id= authenticated user). -
Set the Edge Function secret:
supabase secrets set GEMINI_API_KEY=your_gemini_api_key -
Deploy the resume-match function:
supabase functions deploy resume-match
See supabase/.env.example for the server-side secret name. The Gemini key must not be added to the Expo .env file.
npm start # Expo dev server
npm run ios # iOS simulator
npm run android # Android emulator
npm run web # Web browser
npm run lint # ESLint| Login | Home | Analytics | Resume Match |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
- PDF resume upload and parsing
- Job application reminders and follow-up dates
- Export pipeline data (CSV/PDF)
- OAuth providers (Google, GitHub)
- Offline-first sync improvements
- Dark mode polish across all screens
- Rate limiting and usage analytics for AI features
This repository is currently marked private in package.json. If you fork or open-source the project:
- Open an issue to discuss significant changes.
- Create a feature branch and submit a pull request with a clear description.
- Ensure
npm run lintpasses before requesting review.
No license file is included yet. All rights reserved unless a license is added to the repository.



