Open-source desktop app that helps you tailor your resume to any job posting — privately and offline.
No cloud, no subscriptions, no data collection. Your resume never leaves your machine.
Most ATS checkers are SaaS tools that upload your resume to their servers, charge a monthly fee, and lock features behind paywalls. ResumeFlow takes a different approach:
- 100% offline — all analysis runs locally on your machine via Rust. No internet needed (except optional URL fetch for job descriptions).
- Free & open source — MIT license, no premium tiers, no limits. Fork it, modify it, make it yours.
- Fast — native desktop performance, not a slow web app. PDF parsing + keyword analysis in milliseconds.
- Multilingual — interface available in English, Russian, and Polish.
You drop in your resume (PDF or plain text), paste a job description (or grab it from a URL), and ResumeFlow instantly shows which keywords you're missing, how well your resume matches the listing, flags weak action verbs, and whether the PDF actually parsed correctly. You can also edit your resume in a built-in block editor with live analysis feedback.
| Feature | Description |
|---|---|
| Resume import | Upload PDF or DOCX, or paste text directly, then hydrate the builder safely |
| Job description input | Paste text or fetch from any URL |
| Block editor | Section-based resume editor with drag-and-drop & keyboard reorder |
| Resume builder | Full WYSIWYG builder with 3 templates (Classic, Modern, Minimal) |
| PDF export | Typst-generated PDF export from the same render request as the live preview |
| DOCX export | Best-effort DOCX export that keeps key template styling |
| Field-level layout | Per-field typography plus per-field margin/padding controls beside each editor field |
| Keyword matching | Dictionary-based analysis of 150+ tech skills, frameworks, and tools |
| Match score | Weighted percentage showing how well your resume fits the job |
| Action verb linter | Detects weak verbs ("worked", "helped") and suggests stronger alternatives |
| Readability check | Detects broken PDF extraction, missing sections, garbled text, word count |
| PDF link extraction | Clickable hyperlinks preserved from the original PDF |
| Live preview | Resume preview with zoom controls (persisted to localStorage) |
| Accessibility | ARIA roles, keyboard navigation, screen-reader support |
| Dark theme | Easy on the eyes, always |
| i18n | English, Russian, Polish — all strings translated including exports |
| Error boundary | Graceful crash recovery without losing app state |
| Security | DOMPurify sanitization, file size validation, no unsafe innerHTML |
Grab the latest installer from the Releases page.
Builds are published automatically via GitHub Actions for Windows, macOS, and Linux.
| Layer | Technology |
|---|---|
| Desktop framework | Tauri 2 |
| Frontend | React 19, TypeScript 6.0, Tailwind CSS 4 |
| State management | Zustand 5 |
| Preview/PDF export | Typst renderer in Rust + Tauri commands |
| DOCX export | docx 9.7 |
| Backend | Rust — pdf-extract, reqwest, scraper, Typst |
| i18n | react-i18next (EN, RU, PL) |
| Testing | Vitest + React Testing Library (frontend), cargo test (Rust) |
| Linting | ESLint 10 + Prettier 3 |
- Node.js 20+
- Rust 1.80+
- Tauri prerequisites for your OS
git clone https://github.com/al3xb0/ResumeFlow.git
cd ResumeFlow
npm install
npm run tauri devnpm run tauri buildThe installer will appear in src-tauri/target/release/bundle/.
# Frontend tests
npm test
# Rust CI checks
cd src-tauri && cargo fmt --check
cd src-tauri && cargo clippy -- -D warnings
cd src-tauri && cargo test
# Full check (lint + format + types + tests)
npm run check| Script | Description |
|---|---|
npm run dev |
Start Vite dev server |
npm run build |
Typecheck + Vite production build |
npm run lint |
ESLint check |
npm run lint:fix |
ESLint auto-fix |
npm run format |
Prettier auto-format |
npm run format:check |
Prettier check |
npm test |
Run Vitest tests |
npm run check |
Full CI check (lint + format + types + tests) |
├── src/ # React frontend
│ ├── components/ # UI components
│ ├── hooks/ # Custom React hooks
│ ├── store/ # Zustand stores (resume, editor, builder, toast)
│ ├── lib/ # Utilities, export helpers, render-request builders
│ ├── templates/ # Shared template defaults and theme tokens
│ ├── types/ # TypeScript type definitions
│ ├── i18n/ # react-i18next setup & locale JSON files
│ └── index.css # Tailwind theme & CSS variables
├── src-tauri/ # Rust backend
│ └── src/
│ ├── config.rs # Runtime analysis config loading / validation
│ ├── error.rs # Structured app errors exposed to the frontend
│ ├── lib.rs # Tauri command handlers
│ ├── parser.rs # PDF text & hyperlink extraction
│ ├── scraper.rs # URL fetching & HTML parsing
│ └── analysis/ # Analysis engine
│ ├── mod.rs # Re-exports & text normalization
│ ├── keywords.rs # Keyword matching & scoring
│ ├── readability.rs # Readability & structure checks
│ └── verbs.rs # Action verb linting
├── src-tauri/resources/ # Bundled runtime analysis configuration JSON
├── .github/workflows/ # CI & release pipelines
├── eslint.config.js # ESLint configuration
├── .prettierrc # Prettier configuration
└── package.json
The builder preview is now the visual source of truth for PDF output:
- The editor preview calls the same Rust Typst pipeline as PDF export, so preview pages and exported PDFs come from the same render request.
- Layout customization now supports per-field typography plus per-field margin/padding overrides, edited directly next to the corresponding builder inputs.
- DOCX export keeps template-aware typography and accents as a best-effort office-document export rather than a pixel-perfect Typst clone.
We use a Gitflow workflow. See CONTRIBUTING.md for the full branching strategy.
| Branch | Purpose |
|---|---|
main |
Stable releases, tagged vX.Y.Z |
develop |
Next-release integration branch |
feature/* |
New features |
fix/* |
Bug fixes |
hotfix/* |
Urgent production fixes |
ResumeFlow is open source and contributions are welcome! See CONTRIBUTING.md for guidelines on branching, commit conventions, code style, and how to get started.
Feel free to open issues, suggest features, or submit pull requests.
MIT — do whatever you want with it.