diff --git a/public/og.png b/public/og.png index 5781717..5822133 100644 Binary files a/public/og.png and b/public/og.png differ diff --git a/scripts/gen-og.mjs b/scripts/gen-og.mjs index 3c58fa0..0b6d7c2 100644 --- a/scripts/gen-og.mjs +++ b/scripts/gen-og.mjs @@ -1,5 +1,5 @@ // 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. import sharp from "sharp"; import { fileURLToPath } from "node:url"; @@ -30,23 +30,22 @@ const svg = ` - ~/ INFRASTRUCTURE ENGINEER + ~/ INFRASTRUCTURE & DEVOPS ENGINEER Jonathon Wright - - Secure Kubernetes platforms · automated fleets - - - · GPU-backed edge systems - + + Secure Kubernetes platforms · automated fleets + · GPU-backed edge systems - - Talos · Kubernetes · GitOps · Ansible · Edge AI + + Talos · Kubernetes · GitOps · Ansible · Edge AI - www.bztmon.com `; diff --git a/src/components/About.astro b/src/components/About.astro index e2eaf10..76b6ff3 100644 --- a/src/components/About.astro +++ b/src/components/About.astro @@ -1,12 +1,33 @@ --- import { site } from "../data/site"; -import { experience } from "../data/experience"; +import { experience, education } from "../data/experience"; 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; ---

{site.bio}

+ +
+
+
Based
+
{site.location}
+
+
+
Focus
+
Edge Kubernetes · GPU/AI · IaC & GitOps
+
+
+ +

# education

+
    + {education.map((e) =>
  • {e}
  • )} +
+ {cvAvailable && (

Download full CV (PDF) @@ -14,27 +35,34 @@ import { cvAvailable } from "../lib/assets"; )}

-
    - { - experience.map((role) => ( -
  1. -
    -

    {role.title}

    - {role.period} -
    -

    {role.org}

    -

    {role.summary}

    - {role.highlights.length > 0 && ( -
      - {role.highlights.map((h) => ( -
    • {h}
    • - ))} -
    - )} -
  2. - )) - } -
+
+
    + { + recent.map((role) => ( +
  1. +
    +

    {role.title}

    + {role.period} +
    +

    {role.org}

    +

    {role.summary}

    + {role.highlights.length > 0 && ( +
      + {role.highlights.map((h) => ( +
    • {h}
    • + ))} +
    + )} +
  2. + )) + } +
+ {olderCount > 0 && ( +

+ + {olderCount} earlier roles (ELGAS, Darktime){cvAvailable ? " — see the CV" : ""}. +

+ )} +
diff --git a/src/components/Contact.astro b/src/components/Contact.astro index d109010..ab573ea 100644 --- a/src/components/Contact.astro +++ b/src/components/Contact.astro @@ -7,7 +7,7 @@ import { socials } from "../data/socials";

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.

