2025-08-18 - 2026-08-18

Overview

27 Active Pull Requests
74 Active Issues
Excluding merges, 2 authors have pushed 110 commits to main and 161 commits to all branches. On main, 97 files have changed and there have been 17323 additions and 2187 deletions.

26 Pull requests merged by 2 users

Merged #54 Update golangci-lint to v2.12.2 with canonical config 2026-08-10 16:12:23 +02:00

Merged #55 feat: cache size management and LRU eviction (closes #51) 2026-08-09 13:22:51 +02:00

Merged #53 feat: validate configuration on startup, fail fast on bad config (closes #52) 2026-08-07 22:39:40 +02:00

Merged #50 docs: record manual test pass of auth and encrypted URL flows (closes #49) 2026-08-07 18:44:01 +02:00

Merged #46 refactor: extract signature package from imgcache 2026-08-07 17:44:00 +02:00

Merged #48 fix: set Secure/HttpOnly/SameSite on session cookies (closes #47) 2026-08-07 17:41:03 +02:00

Merged #43 refactor: extract httpfetcher package from imgcache 2026-07-25 12:26:18 +02:00

Merged #45 scripts-to-rule-them-all 2026-07-07 02:14:03 +02:00

Merged #44 Update TODO.md: standard structure and Workflow section 2026-07-06 21:20:56 +02:00

Merged #42 refactor: extract magic byte detection into internal/magic package 2026-04-07 00:41:48 +02:00

Merged #41 refactor: extract whitelist package from internal/imgcache 2026-03-25 20:44:57 +01:00

Merged #36 Move schema_migrations table creation into 000.sql 2026-03-25 02:20:53 +01:00

Merged #40 Enforce and document exact-match-only for signature verification 2026-03-20 23:56:45 +01:00

Merged #34 Consolidate appname to internal/globals as a constant 2026-03-20 07:04:54 +01:00

Merged #37 Bound imageprocessor.Process input read to prevent unbounded memory use 2026-03-20 07:01:15 +01:00

Merged #33 feat: parse version prefix from migration filenames 2026-03-18 03:18:39 +01:00

Merged #25 fix: QA audit fixes for 1.0/MVP readiness 2026-03-15 17:58:13 +01:00

Merged #23 Split Dockerfile: pre-built golangci-lint stage for faster CI 2026-03-02 21:09:52 +01:00

Merged #16 fix: Docker build failures on arm64 (closes #15) 2026-02-25 20:51:45 +01:00

Merged #14 bring repo into compliance with repo policies 2026-02-25 14:52:56 +01:00

Merged #12 chore: remove local dev config files 2026-02-20 12:05:28 +01:00

Merged #6 fix: propagate AllowHTTP to SourceURL() scheme selection (closes #1) 2026-02-09 01:41:32 +01:00

Merged #8 fix: check negative cache in Service.Get() before fetching upstream (closes #3) 2026-02-09 01:32:27 +01:00

Merged #9 fix: correct Stats() column scanning and HitRate computation (closes #4) 2026-02-09 01:31:19 +01:00

Merged #7 fix: encode source query in GenerateSignedURL to avoid malformed URLs (closes #2) 2026-02-09 01:30:51 +01:00

Merged #10 fix: guard against division by zero when fetchBytes is 0 (closes #5) 2026-02-09 01:05:25 +01:00

1 Pull request proposed by 1 user

Proposed #105 next -> main (1.0.0 milestone) 2026-08-10 16:12:36 +02:00

23 Issues closed from 2 users

Closed #58 script/lint does not pin the golangci-lint binary version, so local runs can false-green against a stale linter 2026-08-10 16:13:10 +02:00

Closed #51 P0: implement cache size management and eviction 2026-08-09 13:22:51 +02:00

Closed #52 P0: validate configuration on startup, fail fast on bad config 2026-08-07 22:39:40 +02:00

Closed #49 P0: manual test pass of the auth and encrypted URL flows 2026-08-07 18:44:01 +02:00

