A mainframe-inspired terminal CV viewer built with Node.js, React, and Ink.
- 📟 Retro Terminal UI: Green-screen aesthetic with keyboard navigation.
- 📝 Markdown Driven: CV content is managed entirely via Markdown files.
- 📂 Multi-Human Support: Easily switch between different profiles.
- 📟 MacOS/Linux: Just run npx run-cv
- 🪟 Windows: Ensure Node.js is installed, then run npx run-cv in your terminal.
npx run-cv <name>To run the project locally:
pnpm install
pnpm run dev
# or for a specific profile
pnpm run dev <name>To run the CV for a specific human:
pnpm run dev <name>- Create a folder in
src/humans/<name>. - Create an
introduction.mdfile. This acts as the manifest and entry point. (PDF generator now reads from this file;pdf-intro.mdis deprecated.)- Frontmatter may include a
skills:field (comma-separated) and you can place<!-- Skills badges -->somewhere in the body to have them rendered as retro badges in the terminal and as styled labels above the intro text in the PDF.
- Frontmatter may include a
---
name: Your Name
role: Your Role
menu:
- label: Work Experience
file: experience/index.md
- label: Contact
file: contact.md
---
# SYSTEM ONLINE
Welcome to the terminal.- Add the referenced markdown files (e.g.,
experience.md,contact.md) in the same folder.
You can generate a PDF version of a CV using the gen-pdf script. It will include the text from introduction.md at the top; separate pdf-intro.md files are no longer required.
pnpm run gen-pdf <name> [-- --theme <theme-name>]<name>: The name of the human.--theme <theme-name>: (Optional) Specify a theme. Defaults tovintage.
A companion utility, gen-json, will export the same CV content as a
plain JSON file (frontmatter plus markdown body). It ignores any UI/menu
fields so you can consume it from other tools.
pnpm run gen-json <name> [-- --all]Available themes:
vintageterminal
Each theme supports a handful of CSS variables you can tweak in
styles/themes/<theme>/base.css. A new variable --list-item-spacing controls
vertical distance between <li> elements (default 1 mm), so PDFs render
without excessive gaps.
Example:
# Generate a PDF for <name> with the 'terminal' theme
pnpm run gen-pdf <name> -- --theme terminalWe use Semantic Versioning (SemVer) to manage releases. Instead of manually editing package.json, use the following workflow to keep the repository tags, GitHub Releases, and the npm registry in sync.
Start from a clean, up-to-date main (git pull, git status). Decide which part of the version number (
| Command | Result | Use Case |
|---|---|---|
npm version patch |
0.0.x → 0.0.x+1 |
Bug fixes, style tweaks, or minor text updates. |
npm version minor |
0.x.0 → 0.x+1.0 |
New features (e.g., a new PDF theme) that are backward-compatible. |
npm version major |
x.0.0 → x+1.0.0 |
Breaking changes (e.g., changing the data tape structure or CLI API). |
Note: These commands update
package.json, create a git commit, and create an annotated git tag (vX.Y.Z). Usenpm version, notpnpm version— pnpm rejects the-mflag.%sin the message is replaced with the new version.
Example:
npm version patch -m "Release v%s: Fixed header spacing and updated blah theme"git push origin main --follow-tags
--follow-tagsonly pushes annotated tags. If a tag was created by hand withgit tag vX.Y.Z(lightweight), push it explicitly:git push origin vX.Y.Z. Verify withgit ls-remote --tags origin.
pnpm login
pnpm publishgh release create vX.Y.Z --verify-tag --title vX.Y.Z --generate-notes --latestOr in the browser: Releases → Draft a new release → select the pushed tag → Generate release notes → Publish release.
