Cross-platform desktop editor (Windows, Linux, macOS) for building a CV in a form, rendering it with LaTeX templates and compiling it to PDF with a live preview. It also exports Word (.docx) and LaTeX (.tex), and saves or loads projects as
.cvjson.
These are the recommended downloads for most users: self-contained builds that need no Python and no LaTeX installation. The app can install TinyTeX on first run when you want PDF preview and export.
| Platform | Download |
|---|---|
| Windows x64 | CVLaTex-v0.3.0-windows-x64.zip |
| macOS Apple Silicon (arm64) | CVLaTex-v0.3.0-macos-arm64.zip |
| Linux x86_64 | CVLaTex-v0.3.0-linux-x86_64.tar.gz |
| Checksums | SHA256SUMS.txt |
All four files are attached to the v0.3.0 release. v0.3.0 is the latest public pre-release, the CVLaTeX → CVLaTex rename release; v0.2.1 was the Linux startup fix and v0.2.0 the first public pre-release assembled by CI. The macOS build is Apple Silicon only; Intel Macs are not supported in v0.3.0. All 12 templates, the web assets and the Linux PDF.js viewer ship inside every bundle.
- Windows 10/11 with the WebView2 runtime (preinstalled on current Windows), macOS with the built-in WKWebView, or Linux with WebKitGTK 4.1 plus GObject introspection (
python3-gi,gir1.2-webkit2-4.1; the WebKitGTK 4.1 runtime library is pulled in by these packages on Debian/Ubuntu). Building a bundle additionally needs thelibwebkit2gtk-4.1-devpackage, because PyInstaller must importgiand the GTK backend; running from source or from the bundle does not require-dev. - To run from source: Python 3.12 with pip, plus the packages in
requirements.txt. The standalone bundles need no Python installation. - A LaTeX engine is optional. Preview and PDF export need one, but the app can download and install TinyTeX itself on all three platforms; Word (.docx) and LaTeX (.tex) export never need a LaTeX installation.
For most users: download the archive above, extract it, and run the app. No Python or LaTeX installation is required; the app can install TinyTeX on first run. On first run the language picker asks for the interface language and the app starts with a blank CV; Edit → Load sample CV fills it with a fictional example when you want one.
- Download and extract the
.zip. - Run
CVLaTex.exe. - Windows SmartScreen will warn because the build is unsigned: click More info → Run anyway.
- WebView2 is required and normally preinstalled on Windows 10/11; if missing, install the Microsoft Edge WebView2 Runtime.
- On first run, let the app install TinyTeX if you want PDF preview/export.
- Download and unzip; drag
CVLaTex.appto Applications (optional). - Open it. If Gatekeeper blocks it, right-click the app → Open, or use System Settings → Privacy & Security → Open Anyway.
- This build is Apple Silicon (arm64) only; Intel Macs are not supported in v0.3.0.
- Let the app install TinyTeX if you want PDF preview/export.
-
Install the runtime packages: Debian/Ubuntu
sudo apt install python3-gi gir1.2-webkit2-4.1; Archsudo pacman -S python-gobject webkit2gtk-4.1. -
Extract and run:
tar -xzf CVLaTex-v0.3.0-linux-x86_64.tar.gz chmod +x CVLaTex ./CVLaTex
-
libwebkit2gtk-4.1-devis build-only and not needed to run. -
Let the app install TinyTeX if you want PDF preview/export.
Linux:
sudo apt-get install python3-gi gir1.2-webkit2-4.1 python3-venv
python3 -m venv --system-site-packages .venv
.venv/bin/pip install -r requirements.txt
.venv/bin/python main.pyAdd libwebkit2gtk-4.1-dev only when building a bundle with ./build.sh; it is not needed to run from source.
macOS:
python3 -m venv .venv
.venv/bin/pip install -r requirements.txt
.venv/bin/python main.pyWindows (PowerShell):
python -m venv .venv
.venv\Scripts\pip install -r requirements.txt
.venv\Scripts\python.exe main.pyOn Linux the --system-site-packages flag is required so the venv sees the distro PyGObject/WebKitGTK packages; on macOS it is unnecessary. Full setup, test and build instructions are in docs/DEVELOPMENT.md.
v0.3.0 is the latest public pre-release. The direct downloads are in Download and the same files are attached to the v0.3.0 release. Versions in the 0.* series are published as GitHub pre-releases. (v0.1.0 was uploaded manually; v0.2.0 was the first archive set produced by the release workflow; v0.2.1 fixed the Linux bundle startup failure; v0.3.0 renames the product to CVLaTex.)
| Platform | Architecture | Asset |
|---|---|---|
| Windows | x64 | CVLaTex-v0.3.0-windows-x64.zip (contains CVLaTex.exe) |
| Linux | x86_64 | CVLaTex-v0.3.0-linux-x86_64.tar.gz (contains CVLaTex) |
| macOS | Apple Silicon (arm64) | CVLaTex-v0.3.0-macos-arm64.zip (contains CVLaTex.app) |
| All platforms | — | SHA256SUMS.txt |
GitHub's macos-latest runner currently builds natively on Apple Silicon, so
the v0.3.0 macOS asset is named CVLaTex-v0.3.0-macos-arm64.zip. No universal
macOS binary and no Intel macOS build are produced for v0.3.0.
Verify a download with the checksum manifest (Linux/macOS, with the downloaded
files and SHA256SUMS.txt in the current directory):
sha256sum -c SHA256SUMS.txtOn Windows, compare Get-FileHash -Algorithm SHA256 <file> with the matching
line in SHA256SUMS.txt.
Unsigned builds: the Windows and macOS bundles are not code-signed or
notarized. Windows SmartScreen may warn about the executable, and macOS
Gatekeeper may block the .app on first launch (open it from Finder with
right-click → Open, or allow it in System Settings → Privacy & Security).
Verify the SHA-256 checksum and build provenance before running a bundle.
Linux runtime: the bundle needs WebKitGTK 4.1 and GObject introspection from
your distribution — on Debian/Ubuntu python3-gi and
gir1.2-webkit2-4.1 (the build-only libwebkit2gtk-4.1-dev is needed only
when building), on Arch python-gobject and webkit2gtk-4.1.
Release notes live in CHANGELOG.md, the security policy in SECURITY.md and the third-party licenses in THIRD_PARTY_NOTICES.md.
The form is on the left and the compiled preview on the right; changes are recompiled automatically while typing (configurable in Settings). On Windows and macOS the preview is the webview's native PDF viewer. On Linux, where WebKitGTK cannot render PDFs inline, it is drawn by the PDF.js build vendored in web/pdfjs/ and served locally at /pdfjs/. If PDF.js fails to load or render, the notice above the preview offers Open PDF with the system viewer, which opens the last compiled PDF with the desktop's default viewer.
Edit → CV template groups the 12 templates into ATS Friendly (Classic, Harvard (academic)), Chinese styles (Chinese (standard), Black tabs, Blue ribbon, Navy minimal, Playful, Sword) and Normal CV (Modern, Creative, Sidebar (left), Sidebar (right)).
The Sidebar layout paints a full-height accent bar on the left of the first page only, holding the photo, school logo, contacts, social networks and extra details, while the main column keeps the name/profession header and the professional sections; the first page reserves about 7 cm on the left for the bar (ignoring the left margin setting) and pages 2+ use the configured margins and the full text width. Sidebar (right) mirrors the same layout with the bar on the right of the first page only, reserving about 7 cm on the right (ignoring the right margin setting) and using the configured margins and full text width afterwards. TeX fixes line breaks before pagination, so a single paragraph that straddles the page 1/2 break keeps its first-page line width; breaks between sections or entries reflow normally.
Chinese (standard) renders with a per-OS CJK font fallback (Microsoft YaHei, PingFang SC, Noto Sans CJK SC, WenQuanYi Zen Hei, Source Han Sans SC) and switches compilation to XeLaTeX automatically. Black tabs wraps every page in a heavy frame with black section tabs, Blue ribbon uses a slanted blue header band and a gold accent, Navy minimal keeps navy rules and dense three-column academic entries, Playful combines a large name, badge-style headings, diamond bullets and purple links, and Sword pairs a slanted navy name banner with a two-column contact grid (personal data on the left, profile links on the right, no row hairlines) and navy section plates over gray bars.
Every header shows the person's name as its main element instead of a redundant "resume" label, and long names shrink automatically to fit their banner or column.
- Personal details plus a Social networks card: pick a network (GitHub, LinkedIn, X, Instagram, Facebook, YouTube, TikTok, Telegram, WeChat, Website or Other, which also takes a custom name), type the URL/username, and remove entries you no longer need.
- Extra details holds custom label/value pairs shown in the CV header; the old birth date and nationality fields now live here.
- Body sections: Education, Profile, Work, Internships, Projects, Campus activities, Skills & certificates, Languages, References. Each section header lets you rename it inline, hide/show it and move it up or down; the five entry-list sections support 1–3 columns.
Edit → Load sample CV fills the form in the current CV label language (Spanish, English or Chinese), independent of the selected template. The same career story is translated for the three languages and the active template is kept, so you can see how to complete every field.
The Add menu inserts free blocks interleaved with the standard sections:
Columns(1–3) andPeriod + descriptionlist templates.Separator line,Color bandandBlank space.Custom sectionwith a title and multi-line content.
Each block is anchored to the start, after a section, or to the end, and can be moved. Add → Manage blocks… edits, moves and deletes existing blocks. A block anchored to a hidden section keeps its position. In the Word export, free-block columns stay a single column.
File → Settings includes the Document colors fieldset (Primary, Secondary, Text, Gray). Each color can be typed as #RRGGBB, picked with the color wheel, or reset with Auto; an empty field uses the template's own color. The palette affects the exported document (PDF, Word, .tex), not the UI theme.
- UI language applies to the interface. On first launch CVLaTex asks for it (English preselected) before the LaTeX setup wizard; the choice is stored in the preferences and applied instantly, including the window title.
File → Settings → Interface languageoffers English (default), Español, 中文 and Русский and can change it later. - Document language is the per-CV
CV label languagefield (Spanish, English or Chinese; no Russian option). It selects the labels, fonts and engine used to render the CV. A new CV defaults to the UI language (English when the UI is Russian); the value is then saved with the document, so saved CVs keep their language and do not follow later UI changes.
File → Export → PDF…compiles the document (requires a LaTeX engine).File → Export → LaTeX…writes the generated.texwith the data block embedded as comments.File → Export → Word (.docx)…writes a.docxwith python-docx (no LaTeX needed) that follows the selected template instead of one generic layout: the header composition, section-heading shape, entry lines (right-tabbed date/title lines in the Latin templates, three-column entries in the Chinese-style ones), bullet markers and separators are reproduced with the template palette, and Preferences override its colors. The Latin templates also honour the 1–3 columns of the five entry-list sections; the Chinese-style templates keep their three-column entries and ignore that setting, as in the PDF.File → Import LaTeX (.tex)…rebuilds the form from the data block embedded in a CVLaTex.tex; files without it are rejected with an alert.File → Save…/File → Open…use the.cvjsonproject format: version 3 stores the data plus the photo and logos embedded in base64. v1/v2 files are accepted and migrated (a backup copy with the.v2.baksuffix is written first, never clobbering an existing one).- Autosave writes unsaved changes to the app data directory (
%LOCALAPPDATA%\CVLaTexon Windows,~/Library/Application Support/CVLaTexon macOS,$XDG_DATA_HOME/CVLaTexor~/.local/share/CVLaTexon Linux); on the next start CVLaTex offers to recover it only if it differs from an empty CV. Closing the window with unsaved changes opens a guard with Save / Exit without saving / Cancel; Save writes to the current.cvjson(and asks for a path when the CV has none yet).
The Word layout is an approximation built from WordprocessingML primitives, not a pixel copy of the PDF. Shapes are built from shading and borders rather than DrawingML or VML, and nothing is rotated, so the slanted ornaments (the Sword blade tip, the Blue ribbon wing) are drawn as stair-stepped bars. The Sidebar bar starts at the top margin instead of the paper edge and continues on later pages, while the PDF draws that bar on page 1 only; on the last page it ends with the content. Fonts are written explicitly (Cambria, Calibri for Playful, Microsoft YaHei for CJK), so a machine without them gets the system substitution. Word's line breaking and pagination differ from TeX, and free-block columns stay single-column.
Choose photo… normalizes the image (JPEG, longest side ≤ 1600 px) and opens the crop editor with the full image selected; cancelling keeps the normalized image, and Adjust area… reopens the crop later. The applied crop is saved as JPEG ≤ 1600 px. School and entry logos are normalized to PNG ≤ 512 px (no crop).
Ctrl+S saves, Ctrl+O opens, Ctrl+N starts a new CV, Ctrl+Enter recompiles, Ctrl+Z / Ctrl+Y (or Ctrl+Shift+Z) undo/redo. The preview zooms to 75%, 100% or 125%, and the form/preview split can be dragged (double-click resets it to 50%).
PDF preview and export need a LaTeX engine. pdflatex is resolved in this order:
- The
latex_pathpreference, set fromSettings → LaTeX engine → Change path…. - TinyTeX installed by the app in the app data directory (
tinytex/). pdflatexon thePATH(MiKTeX, TeX Live, MacTeX).
On first run, after the interface-language picker, the setup wizard offers to download and install TinyTeX automatically on Windows, Linux and macOS. The release asset is used exactly as published: when the release provides a SHA-256 checksum it is verified and a mismatch aborts the install; when no checksum asset is available (as in the pinned tinytex-releases version) the install proceeds after a warning that integrity could not be verified. The installation can be cancelled while in progress. Chinese text or a fontspec preamble switches to xelatex automatically. Word export requires no engine.
- "No LaTeX engine found" or the "No LaTeX engine is configured" warning: install TinyTeX from the setup wizard, or set the
pdflatexpath inSettings → LaTeX engine. Preview and PDF export stay disabled until an engine is found. - Linux: the integrated preview is empty: the preview is rendered with the bundled PDF.js, so a blank preview usually means
web/pdfjs/was not bundled (the build includes it via--add-data) or PDF.js failed to load. The notice then offers Open PDF with the system viewer, which opens the last compiled PDF with the desktop's default viewer as a fallback. - Linux: the app does not start / no webview: install the WebKitGTK/gir runtime packages from Requirements (
python3-gi,gir1.2-webkit2-4.1; add the build-onlylibwebkit2gtk-4.1-devpackage only if you are building a bundle). - Linux bundle exits with
You must have either QT or GTK...orNo module named 'gi': the build machine's venv could not see the distro PyGObject, so the bundle shipped without the GTK backend. Install the system packages from Requirements and rebuild with./build.sh; it recreates the venv with--system-site-packagesso PyInstaller can importgi. - Missing LaTeX package: the errors shown under the preview name the problem; install the package with your TeX distribution's manager or re-run the TinyTeX installer.
- A
.texfile is rejected on import: only files generated or exported by CVLaTex can be imported, because they carry the embedded data block. Foreign LaTeX files are not parsed heuristically. - Saving from the embedded PDF viewer does nothing: downloads are enabled in the WebView so the viewer's save button opens the native dialog; if it still fails, use
File → Export → PDF…. - Building on Windows cannot replace the executable: close the running app first; Windows locks the executable while it runs.
- A bundle built on one OS does not run on another: bundles are per-platform; build natively or use the CI artifacts.
Install the test dependencies and run the suite:
.venv/bin/pip install -r requirements-dev.txt
.venv/bin/python -m pytest -m "not latex" -q # fast loop: skips LaTeX compiles
.venv/bin/python -m pytest -n auto # full suite, parallelThe fast loop excludes the slow PDF compilations, so use it while iterating and run the full suite before opening a pull request. The PDF compile tests are skipped, not failed, when pdflatex/xelatex are not installed. Validate the frontend syntax without a browser (optional, needs Node):
node --check web/app.js
node --check web/i18n.jsBuild the release archives with ./build.sh on Linux/macOS or build.bat on Windows. Each script stages the public assets, runs PyInstaller and calls tools/package_release.py, producing dist/CVLaTex-v0.3.0-linux-x86_64.tar.gz, dist/CVLaTex-v0.3.0-macos-arm64.zip and dist/CVLaTex-v0.3.0-windows-x64.zip. The raw dist/CVLaTex_Linux, dist/CVLaTex.app and dist/CVLaTex.exe stay available for local runs.
Setup for all platforms, architecture, testing strategy and the guides for adding templates or data fields are in docs/DEVELOPMENT.md.
Contributions are welcome. Read CONTRIBUTING.md for the workflow and docs/DEVELOPMENT.md for setup.
MIT — see LICENSE.