2026-08-23 - 2026-09-23
Overview
23 Pull requests merged by 1 user
Merged
#320 Say max_retries is the total attempt count, not a retry count
Merged
#318 Consolidate the data directory mode into one owner
Merged
#302 State the UUID-is-the-credential rule as a rule (closes #301)
Merged
#111 Milestone 1.0.0: internet-facing readiness
Merged
#300 Render unknown for a zero CreatedAt in Slack/Mattermost messages (closes #298)
Merged
#297 Carry the event's receipt time into every delivery (closes #257)
Merged
#296 Correct four documentation claims ahead of the 1.0.0 tag
Merged
#292 Close the two remaining delivery terminal-state gaps (closes #107)
Merged
#287 Create every SQLite file 0600 (closes #255)
Merged
#289 Fail loudly on an unparseable SENTRY_DSN and a malformed .env (closes #283)
Merged
#286 Derive the source detail BaseURL scheme from reqtls (closes #272)
Merged
#263 Make SQLite durable under concurrent readers and stop re-delivering stranded webhooks (closes #256)
Merged
#284 Record landed 1.0.0 work and drop the removed signing roadmap in TODO.md
Merged
#277 Bind the app port deliberately and document the proxy deployment (closes #268)
Merged
#281 Remove inbound request signature verification (closes #279)
Merged
#260 Stamp the build version into the binary (closes #253)
Merged
#276 Decide request TLS in one place, per request (closes #269)
Merged
#273 Check every statement in the webhook deletion transaction (closes #262)
Merged
#266 Name a deleted target on its historical deliveries (closes #211)
Merged
#264 Bound the /metrics method label (closes #261)
Merged
#259 Validate max_retries on both target forms (closes #221)
Merged
#258 Label HTTP metrics with the chi route pattern (closes #254)
Merged
#251 Resubmit a stored event as a new undelivered event (closes #250)
3 Pull requests proposed by 1 user
Proposed
#319 Index the event-tier columns the sweeps, event log and retention scan
Proposed
#321 1.0.0 milestone: next into main
Proposed
#322 Default WEBHOOKER_ENVIRONMENT to prod
31 Issues closed from 1 user
Closed
#316 max_retries=N means N attempts in total, but the form label and the field name say retries
Closed
#288 Two constants define the data directory mode, in two packages that both create it
Closed
#303 Independent code audit
Closed
#310 Replay/redelivery does not exist and the UI shows no per-attempt results, despite README promises
Closed
#309 SSRF blocking has no opt-out: cannot deliver to RFC1918/LAN targets — needs ALLOWED_TARGET_CIDRS
Closed
#308 Listener bind failure leaves the process running with no listener instead of exiting non-zero
Closed
#305 Notify drops tasks on full channel; pending deliveries only recover on process restart
Closed
#278 Changing the password neither regenerates the current session nor invalidates any other one
Closed
#304 SQLite concurrency: cache=shared, no busy_timeout, no WAL, unbounded pool — concurrent writers get SQLITE_BUSY, deliveries stick pending
Closed
#301 Document that the entrypoint UUID is the authentication and shared secrets are never used
Closed
#147 CI gate follow-ups: script/cibuild has drifted from the model script, and the status-rewrite context string is hardcoded
Closed
#298 The reaped-row fallback renders the exact zero timestamp that #257 was filed against
Closed
#257 Every Slack message shows a zero timestamp of 0001-01-01T00:00:00Z
Closed
#107 Two remaining delivery terminal-state gaps: opaque failure and deletion-orphaned retries
Closed
#255 SQLite files are created 0644 with plaintext credentials, and the documented Docker deployment supplies the parent directory 0755
Closed
#283 Two config paths fail silently: an unparseable SENTRY_DSN starts anyway, and a malformed .env is discarded whole
Closed
#272 BaseURL on the source detail page uses the raw X-Forwarded-Proto value as the URL scheme
Closed
#256 A concurrent reader wedges the per-webhook database, stranding delivered webhooks at pending and re-delivering them on restart
Closed
#226 SIGTERM during startup panics on a nil httpServer, and cleanShutdown reads two fields with no happens-before edge
Closed
#268 The plaintext app port binds all interfaces and the README has no reverse-proxy deployment section
Closed
#241 README understates who can replay a signed request: forwarding X-Hub-Signature-256 hands every target a valid (body, signature) pair
Closed
#279 Remove inbound request signature verification: the entrypoint UUID is the authentication secret
Closed
#253 The shipped binary reports version "dev": no -X ldflags in the Makefile or Dockerfile
Closed
#269 The session cookie silently loses Secure in the default environment, and X-Forwarded-Proto parsing is exact-match
Closed
#262 Webhook deletion commits a partial delete and reports success when a delete statement fails
Closed
#211 Deleting a target blanks its name on every historical delivery in the event log
Closed
#261 The /metrics method label is still unbounded: 300 requests with random method tokens mint 7,525 permanent series
Closed
#221 max_retries is unbounded at target creation, and unparseable input silently becomes 0
Closed
#254 Enabling /metrics lets an unauthenticated client grow the process without bound, and publishes live entrypoint UUIDs
Closed
#247 Invalid target header name error no longer indicates which line was rejected
Closed
#250 Resubmit a stored event as a new undelivered event, so backends can be tested against real captured traffic
48 Issues created by 1 user
Opened
#250 Resubmit a stored event as a new undelivered event, so backends can be tested against real captured traffic
Opened
#252 Follow-ups from the PR 251 review: two comments state the wrong mechanism, and the resubmit route's middleware is untested
Opened
#253 The shipped binary reports version "dev": no -X ldflags in the Makefile or Dockerfile
Opened
#254 Enabling /metrics lets an unauthenticated client grow the process without bound, and publishes live entrypoint UUIDs
Opened
#255 SQLite files are created 0644 with plaintext credentials, and the documented Docker deployment supplies the parent directory 0755
Opened
#256 A concurrent reader wedges the per-webhook database, stranding delivered webhooks at pending and re-delivering them on restart
Opened
#257 Every Slack message shows a zero timestamp of 0001-01-01T00:00:00Z
Opened
#261 The /metrics method label is still unbounded: 300 requests with random method tokens mint 7,525 permanent series
Opened
#262 Webhook deletion commits a partial delete and reports success when a delete statement fails
Opened
#265 script/docker is no longer byte-identical to the model script, and CI-built images stamp version "unknown"
Opened
#267 webhooker_delivery_duration_seconds is absent from a scrape until the first delivery occurs
Opened
#268 The plaintext app port binds all interfaces and the README has no reverse-proxy deployment section
Opened
#269 The session cookie silently loses Secure in the default environment, and X-Forwarded-Proto parsing is exact-match
Opened
#270 The access log records the proxy's address, never the client's, so abuse cannot be traced from webhooker's own logs
Opened
#271 HSTS is a hardcoded 2-year includeSubDomains preload commitment with no opt-out and no documentation of its value
Opened
#272 BaseURL on the source detail page uses the raw X-Forwarded-Proto value as the URL scheme
Opened
#274 Split internal/handlers/source_management.go along its three CRUD seams
Opened
#275 DeleteDB returns on the first failing suffix, so it can report a leftover file when the history is already destroyed
Opened
#278 Changing the password neither regenerates the current session nor invalidates any other one
Opened
#279 Remove inbound request signature verification: the entrypoint UUID is the authentication secret
Opened
#280 Archive writers are never closed at shutdown, so their -wal survives a clean stop
Opened
#282 make check fails on a fresh clone because script/check does not fetch the vendored assets
Opened
#283 Two config paths fail silently: an unparseable SENTRY_DSN starts anyway, and a malformed .env is discarded whole
Opened
#285 The withRetry bookkeeping-failure branch is unpinned: removing its error check leaves the suite green
Opened
#288 Two constants define the data directory mode, in two packages that both create it
Opened
#290 File-sourced configuration paths have never been audited for silent defaults
Opened
#291 GetDB can open the same event database twice, and closing the loser drops the winner's file locks
Opened
#293 A pending delivery whose target was deleted is stranded forever
Opened
#294 TestProcessRetryTask_LargeBody_FetchFromDB stays green when the fetch it exists to exercise is deleted
Opened
#295 Observation, not a defect: one unreproducible SQLITE_IOERR_SHORT_READ storm under load on ZFS-backed storage
Opened
#298 The reaped-row fallback renders the exact zero timestamp that #257 was filed against
Opened
#299 Startup recovery races the receiver and can deliver a fresh event twice
Opened
#301 Document that the entrypoint UUID is the authentication and shared secrets are never used
Opened
#303 Independent code audit
Opened
#304 SQLite concurrency: cache=shared, no busy_timeout, no WAL, unbounded pool — concurrent writers get SQLITE_BUSY, deliveries stick pending
Opened
#305 Notify drops tasks on full channel; pending deliveries only recover on process restart
Opened
#306 Circuit breaker half-open state busy-loops queued tasks with a DB write per spin
Opened
#307 WEBHOOKER_ENVIRONMENT defaults to dev, silently shipping insecure prod (no Secure cookies, CORS *)
Opened
#308 Listener bind failure leaves the process running with no listener instead of exiting non-zero
Opened
#309 SSRF blocking has no opt-out: cannot deliver to RFC1918/LAN targets — needs ALLOWED_TARGET_CIDRS
Opened
#310 Replay/redelivery does not exist and the UI shows no per-attempt results, despite README promises
Opened
#311 Review toward 1.0: identify and file all next steps
Opened
#312 The inbound query string is discarded: a sender's URL parameters never reach storage, the UI or a target
Opened
#313 Outbound User-Agent is the hardcoded webhooker/1.0, not the stamped build version
Opened
#314 No index on the columns the sweeps, recovery and the event log filter by
Opened
#315 script/test always runs verbose and never measures coverage, against the policy pattern
Opened
#316 max_retries=N means N attempts in total, but the form label and the field name say retries
Opened
#317 MAINTENANCE_MODE is a documented no-op configuration variable
17 Unresolved Conversations
Open
#98
Deprecated gomodguard linter in the org-standard .golangci.yml (needs an upstream decision)
Open
#246
A delivery can carry Content-Type twice when the inbound event also supplied one
Open
#215
make fmt does not format Markdown, so the org prettier settings are unenforced here
Open
#212
Encrypt credential-bearing target config at rest in webhooker.db
Open
#248
Migrate .golangci.yml from the deprecated gomodguard to gomodguard_v2
Open
#245
Default-block the public-unicast cloud metadata endpoints (Azure WireServer, Equinix Metal)
Open
#198
make test is past the org 20s target and arguably past the 60s hard cap, driven almost entirely by internal/handlers
Open
#193
Headers set before an uncommitted panic survive onto the recovered 500, including Set-Cookie
Open
#112
Decision: TODO.md Completed Steps guarantees a merge conflict on every unit landing on next
Open
#175
The CI workflow step is named "runs make check", which the image has never done
Open
#177
Target.Webhook and Webhook.Targets form a reference cycle that will recurse once anything marshals a preloaded model
Open
#169
Restrict /s/* to GET and HEAD — it currently answers POST, PUT and DELETE with 200
Open
#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
Open
#238
The event-DB sweep marker is monotonic and trusts itself, so a downgrade re-leaks target rows permanently
Open
#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
Open
#117
Page {{define "title"}} blocks never render; every browser tab reads "Webhooker"
Open
#33
1.0/mvp