Skip to main content

hookspool

CI PyPI Python License: MIT Docs

Durable, coalescing intake for inbound webhooks. hookspool sits between your reverse proxy and whatever consumes the events, whether that is an agent gateway, a script or an HTTP endpoint. It writes every event to disk before its sender gets a 2xx, holds it until the destination accepts it, and turns a burst of events into one wake-up.

Bobbins feeding a spool while a lever holds back the outgoing thread, so the spool fills until the lever lifts.

One Python package with no dependencies in the core, one SQLite file and two small processes. No queue server, no database server, no LLM anywhere in it.

The problem

A door with a letter slot, envelopes dropping through it into a wire basket and two lying lost on the mat.

A webhook is a promise that the sender will tell you once. Most receivers keep it badly: they acknowledge the request and do the work in memory, so a restart, a crash or a slow downstream loses the event, and a sender that already got its 200 will not try again. A burst of events wakes an expensive consumer once per event. When the consumer is down, nothing holds the backlog and nobody finds out. hookspool is the small, plain thing in front that fixes those and nothing else.

What it guarantees

A toothed wheel with a spring-loaded pawl that lets it turn forward and never back.

  • Commit before acknowledge. A request is verified and committed to SQLite before the sender sees a 2xx, or it gets a 503.
  • At-least-once delivery. A batch is delivered until the destination accepts it; an outage delays work and never loses it.
  • Order per key. Batches of one key go oldest first; different keys go in parallel.
  • Bounded batches. A batch seals at its event count or byte size, however long its destination is down.
  • Bursts become one wake-up. Events with the same key coalesce in a window and arrive together, every one, in order.
  • Nothing is discarded automatically. Only hookspool drop discards, and bodies and secrets stay out of logs.

How it works

Beads sliding along a wire, bunching against a stop and dropping into a cup together as one group.

The intake checks each request, writes it to the spool and answers. The dispatcher groups events with the same key into a batch, waits for a lull, then delivers the batch with retries and a circuit breaker per destination. A script, an HTTP endpoint or an agent gateway receives it. The design and every failure mode are in docs/architecture/.

Quick start

A bobbin hovering above an empty spindle, about to be set on it.

git clone https://github.com/jaredzimmerman/hookspool && cd hookspool
python3 -m venv .venv && . .venv/bin/activate && pip install .
export HOOKSPOOL_HOME="$PWD/demo"   # config.toml lives here (written in the full quick start)
hookspool check          # validate config.toml
hookspool migrate        # create the spool
hookspool dispatch &     # the deliverer
hookspool intake &       # listens on 127.0.0.1:8650

This block is an outline: it needs a config.toml in that directory. The full quick start writes it, sends signed events and shows three of them arriving as one delivery. Other first steps are in docs/getting-started/.

Bobbins

A plank with six pegs, each holding a bobbin wound a different amount.

A bobbin is the plugin for one outside service. It knows how that service proves a request is genuine, what to group its events on, and sometimes how to ask it what changed. You turn one on with a few lines of config. Built in today: GitHub, Gmail, Google Calendar, Google Drive, Plaid, Trello, Zoom and Kaneo, plus hookspool.webhook for any service that signs a JSON POST. Each is named <vendor>.<product> (google.gmail, atlassian.trello).

Already using Hermes webhooks? hookspool can sit in front of the gateway without changing any sender URL or route prompt: each route becomes a bobbin instance that delivers the original payload, and you switch one proxy location per route, with a one-line rollback. See From Hermes webhooks.

The catalogue lists them with a line each, and hookspool bobbin list prints the same from the installed copy. Setup steps and how to write a new one are in docs/bobbins/.

Documentation

  • Getting started: install, the quick start, your first bobbin, verifying.
  • Configuration: every config key, spans, routes, tees, unwrap and bobbin instances.
  • Bobbins: the catalogue, writing one, private bobbins and hooks, review criteria.
  • Operations: running it, health and repair, sweeps, drills, upgrading, the CLI reference.
  • Architecture: the design, how it compares with other tools, the FAQ.
  • Agents: a guide for coding agents, both for working on this repository and for operating a deployment.
  • Changelog: what changed.

Contributing

Pre-1.0: the behaviour in these docs is what the test suite pins, but interfaces may change before 1.0, and the changelog says when they do. A new bobbin is the most useful contribution; CONTRIBUTING.md says how.

License

MIT. See LICENSE.

Metadata

Release files for hookspool 0.2.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for hookspool 0.2.0
File Size Uploaded Provenance
hookspool-0.2.0.tar.gz 2.6 MB With provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for hookspool 0.2.0
File Interpreter ABI Platform
hookspool-0.2.0-py3-none-any.whl Python 3 none any Details

Total release size: 2.9 MB

Release files / hookspool-0.2.0.tar.gz

Download URL hookspool-0.2.0.tar.gz
Size 2.6 MB
Tags Source
SHA-256 checksum
How to use checksums
adad85dadfcde58e27bc233d780ae721cd8d822118d8a1241bbf1c68bf898420
BLAKE2b-256 checksum
How to use checksums
598778b1599a7dc45d2a2db154791122e3c4134b6015e4dcfe9c2114914dce33
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 24, 2026.

Transparency log

Release files / hookspool-0.2.0-py3-none-any.whl

Download URL hookspool-0.2.0-py3-none-any.whl
Size 312.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
37e01614de33b6a733f86354ad26e3d75a2a5bdcae4bc8c18f82477d835deb6e
BLAKE2b-256 checksum
How to use checksums
266613cc3dc610a5cf4202eef318b6d973cda8b0bc021915cf9d0de9459839cd
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 24, 2026.

Transparency log

Security for hookspool 0.2.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 2 files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for hookspool-0.2.0.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 24, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

0.2.0 This release

2 release files Full provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page