2026-07-22 - 2026-10-22

Overview

133 Active Pull Requests
150 Active Issues
Excluding merges, 1 author has pushed 7 commits to main and 129 commits to all branches. On main, 80 files have changed and there have been 8067 additions and 2892 deletions.

3 Releases published by 1 user

Published v1.0.0-rc3 2026-10-20 15:20:22 +02:00

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

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

130 Pull requests merged by 1 user

Merged #325 Serve a cache hit with no database read or write (closes #309) 2026-10-21 18:12:56 +02:00

Merged #324 Store a source the way a variant is stored, one row and one file per source URL (closes #308) 2026-10-21 16:31:34 +02:00

Merged #323 One image request type instead of five (closes #307) 2026-10-21 14:41:08 +02:00

Merged #322 Run only script/cibuild in the Gitea workflow (closes #203) 2026-10-21 13:23:00 +02:00

Merged #278 Keep WebP, AVIF and JPEG XL encodes at the limits under 40 seconds (closes #272) 2026-10-20 15:19:08 +02:00

Merged #273 Answer 415 for a source whose first bytes do not match its Content-Type (closes #253) 2026-10-20 14:40:52 +02:00

Merged #306 Let a bug fix change the test that pins the behavior the bug calls wrong (closes #280) 2026-10-20 14:25:08 +02:00

Merged #304 Re-vendor the canonical files from sneak/prompts at 0653579 (closes #221) 2026-10-19 06:11:44 +02:00

Merged #305 Read a trusted_proxies entry in the IPv4-mapped form as its IPv4 range (closes #303) 2026-10-19 05:29:06 +02:00

Merged #279 Space reconciliation passes by ten times the last pass's time (closes #250) 2026-10-19 05:00:49 +02:00

Merged #302 Read a blocked_networks entry in the IPv4-mapped form as its IPv4 range (closes #301) 2026-10-19 03:00:44 +02:00

Merged #300 Refuse local-use NAT64 addresses, and IPv4-compatible ones in blocked_networks (closes #299) 2026-10-16 06:52:18 +02:00

Merged #298 Refuse an IPv6 address that holds an internal IPv4 address (closes #297) 2026-10-16 05:31:56 +02:00

Merged #296 Fetch an IPv6 source host written without a port (closes #295) 2026-10-16 05:00:47 +02:00

Merged #292 Escape state_dir in the db_url derived from it (closes #290) 2026-10-16 04:37:55 +02:00

Merged #291 Keep a side computed for a size with one side 0 at 1 or more (closes #283) 2026-10-16 04:18:00 +02:00

Merged #294 Make one image URL per source on the generator page for host case and an empty path (closes #293) 2026-10-16 04:04:19 +02:00

Merged #289 Fetch the source path and query URL-encoded, not joined as text (closes #288) 2026-10-16 03:31:16 +02:00

Merged #284 Crop the centre before resizing for fit=cover (closes #282) 2026-10-16 02:23:19 +02:00

Merged #287 Refuse an image URL whose source path or query holds a # (closes #286) 2026-10-16 01:36:57 +02:00

Merged #285 Refuse an image URL whose host is not a host name or IP address (closes #275) 2026-10-16 01:14:51 +02:00

Merged #281 Document how a source query goes into an image URL, and accept it (closes #255) 2026-10-16 00:17:34 +02:00

Merged #261 Default max_concurrent_processing to half the CPUs pixa sees (closes #242) 2026-10-15 23:07:23 +02:00

Merged #276 Re-vendor the canonical files from sneak/prompts at e3f79c4 (closes #221) 2026-10-15 22:40:39 +02:00

Merged #277 Label request metrics with standard HTTP methods only (closes #274) 2026-10-15 21:47:11 +02:00

Merged #265 Logging out ends every login session (closes #256) 2026-10-15 20:44:44 +02:00

Merged #263 Sync cached files and refuse ones left empty or partial (closes #252) 2026-10-15 19:27:33 +02:00

Merged #271 Stop a transcode whose request has ended before it encodes (closes #243) 2026-10-15 18:44:12 +02:00

Merged #270 Tell upaas operators to set the cache size limit (closes #251) 2026-10-15 18:16:19 +02:00

Merged #260 Label request metrics by route, not by path (closes #254) 2026-10-15 16:37:21 +02:00

Merged #262 Remove expired negative cache rows in the eviction loop (closes #244) 2026-10-15 15:02:28 +02:00

Merged #268 Serve a cached variant while its source URL is in the negative cache (closes #245) 2026-10-15 13:45:26 +02:00

Merged #266 Lower-case the image URL's host and require a signature for a port (closes #246) 2026-10-15 12:31:15 +02:00

Merged #269 Escape : and % in the signed and cached path and query (closes #247) 2026-10-15 09:37:02 +02:00

Merged #267 Accept a chunked upstream body of exactly the maximum size (closes #248) 2026-10-15 07:44:09 +02:00

Merged #264 Allowlist no host in the example config (closes #249) 2026-10-15 06:26:25 +02:00

Merged #259 Refuse a fit=outside size whose output exceeds the maximum (closes #257) 2026-10-13 10:44:46 +02:00

Merged #258 Refuse a size whose computed side exceeds the maximum (closes #241) 2026-10-13 09:44:45 +02:00

Merged #239 Remove the unused cache lifetime setting (closes #69) 2026-10-13 07:58:56 +02:00

Merged #240 Refuse SVG sources and never save an unknown input as JPEG (closes #68) 2026-10-13 07:13:18 +02:00