Closed #47 Fix remaining gosec lint findings on main 2026-08-07 17:41:03 +02:00

Closed #29 000.initial.sql should contain migrations table schema 2026-03-25 02:20:53 +01:00

Closed #27 should not support suffix matching for signatures 2026-03-20 23:56:47 +01:00

Closed #30 Appname doesn’t need to be in main and internal/globals both 2026-03-20 09:38:44 +01:00

Closed #31 imageprocessor.Process appears to do unbounded read into memory 2026-03-20 07:01:15 +01:00

Closed #28 migrations need to parse version out of filename 2026-03-18 03:18:39 +01:00

Closed #26 should be configured via env vars not yaml 2026-03-15 18:10:08 +01:00

Closed #24 1.0/mvp 2026-03-15 17:58:13 +01:00

Closed #18 Split Dockerfile: pre-built golangci-lint stage for faster CI 2026-03-02 11:24:15 +01:00

Closed #20 Split Dockerfile: pre-built golangci-lint stage for faster CI 2026-03-02 09:28:31 +01:00

Closed #19 Split Dockerfile: pre-built golangci-lint stage for faster CI 2026-03-02 09:28:30 +01:00

Closed #21 Split Dockerfile: pre-built golangci-lint stage for faster CI 2026-03-02 08:51:57 +01:00

Closed #15 Docker build fails on arm64: golangci-lint binary hardcoded as linux-amd64 2026-02-25 20:51:45 +01:00

Closed #13 Add branch protection to main branch 2026-02-20 12:04:51 +01:00

Closed #1 Bug: SourceURL() hardcodes https:// breaking AllowHTTP mode 2026-02-09 01:41:32 +01:00

Closed #3 Bug: Negative cache is never checked - checkNegativeCache is dead code 2026-02-09 01:32:27 +01:00

Closed #4 Bug: Stats() scans database columns into wrong struct fields 2026-02-09 01:31:19 +01:00

Closed #2 Bug: GenerateSignedURL produces malformed URL when source has query string 2026-02-09 01:30:51 +01:00

Closed #5 Bug: Division by zero in processAndStore when source data is empty 2026-02-09 01:05:25 +01:00

74 Issues created by 1 user

Opened #2 Bug: GenerateSignedURL produces malformed URL when source has query string 2026-02-09 00:56:06 +01:00

Opened #1 Bug: SourceURL() hardcodes https:// breaking AllowHTTP mode 2026-02-09 00:56:06 +01:00

Opened #3 Bug: Negative cache is never checked - checkNegativeCache is dead code 2026-02-09 00:56:07 +01:00

Opened #4 Bug: Stats() scans database columns into wrong struct fields 2026-02-09 00:56:08 +01:00

Opened #5 Bug: Division by zero in processAndStore when source data is empty 2026-02-09 00:56:08 +01:00

Opened #13 Add branch protection to main branch 2026-02-20 11:59:59 +01:00

Opened #15 Docker build fails on arm64: golangci-lint binary hardcoded as linux-amd64 2026-02-25 15:12:41 +01:00

Opened #17 µPaaS deployment setup 2026-03-02 08:47:37 +01:00

Opened #18 Split Dockerfile: pre-built golangci-lint stage for faster CI 2026-03-02 08:50:56 +01:00

Opened #19 Split Dockerfile: pre-built golangci-lint stage for faster CI 2026-03-02 08:51:08 +01:00

Opened #20 Split Dockerfile: pre-built golangci-lint stage for faster CI 2026-03-02 08:51:22 +01:00

Opened #21 Split Dockerfile: pre-built golangci-lint stage for faster CI 2026-03-02 08:51:36 +01:00

Opened #24 1.0/mvp 2026-03-04 12:06:35 +01:00

Opened #26 should be configured via env vars not yaml 2026-03-15 18:01:47 +01:00

Opened #27 should not support suffix matching for signatures 2026-03-15 18:02:25 +01:00

