Skip to content

Releases

v1.1.0

Choose a tag to compare

@github-actions github-actions released this 10 Aug 16:33

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 (a var declaration 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-Disposition for 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 matches package.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

Choose a tag to compare

@github-actions github-actions released this 09 Aug 16:40

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.js as a banner, so the file carries its notices even on its own, and
  • emits THIRD-PARTY-NOTICES.md covering everything bundled into term.js and dist/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

Choose a tag to compare

@github-actions github-actions released this 09 Aug 16:08

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, so nvm and .bashrc load
    normally. vim, htop, claude and 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+C is 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're cd'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 as deck, 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.