Commit Graph

30 Commits

Author SHA1 Message Date
jwright af7e0287d4 fix(ui): backdrop now moves in every browser
build-and-deploy / build (push) Failing after 14m47s
The backdrop's only motion was the scroll-driven pan (animation-timeline:
scroll()), which is Chromium-only — so in Firefox/Safari the board sat dead
still. Add a continuous timed top↔bottom drift (48s, alternates) as the
universal baseline; keep the scroll-coupled pan as a Chromium enhancement that
overrides it. Motion-safe: both gated behind prefers-reduced-motion.
2026-06-27 20:54:08 +10:00
jwright 2aae7c287e ui: backdrop pan — monotonic top→bottom drift
build-and-deploy / build (push) Failing after 11m19s
The S→E→SE→NE loop wandered back near its start, so on a long page the
per-screen movement was imperceptible (worse once the image was zoomed to
215%). Replace it with a single continuous vertical pan (~40% travel) so the
board obviously drifts downward as the page scrolls.
2026-06-27 20:47:36 +10:00
jwright 9e177dcc41 ui+content: zoom the backdrop + de-dupe blog titles
build-and-deploy / build (push) Failing after 11m32s
- Backdrop image scaled 168% → 215% so the Bat-Computer board reads bigger
  and more immersive, with more room for the scroll-pan.
- Retitle the least-privilege post "The most secure credential is the one
  you never mount" → "Every pod holds a key to a door it never opens" so it
  no longer mirrors the "...inbound port is the one you never open" post.
2026-06-27 20:42:02 +10:00
jwright 99455d0168 chore(deps): upgrade Astro 6.4 → 7.0 (Vite 8)
Bumps astro to 7.0.3 and @astrojs/check to the matching release. Vite 8
under the hood; @tailwindcss/vite/sitemap/rss already compatible, Node 22
satisfied. Verified end-to-end: typecheck (0 errors), build, dist scan,
audit gate, and visual render (hero + blog + Shiki) all clean under the new
Rust compiler + Markdown pipeline.
2026-06-27 20:42:02 +10:00
jwright 03b0cf7c7f feat(ui): electric Bat-Computer redesign — cyan→magenta theme
build-and-deploy / build (push) Failing after 11m29s
Cinematic full-page backdrop: per-theme Bat-Computer board image,
scroll-panned (S→E→SE→NE) via CSS scroll-driven animation behind a
legibility scrim — replaces the grid/aura motif.

- Accent retuned royal-blue → the board's cyan→magenta; headline runs a
  cyan→magenta electric sweep; gradient primary CTA + scroll-progress line.
- Display face: self-hosted Chakra Petch (OFL) on hero + section titles.
- Skill chips reworked as circuit-node chips (glowing via + gradient hover
  outline); frosted-glass cards with a cyan→magenta hover hairline; section
  eyebrows get a gradient tick.
- Remove unused BackgroundGrid component + grid assets.

