Packages
Every @postel/* package, what it does, and whether it ships today.
Postel is a workspace of focused packages. Pick the ones you need; the rest don't get installed.
Available today
| Package | Used for | Notes |
|---|---|---|
@postel/core | Inbound and Outbound — the Postel({ inbound, outbound }) factory and primitives | Zero runtime dependencies. The outbound runtime is available, including the in-process InMemoryStorage adapter (import { InMemoryStorage } from "@postel/core"). Inbound sources accept an optional Standard Schema schema (zod/valibot/…) that validates and types event.data — no schema-library dependency. |
@postel/http | Framework-agnostic webhook HTTP core | The verification gate (handleInbound, fetchWebhook) and the shared PostelError→HTTP-status policy every framework adapter binds to. Depends only on @postel/core. |
@postel/hono | Hono framework adapter | HonoWebAdapter(postel, app) routing facade (inbound.<source>.post, outbound.bindJwks, admin.bindAdminRoutes) + low-level verifyWebhook() / withWebhook(). |
@postel/express | Express framework adapter | ExpressWebAdapter(postel, app) routing facade + low-level verifyWebhook() (mounts express.raw() + the gate) / fetchToExpress; sets req.postel. |
@postel/fastify | Fastify framework adapter | fastifyPostel raw-body plugin + FastifyWebAdapter(postel, app) routing facade + low-level verifyWebhook() preHandler / fetchToFastify; sets req.postel. |
@postel/nestjs | NestJS framework adapter | NestjsWebAdapter(postel) (type-checked WebhookGuard) + PostelModule.forRoot(postel) + WebhookGuard(key) guard + @Event() / @WebhookResult() decorators. |
@postel/admin | Admin control plane over the outbound sender | adminRouter(postel, { authorize }) Fetch router (endpoint CRUD, replay, keys, message/attempt reads, tenant reads) with default-deny auth + tenant scoping; mount via Hono / fetchToExpress / fetchToFastify. |
@postel/sqlite | SQLite storage adapter | Standalone — Postel owns the SQLite database (SqliteStorage). Full outbound Storage; also exports SqliteDedup for inbound dedup. |
@postel/pg | Postgres storage adapter | Standalone — PgStorage({ connectionString }). Full outbound Storage (FOR UPDATE SKIP LOCKED, LISTEN/NOTIFY); also exports PgDedup for inbound dedup. |
@postel/mysql | MySQL storage adapter | Standalone — MysqlStorage({ connectionString }) on mysql2 (FOR UPDATE SKIP LOCKED, polling). Full outbound Storage; also exports MysqlDedup for inbound dedup. |
@postel/kysely | Kysely storage adapter | ORM/query-builder — KyselyStorage({ db, dialect }) runs Postel's storage through your Kysely (Postgres, MySQL, or SQLite). |
@postel/drizzle | Drizzle storage adapter | ORM — DrizzleStorage({ db, dialect }) runs Postel's storage through your Drizzle instance (Postgres, MySQL, or SQLite). |
@postel/prisma | Prisma storage adapter | ORM — PrismaStorage({ prisma, dialect }) runs Postel's storage through your PrismaClient's raw surface (Postgres, MySQL, or SQLite). |
@postel/typeorm | TypeORM storage adapter | ORM — TypeOrmStorage({ dataSource, dialect }) runs Postel's storage through your TypeORM DataSource (Postgres, MySQL, or SQLite). |
@postel/mikro-orm | MikroORM storage adapter | ORM — MikroOrmStorage({ orm, dialect }) runs Postel's storage through your MikroORM EntityManager (Postgres, MySQL, or SQLite). |
@postel/storage-helpers | Zero-DB helpers for custom adapters | Dialect codecs, capability flags, row encode/decode, migration SQL, callback registry — what every adapter reuses. |
Stubs today (name reserved, no runtime yet)
| Package | Will be | Status |
|---|---|---|
@postel/nextjs | Next.js Route Handler ergonomics | Planned |
@postel/bun | Bun.serve adapter | Planned |
@postel/effect | Effect-TS layer over the core API | Planned |
@postel/cli | postel CLI (migrate, sign, verify, replay, simulate) | Planned |
Each "stub" package exports only __postelPackage today, is marked private, and is not part of the published 1.0 set — a guard test fails CI if a name-only package is ever made publishable. Don't depend on them in production yet — the framework-agnostic factory recipe works directly against each runtime's native Request.
Storage adapters
The postel.outbound.* runtime runs against any Storage adapter. The full Tier-1 matrix now ships: the in-process InMemoryStorage (in @postel/core), the standalone @postel/pg / @postel/sqlite / @postel/mysql, and the query-builder / ORM adapters @postel/kysely / @postel/drizzle / @postel/prisma / @postel/typeorm / @postel/mikro-orm. See the Storage section for how to choose, and custom adapters to back Postel with any other database.
The matrix is per ADR 0007 — Postgres / SQLite as the canonical (benchmarked) first-class databases, MySQL as a first-party adapter set, query-builder / ORM adapters in their own packages. The external worker strategies (BullMQ, PgBoss) remain config slots that throw NotImplementedError until their adapters ship; the in-process worker pool is the supported runtime.
Polyglot ports (Go, Python, Rust)
Out of scope for the npm registry. See Polyglot for the per-language plan.
Compliance & tooling
| Package | What it is | Status |
|---|---|---|
@postel/compliance | The executable behavioral oracle. Vendor-neutral test suite for any Standard Webhooks producer/receiver. A port version X.Y.Z claims conformance by passing @postel/compliance@X.Y.*. | Receiver + sender; the sender corpus executes end-to-end against @postel/compliance-driver. |
@postel/compliance-driver | The HTTP control-plane the compliance runner drives in sender mode — it wraps a real Postel outbound instance so the cross-port runner can reset state, register endpoints, send, advance the clock, and observe outgoing deliveries. | Workspace-internal harness for the suite; not a production dependency. |
@postel/test | Workspace-internal test fixtures (signed payload generators, vector builders). | Internal — not published. |
Every export
For exact type signatures, see Errors and @postel/http, or read the source under typescript/packages/core.