Single-file bilingual (RU/EN) personal landing. Pure HTML + Tailwind Play CDN + vanilla JS. No build, no npm.
Lives in docs/ so GitHub Pages can publish it (Pages "Deploy from a branch" only
serves from / (root) or /docs). docs/.nojekyll disables Jekyll.
docs/
├── index.html # everything: markup, styles, i18n dict, theme, reveal
├── README.md
├── build-pdf.sh # renders index.html → dist/*.{en,ru}.pdf (headless Chrome)
├── .nojekyll # serve files verbatim, no Jekyll processing
├── assets/
│ ├── portrait.jpg
│ ├── og.jpg # 1200×630 social card
│ └── og-card.html # source template for og.jpg
└── dist/
├── Gregory_Agapov_Resume.en.pdf
└── Gregory_Agapov_Resume.ru.pdf
Just open the file:
open /Users/xawkay/Develop/resume/docs/index.htmlOr serve it (recommended — some browsers block localStorage on file://):
cd /Users/xawkay/Develop/resume/docs
python3 -m http.server 8000
# → http://localhost:8000The site already lives in docs/ on main of github.com/grgrwlkr/resume. Enable it once:
Repo → Settings → Pages → Deploy from a branch → Branch: main / folder: /docs → Save
After that, every git push to main republishes. Default URL: https://grgrwlkr.github.io/resume/.
Static, no framework — point the project's output/publish directory at docs/.
- Theme (
theme) and language (lang) persist inlocalStorage. First visit respectsprefers-color-schemeandnavigator.language. - Tailwind dark mode is class-based; the pre-paint script in
<head>sets the correct class before first render to avoid flicker. - Fonts (Fraunces display + Hanken Grotesk body) load from Google Fonts. If embedding offline, swap to a local
@font-face. assets/og.jpgis the 1200×630 social-share card, generated fromassets/og-card.htmlvia headless Chrome (see the render command in that file). Regenerate it when the hero copy changes.og:url/canonical/ absoluteog:imageare commented out inindex.html— fill them in with the real domain at deploy time.