You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
ApplicaAI is a production-grade, AI-powered resume builder and job application assistant that transforms the job application process through intelligent automation. The platform leverages multiple frontier AI models β including OpenAI GPT-5.2, Anthropic Claude Opus 4.5, Google Gemini 3 Pro, and DeepSeek V3.2 β to craft compelling, ATS-optimized resumes and cover letters that significantly increase your chances of landing interviews.
Built on Next.js 15 with React Server Components, Supabase (PostgreSQL + Auth), Redis for rate limiting, and Stripe for subscription management, ApplicaAI provides an enterprise-grade, full-stack platform designed for scale, security, and developer experience.
From prototype to production: ApplicaAI evolved from a single-file Streamlit prototype into a modular, containerized, multi-model platform supporting concurrent users with Row Level Security, real-time collaboration, and a CI/CD pipeline via GitHub Actions.
Why ApplicaAI?
Problem
Solution
Impact
75% of resumes never reach human eyes due to ATS filtering
Proprietary ATS scoring algorithm combining keyword matching with semantic analysis
40% improved match accuracy vs. keyword-only approaches
Job seekers use 5+ separate tools for applications
Unified platform with seamless workflow (resume β cover letter β scoring β tracking)
60% reduction in job search time
Generic application materials have 80% lower success rates
AI personalization based on specific job descriptions and company context
85% higher relevance scores
β¨ Key Features
Core Capabilities
Feature
Description
Technical Implementation
π€ AI Resume Assistant
Context-aware, real-time content suggestions via an integrated chat interface
Vercel AI SDK streaming, multi-provider tool calling, structured output with Zod schemas
π ATS Scoring Engine
Multi-dimensional resume scoring: completeness, impact, role match, keyword alignment
7-metric scoring system with granular breakdowns and actionable improvement suggestions
π Cover Letter Generation
Job-tailored cover letters generated from resume + job description context
Structured prompts with chain-of-thought reasoning, JSONB storage for versioning
π― Resume Tailoring
Create job-specific resume variants from a master base resume
Base β tailored workflow with AI-assisted content selection and optimization
π PDF Export
Professional PDF generation with customizable document settings
React-PDF renderer with granular margin, spacing, and typography controls
π³ Subscription Management
Free and Pro tiers with trial support
Stripe integration with webhook-driven subscription lifecycle management
π Enterprise Security
Row Level Security ensuring complete data isolation per user
Full-stack local development environment via Docker Compose
12-service Docker Compose stack (PostgreSQL, Kong, GoTrue, Redis, and more)
AI-Powered Intelligent Resume Assistant
Smart, context-aware content suggestions that match your industry and experience
Real-time optimization of resume content for ATS algorithms
Eliminate writer's block with industry-specific prompts for better results
ATS-friendly formatting with professional phrasing and keyword optimization
Resume Performance Scoring & Analytics
Understand exactly how recruiters and ATS systems perceive your resume
Multi-factor scoring engine analyzing completeness, impact, role match, and keyword alignment
Detailed improvement recommendations with actionable next steps
AI Cover Letter Generation
Generate personalized cover letters tailored to specific job descriptions in seconds
Professional tone and structure with relevant achievement-focused narratives
Consistent with your resume content for a unified application package
Resume Dashboard & Management
Centralized resume management with base and tailored resume variants
Maintain a master resume while creating customized versions for each opportunity
Version tracking with timestamps and job linkage
π System Architecture
High-Level Architecture Diagram
graph TB
subgraph Client["Client Layer"]
Browser["Browser (React 19)"]
RSC["React Server Components"]
CC["Client Components"]
end
subgraph NextJS["Application Layer β Next.js 15 (App Router)"]
Middleware["Middleware<br/>(Auth Guard)"]
Pages["Pages & Layouts"]
ServerActions["Server Actions<br/>(Data Mutations)"]
APIRoutes["API Routes<br/>(/api/chat, /api/webhooks)"]
end
subgraph AI["AI Layer β Multi-Provider"]
AISDK["Vercel AI SDK"]
OpenAI["OpenAI<br/>GPT-5.2 / GPT-5.2 Pro"]
Anthropic["Anthropic<br/>Claude Sonnet 4 / Opus 4.5"]
OpenRouter["OpenRouter<br/>Gemini 3 Pro / DeepSeek V3.2"]
end
subgraph Backend["Backend Services"]
SupabaseAuth["Supabase Auth<br/>(GoTrue)"]
Kong["Kong API Gateway"]
PostgREST["PostgREST"]
Realtime["Supabase Realtime"]
Storage["Supabase Storage"]
end
subgraph Data["Data Layer"]
PostgreSQL[("PostgreSQL 15<br/>+ RLS Policies")]
Redis[("Redis 7<br/>Rate Limiting")]
Stripe["Stripe API<br/>Subscriptions"]
end
Browser --> Middleware
Middleware --> Pages
Pages --> RSC
Pages --> CC
RSC --> ServerActions
CC --> APIRoutes
APIRoutes --> AISDK
AISDK --> OpenAI
AISDK --> Anthropic
AISDK --> OpenRouter
ServerActions --> Kong
Kong --> PostgREST
Kong --> SupabaseAuth
PostgREST --> PostgreSQL
SupabaseAuth --> PostgreSQL
APIRoutes --> Redis
ServerActions --> Stripe
Kong --> Realtime
Kong --> Storage
style Client fill:#fff0f3,stroke:#e94560,stroke-width:2px,color:#000
style NextJS fill:#f0f6ff,stroke:#58a6ff,stroke-width:2px,color:#000
style AI fill:#f0fff4,stroke:#2ea043,stroke-width:2px,color:#000
style Backend fill:#fffdf0,stroke:#d29922,stroke-width:2px,color:#000
style Data fill:#fff0f8,stroke:#d8619d,stroke-width:2px,color:#000
Loading
Request Lifecycle
sequenceDiagram
participant U as User (Browser)
participant MW as Middleware
participant SA as Server Action / API Route
participant SB as Supabase (Auth + DB)
participant AI as AI Provider (OpenAI / Anthropic / OpenRouter)
participant RD as Redis
participant ST as Stripe
U->>MW: HTTP Request
MW->>SB: Validate Session (updateSession)
SB-->>MW: Session Token
alt Protected Route
MW->>SA: Forward Authenticated Request
else Public Route
MW->>U: Serve Page Directly
end
alt AI Chat Request
SA->>RD: Check Rate Limit (Leaky Bucket)
RD-->>SA: Rate Limit OK / Exceeded
SA->>AI: Stream AI Response (Vercel AI SDK)
AI-->>SA: Streaming Tokens
SA-->>U: Server-Sent Events (SSE)
end
alt Data Mutation
SA->>SB: CRUD via PostgREST + RLS
SB-->>SA: Query Result
SA-->>U: Updated State
end
alt Subscription Event
ST->>SA: Webhook (checkout.completed, subscription.updated)
SA->>SB: Update Subscription Record
end
Loading
AI Tool Calling Architecture
flowchart LR
subgraph UserRequest["User Chat Message"]
Msg["'Improve my work experience bullets'"]
end
subgraph AIEngine["AI Processing Pipeline"]
SystemPrompt["System Prompt<br/>(Chain-of-Thought)"]
ToolSelection["Tool Selection"]
end
subgraph Tools["Available AI Tools"]
T1["getResume<br/>Read resume sections"]
T2["suggest_work_experience<br/>Improve work entries"]
T3["suggest_project<br/>Improve project entries"]
T4["suggest_skill<br/>Optimize skills"]
T5["suggest_education<br/>Enhance education"]
T6["modifyWholeResume<br/>Batch modifications"]
end
subgraph Output["Output"]
Proposal["Proposed Changes<br/>(User Approval)"]
DirectEdit["Direct Modifications"]
end
Msg --> SystemPrompt
SystemPrompt --> ToolSelection
ToolSelection --> T1
ToolSelection --> T2
ToolSelection --> T3
ToolSelection --> T4
ToolSelection --> T5
ToolSelection --> T6
T2 --> Proposal
T3 --> Proposal
T4 --> Proposal
T5 --> Proposal
T6 --> DirectEdit
Loading
π Tech Stack
Frontend
Technology
Version
Purpose
Next.js
15.1
React framework with App Router, Server Components, Turbopack
React
19
UI rendering with Server/Client Component model
TypeScript
5.7+
Full type safety across the codebase
Tailwind CSS
3.4
Utility-first responsive styling
Shadcn UI + Radix
Latest
Accessible, composable component primitives
Framer Motion
11.x
Smooth animations and micro-interactions
TipTap
2.11
Rich text editing for resume sections
React-PDF
4.1
Client-side PDF document generation
Lucide React
0.469
Consistent iconography
Backend & Data
Technology
Version
Purpose
Supabase
Latest
Auth (GoTrue), PostgreSQL, Realtime, Storage
PostgreSQL
15.x
Primary relational database with JSONB support
Redis (Upstash / ioredis)
7.x
Rate limiting via leaky bucket algorithm
Stripe
18.x
Subscription billing and payment processing
Kong
2.8
API Gateway for Supabase services
Zod
3.24
Runtime schema validation for all data boundaries
AI Integration
Provider
Models
Use Case
OpenAI
GPT-5.2, GPT-5.2 Pro, GPT-5.1, GPT-5 Mini
Frontier-quality content generation (Pro default)
Anthropic
Claude Sonnet 4, Claude Sonnet 4.5, Claude Haiku 4.5, Claude Opus 4.5
High-quality analysis and structured output
OpenRouter
Gemini 3 Pro Preview, DeepSeek V3.2, GPT-OSS 120B/20B, GLM-4.6 Exacto
Cost-effective and free-tier model access
DevOps & Infrastructure
Technology
Purpose
Docker
Multi-stage production Dockerfile (build-base β deps β builder β production)
Docker Compose
12-service local development stack
GitHub Actions
CI/CD pipeline for automated Docker image builds and GHCR publishing
Vercel Analytics
Production performance monitoring
pnpm
Fast, disk-efficient package manager
π€ AI Provider Integration
Model Selection & Routing
flowchart TD
subgraph UserType["User Classification"]
Free["Free User"]
Pro["Pro Subscriber"]
BYOK["BYOK User<br/>(Bring Your Own Key)"]
end
subgraph ModelRouter["Model Router"]
Default["Default Model Selection"]
Custom["Custom Model Selection"]
end
subgraph Models["Available Models"]
direction LR
FreeModels["Free Models<br/>DeepSeek V3.2<br/>GPT-OSS 120B / 20B"]
ProModels["Pro Models<br/>GPT-5.2 Pro<br/>Claude Opus 4.5"]
StandardModels["Standard Models<br/>GPT-5.2, GPT-5.1<br/>Claude Sonnet 4/4.5<br/>Gemini 3 Pro"]
end
subgraph SDKInit["SDK Initialization"]
OpenAISDK["@ai-sdk/openai"]
AnthropicSDK["@ai-sdk/anthropic"]
OpenRouterSDK["@openrouter/ai-sdk-provider"]
end
Free --> Default
Pro --> Custom
BYOK --> Custom
Default --> FreeModels
Custom --> ProModels
Custom --> StandardModels
Custom --> FreeModels
FreeModels --> OpenRouterSDK
ProModels --> OpenAISDK
ProModels --> AnthropicSDK
StandardModels --> OpenAISDK
StandardModels --> AnthropicSDK
StandardModels --> OpenRouterSDK
Loading
Model Designation System
Designation
Model
Use Case
FAST_CHEAP
Claude Sonnet 4.5
Parsing, simple tasks, quick analysis
FAST_CHEAP_FREE
DeepSeek V3.2
Free-tier alternative for fast tasks
FRONTIER
GPT-5.2
Complex tasks, deep analysis, best quality
FRONTIER_ALT
Claude Opus 4.5
Alternative frontier model
BALANCED
Gemini 3 Pro Preview
Good quality with faster/cheaper inference
VISION
Claude Sonnet 4.5
Image analysis capabilities
DEFAULT_PRO
GPT-5.2
Default for Pro subscribers
DEFAULT_FREE
DeepSeek V3.2
Default for free-tier users
Rate Limiting Strategy
Rate limiting is implemented via a leaky bucket algorithm using Redis:
Capacity: 80 messages per 5-hour window (Pro users)
Leak Rate:capacity / duration tokens per second
Storage: Redis hash per user (rate-limit:pro:{userId})
Development: Rate limiting is skipped in NODE_ENV=development
π Database Architecture
Entity-Relationship Diagram
erDiagram
AUTH_USERS ||--o| PROFILES : "has one"
AUTH_USERS ||--o| SUBSCRIPTIONS : "has one"
AUTH_USERS ||--o{ RESUMES : "owns many"
AUTH_USERS ||--o{ JOBS : "owns many"
JOBS ||--o{ RESUMES : "linked to"
AUTH_USERS {
uuid id PK
string email
timestamp created_at
}
PROFILES {
uuid user_id PK,FK
text first_name
text last_name
text email
text phone_number
text location
text website
text linkedin_url
text github_url
jsonb work_experience
jsonb education
jsonb skills
jsonb projects
jsonb certifications
timestamptz created_at
timestamptz updated_at
}
SUBSCRIPTIONS {
uuid user_id PK,FK
text stripe_customer_id UK
text stripe_subscription_id UK
text subscription_plan "free | pro"
text subscription_status "active | canceled"
timestamptz current_period_end
timestamptz trial_end
timestamptz created_at
timestamptz updated_at
}
RESUMES {
uuid id PK
uuid user_id FK
uuid job_id FK
boolean is_base_resume
text name
text target_role
text first_name
text last_name
text email
text phone_number
text location
text website
text linkedin_url
text github_url
text professional_summary
jsonb work_experience
jsonb education
jsonb skills
jsonb projects
jsonb certifications
jsonb section_order
jsonb section_configs
jsonb document_settings
boolean has_cover_letter
jsonb cover_letter
timestamptz created_at
timestamptz updated_at
}
JOBS {
uuid id PK
uuid user_id FK
text company_name
text position_title
text job_url
text description
text location
text salary_range
jsonb keywords
text work_location "remote | in_person | hybrid"
text employment_type "full_time | part_time | co_op | internship | contract"
boolean is_active
timestamptz created_at
timestamptz updated_at
}
Loading
Core Tables
Table
Purpose
Key Fields
Security
profiles
User identity and master resume data
JSONB fields for work_experience, education, skills, projects
# 1. Clone the repository
git clone https://github.com/johnnietse/AI-Powered_Professional_Job_Application_Assistant.git
cd AI-Powered_Professional_Job_Application_Assistant
# 2. Install dependencies
pnpm install
# 3. Configure environment variables
cp .env.example .env.local
# Edit .env.local with your credentials (see Environment Configuration section)# 4. Initialize database# Execute schema.sql in the Supabase SQL Editor# Or via Supabase CLI:
supabase db push --db-url=your_url schema.sql
# 5. Start development server
pnpm dev
Navigate to http://localhost:3000 to start building!
Available Scripts
Command
Description
pnpm dev
Start development server
pnpm dev:turbo
Start with Turbopack (faster HMR)
pnpm build
Create production build
pnpm start
Start production server
pnpm lint
Run ESLint checks
π³ Docker Deployment
Architecture: Docker Compose Services
graph TB
subgraph DockerNetwork["ApplicaAI Docker Network (Bridge)"]
subgraph SupabaseStack["Supabase Stack"]
DB[("PostgreSQL 15<br/>:54322")]
Auth["GoTrue Auth<br/>:9999"]
REST["PostgREST<br/>:3000"]
Realtime["Realtime<br/>:4000"]
Storage["Storage API<br/>:5000"]
ImgProxy["ImgProxy<br/>:8080"]
Meta["Postgres Meta<br/>:8080"]
Kong["Kong Gateway<br/>:54321"]
Studio["Studio UI<br/>:54323"]
Analytics["Logflare<br/>:4000"]
Inbucket["Inbucket<br/>:54324"]
end
subgraph CacheLayer["Cache Layer"]
Redis[("Redis 7<br/>:6379")]
RedisCmd["Redis Commander<br/>:8081"]
end
subgraph AppLayer["Application (Optional)"]
App["Next.js App<br/>:3000"]
end
Seeder["DB Seeder<br/>(runs once)"]
end
Kong --> Auth
Kong --> REST
Kong --> Realtime
Kong --> Storage
REST --> DB
Auth --> DB
Realtime --> DB
Storage --> DB
Storage --> ImgProxy
Studio --> Kong
Studio --> Meta
Meta --> DB
Analytics --> DB
App --> Kong
App --> Redis
Seeder --> Auth
RedisCmd --> Redis
style DockerNetwork fill:#f6f8fa,stroke:#d0d7de,stroke-width:2px,color:#24292f
style SupabaseStack fill:#f0fdf4,stroke:#3FCF8E,stroke-width:2px,color:#000
style CacheLayer fill:#fff1f0,stroke:#DC382D,stroke-width:2px,color:#000
style AppLayer fill:#f0f6ff,stroke:#58a6ff,stroke-width:2px,color:#000
Loading
Quick Start with Docker
# 1. Configure environment
cp .env.example .env.local
# Add at least one AI API key: OPENAI_API_KEY, ANTHROPIC_API_KEY, or OPENROUTER_API_KEY# 2. Start Docker servicescd docker
docker compose --env-file ../.env.local up -d
# 3. Wait ~60 seconds for services to initialize
docker compose --env-file ../.env.local ps
# 4. Run the app locally (from the project root)cd ..
pnpm dev
ATS scoring, quantified achievements, impact-driven language
πΌ Freelancer
Attract better clients
Multiple resume versions for different service offerings
π Anyone
Elevate existing resume
One-click AI improvements, cover letter generation, PDF export
πΊ Future Roadmap
Immediate (2026)
Enhanced AI customization algorithms
Expanded resume template library
Advanced PDF styling options
Application tracking dashboard with analytics
LinkedIn profile synchronization
Long Term (Late 2026+)
Mock interview preparation with AI feedback
Salary benchmarking tools
Career trajectory recommendations
Native mobile applications (iOS/Android)
Multi-language resume support
Team/enterprise features
π€ Contributing
We welcome contributions from developers of all skill levels!
Ways to Contribute
Type
Description
π Bug Reports
Identify and report issues for improvement
π‘ Feature Ideas
Share your vision for new capabilities
π» Code Contributions
Submit pull requests with new features or fixes
π Documentation
Improve setup guides, API docs, or tutorials
π¨ Design Work
Refine visual elements and UX flows
Contribution Workflow
# 1. Fork the repository# 2. Create your feature branch
git checkout -b feature/your-idea
# 3. Make your changes and commit
git commit -m 'Add your feature'# 4. Push to your branch
git push origin feature/your-idea
# 5. Open a Pull Request with a detailed description
π License
This project is licensed under the GNU Affero General Public License v3.0 (AGPL-3.0) β a strong copyleft license designed to ensure that software remains free and open, even when used over a network.
What You Are Allowed to Do
Permission
Description
β Commercial Use
Use this project and its derivatives for commercial purposes
β Modify
Change, adapt, or extend the source code
β Distribute
Share the original project or your modified versions
β Patent Use
Contributors grant an express patent license for their contributions
β Private Use
Use and modify the software privately without distribution
Conditions You Must Follow
Condition
Description
π Preserve Notices
Include a copy of the AGPL-3.0 license and retain existing copyright notices
π Document Changes
Clearly state any modifications you make to the original code
π Disclose Source
Make the complete corresponding source code available when distributing
π Network Use = Distribution
Running a modified version as a network service requires providing source code to users
π Same License
Distributed modifications must be licensed under AGPL-3.0
Radix UI β Headless UI primitives for accessibility
β οΈ Disclaimer
This tool generates AI-powered content that should be reviewed and customized before use. Results may vary based on input quality and API limitations. Always verify company information from official sources. ApplicaAI does not guarantee job placement or interview outcomes.