2026-07-21 - 2026-10-21

Overview

244 Active Pull Requests
252 Active Issues
Excluding merges, 3 authors have pushed 12 commits to main and 238 commits to all branches. On main, 52 files have changed and there have been 4294 additions and 1217 deletions.

3 Releases published by 1 user

Published v1.0.0-rc3 2026-10-21 17:34:15 +02:00

Published v1.0.0-rc2 2026-10-16 00:57:16 +02:00

Published v1.0.0-rc1 2026-10-13 10:53:36 +02:00

243 Pull requests merged by 2 users

Merged #557 Run the tests with cgo off and without the race detector (closes #538) 2026-10-21 17:28:51 +02:00

Merged #555 Store events and create deliveries in the delivery engine (closes #544) 2026-10-16 00:51:27 +02:00

Merged #554 Store a target's settings as columns (closes #543) 2026-10-15 23:02:40 +02:00

Merged #553 Use one recovery routine at start and on every sweep tick (closes #542) 2026-10-15 21:57:06 +02:00

Merged #552 Move the archive files into their own package (closes #541) 2026-10-15 21:03:43 +02:00

Merged #546 Store a webhook's retention as a plain day count, 0 meaning forever (closes #539) 2026-10-15 20:03:33 +02:00

Merged #547 Store a target's number of delivery attempts, at least one 2026-10-15 19:38:14 +02:00

Merged #551 Say the query logger drops bound values 2026-10-15 18:57:59 +02:00

Merged #549 Send only the Referer's scheme and host to Sentry 2026-10-15 18:07:22 +02:00

Merged #550 Build the binary without cgo 2026-10-15 17:36:36 +02:00

Merged #537 Drop unsafe-inline from the Content-Security-Policy 2026-10-15 16:18:27 +02:00

Merged #536 Bind 0.0.0.0 to IPv4 only 2026-10-15 15:44:43 +02:00

Merged #534 Keep the entrypoint UUID out of webhooker's own logs 2026-10-15 14:58:35 +02:00

Merged #532 Leave a delivery cut off by a stop for the next start 2026-10-15 12:29:17 +02:00

Merged #380 Milestone: next into main 2026-10-15 11:36:39 +02:00

Merged #533 Store delivery and archive times without the monotonic clock reading 2026-10-15 11:15:36 +02:00

Merged #526 Build the image's static binary with netgo, osusergo and sqlite_omit_load_extension (closes #525) 2026-10-13 10:43:47 +02:00

Merged #524 Describe code in its own terms, not by an earlier build's data (closes #522) 2026-10-13 09:57:24 +02:00

Merged #523 Escape the database path in the SQLite connection string (closes #518) 2026-10-13 09:30:25 +02:00

Merged #521 Remove upgrade and older-build text from the README (closes #520) 2026-10-13 08:31:52 +02:00

Merged #517 Drop Completed Steps from TODO.md; the tracker is the record (closes #112) 2026-10-13 07:18:50 +02:00

Merged #519 Build every database's schema from embedded SQL files (closes #56) 2026-10-13 06:34:06 +02:00

Merged #516 Name Sentry transactions after the route they matched (closes #185) 2026-10-13 05:47:28 +02:00

Merged #515 Make the HSTS max-age configurable with HSTS_MAX_AGE (closes #271) 2026-10-13 03:27:26 +02:00

Merged #514 Document that DATA_DIR must be on a local filesystem (closes #295) 2026-10-13 01:29:44 +02:00

Merged #512 Keep test helpers out of the shipped binary (closes #506) 2026-10-06 14:29:49 +02:00

Merged #513 Read the export test's heap only after pools drop their caches (closes #511) 2026-10-06 10:56:50 +02:00

Merged #510 Make the load-sensitive tests wait for what they check (closes #507) 2026-10-06 08:51:37 +02:00

Merged #509 Refresh the package lists before installing in script/bootstrap (closes #508) 2026-10-06 07:21:31 +02:00

Merged #505 Re-vendor the shared files from sneak/prompts at dd4027b (closes #504) 2026-10-06 06:05:43 +02:00

Merged #502 Mask a target URL's query string when the URL has no path (closes #500) 2026-10-04 03:31:38 +02:00

Merged #501 Store and show an event's query string, and pass it on to an HTTP target when set (closes #312) 2026-10-04 03:00:36 +02:00

Merged #498 Merge main into next after 416 (closes #497) 2026-10-03 14:29:51 +02:00

Merged #416 main side of 414: cheaper test hashing, and failing tests visible in the build log (closes #414) 2026-10-03 14:08:52 +02:00

Merged #496 Install ESLint and prettier with yarn 4 through corepack (closes #493) 2026-10-03 07:03:32 +02:00

Merged #495 Break long values on the webhook page and event log at phone width (closes #391) 2026-10-03 06:56:44 +02:00

Merged #492 Format the Markdown with prettier in make fmt and make fmt-check (closes #215) 2026-10-03 06:32:28 +02:00

Merged #494 Split source_management.go along its CRUD seams (closes #274) 2026-10-03 06:19:47 +02:00

Merged #490 Event log: show only the events with a failed or a pending delivery (closes #390) 2026-10-03 05:40:35 +02:00

Merged #489 Show an event's entrypoint and request headers in the event log and on its page (closes #389) 2026-10-03 05:22:15 +02:00

Merged #491 Use one name for each thing the UI shows (closes #399) 2026-10-03 05:07:42 +02:00

Merged #486 Lint static/js/ with ESLint in Docker (closes #120) 2026-10-03 04:24:11 +02:00

Merged #482 Rotate a database target's archive monthly, daily or hourly (closes #379) 2026-10-03 04:18:38 +02:00

Merged #487 Event log: show attempt and delivery times, label replays, zone event times (closes #386) 2026-10-03 04:12:27 +02:00

Merged #488 Event log: only the newest event expanded, and only the 50 most recent (closes #349) 2026-10-03 03:43:28 +02:00

Merged #485 Name the item and what is lost in each delete prompt (closes #400) 2026-10-03 03:33:15 +02:00

Merged #484 Say what a database or log target's attempt did, without a status (closes #388) 2026-10-03 02:41:17 +02:00

Merged #471 Event log: an event's ID can be selected without toggling it (closes #348) 2026-10-03 02:32:10 +02:00

Merged #483 Offer no Replay for a delivery to a deleted target (closes #387) 2026-10-03 02:13:18 +02:00

Merged #478 Show a target paused by its circuit breaker (closes #385) 2026-10-03 02:06:20 +02:00

Merged #481 Remove an http target's max_queue_size (closes #477) 2026-10-03 01:39:13 +02:00

Merged #480 Show each page's own title in the browser tab (closes #117) 2026-10-03 01:30:03 +02:00

Merged #479 Offer archive expiry choices on the target forms, show plain units (closes #396) 2026-10-03 01:16:15 +02:00

Merged #474 Keep what was typed when a target or webhook edit is refused (closes #381) 2026-10-03 00:51:56 +02:00

Merged #473 Pin tailwindcss and check the committed stylesheet against it (closes #231) 2026-10-03 00:30:57 +02:00

Merged #476 New-webhook page: optional HTTP target URL and archive with pruning (closes #373) 2026-10-03 00:21:56 +02:00

Merged #475 Show a slack target's retry setting in the target list (closes #395) 2026-10-03 00:19:13 +02:00

Merged #472 Show each target's delivered and failed deliveries in the target list (closes #372) 2026-10-02 23:47:17 +02:00

Merged #470 Show each entrypoint's last event and event count on the webhook page (closes #393) 2026-10-02 23:16:08 +02:00

Merged #463 Targets section: one Add, then a target type and Next, then that type's fields (closes #370) 2026-10-02 22:24:39 +02:00

Merged #465 Give each event its own page and show bodies the same everywhere (closes #369) 2026-10-02 22:00:42 +02:00

Merged #460 Report or refuse each unusable file webhooker reads (closes #290) 2026-10-02 21:38:48 +02:00

Merged #464 Let an entrypoint's description be edited in place (closes #392) 2026-10-02 21:32:43 +02:00

Merged #468 Index the event log's resubmit count with deleted_at (closes #325) 2026-10-02 21:23:34 +02:00

Merged #469 Show a database target's archive file, size and last write in the target list (closes #397) 2026-10-02 21:22:34 +02:00

Merged #467 Name each embedded static file so a missing Alpine.js fails the build (closes #166) 2026-10-02 20:56:36 +02:00

Merged #439 Add a Download button that exports a database target's archive as gzipped JSON (closes #374) 2026-10-02 20:32:09 +02:00

Merged #466 Route the delivery tests' gorm.Open through gormlog (closes #462) 2026-10-02 20:20:49 +02:00

Merged #454 Clamp the HTTP drain by the tail-hook reserve (closes #170) 2026-10-02 20:11:43 +02:00

Merged #458 Pin the HTTP target's unpinned error checks (closes #285) 2026-10-02 19:37:36 +02:00

Merged #461 Name the reaper's hard delete in the event body comments (closes #455) 2026-10-02 19:36:30 +02:00

Merged #457 Fix two resubmit comments and test the resubmit route's middleware (closes #252) 2026-10-02 19:20:40 +02:00

Merged #456 Harden the (*gorm.DB).Scan guard test (closes #232) 2026-10-02 19:19:46 +02:00

Merged #451 Try every event database file on delete and say which was left (closes #275) 2026-10-02 18:42:29 +02:00

Merged #447 Make every clickable control look clickable, in two shared styles (closes #375) 2026-10-02 18:32:19 +02:00

Merged #445 Pin the close before the reopen in the archive sweep (closes #103) 2026-10-02 18:16:32 +02:00

Merged #453 Clear the environment in the cmd/webhooker tests that build a Config (closes #452) 2026-10-02 18:03:32 +02:00

Merged #450 Assert the body a retry delivers, not only its status (closes #294) 2026-10-02 18:03:20 +02:00

Merged #449 Pin the body cap's order in every page route group (closes #93) 2026-10-02 17:53:21 +02:00

Merged #442 Check the log charge against every code point (closes #172) 2026-10-02 17:53:11 +02:00

Merged #444 Isolate config tests from the shell; any out-of-range PORT is ErrInvalidPort (closes #94) 2026-10-02 17:44:30 +02:00

Merged #443 Send fx's own events through the service's logger (closes #183) 2026-10-02 17:22:06 +02:00

Merged #448 Pin the rate-limit key for an empty RemoteAddr (closes #168) 2026-10-02 17:09:23 +02:00

Merged #446 Close the retention follow-ups from the August review (closes #99) 2026-10-02 16:50:34 +02:00

Merged #440 Log the client address next to the peer address (closes #270) 2026-10-02 16:50:23 +02:00

Merged #441 Seed the retention tests 50 rows per insert, not 500 (closes #198) 2026-10-02 16:27:01 +02:00

Merged #411 Load Alpine's CSP build so the UI's directives run (closes #371) 2026-10-02 16:09:04 +02:00

Merged #438 Drive the archive reopen debounce test from a clock (closes #190) 2026-10-02 16:03:02 +02:00

Merged #433 Keep each model's parent out of its JSON (closes #177) 2026-10-02 15:43:07 +02:00

Merged #436 Write a form-error page's status only after it renders (closes #128) 2026-10-02 15:34:02 +02:00

Merged #435 Name the CI build step after what the image runs (closes #175) 2026-10-02 15:15:09 +02:00

Merged #437 Toggle only a target's active state, so it cannot undo an edit (closes #431) 2026-10-02 14:43:01 +02:00

Merged #434 Build the middleware test cookie stores with the production constructor (closes #154) 2026-10-02 14:30:52 +02:00

Merged #432 Justify the handlers tests' start limit with a measurement (closes #225) 2026-10-02 14:08:55 +02:00

Merged #417 Show each webhook's activity in the webhook list (closes #394) 2026-10-02 13:57:43 +02:00

