Changelog
2026-07-07v0.15.1— Parallel Daemons
- Fixed: Multi-project daemon port clash — launching
kandownfrom a second project folder no longer kills the first project's web daemon and steals its port. Each project now gets its own daemon on an auto-allocated port (A=2048, B=2049, C=2050, …), so multiple kandown boards can finally run in parallel.- Root cause #1:
listenOnAvailablePort()unconditionally killed whatever kandown sat on the default port — even when it belonged to a different project. The preemptive stale check now only reclaims same-project zombies; other-project daemons fall through to the port-scan loop (which already skips them). - Root cause #2: the parent↔child startup handshake deleted the freshly-written daemon metadata on any transient HTTP fetch failure. Node's
fetch(undici) doesn't recover from the initialECONNREFUSEDwindow and reported healthy local daemons as down for seconds, orphaning them with a spurious "Daemon failed to start".getDaemonStatus()is now non-destructive on transient fetch failures (metadata is removed only on a real conflict), and startup detection uses a dependency-free TCP probe (net.createConnection) instead of HTTP. - Port range widened 2048–2060 → 2048–2150 (103 slots); startup timeout 5s → 8s.
- Root cause #1: