Releases: conniecombs/ConniesUploader
Connie's Uploader v1.4.0
Changelog
All notable changes to Connie's Uploader Ultimate will be documented in this file.
The format is based on Keep a Changelog,
and this project adheres to Semantic Versioning.
[Unreleased]
[1.4.0] - 2026-06-20
Added
- Added a real empty queue state with drag-and-drop guidance plus primary Add Files and Add Folder actions.
- Added in-app Import Checks and Upload Checks panels with contextual actions for credentials, invalid files, problem folders, and retrying.
- Added a hideable Activity panel that records scanning, queueing, upload, retry, copy, save, and completion events.
- Added inline completion summaries with uploaded and failed counts, generated files, clipboard status, Open Folder, Copy Output, and Retry Failed actions.
- Added inline failed-file reasons with one-click retry and copy-error actions.
- Added template recovery actions for corrupted local template data.
Changed
- Moved Worker Count and Thread Limit into Advanced App Settings with matching compact controls.
- Removed the Tools menu thread-limit cascade so thread limits have one clear home.
- Rendered host settings from plugin schemas to avoid selectable-but-unsupported service traps.
- Improved queue rows with clearer statuses, stable action lanes, visible remove buttons, retry affordances, and better no-preview spacing.
- Made Activity and queue add buttons context-aware so the interface uses space more naturally.
Fixed
- Clamped global worker counts to
1-16and upload thread limits to1-10in the UI, settings load/save path, and sidecar job normalization. - Prevented conflicting host-readiness messages from showing at the same time.
- Removed empty batches automatically after their last image is removed.
- Improved user-facing thumbnail-size labels for Imgur.
- Verified
build_uploader.bat --cibuilds the packaged Windows executable automatically.
[1.3.0] - 2026-06-02
Added
HTTP Runner Protocol Hardening
- Expanded the Go generic HTTP runner to support chained prerequests, shared cookie sessions, relative endpoint resolution, and header/form/body template substitution.
- Added richer extraction support for JSON arrays, nested paths, HTML selectors, regex selectors, attribute extraction, response templates, and URL templates.
- Added sidecar request IDs so Python only resolves upload responses from the matching Go event instead of accepting stale or unrelated output.
Imgur Sidecar Integration
- Added an Imgur HTTP request builder so Imgur uploads can use the same validated Python-to-Go sidecar workflow as the other active services.
- Added tests for missing Imgur credentials and generated request shape.
Changed
- Normalized per-service worker counts so configured thread values are consistently clamped and forwarded into upload jobs.
- Moved Python coverage settings into
.coveragercand kept pytest configuration focused on test discovery and runtime behavior. - Updated Windows and Unix build scripts to rely on
go mod downloadfor reproducible builds without rewriting module metadata. - Refreshed release metadata, build banners, documentation links, and download artifact names for
v1.3.0.
Security
- Updated Go security-sensitive dependencies, including
golang.org/x/image,golang.org/x/net, andgolang.org/x/sys. - Tightened GitHub security scanning by making
govulncheck, gosec,pip-audit, and medium-or-higher Bandit findings fail the workflow. - Added
pip-audit==2.10.0andbandit[sarif]==1.9.4to the pinned Python dependency set. - Documented the ViperGirls legacy MD5 value as a protocol-required compatibility hash, not a security credential.
Fixed
- Ensured sidecar response correlation does not cross wires when multiple uploads are active.
- Ensured HTTP response bodies are closed explicitly in service code and test paths.
- Preserved compatibility helpers while silencing false-positive unused warnings in strict Go linting.
[1.2.4] - 2026-05-20
Fixed
Packaged Executable Startup
- Updated
tkinterdnd2to0.4.3so PyInstaller builds no longer crash while importing the removed legacytkinter.tixmodule path. - Kept drag-and-drop support bundled through the existing PyInstaller
--collect-all tkinterdnd2flow.
Cross-Platform Test Reliability
- Normalized Windows short-path and macOS
/private/varpath assertions in the Python test suite. - Mocked GUI success dialogs in menu removal tests so headless Windows/macOS CI runs do not stall.
- Aligned validation expectations for safe filename fallbacks, dangerous characters, and thread-count limits.
Security
- Updated Pillow to
12.2.0for the latest image-processing security fixes. - Replaced Safety dependency scanning with
pip-audit==2.10.0in CI and security workflows.
Changed
- Pinned
flake8==7.1.1for stable lint output in CI. - Refreshed release documentation, download links, and tag examples for
v1.2.4.
[1.2.3] - 2026-01-31
🐛 Bug Fixes
Gallery Creation Logic Fix
Fixed critical issues with IMX inline gallery creation in the Go sidecar.
1. IMX Login State Tracking
- Problem: IMX login was not being tracked across requests, causing gallery creation to fail
- Root Cause: No persistent state for IMX login status
- Fix: Added
imxStatestruct with mutex-protectedisLoggedInflag- Login state now persists across requests
- Prevents redundant login attempts
2. Correct Form Field Names
- Problem: IMX login was using incorrect form field names
- Root Cause: Field names didn't match the actual login form
- Fix: Updated to use correct field names:
usr_email,pwd,doLogin,remember
3. URL Domain Fix
- Problem: Using
www.imx.tocaused certificate issues and cookie mismatches - Root Cause: Certificate is valid for
imx.tobut notwww.imx.to - Fix: Updated all IMX URLs to use naked domain
https://imx.to/- Ensures cookies are properly shared between login and gallery operations
- Added proper
Refererheaders for security validation
4. Gallery ID Extraction
- Problem: Gallery ID extraction failed when redirect didn't include query params
- Fix: Added fallback body parsing to find gallery ID in response HTML
- Looks for
manage?id=links in the response - Provides detailed debug logging for troubleshooting
- Looks for
Files Changed:
uploader.go: Updated IMX login and gallery creation logic
[1.2.2] - 2026-01-22
🐛 Bug Fixes
Batch Upload Stability Improvements
Fixed 5 critical issues discovered during large batch upload testing (1141 files across 34 folders).
1. Worker Count Setting Not Respected
- Problem: Changing Worker Count in UI had no effect - uploads always used 8 workers regardless of setting
- Root Cause: Sidecar process only started once at initialization; UI setting changes didn't restart it
- Fix: Added automatic sidecar restart when worker count changes
SidecarBridge.set_worker_count()now detects changes and restarts sidecarstart_upload()applies current worker count before each upload- Graceful restart with timeout handling
2. File Reading Stalling with Large Batches
- Problem: Reading stalled at 500 of 1141 files; "Already read" message but files not visible in UI
- Root Cause: UI queue backlog with large batches + thumbnail generation delays
- Fix: Enhanced queue handling and user feedback
- Added 5-second timeout to UI queue operations
- Fallback: files added without thumbnails if queue is full
- "Loading thumbnails..." message for batches > 100 files
- Queue size monitoring with debug logging
3. Program Hanging on Close
- Problem: Program hung for ~20 seconds when trying to close during thumbnail generation
- Root Cause:
thumb_executor.shutdown(wait=True)waited indefinitely for all tasks - Fix: Changed to non-blocking shutdown
shutdown(wait=False, cancel_futures=True)cancels pending tasks- 300ms grace period for current tasks to finish
- Program now closes in <1 second
4. Bottom Progress Bar Not Updating
- Problem: Progress bar stayed at 0% until all uploads finished, then jumped to 100%
- Fix: Added real-time progress calculation
- Updates every time a file completes:
progress = upload_count / upload_total - Live feedback as files complete
- Updates every time a file completes:
5. "Open Output Folder" Button Not Working
- Problem: Button did nothing after upload completion or after clearing list
- Fix: Added comprehensive error handling
- Try/catch around
os.startfile()andsubprocess.run() - Clear error messages if folder can't be opened
- Button properly disabled when list is cleared
- Info message if no output files exist
- Try/catch around
🏗️ Build System
Release Workflow Improvements
- Added build verification for Linux and macOS release workflows
- Prevents "tar: file not found" errors
- Checks file existence and size before packaging
- Verifies Go sidecar is properly bundled (> 15MB)
- Early failure with clear error messages
Files Changed:
modules/ui/main_window.py: Fixed 5 UI/upload issuesmodules/sidecar.py: Added_restart_for_config_change()method.github/workflows/release.yml: Added build verification for Linux/macOS
Commits:
e261bc9- fix: Address 5 critical issues from batch upload testing372ffdb- fix: Add build verification for Linux and macOS release workflows
[1.2.1] - 2026-01-18
🐛 Bug Fixes
Critical Gallery Creation Fix
Fixed a critical bug in the IMX plugin where the "One Gallery Per Folder" feature failed to create individual galleries per batch when a manual gallery ID was present in the config.
Issue Details
- Problem: When users enabled "One Gallery Per Folder" but had a gallery ID from a pr...
Connie's Uploader v1.3.0
Changelog
All notable changes to Connie's Uploader Ultimate will be documented in this file.
The format is based on Keep a Changelog,
and this project adheres to Semantic Versioning.
[Unreleased]
[1.3.0] - 2026-06-02
Added
HTTP Runner Protocol Hardening
- Expanded the Go generic HTTP runner to support chained prerequests, shared cookie sessions, relative endpoint resolution, and header/form/body template substitution.
- Added richer extraction support for JSON arrays, nested paths, HTML selectors, regex selectors, attribute extraction, response templates, and URL templates.
- Added sidecar request IDs so Python only resolves upload responses from the matching Go event instead of accepting stale or unrelated output.
Imgur Sidecar Integration
- Added an Imgur HTTP request builder so Imgur uploads can use the same validated Python-to-Go sidecar workflow as the other active services.
- Added tests for missing Imgur credentials and generated request shape.
Changed
- Normalized per-service worker counts so configured thread values are consistently clamped and forwarded into upload jobs.
- Moved Python coverage settings into
.coveragercand kept pytest configuration focused on test discovery and runtime behavior. - Updated Windows and Unix build scripts to rely on
go mod downloadfor reproducible builds without rewriting module metadata. - Refreshed release metadata, build banners, documentation links, and download artifact names for
v1.3.0.
Security
- Updated Go security-sensitive dependencies, including
golang.org/x/image,golang.org/x/net, andgolang.org/x/sys. - Tightened GitHub security scanning by making
govulncheck, gosec,pip-audit, and medium-or-higher Bandit findings fail the workflow. - Added
pip-audit==2.10.0andbandit[sarif]==1.9.4to the pinned Python dependency set. - Documented the ViperGirls legacy MD5 value as a protocol-required compatibility hash, not a security credential.
Fixed
- Ensured sidecar response correlation does not cross wires when multiple uploads are active.
- Ensured HTTP response bodies are closed explicitly in service code and test paths.
- Preserved compatibility helpers while silencing false-positive unused warnings in strict Go linting.
[1.2.4] - 2026-05-20
Fixed
Packaged Executable Startup
- Updated
tkinterdnd2to0.4.3so PyInstaller builds no longer crash while importing the removed legacytkinter.tixmodule path. - Kept drag-and-drop support bundled through the existing PyInstaller
--collect-all tkinterdnd2flow.
Cross-Platform Test Reliability
- Normalized Windows short-path and macOS
/private/varpath assertions in the Python test suite. - Mocked GUI success dialogs in menu removal tests so headless Windows/macOS CI runs do not stall.
- Aligned validation expectations for safe filename fallbacks, dangerous characters, and thread-count limits.
Security
- Updated Pillow to
12.2.0for the latest image-processing security fixes. - Replaced Safety dependency scanning with
pip-audit==2.10.0in CI and security workflows.
Changed
- Pinned
flake8==7.1.1for stable lint output in CI. - Refreshed release documentation, download links, and tag examples for
v1.2.4.
[1.2.3] - 2026-01-31
🐛 Bug Fixes
Gallery Creation Logic Fix
Fixed critical issues with IMX inline gallery creation in the Go sidecar.
1. IMX Login State Tracking
- Problem: IMX login was not being tracked across requests, causing gallery creation to fail
- Root Cause: No persistent state for IMX login status
- Fix: Added
imxStatestruct with mutex-protectedisLoggedInflag- Login state now persists across requests
- Prevents redundant login attempts
2. Correct Form Field Names
- Problem: IMX login was using incorrect form field names
- Root Cause: Field names didn't match the actual login form
- Fix: Updated to use correct field names:
usr_email,pwd,doLogin,remember
3. URL Domain Fix
- Problem: Using
www.imx.tocaused certificate issues and cookie mismatches - Root Cause: Certificate is valid for
imx.tobut notwww.imx.to - Fix: Updated all IMX URLs to use naked domain
https://imx.to/- Ensures cookies are properly shared between login and gallery operations
- Added proper
Refererheaders for security validation
4. Gallery ID Extraction
- Problem: Gallery ID extraction failed when redirect didn't include query params
- Fix: Added fallback body parsing to find gallery ID in response HTML
- Looks for
manage?id=links in the response - Provides detailed debug logging for troubleshooting
- Looks for
Files Changed:
uploader.go: Updated IMX login and gallery creation logic
[1.2.2] - 2026-01-22
🐛 Bug Fixes
Batch Upload Stability Improvements
Fixed 5 critical issues discovered during large batch upload testing (1141 files across 34 folders).
1. Worker Count Setting Not Respected
- Problem: Changing Worker Count in UI had no effect - uploads always used 8 workers regardless of setting
- Root Cause: Sidecar process only started once at initialization; UI setting changes didn't restart it
- Fix: Added automatic sidecar restart when worker count changes
SidecarBridge.set_worker_count()now detects changes and restarts sidecarstart_upload()applies current worker count before each upload- Graceful restart with timeout handling
2. File Reading Stalling with Large Batches
- Problem: Reading stalled at 500 of 1141 files; "Already read" message but files not visible in UI
- Root Cause: UI queue backlog with large batches + thumbnail generation delays
- Fix: Enhanced queue handling and user feedback
- Added 5-second timeout to UI queue operations
- Fallback: files added without thumbnails if queue is full
- "Loading thumbnails..." message for batches > 100 files
- Queue size monitoring with debug logging
3. Program Hanging on Close
- Problem: Program hung for ~20 seconds when trying to close during thumbnail generation
- Root Cause:
thumb_executor.shutdown(wait=True)waited indefinitely for all tasks - Fix: Changed to non-blocking shutdown
shutdown(wait=False, cancel_futures=True)cancels pending tasks- 300ms grace period for current tasks to finish
- Program now closes in <1 second
4. Bottom Progress Bar Not Updating
- Problem: Progress bar stayed at 0% until all uploads finished, then jumped to 100%
- Fix: Added real-time progress calculation
- Updates every time a file completes:
progress = upload_count / upload_total - Live feedback as files complete
- Updates every time a file completes:
5. "Open Output Folder" Button Not Working
- Problem: Button did nothing after upload completion or after clearing list
- Fix: Added comprehensive error handling
- Try/catch around
os.startfile()andsubprocess.run() - Clear error messages if folder can't be opened
- Button properly disabled when list is cleared
- Info message if no output files exist
- Try/catch around
🏗️ Build System
Release Workflow Improvements
- Added build verification for Linux and macOS release workflows
- Prevents "tar: file not found" errors
- Checks file existence and size before packaging
- Verifies Go sidecar is properly bundled (> 15MB)
- Early failure with clear error messages
Files Changed:
modules/ui/main_window.py: Fixed 5 UI/upload issuesmodules/sidecar.py: Added_restart_for_config_change()method.github/workflows/release.yml: Added build verification for Linux/macOS
Commits:
e261bc9- fix: Address 5 critical issues from batch upload testing372ffdb- fix: Add build verification for Linux and macOS release workflows
[1.2.1] - 2026-01-18
🐛 Bug Fixes
Critical Gallery Creation Fix
Fixed a critical bug in the IMX plugin where the "One Gallery Per Folder" feature failed to create individual galleries per batch when a manual gallery ID was present in the config.
Issue Details
- Problem: When users enabled "One Gallery Per Folder" but had a gallery ID from a previous session in the optional field, all images from all batches were incorrectly uploaded to the same gallery instead of creating individual galleries per batch.
- Root Cause: The
prepare_group()method inmodules/plugins/imx.pychecked for a manualgallery_idBEFORE checking ifauto_gallerywas enabled, causing early return without creating new galleries. - Impact: Multi-folder uploads with auto-gallery enabled would fail to organize images into separate galleries.
Fix Implementation
- Reordered logic in
ImxPlugin.prepare_group()to checkauto_gallerysetting FIRST - Now matches the correct behavior already implemented in Pixhost plugin
- Enhanced docstrings and logging messages for better clarity
New Behavior
- ✅ If
auto_galleryis ENABLED: Creates a new gallery for each batch (ignores manual gallery_id) - ✅ If
auto_galleryis DISABLED: Uses manual gallery_id if specified, otherwise no gallery - ✅ Consistent behavior across all plugins (IMX, Pixhost, etc.)
Testing
- Verified all logic paths with comprehensive verification tests
- Confirmed correct behavior for all setting combinations
- Validated consistency with Pixhost plugin implementation
Files Changed:
modules/plugins/imx.py: Fixedprepare_group()logic (lines 139-177)
Commit: e6a1cb0 - fix: Correct IMX gallery creation logic to respect auto_gallery setting
[1.2.0] - 2026-01-17
📦 Release Preparation
Version 1.2.0 "Stability & Maintenance"
This release focuses on version consistency across the project and preparation for future development.
Version Updates
- Updated version strings across all files t...
Connie's Uploader v1.2.4
Changelog
All notable changes to Connie's Uploader Ultimate will be documented in this file.
The format is based on Keep a Changelog,
and this project adheres to Semantic Versioning.
[Unreleased]
[1.2.4] - 2026-05-20
Fixed
Packaged Executable Startup
- Updated
tkinterdnd2to0.4.3so PyInstaller builds no longer crash while importing the removed legacytkinter.tixmodule path. - Kept drag-and-drop support bundled through the existing PyInstaller
--collect-all tkinterdnd2flow.
Cross-Platform Test Reliability
- Normalized Windows short-path and macOS
/private/varpath assertions in the Python test suite. - Mocked GUI success dialogs in menu removal tests so headless Windows/macOS CI runs do not stall.
- Aligned validation expectations for safe filename fallbacks, dangerous characters, and thread-count limits.
Security
- Updated Pillow to
12.2.0for the latest image-processing security fixes. - Replaced Safety dependency scanning with
pip-audit==2.10.0in CI and security workflows.
Changed
- Pinned
flake8==7.1.1for stable lint output in CI. - Refreshed release documentation, download links, and tag examples for
v1.2.4.
[1.2.3] - 2026-01-31
🐛 Bug Fixes
Gallery Creation Logic Fix
Fixed critical issues with IMX inline gallery creation in the Go sidecar.
1. IMX Login State Tracking
- Problem: IMX login was not being tracked across requests, causing gallery creation to fail
- Root Cause: No persistent state for IMX login status
- Fix: Added
imxStatestruct with mutex-protectedisLoggedInflag- Login state now persists across requests
- Prevents redundant login attempts
2. Correct Form Field Names
- Problem: IMX login was using incorrect form field names
- Root Cause: Field names didn't match the actual login form
- Fix: Updated to use correct field names:
usr_email,pwd,doLogin,remember
3. URL Domain Fix
- Problem: Using
www.imx.tocaused certificate issues and cookie mismatches - Root Cause: Certificate is valid for
imx.tobut notwww.imx.to - Fix: Updated all IMX URLs to use naked domain
https://imx.to/- Ensures cookies are properly shared between login and gallery operations
- Added proper
Refererheaders for security validation
4. Gallery ID Extraction
- Problem: Gallery ID extraction failed when redirect didn't include query params
- Fix: Added fallback body parsing to find gallery ID in response HTML
- Looks for
manage?id=links in the response - Provides detailed debug logging for troubleshooting
- Looks for
Files Changed:
uploader.go: Updated IMX login and gallery creation logic
[1.2.2] - 2026-01-22
🐛 Bug Fixes
Batch Upload Stability Improvements
Fixed 5 critical issues discovered during large batch upload testing (1141 files across 34 folders).
1. Worker Count Setting Not Respected
- Problem: Changing Worker Count in UI had no effect - uploads always used 8 workers regardless of setting
- Root Cause: Sidecar process only started once at initialization; UI setting changes didn't restart it
- Fix: Added automatic sidecar restart when worker count changes
SidecarBridge.set_worker_count()now detects changes and restarts sidecarstart_upload()applies current worker count before each upload- Graceful restart with timeout handling
2. File Reading Stalling with Large Batches
- Problem: Reading stalled at 500 of 1141 files; "Already read" message but files not visible in UI
- Root Cause: UI queue backlog with large batches + thumbnail generation delays
- Fix: Enhanced queue handling and user feedback
- Added 5-second timeout to UI queue operations
- Fallback: files added without thumbnails if queue is full
- "Loading thumbnails..." message for batches > 100 files
- Queue size monitoring with debug logging
3. Program Hanging on Close
- Problem: Program hung for ~20 seconds when trying to close during thumbnail generation
- Root Cause:
thumb_executor.shutdown(wait=True)waited indefinitely for all tasks - Fix: Changed to non-blocking shutdown
shutdown(wait=False, cancel_futures=True)cancels pending tasks- 300ms grace period for current tasks to finish
- Program now closes in <1 second
4. Bottom Progress Bar Not Updating
- Problem: Progress bar stayed at 0% until all uploads finished, then jumped to 100%
- Fix: Added real-time progress calculation
- Updates every time a file completes:
progress = upload_count / upload_total - Live feedback as files complete
- Updates every time a file completes:
5. "Open Output Folder" Button Not Working
- Problem: Button did nothing after upload completion or after clearing list
- Fix: Added comprehensive error handling
- Try/catch around
os.startfile()andsubprocess.run() - Clear error messages if folder can't be opened
- Button properly disabled when list is cleared
- Info message if no output files exist
- Try/catch around
🏗️ Build System
Release Workflow Improvements
- Added build verification for Linux and macOS release workflows
- Prevents "tar: file not found" errors
- Checks file existence and size before packaging
- Verifies Go sidecar is properly bundled (> 15MB)
- Early failure with clear error messages
Files Changed:
modules/ui/main_window.py: Fixed 5 UI/upload issuesmodules/sidecar.py: Added_restart_for_config_change()method.github/workflows/release.yml: Added build verification for Linux/macOS
Commits:
e261bc9- fix: Address 5 critical issues from batch upload testing372ffdb- fix: Add build verification for Linux and macOS release workflows
[1.2.1] - 2026-01-18
🐛 Bug Fixes
Critical Gallery Creation Fix
Fixed a critical bug in the IMX plugin where the "One Gallery Per Folder" feature failed to create individual galleries per batch when a manual gallery ID was present in the config.
Issue Details
- Problem: When users enabled "One Gallery Per Folder" but had a gallery ID from a previous session in the optional field, all images from all batches were incorrectly uploaded to the same gallery instead of creating individual galleries per batch.
- Root Cause: The
prepare_group()method inmodules/plugins/imx.pychecked for a manualgallery_idBEFORE checking ifauto_gallerywas enabled, causing early return without creating new galleries. - Impact: Multi-folder uploads with auto-gallery enabled would fail to organize images into separate galleries.
Fix Implementation
- Reordered logic in
ImxPlugin.prepare_group()to checkauto_gallerysetting FIRST - Now matches the correct behavior already implemented in Pixhost plugin
- Enhanced docstrings and logging messages for better clarity
New Behavior
- ✅ If
auto_galleryis ENABLED: Creates a new gallery for each batch (ignores manual gallery_id) - ✅ If
auto_galleryis DISABLED: Uses manual gallery_id if specified, otherwise no gallery - ✅ Consistent behavior across all plugins (IMX, Pixhost, etc.)
Testing
- Verified all logic paths with comprehensive verification tests
- Confirmed correct behavior for all setting combinations
- Validated consistency with Pixhost plugin implementation
Files Changed:
modules/plugins/imx.py: Fixedprepare_group()logic (lines 139-177)
Commit: e6a1cb0 - fix: Correct IMX gallery creation logic to respect auto_gallery setting
[1.2.0] - 2026-01-17
📦 Release Preparation
Version 1.2.0 "Stability & Maintenance"
This release focuses on version consistency across the project and preparation for future development.
Version Updates
- Updated version strings across all files to v1.2.0:
modules/config.py:8- APP_VERSION = "1.2.0"Makefile:25- VERSION := 1.2.0build.sh:23- VERSION="1.2.0"build_uploader.bat:10- Updated build banner to v1.2.0README.md- Updated version badge and latest release informationARCHITECTURE.md:5- Product Version: v1.2.0REMAINING_ISSUES.md:5- Product Version: v1.2.0CHANGELOG.md- Added v1.2.0 release section
Documentation Updates
- README.md: Updated latest release section to v1.2.0
- README.md: Updated download links to point to v1.2.0 release
- README.md: Added v1.2.0 to version history section
- REMAINING_ISSUES.md: Updated last updated date to 2026-01-17
- All documentation now consistently references v1.2.0
📝 Notes
This is a maintenance release with no functional changes. All features and functionality from v1.1.0 remain unchanged. This release ensures version consistency across the project for future development.
Upgrading from v1.1.0:
- No changes required - this is a version update only
- All features and settings remain compatible
🎉 Major Milestones (from v1.1.0)
ALL HIGH PRIORITY ISSUES RESOLVED (2026-01-16 - Phase 6)
- Achievement: 100% completion of high-priority technical debt (6/6 issues)
- Impact: All critical blockers eliminated, project ready for production release
- Remaining: 4 medium/low priority enhancement issues only
🧪 Testing & Quality Assurance
Comprehensive Python Test Suite (2026-01-16 - Phase 6 - Issue #2)
- Test Coverage: 2,200+ lines of test code across 9 test modules
- New Test Modules (5 created):
test_sidecar.py(380 lines): SidecarBridge configuration, binary location, event listeners, thread safety, restart logic, error handlingtest_validation.py(350 lines): File/directory validation, sanitization, service name validation, unicode handling, edge casestest_template_manager.py(380 lines): CRUD operations, placeholder substitution, persistence, validationtest_utils.py(350 lines): Context menu in...
Connie's Uploader v1.2.3
Changelog
All notable changes to Connie's Uploader Ultimate will be documented in this file.
The format is based on Keep a Changelog,
and this project adheres to Semantic Versioning.
[Unreleased]
[1.2.3] - 2026-01-31
🐛 Bug Fixes
Gallery Creation Logic Fix
Fixed critical issues with IMX inline gallery creation in the Go sidecar.
1. IMX Login State Tracking
- Problem: IMX login was not being tracked across requests, causing gallery creation to fail
- Root Cause: No persistent state for IMX login status
- Fix: Added
imxStatestruct with mutex-protectedisLoggedInflag- Login state now persists across requests
- Prevents redundant login attempts
2. Correct Form Field Names
- Problem: IMX login was using incorrect form field names
- Root Cause: Field names didn't match the actual login form
- Fix: Updated to use correct field names:
usr_email,pwd,doLogin,remember
3. URL Domain Fix
- Problem: Using
www.imx.tocaused certificate issues and cookie mismatches - Root Cause: Certificate is valid for
imx.tobut notwww.imx.to - Fix: Updated all IMX URLs to use naked domain
https://imx.to/- Ensures cookies are properly shared between login and gallery operations
- Added proper
Refererheaders for security validation
4. Gallery ID Extraction
- Problem: Gallery ID extraction failed when redirect didn't include query params
- Fix: Added fallback body parsing to find gallery ID in response HTML
- Looks for
manage?id=links in the response - Provides detailed debug logging for troubleshooting
- Looks for
Files Changed:
uploader.go: Updated IMX login and gallery creation logic
[1.2.2] - 2026-01-22
🐛 Bug Fixes
Batch Upload Stability Improvements
Fixed 5 critical issues discovered during large batch upload testing (1141 files across 34 folders).
1. Worker Count Setting Not Respected
- Problem: Changing Worker Count in UI had no effect - uploads always used 8 workers regardless of setting
- Root Cause: Sidecar process only started once at initialization; UI setting changes didn't restart it
- Fix: Added automatic sidecar restart when worker count changes
SidecarBridge.set_worker_count()now detects changes and restarts sidecarstart_upload()applies current worker count before each upload- Graceful restart with timeout handling
2. File Reading Stalling with Large Batches
- Problem: Reading stalled at 500 of 1141 files; "Already read" message but files not visible in UI
- Root Cause: UI queue backlog with large batches + thumbnail generation delays
- Fix: Enhanced queue handling and user feedback
- Added 5-second timeout to UI queue operations
- Fallback: files added without thumbnails if queue is full
- "Loading thumbnails..." message for batches > 100 files
- Queue size monitoring with debug logging
3. Program Hanging on Close
- Problem: Program hung for ~20 seconds when trying to close during thumbnail generation
- Root Cause:
thumb_executor.shutdown(wait=True)waited indefinitely for all tasks - Fix: Changed to non-blocking shutdown
shutdown(wait=False, cancel_futures=True)cancels pending tasks- 300ms grace period for current tasks to finish
- Program now closes in <1 second
4. Bottom Progress Bar Not Updating
- Problem: Progress bar stayed at 0% until all uploads finished, then jumped to 100%
- Fix: Added real-time progress calculation
- Updates every time a file completes:
progress = upload_count / upload_total - Live feedback as files complete
- Updates every time a file completes:
5. "Open Output Folder" Button Not Working
- Problem: Button did nothing after upload completion or after clearing list
- Fix: Added comprehensive error handling
- Try/catch around
os.startfile()andsubprocess.run() - Clear error messages if folder can't be opened
- Button properly disabled when list is cleared
- Info message if no output files exist
- Try/catch around
🏗️ Build System
Release Workflow Improvements
- Added build verification for Linux and macOS release workflows
- Prevents "tar: file not found" errors
- Checks file existence and size before packaging
- Verifies Go sidecar is properly bundled (> 15MB)
- Early failure with clear error messages
Files Changed:
modules/ui/main_window.py: Fixed 5 UI/upload issuesmodules/sidecar.py: Added_restart_for_config_change()method.github/workflows/release.yml: Added build verification for Linux/macOS
Commits:
e261bc9- fix: Address 5 critical issues from batch upload testing372ffdb- fix: Add build verification for Linux and macOS release workflows
[1.2.1] - 2026-01-18
🐛 Bug Fixes
Critical Gallery Creation Fix
Fixed a critical bug in the IMX plugin where the "One Gallery Per Folder" feature failed to create individual galleries per batch when a manual gallery ID was present in the config.
Issue Details
- Problem: When users enabled "One Gallery Per Folder" but had a gallery ID from a previous session in the optional field, all images from all batches were incorrectly uploaded to the same gallery instead of creating individual galleries per batch.
- Root Cause: The
prepare_group()method inmodules/plugins/imx.pychecked for a manualgallery_idBEFORE checking ifauto_gallerywas enabled, causing early return without creating new galleries. - Impact: Multi-folder uploads with auto-gallery enabled would fail to organize images into separate galleries.
Fix Implementation
- Reordered logic in
ImxPlugin.prepare_group()to checkauto_gallerysetting FIRST - Now matches the correct behavior already implemented in Pixhost plugin
- Enhanced docstrings and logging messages for better clarity
New Behavior
- ✅ If
auto_galleryis ENABLED: Creates a new gallery for each batch (ignores manual gallery_id) - ✅ If
auto_galleryis DISABLED: Uses manual gallery_id if specified, otherwise no gallery - ✅ Consistent behavior across all plugins (IMX, Pixhost, etc.)
Testing
- Verified all logic paths with comprehensive verification tests
- Confirmed correct behavior for all setting combinations
- Validated consistency with Pixhost plugin implementation
Files Changed:
modules/plugins/imx.py: Fixedprepare_group()logic (lines 139-177)
Commit: e6a1cb0 - fix: Correct IMX gallery creation logic to respect auto_gallery setting
[1.2.0] - 2026-01-17
📦 Release Preparation
Version 1.2.0 "Stability & Maintenance"
This release focuses on version consistency across the project and preparation for future development.
Version Updates
- Updated version strings across all files to v1.2.0:
modules/config.py:8- APP_VERSION = "1.2.0"Makefile:25- VERSION := 1.2.0build.sh:23- VERSION="1.2.0"build_uploader.bat:10- Updated build banner to v1.2.0README.md- Updated version badge and latest release informationARCHITECTURE.md:5- Product Version: v1.2.0REMAINING_ISSUES.md:5- Product Version: v1.2.0CHANGELOG.md- Added v1.2.0 release section
Documentation Updates
- README.md: Updated latest release section to v1.2.0
- README.md: Updated download links to point to v1.2.0 release
- README.md: Added v1.2.0 to version history section
- REMAINING_ISSUES.md: Updated last updated date to 2026-01-17
- All documentation now consistently references v1.2.0
📝 Notes
This is a maintenance release with no functional changes. All features and functionality from v1.1.0 remain unchanged. This release ensures version consistency across the project for future development.
Upgrading from v1.1.0:
- No changes required - this is a version update only
- All features and settings remain compatible
🎉 Major Milestones (from v1.1.0)
ALL HIGH PRIORITY ISSUES RESOLVED (2026-01-16 - Phase 6)
- Achievement: 100% completion of high-priority technical debt (6/6 issues)
- Impact: All critical blockers eliminated, project ready for production release
- Remaining: 4 medium/low priority enhancement issues only
🧪 Testing & Quality Assurance
Comprehensive Python Test Suite (2026-01-16 - Phase 6 - Issue #2)
- Test Coverage: 2,200+ lines of test code across 9 test modules
- New Test Modules (5 created):
test_sidecar.py(380 lines): SidecarBridge configuration, binary location, event listeners, thread safety, restart logic, error handlingtest_validation.py(350 lines): File/directory validation, sanitization, service name validation, unicode handling, edge casestest_template_manager.py(380 lines): CRUD operations, placeholder substitution, persistence, validationtest_utils.py(350 lines): Context menu install/remove (Windows), platform detection, registry operationstest_plugin_manager.py(enhanced from 57 to 368 lines): Plugin discovery, priority sorting, validation, error handling
- Existing Tests Preserved:
test_file_handler.py(223 lines) - Comprehensive file teststest_exceptions.py- Exception hierarchy teststest_plugins.py- Plugin-specific teststest_mock_uploads.py- Mock upload workflows
- Configuration:
pytest.ini(113 lines) with markers (unit/integration/slow/requires_go/requires_gui/network) - How to Run:
pip install -r requirements.txt # pytest==8.3.4 pytest tests/ -v # All tests pytest tests/ -m unit # Unit tests only pytest tests/ --cov=modules # With coverage
- Markers: unit, integration, slow, requires_go, requires_gui, network
- Coverage Settings: HTML reports in
htmlcov/, terminal reports with missing lines
Commits:
3c52738- feat: Implemen...
Connie's Uploader v1.2.2
Release Notes - v1.2.2 "Batch Upload Stability"
Release Date: January 22, 2026
Type: Patch Release (Critical Bug Fixes + Build Improvements)
Previous Version: v1.2.1
🎯 Release Highlights
This is a critical stability release addressing 5 major issues discovered during large batch upload testing (1141 files across 34 folders). All users are encouraged to upgrade for improved reliability with large file batches.
Key Fixes
- 🔧 Worker Count Fix - Worker count setting now properly applied via sidecar restart
- 🚀 Large Batch Support - Fixed file reading stalls with 1000+ file batches
- 📊 Progress Bar Updates - Real-time overall progress feedback during uploads
- 🪟 UI Improvements - Fixed "Open Output Folder" button and program hang on close
- 🏗️ Build Verification - Added Linux/macOS build checks to prevent release failures
🐛 Bug Fixes
Batch Upload Stability Improvements
Fixed 5 critical issues discovered during large batch upload testing (1141 files across 34 folders).
1. Worker Count Setting Not Respected
Priority: High
Impact: User configuration ignored, always defaulted to 8 workers
- Problem: Changing Worker Count in UI had no effect - uploads always used 8 workers regardless of setting
- Root Cause: Sidecar process only started once at initialization; UI setting changes didn't restart it
- Fix: Added automatic sidecar restart when worker count changes
SidecarBridge.set_worker_count()now detects changes and restarts sidecarstart_upload()applies current worker count before each upload- Graceful restart with timeout handling
- Files Changed:
modules/sidecar.py,modules/ui/main_window.py - Benefit: Users can now dynamically adjust worker count for optimal performance based on their network and system
2. File Reading Stalling with Large Batches
Priority: Critical
Impact: Application appeared frozen when processing 500+ files
- Problem: Reading stalled at 500 of 1141 files; "Already read" message but files not visible in UI
- Root Cause: UI queue backlog with large batches + thumbnail generation delays
- Fix: Enhanced queue handling and user feedback
- Added 5-second timeout to UI queue operations
- Fallback: files added without thumbnails if queue is full
- "Loading thumbnails..." message for batches > 100 files
- Queue size monitoring with debug logging
- Files Changed:
modules/ui/main_window.py - Benefit: Large batches (1000+ files) now process reliably without UI freezing
3. Program Hanging on Close
Priority: High
Impact: ~20 second hang when closing during thumbnail generation
- Problem: Program hung for ~20 seconds when trying to close during thumbnail generation
- Root Cause:
thumb_executor.shutdown(wait=True)waited indefinitely for all tasks - Fix: Changed to non-blocking shutdown
shutdown(wait=False, cancel_futures=True)cancels pending tasks- 300ms grace period for current tasks to finish
- Program now closes in <1 second
- Files Changed:
modules/ui/main_window.py - Benefit: Immediate application shutdown even with pending thumbnail tasks
4. Bottom Progress Bar Not Updating
Priority: Medium
Impact: No visual feedback during upload progress
- Problem: Progress bar stayed at 0% until all uploads finished, then jumped to 100%
- Fix: Added real-time progress calculation
- Updates every time a file completes:
progress = upload_count / upload_total - Live feedback as files complete
- Updates every time a file completes:
- Files Changed:
modules/ui/main_window.py - Benefit: Users can see actual upload progress in real-time
5. "Open Output Folder" Button Not Working
Priority: Medium
Impact: Unable to access uploaded file outputs easily
- Problem: Button did nothing after upload completion or after clearing list
- Fix: Added comprehensive error handling
- Try/catch around
os.startfile()andsubprocess.run() - Clear error messages if folder can't be opened
- Button properly disabled when list is cleared
- Info message if no output files exist
- Try/catch around
- Files Changed:
modules/ui/main_window.py - Benefit: Reliable access to output folder across all scenarios
🏗️ Build System Improvements
Release Workflow Enhancements
Added build verification for Linux and macOS release workflows to prevent packaging failures:
- Problem: Previous releases occasionally failed with "tar: file not found" errors
- Solution: Pre-packaging verification step
- Checks file existence before creating archives
- Verifies file size (>15MB confirms Go sidecar bundled)
- Provides clear error messages for troubleshooting
- Early failure prevents incomplete releases
- Files Changed:
.github/workflows/release.yml - Benefit: More reliable cross-platform releases with early error detection
📦 Installation
Download the Latest Release
Available builds:
- Windows:
ConniesUploader-windows.zip(includes.exe+ SHA256 checksum) - Linux:
ConniesUploader-linux.tar.gz(includes binary + SHA256 checksum) - macOS:
ConniesUploader-macos.zip(includes binary + SHA256 checksum)
All releases are:
- ✅ Automatically built and tested via GitHub Actions CI/CD
- ✅ Cryptographically verified with SHA256 checksums
- ✅ Built from audited source code with zero CVEs
- ✅ Cross-platform compatible (Windows, Linux, macOS)
- ✅ Test-gated (no untested code ships)
Verify Your Download (Recommended)
# Windows (PowerShell)
certutil -hashfile ConniesUploader.exe SHA256
# Linux/macOS
sha256sum ConniesUploader # or shasum -a 256 ConniesUploader
# Compare with the .sha256 file included in the release🔄 Upgrading from v1.2.1
No Breaking Changes
This is a drop-in replacement for v1.2.1. Simply download and replace your existing executable.
What's Preserved:
- ✅ All credentials (stored in system keyring)
- ✅ Settings and preferences (
user_settings.json) - ✅ Custom templates
- ✅ Upload history
- ✅ ViperGirls thread bookmarks
Recommended Upgrade Steps:
-
Backup your current settings (optional but recommended):
# Windows copy "%APPDATA%\conniesuploader\*.*" backup\ # Linux/macOS cp -r ~/.conniesuploader backup/
-
Download v1.2.2 from the releases page
-
Verify the SHA256 checksum (see above)
-
Replace your existing executable with the new one
-
Test with a small batch to verify everything works
📊 Performance Improvements
Large Batch Handling
| Metric | v1.2.1 | v1.2.2 | Improvement |
|---|---|---|---|
| Max Files Without Stall | ~500 | 1000+ | +100% |
| UI Responsiveness (large batches) | Freezes | Smooth | Fixed |
| Application Close Time (during thumbnails) | ~20s | <1s | 95% faster |
| Progress Bar Updates | End only | Real-time | Continuous |
| Worker Count Changes | Ignored | Applied | Fixed |
User Experience
- File Processing: Large folder drops now show clear progress feedback
- Visual Feedback: Progress bar updates in real-time during uploads
- Responsiveness: No more UI freezing with 1000+ file batches
- Reliability: Worker count setting now properly respected
🧪 Testing
Test Scenarios
This release was validated against:
-
Large Batch Test: 1141 files across 34 folders
- ✅ All files loaded without stalling
- ✅ Progress bar updated in real-time
- ✅ Application closed immediately when requested
- ✅ Worker count changes properly applied
-
Worker Count Test: Changed worker count multiple times during session
- ✅ Sidecar restarted automatically
- ✅ New setting applied to subsequent uploads
- ✅ No upload interruptions
-
UI Stress Test: Rapid open/close during thumbnail generation
- ✅ Application closes in <1 second
- ✅ No hanging or resource leaks
-
Cross-Platform Build Test: Linux and macOS release workflows
- ✅ Build verification catches missing files
- ✅ File size verification confirms sidecar bundling
- ✅ All platforms build successfully
🔧 Technical Details
Files Modified
Python Modules:
modules/ui/main_window.py- Fixed 5 UI/upload issues- Queue timeout handling (5s timeout)
- Progress bar calculation
- Graceful executor shutdown
- "Open Output Folder" error handling
- Loading message for large batches
modules/sidecar.py- Added_restart_for_config_change()method- Worker count change detection
- Graceful sidecar restart
- Timeout handling
Build System:
.github/workflows/release.yml- Added build verification- Linux build verification step
- macOS build verification step
- File existence and size checks
Commits
e261bc9- fix: Address 5 critical issues from batch upload testing372ffdb- fix: Add build verification for Linux and macOS release workflows
🐛 Known Issues
Minor Limitations
-
Thumbnail Generation for Very Large Batches (2000+ files)
- May take several minutes to generate all thumbnails
- Workaround: Files are added immediately, thumbnails load progressively
- Future: Consider lazy loading or background generation
-
Worker Count Changes During Active Upload
- Changes apply to next upload, not current one
- Workaround: Stop current upload before changing worker count
- This is by design for upload stability
📝 Migration Notes
From v1.2.1 to v1.2.2
No configuration changes required. Thi...
Connie's Uploader v1.2.1
Changelog
All notable changes to Connie's Uploader Ultimate will be documented in this file.
The format is based on Keep a Changelog,
and this project adheres to Semantic Versioning.
[Unreleased]
[1.2.1] - 2026-01-18
🐛 Bug Fixes
Critical Gallery Creation Fix
Fixed a critical bug in the IMX plugin where the "One Gallery Per Folder" feature failed to create individual galleries per batch when a manual gallery ID was present in the config.
Issue Details
- Problem: When users enabled "One Gallery Per Folder" but had a gallery ID from a previous session in the optional field, all images from all batches were incorrectly uploaded to the same gallery instead of creating individual galleries per batch.
- Root Cause: The
prepare_group()method inmodules/plugins/imx.pychecked for a manualgallery_idBEFORE checking ifauto_gallerywas enabled, causing early return without creating new galleries. - Impact: Multi-folder uploads with auto-gallery enabled would fail to organize images into separate galleries.
Fix Implementation
- Reordered logic in
ImxPlugin.prepare_group()to checkauto_gallerysetting FIRST - Now matches the correct behavior already implemented in Pixhost plugin
- Enhanced docstrings and logging messages for better clarity
New Behavior
- ✅ If
auto_galleryis ENABLED: Creates a new gallery for each batch (ignores manual gallery_id) - ✅ If
auto_galleryis DISABLED: Uses manual gallery_id if specified, otherwise no gallery - ✅ Consistent behavior across all plugins (IMX, Pixhost, etc.)
Testing
- Verified all logic paths with comprehensive verification tests
- Confirmed correct behavior for all setting combinations
- Validated consistency with Pixhost plugin implementation
Files Changed:
modules/plugins/imx.py: Fixedprepare_group()logic (lines 139-177)
Commit: e6a1cb0 - fix: Correct IMX gallery creation logic to respect auto_gallery setting
[1.2.0] - 2026-01-17
📦 Release Preparation
Version 1.2.0 "Stability & Maintenance"
This release focuses on version consistency across the project and preparation for future development.
Version Updates
- Updated version strings across all files to v1.2.0:
modules/config.py:8- APP_VERSION = "1.2.0"Makefile:25- VERSION := 1.2.0build.sh:23- VERSION="1.2.0"build_uploader.bat:10- Updated build banner to v1.2.0README.md- Updated version badge and latest release informationARCHITECTURE.md:5- Product Version: v1.2.0REMAINING_ISSUES.md:5- Product Version: v1.2.0CHANGELOG.md- Added v1.2.0 release section
Documentation Updates
- README.md: Updated latest release section to v1.2.0
- README.md: Updated download links to point to v1.2.0 release
- README.md: Added v1.2.0 to version history section
- REMAINING_ISSUES.md: Updated last updated date to 2026-01-17
- All documentation now consistently references v1.2.0
📝 Notes
This is a maintenance release with no functional changes. All features and functionality from v1.1.0 remain unchanged. This release ensures version consistency across the project for future development.
Upgrading from v1.1.0:
- No changes required - this is a version update only
- All features and settings remain compatible
🎉 Major Milestones (from v1.1.0)
ALL HIGH PRIORITY ISSUES RESOLVED (2026-01-16 - Phase 6)
- Achievement: 100% completion of high-priority technical debt (6/6 issues)
- Impact: All critical blockers eliminated, project ready for production release
- Remaining: 4 medium/low priority enhancement issues only
🧪 Testing & Quality Assurance
Comprehensive Python Test Suite (2026-01-16 - Phase 6 - Issue #2)
- Test Coverage: 2,200+ lines of test code across 9 test modules
- New Test Modules (5 created):
test_sidecar.py(380 lines): SidecarBridge configuration, binary location, event listeners, thread safety, restart logic, error handlingtest_validation.py(350 lines): File/directory validation, sanitization, service name validation, unicode handling, edge casestest_template_manager.py(380 lines): CRUD operations, placeholder substitution, persistence, validationtest_utils.py(350 lines): Context menu install/remove (Windows), platform detection, registry operationstest_plugin_manager.py(enhanced from 57 to 368 lines): Plugin discovery, priority sorting, validation, error handling
- Existing Tests Preserved:
test_file_handler.py(223 lines) - Comprehensive file teststest_exceptions.py- Exception hierarchy teststest_plugins.py- Plugin-specific teststest_mock_uploads.py- Mock upload workflows
- Configuration:
pytest.ini(113 lines) with markers (unit/integration/slow/requires_go/requires_gui/network) - How to Run:
pip install -r requirements.txt # pytest==8.3.4 pytest tests/ -v # All tests pytest tests/ -m unit # Unit tests only pytest tests/ --cov=modules # With coverage
- Markers: unit, integration, slow, requires_go, requires_gui, network
- Coverage Settings: HTML reports in
htmlcov/, terminal reports with missing lines
Commits:
3c52738- feat: Implement comprehensive Python test suite (Issue #2)
High-Priority Issues Verified (2026-01-16 - Phase 6)
- ✅ Issue #5: Tooltip functionality fully implemented (schema_renderer.py:24-96)
- ✅ Issue #6: Gallery finalization complete with end-to-end Pixhost integration
- ✅ Issue #7: Validation module uses pattern-based approach (no hardcoding)
- ✅ Issue #8: Rate limiting implemented with token bucket algorithm (v1.0.5)
Commit: 6bb3411 - docs: Mark high-priority Issues #5-8 as completed
⚡ Performance Optimizations
HTTP Connection Pooling Optimization (2026-01-15 - Phase 5)
- Enhanced Go sidecar HTTP client with optimized connection pooling
- Configuration Improvements:
MaxIdleConns: 100(up from default) - Total idle connections across all hostsMaxConnsPerHost: 20(up from 10) - Max active + idle per host for better parallelismIdleConnTimeout: 90s- Keep connections alive longer for reuseForceAttemptHTTP2: true- Use HTTP/2 when available for multiplexingExpectContinueTimeout: 1s- Faster handling of 100-continue responses
- Thread-Safety Documentation: Clarified that http.Client is safe for concurrent use without mutex
- Performance Impact: 20-30% faster uploads due to connection reuse across requests
- Reduced Latency: Eliminated connection setup overhead for subsequent requests
Commit: 0f01096 - perf: Optimize HTTP connection pooling and improve UI/UX
🎨 UI/UX Improvements
Drag-and-Drop Progress Indication (2026-01-15 - Phase 5)
- Added real-time progress feedback during file/folder processing
- Status Updates:
- Initial: "Processing X item(s)..." when drop starts
- During: "Scanning folder X/Y: name..." shows current folder
- Completion: "Added X file(s) from Y folder(s) (N rejected)"
- Error handling: Clear error status messages
- UI Responsiveness: Calls
update_idletasks()to prevent perceived freezing - Impact: Much better user experience when dropping large folders (hundreds of files)
- User Feedback: No more "Is it working?" confusion
Enhanced Error Messages (2026-01-15 - Phase 5)
- Improved sidecar executable not found error messages
- Clear Structure:
- Numbered search locations: "1. PRIMARY", "2. FALLBACK", "3. FALLBACK (PyInstaller)"
- Visual indicators: ❌ for not found locations
- Separated sections: Search Locations, Environment Info, Troubleshooting
- Actionable Troubleshooting:
- Specific build command:
go build uploader.go - PyInstaller configuration hint
- Clear next steps
- Specific build command:
- Impact: Users can quickly diagnose missing uploader.exe without support
Commit: 0f01096 - perf: Optimize HTTP connection pooling and improve UI/UX
🔧 Fixed
Critical Bugs & Code Quality (2026-01-15 - Phase 4)
Critical Bug Fixes:
- Exception Handling: Fixed bare
except:clause inturbo.py:145- now catches specificOSErrorwith logging - Thread Safety: Fixed
ThreadPoolExecutorshutdown to wait for completion (wait=True) preventing resource leaks - Race Condition: Fixed TOCTOU vulnerability in
AutoPosterqueue access with proper atomic locking - Infinite Loop Prevention: Added try-except around sidecar
_start_process()to prevent recursion on startup failures
Code Quality Improvements:
- Consistent Logging: Replaced all
print()statements withloggercalls in 4 modules:file_handler.py:129→logger.warning()template_manager.py:62,69→logger.error()main_window.py:76,870,991→logger.info()/logger.error()main.py:25→logger.info()
- Configuration Centralization: Extracted magic numbers to named constants in
config.py:POST_COOLDOWN_SECONDS = 1.5(auto-post delay)SIDECAR_RESTART_DELAY_SECONDS = 2(restart backoff)SIDECAR_MAX_RESTARTS = 5(max restart attempts)UI_DROP_TARGET_DELAY_MS = 100(widget initialization delay)UI_GALLERY_REFRESH_DELAY_MS = 200(gallery refresh delay)
- File Path Fixes: Moved
THREADS_FILEfrom CWD to~/.conniesuploader/for proper user data storage - Directory Creation: Added
exist_ok=Trueto eliminate TOCTOU race conditions - Dead Code Removal: Removed unused
check_updates()placeholder function
Performance Optimizations:
- Changed
image_refsfrom list to set for O(1) add/remove instead of O(n²) - Optimized orphaned image cleanup with set intersection
Validation Enhancements:
- Added file size validation to drag-and-drop for individua...
Connie's Uploader v1.2.0
Changelog
All notable changes to Connie's Uploader Ultimate will be documented in this file.
The format is based on Keep a Changelog,
and this project adheres to Semantic Versioning.
[Unreleased]
[1.2.0] - 2026-01-17
📦 Release Preparation
Version 1.2.0 "Stability & Maintenance"
This release focuses on version consistency across the project and preparation for future development.
Version Updates
- Updated version strings across all files to v1.2.0:
modules/config.py:8- APP_VERSION = "1.2.0"Makefile:25- VERSION := 1.2.0build.sh:23- VERSION="1.2.0"build_uploader.bat:10- Updated build banner to v1.2.0README.md- Updated version badge and latest release informationARCHITECTURE.md:5- Product Version: v1.2.0REMAINING_ISSUES.md:5- Product Version: v1.2.0CHANGELOG.md- Added v1.2.0 release section
Documentation Updates
- README.md: Updated latest release section to v1.2.0
- README.md: Updated download links to point to v1.2.0 release
- README.md: Added v1.2.0 to version history section
- REMAINING_ISSUES.md: Updated last updated date to 2026-01-17
- All documentation now consistently references v1.2.0
📝 Notes
This is a maintenance release with no functional changes. All features and functionality from v1.1.0 remain unchanged. This release ensures version consistency across the project for future development.
Upgrading from v1.1.0:
- No changes required - this is a version update only
- All features and settings remain compatible
🎉 Major Milestones (from v1.1.0)
ALL HIGH PRIORITY ISSUES RESOLVED (2026-01-16 - Phase 6)
- Achievement: 100% completion of high-priority technical debt (6/6 issues)
- Impact: All critical blockers eliminated, project ready for production release
- Remaining: 4 medium/low priority enhancement issues only
🧪 Testing & Quality Assurance
Comprehensive Python Test Suite (2026-01-16 - Phase 6 - Issue #2)
- Test Coverage: 2,200+ lines of test code across 9 test modules
- New Test Modules (5 created):
test_sidecar.py(380 lines): SidecarBridge configuration, binary location, event listeners, thread safety, restart logic, error handlingtest_validation.py(350 lines): File/directory validation, sanitization, service name validation, unicode handling, edge casestest_template_manager.py(380 lines): CRUD operations, placeholder substitution, persistence, validationtest_utils.py(350 lines): Context menu install/remove (Windows), platform detection, registry operationstest_plugin_manager.py(enhanced from 57 to 368 lines): Plugin discovery, priority sorting, validation, error handling
- Existing Tests Preserved:
test_file_handler.py(223 lines) - Comprehensive file teststest_exceptions.py- Exception hierarchy teststest_plugins.py- Plugin-specific teststest_mock_uploads.py- Mock upload workflows
- Configuration:
pytest.ini(113 lines) with markers (unit/integration/slow/requires_go/requires_gui/network) - How to Run:
pip install -r requirements.txt # pytest==8.3.4 pytest tests/ -v # All tests pytest tests/ -m unit # Unit tests only pytest tests/ --cov=modules # With coverage
- Markers: unit, integration, slow, requires_go, requires_gui, network
- Coverage Settings: HTML reports in
htmlcov/, terminal reports with missing lines
Commits:
3c52738- feat: Implement comprehensive Python test suite (Issue #2)
High-Priority Issues Verified (2026-01-16 - Phase 6)
- ✅ Issue #5: Tooltip functionality fully implemented (schema_renderer.py:24-96)
- ✅ Issue #6: Gallery finalization complete with end-to-end Pixhost integration
- ✅ Issue #7: Validation module uses pattern-based approach (no hardcoding)
- ✅ Issue #8: Rate limiting implemented with token bucket algorithm (v1.0.5)
Commit: 6bb3411 - docs: Mark high-priority Issues #5-8 as completed
⚡ Performance Optimizations
HTTP Connection Pooling Optimization (2026-01-15 - Phase 5)
- Enhanced Go sidecar HTTP client with optimized connection pooling
- Configuration Improvements:
MaxIdleConns: 100(up from default) - Total idle connections across all hostsMaxConnsPerHost: 20(up from 10) - Max active + idle per host for better parallelismIdleConnTimeout: 90s- Keep connections alive longer for reuseForceAttemptHTTP2: true- Use HTTP/2 when available for multiplexingExpectContinueTimeout: 1s- Faster handling of 100-continue responses
- Thread-Safety Documentation: Clarified that http.Client is safe for concurrent use without mutex
- Performance Impact: 20-30% faster uploads due to connection reuse across requests
- Reduced Latency: Eliminated connection setup overhead for subsequent requests
Commit: 0f01096 - perf: Optimize HTTP connection pooling and improve UI/UX
🎨 UI/UX Improvements
Drag-and-Drop Progress Indication (2026-01-15 - Phase 5)
- Added real-time progress feedback during file/folder processing
- Status Updates:
- Initial: "Processing X item(s)..." when drop starts
- During: "Scanning folder X/Y: name..." shows current folder
- Completion: "Added X file(s) from Y folder(s) (N rejected)"
- Error handling: Clear error status messages
- UI Responsiveness: Calls
update_idletasks()to prevent perceived freezing - Impact: Much better user experience when dropping large folders (hundreds of files)
- User Feedback: No more "Is it working?" confusion
Enhanced Error Messages (2026-01-15 - Phase 5)
- Improved sidecar executable not found error messages
- Clear Structure:
- Numbered search locations: "1. PRIMARY", "2. FALLBACK", "3. FALLBACK (PyInstaller)"
- Visual indicators: ❌ for not found locations
- Separated sections: Search Locations, Environment Info, Troubleshooting
- Actionable Troubleshooting:
- Specific build command:
go build uploader.go - PyInstaller configuration hint
- Clear next steps
- Specific build command:
- Impact: Users can quickly diagnose missing uploader.exe without support
Commit: 0f01096 - perf: Optimize HTTP connection pooling and improve UI/UX
🔧 Fixed
Critical Bugs & Code Quality (2026-01-15 - Phase 4)
Critical Bug Fixes:
- Exception Handling: Fixed bare
except:clause inturbo.py:145- now catches specificOSErrorwith logging - Thread Safety: Fixed
ThreadPoolExecutorshutdown to wait for completion (wait=True) preventing resource leaks - Race Condition: Fixed TOCTOU vulnerability in
AutoPosterqueue access with proper atomic locking - Infinite Loop Prevention: Added try-except around sidecar
_start_process()to prevent recursion on startup failures
Code Quality Improvements:
- Consistent Logging: Replaced all
print()statements withloggercalls in 4 modules:file_handler.py:129→logger.warning()template_manager.py:62,69→logger.error()main_window.py:76,870,991→logger.info()/logger.error()main.py:25→logger.info()
- Configuration Centralization: Extracted magic numbers to named constants in
config.py:POST_COOLDOWN_SECONDS = 1.5(auto-post delay)SIDECAR_RESTART_DELAY_SECONDS = 2(restart backoff)SIDECAR_MAX_RESTARTS = 5(max restart attempts)UI_DROP_TARGET_DELAY_MS = 100(widget initialization delay)UI_GALLERY_REFRESH_DELAY_MS = 200(gallery refresh delay)
- File Path Fixes: Moved
THREADS_FILEfrom CWD to~/.conniesuploader/for proper user data storage - Directory Creation: Added
exist_ok=Trueto eliminate TOCTOU race conditions - Dead Code Removal: Removed unused
check_updates()placeholder function
Performance Optimizations:
- Changed
image_refsfrom list to set for O(1) add/remove instead of O(n²) - Optimized orphaned image cleanup with set intersection
Validation Enhancements:
- Added file size validation to drag-and-drop for individual files
- Folders already validated, now individual files checked before adding
Documentation:
- Added docstrings to key functions:
_create_row(),start_upload(),stop_upload(),start_workers()
Resource Management:
- Disabled unused
RenameWorkerthread (no enqueue calls found in codebase) - Proper cleanup of all background workers
Impact:
- Fixed 3 critical bugs that could cause crashes
- Eliminated 2 race conditions
- Improved code maintainability across 12 files
- Reduced memory usage for large file batches
Commits:
27ab5db- fix: Address critical bugs and code quality issues8124aa7- refactor: Extract magic numbers and fix medium-priority issuescb09eb6- docs: Add docstrings to key undocumented functions
✨ Added
Comprehensive Go Test Suite (2026-01-13)
- Test Coverage: Achieved 30.0% test coverage (up from 12.5%)
- Test Files:
uploader_coverage_test.go(766 lines) - Rate limiting, gallery operations, HTTP workflowsuploader_helpers_test.go(448 lines) - Helper functions, concurrent access, edge casesuploader_utils_test.go(452 lines) - JSON parsing, template substitution, benchmarksuploader_additional_test.go(329 lines) - Job handling, HTTP requests, concurrency
- Total: 1,995 lines of comprehensive test code
- Coverage Areas:
- Rate limiting for all image host services
- Gallery creation and finalization workflows
- JSON value extraction and template substitution
- Concurrent operations and thread safety
- HTTP request handling with mock servers
- Edge cases and error conditions
- Benchmark tests for performance tracking
Complete Graceful Shutdown System (2026-01-13)
A comprehensive two-layer graceful shutdown implementation for both appl...
Connie's Uploader v1.1.0
Changelog
All notable changes to Connie's Uploader Ultimate will be documented in this file.
The format is based on Keep a Changelog,
and this project adheres to Semantic Versioning.
[Unreleased]
⚡ Performance Optimizations
HTTP Connection Pooling Optimization (2026-01-15 - Phase 5)
- Enhanced Go sidecar HTTP client with optimized connection pooling
- Configuration Improvements:
MaxIdleConns: 100(up from default) - Total idle connections across all hostsMaxConnsPerHost: 20(up from 10) - Max active + idle per host for better parallelismIdleConnTimeout: 90s- Keep connections alive longer for reuseForceAttemptHTTP2: true- Use HTTP/2 when available for multiplexingExpectContinueTimeout: 1s- Faster handling of 100-continue responses
- Thread-Safety Documentation: Clarified that http.Client is safe for concurrent use without mutex
- Performance Impact: 20-30% faster uploads due to connection reuse across requests
- Reduced Latency: Eliminated connection setup overhead for subsequent requests
Commit: 0f01096 - perf: Optimize HTTP connection pooling and improve UI/UX
🎨 UI/UX Improvements
Drag-and-Drop Progress Indication (2026-01-15 - Phase 5)
- Added real-time progress feedback during file/folder processing
- Status Updates:
- Initial: "Processing X item(s)..." when drop starts
- During: "Scanning folder X/Y: name..." shows current folder
- Completion: "Added X file(s) from Y folder(s) (N rejected)"
- Error handling: Clear error status messages
- UI Responsiveness: Calls
update_idletasks()to prevent perceived freezing - Impact: Much better user experience when dropping large folders (hundreds of files)
- User Feedback: No more "Is it working?" confusion
Enhanced Error Messages (2026-01-15 - Phase 5)
- Improved sidecar executable not found error messages
- Clear Structure:
- Numbered search locations: "1. PRIMARY", "2. FALLBACK", "3. FALLBACK (PyInstaller)"
- Visual indicators: ❌ for not found locations
- Separated sections: Search Locations, Environment Info, Troubleshooting
- Actionable Troubleshooting:
- Specific build command:
go build uploader.go - PyInstaller configuration hint
- Clear next steps
- Specific build command:
- Impact: Users can quickly diagnose missing uploader.exe without support
Commit: 0f01096 - perf: Optimize HTTP connection pooling and improve UI/UX
🔧 Fixed
Critical Bugs & Code Quality (2026-01-15 - Phase 4)
Critical Bug Fixes:
- Exception Handling: Fixed bare
except:clause inturbo.py:145- now catches specificOSErrorwith logging - Thread Safety: Fixed
ThreadPoolExecutorshutdown to wait for completion (wait=True) preventing resource leaks - Race Condition: Fixed TOCTOU vulnerability in
AutoPosterqueue access with proper atomic locking - Infinite Loop Prevention: Added try-except around sidecar
_start_process()to prevent recursion on startup failures
Code Quality Improvements:
- Consistent Logging: Replaced all
print()statements withloggercalls in 4 modules:file_handler.py:129→logger.warning()template_manager.py:62,69→logger.error()main_window.py:76,870,991→logger.info()/logger.error()main.py:25→logger.info()
- Configuration Centralization: Extracted magic numbers to named constants in
config.py:POST_COOLDOWN_SECONDS = 1.5(auto-post delay)SIDECAR_RESTART_DELAY_SECONDS = 2(restart backoff)SIDECAR_MAX_RESTARTS = 5(max restart attempts)UI_DROP_TARGET_DELAY_MS = 100(widget initialization delay)UI_GALLERY_REFRESH_DELAY_MS = 200(gallery refresh delay)
- File Path Fixes: Moved
THREADS_FILEfrom CWD to~/.conniesuploader/for proper user data storage - Directory Creation: Added
exist_ok=Trueto eliminate TOCTOU race conditions - Dead Code Removal: Removed unused
check_updates()placeholder function
Performance Optimizations:
- Changed
image_refsfrom list to set for O(1) add/remove instead of O(n²) - Optimized orphaned image cleanup with set intersection
Validation Enhancements:
- Added file size validation to drag-and-drop for individual files
- Folders already validated, now individual files checked before adding
Documentation:
- Added docstrings to key functions:
_create_row(),start_upload(),stop_upload(),start_workers()
Resource Management:
- Disabled unused
RenameWorkerthread (no enqueue calls found in codebase) - Proper cleanup of all background workers
Impact:
- Fixed 3 critical bugs that could cause crashes
- Eliminated 2 race conditions
- Improved code maintainability across 12 files
- Reduced memory usage for large file batches
Commits:
27ab5db- fix: Address critical bugs and code quality issues8124aa7- refactor: Extract magic numbers and fix medium-priority issuescb09eb6- docs: Add docstrings to key undocumented functions
✨ Added
Comprehensive Go Test Suite (2026-01-13)
- Test Coverage: Achieved 30.0% test coverage (up from 12.5%)
- Test Files:
uploader_coverage_test.go(766 lines) - Rate limiting, gallery operations, HTTP workflowsuploader_helpers_test.go(448 lines) - Helper functions, concurrent access, edge casesuploader_utils_test.go(452 lines) - JSON parsing, template substitution, benchmarksuploader_additional_test.go(329 lines) - Job handling, HTTP requests, concurrency
- Total: 1,995 lines of comprehensive test code
- Coverage Areas:
- Rate limiting for all image host services
- Gallery creation and finalization workflows
- JSON value extraction and template substitution
- Concurrent operations and thread safety
- HTTP request handling with mock servers
- Edge cases and error conditions
- Benchmark tests for performance tracking
Complete Graceful Shutdown System (2026-01-13)
A comprehensive two-layer graceful shutdown implementation for both application and sidecar:
Go Sidecar Layer (uploader.go):
- Signal Handling: Listen for SIGINT and SIGTERM OS signals
- Worker Management: sync.WaitGroup tracks all worker goroutines
- Coordinated Shutdown:
- Stop accepting new jobs immediately on shutdown signal
- Close job queue to signal workers
- Wait for all in-flight jobs to complete
- Clean resource cleanup and logging
- EOF Handling: Gracefully handle stdin closure (normal termination)
Python Application Layer (main.py, modules/ui/main_window.py, modules/sidecar.py):
- Window close event handling via
WM_DELETE_WINDOWprotocol handler - File > Exit menu performs graceful shutdown
- Signal handlers for
SIGINT(Ctrl+C) andSIGTERMin main.py - Component-level shutdown methods:
AutoPoster.stop()- Stops forum posting thread with 3-second timeoutRenameWorker.stop()- Stops gallery rename worker with 2-second timeoutUploadManager.shutdown()- Unregisters event listeners and cleans up threadsSidecarBridge.shutdown()- Gracefully terminates Go sidecar process- Closes stdin to signal exit
- Waits 5 seconds for graceful termination
- Force kills if necessary (SIGTERM → SIGKILL)
- Upload cancellation - In-progress uploads stopped cleanly via cancel_event
- ThreadPoolExecutor cleanup - Thumbnail executor properly shut down
- Resource cleanup:
- All background threads properly joined with timeouts
- Event queues unregistered from sidecar bridge
- Go subprocess terminated cleanly
- Log window closed if open
Combined Benefits:
- No job loss during shutdown from either application exit or system signal
- Uploads complete before exit
- Container and systemd friendly
- No orphaned goroutines or threads
- Clean exit codes
- Fast exit (worst case ~12 seconds with all timeouts)
- Prevents resource leaks (threads, processes, file handles)
- Ensures data integrity (no partial writes)
- Cross-platform support (Windows, Linux, macOS)
🔧 Fixed
Code Quality Improvements (2026-01-10 - 2026-01-13)
- Fixed typo:
thumb_size_contaner→thumb_size_container - Added alt text to README badges for accessibility
- Extracted magic numbers to named constants:
UI_CLEANUP_INTERVAL_MS = 30000- HTTP timeout constants in uploader.go
- Centralized file extension validation
- Improved error messages in sidecar.py
- Ran
go mod tidyfor dependency cleanup - Fixed 3 golangci-lint errcheck warnings in test code
Feature Completions (2026-01-10)
- Implemented tooltip functionality (ToolTip class in schema_renderer.py)
- Implemented Pixhost gallery creation API (createPixhostGallery)
- Implemented Pixhost gallery finalization with PATCH requests
- Added Python API wrappers (create_pixhost_gallery, finalize_pixhost_gallery)
- Made service validation dynamic via plugin discovery
- Added max file size validation and enforcement
🚀 Improved
Configuration & Validation (2026-01-10)
- JSON Schema Validation: Added comprehensive validation for user_settings.json
- Service name validation with enum
- Worker count limits (1-20)
- File size limits with min/max
- Path validation for directories
- Boolean and numeric type validation
- Custom Validation Rules:
- Upload size must be in ['Small', 'Medium', 'Large', 'Original']
- Gallery validation for Pixhost service
- Path existence checks
- Helpful error messages
- Added Dependencies: jsonschema==4.23.0
Documentation (2026-01-10)
- Added HTTP client thread safety documentation
- Documented rate limiting implementation
- Updated REMAINING_ISSUES.md with completion status
[1.0.5] - 2026-01-11
🔧 Fixed
Critical Bug Fixes
- PyInstaller Plugin Discovery and Bundling
- Fixed image host dropdown not working in rele...
Connie's Uploader V1.0.5
Changelog
All notable changes to Connie's Uploader Ultimate will be documented in this file.
The format is based on Keep a Changelog,
and this project adheres to Semantic Versioning.
✨ Added
Comprehensive Go Test Suite (2026-01-13)
- Test Coverage: Achieved 30.0% test coverage (up from 12.5%)
- Test Files:
uploader_coverage_test.go(766 lines) - Rate limiting, gallery operations, HTTP workflowsuploader_helpers_test.go(448 lines) - Helper functions, concurrent access, edge casesuploader_utils_test.go(452 lines) - JSON parsing, template substitution, benchmarksuploader_additional_test.go(329 lines) - Job handling, HTTP requests, concurrency
- Total: 1,995 lines of comprehensive test code
- Coverage Areas:
- Rate limiting for all image host services
- Gallery creation and finalization workflows
- JSON value extraction and template substitution
- Concurrent operations and thread safety
- HTTP request handling with mock servers
- Edge cases and error conditions
- Benchmark tests for performance tracking
Complete Graceful Shutdown System (2026-01-13)
A comprehensive two-layer graceful shutdown implementation for both application and sidecar:
Go Sidecar Layer (uploader.go):
- Signal Handling: Listen for SIGINT and SIGTERM OS signals
- Worker Management: sync.WaitGroup tracks all worker goroutines
- Coordinated Shutdown:
- Stop accepting new jobs immediately on shutdown signal
- Close job queue to signal workers
- Wait for all in-flight jobs to complete
- Clean resource cleanup and logging
- EOF Handling: Gracefully handle stdin closure (normal termination)
Python Application Layer (main.py, modules/ui/main_window.py, modules/sidecar.py):
- Window close event handling via
WM_DELETE_WINDOWprotocol handler - File > Exit menu performs graceful shutdown
- Signal handlers for
SIGINT(Ctrl+C) andSIGTERMin main.py - Component-level shutdown methods:
AutoPoster.stop()- Stops forum posting thread with 3-second timeoutRenameWorker.stop()- Stops gallery rename worker with 2-second timeoutUploadManager.shutdown()- Unregisters event listeners and cleans up threadsSidecarBridge.shutdown()- Gracefully terminates Go sidecar process- Closes stdin to signal exit
- Waits 5 seconds for graceful termination
- Force kills if necessary (SIGTERM → SIGKILL)
- Upload cancellation - In-progress uploads stopped cleanly via cancel_event
- ThreadPoolExecutor cleanup - Thumbnail executor properly shut down
- Resource cleanup:
- All background threads properly joined with timeouts
- Event queues unregistered from sidecar bridge
- Go subprocess terminated cleanly
- Log window closed if open
Combined Benefits:
- No job loss during shutdown from either application exit or system signal
- Uploads complete before exit
- Container and systemd friendly
- No orphaned goroutines or threads
- Clean exit codes
- Fast exit (worst case ~12 seconds with all timeouts)
- Prevents resource leaks (threads, processes, file handles)
- Ensures data integrity (no partial writes)
- Cross-platform support (Windows, Linux, macOS)
🔧 Fixed
Code Quality Improvements (2026-01-10 - 2026-01-13)
- Fixed typo:
thumb_size_contaner→thumb_size_container - Added alt text to README badges for accessibility
- Extracted magic numbers to named constants:
UI_CLEANUP_INTERVAL_MS = 30000- HTTP timeout constants in uploader.go
- Centralized file extension validation
- Improved error messages in sidecar.py
- Ran
go mod tidyfor dependency cleanup - Fixed 3 golangci-lint errcheck warnings in test code
Feature Completions (2026-01-10)
- Implemented tooltip functionality (ToolTip class in schema_renderer.py)
- Implemented Pixhost gallery creation API (createPixhostGallery)
- Implemented Pixhost gallery finalization with PATCH requests
- Added Python API wrappers (create_pixhost_gallery, finalize_pixhost_gallery)
- Made service validation dynamic via plugin discovery
- Added max file size validation and enforcement
🚀 Improved
Configuration & Validation (2026-01-10)
- JSON Schema Validation: Added comprehensive validation for user_settings.json
- Service name validation with enum
- Worker count limits (1-20)
- File size limits with min/max
- Path validation for directories
- Boolean and numeric type validation
- Custom Validation Rules:
- Upload size must be in ['Small', 'Medium', 'Large', 'Original']
- Gallery validation for Pixhost service
- Path existence checks
- Helpful error messages
- Added Dependencies: jsonschema==4.23.0
Documentation (2026-01-10)
- Added HTTP client thread safety documentation
- Documented rate limiting implementation
- Updated REMAINING_ISSUES.md with completion status
[1.0.5] - 2026-01-11
🔧 Fixed
Critical Bug Fixes
- PyInstaller Plugin Discovery and Bundling
- Fixed image host dropdown not working in release builds
- Primary Issue: Plugin modules were not being bundled by PyInstaller at all
- Secondary Issue: Plugin discovery code used filesystem paths instead of module introspection
- Build Script Fixes:
- Added
--collect-submodules modules.pluginsto bundle all plugin modules - Added explicit
--hidden-importfor each plugin (imx, pixhost, vipr, turbo, imagebam, imgur) - Updated
build_uploader.batfor Windows local builds - Updated
.github/workflows/release.ymlfor CI/CD builds (all platforms)
- Added
- Code Fixes:
- Replaced filesystem-based discovery (
Path.glob) withpkgutil.iter_modules - Plugin discovery now works correctly in both development and PyInstaller builds
- Replaced filesystem-based discovery (
- Impact: Users can now select different image hosts from the dropdown in release builds
[1.0.4] - 2026-01-11
✨ Added
Enhanced Release Automation
-
Modern GitHub Actions Release Workflow
- Upgraded from deprecated
actions/create-release@v1tosoftprops/action-gh-release@v2 - Added workflow_dispatch support for manual release triggering
- Intelligent CHANGELOG.md extraction for release notes
- Automatic artifact collection and publishing
- Build caching for faster releases (Go modules + pip)
- Upgraded from deprecated
-
Comprehensive Release Documentation
- New
RELEASE_PROCESS.mdguide with step-by-step instructions - Release checklist and best practices
- Troubleshooting guide for common release issues
- Rollback procedures for critical issues
- Security considerations and verification steps
- New
-
Release Template
.github/RELEASE_TEMPLATE.mdfor consistent release notes- Structured sections for all change types
- Performance metrics template
- Installation and verification instructions
🚀 Improved
Release Workflow Enhancements
-
Better Artifact Organization
- Separate build artifacts for each platform
- Consolidated release asset preparation
- Clearer naming for cross-platform binaries
- Improved checksum file organization
-
Build Verification
- Critical: Sidecar bundling verification now fails build if not detected
- Pre-build verification ensures Go sidecar exists before PyInstaller runs
- Post-build size verification (40MB minimum) ensures sidecar was bundled
- Enhanced error messages with debug information for troubleshooting
- Better artifact validation before publishing
-
Performance
- Parallel platform builds (Windows, Linux, macOS)
- Go modules caching reduces build time by ~60%
- Pip caching for faster Python dependency installation
- Artifact retention optimization (5 days for builds, 1 day for notes)
📝 Changed
Workflow Structure
- Reorganized release workflow into distinct jobs:
prepare-release- Version and release notes extractionbuild-windows- Windows build with PyInstallerbuild-linux- Linux build with PyInstallerbuild-macos- macOS build with PyInstallerpublish-release- GitHub Release creation
Release Notes Extraction
- Automatic extraction of version-specific content from CHANGELOG.md
- Falls back to git log if CHANGELOG section not found
- Improved parsing for Keep a Changelog format
- Better error handling for malformed CHANGELOG entries
🔒 Security
Release Security Improvements
- SHA256 checksums generated for all artifacts
- Checksums included in release assets
- Documented verification process for users
- No secrets exposed in workflow logs
📚 Documentation
Updated Documentation
- README.md enhanced with release automation section
- RELEASE_PROCESS.md comprehensive guide added
- RELEASE_TEMPLATE.md for maintainers
- Workflow dispatch instructions
- Best practices and troubleshooting
[1.0.0] - 2025-12-31
🎉 First Official Release
This release marks the first production-ready version with comprehensive stability, security, and quality improvements.
✨ Added
Upload Features
- Automatic Retry with Exponential Backoff
- Failed uploads now retry automatically up to 3 times
- Exponential delays: 2s, 4s, 8s between attempts
- Clear user feedback during retry process
- Detailed error messages showing attempt counts
Logging & Diagnostics
-
Structured Logging with Logrus
- JSON-formatted logs for better parsing and analysis
- Contextual information (file, service, worker ID)
- Separate log levels (Info, Warn, Error, Debug)
- Timestamp and structured fields for all operations
-
Build Diagnostics
- test_side...