| 1 | # Klonkt
|
|---|
| 2 |
|
|---|
| 3 | Je eigen, **zelf-gehoste** plek op het web — voor je verhaal, je beeld en je
|
|---|
| 4 | geluid. Gebouwd op **Node + SQLite + htmx**: licht, server-rendered, en van jou.
|
|---|
| 5 | Geen algoritme, geen advertenties, geen platform dat ertussen zit.
|
|---|
| 6 |
|
|---|
| 7 | ## Wat het kan
|
|---|
| 8 |
|
|---|
| 9 | - **Solo of hub** — één persoonlijke site, of een label/collectief met meerdere
|
|---|
| 10 | makers onder één dak.
|
|---|
| 11 | - **Blog & foto's** — posts met cover, tags, tijdlijn of grid.
|
|---|
| 12 | - **Eigen muziek hosten** — ingebouwde audiospeler met tracks, albums en playlists.
|
|---|
| 13 | - **Fans & reacties** — bezoekers loggen in met Google (optioneel) en reageren.
|
|---|
| 14 | - **Groeien**: nieuwsbrief, download-voor-email, EPK/perskit, link-in-bio,
|
|---|
| 15 | show-agenda, en **cookievrije statistieken**.
|
|---|
| 16 | - **Cirkels** — verbind je site met andere Klonkt-sites en toon elkaars publieke
|
|---|
| 17 | posts; decentraal en zonder centraal platform (Ed25519-gesigneerde federatie).
|
|---|
| 18 | - **Thema's & talen** — meerdere paletten (light + dark), interface in NL/EN/DE.
|
|---|
| 19 | - **Installeerbaar (PWA)**, **privacy-first** (self-hosted fonts, geen tracking).
|
|---|
| 20 |
|
|---|
| 21 | ### Lite-modus (zonder audio)
|
|---|
| 22 |
|
|---|
| 23 | Zet `KLONKT_AUDIO=off` in `.env` om de hele audio-/muziek-feature uit te
|
|---|
| 24 | schakelen. Klonkt draait dan als lichte **blog/foto/EPK/links-site zónder ffmpeg**
|
|---|
| 25 | — ideaal voor minimale hosting. Hub, Cirkels en externe embeds
|
|---|
| 26 | (YouTube/SoundCloud/Spotify) blijven gewoon werken.
|
|---|
| 27 |
|
|---|
| 28 | ## Zelf hosten
|
|---|
| 29 |
|
|---|
| 30 | Klonkt is een **Node-app** — draai 'm op een **VPS, in Docker, of op een
|
|---|
| 31 | Node-hostingplatform (PaaS)**. **Niet** op klassieke shared PHP-hosting. De
|
|---|
| 32 | database (SQLite) maakt zichzelf aan bij de eerste start.
|
|---|
| 33 |
|
|---|
| 34 | ### Optie A — Docker (aanbevolen)
|
|---|
| 35 |
|
|---|
| 36 | Node, ffmpeg en cwebp zitten in het image; je hebt alleen Docker nodig.
|
|---|
| 37 |
|
|---|
| 38 | ```bash
|
|---|
| 39 | git clone <repo-url> klonkt && cd klonkt
|
|---|
| 40 | cp .env.example .env # vul SESSION_SECRET + PUBLIC_BASE_URL in
|
|---|
| 41 | docker compose up -d
|
|---|
| 42 | ```
|
|---|
| 43 |
|
|---|
| 44 | Data (database + media) blijft in het `klonkt-data`-volume, ook na een update.
|
|---|
| 45 | Updaten: `git pull && docker compose up -d --build`.
|
|---|
| 46 |
|
|---|
| 47 | ### Optie B — VPS-installer (Debian/Ubuntu)
|
|---|
| 48 |
|
|---|
| 49 | Eén commando: installeert Node 20, Caddy (automatische HTTPS) en een
|
|---|
| 50 | systemd-service. Coëxistentie-veilig (raakt een bestaande Node/webserver niet).
|
|---|
| 51 |
|
|---|
| 52 | ```bash
|
|---|
| 53 | sudo bash scripts/install.sh --domain jouwdomein.nl
|
|---|
| 54 | ```
|
|---|
| 55 |
|
|---|
| 56 | Bijwerken kan daarna met `klonkt-update`.
|
|---|
| 57 |
|
|---|
| 58 | ### Optie C — kaal Node (20+)
|
|---|
| 59 |
|
|---|
| 60 | ```bash
|
|---|
| 61 | git clone <repo-url> klonkt && cd klonkt
|
|---|
| 62 | npm ci
|
|---|
| 63 | cp .env.example .env # SESSION_SECRET + PUBLIC_BASE_URL invullen
|
|---|
| 64 | npm start # database wordt bij de eerste start aangemaakt
|
|---|
| 65 | ```
|
|---|
| 66 |
|
|---|
| 67 | Zet 'm voor productie achter een procesmanager (pm2/systemd) en een
|
|---|
| 68 | reverse-proxy. `cwebp` is optioneel (`apt install webp`) voor WebP-afbeeldingen.
|
|---|
| 69 |
|
|---|
| 70 | ### HTTPS (Docker / kaal Node)
|
|---|
| 71 |
|
|---|
| 72 | Zet een reverse-proxy vóór de app. Met **Caddy** (automatisch Let's Encrypt):
|
|---|
| 73 |
|
|---|
| 74 | ```caddy
|
|---|
| 75 | jouwdomein.nl {
|
|---|
| 76 | reverse_proxy localhost:3000
|
|---|
| 77 | encode gzip zstd
|
|---|
| 78 | }
|
|---|
| 79 | ```
|
|---|
| 80 |
|
|---|
| 81 | (De VPS-installer regelt Caddy + HTTPS al voor je.)
|
|---|
| 82 |
|
|---|
| 83 | ### Eerste keer
|
|---|
| 84 |
|
|---|
| 85 | Open je site → je krijgt de **setup-wizard**: kies je taal, geef je site een
|
|---|
| 86 | naam en maak je beheerder aan. De **eerste gebruiker wordt automatisch
|
|---|
| 87 | beheerder**; daarna sluit registratie zich. Wachtwoord kwijt?
|
|---|
| 88 | `npm run reset-admin` (Docker: `docker compose exec klonkt npm run reset-admin`).
|
|---|
| 89 |
|
|---|
| 90 | ## Configuratie (`.env`)
|
|---|
| 91 |
|
|---|
| 92 | | Variabele | Nodig | Wat |
|
|---|
| 93 | |---|---|---|
|
|---|
| 94 | | `SESSION_SECRET` | ✅ | Willekeurige string van ≥32 tekens |
|
|---|
| 95 | | `PUBLIC_BASE_URL` | ✅ | Canonieke URL (bv. `https://jouwdomein.nl`) |
|
|---|
| 96 | | `GOOGLE_CLIENT_ID` / `_SECRET` / `_REDIRECT_URI` | — | Google-login voor luisteraars (eigen OAuth-client; geeft nooit beheer) |
|
|---|
| 97 | | `SMTP_HOST` / `_PORT` / `_USER` / `_PASS` / `_FROM` | — | E-mail voor wachtwoord-reset + nieuwsbrief |
|
|---|
| 98 | | `KLONKT_DEFAULT_LANG` | — | Standaardtaal voor bezoekers (`en`/`nl`/`de`) |
|
|---|
| 99 | | `KLONKT_AUDIO` | — | `off` = lite-modus (geen audio/ffmpeg) |
|
|---|
| 100 |
|
|---|
| 101 | ## Stack
|
|---|
| 102 |
|
|---|
| 103 | - **Runtime:** Node 20+
|
|---|
| 104 | - **Web:** Express + Helmet + express-session
|
|---|
| 105 | - **DB:** better-sqlite3 (WAL), migreert zichzelf bij boot
|
|---|
| 106 | - **Templates:** EJS (server-rendered) + **htmx 1.9** (vendored, geen build-step)
|
|---|
| 107 | - **Audio:** ffmpeg-static (meegebundeld)
|
|---|
| 108 | - **Cirkels:** Ed25519-gesigneerde pull (libsodium via Node-crypto)
|
|---|
| 109 | - **Fonts:** self-hosted variable woff2 (Fraunces / Plus Jakarta Sans)
|
|---|
| 110 |
|
|---|
| 111 | ## Project-structuur
|
|---|
| 112 |
|
|---|
| 113 | ```
|
|---|
| 114 | src/
|
|---|
| 115 | ├── server.js # Express bootstrap + routes mounten
|
|---|
| 116 | ├── config/ # database, mailer, google, feature-flags
|
|---|
| 117 | ├── db/migrations/ # SQLite-schema (001-init.sql)
|
|---|
| 118 | ├── middleware/ # site-resolving, auth, render (htmx-aware)
|
|---|
| 119 | ├── routes/ # per-resource Express-routers (posts, auth, admin-*, circle, …)
|
|---|
| 120 | ├── services/ # domeinlogica (federatie, stats, mailer, permissies, …)
|
|---|
| 121 | ├── views/ # shell.ejs + partials/ + pages/ (EJS)
|
|---|
| 122 | └── assets/ # css/ (palette-tokens + componenten), js/ (htmx, speler), fonts/
|
|---|
| 123 | ```
|
|---|
| 124 |
|
|---|
| 125 | ## Licentie
|
|---|
| 126 |
|
|---|
| 127 | Open-source, zelf-hostbaar. **Definitieve licentie nog te bepalen** (richting
|
|---|
| 128 | AGPL-3.0). Tot dan: gebruik om zelf te hosten is welkom; vraag even bij
|
|---|
| 129 | herdistributie/doorverkoop. Gemaakt door robo.burr (Robin Genis) ·
|
|---|
| 130 | <https://klonkt.com>
|
|---|