Skip to content

Pokled/nodyx

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

605 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Nodyx

Nodyx

"The network is the people."

The self-hosted community platform you actually own.
Forum + Chat + Voice + P2P + Canvas + Homepage Builder + Widget SDK — one server, one community, forever.

Version License: AGPL-3.0 CI Stack Ko-fi

⭐ If Nodyx resonates with you, a star helps others find it — and keeps us going.


Hey, before you scroll. Nodyx isn't trying to fight Discord, and it isn't trying to be the only open alternative. There are great projects out there. Matrix, Stoat, Fluxer, Mattermost, Rocket.Chat, Discourse, Haven and others. And we genuinely want you to know about them. We list them, with their GitHub repos, on a page we wrote ourselves: → Why Nodyx (and the other alternatives we respect).

The fight isn't between us. It's between locked silos and communities that actually own themselves. Pick the tool that fits you. We'll cheer either way.

A tool that doesn't have to worry about the moods of a board of directors or the whims of an investor.

🌍 Translations (click to expand)
Language Translation
Français Un outil qui n'a pas à craindre les humeurs d'un conseil d'administration ni les caprices d'un investisseur.
Deutsch Ein Werkzeug, das sich nicht um die Launen eines Vorstands oder die Einfälle eines Investors kümmern muss.
Español Una herramienta que no tiene que preocuparse por los humores de un consejo de administración ni por los caprichos de un inversor.
Italiano Uno strumento che non deve preoccuparsi degli umori di un consiglio di amministrazione o dei capricci di un investitore.
Nederlands Een tool die zich geen zorgen hoeft te maken over de stemmingen van een raad van bestuur of de grillen van een investeerder.
Português Uma ferramenta que não precisa se preocupar com os humores de um conselho de administração ou com os caprichos de um investidor.
Polski Narzędzie, które nie musi się martwić nastrojami zarządu ani kaprysami inwestora.
Русский Инструмент, которому не нужно беспокоиться о настроениях совета директоров или капризах инвестора.
中文 一个不必担心董事会情绪或投资者心血来潮的工具。
日本語 取締役会の気分や投資家の気まぐれを気にする必要のないツール。
Nodyx — Homepage Builder

Why Nodyx

  • Most communities don't own where they live. Years of history, knowledge, and memories sit on platforms that can change rules, ban accounts, or disappear. That's not malice, that's how closed systems work by default.
  • Self-hosting today is fragmented. Forum, real-time chat, voice, and a public homepage usually mean stitching five separate tools together.
  • Nodyx ships them in one install so a community can fully own its presence — text, voice, and homepage — on hardware its admins control.

One command. Your server. Forever.

Built on

Layer Technology
Backend API TypeScript + Fastify v5 + Socket.IO — nodyx-core/
Frontend SvelteKit 5 + Tailwind v4 + TipTap editor — nodyx-frontend/
Database PostgreSQL 16 (FTS, migrations) + Redis 7 (sessions, presence)
Voice relay nodyx-turn — Rust STUN/TURN (replaces coturn, 2.9 MB binary)
P2P tunneling nodyx-relay — Rust TCP tunnel (home server, no open ports)
Real-time WebRTC P2P mesh + Socket.IO fallback
Auth (optional) Nodyx Signet — ECDSA P-256 passwordless PWA — nodyx-authenticator/
Process manager PM2 under a dedicated nodyx system user
Reverse proxy Caddy — automatic Let's Encrypt TLS

No Docker required. The installer deploys Node.js + PostgreSQL + Redis + Caddy + PM2 natively. docker-compose.yml is provided for local development only.


The internet broke something.

Closed platforms ended up holding more conversations than the open web ever did. Not by malice — by default. They were free, easy, and everyone was already there.

But ten years of discussions, tutorials, and collective knowledge now sit behind login walls. Invisible to search engines. Bound to terms of service written in a Delaware courtroom. Gone when the platform decides.

You never owned any of it.


Nodyx gives it back.

One command. Your server. Your rules. Your community — permanently.

curl -fsSL https://nodyx.org/install.sh | bash

Works on a Raspberry Pi behind a home router. No domain. No open ports. No cloud account.


Where each project shines

The community-tools landscape isn't a battle. Each project optimizes for different things, and the right pick depends on what you're building. Here's how we'd recommend it to a friend:

