Strategic resume assembly for senior engineers.
One career library. Countless angles.
You build a single component library — your roles, bullets, skills, target lines, projects — and tag each piece with a priority per vector. A vector is a positioning angle like "Backend Engineering", "Security Platform", or "Engineering Leadership". When you select a vector, Facet's assembly engine automatically builds the highest-impact resume for that angle, respecting your page budget.
Senior engineers don't have one story — they have many. A single career can target backend infrastructure, security, platform engineering, or leadership roles. Traditional resume builders force you to maintain separate documents or manually reshuffle bullets every time. Facet eliminates that:
- Define once — write each bullet, skill group, and project once in your library
- Prioritize per angle — tag components as
must,strong,optional, orexcludefor each vector - Assemble instantly — select a vector and get a ready-to-send resume in seconds
- Stay within budget — the page budget engine trims lowest-priority content from the oldest roles first
The result is a resume that is always structurally sound, strategically targeted, and produced in a fraction of the time.
- Vector-based assembly — define positioning angles and get purpose-built resumes per target
- Priority system — four-tier priority (
must>strong>optional>exclude) with per-vector overrides - Text variants — write vector-specific phrasing for any bullet or target line, with automatic fallback to default text
- Live PDF preview — WYSIWYG preview rendered via Typst with bundled fonts and downloadable output
- Page budget engine — heuristic page estimation with intelligent trimming (trims lowest-priority bullets from oldest roles)
- Drag-and-drop ordering — reorder bullets within roles, persisted independently per vector
- Saved variants — snapshot your override state and switch between configurations per vector
- Multiple renderers — PDF (Typst), plain text, and Markdown (clipboard)
- Theme presets — multiple typographic themes with full control over fonts, spacing, colors, and layout
- Import / Export — YAML and JSON with strict schema validation and additive merge on import
- Fully local — all data persisted to localStorage, no account required
# macOS
brew install just
# cargo
cargo install justFor details and other platforms — see https://github.com/casey/just#installation
git clone https://github.com/NickCrew/Facet.git
cd facet
just installjust devOpen http://localhost:5173 in your browser.
just build
just preview # preview production build locallyRun just --list to see all recipes:
just dev # Start Vite dev server
just build # TypeScript check + Vite production build
just typecheck # TypeScript type-check only
just test # Run all Vitest tests
just test-file <file> # Run a single test file
just test-watch # Run tests in watch mode
just lint # ESLint
just preview # Preview production build locally
just ci # Full CI check: typecheck + lint + test
just clean # Clean build artifacts
- Define your vectors — create positioning angles like "Backend Engineering" or "Security Platform"
- Build your component library — add target lines, profile summaries, roles with bullets, skill groups, and projects
- Tag priorities — for each component, set its priority (
must/strong/optional/exclude) per vector - Select a vector — the assembler builds the optimal resume for that angle
- Fine-tune — use manual overrides, text variants, and drag-and-drop to polish
- Export — download as PDF, copy as plain text or Markdown, or export your data as YAML/JSON
| Layer | Technology |
|---|---|
| Framework | React 19 |
| Language | TypeScript (strict mode) |
| Build | Vite 7 |
| State | Zustand (persisted to localStorage) |
| PDF Rendering | Typst (via typst.ts WASM) |
| Drag & Drop | @dnd-kit |
| Icons | Lucide React |
| Testing | Vitest + Testing Library |
| Linting | ESLint 9 |
src/
├── engine/ # Core assembly pipeline
│ ├── assembler.ts # Vector-aware resume assembly
│ ├── pageBudget.ts # Page estimation and trimming
│ ├── serializer.ts # YAML/JSON parsing and validation
│ └── importMerge.ts # Additive data merging
├── stores/ # Zustand state management
├── components/ # React UI components
├── templates/ # Resume template definitions
├── renderers/ # PDF, text, and Markdown output
├── utils/ # Shared utilities
├── types.ts # Domain type system
└── test/ # Vitest test suites
Contributions are welcome! Please open an issue first to discuss what you'd like to change.
just ci # runs typecheck + lint + test in one shotFacet - Vector-based modular resume assembly Copyright (C) 2026 Nicholas Crew Ferguson