Merged #429 Say at the receiver route where its 1 MB body cap lives (closes #173) 2026-10-02 13:40:01 +02:00

Merged #418 Name each database target's archive for its webhook and target (closes #376) 2026-10-02 13:28:50 +02:00

Merged #430 Remove the no-op MAINTENANCE_MODE setting (closes #317) 2026-10-02 13:27:43 +02:00

Merged #428 Let a handler flush or set a write deadline through the access log and metrics (closes #191) 2026-10-02 13:08:55 +02:00

Merged #427 Serve the delivery duration histogram from boot (closes #267) 2026-10-02 12:45:06 +02:00

Merged #409 Add a read-only Settings page for the loaded configuration (closes #402) 2026-10-02 12:30:22 +02:00

Merged #425 Run script/test quietly with coverage, rerun failed tests verbosely (closes #315) 2026-10-02 11:58:43 +02:00

Merged #422 Refuse [::], 0.0.0.0, IPv6 multicast and documentation space (closes #341) 2026-10-02 11:22:31 +02:00

Merged #426 Discard fx's own log in tests that build an fx app (closes #230) 2026-10-02 11:08:38 +02:00

Merged #420 Say what each action did in a one-line notice (closes #383) 2026-10-02 10:30:32 +02:00

Merged #424 Drop TODO.md's stale docs-only cache caveat (closes #421) 2026-10-02 10:14:41 +02:00

Merged #419 Widen the webhook page by half so an entrypoint URL fits on one line (closes #350) 2026-10-02 09:49:34 +02:00

Merged #423 Send the build version in the outbound User-Agent (closes #313) 2026-10-02 09:48:35 +02:00

Merged #346 Serve /metrics from a registry of its own (closes #227) 2026-10-02 09:06:21 +02:00

Merged #410 Derive the image's version from the .git in the build context (closes #366) 2026-10-02 08:41:21 +02:00

Merged #408 Render admin page errors in the normal layout (closes #382) 2026-10-02 08:15:13 +02:00

Merged #407 Say how to allow a refused private target address (closes #398) 2026-10-02 07:52:51 +02:00

Merged #406 Logging in returns to the page that was asked for (closes #384) 2026-10-02 06:57:52 +02:00

Merged #403 Add a statistics pane to the webhook page (closes #368) 2026-10-02 06:41:00 +02:00

Merged #378 Move webhook pages to /hook/ID and inbound URLs to /h/UUID (closes #367) 2026-10-02 06:32:15 +02:00

Merged #415 Run the test suite without -v so a failure shows in the build log (closes #414) 2026-10-02 06:31:53 +02:00

Merged #404 Keep make test under 2 GB of memory (closes #344) 2026-10-02 03:02:29 +02:00

Merged #413 Reword the build-architecture history line in TODO.md (closes #412) 2026-10-02 01:08:23 +02:00

Merged #336 Trust the RFC 1918 ranges as proxies when TRUSTED_PROXIES is unset (closes #333) 2026-10-02 00:41:37 +02:00

Merged #339 State what the default blocklist covers (closes #244) 2026-10-02 00:21:36 +02:00

Merged #361 Show 50 recent events with size, processing time and status (closes #347) 2026-10-01 23:50:01 +02:00

Merged #405 Remove the fixed Account Type row from the profile page (closes #401) 2026-10-01 23:24:42 +02:00

Merged #351 Commit the Alpine.js tarball in 3p/ and extract it at build time (closes #345) 2026-10-01 22:44:42 +02:00

Merged #338 Bound username length at creation (closes #184) 2026-10-01 21:38:48 +02:00

Merged #365 deploy 2026-09-29 13:06:27 +02:00

Merged #364 Next 2026-09-29 13:05:58 +02:00

Merged #353 Container sets its data directory's owner and mode itself 2026-09-29 13:05:17 +02:00

Merged #362 Let a browser with cookies from an earlier database log in (closes #359) 2026-09-29 12:58:44 +02:00

Merged #360 Fast-forward next to main 2026-09-29 12:19:02 +02:00

Merged #357 deployment to prod 2026-09-29 12:01:57 +02:00

Merged #356 Sneak/testdeploy 2026-09-29 12:01:33 +02:00

Merged #355 deployment 2026-09-29 11:54:07 +02:00

Merged #342 Milestone: next into main 2026-09-29 11:53:19 +02:00

Merged #343 Deploy: main into prod 2026-09-29 11:46:50 +02:00

Merged #335 Restrict /s/* to GET and HEAD (closes #169) 2026-09-29 11:10:27 +02:00

Merged #321 1.0.0 milestone: next into main 2026-09-29 11:04:58 +02:00

Merged #337 Drop Set-Cookie from the recovered 500 (closes #193) 2026-09-29 10:30:27 +02:00

Merged #334 Default-block Azure WireServer's public address (closes #245) 2026-09-29 10:22:08 +02:00

Merged #332 Close archive writers when the delivery engine stops (closes #280) 2026-09-29 08:30:24 +02:00

Merged #331 Send Content-Type once on a delivery 2026-09-29 07:11:56 +02:00

Merged #329 Fail a pending delivery whose target was deleted (closes #293) 2026-09-29 06:48:20 +02:00

Merged #330 Make deliveries refused while half-open wait a cooldown (closes #306) 2026-09-29 05:48:21 +02:00

Merged #327 Open each event database once when callers race 2026-09-29 04:37:31 +02:00

Merged #326 Say make check needs make bootstrap on a fresh clone 2026-09-29 04:30:15 +02:00

Merged #328 Do not resend a delivery that restart recovery already sent 2026-09-29 04:12:15 +02:00

Merged #319 Index the event-tier columns the sweeps, event log and retention scan 2026-09-28 14:13:23 +02:00

Merged #322 Default WEBHOOKER_ENVIRONMENT to prod (closes #307) 2026-09-28 12:47:32 +02:00

Merged #324 Document running webhooker under upaas (closes #323) 2026-09-28 12:30:33 +02:00

Merged #320 Say max_retries is the total attempt count, not a retry count 2026-09-21 18:33:10 +02:00

Merged #318 Consolidate the data directory mode into one owner 2026-09-21 10:01:51 +02:00

Merged #302 State the UUID-is-the-credential rule as a rule (closes #301) 2026-08-30 04:05:38 +02:00

Merged #111 Milestone 1.0.0: internet-facing readiness 2026-08-30 04:05:00 +02:00

Merged #300 Render unknown for a zero CreatedAt in Slack/Mattermost messages (closes #298) 2026-08-24 17:52:26 +02:00

Merged #297 Carry the event's receipt time into every delivery (closes #257) 2026-08-24 06:44:24 +02:00

Merged #296 Correct four documentation claims ahead of the 1.0.0 tag 2026-08-24 06:25:09 +02:00

Merged #292 Close the two remaining delivery terminal-state gaps (closes #107) 2026-08-24 05:12:03 +02:00

Merged #287 Create every SQLite file 0600 (closes #255) 2026-08-24 04:33:40 +02:00

Merged #289 Fail loudly on an unparseable SENTRY_DSN and a malformed .env (closes #283) 2026-08-24 04:25:30 +02:00

Merged #286 Derive the source detail BaseURL scheme from reqtls (closes #272) 2026-08-24 04:04:04 +02:00

Merged #263 Make SQLite durable under concurrent readers and stop re-delivering stranded webhooks (closes #256) 2026-08-24 03:49:18 +02:00

Merged #284 Record landed 1.0.0 work and drop the removed signing roadmap in TODO.md 2026-08-24 03:43:17 +02:00

Merged #277 Bind the app port deliberately and document the proxy deployment (closes #268) 2026-08-24 03:38:44 +02:00

Merged #281 Remove inbound request signature verification (closes #279) 2026-08-24 03:25:10 +02:00

Merged #260 Stamp the build version into the binary (closes #253) 2026-08-24 03:15:21 +02:00

Merged #276 Decide request TLS in one place, per request (closes #269) 2026-08-24 03:01:38 +02:00

Merged #273 Check every statement in the webhook deletion transaction (closes #262) 2026-08-24 03:01:34 +02:00

Merged #266 Name a deleted target on its historical deliveries (closes #211) 2026-08-24 02:03:23 +02:00

Merged #264 Bound the /metrics method label (closes #261) 2026-08-24 02:03:19 +02:00

Merged #259 Validate max_retries on both target forms (closes #221) 2026-08-24 01:32:48 +02:00

Merged #258 Label HTTP metrics with the chi route pattern (closes #254) 2026-08-24 01:32:45 +02:00

Merged #251 Resubmit a stored event as a new undelivered event (closes #250) 2026-08-24 00:53:38 +02:00

Merged #249 Record the completed 1.0.0 milestone in TODO.md 2026-08-20 11:16:51 +02:00

Merged #242 Harden operator-set target headers (closes #233) 2026-08-20 10:54:43 +02:00

Merged #217 Add an egress CIDR allowlist to the SSRF guard (closes #204) 2026-08-20 10:34:42 +02:00

Merged #219 Render delivery attempt detail in the event log (closes #202) 2026-08-20 08:36:26 +02:00

Merged #240 Add per-delivery replay to the event log (closes #203) 2026-08-20 08:11:36 +02:00

Merged #239 Add a webhooker resetpw subcommand and a bootstrap banner (closes #208) 2026-08-20 08:01:42 +02:00

Merged #228 Add optional inbound webhook signature verification (closes #67) 2026-08-20 08:01:33 +02:00

Merged #223 Stop target credentials leaking into event databases (closes #206) 2026-08-20 07:55:35 +02:00

Merged #237 Read queue depths with Find, not Scan (closes #234) 2026-08-20 07:55:20 +02:00

Merged #229 Add a target edit form and reachable header/timeout fields (closes #127) 2026-08-20 07:24:13 +02:00

Merged #220 Lock DATA_DIR against a second instance (closes #201) 2026-08-20 07:23:01 +02:00

Merged #222 Log SQL with placeholders, never bound values (closes #207) 2026-08-20 07:21:00 +02:00

Merged #224 Expose delivery metrics on /metrics (closes #209) 2026-08-20 07:19:05 +02:00

Merged #218 Exit non-zero when the HTTP listener fails (closes #200) 2026-08-20 06:42:37 +02:00

Merged #216 Fail startup on half-set metrics credentials (closes #205) 2026-08-20 06:30:25 +02:00

Merged #214 Document backup, restore and upgrade procedures (closes #210) 2026-08-20 06:05:15 +02:00

Merged #213 Record the reopened 1.0.0 milestone in TODO.md 2026-08-20 05:58:03 +02:00

Merged #199 Record the 1.0.0 milestone as complete in TODO.md 2026-08-18 10:50:01 +02:00

Merged #195 Raise script/test's per-package timeout to 90s (closes #194) 2026-08-18 10:44:05 +02:00

Merged #197 Re-sync REPO_POLICIES.md from prompts (closes #196) 2026-08-18 09:33:29 +02:00

Merged #189 Report handler panics through the logger and answer 500 (closes #187) 2026-08-18 08:33:13 +02:00

Merged #182 Route GORM's logger through slog and bound it (closes #178) 2026-08-18 07:17:44 +02:00

Merged #180 Bound every slog line against client-chosen text (closes #176) 2026-08-18 06:03:11 +02:00

Merged #188 Stop a slow host turning a login-guard test into a segfault (closes #186) 2026-08-18 05:01:14 +02:00

Merged #192 Correct TODO.md milestone state and record seventeen landed units 2026-08-18 04:07:40 +02:00

Merged #181 Send the chi route pattern to Sentry, not the concrete path (closes #179) 2026-08-18 02:42:58 +02:00

Merged #174 Read form fields from the POST body only (closes #160) 2026-08-18 02:04:10 +02:00

Merged #171 Verify login credentials before spending rate-limit budget (closes #150) 2026-08-18 01:55:42 +02:00

Merged #165 Run all linting in Docker via Dockerfile.lint (closes #109) 2026-08-18 01:07:17 +02:00

