No description
- TypeScript 86.7%
- JavaScript 6.2%
- Shell 5.2%
- CSS 1.6%
- Dockerfile 0.3%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
| .github/workflows | ||
| app | ||
| components | ||
| docs/synthesis-screenshots | ||
| hooks | ||
| lib | ||
| monitoring | ||
| public | ||
| scripts | ||
| tests | ||
| .dockerignore | ||
| .env.example | ||
| .gitignore | ||
| .nvmrc | ||
| compose.yaml | ||
| Dockerfile | ||
| next-env.d.ts | ||
| next.config.js | ||
| package-lock.json | ||
| package.json | ||
| playwright.config.ts | ||
| postcss.config.js | ||
| README.md | ||
| tailwind.config.js | ||
| tsconfig.json | ||
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_TOKENis 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
- Forgejo: git.tessdev.fr/karma
- Email: ledombre@gmail.com