Webhook Vault
Webhook registry API that HMAC-signs payloads with a secret from the environment, as computed columns
One app.py with 1 table, 3 computed columns, 4 HTTP routes. Needs pixeltable[serve]>=0.7.14. Updated 2026-09-26.
app.py
"""Webhook Vault API built with Pixeltable.export WEBHOOK_HMAC_SECRET=<any-long-random-string>pxt schema update app.py vaultpxt service run app.py vault"""import pixeltable as pxtimport pixeltable.functions as pxtffrom pixeltable.serving import FastAPIRouterfrom udfs import digest_payload, sign_payload, target_host# ---- tables ----TableModel = pxt.model_base()class Webhooks(TableModel, name='webhooks'):id = pxt.Column(value=pxtf.uuid.uuid7(), primary_key=True)name: pxt.Stringurl: pxt.Stringevent: pxt.Stringpayload: pxt.Stringhost = target_host(url)digest = digest_payload(payload)signature = sign_payload(event, payload)# ---- queries ----@pxt.querydef deliveries_for(event: str):"""Signed deliveries for one event type."""return Webhooks.where(Webhooks.event == event).select(Webhooks.id, Webhooks.name, Webhooks.host, Webhooks.signature).order_by(Webhooks.name)# ---- routes ----vault_api = FastAPIRouter(name='vault_api')vault_api.add_insert_route(Webhooks, path='/webhooks',inputs=[Webhooks.name, Webhooks.url, Webhooks.event, Webhooks.payload],outputs=[Webhooks.id, Webhooks.host, Webhooks.digest, Webhooks.signature],)vault_api.add_compute_route(Webhooks, path='/sign', inputs=[Webhooks.event, Webhooks.payload],outputs=[Webhooks.digest, Webhooks.signature])vault_api.add_delete_route(Webhooks, path='/webhooks/delete')vault_api.add_query_route(path='/webhooks/by-event', query=deliveries_for, method='get')
What app.py declares
Each row links to its line.
- runs on insert
- stored
- index
- route
Run it
Needs uv. The routes then answer on port 8000.
terminal
git clone https://github.com/pierrebrunelle/pixeltable-webhook-vaultcd pixeltable-webhook-vaultuv syncuv run pxt schema update app.py vaultuv run python seed.py vaultuv run pxt service run app.py vault --port 8000
Related apps
- Forge Heat CyclesForge heat-cycle registry API: B-tree indexes, chained risk UDFs, and parallel shop-floor writersShares: UDFs
- Climbing Route ToposClimbing-route topo registry API: photo uploads with thumbnails, grayscale copies, grade bands and index-backed crag lookupsShares: UDFs
- Warehouse Pick ListsWarehouse pick-list REST API: units, pick zones, waves and tote labels as incremental computed columns over Json order linesShares: UDFs