- Add touch gestures for relative mouse mode, including tap, drag, long press, double-tap drag, and two-finger scrolling.
- Improve absolute mouse touch handling and prevent black letterbox areas from generating remote mouse events.
- Fit H.264 and MJPEG screens with contain scaling and disable browser touch handling on the screen elements.
- Move golang.org/x/sys to the direct dependency list.
* fix(ota): isolate updates in persistent workspaces
Stage online and offline update archives under /root/.kvmcache/nanokvm-update-* and validate storage, manifests, and archive contents before changing the installed application.
* fix(ota): harden storage safety and release gates
Preserve the last rollback backup when update storage is insufficient, and verify the actual application mount point before installation.
Move the shared transfer sentinel from /tmp to /run, enforce device package limits in release verification, and run that verification in package CI.
Upgrade Vite to 8.2.0 and @vitejs/plugin-react to 6.0.5.
Use Vite's native tsconfig path resolver and remove vite-tsconfig-paths.
Verified with pnpm build and pnpm lint (existing warnings only).
Layer the frontend toolchain on top of the existing release builder
image so a single container covers Go, C support-layer and web
development, with the builder image remaining the single source of
truth for the cross toolchain, Go and MaixCDK.
- Mount the workspace at /home/build/NanoKVM, where the Makefile and
support/sg2002/build expect it, and resync MaixCDK components via
update_lib on create so C builds never use stale sources
- Install Node from official dist tarballs (integrity-checked, pinned
to the major used by CI), with NODE_DIST_MIRROR / NPM_REGISTRY /
BASE_IMAGE build args for restrictive or mirrored corporate networks
- Export the MaixCDK virtualenv via remoteEnv so non-interactive
processes (tasks, extensions, exec) get it too; make
updateRemoteUserUID explicit since the published builder image bakes
the CI runner's uid
- Run pnpm non-interactively during post-create (no TTY) and give the
skeleton-less home a standard ~/.profile -> ~/.bashrc chain
- Make the web toolchain convention explicit via package.json engines
(Node >= 22, pnpm >= 11, matching CI) and document it in web/README
- Document the dev container in the README, point server/README at the
container flow that works on any host OS, and ignore .pnpm-store/
+ Add persistent custom update server configuration, authenticated URL support, manifest validation, and the settings UI.
+ Keep application updates rebootless by coordinating video shutdown, migration-time service startup, and online/offline service restarts.
+ Localize the custom update server workflow across all supported languages.
- Add decode-driven flow control and bounded GOP-aware queues to prevent stale H.264 frames from accumulating in TCP and WebSocket buffers.
- Isolate slow clients with dedicated writer goroutines, write deadlines, and safer connection lifecycle handling.
- Move the Direct H.264 socket into the worker, simplify the low-latency decode path, and improve reconnect behavior.
Groundwork for building outside an interactive terminal.
- IMAGE_NAME becomes overridable so a prebuilt image can be used instead
of building one locally
- docker run no longer hardcodes -it on the app and support recipes:
allocating a TTY fails where there is none. shell stays interactive
- install patchelf, which server/build.sh needs to set the RPATH on the
server binary
The script has no error handling of its own, so these all pass silently.
- update_lib exited 1 after succeeding, so callers could not chain it
- a failed maixcdk build printed "Build Error!" and exited 0, letting a
caller carry on with no artifacts
- add_to_kvmapp did the same when the source did not exist
- the copies in update_lib were unchecked; since update_lib is what keeps
the SDK components in sync with the source tree, a silent failure there
yields libraries built from stale sources
The USB network gadget (rndis.usb0 / ncm.usb0) is created without dev_addr or
host_addr, so the kernel picks a random MAC for both the device side and the
host side on every bind. S10uuid later pins the device-side usb0 via
'ip link set', but the host_addr -- the MAC the attached PC's RNDIS/NCM adapter
uses -- stays random and changes on every re-enumeration/reboot. The host then
registers a brand-new network adapter each time, piling up stale adapters/MACs
(e.g. ~10 after a few reboots) and breaking anything that keys off the MAC.
Derive both MACs from the chip UID (same scheme S10uuid already uses for eth0
and usb0), before binding the gadget:
dev_addr = 48:da:35:6e:<uid>
host_addr = 48:da:35:6d:<uid>
Verified on a NanoKVM Cube: host_addr went from random a6:3f:5d:8a:7d:52 to a
stable 48:da:35:6d:26:62, identical across two reboots.
Fixes#740
Co-authored-by: BeaconCat <BeaconCat@users.noreply.github.com>
Cancel PicoClaw start/readiness waits when MCP takes control, clear held manual input state after failed release reports, and keep paste duration below the control-mode wait budget.
Also add MCP copy failure translations and avoid reconnect effect churn when the locale changes.
Add the MCP settings view and frontend API bindings for configuring remote-control access.
Expose AI-control ownership state in PicoClaw, lock conflicting keyboard input paths, and preserve chat state when control is released.
Add an MCP Streamable HTTP server with token authentication, screenshot capture, keyboard, and mouse tools.
Introduce shared control-mode and input-control coordination so MCP, PicoClaw, and local HID paths serialize ownership safely.
Integrate PicoClaw gateway/runtime control handoff with PID-managed startup and focused unit coverage.
Move frame ownership and zero-copy VENC handling into the tracked MMF
and Vision sources instead of relying on a preload hook. Keep the sensor
name mapping aligned with middleware enums and release deferred VI frames
safely across encoder lifecycle changes.
OLED sleep settings are stored as seconds, but the kvm_system reader parsed the value into a uint8_t before assigning it to the uint16_t state field. Values above 255 seconds wrapped, so 5 min, 10 min, 30 min, and 1 hour did not behave as selected.
Parse the setting into a uint16_t-sized temporary value and terminate the read buffer before atoi so all configured durations up to 3600 seconds are preserved.
Closes#826
* feat(download): add sha256sum check and cancellable downloads
+ server/proto/download.go
+ add DownloadImageReq and sha256 argument
server/router/download.go
+ add cancel download router
server/service/download/service.go
+ sha256 decode and check
+ remove HEAD request
+ cancel download
* refactor(download): synchronize image and application transfers
sovel the the problem that image downloading and app downloading would conflict
at same time
* fix: optimized UI of image download and locale issue
* fix: locale
- Replace the Discussion community link with Discord
- Align terminal and script ordering in the menu and appearance settings
- Remove the divider before the leader key menu item
Normalize stored MAC addresses, avoid shell execution for ether-wake, handle missing WOL history gracefully, and improve the WOL menu display for named MAC entries.
Use client snapshots for stream fanout, reduce frame queue latency, expose backend ICE server configuration to the WebRTC client, and clean up disconnected WebRTC clients more aggressively.