Merged #235 Keep counts not written by the request's deadline in memory (closes #224) 2026-10-13 03:07:26 +02:00

Merged #237 Limit each client's requests to the image routes (closes #236) 2026-10-13 01:36:20 +02:00

Merged #234 Save PNG compressed, WebP at effort 4 and AVIF at effort 1 (closes #232) 2026-10-08 14:13:26 +02:00

Merged #233 Serve JPEG XL when a request names no format (closes #222) 2026-10-08 12:49:57 +02:00

Merged #230 Serve and accept JPEG XL as an image format (part of #222) 2026-10-08 11:01:13 +02:00

Merged #231 Run pixad on the Alpine release it is built on (closes #229) 2026-10-08 09:35:04 +02:00

Merged #228 Eviction no longer reads a whole table while requests wait on the database (closes #227) 2026-10-08 07:12:03 +02:00

Merged #226 Install libvips JPEG XL support and require it at startup (part of #222) 2026-10-08 06:19:06 +02:00

Merged #225 Queue SQLite writes on one connection so none fails as locked (closes #223) 2026-10-08 04:50:33 +02:00

Merged #220 Serve the format auto, chosen from the Accept header (closes #88) 2026-10-05 05:24:51 +02:00

Merged #219 Format the markdown with prettier in script/fmt and script/fmt-check (closes #100) 2026-10-05 04:24:46 +02:00

Merged #218 Run lint and tests as the lint and test phases of the Dockerfile, built with --no-cache (closes #202) 2026-10-05 03:41:51 +02:00

Merged #209 Add script/loadtest to measure throughput, latency and memory (closes #81) 2026-10-05 02:58:41 +02:00

Merged #216 Fetch the tags in the CI checkout (closes #208) 2026-10-05 02:07:33 +02:00

Merged #217 Keep config.yml out of git and the Docker build context (closes #212) 2026-10-05 01:58:32 +02:00

Merged #214 Keep local config files out of the Docker build context (closes #211) 2026-10-05 01:24:41 +02:00

Merged #215 Move pixad's startup from cmd/pixad into internal/app (closes #206) 2026-10-05 01:07:48 +02:00

Merged #213 Ignore .claude/ in .gitignore (closes #204) 2026-10-05 00:41:42 +02:00

Merged #210 Keep secrets out of the Docker build context at every depth (closes #205) 2026-10-05 00:07:37 +02:00

Merged #207 Replace REPO_POLICIES.md with the canonical copy from sneak/prompts (closes #196) 2026-10-04 23:59:30 +02:00

Merged #195 Add an integration test of the image proxy flow (closes #80) 2026-10-04 23:24:46 +02:00

Merged #201 Test that a URL made on the generator page with a ttl expires (closes #199) 2026-10-04 22:42:04 +02:00

Merged #197 Refuse image requests whose Referer is on referer_blocklist (closes #90) 2026-10-04 22:24:50 +02:00

Merged #194 Move the example config to configs/, delete scripts/ and CONVENTIONS.md (closes #97) 2026-10-04 21:07:52 +02:00

Merged #200 Wait on a busy SQLite database and turn on WAL mode (closes #198) 2026-10-04 20:58:37 +02:00

Merged #193 Make the periodic reconciliation test wait for the startup pass (closes #189) 2026-10-04 19:59:37 +02:00

Merged #188 Count what the cache holds in the default cache_max_bytes (closes #184) 2026-10-04 19:41:50 +02:00

Merged #191 Test logging in, logging out, the URL generator and /v1/e/ tokens (closes #77) 2026-10-04 19:24:40 +02:00

Merged #185 Drop unsafe-inline from the Content-Security-Policy (closes #125) 2026-10-04 18:58:41 +02:00

Merged #186 Replace the deprecated gomodguard with gomodguard_v2 by re-vendoring .golangci.yml (closes #57) 2026-10-04 18:34:55 +02:00

Merged #181 Abort startup on a config file pixa cannot read (closes #176) 2026-10-04 18:24:44 +02:00

Merged #192 Merge TODO.md with git's union merge (closes #190) 2026-10-04 17:58:42 +02:00

Merged #187 Stop TestEvictionRunsOnPeriodicSchedule racing the evictor (closes #183) 2026-10-04 16:58:35 +02:00

Merged #182 Write the deployment guide and an example Caddy config (closes #89) 2026-10-04 15:08:04 +02:00

Merged #178 Test the metrics basic auth, CORS preflight, login logging and metrics recording (closes #79) 2026-10-04 14:39:28 +02:00

Merged #177 Test the image route's signature check and error answers (closes #76) 2026-10-04 13:58:29 +02:00

Merged #179 Return and pass on request IDs, and give /v1/e/ ETag, 304 and HEAD (closes #84) 2026-10-04 12:41:55 +02:00

Merged #174 Document every route, encrypted URLs and the config file search (closes #75) 2026-10-04 09:58:36 +02:00

Merged #173 Stop cache eviction in progress at shutdown (closes #102) 2026-10-04 09:24:42 +02:00

Merged #175 Remove unimplemented Purge and three unused interfaces from imgcache (closes #73) 2026-10-04 08:41:38 +02:00

Merged #171 Remove idle upstream host semaphores and delete a variant's .meta file with it (closes #87) 2026-10-04 07:11:32 +02:00

Merged #172 Make the README's storage paths, formats, TLS and metrics match the code (closes #74) 2026-10-04 06:24:38 +02:00

Merged #169 Exit with the shutdown's code and wait for image processing (closes #86) 2026-10-04 04:59:31 +02:00

Merged #170 Run the checks on every script/cibuild and script/docker build (closes #101) 2026-10-04 03:58:37 +02:00

