Repository navigation
First public release on this repo. Performance + correctness pass focused on long-term maintainability and the start/stop user flow. No new features over 0.3.0; this is a hardening release.
Install
Pick one:
Stackpilot_0.3.1_x64_en-US.msi— standard Windows installerStackpilot_0.3.1_x64-setup.exe— NSIS installer (smaller, same product)
Requires Windows 10 1803+ (for WebView2). Scoop is bootstrapped on first run if it's not already installed.
Highlights
Bugs fixed
- TOCTOU on
running_pidacross scoop install/update/uninstall/bootstrap andpresets_apply— concurrent invokes could both pass the busy check. - TOCTOU on
services_start— concurrent same-key starts could both runinit_step(Postgresinitdbcorrupting the data dir). service_logs::tailpartial-line drop trimmed the wrong end of a truncated read.services_stopnow refuses with a clear error when a start is in flight;services_restartsurfaces both errors when the start step fails.validate_config_pathnow canonicalizes viadunceand walks the deepest existing ancestor — symlinks/junctions can't escape the Scoop root.- Frontend log + service-tail polling re-checks its cancellation flag after each awaited IPC.
Performance
- One shared
reqwest::Clientacross health probes + scoopsearch (was building TLS state per call). CatalogCachehands outArc<Vec<AppEntry>>instead of cloning the 3,800-entry vector on every keystroke.services_listtakes oneGetExtendedTcpTablesnapshot (was hitting the kernel ~3× per service).scoop_root()cached for the process lifetime; invalidated on bootstrap + refresh.- Operation log appends switch from O(n²) spread to in-place push + splice-trim.
- Polling pauses when the window is hidden to tray.
services_tail_logskips the read entirely whensize_bytesis unchanged.- 30-min wall-clock watchdog on the scoop subprocess.
Memory leaks
service_logs::reap_orphanscleans logs of uninstalled services.ssl::reap_orphanscleans cert + key files for hosts no longer referenced by any project.
Maintenance
- Extracted
crate::winutil(hide_console_*, PATHEXT-awarewhich) andcrate::http(shared client) modules. - Three scoop ops collapse into one
run_scoop_app_opbody. eprintln!→log::warn!;env_loggerinitialised at startup.- Rotating config-write backups (
<path>.{1,2,3}.bak) instead of clobbering a single.bak.
Full changelog: see CHANGELOG.md.