Skip to content

USpiri/cv

Repository files navigation

👤 Minimalist CV

Things shop icon
Minimalistic and printable web-based resume.

     

Demo here

About Minimalist CV

Minimalist CV is a simple and minimalist web-based resume built with Astro and Tailwind CSS. It provides a user-friendly layout optimized for printing and supports multiple languages through internationalization. Inspired on Bartosz Jarocki CV and Minimal Porfolio from Midudev.

✨ Features

  • Print-friendly design: The layout ensures a clean and professional print output.
  • Multi-language support: Easily switch between languages (English and Spanish by default).
  • PDF Generation: Create a PDF for each language with a simple command.
  • Structured Data: Store and manage user information in JSON files.
  • API-like JSON Routes: Serve static JSON data for external use (e.g., in a portfolio).

🖼️ Screenshoots

456shots_so 99shots_so 557shots_so

🛠️ Tech Stack

  • Framework: Astro.
  • Language: TypeScript.
  • Styling: Tailwind CSS.
  • PDF scripts: Pupeteer.

📂 Project Structure

src/                             # Astro Main Folder
├── components/                  # Components
│   ├── icons/                   # Icons
│   ├── layout/                  # Layout
│   ├── sections/                # Sections
│   └── ...
├── data/                        # Data schemas and utilities
├── i18n/                        # Internacionalization files
├── layouts/                     # Astro layouts
├── models/                      # Models and interfaces
├── pages/                       # Astro pages routing
├── styles/                      # Styles
└── content.config.ts            # Astro content configuration file
data/                            # User information content
├── en/                          # Language folder
│   ├── education.json           # JSON data
│   ├── projects.json
│   ├── skills.json
│   ├── user.json
│   └── work.json
└── es/
    └── ...
public/                          # Autogenerated pdf, og image and favicon.
└── ...
scripts/                         # Generate pdf scripts
...                              # Config files (package.json, etc.)

Customizing data

User information is stored in the data/ directory, organized by language:

data/                            # Data content
├── en/                          # Language folder
│   ├── education.json           # JSON data
│   ├── projects.json
│   ├── skills.json
│   ├── user.json
│   └── work.json
└── es/
    └── ...

Each JSON file follows a specific schema (defined with astro:schema).

  • user.json: Personal details, contact information, social profiles.
Property Data Type Validation
name String Required
label String Required
image String Required
email String Must be a valid email
phone String Required
url String Must be a valid URL
blog String Must be a valid URL
summary String Required
location Object Contains address (String) and map (valid URL)
profiles Array Contains objects with url (valid URL), network (String), and username (String)
  • work.json: Work experience.
Property Data Type Validation
name String Required
position String Required
summary String Required
location String Required
url String Optional, must be a valid URL
startDate String Required
endDate String Required
remote Boolean Required
highlights Array Contains Strings
  • education.json: Education details.
Property Data Type Validation
institution String Required
url String Optional, must be a valid URL
area String Required
course String Required
studyType String Required
startDate String Required
endDate String Required
  • skills.json: List of skills.
Property Data Type Validation
skills Array Contains Strings
  • projects.json: Projects with descriptions and links.
Property Data Type Validation
name String Required
description String Required
url String Optional, must be a valid URL
urls Array Contains valid URLs
tags Array Contains Strings
highlights Array Contains Strings

Adding a new language

By default, if a translation is missing for a specific language, the English translation will be used.

  1. Add a new language in src/i18n/ui.ts under the languages constant. You can also translate the ui constant by copying an existing language's translation (e.g., fr). Astro will automatically configure itself using the languages constant.
  2. Copy and paste the data/en/ folder and rename it to data/fr/.
  3. Translate the content inside data/fr/.
  4. That's it! The language button will redirect to the next available language according to the order defined in the languages constant.

Generating PDFs

Warning

To generate pdf with generate-pdf command you need Node v22.6.0 or higher.

Add the new language to the languages constant on scripts/web-to-pfd.ts. Run the following command to generate a PDF for each available language:

npm run generate-pdf

Static JSON API

Minimalist CV exposes static JSON endpoints, allowing external applications (e.g., a portfolio) to retrieve user data. Example routes:

  • https://cv.uspiri.com/api/user.json
  • https://cv.uspiri.com/api/work.json

🚀 Getting Started

  1. Clone the repository:
git clone https://github.com/USpiri/cv.git
  1. Navigate to the project directory:
cd cv
  1. Install dependencies:
npm install
  1. Start the Tauri development server:
npm run dev

🤝 Contribution Guidelines

Contributions are welcome! If you'd like to contribute:

  1. Fork the repository.
  2. Create a new branch for your feature or bug fix.
  3. Commit your changes with a descriptive message.
  4. Submit a pull request for review.