Project What it does best Where it fits
Discord Real-time voice + chat for closed groups, mobile-first, 10+ years of bot ecosystem If your community is private and ad-hoc
Matrix (Element) Federated protocol with bridges to almost everything (Discord, Slack, Telegram, IRC, ...) If interoperability is non-negotiable
Discourse Indexed, searchable forums and knowledge bases If long-form async discussion is your core
Mattermost / Rocket.Chat Enterprise compliance, Slack-replacement at scale If you have a procurement team
Haven Privacy-first chat, zero cloud, native Windows/Linux/Android clients, no telemetry If keeping every byte on your own machine matters most
Stoat (ex-Revolt) / Fluxer Discord-shaped UI, easy migration If your members already know Discord
Lemmy Federated, Reddit-style threaded forums If you want a fediverse-native presence
Nodyx Forum + chat + voice + canvas + homepage builder, in one self-hosted install with a P2P relay for home servers If you want to fully own a multi-format community on your own hardware

Nodyx is the only project combining all of those formats in a single install — but if you only need one or two, another tool above may fit you better.

Read our honest take, including the alternatives we respect →

What's inside the Nodyx single install

  • Indexed forum (canonical URLs, JSON-LD, sitemap, Google-friendly)
  • Real-time chat with replies, pins, reactions, unfurls
  • P2P voice channels — zero Big Tech relay
  • Collaborative P2P canvas (whiteboard)
  • WebRTC DataChannels for instant typing/reactions
  • Home server support — no port forwarding, no domain required
  • Federated community directory + cross-instance global search
  • Asset library (frames, badges, banners, profile themes)
  • Ephemeral whisper rooms
  • Passwordless login (ECDSA P-256 PWA — Nodyx Signet)
  • Collaborative jukebox (YouTube queue)
  • Event calendar (OSM maps, RSVP, SEO)
  • Homepage Builder with 11 layout zones, drag & drop
  • Widget Store — install external widgets via .zip
  • Widget SDK — build custom widgets, no framework needed

Homepage Builder + Widget SDK

Nodyx ships with a drag-and-drop Homepage Builder and a complete Widget SDK — two features that no other self-hosted community platform offers.

11 layout zones

Place widgets anywhere on your homepage. Positions include:

banner          → full-width top announcement strip
hero            → main hero section
stats-bar       → community counters (members, online, posts)
main            → above main content
sidebar         → right column (join card, etc.)
half-1 / half-2 → 2-column grid
trio-1/2/3      → 3-column grid
footer-1/2/3    → footer columns
footer-bar      → full-width footer strip

4 native widgets (Phase 1)

Widget Description
Hero Banner Animated hero with live/event/night variants resolved server-side
Stats Bar Live member count, online count, thread count with animated counters
Join Card CTA card for guests, hidden for logged-in members
Announcement Banner Closeable info/warning/error strip with icon

Widget Store — install in one click

Any developer can package a widget as a .zip and install it on any Nodyx instance:

my-widget-1.0.0.zip
├── manifest.json     ← id, label, version, schema (config fields)
└── widget.iife.js    ← Web Component — Shadow DOM isolated

The admin panel handles upload, validation, extraction and activation. No rebuild, no deploy.

Widget SDK — build your own, zero build tools

Widgets are standard Custom Elements (Web Components). Plain JavaScript, no React, no Vue, no npm.

class MyWidget extends HTMLElement {
  connectedCallback() { this._render() }

  _render() {
    var cfg = JSON.parse(this.dataset.config || '{}')
    if (!this.shadowRoot) this.attachShadow({ mode: 'open' })
    this.shadowRoot.innerHTML = `<div>Hello ${cfg.title}</div>`
  }
}
customElements.define('nodyx-widget-my-widget', MyWidget)

Full step-by-step guide for non-developers → nodyx.dev/create-widget


The P2P Stack — 100% handwritten Rust

This is where Nodyx goes further than anyone else.

nodyx-turn — Rust STUN/TURN server (replaces coturn)

coturn is the industry standard — a mature C server used by Signal, Jitsi, Matrix. We replaced it with a 2.9MB Rust binary that does exactly what Nodyx needs. Nothing more.

RFC 5389 (STUN) + RFC 5766 (TURN) + RFC 6062 (TURN-over-TCP)
HMAC-SHA1 time-based credentials (username={expires}:{userId})
MESSAGE-INTEGRITY on all responses (RFC 5389 §10.3) — Firefox/Chrome compliant
Rate limiting + allocation quotas (MAX_LIFETIME=300s) + ban map
tokio async runtime — UDP:3478 + TCP:3478 (VPN/firewall bypass)
Zero coturn dependency on production

