https://github.com/roschaefer/roschaefer.de
https://github.com/roschaefer/roschaefer.de
Last synced: 3 months ago
JSON representation
- Host: GitHub
- URL: https://github.com/roschaefer/roschaefer.de
- Owner: roschaefer
- Created: 2026-03-17T16:40:05.000Z (3 months ago)
- Default Branch: main
- Last Pushed: 2026-03-26T19:11:01.000Z (3 months ago)
- Last Synced: 2026-03-27T08:09:12.793Z (3 months ago)
- Language: TypeScript
- Size: 421 KB
- Stars: 0
- Watchers: 0
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
[](https://app.netlify.com/projects/roschaefer/deploys)
# Robert Schäfer Portfolio
Personal portfolio and printable CV built with `SvelteKit`, `Tailwind CSS`, `Paraglide`, `Typst`, and prerendering.
The site is bilingual (`de`, `en`), privacy-conscious, screen-reader friendly, and designed to print cleanly as a CV.
## Stack
- `SvelteKit` with `@sveltejs/adapter-static`
- `Tailwind CSS`
- `Paraglide` for UI i18n
- `Typst` for PDF generation
- `Biome` for linting and formatting
- `Vitest` for unit tests
- `Netlify` for hosting, edge locale redirects, and short-link redirects
## Content Model
- `resume.i18n.json`
This file is the authored source of truth for resume content.
- `resume.de.json`
- `resume.en.json`
These two localized JSON Resume files are generated from `resume.i18n.json`.
The downloadable PDFs are generated from the same localized JSON sources through a dedicated `Typst` pipeline.
UI translations live in:
- `messages/de.json`
- `messages/en.json`
## Local Development
Install dependencies:
```bash
pnpm install
```
Start the dev server:
```bash
pnpm dev
```
The app runs with Paraglide compilation as part of the dev workflow.
## Useful Commands
Compile Paraglide messages:
```bash
pnpm paraglide:compile
```
Lint:
```bash
pnpm lint
```
Typecheck:
```bash
pnpm check
```
Test:
```bash
pnpm test
```
Build:
```bash
pnpm build
```
Build production output including PDFs:
```bash
pnpm build
```
Build PDFs only:
```bash
pnpm pdf:build
```
Format:
```bash
pnpm format
```
## Tests
The repo currently checks:
- tech-experience derivation
- locale preference parsing
- localized resume parity
- short-link parity between `src/lib/data/short-links.ts` and `netlify.toml`
## Deployment
Target hosting is `Netlify`.
The deployed PDFs are published as:
- `/de/robert-schaefer-resume.de.pdf`
- `/en/robert-schaefer-resume.en.pdf`
Important deployment behavior:
- `/` redirects to `/de` or `/en` via a Netlify edge function based on `Accept-Language`
- `/resume.json` redirects to `/de/resume.json` or `/en/resume.json`
- human-readable short links like `/linkedin` or `/oss-contributors-35c3` are defined in `netlify.toml`
## PDF Build And Deploy
- `Typst` is not assumed to be available in Netlify builds.
- GitHub Actions builds the PDFs and the final static site.
- GitHub Actions deploys the finished `build/` directory to Netlify.
- Netlify should be configured to use the GitHub Actions deployment path rather than relying on its own repository build if you want the PDFs to stay part of every deploy.
- Vendored `ttf` or `otf` fonts under `typst/fonts/` are required for the PDF build. See [`typst/README.md`](/home/robert/Development/schaefer-development/roschaefer.de/typst/README.md).
Required GitHub repository secrets for deployment:
- `NETLIFY_AUTH_TOKEN`
- `NETLIFY_SITE_ID`
## SEO / Social Metadata
The site includes:
- localized `` and meta description tags
- canonical URLs
- `hreflang` tags for the localized portfolio pages
- Open Graph tags
- Twitter card tags
The current social preview image is:
- `static/roschaefer.jpg`
## Project Notes
- Print output is optimized primarily for Firefox.
- The web version and print version share the same content source.
- Generated Paraglide files in `src/lib/paraglide` are expected to be committed.
- CI verifies that `pnpm paraglide:compile` does not leave generated changes uncommitted.