Molodetz blogrol volgens DPP-template

This commit is contained in:
2026-10-05 09:36:20 +02:00
commit f290a4c766
277 changed files with 15758 additions and 0 deletions
+24
View File
@@ -0,0 +1,24 @@
# API en authenticatie
Elke route heeft vier gezichten: HTML, JSON, documentatie en (waar geselecteerd) een assistent-tool. Vraag JSON met `Accept: application/json`.
## Authenticatie
Volgorde van resolutie:
1. `session` cookie (64 hex tekens) na inloggen op `/auth/login`.
2. `X-API-KEY` header met je API-sleutel.
3. `Authorization: Bearer <sleutel>`.
4. `Authorization: Basic` met naam of e-mail en wachtwoord.
Er is geen JWT en geen OAuth.
## Voorbeeld
```bash
curl -H 'Accept: application/json' https://molodetz.nl/rol
```
## Fouten
Fouten hebben de vorm `{"error": {"status": 404, "message": "..."}}`. Validatiefouten geven `422` met `{"error": "validation", "fields": [...], "messages": [...]}`.
@@ -0,0 +1,18 @@
# Architectuur
FastAPI met Jinja2, server-side gerenderd. SQLite via `dataset`, synchroon en bewust zonder threadpool. Sessies met PBKDF2-SHA256 wachtwoorden.
## Lagen
- `molodetz/database/`: één bestand per onderwerp, importeer altijd vanaf de package-root.
- `molodetz/routers/`: spiegelt het URL-pad.
- `molodetz/services/`: achtergrondservices onder één supervisor met een bestandsslot.
- `molodetz/templates/`: één Jinja-omgeving in `templating.py`.
## Verwijderen
Alles wordt zacht verwijderd met `deleted_at` en `deleted_by`. Alleen opruimtaken verwijderen hard.
## Statische bestanden
Assets lopen via `static_url()`, wat ze versioneert onder `/static/v<versie>/`. Die zijn een jaar onveranderlijk cachebaar.
+14
View File
@@ -0,0 +1,14 @@
# Back-ups en onderhoud
Doelen: `database`, `uploads`, `keys`, `full`. Archieven worden gecomprimeerd met zstd of brotli en staan onder `data/backups/`. Alleen de primaire beheerder kan downloaden.
## CLI
```bash
molodetz backups list
molodetz backups run --target database
molodetz backups prune --keep 14 --dry-run
molodetz system prune --dry-run
```
Het onderhoudsscript `bin/maintenance.sh` draait alle prunes en toont schijfgebruik voor en na.
+13
View File
@@ -0,0 +1,13 @@
# Beheer en services
Onder *Beheer, Services* staan alle achtergrondservices. Elke service heeft een overzicht, configuratie en logs. Starten, stoppen, nu draaien en logs wissen zijn databaseschrijfacties waar de service binnen een seconde op reageert.
| Service | Doel |
|---------|------|
| presence | publiceert de online-set |
| housekeeping | ruimt verlopen sessies op, snoeit het auditlog |
| backup | verwerkt de back-upwachtrij en plant automatische back-ups |
## Onderhoudsmodus
Zet `maintenance_mode` op `1` onder *Instellingen*. Beheerders blijven alles zien.
+5
View File
@@ -0,0 +1,5 @@
# Binnenkomen
Het formulier op [/binnen](/binnen) slaat een aanmelding op: naam, contact, optioneel een link naar je werk en een bericht. Beheerders krijgen een melding en zien de aanmelding onder *Beheer, Aanmeldingen*.
Er is geen automatische toegang. retoor leest elke aanmelding en neemt zelf contact op.
@@ -0,0 +1,5 @@
# dp-avatar
Toont een deterministische SVG-avatar plus presence-stip. Attribuut `seed`, `size`, `uid`.
Light DOM, geen shadow DOM. Registreert zichzelf met `customElements.define`.
@@ -0,0 +1,5 @@
# dp-chat
Eenvoudige log met invoerregel. Geeft een `dp-chat-send` event.
Light DOM, geen shadow DOM. Registreert zichzelf met `customElements.define`.
@@ -0,0 +1,5 @@
# dp-code
Markeert een codeblok met highlight.js en voegt een Kopieer-knop toe.
Light DOM, geen shadow DOM. Registreert zichzelf met `customElements.define`.
@@ -0,0 +1,5 @@
# dp-content
Rendert live markdown aan de clientkant via marked, daarna DOMPurify. Alleen voor live inhoud, zoals het editorvoorbeeld.
Light DOM, geen shadow DOM. Registreert zichzelf met `customElements.define`.
@@ -0,0 +1,5 @@
# dp-context-menu
Klein contextmenu met knoppen, gepositioneerd bij de cursor.
Light DOM, geen shadow DOM. Registreert zichzelf met `customElements.define`.
@@ -0,0 +1,5 @@
# dp-dialog
Bevestigingsdialoog. Formulieren met `data-confirm` lopen hierlangs.
Light DOM, geen shadow DOM. Registreert zichzelf met `customElements.define`.
@@ -0,0 +1,5 @@
# dp-lightbox
Volledig scherm voor afbeeldingen met `data-lightbox`. Escape of klik sluit.
Light DOM, geen shadow DOM. Registreert zichzelf met `customElements.define`.
@@ -0,0 +1,5 @@
# dp-title
Inline-variant van dp-content voor titels.
Light DOM, geen shadow DOM. Registreert zichzelf met `customElements.define`.
@@ -0,0 +1,5 @@
# dp-toast
Host voor korte meldingen. Gebruik `Toast.flash(el, bericht)` of `app.toast(bericht)`.
Light DOM, geen shadow DOM. Registreert zichzelf met `customElements.define`.
@@ -0,0 +1,5 @@
# dp-upload
Sleepvlak voor bestanden. Geeft een `dp-files` event met de gekozen bestanden.
Light DOM, geen shadow DOM. Registreert zichzelf met `customElements.define`.
@@ -0,0 +1,7 @@
# Frontend en componenten
ES6-modules, één klasse per bestand, geen framework en geen bundler. `Application.js` maakt alle singletons aan en zet `window.app`.
Componenten zijn custom elements met het voorvoegsel `dp-`, zonder shadow DOM. Zie de componentpagina's in de zijbalk.
Clientrendering met marked en DOMPurify is alleen voor live inhoud: het voorbeeld in de editor. Gepubliceerde berichten worden op de server gerenderd.
@@ -0,0 +1,6 @@
# Voorwaarden en privacy
- [Voorwaarden](/voorwaarden)
- [Privacy](/privacy)
Molodetz heeft geen advertenties, geen tracking over apps heen, geen betalingen en geen sociale login.
@@ -0,0 +1,17 @@
# Schrijven op de rol
Berichten zijn markdown en staan in SQLite. Alleen beheerders schrijven. Een bericht heeft een titel, een onderwerp (`rol` of `standaard`), een status (`draft` of `published`) en optioneel de markering *placeholder*.
## Markdown
De server rendert met GFM: tabellen, doorhalen, harde regeleinden. HTML in de tekst wordt ge-escaped. Links mogen alleen `http`, `https`, `mailto` en `tel` zijn. Emoji schrijf je als `:shortcode:`, bijvoorbeeld `:fire:`.
Een losse afbeeldings-URL wordt een afbeelding, `@naam` wordt een link naar het profiel.
## Placeholders
De eerste notities zijn overgenomen uit de oude Molodetz-pagina en dragen het label *Placeholder*. retoor vervangt ze door eigen verhalen. Haal het vinkje weg bij het bewerken zodra een bericht echt is.
## Slugs
Een slug is permanent: titel plus de laatste twaalf tekens van de uid. Bewerken verandert de slug niet.
+15
View File
@@ -0,0 +1,15 @@
# Welkom bij Molodetz
Molodetz is een rustige blogrol. Notities over het werk, het afmaken en het oordeel. Deze documentatie beschrijft hoe de site werkt, hoe je de API gebruikt en hoe beheer de boel draaiende houdt.
## Wat er is
- **Rol**: korte notities, nieuwste eerst.
- **Standaard**: waar Molodetz op staat.
- **Flyers** en **Memes**: twee galerijen.
- **Mensen**: wie er schrijft.
- **Binnen**: het formulier om mee te schrijven.
## Waar te beginnen
Lees [Schrijven op de rol](/docs/schrijven) voor de inhoud, [API en authenticatie](/docs/api) voor integraties, en [Architectuur](/docs/architectuur) als je wilt weten hoe het gebouwd is.