2026-10-15 - 2026-10-22
Overview
1 Release published by 1 user
Published
v1.0.0-rc3
30 Pull requests merged by 1 user
Merged
#325 Serve a cache hit with no database read or write (closes #309)
Merged
#324 Store a source the way a variant is stored, one row and one file per source URL (closes #308)
Merged
#323 One image request type instead of five (closes #307)
Merged
#322 Run only script/cibuild in the Gitea workflow (closes #203)
Merged
#278 Keep WebP, AVIF and JPEG XL encodes at the limits under 40 seconds (closes #272)
Merged
#273 Answer 415 for a source whose first bytes do not match its Content-Type (closes #253)
Merged
#306 Let a bug fix change the test that pins the behavior the bug calls wrong (closes #280)
Merged
#304 Re-vendor the canonical files from sneak/prompts at 0653579 (closes #221)
Merged
#305 Read a trusted_proxies entry in the IPv4-mapped form as its IPv4 range (closes #303)
Merged
#279 Space reconciliation passes by ten times the last pass's time (closes #250)
Merged
#302 Read a blocked_networks entry in the IPv4-mapped form as its IPv4 range (closes #301)
Merged
#300 Refuse local-use NAT64 addresses, and IPv4-compatible ones in blocked_networks (closes #299)
Merged
#298 Refuse an IPv6 address that holds an internal IPv4 address (closes #297)
Merged
#296 Fetch an IPv6 source host written without a port (closes #295)
Merged
#292 Escape state_dir in the db_url derived from it (closes #290)
Merged
#291 Keep a side computed for a size with one side 0 at 1 or more (closes #283)
Merged
#294 Make one image URL per source on the generator page for host case and an empty path (closes #293)
Merged
#289 Fetch the source path and query URL-encoded, not joined as text (closes #288)
Merged
#284 Crop the centre before resizing for fit=cover (closes #282)
Merged
#287 Refuse an image URL whose source path or query holds a # (closes #286)
Merged
#285 Refuse an image URL whose host is not a host name or IP address (closes #275)
Merged
#281 Document how a source query goes into an image URL, and accept it (closes #255)
Merged
#261 Default max_concurrent_processing to half the CPUs pixa sees (closes #242)
Merged
#276 Re-vendor the canonical files from sneak/prompts at e3f79c4 (closes #221)
Merged
#277 Label request metrics with standard HTTP methods only (closes #274)
Merged
#265 Logging out ends every login session (closes #256)
Merged
#263 Sync cached files and refuse ones left empty or partial (closes #252)
Merged
#271 Stop a transcode whose request has ended before it encodes (closes #243)
Merged
#270 Tell upaas operators to set the cache size limit (closes #251)
Merged
#260 Label request metrics by route, not by path (closes #254)
1 Pull request proposed by 1 user
Proposed
#326 Declare only the tables and columns pixa writes and reads (closes #310)
29 Issues closed from 1 user
Closed
#309 Serve a cache hit with no database read or write
Closed
#308 Store a source the way a variant is stored: one row and one file per source URL
Closed
#307 One image request type instead of five
Closed
#203 The Gitea workflow runs script/docker-smoke besides script/cibuild
Closed
#272 WebP, AVIF and JPEG XL outputs with an alpha channel take longer to encode than the request may wait
Closed
#253 A source whose first bytes do not match its Content-Type answers 500 and is fetched again on every request
Closed
#280 May a bug fix change a test that pins exactly the behaviour the bug calls wrong, without asking each time?
Closed
#221 Re-vendor the canonical files from sneak/prompts at dd4027b
Closed
#303 A trusted_proxies entry written in the IPv4-mapped form is accepted but never matches
Closed
#250 The reconciliation pass costs one database query per cached file and runs back to back on a large cache
Closed
#301 A blocked_networks entry written in the IPv4-mapped form is accepted but refuses nothing
Closed
#299 The local-use NAT64 range and the operator's blocked_networks list miss IPv4 addresses embedded in IPv6
Closed
#297 The private-address check misses an IPv4 address embedded in an IPv6 one
Closed
#295 An IPv6 source host written without a port is refused by the fetcher and answers 500
Closed
#290 A state_dir holding %, ? or # breaks the database URL pixa derives from it
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
Closed
#293 The generator page gives one upstream image several cache keys for host case and an empty path
Closed
#288 The source URL is built by joining the decoded path and query as text, so some characters reach the upstream wrong
Closed
#282 A thin source requested with fit=cover makes libvips allocate a huge uncropped image
Closed
#286 A # written into the source path or query gives another unsigned spelling of an allowlisted image
Closed
#275 A ? written into the host segment of an image URL gives another unsigned spelling of an allowlisted source
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
Closed
#242 Memory per image and the default number of images processed at once are not bounded or documented for the container
Closed
#274 The request metrics label every distinct HTTP method name, so made-up methods grow memory without bound when metrics are on
Closed
#256 Logging out does not end the login session
Closed
#252 A cached file left empty or partial by a crash is served or re-fetched forever
Closed
#243 Image processing runs past the request's deadline and keeps its slot
Closed
#251 The upaas section calls the cache size limit optional, but its default takes three quarters of a shared filesystem
Closed
#254 The request metrics label every distinct URL path, so unauthenticated requests grow memory without bound when metrics are on
27 Issues created by 1 user
Opened
#280 May a bug fix change a test that pins exactly the behaviour the bug calls wrong, without asking each time?
Opened
#282 A thin source requested with fit=cover makes libvips allocate a huge uncropped image
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
Opened
#286 A # written into the source path or query gives another unsigned spelling of an allowlisted image
Opened
#288 The source URL is built by joining the decoded path and query as text, so some characters reach the upstream wrong
Opened
#290 A state_dir holding %, ? or # breaks the database URL pixa derives from it
Opened
#293 The generator page gives one upstream image several cache keys for host case and an empty path
Opened
#295 An IPv6 source host written without a port is refused by the fetcher and answers 500
Opened
#297 The private-address check misses an IPv4 address embedded in an IPv6 one
Opened
#299 The local-use NAT64 range and the operator's blocked_networks list miss IPv4 addresses embedded in IPv6
Opened
#301 A blocked_networks entry written in the IPv4-mapped form is accepted but refuses nothing
Opened
#303 A trusted_proxies entry written in the IPv4-mapped form is accepted but never matches
Opened
#307 One image request type instead of five
Opened
#308 Store a source the way a variant is stored: one row and one file per source URL
Opened
#309 Serve a cache hit with no database read or write
Opened
#310 Make the schema file describe only the tables and columns pixa uses
Opened
#311 Count hits, misses, fetches and transforms as Prometheus counters instead of the cache_stats table
Opened
#312 Remove the code nothing in production uses
Opened
#313 Build the image pipeline in the fx graph, with each default declared once in the config
Opened
#314 Take the signature, the expiry and the URL scheme off the image request
Opened
#315 Derive every key from the signing key in one place
Opened
#316 One handler body and one error mapping for the two image routes
Opened
#317 Split internal/imgcache into the image proxy and the cache
Opened
#318 One file store type for cached sources and variants
Opened
#319 Decide a fetched image's format from its bytes once
Opened
#320 One table of settings in internal/config
Opened
#321 Describe the implemented model in README.md with a list of its concepts
6 Unresolved Conversations
Open
#149
next -> main
Open
#168
Recommendations for a clearer, simpler object and data model
Open
#39
Refactor: split internal/imgcache into focused packages
Open
#83
Capture upstream Last-Modified/ETag and support conditional revalidation
Open
#85
No pixa-specific Prometheus metrics, and metrics are not collected at all unless credentials are configured
Open
#112
Release: tag v1.0.0 on main once the milestone closes