- scripts/package.py builds out/mudfish-decky-<version>.zip with the
mudfish-decky/ folder Decky expects (runtime files only).
- scripts/gitea_release.py creates release v<version> and uploads the zip,
skipping versions that already have a release.
- Jenkinsfile uses the organization folder's gitea-ysj7705 token.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Decky 3.3 often SIGKILLs plugins 5s after SIGTERM because its socket
listener spins on EOF and starves the event loop (seen for several
plugins). So:
- _unload/_uninstall run synchronously (an awaited worker thread could
never resume), and the daemon stop no longer waits.
- A transient systemd path unit watches the plugins folder; if this
plugin's folder stays gone for 20s it stops the daemon and deletes
/opt/mudfish and the plugin settings, then removes itself.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Install: download the latest package from mudfish.net, verify the
Makeself MD5, unpack the bzip2 tar ourselves (no installer script is
executed; path traversal and links rejected) into /opt/mudfish/<ver>.
- Update: checked at most daily; button-only; refused while the tunnel is
up; carries the saved login (.conf, .conf.db) into the new version,
restarts the daemon and keeps only the previous version.
- Remove: button with confirmation, and automatically when the plugin is
uninstalled: VPN off, daemon stopped, mudfish-tap removed,
/opt/mudfish deleted, plugin settings cleared.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
When autologin is rejected the panel offers '휴대폰으로 로그인 (QR)'. It opens
a 5-minute LAN relay to the launcher UI guarded by a one-time token (first
phone to open the QR URL is the only client allowed) and shows the URL as a
QR code. The relay closes as soon as a new session appears, on cancel, on
expiry, and on unload.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Detect resume (boottime-monotonic jump) and tear down the tunnel: on wake
NetworkManager drops Mudfish's relay route and all traffic black-holes.
- Turn the tunnel off on plugin unload (Deck shutdown/restart).
- One verified teardown path for disconnect, connect failure/timeout and
node-change failure; keep the route snapshot if tap0 stays up.
- Toggle can always turn off a stuck tunnel; status failure with tap0 up
is reported as an error, not off.
- Re-sign in once when the cloud rejects an expired jwt.
- Expire cached pings after 10 minutes.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Prepare signs in on load (never connects), system CA bundle for HTTPS,
root-owned deploy extraction.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>