Modern, minimal curriculum vitae website for Juan AndrΓ©s Moreno Rubio built with Go and HTMX.
A professional, bilingual CV site with server-side PDF generation, HTMX interactivity, and a clean paper design aesthetic. Built as a personal portfolio project showcasing production-grade Go and HTMX development.
This is a personal portfolio project demonstrating production-grade Go and HTMX development.
Open Source: The code is MIT licensed and available for educational purposes. You're welcome to use it as a template or reference for your own projects. This repository is maintained as my personal CV site and may be modified without notice.
Contributions: This is a personal CV project and is feature-complete. I'm not seeking contributions, but you're welcome to use it as a template! If you find a critical security vulnerability, please report it via email.
- Features
- Demo
- Security
- Quick Start
- Updating Your CV
- Export to PDF
- Key Technologies
- Documentation
- Deployment
- Customization
- Privacy & Analytics
- Contributing
- License
- Support
- β Bilingual Support - Spanish and English with instant switching (no page reload)
- β Server-Side PDF Export - Professional PDF generation using chromedp (headless Chrome)
- β Browser Print - Alternative print-friendly layout for manual PDF creation
- β HTMX Dynamic Updates - Smooth UX without heavy JavaScript
- β Paper Design - Professional CV on elegant white paper with gray background
- β Zoom Control - Adjustable zoom (25%-300%) with persistence across sessions
- β Responsive - Mobile, tablet, and desktop friendly
- β JSON-Based Content - Easy to update without touching code
- β AI Development Section - Showcases modern AI-assisted development skills
- β Fast & Lightweight - Go backend with chromedp for PDF generation
- β Privacy-Friendly Analytics - Self-hosted analytics (no third-party data sharing)
- β Security Hardened - CSP headers, XSS protection, origin validation, rate limiting
- β Production Ready - Systemd service, CI/CD workflows, deployment guides
- β Developer Friendly - Hot reload, clear code structure, comprehensive Makefile
π Live Demo: https://juan.andres.morenorub.io/
Live Features:
- Single-page application with no page reloads
- Instant language switching (English β Spanish)
- Professional PDF export with perfect font rendering
- Responsive design from mobile to desktop
- Clean paper aesthetic on gray background
- Print-friendly layouts
Note: This is my personal CV site. The code is open source for learning and reference purposes.
This project demonstrates production-grade security practices with multiple layers of protection.
β Browser-Only Access - Contact form blocks automation tools (curl, Postman, scripts) β CSRF Protection - Cryptographically secure tokens prevent cross-site attacks β Rate Limiting - 5 forms/hour, 3 PDFs/minute to prevent abuse β Bot Detection - Honeypot fields and timing validation β Input Validation - Comprehensive sanitization and injection prevention β Security Headers - A+ rated CSP, HSTS, X-Frame-Options β Security Logging - Structured JSON logs for monitoring β Zero Critical Vulnerabilities - Full OWASP Top 10 compliance
Security Rating: A- (Very Good)
Documentation: See SECURITY.md for complete security architecture and implementation details.
If you want to explore the code or run it locally:
- Go 1.25.1+ installed
- Chrome/Chromium (for PDF generation)
- Make (optional, for easier development)
```bash
git clone https://github.com/juanatsap/cv-site.git cd cv-site
make dev
make run
go run main.go
go build -o cv-server && ./cv-server ```
The project includes automated quality checks at multiple stages:
| Stage | Command | What Runs | Coverage |
|---|---|---|---|
| Commit | git commit |
Pre-commit hook | Changed files only (fast) |
| Push | git push |
Pre-push hook | Entire codebase (same as CI) |
| Manual | make lint |
golangci-lint | Entire codebase |
| Auto-fix | make lint-fix |
golangci-lint --fix | Fixes issues automatically |
Available Make targets:
```bash make lint # Run linter on entire codebase (same as CI) make lint-fix # Auto-fix lint issues where possible make test # Run unit tests make test-all # Run all tests including integration make check # Run lint + unit tests make css-prod # Bundle and minify CSS for production make dev # Start development server with hot reload ```
Bypassing hooks (when needed): ```bash git commit --no-verify # Skip pre-commit hook git push --no-verify # Skip pre-push hook ```
Open http://localhost:1999 in your browser
- π¬π§ English version: http://localhost:1999/?lang=en
- πͺπΈ Spanish version: http://localhost:1999/?lang=es
Language switching is instant via HTMX - no page reload required!
Edit JSON files in data/:
- English:
data/cv-en.json - Spanish:
data/cv-es.json
No code changes needed - just refresh browser!
- Click "Download as PDF" button in the action bar
- PDF is generated server-side using headless Chrome
- File downloads automatically:
CV-Juan-Andres-Moreno-Rubio-{lang}.pdf
Advantages:
- Consistent rendering across all platforms
- Perfect font rendering
- No browser compatibility issues
- Professional quality output
- Click "Print Friendly" button
- Use browser print dialog (Cmd/Ctrl + P)
- Select "Save as PDF"
Endpoints:
- English PDF:
http://localhost:1999/export/pdf?lang=en - Spanish PDF:
http://localhost:1999/export/pdf?lang=es
- Backend: Go 1.21+ (stdlib
net/http, graceful shutdown) - PDF Generation: chromedp (headless Chrome automation)
- Frontend: HTMX 1.9.10 (hypermedia-driven interactions)
- Styling: Custom CSS with Quicksand font from Google Fonts
- Data: JSON files for easy content management
- Deployment: Systemd service, manual binary, GitHub Actions CI/CD
This project includes comprehensive documentation organized by purpose:
- README.md - Project overview, quick start, and features (you are here)
- DEPLOYMENT.md - Production deployment guides for VPS and cloud platforms
- CUSTOMIZATION.md - How to customize this CV template for your own use
- ARCHITECTURE.md - System design, patterns, and technical decisions
- API.md - Complete HTTP API reference and HTMX integration
- SECURITY.md - Complete security architecture, implementation, and testing guide
- PRIVACY.md - Privacy policy template and analytics guidance
- CODE_OF_CONDUCT.md - Community standards (Contributor Covenant)
- CONTRIBUTING.md - Contribution policy (personal project notice)
- LICENSE - MIT License
This project is production-ready with multiple deployment options. See DEPLOYMENT.md for complete guides.
```bash
make install-service
make update-service ```
```bash
make build
GO_ENV=production ./cv-server ```
Deployment guides available for:
- Fly.io - Complete fly.toml configuration
- Google Cloud Run - Container deployment
- AWS ECS - Task definitions
- Railway / Render - Auto-deploy configs
See DEPLOYMENT.md for detailed instructions.
Environment Configuration: Copy .env.example to .env and customize:
PORT- Server port (default: 1999)GO_ENV- Environment (development/production)TEMPLATE_HOT_RELOAD- Enable template hot-reload in development
Security: See SECURITY.md for production deployment best practices.
Want to use this template for your own CV? See CUSTOMIZATION.md for the complete guide!
- Update Content: Edit
data/cv-en.jsonanddata/cv-es.jsonwith your information - Customize Styling: Modify
static/css/main.css(colors, fonts, layout) - Adjust Templates: Edit files in
templates/directory - Add Sections: Update
internal/models/cv.goand JSON files
The CUSTOMIZATION.md guide includes:
- Complete JSON schema documentation
- Visual customization (colors, fonts, layout)
- Template modification examples
- Adding new languages
- Advanced customization patterns
This site demonstrates self-hosted analytics implementation for privacy-conscious tracking.
Key features:
- Self-hosted analytics (no third-party data sharing)
- Privacy-friendly (respects Do Not Track)
- Fully configurable
See PRIVACY.md for complete privacy policy template.
This project is open-source and available for you to use!
If you use this as a template, you should:
- Review the analytics implementation in
templates/index.html - Either configure your own analytics server or remove the tracking code
- Update CSP headers in
internal/middleware/security.goaccordingly - Customize
PRIVACY.mdwith your own privacy policy
See CUSTOMIZATION.md for detailed analytics configuration
Other recommended changes:
- Update all personal information in
data/cv-en.jsonanddata/cv-es.json - Replace profile photo in
static/images/profile/ - Update
ALLOWED_ORIGINSin.envfor API protection - Customize colors and branding in
static/css/main.css
See CUSTOMIZATION.md for the complete customization guide.
This project is licensed under the MIT License - see the LICENSE file for details.
TL;DR: You can use this template for your own CV site, modify it, and distribute it. Just keep the original copyright notice.
- Questions: Feel free to fork and modify - this is a template!
- Security Issues: Report vulnerabilities via email
- Documentation: Check CUSTOMIZATION.md and DEPLOYMENT.md
- HTMX - For making hypermedia-driven applications enjoyable
- chromedp - For reliable headless Chrome automation
- Go Community - For excellent standard library and tooling
- AI Assistance - For accelerating development and documentation
Built with β€οΈ using Go, HTMX, and AI assistance