Skip to content

Commit afb2600

Browse files
davidbingmannclaude
andcommitted
Add privacy policy, self-host fonts, and tighten log retention
- Bundle Space Mono (latin subset) via @fontsource/space-mono; remove external Google Fonts request from <head> to satisfy GDPR/EU IP-transfer concerns (LG München I, 20.01.2022 — 3 O 17493/20). - Add Caddy access-log block with 14-day rolling retention to match the retention statement in the privacy policy. - Add concise privacy policy as fine print on /impressum, covering controller, hosting (netcup, EU), server logs, aggregate access stats, external links, data subject rights (Art. 15-18, 21), and supervisory authority contact. - Disable Safari format-detection auto-links and turn off spellcheck on the imprint section so legal references like "§§ 5, 6 DDG" and "Art. 6(1)(f) GDPR" render cleanly. - Update footer label to "Imprint & Privacy". - Add LICENSE (All rights reserved). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent b505411 commit afb2600

9 files changed

Lines changed: 118 additions & 11 deletions

File tree

Caddyfile

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,12 @@ davidbingmann.de {
88
Permissions-Policy "geolocation=(), microphone=(), camera=(), payment=()"
99
-Server
1010
}
11+
log {
12+
output file /var/log/caddy/access.jsonl {
13+
roll_size 10MiB
14+
roll_keep 5
15+
roll_keep_for 336h
16+
}
17+
}
1118
reverse_proxy mywebsite_app:5001
1219
}

LICENSE

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
Copyright (c) 2026 David Bingmann
2+
All rights reserved.
3+
4+
This repository is published for portfolio and reference purposes only.
5+
No license is granted to use, copy, modify, distribute, or create derivative
6+
works from any part of this repository, except where expressly permitted by
7+
applicable law or by the terms of GitHub's platform.
8+
9+
Third-party dependencies referenced in this repository remain subject to
10+
their own respective licenses.

index.html

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,7 @@
44
<meta charset="UTF-8" />
55
<link rel="icon" type="image/x-icon" href="/favicon.ico" />
66
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
7-
<link rel="preconnect" href="https://fonts.googleapis.com" />
8-
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
9-
<link
10-
href="https://fonts.googleapis.com/css2?family=Space+Mono:wght@400;700&display=swap"
11-
rel="stylesheet"
12-
/>
7+
<meta name="format-detection" content="telephone=no, date=no, address=no, email=no" />
138
<title>David Bingmann</title>
149
</head>
1510
<body>

package-lock.json

Lines changed: 10 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
"preview": "vite preview --host 0.0.0.0 --port 5001"
1010
},
1111
"dependencies": {
12+
"@fontsource/space-mono": "^5.0.0",
1213
"react": "^18.2.0",
1314
"react-dom": "^18.2.0",
1415
"react-icons": "^5.2.1",

src/components/Layout.jsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ export default function Layout() {
7777
))}
7878
</div>
7979
<NavLink className="footer-impressum" to="/impressum">
80-
Impressum (c) {currentYear} David Bingmann
80+
Imprint & Privacy (c) {currentYear} David Bingmann
8181
</NavLink>
8282
</footer>
8383
</div>

src/main.jsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import React from 'react';
22
import ReactDOM from 'react-dom/client';
3+
import '@fontsource/space-mono/latin-400.css';
4+
import '@fontsource/space-mono/latin-700.css';
35
import App from './App.jsx';
46
import './styles.css';
57

src/pages/Impressum.jsx

Lines changed: 57 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@ import { useEffect } from 'react';
22

