tillandClaude Opus 5 bfcfd14625 Impressum and Datenschutz, in both languages — and stop logging IPs
Four pages: /imprint/ and /privacy/ in English, /de/impressum/ and
/de/datenschutz/ in German, linked from the footer of the matching language.
The German version is the authoritative one; the English one says so.

Every fact in them was checked rather than assumed. The hosting section comes
from the Art. 28 processing agreement with Hetzner (EU/EEA only, DPO appointed,
breach notification, ISO 27001, BSI C5 Type 2); the server location comes from
the provider's API and is Nuremberg; the "no cookies, no third-party requests,
nothing in your browser" claim comes from loading the live page in a browser
that records every outgoing request — all of them went to this domain, with
zero cookies and an empty localStorage.

nginx now logs without the client address. The default format was writing
$remote_addr and X-Forwarded-For, so a static page that needs no personal data
at all was storing the IP of everyone who looked at it. The log keeps time,
request, status, size, referrer and user agent — enough to operate the site,
minus the field that identifies a person. Data minimisation beats a retention
policy you then have to honour.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Nh4A79bbqT9dcd2inzYUdg
2026-09-15 16:02:50 +00:00
2026-09-15 14:59:59 +00:00
2026-09-15 14:59:59 +00:00

klarbild-demo

The product and demo page for Klarbild, live at klarbild-demo.heidrich-digital.de.

Two static Astro pages — / in English and /de/ in German, from one shared component and one copy file (src/lib/copy.ts). The languages are separate URLs rather than a runtime switch, so each one is linkable, indexable and works without JavaScript; the button in the header is an ordinary link. The interesting part is src/lib/playground.ts: it imports src/engine/printlayout.ts and src/engine/paper.ts verbatim from the Klarbild repository and runs them in the visitor's browser. So the sheet you see being laid out is not a mock-up — it is the application's own arithmetic, and the PDF the page hands you is drawn from the same placements (with pdf-lib in the browser rather than sharp on a server, which is why it carries outlines instead of photographs).

The preset builder in the image-generation section does the same with src/engine/format.ts: it composes a real Klarbild recipe and shows the exact target pixels, but it never calls a model. Generating on a public page would mean a key on that page and a bill for every curious visitor — and the picture would say something about the model rather than about Klarbild.

Nothing is uploaded and there is no backend.

npm install
npm run dev

Keeping the engine in sync

src/engine/* are copies. When the print engine changes upstream, copy them again:

cp ../klarbild/src/lib/{printlayout,paper,printoversize,format}.ts src/engine/
cp ../klarbild/src/styles/tokens.css src/styles/tokens.css
# printoversize.ts imports './printlayout.ts'; drop the extension for the bundler
sed -i "s#from './printlayout.ts'#from './printlayout'#" src/engine/printoversize.ts

Deployment

Dockerfile: Node builds the site, nginx serves it on port 80. Coolify deploys on push to main.

S
Description
Product and demo page for Klarbild — klarbild-demo.heidrich-digital.de. Static Astro, runs the real print engine in the browser.
https://klarbild-demo.heidrich-digital.de
Readme
1.5 MiB
0 Stars 1 Watchers 0 Forks
Languages
TypeScript 70.8%
Astro 14.8%
CSS 13.9%
Dockerfile 0.3%
JavaScript 0.2%