# LapisCV: Markdown resumes inside Typora, VSCode and Obsidian

> LapisCV is a CSS theme and template set that turns Markdown into an A4 resume PDF in the editor you already use. It is a styling project, not an application, and that shapes both its strengths and its limits.

**BingyanStudio/LapisCV** — 📄 Easily create your resume with Markdown on VSCode / Typora / Obsidian

- Repository: https://github.com/BingyanStudio/LapisCV
- Website: https://lapis-cv.bingyan.net
- Stars: 5,079 · Forks: 317
- Language: CSS
- License: MIT
- Published: 2026-09-23 · Updated: 2026-09-23 · Language: en
- Canonical page: https://hysenlabs.com/projects/bingyanstudio-lapiscv

## What LapisCV actually is, and who it is for

LapisCV is not a resume application. It is a set of CSS files, fonts and Markdown templates that make a Markdown document render as a formatted resume inside an editor you already have open. The README describes it as a way to "easily create resumes with Markdown on VSCode / Typora / Obsidian", and the repository layout backs that up: the top level holds styles/, fonts/, templates/ and a Makefile, with no application source directory and no server component.

The audience follows from that. If your resume already lives as a Markdown file, or you want it to, LapisCV adds typography and page layout without asking you to move into a separate web app. The output is a PDF exported by the editor, so the file you edit and the file you send are produced by the same pipeline. Two visual variants ship: the original LapisCV and LapisCV Serif, which the README lists as new in v2.0.0.

The people who should look elsewhere are those who want a form with labelled fields, a live preview hosted somewhere, or an account that stores versions for them. LapisCV gives you none of that. It gives you a stylesheet and a template, and the rest is your editor.

## The mechanism: one Markdown file, three editor-specific CSS bundles

The build system is the clearest window into how this works. The Makefile defines three output directories under build/: obsidian, typora and vscode. Each target copies the matching template directory and then concatenates a specific list of CSS sources into the destination file.

For Typora, styles/classic/typora.css becomes build/typora/lapis-cv.css and styles/serif/typora.css becomes build/typora/lapis-cv-serif.css, with styles/main.css appended into a lapis-cv/styles/main.css path and the fonts directory copied alongside. The VSCode target mirrors that shape with styles/classic/vscode.css and styles/serif/vscode.css. Obsidian differs: there the concatenated output lands in .obsidian/snippets/lapis-cv.css and .obsidian/snippets/lapis-cv-serif.css, because Obsidian loads CSS through its snippets mechanism rather than through a theme folder.

So the same shared main.css is combined with a per-editor adapter and shipped three ways. The classic and serif variants are not separate themes with separate logic; they are different entry stylesheets fed into the same concatenation step. If you want to understand what a given editor will actually apply, the Makefile's file lists are more informative than the README, which documents the result rather than the assembly.

## Installing LapisCV in VSCode and exporting a first PDF

The README's VSCode path starts from the release archive rather than a package manager. Download the release, unzip it, and open the folder in VSCode. Then install the Markdown PDF extension, which the README links as yzane.markdown-pdf.

```bash
# after unzipping the release archive
code .
```

Opening the folder rather than a single file matters, because the theme paths in .vscode/settings.json are relative to the workspace. The README shows the styles array that selects the classic or serif variant:

```json
"markdown.styles": [
    "./lapis-cv/styles/main.css",
    "./lapis-cv/styles/lapis-cv.css"
]
```

Swapping the second entry to lapis-cv-serif.css switches to the serif variant. With a template file open, the preview icon in the top right renders the styled document, and right-clicking gives Markdown PDF - Export (pdf). Page numbers are configured in the same settings file:

```json
"markdown-pdf.displayHeaderFooter": true,
"markdown-pdf.headerTemplate": "<div></div>",
"markdown-pdf.footerTemplate": "<div style=\"font-size: 9px; margin: 0 auto;\"> <span class='pageNumber'></span> / <span class='totalPages'></span></div>"
```

The README warns that other VSCode extensions can interfere with the styling, and that you should check for plugin conflicts if the rendered result does not match. That is worth taking literally: a Markdown preview extension that injects its own CSS will fight the theme.

## The A4 export settings are manual, and that is the main failure mode

LapisCV does not control the PDF. The editor does. The README's Typora instructions are explicit that before exporting you must set the page size to A4 and margins to custom, with top and bottom margins of 13mm and left and right margins of 15mm. Get that wrong and the layout the CSS was designed around does not hold, no matter how correct the stylesheet is.

VSCode has the same problem in a different place, where margins come from markdown-pdf.margin keys in .vscode/settings.json or from the Markdown-pdf margin section in the Workspace settings tab. Obsidian is the weakest of the three here: the README states that the software itself does not support adding page numbers directly and suggests installing plugins for it. Margins in Obsidian are adjusted through --file-margins in the style file, which means editing CSS rather than a settings dialog.

Page breaks are the other manual lever. The README says to insert --- at the position where a break is needed. That is a horizontal rule in Markdown, reused as a break marker, so the author has to place breaks by hand and re-place them whenever content shifts. Nothing in the documentation describes automatic pagination, and nothing describes a way to verify page count before export.

