A smart job application assistant for Malaysian job seekers powered by AI
KerjaFlow is a web application that helps you find, rank, and apply to jobs from Malaysian job sites (Hiredly only for now). It scrapes job listings, ranks them based on how well they match your resume, and helps you tailor your resume and cover letter for each specific job. Generate professional resume PDFs and AI-written cover letters.
- 🔍 Job Scraping - Automatically scrape job listings from Hiredly using Apify
- 🤖 AI-Powered Ranking - Real-time parallel job ranking with fit scores (0-100%)
- 📄 Master Dump Resume - Paste your entire career history once, we tailor it for each job
- ✨ Custom Resume Generation - AI generates tailored resumes highlighting relevant experience
- ✉️ Cover Letter Writing - AI-generated cover letters based on job requirements
- 📥 PDF Export - Download professional resume PDFs
- 🔗 Direct Application Links - One-click access to apply on Hiredly
- ⚡ Real-time Updates - Live progress tracking for scraping and ranking via Convex
- 🌙 Dark Glassmorphism Theme - Modern dark UI with glass effects and gradient accents
- 📊 Live Progress Tracking - Visual milestones during job scraping
- 🎯 Match Indicators - Color-coded fit scores (green for high match, indigo for medium)
- Landing Page - Sign in with Google via Clerk
- Master Dump - Paste your entire career history (skills, experience, projects)
- Job Search - Enter job title (e.g., "Frontend Developer")
- Scraping - Watch real-time progress as jobs are scraped from Hiredly
- AI Ranking - Jobs automatically ranked by fit score with reasoning
- View Results - Browse ranked jobs with match percentages
- Generate Documents - Create tailored resume and cover letter for selected job
- Download & Apply - Export PDF and apply via Hiredly link
- Next.js 16 - React framework with App Router
- Convex - Real-time backend with live subscriptions
- Clerk - Google OAuth authentication
- Claude Sonnet - AI for ranking, resume tailoring, and cover letters
- Apify - Cloud web scraping for job listings
- Tailwind CSS - Dark glassmorphism styling
- TypeScript - Type safety throughout
- Node.js 22+
- pnpm package manager
- Apify account (for job scraping)
- Anthropic API key (for Claude)
- Convex account (for backend)
- Clerk account (for authentication)
-
Clone the repository
git clone <your-repo-url> cd cursor-hackathon-2025
-
Install dependencies
pnpm install
-
Configure environment variables
cp .env.example .env
Required environment variables:
# Apify APIFY_API_TOKEN=your_apify_token # Anthropic Claude ANTHROPIC_API_KEY=your_anthropic_key # Convex CONVEX_DEPLOYMENT=your_convex_deployment NEXT_PUBLIC_CONVEX_URL=your_convex_url # Clerk Authentication NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY=your_clerk_publishable_key CLERK_SECRET_KEY=your_clerk_secret_key
-
Set up Convex
npx convex dev
-
Start development server
pnpm dev:next
The app will be available at
http://localhost:3000
.
├── apps/
│ └── nextjs/ # Next.js web application
│ └── src/
│ └── app/
│ ├── api/
│ │ ├── search-jobs/ # Job scraping endpoint
│ │ ├── rank-job/ # AI job ranking endpoint
│ │ ├── generate-resume/ # Resume generation endpoint
│ │ ├── generate-cover-letter/ # Cover letter endpoint
│ │ └── generate-pdf/ # PDF export endpoint
│ ├── kerjaflow/
│ │ └── _components/ # UI components
│ │ ├── login-view.tsx
│ │ ├── search-view.tsx
│ │ ├── results-view.tsx
│ │ ├── job-card.tsx
│ │ ├── generator-view.tsx
│ │ └── resume-dump-view.tsx
│ ├── dump/ # Master dump page
│ ├── search/ # Job search page
│ ├── results/ # Results page
│ ├── jobs/[jobId]/ # Job details page
│ └── generate/ # Document generator page
├── my-actor/ # Apify Actor for web scraping
│ └── src/
│ └── main.ts # Scraper with Claude structured outputs
├── convex/ # Convex backend functions
│ ├── jobs.ts # Job listing management
│ ├── rankings.ts # AI ranking storage
│ ├── resumes.ts # Resume management
│ ├── users.ts # User data
│ └── schema.ts # Database schema
├── tooling/
│ └── tailwind/
│ └── theme.css # Dark theme CSS variables
└── packages/
└── ui/ # Shared UI components
- User searches for a job (e.g., "software engineer")
- Next.js API calls Apify Actor via cloud API
- Apify Actor (running in cloud):
- Navigates to Hiredly job listings
- Extracts job detail pages
- Uses Claude AI with structured outputs to parse job data
- Jobs saved to Convex database
- Real-time updates pushed to client via Convex subscriptions
- Jobs fetched from Convex after scraping completes
- Parallel ranking - Multiple jobs ranked simultaneously
- Claude analyzes each job against user's master dump resume
- Fit scores (0-100%) calculated with reasoning
- Rankings saved to Convex, UI updates in real-time
- Results sorted by fit score (highest first)
- Structured Outputs - 100% valid JSON extraction from job listings
- Job Ranking - Fit score with key strengths and potential challenges
- Resume Tailoring - AI rewrites experience to match job requirements
- Cover Letter Writing - Personalized letters based on job description
- PDF Generation - Professional resume PDFs for download
cd my-actor
npm install
apify runcd my-actor
apify login
apify pushMake sure to set ANTHROPIC_API_KEY as a secret environment variable in Apify Console.
pnpm testSearch and scrape jobs from Hiredly, save to Convex.
Rank a single job against user's resume using Claude AI.
Response:
{
"fitScore": 85,
"reasoning": "Strong match due to...",
"keyStrengths": ["React experience", "Team leadership"],
"potentialChallenges": ["No Go experience mentioned"]
}Generate tailored resume content using Claude AI.
Generate personalized cover letter using Claude AI.
Export resume as PDF document.
- Job scraping: ~1-2 minutes for 5 jobs (includes AI parsing)
- AI ranking: Parallel processing, ~5-10 seconds per job
- Real-time updates: Instant UI updates via Convex subscriptions
- Structured outputs: 100% valid JSON, no retries needed
Contributions are welcome! Please feel free to submit a Pull Request.
[Your chosen license]
- Built with create-t3-turbo
- Powered by Apify for web scraping
- AI by Anthropic Claude
- Hosted on Vercel
Built for Cursor Hackathon 2025 🚀