33
export default function Impressum() {
44
useEffect(() => {
5-
document.title = 'Impressum - David Bingmann';
5+
document.title = 'Imprint & Privacy - David Bingmann';
66
}, []);
77

88
return (
99
<section className="section">
10-
<h1 className="section-title">impressum/</h1>
11-
<div className="section-body">
10+
<h1 className="section-title">imprint/</h1>
11+
<div className="section-body" spellCheck={false}>
1212
<p>
1313
<strong>Information according to §§ 5, 6 DDG</strong>
1414
</p>
@@ -66,8 +66,61 @@ export default function Impressum() {
6666
infringement, please let me know so that I can remove the affected
6767
content immediately.
6868
</p>
69+
70+
<div className="legal-fineprint">
71+
<h2 id="privacy">Privacy policy</h2>
72+
<p>
73+
This personal, non-commercial site sets no cookies and uses no
74+
analytics, advertising, social plug-ins, or third-party trackers.
75+
Web fonts are bundled and served from the same domain. The
76+
processing described below is based on Art. 6(1)(f) GDPR
77+
(legitimate interest in operating and securing this website).
78+
</p>
79+
<p>
80+
<strong>Controller.</strong> See the imprint above.
81+
</p>
82+
<p>
83+
<strong>Hosting.</strong> This site is hosted by netcup GmbH,
84+
Daimlerstraße 25, 76185 Karlsruhe, Germany (server located in the
85+
EU). The provider acts as processor under Art. 28 GDPR.
86+
</p>
87+
<p>
88+
<strong>Server log files.</strong> Each HTTP request is recorded
89+
with your IP address, User-Agent, requested URL, response status,
90+
and timestamp. Logs are kept for a maximum of 14 days and then
91+
deleted. They are not merged with other data or used to identify
92+
individual visitors.
93+
</p>
94+
<p>
95+
<strong>Aggregate access statistics.</strong> A daily server-side
96+
report counts requests per day, broken down into humans, AI agents,
97+
and other bots based on the User-Agent. The report contains
98+
aggregate counts only; no profile is created and no data is shared
99+
with third parties.
100+
</p>
101+
<p>
102+
<strong>External links.</strong> Links to LinkedIn, GitHub, X
103+
(Twitter), and email addresses transmit data to the respective
104+
providers once you click them; their privacy policies apply.
105+
</p>
106+
<p>
107+
<strong>Your rights.</strong> Under Art. 15–18 and Art. 21 GDPR you
108+
may request information, correction, erasure or restriction of your
109+
personal data, and object to processing. Contact the email address
110+
in the imprint to exercise these rights.
111+
</p>
112+
<p>
113+
<strong>Complaints.</strong> You may lodge a complaint with the
114+
competent supervisory authority: Der Landesbeauftragte für den
115+
Datenschutz und die Informationsfreiheit Rheinland-Pfalz, Hintere
116+
Bleiche 34, 55116 Mainz —{' '}
117+
<a href="mailto:poststelle@datenschutz.rlp.de">
118+
poststelle@datenschutz.rlp.de
119+
</a>
120+
.
121+
</p>
122+
</div>
69123
</div>
70124
</section>
71125
);
72126
}
73-

src/styles.css

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,35 @@ p {
240240
border-bottom: 1px solid var(--text);
241241
}
242242

243+
.legal-fineprint {
244+
margin-top: 3rem;
245+
padding-top: 1.5rem;
246+
border-top: 1px dashed var(--line);
247+
font-size: 0.78rem;
248+
line-height: 1.6;
249+
color: var(--muted);
250+
}
251+
252+
.legal-fineprint h2 {
253+
margin: 0 0 1rem;
254+
font-size: 0.92rem;
255+
letter-spacing: 0.06em;
256+
text-transform: uppercase;
257+
}
258+
259+
.legal-fineprint p {
260+
margin: 0 0 0.7rem;
261+
}
262+
263+
.legal-fineprint strong {
264+
color: var(--text);
265+
}
266+
267+
.legal-fineprint a {
268+
color: var(--muted);
269+
border-bottom: 1px solid var(--line);
270+
}
271+
243272
.reveal {
244273
opacity: 0;
245274
transform: translateY(14px);

0 commit comments

Comments
 (0)