Opened #28 migrations need to parse version out of filename 2026-03-15 18:06:44 +01:00

Opened #29 000.initial.sql should contain migrations table schema 2026-03-15 18:09:18 +01:00

Opened #30 Appname doesn’t need to be in main and internal/globals both 2026-03-15 18:14:24 +01:00

Opened #31 imageprocessor.Process appears to do unbounded read into memory 2026-03-15 18:24:38 +01:00

Opened #39 Refactor: split internal/imgcache into focused packages 2026-03-18 04:34:17 +01:00

Opened #47 Fix remaining gosec lint findings on main 2026-08-04 02:28:06 +02:00

Opened #49 P0: manual test pass of the auth and encrypted URL flows 2026-08-07 17:44:56 +02:00

Opened #51 P0: implement cache size management and eviction 2026-08-07 18:06:42 +02:00

Opened #52 P0: validate configuration on startup, fail fast on bad config 2026-08-07 18:06:54 +02:00

Opened #56 Cache.Stats reads never-populated output_content/request_cache tables, so TotalItems and TotalSizeBytes are always 0 2026-08-07 23:13:03 +02:00

Opened #57 Migrate .golangci.yml from deprecated gomodguard to gomodguard_v2 2026-08-07 23:14:45 +02:00

Opened #58 script/lint does not pin the golangci-lint binary version, so local runs can false-green against a stale linter 2026-08-09 03:00:19 +02:00

Opened #59 script/test doesn't follow the REPO_POLICIES conditional-verbose-rerun pattern (always runs -v) 2026-08-09 03:00:22 +02:00

Opened #60 P1 security: q and fit are outside the HMAC signature, allowing 500x cache/transcode amplification from one signed URL 2026-08-09 03:42:53 +02:00

Opened #61 P1: four config keys documented in README do not exist and now abort startup 2026-08-09 03:43:07 +02:00

Opened #62 P1: /v1/e/ encrypted URLs bypass dimension and fit-mode validation 2026-08-09 03:43:23 +02:00

Opened #63 Expiring URLs are served with Cache-Control: max-age=31536000, immutable 2026-08-09 03:43:32 +02:00

Opened #64 P1: no global cap on concurrent image processing — unbounded memory under load 2026-08-09 03:43:51 +02:00

Opened #65 No request coalescing: K concurrent misses for the same variant cause K upstream fetches and K transcodes 2026-08-09 03:44:03 +02:00

Opened #66 P1 security: no rate limiting or lockout on the signing-key login form 2026-08-09 03:44:20 +02:00

Opened #67 P1: blocked networks config + SSRF gaps (CGNAT, benchmark, NAT64 ranges not blocked) 2026-08-09 03:44:32 +02:00

Opened #68 Decide on SVG: it is accepted and rendered by libvips, and format=orig silently returns JPEG 2026-08-09 03:44:54 +02:00

Opened #69 CacheConfig.CacheTTL is configured but never read — cached variants never expire 2026-08-09 03:45:06 +02:00

Opened #70 Cache.metaCache is dead: every cache hit does open+stat+ReadFile+JSON parse instead of the in-memory lookup README promises 2026-08-09 03:45:28 +02:00

Opened #71 maintenance_mode is configurable and reported by the healthcheck but does not affect any request 2026-08-09 03:45:38 +02:00

Opened #72 Silently swallowed errors: unparseable exp yields 401 instead of 400, sidecar write failures logged nowhere 2026-08-09 03:45:56 +02:00

Opened #73 Remove dead abstractions in imgcache: unimplemented Purge and three interfaces with no implementers 2026-08-09 03:46:08 +02:00

Opened #74 README describes storage paths, formats, and features that do not match the code 2026-08-09 03:47:33 +02:00

Opened #75 Document the auth UI, encrypted-URL routes, q/fit parameters, and the undocumented config keys 2026-08-09 03:47:47 +02:00

