Hirelytics is a small full-stack React app (Vite + React Router) that provides AI-powered resume analysis and ATS scoring. Users upload a PDF resume, the app converts it to an image, sends the file to an AI feedback service (via the Puter.js integration), stores results in a KV store, and displays a detailed review.
- Upload PDF resumes (drag & drop)
- Convert the first page of a PDF to an image preview
- AI-generated structured feedback (ATS score, content, style, structure, skills)
- Persistent storage via the integrated
puterclient (KV, fs) - View and share analyzed resumes with a unique review page
- Lightweight server build for SSR using React Router
- Dockerfile for containerized deployment
- Frontend: React 19 + TypeScript
- Routing: React Router (v7) with SSR support
- Bundler: Vite
- Styling: Tailwind CSS
- State: Zustand (used for
puterstore) - PDF handling:
pdfjs-distto render PDF pages to canvas - AI & storage:
puter.js(injected via script tag) — auth, fs, kv, and AI endpoints
- Node.js 20+ and npm
- A
puter.jsruntime available in the browser (the app loadshttps://js.puter.com/v2/in the HTML layout)
Install dependencies:
npm ciRun the dev server (Vite + React Router dev server):
npm run dev
Build for production:
npm run buildStart the production server (serves build/):
npm run startNotes:
- The app uses the
puterbrowser SDK to access auth, file upload, AI, and KV features. Ensure thehttps://js.puter.com/v2/script can initialize in your environment.
Build and run the included Dockerfile:
docker build -t hirelytics .
docker run -p 3000:3000 hirelyticsThe Dockerfile creates a multi-stage build and runs the built server from build/server.
- User uploads a PDF on the Upload page (
/upload). See app/routes/upload.tsx. - The file is uploaded via
puter.fs.upload, and the app converts the first page to an image usingapp/lib/pdf2img.ts. - The app sends the uploaded PDF path and prepared instructions (job title & description) to
puter.ai.chatviaputer'sfeedbackhelper. The expected AI response is a JSON object matching theFeedbackinterface (see constants/index.ts). - The resulting feedback is stored in the KV store (
puter.kv.set) underresume:<uuid>. - The user is redirected to
/resume/:idto view the review, rendered with components in app/components.
- Layout & app entry: app/root.tsx
- Routes config: app/routes.ts
- Upload flow: app/routes/upload.tsx
- Resume review: app/routes/resume.tsx
- Puter client wrapper (Zustand store): app/lib/puter.ts
- PDF conversion helper: app/lib/pdf2img.ts
- AI instructions & format: constants/index.ts
- Dockerfile: Dockerfile
- The app expects
puter.jsto be available in the browser. The layout includes this script tag:<script src="https://js.puter.com/v2/"></script>(see app/root.tsx). - No additional server-side environment variables are required for the built-in example; production deployments may integrate a proper
puterbackend or runtime.
- Linting/type generation:
npm run typecheckrunsreact-routertypegen andtsc. - The Vite config uses
@react-router/devand Tailwind Vite plugin: vite.config.ts.
- Open an issue or submit a PR. Keep changes focused and add tests where appropriate.
- Add CI (GitHub Actions) to run
npm ciandnpm run typecheck. - Add e2e tests for the upload and review flow.
- Secure production
putercredentials / runtime if deploying publicly.