Merged #167 Serve an event's full stored body over HTTP (closes #157) 2026-08-18 00:41:32 +02:00

Merged #155 Bound the access log line against client-chosen text (closes #146) 2026-08-18 00:32:29 +02:00

Merged #161 Mark superseded commits honestly instead of skipped (closes #152) 2026-08-18 00:31:55 +02:00

Merged #159 Set fx.StopTimeout inside the container stop grace (closes #134) 2026-08-18 00:12:52 +02:00

Merged #162 Bucket IPv6 rate-limit keys by /64 (closes #125) 2026-08-17 23:52:16 +02:00

Merged #156 Correct release-blocking README and startup-warning inaccuracies (closes #151) 2026-08-17 23:44:59 +02:00

Merged #164 Fetch Alpine.js at build time under a verified hash (closes #145) 2026-08-17 23:12:17 +02:00

Merged #158 Bound the event log's rendered bodies in the query (closes #135) 2026-08-17 22:57:09 +02:00

Merged #126 Mask the http target's destination URL in the UI (closes #115) 2026-08-17 22:50:27 +02:00

Merged #130 Bound shutdown hooks by their stop context (closes #102) 2026-08-14 06:18:34 +02:00

Merged #131 Render templates via a buffer, not the ResponseWriter (closes #123) 2026-08-14 06:18:22 +02:00

Merged #132 Align session codec max-age with the 7-day cap (closes #108) 2026-08-14 06:17:43 +02:00

Merged #153 Warn when production shares one rate-limit bucket (closes #149) 2026-08-12 13:49:39 +02:00

Merged #148 Record the last four milestone units in TODO.md 2026-08-12 13:21:39 +02:00

Merged #143 Bound the receiver rate limit per client IP across /webhook/* (closes #139) 2026-08-12 13:19:43 +02:00

Merged #144 Correct release-blocking documentation inaccuracies (closes #141) 2026-08-12 13:15:06 +02:00

Merged #138 Make the CI gate execute the checks it reports on (closes #119) 2026-08-12 13:00:52 +02:00

Merged #142 Require a positive RETENTION_SWEEP_INTERVAL (closes #140) 2026-08-12 12:46:40 +02:00

Merged #137 Update TODO.md for the completed 1.0.0 milestone 2026-08-12 12:20:34 +02:00

Merged #136 Scan the X-Forwarded-For chain without splitting it (closes #133) 2026-08-12 12:19:14 +02:00

Merged #129 Cap the X-Forwarded-For hop walk at 64 entries (closes #124) 2026-08-12 11:53:48 +02:00

Merged #122 Gate forwarded-header trust behind trusted-proxy config (closes #88) 2026-08-12 11:36:11 +02:00

Merged #116 Clarify web UI terminology, copy, and the entrypoint URL (closes #57) 2026-08-11 15:42:09 +02:00

Merged #121 Mask the target URL in delivery errors, SSRF logs and log page data (closes #118) 2026-08-11 15:11:58 +02:00

Merged #87 Rate-limit the public webhook receiver endpoint (closes #64) 2026-08-11 14:47:22 +02:00

Merged #91 Enforce the body size limit before CSRF parses the form (closes #90) 2026-08-11 14:37:39 +02:00

Merged #114 Mask target config on the source detail page (closes #113) 2026-08-11 14:37:10 +02:00

Merged #96 Allow retention_days of 0 to mean retain forever (closes #79) 2026-08-11 14:35:35 +02:00

Merged #105 Add inactivity-based session timeout (closes #66) 2026-08-10 16:12:40 +02:00

Merged #92 Fail loudly on set-but-unparseable env config values (closes #80) 2026-08-10 16:06:12 +02:00

Merged #104 Terminally fail retrying deliveries with a non-retry target type (closes #82) 2026-08-10 16:00:04 +02:00

Merged #95 Evict archive writers on deletion and sweep idle archives (closes #89) 2026-08-10 15:52:21 +02:00

Merged #100 Root background loops at context.Background() (closes #97) 2026-08-10 15:44:56 +02:00

Merged #83 Add admin password change flow (closes #65) 2026-08-07 23:23:05 +02:00

Merged #86 Update golangci-lint to v2.12.2 with canonical config 2026-08-07 23:18:49 +02:00

Merged #84 Implement the database archiving target (closes #43) 2026-08-07 22:50:08 +02:00

Merged #81 Refactor delivery targets to a Target interface (closes #77) 2026-08-07 17:07:49 +02:00

Merged #78 Add per-webhook event retention reaper (closes #63) 2026-08-07 16:15:14 +02:00

Merged #75 Add NoCache middleware for authenticated pages (closes #61) 2026-08-07 15:33:44 +02:00

Merged #73 Validate Slack target URLs at creation time (closes #68) 2026-08-07 14:03:56 +02:00

Merged #74 Keep the SSRF-safe transport in clientForConfig (closes #69) 2026-08-07 14:03:38 +02:00

Merged #71 Wrap /user/{username} in RequireAuth middleware (closes #60) 2026-08-07 14:00:17 +02:00

Merged #72 Raise HTTP WriteTimeout above the request middleware timeout (closes #62) 2026-08-07 13:58:29 +02:00

1 Pull request proposed by 1 user

Proposed #556 next into main 2026-10-16 04:07:32 +02:00

249 Issues closed from 2 users

Closed #538 why is CGO being used? 2026-10-21 17:28:52 +02:00

Closed #544 Move storing an event and creating its deliveries from the handlers into the delivery engine 2026-10-16 00:51:27 +02:00

Closed #543 Store a target's settings as columns instead of a per-type JSON string 2026-10-15 23:02:40 +02:00

Closed #542 Use one recovery routine at start and on every sweep tick 2026-10-15 21:57:06 +02:00

Closed #541 Move the archive files into their own package 2026-10-15 21:03:44 +02:00

Closed #539 Store a webhook's retention as a plain day count, 0 meaning forever 2026-10-15 20:03:34 +02:00

Closed #540 Store a target's number of delivery attempts, at least one, instead of its retries 2026-10-15 19:38:15 +02:00

Closed #535 A comment in the middleware says the query logger writes client values into statements; it drops them 2026-10-15 18:57:59 +02:00

Closed #548 Sentry events can carry the entrypoint URL in the Referer header 2026-10-15 18:07:22 +02:00

Closed #545 Build the binary without cgo 2026-10-15 17:36:36 +02:00

Closed #530 CSP allows unsafe-inline scripts and styles and the README never says why 2026-10-15 16:18:27 +02:00

Closed #528 BIND_ADDRESS=0.0.0.0 binds IPv6 too; the README describes it as IPv4-only and distinct from :: 2026-10-15 15:44:43 +02:00

Closed #531 webhooker logs the entrypoint UUID at INFO although the README says to keep it out of logs 2026-10-15 14:58:36 +02:00

Closed #527 A clean stop cancels in-flight delivery attempts and records them as failed; fire-and-forget deliveries are lost to a restart 2026-10-15 12:29:18 +02:00

Closed #529 finished_at and archived_at are stored with Go's monotonic clock reading appended (m=+365.03) 2026-10-15 11:15:37 +02:00

Closed #311 Review toward 1.0: identify and file all next steps 2026-10-13 11:35:45 +02:00

Closed #525 The static image build links glibc's getaddrinfo and dlopen, which the Alpine runtime cannot satisfy 2026-10-13 10:43:48 +02:00

Closed #522 Two code comments explain behaviour by what an earlier build left behind 2026-10-13 09:57:25 +02:00

Closed #518 A # or ? in DATA_DIR makes every database open the same, shorter path 2026-10-13 09:30:25 +02:00

Closed #520 The README describes an upgrade path that does not exist before 1.0 2026-10-13 08:31:53 +02:00

Closed #112 Decision: TODO.md Completed Steps guarantees a merge conflict on every unit landing on next 2026-10-13 07:18:50 +02:00

Closed #56 Move schema_migrations table creation into 000.sql with INTEGER version column 2026-10-13 06:34:07 +02:00

Closed #185 If tracing is ever enabled, every Sentry transaction will collapse into one bucket named POST /(redacted) 2026-10-13 05:47:29 +02:00

Closed #271 HSTS is a hardcoded 2-year includeSubDomains preload commitment with no opt-out and no documentation of its value 2026-10-13 03:27:26 +02:00

Closed #85 Design: should delivery targets own their recovery/sweep loop, not just backoff? 2026-10-13 03:15:17 +02:00

Closed #295 Observation, not a defect: one unreproducible SQLITE_IOERR_SHORT_READ storm under load on ZFS-backed storage 2026-10-13 01:29:45 +02:00

Closed #506 Test helpers are compiled into the shipped binary 2026-10-06 14:29:49 +02:00

Closed #511 Make next green: TestArchiveExport_Streams measures the shared heap and fails go test on noise 2026-10-06 10:56:50 +02:00

Closed #507 Tests that fail at random under load 2026-10-06 08:51:37 +02:00

Closed #508 CI fails at bootstrap: the runner cannot install Go 2026-10-06 07:21:32 +02:00

Closed #504 Re-vendor the canonical files from sneak/prompts at dd4027b 2026-10-06 06:05:44 +02:00

Closed #98 Deprecated gomodguard linter in the org-standard .golangci.yml (needs an upstream decision) 2026-10-06 01:42:40 +02:00

Closed #265 script/docker is no longer byte-identical to the model script, and CI-built images stamp version "unknown" 2026-10-06 01:42:40 +02:00

Closed #248 Migrate .golangci.yml from the deprecated gomodguard to gomodguard_v2 2026-10-06 01:22:53 +02:00

Closed #500 The Redactor misses an echoed request line when the target URL has a query string but no path 2026-10-04 03:31:38 +02:00

Closed #312 The inbound query string is discarded: a sender's URL parameters never reach storage, the UI or a target 2026-10-04 03:00:36 +02:00

Closed #497 Merge main into next so the milestone PR merges again after 416 2026-10-03 14:29:51 +02:00

Closed #414 Make main and next green: make test fails in the Docker build, and its output is cut off before the failure 2026-10-03 14:08:52 +02:00

Closed #493 yarn 1 prints a url.parse() deprecation warning in the js-deps stage 2026-10-03 07:03:32 +02:00

Closed #377 Audit: missing basic functionality and information across the whole UI 2026-10-03 06:57:00 +02:00

Closed #391 At phone width the event log and the target list cut off statuses and controls 2026-10-03 06:56:44 +02:00

Closed #215 make fmt does not format Markdown, so the org prettier settings are unenforced here 2026-10-03 06:32:28 +02:00

Closed #274 Split internal/handlers/source_management.go along its three CRUD seams 2026-10-03 06:19:47 +02:00

Closed #390 Event log cannot show only the events whose delivery failed 2026-10-03 05:40:35 +02:00

Closed #389 The event log never shows an event's request headers or the entrypoint it arrived at 2026-10-03 05:22:15 +02:00

Closed #399 The UI names the same things in different ways 2026-10-03 05:07:42 +02:00

Closed #120 No JS linting, so the styleguide REPO_POLICIES binds us to is unenforced 2026-10-03 04:24:11 +02:00

Closed #379 Archive database target: rotation setting puts year-month, day or hour in the filename 2026-10-03 04:18:38 +02:00

Closed #386 Event log: attempts and deliveries show no time, event times have no zone, replays look like originals 2026-10-03 04:12:28 +02:00

Closed #349 Event log: only the newest event expanded on load, and only the 50 most recent events 2026-10-03 03:43:29 +02:00

Closed #400 Delete confirmations do not name the item or say what is lost 2026-10-03 03:33:15 +02:00

Closed #388 Database and log target deliveries read "Status: — (no response)" 2026-10-03 02:41:17 +02:00

Closed #348 Log viewer: the caret does not collapse an event; clicking the row should toggle it 2026-10-03 02:32:10 +02:00

Closed #387 Replay is offered for a deleted target, and its refusal gives advice that cannot work 2026-10-03 02:13:18 +02:00