nodyx-relay — Rust P2P TCP tunnel (no domain, no open ports)

A Raspberry Pi under your desk. No domain. No router port forwarding. No Cloudflare account. Run Nodyx anyway.

nodyx-relay server  →  listens TCP:7443 + HTTP:7001
nodyx-relay client  →  persistent TCP tunnel → exposes local port 80
  • Automatic reconnection with exponential backoff (1s → 30s max)
  • JWT authentication per instance
  • Routing by slug: yourclub.nodyx.org → proxied to the Pi behind your router
  • Validated on a real Raspberry Pi 4 with zero open ports ✅

WebRTC DataChannels — P2P without the server

Messages between peers that never touch the server.

  • Instant typing indicators — < 5ms local latency (vs 80–200ms via server)
  • Optimistic emoji reactions — appear instantly, server confirms in background
  • P2P file transfer — assets shared directly between peers
  • Graceful fallback — if DataChannel unavailable (strict NAT), Socket.IO takes over transparently

NodyxCanvas — Collaborative whiteboard (v2.2)

NodyxCanvas — collaborative whiteboard

Draw, annotate, and build together in real time — directly inside voice channels. Synced via Socket.IO CRDT. Every op is persistent (PostgreSQL JSONB snapshot).

CRDT Last-Write-Wins per element (UUID + timestamp)
canvas:op / canvas:clear / canvas:cursor / canvas:chat  →  Socket.IO
Voice-aware cursors: peer cursor pulses when they're speaking
Real-time participants panel with live tool + avatar
Board-scoped chat (independent from the voice channel chat)

Tools (v2.2):

Tool Key Description
Select V Move + resize with 8 handles (corners + midpoints)
Pen P Freehand drawing — color, width, opacity
Text T Rich inline text — bold/italic/underline/strike, align, font, size
Sticky N Post-it note — 8 colors, multiline
Rect / Circle R / C Fill + stroke with independent colors and width
Shape S Advanced shapes — triangle, diamond, star, hexagon, cloud
Arrow A Styled arrows — solid/dashed/dotted, 3 cap types
Connector X Smart connectors — straight/bezier/elbow, independent start+end caps
Image I Drag & drop or file picker → uploaded to /assets, rendered on canvas
Frame F Named section — label + dashed border, groups elements visually
Eraser E Point eraser

Canvas features:

  • Undo / Redo — 50-op stack per session, Ctrl+Z / Ctrl+Y / Ctrl+Shift+Z
  • Snap to grid — 28px world grid, toggleable (G)
  • Zoom — Ctrl+Scroll, pinch, or toolbar buttons (5% → 1000%)
  • Pan — Space+drag or middle-click drag
  • Minibar bottom — zoom %, grid toggle, snap toggle
  • Export PNG — downloads full canvas, posts recap to chat channel

Screenshots

Community · Builder · Admin · Features — all running on a single install

— Community Experience —
Homepage — Grid Builder Forum
Homepage with Grid Builder widgets Forum — categories, threads, rich editor
Real-time Chat Voice Channels — P2P WebRTC
Real-time text chat Voice channel with P2P mesh

— Homepage Builder —

Homepage Builder — drag & drop, 11 zones, live preview

Drag-and-drop grid editor — 11 layout zones, live preview, per-widget audience rules and scheduling


Widget Store — install via .zip Module Management
Widget Store — one-click .zip install Module management — 26 activatable modules

— Features —
Cross-Instance Search Polls — Forum & Chat
Cross-instance federated search engine Polls with real-time results
Wiki Asset Library
Community wiki Asset library — frames, badges, banners

Quick Start

Prerequisites

The installer handles everything automatically. Your system only needs curl and git to get started.

# Ubuntu / Debian
apt-get install -y git curl

PM2 memory limits are automatically tuned to your machine:

Total RAM nodyx-core nodyx-frontend Auto-swap Works on
< 1.5 GB 256 MB 192 MB 2 GB created Raspberry Pi 1 GB
1.5 – 3 GB 384 MB 256 MB 1 GB if needed RPi 4 / small VPS
≥ 3 GB 512 MB 512 MB 1 GB if needed Standard VPS ⭐

Raspberry Pi: use a 64-bit OS (Raspberry Pi OS 64-bit or Ubuntu ARM64). 32-bit is not supported.

