This is the big "make scrolling smooth" pass — the biggest wins live
in cold-start, not in the scroll loop itself, but a fast cold start
means GSAP starts in a non-thrashing state and stays there.
- Drop @babel/standalone (~3MB) from the page entirely. app.jsx is
pre-compiled to app.js via deploy/build.sh; the browser loads the
compiled bundle directly. JSX-in-browser was running babel transform
on every page load, which is brutal on phones.
- Switch React UMD bundles from .development to .production.min:
~1.1MB → ~140KB, no dev-mode warnings/checks in the hot path.
- Add `defer` + `<link rel=preload as=script>` for the React/GSAP CDN
scripts so they fetch in parallel with HTML parse, execute in order
after DOM is ready, and don't block first paint.
- Re-encode the three 1.4–1.8MB PNG backgrounds as WebP at full size
(~190KB total) plus a 900px-wide mobile variant (~52KB total).
Mobile preload links use `media=` so phones never download the
full-size variants.
- Move bg-image URLs from inline JSX styles into styles.css so the
mobile media query can swap them in cleanly.
- nginx: long-cache versioned static assets (Cache-Control immutable,
1 year) since URLs already carry ?v=… cache busters; keep the HTML
itself on must-revalidate so the version pointer can update.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- Move deploy/nginx.conf -> deploy/conf.d/default.conf and mount the
directory so future config changes can be hot-reloaded with
`nginx -s reload` instead of a full container restart.
- Add deploy/hook.py: a tiny stdlib HMAC-validated webhook listener that
runs pull.sh on Gitea push events. Bound to 127.0.0.1:9528 and
fronted by openresty at /_hook/deploy.
- Add the matching systemd unit at deploy/facere-deploy-hook.service.
- Teach pull.sh the new layout (reload vs. restart vs. compose up -d)
and self-restart the hook listener if hook.py changes.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Cron on the host runs deploy/pull.sh every minute. It fetches main,
fast-forwards the working tree, and restarts the facere-web container
when deploy/nginx.conf changes (Docker bind-mounts the file by inode,
so the in-container view is otherwise stale after a git reset).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Prevents leaking repo history, the docker-compose / nginx config, and
the auto-pull script via the publicly served root.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Bring in the newer app.jsx/styles.css/facere.html that were edited
directly on the deployed copy, rename Facere.html -> facere.html to
match the nginx index, and check in the docker-compose + nginx.conf
that drives the container.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>