pdf-parse
for PDF résumé text extraction* mammoth
for DOCX résumé text extraction* OpenAI Embeddings (@mmateus/openai-vector
or equivalent) for semantic matching - Store vectors in a Supabase pgvector table (supabase-js
)* Web-scraping / job search: 1. Primary: Google Custom Search API (target=jobs.google.com/, site:naukri.com, site:linkedin.com/jobs, site:careers.icai.org, etc.) 2. Fallback: SerpAPI (free tier) 3. Deduplicate by canonical URL. cron / background: Next.js Cron (vercel-cron) every 6 h → refresh job index.# Pages / routes / components1. /
– Hero + résumé uploader * Upload drop-zone (UploadDropzone
component). * Accept .pdf, .doc, .docx
. * Progress bar → calls parseResumeAction
.2. /results
– Job matches list * Query param: resumeId=uuid
. * Client fetches /api/match?resumeId=…
(SWR). * Grid of JobCard
components (company logo, title, chips for location & salary, 0-100 match bar, “Apply” button).3. /dashboard
(admin-only, via Vercel Password Protect) – list of scraped jobs, vector counts, retry failed scrapes.# Server actions / API endpoints* app/actions/parseResumeAction.ts
```ts // receives File; detects mime; extracts text via pdf-parse or mammoth; // stores raw text in Supabase; returns resumeIdapp/api/match/route.tstsCopyEdit// GET resumeId => returns top 50 job docs ranked by cosine similaritylib/scrapeJobs.tstsCopyEdit// Called by cron: query Google CSE & SerpAPI with// "chartered accountant" | "CA" ("inter", "final" optional) + location filters (all states)// Fetch HTML, extract title, snippet, url, postedDate.// Generate embeddings for title + snippet, upsert into pgvector table.lib/applyScore.tstsCopyEdit// heuristic (30 % skills match, 40 % role keywords, 20 % experience yrs, 10 % location)UX detailsShow a Lottie “searching” animation while matching.Use Skeleton loaders for JobCards.Results list supports filters: city (multi-select), experience band (<3 yrs, 3-5, 5-10, 10+), salary range slider, remote/onsite toggle.Dark-mode ready (Tailwind dark:).AI prompt engineering (server-side comment)javaCopyEditYou are ResumeMatchGPT. Input: {resumeText} + {jobText}. Output JSON: { "overallScore": 0-100, "reasons": ["…", "…"] }. Scoring rubric: 1. Exact match to “Chartered Accountant”, “CA”, “Accountancy”, “Audit”, “IFRS”, “GST”, “Tax”, “SAP-FICO” = +15 each 2. Years of post-qualification experience difference ≤ 1 yr = +20; ≤ 3 yrs = +10 3. Located in same Indian state OR remote = +15 4. Salary meets or exceeds expected (if salary parsed in résumé) = +10 Return the five best reasons for the score.Styling guidelinesCard corners: rounded-2xlShadows: shadow-lgSection spacing: py-16 top/bottom.DeliverablesAll code in a single Next.js project.Include .env.example listing OPENAI_API_KEY, SUPABASE_URL, SUPABASE_ANON_KEY, GOOGLE_CSE_ID, GOOGLE_CSE_KEY, SERPAPI_KEY.Add a README with setup & deployment steps on Vercel.IgnoreDo NOT generate test spec files.yamlCopyEdit---### How to iterate once v0 generates the first draft1. Ask v0 to “swap Supabase for PostgreSQL with neon.tech if it reduces cold-start time.” 2. Add an Edge Function for low-latency matching if traffic grows. 3. Request design tweaks: e.g., _“Use gradient #0369a1
→#0ea5e9
for the hero headline.”_Happy building! (Ref: v0 prompt-writing best-practice—be explicit about functionality, libraries, and styling preferences) :contentReference[oaicite:0]{index=0}::contentReference[oaicite:1]{index=1}Loading...
Loading...
The code returns the following error:
Failed to load "pdfjs-dist" from "blob:https://preview-resumematchgpt-kzmm0bsm0bbc1nmh81gy.vusercontent.net/cc73adf7-1571-4ca4-a411-250a4d296597. Modules must be served with a valid MIME type like application/javascript.", make sure it exists.
Revise the code to address the error.
I was previewing: /