Early access — building in the open

Ship a WhatsApp bot without shipping a server.

Write it in Python with Pywa. Run one command. Pywa Cloud builds the runtime, secures the webhook, and keeps it running — no server, no webhook infrastructure, no DevOps.

Early access — we're inviting testers as onboarding capacity allows.

~/support-bot
$ pywa deploy
 
Building application
Resolved dependencies
Discovered WhatsApp app in main.py
Built container image
Started runtime
Configured secure webhook
support-bot · +1 415 555 0142
RUNNING
From code to live

Nine lines of Python. One command. A running bot.

This is the whole loop — nothing hidden behind the ellipsis.

main.py
from pywa import WhatsApp, filters, types
wa = WhatsApp(
    phone_id=os.environ["PYWA_PHONE_ID"],
    token=os.environ["PYWA_TOKEN"],
)

@wa.on_message(filters.text)
def echo(_: WhatsApp, msg: types.Message) -> None:
    msg.reply_text(f"You said: {msg.text}")
Terminal
$ pywa deploy

 Built & started — 8s
 Webhook configured

POST /webhook → 200
11:24:03
WhatsApp
You: hello
↳ You said: hello
Architecture

You write the bot. Pywa Cloud runs it.

Everything between your code and WhatsApp — runtime, webhook, connection, logs, isolation — is Pywa Cloud's job, not yours.

YOUR CODE — main.py
Pywa Cloud
Runtime
Secure webhook
WhatsApp connection
Logs
Isolation
Deployments
WHATSAPP

Pywa itself — the framework your bot is written against — stays fully independent and open-source. Pywa Cloud runs your code; it doesn't own it. Nothing ties your bot to this platform, and you can always run the same code yourself.

Security

Your webhook is not an open door.

Every request from WhatsApp passes through validation at Pywa Cloud's boundary — before it ever reaches your code, and without your bot having to implement any of it.

Request arrives
POST /webhook/support-bot
mTLS handshake
client cert verified against Meta's CA
connection refused
Signature check
HMAC-SHA256, constant-time
403 invalid signature
Your container
isolated, non-root, read-only fs
Your code
receives an already-verified request
  • Every inbound connection presents a client certificate validated against Meta's own CA before the TLS handshake even completes — non-Meta traffic never reaches an HTTP request at all.
  • Every inbound webhook is validated against an HMAC-SHA256 signature before it's proxied anywhere — a bad or missing signature never reaches your container.
  • Secrets are encrypted at rest (Fernet: AES-128-CBC + HMAC-SHA256) and only decrypted server-side, at deploy time, to inject into your container's environment.
  • Each bot runs in its own container on its own dedicated Docker network — no route to any other tenant's container, even by raw IP.
  • Containers run as a non-root user with every Linux capability dropped, a read-only root filesystem, and no access to the Docker socket or host filesystem.
  • A bot with no WhatsApp connection rejects every inbound webhook outright — there's nothing for an attacker to spoof traffic against.
  • A deploy token used in CI can deploy exactly one bot. It cannot list your bots, read your env vars, or touch anything else.

This is container isolation on a shared host, not VM-level isolation — and it hasn't had an independent security audit yet. We'd rather tell you what this does and doesn't protect against than round it up. Full detail on the security & isolation page.

Local development

Real WhatsApp webhooks, on localhost.

Add one flag to the command you already run. pywa dev --tunnel starts your bot locally and, in the same step, reroutes this bot's live webhook traffic here — no ngrok, no second terminal, no repointing the callback URL in Meta's dashboard.

~/support-bot
$ pywa dev --tunnel 🌐 Server URL: http://127.0.0.1:8000 Tunneling 'support-bot'… connected POST /webhook → 200

Not running pywa dev? pywa cloud tunnel relays the same traffic to any local process on its own.

WHATSAPP
PYWA CLOUD INGRESS webhook URL never changes
your laptop $ pywa dev --tunnel
deployed container your last pywa deploy

Stop --tunnel (Ctrl+C) and traffic flows back to the container within moments — same URL, same already-verified request, either way.

WhatsApp connection

Connect a WhatsApp Business number without becoming a Meta developer.

Pywa Cloud is a registered Meta Tech Provider. For the standard path, you connect through Pywa Cloud's own Meta app — no separate Meta app of your own to create, configure, or keep alive.

DEVELOPER
PYWA CLOUD
Meta Tech Provider
META / WHATSAPP
YOUR WABA

Already run your own Meta app and system-user token? A manual connection is supported too — Pywa Cloud validates it against the real Graph API before saving it, and your credentials stay yours.

The dashboard

Not just a CLI. A real control plane.

Every bot, deployment, and WhatsApp connection is visible in one place — these are real screens from the running application, not mockups.

pywa.cloud — /bots/support-bot/deployments
Pywa Cloud dashboard showing a bot's deployment history, a running deployment, and a rollback action

Deployments — status, build history, one-click rollback to a previous image.

pywa.cloud — /bots
Pywa Cloud dashboard showing a list of bots

Every bot on your team, at a glance.

Why

What you stop doing.

  • 01 Rent and patch a VPS
  • 02 Write and maintain a Dockerfile
  • 03 Configure a reverse proxy and TLS certificates
  • 04 Build your own webhook signature validation
  • 05 Create and maintain a Meta app for a standard connection
  • 06 Redeploy just to test a webhook change
  • 07 Manage ngrok tunnels for local testing
Run pywa deploy.
Early access

Want to test it yourself?

We're inviting a small number of early testers while onboarding is still hands-on. Tell us what you're building and we'll reach out.

Free during early access — no credit card, no pricing surprises.