Releases: MapleSyrupLover/BuzzInstaller
Release list
Da fix
Here's the release description for the changes:
BuzzInstaller v1.1.1
Major Change: Onedir Distribution (No More _MEI Temp Files)
BuzzInstaller now builds as a onedir distribution instead of a single-file executable. This eliminates the PyInstaller _MEIxxxxx temporary extraction/cleanup problem entirely.
What changed:
- The app is now distributed as
BuzzInstaller.zipcontaining the full application directory (BuzzInstaller.exe,_internal/,PySide6/, Qt DLLs, plugins, etc.) - No more "Failed to remove temporary directory" warnings
- No more
_MEI*folders being created in%TEMP%when launching - The background process (
BuzzInstaller.exe --background) now runs directly from the installed directory — no handoff launcher needed - The installer (
BuzzInstallerInstaller.exe) now downloads and extracts the entireBuzzInstaller.zipdirectory, preserving all DLLs, Qt plugins, and Python runtime files
Installation layout:
C:\BuzzInstaller\
BuzzInstaller.exe
_internal\ (all Python runtime, PySide6, Qt6*.dll, plugins)
bz.cmd
Hotkey: Selected Text Only (Checkbox Option)
Removed clipboard-based downloading. The global hotkey now always reads the highlighted text — no more clipboard mode.
What changed:
- The "Hotkey Mode" dropdown (Clipboard Mode / Selected Text Mode) is replaced with a simple checkbox: "Download from selected text"
- The hotkey reads whatever text you have highlighted (using Ctrl+C simulation that preserves your full clipboard)
- If the highlighted text is a valid
BZ://code, it downloads automatically
Installer Improvements
- The installer now prefers the
BuzzInstaller.zipbundle asset over the legacy single.exe - Fresh installs and updates extract the entire onedir directory
- Deletion removes the entire installation directory (not just the exe)
Verified
- All 80+ tests pass
- Background process starts and stays running from the onedir distribution
- No
_MEI*directories created on launch BuzzInstaller.exe --version→BuzzInstaller 1.1.1
HUGE OPTIMIZATIONS!
BuzzInstaller 1.1.0 — Release Notes
Executive Summary
This release delivers two major improvements: a 81% reduction in executable size for both BuzzInstaller.exe and BuzzInstallerInstaller.exe, and critical stability fixes for the PyInstaller onefile cleanup, background process lifecycle, and Windows shortcut integration.
1. Executable Size Comparison
BuzzInstaller.exe
| Metric | Before | After | Change |
|---|---|---|---|
| Size (bytes) | 256,744,993 | 49,408,266 | -207,336,727 |
| Size (MiB) | ~245 MiB | ~47 MiB | -81% |
BuzzInstallerInstaller.exe
| Metric | Before | After | Change |
|---|---|---|---|
| Size (bytes) | ~250,000,000 | 46,773,568 | -203,226,432 |
| Size (MiB) | ~240 MiB | ~45 MiB | -81% |
Combined savings: ~410 MB across both executables
Why was it so large?
Both build scripts used --collect-all PySide6, which instructs PyInstaller to bundle every PySide6 module and plugin — including dozens of optional Qt modules that neither application uses:
- QtWebEngine (~70 MB) — full Chromium browser engine
- Qt3D (~30 MB) — 3D rendering framework
- QtQuick/QtQml/QtDeclarative (~20 MB) — QML engine
- QtCharts + QtDataVisualization (~15 MB) — data visualization
- QtPdf (~10 MB) — PDF rendering
- QtBluetooth/QtNfc/QtSerialPort/QtSensors (~15 MB) — hardware interfaces
- QtQuick3D/QtSpatialAudio/QtMultimedia/QtWebSockets (~25 MB) — multimedia/3D/audio
- Plus ~30 more optional modules
Neither BuzzInstaller nor BuzzInstallerInstaller uses any of these — both are pure QtWidgets applications (buttons, labels, progress bars, file dialogs).
What changed
src/BuzzInstaller/build/build_exe.py and src/BuzzInstallerInstaller/build/build_installer.py:
- Removed
--collect-all PySide6— the primary fix - PyInstaller's standard
hook-PySide6.pynow collects only the actually imported modules (QtWidgets, QtCore, QtGui, QtNetwork) plus the required Qt plugins (platforms, imageformats, styles) - Removed unnecessary hidden imports (
PySide6.QtXml,PySide6.QtMultimedia) from BuzzInstaller - Added
system.background_launcherto hidden imports (new module from the handoff fix) - No functionality was removed — no modules were excluded because they were large; they were simply no longer force-collected when not imported
2. Fixes in this Release
Fix 1: PyInstaller "_MEI" Temporary Directory Cleanup Warning
Problem: When BuzzInstaller.exe (PyInstaller onefile) spawned --background, the child's bootloader inherited the parent's _MEIPASS2 environment variable and reused the parent's _MEI* extraction directory. The background process is intentionally long-lived, so it kept Qt DLLs loaded from the parent's directory — locking it. When the foreground exited, PyInstaller failed with:
Failed to remove temporary directory:
C:\Users\elial\AppData\Local\Temp\_MEIxxxxxx
Solution — background handoff mechanism:
src/BuzzInstaller/system/background_launcher.py (NEW):
- A short-lived intermediary that waits for the foreground process to fully exit (via
WaitForSingleObject— no fixed delays, no busy-wait) - Imports ONLY the standard library — holds no files from the parent's
_MEI*directory - Strips
_MEIPASS2from the environment when launching the final--backgroundprocess
src/BuzzInstaller/system/background_service.py (MODIFIED):
- In frozen mode,
--backgroundis never spawned directly from the foreground - Instead,
_launch_background_via_launcher()uses PowerShell as the intermediary (sincesys.executableis the bundled exe, not python): waits viaWait-Processfor the foreground PID, sets$env:_MEIPASS2 = $null, then launchesBuzzInstaller.exe --backgroundwith-WindowStyle Hidden - Non-background launches (download UI) still spawn directly with
_MEIPASS2stripped - Source mode still spawns directly (no launcher needed)
Fix 2: Clean Shutdown Behavior
src/BuzzInstaller/core/buzzheavier_api.py (MODIFIED):
- Added
BuzzHeavierAPI.close()to release therequests.Session(connection pools/sockets) before process exit - Fixed
get_download_url()to close HTTP responses withresp.close()in afinallyblock
src/BuzzInstaller/main.py (MODIFIED):
run_upload(): Addedservice.api.close()in worker'sfinallyblock; thread join afterapp.exec()run_download(): Addedworker_doneEvent,service.api.close()infinallyblock; thread join afterapp.exec()- Background mode: shutdown logging around
svc.run()andsvc.stop() __main__: exit logging
Fix 3: Windows Shortcut Creation
src/BuzzInstallerInstaller/shortcut.py (NEW):
create_shortcut(),delete_shortcut(),get_shortcut_target()using PowerShell's WScript.Shell COM — creates real.lnkfiles, not text
src/BuzzInstallerInstaller/installer.py (MODIFIED):
create_shortcut_for_installed()createsC:\BuzzInstaller\BuzzInstaller.lnkafter install/update — non-fatal on permission failuredelete_buzzinstaller()removes the shortcut, and only removesC:\BuzzInstallerif empty (unrelated files preserved)
3. Verification Results
| Check | Result |
|---|---|
| Version tests | ✅ 10/10 PASS |
| Installer tests | ✅ 24/24 PASS |
| Improvements tests | ✅ 19/19 PASS |
| Shortcut tests | ✅ 13/13 PASS |
| Background handoff tests | ✅ 8/8 PASS |
| Total tests | 74/74 PASS |
| BuzzInstaller.exe --version | ✅ "BuzzInstaller 1.1.0" |
| BuzzInstaller.exe --background | ✅ Idle event loop running |
| BuzzInstallerInstaller.exe UI | ✅ Launched, real Qt GUI (69 MB working set) |
| Build compile checks | ✅ All modified files compile |
NOTE: ADD bz.cmd TO "C:\WINDOWS\System32\bz.cmd" FOR THE BZ CLI
BuzzInstaller FIXES
Summary of All Changes
Part 1: PyInstaller _MEI Cleanup Fix (3 files)
Root cause: When BuzzInstaller.exe (PyInstaller onefile) spawns the --background process via subprocess.Popen([sys.executable, "--background"]), the child inherits the _MEIPASS2 environment variable set by the parent's C bootloader. The child's bootloader sees _MEIPASS2 already set and reuses the parent's _MEI* extraction directory instead of extracting its own copy. The background process is intentionally long-lived, keeping Qt DLLs loaded from the parent's _MEI* directory — locking it. When the foreground exits, PyInstaller's cleanup fails.
1. src/BuzzInstaller/system/background_service.py — PRIMARY FIX
- Strips
_MEIPASS2from the child's environment when spawning subprocesses while frozen, forcing the child to extract its own_MEI*directory.
2. src/BuzzInstaller/core/buzzheavier_api.py — NETWORK CLEANUP
- Added
BuzzHeavierAPI.close()to release therequests.Session(connection pools/sockets). - Fixed
get_download_url()to properly close HTTP responses withresp.close()in afinallyblock.
3. src/BuzzInstaller/main.py — SHUTDOWN LOGGING + CLEANUP
run_upload(): Addedservice.api.close()in worker'sfinallyblock, thread join afterapp.exec().run_download(): Addedworker_doneEvent,service.api.close()infinallyblock, thread join.main()background mode: Added shutdown logging aroundsvc.run()andsvc.stop().__main__: Added exit logging.
Part 2: Shortcut Creation (2 new files, 1 modified)
4. src/BuzzInstallerInstaller/shortcut.py — NEW FILE
create_shortcut(exe_path, shortcut_path)— Creates/updates a real.lnkfile using PowerShell's WScript.Shell COM object.delete_shortcut(shortcut_path)— Removes a shortcut.get_shortcut_target(shortcut_path)— Reads the target of an existing shortcut.
5. src/BuzzInstallerInstaller/installer.py — SHORTCUT INTEGRATION
create_shortcut_for_installed()— CreatesC:\BuzzInstaller\BuzzInstaller.lnkafter install/update.delete_buzzinstaller()— Removes the shortcut on delete (only removesC:\BuzzInstallerdir if empty).Installer.run()— Creates shortcut after successful install/update (best-effort, non-fatal on failure).
6. src/BuzzInstallerInstaller/tests/test_shortcut.py — NEW FILE
- 13 tests covering: create, update, target path, working directory, permission failure, delete, missing shortcut, installer integration, unrelated file preservation.
Test Results
- test_version.py: 10/10 PASS
- test_installer.py: 24/24 PASS
- test_improvements.py: 19/19 PASS
- test_shortcut.py: 13/13 PASS
- Total: 66/66 tests PASS
- One-file PyInstaller build: SUCCESS (256 MB executable)
1.0.1
Release: v1.0.1 — Settings Label Cleanup
What's New
This patch release cleans up the Settings window label for dark mode.
Changes
- Settings UI — The dark mode checkbox label was shortened from
"Dark mode (system = auto)"to just"Dark mode". The three-state behavior is unchanged (checked = dark, unchecked = light, partially checked = system auto) — only the visible text was simplified.
Assets
BuzzInstaller.exe— the main application (v1.0.1)BuzzInstallerInstaller.exe— the separate installer/updater
Versioning
Tag: v1.0.1 — follows the vMAJOR.MINOR.PATCH convention.
AUTOINSTALL
Release Description: v1.0.0 - Initial Release with Installer/Updater
What's New
This release introduces BuzzInstallerInstaller.exe - a separate, lightweight installer & updater that installs and keeps BuzzInstaller up to date from GitHub Releases.
BuzzInstallerInstaller Features
- One-click Install — Downloads the latest release, installs to your chosen location, registers the BZ:// protocol and Explorer context menu, and launches BuzzInstaller.
- Installation Location Selection:
- Install to PATH — installs to
%LOCALAPPDATA%\BuzzInstaller\and adds it to your user PATH sobzworks from any terminal (no admin required). - Custom directory — use the Browse button to pick any folder.
- Install to PATH — installs to
- Automatic Version Check — checks GitHub Releases on startup and displays the current state (not installed / up to date / update available / newer installed).
- Semantic Version Comparison —
1.10.0correctly sorts newer than1.9.0. - Safe Replacement — downloads to a temp file first, verifies it, waits for BuzzInstaller to close, then replaces. Never deletes the old executable before the new one is ready.
- Download Progress — shows percentage and size (e.g.
180 MB / 264 MB). - Delete BuzzInstaller — removes the executable, PATH entry, and Windows integration with confirmation.
- No Downgrades — won't downgrade if your installed version is newer than the latest release.
BuzzInstaller Changes
- Settings label updated: "Dark mode" (removed "(system = auto)").
- Config save hardened against
PermissionError— cross-process lock, retry mechanism, atomic writes, preserves existing config on failure.
Assets
BuzzInstallerInstaller.exe— the separate installer/updaterBuzzInstaller.exe— the main application
Versioning
Releases use the vMAJOR.MINOR.PATCH convention (e.g. v1.0.0). The GitHub Release tag is the authoritative source for the newest published version.
Testing
53 tests pass across version comparison, installation detection, error handling, PATH management, metadata, deletion, and config concurrency.