## Icons, avatars and the places where the Markdown abstraction leaks

The avatar is inserted as raw HTML: the README gives the pattern <img alt="avatar" src="..."> and says to delete the line if no avatar is needed. Icons work the same way, through escaped Unicode entities such as &#xe60f; and &#xe7ca; from a fixed table the README publishes. This is a font-icon approach: the glyphs come from the bundled fonts rather than from an image set, so the icon list is closed. If the symbol you want is not in that table, the README offers no path to add one.

The avatar also exposes an editor-specific trap. The README notes that Obsidian cannot recognize local images inserted in HTML format, and recommends uploading the image as a link before inserting it. So the same Markdown file does not behave identically across the three editors, and a resume that renders correctly in Typora may show a broken avatar in Obsidian. Anyone maintaining one file across two editors should test that case early.

Custom styles are the escape hatch. The README describes modifying variables in the corresponding editor's style file to adapt to different content volumes and adjust details. That is real flexibility, but it means the styling lives in CSS you maintain, not in configuration the project maintains for you.

## How LapisCV differs from a hosted resume builder

The obvious alternative class is a hosted resume builder, where you fill in fields in a web form and the service renders and stores the document. The difference is not cosmetic. A hosted builder owns the document model: it decides what a section is, how entries are ordered, and what the exported PDF looks like. LapisCV owns none of that. Your resume is a Markdown file, and the project's contribution is the stylesheet applied to it.

That has a concrete consequence for version control. A Markdown file diffs cleanly, so a change from one job application to the next shows up as a line in git rather than as an opaque binary or a row in someone else's database. It also means the resume survives the project: if LapisCV stopped being updated, the Markdown file would still be readable and the PDF export would still work, just without the theme.

The trade is that you supply the structure. A hosted builder will prompt you for a phone number field; LapisCV will not, and the README's Format and Style section is a list of conventions you follow by hand rather than a schema the tool enforces.

## Maintenance, licensing and what the release history shows

The repository is not archived, and the last push was on 2026-07-16. Releases are infrequent rather than continuous: v2.0.1 landed on 2026-01-05, v2.0.0 on 2025-03-26, and v1.2.0 before that on 2024-09-14. For a project whose surface is CSS and templates, that cadence is not alarming, but it does mean a reported rendering bug may sit for a while.

The upgrade cost is low in the common case. Because the build concatenates shared styles into per-editor bundles, replacing the lapis-cv directory from a newer release is the whole operation, and your Markdown content is untouched. The risk sits in custom styles: if you edited the CSS variables the README describes, a new release overwrites the files you changed unless you keep your edits separate.

LapisCV is MIT licensed. That permits commercial and private use and modification, and it requires the licence and copyright notice to be preserved. This is a description of the licence text, not legal advice; if you redistribute the theme inside a product, read the LICENSE file in the repository yourself. The bundled fonts are a separate question from the code licence, and the README does not state their terms, so check the fonts/ directory before redistributing the package.

## Conclusion

Adopt LapisCV if you already write in Typora, VSCode or Obsidian and want the resume to be a plain Markdown file you can diff and reuse. Skip it if you need an interactive form-based builder, a hosted editor, or a tool that manages several resume variants at once. Before committing, verify that your editor's PDF export settings match the documented A4 page size with 13mm top and bottom margins and 15mm left and right margins, and check the .vscode/settings.json markdown.styles paths against your own folder layout.

## FAQ

### Is Markdown good for a resume with LapisCV?

LapisCV treats Markdown as the source format and the editor as the renderer, so the resume stays a plain text file you can diff and reuse. The trade is that pagination is manual: the README says to insert --- where a page break is needed, and there is no automatic pagination described.

### How can I convert a Markdown file to a PDF for my resume with LapisCV?

The README's flow is to edit the template in Typora, VSCode or Obsidian and then export from the editor. In VSCode that means the Markdown PDF extension and the Markdown PDF - Export (pdf) command, with the page size set to A4 and margins of 13mm top and bottom and 15mm left and right.

### Which CV builder is actually free?

LapisCV is MIT licensed and distributed as a release archive you unzip, so there is no account or subscription in the documented flow. It is not a builder in the form-based sense: it supplies CSS, fonts and templates for Typora, VSCode and Obsidian, and the editor does the rendering.

## Sources

- [BingyanStudio/LapisCV on GitHub](https://github.com/BingyanStudio/LapisCV)
- [License: MIT](https://github.com/BingyanStudio/LapisCV/blob/main/LICENSE)
- [Project website](https://lapis-cv.bingyan.net)
- [README](https://github.com/BingyanStudio/LapisCV/blob/main/README.md)
- [Releases](https://github.com/BingyanStudio/LapisCV/releases)

---

Hysen Labs editorial analysis, written from the project's own repository and release notes. Cite the canonical page: https://hysenlabs.com/projects/bingyanstudio-lapiscv