Closed #385 A target paused by its circuit breaker is not shown as paused 2026-10-03 02:06:20 +02:00

Closed #477 An http target's max_queue_size is stored and shown but nothing enforces it 2026-10-03 01:39:13 +02:00

Closed #117 Page {{define "title"}} blocks never render; every browser tab reads "Webhooker" 2026-10-03 01:30:03 +02:00

Closed #396 Archive expiry is a raw duration typed by hand (720h) 2026-10-03 01:16:15 +02:00

Closed #381 Target and webhook edit pages lose what was typed when a save is rejected 2026-10-03 00:51:57 +02:00

Closed #231 tailwindcss is unpinned, so the committed static/css/tailwind.css is not reproducible from the repo's own tooling 2026-10-03 00:30:58 +02:00

Closed #373 New-webhook page: optional HTTP target URL and archive checkbox with pruning choice, creating those targets 2026-10-03 00:21:56 +02:00

Closed #395 The slack target's retry setting is not shown in the target list 2026-10-03 00:19:13 +02:00

Closed #372 Target list: successful and failed deliveries per target, in total and in the last 24h 2026-10-02 23:47:17 +02:00

Closed #393 Entrypoints do not show when they last received an event 2026-10-02 23:16:08 +02:00

Closed #370 Targets on the webhook page: one + Add, then pick a target type, then that type's settings 2026-10-02 22:24:39 +02:00

Closed #369 Event bodies: per-event page, expandable recent events, full bodies under 32k, JSON formatted, scroll well over 200 lines 2026-10-02 22:00:42 +02:00

Closed #290 File-sourced configuration paths have never been audited for silent defaults 2026-10-02 21:38:48 +02:00

Closed #459 The main database's open errors do not name the file 2026-10-02 21:38:48 +02:00

Closed #392 An entrypoint's description cannot be changed 2026-10-02 21:32:43 +02:00

Closed #325 The event log's resubmit count reads every live event instead of using the resubmitted_from_id index 2026-10-02 21:23:34 +02:00

Closed #397 A database target does not show its archive file, size or last write 2026-10-02 21:22:34 +02:00

Closed #166 static.go embeds the js directory, so a missing fetched asset silently produces a binary with no Alpine 2026-10-02 20:56:36 +02:00

Closed #374 Database targets: a Download button that exports the SQLite contents as gzipped JSON 2026-10-02 20:32:09 +02:00

Closed #462 Six test-only gorm.Open calls still pass a bare gorm.Config 2026-10-02 20:20:49 +02:00

Closed #170 Clamp the HTTP drain by the tail-hook reserve, not just the Sentry flush 2026-10-02 20:11:44 +02:00

Closed #285 The withRetry bookkeeping-failure branch is unpinned: removing its error check leaves the suite green 2026-10-02 19:37:36 +02:00

Closed #455 The eventBodyQuery comment credits the soft-delete predicate for refusing a reaped event 2026-10-02 19:36:30 +02:00

Closed #252 Follow-ups from the PR 251 review: two comments state the wrong mechanism, and the resubmit route's middleware is untested 2026-10-02 19:20:40 +02:00

Closed #232 Harden the (*gorm.DB).Scan guard test: three evasions, an overstated doc comment, and a weak file-count floor 2026-10-02 19:19:46 +02:00

Closed #275 DeleteDB returns on the first failing suffix, so it can report a leftover file when the history is already destroyed 2026-10-02 18:42:29 +02:00

Closed #375 Clickable things must look clickable: the entrypoint URL "copy" control, "+ Add", and every other one 2026-10-02 18:32:19 +02:00

Closed #103 Pin the pre-reopen close in archiveWriter.sweepExpired (unprotected connection-leak guard) 2026-10-02 18:16:32 +02:00

Closed #452 Tests outside the config package still read the developer's shell when they build a Config 2026-10-02 18:03:32 +02:00

Closed #294 TestProcessRetryTask_LargeBody_FetchFromDB stays green when the fetch it exists to exercise is deleted 2026-10-02 18:03:20 +02:00

Closed #93 Follow-ups from the PR #91 review: body-limit docs and route-ordering test coverage 2026-10-02 17:53:21 +02:00

Closed #172 Assert the access-log encoded-byte charge against every Unicode code point 2026-10-02 17:53:11 +02:00

Closed #94 Follow-ups from the PR #92 review: config test hygiene and env docs 2026-10-02 17:44:30 +02:00

Closed #183 Two writers bypass internal/logger: fx's console logger and the Go runtime 2026-10-02 17:22:06 +02:00

Closed #238 The event-DB sweep marker is monotonic and trusts itself, so a downgrade re-leaks target rows permanently 2026-10-02 17:09:59 +02:00

Closed #168 Rate-limit key collapses every peer with an empty RemoteAddr into one bucket 2026-10-02 17:09:24 +02:00

Closed #99 Follow-ups from the PR #96 re-review: retention bound docs and untested normalisation 2026-10-02 16:50:34 +02:00

Closed #270 The access log records the proxy's address, never the client's, so abuse cannot be traced from webhooker's own logs 2026-10-02 16:50:23 +02:00

Closed #198 make test is past the org 20s target and arguably past the 60s hard cap, driven almost entirely by internal/handlers 2026-10-02 16:27:01 +02:00

Closed #371 The UI's Alpine.js never runs: the Content-Security-Policy forbids the eval it needs 2026-10-02 16:09:04 +02:00

Closed #190 Last wall-clock-dependent test: two writes must land inside a real 2s debounce window or correct code reds 2026-10-02 16:03:02 +02:00

Closed #101 Archive sweep repeats open/prune/close once per database target instead of once per webhook 2026-10-02 15:43:30 +02:00

Closed #177 Target.Webhook and Webhook.Targets form a reference cycle that will recurse once anything marshals a preloaded model 2026-10-02 15:43:07 +02:00

Closed #128 Form-error paths commit a 4xx before rendering, so a failed render there cannot report 500 2026-10-02 15:34:03 +02:00

Closed #175 The CI workflow step is named "runs make check", which the image has never done 2026-10-02 15:15:09 +02:00

Closed #431 The target toggle saves the whole row, so it can undo an edit of the same target 2026-10-02 14:43:01 +02:00

Closed #154 middleware tests construct cookie stores by hand, so they no longer match the production store 2026-10-02 14:30:52 +02:00

Closed #225 internal/handlers tests are load-fragile: both the fx start budget and the 90s package timeout blow under host load, so the gate reports failures unrelated to the change 2026-10-02 14:08:55 +02:00

Closed #394 Webhook list does not show which webhooks are receiving or failing 2026-10-02 13:57:43 +02:00

Closed #173 The receiver's 1 MB body cap lives in the handler, not the middleware the other route groups use 2026-10-02 13:40:01 +02:00

Closed #376 Archive database filename includes the webhook name and the target name 2026-10-02 13:28:50 +02:00

Closed #317 MAINTENANCE_MODE is a documented no-op configuration variable 2026-10-02 13:27:44 +02:00

Closed #191 loggingResponseWriter has no Unwrap, so http.ResponseController cannot reach the real writer through the shipped chain 2026-10-02 13:08:55 +02:00

Closed #267 webhooker_delivery_duration_seconds is absent from a scrape until the first delivery occurs 2026-10-02 12:45:06 +02:00

Closed #402 No page shows the server's settings 2026-10-02 12:30:22 +02:00

Closed #315 script/test always runs verbose and never measures coverage, against the policy pattern 2026-10-02 11:58:43 +02:00

Closed #341 The SSRF guard lets a delivery reach [::], which is the host itself on Linux 2026-10-02 11:22:31 +02:00

Closed #230 Data race in internal/handlers/logbound_test.go: fx testutil.WriteSyncer calls t.Logf from a start hook after the test goroutine has finished 2026-10-02 11:08:38 +02:00

Closed #383 No message after saving, deleting, activating or signing out 2026-10-02 10:30:32 +02:00

Closed #421 TODO.md says a docs-only commit replays from the layer cache, which is no longer true 2026-10-02 10:14:41 +02:00

Closed #350 Webhook page: widen the entrypoints container by 50-100% so the URL does not wrap 2026-10-02 09:49:34 +02:00

Closed #313 Outbound User-Agent is the hardcoded webhooker/1.0, not the stamped build version 2026-10-02 09:48:35 +02:00

Closed #227 go test -count=2 ./internal/server/... panics on duplicate metrics collector registration 2026-10-02 09:06:21 +02:00

Closed #366 Image built by upaas stamps version "unknown" into the binary 2026-10-02 08:41:21 +02:00

Closed #382 Error pages outside forms are bare text with no way back 2026-10-02 08:15:13 +02:00

Closed #398 Refusing a private target address does not say how to allow it 2026-10-02 07:52:51 +02:00

Closed #384 Signing in does not return to the page that was asked for 2026-10-02 06:57:52 +02:00

Closed #368 Per-webhook page: statistics pane at the top (lifetime and per retention period) 2026-10-02 06:41:01 +02:00

Closed #367 Routes: per-webhook page under /webhook/ (not /source/), its log at .../events, inbound URLs under /h/UUID or /ingest/UUID 2026-10-02 06:32:15 +02:00

Closed #344 make test needs up to 6.7 GiB of RAM (handlers and database tests under -race) 2026-10-02 03:02:29 +02:00

Closed #412 Remove buildarch mentions: the architecture is read at runtime 2026-10-02 01:08:23 +02:00

Closed #333 Trust the RFC 1918 ranges as proxies when TRUSTED_PROXIES is unset 2026-10-02 00:41:37 +02:00

Closed #244 blockedNetworks does not cover in-cloud provider service networks on public unicast, e.g. IBM Cloud 161.26.0.0/16 and 166.8.0.0/14 2026-10-02 00:21:36 +02:00

Closed #347 Recent events on a webhook page: 50 rows, relative times, size, processing time, delivery status 2026-10-01 23:50:01 +02:00

Closed #401 Profile page says "Account Type: Standard User" for the admin account 2026-10-01 23:24:42 +02:00

Closed #345 Commit the Alpine.js tarball in 3p/ instead of downloading it at build time 2026-10-01 22:44:42 +02:00

Closed #184 Nothing bounds username length, and an account with a multi-KB username cannot log in at all 2026-10-01 21:38:48 +02:00

Closed #363 Run every build, test and lint step in the Dockerfiles at nice -n 19 2026-09-29 13:12:14 +02:00

Closed #340 The container sets its data directory permissions itself before startup 2026-09-29 13:05:17 +02:00

Closed #359 After a restart under upaas: new admin password, and logging in with it returns 500 2026-09-29 12:58:45 +02:00

Closed #169 Restrict /s/* to GET and HEAD — it currently answers POST, PUT and DELETE with 200 2026-09-29 11:10:27 +02:00

Closed #193 Headers set before an uncommitted panic survive onto the recovered 500, including Set-Cookie 2026-09-29 10:30:27 +02:00

Closed #245 Default-block the public-unicast cloud metadata endpoints (Azure WireServer, Equinix Metal) 2026-09-29 10:22:08 +02:00

Closed #280 Archive writers are never closed at shutdown, so their -wal survives a clean stop 2026-09-29 08:30:25 +02:00

Closed #246 A delivery can carry Content-Type twice when the inbound event also supplied one 2026-09-29 07:11:56 +02:00

Closed #293 A pending delivery whose target was deleted is stranded forever 2026-09-29 06:48:20 +02:00

Closed #306 Circuit breaker half-open state busy-loops queued tasks with a DB write per spin 2026-09-29 05:48:22 +02:00

Closed #291 GetDB can open the same event database twice, and closing the loser drops the winner's file locks 2026-09-29 04:37:31 +02:00

Closed #282 make check fails on a fresh clone because script/check does not fetch the vendored assets 2026-09-29 04:30:15 +02:00