Merged #160 Share one fetch and transcode among concurrent misses (closes #65) 2026-10-04 01:58:50 +02:00

Merged #162 Send CORS headers only from the image routes (closes #98) 2026-10-03 17:49:44 +02:00

Merged #167 Stamp the tag or short commit in a plain docker build (closes #166) 2026-10-02 06:01:42 +02:00

Merged #165 Read the architecture at run time, not via a Buildarch ldflag (closes #164) 2026-10-02 01:17:37 +02:00

Merged #161 Container makes /var/lib/pixa usable before starting pixad 2026-09-29 12:44:38 +02:00

Merged #157 Keep variant content types in memory for cache hits (closes #70) 2026-09-29 12:00:11 +02:00

Merged #154 Answer image requests with 503 in maintenance mode (closes #71) 2026-09-29 11:01:31 +02:00

Merged #148 Bound concurrent image processing and upstream fetches (closes #64) 2026-09-29 10:32:18 +02:00

Merged #156 Install Dockerfile build dependencies through script/bootstrap (closes #95) 2026-09-29 09:11:22 +02:00

Merged #142 Add the four settings the README documented but pixa lacked (closes #61) 2026-09-29 08:49:19 +02:00

Merged #155 Move migrations to internal/db/migrations (closes #96) 2026-09-29 07:42:06 +02:00

Merged #153 Correct trusted_proxies advice and state signature padding (closes #150) 2026-09-29 06:05:45 +02:00

Merged #144 Make the cache stats count what is cached, fetched and transcoded (closes #56) 2026-09-29 05:25:11 +02:00

Merged #152 Give pixad a fixed uid and gid 65532 (closes #151) 2026-09-29 04:44:50 +02:00

Merged #146 Keep max-age within an expiring image URL's lifetime (closes #63) 2026-09-29 03:51:58 +02:00

Merged #118 next -> main (1.0.0 milestone) 2026-09-29 03:01:06 +02:00

Merged #145 Strip metadata from processed images (closes #82) 2026-09-29 02:18:26 +02:00

Merged #143 Rate limit login attempts per client address (closes #66) 2026-09-29 01:03:38 +02:00

Merged #141 Refuse an unparseable exp with 400; log swallowed cache errors (closes #72) 2026-09-28 19:59:39 +02:00

Merged #140 Refuse an empty fit on /v1/image/ with 400 (closes #139) 2026-09-28 18:07:12 +02:00

Merged #138 Refuse a q outside 1-100 on /v1/image/ with 400 2026-09-28 17:46:49 +02:00

Merged #136 Abort startup on an unknown PIXA_ environment variable (closes #133) 2026-09-28 16:12:58 +02:00

Merged #137 Describe what --health-interval does in docker-smoke on current Docker (closes #132) 2026-09-28 15:48:53 +02:00

Merged #126 fix: validate dimensions and fit mode on encrypted URLs (closes #62) 2026-09-28 15:24:32 +02:00

Merged #135 Start on a fresh upaas volume and document running under upaas (closes #129) 2026-09-28 15:12:48 +02:00

Merged #122 build: run all linting in Docker through script/lint (closes #104) 2026-09-28 14:27:35 +02:00

Merged #131 Every setting can be given as an environment variable (closes #128) 2026-09-28 13:46:56 +02:00

Merged #116 Include quality and fit in the URL signature (closes #60) 2026-09-28 13:02:22 +02:00

Merged #130 Add a Docker HEALTHCHECK and make docker-smoke (closes #111) 2026-09-28 12:06:30 +02:00

Merged #127 Resolve real client IP behind trusted proxies (closes #94) 2026-09-22 10:25:42 +02:00

Merged #124 feat: blocked_networks config and extended SSRF ranges (closes #67) 2026-09-22 00:43:27 +02:00

Merged #120 Take the image signing key from PIXA_SIGNING_KEY and refuse the example placeholder (closes #110) 2026-09-21 21:59:25 +02:00

Merged #123 Harden http.Server: slowloris timeouts and form body limit (closes #92) 2026-09-21 20:59:25 +02:00

Merged #121 feat: add HSTS, CSP, and Permissions-Policy security headers (closes #91) 2026-09-21 20:43:13 +02:00

Merged #114 docs: update TODO.md Workflow and Status for the next branching model (closes #106) 2026-09-21 19:59:52 +02:00

Merged #119 test: cover redirect SSRF and semaphore release in httpfetcher (closes #78) 2026-09-21 19:59:27 +02:00

Merged #115 fix: script/test conditional-verbose-rerun with -cover (closes #59) 2026-09-21 19:43:22 +02:00

Merged #117 CSRF protection on the login and URL-generator forms (closes #93) 2026-09-21 19:26:18 +02:00

Merged #105 next -> main (1.0.0 milestone) 2026-09-21 09:31:55 +02:00

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

3 Pull requests proposed by 1 user

Proposed #147 main -> prod: first deploy of pixa 2026-09-29 03:10:56 +02:00

Proposed #149 next -> main 2026-09-29 03:52:11 +02:00

Proposed #326 Declare only the tables and columns pixa writes and reads (closes #310) 2026-10-21 18:23:32 +02:00

132 Issues closed from 1 user

Closed #309 Serve a cache hit with no database read or write 2026-10-21 18:12:57 +02:00

Closed #308 Store a source the way a variant is stored: one row and one file per source URL 2026-10-21 16:31:35 +02:00

Closed #307 One image request type instead of five 2026-10-21 14:41:09 +02:00

