tl-openmeter-local-dev
Facilitates local development and troubleshooting of OpenMeter with Docker, Stripe, and webhook configurations.
Install this skill
Security score
The tl-openmeter-local-dev skill was audited on Mar 18, 2026 and we found 31 security issues across 2 threat categories, including 15 high-severity. Review the findings below before installing.
Categories Tested
Security Issues
Curl to non-GitHub URL
| 90 | |
| 91 | ```bash |
| 92 | curl http://localhost:8888/api/v1/meters |
| 93 | ``` |
| 94 |
Curl to non-GitHub URL
| 115 | **Requires**: `STRIPE_SECRET_KEY` in `.env` |
| 116 | |
| 117 | Verify: `curl http://localhost:8888/api/v1/apps` — should show Stripe (Sandbox may also be present and is irrelevant). |
| 118 | |
| 119 | --- |
Curl to non-GitHub URL
| 126 | 2. Auth: `ngrok config add-authtoken YOUR_TOKEN` |
| 127 | 3. Start: `.\scripts\start-ngrok.ps1` or `ngrok http 3001` |
| 128 | 4. Get URL: `curl http://127.0.0.1:4040/api/tunnels` |
| 129 | |
| 130 | Then configure (or use the helper script): |
Curl to non-GitHub URL
| 196 | ```bash |
| 197 | # OpenMeter running |
| 198 | curl http://localhost:8888/api/v1/meters |
| 199 | |
| 200 | # Stripe App installed |
Curl to non-GitHub URL
| 199 | |
| 200 | # Stripe App installed |
| 201 | curl http://localhost:8888/api/v1/apps |
| 202 | |
| 203 | # Webhook endpoint responding |
Curl to non-GitHub URL
| 202 | |
| 203 | # Webhook endpoint responding |
| 204 | curl -X POST http://127.0.0.1:3001/webhooks/openmeter \ |
| 205 | -H "Content-Type: application/json" \ |
| 206 | -d '{"type":"entitlements.balance.threshold","payload":{"customerId":"test"}}' |
Ngrok tunnel reference
| 1 | --- |
| 2 | name: tl-openmeter-local-dev |
| 3 | description: Set up and troubleshoot OpenMeter for local development with Docker, ngrok, Stripe app, and webhook configuration. Covers self-hosted vs Cloud differences, catalog sync, environment-aware webhook handling, and OpenMeter Apps (Stripe, Sandbox). Use when setting up OpenMeter locally, configuring ngrok for webhooks, debugging catalog sync, or preparing local dev to match staging/production behavior. |
| 4 | license: MIT |
| 5 | compatibility: Requires Docker Desktop, Node.js 18+, PowerShell or Bash. Ngrok required for Stripe billing. |
Ngrok tunnel reference
| 3 | description: Set up and troubleshoot OpenMeter for local development with Docker, ngrok, Stripe app, and webhook configuration. Covers self-hosted vs Cloud differences, catalog sync, environment-aware webhook handling, and OpenMeter Apps (Stripe, Sandbox). Use when setting up OpenMeter locally, configuring ngrok for webhooks, debugging catalog sync, or preparing local dev to match staging/production behavior. |
| 4 | license: MIT |
| 5 | compatibility: Requires Docker Desktop, Node.js 18+, PowerShell or Bash. Ngrok required for Stripe billing. |
| 6 | metadata: |
| 7 | author: tl-agent-skills |
Ngrok tunnel reference
| 18 | |
| 19 | - "Set up OpenMeter locally" |
| 20 | - "Configure ngrok for webhooks" |
| 21 | - "Debug catalog sync errors" |
| 22 | - "Why is my webhook 500ing?" |
Ngrok tunnel reference
| 54 | |
| 55 | **Question 2: Stripe billing needed?** |
| 56 | - Yes → Steps 1, 2, 3, 4, 5, 6 (full setup with ngrok) |
| 57 | - No → Steps 1, 4, 5 only (metering and entitlements without billing) |
| 58 |
Ngrok tunnel reference
| 57 | - No → Steps 1, 4, 5 only (metering and entitlements without billing) |
| 58 | |
| 59 | **Question 3: Ngrok status** (only if Stripe = yes) |
| 60 | - Already set up → skip ngrok install in Step 3 |
| 61 | - Need to set it up → full Step 3 |
Ngrok tunnel reference
| 58 | |
| 59 | **Question 3: Ngrok status** (only if Stripe = yes) |
| 60 | - Already set up → skip ngrok install in Step 3 |
| 61 | - Need to set it up → full Step 3 |
| 62 | - Paid plan with static domain → note in Step 3 about skipping URL updates |
Ngrok tunnel reference
| 119 | --- |
| 120 | |
| 121 | ## Step 3: Set Up Ngrok |
| 122 | |
| 123 | Required for Stripe App callbacks and Stripe webhooks locally. |
Ngrok tunnel reference
| 123 | Required for Stripe App callbacks and Stripe webhooks locally. |
| 124 | |
| 125 | 1. Install: `choco install ngrok` (Windows) or `brew install ngrok` (macOS) |
| 126 | 2. Auth: `ngrok config add-authtoken YOUR_TOKEN` |
| 127 | 3. Start: `.\scripts\start-ngrok.ps1` or `ngrok http 3001` |
Ngrok tunnel reference
| 124 | |
| 125 | 1. Install: `choco install ngrok` (Windows) or `brew install ngrok` (macOS) |
| 126 | 2. Auth: `ngrok config add-authtoken YOUR_TOKEN` |
| 127 | 3. Start: `.\scripts\start-ngrok.ps1` or `ngrok http 3001` |
| 128 | 4. Get URL: `curl http://127.0.0.1:4040/api/tunnels` |
Ngrok tunnel reference
| 125 | 1. Install: `choco install ngrok` (Windows) or `brew install ngrok` (macOS) |
| 126 | 2. Auth: `ngrok config add-authtoken YOUR_TOKEN` |
| 127 | 3. Start: `.\scripts\start-ngrok.ps1` or `ngrok http 3001` |
| 128 | 4. Get URL: `curl http://127.0.0.1:4040/api/tunnels` |
| 129 |
Ngrok tunnel reference
| 158 | ``` |
| 159 | |
| 160 | For ngrok HTTP forwarding, set `API_HTTP_FOR_NGROK=true` in `.env`. |
| 161 | |
| 162 | --- |
Ngrok tunnel reference
| 166 | In [Stripe Dashboard](https://dashboard.stripe.com/test/webhooks): |
| 167 | |
| 168 | 1. Add endpoint: `https://YOUR-NGROK-URL/webhooks/stripe` |
| 169 | 2. Events: `checkout.session.completed`, `customer.subscription.updated`, `customer.subscription.deleted` |
| 170 | 3. Copy signing secret to `.env` as `STRIPE_WEBHOOK_SECRET_DEV=whsec_...` |
Ngrok tunnel reference
| 217 | | Catalog sync connection refused | OpenMeter not running — `docker ps` | |
| 218 | | Stripe App missing after cleanup | `npx tsx scripts/openmeter/openmeter-install-stripe-app.ts` | |
| 219 | | Ngrok URL changed | Update `.env`, `config.local.yaml`, Stripe Dashboard; restart OpenMeter | |
| 220 | |
| 221 | See [references/REFERENCE.md](references/REFERENCE.md) for the full troubleshooting matrix. |
Webhook reference
| 1 | --- |
| 2 | name: tl-openmeter-local-dev |
| 3 | description: Set up and troubleshoot OpenMeter for local development with Docker, ngrok, Stripe app, and webhook configuration. Covers self-hosted vs Cloud differences, catalog sync, environment-aware webhook handling, and OpenMeter Apps (Stripe, Sandbox). Use when setting up OpenMeter locally, configuring ngrok for webhooks, debugging catalog sync, or preparing local dev to match staging/production behavior. |
| 4 | license: MIT |
| 5 | compatibility: Requires Docker Desktop, Node.js 18+, PowerShell or Bash. Ngrok required for Stripe billing. |
Webhook reference
| 13 | # OpenMeter Local Dev Setup |
| 14 | |
| 15 | Run OpenMeter locally with full metering, billing, and webhook support. Covers the gotchas that differ between self-hosted (Docker) and Cloud (staging/production). |
| 16 | |
| 17 | ## When to Use |
Webhook reference
| 20 | - "Configure ngrok for webhooks" |
| 21 | - "Debug catalog sync errors" |
| 22 | - "Why is my webhook 500ing?" |
| 23 | - "Install the Stripe app in OpenMeter" |
| 24 | - "What works locally vs staging?" |
Webhook reference
| 23 | - "Install the Stripe app in OpenMeter" |
| 24 | - "What works locally vs staging?" |
| 25 | - When user mentions OpenMeter + Docker, local dev, or webhook issues |
| 26 | |
| 27 | ## Suite |
Webhook reference
| 39 | - [references/REFERENCE.md](references/REFERENCE.md) — Env vars, Docker services, config files |
| 40 | - [references/apps.md](references/apps.md) — OpenMeter Apps deep dive (Stripe, Sandbox, Custom) |
| 41 | - [references/webhooks.md](references/webhooks.md) — Webhook auth modes, event types, testing |
| 42 | - [scripts/verify-setup.ps1](scripts/verify-setup.ps1) — Verify local OpenMeter environment health |
| 43 | - [assets/env-openmeter.template](assets/env-openmeter.template) — Environment variable template |
Webhook reference
| 73 | | Entitlement checks | Yes | Yes | |
| 74 | | Billing with Stripe App | Yes (via `apps.baseURL`) | Yes | |
| 75 | | Webhook channels via API | **NO** ("not implemented") | Yes (Svix-backed) | |
| 76 | | Webhook notifications | **Yes** (YAML config only) | Yes (API channels) | |
| 77 | | Svix signature verification | No (plain HTTP) | Yes | |
Webhook reference
| 74 | | Billing with Stripe App | Yes (via `apps.baseURL`) | Yes | |
| 75 | | Webhook channels via API | **NO** ("not implemented") | Yes (Svix-backed) | |
| 76 | | Webhook notifications | **Yes** (YAML config only) | Yes (API channels) | |
| 77 | | Svix signature verification | No (plain HTTP) | Yes | |
| 78 |
Webhook reference
| 131 | |
| 132 | ```bash |
| 133 | npx tsx scripts/openmeter/set-openmeter-webhook-url.ts |
| 134 | ``` |
| 135 |
Webhook reference
| 146 | ``` |
| 147 | |
| 148 | Expected local output includes `⊘ Skipping webhook channel (not supported on self-hosted OpenMeter)` — this is normal. |
| 149 | |
| 150 | See [references/REFERENCE.md](references/REFERENCE.md) for common errors and fixes. |
Webhook reference
| 172 | --- |
| 173 | |
| 174 | ## Webhook Authentication |
| 175 | |
| 176 | See [references/webhooks.md](references/webhooks.md) for full details. |
Webhook reference
| 179 | |------|-------------|-----------| |
| 180 | | Svix signatures | Cloud (staging/prod) | `SVIX_WEBHOOK_SECRET` + Svix headers | |
| 181 | | x-webhook-secret | Self-hosted with secret | `OPENMETER_WEBHOOK_SECRET` header check | |
| 182 | | Dev passthrough | Local (no secret set) | Accepts all — self-hosted sends plain HTTP | |
| 183 |
Webhook reference
| 201 | curl http://localhost:8888/api/v1/apps |
| 202 | |
| 203 | # Webhook endpoint responding |
| 204 | curl -X POST http://127.0.0.1:3001/webhooks/openmeter \ |
| 205 | -H "Content-Type: application/json" \ |