Compare commits

..
8 Commits
Author SHA1 Message Date
till 8548f6a3af nginx: Sicherheitsheader greifen jetzt wirklich (add_header wird nicht in location vererbt) 2026-09-15 12:26:08 +02:00
till 3fe8d9c324 Logo als Pfade, Undo-Fix beim Einfuegen, Drop-Schutz, CSP/HSTS, Datenschutz praezisiert 2026-09-15 12:24:59 +02:00
till 2182dd74ae Dockerfile: Rechtstexte und legal.css ins Image kopieren 2026-09-15 12:06:32 +02:00
till 5612de3500 Impressum und Datenschutzerklaerung ergaenzt, Footer-Links, SW-Cache v3 2026-09-15 12:02:58 +02:00
tillandClaude Opus 4.8 197376a584 v2: light editorial redesign, bilingual (EN-first), preview, front matter, PWA
Design (design-taste-frontend + ui-ux-design-pro + impeccable):
- Warm, flat, light editorial theme (OKLCH), Geist + Geist Mono, single vermilion accent
- Dark mode toggle, persisted; respects prefers-color-scheme
- Prominent focus rings, tactile states, reduced-motion

Features (GitHub-ready):
- i18n EN/DE, English default, persisted
- Live split preview (marked + DOMPurify, sanitized)
- Optional YAML front matter (title/date/source/tags), rendered as metadata block
- Conversion options: links as text, strip images, bullet marker, heading style
- Filename patterns (title+date / date+time), auto/custom indicator
- Drag & drop .html/.md/.txt, reading time
- Installable PWA + service worker (offline), README (EN) + MIT LICENSE

Fix: switch inputs were covered by decorative spans (pointer-events).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-11 11:25:42 +00:00
tillandClaude Opus 4.8 f2793a34c3 ux: Redesign-Pass (impeccable)
- Editor als Hero mit Empty-State-Affordance (Paste-Glyph + Key-Hints)
- Dateiname mit auto/eigen-Indikator und Flash bei Auto-Update
- Live-Statusbadge 'HTML->Markdown konvertiert' mit Puls
- Verfeinerte OKLCH-Palette (getoente Neutrals, ein Accent), Type-Hierarchie
- Header-Wordmark + Keyboard-Legende
- Motion (ease-out-quint) mit prefers-reduced-motion, :focus-visible, aria-live Toast
- Responsive (Mobile-Layout), Danger-Flash bei leerem Speichern
- PRODUCT.md + DESIGN.md (HD Design-System dokumentiert)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-11 11:13:42 +00:00
tillandClaude Opus 4.8 d237f7a9d4 chore: ignore local test artifacts (playwright)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-11 05:25:57 +00:00
tillandClaude Opus 4.8 6acb87a189 clip2md: Paste-to-Markdown Tool (Turndown+GFM, Nginx, Coolify-ready)
- Smart Paste: HTML->Markdown, sonst roh; Cmd/Ctrl+Shift+V erzwingt roh
- Auto-Dateiname aus Titel + Datum, editierbar
- Speichern via Button / Cmd+Ctrl+S, Kopieren, Leeren, Zaehler
- Vendored Turndown 7.2.4 + turndown-plugin-gfm 1.0.2 (kein CDN)
- nginx:alpine Dockerfile + Healthcheck

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-11 05:21:40 +00:00
33 changed files with 610 additions and 4464 deletions

No files matched your search

