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.
This commit is contained in:
Executable
+35
@@ -0,0 +1,35 @@
|
||||
#!/usr/bin/env bash
|
||||
# Build + push the site image to the public Gitea registry using rootless buildah.
|
||||
# Bootstrap path for M1-M4 (before the Gitea Actions runner exists in M5).
|
||||
#
|
||||
# Usage: scripts/build-image.sh [push]
|
||||
# (no arg) -> build only
|
||||
# push -> build then push, and print the pushed digest to pin in home-ops
|
||||
#
|
||||
# Requires: buildah (rootless) on the host, and `buildah login` to the registry
|
||||
# for the push step (anonymous pull, authenticated push).
|
||||
set -euo pipefail
|
||||
|
||||
REGISTRY="${REGISTRY:-git.bztmon.com}"
|
||||
IMAGE="${IMAGE:-jwrong96/bztmon-site}"
|
||||
REF="${REGISTRY}/${IMAGE}"
|
||||
|
||||
cd "$(dirname "$0")/.."
|
||||
|
||||
# Tag with the short git sha when available, else 'dev'.
|
||||
TAG="$(git rev-parse --short HEAD 2>/dev/null || echo dev)"
|
||||
|
||||
echo ">> building ${REF}:${TAG}"
|
||||
buildah build --layers -t "${REF}:${TAG}" -t "${REF}:latest" .
|
||||
|
||||
if [[ "${1:-}" == "push" ]]; then
|
||||
echo ">> pushing ${REF}:${TAG}"
|
||||
buildah push --digestfile /tmp/bztmon-site.digest "${REF}:${TAG}"
|
||||
buildah push "${REF}:latest"
|
||||
DIGEST="$(cat /tmp/bztmon-site.digest)"
|
||||
echo
|
||||
echo ">> pin this in home-ops kubernetes/apps/bztmon-site/bztmon-site.yaml:"
|
||||
echo " image: ${REF}:${TAG}@${DIGEST}"
|
||||
else
|
||||
echo ">> built (not pushed). Re-run with: scripts/build-image.sh push"
|
||||
fi
|
||||
@@ -0,0 +1,54 @@
|
||||
// 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).
|
||||
// Self-hosted asset → no third-party OG service, nothing external at runtime.
|
||||
import sharp from "sharp";
|
||||
import { fileURLToPath } from "node:url";
|
||||
|
||||
const out = fileURLToPath(new URL("../public/og.png", import.meta.url));
|
||||
|
||||
const W = 1200;
|
||||
const H = 630;
|
||||
|
||||
const svg = `
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="${W}" height="${H}" viewBox="0 0 ${W} ${H}">
|
||||
<defs>
|
||||
<linearGradient id="title" x1="0" y1="0" x2="0" y2="1">
|
||||
<stop offset="0" stop-color="#e7edf4"/>
|
||||
<stop offset="1" stop-color="#7fdcc9"/>
|
||||
</linearGradient>
|
||||
<radialGradient id="glow" cx="18%" cy="0%" r="80%">
|
||||
<stop offset="0" stop-color="#2dd4bf" stop-opacity="0.22"/>
|
||||
<stop offset="60%" stop-color="#2dd4bf" stop-opacity="0"/>
|
||||
</radialGradient>
|
||||
<pattern id="grid" width="44" height="44" patternUnits="userSpaceOnUse">
|
||||
<path d="M44 0H0V44" fill="none" stroke="#94a3b8" stroke-opacity="0.06" stroke-width="1"/>
|
||||
</pattern>
|
||||
</defs>
|
||||
|
||||
<rect width="${W}" height="${H}" fill="#090c14"/>
|
||||
<rect width="${W}" height="${H}" fill="url(#grid)"/>
|
||||
<rect width="${W}" height="${H}" fill="url(#glow)"/>
|
||||
<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"
|
||||
fill="#5eead4">~/ INFRASTRUCTURE ENGINEER</text>
|
||||
|
||||
<text x="78" y="300" font-family="sans-serif" font-size="118" font-weight="700"
|
||||
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">
|
||||
Secure Kubernetes platforms · automated fleets
|
||||
</text>
|
||||
<text x="80" y="446" font-family="sans-serif" font-size="40" font-weight="500" fill="#cdd6e3">
|
||||
· GPU-backed edge systems
|
||||
</text>
|
||||
|
||||
<text x="80" y="560" font-family="monospace" font-size="28" fill="#61708a">
|
||||
Talos · Kubernetes · GitOps · Ansible · Edge AI
|
||||
</text>
|
||||
<text x="${W - 80}" y="560" text-anchor="end" font-family="monospace" font-size="28"
|
||||
fill="#5eead4">www.bztmon.com</text>
|
||||
</svg>`;
|
||||
|
||||
await sharp(Buffer.from(svg)).png().toFile(out);
|
||||
console.log("wrote", out);
|
||||
Reference in New Issue
Block a user