diff --git a/.gitea/workflows/deploy.yml b/.gitea/workflows/deploy.yml index c014cbbb..31c262bc 100644 --- a/.gitea/workflows/deploy.yml +++ b/.gitea/workflows/deploy.yml @@ -41,3 +41,30 @@ jobs: docker stop portfolio 2>/dev/null || true && \ docker rm portfolio 2>/dev/null || true && \ docker run -d --name portfolio -p 80:80 --restart unless-stopped portfolio" + + - name: Tag release (CalVer) + run: | + git fetch --tags + if git describe --exact-match --tags HEAD 2>/dev/null; then + echo "Commit already tagged, skipping." + else + YEAR=$(date +%Y) + MONTH=$(date +%m) + LATEST=$(git tag --sort=-v:refname | grep -E '^[0-9]{4}\.[0-9]{2}\.[0-9]+$' | head -1) + if [ -n "$LATEST" ]; then + LATEST_YEAR=$(echo "$LATEST" | cut -d. -f1) + LATEST_MONTH=$(echo "$LATEST" | cut -d. -f2) + LATEST_MICRO=$(echo "$LATEST" | cut -d. -f3) + if [ "$YEAR" = "$LATEST_YEAR" ] && [ "$MONTH" = "$LATEST_MONTH" ]; then + MICRO=$((LATEST_MICRO + 1)) + else + MICRO=1 + fi + else + MICRO=1 + fi + NEW_TAG="${YEAR}.$(printf '%02d' $MONTH).${MICRO}" + git tag "$NEW_TAG" + git push origin "$NEW_TAG" + echo "Tagged $NEW_TAG" + fi diff --git a/src/app/archive/page.tsx b/src/app/archive/page.tsx index 13e5848b..0692efde 100644 --- a/src/app/archive/page.tsx +++ b/src/app/archive/page.tsx @@ -11,22 +11,17 @@ export default function ArchivePage() { return ( <>
-
- - archive - - -

- Earlier Work -

-

+

+ + tyler/projects/archive +

+

Experiments, browser extensions, and bootcamp projects. Kept here for context — not representative of current work.

- +
{archiveProjects.map((project) => (
-

+

{project.description}

diff --git a/src/app/globals.css b/src/app/globals.css index ad6ef9a6..f0c7b66f 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -3,17 +3,24 @@ @variant dark (&:where(.dark, .dark *)); @theme { - /* Terminal-Noir palette */ - --color-bg: #0a0a0a; - --color-surface: #111111; - --color-surface-raised: #1a1a1a; - --color-border: #2a2a2a; - --color-border-bright: #444444; - --color-text: #e8e8e8; - --color-text-label: #666666; - --color-text-dim: #444444; - --color-accent-green: #00cc44; - --color-accent-red: #cc2200; + /* macOS Classic Dark (default) */ + --color-bg: #131313; + --color-surface: #1e1d1e; + --color-surface-raised: #272727; + --color-border: #3a3a3a; + --color-border-bright: #404040; + --color-text: #caccca; + --color-text-label: #9e9e9e; + --color-text-dim: #8f8f8f; + --color-accent-green: #62ba46; + --color-accent-red: #c74028; + + /* Timeline type colors — dark */ + --color-timeline-career: #62ba46; + --color-timeline-education: #c28b12; + --color-timeline-cert: #c75828; + --color-timeline-project: #c72855; + --color-timeline-homelab: #e1d797; /* Typography */ --font-mono: "Source Code Pro", ui-monospace, monospace; @@ -34,11 +41,15 @@ /* Base */ html { scroll-behavior: smooth; + font-size: 14px; background-color: var(--color-bg); color: var(--color-text); font-family: var(--font-mono); } +@keyframes blink { 50% { opacity: 0; } } +.animate-cursor { animation: blink 1s step-start infinite; } + @layer base { * { box-sizing: border-box; @@ -47,6 +58,26 @@ html { } } +/* macOS Classic Light overrides */ +:root:not(.dark) { + --color-bg: #ffffff; + --color-surface: #f9f9f9; + --color-surface-raised: #f7f7f7; + --color-border: #e0e0e0; + --color-border-bright: #d2d2d2; + --color-text: #000000; + --color-text-label: #505050; + --color-text-dim: #929292; + --color-accent-green: #036a07; + --color-accent-red: #d21f07; + + --color-timeline-career: #036a07; + --color-timeline-education: #0433ff; + --color-timeline-cert: #957931; + --color-timeline-project: #6f42c1; + --color-timeline-homelab: #0000a2; +} + /* Default transitions — linear, fast */ a, button { diff --git a/src/app/homelab/page.tsx b/src/app/homelab/page.tsx index a9fc0443..fbb7ad0f 100644 --- a/src/app/homelab/page.tsx +++ b/src/app/homelab/page.tsx @@ -74,6 +74,11 @@ const adrs = [ "act_runner v0.3.1 on Gitea LXC (10.99.0.22). Push to dev → node:22-alpine container builds Next.js → rsync out/ to Portfolio LXC → SSH docker rebuild.", why: "Keeps the full pipeline internal — no GitHub Actions, no external runners. Build runs in an isolated Alpine container so the Gitea LXC isn't polluted. Portfolio LXC (10.99.0.23) just serves pre-built static files via nginx.", }, + { + title: "Authentik over Authelia", + decision: "Authentik as the SSO provider across all self-hosted services.", + why: "Full OIDC provider + forward auth in one. Lets services like Outline, Gitea, and Vikunja use real SSO rather than just a login gate. Authelia is forward-auth only — no OIDC provider capability.", + }, ]; export default function HomelabPage() { @@ -81,16 +86,11 @@ export default function HomelabPage() { <> {/* Header */}
-
- - lerkolabs - - -

- Home Infrastructure Lab -

-

+

+ + homelab +

+

Personal infrastructure environment for learning, self-hosting, and operational practice. Running 24/7 on production-grade hardware with real network segmentation, SSO, monitoring, and IaC-style documentation. @@ -98,7 +98,7 @@ export default function HomelabPage() {

{/* At a Glance */} - +
{glanceStats.map(({ label, value }) => (
@@ -151,7 +151,7 @@ export default function HomelabPage() { {v.subnet} - {v.purpose} + {v.purpose} ))} @@ -161,7 +161,7 @@ export default function HomelabPage() { {/* Services */} @@ -187,7 +187,7 @@ export default function HomelabPage() {

{svc.name}

-

+

{svc.description}

@@ -202,7 +202,7 @@ export default function HomelabPage() { {/* ADRs */}

{adr.title}

-

+

decision: {adr.decision}

-

+

why: {adr.why}

@@ -228,16 +228,16 @@ export default function HomelabPage() {
{/* GitHub CTA */} -
-

lerkolabs on GitHub

-

- Full documentation: VLAN maps, runbooks, service registry, config exports, and setup guides. +

+

homelab/docs → github.com/lerko96/homelab-wip

+

+ VLAN maps, runbooks, service registry, config exports, and setup guides.

↗ github.com/lerko96/homelab-wip diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 0f0a8aa2..a2c840a3 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -27,12 +27,6 @@ export default function RootLayout({ - - - +
{featuredProjects.map((project) => ( ))}
+ + ); } diff --git a/src/components/Footer.tsx b/src/components/Footer.tsx index 2085cd15..a367933c 100644 --- a/src/components/Footer.tsx +++ b/src/components/Footer.tsx @@ -2,7 +2,7 @@ export default function Footer() { return (