11 Commits

Author SHA1 Message Date
ea85a01edf Install scene: fix cmd-bar overlap, swap install command
The "CLICK TO COPY" hint was absolute-positioned at top:10/right:14 of
the cmd-box, landing on top of "~/facere — bash" in the bar header.
Move the hint into the bar as a flex sibling so the title and hint
share the row cleanly without overlap.

Replace the placeholder install command with the real installer pulled
from raw.githubusercontent.com, with FACERE_GH_TOKEN as a
"contact us for demo" placeholder.

Also fix deploy/build.sh: `npm init -y` rejects the leading-dot dir
name `.build`, and the preset must be resolved by absolute path since
babel runs from the repo root.
2026-05-08 00:45:21 +08:00
d0e6322f9e nginx: stamp must-revalidate on the HTML entrypoint
The Cache-Control on `location = /facere.html` wasn't reaching
browsers because requests for `/` matched `location = /` and never
fell into the named location even with try_files. Set the header
on both, with `always` so it applies to all response codes.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-03 03:18:24 +08:00
b510b33628 Perf: pre-compile JSX, prod React, WebP assets, immutable cache
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>
2026-05-03 03:17:38 +08:00
dbe965d0e9 Mobile scroll perf: cut paint cost and re-render rate
Mobile scrolling was janky from a stack of expensive paint passes
running every frame. This pass:

- CSS: hide .grain (SVG feTurbulence is the single biggest cost),
  drop mix-blend-mode on .haze/.smoke-puff, drop backdrop-filter on
  .cmd-box, hide the blurred arm-glow, and remove blur filters from
  chip-glow / conveyor-pulse / scan-tear under <=760px.
- JSX: capture an IS_MOBILE flag once at boot. On mobile, halve
  smoke puffs / chimneys / sparks / chip-pulse dots / embers, and
  switch GSAP scrub from 0.6 (rAF interpolation) to true (direct
  scroll-tied) — which is cheaper and more responsive.
- HUD: gate setProgress() on a changed integer depth (0..100) so we
  re-render at most ~100 times per full scroll instead of every frame.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-03 03:09:44 +08:00
277d161a95 Mobile responsive pass
- PixelLogo scales to viewport via a responsive hook so FACERE no
  longer overflows narrow screens.
- styles.css mobile breakpoints (760px / 480px / short-landscape)
  unwrap headlines/body copy, compact the HUD, allow the install
  command to wrap on tiny phones, and re-aim the bg pan origins so
  the meaningful slice of each landscape image stays in frame.
- Shorten scroll-track to 480vh on phones — the GSAP timeline still
  scrubs by progress so the choreography is preserved, just less
  exhausting to swipe through.
- Bump cache-busting query string on css/jsx.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-03 03:04:56 +08:00
5029c5db6f Switch nginx config to directory mount and add webhook listener
- 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>
2026-05-03 02:04:02 +08:00
942a0096ba Add deploy/pull.sh and run it from cron for auto-deploy
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>
2026-05-03 01:44:30 +08:00
08d253cdb6 Deny access to .git, deploy/, and deploy-pull.sh
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>
2026-05-03 01:43:09 +08:00
8ea175fa78 Migrate live changes from facere-website and add deploy configs
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>
2026-05-03 01:41:50 +08:00
75aad16a26 Add Facere site source, styles, and assets
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-03 01:33:50 +08:00
2567851beb web 2026-05-01 22:05:22 +08:00