+47 -9
View File
@@ -1,13 +1,51 @@
# clip2md — Design System # clip2md — Design System
Seit September 2026 Teil der **Klarbild-Familie** (Tokens aus `klarbild-oss/src/styles/tokens.css`). Register: **product**. Color strategy: **Restrained** (tinted neutrals + one accent ≤10%).
Theme: **dark**. Scene: Nutzer legt spätabends oder tagsüber am Monitor schnell einen langen
Thread ab; eine ruhige, dunkle, blendfreie Fläche hält den Fokus auf dem Text, nicht auf dem UI.
- **Farbe:** warmes Papier `#EAEAE3`, Karte `#FBFBF7`, Linie `#D7D6CC`, Tinte `#16150F`, ein kräftiges Blau `#1B3BE0` (OKLCH 45% 0.23 267) für Primäraktion, Fokus, Logo. Dunkelmodus: blau getönte Neutrals, Blau aufgehellt. ## Color (OKLCH)
- **Schrift:** Space Grotesk (UI, Überschriften), Space Mono (Editor, Dateiname, Mono-Labels in Versalien mit 0.18em Sperrung). Self-hosted, keine Google-Fonts.
- **Form:** Karten mit 4px Radius, Bedienelemente als Pills (999px). Kein Schatten außer 1px-Hauch und Toast/Sheet.
- **Logo:** Klemmbrett mit Pfeil nach unten (Zwischenablage → Datei) in Blau, Wortmarke „clip**2**md" mit blauer 2. App-Icon: cremefarbenes Klemmbrett auf blauem Quadrat.
- **Mobil:** Touch-Ziele ≥44px, Eingaben 16px (kein iOS-Zoom), `env(safe-area-inset-*)`, Einstellungen als Bottom-Sheet, Aktionsleiste als 5er-Raster mit Icon über Label, Speichern über Teilen-Menü.
- **Motion:** ease-out-quint, 120–240ms, nur Opacity/Transform; `prefers-reduced-motion` respektiert.
## Historie Neutrals sind zur Marken-Hue (kühles Blau-Grau, ~265) getönt — nie reines `#000`/`#fff`.
Vorher: dunkles Theme mit Grün (v1), dann helles Editorial mit Geist und Zinnober/Blau (v2). Beides abgelöst.
| Token | OKLCH | Rolle |
| --- | --- | --- |
| `--bg` | `0.17 0.014 265` | App-Hintergrund (tief) |
| `--surface` | `0.215 0.016 265` | Editor-Fläche |
| `--raised` | `0.255 0.018 265` | Bars, Buttons |
| `--line` | `0.32 0.02 265` | Ruhige Rahmen |
| `--line-strong`| `0.42 0.024 265` | Aktive Rahmen |
| `--text` | `0.95 0.006 265` | Primärtext |
| `--muted` | `0.68 0.012 265` | Sekundärtext, Labels |
| `--faint` | `0.5 0.012 265` | Tertiär, Legende |
| `--accent` | `0.74 0.15 152` | Grün — Primäraktion, Fokus, „konvertiert" |
| `--accent-ink` | `0.22 0.05 152` | Text auf Accent |
| `--danger` | `0.66 0.16 25` | Fehler-Toast, destruktiv |
Accent trägt <10% der Fläche: Save-Button, Fokus-Ring, „konvertiert"-Badge. Sonst Neutrals.
## Typography
- **Sans (UI-Chrome):** Inter / system-ui. Labels, Buttons, Legende.
- **Mono (Daten):** ui-monospace / JetBrains Mono. Editor, Dateiname, Zähler — alles, was „Inhalt" ist.
- Scale mit ≥1.25-Kontrast: 11 (legende) · 12.5 (meta) · 14 (body/editor) · 15 (buttons) · 18 (wordmark).
- Editor-Zeilenhöhe 1.65, `tab-size: 2`, Body-Zeilen bleiben durch die Mono-Fläche natürlich lesbar.
## Elevation & Layout
- Drei Ebenen: `bg` (App) → `surface` (Editor, das Herzstück, bekommt den Raum) → `raised` (Bars/Buttons).
- Keine Cards, keine Schatten außer einem weichen Toast-Drop. Trennung über 1px-Linien und Ton, nicht Boxen.
- Spacing-Rhythmus variiert bewusst: großzügig um den Editor, kompakt in der Toolbar.
- Radius 10–12px, konsistent.
## Motion
- Ease-out-quint (`cubic-bezier(0.22, 1, 0.36, 1)`), 120–240ms. Kein Bounce.
- Nur Opacity/Transform animieren. Toast slidet ein, Button-Press senkt 1px, „konvertiert"-Badge pulst einmal kurz, auto-aktualisierter Dateiname flasht dezent.
- `prefers-reduced-motion`: alle nicht-essenziellen Transitions aus.
## Accessibility
- `:focus-visible` Ring in Accent, überall. Touch-Ziele ≥40px.
- Toasts über `aria-live="polite"`. Editor & Felder korrekt gelabelt.
- Kontrast: Text/`bg` und Accent-Ink/Accent über WCAG AA.
+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 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 index.html impressum.html datenschutz.html legal.css icon-mono.svg manifest.webmanifest sw.js icon.svg /usr/share/nginx/html/
COPY vendor/ /usr/share/nginx/html/vendor/ COPY vendor/ /usr/share/nginx/html/vendor/
EXPOSE 80 EXPOSE 80
+9 -33
View File
@@ -1,15 +1,13 @@
# clip2md — Paste to Markdown # clip2md — Paste to Markdown
Paste a long Reddit thread, an article, or any formatted web content, and save it as clean Paste a long Reddit thread, an article, or any formatted web content, and save it as clean
Markdown in one click. Works on desktop and phone. Runs entirely in your browser: nothing is uploaded, no account, Markdown in a single keystroke. Runs entirely in your browser: nothing is uploaded, no account,
no tracking, works offline. no tracking, works offline.
**Live demo:** https://clip2md.heidrich-digital.de **Live demo:** https://clip2md.heidrich-digital.de
![clip2md](docs/screenshot-light.png) ![clip2md](docs/screenshot-light.png)
<img src="docs/screenshot-mobile.png" alt="clip2md on a phone" width="280">
## Why ## Why
Copying from the web and getting usable Markdown is usually two or three tools and a lot of Copying from the web and getting usable Markdown is usually two or three tools and a lot of
@@ -21,20 +19,8 @@ Obsidian vault, a wiki, or a repo.
## Features ## Features
- **One-click paste.** The *Paste* button reads the clipboard directly (Async Clipboard API) and
picks the HTML version when there is one. Browsers ask once for permission; `⌘V` always works too.
- **Smart paste.** Formatted HTML (copy from a browser, e.g. Reddit `⌘A` → `⌘C`) is converted to - **Smart paste.** Formatted HTML (copy from a browser, e.g. Reddit `⌘A` → `⌘C`) is converted to
clean Markdown. Plain text stays raw. Same `⌘V` for both, no mode switch. clean Markdown. Plain text stays raw. Same `⌘V` for both, no mode switch.
- **Page clean-up.** Pasting a whole web page drops navigation, cookie banners, share buttons and
sidebars; articles are extracted with Mozilla Readability. *Undo clean-up* re-inserts the
unfiltered version with one click.
- **Reddit threads.** New and old Reddit: post title, subreddit and author on top, no vote counts or
Reply/Share leftovers, comments as nested quotes with `(OP)` marked.
- **Open in Obsidian.** Optional button that creates the note straight in your vault (vault and
folder configurable), via the `obsidian://` URI and the clipboard — no file detour.
- **History (opt-in).** Keeps the last 10 clips in this browser's IndexedDB. Off by default.
- **iPhone shortcut.** iOS keeps web apps out of the share sheet; a four-step Shortcut fills the gap
(see [docs/ios-shortcut.md](docs/ios-shortcut.md) or *iPhone shortcut* in the app footer).
- **Force raw.** `⌘/Ctrl+Shift+V` pastes the next clip as plain text, skipping conversion. - **Force raw.** `⌘/Ctrl+Shift+V` pastes the next clip as plain text, skipping conversion.
- **Live preview.** Toggle a side-by-side rendered Markdown view (marked + DOMPurify). - **Live preview.** Toggle a side-by-side rendered Markdown view (marked + DOMPurify).
- **Auto filename.** Derived from the first heading + date, e.g. `2026-08-11-my-thread.md`. - **Auto filename.** Derived from the first heading + date, e.g. `2026-08-11-my-thread.md`.
@@ -43,14 +29,11 @@ Obsidian vault, a wiki, or a repo.
knowledge bases like Obsidian. knowledge bases like Obsidian.
- **Conversion options.** Links as plain text, strip images, bullet marker (`-` / `*` / `+`), - **Conversion options.** Links as plain text, strip images, bullet marker (`-` / `*` / `+`),
heading style (ATX `#` / Setext). heading style (ATX `#` / Setext).
- **Open & drop files.** Pick or drop an `.html`, `.md` or `.txt` file to load or convert it. - **Drag & drop.** Drop an `.html`, `.md` or `.txt` file to load or convert it.
- **Mobile-first.** 44 px touch targets, 16 px inputs (no iOS zoom), safe-area aware, settings as a
bottom sheet; *Save* hands the file to the share sheet (Files, Obsidian, mail) on phones.
- **Bilingual.** English and German, switchable in the header. - **Bilingual.** English and German, switchable in the header.
- **Light & dark.** Warm paper, one strong blue, clipboard logo; dark mode one click away. - **Light & dark.** Warm, flat, editorial light theme by default; dark mode one click away.
- **Save / copy / clear**, word + character count and reading time. - **Save / copy / clear**, word + character count and reading time.
- **Installable PWA**, fully offline after first load. On Android, clip2md shows up in the - **Installable PWA**, fully offline after first load.
system share sheet: share a page or selection straight into the editor.
Everything is **client-side**. No servers, no CDNs, no third-party requests — GDPR-friendly by Everything is **client-side**. No servers, no CDNs, no third-party requests — GDPR-friendly by
construction. construction.
@@ -66,10 +49,9 @@ construction.
## Tech ## Tech
- Single self-contained `index.html` (inline CSS/JS, OKLCH tokens, Space Grotesk + Space Mono). - Single self-contained `index.html` (inline CSS/JS, OKLCH tokens, Geist + Geist Mono).
- Vendored, no CDN: Turndown + GFM plugin, marked, DOMPurify, fonts — all under `vendor/`. - Vendored, no CDN: Turndown + GFM plugin, marked, DOMPurify, fonts — all under `vendor/`.
- Served by `nginx:alpine` (`Dockerfile` + `nginx.conf`) with a service worker for offline use - Served by `nginx:alpine` (`Dockerfile` + `nginx.conf`) with a service worker for offline use.
(network-first for pages, cache-first for static assets).
- No build step, no backend, no database. - No build step, no backend, no database.
## Run locally ## Run locally
@@ -89,22 +71,16 @@ Any static host works — point it at this repo. The reference deployment uses
## Update vendored libraries ## Update vendored libraries
```bash ```bash
npm pack turndown turndown-plugin-gfm marked dompurify @mozilla/readability @fontsource/space-grotesk @fontsource/space-mono npm pack turndown turndown-plugin-gfm marked dompurify geist
# turndown/dist/turndown.js -> vendor/turndown.js # turndown/dist/turndown.js -> vendor/turndown.js
# turndown-plugin-gfm/dist/turndown-plugin-gfm.js -> vendor/turndown-plugin-gfm.js # turndown-plugin-gfm/dist/turndown-plugin-gfm.js -> vendor/turndown-plugin-gfm.js
# marked/lib/marked.umd.js -> vendor/marked.umd.js # marked/lib/marked.umd.js -> vendor/marked.umd.js
# dompurify/dist/purify.min.js -> vendor/purify.min.js # dompurify/dist/purify.min.js -> vendor/purify.min.js
# @mozilla/readability/Readability.js -> vendor/Readability.js # geist/dist/fonts/**/*-Variable.woff2 -> vendor/fonts/
# @fontsource/*/files/*-latin-{400,500,700}-normal.woff2 -> vendor/fonts/
``` ```
Bump the `CACHE` constant in `sw.js` whenever an asset changes so clients pick it up. Bump the `CACHE` constant in `sw.js` whenever an asset changes so clients pick it up.
## Support
clip2md is free. If it saves you time: [buy me a coffee via PayPal](https://www.paypal.com/ncp/payment/54FPXDFBMP5TJ) · Gefällt dir clip2md? [Spendier mir einen Kaffee](https://www.paypal.com/ncp/payment/54FPXDFBMP5TJ).
## License ## License
[MIT](LICENSE). Turndown, marked, DOMPurify, Mozilla Readability, Space Grotesk and Space Mono are under their respective MIT/Apache/OFL licenses. [MIT](LICENSE). Turndown, marked, DOMPurify and Geist are under their respective MIT/OFL licenses.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.0 KiB

-159
View File
@@ -1,159 +0,0 @@
/* clip2md — page clean-up and Reddit formatting. Runs entirely in the browser.
Exposes window.Clip2mdClean = { prepare, postprocess }. */
(function () {
'use strict';
var BUTTON_WORDS = /^(reply|share|report|save|saved|follow|following|subscribe|unsubscribe|join|joined|award|give award|upvote|downvote|vote|like|likes|comment|comments|copy link|copy text|embed|print|tweet|pin it|email|more|more options|show more|show less|read more|see more|continue reading|load more|view more comments|back to top|skip to content|skip to main content|accept|accept all|reject|reject all|allow all|decline|manage cookies|cookie settings|close|dismiss|sign in|log in|sign up|antworten|teilen|melden|speichern|folgen|abonnieren|beitreten|gefällt mir|kommentieren|link kopieren|drucken|mehr|mehr anzeigen|weniger anzeigen|weiterlesen|mehr laden|nach oben|zum inhalt springen|akzeptieren|alle akzeptieren|ablehnen|alle ablehnen|einstellungen|cookie-einstellungen|schließen|anmelden|registrieren)$/i;
var JUNK_ATTR = /(^|[\s_-])(cookie|consent|gdpr|cmp|banner|newsletter|subscribe|share|sharing|social|advert|ad-slot|ads|sponsor|promo|popup|modal|overlay|sidebar|breadcrumb|related|recommend|paywall|toolbar|skip-link|comment-form|site-header|site-footer|masthead)([\s_-]|$)/i;
var JUNK_SELECTORS = 'nav, aside, footer, form, button, input, select, textarea, dialog, iframe, noscript, template, [hidden], [aria-hidden="true"], [role="navigation"], [role="banner"], [role="contentinfo"], [role="dialog"], [role="alertdialog"], [role="complementary"], [role="search"], [role="menu"], [role="menubar"], [role="toolbar"]';
function textLen(el) { return el ? (el.textContent || '').replace(/\s+/g, ' ').trim().length : 0; }
function esc(s) { return String(s).replace(/[&<>"]/g, function (c) { return { '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;' }[c]; }); }
// ---------- Generic page clean-up ----------
function stripJunk(root) {
var total = textLen(root) || 1, removed = 0;
Array.prototype.slice.call(root.querySelectorAll(JUNK_SELECTORS)).forEach(function (el) {
// Never drop the bulk of the content just because it sits in an odd wrapper.
if (el.isConnected && textLen(el) < total * 0.5) { el.remove(); removed++; }
});
Array.prototype.slice.call(root.querySelectorAll('[class], [id]')).forEach(function (el) {
if (!el.isConnected || /^(html|body|main|article)$/i.test(el.tagName)) return;
var sig = (el.getAttribute('class') || '') + ' ' + (el.id || '');
if (JUNK_ATTR.test(sig) && textLen(el) < total * 0.25) { el.remove(); removed++; }
});
Array.prototype.slice.call(root.querySelectorAll('a, span, div, li, p, strong, b')).forEach(function (el) {
if (!el.isConnected) return;
var t = (el.textContent || '').replace(/\s+/g, ' ').trim();
if (t && t.length < 32 && BUTTON_WORDS.test(t) && !el.querySelector('img')) { el.remove(); removed++; }
});
Array.prototype.slice.call(root.querySelectorAll('img')).forEach(function (img) {
var w = parseInt(img.getAttribute('width'), 10), h = parseInt(img.getAttribute('height'), 10);
var alt = (img.getAttribute('alt') || '') + ' ' + (img.getAttribute('src') || '');
if ((w && w <= 48) || (h && h <= 48) || /avatar|icon|logo|emoji|spacer|pixel|tracking/i.test(alt)) { img.remove(); removed++; }
});
return removed;
}
function looksLikePage(doc) {
return !!doc.querySelector('article, main, [role="main"], nav, header, footer') || doc.querySelectorAll('a').length > 25;
}
// ---------- Reddit ----------
function isReddit(doc, html) {
if (doc.querySelector('shreddit-comment, shreddit-post, .thing.comment, .thing.link, [data-testid="comment"]')) return true;
return /reddit\.com\/(r|user)\//i.test(html) && /\b(reply|upvote|antworten)\b/i.test(doc.body ? doc.body.textContent : '');
}
function quote(lines, depth) {
var p = new Array(depth + 1).join('> ');
return lines.map(function (l) { return (p + l).replace(/\s+$/, ''); });
}
function nearest(el, sel) { var p = el.parentElement; return p ? p.closest(sel) : null; }
function redditToMd(doc, toMd, labels) {
var out = [], post, title, author, sub, body, comments = [];
// New Reddit (shreddit web components)
post = doc.querySelector('shreddit-post');
var sc = doc.querySelectorAll('shreddit-comment');
if (post || sc.length) {
title = post && post.getAttribute('post-title');
author = post && post.getAttribute('author');
sub = post && post.getAttribute('subreddit-prefixed-name');
body = post && post.querySelector('[slot="text-body"]');
var top = Array.prototype.filter.call(sc, function (c) { return !nearest(c, 'shreddit-comment'); });
var renderNew = function (c, depth) {
var a = c.getAttribute('author') || '[deleted]';
var bodyEl = Array.prototype.filter.call(c.querySelectorAll('[slot="comment"]'), function (b) { return b.closest('shreddit-comment') === c; })[0];
var lines = ['**u/' + a + '**' + (author && a === author ? ' (OP)' : ''), ''];
lines = lines.concat((bodyEl ? toMd(bodyEl.innerHTML) : '').split('\n'));
var res = quote(lines, depth);
Array.prototype.filter.call(c.querySelectorAll('shreddit-comment'), function (k) { return nearest(k, 'shreddit-comment') === c; })
.forEach(function (k) { res.push(quote([''], depth)[0]); res = res.concat(renderNew(k, depth + 1)); });
return res;
};
top.forEach(function (c) { comments.push(renderNew(c, 1).join('\n')); });
} else {
// Old Reddit
var link = doc.querySelector('.thing.link');
var oc = doc.querySelectorAll('.thing.comment');
if (!link && !oc.length) return null;
if (link) {
var ta = link.querySelector('a.title'); title = ta && ta.textContent.trim();
var au = link.querySelector('.tagline .author'); author = au && au.textContent.trim();
var sr = link.querySelector('.tagline .subreddit'); sub = sr && sr.textContent.trim();
body = link.querySelector('.usertext-body .md');
}
var topOld = Array.prototype.filter.call(oc, function (c) { return !nearest(c, '.thing.comment'); });
var renderOld = function (c, depth) {
var entry = c.querySelector(':scope > .entry') || c;
var au2 = entry.querySelector('.tagline .author'); var a = au2 ? au2.textContent.trim() : '[deleted]';
var md = entry.querySelector('.usertext-body .md');
var lines = ['**u/' + a + '**' + (author && a === author ? ' (OP)' : ''), ''].concat((md ? toMd(md.innerHTML) : '').split('\n'));
var res = quote(lines, depth);
Array.prototype.filter.call(c.querySelectorAll('.thing.comment'), function (k) { return nearest(k, '.thing.comment') === c; })
.forEach(function (k) { res.push(quote([''], depth)[0]); res = res.concat(renderOld(k, depth + 1)); });
return res;
};
topOld.forEach(function (c) { comments.push(renderOld(c, 1).join('\n')); });
}
if (!title) { var h1 = doc.querySelector('h1'); title = h1 && h1.textContent.trim(); }
if (title) out.push('# ' + title, '');
var meta = [sub, author ? 'u/' + author : ''].filter(Boolean).join(' · ');
if (meta) out.push('*' + meta + '*', '');
if (body) { var b = toMd(body.innerHTML); if (b) out.push(b, ''); }
if (comments.length) { out.push('---', '', '## ' + labels.comments + ' (' + comments.length + ')', '', comments.join('\n\n')); }
var res = out.join('\n').replace(/\n{3,}/g, '\n\n').trim();
return res.length > 20 ? res : null;
}
var REDDIT_LINE = /^(reply|share|report|save|follow|award|upvote|downvote|vote|more replies|\d+ more repl(y|ies)|level \d+|op|edited|•|·|u\/[\w-]+ avatar|r\/[\w-]+ icon|\d+(\.\d+)?\s*[kKmM]?|\d+\s*(s|m|h|d|w|mo|y|yr|min|hr)\.?\s*ago|go to comments|sort by:?|best|top|new|controversial|old|q&a|comments|antworten|teilen|melden)$/i;
function postprocess(md, opts) {
var lines = md.split('\n'), out = [], inFence = false;
for (var i = 0; i < lines.length; i++) {
var l = lines[i], t = l.trim();
if (/^(```|~~~)/.test(t)) { inFence = !inFence; out.push(l); continue; }
if (inFence) { out.push(l); continue; }
var bare = t.replace(/^[-*+]\s+/, '').replace(/^\[([^\]]*)\]\([^)]*\)$/, '$1').trim();
if (bare && BUTTON_WORDS.test(bare)) continue;
if (opts.reddit && bare && REDDIT_LINE.test(bare)) continue;
if (/^\[\s*\]\([^)]*\)$/.test(t) || /^[|•·\-–—]+$/.test(t) && !/^-{3,}$/.test(t)) continue;
out.push(l.replace(/\[\s*\]\([^)]*\)/g, ''));
}
return out.join('\n').replace(/\n{3,}/g, '\n\n').trim();
}
/* prepare(html, opts) → { md?, html?, kind, title? }
opts: { cleanup, reddit, toMd(htmlString)→md, labels:{comments} } */
function prepare(html, opts) {
var doc;
try { doc = new DOMParser().parseFromString(html, 'text/html'); } catch (e) { return { html: html, kind: 'plain' }; }
if (!doc || !doc.body) return { html: html, kind: 'plain' };
var reddit = isReddit(doc, html);
if (opts.reddit && reddit) {
try { var rmd = redditToMd(doc, opts.toMd, opts.labels); if (rmd) return { md: rmd, kind: 'reddit', reddit: true }; } catch (e) {}
}
if (!opts.cleanup) return { html: html, kind: 'plain', reddit: reddit };
var before = textLen(doc.body);
if (before > 1200 && typeof window.Readability === 'function' && looksLikePage(doc) && !reddit) {
try {
var art = new window.Readability(doc.cloneNode(true), { charThreshold: 250, keepClasses: false }).parse();
if (art && art.content && (art.textContent || '').trim().length > before * 0.3) {
var content = art.content;
if (art.title && content.indexOf(art.title) < 0) content = '<h1>' + esc(art.title) + '</h1>' + content;
return { html: content, kind: 'article', title: art.title, reddit: reddit };
}
} catch (e) {}
}
var n = stripJunk(doc.body);
return { html: doc.body.innerHTML, kind: n ? 'cleaned' : 'plain', reddit: reddit };
}
window.Clip2mdClean = { prepare: prepare, postprocess: postprocess };
})();
+16 -66
View File
@@ -2,33 +2,29 @@
<html lang="de"> <html lang="de">
<head> <head>
<meta charset="UTF-8" /> <meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="robots" content="noindex" /> <meta name="robots" content="noindex" />
<meta name="theme-color" content="#EAEAE3" /> <meta name="theme-color" content="#faf7f2" />
<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 t = JSON.parse(localStorage.getItem('clip2md:theme')); if (t === 'dark') document.documentElement.setAttribute('data-theme','dark'); } catch (e) {}
</script> </script>
</head> </head>
<body> <body>
<header class="topbar"> <header class="legal-head">
<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> <div class="inner">
<a class="back" href="/"><span class="wordmark">clip<b>2</b>md</span></a>
<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>
</div>
</header> </header>
<main class="legal"> <main class="legal">
<span class="mono-label">Rechtliches</span>
<h1>Datenschutzerklärung</h1> <h1>Datenschutzerklärung</h1>
<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
@@ -61,19 +57,6 @@
Zwischenablage erfolgen ebenfalls lokal über die entsprechenden Browser-Schnittstellen. Zwischenablage erfolgen ebenfalls lokal über die entsprechenden Browser-Schnittstellen.
Auch dabei werden keine Daten an uns übermittelt. Auch dabei werden keine Daten an uns übermittelt.
</p> </p>
<p>
Über die Schaltfläche „Einfügen" liest die Seite die Zwischenablage Ihres Geräts aus. Das
geschieht nur, wenn Sie die Schaltfläche betätigen, und je nach Browser erst nach Ihrer
Zustimmung. Der Inhalt wird wie beim Einfügen per Tastatur ausschließlich lokal umgewandelt.
Auf Smartphones übergibt „Speichern" die Datei an das Teilen-Menü Ihres Betriebssystems; wohin
Sie sie von dort weitergeben, entscheiden Sie selbst.
</p>
<p>
Das Aufräumen eingefügter Webseiten und die Aufbereitung von Reddit-Threads laufen ebenfalls
vollständig in Ihrem Browser. Der optionale Knopf „In Obsidian öffnen" legt den Text in die
Zwischenablage und übergibt ihn an die Obsidian-App auf Ihrem Gerät; an uns oder Dritte wird
dabei nichts übertragen.
</p>
<h2>3. Lokale Speicherung Ihrer Einstellungen</h2> <h2>3. Lokale Speicherung Ihrer Einstellungen</h2>
<p> <p>
@@ -84,13 +67,6 @@
eingefügten Inhalte. Es handelt sich nicht um Cookies. Sie können die Werte jederzeit über eingefügten Inhalte. Es handelt sich nicht um Cookies. Sie können die Werte jederzeit über
die Einstellungen Ihres Browsers löschen. die Einstellungen Ihres Browsers löschen.
</p> </p>
<p>
Nur wenn Sie in den Einstellungen „Letzte 10 Clips behalten" einschalten, speichert die Seite
die zuletzt bearbeiteten Texte in der lokalen Datenbank Ihres Browsers (<span class="mono">IndexedDB</span>).
Die Funktion ist standardmäßig ausgeschaltet. Die Einträge verlassen Ihr Gerät nicht, sind nur in
diesem Browser sichtbar und lassen sich im Verlauf einzeln oder vollständig löschen; beim
Ausschalten werden Sie gefragt, ob der Verlauf gelöscht werden soll.
</p>
<p> <p>
Rechtsgrundlage für diese ausschließlich lokale Speicherung ist Ihr Wunsch nach einer Rechtsgrundlage für diese ausschließlich lokale Speicherung ist Ihr Wunsch nach einer
funktionsfähigen Bedienoberfläche; ein Zugriff unsererseits findet nicht statt. funktionsfähigen Bedienoberfläche; ein Zugriff unsererseits findet nicht statt.
@@ -141,7 +117,7 @@
Einwilligungsabfrage ist deshalb nicht erforderlich. Einwilligungsabfrage ist deshalb nicht erforderlich.
</p> </p>
<p> <p>
Eine Ausnahme betrifft die optionale Vorschau: Enthält der von Ihnen eingefügte Text Eine Ausnahme betrifft die optionale Vorschau: Enthält der von Ihnen eingefuegte Text
Bilder, die auf fremde Server verweisen, lädt Ihr Browser diese Bilder beim Anzeigen der Bilder, die auf fremde Server verweisen, lädt Ihr Browser diese Bilder beim Anzeigen der
Vorschau von dort. Dabei erfährt der jeweilige fremde Server Ihre IP-Adresse. Übertragen Vorschau von dort. Dabei erfährt der jeweilige fremde Server Ihre IP-Adresse. Übertragen
wird dabei nichts von Ihrem Text; die Herkunft wird durch die Einstellung wird dabei nichts von Ihrem Text; die Herkunft wird durch die Einstellung
@@ -149,30 +125,7 @@
vermeiden möchten, lassen Sie die Vorschau ausgeschaltet. vermeiden möchten, lassen Sie die Vorschau ausgeschaltet.
</p> </p>
<h2>8. Unterstützung über PayPal</h2> <h2>8. Ihre Rechte</h2>
<p>
Auf der Seite finden Sie einen Link „Spenden" bzw. „Spendier mir einen Kaffee". Es handelt sich
um einen einfachen Link; beim Aufruf von clip2md werden keine Inhalte, Skripte oder Cookies von
PayPal geladen und keine Daten an PayPal übertragen. Erst wenn Sie den Link anklicken, verlassen
Sie diese Seite und gelangen zu einer Zahlungsseite von PayPal.
</p>
<p>
Anbieter ist die PayPal (Europe) S.à r.l. et Cie, S.C.A., 22–24 Boulevard Royal, L-2449
Luxemburg. Für die Verarbeitung auf den Seiten von PayPal ist PayPal selbst verantwortlich; es
gilt dessen Datenschutzerklärung:
<a href="https://www.paypal.com/de/legalhub/privacy-full" rel="noopener nofollow">paypal.com/de/legalhub/privacy-full</a>.
</p>
<p>
Wenn Sie einen Betrag zahlen, erhalten wir von PayPal die zur Abwicklung nötigen Angaben,
insbesondere Ihren Namen, Ihre E-Mail-Adresse, den Betrag, Datum und Uhrzeit sowie die
Transaktionsnummer. Rechtsgrundlage ist Art. 6 Abs. 1 lit. b DSGVO (Abwicklung der Zahlung)
sowie Art. 6 Abs. 1 lit. c DSGVO in Verbindung mit den steuer- und handelsrechtlichen
Aufbewahrungspflichten (in der Regel acht bis zehn Jahre). Eine weitere Nutzung, etwa für
Werbung, findet nicht statt. Die Zahlung ist freiwillig; eine Gegenleistung ist damit nicht
verbunden.
</p>
<h2>9. Ihre Rechte</h2>
<p> <p>
Sie haben das Recht auf Auskunft (Art. 15 DSGVO), Berichtigung (Art. 16), Löschung Sie haben das Recht auf Auskunft (Art. 15 DSGVO), Berichtigung (Art. 16), Löschung
(Art. 17), Einschränkung der Verarbeitung (Art. 18), Datenübertragbarkeit (Art. 20) sowie (Art. 17), Einschränkung der Verarbeitung (Art. 18), Datenübertragbarkeit (Art. 20) sowie
@@ -180,20 +133,17 @@
(Art. 21). Wenden Sie sich dafür an die oben genannte Adresse. (Art. 21). Wenden Sie sich dafür an die oben genannte Adresse.
</p> </p>
<h2>10. Beschwerderecht</h2> <h2>9. Beschwerderecht</h2>
<p> <p>
Sie können sich bei einer Datenschutz-Aufsichtsbehörde beschweren. Zuständig ist die Sie können sich bei einer Datenschutz-Aufsichtsbehörde beschweren. Zuständig ist die
Landesbeauftragte für den Datenschutz Niedersachsen, Prinzenstraße 5, 30159 Hannover. Landesbeauftragte für den Datenschutz Niedersachsen, Prinzenstraße 5, 30159 Hannover.
</p> </p>
<h2>11. Stand</h2> <h2>10. Stand</h2>
<p>Diese Datenschutzerklärung hat den Stand September 2026.</p> <p>Diese Datenschutzerklärung hat den Stand September 2026.</p>
</div>
<div class="legal-foot"> <div class="legal-foot">
<a href="/">← Zurück zu clip2md</a> <a href="/">Zurück zum Werkzeug</a> · <a href="impressum.html">Impressum</a>
<a href="/impressum.html">Impressum</a>
<a href="https://www.paypal.com/ncp/payment/54FPXDFBMP5TJ" target="_blank" rel="noopener nofollow">Spenden</a>
</div> </div>
</main> </main>
</body> </body>
-25
View File
@@ -1,25 +0,0 @@
# iPhone shortcut for clip2md
iOS does not let web apps into the share sheet. This Shortcut copies the current Safari page and opens clip2md.
1. Open **Shortcuts**, tap **+**, name it **clip2md**.
2. Tap **ⓘ**, enable **Show in Share Sheet**, allow **Safari web pages**, **Rich text**, **Text**.
3. Add **Get Details of Safari Web Page** → **Page Contents** (input: Shortcut Input).
4. Add **Copy to Clipboard**.
5. Add **Open URLs** → `https://clip2md.heidrich-digital.de/?from=ios` (use your own domain when self-hosting).
In Safari: Share → **clip2md** → tap **Paste**. iOS asks once whether clip2md may paste.
For a selection only, no Shortcut is needed: copy it and use the Paste button.
---
## Deutsch
1. App **Kurzbefehle** öffnen, **+** tippen, Name **clip2md**.
2. **ⓘ** tippen, **Im Share-Sheet anzeigen** einschalten, **Safari-Webseiten**, **Rich Text**, **Text** zulassen.
3. Aktion **Details von Safari-Webseite abrufen** → **Seiteninhalt**.
4. Aktion **In Zwischenablage kopieren**.
5. Aktion **URLs öffnen** → `https://clip2md.heidrich-digital.de/?from=ios`
In Safari: Teilen → **clip2md** → **Einfügen** tippen.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 227 KiB

After

Width:  |  Height:  |  Size: 101 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 193 KiB

BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.6 KiB

BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

+5 -5
View File
@@ -1,7 +1,7 @@
<svg xmlns="http://www.w3.org/2000/svg" width="512" height="512" viewBox="0 0 512 512" role="img" aria-label="clip2md" xmlns:c2pa="http://c2pa.org/manifest"><metadata><c2pa:manifest>AAAWgmp1bWIAAAAeanVtZGMycGEAEQAQgAAAqgA4m3EDYzJwYQAAABZcanVtYgAAAEdqdW1kYzJtYQARABCAAACqADibcQN1cm46YzJwYTo5NjkzMWJiNy1jYTg3LTRjNWEtOGE4Ni0yNjQxYzJjODg3Y2IAAAADl2p1bWIAAAApanVtZGMyYXMAEQAQgAAAqgA4m3EDYzJwYS5hc3NlcnRpb25zAAAAALxqdW1iAAAARGp1bWRjYm9yABEAEIAAAKoAOJtxE2MycGEuaW5ncmVkaWVudC52MwAAAAAYYzJzaEd1ybodD3L6bmfkOq9bA40AAABwY2JvcqNpZGM6Zm9ybWF0bWltYWdlL3N2Zyt4bWxqaW5zdGFuY2VJRHgseG1wOmlpZDpiYmUwY2ZjNi00NGNhLTRkMWItYjRiNi04MmRjY2U1ZWQyYzJscmVsYXRpb25zaGlwaHBhcmVudE9mAAAB4mp1bWIAAABBanVtZGNib3IAEQAQgAAAqgA4m3ETYzJwYS5hY3Rpb25zLnYyAAAAABhjMnNoD8B6kTZGbHgLyzg08rdPaAAAAZljYm9yomdhY3Rpb25zgqJmYWN0aW9ua2MycGEub3BlbmVkanBhcmFtZXRlcnOha2luZ3JlZGllbnRzgaJjdXJseC1zZWxmI2p1bWJmPWMycGEuYXNzZXJ0aW9ucy9jMnBhLmluZ3JlZGllbnQudjNkaGFzaFggefl5EZp24D6m6pO00dQE2grxyV6xfE4gO+musKFljSakZmFjdGlvbngdY29tLmFudGhyb3BpYy5jbGF1ZGUucHJvdmlkZWRqcGFyYW1ldGVyc6F4H2NvbS5hbnRocm9waWMub3JpZ2luLWNvbmZpZGVuY2VndW5rbm93bmtkZXNjcmlwdGlvbnhmQ2xhdWRlIHByb3ZpZGVkIHRoaXMgZmlsZSBhdCB0aGUgcmVxdWVzdCBvZiBhIHVzZXIgYW5kIG1heSBoYXZlIGNyZWF0ZWQgb3IgbW9kaWZpZWQgdGhlIGZpbGUgY29udGVudHMubXNvZnR3YXJlQWdlbnShZG5hbWVmQ2xhdWRlcmFsbEFjdGlvbnNJbmNsdWRlZPUAAADIanVtYgAAAEBqdW1kY2JvcgARABCAAACqADibcRNjMnBhLmhhc2guZGF0YQAAAAAYYzJzaJenzbrkdVtDScW6NB1RE6oAAACAY2JvcqVjYWxnZnNoYTI1NmNwYWRNAAAAAAAAAAAAAAAAAGRoYXNoWCD6NBeqJ7Ht0mHPVl42j6FWIZFbAbXQRXPffHTHE/OE8GRuYW1lbmp1bWJmIG1hbmlmZXN0amV4Y2x1c2lvbnOBomVzdGFydBi2Zmxlbmd0aBkeBAAAAj5qdW1iAAAAJ2p1bWRjMmNsABEAEIAAAKoAOJtxA2MycGEuY2xhaW0udjIAAAACD2Nib3KlY2FsZ2ZzaGEyNTZpc2lnbmF0dXJleE1zZWxmI2p1bWJmPS9jMnBhL3VybjpjMnBhOjk2OTMxYmI3LWNhODctNGM1YS04YTg2LTI2NDFjMmM4ODdjYi9jMnBhLnNpZ25hdHVyZWppbnN0YW5jZUlEeCx4bXA6aWlkOjgyMDQyNDg5LWEwZmQtNDFkMS1iNzJiLWNiN2I3ODQ5ZGM3ZHJjcmVhdGVkX2Fzc2VydGlvbnODomN1cmx4LXNlbGYjanVtYmY9YzJwYS5hc3NlcnRpb25zL2MycGEuaW5ncmVkaWVudC52M2RoYXNoWCB5+XkRmnbgPqbqk7TR1ATaCvHJXrF8TiA76a6woWWNJqJjdXJseCpzZWxmI2p1bWJmPWMycGEuYXNzZXJ0aW9ucy9jMnBhLmFjdGlvbnMudjJkaGFzaFggaNNTgOw83IrurlIppyF4vuc6nRxPx9W196cCasAjeCSiY3VybHgpc2VsZiNqdW1iZj1jMnBhLmFzc2VydGlvbnMvYzJwYS5oYXNoLmRhdGFkaGFzaFggjA55f0u5dgptrQQn9+ArLOZjPV71ZLqDOc0AfCcWtx50Y2xhaW1fZ2VuZXJhdG9yX2luZm+jZG5hbWVvQW50aHJvcGljIEZpbGVzZ3ZlcnNpb25lMS4wLjBrc3BlY1ZlcnNpb25lMi40LjAAABA4anVtYgAAAChqdW1kYzJjcwARABCAAACqADibcQNjMnBhLnNpZ25hdHVyZQAAABAIY2JvctKEWQISogEmGCFZAgowggIGMIIBjaADAgECAhRA5aAK7sI50L64g/oGQgU9Z1UTADAKBggqhkjOPQQDAzBJMRcwFQYDVQQKEw5BbnRocm9waWMsIFBCQzEuMCwGA1UEAxMlQW50aHJvcGljIENvbnRlbnQgQ3JlZGVudGlhbHMgUm9vdCBDQTAeFw0yNjA4MDcxODQzNTZaFw0yODA4MDYxOTQzNTZaMEQxFzAVBgNVBAoTDkFudGhyb3BpYywgUEJDMSkwJwYDVQQDEyBBbnRocm9waWMgQ2xhdWRlIENvbnRlbnQgU2lnbmluZzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABJh6CmvLUBgFFNU0vUKlOVtE6djd17L5SuwX0LemFisBM3dkd/3cyjxFA3Qo5S46fX0/ihY0VZ7mfb9KF703t5OjWDBWMA4GA1UdDwEB/wQEAwIHgDAVBgNVHSUEDjAMBgorBgEEAYPoXgIBMAwGA1UdEwEB/wQCMAAwHwYDVR0jBBgwFoAUzlHiBIFOZFsj+OPEz5o+nMHXXMIwCgYIKoZIzj0EAwMDZwAwZAIwMXMdFJ4BetLLVY7ORuE9noqbbAZOZn/aArXyTwFAZfKrPzxF2vPoJNf1+UCdg1XGAjBwX1zd9WGqYkqmL5SFqw1QySjr1zJfpJM9+1rdDwSPLMOPOjKuiXjoU/pUUeG9RwmhY3BhZFkNngAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALine truncated <svg xmlns="http://www.w3.org/2000/svg" width="512" height="512" viewBox="0 0 512 512" role="img" aria-label="clip2md">
<g fill="none" stroke="#000" stroke-width="30" stroke-linecap="round" stroke-linejoin="round"> <g fill="none" stroke="currentColor" stroke-width="44" stroke-linecap="round" stroke-linejoin="round">
<rect x="146" y="124" width="220" height="284" rx="22"/> <path d="M118 352V166l86 94 86-94v186"/>
<path d="M256 214v124M204 288l52 52 52-52"/> <path d="M384 166v140"/>
<path d="M338 268l46 52 46-52"/>
</g> </g>
<rect x="198" y="92" width="116" height="64" rx="16" fill="#000"/>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 8.0 KiB

After

Width:  |  Height:  |  Size: 350 B

+6 -6
View File
@@ -1,8 +1,8 @@
<svg xmlns="http://www.w3.org/2000/svg" width="512" height="512" viewBox="0 0 512 512" role="img" aria-label="clip2md" xmlns:c2pa="http://c2pa.org/manifest"><metadata><c2pa:manifest>AAAWgmp1bWIAAAAeanVtZGMycGEAEQAQgAAAqgA4m3EDYzJwYQAAABZcanVtYgAAAEdqdW1kYzJtYQARABCAAACqADibcQN1cm46YzJwYTo3NjZmY2E1NS0xNWZhLTRjMjktOWMwMi0yZWQ2YTRlMTE5N2IAAAADl2p1bWIAAAApanVtZGMyYXMAEQAQgAAAqgA4m3EDYzJwYS5hc3NlcnRpb25zAAAAALxqdW1iAAAARGp1bWRjYm9yABEAEIAAAKoAOJtxE2MycGEuaW5ncmVkaWVudC52MwAAAAAYYzJzaIxdjdUDEhE5YIY3eHT5SCoAAABwY2JvcqNpZGM6Zm9ybWF0bWltYWdlL3N2Zyt4bWxqaW5zdGFuY2VJRHgseG1wOmlpZDo1NGNhN2NlYy0wYWE0LTQ5YzMtOGI5Ny00YzUxNDdlMmJjNjJscmVsYXRpb25zaGlwaHBhcmVudE9mAAAB4mp1bWIAAABBanVtZGNib3IAEQAQgAAAqgA4m3ETYzJwYS5hY3Rpb25zLnYyAAAAABhjMnNo9xq2bExTiscFiT0oWzKpFgAAAZljYm9yomdhY3Rpb25zgqJmYWN0aW9ua2MycGEub3BlbmVkanBhcmFtZXRlcnOha2luZ3JlZGllbnRzgaJjdXJseC1zZWxmI2p1bWJmPWMycGEuYXNzZXJ0aW9ucy9jMnBhLmluZ3JlZGllbnQudjNkaGFzaFggsVAEfTnGrUgMMt4oWhSoE9/0KzYLZORmwRH2LXb/+VKkZmFjdGlvbngdY29tLmFudGhyb3BpYy5jbGF1ZGUucHJvdmlkZWRqcGFyYW1ldGVyc6F4H2NvbS5hbnRocm9waWMub3JpZ2luLWNvbmZpZGVuY2VndW5rbm93bmtkZXNjcmlwdGlvbnhmQ2xhdWRlIHByb3ZpZGVkIHRoaXMgZmlsZSBhdCB0aGUgcmVxdWVzdCBvZiBhIHVzZXIgYW5kIG1heSBoYXZlIGNyZWF0ZWQgb3IgbW9kaWZpZWQgdGhlIGZpbGUgY29udGVudHMubXNvZnR3YXJlQWdlbnShZG5hbWVmQ2xhdWRlcmFsbEFjdGlvbnNJbmNsdWRlZPUAAADIanVtYgAAAEBqdW1kY2JvcgARABCAAACqADibcRNjMnBhLmhhc2guZGF0YQAAAAAYYzJzaIs0FFpWK28j1nfpDaf+6ewAAACAY2JvcqVjYWxnZnNoYTI1NmNwYWRNAAAAAAAAAAAAAAAAAGRoYXNoWCC9PsI0VhKdqWl+KMmXDr0D88GymzjDSxOZnAykNujo+mRuYW1lbmp1bWJmIG1hbmlmZXN0amV4Y2x1c2lvbnOBomVzdGFydBi2Zmxlbmd0aBkeBAAAAj5qdW1iAAAAJ2p1bWRjMmNsABEAEIAAAKoAOJtxA2MycGEuY2xhaW0udjIAAAACD2Nib3KlY2FsZ2ZzaGEyNTZpc2lnbmF0dXJleE1zZWxmI2p1bWJmPS9jMnBhL3VybjpjMnBhOjc2NmZjYTU1LTE1ZmEtNGMyOS05YzAyLTJlZDZhNGUxMTk3Yi9jMnBhLnNpZ25hdHVyZWppbnN0YW5jZUlEeCx4bXA6aWlkOjMyYTlhZWM1LWI3NjgtNDM1Zi1hYmQwLWI3YWI0ZjM1ZDliMXJjcmVhdGVkX2Fzc2VydGlvbnODomN1cmx4LXNlbGYjanVtYmY9YzJwYS5hc3NlcnRpb25zL2MycGEuaW5ncmVkaWVudC52M2RoYXNoWCCxUAR9OcatSAwy3ihaFKgT3/QrNgtk5GbBEfYtdv/5UqJjdXJseCpzZWxmI2p1bWJmPWMycGEuYXNzZXJ0aW9ucy9jMnBhLmFjdGlvbnMudjJkaGFzaFggC2jWKBQAXG2Nl28/mppC+AVk5pvIfJUH9IZaGTTCDMaiY3VybHgpc2VsZiNqdW1iZj1jMnBhLmFzc2VydGlvbnMvYzJwYS5oYXNoLmRhdGFkaGFzaFgglSQJIGyHAJjeNhWxWBLoo/KtOZ1TONf6O1V9ENt4vf10Y2xhaW1fZ2VuZXJhdG9yX2luZm+jZG5hbWVvQW50aHJvcGljIEZpbGVzZ3ZlcnNpb25lMS4wLjBrc3BlY1ZlcnNpb25lMi40LjAAABA4anVtYgAAAChqdW1kYzJjcwARABCAAACqADibcQNjMnBhLnNpZ25hdHVyZQAAABAIY2JvctKEWQISogEmGCFZAgowggIGMIIBjaADAgECAhRA5aAK7sI50L64g/oGQgU9Z1UTADAKBggqhkjOPQQDAzBJMRcwFQYDVQQKEw5BbnRocm9waWMsIFBCQzEuMCwGA1UEAxMlQW50aHJvcGljIENvbnRlbnQgQ3JlZGVudGlhbHMgUm9vdCBDQTAeFw0yNjA4MDcxODQzNTZaFw0yODA4MDYxOTQzNTZaMEQxFzAVBgNVBAoTDkFudGhyb3BpYywgUEJDMSkwJwYDVQQDEyBBbnRocm9waWMgQ2xhdWRlIENvbnRlbnQgU2lnbmluZzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABJh6CmvLUBgFFNU0vUKlOVtE6djd17L5SuwX0LemFisBM3dkd/3cyjxFA3Qo5S46fX0/ihY0VZ7mfb9KF703t5OjWDBWMA4GA1UdDwEB/wQEAwIHgDAVBgNVHSUEDjAMBgorBgEEAYPoXgIBMAwGA1UdEwEB/wQCMAAwHwYDVR0jBBgwFoAUzlHiBIFOZFsj+OPEz5o+nMHXXMIwCgYIKoZIzj0EAwMDZwAwZAIwMXMdFJ4BetLLVY7ORuE9noqbbAZOZn/aArXyTwFAZfKrPzxF2vPoJNf1+UCdg1XGAjBwX1zd9WGqYkqmL5SFqw1QySjr1zJfpJM9+1rdDwSPLMOPOjKuiXjoU/pUUeG9RwmhY3BhZFkNngAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALine truncated <svg xmlns="http://www.w3.org/2000/svg" width="512" height="512" viewBox="0 0 512 512" role="img" aria-label="clip2md">
<rect width="512" height="512" rx="104" fill="#1B3BE0"/> <rect width="512" height="512" rx="112" fill="#c14a2b"/>
<g fill="none" stroke="#FBFBF7" stroke-width="30" stroke-linecap="round" stroke-linejoin="round"> <g fill="none" stroke="#fdf6f1" stroke-width="44" stroke-linecap="round" stroke-linejoin="round">
<rect x="146" y="124" width="220" height="284" rx="22"/> <path d="M118 352V166l86 94 86-94v186"/>
<path d="M256 214v124M204 288l52 52 52-52"/> <path d="M384 166v140"/>
<path d="M338 268l46 52 46-52"/>
</g> </g>
<rect x="198" y="92" width="116" height="64" rx="16" fill="#FBFBF7"/>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 8.1 KiB

After

Width:  |  Height:  |  Size: 404 B

+14 -21
View File
@@ -2,33 +2,29 @@
<html lang="de"> <html lang="de">
<head> <head>
<meta charset="UTF-8" /> <meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="robots" content="noindex" /> <meta name="robots" content="noindex" />
<meta name="theme-color" content="#EAEAE3" /> <meta name="theme-color" content="#faf7f2" />
<title>Impressum — clip2md</title> <title>Impressum — 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/impressum.html" />
<link rel="alternate" hreflang="en" href="https://clip2md.heidrich-digital.de/imprint.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 t = JSON.parse(localStorage.getItem('clip2md:theme')); if (t === 'dark') document.documentElement.setAttribute('data-theme','dark'); } catch (e) {}
</script> </script>
</head> </head>
<body> <body>
<header class="topbar"> <header class="legal-head">
<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> <div class="inner">
<a class="back" href="/"><span class="wordmark">clip<b>2</b>md</span></a>
<nav> <nav>
<a href="/impressum.html" aria-current="page">Impressum</a> <a href="impressum.html" aria-current="page">Impressum</a>
<a href="/datenschutz.html">Datenschutz</a> <a href="datenschutz.html">Datenschutz</a>
<a class="lang" href="/imprint.html" hreflang="en" lang="en" title="English">EN</a>
</nav> </nav>
</div>
</header> </header>
<main class="legal"> <main class="legal">
<span class="mono-label">Rechtliches</span>
<h1>Impressum</h1> <h1>Impressum</h1>
<div class="card">
<h2>Angaben gemäß § 5 DDG</h2> <h2>Angaben gemäß § 5 DDG</h2>
<table class="legal-table"> <table class="legal-table">
@@ -69,15 +65,12 @@
<h2>Urheberrecht und Lizenz</h2> <h2>Urheberrecht und Lizenz</h2>
<p> <p>
Der Quellcode von clip2md steht unter der MIT-Lizenz. Die eingebundenen Bibliotheken Der Quellcode von clip2md steht unter der MIT-Lizenz. Die eingebundenen Bibliotheken
(Turndown, Marked, DOMPurify, Mozilla Readability; MIT- bzw. Apache-Lizenz) und die Schriftfamilien Space Grotesk und Space Mono stehen unter ihren jeweiligen (Turndown, Marked, DOMPurify) und die Schriftfamilie Geist stehen unter ihren jeweiligen
freien Lizenzen (Schriften: SIL Open Font License). Texte und Gestaltung dieser Seite unterliegen dem deutschen Urheberrecht. freien Lizenzen. Texte und Gestaltung dieser Seite unterliegen dem deutschen Urheberrecht.
</p> </p>
</div>
<div class="legal-foot"> <div class="legal-foot">
<a href="/">← Zurück zu clip2md</a> <a href="/">Zurück zum Werkzeug</a> · <a href="datenschutz.html">Datenschutzerklärung</a>
<a href="/datenschutz.html">Datenschutzerklärung</a>
<a href="https://www.paypal.com/ncp/payment/54FPXDFBMP5TJ" target="_blank" rel="noopener nofollow">Spenden</a>
</div> </div>
</main> </main>
</body> </body>
-85
View File
@@ -1,85 +0,0 @@
<!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>
+427 -728
View File
File diff suppressed because it is too large. Load diff
+55 -62
View File
@@ -1,73 +1,66 @@
@font-face { font-family: "Space Grotesk"; src: url("/vendor/fonts/space-grotesk-latin-400-normal.woff2") format("woff2"); font-weight: 400; font-display: swap; } @font-face { font-family: "Geist"; src: url("vendor/fonts/Geist-Variable.woff2") format("woff2"); font-weight: 100 900; font-style: normal; font-display: swap; }
@font-face { font-family: "Space Grotesk"; src: url("/vendor/fonts/space-grotesk-latin-700-normal.woff2") format("woff2"); font-weight: 700; font-display: swap; } @font-face { font-family: "Geist Mono"; src: url("vendor/fonts/GeistMono-Variable.woff2") format("woff2"); font-weight: 100 900; font-style: normal; font-display: swap; }
@font-face { font-family: "Space Mono"; src: url("/vendor/fonts/space-mono-latin-400-normal.woff2") format("woff2"); font-weight: 400; font-display: swap; }
:root { :root {
--paper: oklch(92.8% 0.005 95); --card: oklch(98.4% 0.004 95); --tint: oklch(95.6% 0.005 95); --paper: oklch(98.4% 0.006 80);
--line: oklch(86.8% 0.007 95); --mark: oklch(70% 0.006 95); --surface: oklch(99.6% 0.003 80);
--ink: oklch(21% 0.01 95); --ink-soft: oklch(49% 0.008 95); --line: oklch(89% 0.008 75);
--accent: oklch(45% 0.23 267); --accent-2: oklch(38% 0.21 267); --accent-bg: oklch(45% 0.23 267 / 0.07); --on-accent: #fff; --ink: oklch(26% 0.02 55);
--radius: 4px; --shadow: 0 1px 2px oklch(21% 0.01 95 / 0.05); --ink-2: oklch(44% 0.018 55);
--sans: "Space Grotesk", system-ui, -apple-system, sans-serif; --ink-3: oklch(58% 0.014 55);
--mono: "Space Mono", ui-monospace, Menlo, monospace; --accent: oklch(56% 0.168 34);
--accent-hi: oklch(52% 0.18 33);
--r: 10px;
--font: "Geist", ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
--mono: "Geist Mono", ui-monospace, "SF Mono", Menlo, Consolas, monospace;
} }
[data-theme="dark"] { [data-theme="dark"] {
--paper: oklch(17.5% 0.01 267); --card: oklch(21% 0.012 267); --tint: oklch(24% 0.014 267); --paper: oklch(19% 0.008 60);
--line: oklch(31% 0.015 267); --mark: oklch(52% 0.012 267); --surface: oklch(22% 0.01 60);
--ink: oklch(94% 0.005 95); --ink-soft: oklch(72% 0.01 95); --line: oklch(30% 0.012 60);
--accent: oklch(70% 0.15 267); --accent-2: oklch(79% 0.12 267); --accent-bg: oklch(70% 0.15 267 / 0.14); --on-accent: oklch(17% 0.03 267); --ink: oklch(93% 0.006 75);
--shadow: 0 1px 2px oklch(0% 0 0 / 0.3); --ink-2: oklch(72% 0.012 70);
--ink-3: oklch(60% 0.012 65);
--accent: oklch(70% 0.15 40);
--accent-hi: oklch(76% 0.14 42);
} }
*, *::before, *::after { box-sizing: border-box; } *, *::before, *::after { box-sizing: border-box; }
html { -webkit-text-size-adjust: 100%; } html { -webkit-text-size-adjust: 100%; }
body { margin: 0; background: var(--paper); color: var(--ink); font-family: var(--sans); font-size: 16px; line-height: 1.6; body {
-webkit-font-smoothing: antialiased; padding-left: env(safe-area-inset-left); padding-right: env(safe-area-inset-right); } margin: 0; background: var(--paper); color: var(--ink);
font-family: var(--font); font-size: 1rem; line-height: 1.62;
-webkit-font-smoothing: antialiased;
}
.legal-head { border-bottom: 1px solid var(--line); background: var(--surface); }
.legal-head .inner, main.legal { width: min(100% - 2.5rem, 46rem); margin-inline: auto; }
.legal-head .inner { display: flex; align-items: center; justify-content: space-between; gap: 1rem; padding: 0.9rem 0; }
.legal-head a.back { display: inline-flex; align-items: center; gap: 0.45rem; text-decoration: none; color: var(--ink); font-weight: 500; }
.legal-head .wordmark { font-family: var(--mono); font-size: 1.02rem; letter-spacing: -0.03em; }
.legal-head .wordmark b { color: var(--accent); }
.legal-head nav { display: flex; gap: 1.25rem; font-size: 0.875rem; }
.legal-head nav a { color: var(--ink-3); text-decoration: none; }
.legal-head nav a:hover, .legal-head nav a[aria-current="page"] { color: var(--accent); }
main.legal { padding: 3rem 0 5rem; }
h1 { font-size: clamp(1.9rem, 1.5rem + 1.6vw, 2.5rem); letter-spacing: -0.03em; line-height: 1.12; margin: 0 0 1.5rem; }
h2 { font-size: 1.0625rem; letter-spacing: -0.015em; margin: 2.4rem 0 0.6rem; }
p { margin: 0 0 1em; color: var(--ink-2); }
p.intro { color: var(--ink); }
ul { padding-left: 1.15rem; margin: 0 0 1em; color: var(--ink-2); }
li { margin-bottom: 0.32em; }
a { color: var(--accent); text-underline-offset: 3px; } a { color: var(--accent); text-underline-offset: 3px; }
a:hover { color: var(--accent-2); } a:hover { color: var(--accent-hi); }
:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; } :focus-visible { outline: 2px solid var(--accent); outline-offset: 3px; border-radius: 3px; }
code, .mono { font-family: var(--mono); font-size: 0.92em; }
.topbar { position: sticky; top: 0; z-index: 10; display: flex; align-items: center; gap: 12px; table.legal-table { border-collapse: collapse; margin: 0 0 1em; }
padding: calc(10px + env(safe-area-inset-top)) 16px 10px; border-bottom: 1px solid var(--line); table.legal-table th { text-align: left; font-weight: 500; color: var(--ink-3); padding: 0.22rem 1.6rem 0.22rem 0; vertical-align: top; white-space: nowrap; font-size: 0.9375rem; }
background: color-mix(in oklab, var(--card) 88%, transparent); backdrop-filter: blur(8px); -webkit-backdrop-filter: blur(8px); } table.legal-table td { padding: 0.22rem 0; vertical-align: top; color: var(--ink-2); }
.brand { display: inline-flex; align-items: center; gap: 9px; color: var(--ink); text-decoration: none; font-weight: 700; font-size: 1.2rem; letter-spacing: -0.02em; }
.brand:hover { color: var(--ink); }
.brand svg { width: 22px; height: 22px; color: var(--accent); }
.brand .two { color: var(--accent); }
.topbar nav { margin-left: auto; display: flex; gap: 4px; flex-wrap: wrap; }
.topbar nav a { min-height: 40px; display: inline-flex; align-items: center; padding: 0 12px; border-radius: 999px; color: var(--ink-soft); text-decoration: none; font-size: 0.9rem; }
.topbar nav a:hover { color: var(--ink); background: var(--tint); }
.topbar nav a[aria-current="page"] { color: var(--accent); background: var(--accent-bg); font-weight: 700; }
main.legal { max-width: 760px; margin: 0 auto; padding: 32px 16px calc(64px + env(safe-area-inset-bottom)); } .legal-foot { border-top: 1px solid var(--line); margin-top: 3rem; padding-top: 1.25rem; font-size: 0.875rem; color: var(--ink-3); }
.mono-label { font-family: var(--mono); font-size: 10px; letter-spacing: 0.18em; text-transform: uppercase; color: var(--ink-soft); } .legal-foot a { color: var(--ink-3); }
h1 { font-size: clamp(1.9rem, 1.5rem + 1.6vw, 2.5rem); letter-spacing: -0.02em; line-height: 1.12; margin: 6px 0 20px; }
.card { background: var(--card); border: 1px solid var(--line); border-radius: var(--radius); box-shadow: var(--shadow); padding: 8px 24px 20px; }
h2 { font-size: 1.08rem; letter-spacing: -0.01em; margin: 1.8rem 0 0.5rem; }
p { margin: 0 0 1em; color: var(--ink-soft); }
p.intro { color: var(--ink); font-size: 1.05rem; margin-bottom: 20px; }
ul { padding-left: 1.15rem; margin: 0 0 1em; color: var(--ink-soft); }
li { margin-bottom: 0.3em; }
code, .mono { font-family: var(--mono); font-size: 0.88em; }
table.legal-table { border-collapse: collapse; margin: 0 0 1em; width: 100%; }
table.legal-table th { text-align: left; font-weight: 400; color: var(--ink-soft); padding: 0.3rem 1.4rem 0.3rem 0; vertical-align: top; white-space: nowrap; font-family: var(--mono); font-size: 0.78rem; letter-spacing: .04em; }
table.legal-table td { padding: 0.3rem 0; vertical-align: top; overflow-wrap: anywhere; }
.legal-foot { margin-top: 24px; display: flex; gap: 8px 18px; flex-wrap: wrap; font-size: 0.9rem; }
.legal-foot a { color: var(--ink-soft); text-decoration: none; padding: 6px 0; }
.legal-foot a:hover { color: var(--accent); } .legal-foot a:hover { color: var(--accent); }
@media (max-width: 560px) {
.card { padding: 4px 16px 16px; } @media (prefers-reduced-motion: reduce) { *, *::before, *::after { transition-duration: 0.01ms !important; animation-duration: 0.01ms !important; } }
.topbar nav a { padding: 0 10px; font-size: 0.85rem; }
table.legal-table th, table.legal-table td { display: block; padding: 0; }
table.legal-table td { margin-bottom: 10px; }
}
@media (prefers-reduced-motion: reduce) { *, *::before, *::after { transition-duration: .001ms !important; animation-duration: .001ms !important; } }
.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; }
}
+7 -39
View File
@@ -1,45 +1,13 @@
{ {
"name": "clip2md — Paste to Markdown", "name": "clip2md — Paste to Markdown",
"short_name": "clip2md", "short_name": "clip2md",
"description": "Paste rich text or a web page and save it as clean Markdown in one click. Client-side, private, offline-capable.", "description": "Paste rich text or a web page and save it as clean Markdown in one keystroke. Client-side, private, offline-capable.",
"start_url": "/", "start_url": ".",
"scope": "/", "scope": ".",
"display": "standalone", "display": "standalone",
"background_color": "#EAEAE3", "background_color": "#faf7f2",
"theme_color": "#EAEAE3", "theme_color": "#faf7f2",
"icons": [ "icons": [
{ { "src": "icon.svg", "sizes": "any", "type": "image/svg+xml", "purpose": "any maskable" }
"src": "/icon.svg", ]
"sizes": "any",
"type": "image/svg+xml",
"purpose": "any"
},
{
"src": "/icon-192.png",
"sizes": "192x192",
"type": "image/png",
"purpose": "any"
},
{
"src": "/icon-512.png",
"sizes": "512x512",
"type": "image/png",
"purpose": "any"
},
{
"src": "/icon-maskable-512.png",
"sizes": "512x512",
"type": "image/png",
"purpose": "maskable"
}
],
"share_target": {
"action": "/",
"method": "GET",
"params": {
"title": "title",
"text": "text",
"url": "url"
}
}
} }
-3
View File
@@ -38,10 +38,7 @@ server {
add_header Cache-Control "no-cache"; add_header Cache-Control "no-cache";
} }
# Pages and icons revalidate on every load, so a deploy reaches users immediately.
location / { location / {
include /etc/nginx/security-headers.conf;
add_header Cache-Control "no-cache";
try_files $uri $uri.html $uri/ /index.html; try_files $uri $uri.html $uri/ /index.html;
} }
} }
-184
View File
@@ -1,184 +0,0 @@
<!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>
+23 -53
View File
@@ -1,31 +1,19 @@
/* clip2md service worker. /* clip2md service worker — offline shell cache. Bump CACHE on any asset change. */
Pages (navigations, .html): network first, cache only as offline fallback — var CACHE = 'clip2md-v3';
so new or changed pages are never frozen for existing users.
Static assets (vendor, fonts, icons): cache first. Bump CACHE on asset changes. */
var CACHE = 'clip2md-v8';
var ASSETS = [ var ASSETS = [
'/', './',
'/index.html', './index.html',
'/impressum.html', './impressum.html',
'/datenschutz.html', './datenschutz.html',
'/imprint.html', './legal.css',
'/privacy.html', './icon.svg',
'/legal.css', './manifest.webmanifest',
'/icon.svg', './vendor/turndown.js',
'/icon-192.png', './vendor/turndown-plugin-gfm.js',
'/apple-touch-icon.png', './vendor/marked.umd.js',
'/manifest.webmanifest', './vendor/purify.min.js',
'/vendor/turndown.js', './vendor/fonts/Geist-Variable.woff2',
'/vendor/turndown-plugin-gfm.js', './vendor/fonts/GeistMono-Variable.woff2'
'/vendor/marked.umd.js',
'/vendor/purify.min.js',
'/vendor/Readability.js',
'/clean.js',
'/vendor/fonts/space-grotesk-latin-400-normal.woff2',
'/vendor/fonts/space-grotesk-latin-500-normal.woff2',
'/vendor/fonts/space-grotesk-latin-700-normal.woff2',
'/vendor/fonts/space-mono-latin-400-normal.woff2',
'/vendor/fonts/space-mono-latin-700-normal.woff2'
]; ];
self.addEventListener('install', function (e) { self.addEventListener('install', function (e) {
@@ -41,36 +29,18 @@ self.addEventListener('activate', function (e) {
); );
}); });
function isPage(req, url) {
return req.mode === 'navigate' || req.destination === 'document' || /\.html$/.test(url.pathname) || url.pathname === '/';
}
self.addEventListener('fetch', function (e) { self.addEventListener('fetch', function (e) {
var req = e.request; if (e.request.method !== 'GET') return;
if (req.method !== 'GET') return;
var url = new URL(req.url);
if (url.origin !== self.location.origin) return; // external links (PayPal, GitHub) untouched
if (isPage(req, url)) {
e.respondWith( e.respondWith(
fetch(req).then(function (res) { caches.match(e.request).then(function (hit) {
if (res && res.ok) { var copy = res.clone(); caches.open(CACHE).then(function (c) { c.put(req, copy); }); } return hit || fetch(e.request).then(function (res) {
return res; // Runtime-cache same-origin successful responses.
}).catch(function () { if (res && res.ok && e.request.url.indexOf(self.location.origin) === 0) {
return caches.match(req).then(function (hit) { var copy = res.clone();
return hit || caches.match(url.pathname.replace(/\/$/, '/index.html')) || caches.match('/index.html'); caches.open(CACHE).then(function (c) { c.put(e.request, copy); });
});
})
);
return;
} }
e.respondWith(
caches.match(req).then(function (hit) {
return hit || fetch(req).then(function (res) {
if (res && res.ok) { var copy = res.clone(); caches.open(CACHE).then(function (c) { c.put(req, copy); }); }
return res; return res;
}); }).catch(function () { return caches.match('./index.html'); });
}) })
); );
}); });
-13
View File
@@ -1,13 +0,0 @@
Copyright (c) 2010 Arc90 Inc
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-2786
View File
File diff suppressed because it is too large. Load diff
Binary file not shown.
Binary file not shown.
-93
View File
@@ -1,93 +0,0 @@
Copyright 2020 The Space Grotesk Project Authors (https://github.com/floriankarsten/space-grotesk)
This Font Software is licensed under the SIL Open Font License, Version 1.1.
This license is copied below, and is also available with a FAQ at:
http://scripts.sil.org/OFL
-----------------------------------------------------------
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
-----------------------------------------------------------
PREAMBLE
The goals of the Open Font License (OFL) are to stimulate worldwide
development of collaborative font projects, to support the font creation
efforts of academic and linguistic communities, and to provide a free and
open framework in which fonts may be shared and improved in partnership
with others.
The OFL allows the licensed fonts to be used, studied, modified and
redistributed freely as long as they are not sold by themselves. The
fonts, including any derivative works, can be bundled, embedded,
redistributed and/or sold with any software provided that any reserved
names are not used by derivative works. The fonts and derivatives,
however, cannot be released under any other type of license. The
requirement for fonts to remain under this license does not apply
to any document created using the fonts or their derivatives.
DEFINITIONS
"Font Software" refers to the set of files released by the Copyright
Holder(s) under this license and clearly marked as such. This may
include source files, build scripts and documentation.
"Reserved Font Name" refers to any names specified as such after the
copyright statement(s).
"Original Version" refers to the collection of Font Software components as
distributed by the Copyright Holder(s).
"Modified Version" refers to any derivative made by adding to, deleting,
or substituting -- in part or in whole -- any of the components of the
Original Version, by changing formats or by porting the Font Software to a
new environment.
"Author" refers to any designer, engineer, programmer, technical
writer or other person who contributed to the Font Software.
PERMISSION & CONDITIONS
Permission is hereby granted, free of charge, to any person obtaining
a copy of the Font Software, to use, study, copy, merge, embed, modify,
redistribute, and sell modified and unmodified copies of the Font
Software, subject to the following conditions:
1) Neither the Font Software nor any of its individual components,
in Original or Modified Versions, may be sold by itself.
2) Original or Modified Versions of the Font Software may be bundled,
redistributed and/or sold with any software, provided that each copy
contains the above copyright notice and this license. These can be
included either as stand-alone text files, human-readable headers or
in the appropriate machine-readable metadata fields within text or
binary files as long as those fields can be easily viewed by the user.
3) No Modified Version of the Font Software may use the Reserved Font
Name(s) unless explicit written permission is granted by the corresponding
Copyright Holder. This restriction only applies to the primary font name as
presented to the users.
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
Software shall not be used to promote, endorse or advertise any
Modified Version, except to acknowledge the contribution(s) of the
Copyright Holder(s) and the Author(s) or with their explicit written
permission.
5) The Font Software, modified or unmodified, in part or in whole,
must be distributed entirely under this license, and must not be
distributed under any other license. The requirement for fonts to
remain under this license does not apply to any document created
using the Font Software.
TERMINATION
This license becomes null and void if any of the above conditions are
not met.
DISCLAIMER
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
OTHER DEALINGS IN THE FONT SOFTWARE.
-93
View File
@@ -1,93 +0,0 @@
Copyright 2016 The Space Mono Project Authors (https://github.com/googlefonts/spacemono) SpaceMono-Italic.ttf: Copyright 2016 The Space Mono Project Authors (https://github.com/googlefonts/spacemono) SpaceMono-Bold.ttf: Copyright 2016 The Space Mono Project Authors (https://github.com/googlefonts/spacemono) SpaceMono-BoldItalic.ttf: Copyright 2016 The Space Mono Project Authors (https://github.com/googlefonts/spacemono)
This Font Software is licensed under the SIL Open Font License, Version 1.1.
This license is copied below, and is also available with a FAQ at:
http://scripts.sil.org/OFL
-----------------------------------------------------------
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
-----------------------------------------------------------
PREAMBLE
The goals of the Open Font License (OFL) are to stimulate worldwide
development of collaborative font projects, to support the font creation
efforts of academic and linguistic communities, and to provide a free and
open framework in which fonts may be shared and improved in partnership
with others.
The OFL allows the licensed fonts to be used, studied, modified and
redistributed freely as long as they are not sold by themselves. The
fonts, including any derivative works, can be bundled, embedded,
redistributed and/or sold with any software provided that any reserved
names are not used by derivative works. The fonts and derivatives,
however, cannot be released under any other type of license. The
requirement for fonts to remain under this license does not apply
to any document created using the fonts or their derivatives.
DEFINITIONS
"Font Software" refers to the set of files released by the Copyright
Holder(s) under this license and clearly marked as such. This may
include source files, build scripts and documentation.
"Reserved Font Name" refers to any names specified as such after the
copyright statement(s).
"Original Version" refers to the collection of Font Software components as
distributed by the Copyright Holder(s).
"Modified Version" refers to any derivative made by adding to, deleting,
or substituting -- in part or in whole -- any of the components of the
Original Version, by changing formats or by porting the Font Software to a
new environment.
"Author" refers to any designer, engineer, programmer, technical
writer or other person who contributed to the Font Software.
PERMISSION & CONDITIONS
Permission is hereby granted, free of charge, to any person obtaining
a copy of the Font Software, to use, study, copy, merge, embed, modify,
redistribute, and sell modified and unmodified copies of the Font
Software, subject to the following conditions:
1) Neither the Font Software nor any of its individual components,
in Original or Modified Versions, may be sold by itself.
2) Original or Modified Versions of the Font Software may be bundled,
redistributed and/or sold with any software, provided that each copy
contains the above copyright notice and this license. These can be
included either as stand-alone text files, human-readable headers or
in the appropriate machine-readable metadata fields within text or
binary files as long as those fields can be easily viewed by the user.
3) No Modified Version of the Font Software may use the Reserved Font
Name(s) unless explicit written permission is granted by the corresponding
Copyright Holder. This restriction only applies to the primary font name as
presented to the users.
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
Software shall not be used to promote, endorse or advertise any
Modified Version, except to acknowledge the contribution(s) of the
Copyright Holder(s) and the Author(s) or with their explicit written
permission.
5) The Font Software, modified or unmodified, in part or in whole,
must be distributed entirely under this license, and must not be
distributed under any other license. The requirement for fonts to
remain under this license does not apply to any document created
using the Font Software.
TERMINATION
This license becomes null and void if any of the above conditions are
not met.
DISCLAIMER
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
OTHER DEALINGS IN THE FONT SOFTWARE.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.