A dynamic resume featuring an interactive background, multilingual support, and spam protection.
The project supports the generation of beautifully styled PDF versions of the resume. In production, files are served with maximum gzip compression and decompressed directly in the user's browser.
- 🇬🇧 English: Download CV (PDF)
- 🇷🇺 Русский: Download CV (PDF)
- 🇫🇷 Français: Download CV (PDF)
- Interactive Hero Screen: Animated background on a
<canvas>inside an<iframe>, reacting to user actions (drawing mode). - Multilingual (i18n): Full support for English, Russian, and French. Translations are stored in a convenient
CONTENT.tomlformat and parsed on the fly. - Smart Spam Protection: The contact form uses a Proof-of-Work (PoW) system and time delays on the Cloudflare Worker side to completely eliminate bots without using CAPTCHA.
- Secure Contact Reveal: Email and Telegram are no longer exposed in the source code. They are provided by the worker only after the client solves a cryptographic challenge (PoW).
- Optimized PDF Export: In development mode, the button generates a PDF on the fly via
window.print(). In production, it serves pre-compressed.gzfiles that are decompressed via theDecompressionStreamAPI. - Stale Data Protection: The
pre-pushGit hook automatically checks if PDF renders have been updated after changes to content (CONTENT.toml) or styles. If the code is newer than the PDF, the push is blocked.
The project is built on a strict color system. Below are the primary colors used in the design (from backgrounds to accents).
| Group | Hex Code | Description |
|---|---|---|
| Backgrounds | #070D15 |
Primary dark background (Hero, Topbar) |
#EDEDEE |
Primary light background (Content Area) | |
| Curves / Pattern | #10263D |
Darkest pattern element / Secondary text |
#19426A |
Deep blue pattern | |
#30619B |
Medium blue pattern | |
#6085C4 |
Light blue pattern | |
#889FC9 |
Pale blue pattern | |
#AFB9CA |
Lightest pattern element / Borders | |
| Accent | #5F9F59 |
Primary accent color (buttons, links, highlights) |
| Client (Frontend) | Server (Backend) | Infrastructure |
|---|---|---|
| Vanilla JS (ES6+ Modules) | Cloudflare Workers | Vite (Bundler) |
| CSS Variables & Grid | Web Crypto API (SHA-256) | GitHub Pages (Hosting) |
| TOML parser (i18n) | KV Storage (Rate Limiting) | Git Hooks (Automation) |
To run the project locally, make sure you have Node.js installed.
# 1. Install dependencies
npm install
# 2. Run in development mode (with HTTPS for testing Crypto API)
npm run dev
# 3. Build for production
npm run build
# 4. Preview the built version
npm run previewGit Hooks Automation (Optional)
The project includes a script to protect against pushing stale PDF renders.
- The
scripts/check-pdfs.jsscript compares the modification time of PDF files with content and style files (CONTENT.toml,index.html,src/scripts/,src/styles/). - If the code was changed later than the PDF, the push is interrupted with an error.
- To activate the hook, create a file
.git/hooks/pre-push(or.githooks/pre-pushifcore.hooksPathis configured) with the following content:node scripts/check-pdfs.js
- Make the file executable:
chmod +x .git/hooks/pre-push. - If you need to bypass the check, use the flag:
git push --no-verify.
├── public/
│ ├── assets/ # Images
│ └── pdf/ # Source PDF resume files
├── cloudflare/
│ └── worker.js # Backend for the contact form
├── scripts/
│ ├── check-pdfs.js # Git hook script to check PDF freshness
│ └── compress-pdfs.js # PDF gzip compression script during build
├── src/
│ ├── scripts/ # Modular JavaScript (i18n, render, modals, export)
│ └── styles/ # CSS (variables, components, print)
├── CONTENT.toml # All text content and translations
├── index.html # Main HTML file
└── vite.config.js # Vite configuration
🄯 2026
Built with VSCodium, GLM 5.2, Vite and a lot of Coffee.
This work is licensed under Creative Commons Attribution-ShareAlike 4.0 International.