Both marks now appear everywhere they would have to work: five sizes down to the real 16 px tab icon, horizontal and stacked lockups, browser tab + site header, phone tiles, console banner + boot splash, social card, and four colour grounds — generated from one geometry source by website/tools/logo-assets.py (outputs committed under data/logo and static/img/logo). The homepage links to the vote and its 'what works today' list catches up with 26.8–26.17: password login, online app catalog, app dependencies, opt-in HTTPS. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MScAinbyMdeNc7H2BZdnnG
3.6 KiB
website/ — furtka.org
Hugo source for furtka.org. Intentionally minimal while the project is pre-alpha: a single idea page in English and German, nothing more. More pages will come back when there's something real to show.
Local build
cd website
hugo server # http://localhost:1313
Requires Hugo extended ≥ 0.140.
Deploy
Hosted on forge-runner-01 (Proxmox VM, Ubuntu 24.04). Hugo runs on the VM;
nginx serves the built output from /var/www/furtka.org. TLS is terminated by
an upstream openresty reverse proxy — the VM itself only speaks plain HTTP.
Auto-deploy on push-to-main (default)
.forgejo/workflows/deploy-site.yml fires on every push to main that touches
website/**. The self-hosted runner is forge-runner-01, so the whole deploy
collapses to a local rsync into /srv/furtka-site/ + hugo --minify into
/var/www/furtka.org/. No SSH hop, no secrets. Runs in under a minute.
The in-CI script is website/deploy-ci.sh. Don't invoke it from your dev box —
it assumes it's already on the target host.
Manual deploy (fallback)
For out-of-band pushes (feature branch, CI outage), deploy from your dev machine:
./website/deploy.sh
This rsyncs website/ to /srv/furtka-site/ on the VM over SSH and runs
hugo --minify into /var/www/furtka.org. Same end state as the CI path,
just with an SSH hop.
Poll counter
/api/poll/ is a tiny stdlib Python service (ops/poll/pollsvc.py,
SQLite, systemd DynamicUser) behind nginx on 127.0.0.1:8090. Install or
update it on the VM with sudo ops/poll/setup-poll.sh; the nginx location
and rate limit come from ops/nginx/ via setup-vm.sh. Devices are told
apart by a salted hash of IP + user agent — no cookie — and a repeat vote
from the same device changes the choice instead of adding one.
First-time VM setup
Only needed once, when provisioning a fresh forge-runner VM:
ssh forge-runner
sudo /srv/furtka-site/ops/nginx/setup-vm.sh # or copy the script over first
Structure
hugo.toml Hugo config (multilingual: en default, de)
content/ Markdown pages
_index.md Home (EN)
_index.de.md Home (DE)
logo.md / .de.md Logo poll (/logo/, /de/logo/) — layout `poll`, votes via /api/poll/
layouts/ Custom inline theme — no external theme or framework
_default/ baseof, single, list
partials/ head, header, footer, gate SVG, lang switcher, mark-m / mark-r (poll)
poll/single.html Logo poll page; strings come from the content front matter
index.html Home-only layout with editorial hero
assets/css/main.css Stylesheet (fingerprinted + minified on build)
assets/js/poll.js Vote script for /logo/ — plain fetch, no cookies, no storage
data/logo/{m,r}.json Generated: mark SVGs, lockups, 16 px icons, console banner per proposal
static/img/logo/ Generated: tiles, splash and social card per proposal
tools/logo-assets.py Generator for the two lines above (cairosvg + Pillow + fontTools);
run on the dev box, commit the output. Font: tools/FONT-PROVENANCE.md
static/favicon.svg Gate mark in crimson
deploy.sh Manual rsync + remote Hugo build (over SSH, for off-CI pushes)
deploy-ci.sh Local rsync + Hugo build — runs on forge-runner-01 from CI
Design
Modern-minimal on paper-white light / near-black dark. System-UI sans
(no webfonts — zero external requests, matches the self-hosting ethos).
Deep crimson accent, prefers-color-scheme switch.
The gate SVG is the one brand mark — a small wicket-gate glyph repeated in the header, footer, and favicon.