# Welcome





Sending and receiving webhooks is easy. Doing it **reliably and securely** is hard — retries, replay, signature verification, key rotation, idempotency, raw-bytes preservation. Postel is a library that handles those for you, inside your application, against your existing relational database (Postgres, MySQL, SQLite, …) — no Redis, no broker, no separate dispatcher process.

## Two halves, one library [#two-halves-one-library]

Postel has two independent halves. Use either alone, or both together.

| Half                           | What it does                                                                                                                                                                                                                  |
| ------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **[Inbound](/docs/inbound)**   | Verify webhooks other services send you — Standard Webhooks, plus ready-made [Stripe / GitHub / Shopify / Twilio / Slack verifiers](/docs/inbound/providers). Constant-time checks, rotation windows, JWKS, dedup.            |
| **[Outbound](/docs/outbound)** | Deliver Standard Webhooks to your customers' endpoints. Transactional outbox, retries, replay, fanout, key rotation, JWKS publication, circuit breaker, dead-letter — durable on [Postgres, MySQL, or SQLite](/docs/storage). |

The `Postel({ inbound, outbound })` factory composes both — but everywhere else in these docs they're separated, so you never wade through sender material to integrate the receiver, or vice versa.

## Start here [#start-here]

<Cards>
  <Card icon="<RocketIcon />" title="Quickstart" href="/docs/get-started/quickstart" description="Verify an inbound webhook and send an outbound one, from scratch." />

  <Card icon="<CompassIcon />" title="Is Postel for me?" href="/docs/get-started/is-postel-for-me" description="The decision gate — run it before you spend more time evaluating." />

  <Card icon="<BinaryIcon />" title="How Postel works" href="/docs/concepts/how-postel-works" description="The mental model: outbox, worker pool, delivery lifecycle, receiver." />

  <Card icon="<BookIcon />" title="Why Postel" href="/docs/project/why" description="The design rationale and the comparison vs Svix, Outpost, Convoy, DIY." />
</Cards>

## Go deeper [#go-deeper]

<Cards>
  <Card icon="<InboxIcon />" title="Inbound" href="/docs/inbound" description="Verification, provider verifiers, key rotation, deduplication." />

  <Card icon="<SendIcon />" title="Outbound" href="/docs/outbound" description="send(), retries, replay, endpoints, introspection, tenants." />

  <Card icon="<PlugIcon />" title="Web adapters" href="/docs/web-adapters" description="Hono, Express, Fastify, NestJS, Next.js — or any Fetch runtime." />

  <Card icon="<DatabaseIcon />" title="Storage" href="/docs/storage" description="pg / sqlite / mysql, or your Kysely, Drizzle, Prisma, TypeORM, MikroORM instance." />
</Cards>

On an Effect-TS stack? [`@postel/effect`](/docs/reference/effect) wraps the whole API — Layer-managed lifecycle, typed error channel, Effect-wrapped `send`/`verify`. Want to see it running first? The [nextjs-prisma example](/docs/get-started/examples) round-trips a webhook offline, crash demo included.

## Where the project stands [#where-the-project-stands]

Both halves are implemented and exercised end-to-end by the [`@postel/compliance`](https://github.com/postel-sh/postel/tree/main/compliance) suite. Three things to know before you build on it:

* **No release is cut yet** — nothing is on npm. [Run it from source](/docs/get-started/quickstart) today; pin to a minor once releases ship.
* **Unwired config slots fail fast**: external job-queue workers, KMS-backed keys, retention, ephemeral keys, and a few HTTP knobs throw `NotImplementedError` instead of silently no-opping. [Outbound](/docs/outbound) marks each one.
* **Go, Python, and Rust ports** follow the TypeScript implementation, each gated on the same compliance suite — see [Polyglot](/docs/project/polyglot).

If a page describes behavior the source doesn't have, [open an issue](https://github.com/postel-sh/postel/issues).
