furtka/website
Daniel Maksymilian Syrnicki 91aa33b891
All checks were successful
CI / lint (pull_request) Successful in 30s
CI / validate-json (pull_request) Successful in 24s
CI / markdown-links (pull_request) Successful in 16s
CI / test (pull_request) Successful in 1m47s
CI / lint (push) Successful in 28s
CI / test (push) Successful in 1m56s
CI / validate-json (push) Successful in 24s
CI / markdown-links (push) Successful in 21s
Deploy site / deploy (push) Successful in 5s
Build ISO / build-iso (push) Successful in 20m27s
feat(brand): Mark M is the Furtka logo — website, installer, box UI, console, boot splash
The logo vote on furtka.org closed with M 29 · R 13 (42 votes).

- website/tools/brand-assets.py generates every brand file from the
  logo-assets.py geometry: favicons (small-size tier, accent with a
  dark-mode variant) for website / webinstaller / on-box UI, 180 px
  apple-touch-icon, 1200x630 default share card, 640x480 syslinux splash,
  and docs/brand/ (mark, small mark, lockups, 20-column console art)
- website: header mark, favicon, touch icon, default og:image; /logo/ now
  shows the final result (static counts, winner highlighted, no voting
  UI or poll.js); homepage link reads 'meet our new logo'
- webinstaller: M in the header + tab icon
- on-box UI: .brand mark via CSS mask in brand red (not the UI's green),
  favicon on every page, brand line on the login page
- console: M art above the text of /etc/issue on the installed box
  (furtka-welcome) and the live ISO (furtka-update-issue)
- ISO: build.sh swaps releng's Arch splash for the Furtka one
- README shows the lockup

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Wq1hzUp4ZmCKHDuLKCnu73
2026-09-28 15:08:49 +02:00
..
assets feat(brand): Mark M is the Furtka logo — website, installer, box UI, console, boot splash 2026-09-28 15:08:49 +02:00
content feat(brand): Mark M is the Furtka logo — website, installer, box UI, console, boot splash 2026-09-28 15:08:49 +02:00
data/logo fix(website): sharper console banners on /logo/ (30 columns, coverage-sampled), no line gaps or phone text inflation 2026-08-26 14:04:47 +02:00
layouts feat(brand): Mark M is the Furtka logo — website, installer, box UI, console, boot splash 2026-09-28 15:08:49 +02:00
static feat(brand): Mark M is the Furtka logo — website, installer, box UI, console, boot splash 2026-09-28 15:08:49 +02:00
tools feat(brand): Mark M is the Furtka logo — website, installer, box UI, console, boot splash 2026-09-28 15:08:49 +02:00
deploy-ci.sh fix(website): build on Hugo 0.147 again (site.Data), chown site trees even when the CI build fails 2026-08-26 13:35:40 +02:00
deploy.sh feat(website): legal pages (Impressum/Datenschutz) + auto-deploy on push-to-main 2026-04-18 12:10:06 +02:00
hugo.toml feat(website): download page for the ISO, homepage with download CTA and 3-step how-it-works 2026-09-28 14:52:59 +02:00
README.md feat(website): logo showcase on /logo/, poll link + current feature list on the homepage 2026-08-26 13:30:10 +02:00

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.