lab.hartle.tech — portfolio dashboard for HARTLE.TECH. Products, infrastructure, knowledge, source consoles. Tailnet-only. https://lab.hartle.tech
  • Astro 41.7%
  • TypeScript 41.4%
  • CSS 10.9%
  • Dockerfile 4.6%
  • JavaScript 1.4%
Find a file
hartle-tech 56497c804b
Some checks failed
build / build-and-push (push) Failing after 0s
feat(ci): Forgejo Actions build → forgejo.hartle.tech registry (replaces ex-GHA)
2026-05-19 00:09:51 +01:00
.forgejo/workflows feat(ci): Forgejo Actions build → forgejo.hartle.tech registry (replaces ex-GHA) 2026-05-19 00:09:51 +01:00
.github/workflows feat(init S01E37 #21): lab.hartle.tech portfolio dashboard — Astro + Open Props 2026-05-16 22:45:26 +01:00
public feat(init S01E37 #21): lab.hartle.tech portfolio dashboard — Astro + Open Props 2026-05-16 22:45:26 +01:00
src fix(inventory): retire All-project-boards card (Vikunja replaces); AWS → standby 2026-05-19 00:06:31 +01:00
.gitignore feat(init S01E37 #21): lab.hartle.tech portfolio dashboard — Astro + Open Props 2026-05-16 22:45:26 +01:00
astro.config.mjs feat(init S01E37 #21): lab.hartle.tech portfolio dashboard — Astro + Open Props 2026-05-16 22:45:26 +01:00
Caddyfile fix(inventory S01E37): tools→Documentation, OpenBao/Headlamp/Authentik canonical, Nosferato linkless 2026-05-17 02:41:47 +01:00
CLAUDE.md feat(init S01E37 #21): lab.hartle.tech portfolio dashboard — Astro + Open Props 2026-05-16 22:45:26 +01:00
Dockerfile fix(k8s S01E37): strip cap_net_bind_service fcap from caddy binary 2026-05-17 00:13:28 +01:00
LICENSE feat(init S01E37 #21): lab.hartle.tech portfolio dashboard — Astro + Open Props 2026-05-16 22:45:26 +01:00
NOTICE feat(init S01E37 #21): lab.hartle.tech portfolio dashboard — Astro + Open Props 2026-05-16 22:45:26 +01:00
package-lock.json feat(init S01E37 #21): lab.hartle.tech portfolio dashboard — Astro + Open Props 2026-05-16 22:45:26 +01:00
package.json feat(init S01E37 #21): lab.hartle.tech portfolio dashboard — Astro + Open Props 2026-05-16 22:45:26 +01:00
README.md feat(init S01E37 #21): lab.hartle.tech portfolio dashboard — Astro + Open Props 2026-05-16 22:45:26 +01:00
tsconfig.json feat(init S01E37 #21): lab.hartle.tech portfolio dashboard — Astro + Open Props 2026-05-16 22:45:26 +01:00

lab.hartle.tech

Portfolio dashboard for HARTLE.TECH — every product, infrastructure surface, knowledge base, and external console in one card grid. Tailnet-only.

Live at lab.hartle.tech (tailnet members only). Replaces the previous gethomepage installation with a recruiter/business-partner-grade portfolio surface.

Stack

  • Astro — static site, zero JS by default
  • Open Props — design tokens via CDN, no build dependency
  • Vanilla CSS with custom-properties, container queries, and View Transitions
  • Container runtime: caddy:2-alpine (in-pod static server)
  • Deploy: GHA → GHCR → Flux Image Automation → k3s

Local dev

npm install
npm run dev
# → http://localhost:5179

Build

npm run build     # produces dist/
npm run preview   # serves dist/ locally

Docker

docker build -t lab-hartle-tech .
docker run --rm -p 8080:80 lab-hartle-tech
# → http://localhost:8080

Architecture

code-hartle-tech/lab-hartle-tech     (this repo)
        │
        ▼ push to develop
GHA → docker buildx → ghcr.io/code-hartle-tech/lab-hartle-tech:sha-N-XXXX
        │
        ▼ Flux ImageRepository + ImagePolicy
hartle.tech-terraform/k8s/workloads/product-docs/lab-hartle-tech/
        │
        ▼ Deployment → ClusterIP Service
Caddy on VPS (lab.hartle.tech vhost) → reverse_proxy → cluster

Card design contract

Each card uses one --brand-accent CSS variable. Brand color enters via:

  • 3px left stripe
  • Status pill background tint
  • Hover glow (12% opacity)
  • Arrow color on hover

Everything else (surface, text, borders, tags) uses global neutral tokens. This prevents the rainbow-Skittles failure mode while letting each card feel like its product.

Adding a card

Edit src/data/inventory.ts:

{
  name: 'My New Thing',
  tagline: 'One-line description.',
  urlPublic: 'https://newthing.hartle.tech',
  brandAccent: '#04D94F',
  tags: ['tag1', 'tag2'],
  status: 'wip',
},

Add it to the appropriate Category.items array. Build, push to develop, Flux deploys it.

License

Apache 2.0 — see LICENSE and NOTICE.

Contact

contact@hartle.tech