Closed #203 The Gitea workflow runs script/docker-smoke besides script/cibuild 2026-10-21 13:23:01 +02:00

Closed #272 WebP, AVIF and JPEG XL outputs with an alpha channel take longer to encode than the request may wait 2026-10-20 15:19:08 +02:00

Closed #253 A source whose first bytes do not match its Content-Type answers 500 and is fetched again on every request 2026-10-20 14:40:53 +02:00

Closed #280 May a bug fix change a test that pins exactly the behaviour the bug calls wrong, without asking each time? 2026-10-20 14:25:09 +02:00

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

Closed #303 A trusted_proxies entry written in the IPv4-mapped form is accepted but never matches 2026-10-19 05:29:06 +02:00

Closed #250 The reconciliation pass costs one database query per cached file and runs back to back on a large cache 2026-10-19 05:00:49 +02:00

Closed #301 A blocked_networks entry written in the IPv4-mapped form is accepted but refuses nothing 2026-10-19 03:00:44 +02:00

Closed #299 The local-use NAT64 range and the operator's blocked_networks list miss IPv4 addresses embedded in IPv6 2026-10-16 06:52:18 +02:00

Closed #297 The private-address check misses an IPv4 address embedded in an IPv6 one 2026-10-16 05:31:57 +02:00

Closed #295 An IPv6 source host written without a port is refused by the fetcher and answers 500 2026-10-16 05:00:48 +02:00

Closed #290 A state_dir holding %, ? or # breaks the database URL pixa derives from it 2026-10-16 04:37:55 +02:00

Closed #283 A size with one side 0 whose computed side rounds down to 0 comes out square, can ask for tens of GB, or answers 500 2026-10-16 04:18:00 +02:00

Closed #293 The generator page gives one upstream image several cache keys for host case and an empty path 2026-10-16 04:04:20 +02:00

Closed #288 The source URL is built by joining the decoded path and query as text, so some characters reach the upstream wrong 2026-10-16 03:31:16 +02:00

Closed #282 A thin source requested with fit=cover makes libvips allocate a huge uncropped image 2026-10-16 02:23:19 +02:00

Closed #286 A # written into the source path or query gives another unsigned spelling of an allowlisted image 2026-10-16 01:36:58 +02:00

Closed #275 A ? written into the host segment of an image URL gives another unsigned spelling of an allowlisted source 2026-10-16 01:14:51 +02:00

Closed #255 The README gives no way to put a source query into a signed image URL, and the in-tree builder makes one that fails 2026-10-16 00:17:34 +02:00

Closed #242 Memory per image and the default number of images processed at once are not bounded or documented for the container 2026-10-15 23:07:24 +02:00

Closed #274 The request metrics label every distinct HTTP method name, so made-up methods grow memory without bound when metrics are on 2026-10-15 21:47:11 +02:00

Closed #256 Logging out does not end the login session 2026-10-15 20:44:45 +02:00

Closed #252 A cached file left empty or partial by a crash is served or re-fetched forever 2026-10-15 19:27:34 +02:00

Closed #243 Image processing runs past the request's deadline and keeps its slot 2026-10-15 18:44:13 +02:00

Closed #251 The upaas section calls the cache size limit optional, but its default takes three quarters of a shared filesystem 2026-10-15 18:16:19 +02:00

Closed #254 The request metrics label every distinct URL path, so unauthenticated requests grow memory without bound when metrics are on 2026-10-15 16:37:21 +02:00

Closed #244 Negative-cache rows are never purged, so the database grows without bound 2026-10-15 15:02:28 +02:00

Closed #245 A cached variant is refused while its source URL is in the negative cache 2026-10-15 13:45:26 +02:00

Closed #246 The host segment is not normalized before the allowlist, the per-host limit and the cache keys 2026-10-15 12:31:16 +02:00

Closed #247 The signed data and the cache key are ambiguous between path and query 2026-10-15 09:37:02 +02:00

Closed #248 A chunked upstream body of exactly the maximum size is refused 2026-10-15 07:44:09 +02:00

Closed #249 The example config allowlists public hosts that carry anyone's uploads 2026-10-15 06:26:25 +02:00

Closed #257 fit=outside with both sides given makes an output of unbounded size 2026-10-13 10:44:46 +02:00

Closed #241 A request with one dimension 0 makes an output of unbounded size 2026-10-13 09:44:45 +02:00

Closed #69 CacheConfig.CacheTTL is configured but never read — cached variants never expire 2026-10-13 07:58:57 +02:00

Closed #68 Decide on SVG: it is accepted and rendered by libvips, and format=orig silently returns JPEG 2026-10-13 07:13:19 +02:00

Closed #113 Delete five stale remote branches 2026-10-13 03:17:10 +02:00

Closed #103 Tracking: 1.0.0 sequencing and critical path 2026-10-13 03:16:55 +02:00

Closed #238 TestService_Get_WaitsForSlotBeforeReadingCachedSource fails when the host is busy 2026-10-13 03:07:33 +02:00

Closed #224 TestService_Get_ReturnsByItsDeadline fails when the host is busy 2026-10-13 03:07:27 +02:00

Closed #236 One client can keep every image processing slot busy: the image routes have no limit per client 2026-10-13 01:36:21 +02:00

Closed #232 PNG output is saved uncompressed, and WebP, AVIF and GIF at the lowest effort 2026-10-08 14:13:26 +02:00

Closed #222 JPEG XL as a first-class format, and the default output when none is specified 2026-10-08 12:49:57 +02:00

Closed #229 The runtime image runs pixad on an older Alpine and libvips than it was built with 2026-10-08 09:35:05 +02:00

