Personal portfolio codebase for tim-schoenle.de.
It includes:
- localized routes (
/en,/de) - live GitHub project and contribution data
- generated PDF resumes (optionally digitally signed)
- strict CI quality gates, security checks, and Docker build pipeline
This repository is under a proprietary license. You can inspect and run it locally for personal evaluation, but reuse and public deployment are restricted. See LICENSE.
- Runtime: Bun
- Framework: Next.js App Router (React 19, TypeScript strict mode)
- Styling: Tailwind CSS v4 + Radix primitives + custom "blueprint" design system
- i18n:
next-intl - Monitoring/analytics: optional Sentry + Cloudflare Web Analytics
- PWA: Serwist service worker and web app manifest
- Testing: Vitest (unit/component), Playwright (e2e), fuzzy tests
- Quality: ESLint, Prettier, Knip, dependency-cruiser, Lighthouse CI, license check
- Delivery: multi-stage Docker image (
output: "standalone") + GitHub Actions
- Landing page sections for hero, about, skills, projects, experience, contact
- Command palette (
Ctrl+K/Cmd+K) for navigation and quick actions - GitHub integration for featured repos, profile stats, and contribution heatmap
- Public API endpoints:
GET /api/healthGET /api/v1/profileGET /api/v1/profile/schema
- Resume generation at build time to
public/resume/{locale}.pdf - Optional resume signing with certificate export + fingerprint verification UI
- Localized legal pages (
/imprint,/privacy)
.
|- messages/ # Translation files (en/de)
|- scripts/ # Build helpers (resume generation, standalone startup, licenses)
|- src/
| |- app/ # App Router pages, metadata routes, API routes, service worker
| |- components/
| | |- blueprint/ # Portfolio-specific design primitives
| | |- sections/ # Home page sections
| | |- features/ # Command palette, contribution graph, analytics, etc.
| |- data/ # Site configuration and skills data
| |- i18n/ # Locale routing and request helpers
| |- lib/ # GitHub client, logger, utility modules
| |- models/ # API/data schemas (zod)
|- test/ # Vitest setup
|- tests/ # Playwright tests + global setup
|- .github/workflows/ # CI/CD + security workflows
bun installGITHUB_TOKEN=ghp_xxxNotes:
GITHUB_TOKENis optional, but without it GitHub data may be empty/rate-limited.
bun run devOpen:
bun run build
bun run startstart runs a standalone server helper (scripts/start-standalone.ts) with HOSTNAME=0.0.0.0 and PORT=3000.
Returns runtime liveness:
{
"status": "healthy",
"timestamp": "<ISO-8601 timestamp>"
}Returns public profile data (contact, social links, typed skill groups). Response includes:
- validated payload based on zod schema
$schemalink pointing to/api/v1/profile/schema
Returns the JSON schema for /api/v1/profile.
Builds always generate localized PDFs:
bun run build:resumeUnsigned mode:
- writes
public/resume/en.pdfandpublic/resume/de.pdf
Signed mode:
- Provide
RESUME_SIGNING_CERT_BASE64andRESUME_SIGNING_CERT_PASSWORD - Build resumes again
- Script exports:
- signed PDFs
public/resume/certificate.crtpublic/resume-fingerprint.json
For local certificate bootstrap:
bun scripts/generate-resume-certificate.ts- GitHub cards or contribution graph empty:
- check
GITHUB_TOKEN - check API rate limits
- check
Proprietary license. See LICENSE for terms.