Compare commits

..
1 Commits
Author SHA1 Message Date
fraujulianandClaude Opus 5.5 2cf0dd1720 docs(readme): rewrite in a personal voice
CI / formatting (push) Successful in 46s
CI / metadata (push) Successful in 46s
CI / lint (push) Successful in 54s
CI / tests (push) Successful in 54s
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 16:46:08 +02:00
+50 -39
View File
@@ -1,75 +1,86 @@
# FrauJulian's Portfolio Website
# Hey, I'm Julian πŸ‘‹
## Preview
This is the source code of my personal portfolio at
[fraujulian.xyz](https://fraujulian.xyz/). It's where I show who I am, what I
work on, and how you can reach me.
Visit the live website at [fraujulian.xyz](https://fraujulian.xyz/).
I'm a full-stack developer from Austria. I care about reliable systems, clean
code, and privacy. Most of my day happens on the move, usually on a train, and
when I'm not coding, I'm probably scuba diving somewhere in an Austrian lake. 🀿
## Technology
## What you'll find on the site
- Angular 22
- TypeScript
- SCSS
- Vitest for tests
## Features
- English and German language options (`?lang=de` selects German)
- About, work, and project portfolio
- Contact links
- A short introduction about me and the skills I work with
- My current jobs and projects
- Ways to get in touch: email, phone, Signal, Gitea, and LinkedIn
- English and German versions (add `?lang=de` for German)
- A small portrait gallery: click the photo to see a bit more of my life
- Imprint and privacy information
- Interactive portrait highlights
## Project Architecture
## Built with
- `src/app/home` β€” portfolio landing page
- `src/app/imprint` β€” imprint and privacy page
- `src/app/footer` β€” site footer
- `src/app/shared` β€” reusable UI components
- `src/app/services` β€” language and preference services
- `src/languages` β€” English and German content
- `scripts` β€” asset generation, versioning, and static file tools
I kept the stack small and modern on purpose:
## Setup
- Angular 22 with standalone components, signals, and zoneless change detection
- TypeScript and SCSS
- Vitest for tests
- A tiny Node.js static server with security headers and compression
Requirements: Node.js 24.15 or newer and npm 11.12 or newer.
The site is fully static. There is no tracking, no cookies, and no third-party
requests. Even the font is self-hosted. πŸ”’
### Development
## Running it locally
You need Node.js 24.15 or newer and npm 11.12 or newer.
```bash
npm ci
npm run dev
```
The development server generates required static assets and runs the site at
This generates the optimized assets and starts the dev server at
`http://localhost:4200`.
### Production
To build and serve the production version:
```bash
npm run build
npm start
```
The build writes the static site to `dist/browser`. The static server serves the
built site at `http://localhost:3000`.
The build lands in `dist/browser`, and the static server runs at
`http://localhost:3000`.
## Tests
## Tests and checks
```bash
npm run test
npm run check
```
This generates assets and runs the Vitest tests in jsdom.
`npm run test` runs the Vitest suite in jsdom. `npm run check` runs linting,
formatting, version, and source text checks. Please run it before you open a
pull request.
## Docs
## Project structure
- `src/app/home`: the portfolio landing page
- `src/app/imprint`: imprint and privacy page
- `src/app/footer`: site footer
- `src/app/shared`: reusable UI building blocks
- `src/app/services`: language, preference, and SEO services
- `src/languages`: English and German content
- `scripts`: asset generation, versioning, and the static server
More notes:
- [Nginx Proxy Manager deployment notes](npm.md)
- [Project conventions](AGENTS.md)
## Guidelines
## License
Run `npm run check` before submitting changes. See [AGENTS.md](AGENTS.md) for
project conventions.
The code is licensed under the
[GNU Affero General Public License v3.0](LICENSE). The content of the website,
such as texts and photos, is mine and not covered by that license.
## LICENSE
Licensed under the [GNU Affero General Public License v3.0](LICENSE).
Thanks for stopping by! ✨