Changeset 184393c in Klonkt
- Timestamp:
- 06/23/2026 04:13:25 PM (3 months ago)
- Branches:
- main
- Children:
- d5e78f7
- Parents:
- 3f4049e
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
README.md
r3f4049e r184393c 1 # Klonkt Beta1 # Klonkt 2 2 3 Persoonlijk multi-site platform met editorial-feel content + sociale community. 4 Gebouwd op **Node + SQLite + htmx** — licht, zelf-gehost, en van jou. 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. 5 6 6 > **Wat het is.** Geen *publishing tool* maar een *persoonlijk canvas* — content, 7 > profiel, sociale interactie en realtime in één. 7 ## Wat het kan 8 8 9 ## Filosofie 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). 10 20 11 - **Editorial feel.** Magazine-typografie (Fraunces + Literata + Plus Jakarta), royale spacing, 12 paletten (o.a. Sage, Paper, Ocean, Forest, Stone, Midnight, Sunset, Cream, Rose, Goud, Terracotta, Lilac). Light + dark per palette. 12 - **App-feel waar het telt.** Geen full page reloads — htmx swaps + (binnenkort) View Transitions. Voelt als app, niet als website. 13 - **Server-rendered.** Geen build step, geen SPA-tax. EJS + htmx + minimale Alpine. 14 - **Realtime ingebouwd.** WebSocket server zit in `src/websocket/`. SSE als alternatief beschikbaar. 15 - **Privacy-first.** Self-hosted fonts, geen third-party requests, geen tracking. 21 ### Lite-modus (zonder audio) 16 22 17 ## Roadmap 18 19 | Fase | Scope | Status | 20 |------|-------|--------| 21 | **1.0 — v9-feel** | Homepage, profile-header, feed, post-detail visueel matchen met v9 | 🟡 in progress | 22 | **1.1 — auth + posts** | Login / register / post CRUD compleet | ✅ klaar | 23 | **1.2 — sociale laag** | Comments, Prutter (DMs zonder E2EE), notifications | ⚪ na 1.0 | 24 | **1.3 — app-feel** | View Transitions, optimistic UI, swipe-actions, haptics | ⚪ | 25 | **1.4 — bottom-tab nav** | Native-app-stijl navigatie op mobiel, sidebar op desktop | ⚪ | 26 | **2.0 — E2EE DMs** | MLS protocol via `@openmls/openmls`, single-device first | ⚪ apart project | 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 27 28 28 ## Zelf hosten 29 29 30 Klonkt is een **Node-app** (geen PHP) — draai 'm op een VPS, in Dockerof op een31 Node-hostingplatform . **Niet** op klassieke shared PHP-hosting. De database32 (SQLite) maakt zichzelf aan bij de eerste start; er is geen los installatiescript.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 33 34 34 ### Optie A — Docker (aanbevolen) 35 35 36 Alles (Node, ffmpeg, cwebp) zit in het image; je hoeft alleen Docker te hebben.36 Node, ffmpeg en cwebp zitten in het image; je hebt alleen Docker nodig. 37 37 38 38 ```bash 39 39 git clone <repo-url> klonkt && cd klonkt 40 cp .env.example .env 41 # vul in .env minimaal in: SESSION_SECRET (>=32 random tekens) + PUBLIC_BASE_URL 40 cp .env.example .env # vul SESSION_SECRET + PUBLIC_BASE_URL in 42 41 docker compose up -d 43 42 ``` 44 43 45 De app draait nu op poort 3000. Alle data (database + geüploade media/audio) 46 blijft bewaard in het `klonkt-data`-volume, ook na een update. Updaten: 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). 47 51 48 52 ```bash 49 git pull && docker compose up -d --build 53 sudo bash scripts/install.sh --domain jouwdomein.nl 50 54 ``` 51 55 52 ### Optie B — direct met Node (Node 20+) 56 Bijwerken kan daarna met `klonkt-update`. 57 58 ### Optie C — kaal Node (20+) 53 59 54 60 ```bash 55 61 git clone <repo-url> klonkt && cd klonkt 56 62 npm ci 57 cp .env.example .env # SESSION_SECRET + PUBLIC_BASE_URL invullen58 npm start # database wordt bij de eerste start aangemaakt63 cp .env.example .env # SESSION_SECRET + PUBLIC_BASE_URL invullen 64 npm start # database wordt bij de eerste start aangemaakt 59 65 ``` 60 66 61 Open http://localhost:3000. Voor productie: zet 'm achter een procesmanager 62 (pm2/systemd) zodat 'ie aanblijft. `cwebp` is optioneel (Debian/Ubuntu: 63 `apt install webp`) voor WebP-afbeeldingen — ontbreekt 'ie, dan wordt het 64 origineel bewaard. (`npm run dev` = watch-mode voor ontwikkeling.) 67 Zet 'm voor productie achter een procesmanager (pm2/systemd) en een 68 reverse-proxy. `cwebp` is optioneel (`apt install webp`) voor WebP-afbeeldingen. 65 69 66 ### HTTPS ( productie)70 ### HTTPS (Docker / kaal Node) 67 71 68 Zet een reverse-proxy vóór de app voor TLS. Met **Caddy** (automatisch 69 Let's Encrypt) volstaat één blok: 72 Zet een reverse-proxy vóór de app. Met **Caddy** (automatisch Let's Encrypt): 70 73 71 74 ```caddy … … 76 79 ``` 77 80 81 (De VPS-installer regelt Caddy + HTTPS al voor je.) 82 78 83 ### Eerste keer 79 84 80 Open je site en ga naar **`/auth/register`** — de **eerste gebruiker wordt 81 automatisch beheerder**; daarna sluit registratie zich. Wachtwoord kwijt? 82 `npm run reset-admin` (in Docker: `docker compose exec klonkt npm run reset-admin`). 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) | 83 100 84 101 ## Stack … … 86 103 - **Runtime:** Node 20+ 87 104 - **Web:** Express + Helmet + express-session 88 - **DB:** better-sqlite3 (WAL mode)89 - **Templates:** EJS (server-rendered) 90 - ** Frontend interactie:** htmx 1.9 (vendored)91 - ** Realtime:** ws (WebSocket)92 - **Fonts:** self-hosted variable woff2 (Fraunces / Literata /Plus Jakarta Sans)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) 93 110 94 ## Project structure111 ## Project-structuur 95 112 96 113 ``` 97 114 src/ 98 ├── server.js # Express bootstrap, routes mounting, WS server 99 ├── config/ # database, env loading 100 ├── db/migrations/ # SQLite schema (001-init.sql) 101 ├── middleware/ # auth, render (htmx-aware), site, rate-limit 102 ├── routes/ # per-resource Express routers 103 ├── services/ # domain logic (Prutter, Audio, Theme, Permissions, ...) 104 ├── views/ 105 │ ├── shell.ejs # outer document (head, nav, footer) 106 │ ├── partials/ # topnav, profile-header, post-card, post-tile 107 │ └── pages/ # home, post, account, admin, ... 108 ├── assets/ 109 │ ├── css/style.css # v9 stylesheet — palette tokens, components 110 │ ├── fonts/ # variable woff2 111 │ └── js/ # htmx, audio-player 112 └── websocket/ # WS server for realtime (notifications, prutter, presence) 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/ 113 123 ``` 114 124 115 ## Import125 ## Licentie 116 126 117 Importer voor bestaande bestandsgebaseerde content is gepland voor v1.1. 118 Pad: `posts/*.md` + `users.json` + `sites/*/config.json` → SQLite. 119 120 ## License 121 122 Persoonlijk project. Niet bedoeld voor publieke distributie tot verder bericht. 123 124 ## Deployed via git workflow on 2026-04-30 125 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>
Note:
See TracChangeset
for help on using the changeset viewer.
![(please configure the [header_logo] section in trac.ini)](/chrome/site/your_project_logo.png)