furtka/website
Daniel Maksymilian Syrnicki aa7dea0528
Some checks failed
CI / lint (push) Successful in 1m24s
CI / test (push) Successful in 2m24s
CI / validate-json (push) Successful in 57s
CI / markdown-links (push) Successful in 29s
Deploy site / deploy (push) Successful in 7s
Build ISO / build-iso (push) Failing after 14m59s
feat(site): pimp homepage with animated 3D background and scroll reveals
Adopts the visual feel of Pascal's prototype while keeping Furtka's
voice, brand palette, and bilingual structure intact.

What changed
- Three.js wireframe torus-knot behind the hero, color/opacity tied
  to the existing --accent / --scene-opacity CSS vars so light and
  dark modes both work without a scene re-init.
- Scroll-driven camera zoom + core scale + tilt; canvas opacity fades
  past hero so feature cards stay readable.
- GSAP + ScrollTrigger reveal hero on load and stagger feature cards
  in as they enter the viewport. Lenis smooths scroll.
- "What works today" / "What's coming next" lists move from markdown
  bullets into front-matter arrays and render as scroll-reveal cards
  (7 + 4 cards, EN/DE parallel; copy is 1:1 from the original lists).
- Hero scaled up: gradient text on the wordmark (fg → accent),
  drop-shadow glow in dark mode, brighter lede color.
- Primary CTA -> /releases listing on Forgejo (Forgejo has no
  /releases/latest), with a pulsing glow + arrow slide on hover.
- Version bump 26.8-alpha -> 26.15-alpha to match the actual release.

Performance / a11y
- Vendor JS (Three.js r128, GSAP 3.12.2 + ScrollTrigger, Lenis 1.0.33)
  vendored locally under assets/js/vendor/ - no third-party CDN at
  runtime. ~728 KB total, fingerprinted via Hugo's pipeline with SRI.
- Canvas + scripts gated to homepage only ({{ if .IsHome }}); the
  Impressum/Datenschutz pages stay plain.
- prefers-reduced-motion: scene + GSAP early-return, CSS forces cards
  to their resting state. No-JS users see all content.
- All scripts deferred so first paint isn't blocked.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-27 16:14:21 +02:00
..
assets feat(site): pimp homepage with animated 3D background and scroll reveals 2026-04-27 16:14:21 +02:00
content feat(site): pimp homepage with animated 3D background and scroll reveals 2026-04-27 16:14:21 +02:00
layouts feat(site): pimp homepage with animated 3D background and scroll reveals 2026-04-27 16:14:21 +02:00
static feat: publish public website at furtka.org 2026-04-14 10:27:51 +02:00
deploy-ci.sh feat(website): legal pages (Impressum/Datenschutz) + auto-deploy on push-to-main 2026-04-18 12:10:06 +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(site): pimp homepage with animated 3D background and scroll reveals 2026-04-27 16:14:21 +02:00
README.md docs: add apps/ authoring guide + realign READMEs with 26.4-alpha 2026-04-20 11:39:48 +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.

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)
layouts/             Custom inline theme — no external theme or framework
  _default/          baseof, single, list
  partials/          head, header, footer, gate SVG, lang switcher
  index.html         Home-only layout with editorial hero
assets/css/main.css  Stylesheet (fingerprinted + minified on build)
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.