Closed #227 Requests wait behind the eviction pass's whole-table queries on the one database connection 2026-10-08 07:12:05 +02:00

Closed #223 Concurrent SQLite writes still fail with "database is locked" under load, so next is red 2026-10-08 04:50:33 +02:00

Closed #88 Implement format=auto (Accept-header content negotiation) 2026-10-05 05:24:51 +02:00

Closed #100 Markdown is never formatted: script/fmt covers only Go, and no prettier config exists 2026-10-05 04:24:47 +02:00

Closed #202 Lint and tests do not run as the lint and test phases of the Dockerfile, built with --no-cache 2026-10-05 03:41:51 +02:00

Closed #81 No load test verifying the documented 1k-5k req/s target 2026-10-05 02:58:41 +02:00

Closed #208 The CI checkout fetches no tags, so a version stamped from git describe would be a bare commit 2026-10-05 02:07:33 +02:00

Closed #212 config.yml, the config file Getting Started creates, is kept out of neither git nor the Docker build context 2026-10-05 01:58:32 +02:00

Closed #211 Local config files that can hold the signing key still reach the Docker build context 2026-10-05 01:24:42 +02:00

Closed #206 cmd/pixad/main.go holds logic that belongs under internal/ 2026-10-05 01:07:48 +02:00

Closed #204 .gitignore does not ignore .claude/ 2026-10-05 00:41:42 +02:00

Closed #205 .dockerignore keeps secrets out only at the repository root 2026-10-05 00:07:37 +02:00

Closed #196 REPO_POLICIES.md no longer matches the canonical copy in sneak/prompts 2026-10-04 23:59:30 +02:00

Closed #80 No integration test of the end-to-end image proxy flow 2026-10-04 23:24:47 +02:00

Closed #199 No test that a URL made on the generator page with a ttl expires (410) 2026-10-04 22:42:04 +02:00

Closed #90 Implement referer blocklist to prevent hotlinking 2026-10-04 22:24:50 +02:00

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

Closed #198 SQLite writes are dropped with "database is locked": no busy timeout, and WAL is never turned on 2026-10-04 20:58:37 +02:00

Closed #189 TestPeriodicReconciliationAdoptsFileThatAppearsAfterStartup can pass without a periodic pass 2026-10-04 19:59:37 +02:00

Closed #184 The default cache_max_bytes shrinks as the cache fills: each restart can evict most of the cache 2026-10-04 19:41:50 +02:00

Closed #77 The auth UI and encrypted-URL flows have zero Go tests — only a manual shell script 2026-10-04 19:24:40 +02:00

Closed #125 Remove unsafe-inline from the Content-Security-Policy: move inline handlers and runtime Tailwind styles into served assets 2026-10-04 18:58:41 +02:00

Closed #57 Migrate .golangci.yml from deprecated gomodguard to gomodguard_v2 2026-10-04 18:34:55 +02:00

Closed #176 A config file pixa cannot read is skipped silently instead of aborting startup 2026-10-04 18:24:44 +02:00

Closed #190 Every merge to next makes the other open PRs conflict in TODO.md 2026-10-04 17:58:42 +02:00

Closed #183 Make next green: TestEvictionRunsOnPeriodicSchedule races the evictor's reconciliation and fails make test 2026-10-04 16:58:35 +02:00

Closed #89 Write the deployment guide and an example reverse proxy config 2026-10-04 15:08:04 +02:00

Closed #79 internal/middleware: CORS, logging, and the metrics auth gate are untested 2026-10-04 14:39:29 +02:00

Closed #76 internal/handlers has 4 tests: the 401 signature boundary and every error path are untested 2026-10-04 13:58:29 +02:00

Closed #84 Response header gaps: no Vary, X-Request-ID not returned or propagated, /v1/e/ lacks ETag/HEAD/304 2026-10-04 12:41:55 +02:00

Closed #75 Document the auth UI, encrypted-URL routes, q/fit parameters, and the undocumented config keys 2026-10-04 09:58:37 +02:00

Closed #102 Eviction loop is not context-cancellable; shutdown ignores its deadline 2026-10-04 09:24:42 +02:00

Closed #73 Remove dead abstractions in imgcache: unimplemented Purge and three interfaces with no implementers 2026-10-04 08:41:38 +02:00

Closed #87 httpfetcher.hostSems grows without bound, and VariantStorage.Delete orphans the .meta sidecar 2026-10-04 07:11:32 +02:00

Closed #74 README describes storage paths, formats, and features that do not match the code 2026-10-04 06:24:38 +02:00

Closed #86 Shutdown correctness: exit code always 0, two competing signal handlers, Sentry calls os.Exit from a goroutine 2026-10-04 04:59:31 +02:00

Closed #101 script/cibuild can report a green it did not earn: docker layer cache can skip make check entirely 2026-10-04 03:58:37 +02:00

Closed #65 No request coalescing: K concurrent misses for the same variant cause K upstream fetches and K transcodes 2026-10-04 01:58:50 +02:00

Closed #98 CORS wildcard is applied at the router root, covering the cookie-authenticated routes 2026-10-03 17:49:44 +02:00

Closed #166 docker build . stamps dev, not the git tag or short commit 2026-10-02 06:01:42 +02:00

Closed #164 Remove Buildarch from CONVENTIONS.md: read the architecture at run time 2026-10-02 01:17:38 +02:00

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

Closed #159 The container sets its data directory permissions itself before startup 2026-09-29 12:44:47 +02:00

