2026-09-21 - 2026-10-21
Overview
2 Releases published by 1 user
Published
v1.0.0-rc2
Published
v1.0.0-rc1
149 Pull requests merged by 2 users
Merged
#555 Store events and create deliveries in the delivery engine (closes #544)
Merged
#554 Store a target's settings as columns (closes #543)
Merged
#553 Use one recovery routine at start and on every sweep tick (closes #542)
Merged
#552 Move the archive files into their own package (closes #541)
Merged
#546 Store a webhook's retention as a plain day count, 0 meaning forever (closes #539)
Merged
#547 Store a target's number of delivery attempts, at least one
Merged
#551 Say the query logger drops bound values
Merged
#549 Send only the Referer's scheme and host to Sentry
Merged
#550 Build the binary without cgo
Merged
#537 Drop unsafe-inline from the Content-Security-Policy
Merged
#536 Bind 0.0.0.0 to IPv4 only
Merged
#534 Keep the entrypoint UUID out of webhooker's own logs
Merged
#532 Leave a delivery cut off by a stop for the next start
Merged
#380 Milestone: next into main
Merged
#533 Store delivery and archive times without the monotonic clock reading
Merged
#526 Build the image's static binary with netgo, osusergo and sqlite_omit_load_extension (closes #525)
Merged
#524 Describe code in its own terms, not by an earlier build's data (closes #522)
Merged
#523 Escape the database path in the SQLite connection string (closes #518)
Merged
#521 Remove upgrade and older-build text from the README (closes #520)
Merged
#517 Drop Completed Steps from TODO.md; the tracker is the record (closes #112)
Merged
#519 Build every database's schema from embedded SQL files (closes #56)
Merged
#516 Name Sentry transactions after the route they matched (closes #185)
Merged
#515 Make the HSTS max-age configurable with HSTS_MAX_AGE (closes #271)
Merged
#514 Document that DATA_DIR must be on a local filesystem (closes #295)
Merged
#512 Keep test helpers out of the shipped binary (closes #506)
Merged
#513 Read the export test's heap only after pools drop their caches (closes #511)
Merged
#510 Make the load-sensitive tests wait for what they check (closes #507)
Merged
#509 Refresh the package lists before installing in script/bootstrap (closes #508)
Merged
#505 Re-vendor the shared files from sneak/prompts at dd4027b (closes #504)
Merged
#502 Mask a target URL's query string when the URL has no path (closes #500)
Merged
#501 Store and show an event's query string, and pass it on to an HTTP target when set (closes #312)
Merged
#498 Merge main into next after 416 (closes #497)
Merged
#416 main side of 414: cheaper test hashing, and failing tests visible in the build log (closes #414)
Merged
#496 Install ESLint and prettier with yarn 4 through corepack (closes #493)
Merged
#495 Break long values on the webhook page and event log at phone width (closes #391)
Merged
#492 Format the Markdown with prettier in make fmt and make fmt-check (closes #215)
Merged
#494 Split source_management.go along its CRUD seams (closes #274)
Merged
#490 Event log: show only the events with a failed or a pending delivery (closes #390)
Merged
#489 Show an event's entrypoint and request headers in the event log and on its page (closes #389)
Merged
#491 Use one name for each thing the UI shows (closes #399)
Merged
#486 Lint static/js/ with ESLint in Docker (closes #120)
Merged
#482 Rotate a database target's archive monthly, daily or hourly (closes #379)
Merged
#487 Event log: show attempt and delivery times, label replays, zone event times (closes #386)
Merged
#488 Event log: only the newest event expanded, and only the 50 most recent (closes #349)
Merged
#485 Name the item and what is lost in each delete prompt (closes #400)
Merged
#484 Say what a database or log target's attempt did, without a status (closes #388)
Merged
#471 Event log: an event's ID can be selected without toggling it (closes #348)
Merged
#483 Offer no Replay for a delivery to a deleted target (closes #387)
Merged
#478 Show a target paused by its circuit breaker (closes #385)
Merged
#481 Remove an http target's max_queue_size (closes #477)
Merged
#480 Show each page's own title in the browser tab (closes #117)
Merged
#479 Offer archive expiry choices on the target forms, show plain units (closes #396)
Merged
#474 Keep what was typed when a target or webhook edit is refused (closes #381)
Merged
#473 Pin tailwindcss and check the committed stylesheet against it (closes #231)
Merged
#476 New-webhook page: optional HTTP target URL and archive with pruning (closes #373)
Merged
#475 Show a slack target's retry setting in the target list (closes #395)
Merged
#472 Show each target's delivered and failed deliveries in the target list (closes #372)
Merged
#470 Show each entrypoint's last event and event count on the webhook page (closes #393)
Merged
#463 Targets section: one Add, then a target type and Next, then that type's fields (closes #370)
Merged
#465 Give each event its own page and show bodies the same everywhere (closes #369)
Merged
#460 Report or refuse each unusable file webhooker reads (closes #290)
Merged
#464 Let an entrypoint's description be edited in place (closes #392)
Merged
#468 Index the event log's resubmit count with deleted_at (closes #325)
Merged
#469 Show a database target's archive file, size and last write in the target list (closes #397)
Merged
#467 Name each embedded static file so a missing Alpine.js fails the build (closes #166)
Merged
#439 Add a Download button that exports a database target's archive as gzipped JSON (closes #374)
Merged
#466 Route the delivery tests' gorm.Open through gormlog (closes #462)
Merged
#454 Clamp the HTTP drain by the tail-hook reserve (closes #170)
Merged
#458 Pin the HTTP target's unpinned error checks (closes #285)
Merged
#461 Name the reaper's hard delete in the event body comments (closes #455)
Merged
#457 Fix two resubmit comments and test the resubmit route's middleware (closes #252)
Merged
#456 Harden the (*gorm.DB).Scan guard test (closes #232)
Merged
#451 Try every event database file on delete and say which was left (closes #275)
Merged
#447 Make every clickable control look clickable, in two shared styles (closes #375)
Merged
#445 Pin the close before the reopen in the archive sweep (closes #103)
Merged
#453 Clear the environment in the cmd/webhooker tests that build a Config (closes #452)
Merged
#450 Assert the body a retry delivers, not only its status (closes #294)
Merged
#449 Pin the body cap's order in every page route group (closes #93)
Merged
#442 Check the log charge against every code point (closes #172)
Merged
#444 Isolate config tests from the shell; any out-of-range PORT is ErrInvalidPort (closes #94)
Merged
#443 Send fx's own events through the service's logger (closes #183)
Merged
#448 Pin the rate-limit key for an empty RemoteAddr (closes #168)
Merged
#446 Close the retention follow-ups from the August review (closes #99)
Merged
#440 Log the client address next to the peer address (closes #270)
Merged
#441 Seed the retention tests 50 rows per insert, not 500 (closes #198)
Merged
#411 Load Alpine's CSP build so the UI's directives run (closes #371)
Merged
#438 Drive the archive reopen debounce test from a clock (closes #190)
Merged
#433 Keep each model's parent out of its JSON (closes #177)
Merged
#436 Write a form-error page's status only after it renders (closes #128)
Merged
#435 Name the CI build step after what the image runs (closes #175)
Merged
#437 Toggle only a target's active state, so it cannot undo an edit (closes #431)
Merged
#434 Build the middleware test cookie stores with the production constructor (closes #154)
Merged
#432 Justify the handlers tests' start limit with a measurement (closes #225)
Merged
#417 Show each webhook's activity in the webhook list (closes #394)
Merged
#429 Say at the receiver route where its 1 MB body cap lives (closes #173)
Merged
#418 Name each database target's archive for its webhook and target (closes #376)
Merged
#430 Remove the no-op MAINTENANCE_MODE setting (closes #317)
Merged
#428 Let a handler flush or set a write deadline through the access log and metrics (closes #191)
Merged
#427 Serve the delivery duration histogram from boot (closes #267)
Merged
#409 Add a read-only Settings page for the loaded configuration (closes #402)
Merged
#425 Run script/test quietly with coverage, rerun failed tests verbosely (closes #315)
Merged
#422 Refuse [::], 0.0.0.0, IPv6 multicast and documentation space (closes #341)
Merged
#426 Discard fx's own log in tests that build an fx app (closes #230)
Merged
#420 Say what each action did in a one-line notice (closes #383)
Merged
#424 Drop TODO.md's stale docs-only cache caveat (closes #421)
Merged
#419 Widen the webhook page by half so an entrypoint URL fits on one line (closes #350)
Merged
#423 Send the build version in the outbound User-Agent (closes #313)
Merged
#346 Serve /metrics from a registry of its own (closes #227)
Merged
#410 Derive the image's version from the .git in the build context (closes #366)
Merged
#408 Render admin page errors in the normal layout (closes #382)
Merged
#407 Say how to allow a refused private target address (closes #398)
Merged
#406 Logging in returns to the page that was asked for (closes #384)
Merged
#403 Add a statistics pane to the webhook page (closes #368)
Merged
#378 Move webhook pages to /hook/ID and inbound URLs to /h/UUID (closes #367)
Merged
#415 Run the test suite without -v so a failure shows in the build log (closes #414)
Merged
#404 Keep make test under 2 GB of memory (closes #344)
Merged
#413 Reword the build-architecture history line in TODO.md (closes #412)
Merged
#336 Trust the RFC 1918 ranges as proxies when TRUSTED_PROXIES is unset (closes #333)
Merged
#339 State what the default blocklist covers (closes #244)
Merged
#361 Show 50 recent events with size, processing time and status (closes #347)
Merged
#405 Remove the fixed Account Type row from the profile page (closes #401)
Merged
#351 Commit the Alpine.js tarball in 3p/ and extract it at build time (closes #345)
Merged
#338 Bound username length at creation (closes #184)
Merged
#365 deploy
Merged
#364 Next
Merged
#353 Container sets its data directory's owner and mode itself
Merged
#362 Let a browser with cookies from an earlier database log in (closes #359)
Merged
#360 Fast-forward next to main
Merged
#357 deployment to prod
Merged
#356 Sneak/testdeploy
Merged
#355 deployment
Merged
#342 Milestone: next into main
Merged
#343 Deploy: main into prod
Merged
#335 Restrict /s/* to GET and HEAD (closes #169)
Merged
#321 1.0.0 milestone: next into main
Merged
#337 Drop Set-Cookie from the recovered 500 (closes #193)
Merged
#334 Default-block Azure WireServer's public address (closes #245)
Merged
#332 Close archive writers when the delivery engine stops (closes #280)
Merged
#331 Send Content-Type once on a delivery
Merged
#329 Fail a pending delivery whose target was deleted (closes #293)
Merged
#330 Make deliveries refused while half-open wait a cooldown (closes #306)
Merged
#327 Open each event database once when callers race
Merged
#326 Say make check needs make bootstrap on a fresh clone
Merged
#328 Do not resend a delivery that restart recovery already sent
Merged
#319 Index the event-tier columns the sweeps, event log and retention scan
Merged
#322 Default WEBHOOKER_ENVIRONMENT to prod (closes #307)
Merged
#324 Document running webhooker under upaas (closes #323)
Merged
#320 Say max_retries is the total attempt count, not a retry count
Merged
#318 Consolidate the data directory mode into one owner
1 Pull request proposed by 1 user
Proposed
#556 next into main
154 Issues closed from 1 user
Closed
#544 Move storing an event and creating its deliveries from the handlers into the delivery engine
Closed
#543 Store a target's settings as columns instead of a per-type JSON string
Closed
#542 Use one recovery routine at start and on every sweep tick
Closed
#541 Move the archive files into their own package
Closed
#539 Store a webhook's retention as a plain day count, 0 meaning forever
Closed
#540 Store a target's number of delivery attempts, at least one, instead of its retries
Closed
#535 A comment in the middleware says the query logger writes client values into statements; it drops them
Closed
#548 Sentry events can carry the entrypoint URL in the Referer header
Closed
#545 Build the binary without cgo
Closed
#530 CSP allows unsafe-inline scripts and styles and the README never says why
Closed
#528 BIND_ADDRESS=0.0.0.0 binds IPv6 too; the README describes it as IPv4-only and distinct from ::
Closed
#531 webhooker logs the entrypoint UUID at INFO although the README says to keep it out of logs
Closed
#527 A clean stop cancels in-flight delivery attempts and records them as failed; fire-and-forget deliveries are lost to a restart
Closed
#529 finished_at and archived_at are stored with Go's monotonic clock reading appended (m=+365.03)
Closed
#311 Review toward 1.0: identify and file all next steps
Closed
#525 The static image build links glibc's getaddrinfo and dlopen, which the Alpine runtime cannot satisfy
Closed
#522 Two code comments explain behaviour by what an earlier build left behind
Closed
#518 A # or ? in DATA_DIR makes every database open the same, shorter path
Closed
#520 The README describes an upgrade path that does not exist before 1.0
Closed
#112 Decision: TODO.md Completed Steps guarantees a merge conflict on every unit landing on next
Closed
#56 Move schema_migrations table creation into 000.sql with INTEGER version column
Closed
#185 If tracing is ever enabled, every Sentry transaction will collapse into one bucket named POST /(redacted)
Closed
#271 HSTS is a hardcoded 2-year includeSubDomains preload commitment with no opt-out and no documentation of its value
Closed
#85 Design: should delivery targets own their recovery/sweep loop, not just backoff?
Closed
#295 Observation, not a defect: one unreproducible SQLITE_IOERR_SHORT_READ storm under load on ZFS-backed storage
Closed
#506 Test helpers are compiled into the shipped binary
Closed
#511 Make next green: TestArchiveExport_Streams measures the shared heap and fails go test on noise
Closed
#507 Tests that fail at random under load
Closed
#508 CI fails at bootstrap: the runner cannot install Go
Closed
#504 Re-vendor the canonical files from sneak/prompts at dd4027b
Closed
#98 Deprecated gomodguard linter in the org-standard .golangci.yml (needs an upstream decision)
Closed
#265 script/docker is no longer byte-identical to the model script, and CI-built images stamp version "unknown"
Closed
#248 Migrate .golangci.yml from the deprecated gomodguard to gomodguard_v2
Closed
#500 The Redactor misses an echoed request line when the target URL has a query string but no path
Closed
#312 The inbound query string is discarded: a sender's URL parameters never reach storage, the UI or a target
Closed
#497 Merge main into next so the milestone PR merges again after 416
Closed
#414 Make main and next green: make test fails in the Docker build, and its output is cut off before the failure
Closed
#493 yarn 1 prints a url.parse() deprecation warning in the js-deps stage
Closed
#377 Audit: missing basic functionality and information across the whole UI
Closed
#391 At phone width the event log and the target list cut off statuses and controls
Closed
#215 make fmt does not format Markdown, so the org prettier settings are unenforced here
Closed
#274 Split internal/handlers/source_management.go along its three CRUD seams
Closed
#390 Event log cannot show only the events whose delivery failed
Closed
#389 The event log never shows an event's request headers or the entrypoint it arrived at
Closed
#399 The UI names the same things in different ways
Closed
#120 No JS linting, so the styleguide REPO_POLICIES binds us to is unenforced
Closed
#379 Archive database target: rotation setting puts year-month, day or hour in the filename
Closed
#386 Event log: attempts and deliveries show no time, event times have no zone, replays look like originals
Closed
#349 Event log: only the newest event expanded on load, and only the 50 most recent events
Closed
#400 Delete confirmations do not name the item or say what is lost
Closed
#388 Database and log target deliveries read "Status: — (no response)"
Closed
#348 Log viewer: the caret does not collapse an event; clicking the row should toggle it
Closed
#387 Replay is offered for a deleted target, and its refusal gives advice that cannot work
Closed
#385 A target paused by its circuit breaker is not shown as paused
Closed
#477 An http target's max_queue_size is stored and shown but nothing enforces it
Closed
#117 Page {{define "title"}} blocks never render; every browser tab reads "Webhooker"
Closed
#396 Archive expiry is a raw duration typed by hand (720h)
Closed
#381 Target and webhook edit pages lose what was typed when a save is rejected
Closed
#231 tailwindcss is unpinned, so the committed static/css/tailwind.css is not reproducible from the repo's own tooling
Closed
#373 New-webhook page: optional HTTP target URL and archive checkbox with pruning choice, creating those targets
Closed
#395 The slack target's retry setting is not shown in the target list
Closed
#372 Target list: successful and failed deliveries per target, in total and in the last 24h
Closed
#393 Entrypoints do not show when they last received an event
Closed
#370 Targets on the webhook page: one + Add, then pick a target type, then that type's settings
Closed
#369 Event bodies: per-event page, expandable recent events, full bodies under 32k, JSON formatted, scroll well over 200 lines
Closed
#290 File-sourced configuration paths have never been audited for silent defaults
Closed
#459 The main database's open errors do not name the file
Closed
#392 An entrypoint's description cannot be changed
Closed
#325 The event log's resubmit count reads every live event instead of using the resubmitted_from_id index
Closed
#397 A database target does not show its archive file, size or last write
Closed
#166 static.go embeds the js directory, so a missing fetched asset silently produces a binary with no Alpine
Closed
#374 Database targets: a Download button that exports the SQLite contents as gzipped JSON
Closed
#462 Six test-only gorm.Open calls still pass a bare gorm.Config
Closed
#170 Clamp the HTTP drain by the tail-hook reserve, not just the Sentry flush
Closed
#285 The withRetry bookkeeping-failure branch is unpinned: removing its error check leaves the suite green
Closed
#455 The eventBodyQuery comment credits the soft-delete predicate for refusing a reaped event
Closed
#252 Follow-ups from the PR 251 review: two comments state the wrong mechanism, and the resubmit route's middleware is untested
Closed
#232 Harden the (*gorm.DB).Scan guard test: three evasions, an overstated doc comment, and a weak file-count floor
Closed
#275 DeleteDB returns on the first failing suffix, so it can report a leftover file when the history is already destroyed
Closed
#375 Clickable things must look clickable: the entrypoint URL "copy" control, "+ Add", and every other one
Closed
#103 Pin the pre-reopen close in archiveWriter.sweepExpired (unprotected connection-leak guard)
Closed
#452 Tests outside the config package still read the developer's shell when they build a Config
Closed
#294 TestProcessRetryTask_LargeBody_FetchFromDB stays green when the fetch it exists to exercise is deleted
Closed
#93 Follow-ups from the PR #91 review: body-limit docs and route-ordering test coverage
Closed
#172 Assert the access-log encoded-byte charge against every Unicode code point
Closed
#94 Follow-ups from the PR #92 review: config test hygiene and env docs
Closed
#183 Two writers bypass internal/logger: fx's console logger and the Go runtime
Closed
#238 The event-DB sweep marker is monotonic and trusts itself, so a downgrade re-leaks target rows permanently
Closed
#168 Rate-limit key collapses every peer with an empty RemoteAddr into one bucket
Closed
#99 Follow-ups from the PR #96 re-review: retention bound docs and untested normalisation
Closed
#270 The access log records the proxy's address, never the client's, so abuse cannot be traced from webhooker's own logs
Closed
#198 make test is past the org 20s target and arguably past the 60s hard cap, driven almost entirely by internal/handlers
Closed
#371 The UI's Alpine.js never runs: the Content-Security-Policy forbids the eval it needs
Closed
#190 Last wall-clock-dependent test: two writes must land inside a real 2s debounce window or correct code reds
Closed
#101 Archive sweep repeats open/prune/close once per database target instead of once per webhook
Closed
#177 Target.Webhook and Webhook.Targets form a reference cycle that will recurse once anything marshals a preloaded model
Closed
#128 Form-error paths commit a 4xx before rendering, so a failed render there cannot report 500
Closed
#175 The CI workflow step is named "runs make check", which the image has never done
Closed
#431 The target toggle saves the whole row, so it can undo an edit of the same target
Closed
#154 middleware tests construct cookie stores by hand, so they no longer match the production store
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
Closed
#394 Webhook list does not show which webhooks are receiving or failing
Closed
#173 The receiver's 1 MB body cap lives in the handler, not the middleware the other route groups use
Closed
#376 Archive database filename includes the webhook name and the target name
Closed
#317 MAINTENANCE_MODE is a documented no-op configuration variable
Closed
#191 loggingResponseWriter has no Unwrap, so http.ResponseController cannot reach the real writer through the shipped chain
Closed
#267 webhooker_delivery_duration_seconds is absent from a scrape until the first delivery occurs
Closed
#402 No page shows the server's settings
Closed
#315 script/test always runs verbose and never measures coverage, against the policy pattern
Closed
#341 The SSRF guard lets a delivery reach [::], which is the host itself on Linux
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
Closed
#383 No message after saving, deleting, activating or signing out
Closed
#421 TODO.md says a docs-only commit replays from the layer cache, which is no longer true
Closed
#350 Webhook page: widen the entrypoints container by 50-100% so the URL does not wrap
Closed
#313 Outbound User-Agent is the hardcoded webhooker/1.0, not the stamped build version
Closed
#227 go test -count=2 ./internal/server/... panics on duplicate metrics collector registration
Closed
#366 Image built by upaas stamps version "unknown" into the binary
Closed
#382 Error pages outside forms are bare text with no way back
Closed
#398 Refusing a private target address does not say how to allow it
Closed
#384 Signing in does not return to the page that was asked for
Closed
#368 Per-webhook page: statistics pane at the top (lifetime and per retention period)
Closed
#367 Routes: per-webhook page under /webhook/ (not /source/), its log at .../events, inbound URLs under /h/UUID or /ingest/UUID
Closed
#344 make test needs up to 6.7 GiB of RAM (handlers and database tests under -race)
Closed
#412 Remove buildarch mentions: the architecture is read at runtime
Closed
#333 Trust the RFC 1918 ranges as proxies when TRUSTED_PROXIES is unset
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
Closed
#347 Recent events on a webhook page: 50 rows, relative times, size, processing time, delivery status
Closed
#401 Profile page says "Account Type: Standard User" for the admin account
Closed
#345 Commit the Alpine.js tarball in 3p/ instead of downloading it at build time
Closed
#184 Nothing bounds username length, and an account with a multi-KB username cannot log in at all
Closed
#363 Run every build, test and lint step in the Dockerfiles at nice -n 19
Closed
#340 The container sets its data directory permissions itself before startup
Closed
#359 After a restart under upaas: new admin password, and logging in with it returns 500
Closed
#169 Restrict /s/* to GET and HEAD — it currently answers POST, PUT and DELETE with 200
Closed
#193 Headers set before an uncommitted panic survive onto the recovered 500, including Set-Cookie
Closed
#245 Default-block the public-unicast cloud metadata endpoints (Azure WireServer, Equinix Metal)
Closed
#280 Archive writers are never closed at shutdown, so their -wal survives a clean stop
Closed
#246 A delivery can carry Content-Type twice when the inbound event also supplied one
Closed
#293 A pending delivery whose target was deleted is stranded forever
Closed
#306 Circuit breaker half-open state busy-loops queued tasks with a DB write per spin
Closed
#291 GetDB can open the same event database twice, and closing the loser drops the winner's file locks
Closed
#282 make check fails on a fresh clone because script/check does not fetch the vendored assets
Closed
#299 Startup recovery races the receiver and can deliver a fresh event twice
Closed
#314 No index on the columns the sweeps, recovery and the event log filter by
Closed
#307 WEBHOOKER_ENVIRONMENT defaults to dev, silently shipping insecure prod (no Secure cookies, CORS *)
Closed
#323 Ready to run under upaas: prod branch, one data volume, env configuration, README section
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
#278 Changing the password neither regenerates the current session nor invalidates any other one
Closed
#305 Notify drops tasks on full channel; pending deliveries only recover on process restart
Closed
#308 Listener bind failure leaves the process running with no listener instead of exiting non-zero
Closed
#309 SSRF blocking has no opt-out: cannot deliver to RFC1918/LAN targets — needs ALLOWED_TARGET_CIDRS
Closed
#310 Replay/redelivery does not exist and the UI shows no per-attempt results, despite README promises
92 Issues created by 2 users
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
#314 No index on the columns the sweeps, recovery and the event log filter by
Opened
#313 Outbound User-Agent is the hardcoded webhooker/1.0, not the stamped build version
Opened
#317 MAINTENANCE_MODE is a documented no-op configuration variable
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
#323 Ready to run under upaas: prod branch, one data volume, env configuration, README section
Opened
#325 The event log's resubmit count reads every live event instead of using the resubmitted_from_id index
Opened
#333 Trust the RFC 1918 ranges as proxies when TRUSTED_PROXIES is unset
Opened
#340 The container sets its data directory permissions itself before startup
Opened
#341 The SSRF guard lets a delivery reach [::], which is the host itself on Linux
Opened
#344 make test needs up to 6.7 GiB of RAM (handlers and database tests under -race)
Opened
#345 Commit the Alpine.js tarball in 3p/ instead of downloading it at build time
Opened
#347 Recent events on a webhook page: 50 rows, relative times, size, processing time, delivery status
Opened
#348 Log viewer: the caret does not collapse an event; clicking the row should toggle it
Opened
#349 Event log: only the newest event expanded on load, and only the 50 most recent events
Opened
#350 Webhook page: widen the entrypoints container by 50-100% so the URL does not wrap
Opened
#359 After a restart under upaas: new admin password, and logging in with it returns 500
Opened
#363 Run every build, test and lint step in the Dockerfiles at nice -n 19
Opened
#366 Image built by upaas stamps version "unknown" into the binary
Opened
#367 Routes: per-webhook page under /webhook/ (not /source/), its log at .../events, inbound URLs under /h/UUID or /ingest/UUID
Opened
#368 Per-webhook page: statistics pane at the top (lifetime and per retention period)
Opened
#369 Event bodies: per-event page, expandable recent events, full bodies under 32k, JSON formatted, scroll well over 200 lines
Opened
#370 Targets on the webhook page: one + Add, then pick a target type, then that type's settings
Opened
#371 The UI's Alpine.js never runs: the Content-Security-Policy forbids the eval it needs
Opened
#372 Target list: successful and failed deliveries per target, in total and in the last 24h
Opened
#373 New-webhook page: optional HTTP target URL and archive checkbox with pruning choice, creating those targets
Opened
#374 Database targets: a Download button that exports the SQLite contents as gzipped JSON
Opened
#375 Clickable things must look clickable: the entrypoint URL "copy" control, "+ Add", and every other one
Opened
#376 Archive database filename includes the webhook name and the target name
Opened
#377 Audit: missing basic functionality and information across the whole UI
Opened
#379 Archive database target: rotation setting puts year-month, day or hour in the filename
Opened
#381 Target and webhook edit pages lose what was typed when a save is rejected
Opened
#384 Signing in does not return to the page that was asked for
Opened
#383 No message after saving, deleting, activating or signing out
Opened
#382 Error pages outside forms are bare text with no way back
Opened
#385 A target paused by its circuit breaker is not shown as paused
Opened
#386 Event log: attempts and deliveries show no time, event times have no zone, replays look like originals
Opened
#387 Replay is offered for a deleted target, and its refusal gives advice that cannot work
Opened
#388 Database and log target deliveries read "Status: — (no response)"
Opened
#389 The event log never shows an event's request headers or the entrypoint it arrived at
Opened
#390 Event log cannot show only the events whose delivery failed
Opened
#391 At phone width the event log and the target list cut off statuses and controls
Opened
#392 An entrypoint's description cannot be changed
Opened
#396 Archive expiry is a raw duration typed by hand (720h)
Opened
#394 Webhook list does not show which webhooks are receiving or failing
Opened
#393 Entrypoints do not show when they last received an event
Opened
#395 The slack target's retry setting is not shown in the target list
Opened
#398 Refusing a private target address does not say how to allow it
Opened
#399 The UI names the same things in different ways
Opened
#400 Delete confirmations do not name the item or say what is lost
Opened
#401 Profile page says "Account Type: Standard User" for the admin account
Opened
#397 A database target does not show its archive file, size or last write
Opened
#402 No page shows the server's settings
Opened
#412 Remove buildarch mentions: the architecture is read at runtime
Opened
#414 Make main and next green: make test fails in the Docker build, and its output is cut off before the failure
Opened
#421 TODO.md says a docs-only commit replays from the layer cache, which is no longer true
Opened
#431 The target toggle saves the whole row, so it can undo an edit of the same target
Opened
#452 Tests outside the config package still read the developer's shell when they build a Config
Opened
#455 The eventBodyQuery comment credits the soft-delete predicate for refusing a reaped event
Opened
#459 The main database's open errors do not name the file
Opened
#462 Six test-only gorm.Open calls still pass a bare gorm.Config
Opened
#477 An http target's max_queue_size is stored and shown but nothing enforces it
Opened
#493 yarn 1 prints a url.parse() deprecation warning in the js-deps stage
Opened
#497 Merge main into next so the milestone PR merges again after 416
Opened
#499 Recommendations for a clearer, simpler object and data model
Opened
#500 The Redactor misses an echoed request line when the target URL has a query string but no path
Opened
#504 Re-vendor the canonical files from sneak/prompts at dd4027b
Opened
#506 Test helpers are compiled into the shipped binary
Opened
#507 Tests that fail at random under load
Opened
#508 CI fails at bootstrap: the runner cannot install Go
Opened
#511 Make next green: TestArchiveExport_Streams measures the shared heap and fails go test on noise
Opened
#518 A # or ? in DATA_DIR makes every database open the same, shorter path
Opened
#520 The README describes an upgrade path that does not exist before 1.0
Opened
#522 Two code comments explain behaviour by what an earlier build left behind
Opened
#525 The static image build links glibc's getaddrinfo and dlopen, which the Alpine runtime cannot satisfy
Opened
#527 A clean stop cancels in-flight delivery attempts and records them as failed; fire-and-forget deliveries are lost to a restart
Opened
#528 BIND_ADDRESS=0.0.0.0 binds IPv6 too; the README describes it as IPv4-only and distinct from ::
Opened
#529 finished_at and archived_at are stored with Go's monotonic clock reading appended (m=+365.03)
Opened
#530 CSP allows unsafe-inline scripts and styles and the README never says why
Opened
#531 webhooker logs the entrypoint UUID at INFO although the README says to keep it out of logs
Opened
#535 A comment in the middleware says the query logger writes client values into statements; it drops them
Opened
#538 why is CGO being used?
Opened
#539 Store a webhook's retention as a plain day count, 0 meaning forever
Opened
#540 Store a target's number of delivery attempts, at least one, instead of its retries
Opened
#541 Move the archive files into their own package
Opened
#542 Use one recovery routine at start and on every sweep tick
Opened
#543 Store a target's settings as columns instead of a per-type JSON string
Opened
#544 Move storing an event and creating its deliveries from the handlers into the delivery engine
Opened
#545 Build the binary without cgo
Opened
#548 Sentry events can carry the entrypoint URL in the Referer header
2 Unresolved Conversations
Open
#33
1.0/mvp
Open
#212
Encrypt credential-bearing target config at rest in webhooker.db