Closed #299 Startup recovery races the receiver and can deliver a fresh event twice 2026-09-29 04:12:15 +02:00

Closed #314 No index on the columns the sweeps, recovery and the event log filter by 2026-09-28 14:13:30 +02:00

Closed #307 WEBHOOKER_ENVIRONMENT defaults to dev, silently shipping insecure prod (no Secure cookies, CORS *) 2026-09-28 12:47:32 +02:00

Closed #323 Ready to run under upaas: prod branch, one data volume, env configuration, README section 2026-09-28 12:30:33 +02:00

Closed #316 max_retries=N means N attempts in total, but the form label and the field name say retries 2026-09-21 18:33:22 +02:00

Closed #288 Two constants define the data directory mode, in two packages that both create it 2026-09-21 10:01:52 +02:00

Closed #303 Independent code audit 2026-09-21 09:20:59 +02:00

Closed #278 Changing the password neither regenerates the current session nor invalidates any other one 2026-09-21 09:19:47 +02:00

Closed #305 Notify drops tasks on full channel; pending deliveries only recover on process restart 2026-09-21 09:19:47 +02:00

Closed #308 Listener bind failure leaves the process running with no listener instead of exiting non-zero 2026-09-21 09:19:47 +02:00

Closed #309 SSRF blocking has no opt-out: cannot deliver to RFC1918/LAN targets — needs ALLOWED_TARGET_CIDRS 2026-09-21 09:19:47 +02:00

Closed #310 Replay/redelivery does not exist and the UI shows no per-attempt results, despite README promises 2026-09-21 09:19:47 +02:00

Closed #304 SQLite concurrency: cache=shared, no busy_timeout, no WAL, unbounded pool — concurrent writers get SQLITE_BUSY, deliveries stick pending 2026-08-30 06:11:52 +02:00

Closed #301 Document that the entrypoint UUID is the authentication and shared secrets are never used 2026-08-30 04:05:38 +02:00

Closed #147 CI gate follow-ups: script/cibuild has drifted from the model script, and the status-rewrite context string is hardcoded 2026-08-30 04:05:01 +02:00

Closed #298 The reaped-row fallback renders the exact zero timestamp that #257 was filed against 2026-08-24 17:52:26 +02:00

Closed #257 Every Slack message shows a zero timestamp of 0001-01-01T00:00:00Z 2026-08-24 06:44:24 +02:00

Closed #107 Two remaining delivery terminal-state gaps: opaque failure and deletion-orphaned retries 2026-08-24 05:12:03 +02:00

Closed #255 SQLite files are created 0644 with plaintext credentials, and the documented Docker deployment supplies the parent directory 0755 2026-08-24 04:33:41 +02:00

Closed #283 Two config paths fail silently: an unparseable SENTRY_DSN starts anyway, and a malformed .env is discarded whole 2026-08-24 04:25:30 +02:00

Closed #272 BaseURL on the source detail page uses the raw X-Forwarded-Proto value as the URL scheme 2026-08-24 04:04:05 +02:00

Closed #256 A concurrent reader wedges the per-webhook database, stranding delivered webhooks at pending and re-delivering them on restart 2026-08-24 03:49:18 +02:00

Closed #226 SIGTERM during startup panics on a nil httpServer, and cleanShutdown reads two fields with no happens-before edge 2026-08-24 03:39:13 +02:00

Closed #268 The plaintext app port binds all interfaces and the README has no reverse-proxy deployment section 2026-08-24 03:38:44 +02:00

Closed #241 README understates who can replay a signed request: forwarding X-Hub-Signature-256 hands every target a valid (body, signature) pair 2026-08-24 03:25:28 +02:00

Closed #279 Remove inbound request signature verification: the entrypoint UUID is the authentication secret 2026-08-24 03:25:10 +02:00

Closed #253 The shipped binary reports version "dev": no -X ldflags in the Makefile or Dockerfile 2026-08-24 03:15:21 +02:00

Closed #269 The session cookie silently loses Secure in the default environment, and X-Forwarded-Proto parsing is exact-match 2026-08-24 03:01:38 +02:00

Closed #262 Webhook deletion commits a partial delete and reports success when a delete statement fails 2026-08-24 03:01:34 +02:00

Closed #211 Deleting a target blanks its name on every historical delivery in the event log 2026-08-24 02:03:24 +02:00

Closed #261 The /metrics method label is still unbounded: 300 requests with random method tokens mint 7,525 permanent series 2026-08-24 02:03:19 +02:00

Closed #221 max_retries is unbounded at target creation, and unparseable input silently becomes 0 2026-08-24 01:32:48 +02:00

Closed #254 Enabling /metrics lets an unauthenticated client grow the process without bound, and publishes live entrypoint UUIDs 2026-08-24 01:32:45 +02:00

Closed #247 Invalid target header name error no longer indicates which line was rejected 2026-08-24 00:58:35 +02:00

Closed #250 Resubmit a stored event as a new undelivered event, so backends can be tested against real captured traffic 2026-08-24 00:53:38 +02:00

Closed #243 Forwarded inbound event headers are not stripped on a cross-origin redirect, unlike operator-configured ones 2026-08-20 10:55:03 +02:00

Closed #233 Operator-set target headers: credential headers survive a cross-host redirect, Trailer is not reserved, and an invalid header name error can quote a secret 2026-08-20 10:54:43 +02:00

Closed #204 The SSRF blocklist has no escape hatch, so a self-hosted proxy cannot forward to your own network 2026-08-20 10:34:42 +02:00

Closed #236 next ships a target edit form whose Tailwind classes are missing from the committed CSS 2026-08-20 08:36:37 +02:00

Closed #202 Delivery failures are invisible in the UI: nothing renders status_code, response_body, error or attempt_num 2026-08-20 08:36:26 +02:00

Closed #203 No replay: a delivery that exhausts max_retries is failed forever, and store-and-forward is the point 2026-08-20 08:11:36 +02:00

Closed #208 No admin password recovery path: lose the one-time bootstrap line and the deployment is unreachable 2026-08-20 08:01:42 +02:00

Closed #67 Optional inbound webhook HMAC signature verification 2026-08-20 08:01:33 +02:00

Closed #206 Target credentials leak into the per-webhook event databases via GORM association upsert 2026-08-20 07:55:35 +02:00

Closed #234 next is red: queue_depth.go calls (*gorm.DB).Scan, which interpolates bound values into logged SQL 2026-08-20 07:55:21 +02:00

Closed #235 next is red: queue_depth.go calls (*gorm.DB).Scan, tripping the scan guard 2026-08-20 07:41:25 +02:00

Closed #127 No target edit form: a target's destination URL, headers and timeout are write-once 2026-08-20 07:24:13 +02:00

Closed #201 No lock on DATA_DIR: two instances both run delivery recovery and both deliver 2026-08-20 07:23:01 +02:00

Closed #207 DEBUG=true prints the session encryption key and the admin password hash to the log 2026-08-20 07:21:00 +02:00

Closed #209 No delivery metrics: /metrics cannot tell you whether the product is doing its job 2026-08-20 07:19:05 +02:00

Closed #200 A failed listen leaves a live, non-serving process that fx still reports RUNNING 2026-08-20 06:42:37 +02:00

Closed #205 METRICS_USERNAME set with an empty METRICS_PASSWORD publishes /metrics unauthenticated 2026-08-20 06:30:25 +02:00

Closed #210 No backup, restore or upgrade guidance anywhere in the README 2026-08-20 06:05:16 +02:00

Closed #194 internal/handlers runs at 22s against script/test's 30s per-package timeout, and has already reded a build under load 2026-08-18 10:44:05 +02:00

Closed #196 REPO_POLICIES.md is a stale copy: it mandates a 30s test timeout the org policy replaced with 90s 2026-08-18 09:33:29 +02:00

Closed #187 chi's Recoverer panics instead of handling a handler panic, so a panicking request drops the connection instead of answering 500 2026-08-18 08:33:13 +02:00

Closed #178 GORM's default logger prints the full interpolated SQL, including the client-chosen path and username, on every record-not-found 2026-08-18 07:17:44 +02:00

Closed #176 MaxBodySize logs the full client-chosen path ahead of RequireAuth, sidestepping the access-log line budget 2026-08-18 06:03:11 +02:00

Closed #186 A timing-sensitive login-guard test panics on a nil release and reds the whole internal/middleware package 2026-08-18 05:01:14 +02:00

Closed #179 The receiver's capability URL is sent to Sentry in full 2026-08-18 02:42:59 +02:00

Closed #160 Target create reads the destination URL via r.FormValue, so a query-string credential lands in the access log and Sentry 2026-08-18 02:04:10 +02:00

Closed #150 Decision: should login rate limiting survive a shared bucket, or should TRUSTED_PROXIES be mandatory in production? 2026-08-18 01:55:42 +02:00

Closed #106 script/lint uses the host golangci-lint and a shared cache, so lint results can be wrong in either direction 2026-08-18 01:07:29 +02:00

Closed #109 Run all linting in Docker via Dockerfile.lint + script/lint 2026-08-18 01:07:17 +02:00

Closed #157 No in-app way to retrieve an event body larger than the event log's 8 KB render cap 2026-08-18 00:41:32 +02:00

Closed #146 The access log writes one INFO line with the full attacker-controlled URL per request, including rejected ones 2026-08-18 00:32:29 +02:00

Closed #152 Superseded-run status laundering: a never-tested commit reads green in the combined status 2026-08-18 00:31:55 +02:00

Closed #134 fx.StopTimeout is never set, so the bounded-shutdown fix does not fire under a default docker stop 2026-08-18 00:12:52 +02:00

Closed #125 Decision: should IPv6 rate-limit keys bucket by /64 rather than per-address? 2026-08-17 23:52:16 +02:00

Closed #151 Release-blocking accuracy: README describes a build and an endpoint that do not exist, and the lockout warning misses the default environment 2026-08-17 23:44:59 +02:00

Closed #145 A minified vendored bundle is committed to the repo, which REPO_POLICIES forbids 2026-08-17 23:12:18 +02:00

Closed #135 The event-log page renders stored bodies untruncated, so buffered rendering can hold ~25 MB per request 2026-08-17 22:57:09 +02:00

Closed #115 HTTP target destination URL is rendered in full and can itself be a bearer credential 2026-08-17 22:50:27 +02:00

Closed #102 Shutdown hooks ignore their context and wg.Wait() unbounded 2026-08-14 06:18:34 +02:00

Closed #123 renderTemplate streams to the ResponseWriter, so a mid-render template error ships a partial page 2026-08-14 06:18:23 +02:00

Closed #108 Session codec max-age still 30 days: bring securecookie codecs in line with the 7-day cap 2026-08-14 06:17:43 +02:00

Closed #149 Default config allows a remote stranger to lock the operator out of the admin UI, and nothing warns about it 2026-08-12 13:49:39 +02:00

Closed #139 The receiver rate limit is per-URL-path, so an attacker gets unlimited aggregate rate against /webhook/* 2026-08-12 13:19:43 +02:00

Closed #141 Release-readiness accuracy: docs contradict the code, TODO.md omits landed units, debug logging in the production asset 2026-08-12 13:15:06 +02:00

Closed #119 CI can report success without running lint or tests, because script/cibuild replays a cached image 2026-08-12 13:00:52 +02:00

Closed #140 RETENTION_SWEEP_INTERVAL is not range-checked, so a non-positive value panics two goroutines after startup reports success 2026-08-12 12:46:41 +02:00

Closed #133 The hop cap bounds the walk but not the Split: a 1 MB X-Forwarded-For still allocates ~8 MB per request 2026-08-12 12:19:14 +02:00

Closed #124 Cap the X-Forwarded-For hop walk: an unbounded chain burns CPU on every request 2026-08-12 11:53:49 +02:00

Closed #88 Gate forwarded-header trust behind trusted-proxy config in rate limiters 2026-08-12 11:36:11 +02:00

Closed #57 Clean up and clarify the web UI 2026-08-11 15:42:09 +02:00