{site.email} diff --git a/src/data/experience.ts b/src/data/experience.ts index c5668b5..964add0 100644 --- a/src/data/experience.ts +++ b/src/data/experience.ts @@ -1,6 +1,5 @@ -// Short experience summary for the About section (M1). -// A fuller, dated timeline lands in M2. -// TODO(Jonathon): fill employer names, exact titles, and dates. +// Career history (from CV). The About section shows the most recent few; +// the full list lives here (and on /projects / the CV). export type Role = { title: string; @@ -12,22 +11,71 @@ export type Role = { export const experience: Role[] = [ { - title: "Platform / Infrastructure Engineer", - org: "TODO: Employer", // TODO(Jonathon) - period: "TODO: dates", // TODO(Jonathon) + title: "Infrastructure / DevOps Engineer", + org: "Woolworths", + period: "Aug 2025 – Present", 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: [ - "Hardened GPU readiness and egress networking across the edge fleet", - "Built Ansible/AWX automation for repeatable cluster bring-up", - "Owned observability and network policy for the platform", + "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", + "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", - org: "TODO: Employer", // TODO(Jonathon) - period: "TODO: dates", // TODO(Jonathon) - summary: "TODO(Jonathon): one or two lines on a previous role.", - highlights: [], + title: "Infrastructure Systems Engineer", + org: "Virtus Health", + period: "Aug 2022 – Aug 2025", + summary: + "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", +]; + diff --git a/src/data/projects.ts b/src/data/projects.ts index f4ad0ae..a207506 100644 --- a/src/data/projects.ts +++ b/src/data/projects.ts @@ -18,63 +18,63 @@ export type Project = { export const projects: Project[] = [ { - slug: "edge-gpu-inference-platform", - title: "Edge Kubernetes / GPU Inference Platform", + slug: "edge-ai-platform", + title: "Single-Touch Edge AI Platform", 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: - "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.", - role: "Platform / Infrastructure Engineer", - period: "Recent", // TODO(Jonathon): dates - stack: ["OpenShift", "NVIDIA GPU Operator", "Multus", "SNAT / egress", "GPU device plugin"], + "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: "Infrastructure / DevOps Engineer · Woolworths", + period: "2025 – Present", + stack: ["Kubernetes", "Edge", "NVIDIA GPU", "CD pipelines", "Helm", "Python"], featured: true, }, { - slug: "cv-compliance-verifier", - title: "Computer-Vision Compliance Verifier", + slug: "self-hosted-ai-homelab", + title: "Self-Hosted AI & Homelab Platform", 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: - "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.", - 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.", + "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: "Owner / Operator", period: "Ongoing", - stack: ["Proxmox", "Talos", "ArgoCD", "Cilium", "Cloudflare Tunnel", "Prometheus"], - featured: false, + stack: ["Talos", "OpenShift", "ArgoCD", "Proxmox", "Local LLM", "Cloudflare Tunnel"], + featured: true, }, { slug: "iac-fleet-automation", - title: "IaC Automation for Fleet Deployments", + title: "IaC Fleet Automation", 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: - "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", - period: "Recent", // TODO(Jonathon): dates - stack: ["Ansible", "AWX", "Vault", "Multus", "GPU Operator"], + period: "2025 – Present", + 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, }, ]; diff --git a/src/data/site.ts b/src/data/site.ts index 90a5b1b..b9dc9a5 100644 --- a/src/data/site.ts +++ b/src/data/site.ts @@ -5,7 +5,8 @@ export const site = { name: "Jonathon Wright", // Short handle used in the mono "logo". handle: "jwright", - role: "Infrastructure Engineer", + role: "Infrastructure & DevOps Engineer", + location: "Sydney, Australia", // Outcome-led positioning (hero headline). positioning: "Building secure Kubernetes platforms, automated infrastructure fleets and GPU-backed edge systems.", @@ -19,14 +20,13 @@ export const site = { "Edge AI", ], // 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). 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", - // 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", locale: "en", } as const; diff --git a/src/data/skills.ts b/src/data/skills.ts index 608e552..2da67c9 100644 --- a/src/data/skills.ts +++ b/src/data/skills.ts @@ -10,77 +10,82 @@ export type 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.", items: [ "Kubernetes", - "Talos Linux", "OpenShift", + "Talos Linux", + "vSphere / VMware ESXi", + "Proxmox", + "containerd", "ArgoCD / GitOps", "Helm & Kustomize", - "Cilium / flannel", - "Gateway API & Ingress", ], }, { - title: "Infrastructure Automation", - blurb: "Removing the manual step entirely, not documenting it.", + title: "Automation & IaC", + blurb: "Single-touch deployments — removing the manual step, not documenting it.", items: [ - "Ansible", - "AWX", - "GitOps pipelines", - "Renovate", - "Image pre-pull & templating", - "Reproducible cluster bring-up", - ], - }, - { - 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", + "Ansible / AWX", + "PowerShell (PowerCLI)", + "Python", + "Bash / Shell", + "Terraform", + "Image pre-pull & air-gapped registries (ACR / NVCR)", + "Secrets management", ], }, { title: "Networking & Security", - blurb: "Default-deny, least-privilege, and a small attack surface.", + blurb: "Default-deny, segmentation, and a small attack surface.", items: [ - "Split-horizon DNS", - "Cloudflare Tunnel", - "Reverse proxy (Traefik / nginx)", - "NetworkPolicies", - "OIDC / SSO (Authentik)", - "Secrets (Vault / Infisical / ESO)", - "TLS & cert-manager", + "SD-WAN", + "802.1Q VLAN segmentation", + "ACLs / IPSec / RADIUS", + "Aruba ClearPass", + "Palo Alto / FortiGate", + "Firewall policy governance", + "RBAC · 2FA / SSO", ], }, { - title: "Observability", - blurb: "Knowing the system is healthy, not just the pods.", + title: "Observability & Ops", + blurb: "Knowing the system is healthy — and the GPUs with it.", items: [ "Prometheus", "Grafana", - "Alertmanager", - "node-exporter / kube-state-metrics", - "ServiceMonitors", + "DCGM Exporter", + "PRTG / LibreNMS", + "AWX job reporting", + "Veeam backup", + "ITIL processes", ], }, { - title: "AI & GPU Infrastructure", - blurb: "Serving vision and language models on real hardware.", + title: "Edge AI & GPU", + blurb: "Serving vision and language models on real hardware at the edge.", items: [ "NVIDIA GPU Operator", - "Multus / SR-IOV", + "GPU passthrough (ESXi, as code)", + "GPU readiness probing & watchdogs", + "Pod lifecycle management", "YOLO / computer-vision inference", "Local LLM serving (llama.cpp)", - "Agent frameworks & tooling", - "Hardware-isolated workloads (Kata)", + "Edge Kubernetes", ], }, ]; diff --git a/src/data/socials.ts b/src/data/socials.ts index b5fadbf..f5e2984 100644 --- a/src/data/socials.ts +++ b/src/data/socials.ts @@ -1,5 +1,4 @@ -// Social / contact links. `mailto` is built from site.email. -// TODO(Jonathon): confirm GitHub + LinkedIn handles (placeholders below). +// Social / contact links. export type Social = { label: string; @@ -12,14 +11,15 @@ export type Social = { export const socials: Social[] = [ { - label: "GitHub", - href: "https://github.com/jwrong96", // TODO(Jonathon): confirm public GitHub handle + // Self-hosted public git — his code, on his own infrastructure (goes live with git.bztmon.com). + label: "Source", + href: "https://git.bztmon.com/jwright", 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", - href: "https://www.linkedin.com/in/jonathon-wright", // TODO(Jonathon): confirm LinkedIn URL + href: "https://www.linkedin.com/in/jonathon-w-2697b995", 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", },