# markusgraf.ch

Source code for [markusgraf.ch](https://markusgraf.ch) — personal website of Markus Graf, built with [Hugo](https://gohugo.io/).

## About

Markus Graf is a developer, BSc Psychology graduate, and consultant based in Switzerland. The site serves as his personal blog and digital CV. Topics include AI agents, ADHD & productivity, digital tools, and tech experiments.

## Tech Stack

- **Static site generator**: [Hugo](https://gohugo.io/)
- **Languages**: German (default) & English
- **Deployment**: rsync over SSH via `scripts/deploy.sh`
- **Hosted at**: markusgraf.ch

## Site Structure

```
content/
├── blog/           # Blog posts (bilingual, DE + EN)
├── cv.de.md        # Lebenslauf (DE)
└── cv.en.md        # Curriculum Vitae (EN)
```

Blog posts are organized as page bundles (one folder per post). Each post has a `translationKey` to link its language variants.

## Local Development

```bash
hugo server -D
```

The site is served at `http://localhost:1313`. Draft posts (`-D`) are included.

## Deployment

The site is deployed via rsync. See [DEPLOYMENT.md](DEPLOYMENT.md) for the full guide.

```bash
hugo build
export SSH_USER='user'
export SSH_HOST='server.com'
./scripts/deploy.sh
```

## Workflow

All changes go through feature branches. See [AGENTS.md](AGENTS.md) for the full Git workflow and OpenSpec conventions.

```bash
git checkout -b feature/my-change
# make changes
git commit -m "feat: description"
# open pull request
```

Commit message conventions: `feat:`, `fix:`, `docs:`, `refactor:`, `test:`

## LLM Friendliness

The site includes a `static/llms.txt` file following the [llms.txt specification](https://llmstxt.org/), listing key pages for LLM discovery. When adding content, keep `static/llms.txt` up to date.

AI assistants working in this project should read [AGENTS.md](AGENTS.md) and [CLAUDE.md](CLAUDE.md) for project-specific instructions.