Closed #118 Slack webhook credential still leaks via delivery errors, SSRF logs, and the source_logs template data 2026-08-11 15:11:58 +02:00

Closed #64 Rate-limit the public webhook receiver endpoint 2026-08-11 14:47:22 +02:00

Closed #90 Enforce request body size limit before CSRF middleware parses the form 2026-08-11 14:37:39 +02:00

Closed #113 Source detail page renders raw target config, exposing the Slack webhook URL credential 2026-08-11 14:37:10 +02:00

Closed #79 RetentionDays cannot be set to 0 (retain forever) via the normal create path 2026-08-11 14:35:35 +02:00

Closed #110 TOP PRIORITY: consolidate all open PRs onto one next branch, one PR 2026-08-11 13:56:44 +02:00

Closed #66 Add inactivity-based session timeout 2026-08-10 16:12:40 +02:00

Closed #80 Config parsing should fail loudly on set-but-unparseable env values (envInt, etc.) 2026-08-10 16:06:12 +02:00

Closed #82 Recovery skips orphaned retrying deliveries whose target type changed to a non-retry type 2026-08-10 16:00:04 +02:00

Closed #89 Archive writer lifecycle: evict writers on webhook deletion and sweep idle archives 2026-08-10 15:52:21 +02:00

Closed #97 CRITICAL: delivery engine and retention reaper both die ~15s after startup (fx OnStart context) 2026-08-10 15:44:56 +02:00

Closed #65 Add an admin password change flow in the web UI 2026-08-07 23:23:05 +02:00

Closed #43 configure db target type for archiving 2026-08-07 22:50:08 +02:00

Closed #77 Refactor delivery targets to a Target interface 2026-08-07 17:07:49 +02:00

Closed #63 Enforce per-webhook event retention (RetentionDays reaper) 2026-08-07 16:15:14 +02:00

Closed #61 Set Cache-Control: no-store on authenticated pages 2026-08-07 15:33:45 +02:00

Closed #70 Implement the log delivery target 2026-08-07 15:26:46 +02:00

Closed #68 Validate Slack target URLs at creation time (SSRF parity with HTTP targets) 2026-08-07 14:03:56 +02:00

Closed #69 Keep the SSRF-safe Transport in clientForConfig when a per-target timeout is set 2026-08-07 14:03:38 +02:00

Closed #60 Wrap the /user/{username} route in RequireAuth middleware 2026-08-07 14:00:17 +02:00

Closed #62 Reconcile HTTP WriteTimeout with the request middleware timeout 2026-08-07 13:58:29 +02:00

249 Issues created by 1 user

Opened #60 Wrap the /user/{username} route in RequireAuth middleware 2026-08-07 13:10:51 +02:00

Opened #61 Set Cache-Control: no-store on authenticated pages 2026-08-07 13:10:55 +02:00

Opened #62 Reconcile HTTP WriteTimeout with the request middleware timeout 2026-08-07 13:10:59 +02:00

Opened #63 Enforce per-webhook event retention (RetentionDays reaper) 2026-08-07 13:11:03 +02:00

Opened #64 Rate-limit the public webhook receiver endpoint 2026-08-07 13:11:08 +02:00

Opened #65 Add an admin password change flow in the web UI 2026-08-07 13:11:13 +02:00

Opened #66 Add inactivity-based session timeout 2026-08-07 13:11:16 +02:00

Opened #67 Optional inbound webhook HMAC signature verification 2026-08-07 13:11:19 +02:00

Opened #68 Validate Slack target URLs at creation time (SSRF parity with HTTP targets) 2026-08-07 13:16:06 +02:00

Opened #69 Keep the SSRF-safe Transport in clientForConfig when a per-target timeout is set 2026-08-07 13:16:10 +02:00

Opened #70 Implement the log delivery target 2026-08-07 13:16:13 +02:00

Opened #77 Refactor delivery targets to a Target interface 2026-08-07 15:05:53 +02:00

Opened #79 RetentionDays cannot be set to 0 (retain forever) via the normal create path 2026-08-07 15:26:51 +02:00

Opened #80 Config parsing should fail loudly on set-but-unparseable env values (envInt, etc.) 2026-08-07 15:29:22 +02:00

Opened #82 Recovery skips orphaned retrying deliveries whose target type changed to a non-retry type 2026-08-07 17:12:07 +02:00

Opened #85 Design: should delivery targets own their recovery/sweep loop, not just backoff? 2026-08-07 18:07:15 +02:00

Opened #88 Gate forwarded-header trust behind trusted-proxy config in rate limiters 2026-08-07 19:11:38 +02:00

Opened #89 Archive writer lifecycle: evict writers on webhook deletion and sweep idle archives 2026-08-07 19:11:43 +02:00

Opened #90 Enforce request body size limit before CSRF middleware parses the form 2026-08-07 19:12:08 +02:00

Opened #93 Follow-ups from the PR #91 review: body-limit docs and route-ordering test coverage 2026-08-09 04:03:32 +02:00

Opened #94 Follow-ups from the PR #92 review: config test hygiene and env docs 2026-08-09 04:08:12 +02:00

Opened #97 CRITICAL: delivery engine and retention reaper both die ~15s after startup (fx OnStart context) 2026-08-09 04:43:26 +02:00

Opened #98 Deprecated gomodguard linter in the org-standard .golangci.yml (needs an upstream decision) 2026-08-09 05:01:01 +02:00

Opened #99 Follow-ups from the PR #96 re-review: retention bound docs and untested normalisation 2026-08-09 05:11:44 +02:00

Opened #101 Archive sweep repeats open/prune/close once per database target instead of once per webhook 2026-08-09 07:26:46 +02:00

Opened #102 Shutdown hooks ignore their context and wg.Wait() unbounded 2026-08-09 07:27:39 +02:00

Opened #103 Pin the pre-reopen close in archiveWriter.sweepExpired (unprotected connection-leak guard) 2026-08-09 07:44:18 +02:00

Opened #106 script/lint uses the host golangci-lint and a shared cache, so lint results can be wrong in either direction 2026-08-09 08:09:02 +02:00

Opened #107 Two remaining delivery terminal-state gaps: opaque failure and deletion-orphaned retries 2026-08-09 08:13:05 +02:00

Opened #108 Session codec max-age still 30 days: bring securecookie codecs in line with the 7-day cap 2026-08-09 08:19:57 +02:00

Opened #109 Run all linting in Docker via Dockerfile.lint + script/lint 2026-08-10 13:14:12 +02:00

Opened #110 TOP PRIORITY: consolidate all open PRs onto one next branch, one PR 2026-08-10 14:30:12 +02:00

Opened #112 Decision: TODO.md Completed Steps guarantees a merge conflict on every unit landing on next 2026-08-10 15:46:14 +02:00

Opened #113 Source detail page renders raw target config, exposing the Slack webhook URL credential 2026-08-11 13:56:16 +02:00

Opened #115 HTTP target destination URL is rendered in full and can itself be a bearer credential 2026-08-11 14:28:51 +02:00

Opened #117 Page {{define "title"}} blocks never render; every browser tab reads "Webhooker" 2026-08-11 14:32:36 +02:00

Opened #118 Slack webhook credential still leaks via delivery errors, SSRF logs, and the source_logs template data 2026-08-11 14:37:28 +02:00

Opened #119 CI can report success without running lint or tests, because script/cibuild replays a cached image 2026-08-11 14:38:28 +02:00

Opened #120 No JS linting, so the styleguide REPO_POLICIES binds us to is unenforced 2026-08-11 14:45:30 +02:00

Opened #123 renderTemplate streams to the ResponseWriter, so a mid-render template error ships a partial page 2026-08-11 15:20:53 +02:00

Opened #124 Cap the X-Forwarded-For hop walk: an unbounded chain burns CPU on every request 2026-08-12 11:36:41 +02:00

Opened #125 Decision: should IPv6 rate-limit keys bucket by /64 rather than per-address? 2026-08-12 11:36:52 +02:00

Opened #127 No target edit form: a target's destination URL, headers and timeout are write-once 2026-08-12 11:42:26 +02:00

Opened #128 Form-error paths commit a 4xx before rendering, so a failed render there cannot report 500 2026-08-12 11:46:09 +02:00

Opened #133 The hop cap bounds the walk but not the Split: a 1 MB X-Forwarded-For still allocates ~8 MB per request 2026-08-12 11:54:06 +02:00

Opened #134 fx.StopTimeout is never set, so the bounded-shutdown fix does not fire under a default docker stop 2026-08-12 11:55:48 +02:00

Opened #135 The event-log page renders stored bodies untruncated, so buffered rendering can hold ~25 MB per request 2026-08-12 11:56:52 +02:00

Opened #139 The receiver rate limit is per-URL-path, so an attacker gets unlimited aggregate rate against /webhook/* 2026-08-12 12:29:51 +02:00

Opened #140 RETENTION_SWEEP_INTERVAL is not range-checked, so a non-positive value panics two goroutines after startup reports success 2026-08-12 12:30:00 +02:00

Opened #141 Release-readiness accuracy: docs contradict the code, TODO.md omits landed units, debug logging in the production asset 2026-08-12 12:30:13 +02:00

Opened #145 A minified vendored bundle is committed to the repo, which REPO_POLICIES forbids 2026-08-12 12:53:08 +02:00

Opened #146 The access log writes one INFO line with the full attacker-controlled URL per request, including rejected ones 2026-08-12 12:57:46 +02:00

Opened #147 CI gate follow-ups: script/cibuild has drifted from the model script, and the status-rewrite context string is hardcoded 2026-08-12 13:00:16 +02:00

Opened #149 Default config allows a remote stranger to lock the operator out of the admin UI, and nothing warns about it 2026-08-12 13:32:06 +02:00

Opened #150 Decision: should login rate limiting survive a shared bucket, or should TRUSTED_PROXIES be mandatory in production? 2026-08-12 13:32:25 +02:00

Opened #151 Release-blocking accuracy: README describes a build and an endpoint that do not exist, and the lockout warning misses the default environment 2026-08-12 13:32:46 +02:00

Opened #152 Superseded-run status laundering: a never-tested commit reads green in the combined status 2026-08-12 13:33:05 +02:00

Opened #154 middleware tests construct cookie stores by hand, so they no longer match the production store 2026-08-14 06:17:56 +02:00

Opened #157 No in-app way to retrieve an event body larger than the event log's 8 KB render cap 2026-08-17 22:45:06 +02:00

Opened #160 Target create reads the destination URL via r.FormValue, so a query-string credential lands in the access log and Sentry 2026-08-17 22:50:53 +02:00

Opened #163 Consider dropping Alpine.js and writing its 19 directive uses directly 2026-08-17 23:01:56 +02:00

Opened #166 static.go embeds the js directory, so a missing fetched asset silently produces a binary with no Alpine 2026-08-17 23:12:31 +02:00

Opened #168 Rate-limit key collapses every peer with an empty RemoteAddr into one bucket 2026-08-17 23:38:48 +02:00

Opened #169 Restrict /s/* to GET and HEAD — it currently answers POST, PUT and DELETE with 200 2026-08-17 23:45:16 +02:00

Opened #170 Clamp the HTTP drain by the tail-hook reserve, not just the Sentry flush 2026-08-18 00:13:14 +02:00

Opened #172 Assert the access-log encoded-byte charge against every Unicode code point 2026-08-18 00:32:55 +02:00

Opened #173 The receiver's 1 MB body cap lives in the handler, not the middleware the other route groups use 2026-08-18 00:41:49 +02:00

Opened #175 The CI workflow step is named "runs make check", which the image has never done 2026-08-18 01:07:52 +02:00

Opened #176 MaxBodySize logs the full client-chosen path ahead of RequireAuth, sidestepping the access-log line budget 2026-08-18 01:09:18 +02:00

Opened #177 Target.Webhook and Webhook.Targets form a reference cycle that will recurse once anything marshals a preloaded model 2026-08-18 01:10:13 +02:00