Opened #76 internal/handlers has 4 tests: the 401 signature boundary and every error path are untested 2026-08-09 03:48:01 +02:00

Opened #77 The auth UI and encrypted-URL flows have zero Go tests — only a manual shell script 2026-08-09 03:48:12 +02:00

Opened #78 httpfetcher: redirect-to-private-IP SSRF and semaphore release are untested 2026-08-09 03:48:28 +02:00

Opened #79 internal/middleware: CORS, logging, and the metrics auth gate are untested 2026-08-09 03:48:37 +02:00

Opened #80 No integration test of the end-to-end image proxy flow 2026-08-09 03:48:52 +02:00

Opened #81 No load test verifying the documented 1k-5k req/s target 2026-08-09 03:49:02 +02:00

Opened #82 P1 privacy: EXIF and other metadata are not stripped from processed images 2026-08-09 03:49:19 +02:00

Opened #83 Capture upstream Last-Modified/ETag and support conditional revalidation 2026-08-09 03:49:30 +02:00

Opened #84 Response header gaps: no Vary, X-Request-ID not returned or propagated, /v1/e/ lacks ETag/HEAD/304 2026-08-09 03:49:48 +02:00

Opened #85 No pixa-specific Prometheus metrics, and metrics are not collected at all unless credentials are configured 2026-08-09 03:50:01 +02:00

Opened #86 Shutdown correctness: exit code always 0, two competing signal handlers, Sentry calls os.Exit from a goroutine 2026-08-09 03:50:20 +02:00

Opened #87 httpfetcher.hostSems grows without bound, and VariantStorage.Delete orphans the .meta sidecar 2026-08-09 03:50:32 +02:00

Opened #88 Implement format=auto (Accept-header content negotiation) 2026-08-09 03:50:49 +02:00

Opened #89 Write the deployment guide and an example reverse proxy config 2026-08-09 03:51:01 +02:00

Opened #90 Implement referer blocklist to prevent hotlinking 2026-08-09 03:51:22 +02:00

Opened #91 Blocks 1.0: missing HSTS, CSP, and Permissions-Policy security headers 2026-08-09 07:02:29 +02:00

Opened #92 Blocks 1.0: http.Server missing IdleTimeout and ReadHeaderTimeout (slowloris), no request body size limits 2026-08-09 07:02:42 +02:00

Opened #93 Blocks 1.0: no CSRF protection on the cookie-authenticated POST / and POST /generate forms 2026-08-09 07:02:57 +02:00

Opened #94 Blocks 1.0: no trusted-proxy handling — every log line and login record shows the proxy's IP 2026-08-09 07:03:11 +02:00

Opened #95 Dockerfile duplicates dependency installs inline instead of running script/bootstrap, and omits -trimpath / -s -w 2026-08-09 07:03:29 +02:00

Opened #96 Migrations are not at the mandated internal/db/migrations/ path or filenames 2026-08-09 07:03:39 +02:00

Opened #97 Repo layout: non-canonical root files, a confusing scripts/ directory, and a stale reformatted CONVENTIONS.md 2026-08-09 07:04:00 +02:00

Opened #98 CORS wildcard is applied at the router root, covering the cookie-authenticated routes 2026-08-09 07:04:11 +02:00

Opened #99 Port is not overridable with the PORT environment variable 2026-08-09 07:04:27 +02:00

Opened #100 Markdown is never formatted: script/fmt covers only Go, and no prettier config exists 2026-08-09 07:04:41 +02:00

Opened #101 script/cibuild can report a green it did not earn: docker layer cache can skip make check entirely 2026-08-09 07:37:54 +02:00

Opened #102 Eviction loop is not context-cancellable; shutdown ignores its deadline 2026-08-09 15:37:46 +02:00

Opened #103 Tracking: 1.0.0 sequencing and critical path 2026-08-09 16:10:39 +02:00

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

Opened #106 TODO.md documents a branch-from-main workflow that no longer matches the next branching model 2026-08-10 16:14:39 +02:00