LabCodeHub öffentliche Ansicht
Anmelden
Küpper / Quildrop öffentlich

fix: add reademe de

R Rüdiger Küpper <rpr@9it.de> committete am 19.02.2026 07:56
a778b2b163841b680c0d807ab41915a5c5646042
1 geänderte Datei(en) +406 −0
Kontextzeilen: 0 1 2 3 10
hinzugefügt README-de.md
+406 −0 Datei ansehen
@@ -0,0 +1,406 @@
1 +
# QuillDrop
2 +
3 +
**QuillDrop** ist ein modernes, minimalistisches Blog-CMS, geschrieben in Go. Es kombiniert die Geschwindigkeit eines Static Site Generators mit der Flexibilität eines dynamischen HTTP-Servers - ohne externe Datenbank, ohne JavaScript-Frameworks, ohne Overhead.
4 +
5 +
## Philosophie
6 +
7 +
> Write. Save. Published.
8 +
9 +
QuillDrop folgt dem Prinzip der maximalen Einfachheit: Markdown-Dateien schreiben, speichern - fertig. Kein Build-Tool-Chaos, kein Node.js, keine Datenbank. Ein einzelnes Go-Binary erledigt alles.
10 +
11 +
## Features
12 +
13 +
### Dual-Mode Betrieb
14 +
15 +
QuillDrop unterstützt zwei Betriebsmodi in einem einzigen Binary:
16 +
17 +
- **`quilldrop serve`** - Startet einen dynamischen HTTP-Server für lokale Entwicklung und Vorschau. Ideal zum Schreiben und sofortigen Testen neuer Posts.
18 +
- **`quilldrop generate`** - Generiert eine komplette statische Website als HTML-Dateien. Perfekt für Deployment auf Nginx, Apache, CDN oder GitHub Pages.
19 +
20 +
### Markdown mit YAML-Frontmatter
21 +
22 +
Posts und Seiten werden als einfache Markdown-Dateien mit YAML-Frontmatter geschrieben:
23 +
24 +
```yaml
25 +
---
26 +
title: "Mein neuer Blogpost"
27 +
date: 2025-11-06 12:00:00
28 +
author: "Max Mustermann"
29 +
cover: "/images/posts/2025/11/cover.webp"
30 +
tags: [Kubernetes, DevOps, Self-Hosted]
31 +
categories: [Technik]
32 +
preview: "Kurze Vorschau des Posts..."
33 +
draft: false
34 +
toc: true
35 +
---
36 +
37 +
# Hier beginnt der Post
38 +
39 +
Normales Markdown mit allen Extras...
40 +
```
41 +
42 +
Unterstützte Frontmatter-Felder:
43 +
44 +
| Feld | Beschreibung |
45 +
|------|-------------|
46 +
| `title` | Titel des Posts |
47 +
| `date` | Veröffentlichungsdatum (mehrere Formate unterstützt) |
48 +
| `update` | Letzte Aktualisierung |
49 +
| `author` | Autor des Posts |
50 +
| `cover` / `featureImage` | Cover-Bild (mit Fallback) |
51 +
| `tags` | Liste von Tags |
52 +
| `categories` | Liste von Kategorien |
53 +
| `preview` | Benutzerdefinierte Vorschau (sonst automatisch aus erstem Absatz) |
54 +
| `draft` | Entwurf - wird nicht veröffentlicht |
55 +
| `toc` | Inhaltsverzeichnis automatisch generieren |
56 +
| `hide` | Post verstecken |
57 +
| `top` | Post oben anpinnen |
58 +
59 +
### Erweitertes Markdown-Rendering
60 +
61 +
QuillDrop nutzt [Goldmark](https://github.com/yuin/goldmark) als Markdown-Engine mit folgenden Erweiterungen:
62 +
63 +
- **GitHub Flavored Markdown (GFM)** - Tabellen, Strikethrough, Autolinks, Task-Listen
64 +
- **Syntax Highlighting** - Über 200 Programmiersprachen mit dem Dracula-Theme via [Chroma](https://github.com/alecthomas/chroma)
65 +
- **Emoji-Support** - Shortcodes wie `:rocket:`, `:tada:`, `:satellite:`
66 +
- **Automatische Heading-IDs** - Für Ankerverlinkung und Inhaltsverzeichnis
67 +
- **Raw HTML** - Einbettung von HTML direkt im Markdown
68 +
- **Hugo-Kompatibilität** - `{{</* rawhtml */>}}` Shortcodes werden automatisch verarbeitet
69 +
70 +
### Responsives Design mit Dark/Light Theme
71 +
72 +
Das mitgelieferte Theme bietet:
73 +
74 +
- **Dark Mode als Default** mit einem hellen Alternativ-Theme
75 +
- **Theme Toggle** mit localStorage-Persistenz (bleibt nach Reload erhalten)
76 +
- **Futuristisches Design** - Dunkle Hintergrunde, Cyan-Akzente, subtile Glow-Effekte
77 +
- **Responsive Layout** - Mobile-first, optimiert für alle Bildschirmgrößen
78 +
- **Hamburger-Navigation** auf mobilen Geräten mit Fullscreen-Overlay und eigenem Stacking Context
79 +
- **Dropdown-Menus** für verschachtelte Navigation (Touch-optimiert auf Mobile)
80 +
- **Integrierte Suche** — Lupe in der Navbar mit Ctrl+K Shortcut
81 +
- **Typographie** - Inter als Textfont, JetBrains Mono für Code und Metadaten
82 +
83 +
### Navigation und Menü
84 +
85 +
Das Navigationsmenü wird vollständig über die `config.yaml` konfiguriert und unterstützt verschachtelte Dropdown-Menüs:
86 +
87 +
```yaml
88 +
menu:
89 +
  - label: "Home"
90 +
    url: "/"
91 +
  - label: "Projekte"
92 +
    children:
93 +
      - label: "VM-Manager"
94 +
        url: "/sites/projekte/vm-manager"
95 +
      - label: "VM-Tracker"
96 +
        url: "/sites/projekte/vm-tracker"
97 +
      - label: "QuillDrop"
98 +
        url: "/sites/projekte/quilldrop"
99 +
  - label: "Über mich"
100 +
    url: "/sites/ueber-mich"
101 +
  - label: "Tags"
102 +
    url: "/tags"
103 +
```
104 +
105 +
Neue Menüpunkte und Untermenüs können jederzeit durch einfaches Erweitern der YAML-Konfiguration hinzugefügt werden.
106 +
107 +
### Pagination
108 +
109 +
Die Startseite zeigt eine konfigurierbare Anzahl von Posts pro Seite (Standard: 5). Die Pagination bietet:
110 +
111 +
- **Intelligente Seitennummerierung** - Zeigt erste und letzte Seite, plus ein Fenster um die aktuelle Seite herum
112 +
- **Ellipsis** bei vielen Seiten (1 ... 10 11 **12** 13 14 ... 23)
113 +
- **Neuere/Ältere Buttons** für schnelle Navigation
114 +
- **Pretty URLs** - `/page/2`, `/page/3`, etc.
115 +
- SEO-freundlich: `/page/1` wird automatisch auf `/` umgeleitet (301)
116 +
117 +
### Tags und Kategorien
118 +
119 +
QuillDrop unterstützt sowohl Tags als auch Kategorien zur Strukturierung von Inhalten:
120 +
121 +
- **Tag-Übersicht** unter `/tags/` mit Anzahl der Posts pro Tag
122 +
- **Tag-Seiten** unter `/tags/kubernetes/` mit allen Posts eines Tags
123 +
- **Kategorie-Übersicht** unter `/categories/` mit Anzahl der Posts pro Kategorie
124 +
- **Kategorie-Seiten** unter `/categories/technik/` mit allen Posts einer Kategorie
125 +
- **Tag- und Kategorie-Badges** auf Post-Cards und Einzelseiten
126 +
- Tags und Kategorien werden aus dem YAML-Frontmatter (`tags`, `categories`) ausgelesen
127 +
128 +
### Volltextsuche
129 +
130 +
QuillDrop enthält eine integrierte Client-seitige Suche, die komplett ohne Backend auskommt:
131 +
132 +
- **Suchindex** — Beim Generieren wird eine `search-index.json` mit allen Posts erstellt
133 +
- **Lazy Loading** — Der Suchindex wird erst beim ersten Öffnen der Suche geladen
134 +
- **Multi-Term-Suche** — Mehrere Suchbegriffe werden mit UND verknüpft
135 +
- **Felder** — Durchsucht Titel, Vorschau, Tags und Kategorien
136 +
- **Keyboard-Shortcut** — `Ctrl+K` / `Cmd+K` öffnet die Suche
137 +
- **Lupe in der Navbar** — Klick auf das Such-Icon öffnet das Suchfeld
138 +
- **Debounce** — Suchergebnisse erscheinen nach 200ms Tippverzögerung
139 +
- **Maximal 8 Treffer** mit Highlighting der Suchbegriffe
140 +
- **Escape** oder Klick außerhalb schließt die Suche
141 +
- Kein externer Dienst, kein Framework — reines Vanilla JavaScript
142 +
143 +
### Artikel-Navigation
144 +
145 +
Am Ende jedes Blog-Posts wird eine Navigation zum vorherigen und nächsten Artikel angezeigt:
146 +
147 +
- **Neuerer Artikel** (← links) — Verlinkt zum chronologisch neueren Post
148 +
- **Älterer Artikel** (→ rechts) — Verlinkt zum chronologisch älteren Post
149 +
- Beim neuesten Artikel wird nur "Älterer Artikel" angezeigt
150 +
- Beim ältesten Artikel wird nur "Neuerer Artikel" angezeigt
151 +
- Zeigt jeweils den Titel des verlinkten Artikels an
152 +
153 +
### Inhaltsverzeichnis (Table of Contents)
154 +
155 +
Posts können ein automatisch generiertes Inhaltsverzeichnis aktivieren:
156 +
157 +
- Aktivierung über `toc: true` im Frontmatter
158 +
- Unterstützt **H1, H2 und H3** Überschriften
159 +
- **Relative Einrückung** — Das TOC erkennt die minimale Heading-Ebene und rückt relativ dazu ein
160 +
- Automatische Anchor-Links zu den jeweiligen Überschriften
161 +
- Wird client-seitig generiert für schnelle Seitenladezeit
162 +
163 +
### Statische Seiten
164 +
165 +
Neben Blog-Posts unterstützt QuillDrop statische Seiten für:
166 +
167 +
- Impressum, Datenschutzerklärung
168 +
- Über mich / About
169 +
- Projektseiten (mit Unterseiten)
170 +
- Beliebige weitere Seiten
171 +
172 +
Seiten werden als Markdown-Dateien im `sites/`-Verzeichnis abgelegt. Verschachtelte Verzeichnisse werden automatisch erkannt - z.B. wird `sites/projekte/vm-tracker/index.md` unter `/sites/projekte/vm-tracker` erreichbar.
173 +
174 +
### RSS Feed
175 +
176 +
Automatisch generierter RSS 2.0 Feed unter `/index.xml` mit:
177 +
178 +
- Den letzten 20 Posts
179 +
- Titel, Link, Vorschau und Veröffentlichungsdatum
180 +
- RSS-Autodiscovery im HTML-Head
181 +
- RSS-Icon in der Navigation
182 +
- URL `/index.xml` für Kompatibilität mit bestehenden Blog-Setups
183 +
184 +
### Cover-Bilder
185 +
186 +
Posts können ein Cover-Bild definieren, das sowohl auf der Startseite (als Post-Card) als auch auf der Einzelansicht angezeigt wird:
187 +
188 +
- **21:9 Aspect Ratio** auf Post-Cards mit Zoom-on-Hover Effekt
189 +
- **Volle Breite** auf der Einzelpost-Seite
190 +
- **Lazy Loading** für optimale Performance
191 +
- **Fallback** von `cover` auf `featureImage`
192 +
193 +
## Architektur
194 +
195 +
### Projektstruktur
196 +
197 +
```
198 +
quilldrop/
199 +
├── main.go                          # CLI Entry Point
200 +
├── config.yaml                      # Konfiguration
201 +
├── content/                         # Blog-Posts (Markdown)
202 +
│   ├── 2025-11-06-mein-post.md
203 +
│   └── ...
204 +
├── sites/                           # Statische Seiten
205 +
│   ├── ueber-mich.md
206 +
│   ├── impressum.md
207 +
│   └── projekte/
208 +
│       └── mein-projekt/
209 +
│           └── index.md
210 +
├── static/                          # Statische Assets
211 +
│   ├── css/style.css
212 +
│   ├── js/
213 +
│   │   ├── theme.js                 # Dark/Light Toggle + TOC Generator
214 +
│   │   └── search.js                # Client-seitige Volltextsuche
215 +
│   └── images/
216 +
├── internal/
217 +
│   ├── config/config.go             # YAML Config Loader
218 +
│   ├── content/
219 +
│   │   ├── post.go                  # Post Struct + FlexTime + Tags/Categories
220 +
│   │   ├── parser.go                # Markdown + Frontmatter Parser
221 +
│   │   └── page.go                  # Statische Seiten Parser
222 +
│   ├── server/server.go             # HTTP Server
223 +
│   ├── generator/
224 +
│   │   ├── generator.go             # Static Site Generator
225 +
│   │   └── search.go                # Search-Index Generator (JSON)
226 +
│   └── templates/
227 +
│       ├── render.go                # Template Engine + Functions
228 +
│       ├── rss.go                   # RSS Feed Generator
229 +
│       ├── base.html                # Base Layout + Navbar + Suche
230 +
│       ├── home.html                # Homepage + Pagination
231 +
│       ├── post.html                # Einzelner Post + Prev/Next Navigation
232 +
│       ├── page.html                # Statische Seite
233 +
│       ├── tags.html                # Tag-Übersicht
234 +
│       ├── tag.html                 # Tag-Seite
235 +
│       ├── categories.html          # Kategorie-Übersicht
236 +
│       └── category.html            # Kategorie-Seite
237 +
└── output/                          # Generierte statische Dateien
238 +
```
239 +
240 +
### Technologie-Stack
241 +
242 +
| Komponente | Technologie |
243 +
|-----------|-------------|
244 +
| Sprache | Go (Standard Library + minimale Dependencies) |
245 +
| HTTP Server | `net/http` (Go Standard Library) |
246 +
| Templates | `html/template` mit `embed.FS` |
247 +
| Markdown | Goldmark + GFM + Emoji + Chroma |
248 +
| Konfiguration | YAML via `gopkg.in/yaml.v3` |
249 +
| Syntax Highlighting | Chroma (Dracula Theme) |
250 +
| Fonts | Inter + JetBrains Mono (Google Fonts) |
251 +
| CSS | Vanilla CSS mit Custom Properties |
252 +
| JavaScript | Vanilla JS — Theme Toggle, Suche, TOC (kein Framework) |
253 +
254 +
### Dependencies
255 +
256 +
QuillDrop hat bewusst minimale Abhängigkeiten - **kein Web-Framework**, **kein CSS-Framework**, **kein JS-Framework**:
257 +
258 +
- `github.com/yuin/goldmark` - Markdown Parser (CommonMark-konform)
259 +
- `github.com/yuin/goldmark-emoji` - Emoji Shortcodes
260 +
- `github.com/yuin/goldmark-highlighting/v2` - Syntax Highlighting
261 +
- `github.com/alecthomas/chroma/v2` - Syntax Highlighting Engine
262 +
- `gopkg.in/yaml.v3` - YAML Parser
263 +
264 +
### Embedded Assets
265 +
266 +
Alle HTML-Templates werden via Go's `//go:embed` Directive direkt in das Binary eingebettet. Das bedeutet:
267 +
268 +
- **Einzelnes Binary** - Keine externen Template-Dateien nötig
269 +
- **Schneller Start** - Kein Dateisystem-Zugriff für Templates
270 +
- **Einfaches Deployment** - Ein Binary + Config + Content = fertig
271 +
272 +
## Konfiguration
273 +
274 +
Die gesamte Konfiguration erfolgt über eine einzige `config.yaml`:
275 +
276 +
```yaml
277 +
title: "Mein Blog"
278 +
description: "Tech Blog - DevOps, Kubernetes, Self-Hosted"
279 +
author: "Max Mustermann"
280 +
baseURL: "https://mein-blog.de"
281 +
port: 8080
282 +
postsPerPage: 5
283 +
contentDir: "content"
284 +
sitesDir: "sites"
285 +
outputDir: "output"
286 +
287 +
menu:
288 +
  - label: "Home"
289 +
    url: "/"
290 +
  - label: "Tags"
291 +
    url: "/tags"
292 +
  - label: "Über mich"
293 +
    url: "/sites/ueber-mich"
294 +
```
295 +
296 +
| Option | Default | Beschreibung |
297 +
|--------|---------|-------------|
298 +
| `title` | - | Titel der Website |
299 +
| `description` | - | Beschreibung (Meta-Tag + Hero) |
300 +
| `author` | - | Autor der Website |
301 +
| `baseURL` | - | Basis-URL für RSS und absolute Links |
302 +
| `port` | `8080` | Port für den dynamischen Server |
303 +
| `postsPerPage` | `5` | Anzahl Posts pro Seite |
304 +
| `contentDir` | `content` | Verzeichnis für Blog-Posts |
305 +
| `sitesDir` | `sites` | Verzeichnis für statische Seiten |
306 +
| `outputDir` | `output` | Ausgabeverzeichnis für statische Generierung |
307 +
| `menu` | `[]` | Navigationsmenü mit optionalen Untermenüs |
308 +
309 +
## Schnellstart
310 +
311 +
### Installation
312 +
313 +
```bash
314 +
# Repository klonen
315 +
git clone https://github.com/ruedigerp/quilldrop.git
316 +
cd quilldrop
317 +
318 +
# Dependencies laden
319 +
go mod download
320 +
321 +
# Binary bauen
322 +
go build -o quilldrop .
323 +
```
324 +
325 +
### Neuen Post erstellen
326 +
327 +
Eine neue Markdown-Datei im `content/`-Verzeichnis anlegen:
328 +
329 +
```bash
330 +
touch content/2025-12-01-mein-erster-post.md
331 +
```
332 +
333 +
```markdown
334 +
---
335 +
title: "Mein erster Post"
336 +
date: 2025-12-01 10:00:00
337 +
author: "Max Mustermann"
338 +
tags: [Blog, QuillDrop]
339 +
preview: "Das ist mein erster Post mit QuillDrop!"
340 +
toc: false
341 +
---
342 +
343 +
# Willkommen
344 +
345 +
Das ist mein erster Post mit **QuillDrop**.
346 +
347 +
```
348 +
349 +
### Lokale Vorschau
350 +
351 +
```bash
352 +
# Dynamischen Server starten
353 +
./quilldrop serve
354 +
355 +
# Oder direkt mit Go
356 +
go run . serve
357 +
```
358 +
359 +
Dann im Browser: [http://localhost:8080](http://localhost:8080)
360 +
361 +
### Statische Seite generieren
362 +
363 +
```bash
364 +
# HTML-Dateien generieren
365 +
./quilldrop generate
366 +
367 +
# Generierte Dateien befinden sich in output/
368 +
ls output/
369 +
```
370 +
371 +
Die generierten Dateien im `output/`-Verzeichnis können direkt auf einen Webserver (Nginx, Apache, Caddy) oder CDN deployed werden.
372 +
373 +
## URL-Schema
374 +
375 +
Alle URLs verwenden konsequent Trailing Slashes, um serverseitige Redirects zu vermeiden:
376 +
377 +
| URL | Beschreibung |
378 +
|-----|-------------|
379 +
| `/` | Startseite (letzte N Posts) |
380 +
| `/page/2/` | Seite 2 der Post-Liste |
381 +
| `/posts/2025-11-06-mein-post/` | Einzelner Blog-Post |
382 +
| `/tags/` | Tag-Übersicht |
383 +
| `/tags/kubernetes/` | Posts mit Tag "Kubernetes" |
384 +
| `/categories/` | Kategorie-Übersicht |
385 +
| `/categories/technik/` | Posts in Kategorie "Technik" |
386 +
| `/sites/ueber-mich/` | Statische Seite |
387 +
| `/sites/projekte/vm-tracker/` | Verschachtelte Projektseite |
388 +
| `/index.xml` | RSS Feed |
389 +
| `/search-index.json` | Suchindex (JSON) |
390 +
| `/static/css/style.css` | Statische Assets |
391 +
| `/images/posts/2025/11/cover.webp` | Bilder |
392 +
393 +
## Warum QuillDrop?
394 +
395 +
- **Keine Datenbank** - Dateisystem als einzige Datenquelle
396 +
- **Keine Build-Pipeline** - Ein `go build` und fertig
397 +
- **Keine JS-Frameworks** - Vanilla JavaScript für Theme, Suche und TOC
398 +
- **Minimale Dependencies** - 5 Go-Packages, alle fokussiert auf Markdown
399 +
- **Blitzschnell** - Generiert 100+ Posts in unter 3 Sekunden
400 +
- **Einzelnes Binary** - Templates eingebettet, kein Runtime-Setup
401 +
- **Hugo-kompatibel** - Bestehende Hugo-Posts mit Frontmatter funktionieren
402 +
- **Dual-Mode** - Entwicklung mit Server, Produktion mit Static Generator
403 +
404 +
## Lizenz
405 +
406 +
QuillDrop ist Open Source.