Three contexts, one engagement layer. Tres contextos, una capa de engagement.

Quelora is built around a clear split: the page renders the UI, a Web Worker handles network and crypto, a Service Worker handles push and offline cache. The backend is a set of small Node.js services connected by Redis, MongoDB and BullMQ. Quelora se construye sobre una división clara: la página renderiza UI, un Web Worker maneja red y crypto, un Service Worker maneja push y caché offline. El backend son servicios chicos en Node.js conectados por Redis, MongoDB y BullMQ.

In the browserEn el navegador

The widget runs in three execution contexts.El widget corre en tres contextos.

Each context has one job. The main thread paints. The Worker computes. The Service Worker survives the tab being closed.Cada contexto tiene un trabajo. El main thread pinta. El Worker computa. El Service Worker sobrevive a que se cierre la pestaña.

Main Thread (UI) DOM observation · event bus · rendering quelora.js Singleton bootstrap · config DOM observer · anchor handler quelora-app.js Lazy on first interaction UI modules · plugins UI modules Comments · Posts · Profile · Notifications · Drawers · Toasts · Emoji · GIF Core session · storage · i18n · security Plugins (lazy) gamification · chat · live · SSE eventBus SESSION_ESTABLISHED · DRAWER_STATE_CHANGE · SHOW_TOAST CHAT_MESSAGE_RECEIVED · P2P_CONNECTION_ESTABLISHED · OFFLINE_MODE Web Worker network · crypto · WASM · resilience queloraWorker.js action dispatcher fetch · JWT · resilience routing WASM modules image processor markdown parser (XSS-safe) Resilience routing HYBRID · PASSIVE · SERVER_ONLY · P2P_ONLY IndexedDB fallback · circuit breaker Trystero (WebTorrent / Nostr) peers Service Worker Push · offline cache sw.js VAPID push · deep-link routing · ql-notifications-v3 cache postMessage

BackendBackend

Small services, sharp boundaries.Servicios chicos, fronteras claras.

Each service has a single responsibility. Mongo holds data, Redis holds counters and cache, BullMQ holds background work. There is no shared runtime state between processes — only the data store.Cada servicio tiene una sola responsabilidad. Mongo guarda datos, Redis guarda contadores y caché, BullMQ guarda trabajo en background. No hay estado de runtime compartido entre procesos — solo el data store.

ServiceServicioStackStackRoleRol
quelora-public-apiNode · ExpressCommunity-facing API: auth, SSO, posts, comments, profiles, follows, notifications, GIF proxyAPI pública: auth, SSO, posts, comentarios, perfiles, follows, notificaciones, GIF proxy
quelora-dashboard-apiNode · Express · wsAdmin backend: RBAC, WordPress sync, Sentinel debug brokerBackend de admin: RBAC, sync WordPress, broker Sentinel
quelora-dashboardReact 18 SPAAdmin UIUI de admin
quelora-workerBullMQ workerEmails · push · notifications · activity · aggregation queuesEmails · push · notificaciones · activity · aggregation
quelora-jobsBullMQ workerReputation · suggestions · system · gravity-decayReputación · sugerencias · system · gravity-decay
MongoDBmongo:4.4Primary datastoreDatastore primario
Redisredis:alpineCache · counters · BullMQ broker · presenceCaché · counters · broker BullMQ · presencia
nginxnginx:mainline-alpineReverse proxy · TLS · rate limitReverse proxy · TLS · rate limit

Request flowFlujo de request

From the browser to the database — and back.Del navegador a la base de datos — y de vuelta.

Browser Widget / Dashboard SPA WordPress plugin nginx TLS · proxy rate limit public-api Express middlewares JWT · CID · captcha cache invalidator dashboard-api RBAC · WordPress sync Sentinel WS broker MongoDB posts · comments profiles · clients Redis cache · counters presence · active CID BullMQ emails · push reputation · jobs workers quelora-worker quelora-jobs

Multi-tenancyMulti-tenant

One install. Many tenants.Una instalación. Muchos tenants.

Every record carries a cid (Client ID, format QU-XXXXXXXX-XXXXX). Every query is scoped by CID. Tenant configuration lives in a single Client document — including which features and which plugins are activated.

Cada registro lleva un cid (Client ID, formato QU-XXXXXXXX-XXXXX). Cada query está scopeada por CID. La configuración por tenant vive en un solo documento Client — incluyendo qué features y qué plugins están activados.

A god role lets you operate any tenant from a single dashboard install — useful when running multiple sites or hosting communities for others.

Un rol god te deja operar cualquier tenant desde una sola instalación del dashboard — útil si corrés múltiples sitios o hospedás comunidades para terceros.

RBAC
god100Master — all tenantsMaster — todos los tenants
admin50Full client managementGestión total del tenant
editor40Content editingEdición de contenido
moderator30Moderation actionsAcciones de moderación
advertiser20Ad managementGestión de ads
analyst15Analytics read-onlyAnalytics solo lectura
user10BaseBase