Closed #70 Cache.metaCache is dead: every cache hit does open+stat+ReadFile+JSON parse instead of the in-memory lookup README promises 2026-09-29 12:00:11 +02:00

Closed #158 script/docker-smoke: run the container with a 2 GiB memory limit 2026-09-29 11:02:58 +02:00

Closed #71 maintenance_mode is configurable and reported by the healthcheck but does not affect any request 2026-09-29 11:01:31 +02:00

Closed #64 P1: no global cap on concurrent image processing — unbounded memory under load 2026-09-29 10:32:18 +02:00

Closed #95 Dockerfile duplicates dependency installs inline instead of running script/bootstrap, and omits -trimpath / -s -w 2026-09-29 09:11:22 +02:00

Closed #61 P1: four config keys documented in README do not exist and now abort startup 2026-09-29 08:49:20 +02:00

Closed #96 Migrations are not at the mandated internal/db/migrations/ path or filenames 2026-09-29 07:42:06 +02:00

Closed #150 README: trusted_proxies advice and signature padding mislead operators 2026-09-29 06:05:46 +02:00

Closed #56 Cache.Stats reads never-populated output_content/request_cache tables, so TotalItems and TotalSizeBytes are always 0 2026-09-29 05:25:11 +02:00

Closed #151 Give the pixad user a fixed uid and gid outside the login range 2026-09-29 04:44:52 +02:00

Closed #63 Expiring URLs are served with Cache-Control: max-age=31536000, immutable 2026-09-29 03:51:58 +02:00

Closed #82 P1 privacy: EXIF and other metadata are not stripped from processed images 2026-09-29 02:18:26 +02:00

Closed #66 P1 security: no rate limiting or lockout on the signing-key login form 2026-09-29 01:03:38 +02:00

Closed #72 Silently swallowed errors: unparseable exp yields 401 instead of 400, sidecar write failures logged nowhere 2026-09-28 19:59:39 +02:00

Closed #139 /v1/image/ serves an empty fit= as cover instead of answering 400 2026-09-28 18:07:12 +02:00

Closed #134 /v1/image/ serves an invalid q as the default instead of answering 400 2026-09-28 17:46:49 +02:00

Closed #133 An unknown PIXA_ environment variable is ignored instead of aborting startup 2026-09-28 16:12:58 +02:00

Closed #132 script/docker-smoke: the comment on --health-interval describes old Docker behavior 2026-09-28 15:48:53 +02:00

Closed #62 P1: /v1/e/ encrypted URLs bypass dimension and fit-mode validation 2026-09-28 15:24:32 +02:00

Closed #17 µPaaS deployment setup 2026-09-28 15:13:38 +02:00

Closed #129 Start on a fresh upaas volume, and a README section on running under upaas 2026-09-28 15:12:49 +02:00

Closed #104 Run all linting in Docker via Dockerfile.lint + script/lint 2026-09-28 14:27:36 +02:00

Closed #99 Port is not overridable with the PORT environment variable 2026-09-28 13:47:03 +02:00

Closed #128 Every setting can be given as an environment variable 2026-09-28 13:46:56 +02:00

Closed #60 P1 security: q and fit are outside the HMAC signature, allowing 500x cache/transcode amplification from one signed URL 2026-09-28 13:02:22 +02:00

Closed #111 Prove the Docker image runs: HEALTHCHECK instruction and a make docker-smoke target that starts the image and checks the healthcheck 2026-09-28 12:06:30 +02:00

Closed #94 Blocks 1.0: no trusted-proxy handling — every log line and login record shows the proxy's IP 2026-09-22 10:25:42 +02:00

Closed #67 P1: blocked networks config + SSRF gaps (CGNAT, benchmark, NAT64 ranges not blocked) 2026-09-22 00:43:28 +02:00

Closed #110 Docker image bakes the example config with a placeholder signing key; take the key from the environment and refuse the placeholder 2026-09-21 21:59:25 +02:00

Closed #92 Blocks 1.0: http.Server missing IdleTimeout and ReadHeaderTimeout (slowloris), no request body size limits 2026-09-21 20:59:26 +02:00

Closed #91 Blocks 1.0: missing HSTS, CSP, and Permissions-Policy security headers 2026-09-21 20:43:14 +02:00

Closed #106 TODO.md documents a branch-from-main workflow that no longer matches the next branching model 2026-09-21 19:59:52 +02:00

Closed #78 httpfetcher: redirect-to-private-IP SSRF and semaphore release are untested 2026-09-21 19:59:27 +02:00

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

Closed #93 Blocks 1.0: no CSRF protection on the cookie-authenticated POST / and POST /generate forms 2026-09-21 19:26:19 +02:00

Closed #107 Add hash-pinned Dockerfile.lint and make script/lint Docker-only 2026-09-05 11:32:53 +02:00

Closed #108 Prove the Docker lint gate actually lints: defeat layer cache + negative control 2026-09-05 11:32:53 +02:00

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

149 Issues created by 1 user

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

Opened #107 Add hash-pinned Dockerfile.lint and make script/lint Docker-only 2026-09-04 00:02:04 +02:00

Opened #108 Prove the Docker lint gate actually lints: defeat layer cache + negative control 2026-09-04 00:02:10 +02:00

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

Opened #110 Docker image bakes the example config with a placeholder signing key; take the key from the environment and refuse the placeholder 2026-09-21 09:19:48 +02:00

Opened #111 Prove the Docker image runs: HEALTHCHECK instruction and a make docker-smoke target that starts the image and checks the healthcheck 2026-09-21 09:19:49 +02:00

Opened #112 Release: tag v1.0.0 on main once the milestone closes 2026-09-21 09:19:49 +02:00

