This repo contains the files for maintaining my personal website ⇢ gugulet.hu
- CSS 61.9%
- JavaScript 15.1%
- Shell 11.2%
- Python 5.7%
- HTML 5.3%
- Other 0.8%
| .checks | ||
| .forgejo/workflows | ||
| .vale | ||
| content | ||
| .envrc | ||
| .markdownlint-cli2.jsonc | ||
| .vale.ini | ||
| Dockerfile | ||
| minify.py | ||
| readme.md | ||
| requirements.txt | ||
| skills.md | ||
| zensical.toml | ||
Site
This repo contains the files for maintaining my personal website: gugulet.hu and is built using the Zensical static site generator.
Setup steps
- Clone the repo and enter the directory:
git clone git:git.gugulet.hu/g_it/site.g_it; cd site - Setup the virtual environment:
python3 -m venv .venv - Activate the virtual environment:
source .venv/bin/activate - Install all the packages:
pip install -r requirements.txt - Activate direnv:
direnv allow
Architecture
content/ Source content (Markdown, assets, templates)
assets/css/ Per-page stylesheets
assets/js/ JavaScript (GSAP animations, loader, protection)
assets/fonts/ Custom fonts (ttf)
assets/media/ Images, favicons
overrides/ Jinja2 templates (extends Zensical theme)
index.md Homepage
resume.md Resume page
deploy/ Generated static site (build output)
zensical.toml Build config (site metadata, extensions, theme)
minify.py Post-build CSS/JS/HTML minification
Dockerfile Multi-stage build (Zensical builder + Caddy server)
Build and serve
# Development
source .venv/bin/activate
zensical serve --watch
# Production build
zensical build
rm ./deploy/sitemap.xml
python minify.py
# Docker
docker build -t site:latest .
docker run -p 80:80 site:latest
Key conventions
- Zensical (MkDocs-based) static site generator with
zensical.tomlas single config source. - Markdown + YAML frontmatter for all content. Each page declares its template, extra_css, and extra_js.
- Jinja2 templates in
content/overrides/extend the Zensical base theme. - GSAP + ScrollTrigger for homepage scroll animations. No other JS frameworks.
- Per-section typography: serif (Words), monospace (Technical), display (Visuals).
- CSS custom properties for theming. Responsive sizing via
clamp()and viewport units. - Post-build minification via
minify.py(terser for JS, clean-css for CSS, inline for HTML). Preserves<pre>/<code>blocks. - No database. Fully static output served by Caddy.
- Content protection:
protect.jsprevents right-click and copying. - Anti-AI crawling: meta robots tag with
noai, noimageai.
CI/CD
GitHub Actions runs Vale prose linting and MegaLinter on push/PR to main. Fail on errors.
Dependencies
pip install -r requirements.txt # Python (Zensical, Jinja2, pymdown-extensions)
npm install -g terser clean-css-cli # Node (minification)