Two related improvements requested while testing the private fork: 1. Custom TCP/QUIC listen ports (SidecarConfig.tcpListenPort, .quicListenPort). With ephemeral ports, the daemon's peer-listen port changes at every restart, which makes port-forwarding on a home router useless after the first daemon stop. Pinning these keeps the same port across restarts so other private-network nodes can dial in reliably. Backend uses the configured port if Some, falls back to pick_port_skip otherwise. Frontend exposes two inputs in Settings → Daemon configuration with a help line explaining when to fill them. 2. Daemon-failure banner in App.vue. The previous behaviour was silent: a click on \"Start daemon\" that hit a backend error only flipped the sidebar dot to red, with no message visible. Now an inline banner at the top of the main content area shows the error, plus a \"Go to Settings\" shortcut when the message mentions a network config issue.
4.2 KiB
4.2 KiB
Changelog
All notable changes to this fork are documented here. Format follows Keep a Changelog, version numbers follow Semantic Versioning.
This fork tracks syoul/Mycell-UI (the public-network variant) as upstream. Bugfixes from upstream are cherry-picked; this changelog only records changes specific to the private-network track.
Unreleased
Added
SidecarConfig.tcpListenPortandSidecarConfig.quicListenPort(Option): pin the daemon's peer-listen ports across restarts so they can be reliably port-forwarded on a home router.Nonekeeps the previous ephemeral behaviour.- Two input fields in Settings → Daemon configuration to expose them, with an explanation of when to set them.
- App.vue surfaces a top banner when
phase === 'error'with the daemon error message and a shortcut "Go to Settings" button.
0.1.0 — 2026-04-27
Forked from Mycell-UI@5229e2c ("feat(packaging): pre-spawn cleanup wrapper for clean restarts").
Added
- Bundling of the
mycelium-privatedaemon (separate upstream release tarball —mycelium-private-{triple}-unknown-linux-musl.tar.gz) instead of the publicmycelium. SidecarConfig.networkNamefield (UTF-8, 2..=64 bytes — public, agreed across all nodes of the same overlay).- Network key management:
network_key_status,network_key_generate,network_key_import,network_key_export,network_key_deleteTauri commands. Keys are 32 random bytes from the OS RNG, stored atapp_data_dir/network_key.binwith mode0600. - "Private network" section in Settings at the top: name input, generate / reveal-hex / import / delete buttons, configured / missing status badge.
- Pre-flight check in
sidecar::start: refuses to spawn the daemon without a non-empty network name AND an existing key file. Surfaces a clear error rather than lettingmycelium-privatefail mid-startup. mycellium-bootstrap-privatecleanup wrapper kills bothmyceliumandmycelium-privateorphans on each spawn, since either would block UDP/9650 (multicast discovery) and TCP/8990 (hardcoded JSON-RPC port).
Changed
- App identifier:
tech.threefold.mycellium-ui→tech.threefold.mycellium-ui-private. - Cargo crate name + lib name:
mycellium_ui_lib→mycellium_ui_private_lib. - Display:
Mycellium UI→Mycellium UI Private. Sidebar shows "Mycellium Private" with an amber accent. .debpackage name:mycellium-ui→mycellium-ui-private. Distinct binary at/usr/bin/mycellium-ui-private. The two apps coexist on the same machine.- polkit action ID:
tech.threefold.mycellium-ui.bootstrap→tech.threefold.mycellium-ui-private.bootstrap. Path annotation points at/usr/bin/mycellium-bootstrap-private. - Default peer list is now empty: a private network has no Threefold-operated seed; the user must explicitly add bootstrap peers they control.
- The "Static peers" textarea hint in Settings changed from "tcp://188.40.132.242:9651" to "tcp://your-node.example.org:9651".
- README rewritten to focus on the private-network model, key distribution flow, and the divergence policy from upstream.
Removed
- The two public Threefold seed peers from
SidecarConfig::default()(TCP 188.40.132.242:9651 and QUIC [2a01:4f8:212:fa6::2]:9651).
Inherited from upstream Mycell-UI@5229e2c
- Sidecar lifecycle via pkexec with elevated cleanup wrapper (
auth_admin_keepcached per session). - Ephemeral ports for the REST API, peer-listen TCP/QUIC, and Prometheus metrics endpoint.
- reqwest connection pool disabled (
pool_max_idle_per_host(0)) to dodge stale-connection errors on long-running sessions. - Short-poll inbox loop (workaround for the upstream HTTP serialization bug — see
docs-syoul/upstream-bug-http-serialization.mdin the public repo). - Status page surfaces the full overlay IPv6 (parsed from the daemon's
Node overlay IP:log line) in addition to the/64subnet. pkexec | policykit-1Depends alternative for compatibility with both Debian 12 (bookworm) and Debian 13 (trixie).