Opened #113 Delete five stale remote branches 2026-09-21 09:19:49 +02:00

Opened #125 Remove unsafe-inline from the Content-Security-Policy: move inline handlers and runtime Tailwind styles into served assets 2026-09-21 20:43:36 +02:00

Opened #128 Every setting can be given as an environment variable 2026-09-28 11:09:51 +02:00

Opened #129 Start on a fresh upaas volume, and a README section on running under upaas 2026-09-28 11:09:58 +02:00

Opened #132 script/docker-smoke: the comment on --health-interval describes old Docker behavior 2026-09-28 12:07:44 +02:00

Opened #133 An unknown PIXA_ environment variable is ignored instead of aborting startup 2026-09-28 13:10:15 +02:00

Opened #134 /v1/image/ serves an invalid q as the default instead of answering 400 2026-09-28 14:35:02 +02:00

Opened #139 /v1/image/ serves an empty fit= as cover instead of answering 400 2026-09-28 16:42:06 +02:00

Opened #150 README: trusted_proxies advice and signature padding mislead operators 2026-09-29 04:08:24 +02:00

Opened #151 Give the pixad user a fixed uid and gid outside the login range 2026-09-29 04:08:24 +02:00

Opened #158 script/docker-smoke: run the container with a 2 GiB memory limit 2026-09-29 11:00:36 +02:00

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

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

Opened #164 Remove Buildarch from CONVENTIONS.md: read the architecture at run time 2026-10-02 00:47:26 +02:00

Opened #166 docker build . stamps dev, not the git tag or short commit 2026-10-02 02:21:45 +02:00

Opened #168 Recommendations for a clearer, simpler object and data model 2026-10-03 14:28:20 +02:00

Opened #176 A config file pixa cannot read is skipped silently instead of aborting startup 2026-10-04 09:25:03 +02:00

Opened #180 Test the /metrics basic auth and metrics recording through the router (needs approval to change an existing test) 2026-10-04 11:58:53 +02:00

Opened #183 Make next green: TestEvictionRunsOnPeriodicSchedule races the evictor's reconciliation and fails make test 2026-10-04 14:23:20 +02:00

Opened #184 The default cache_max_bytes shrinks as the cache fills: each restart can evict most of the cache 2026-10-04 15:08:35 +02:00

Opened #189 TestPeriodicReconciliationAdoptsFileThatAppearsAfterStartup can pass without a periodic pass 2026-10-04 16:58:48 +02:00

Opened #190 Every merge to next makes the other open PRs conflict in TODO.md 2026-10-04 17:07:55 +02:00

Opened #196 REPO_POLICIES.md no longer matches the canonical copy in sneak/prompts 2026-10-04 20:01:10 +02:00

Opened #198 SQLite writes are dropped with "database is locked": no busy timeout, and WAL is never turned on 2026-10-04 20:24:55 +02:00

Opened #199 No test that a URL made on the generator page with a ttl expires (410) 2026-10-04 20:24:55 +02:00

Opened #202 Lint and tests do not run as the lint and test phases of the Dockerfile, built with --no-cache 2026-10-04 22:29:51 +02:00

Opened #203 The Gitea workflow runs script/docker-smoke besides script/cibuild 2026-10-04 22:29:51 +02:00

Opened #204 .gitignore does not ignore .claude/ 2026-10-04 22:29:51 +02:00

Opened #205 .dockerignore keeps secrets out only at the repository root 2026-10-04 22:29:51 +02:00

Opened #206 cmd/pixad/main.go holds logic that belongs under internal/ 2026-10-04 22:29:51 +02:00

Opened #208 The CI checkout fetches no tags, so a version stamped from git describe would be a bare commit 2026-10-04 22:58:36 +02:00

Opened #211 Local config files that can hold the signing key still reach the Docker build context 2026-10-04 23:41:48 +02:00

Opened #212 config.yml, the config file Getting Started creates, is kept out of neither git nor the Docker build context 2026-10-05 00:09:59 +02:00

Opened #221 Re-vendor the canonical files from sneak/prompts at dd4027b 2026-10-06 01:30:04 +02:00

Opened #222 JPEG XL as a first-class format, and the default output when none is specified 2026-10-08 01:04:28 +02:00

Opened #223 Concurrent SQLite writes still fail with "database is locked" under load, so next is red 2026-10-08 02:24:23 +02:00

Opened #224 TestService_Get_ReturnsByItsDeadline fails when the host is busy 2026-10-08 02:45:01 +02:00

Opened #227 Requests wait behind the eviction pass's whole-table queries on the one database connection 2026-10-08 03:58:17 +02:00

Opened #229 The runtime image runs pixad on an older Alpine and libvips than it was built with 2026-10-08 06:19:44 +02:00

Opened #232 PNG output is saved uncompressed, and WebP, AVIF and GIF at the lowest effort 2026-10-08 09:35:50 +02:00

Opened #236 One client can keep every image processing slot busy: the image routes have no limit per client 2026-10-12 10:56:10 +02:00

Opened #238 TestService_Get_WaitsForSlotBeforeReadingCachedSource fails when the host is busy 2026-10-13 00:26:22 +02:00

Opened #241 A request with one dimension 0 makes an output of unbounded size 2026-10-13 08:46:08 +02:00

Opened #242 Memory per image and the default number of images processed at once are not bounded or documented for the container 2026-10-13 08:46:09 +02:00

Opened #243 Image processing runs past the request's deadline and keeps its slot 2026-10-13 08:46:09 +02:00

