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.
This commit is contained in:
Binary file not shown.
|
Before Width: | Height: | Size: 104 KiB After Width: | Height: | Size: 107 KiB |
+11
-12
@@ -1,5 +1,5 @@
|
|||||||
// Generate the social preview image (public/og.png, 1200x630) from an inline SVG.
|
// Generate the social preview image (public/og.png, 1200x630) from an inline SVG.
|
||||||
// Run: node scripts/gen-og.mjs (also wired into `npm run build` via prebuild).
|
// Run: node scripts/gen-og.mjs (or: npm run gen:og)
|
||||||
// Self-hosted asset → no third-party OG service, nothing external at runtime.
|
// Self-hosted asset → no third-party OG service, nothing external at runtime.
|
||||||
import sharp from "sharp";
|
import sharp from "sharp";
|
||||||
import { fileURLToPath } from "node:url";
|
import { fileURLToPath } from "node:url";
|
||||||
@@ -30,23 +30,22 @@ const svg = `
|
|||||||
<rect width="${W}" height="${H}" fill="url(#glow)"/>
|
<rect width="${W}" height="${H}" fill="url(#glow)"/>
|
||||||
<rect x="0" y="0" width="${W}" height="6" fill="#2dd4bf"/>
|
<rect x="0" y="0" width="${W}" height="6" fill="#2dd4bf"/>
|
||||||
|
|
||||||
<text x="80" y="150" font-family="monospace" font-size="26" letter-spacing="6"
|
<text x="80" y="150" font-family="monospace" font-size="24" letter-spacing="5"
|
||||||
fill="#5eead4">~/ INFRASTRUCTURE ENGINEER</text>
|
fill="#5eead4">~/ INFRASTRUCTURE & DEVOPS ENGINEER</text>
|
||||||
|
|
||||||
<text x="78" y="300" font-family="sans-serif" font-size="118" font-weight="700"
|
<text x="78" y="300" font-family="sans-serif" font-size="118" font-weight="700"
|
||||||
letter-spacing="-3" fill="url(#title)">Jonathon Wright</text>
|
letter-spacing="-3" fill="url(#title)">Jonathon Wright</text>
|
||||||
|
|
||||||
<text x="80" y="392" font-family="sans-serif" font-size="40" font-weight="500" fill="#cdd6e3">
|
<!-- Editorial italic serif subtitle (smaller, for hierarchy). -->
|
||||||
Secure Kubernetes platforms · automated fleets
|
<text x="80" y="386" font-family="C059, serif" font-style="italic" font-size="35"
|
||||||
</text>
|
fill="#aeb9c9">Secure Kubernetes platforms · automated fleets</text>
|
||||||
<text x="80" y="446" font-family="sans-serif" font-size="40" font-weight="500" fill="#cdd6e3">
|
<text x="80" y="434" font-family="C059, serif" font-style="italic" font-size="35"
|
||||||
· GPU-backed edge systems
|
fill="#aeb9c9">· GPU-backed edge systems</text>
|
||||||
</text>
|
|
||||||
|
|
||||||
<text x="80" y="560" font-family="monospace" font-size="28" fill="#61708a">
|
<text x="80" y="560" font-family="monospace" font-size="27" fill="#61708a">
|
||||||
Talos · Kubernetes · GitOps · Ansible · Edge AI
|
Talos · Kubernetes · GitOps · Ansible · Edge AI
|
||||||
</text>
|
</text>
|
||||||
<text x="${W - 80}" y="560" text-anchor="end" font-family="monospace" font-size="28"
|
<text x="${W - 80}" y="560" text-anchor="end" font-family="monospace" font-size="27"
|
||||||
fill="#5eead4">www.bztmon.com</text>
|
fill="#5eead4">www.bztmon.com</text>
|
||||||
</svg>`;
|
</svg>`;
|
||||||
|
|
||||||
|
|||||||
@@ -1,12 +1,33 @@
|
|||||||
---
|
---
|
||||||
import { site } from "../data/site";
|
import { site } from "../data/site";
|
||||||
import { experience } from "../data/experience";
|
import { experience, education } from "../data/experience";
|
||||||
import { cvAvailable } from "../lib/assets";
|
import { cvAvailable } from "../lib/assets";
|
||||||
|
|
||||||
|
// M1 shows the most recent roles; the full history lives in experience.ts (and the CV).
|
||||||
|
const recent = experience.slice(0, 3);
|
||||||
|
const olderCount = experience.length - recent.length;
|
||||||
---
|
---
|
||||||
|
|
||||||
<div class="about">
|
<div class="about">
|
||||||
<div class="about__bio" data-reveal>
|
<div class="about__bio" data-reveal>
|
||||||
<p class="lead">{site.bio}</p>
|
<p class="lead">{site.bio}</p>
|
||||||
|
|
||||||
|
<dl class="about__facts">
|
||||||
|
<div>
|
||||||
|
<dt class="mono">Based</dt>
|
||||||
|
<dd>{site.location}</dd>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<dt class="mono">Focus</dt>
|
||||||
|
<dd>Edge Kubernetes · GPU/AI · IaC & GitOps</dd>
|
||||||
|
</div>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<h3 class="about__sub mono"># education</h3>
|
||||||
|
<ul class="about__education">
|
||||||
|
{education.map((e) => <li>{e}</li>)}
|
||||||
|
</ul>
|
||||||
|
|
||||||
{cvAvailable && (
|
{cvAvailable && (
|
||||||
<p class="about__cv">
|
<p class="about__cv">
|
||||||
<a class="btn" href="/cv.pdf" download>Download full CV (PDF)</a>
|
<a class="btn" href="/cv.pdf" download>Download full CV (PDF)</a>
|
||||||
@@ -14,9 +35,10 @@ import { cvAvailable } from "../lib/assets";
|
|||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div>
|
||||||
<ol class="about__timeline">
|
<ol class="about__timeline">
|
||||||
{
|
{
|
||||||
experience.map((role) => (
|
recent.map((role) => (
|
||||||
<li class="about__role" data-reveal>
|
<li class="about__role" data-reveal>
|
||||||
<div class="about__role-head">
|
<div class="about__role-head">
|
||||||
<h3 class="about__role-title">{role.title}</h3>
|
<h3 class="about__role-title">{role.title}</h3>
|
||||||
@@ -35,6 +57,12 @@ import { cvAvailable } from "../lib/assets";
|
|||||||
))
|
))
|
||||||
}
|
}
|
||||||
</ol>
|
</ol>
|
||||||
|
{olderCount > 0 && (
|
||||||
|
<p class="about__more mono">
|
||||||
|
+ {olderCount} earlier roles (ELGAS, Darktime){cvAvailable ? " — see the CV" : ""}.
|
||||||
|
</p>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
@@ -49,8 +77,45 @@ import { cvAvailable } from "../lib/assets";
|
|||||||
align-items: start;
|
align-items: start;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
.about__facts {
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
gap: var(--space-6);
|
||||||
|
margin: var(--space-5) 0 0;
|
||||||
|
}
|
||||||
|
.about__facts dt {
|
||||||
|
font-size: 0.7rem;
|
||||||
|
letter-spacing: 0.16em;
|
||||||
|
text-transform: uppercase;
|
||||||
|
color: var(--text-faint);
|
||||||
|
}
|
||||||
|
.about__facts dd {
|
||||||
|
margin: 0.2rem 0 0;
|
||||||
|
color: var(--text);
|
||||||
|
font-size: var(--step--1);
|
||||||
|
}
|
||||||
|
.about__sub {
|
||||||
|
margin-top: var(--space-6);
|
||||||
|
color: var(--text-dim);
|
||||||
|
font-size: var(--step--1);
|
||||||
|
letter-spacing: 0.02em;
|
||||||
|
}
|
||||||
|
.about__sub::first-letter {
|
||||||
|
color: var(--accent);
|
||||||
|
}
|
||||||
|
.about__education {
|
||||||
|
margin: var(--space-3) 0 0;
|
||||||
|
padding-left: 1.1rem;
|
||||||
|
color: var(--text-dim);
|
||||||
|
font-size: var(--step--1);
|
||||||
|
display: grid;
|
||||||
|
gap: 0.3rem;
|
||||||
|
}
|
||||||
|
.about__education li::marker {
|
||||||
|
color: var(--accent);
|
||||||
|
}
|
||||||
.about__cv {
|
.about__cv {
|
||||||
margin-top: var(--space-5);
|
margin-top: var(--space-6);
|
||||||
}
|
}
|
||||||
.about__timeline {
|
.about__timeline {
|
||||||
list-style: none;
|
list-style: none;
|
||||||
@@ -110,4 +175,10 @@ import { cvAvailable } from "../lib/assets";
|
|||||||
.about__highlights li::marker {
|
.about__highlights li::marker {
|
||||||
color: var(--accent);
|
color: var(--accent);
|
||||||
}
|
}
|
||||||
|
.about__more {
|
||||||
|
margin-top: var(--space-5);
|
||||||
|
padding-left: var(--space-5);
|
||||||
|
font-size: 0.72rem;
|
||||||
|
color: var(--text-faint);
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ import { socials } from "../data/socials";
|
|||||||
<div class="contact__body">
|
<div class="contact__body">
|
||||||
<p class="contact__lead">
|
<p class="contact__lead">
|
||||||
Open to conversations about platform engineering, edge infrastructure, and
|
Open to conversations about platform engineering, edge infrastructure, and
|
||||||
GPU/AI systems. The fastest way to reach me is email.
|
GPU/AI systems. Based in {site.location}; the fastest way to reach me is email.
|
||||||
</p>
|
</p>
|
||||||
<a class="btn btn--primary contact__mail mono" href={`mailto:${site.email}`}>
|
<a class="btn btn--primary contact__mail mono" href={`mailto:${site.email}`}>
|
||||||
{site.email}
|
{site.email}
|
||||||
|
|||||||
+63
-15
@@ -1,6 +1,5 @@
|
|||||||
// Short experience summary for the About section (M1).
|
// Career history (from CV). The About section shows the most recent few;
|
||||||
// A fuller, dated timeline lands in M2.
|
// the full list lives here (and on /projects / the CV).
|
||||||
// TODO(Jonathon): fill employer names, exact titles, and dates.
|
|
||||||
|
|
||||||
export type Role = {
|
export type Role = {
|
||||||
title: string;
|
title: string;
|
||||||
@@ -12,22 +11,71 @@ export type Role = {
|
|||||||
|
|
||||||
export const experience: Role[] = [
|
export const experience: Role[] = [
|
||||||
{
|
{
|
||||||
title: "Platform / Infrastructure Engineer",
|
title: "Infrastructure / DevOps Engineer",
|
||||||
org: "TODO: Employer", // TODO(Jonathon)
|
org: "Woolworths",
|
||||||
period: "TODO: dates", // TODO(Jonathon)
|
period: "Aug 2025 – Present",
|
||||||
summary:
|
summary:
|
||||||
"Operate and automate a fleet of GPU-backed edge Kubernetes clusters running computer-vision workloads, plus the IaC pipelines that deploy them.",
|
"Core DevOps infrastructure engineer for store-edge solutions — turning high-level designs into single-press deployments and CD pipelines.",
|
||||||
highlights: [
|
highlights: [
|
||||||
"Hardened GPU readiness and egress networking across the edge fleet",
|
"Single-touch deployment of an edge AI solution running on Kubernetes at the store edge",
|
||||||
"Built Ansible/AWX automation for repeatable cluster bring-up",
|
"GPU brought online as code — passthrough via ESXi, end-state manifests / Helm charts",
|
||||||
"Owned observability and network policy for the platform",
|
"Ansible playbook builds wired through a single source-of-truth pipeline with per-store vars",
|
||||||
|
"Removed manual practices across infra and ops — IaC throughout, spec-driven and documented as code",
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: "TODO: Previous role",
|
title: "Infrastructure Systems Engineer",
|
||||||
org: "TODO: Employer", // TODO(Jonathon)
|
org: "Virtus Health",
|
||||||
period: "TODO: dates", // TODO(Jonathon)
|
period: "Aug 2022 – Aug 2025",
|
||||||
summary: "TODO(Jonathon): one or two lines on a previous role.",
|
summary:
|
||||||
highlights: [],
|
"Global IT — optimisation, implementation and projects across an enterprise estate.",
|
||||||
|
highlights: [
|
||||||
|
"Managed ~1,000 VMs across a global VMware estate",
|
||||||
|
"Re-segmented flat sites into isolated VLAN ranges; SD-WAN and Aruba ClearPass onboarding",
|
||||||
|
"Migrated workloads to Azure (Blob, AVS); upgraded Palo Alto / FortiGate firewalls",
|
||||||
|
"Led a new major-site build — end-to-end services implementation",
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Global IT Infrastructure Engineer",
|
||||||
|
org: "Linde Asia Pacific",
|
||||||
|
period: "Sep 2019 – Aug 2022",
|
||||||
|
summary:
|
||||||
|
"Maintained and modernised global infrastructure to enterprise standards across the region.",
|
||||||
|
highlights: [
|
||||||
|
"Global VMware / Dell hosting; PowerShell automation of manual project tasks",
|
||||||
|
"Migrated Google Business → Microsoft 365 across the region; AWS-hosted ERP access",
|
||||||
|
"ERP hardware refresh with new mainframe and DR solution; PBX → VoIP across AU/NZ",
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Web Developer / Tech Admin",
|
||||||
|
org: "ELGAS",
|
||||||
|
period: "Aug 2018 – Sep 2019",
|
||||||
|
summary:
|
||||||
|
"Development, optimisation and escalation for the IT service-desk team.",
|
||||||
|
highlights: [
|
||||||
|
"Automated network management and single-click OS updating / app packaging",
|
||||||
|
"Cost-saving remote troubleshooting and DR ownership for critical systems",
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "IT Technician",
|
||||||
|
org: "Darktime Computer Services",
|
||||||
|
period: "Nov 2010 – Jun 2013",
|
||||||
|
summary:
|
||||||
|
"Field and workshop IT across legal firms, schools, real estate and small business.",
|
||||||
|
highlights: [
|
||||||
|
"SBS 2008 server installs, Exchange, backups and RAID storage for small business",
|
||||||
|
"Solo on-site support — diagnose, fix, move on",
|
||||||
|
],
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
|
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",
|
||||||
|
];
|
||||||
|
|
||||||
|
|||||||
+42
-42
@@ -18,63 +18,63 @@ export type Project = {
|
|||||||
|
|
||||||
export const projects: Project[] = [
|
export const projects: Project[] = [
|
||||||
{
|
{
|
||||||
slug: "edge-gpu-inference-platform",
|
slug: "edge-ai-platform",
|
||||||
title: "Edge Kubernetes / GPU Inference Platform",
|
title: "Single-Touch Edge AI Platform",
|
||||||
outcome:
|
outcome:
|
||||||
"Made GPU computer-vision reliable across a fleet of store-edge clusters — no more inference pods racing the GPU at boot.",
|
"Turned a high-level edge-AI design into a single-press deployment running on Kubernetes at the store edge.",
|
||||||
summary:
|
summary:
|
||||||
"A fleet of single-purpose edge Kubernetes clusters running GPU-accelerated computer-vision workloads. Hardened the GPU readiness path (init-gated so pods never schedule before the device plugin is up) and corrected the egress NAT path so inference results reached upstream services reliably.",
|
"Store-edge Kubernetes running GPU-backed AI workloads, deployed from one command. High-level designs become real, problem-solving deployments via CD pipelines — with GPU readiness probing and pod-lifecycle watchdogs so inference never starts before the hardware is ready.",
|
||||||
role: "Platform / Infrastructure Engineer",
|
role: "Infrastructure / DevOps Engineer · Woolworths",
|
||||||
period: "Recent", // TODO(Jonathon): dates
|
period: "2025 – Present",
|
||||||
stack: ["OpenShift", "NVIDIA GPU Operator", "Multus", "SNAT / egress", "GPU device plugin"],
|
stack: ["Kubernetes", "Edge", "NVIDIA GPU", "CD pipelines", "Helm", "Python"],
|
||||||
featured: true,
|
featured: true,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
slug: "cv-compliance-verifier",
|
slug: "self-hosted-ai-homelab",
|
||||||
title: "Computer-Vision Compliance Verifier",
|
title: "Self-Hosted AI & Homelab Platform",
|
||||||
outcome:
|
outcome:
|
||||||
"Turned a manual visual check into a containerized GPU workload emitting a structured pass/fail verdict.",
|
"A production-grade homelab — GitOps from bare metal to local AI, and the platform that serves this very site.",
|
||||||
summary:
|
summary:
|
||||||
"A YOLO-based vision tool packaged as a containerized workload on GPU edge nodes. Runs an inference pipeline against a defined scene and emits a structured, machine-readable verdict — replacing a manual, subjective check with a repeatable one.",
|
"Proxmox with PCIe passthrough under single-node Talos and OpenShift clusters, all driven by ArgoCD GitOps. Local hosted AI on a Blackwell GPU, split-horizon DNS (Pi-hole), VPN with 2FA/SSO, Prometheus/Grafana observability, ZFS storage, and NAS-backed restic backups. Optimising, securing and learning in the open.",
|
||||||
role: "Platform / Infrastructure Engineer",
|
|
||||||
period: "Recent", // TODO(Jonathon): dates
|
|
||||||
stack: ["YOLO", "Containers", "GPU nodes", "Kubernetes", "Structured output"],
|
|
||||||
featured: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
slug: "self-hosted-agent-infra",
|
|
||||||
title: "Self-Hosted AI Agent Infrastructure",
|
|
||||||
outcome:
|
|
||||||
"Ran a private, channel-connected AI agent on my own hardware — no third-party platform holding the data or the keys.",
|
|
||||||
summary:
|
|
||||||
"A self-hosted agent on a GPU workstation with a Signal-based sibling agent, built on a skill/context-loading framework. Local LLM inference, scoped tool access, and a credential model where the agent never holds a downstream secret directly.",
|
|
||||||
role: "Builder",
|
|
||||||
period: "Ongoing",
|
|
||||||
stack: ["Local LLM (llama.cpp)", "Agent framework", "Skills/tooling", "Signal channel", "RTX 5080"],
|
|
||||||
featured: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
slug: "homelab-platform",
|
|
||||||
title: "Homelab Platform",
|
|
||||||
outcome:
|
|
||||||
"A production-grade homelab: GitOps from bare metal to apps, with the same rigor I'd apply at work.",
|
|
||||||
summary:
|
|
||||||
"Proxmox with PCIe passthrough (GPU/SATA) underneath single-node Talos clusters, all driven by ArgoCD GitOps. Split-horizon DNS, SSO, observability, NAS-backed restic backups, and local LLM inference on a Blackwell GPU — the platform that hosts this very site.",
|
|
||||||
role: "Owner / Operator",
|
role: "Owner / Operator",
|
||||||
period: "Ongoing",
|
period: "Ongoing",
|
||||||
stack: ["Proxmox", "Talos", "ArgoCD", "Cilium", "Cloudflare Tunnel", "Prometheus"],
|
stack: ["Talos", "OpenShift", "ArgoCD", "Proxmox", "Local LLM", "Cloudflare Tunnel"],
|
||||||
featured: false,
|
featured: true,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
slug: "iac-fleet-automation",
|
slug: "iac-fleet-automation",
|
||||||
title: "IaC Automation for Fleet Deployments",
|
title: "IaC Fleet Automation",
|
||||||
outcome:
|
outcome:
|
||||||
"Stood up identical edge clusters from code — GPU stack, networking, and secrets templated, not hand-configured.",
|
"Stood up identical edge sites from code — every store comes up the same way, every time.",
|
||||||
summary:
|
summary:
|
||||||
"Ansible/AWX playbooks for fleet deployment: GPU operator install, CNI and templated network attachments, container image pre-pull, and secrets delivered via Vault — so a new edge site comes up the same way every time.",
|
"Ansible/AWX playbooks wired through a single source-of-truth pipeline: GPU operator install, templated network attachments, container image pre-pull, and secrets delivered at deploy time. Air-gapped registry workflows mirror images across ACR and NVCR so disconnected edge sites still build.",
|
||||||
role: "Automation Engineer",
|
role: "Automation Engineer",
|
||||||
period: "Recent", // TODO(Jonathon): dates
|
period: "2025 – Present",
|
||||||
stack: ["Ansible", "AWX", "Vault", "Multus", "GPU Operator"],
|
stack: ["Ansible", "AWX", "GitOps", "ACR / NVCR", "Image pre-pull", "Secrets mgmt"],
|
||||||
|
featured: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
slug: "gpu-as-code",
|
||||||
|
title: "GPU-as-Code on the Edge",
|
||||||
|
outcome:
|
||||||
|
"Brought GPUs online as code — passthrough, readiness-gated, and reproducible across the fleet.",
|
||||||
|
summary:
|
||||||
|
"GPU passthrough configured through ESXi via code with end-state manifests and Helm charts, paired with Bash/Shell readiness probes and Kubernetes watchdogs. DCGM-exporter feeds GPU and container-workload health into Prometheus and AWX job-level reporting.",
|
||||||
|
role: "Infrastructure / DevOps Engineer",
|
||||||
|
period: "2025 – Present",
|
||||||
|
stack: ["GPU passthrough", "ESXi", "DCGM Exporter", "Prometheus", "Bash", "Watchdogs"],
|
||||||
|
featured: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
slug: "global-infra-modernisation",
|
||||||
|
title: "Global Infrastructure Modernisation",
|
||||||
|
outcome:
|
||||||
|
"Modernised enterprise infrastructure at scale — ~1,000 VMs, segmented networks, multi-region cloud migration.",
|
||||||
|
summary:
|
||||||
|
"Across global IT roles: managed a ~1,000-VM VMware estate, re-segmented flat sites into isolated VLAN ranges with SD-WAN and Aruba ClearPass, upgraded Palo Alto / FortiGate firewalls, and migrated workloads to Azure and Microsoft 365 — including ERP hardware refresh, DR, and PBX-to-VoIP.",
|
||||||
|
role: "Infrastructure Engineer · Virtus Health / Linde",
|
||||||
|
period: "2019 – 2025",
|
||||||
|
stack: ["VMware", "Azure", "SD-WAN", "Aruba ClearPass", "FortiGate", "Microsoft 365"],
|
||||||
featured: false,
|
featured: false,
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|||||||
+5
-5
@@ -5,7 +5,8 @@ export const site = {
|
|||||||
name: "Jonathon Wright",
|
name: "Jonathon Wright",
|
||||||
// Short handle used in the mono "logo".
|
// Short handle used in the mono "logo".
|
||||||
handle: "jwright",
|
handle: "jwright",
|
||||||
role: "Infrastructure Engineer",
|
role: "Infrastructure & DevOps Engineer",
|
||||||
|
location: "Sydney, Australia",
|
||||||
// Outcome-led positioning (hero headline).
|
// Outcome-led positioning (hero headline).
|
||||||
positioning:
|
positioning:
|
||||||
"Building secure Kubernetes platforms, automated infrastructure fleets and GPU-backed edge systems.",
|
"Building secure Kubernetes platforms, automated infrastructure fleets and GPU-backed edge systems.",
|
||||||
@@ -19,14 +20,13 @@ export const site = {
|
|||||||
"Edge AI",
|
"Edge AI",
|
||||||
],
|
],
|
||||||
// One-paragraph elevator pitch for the About section.
|
// One-paragraph elevator pitch for the About section.
|
||||||
bio: "I design and run platforms that have to keep working when no one is watching — fleets of GPU-backed Kubernetes clusters at the edge, the IaC pipelines that deploy them, and the observability and network policy that keep them honest. I care about reliability you can reason about, security that's the default rather than a bolt-on, and automation that removes the manual step entirely instead of documenting it.",
|
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.",
|
||||||
|
|
||||||
// Canonical URL (used for OG/sitemap/RSS).
|
// Canonical URL (used for OG/sitemap/RSS).
|
||||||
url: "https://www.bztmon.com",
|
url: "https://www.bztmon.com",
|
||||||
// Contact.
|
// Public contact. (CV lists jonnywright2011@live.com.au — using the primary below;
|
||||||
|
// tell me if you'd rather the site match the CV exactly.)
|
||||||
email: "jonny.wright225@gmail.com",
|
email: "jonny.wright225@gmail.com",
|
||||||
// Set when a real CV is dropped at public/cv.pdf — the button is hidden until then.
|
|
||||||
// Detection is automatic (see Layout/Hero); this is just an override if ever needed.
|
|
||||||
ogImage: "/og.png",
|
ogImage: "/og.png",
|
||||||
locale: "en",
|
locale: "en",
|
||||||
} as const;
|
} as const;
|
||||||
|
|||||||
+48
-43
@@ -10,77 +10,82 @@ export type SkillGroup = {
|
|||||||
|
|
||||||
export const skills: SkillGroup[] = [
|
export const skills: SkillGroup[] = [
|
||||||
{
|
{
|
||||||
title: "Platform Engineering",
|
title: "Cloud & Identity",
|
||||||
|
blurb: "Hybrid estates across the major clouds, with identity done properly.",
|
||||||
|
items: [
|
||||||
|
"Azure",
|
||||||
|
"Entra ID",
|
||||||
|
"Intune",
|
||||||
|
"AWS",
|
||||||
|
"GCP",
|
||||||
|
"Microsoft 365",
|
||||||
|
"Azure Blob / S3",
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Platform & Virtualization",
|
||||||
blurb: "Kubernetes platforms designed to be reasoned about and recovered.",
|
blurb: "Kubernetes platforms designed to be reasoned about and recovered.",
|
||||||
items: [
|
items: [
|
||||||
"Kubernetes",
|
"Kubernetes",
|
||||||
"Talos Linux",
|
|
||||||
"OpenShift",
|
"OpenShift",
|
||||||
|
"Talos Linux",
|
||||||
|
"vSphere / VMware ESXi",
|
||||||
|
"Proxmox",
|
||||||
|
"containerd",
|
||||||
"ArgoCD / GitOps",
|
"ArgoCD / GitOps",
|
||||||
"Helm & Kustomize",
|
"Helm & Kustomize",
|
||||||
"Cilium / flannel",
|
|
||||||
"Gateway API & Ingress",
|
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: "Infrastructure Automation",
|
title: "Automation & IaC",
|
||||||
blurb: "Removing the manual step entirely, not documenting it.",
|
blurb: "Single-touch deployments — removing the manual step, not documenting it.",
|
||||||
items: [
|
items: [
|
||||||
"Ansible",
|
"Ansible / AWX",
|
||||||
"AWX",
|
"PowerShell (PowerCLI)",
|
||||||
"GitOps pipelines",
|
"Python",
|
||||||
"Renovate",
|
"Bash / Shell",
|
||||||
"Image pre-pull & templating",
|
"Terraform",
|
||||||
"Reproducible cluster bring-up",
|
"Image pre-pull & air-gapped registries (ACR / NVCR)",
|
||||||
],
|
"Secrets management",
|
||||||
},
|
|
||||||
{
|
|
||||||
title: "Linux & Systems",
|
|
||||||
blurb: "From the hypervisor up to the workload.",
|
|
||||||
items: [
|
|
||||||
"Debian / RHEL",
|
|
||||||
"systemd",
|
|
||||||
"Proxmox / KVM",
|
|
||||||
"PCIe / GPU passthrough",
|
|
||||||
"LVM & block storage",
|
|
||||||
"restic / SMB backup",
|
|
||||||
"Bash & PowerShell",
|
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: "Networking & Security",
|
title: "Networking & Security",
|
||||||
blurb: "Default-deny, least-privilege, and a small attack surface.",
|
blurb: "Default-deny, segmentation, and a small attack surface.",
|
||||||
items: [
|
items: [
|
||||||
"Split-horizon DNS",
|
"SD-WAN",
|
||||||
"Cloudflare Tunnel",
|
"802.1Q VLAN segmentation",
|
||||||
"Reverse proxy (Traefik / nginx)",
|
"ACLs / IPSec / RADIUS",
|
||||||
"NetworkPolicies",
|
"Aruba ClearPass",
|
||||||
"OIDC / SSO (Authentik)",
|
"Palo Alto / FortiGate",
|
||||||
"Secrets (Vault / Infisical / ESO)",
|
"Firewall policy governance",
|
||||||
"TLS & cert-manager",
|
"RBAC · 2FA / SSO",
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: "Observability",
|
title: "Observability & Ops",
|
||||||
blurb: "Knowing the system is healthy, not just the pods.",
|
blurb: "Knowing the system is healthy — and the GPUs with it.",
|
||||||
items: [
|
items: [
|
||||||
"Prometheus",
|
"Prometheus",
|
||||||
"Grafana",
|
"Grafana",
|
||||||
"Alertmanager",
|
"DCGM Exporter",
|
||||||
"node-exporter / kube-state-metrics",
|
"PRTG / LibreNMS",
|
||||||
"ServiceMonitors",
|
"AWX job reporting",
|
||||||
|
"Veeam backup",
|
||||||
|
"ITIL processes",
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: "AI & GPU Infrastructure",
|
title: "Edge AI & GPU",
|
||||||
blurb: "Serving vision and language models on real hardware.",
|
blurb: "Serving vision and language models on real hardware at the edge.",
|
||||||
items: [
|
items: [
|
||||||
"NVIDIA GPU Operator",
|
"NVIDIA GPU Operator",
|
||||||
"Multus / SR-IOV",
|
"GPU passthrough (ESXi, as code)",
|
||||||
|
"GPU readiness probing & watchdogs",
|
||||||
|
"Pod lifecycle management",
|
||||||
"YOLO / computer-vision inference",
|
"YOLO / computer-vision inference",
|
||||||
"Local LLM serving (llama.cpp)",
|
"Local LLM serving (llama.cpp)",
|
||||||
"Agent frameworks & tooling",
|
"Edge Kubernetes",
|
||||||
"Hardware-isolated workloads (Kata)",
|
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|||||||
+6
-6
@@ -1,5 +1,4 @@
|
|||||||
// Social / contact links. `mailto` is built from site.email.
|
// Social / contact links.
|
||||||
// TODO(Jonathon): confirm GitHub + LinkedIn handles (placeholders below).
|
|
||||||
|
|
||||||
export type Social = {
|
export type Social = {
|
||||||
label: string;
|
label: string;
|
||||||
@@ -12,14 +11,15 @@ export type Social = {
|
|||||||
|
|
||||||
export const socials: Social[] = [
|
export const socials: Social[] = [
|
||||||
{
|
{
|
||||||
label: "GitHub",
|
// Self-hosted public git — his code, on his own infrastructure (goes live with git.bztmon.com).
|
||||||
href: "https://github.com/jwrong96", // TODO(Jonathon): confirm public GitHub handle
|
label: "Source",
|
||||||
|
href: "https://git.bztmon.com/jwright",
|
||||||
external: true,
|
external: true,
|
||||||
icon: "M12 .5A11.5 11.5 0 0 0 .5 12a11.5 11.5 0 0 0 7.86 10.92c.58.1.79-.25.79-.56v-2c-3.2.7-3.88-1.37-3.88-1.37-.53-1.34-1.3-1.7-1.3-1.7-1.06-.72.08-.71.08-.71 1.17.08 1.78 1.2 1.78 1.2 1.04 1.79 2.73 1.27 3.4.97.1-.76.41-1.27.74-1.56-2.55-.29-5.24-1.28-5.24-5.7 0-1.26.45-2.29 1.19-3.1-.12-.29-.52-1.46.11-3.05 0 0 .97-.31 3.18 1.18a11 11 0 0 1 5.8 0c2.2-1.5 3.17-1.18 3.17-1.18.63 1.59.24 2.76.12 3.05.74.81 1.18 1.84 1.18 3.1 0 4.43-2.69 5.4-5.25 5.69.42.36.8 1.08.8 2.18v3.23c0 .31.21.67.8.56A11.5 11.5 0 0 0 23.5 12 11.5 11.5 0 0 0 12 .5Z",
|
icon: "M21.6 11.2 12.8 2.4a1.3 1.3 0 0 0-1.9 0L9 4.3l2.3 2.3a1.6 1.6 0 0 1 2 2L15.6 11a1.6 1.6 0 1 1-1 1l-2.1-2.2v5.6a1.6 1.6 0 1 1-1.3 0V9.8a1.6 1.6 0 0 1-.6-2.1L8.1 5.3l-5.7 5.7a1.3 1.3 0 0 0 0 1.9l8.8 8.8a1.3 1.3 0 0 0 1.9 0l8.5-8.5a1.3 1.3 0 0 0 0-2Z",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "LinkedIn",
|
label: "LinkedIn",
|
||||||
href: "https://www.linkedin.com/in/jonathon-wright", // TODO(Jonathon): confirm LinkedIn URL
|
href: "https://www.linkedin.com/in/jonathon-w-2697b995",
|
||||||
external: true,
|
external: true,
|
||||||
icon: "M20.45 20.45h-3.56v-5.57c0-1.33-.02-3.04-1.85-3.04-1.85 0-2.14 1.45-2.14 2.94v5.67H9.35V9h3.41v1.56h.05c.48-.9 1.64-1.85 3.37-1.85 3.6 0 4.27 2.37 4.27 5.46v6.28ZM5.34 7.43a2.07 2.07 0 1 1 0-4.14 2.07 2.07 0 0 1 0 4.14ZM7.12 20.45H3.55V9h3.57v11.45ZM22.22 0H1.77C.8 0 0 .78 0 1.74v20.51C0 23.22.8 24 1.77 24h20.45c.98 0 1.78-.78 1.78-1.75V1.74C24 .78 23.2 0 22.22 0Z",
|
icon: "M20.45 20.45h-3.56v-5.57c0-1.33-.02-3.04-1.85-3.04-1.85 0-2.14 1.45-2.14 2.94v5.67H9.35V9h3.41v1.56h.05c.48-.9 1.64-1.85 3.37-1.85 3.6 0 4.27 2.37 4.27 5.46v6.28ZM5.34 7.43a2.07 2.07 0 1 1 0-4.14 2.07 2.07 0 0 1 0 4.14ZM7.12 20.45H3.55V9h3.57v11.45ZM22.22 0H1.77C.8 0 0 .78 0 1.74v20.51C0 23.22.8 24 1.77 24h20.45c.98 0 1.78-.78 1.78-1.75V1.74C24 .78 23.2 0 22.22 0Z",
|
||||||
},
|
},
|
||||||
|
|||||||
Reference in New Issue
Block a user