One source of truth
Everything on this site comes from a handful of TypeScript files in src/lib/data. The roles have start and end dates and a stack. The rest is derived: how long I used each skill, the charts, the stats in the About section, the skill levels. When I add a role, every number updates.
{ id: 'property-plan', company: 'Property Plan', start: '2025-07', end: '2026-07', stack: ['Angular', 'Ionic Framework', 'Capacitor', 'RxJS', 'Playwright', 'MCP']}Overlapping roles are counted once, so two parallel projects with React do not make two years of React out of one.
Static, but not boring
The site is built with SvelteKit and exported as plain HTML with adapter-static, hosted on GitHub Pages. Every page, in both languages, is prerendered, so it works without JavaScript and search engines see the full text.
Heavier sections load when you scroll near them. The fonts are self-hosted, so your IP address is not sent to Google. Analytics come from Cloudflare Web Analytics, which uses no cookies, so there is no cookie banner either.
Two languages, two URLs
English lives at / and Dutch at /nl/. Each page links to its translation with hreflang tags, so a Dutch search shows the Dutch page. The text for each language lives in its own folder, and TypeScript checks that the Dutch version has every key the English one has.
Tested like a product
- Unit tests with Vitest for the date maths and the derived statistics.
- End-to-end tests with Playwright, including an axe accessibility scan of every page in both themes.
- Lighthouse CI on every pull request, with budgets for performance, accessibility and SEO.
- A Content Security Policy with hashes for every inline script.
The status of my open-source pull requests is fetched from the GitHub API at build time, and the site rebuilds itself every week, so it does not show a merged PR as open for months.
The code is MIT-licensed on GitHub. Feel free to use it for your own portfolio.