codeaeffchen.de – our own website, built with Astro
More than 400 pages in two languages, two domains from a single build, served as finished HTML from ordinary web hosting. What we recommend to clients, we run here ourselves – and measure it in every pull request.
Project info
- type
- Own project
- service
- Concept, development, operation
- technology
- Astro 7, Tailwind CSS 4, TypeScript
- scope
- More than 400 pages in German and English
- status
- Live on codeaeffchen.de and codeaeffchen.com
What it is about
Our website is mostly content: 68 in-depth articles, 69 glossary terms and 15 tools – each in German and English, on two domains. We maintain it ourselves, in Markdown and Git. A CMS with logins, plugins and security updates would only have added upkeep without doing anything we need.
Hence Astro: every page is built ahead of time as finished HTML. PHP runs on the server only in the two places that truly need it – the contact form and the HTTP status checker. Everything else is static and sits on perfectly ordinary web hosting.
How the site is built
Two domains from one build
A single Astro build produces every page in both languages. A custom script then splits the output onto codeaeffchen.de and codeaeffchen.com, strips the /en/ prefix from every link on the English domain and rewrites sitemaps and robots.txt to match. Every page knows its counterpart in the other language (hreflang).
Content with a schema
Articles live in a content collection. The build itself checks title and description length and the mandatory summary – an incomplete article never goes live. Articles dated in the future appear on their own: a daily early-morning build publishes them.
One source for every figure
Prices, navigation, footer, the llms.txt for AI systems and the tools overview are generated from data files. When a price changes, it changes in one place – and everywhere on the site.
Analytics without a cookie banner
Matomo runs without cookies and respects Do Not Track, fonts are self-hosted. The site therefore shows no cookie banner.
What is checked before every change
A static site can't crash – but it can break quietly: a link to nowhere, a missing section, a page that no longer works on a phone. So before any change goes live:
- Completeness: Does every page have a title, heading, description and text? If a required section is missing, the check fails.
- Links: Every internal link in the build is checked for targets that don't exist.
- Accessibility: axe-core checks 47 page types against WCAG 2.0/2.1 A and AA plus best practices – at two screen widths, with and without animations.
- Lighthouse: Five pages are measured three times each on mobile. If accessibility drops below 95, the change is not accepted; performance, best practices and SEO below 90 raise a warning.
- After upload: A second check runs against the real domains: pages reachable, content complete, form and status endpoint responding as expected.
Measurements
Lighthouse, mobile view on a throttled connection, median of three runs. Measured 10 October 2026.
| Page | Performance | Accessibility | Best Practices | SEO | LCP |
|---|---|---|---|---|---|
| Home | 99 | 100 | 100 | 100 | 2.0 s |
| WordPress maintenance | 100 | 100 | 100 | 100 | 1.7 s |
| Article | 100 | 100 | 100 | 100 | 1.7 s |
| Contact | 100 | 100 | 100 | 100 | 1.7 s |
| HTTP status checker | 100 | 100 | 100 | 100 | 1.7 s |
These are lab figures from our automated checks, not measurements from real visitors. They show the site gives nothing away technically – how fast it loads for you also depends on your device and connection.
Stack
- Framework
- Astro 7, TypeScript
- Styling
- Tailwind CSS 4
- Content
- Markdown, content collections
- Tests
- Playwright, axe-core, Lighthouse CI
- Server-side
- PHP 8 (contact form, status checker)
- Deployment
- GitHub Actions, two domains
Planning an Astro website?
New build or moving off WordPress: in a first call we show you what Astro brings to your site – and where it doesn't fit.
Prefer to talk? +49 9163 6791505 (Mon–Fri, 8 am–6 pm CET)