Opened #178 GORM's default logger prints the full interpolated SQL, including the client-chosen path and username, on every record-not-found 2026-08-18 01:40:55 +02:00

Opened #179 The receiver's capability URL is sent to Sentry in full 2026-08-18 01:41:07 +02:00

Opened #183 Two writers bypass internal/logger: fx's console logger and the Go runtime 2026-08-18 02:31:57 +02:00

Opened #184 Nothing bounds username length, and an account with a multi-KB username cannot log in at all 2026-08-18 02:33:32 +02:00

Opened #185 If tracing is ever enabled, every Sentry transaction will collapse into one bucket named POST /(redacted) 2026-08-18 02:34:32 +02:00

Opened #186 A timing-sensitive login-guard test panics on a nil release and reds the whole internal/middleware package 2026-08-18 03:14:50 +02:00

Opened #187 chi's Recoverer panics instead of handling a handler panic, so a panicking request drops the connection instead of answering 500 2026-08-18 03:15:07 +02:00

Opened #190 Last wall-clock-dependent test: two writes must land inside a real 2s debounce window or correct code reds 2026-08-18 03:59:56 +02:00

Opened #191 loggingResponseWriter has no Unwrap, so http.ResponseController cannot reach the real writer through the shipped chain 2026-08-18 04:02:58 +02:00

Opened #193 Headers set before an uncommitted panic survive onto the recovered 500, including Set-Cookie 2026-08-18 04:18:05 +02:00

Opened #194 internal/handlers runs at 22s against script/test's 30s per-package timeout, and has already reded a build under load 2026-08-18 06:48:33 +02:00

Opened #196 REPO_POLICIES.md is a stale copy: it mandates a 30s test timeout the org policy replaced with 90s 2026-08-18 09:31:04 +02:00

Opened #198 make test is past the org 20s target and arguably past the 60s hard cap, driven almost entirely by internal/handlers 2026-08-18 09:59:17 +02:00

Opened #200 A failed listen leaves a live, non-serving process that fx still reports RUNNING 2026-08-20 05:46:55 +02:00

Opened #201 No lock on DATA_DIR: two instances both run delivery recovery and both deliver 2026-08-20 05:47:02 +02:00

Opened #202 Delivery failures are invisible in the UI: nothing renders status_code, response_body, error or attempt_num 2026-08-20 05:47:14 +02:00

Opened #203 No replay: a delivery that exhausts max_retries is failed forever, and store-and-forward is the point 2026-08-20 05:47:22 +02:00

Opened #204 The SSRF blocklist has no escape hatch, so a self-hosted proxy cannot forward to your own network 2026-08-20 05:47:37 +02:00

Opened #205 METRICS_USERNAME set with an empty METRICS_PASSWORD publishes /metrics unauthenticated 2026-08-20 05:47:43 +02:00

Opened #206 Target credentials leak into the per-webhook event databases via GORM association upsert 2026-08-20 05:47:57 +02:00

Opened #207 DEBUG=true prints the session encryption key and the admin password hash to the log 2026-08-20 05:48:04 +02:00

Opened #208 No admin password recovery path: lose the one-time bootstrap line and the deployment is unreachable 2026-08-20 05:48:21 +02:00

Opened #209 No delivery metrics: /metrics cannot tell you whether the product is doing its job 2026-08-20 05:48:28 +02:00

Opened #210 No backup, restore or upgrade guidance anywhere in the README 2026-08-20 05:48:41 +02:00

Opened #211 Deleting a target blanks its name on every historical delivery in the event log 2026-08-20 05:48:49 +02:00

Opened #212 Encrypt credential-bearing target config at rest in webhooker.db 2026-08-20 05:52:42 +02:00

Opened #215 make fmt does not format Markdown, so the org prettier settings are unenforced here 2026-08-20 06:05:22 +02:00

Opened #221 max_retries is unbounded at target creation, and unparseable input silently becomes 0 2026-08-20 06:23:21 +02:00

Opened #225 internal/handlers tests are load-fragile: both the fx start budget and the 90s package timeout blow under host load, so the gate reports failures unrelated to the change 2026-08-20 06:38:14 +02:00

Opened #226 SIGTERM during startup panics on a nil httpServer, and cleanShutdown reads two fields with no happens-before edge 2026-08-20 06:42:47 +02:00

Opened #227 go test -count=2 ./internal/server/... panics on duplicate metrics collector registration 2026-08-20 06:44:18 +02:00

Opened #230 Data race in internal/handlers/logbound_test.go: fx testutil.WriteSyncer calls t.Logf from a start hook after the test goroutine has finished 2026-08-20 07:16:00 +02:00

Opened #231 tailwindcss is unpinned, so the committed static/css/tailwind.css is not reproducible from the repo's own tooling 2026-08-20 07:16:52 +02:00

Opened #232 Harden the (*gorm.DB).Scan guard test: three evasions, an overstated doc comment, and a weak file-count floor 2026-08-20 07:21:18 +02:00

Opened #233 Operator-set target headers: credential headers survive a cross-host redirect, Trailer is not reserved, and an invalid header name error can quote a secret 2026-08-20 07:24:32 +02:00

Opened #234 next is red: queue_depth.go calls (*gorm.DB).Scan, which interpolates bound values into logged SQL 2026-08-20 07:31:29 +02:00

Opened #235 next is red: queue_depth.go calls (*gorm.DB).Scan, tripping the scan guard 2026-08-20 07:39:19 +02:00

Opened #236 next ships a target edit form whose Tailwind classes are missing from the committed CSS 2026-08-20 07:40:29 +02:00

Opened #238 The event-DB sweep marker is monotonic and trusts itself, so a downgrade re-leaks target rows permanently 2026-08-20 07:49:37 +02:00

Opened #241 README understates who can replay a signed request: forwarding X-Hub-Signature-256 hands every target a valid (body, signature) pair 2026-08-20 07:56:32 +02:00

Opened #243 Forwarded inbound event headers are not stripped on a cross-origin redirect, unlike operator-configured ones 2026-08-20 08:34:50 +02:00

Opened #244 blockedNetworks does not cover in-cloud provider service networks on public unicast, e.g. IBM Cloud 161.26.0.0/16 and 166.8.0.0/14 2026-08-20 08:35:40 +02:00

Opened #245 Default-block the public-unicast cloud metadata endpoints (Azure WireServer, Equinix Metal) 2026-08-20 10:05:03 +02:00

Opened #246 A delivery can carry Content-Type twice when the inbound event also supplied one 2026-08-20 10:16:01 +02:00

Opened #247 Invalid target header name error no longer indicates which line was rejected 2026-08-20 10:29:52 +02:00

Opened #248 Migrate .golangci.yml from the deprecated gomodguard to gomodguard_v2 2026-08-20 11:07:12 +02:00

Opened #250 Resubmit a stored event as a new undelivered event, so backends can be tested against real captured traffic 2026-08-24 00:23:54 +02:00

Opened #252 Follow-ups from the PR 251 review: two comments state the wrong mechanism, and the resubmit route's middleware is untested 2026-08-24 00:53:49 +02:00

Opened #253 The shipped binary reports version "dev": no -X ldflags in the Makefile or Dockerfile 2026-08-24 00:56:09 +02:00

Opened #254 Enabling /metrics lets an unauthenticated client grow the process without bound, and publishes live entrypoint UUIDs 2026-08-24 00:56:31 +02:00

Opened #255 SQLite files are created 0644 with plaintext credentials, and the documented Docker deployment supplies the parent directory 0755 2026-08-24 00:56:47 +02:00

Opened #256 A concurrent reader wedges the per-webhook database, stranding delivered webhooks at pending and re-delivering them on restart 2026-08-24 00:58:15 +02:00

Opened #257 Every Slack message shows a zero timestamp of 0001-01-01T00:00:00Z 2026-08-24 00:58:32 +02:00

Opened #261 The /metrics method label is still unbounded: 300 requests with random method tokens mint 7,525 permanent series 2026-08-24 01:33:03 +02:00

Opened #262 Webhook deletion commits a partial delete and reports success when a delete statement fails 2026-08-24 01:39:43 +02:00

Opened #265 script/docker is no longer byte-identical to the model script, and CI-built images stamp version "unknown" 2026-08-24 01:48:03 +02:00

Opened #267 webhooker_delivery_duration_seconds is absent from a scrape until the first delivery occurs 2026-08-24 02:00:12 +02:00

Opened #268 The plaintext app port binds all interfaces and the README has no reverse-proxy deployment section 2026-08-24 02:11:12 +02:00

Opened #269 The session cookie silently loses Secure in the default environment, and X-Forwarded-Proto parsing is exact-match 2026-08-24 02:11:31 +02:00

Opened #270 The access log records the proxy's address, never the client's, so abuse cannot be traced from webhooker's own logs 2026-08-24 02:11:49 +02:00

Opened #271 HSTS is a hardcoded 2-year includeSubDomains preload commitment with no opt-out and no documentation of its value 2026-08-24 02:11:58 +02:00

Opened #272 BaseURL on the source detail page uses the raw X-Forwarded-Proto value as the URL scheme 2026-08-24 02:15:44 +02:00

Opened #274 Split internal/handlers/source_management.go along its three CRUD seams 2026-08-24 02:18:07 +02:00

Opened #275 DeleteDB returns on the first failing suffix, so it can report a leftover file when the history is already destroyed 2026-08-24 02:28:48 +02:00

Opened #278 Changing the password neither regenerates the current session nor invalidates any other one 2026-08-24 02:48:41 +02:00

Opened #279 Remove inbound request signature verification: the entrypoint UUID is the authentication secret 2026-08-24 02:58:36 +02:00

Opened #280 Archive writers are never closed at shutdown, so their -wal survives a clean stop 2026-08-24 03:05:51 +02:00

Opened #282 make check fails on a fresh clone because script/check does not fetch the vendored assets 2026-08-24 03:15:04 +02:00

Opened #283 Two config paths fail silently: an unparseable SENTRY_DSN starts anyway, and a malformed .env is discarded whole 2026-08-24 03:17:05 +02:00

Opened #285 The withRetry bookkeeping-failure branch is unpinned: removing its error check leaves the suite green 2026-08-24 03:49:30 +02:00

Opened #288 Two constants define the data directory mode, in two packages that both create it 2026-08-24 04:14:25 +02:00

Opened #290 File-sourced configuration paths have never been audited for silent defaults 2026-08-24 04:25:42 +02:00

Opened #291 GetDB can open the same event database twice, and closing the loser drops the winner's file locks 2026-08-24 04:29:13 +02:00

Opened #293 A pending delivery whose target was deleted is stranded forever 2026-08-24 04:33:12 +02:00

Opened #294 TestProcessRetryTask_LargeBody_FetchFromDB stays green when the fetch it exists to exercise is deleted 2026-08-24 05:13:05 +02:00

Opened #295 Observation, not a defect: one unreproducible SQLITE_IOERR_SHORT_READ storm under load on ZFS-backed storage 2026-08-24 06:17:39 +02:00

Opened #298 The reaped-row fallback renders the exact zero timestamp that #257 was filed against 2026-08-24 06:44:38 +02:00

Opened #299 Startup recovery races the receiver and can deliver a fresh event twice 2026-08-24 06:44:52 +02:00

Opened #301 Document that the entrypoint UUID is the authentication and shared secrets are never used 2026-08-25 22:34:36 +02:00

Opened #303 Independent code audit 2026-08-30 03:48:37 +02:00

Opened #304 SQLite concurrency: cache=shared, no busy_timeout, no WAL, unbounded pool — concurrent writers get SQLITE_BUSY, deliveries stick pending 2026-08-30 03:57:12 +02:00

Opened #305 Notify drops tasks on full channel; pending deliveries only recover on process restart 2026-08-30 03:57:14 +02:00

Opened #306 Circuit breaker half-open state busy-loops queued tasks with a DB write per spin 2026-08-30 03:57:20 +02:00

