Gateways are the services your app talks to when it sends a WhatsApp message, an email through an API, a push notification, an SMS or a Telegram message. DevCatz runs them on your computer so you can build and test those flows without a provider account — and, for email and SMS, without anything leaving your computer. Gateways run on macOS and Windows.
The engines
| Gateway | Kind | Port | Runs as |
|---|---|---|---|
| GOWA | 3010 (gowa.<tld>) |
A Go binary (gowa.exe) |
|
| WAHA | 3020 (waha.<tld>) |
A Docker imageIn DoCatz, from its Docker image | |
| Stalwart | 8490 |
A mail server that relays into the DevCatz mail catcher — a native binary with stalwart-cli |
|
| Postal | 5010 |
DockerIn DoCatz, with MariaDB | |
| ntfy | Push notifications | 8492 |
DockerIn DoCatz |
| Gotify | Push notifications | 8493 |
DockerIn DoCatz |
| Jasmin | SMS | 8494 |
DockerIn DoCatz, with Redis and RabbitMQ |
| Telegram Bot API server | Telegram | 8496 |
DockerIn DoCatz (needs your api_id / api_hash) |
GOWA and Stalwart run natively on both platforms, from their GitHub releases (macOS tarballsWindows x64 zips, checksums checked).
The engines marked Docker need a container engine: they use the engine the Docker tab uses — DoCatz (recommended), OrbStack, Docker Desktop and the rest. When none is running, the error says so and names them.
In DoCatz on Windows
WAHA, Postal, ntfy, Gotify, Jasmin and the Telegram Bot API server have no native Windows build, so on Windows they
always run in DoCatz’s container engine (WSL 2), whatever engine the Docker tab uses. DevCatz pulls
their images there, starts and stops them, and keeps the same ports, domains, keys and .env lines as anywhere else
— your site does not know the difference.
- Install — a gateway that is not installed says runs in DoCatz (WAHA, on the WhatsApp page: runs in DoCatz’s engine), and its button reads Install in DoCatz…, with DoCatz’s logo. DevCatz opens DoCatz, waits for its engine (you can cancel the wait) and installs the gateway there.
- While it runs — the page header says in DoCatz next to the port, Start, Stop, Restart and Update to … work as for any gateway, and More ▾ gets Open in DoCatz, which shows the containers in DoCatz. DoCatz lists them in its read-only DevCatz Services group (more): DevCatz installs, starts, stops and updates them.
- No DoCatz yet? The page shows DoCatz is not installed with Download & Install DoCatz first: DevCatz fetches DoCatz for this PC, checks it and installs it for your account, then you install the gateway.
- DoCatz there, engine not set up? DevCatz opens DoCatz and says so at once: start the engine in DoCatz (Engine), then try again. WSL 2 has to be able to run, which it cannot in a virtual machine without nested virtualisation.
- Callbacks — the ports the containers call back on (the mail and SMS catchers, WhatsApp webhooks) are opened on Windows’ WSL address too; when Windows Firewall blocks DevCatz there, the page says so.
GOWA, the other WhatsApp engine, stays native on Windows — pick it when you would rather not run DoCatz.
WhatsApp (GOWA and WAHA)
Read this first. Both engines speak the WhatsApp Web protocol and are unofficial. WhatsApp may ban numbers that automate messages. Link a test number you can afford to lose, never your own or a customer’s.
The WhatsApp page has these tabs:
- Sessions — one session is one linked phone. Add session, then Link a phone (QR) and scan the code with
WhatsApp → Settings → Linked devices → Link a device. The code refreshes by itself. Log out unlinks a
phone; Remove deletes the session. Sites pick a session with
WHATSAPP_SESSION. - Test sender — send Text, Image or Document from a session, and see the API request it made and the response.
- Contacts — contacts and groups of a linked phone.
- Connection — the API address (HTTPS and local), the dashboard / Swagger user, the default session and the data folder, with Write to .env and short API notes.
- Logs.
Two more views sit beside them:
- Inspector — every message in and out, live, plus the raw events; Copy JSON for any of them, Clear to empty it.
- Webhooks — forward the engines’ events to a site.
Webhooks to sites
Add webhook… picks a site, a URL and the events to forward (empty = all). The site gets each event as JSON in a
POST, signed with an HMAC:
| Header | Holds |
|---|---|
X-DevCatz-Signature |
sha256=HMAC(secret, body) |
X-DevCatz-Engine |
The engine that sent it |
X-DevCatz-Event |
The event name |
X-DevCatz-Delivery |
A delivery id |
Check the signature in your app with the secret from WHATSAPP_WEBHOOK_SECRET. Every delivery is logged with the body
sent and the response; Replay sends one again after you changed your code.
Write to .env
Write to .env adds WHATSAPP_API_URL, WHATSAPP_API_KEY, WHATSAPP_SESSION and WHATSAPP_WEBHOOK_SECRET to a
site.
Email (Stalwart and Postal)
- Stalwart is a full mail server. Sites send through SMTP submission as
devcatz(no TLS on your computer). Mail to other domains lands in the DevCatz mail catcher; mail to…@devcatz.teststays in Stalwart, where you can read it over IMAP — handy for reply-by-email and other inbound flows. Accounts, domains and filters are managed in its web admin. On the first start DevCatz configures it withstalwart-cli(listeners, domain, mailbox, the relay to the catcher). - Postal gives you an HTTP sending API (with an
X-Server-API-Keyheader) or SMTP.devcatz.testand every site’s domain are verified as sending domains for you. Webhooks, message history and tracking live in its web UI; delivery goes to the mail catcher.
Either way, real inboxes are never reached.
Push (ntfy and Gotify)
- ntfy — publish with a
POST(anAuthorization: Bearer <token>header; the body is the message;Title,PriorityandTagsheaders add more). - Gotify — send JSON; receive in the web UI, the Gotify Android app, or over its WebSocket stream (
/stream, with a client token).
Phones and browsers on your computer’s network can subscribe through the domain; share it with Expose for devices outside.
SMS (Jasmin and the SMS catcher)
Jasmin is an SMS gateway with an HTTP API. DevCatz pairs it with its own SMS catcher, which speaks SMPP 3.4:
every SMS Jasmin sends lands in the SMS catcher tab, so no operator account is needed. Add coding=8 for unicode
messages. Users, routes and filters are managed in jCli.
Telegram
The Telegram Bot API server runs the Bot API on your computer. Point your bot library at it instead of
https://api.telegram.org; the methods stay the same (/bot<token>/sendMessage …).
- Add the bot token in the engine’s Settings… first.
- Before a bot’s first request here, call
logOutonce on api.telegram.org to move it to this server. It can move back after 10 minutes. - Webhooks may use any local URL (
http://host.docker.internal:3000/…reaches a site’s dev server), and files can be up to 2 GB.
An engine’s page
Every gateway has Start, Stop and Restart, and these tabs:
- Overview — the connection details, keys and tokens (they appear after the first start), Write to .env and How sites use it.
- Test sender — send a message and see the request it made and the response, with Open Mail or Open SMS catcher to see where it landed.
- SMS catcher — Jasmin only.
- Logs.
More ▾ has the web UI, the data folder, Check for updates, Settings and Uninstall.
The site’s Gateways tab
A site gets a Gateways tab when its .env has WhatsApp or gateway keys, or a WhatsApp client library is found.
- It lists the gateways the site points at, with Open.
- If the WhatsApp settings point somewhere else, or only a library was found, it offers the lines to use a DevCatz engine instead, with Write to .env.
- Webhook to this site — Add webhook or Replay, with Edit on the Gateways page.
- Use another gateway adds one more.
Settings → Gateways
| Option | What it does |
|---|---|
| Services | Each gateway with its status, address, Starts with DevCatz and Restart |
| Messages kept in the inspector | 500 by default; the oldest are dropped beyond this |
| Notification when a message arrives | A macOSWindows notification per incoming WhatsApp message |
In the menu bar
The menu bar (the system tray on Windows) has a line per WhatsApp engine (GOWA (WhatsApp) · N linked) and per gateway (Stalwart (email) · status), each with Open, Start, Stop and Restart. See Monitoring and the menu bar.
Limits
- The WhatsApp engines are unofficial; a number can be banned.
- WAHA, Postal, ntfy, Gotify, Jasmin and the Telegram server need a container engine (DoCatz, OrbStack, Docker Desktop …DoCatz).
- The Telegram server has not been tried with a real bot yet; treat it as early.
Last updated 2026-11-03