No description
  • TypeScript 86.7%
  • JavaScript 6.2%
  • Shell 5.2%
  • CSS 1.6%
  • Dockerfile 0.3%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Karma be43ef6e84
All checks were successful
CI / test (push) Successful in 2m13s
CI / docker-verify (push) Successful in 58s
CI / docker-publish (push) Successful in 16s
CI / deploy (push) Successful in 26s
docs: refresh README for synthesis portfolio, Forgejo, and Umami
2026-08-07 15:44:34 +02:00
.github/workflows fix: deploy via OpenSSH instead of appleboy/ssh-action 2026-07-22 16:57:43 +02:00
app design/synthesis: lavender chalk + Forgejo + smoother stages (#2) 2026-08-07 15:39:54 +02:00
components design/synthesis: lavender chalk + Forgejo + smoother stages (#2) 2026-08-07 15:39:54 +02:00
docs/synthesis-screenshots design/synthesis: lavender chalk + Forgejo + smoother stages (#2) 2026-08-07 15:39:54 +02:00
hooks design/synthesis: lavender chalk + Forgejo + smoother stages (#2) 2026-08-07 15:39:54 +02:00
lib design/synthesis: lavender chalk + Forgejo + smoother stages (#2) 2026-08-07 15:39:54 +02:00
monitoring Harden analytics dashboards and strip X-Powered-By from portfolio. 2026-06-15 03:25:37 +02:00
public design/synthesis: lavender chalk + Forgejo + smoother stages (#2) 2026-08-07 15:39:54 +02:00
scripts design/synthesis: lavender chalk + Forgejo + smoother stages (#2) 2026-08-07 15:39:54 +02:00
tests design/synthesis: lavender chalk + Forgejo + smoother stages (#2) 2026-08-07 15:39:54 +02:00
.dockerignore chore: harden Docker build and CI for production deploy 2026-06-11 18:03:47 +02:00
.env.example design/synthesis: lavender chalk + Forgejo + smoother stages (#2) 2026-08-07 15:39:54 +02:00
.gitignore Ignore AGENTS.md locally after purging it from repository history. 2026-06-15 03:21:53 +02:00
.nvmrc chore: upgrade toolchain for modern Next.js portfolio 2026-05-12 11:07:23 +02:00
compose.yaml design/synthesis: lavender chalk + Forgejo + smoother stages (#2) 2026-08-07 15:39:54 +02:00
Dockerfile perf: audit fixes, terminal OG card, and production hardening 2026-06-11 07:29:59 +02:00
next-env.d.ts fix: Update TypeScript route imports and enforce constant type for spring transitions in page.tsx 2026-01-05 00:54:02 +01:00
next.config.js design/synthesis: lavender chalk + Forgejo + smoother stages (#2) 2026-08-07 15:39:54 +02:00
package-lock.json fix(security): update esbuild to 0.28.1 2026-07-23 12:34:19 +02:00
package.json Harden analytics dashboards and strip X-Powered-By from portfolio. 2026-06-15 03:25:37 +02:00
playwright.config.ts design/synthesis: lavender chalk + Forgejo + smoother stages (#2) 2026-08-07 15:39:54 +02:00
postcss.config.js chore: Update .gitignore and add PostCSS and Tailwind CSS configuration files 2024-08-31 17:17:21 +02:00
README.md docs: refresh README for synthesis portfolio, Forgejo, and Umami 2026-08-07 15:44:34 +02:00
tailwind.config.js design/synthesis: lavender chalk + Forgejo + smoother stages (#2) 2026-08-07 15:39:54 +02:00
tsconfig.json Refresh portfolio with tests, updated projects, and Raytracer demo image. 2026-06-11 05:10:58 +02:00

Tess Dev Portfolio

Personal portfolio for Karma — C++, systems work, and a Proxmox homelab on tess. Live at tessdev.fr. Source on Forgejo.

Features

  • Synthesis UI: warm kinetic layout, lavender chalk palette, scroll-locked project + lab stages
  • Live GLSL raytracer hero (and ambient contact cam) — port of the C++ raytracer
  • Forgejo repo count on About (private repos when FORGEJO_TOKEN is set)
  • Same-origin Umami analytics via /analytics/* proxy (LAN-only Umami, no public Umami host)
  • Playwright e2e + unit tests in Forgejo Actions; Docker image → Proxmox LXC behind NPM

Stack

  • Next.js 16 · React 19 · TypeScript (Node >=20 <27)
  • Tailwind CSS 3.4 · shadcn/ui patterns · lucide-react
  • Playwright · Docker · Proxmox · Forgejo · Umami (local)

Getting started

git clone git@git.tessdev.fr:karma/portfolio.git
cd portfolio
cp .env.example .env   # fill FORGEJO_TOKEN / Umami if needed
npm install
npm run dev

Open http://localhost:3000.

Environment

Variable Purpose
FORGEJO_TOKEN Forgejo PAT (read:repository) so About can count private repos
UMAMI_INTERNAL_URL Server-only Umami base (e.g. http://host.docker.internal:11001 on homelab)
UMAMI_WEBSITE_ID Umami website id — enables <SiteAnalytics />

Browser never talks to Umami directly; it loads /analytics/script.js and posts to /analytics/api/* on the same origin.

Local analytics stack (optional):

npm run analytics:up    # Umami (+ helpers) via monitoring/compose.yaml
npm run analytics:down

Scripts

npm run dev               # Next.js dev server
npm run build             # Production build
npm run start             # next start
npm run start:standalone  # Standalone Node server (CI / Docker-shaped)
npm run typecheck
npm run test              # unit + e2e
npm run test:unit
npm run test:e2e          # Playwright against a production build (:3002)
npm run test:e2e:ui

Project structure

app/                 App Router (page, layout, analytics proxy, Forgejo API)
components/
  synthesis/         Live portfolio sections (hero, projects, lab, about, contact)
  first-light/       Shared raytracer / cursor / magnetic primitives
  sections/          Legacy section set (not the live home composition)
lib/
  data/              Editable content (projects, skills, contact, forgejo, site)
  forgejo.ts         Repo-count client
  analytics.ts       Umami config + public paths
tests/e2e/           Playwright
tests/unit/          Node test runner
monitoring/          Local Umami / GoAccess compose
public/demos/        Project WebM + posters

Edit lineup and copy in lib/data/ — not hardcoded in section components.

Docker / homelab

docker compose up -d --build   # http://localhost:11000

Image: getkarma/tess-dev-portfolio:latest (standalone Next.js on Node 20 Alpine). Homelab runs it as portfolio-tess-dev on LXC 699 (docker-general), port 11000, fronted by Nginx Proxy Manager.

CI on main: unit → typecheck → e2e → Docker verify → (secrets present) publish + deploy.

Contact