Infrastructure as code for WhatsApp

Your WhatsApp templates and flows, as code.

Declare templates, flows, and tests in typed TypeScript. Plan the diff, apply to the Cloud API. Ship 20x faster and break nothing.

$ npm install @manano-ai/wham

Private repository — join the waitlist for access

wham.ts
Writing message handler...
9:41
W
WHAM Bot

online

Where's my order #38291?

14:31
Message
The problem

A WhatsApp template isn't a web page

Web code is instant, local, and yours. WhatsApp doesn't work like that. And that one difference changes how you should build.

Web code (HTML, JS)

  • Change a file, hit refresh. Live in seconds.
  • Runs on your servers. You own every part of it.
  • Test it anywhere, on localhost, for free.
  • Break it, fix it, ship again. Nobody's watching.

WhatsApp templates & flows

  • Submit it and wait. Meta approves every change.
  • Lives inside a Meta account, not your codebase.
  • No localhost. You need a real number to even see it.
  • Someone edits it by hand and your code no longer matches reality.

Sound familiar? That's how servers, databases, and DNS behave. Not web pages. You don't click around a console and hope. You declare what you want, preview the change, and apply it. wham brings that exact workflow to WhatsApp.

Declare. Plan. Apply.

The same workflow you use for cloud infrastructure, now for your WhatsApp templates and flows.

01

Declare

Write your templates, flows, and tests as typed TypeScript resources. Rename a screen and the compiler catches every broken reference before you ship.

02

Plan

Run wham plan to see exactly what changes. Creates, updates, deletes, drift from manual edits. No surprises in production.

03

Apply

wham apply pushes changes to Meta in dependency order and waits until templates are approved and flows are published. Wire it into CI.

One source of truth for your WhatsApp account

Templates

Typed message templates with validated placeholders. Approval status tracked in state.

Flows

Multi-screen forms with end-to-end type narrowing. Reference a flow from a template, safely.

Tests

Preview flows and templates locally with mock data. No Business account, no real credentials.

Webhooks

Receive messages in real time. Filter by type, respond with typed replies, connect any backend.

Developer Experience

WhatsApp infrastructure, version controlled

Templates, flows, and tests in one typed codebase. Diff every change, catch breakage at build time, and ship from CI.

Caught at build time

Type-safe templates

Templates are typed resources, not strings. Placeholders and flow references are checked at compile time. Rename something and the build breaks, not your production messages.

templates.tsx
// Templates are typed resources, not strings
const bookingConfirmation = template({
  id: 'booking_confirmation',
  language: 'en_US',
  category: 'UTILITY',
  params: { room: example('room 204') },
  view: ({ param }) => (
    <>
      <Body>Your booking for {param.room} is confirmed.</Body>
      <Button.Flow flow={bookingFlow}
        navigateScreen={bookingFlow.screens.DETAILS}>
        Manage booking
      </Button.Flow>
    </>
  ),
});

// Rename a screen and this fails to compile,
// not in production.
End-to-end typed

Interactive flows

Declare multi-screen WhatsApp forms as JSX with end-to-end type narrowing. Screen data flows through to your handlers, fully typed.

flows.tsx
// Multi-screen flows, fully typed
const bookingFlow = (
  <Flow id="booking" categories={['OTHER']} version="7.0">
    <Screen
      id="DETAILS"
      data={z.object({ room: z.string() })}
    >
      {(s) => ({
        title: 'Your booking',
        terminal: true,
        body: [s.heading('Confirmed'), s.body(s.data.room)],
        footer: { label: 'Done', complete: { room: s.data.room } },
      })}
    </Screen>
  </Flow>
);
No surprises

Plan before you apply

See every create, update, and delete before it happens. wham detects drift from manual edits in Business Manager and reconciles it. Like terraform plan, for WhatsApp.

terminal
$ wham plan

  + flow.booking            create
  ~ template.order_confirm  update body
  - template.old_promo      delete
  ! template.reminder       drift detected

Plan: 1 to add, 1 to change, 1 to destroy.

Drift detection

wham sync discovers manual changes made in Business Manager and lets you adopt or revert them. Your code stays the source of truth.

Local preview

Render flows and templates with mock data on localhost, hot-reloaded. No Business account or real credentials needed.

Multi-environment

One declarations module, many stacks. Deploy the same resources to dev, sandbox, and prod with a single flag.

Local Development

Test without credentials

Preview flows and templates locally with the exact screens Meta renders. No WhatsApp Business account needed. Iterate before you ever touch production.

Full API Simulation

All messaging endpoints, templates, and flows work locally

Webhook Round-trips

Test complete message flows with HMAC-signed webhooks

Error Injection

Simulate rate limits, failures, and edge cases

CI/CD Ready

Run in tests without real credentials

$ wham preview

 Preview server at http://localhost:3001
 Rendering flows & templates with mock data
 Hot reload enabled
9:41
B

Bella's Salon

Business Account

Today

Welcome to Bella's Hair Salon! How can I help you today?

10:32

Book Appointment

10:33

Select a Service

Haircut - $30
Hair Color - $80
10:33
Message
Infrastructure as Code

Deploy like it's 2026

Version control your WhatsApp infrastructure. Plan changes, preview diffs, deploy with confidence.

1

Define Resources

Declare templates and flows in TypeScript

// wham/resources.tsx
export const resources = (
  <ResourceSet>
    {bookingFlow}
    {reminderTemplate}
    {confirmationTemplate}
  </ResourceSet>
);
2

Preview Changes

See what will be created, updated, or deleted

$ wham plan

+ flow.booking         create
~ template.reminder    update body
- template.old_promo   delete
3

Push to Deploy

Apply changes with a single command

$ wham apply

Applying 3 changes...
✓ flow.booking created
✓ template.reminder updated
✓ template.old_promo deleted

Deployed in 4.2s

CI/CD Ready

Integrate with GitHub Actions, GitLab CI, or any CI system. Deploy on merge to main. Preview environments for every PR.

# .github/workflows/deploy.yml
on:
  push:
    branches: [main]

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: npx wham apply --yes
Claude Code skills

Build it by talking to your agent

wham ships as Claude Code skills. Install them once, then describe what you want. Claude writes the templates and flows, tests them in the simulator, and ships them with plan and apply.

claude code
$ npx wham skills install
 Installed 6 skills to .claude/skills

# then just ask Claude Code:
you › build a booking flow and deploy it to dev

 wrote wham/flows/booking.tsx
 previewed in the simulator
 wham apply --stack dev → published
wham-templates

Author message templates with the typed JSX DSL.

wham-flows

Build multi-screen flows with typed screens and routing.

wham-messaging

Send text, media, buttons, lists, templates, and flows.

wham-webhooks

Receive and route inbound messages and flow completions.

wham-simulator-testing

Test end-to-end with no Meta credentials.

wham-deploy

Plan and apply your templates and flows as code.

Limited Beta Access

Get early access to wham

Join the waitlist for the WhatsApp infrastructure toolkit. Manage your templates, flows, and tests as code, and ship 20x faster.

First 50 teams get founding member pricing.
Invite friends to skip the line.