Opened #244 Negative-cache rows are never purged, so the database grows without bound 2026-10-13 08:46:10 +02:00

Opened #245 A cached variant is refused while its source URL is in the negative cache 2026-10-13 08:46:10 +02:00

Opened #246 The host segment is not normalized before the allowlist, the per-host limit and the cache keys 2026-10-13 08:46:10 +02:00

Opened #247 The signed data and the cache key are ambiguous between path and query 2026-10-13 08:46:11 +02:00

Opened #248 A chunked upstream body of exactly the maximum size is refused 2026-10-13 08:46:11 +02:00

Opened #249 The example config allowlists public hosts that carry anyone's uploads 2026-10-13 08:46:11 +02:00

Opened #250 The reconciliation pass costs one database query per cached file and runs back to back on a large cache 2026-10-13 08:46:11 +02:00

Opened #251 The upaas section calls the cache size limit optional, but its default takes three quarters of a shared filesystem 2026-10-13 08:46:11 +02:00

Opened #252 A cached file left empty or partial by a crash is served or re-fetched forever 2026-10-13 08:46:11 +02:00

Opened #253 A source whose first bytes do not match its Content-Type answers 500 and is fetched again on every request 2026-10-13 08:46:11 +02:00

Opened #254 The request metrics label every distinct URL path, so unauthenticated requests grow memory without bound when metrics are on 2026-10-13 08:46:11 +02:00

Opened #255 The README gives no way to put a source query into a signed image URL, and the in-tree builder makes one that fails 2026-10-13 08:46:11 +02:00

Opened #256 Logging out does not end the login session 2026-10-13 08:46:11 +02:00

Opened #257 fit=outside with both sides given makes an output of unbounded size 2026-10-13 09:00:18 +02:00

Opened #272 WebP, AVIF and JPEG XL outputs with an alpha channel take longer to encode than the request may wait 2026-10-15 09:44:31 +02:00

Opened #274 The request metrics label every distinct HTTP method name, so made-up methods grow memory without bound when metrics are on 2026-10-15 11:31:14 +02:00

Opened #275 A ? written into the host segment of an image URL gives another unsigned spelling of an allowlisted source 2026-10-15 12:31:47 +02:00

Opened #280 May a bug fix change a test that pins exactly the behaviour the bug calls wrong, without asking each time? 2026-10-15 22:53:52 +02:00

Opened #282 A thin source requested with fit=cover makes libvips allocate a huge uncropped image 2026-10-15 23:23:59 +02:00

Opened #283 A size with one side 0 whose computed side rounds down to 0 comes out square, can ask for tens of GB, or answers 500 2026-10-15 23:46:28 +02:00

Opened #286 A # written into the source path or query gives another unsigned spelling of an allowlisted image 2026-10-16 00:47:30 +02:00

Opened #288 The source URL is built by joining the decoded path and query as text, so some characters reach the upstream wrong 2026-10-16 01:37:27 +02:00

Opened #290 A state_dir holding %, ? or # breaks the database URL pixa derives from it 2026-10-16 02:11:49 +02:00

Opened #293 The generator page gives one upstream image several cache keys for host case and an empty path 2026-10-16 03:31:19 +02:00

Opened #295 An IPv6 source host written without a port is refused by the fetcher and answers 500 2026-10-16 03:48:23 +02:00

Opened #297 The private-address check misses an IPv4 address embedded in an IPv6 one 2026-10-16 04:49:04 +02:00

Opened #299 The local-use NAT64 range and the operator's blocked_networks list miss IPv4 addresses embedded in IPv6 2026-10-16 05:32:00 +02:00

Opened #301 A blocked_networks entry written in the IPv4-mapped form is accepted but refuses nothing 2026-10-16 06:38:19 +02:00

Opened #303 A trusted_proxies entry written in the IPv4-mapped form is accepted but never matches 2026-10-19 01:28:55 +02:00

Opened #307 One image request type instead of five 2026-10-21 12:48:50 +02:00

Opened #308 Store a source the way a variant is stored: one row and one file per source URL 2026-10-21 12:49:02 +02:00

Opened #309 Serve a cache hit with no database read or write 2026-10-21 12:49:18 +02:00

Opened #310 Make the schema file describe only the tables and columns pixa uses 2026-10-21 12:49:55 +02:00

Opened #311 Count hits, misses, fetches and transforms as Prometheus counters instead of the cache_stats table 2026-10-21 12:50:03 +02:00

Opened #312 Remove the code nothing in production uses 2026-10-21 12:50:16 +02:00

Opened #313 Build the image pipeline in the fx graph, with each default declared once in the config 2026-10-21 12:50:24 +02:00

Opened #314 Take the signature, the expiry and the URL scheme off the image request 2026-10-21 12:50:31 +02:00

Opened #315 Derive every key from the signing key in one place 2026-10-21 12:50:41 +02:00

Opened #316 One handler body and one error mapping for the two image routes 2026-10-21 12:50:47 +02:00

Opened #317 Split internal/imgcache into the image proxy and the cache 2026-10-21 12:50:57 +02:00

Opened #318 One file store type for cached sources and variants 2026-10-21 12:51:08 +02:00

Opened #319 Decide a fetched image's format from its bytes once 2026-10-21 12:51:15 +02:00

Opened #320 One table of settings in internal/config 2026-10-21 12:51:21 +02:00

Opened #321 Describe the implemented model in README.md with a list of its concepts 2026-10-21 12:51:27 +02:00

1 Unresolved Conversation

Open #39 Refactor: split internal/imgcache into focused packages 2026-10-21 12:50:58 +02:00