Repository navigation
Releases
v1.1.0
Type a path in the file panel. / in the panel's top bar (or Ctrl+L) swaps the
breadcrumbs for a path box that behaves like a shell: Tab completes, ↑↓ pick a
suggestion, Enter goes, ~ and relative paths work, and an empty box lists recently
visited directories. Typing a file's path opens its directory with the file selected.
Getting to /run/media/deck/… no longer takes six clicks.
Behaviour change: the shell's locale now follows your system instead of being forced to
Chinese. LANG inside the terminal was hardcoded to zh_CN.UTF-8, so every user got a
Chinese-speaking ls, git and man regardless of the seven UI languages. It now
resolves from the plugin setting, then $LANG, then the desktop's own locale
(~/.config/plasma-localerc), then /etc/locale.conf, falling back to C.UTF-8; only
UTF-8 locales the system has actually generated are accepted. A Terminal language
dropdown in the QAM panel makes it switchable without editing files. It applies to new
sessions only — tmux fixes a session's environment when the session is created.
Fixes
- Clicking Copy on the on-screen key bar with nothing selected threw a
TypeError
instead of showing a message (avardeclaration shadowed the translation helper). - Dragging a protected location (your home directory, a mount point) onto another folder
in the file panel moved it. The guard existed but was only wired into delete, despite
its own documentation saying it stopped exactly this. - A session name with a trailing newline was accepted, producing a tmux session that was
invisible in the session list and impossible to close while still occupying one of the
24 slots. Content-Dispositionfor a filename ending in a backslash produced an unterminated
quoted-string, which strict parsers read as swallowing the rest of the header.- The idle auto-stop could silently fail to run: the shutdown task was created without
keeping a reference, and the event loop only holds a weak one. - The PWA manifest hardcoded Chinese app names for every language.
Development
- CI now runs the build, type check, ESLint, Ruff and the unit tests on every push and
pull request; releases verify that the tag matchespackage.json. - New
tests/unit.py: 268 pure-function checks that run anywhere, covering path handles,
session-name namespacing, locale resolution, path completion and the same-origin check.
The 127 end-to-end checks still need a real Deck; several of them turned out to pass
regardless of whether the code worked, and were rewritten to actually test what their
names promise. - Source comments are now in English.
v1.0.1
Licensing fix, no functional changes.
bin/web/term.js concatenates the minified xterm.js UMD bundles, which carry no copyright
headers of their own — so the distributed file was missing the notices MIT requires. The build
now reads the license texts out of node_modules and
- prepends them to
term.jsas a banner, so the file carries its notices even on its own, and - emits
THIRD-PARTY-NOTICES.mdcovering everything bundled intoterm.jsanddist/index.js
(xterm.js and its four addons,@decky/api,qrcode-generator,react-icons,tslib).
Both the release archive and deploy.sh now ship that file. Two end-to-end checks guard it.
v1.0.0
First public release.
A full Steam Deck terminal in any browser, equivalent to SSH. Scan a QR code and you're in;
no client to install. Sessions live in tmux, so disconnects, sleep and closing the browser
don't interrupt anything.
What's in it
- Real PTY —
pty.fork()+execve, interactive login shell, sonvmand.bashrcload
normally.vim,htop,claudeand other full-screen TUIs work properly. - Persistent, independent sessions — one tmux session per browser tab. Close the browser and
the processes keep running; reconnect and you're back. Two windows don't mirror each other. - Copy & paste like a real terminal — copy on select, right-click / middle-click to paste, no
confirmation dialogs.Ctrl+Cis always an interrupt. OSC 52 lets vim and tmux write straight to
the browser clipboard. - File transfer by dragging — drag between your own file manager and the Deck. Drop onto the
terminal and it lands in whatever directory you'recd'd into, with the names appended to the
command line. Directory transfers are a single streamed request; deletes go to the Trash. - 7 languages — English, 简体中文, 日本語, Deutsch, Français, Español, Русский. Both the QAM
panel and the browser pages follow your system language and fall back to English. - Faithful and fast — 24-bit color, Unicode 11 widths (CJK and box drawing line up), zero Esc
delay, WebGL rendering, median keystroke round-trip ~1.3 ms over loopback. - Encrypted by default — self-signed HTTPS, 6-digit PIN with rate limiting, optional 30-day
device memory. Runs asdeck, no root.
Install
Decky → Settings → Developer Mode → Install Plugin from URL, and paste the decky-webterm.zip
link below. Or download it and unzip into ~/homebrew/plugins/.
Verified on Decky Loader 3.2.6 / SteamOS. 109 end-to-end checks pass.