portfolio pass: correct the CSP claim to match what nginx sends, rename the project outcome label, plain-english the projects intro and bio, standardise on Argo CD and single-touch, drop the education filler line
build-and-deploy / build (push) Failing after 14m34s

This commit is contained in:
2026-08-18 01:11:25 +10:00
parent 7542ae2665
commit 25425d6f6a
12 changed files with 26 additions and 19 deletions
+1 -1
View File
@@ -10,7 +10,7 @@ interface Props {
const { name, caption } = Astro.props;
const captions: Record<string, string> = {
"edge-ai": "Design → single-press pipeline → readiness-gated GPU inference at the edge",
"edge-ai": "Design → single-touch pipeline → readiness-gated GPU inference at the edge",
"iac-fleet": "One source of truth → AWX/Ansible → identical edge nodes, even air-gapped",
homelab: "Bare metal → GitOps clusters → services, exposed outbound-only via a tunnel",
"authentik-sso": "One identity provider, 2FA at the flow; apps validate over an internal back channel",
+9 -1
View File
@@ -34,7 +34,7 @@ const dossierNo = String(index).padStart(3, "0");
<h3 class="dossier__title">
{p.title} <span class="dossier__arrow" aria-hidden="true">→</span>
</h3>
<p class="dossier__argument">The argument: {p.outcome}</p>
<p class="dossier__argument"><span class="dossier__outcome-label">Outcome</span> {p.outcome}</p>
<ul class="dossier__chips mono" role="list">
{p.stack.map((s) => <li class="dchip">{s}</li>)}
</ul>
@@ -146,6 +146,14 @@ const dossierNo = String(index).padStart(3, "0");
.dossier:hover .dossier__arrow {
transform: translateX(4px);
}
.dossier__outcome-label {
font-family: var(--mono, ui-monospace, monospace);
font-size: 11px;
letter-spacing: .08em;
text-transform: uppercase;
color: var(--accent, #3fbaf5);
margin-right: 6px;
}
.dossier__argument {
margin: 0;
font-size: 14px;
+1 -1
View File
@@ -33,7 +33,7 @@ gesture at. The site didn't ship until every box was ticked:
```text
[x] Static output - no server runtime to attack
[x] Strict CSP, no unsafe-inline / unsafe-eval
[x] CSP: script-src 'self', no inline or eval JavaScript (style-src keeps 'unsafe-inline' for Shiki)
[x] Self-hosted fonts - zero third-party requests
[x] No secrets in the client bundle (verified by build-time grep)
[x] Outbound-only tunnel, single hostname, no catch-all
+1 -1
View File
@@ -1,6 +1,6 @@
---
title: "Single-Touch Edge AI Platform"
outcome: "Turned a high-level edge-AI design into a single-press deployment running on Kubernetes at the store edge."
outcome: "Turned a high-level edge-AI design into a single-touch deployment running on Kubernetes at the store edge."
summary: "Store-edge Kubernetes running GPU-backed AI workloads, deployed from one command, with readiness-gated GPUs so inference never starts before the hardware is ready."
role: "Infrastructure / DevOps Engineer · Woolworths"
period: "2025 - Present"
+1 -2
View File
@@ -15,7 +15,7 @@ export const experience: Role[] = [
org: "Woolworths",
period: "Aug 2025 - Present",
summary:
"Core DevOps infrastructure engineer for store-edge solutions - turning high-level designs into single-press deployments and CD pipelines.",
"Core DevOps infrastructure engineer for store-edge solutions - turning high-level designs into single-touch deployments and CD pipelines.",
highlights: [
"Single-touch deployment of an edge AI solution running on Kubernetes at the store edge",
"GPU brought online as code - passthrough via ESXi, end-state manifests / Helm charts",
@@ -76,6 +76,5 @@ export const education: string[] = [
"Advanced Diploma in IT Networking and Security",
"Diploma in IT Networking",
"Certificate IV in IT Networking",
"Ongoing study in IT certifications and new techniques",
];
+1 -1
View File
@@ -4,7 +4,7 @@
// Facts the hero typing bar cycles through. Real, verbatim - no invented numbers.
export const fleetFacts = [
"6 single-node Talos clusters · 0 SSH daemons · every machine is a document",
"6 single-node Talos clusters / 0 SSH daemons / every node rebuilt from committed config",
"139 Argo CD Applications reconciled from one hub",
"170+ CiliumNetworkPolicies fleet-wide - every namespace starts at default-deny",
"zero open inbound ports - the origin dials out",
+1 -1
View File
@@ -20,7 +20,7 @@ export const site = {
"Edge AI",
],
// One-paragraph elevator pitch for the About section.
bio: "I'm an infrastructure and DevOps engineer who turns high-level designs into single-press deployments. My day job is store-edge Kubernetes running GPU-backed AI; my craft is the automation, GitOps and network policy that make a fleet behave the same way every time. I've run global infrastructure at enterprise scale - a thousand VMs, multi-region migrations, segmented networks - and I bring that same rigour to the smallest edge node. I'm an IaC enthusiast: if it's a manual step, I want it gone.",
bio: "I'm an infrastructure and platform engineer. I spend most of my time on the automation people usually leave in runbooks: store-edge Kubernetes running GPU-backed AI workloads, the GitOps pipelines that deploy them, and the network policy that keeps a fleet behaving the same way on every node. Before that I worked across larger enterprise estates - around a thousand VMs, multi-region migrations, segmented networks. I like infrastructure that can be rebuilt and explained from the repo. If a deployment still depends on someone remembering the right sequence of clicks, there's usually another piece worth automating.",
// Canonical URL (used for OG/sitemap/RSS).
url: "https://www.bztmon.com",
+2 -2
View File
@@ -10,11 +10,11 @@ const projects = (await getCollection("projects")).sort(
---
<Layout title="Projects" path="/projects" description="Selected platform & infrastructure projects by Jonathon Wright.">
<Section id="all-projects" eyebrow="Projects" index="*" title="Some bytes I'm proud of - a starting line, not a trophy shelf.">
<Section id="all-projects" eyebrow="Projects" index="*" title="Systems I've built and run.">
<p class="lead projects__intro" data-reveal>
Edge Kubernetes, GPU inference, self-hosted AI, productionised network automation, and
the infrastructure rigour that ties it together - each with the problem, the design, and
the outcome. More always cooking.
the outcome.
</p>
<div class="grid">
{projects.map((entry, i) => <ProjectCard entry={entry} index={i + 1} />)}