Rechtstexte auf Englisch (imprint, privacy), App-Sprache folgt Browsersprache, SW-Cache v8

- Sprache: explizite Wahl per Knopf wird gemerkt (langChoice), sonst navigator.languages (de/en, Rest englisch); alter lang-Schlüssel wird ignoriert
- Footer-Links zeigen je nach Sprache auf Impressum/Datenschutz oder Legal notice/Privacy
- Rechtstexte mit Sprachumschalter und hreflang; englische Fassung mit Hinweis, dass die deutsche verbindlich ist
This commit is contained in:
till committed 2026-09-16 12:48:35 +02:00
1 parent b955d857bf
commit a1a58531d8
6 files changed
+286 -2

No files matched your search

+1 -1
View File
@@ -3,7 +3,7 @@ FROM nginx:1.27-alpine
# Static single-page app — no build step. # Static single-page app — no build step.
COPY nginx.conf /etc/nginx/conf.d/default.conf COPY nginx.conf /etc/nginx/conf.d/default.conf
COPY security-headers.conf /etc/nginx/security-headers.conf COPY security-headers.conf /etc/nginx/security-headers.conf
COPY index.html clean.js impressum.html datenschutz.html legal.css icon-mono.svg manifest.webmanifest sw.js icon.svg icon-192.png icon-512.png icon-maskable-512.png apple-touch-icon.png /usr/share/nginx/html/ COPY index.html clean.js impressum.html datenschutz.html imprint.html privacy.html legal.css icon-mono.svg manifest.webmanifest sw.js icon.svg icon-192.png icon-512.png icon-maskable-512.png apple-touch-icon.png /usr/share/nginx/html/
COPY vendor/ /usr/share/nginx/html/vendor/ COPY vendor/ /usr/share/nginx/html/vendor/
EXPOSE 80 EXPOSE 80
+4
View File
@@ -8,6 +8,8 @@
<title>Datenschutzerklärung — clip2md</title> <title>Datenschutzerklärung — clip2md</title>
<link rel="icon" href="/icon.svg" type="image/svg+xml" /> <link rel="icon" href="/icon.svg" type="image/svg+xml" />
<link rel="stylesheet" href="/legal.css" /> <link rel="stylesheet" href="/legal.css" />
<link rel="alternate" hreflang="de" href="https://clip2md.heidrich-digital.de/datenschutz.html" />
<link rel="alternate" hreflang="en" href="https://clip2md.heidrich-digital.de/privacy.html" />
<script> <script>
try { var th = JSON.parse(localStorage.getItem('clip2md:theme')); if (th === 'dark' || (th === null && matchMedia('(prefers-color-scheme: dark)').matches)) document.documentElement.setAttribute('data-theme','dark'); } catch (e) {} try { var th = JSON.parse(localStorage.getItem('clip2md:theme')); if (th === 'dark' || (th === null && matchMedia('(prefers-color-scheme: dark)').matches)) document.documentElement.setAttribute('data-theme','dark'); } catch (e) {}
</script> </script>
@@ -18,6 +20,7 @@
<nav> <nav>
<a href="/impressum.html">Impressum</a> <a href="/impressum.html">Impressum</a>
<a href="/datenschutz.html" aria-current="page">Datenschutz</a> <a href="/datenschutz.html" aria-current="page">Datenschutz</a>
<a class="lang" href="/privacy.html" hreflang="en" lang="en" title="English">EN</a>
</nav> </nav>
</header> </header>
@@ -26,6 +29,7 @@
<h1>Datenschutzerklärung</h1> <h1>Datenschutzerklärung</h1>
<div class="card"> <div class="card">
<p class="intro"> <p class="intro">
Der Text, den Sie auf dieser Seite einfügen, wird ausschließlich in Ihrem Browser Der Text, den Sie auf dieser Seite einfügen, wird ausschließlich in Ihrem Browser
umgewandelt. Er wird nicht übertragen, nicht gespeichert und nicht ausgewertet. Es gibt umgewandelt. Er wird nicht übertragen, nicht gespeichert und nicht ausgewertet. Es gibt
+85
View File
@@ -0,0 +1,85 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
<meta name="robots" content="noindex" />
<meta name="theme-color" content="#EAEAE3" />
<title>Legal notice — clip2md</title>
<link rel="icon" href="/icon.svg" type="image/svg+xml" />
<link rel="stylesheet" href="/legal.css" />
<link rel="alternate" hreflang="de" href="https://clip2md.heidrich-digital.de/impressum.html" />
<link rel="alternate" hreflang="en" href="https://clip2md.heidrich-digital.de/imprint.html" />
<script>
try { var th = JSON.parse(localStorage.getItem('clip2md:theme')); if (th === 'dark' || (th === null && matchMedia('(prefers-color-scheme: dark)').matches)) document.documentElement.setAttribute('data-theme','dark'); } catch (e) {}
</script>
</head>
<body>
<header class="topbar">
<a class="brand" href="/"><svg viewBox="0 0 24 24" aria-hidden="true"><g fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round"><rect x="5" y="4.5" width="14" height="17" rx="1.5"/><path d="M12 9.5v7.5M8.8 13.8 12 17l3.2-3.2"/></g><rect x="8.6" y="2.4" width="6.8" height="3.8" rx="1" fill="currentColor"/></svg><span>clip<span class="two">2</span>md</span></a>
<nav>
<a href="/imprint.html" aria-current="page">Legal notice</a>
<a href="/privacy.html">Privacy</a>
<a class="lang" href="/impressum.html" hreflang="de" lang="de" title="Deutsch">DE</a>
</nav>
</header>
<main class="legal">
<span class="mono-label">Legal</span>
<h1>Legal notice</h1>
<div class="card">
<p class="intro">This is a translation provided for convenience. The German version (<a href="/impressum.html">Impressum</a>) is legally binding.</p>
<h2>Information pursuant to § 5 DDG (German Digital Services Act)</h2>
<table class="legal-table">
<tbody>
<tr><th>Provider</th><td>Till Heidrich – Content Creation</td></tr>
<tr><th>Owner</th><td>Till Heidrich</td></tr>
<tr><th>Address</th><td>Rotdornweg 17<br />21255 Tostedt<br />Germany</td></tr>
<tr><th>Email</th><td><a href="mailto:info@tillheidrich.de">info@tillheidrich.de</a></td></tr>
<tr><th>Phone</th><td><a href="tel:+4915773953819">+49 1577 3953819</a></td></tr>
</tbody>
</table>
<h2>VAT</h2>
<p>
As a small business within the meaning of § 19 (1) of the German VAT Act (UStG), no VAT is
charged and therefore no VAT identification number is held.
</p>
<h2>Responsible for content pursuant to § 18 (2) MStV</h2>
<p>Till Heidrich, address as above.</p>
<h2>Dispute resolution</h2>
<p>
The European Commission provides a platform for online dispute resolution:
<a href="https://ec.europa.eu/consumers/odr/" rel="nofollow noopener">ec.europa.eu/consumers/odr</a>.
We are neither obliged nor willing to take part in dispute resolution proceedings before a
consumer arbitration board.
</p>
<h2>Liability for links</h2>
<p>
This site contains links to external third-party websites whose content we cannot influence.
The respective provider is always responsible for that content. No legal violations were
apparent at the time of linking. Should we become aware of any, we will remove such links
immediately.
</p>
<h2>Copyright and licence</h2>
<p>
The source code of clip2md is released under the MIT licence. The bundled libraries
(Turndown, Marked, DOMPurify, Mozilla Readability; MIT or Apache licence) and the typefaces
Space Grotesk and Space Mono (SIL Open Font License) are subject to their respective free
licences. Texts and design of this site are protected by German copyright law.
</p>
</div>
<div class="legal-foot">
<a href="/">← Back to clip2md</a>
<a href="/privacy.html">Privacy policy</a>
<a href="https://www.paypal.com/ncp/payment/54FPXDFBMP5TJ" target="_blank" rel="noopener nofollow">Donate</a>
</div>
</main>
</body>
</html>
+9
View File
@@ -62,3 +62,12 @@ table.legal-table td { padding: 0.3rem 0; vertical-align: top; overflow-wrap: an
} }
@media (prefers-reduced-motion: reduce) { *, *::before, *::after { transition-duration: .001ms !important; animation-duration: .001ms !important; } } @media (prefers-reduced-motion: reduce) { *, *::before, *::after { transition-duration: .001ms !important; animation-duration: .001ms !important; } }
.card > :first-child { margin-top: 18px; } .card > :first-child { margin-top: 18px; }
.topbar nav a.lang { font-family: var(--mono); font-size: 0.72rem; letter-spacing: .06em; border: 1px solid var(--line); margin-left: 4px; }
.topbar nav a.lang:hover { color: var(--accent); border-color: var(--accent); background: transparent; }
@media (max-width: 560px) {
.topbar { gap: 8px; padding-left: 12px; padding-right: 12px; }
.brand { font-size: 1.05rem; }
.topbar nav { flex-wrap: nowrap; gap: 2px; }
.topbar nav a { padding: 0 8px; font-size: 0.8rem; }
.topbar nav a.lang { padding: 0 7px; margin-left: 2px; }
}
+184
View File
@@ -0,0 +1,184 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
<meta name="robots" content="noindex" />
<meta name="theme-color" content="#EAEAE3" />
<title>Privacy policy — clip2md</title>
<link rel="icon" href="/icon.svg" type="image/svg+xml" />
<link rel="stylesheet" href="/legal.css" />
<link rel="alternate" hreflang="de" href="https://clip2md.heidrich-digital.de/datenschutz.html" />
<link rel="alternate" hreflang="en" href="https://clip2md.heidrich-digital.de/privacy.html" />
<script>
try { var th = JSON.parse(localStorage.getItem('clip2md:theme')); if (th === 'dark' || (th === null && matchMedia('(prefers-color-scheme: dark)').matches)) document.documentElement.setAttribute('data-theme','dark'); } catch (e) {}
</script>
</head>
<body>
<header class="topbar">
<a class="brand" href="/"><svg viewBox="0 0 24 24" aria-hidden="true"><g fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round"><rect x="5" y="4.5" width="14" height="17" rx="1.5"/><path d="M12 9.5v7.5M8.8 13.8 12 17l3.2-3.2"/></g><rect x="8.6" y="2.4" width="6.8" height="3.8" rx="1" fill="currentColor"/></svg><span>clip<span class="two">2</span>md</span></a>
<nav>
<a href="/imprint.html">Legal notice</a>
<a href="/privacy.html" aria-current="page">Privacy</a>
<a class="lang" href="/datenschutz.html" hreflang="de" lang="de" title="Deutsch">DE</a>
</nav>
</header>
<main class="legal">
<span class="mono-label">Legal</span>
<h1>Privacy policy</h1>
<div class="card">
<p class="intro">This is a translation provided for convenience. The German version (<a href="/datenschutz.html">Datenschutzerklärung</a>) is legally binding.</p>
<p>
The text you paste on this site is converted exclusively in your browser. It is not
transmitted, stored or analysed. There are no cookies, no analytics, no embedded third-party
services and no externally loaded fonts. Only the technical access data that arises whenever a
website is requested is collected.
</p>
<h2>1. Controller</h2>
<p>
Till Heidrich – Content Creation<br />
Till Heidrich<br />
Rotdornweg 17, 21255 Tostedt, Germany<br />
Email: <a href="mailto:info@tillheidrich.de">info@tillheidrich.de</a><br />
Phone: <a href="tel:+4915773953819">+49 1577 3953819</a>
</p>
<p>There is no legal requirement to appoint a data protection officer.</p>
<h2>2. Processing of pasted content</h2>
<p>
Converting formatted text into Markdown happens entirely client-side, by JavaScript in your
browser. Content you paste never leaves your device and is discarded when you close or reload
the page. To that extent, we do not process any personal data within the meaning of the GDPR.
</p>
<p>
Saving the result as a <code>.md</code> file and copying it to the clipboard also happen locally
through the corresponding browser interfaces. No data is sent to us.
</p>
<p>
The “Paste” button reads your device's clipboard. This only happens when you press the button
and, depending on the browser, only after you have given permission. As with pasting via the
keyboard, the content is converted locally only. On smartphones, “Save” hands the file to your
operating system's share sheet; where you pass it on from there is up to you.
</p>
<p>
Cleaning up pasted web pages and formatting Reddit threads also run entirely in your browser.
The optional “Open in Obsidian” button places the text on the clipboard and hands it to the
Obsidian app on your device; nothing is transmitted to us or third parties.
</p>
<h2>3. Local storage of your settings</h2>
<p>
So that the site remembers your preferences, it stores values in your browser's local storage
(<span class="mono">localStorage</span>), such as your chosen language, light or dark
appearance and your conversion settings. These values stay on your device, are not transmitted
to us and contain none of the content you paste. They are not cookies. You can delete them at
any time in your browser settings.
</p>
<p>
Only if you switch on “Keep the last 10 clips” in the settings does the site store the most
recently edited texts in your browser's local database (<span class="mono">IndexedDB</span>).
This feature is off by default. The entries never leave your device, are only visible in this
browser and can be deleted individually or all at once in the history; when you switch the
feature off, you are asked whether the history should be deleted.
</p>
<p>
The basis for this purely local storage is your wish for a working user interface; we have no
access to it.
</p>
<h2>4. Offline use (Progressive Web App)</h2>
<p>
The site registers a service worker that stores the required program files in your browser's
cache, so clip2md also works without an internet connection. Only program files of this site
are cached, never your content. You can remove the cache via your browser's site data.
</p>
<h2>5. Server log files</h2>
<p>When this site is requested, the hosting provider automatically stores data in log files:</p>
<ul>
<li>IP address of the requesting device</li>
<li>date and time of access</li>
<li>name and URL of the requested file</li>
<li>amount of data transferred and whether the request succeeded</li>
<li>browser and operating system used</li>
<li>where applicable, the previously visited page (referrer)</li>
</ul>
<p>
The legal basis is Art. 6 (1) (f) GDPR. Our legitimate interest lies in the technically
error-free operation and security of the service. The data is deleted after seven days at the
latest and is not combined with other data sources.
</p>
<h2>6. Hosting</h2>
<p>
This site is operated on servers of Hetzner Online GmbH, Industriestr. 25, 91710 Gunzenhausen,
Germany. A data processing agreement pursuant to Art. 28 GDPR is in place with the provider.
Processing takes place exclusively within the European Union. Data transfer to this site is
encrypted via HTTPS.
</p>
<h2>7. No cookies, no tracking</h2>
<p>
This site sets no cookies and uses no analytics, advertising or audience measurement services.
No content is loaded from third-party servers, in particular no fonts and no scripts from
content delivery networks. A consent banner is therefore not required.
</p>
<p>
One exception concerns the optional preview: if the text you paste contains images hosted on
third-party servers, your browser loads those images from there when the preview is shown. The
respective server learns your IP address in the process. None of your text is transmitted, and
the origin is not sent thanks to <span class="mono">Referrer-Policy: no-referrer</span>. If you
want to avoid this, keep the preview switched off.
</p>
<h2>8. Support via PayPal</h2>
<p>
The site contains a “Donate” or “Buy me a coffee” link. It is a plain link; when you open
clip2md, no content, scripts or cookies are loaded from PayPal and no data is sent to PayPal.
Only when you click the link do you leave this site and reach a PayPal payment page.
</p>
<p>
The provider is PayPal (Europe) S.à r.l. et Cie, S.C.A., 22–24 Boulevard Royal, L-2449
Luxembourg. PayPal itself is responsible for processing on its pages; its privacy statement
applies:
<a href="https://www.paypal.com/de/legalhub/privacy-full" rel="noopener nofollow">paypal.com/de/legalhub/privacy-full</a>.
</p>
<p>
If you pay an amount, PayPal provides us with the details needed to process it, in particular
your name, email address, the amount, date and time, and the transaction number. The legal basis
is Art. 6 (1) (b) GDPR (processing the payment) and Art. 6 (1) (c) GDPR in conjunction with
statutory tax and commercial retention obligations (usually eight to ten years). The data is not
used for any other purpose, such as advertising. The payment is voluntary; nothing is provided
in return.
</p>
<h2>9. Your rights</h2>
<p>
You have the right of access (Art. 15 GDPR), rectification (Art. 16), erasure (Art. 17),
restriction of processing (Art. 18), data portability (Art. 20) and the right to object to
processing based on Art. 6 (1) (f) GDPR (Art. 21). To exercise these rights, please contact the
address above.
</p>
<h2>10. Right to lodge a complaint</h2>
<p>
You may lodge a complaint with a data protection supervisory authority. The competent authority
is the State Commissioner for Data Protection of Lower Saxony (Die Landesbeauftragte für den
Datenschutz Niedersachsen), Prinzenstraße 5, 30159 Hannover, Germany.
</p>
<h2>11. Last updated</h2>
<p>This privacy policy was last updated in September 2026.</p>
</div>
<div class="legal-foot">
<a href="/">← Back to clip2md</a>
<a href="/imprint.html">Legal notice</a>
<a href="https://www.paypal.com/ncp/payment/54FPXDFBMP5TJ" target="_blank" rel="noopener nofollow">Donate</a>
</div>
</main>
</body>
</html>
+3 -1
View File
@@ -2,12 +2,14 @@
Pages (navigations, .html): network first, cache only as offline fallback — Pages (navigations, .html): network first, cache only as offline fallback —
so new or changed pages are never frozen for existing users. so new or changed pages are never frozen for existing users.
Static assets (vendor, fonts, icons): cache first. Bump CACHE on asset changes. */ Static assets (vendor, fonts, icons): cache first. Bump CACHE on asset changes. */
var CACHE = 'clip2md-v7'; var CACHE = 'clip2md-v8';
var ASSETS = [ var ASSETS = [
'/', '/',
'/index.html', '/index.html',
'/impressum.html', '/impressum.html',
'/datenschutz.html', '/datenschutz.html',
'/imprint.html',
'/privacy.html',
'/legal.css', '/legal.css',
'/icon.svg', '/icon.svg',
'/icon-192.png', '/icon-192.png',