Forward live webhook events to localhost — instant public tunnel or full dev mode with retries and logs
Project description
firmhook
The official CLI for FirmHook — a webhook monitoring and delivery platform.
The CLI gives you two ways to receive webhooks on your local machine:
firmhook listen |
firmhook start |
|
|---|---|---|
| Account required | No | Yes |
| API key required | No | Yes |
| Events stored in dashboard | No | Yes |
| Retries on failure | No | Yes |
| Response returned to provider | Yes | No |
| Best for | Quick testing, demos, no-account situations | Active development against a configured endpoint |
Installation
# Recommended — isolated install, firmhook available on PATH immediately
uv tool install firmhook
# Or with pipx
pipx install firmhook
# Or with pip
pip install firmhook
Verify:
firmhook --help
firmhook version
Requires Python 3.9+.
Instant Tunnel — firmhook listen
Get a public URL in one command. No account, no API key, no configuration.
firmhook listen 3000
Output:
firmhook 0.2.0 | Press Ctrl+C to stop
Tunnel URL: https://api.firmhook.com/tunnel/a3f2c1d4-...
Forwarding: http://localhost:3000
Ready. Waiting for requests... (Ctrl+C to stop)
→ POST http://localhost:3000 [application/json]
← 200 (42ms)
Paste the Tunnel URL into any webhook provider. All incoming requests are forwarded to your local server in real time. The actual response from your server is returned to the provider — webhook providers that validate the response (e.g. Stripe, GitHub) work correctly.
The tunnel lives as long as the CLI is running. Closing it (Ctrl+C) immediately invalidates the URL.
Options
firmhook listen <port> [--forward-to <url>]
| Argument | Description |
|---|---|
port |
Local port to forward requests to |
--forward-to, -f |
Override the full forward URL (default: http://localhost:<port>) |
Examples
# Forward to localhost:3000
firmhook listen 3000
# Forward to a specific path on localhost
firmhook listen 3000 --forward-to http://localhost:3000/webhooks
# Forward to a different local service
firmhook listen 3000 --forward-to http://127.0.0.1:4000/events
Dev Mode — firmhook start
For active development. Events are stored in the FirmHook dashboard with full history, retries, delivery logs, and AI-assisted error explanations.
Setup
1. Create a FirmHook account at firmhook.com.
2. Enable dev mode on an endpoint — in the dashboard, open an endpoint and toggle Dev Mode on. Set a Dev Forward URL (e.g. http://localhost:3000/webhooks).
3. Save your API key:
firmhook config --api-key fhk_your_api_key_here
4. Start forwarding:
firmhook start <org-slug> <endpoint-id>
For example:
firmhook start acme-corp b338f02c-e8b1-4dd5-93ad-0cba72f23ffe
The CLI fetches the dev_forward_url from the endpoint automatically. Events from FirmHook are forwarded to your local server as they arrive.
Options
firmhook start <org-slug> <endpoint-id> [--forward-to <url>] [--api-key <key>] [--detach]
| Flag | Description |
|---|---|
--forward-to, -f |
Override the local URL for this session (does not update the endpoint) |
--api-key |
Use a specific API key instead of the saved one |
--detach, -d |
Run the agent in the background |
Background mode
# Start in background
firmhook start acme-corp <endpoint-id> --detach
# Check if it's running
firmhook status
# View recent log output
firmhook logs
# Stream logs in real time
firmhook logs --follow
# Stop the background agent
firmhook stop
All commands
firmhook listen <port> Open a public tunnel URL and forward requests to a local port
firmhook start <org> <id> Connect to a FirmHook endpoint and forward events to localhost
firmhook config Save your API key
firmhook status Show whether the background agent is running
firmhook logs Print recent agent log output
firmhook stop Stop the background agent
firmhook version Print the firmhook version
How it works
Instant tunnel
Webhook provider
│
▼
POST https://api.firmhook.com/tunnel/{session_id}
│
▼ Redis pub/sub
│
▼
WebSocket wss://api.firmhook.com/ws/tunnel/{session_id}
│
▼
firmhook CLI → HTTP → localhost:<port>
│
▼ ack (status + body)
│
▼
Response returned to webhook provider
Dev mode
Webhook provider → FirmHook ingest URL
│
PostgreSQL (event stored)
│
Celery worker
│ Redis pub/sub
▼
firmhook CLI → localhost:<port>
│
Delivery recorded in dashboard
Configuration
The CLI stores settings in ~/.firmhook/config.json.
# Save your API key
firmhook config --api-key fhk_your_key
# Show the saved API key
firmhook config --show
Changelog
0.2.1
- Added project URLs (homepage and source) to package metadata
0.2.0
- Added
firmhook listen <port>— instant public tunnel, no account or API key required - Server URL is now always
api.firmhook.comand is no longer user-configurable
0.1.0
- Initial release —
config,start,stop,status,logs,versioncommands
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file firmhook-0.2.1.tar.gz.
File metadata
- Download URL: firmhook-0.2.1.tar.gz
- Upload date:
- Size: 8.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d029f07e66c0f009f247d233f5fcfa91b3df2db60c8aed85efe45e2b7cd74557
|
|
| MD5 |
46930b49216f15b7da35b6ac0dd0ac44
|
|
| BLAKE2b-256 |
63debcfbf4b773f9be5f4adeb021be55f6d058e1c978dfae6f0a1e3d05a54a85
|
Provenance
The following attestation bundles were made for firmhook-0.2.1.tar.gz:
Publisher:
publish.yml on Numostanley/FirmHook
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
firmhook-0.2.1.tar.gz -
Subject digest:
d029f07e66c0f009f247d233f5fcfa91b3df2db60c8aed85efe45e2b7cd74557 - Sigstore transparency entry: 1732411842
- Sigstore integration time:
-
Permalink:
Numostanley/FirmHook@2732bea6fd2252a633bda8f7fa8787e8d471a2bb -
Branch / Tag:
refs/tags/cli/v0.2.1 - Owner: https://github.com/Numostanley
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@2732bea6fd2252a633bda8f7fa8787e8d471a2bb -
Trigger Event:
push
-
Statement type:
File details
Details for the file firmhook-0.2.1-py3-none-any.whl.
File metadata
- Download URL: firmhook-0.2.1-py3-none-any.whl
- Upload date:
- Size: 11.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
89c33d8ddd4fad190a7da6519d520b4f5c0c7014758616a9c7de8a2180bcc6f3
|
|
| MD5 |
ab2e1fb8751c0d74c8ea8c4357752195
|
|
| BLAKE2b-256 |
abf3096adf87e29927829fee108c5b0fedefcbb94f873e8f931608bd1c4b1489
|
Provenance
The following attestation bundles were made for firmhook-0.2.1-py3-none-any.whl:
Publisher:
publish.yml on Numostanley/FirmHook
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
firmhook-0.2.1-py3-none-any.whl -
Subject digest:
89c33d8ddd4fad190a7da6519d520b4f5c0c7014758616a9c7de8a2180bcc6f3 - Sigstore transparency entry: 1732411868
- Sigstore integration time:
-
Permalink:
Numostanley/FirmHook@2732bea6fd2252a633bda8f7fa8787e8d471a2bb -
Branch / Tag:
refs/tags/cli/v0.2.1 - Owner: https://github.com/Numostanley
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@2732bea6fd2252a633bda8f7fa8787e8d471a2bb -
Trigger Event:
push
-
Statement type: