Every business messaging channel, one sovereign inbox.

WhatsApp Business is live today. Every chat-channel bridge reads and writes the same per-tenant JSON store on your IIS filesystem. Bring your own API credentials, keep every message on your infrastructure, and let each channel plug in as a small transport module against a stable, standards-compliant core.

Bring-your-own credentials Filesystem storage · no database Per-tenant isolation NIS2 · DORA · CRA · GDPR aware

Why this shape

Most messaging vendors ask you to route your customer conversations through their cloud. CodeB flips the model. Your Meta app credentials live in the same per-tenant folder as your call recordings and your transcripts. If a channel provider changes terms, you rotate the credential and keep every past message. If you need to leave, the export is a folder copy.

BYO app credentials

You register with Meta yourself and drop the keys into the tenant folder. CodeB never sees anyone else's tokens.

Filesystem-only storage

Every thread and message is a JSON file under App_Data/<tenant>/xmpp-channels/. NTFS-atomic writes with .backup sidecars. Disaster recovery is a folder restore.

Per-tenant isolation

No cross-tenant reads. Sanitised slugs at the path resolver, defense-in-depth at every endpoint, superuser bypass logged loudly.

Standards-compliant core

The message schema is a strict subset of XEP-0227 semantics. Any past XMPP archive imports cleanly; any future XMPP export leaves cleanly.

What ships today

The plumbing is proven and running on real tenants.

Common foundation

Per-tenant path resolver, atomic JSON writer, canonical ChannelMessage schema, thread meta, HMAC verifier, metering + license hooks. Every real channel plugin sits on top.

Simulator channel

Walking-skeleton bridge that exercises the pipeline end-to-end without any external API. Useful for smoke tests, operator training, and integration testing before your real API keys arrive.

Admin console

Operator UI at /chat-channels.html. Config panel, thread list, message viewer, simulate-inbound + send forms, mark-read, and superuser-only GDPR erasure.

Channels

Each channel runs with your own credentials from the channel provider.

ChannelStatusOpen protocol?When
Simulator
Walking skeleton, no external calls.
Live todayN/AToday
WhatsApp Business
Meta Cloud API v20.0 · per-tenant Meta App credentials in App_Data/<tenant>/chat-whatsapp/config.json · HMAC X-Hub-Signature-256 verify · appsecret_proof on every Graph call · media (image/audio/video/document) fetched from lookaside and cached locally · per-message-id dedup · shared “WhatsApp Inbox” group thread in chat.html · admin UI at /whatsapp-admin.html.
Live todayYesToday

How each new channel plugs in

A channel plugin is a small transport module. It subclasses the shared config, verifies the vendor's inbound signature, builds the canonical ChannelMessage, and hands it to the shared store. Outbound calls the vendor API only when dry-run is off. Every step is LOUD-logged so an operator can trace any conversation end-to-end.

1. Config subclass

Add the fields the channel needs (for example the Meta app id) on top of the shared enabled / dry-run / rate-limit base.

2. Inbound handler

Parse the webhook or the IMAP fetch, verify HMAC, build a ChannelMessage, call the store.

3. Sender

Respect dry-run, call the external API, update Status. Store persists both dry-run and real sends.

4. REST + UI

Copy the Simulator .ashx + admin.html pair; every channel gets its own small operator page with the same shape.

Frequently asked

Do I need to give CodeB my Meta API key?

No. CodeB is deployed inside your infrastructure. You register your own app credentials with the channel provider and drop them into the per-tenant config folder. CodeB never sees API tokens for any account other than yours.

Where does CodeB store my messages?

On your IIS filesystem, under App_Data/<tenant>/xmpp-channels/<channel>/. Every write is NTFS-atomic (File.Replace) with a .backup sidecar. There is no database dependency, so disaster recovery is a folder restore.

What happens when I disable a channel?

Inbound webhooks stop being processed and outbound sends refuse. Existing threads and message history remain readable in the admin console. Nothing is deleted until an operator with erasure rights runs the GDPR delete-thread action.

Can I export my message history?

Yes. The on-disk JSON layout is a strict subset of XEP-0227 semantics, so a per-tenant XML dump is a small transform. You are never locked in to CodeB and never at risk of vendor lock-in from your channel providers either.

Ready to see the pipeline?
Sign in to the admin console and try the Simulator channel end-to-end — no API key needed.
Open the operator console

Built by the CodeB team at Aloaha Limited. Every messaging surface is designed with NIS2, DORA, the EU Cyber Resilience Act and GDPR in mind — the same posture that governs the rest of the CodeB stack. Nothing on this page implies certification; it describes the sovereign-by-design defaults you inherit when you deploy CodeB inside your own infrastructure.