Opened #307 WEBHOOKER_ENVIRONMENT defaults to dev, silently shipping insecure prod (no Secure cookies, CORS *) 2026-08-30 03:57:23 +02:00

Opened #308 Listener bind failure leaves the process running with no listener instead of exiting non-zero 2026-08-30 03:57:27 +02:00

Opened #309 SSRF blocking has no opt-out: cannot deliver to RFC1918/LAN targets — needs ALLOWED_TARGET_CIDRS 2026-08-30 03:57:30 +02:00

Opened #310 Replay/redelivery does not exist and the UI shows no per-attempt results, despite README promises 2026-08-30 03:57:36 +02:00

Opened #311 Review toward 1.0: identify and file all next steps 2026-09-21 09:13:49 +02:00

Opened #312 The inbound query string is discarded: a sender's URL parameters never reach storage, the UI or a target 2026-09-21 09:20:19 +02:00

Opened #313 Outbound User-Agent is the hardcoded webhooker/1.0, not the stamped build version 2026-09-21 09:20:20 +02:00

Opened #314 No index on the columns the sweeps, recovery and the event log filter by 2026-09-21 09:20:20 +02:00

Opened #315 script/test always runs verbose and never measures coverage, against the policy pattern 2026-09-21 09:20:20 +02:00

Opened #316 max_retries=N means N attempts in total, but the form label and the field name say retries 2026-09-21 09:20:20 +02:00

Opened #317 MAINTENANCE_MODE is a documented no-op configuration variable 2026-09-21 09:20:20 +02:00

Opened #323 Ready to run under upaas: prod branch, one data volume, env configuration, README section 2026-09-24 17:58:59 +02:00

Opened #325 The event log's resubmit count reads every live event instead of using the resubmitted_from_id index 2026-09-28 13:36:41 +02:00

Opened #333 Trust the RFC 1918 ranges as proxies when TRUSTED_PROXIES is unset 2026-09-29 09:11:35 +02:00

Opened #340 The container sets its data directory permissions itself before startup 2026-09-29 11:07:46 +02:00

Opened #341 The SSRF guard lets a delivery reach [::], which is the host itself on Linux 2026-09-29 11:10:38 +02:00

Opened #344 make test needs up to 6.7 GiB of RAM (handlers and database tests under -race) 2026-09-29 11:11:27 +02:00

Opened #345 Commit the Alpine.js tarball in 3p/ instead of downloading it at build time 2026-09-29 11:21:49 +02:00

Opened #347 Recent events on a webhook page: 50 rows, relative times, size, processing time, delivery status 2026-09-29 11:33:06 +02:00

Opened #348 Log viewer: the caret does not collapse an event; clicking the row should toggle it 2026-09-29 11:34:51 +02:00

Opened #349 Event log: only the newest event expanded on load, and only the 50 most recent events 2026-09-29 11:36:00 +02:00

Opened #350 Webhook page: widen the entrypoints container by 50-100% so the URL does not wrap 2026-09-29 11:37:07 +02:00

Opened #359 After a restart under upaas: new admin password, and logging in with it returns 500 2026-09-29 12:11:40 +02:00

Opened #363 Run every build, test and lint step in the Dockerfiles at nice -n 19 2026-09-29 13:02:22 +02:00

Opened #366 Image built by upaas stamps version "unknown" into the binary 2026-10-01 20:38:56 +02:00

Opened #367 Routes: per-webhook page under /webhook/ (not /source/), its log at .../events, inbound URLs under /h/UUID or /ingest/UUID 2026-10-01 20:54:35 +02:00

Opened #368 Per-webhook page: statistics pane at the top (lifetime and per retention period) 2026-10-01 20:54:39 +02:00

Opened #369 Event bodies: per-event page, expandable recent events, full bodies under 32k, JSON formatted, scroll well over 200 lines 2026-10-01 20:55:44 +02:00

Opened #370 Targets on the webhook page: one + Add, then pick a target type, then that type's settings 2026-10-01 21:00:17 +02:00

Opened #371 The UI's Alpine.js never runs: the Content-Security-Policy forbids the eval it needs 2026-10-01 21:03:30 +02:00

Opened #372 Target list: successful and failed deliveries per target, in total and in the last 24h 2026-10-01 21:04:39 +02:00

Opened #373 New-webhook page: optional HTTP target URL and archive checkbox with pruning choice, creating those targets 2026-10-01 21:12:41 +02:00

Opened #374 Database targets: a Download button that exports the SQLite contents as gzipped JSON 2026-10-01 21:14:28 +02:00

Opened #375 Clickable things must look clickable: the entrypoint URL "copy" control, "+ Add", and every other one 2026-10-01 21:17:33 +02:00

Opened #376 Archive database filename includes the webhook name and the target name 2026-10-01 21:18:21 +02:00

Opened #377 Audit: missing basic functionality and information across the whole UI 2026-10-01 21:21:22 +02:00

Opened #379 Archive database target: rotation setting puts year-month, day or hour in the filename 2026-10-01 21:25:25 +02:00

Opened #381 Target and webhook edit pages lose what was typed when a save is rejected 2026-10-01 22:04:46 +02:00

Opened #382 Error pages outside forms are bare text with no way back 2026-10-01 22:06:18 +02:00

Opened #383 No message after saving, deleting, activating or signing out 2026-10-01 22:06:18 +02:00

Opened #384 Signing in does not return to the page that was asked for 2026-10-01 22:06:18 +02:00

Opened #385 A target paused by its circuit breaker is not shown as paused 2026-10-01 22:06:19 +02:00

Opened #386 Event log: attempts and deliveries show no time, event times have no zone, replays look like originals 2026-10-01 22:06:19 +02:00

Opened #387 Replay is offered for a deleted target, and its refusal gives advice that cannot work 2026-10-01 22:06:19 +02:00

Opened #388 Database and log target deliveries read "Status: — (no response)" 2026-10-01 22:06:19 +02:00

Opened #389 The event log never shows an event's request headers or the entrypoint it arrived at 2026-10-01 22:06:20 +02:00

Opened #390 Event log cannot show only the events whose delivery failed 2026-10-01 22:06:20 +02:00

Opened #391 At phone width the event log and the target list cut off statuses and controls 2026-10-01 22:06:21 +02:00

Opened #392 An entrypoint's description cannot be changed 2026-10-01 22:06:21 +02:00

Opened #393 Entrypoints do not show when they last received an event 2026-10-01 22:06:25 +02:00

Opened #394 Webhook list does not show which webhooks are receiving or failing 2026-10-01 22:06:25 +02:00

Opened #395 The slack target's retry setting is not shown in the target list 2026-10-01 22:06:25 +02:00

Opened #396 Archive expiry is a raw duration typed by hand (720h) 2026-10-01 22:06:25 +02:00

Opened #397 A database target does not show its archive file, size or last write 2026-10-01 22:06:26 +02:00

Opened #398 Refusing a private target address does not say how to allow it 2026-10-01 22:06:26 +02:00

Opened #399 The UI names the same things in different ways 2026-10-01 22:06:26 +02:00

Opened #400 Delete confirmations do not name the item or say what is lost 2026-10-01 22:06:26 +02:00

Opened #401 Profile page says "Account Type: Standard User" for the admin account 2026-10-01 22:06:26 +02:00

Opened #402 No page shows the server's settings 2026-10-01 22:06:27 +02:00

Opened #412 Remove buildarch mentions: the architecture is read at runtime 2026-10-02 00:44:08 +02:00

Opened #414 Make main and next green: make test fails in the Docker build, and its output is cut off before the failure 2026-10-02 02:26:36 +02:00

Opened #421 TODO.md says a docs-only commit replays from the layer cache, which is no longer true 2026-10-02 09:13:26 +02:00

Opened #431 The target toggle saves the whole row, so it can undo an edit of the same target 2026-10-02 12:59:48 +02:00

Opened #452 Tests outside the config package still read the developer's shell when they build a Config 2026-10-02 17:44:42 +02:00

Opened #455 The eventBodyQuery comment credits the soft-delete predicate for refusing a reaped event 2026-10-02 18:12:33 +02:00

Opened #459 The main database's open errors do not name the file 2026-10-02 18:29:55 +02:00

Opened #462 Six test-only gorm.Open calls still pass a bare gorm.Config 2026-10-02 18:54:20 +02:00

Opened #477 An http target's max_queue_size is stored and shown but nothing enforces it 2026-10-03 00:01:40 +02:00

Opened #493 yarn 1 prints a url.parse() deprecation warning in the js-deps stage 2026-10-03 05:47:47 +02:00

Opened #497 Merge main into next so the milestone PR merges again after 416 2026-10-03 14:16:27 +02:00

Opened #499 Recommendations for a clearer, simpler object and data model 2026-10-03 14:31:04 +02:00

Opened #500 The Redactor misses an echoed request line when the target URL has a query string but no path 2026-10-04 02:15:36 +02:00

Opened #504 Re-vendor the canonical files from sneak/prompts at dd4027b 2026-10-06 01:31:07 +02:00

Opened #506 Test helpers are compiled into the shipped binary 2026-10-06 03:26:35 +02:00

Opened #507 Tests that fail at random under load 2026-10-06 06:06:39 +02:00

Opened #508 CI fails at bootstrap: the runner cannot install Go 2026-10-06 06:28:29 +02:00

Opened #511 Make next green: TestArchiveExport_Streams measures the shared heap and fails go test on noise 2026-10-06 09:04:50 +02:00

Opened #518 A # or ? in DATA_DIR makes every database open the same, shorter path 2026-10-13 04:46:37 +02:00

Opened #520 The README describes an upgrade path that does not exist before 1.0 2026-10-13 06:34:37 +02:00

Opened #522 Two code comments explain behaviour by what an earlier build left behind 2026-10-13 07:10:38 +02:00

Opened #525 The static image build links glibc's getaddrinfo and dlopen, which the Alpine runtime cannot satisfy 2026-10-13 09:58:00 +02:00

Opened #527 A clean stop cancels in-flight delivery attempts and records them as failed; fire-and-forget deliveries are lost to a restart 2026-10-13 11:32:24 +02:00

Opened #528 BIND_ADDRESS=0.0.0.0 binds IPv6 too; the README describes it as IPv4-only and distinct from :: 2026-10-13 11:32:24 +02:00

Opened #529 finished_at and archived_at are stored with Go's monotonic clock reading appended (m=+365.03) 2026-10-13 11:32:25 +02:00

Opened #530 CSP allows unsafe-inline scripts and styles and the README never says why 2026-10-13 11:32:25 +02:00

Opened #531 webhooker logs the entrypoint UUID at INFO although the README says to keep it out of logs 2026-10-13 11:35:27 +02:00

Opened #535 A comment in the middleware says the query logger writes client values into statements; it drops them 2026-10-15 10:49:38 +02:00

Opened #538 why is CGO being used? 2026-10-15 11:37:30 +02:00

Opened #539 Store a webhook's retention as a plain day count, 0 meaning forever 2026-10-15 11:57:18 +02:00

Opened #540 Store a target's number of delivery attempts, at least one, instead of its retries 2026-10-15 11:57:18 +02:00

Opened #541 Move the archive files into their own package 2026-10-15 11:57:19 +02:00

Opened #542 Use one recovery routine at start and on every sweep tick 2026-10-15 11:57:19 +02:00

Opened #543 Store a target's settings as columns instead of a per-type JSON string 2026-10-15 11:57:19 +02:00

Opened #544 Move storing an event and creating its deliveries from the handlers into the delivery engine 2026-10-15 11:57:20 +02:00

Opened #545 Build the binary without cgo 2026-10-15 11:57:39 +02:00

Opened #548 Sentry events can carry the entrypoint URL in the Referer header 2026-10-15 14:44:40 +02:00

1 Unresolved Conversation

Open #33 1.0/mvp 2026-10-21 17:34:20 +02:00