One-click install

curl -fsSL https://nodyx.org/install.sh | bash

Or clone first:

git clone https://github.com/Pokled/Nodyx.git && cd Nodyx && sudo bash install.sh

The installer offers three network modes:

Mode Requirements Result
Nodyx Relay Nothing — outbound TCP only yourclub.nodyx.org in minutes
Open ports Ports 80 + 443, domain or IP Let's Encrypt HTTPS, full control
Cloudflare Tunnel CF account + own domain Your custom domain, no open ports

Nodyx Relay is the recommended default — works on a Raspberry Pi behind a home router. No domain. No port forwarding. No cloud account. Just run the script.

Installs automatically: Node.js 20, PostgreSQL 16, Redis 7, Caddy (HTTPS), PM2, nodyx-turn (Rust STUN/TURN).
Generates secrets, runs all DB migrations, creates your admin account. No Docker. No manual configuration.

Supported: Ubuntu 22.04 / 24.04, Debian 11 / 12 / 13.

Complete installation guide (EN)
Guide d'installation complet (FR)

Updating an existing instance

cd /var/www/nexus && git pull && \
  cd nodyx-core && npm run build && sudo -u nodyx pm2 restart nodyx-core && \
  cd ../nodyx-frontend && npm run build && sudo -u nodyx pm2 restart nodyx-frontend

Database migrations are applied automatically on startup — no manual SQL needed.


Architecture

Repository layout

nodyx/
├── nodyx-core/          → Fastify v5 + TypeScript REST API, Socket.IO, DB migrations
├── nodyx-frontend/      → SvelteKit 5 + Tailwind v4 SPA (SSR + client hydration)
├── nodyx-p2p/           → Rust workspace: nodyx-relay (TCP tunnel) + nexus-turn (STUN/TURN)
├── nodyx-authenticator/ → Nodyx Signet — ECDSA P-256 passwordless auth PWA (SvelteKit 5)
├── nodyx-hub/           → Olympus Hub — internal admin dashboard (SvelteKit 5)
├── nodyx-docs/          → nodyx.dev documentation site (SvelteKit 5)
├── docs/                → Markdown docs (EN + FR) — served by nodyx-docs
├── install.sh           → One-click installer (Node + PG + Redis + Caddy + PM2, no Docker)
├── ecosystem.config.js  → PM2 process config (production)
└── docker-compose.yml   → Local development only — not used in production installs

Federation — how it works

Each Nodyx instance runs a Gossip Protocol scheduler that periodically pings the central directory (nodyx.org/api/directory). Instances share their public metadata (name, slug, URL, member count) and are discoverable via the /discover page on any instance. Events (calendar) federate across instances through the same gossip mechanism. There is no dependency on ActivityPub — the protocol is intentionally minimal and self-contained.

Runtime diagram

┌─────────────────────────────────────────────────────────────┐
│                        Your Browser                         │
└──────────────┬──────────────────────────────┬───────────────┘
               │ HTTP / WebSocket             │ WebRTC P2P
               ▼                             ▼
┌──────────────────────────┐    ┌────────────────────────────┐
│   nodyx-core (Fastify)   │    │  Direct peer connection    │
│   nodyx-frontend (Svelte)│    │  DataChannels + Canvas     │
│   PostgreSQL + Redis     │    │  Voice + Screen share      │
└──────────────────────────┘    └────────────────────────────┘
               │                             │
        ┌──────┴──────┐               ┌──────┴──────┐
        │ nodyx-relay │               │ nodyx-turn  │
        │ (Rust TCP)  │               │ (Rust TURN) │
        │ home server │               │ NAT bypass  │
        └─────────────┘               └─────────────┘
Layer Technology
API TypeScript + Fastify v5 — nodyx-core/
Database PostgreSQL 16 · 53 migrations — automatic on startup
Cache / Sessions Redis 7 — JWT sessions, presence, rate-limiting
Full-text search PostgreSQL FTS (tsvector + GIN) — cross-instance via Gossip
Frontend SvelteKit 5 + Tailwind v4 — nodyx-frontend/
Editor TipTap (WYSIWYG)
Real-time Socket.IO (polling-first, WebSocket upgrade)
Voice WebRTC P2P mesh — no central audio relay
TURN relay nodyx-turn — Rust 2.9 MB, replaces coturn
P2P relay nodyx-relay — Rust TCP tunnel, runs on home servers
Collaborative canvas NodyxCanvas — CRDT LWW, Socket.IO sync, 11 tools, resize handles, undo/redo
Homepage Homepage Builder — 11 zones, drag & drop, visibility rules
Widgets Widget Store — .zip install + Widget SDK (Web Components)
Passwordless auth Nodyx Signet — ECDSA P-256 PWA — nodyx-authenticator/

