-
Notifications
You must be signed in to change notification settings - Fork 0
Development
Install Node.js (LTS, v18 or newer) from https://nodejs.org. This gives you node and npm.
Check it's installed:
node -v
npm -vOn Windows, also have Git (for version control) and a code editor like VS Code.
npm installnpm run devThis starts Vite and opens the Electron app pointing at it. Edits to React files refresh live.
npm startnpm test # Vitest unit tests (pure logic: formatting, profiles, exports, theming…)
npm run test:e2e # Playwright e2e smoke suite driving the real Electron app
npm run lint # ESLintCI runs all three on every push, and the release build workflows require them to pass before uploading installers — please run them before opening a PR.
npm run distOutput lands in the release/ folder. On Windows you'll get an NSIS installer and a portable .exe. macOS .dmg builds can't be cross-compiled from Windows/Linux — see .github/workflows/build-mac.yml, which builds them on a GitHub Actions macOS runner instead (there's an equivalent workflow for the Linux AppImage).
electron/
main.cjs Electron main process — window, native menu, file save/load,
PDF/DOCX/TXT export dialogs, spellcheck menu, update check, theme IPC
preload.cjs Safe bridge between UI and the main process
src/
main.jsx React entry
App.jsx Layout, toolbar, tabs, profiles/snapshots/export/theme wiring
Editor.jsx Section-based form (generic field-config-driven card renderer)
Preview.jsx Live resume render (all three templates)
TemplateGallery.jsx Template picker with live thumbnails
SectionNav.jsx Left nav: add/remove/rename/reorder sections
RichBulletField.jsx WYSIWYG bold/italic contenteditable for bullet fields
MonthYearField.jsx Month/year date picker
data.js The resume JSON model + section type definitions
profiles.js Multi-profile storage: index, per-profile body/snapshots, migration
history.js Undo/redo core (+ useHistory.js React hook)
theme.js System/Light/Dark setting, persistence, resolution
exportModel.js Format-agnostic export model shared by all exporters
docxExport.js Word (.docx) serializer (real runs, numbering, hyperlinks)
textExport.js Plain-text (.txt) serializer
format.jsx Bold/italic marker parsing for the preview
richText.js Marker-string <-> DOM helpers for the WYSIWYG fields
textEditing.js List/indent/Enter key math for bullet fields
bulletStyles.js Bullet & numbering style definitions
contactFields.js URL normalization + validation hints for Links
autocompleteData.js Suggestion lists (titles, skills, degrees, proficiencies)
ai.js AI stub — fill in later
styles.css All styling (CSS-variable themed) + print rules
scripts/
launch-electron.cjs Dev/prod launcher (clears ELECTRON_RUN_AS_NODE)
docs-screenshots.mjs Regenerates all docs/wiki screenshots against the current build
e2e/
smoke.mjs Playwright e2e suite (real Electron app, end to end)
Most src/ modules have a matching *.test.js beside them.
After a UI change, rebuild and re-shoot every screenshot in one go:
npm run build
node scripts/docs-screenshots.mjsOutput goes to docs/screenshot.png + docs/screenshots/*.png (1440×900, seeded sample data). Copy the PNGs into the wiki clone to update the wiki's copies.
See the comments in src/ai.js. The key rule: do the actual API call in
electron/main.cjs (the main process) so your API key is never exposed in the
UI. Expose it through preload.cjs the same way save/load/export work, then
call it from ai.js.