Architecture

Three layers: a frontend host, a Rust core, and PostgreSQL. Modules plug into them as standalone processes.

Overview #

Frontend host (React 19) ── import map ──► modules chargés au runtime (/modules/<id>/entry.js)
        │
Core (Rust / Axum)  ── reverse-proxy + events + auth + storage ──►  modules (processus séparés)
        │
PostgreSQL 16 (schéma par module · LISTEN/NOTIFY · jobs SKIP LOCKED)

The core #

The core (the kubuno-core crate) handles authentication (JWT + refresh tokens), storage (the StorageBackend trait: local or S3), real-time events, the per-user WebSocket and the reverse proxy to the modules. It exposes shared registries that modules feed on the frontend side.

Ports #

The core listens on 8080. Each module has a fixed port on 127.0.0.1:

ModulePortModulePort
drive3101contacts3110
calendar3102mail3111
photos3103code3112
notes3104media3113
office3105keestore3114
paintsharp3106maps3115
assistant3107tasks3116
app3119wiki3120
books3121stt3122
p2pnas3123build3124
forms3108forum3117
chat3109flow3118

PostgreSQL, three jobs in one #

  • Database — a dedicated schema per module, no tables outside it.
  • Event bus — via LISTEN/NOTIFY.
  • Job queue — via SELECT … FOR UPDATE SKIP LOCKED.
Tip

No Redis, no external broker: PostgreSQL is enough. This is a deliberate architectural choice.