Changelog
Released versions, ordered from newest to oldest. Source of truth is the GitHub releases page.
Repository changelog synchronization
The root CHANGELOG.md outlines planned feature revisions ahead of version tags. Canonical published releases are documented below.
v1.1.5 (8 October 2026)
Performance optimizations, non-root container hardening, boundary input validation, and supply-chain lockfile pinning.
Performance
- Deduplicated Cache Key Hashes: Hoisted MD5 cache key generation out of the format loop in
image_processing.py, eliminating redundant disk reads and hash calculations across 45 target formats. - Precomputed Source Hashing: Cached upfront source image hash used across variation generation and format export.
- Optimized Metadata Stripping: Refactored EXIF stripping in
app.pyto useImage.new()andpaste()avoiding full-frame pixel list allocations.
Security & Hardening
- Non-root Container Execution: Hardened
Dockerfilewith dedicated non-root userbrandkit(UID 1000) and proper permissions on/app/static/uploads. - Docker Build Hygiene: Added
.dockerignoreblocking tests, virtualenvs, Git metadata, and documentation artifacts from container builds. - Strict Boundary Clamping: Enforced safe numeric range clamping with NaN/Inf rejection on all filter parameters (
parse_clamped_float,parse_clamped_int).
Supply Chain
- Universal Hash-Pinned Lockfile: Introduced
requirements.lockwith SHA-256 hashes generated viauvfor reproducible builds. - Test Dependency Pinning: Pinned explicit versions for
pytest==9.1.1andpytest-cov==7.1.0.
UI & Theme Decoupling
- Automatic OS/Browser Theme Sync: Client color scheme automatically follows system preference with instant dynamic response to
prefers-color-schememedia query changes. - Top Bar Streamlining: Removed redundant status badges and manual theme switchers from the navigation header.
- Control Harmonization: Fully styled native checkboxes, color swatches, and inputs across both dark and light modes.
v1.1.4 (16 September 2026)
Architecture decoupling, automated test coverage, structured observability, and atomic data persistence.
Added
- Automated Test Suite: Comprehensive test suite (48 tests) using
pytestcovering unit image processing, HTTP route workflows, boundary security validations (CSRF rejection, path traversal prevention, file size limits), and atomic caching. - CI Integration: Upgraded
.github/workflows/ci.ymlfrom import smoke testing to runpytest -vacross Python 3.11 and 3.12. - Request Correlation: Emits and propagates
X-Request-IDacross Flask request context (g.request_id), response headers, and root logger formatters for distributed tracing. - Application Factory: Converted
app.pyto an explicitcreate_app()factory with lifecycle control, while maintaining full backward-compatible module re-exports. - Atomic File Persistence: EXIF-stripped image uploads and resized disk cache entries now use atomic temporary write and rename semantics (
os.replace) to eliminate file tearing risks. - Configuration Validation: Introduced schema validation for custom
config.jsondefinitions, rejecting malformed format dimensions before runtime rendering.
Security
pillow-> 12.3.0 (closes 11 advisories: heap out-of-bounds writes inImageCmsTransform.apply(),Image.paste()/crop()andImageFilter.RankFilter; decompression-bomb bypasses viaPdfParser,GdImageFile, and the BDF/PCF/FontFilefont paths; an EPS infinite loop; a TGA heap-disclosure; andWindowsViewer.get_command()command injection)rembg-> 2.0.75 (SSRF and weak default CORS in the rembg server; path traversal via custom model loading)Flask-> 3.1.3 (missingVary: Cookie)Pygments-> 2.20.0 (ReDoS in GUID regex)numpy-> 2.3.5,scikit-image-> 0.26.0,opencv-python/opencv-python-headless-> 4.14.0.94: matches newrembgbaseline withinnumba'snumpy<2.4constraint- Removed
zipfile36(unused dependency) - CSP tightened: Dropped obsolete CDN rules for
cdn.tailwindcss.comandcdn.jsdelivr.net. /download-zip/<filename>hardened: Filenames must passsecure_filename()validation, end in.zip, and resolve strictly within the designated uploads directory.
Fixed
- Structured Logging: Replaced uninstrumented
print()calls in config loading, cleanup routines, and error paths with standardlogging.info(),logging.warning(), andlogging.error(). BRANDKIT_SECRET_KEYEnvironment Support: Reads signing keys fromBRANDKIT_SECRET_KEYorFLASK_SECRET_KEY. Logs a warning if an ephemeral key is generated.- Gunicorn Cleanup Execution: Cleanup thread starts at module import time, ensuring active sweeps when running under multi-worker WSGI containers.
- Fixed
python app.pyport binding to honor thePORTenvironment variable.
Changed
- Modular Architecture: Decoupled core image transformations into
image_processing.py, configuration parsing intoconfig_utils.py, and memory/file sweeps intocleanup.py. FLASK_ENV=productiondeprecated in favor of explicit configuration.
v1.1.3 (8 July 2026)
Security hardening and asset dependency vendoring.
Security
pillow-> 12.2.0urllib3-> 2.7.0protobuf-> 6.33.5requests-> 2.33.0Werkzeug-> 3.1.6idna-> 3.15
Changed
- Vendored Client Assets: Tailwind CSS and Alpine.js assets vendored under
static/vendor/and served same-origin (#19), eliminating third-party network egress. - CI pipeline modernized with matrix builds across Python 3.11 and 3.12 (#18).
v1.1.2 (6 December 2025)
Fixed
- rembg import handling and container port binding (#2)
Changed
- Documentation review and synchronization (#1)
- Dependency updates:
urllib3-> 2.6.0,werkzeug-> 3.1.4
v1.1.0 (25 June 2025)
Feature expansion and preprocessing pipeline addition.
Added
- Neural background removal via rembg (models: auto, person, object, anime)
- Background color replacement: transparent, solid, or radial gradient based on extracted dominant hues
- Alpha edge smoothing
- Image preprocessing filters: grayscale, B&W, invert, contrast, hue shift, temperature, saturation, brightness, auto-crop, noise reduction, sharpen, blur, vignette, drop shadow, and watermarks
- Variations mode: batch generation of ten tonal treatments per format
- Format search filtering and category classification
- Keyboard shortcuts dialog (Shift+?)
- WebP and ICO encoding support
- Bulk ZIP export archive
Enhanced
- CSRF protection, rate limiting, and security headers via Flask-WTF, Flask-Limiter, and Flask-Talisman
- Automated EXIF sanitization
- Disk caching keyed by content hash,
psutilmemory monitoring, and scheduled cleanup
v1.0.0 (25 April 2025)
Initial release.
Added
- Single-source image upload and multi-format generation
- PNG and JPG output encodings
- Resizing and padding pipeline
- Docker containerization
- Format selection interface
Versioning specification
Releases adhere to Semantic Versioning. Changelog categories follow Keep a Changelog.