What's built. What's coming.

v0.1 → v1.3 — Foundation
Feature Version
Forum (categories, threads, posts, reactions, tags) v0.1
Full-text search (PostgreSQL FTS) v0.1
Real-time chat (Socket.IO) v0.1
Voice channels (WebRTC P2P) v0.1
Screen sharing + clip recording v0.2
Admin panel v0.2
SEO (sitemap, RSS, JSON-LD) v0.3
One-click installer v0.4
Instance directory + auto DNS v0.5
nodyx-relay — Rust P2P TCP tunnel v0.5
Community asset library (frames, banners, badges) v0.6
Feature Garden — community voting v0.6
Federated asset directory (cross-instance sharing) v0.7
Whispers — ephemeral encrypted chat rooms (1h TTL) v0.7
P2P DataChannels — instant typing, optimistic reactions v0.8
nodyx-turn — Rust STUN/TURN replacing coturn v0.9
NodyxCanvas — collaborative P2P whiteboard v0.9
Profile theme system — 6 presets, per-user app-wide CSS engine v1.0
Mobile-responsive UI v1.0
Chat — Reply/quote, pinned messages, link previews, @mention badge v1.1
Presence — Custom status + offline members list v1.1
Direct Messages (DMs) — private 1:1 conversations v1.2
Polls — in chat and forum, 3 types, real-time results v1.2
Ban system — IP ban, email ban, multi-layer enforcement v1.2
nodyx-turn — TURN-over-TCP (RFC 6062) v1.3
Voice — Relay failover + Opus tuning v1.3
v1.4 → v1.9 — Security & Polish
Feature Version
Thread slug URLs + full SEO (canonical, OG, JSON-LD, sitemap) v1.4
Category slugs + subcategories v1.5
Global Search — cross-instance FTS index, /discover UI v1.5
Event Calendar — CRUD, RSVP, OSM maps, cover image, rich snippets v1.6
Gossip Protocol — event federation across instances v1.6
Nodyx Signet — passwordless ECDSA P-256 auth PWA v1.7
QR enrollment + Optimistic UI + Notification center v1.7
Tasks / Kanban — per-community boards, drag & drop, deadlines v1.8
Update alert + Instance version display v1.8
Full paranoid security audit — 38 vulnerabilities fixed v1.8.2
Honeypot — 25+ scanner paths trapped; tarpit; geolocation; DB logging v1.9.0
fail2ban — 5 jails: SSH, brute force, honeypot (7d), permanent blacklist v1.9.0
Argon2id — OWASP 2026 password hashing v1.9.0
2FA TOTP (RFC 6238) + 2FA via Nodyx Signet v1.9.1
Credential harvesting traps + Canary files + Canvas fingerprint v1.9.2
Slowloris inverse — byte-by-byte streaming burns attacker threads 45–90s v1.9.2
Olympus Hub security dashboard v1.9.2
Process isolation — all processes under nodyx system user v1.9.4
181 Node.js tests + 18 Rust unit tests + CI pipeline v1.9.4
Living Profile — Generative banner (Lissajous/FNV-1a), Reputation rings (SVG animated), Activity heatmap v1.9.5
Parallax hero, rotating avatar arcs, Timeline, /reputation transparent formulas v1.9.5
Forum redesign — flat design, zero radius, full-width content v1.9.5
v2.0 — Private & Sovereign Communications 🔒
Feature Version
DM E2E encryption — ECDH P-256 + AES-256-GCM, private key never leaves the browser (IndexedDB non-extractable) v2.0
ESY Barbare layer — per-instance byte-permutation obfuscation on top of AES-GCM, server sees only opaque ciphertext v2.0
E2E shield — live indicator in DM header (green pulse = active, orange = partial), ESY fingerprint tooltip v2.0
Barbarize animation — sender sees obfuscated text during encryption, receiver sees it decipher in real-time v2.0
DM message edit — inline edit with re-encryption for E2E messages, real-time propagation via socket v2.0
DM message delete — real-time soft-delete propagated to all participants instantly v2.0
DM full-width redesign — split layout, glassmorphism sidebar, iMessage-style bubbles, grouped messages v2.0
AudioContext shared — single context for all peer VAD (Chrome 6-context limit fix) v2.0
v2.4 — Backup System + Live Maintenance Mode 💾
Feature Version
Backup admin UI/admin/backups page with storage indicator, table of archives, per-row Download / Verify / Restore / Delete actions, sidebar shortcut 💾 v2.4
Create backuppg_dump --format=custom --compress=9 + tar -czf, SHA-256 checksum, manifest with stats. Toggle to include or exclude uploaded files v2.4
Restore with safety net — atomic pg_restore --single-transaction --clean --if-exists, automatic pre-restore snapshot protected for 24h (rollback in one click), type-to-confirm slug + 5s countdown, ordered list of steps shown in the modal v2.4
Dry-run — verify checksum + format-version compat + tar structure without touching DB or filesystem. Result inline (✓ restorable / ✗ exact error). Audited as metadata.dry_run = true v2.4
Verify — recompute SHA-256 + check archive structure on demand, badge visible on the row v2.4
Audit log — every sensitive action (create / restore / download / delete / verify / settings) logged with user + IP + user-agent. Standalone /admin/backups/audit page, indexed for post-compromise forensics v2.4
ReindexPOST /admin/backups/reindex scans the directory, parses each .tar.gz manifest in-memory, INSERTs missing rows. Recovery for orphan archives v2.4
Live Maintenance Mode — Redis flag nodyx:maintenance:meta set during create/restore. Global onRequest hook returns 503 on writes (registration, posts, uploads) with a structured payload. Reads, admin endpoints and Socket.IO stay open. Auto-clear with safety belt (30 min create, 60 min restore) v2.4
Maintenance banner — sticky amber banner at the top of every page when active, polled every 15 s. "🛠️ Sauvegarde en cours, les nouvelles inscriptions et publications sont temporairement désactivées" v2.4
System tables excluded from dumpbackups, backup_audit_log, backup_settings, schema_migrations are never inside an archive, so a restore can't wipe its own safety net. Discovered live during the first prod test (see The Yannick Story in CHANGELOG) v2.4
Redis lock with Lua releasebackup:lock (NX EX 3600) prevents concurrent backups or backup-during-restore. Released atomically via Lua so a process can never delete a lock owned by someone else v2.4
path.basename() on download — defuses path traversal attempts on the filename param v2.4
13 vitest tests — service-level invariants (path traversal, retention clamps, format-version refusal, protected-bypass), 194 total, 0 regression v2.4
Spec promoted to docs/specs/014-backup-system/SPEC.MD, indexed by nodyx.dev v2.4
v2.3 — Universal Media Player + Builder Catalog Fusion 🎬
Feature Version
Universal Media Player — auto-detects YouTube, Vimeo, Dailymotion, Twitch (live / VOD / clip), SoundCloud, Spotify, plus direct .mp4 / .webm / .mp3 hosted files. Single URL field, platform inferred at render time v2.3
Builder catalog fusion — installed widgets now appear in the Grid Builder picker next to native plugins. New CatalogEntry aggregation layer with checkbox → boolean field type canonicalization v2.3
Tunnel installer hardening (#23) — 12 fixes for Pangolin mode: Caddy site-address :80 { bind ... } rewrite (Host filter root cause), atomic Caddyfile regen on --repair, UFW RFC1918 rules, doctor false-positive gate v2.3
nodyx-doctor — Method A (--network host) no longer triggers a misleading "LAN IP not bound" warning v2.3
nodyx-relay v0.1.4 — TCP keepalive + read deadline to detect dead sessions v2.3
Doc search rewrite — heading-aware index with deep-link anchors, scrollspy TOC sidebar, slug correctness pass (108 broken TOC links + 60 leading-dash ids cleaned) v2.3
Why-Nodyx posture — new positioning page listing alternative platforms (Matrix, Stoat, Fluxer, Haven, ...), README aligned, "silos vs liberty, not Nodyx vs X" framing v2.3
i18n — German (de.json) + Spanish (es.json) translations, native review for both v2.3
Homepage Builder polish — Twitch stream + Articles showcase widgets, clickable (?) info panel on field labels v2.3
Voice kick — owners, admins and moderators can remove a user from a voice channel v2.3
Community Pulse — co-presence trail and wave visualization page v2.3
Nodyx Stars — proper recognition system for external contributors with public CONTRIBUTORS.md, avatar block in README, polish-trail transparency v2.3
v2.2 — NodyxCanvas major upgrade 🎨
Feature Version
Canvas UI refactor — 4 dedicated components: CanvasLeftToolbar, CanvasTopBar (contextual per tool), CanvasBottomBar, CanvasRightPanel v2.2
Undo / Redo — 50-op stack, Ctrl+Z/Y/Shift+Z, buttons with active/disabled state. Fixed CRDT LWW timestamp so undo always applies v2.2
Snap to grid — 28px world grid, toggle (G key), visual grid overlay v2.2
Rich text — bold, italic, underline, strikethrough, alignment (left/center/right), 3 font families (sans/serif/mono), 12 font sizes v2.2
Advanced shapes — triangle, diamond (losange), star, hexagon, cloud — rendered via Path2D, fill + stroke + label v2.2
Connectors — straight / bezier / elbow lines, independent start & end caps (arrow/dot/none), solid/dashed/dotted style, 2-click creation v2.2
Frames / Sections — named rectangular regions with dashed border, label rendered above, inline name input on creation v2.2
Image insertion — drag & drop from desktop or file picker, uploaded to /api/v1/assets, cached and rendered on canvas, proportional sizing v2.2
Resize handles — 8 handles (corners + midpoints) on selected rect/circle/shape/frame/image/sticky elements, live preview, snap-aware v2.2
Real user avatars — participant panel shows real user avatars (with initials fallback) and their active tool v2.2
Board chat — real-time chat scoped to the canvas board, independent from the voice channel chat v2.2
Full keyboard shortcuts — V P T N R C S A X I F E (tools) + G (grid) + Ctrl+Z/Y/Shift+Z (undo/redo) + Delete + Escape v2.2
Portal rendering — canvas mounted on document.body via portal action, bypasses CSS transform ancestors that break position:fixed v2.2
v2.1 — Homepage Builder + Widget SDK 🧩
Feature Version
Homepage Builder — drag-and-drop admin, 11 layout zones (banner, hero, stats-bar, main, sidebar, half ×2, trio ×3, footer ×4) v2.1
Plugin registry — each native widget is a self-contained file, zero core changes to add new ones v2.1
4 native widgets Phase 1 — Hero Banner (live/event/night variants), Stats Bar (animated counters), Join Card, Announcement Banner v2.1
Visibility rules — per-widget audience (all / guests / members) + scheduled start/end dates v2.1
Widget Store — install external widgets via .zip upload (XHR progress bar, 4-step validation, extraction whitelist) v2.1
Dynamic Widget Loader — Web Components loaded at runtime, no rebuild, no deploy v2.1
Widget SDK — plain JS Custom Elements (Shadow DOM), manifest.json schema → auto-generated config fields in builder v2.1
Demo widget: Video Player — YouTube / Vimeo / MP4 with live preview, source viewer, one-click install v2.1
nodyx.dev/create-widget — step-by-step guide for non-developers (7 steps, EN) v2.1

Coming

Feature Notes
Canvas — Ghost Mode — anonymous brainstorming: contributions appear under random pseudonyms, author revealed at end Sprint D
Canvas — Audio Stickies — voice note recorded directly on the canvas, waveform rendered as post-it Sprint D
Canvas — Contextual Chat — threaded discussion anchored to a canvas zone, spatially indexed Sprint D
More native widgets — Countdown, Leaderboard, Latest Threads, Featured Events, Jukebox Player Phase 2
Widget marketplace — community-published widgets, ratings, one-click install from directory
Nodes — durable structured knowledge, community-validated via Garden SPEC 013
Module system — 26 activatable modules from admin panel (Joomla-style CMS) Spec
DM reactions — emoji reactions on private messages
Discord import — bulk import channels, threads, reactions, avatars
Mobile (Capacitor) / Desktop (Tauri)
Rust migration — nodyx-server (Axum) replacing nodyx-core progressively

The Vision

Nodyx is not a Discord alternative.

It is a different answer to a different question.

Discord asked: "How do we grow fast and capture communities?"
Nodyx asks: "How do we give communities sovereignty over their own existence?"

Every Nodyx instance is a sovereign node. It runs where you run it — a VPS, a Pi, a spare laptop. It stores what you choose to store. It shares what you choose to share. It shuts down when you decide — not when a company pivots.

The internet was decentralized by design. SMTP, IRC, NNTP — anyone could run a server and talk to anyone else's server. That was the promise. Big Tech centralized it into silos over two decades.

Nodyx is the promise, kept.

And it spreads the same way. Each instance that goes live exposes others to the idea. Each public event indexed by Google brings in someone new. Each community that chooses sovereignty inspires another.

"Fork us if we betray you." — AGPL-3.0


Documentation

Language Docs
EN English nodyx.dev · docs/en/
FR Français docs/fr/
ES Español coming soon
DE Deutsch coming soon

Contributing

Nodyx belongs to its community.

  1. Browse open Issues or open a Discussion
  2. Read CONTRIBUTING.md before opening a PR
  3. Commits follow Conventional Commits, written in English

Contribute freely — no prior validation required:

docs/        →  improve or translate documentation
docs/ideas/  →  design thinking, UX proposals, new ideas

The core (nodyx-core/src/) requires discussion first — open an Issue.


🌟 Nodyx Stars — Contributors

Every external contribution earns a star. Every Star goes on our Hall of Fame — with avatar, profile link, and rank.

Recognition is not optional here. Open source without recognition is just free labor, and that's not how we roll.

🏆 First external contributor

Pranto

Pranto Goswamee : 🌟 × 1, added Ctrl/Cmd + D canvas duplication (PR #11).

First external contribution to Nodyx ever. Thank you 🙏


🎯 First Regular

waazaa-fr

waazaa-fr : 🌟 × 2, found and reported two installer bugs back to back (#14, #15), both fixed within hours.

Reliable bug hunters keep the installer honest. Merci waazaa 🙏


🇪🇸 Hablas español? Now Nodyx does too

naranco66

naranco66 : 🌟 × 3, brought Spanish (es-ES) to Nodyx via PR #16 (719 strings, full key + placeholder parity), came back with PR #19 for a native review of the community pulse strings, then jumped from i18n to ops with PR #22 : fixed orphaned nexus-* references in docker-compose.yml and an Alpine font path mismatch that broke the frontend Docker build.

Third locale, third bridge to the world, and a Docker setup that actually works out of the box. Gracias naranco 🙏


🇩🇪 Sprichst du Deutsch? Now Nodyx does too

forke24x7

forke24x7 : 🌟 × 5, brought German (de) to Nodyx by attaching a hand-reviewed de.json (741 strings, native review) on issue #5, triggered the Pangolin / alternative-tunnel support work via issue #18, caught a frontend build regression in install_tunnel.sh on day-one Pangolin testing (#21), ran a meticulous second-pass test of PR #24 that surfaced two remaining tunnel-installer issues (#23), and ultimately pinned the blank-page root cause with a byte-count diagnostic that revealed the rendered Caddy site address was a Host filter, not a bind (5445e8b).

Fourth locale, a feature request that made the installer better for the whole self-hosting community, two consecutive regression hunts on the tunnel installer, and a clean root-cause diagnosis on a non-obvious Caddy bug. Danke forke 🙏


🇨🇿 The docs search hunter

Lukáš Melega

Lukáš Melega : 🌟 × 2, reported that the docs search couldn't find "minimum requirements" (discussion #12) which triggered a heading-aware index rewrite (882099d), then came back with a one-line precision report : "clicking the search input requires a second click", which surfaced a focus bug + 108 broken TOC links + 60 leading-dash heading ids that nobody else had noticed. The full audit pass landed in a429fa3.

The kind of careful observation that turns a vague annoyance into a five-minute fix, twice in a row. Děkuji Lukáš 🙏


👉 See all contributors →


Support Nodyx

Nodyx is built by one developer, with no VC money and no strings attached. If the project is useful to you, consider supporting it:

Support on Ko-fi

Your support helps cover server costs and keeps Nodyx 100% free and open-source.


License

AGPL-3.0 — The strongest open source license for networked software.

If you use Nodyx, even over a network, your modifications must be open source. If Nodyx ever betrays its principles, this license lets anyone fork it and continue in the spirit of the Manifesto.


Born February 18, 2026.

"Fork us if we betray you."

About

Self-hosted community platform Forum + Chat + Voice + P2P + Canvas + Homepage Builder. One server, one community, forever. AGPL-3.0. Discord alternative | Private Chat.

Topics

Resources

Security policy

Stars

Watchers

Forks

Sponsor this project

Packages

 
 
 

Contributors