All CSS-only / zero external requests / no inline JS — strict CSP and A+
security headers preserved.
2026-06-27 20:31:48 +10:00
jwright d64f528ff7 Merge pull request 'docker: digest-pin the node:22-bookworm-slim build base' (#2) from mirror/node-digest-pin into main
build-and-deploy / build (push) Failing after 12m42s
Reviewed-on: #2
2026-06-23 11:01:59 +00:00
jwright dc42d31595 docker: digest-pin the node:22-bookworm-slim build base
Pin the floating node:22-bookworm-slim tag to its index digest. The re-resolve
of this unpinned docker.io tag every build was the recurring CI 'hang'. Paired
with the bastion runner now pulling through the zot mirror, the base is fetched
once and cached. (nginx runtime stage was already digest-pinned.)
2026-06-23 20:47:02 +10:00
jwright c5d9da9092 Merge pull request 'blog: 'The most secure credential is the one you never mount'' (#1) from blog/workload-least-privilege into main
build-and-deploy / build (push) Failing after 13m51s
Reviewed-on: #1
2026-06-23 09:20:50 +00:00
jwright b18c6589bf blog: 'The most secure credential is the one you never mount'
Least-privilege for Kubernetes workloads — own ServiceAccount + no auto-mounted
API token, then non-root + dropped caps, then Pod Security as the enforced floor.
Adds a matching house-style SVG diagram (workload-least-privilege).
2026-06-23 19:17:03 +10:00
jwright cbb82eb97b Add SSO+2FA and outbound-exposure posts with Excalidraw architecture diagrams; Diagram component serves outlined SVGs
build-and-deploy / build (push) Failing after 12m1s
2026-06-22 16:26:15 +10:00
jwright 1c87af560d ci(bump-digest): force-push the ephemeral deploy branch (idempotent re-runs)
Re-running the same commit collided with the prior run's deploy/<sha> branch
(non-fast-forward reject). The branch is a disposable deploy artifact; main is
the protected human-merge gate, so force-push is safe and makes re-runs work.
2026-06-17 23:33:34 +10:00
jwright 2592b5680b ci(bump-digest): bound PR-open curl + make it non-fatal so runs go green
The branch push is the deploy artifact; opening the PR is best-effort.
Previously a no-timeout curl to the private Gitea API tripped split-horizon
DNS from the runner, hanging the step ~10min then failing the whole run.
Now: --connect-timeout 10 --max-time 30, failure is logged non-fatally, exit 0.
2026-06-17 23:02:27 +10:00
jwright 9919e20850 gitignore: broaden secret patterns (env/keys/certs/credentials/kubeconfig) 2026-06-17 22:52:30 +10:00
jwright 08fb56935d contact: low-latency phrasing for the get-in-touch lead (LinkedIn + email)
build-and-deploy / build (push) Failing after 11m1s
2026-06-17 22:47:09 +10:00
jwright 939962aeeb footer: add CC BY-NC-SA 4.0 content license + low-latency contact line
build-and-deploy / build (push) Failing after 14m26s
- License link (rel=license) renders site-wide for blog/content reuse terms
- Contact line links LinkedIn + email from socials data
2026-06-17 22:14:08 +10:00
jwright 1c956d6ec4 Hero: fix title descender clipping (g); CI: rename PR token var so Gitea's auto GITEA_TOKEN doesn't 401 the branch step
build-and-deploy / build (push) Failing after 11m19s
2026-06-17 20:54:57 +10:00
jwright 18ed7458c3 CI: per-user digest file path (avoid /tmp collision between manual + runner) 2026-06-17 20:51:08 +10:00
jwright 1dc9c82cb3 Links: trailing-slash internal URLs (no dir-redirect → kills the :8080/cached-301 issue)
build-and-deploy / build (push) Failing after 13m10s
2026-06-17 20:48:06 +10:00
jwright a729484c7a Hero/OG: Platform & Infrastructure Engineer, RHEL-led tagline with ▸; fix :8080 links (relative nginx redirects)
build-and-deploy / build (push) Failing after 15m26s
2026-06-17 20:35:51 +10:00
jwright 3fd0a9a729 CI: retry buildah build/push (resilient to transient registry 502s) 2026-06-17 20:27:59 +10:00
jwright f132303d6d CI: use upload-artifact@v3 (Gitea), best-effort so it never blocks deploy 2026-06-17 20:23:40 +10:00
jwright fbad7a18db CI: digest-bump pushes a branch for manual PR (no broad token needed) 2026-06-17 20:11:13 +10:00
jwright 74cbf3af26 Add HSTS header at the origin (host-scoped, no includeSubDomains)
build-and-deploy / build (push) Failing after 13m53s
2026-06-17 19:38:05 +10:00
jwright 83edaf5975 M5: publish seam + CI/CD pipeline
build-and-deploy / build (push) Failing after 15m10s
scripts/new-post.mjs writes schema-valid posts from flags or a JSON event
(the IaC publish seam). Gitea Actions workflow: ci check, audit-ci gate,
build, dist scan, CycloneDX SBOM, buildah build+push, and a least-privilege
digest-bump PR to home-ops (never auto-merged). Renovate + audit allowlist.
2026-06-17 17:20:54 +10:00
jwright c1db5cec86 M4: security pass — strict CSP, header split, build-time scan
All JS moved to external /site.js → script-src 'self' with no inline JS,
hashes or eval. Full header set via nginx (CSP, nosniff, frame-deny,
referrer, permissions, COOP/CORP); HSTS stays at the CF edge. Shared
headers include avoids the location add_header reset footgun. Build-time
secret/inline-script/third-party scan gate. SECURITY.md documents posture.
2026-06-17 17:12:57 +10:00
jwright cb76a87c36 M3: theme-aware SVG architecture diagrams + hero motion
Hand-authored inline-SVG Diagram component (no runtime JS, CSP-clean,
themeable) rendering edge-AI, IaC-fleet and homelab architectures on the
case studies. Staggered CSS hero entrance, motion-aware.
2026-06-17 17:02:22 +10:00
jwright 22f482d89a M2: content collections — case studies, blog, RSS, tags, sitemap
Projects + blog as schema-validated content collections; structured case
studies (problem/design/outcome), blog with tag pages, reading time, RSS
feed (drafts excluded), sitemap, and Shiki dual-theme code highlighting.
2026-06-17 16:56:46 +10:00
jwright 720d579386 Switch public contact email to live.com.au (matches CV) 2026-06-17 16:45:28 +10:00
jwright ae207eb79d Populate site with real CV data; restyle OG subtitle
Real career history (Woolworths, Virtus Health, Linde, ELGAS, Darktime),
cloud-heavy skills matrix, education, LinkedIn, Sydney location, and
projects mapped to actual work. OG subtitle now smaller italic serif.
2026-06-17 16:44:03 +10:00
jwright 2d4b6ea097 Initial portfolio site: Astro + Tailwind MVP
Outcome-led hero, about, grouped skills, experience summary, featured
projects + /projects index, static contact, SEO/OG, dark/light theme.
Dockerfile + nginx config + build script for homelab deploy.
2026-06-17 16:22:53 +10:00