A powerful, flexible resume generator that creates beautiful PDFs and static websites from YAML data files. Built with Go and designed for developers who want version-controlled, multi-language resumes.
📚 Visit the Wiki for comprehensive documentation, guides, and tutorials.
The project wiki is maintained as a Git submodule and contains detailed information about:
- Installation and setup
- Configuration options
- Data structure reference
- Template customization
- Multi-language support
- Development guidelines
- Troubleshooting
When cloning this repository, include the wiki submodule to access documentation locally:
# Clone with all submodules
git clone --recurse-submodules https://github.com/odinnordico/odinnordico.github.io.git
# Or if already cloned, initialize submodules
git submodule init
git submodule updateContributing to the wiki? See the Contributing to the Wiki guide.
- 📄 PDF Generation - Create professional PDF resumes using the gofpdf library
- 🌐 Static Website - Generate a responsive HTML website from the same data
- 🌍 Multi-language Support - Easily maintain resumes in multiple languages
- 🎨 Themeable - Customize the look and feel with templates
- 🔄 Live Reload - Development server with automatic regeneration on file changes
- 📝 YAML-based - Simple, readable data format
- 🎯 Type-safe - Strongly typed Go models ensure data consistency
- PDF Generation: gofpdf - PDF document generator with high level support for text, drawing and images
- Template Engine: Scriggo - Fast Go template engine
- CLI Framework: Cobra - Modern CLI framework
- Configuration: Viper - Configuration management
- File Watching: fsnotify - Cross-platform file system notifications
- Go 1.21 or higher
- Git
# Clone the repository
git clone https://github.com/odinnordico/odinnordico.github.io.git
cd odinnordico.github.io
# Build the binary
go build -o odinnordico.github.io .
# Or install globally
go installThe resume data is stored in YAML files in the data/ directory:
data/
├── basic.yml # Personal information
├── professional.yml # Work experience
├── education.yml # Education history
├── certificates.yml # Certifications
├── skills.yml # Skills and expertise
├── social.yml # Social media links
└── lang/ # Translations
└── es/ # Spanish translations
├── basic.yml
├── professional.yml
└── ...
# Generate PDF for all languages
go run . pdf
# Generate PDF for specific language
go run . pdf --lang es
# Use a custom theme
go run . pdf --theme modernOutput: public/assets/files/resume.pdf (and resume-es.pdf for Spanish)
# Generate static website for all languages
go run . website
# Use a custom theme
go run . website --theme modernOutput: public/index.html (English) and public/es/index.html (Spanish)
# Start server (default: http://localhost:8080)
go run . serve
# Start with live reload (auto-regenerates on file changes)
go run . serve --watch
# Custom host and port
go run . serve --host 0.0.0.0 --port 3000 --watchname: "John Doe"
display_name: "John Doe"
location: "San Francisco, CA"
summary: |
Experienced software engineer with expertise in...
website: "https://johndoe.com"title: "Senior Software Engineer"
years_of_experience: 8
jobs:
- position: "Senior Software Engineer"
company:
name: "Tech Corp"
url: "https://techcorp.com"
logo:
library: "brands"
image: "company-logo"
start_date: 2020-01-15
end_date: null # null means current position
job_description: |
- Led development of microservices architecture
- Mentored junior developers
- Improved system performance by 40%- name: "Email"
url: "mailto:john@example.com"
logo:
library: "solid"
image: "envelope"
- name: "GitHub"
url: "https://github.com/johndoe"
logo:
library: "brands"
image: "github"
- name: "LinkedIn"
url: "https://linkedin.com/in/johndoe"
logo:
library: "brands"
image: "linkedin"- name: "Go"
description: "Backend development, microservices"
level: 9
logo:
library: "devicon"
image: "go"
tags:
- "backend"
- "systems"
- name: "Python"
description: "Data processing, automation"
level: 8
tags:
- "backend"
- "scripting"- title: "Bachelor of Science in Computer Science"
level: "Bachelor's Degree"
provider:
name: "University of Technology"
url: "https://university.edu"
date: 2015-05-20
description: "Graduated with honors"- name: "AWS Certified Solutions Architect"
description: "Professional level certification"
date: 2023-06-15
certificate_url: "https://aws.amazon.com/certification/"
url: "https://verify.cert.com/12345"
provider:
name: "Amazon Web Services"
url: "https://aws.amazon.com"
topics:
- "Cloud Architecture"
- "AWS Services"- Create a language directory:
mkdir -p data/lang/fr- Copy and translate your YAML files:
cp data/basic.yml data/lang/fr/basic.yml
# Edit data/lang/fr/basic.yml with French translations- Generate outputs:
# Generates resume.pdf, resume-es.pdf, resume-fr.pdf
go run . pdf
# Generates index.html, es/index.html, fr/index.html
go run . websiteThe system automatically:
- Detects available languages from
data/lang/directories - Generates PDFs with language suffixes (e.g.,
resume-es.pdf) - Creates language-specific website subdirectories (e.g.,
public/es/) - Uses English as the default/fallback language
Templates are located in templates/default/:
resume.yaml.tmpl- PDF template (YAML-based, rendered with Maroto)index.html.tmpl- Website template (HTML with Scriggo)
The PDF template uses a YAML structure that defines rows and columns:
rows:
- height: 10
cols:
- width: 12
text:
content: "{{.Basic.Name}}"
size: 24
style: bold
align: centerformatDate- Format dates as YYYY-MMformatEndDate- Format end dates or show "Present"formatYear- Extract year from dategetEmail- Extract email from social linksgetPhone- Extract phone from social linkshasSocials- Check if social media links existsplitLines- Split multiline textcalculateHeight- Calculate required height for textassetPath- Resolve absolute asset pathslastURLPart- Extract username from URL
Place your assets in the assets/ directory:
assets/
├── media/
│ ├── brands/ # Brand logos (GitHub, LinkedIn, etc.)
│ │ ├── github.png
│ │ └── linkedin.png
│ └── solid/ # Solid icons
│ └── envelope.png
├── images/
│ └── profile.jpg
└── files/
└── custom.pdf
Assets are automatically copied to public/assets/ during website generation.
--config string # Config file (default: $HOME/.odinnordico.github.io.yaml)
--data-dir string # Data directory (default: "data")
--output-dir string # Output directory (default: "public")go run . pdf [flags]
Flags:
--theme string # Theme name (default: "default")go run . website [flags]
Flags:
--theme string # Theme name (default: "default")go run . serve [flags]
Flags:
--host string # Host to serve on (default: "localhost")
--port string # Port to serve on (default: "8080")
--watch # Enable live reload (default: false)
--theme string # Theme name (default: "default")odinnordico.github.io/
├── cmd/ # CLI commands
│ ├── pdf.go # PDF generation command
│ ├── website.go # Website generation command
│ └── serve.go # Development server command
├── internal/
│ ├── generator/ # PDF and website generators
│ │ ├── pdf.go # PDF generation logic
│ │ ├── template.go # Template parsing and rendering
│ │ └── website.go # Website generation logic
│ ├── loader/ # YAML data loading
│ ├── logger/ # Logging utilities
│ ├── models/ # Data models
│ └── utils/ # Utility functions
├── templates/ # Templates
│ └── default/
│ ├── resume.yaml.tmpl
│ └── index.html.tmpl
├── data/ # Resume data
├── assets/ # Static assets
└── public/ # Generated output
# Build for current platform
go build -o odinnordico.github.io .
# Build for multiple platforms
GOOS=linux GOARCH=amd64 go build -o odinnordico.github.io-linux-amd64 .
GOOS=darwin GOARCH=amd64 go build -o odinnordico.github.io-darwin-amd64 .
GOOS=windows GOARCH=amd64 go build -o odinnordico.github.io-windows-amd64.exe .# Run all tests
go test ./...
# Run with coverage
go test -cover ./...
# Run specific package tests
go test ./internal/generator/...- Create a new theme directory:
mkdir -p templates/mytheme- Copy and modify templates:
cp templates/default/resume.yaml.tmpl templates/mytheme/
cp templates/default/index.html.tmpl templates/mytheme/- Use your theme:
go run . pdf --theme mytheme
go run . website --theme mythemeThe PDF template supports:
- Text: Content, size, style (normal/bold/italic), alignment, color, hyperlinks
- Lines: Thickness, color
- Images: Path, size percentage, centering
Example:
- height: 5
cols:
- width: 6
text:
content: "Hello World"
size: 12
style: bold
align: left
hyperlink: "https://example.com"
color:
red: 0
green: 0
blue: 255Problem: Images not loading in PDF
- Solution: Ensure images are PNG format and paths are correct
- Convert images:
mogrify -format png *.jpg
Problem: Text overflow in PDF
- Solution: Adjust
calculateHeightin template or reduce font size
Problem: Assets not copying
- Solution: Check that assets exist in
assets/directory - Verify file permissions
Error: template file not found
- Check that templates exist in
templates/default/ - Verify
--themeflag is correct
Error: failed to load resume data
- Ensure YAML files are valid
- Check file paths and permissions
Contributions are welcome! We appreciate help with both code and documentation.
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
Help improve our documentation by contributing to the project wiki. See the Contributing to the Wiki guide for details on how to edit wiki pages.
This project is licensed under the MIT License - see the LICENSE file for details.
- gofpdf - PDF document generator with high level support for text, drawing and images
- Scriggo - Fast template engine
- Cobra - Powerful CLI framework
- 📧 Email: odin.nordico90@gmail.com
- 🐛 Issues: GitHub Issues
- 💬 Discussions: GitHub Discussions