Releases: asadev/terminaldeck
Release list
v0.1.5
Install
macOS 12 or later, Apple silicon: open -arm64.dmg and drag the app
to Applications. There is no Intel Mac build — macOS 27 runs on none.
Windows 10 or later, x64: run -x64-setup.exe. There is no separate
ARM build; Windows on ARM runs the x64 one. The whole test suite runs
on a Windows runner and gates this installer — a red Windows test stops
the release rather than being waved through.
Neither build is signed. macOS will refuse the first launch: either
right-click the app and choose Open, or clear the quarantine flag:
xattr -dr com.apple.quarantine "/Applications/Terminal Deck.app"Windows SmartScreen will warn instead: choose More info, then
Run anyway. The -portable.exe needs no installation and cannot
update itself.
Terminal Deck runs agent CLIs; it does not bundle them. At least one of
Claude Code, Codex CLI or Gemini CLI needs to be installed and
authenticated already.
The app checks for new versions and installs them itself, so the
.zip and latest*.yml files are for the updater rather than for
you. SHA256SUMS.txt lists the checksum of every artifact below.
Full Changelog: v0.1.4...v0.1.5
v0.1.4
Install
macOS 12 or later, Apple silicon: open -arm64.dmg and drag the app
to Applications. There is no Intel Mac build — macOS 27 runs on none.
Windows 10 or later, x64: run -x64-setup.exe. There is no separate
ARM build; Windows on ARM runs the x64 one. The whole test suite runs
on a Windows runner and gates this installer — a red Windows test stops
the release rather than being waved through.
Neither build is signed. macOS will refuse the first launch: either
right-click the app and choose Open, or clear the quarantine flag:
xattr -dr com.apple.quarantine "/Applications/Terminal Deck.app"Windows SmartScreen will warn instead: choose More info, then
Run anyway. The -portable.exe needs no installation and cannot
update itself.
Terminal Deck runs agent CLIs; it does not bundle them. At least one of
Claude Code, Codex CLI or Gemini CLI needs to be installed and
authenticated already.
The app checks for new versions and installs them itself, so the
.zip and latest*.yml files are for the updater rather than for
you. SHA256SUMS.txt lists the checksum of every artifact below.
Full Changelog: v0.1.3...v0.1.4
v0.1.3
Remote access has never worked. It does now.
Not once, on any platform, in any build before this one.
Electron links BoringSSL, which ships 28 ciphers and not one of them is a
ChaCha. So createCipheriv('chacha20-poly1305', …) threw Unknown cipher, a
silent catch swallowed it, and every relayed handshake closed with nothing on
the wire and nothing in the log. The whole time, 3628 tests passed — because
vitest runs under plain Node, where the cipher exists.
The AEAD now comes from @noble/ciphers: the same code in every runtime, with
no "native when available" fast path, because a fallback means the suite
exercises one implementation and users run the other. npm test now runs the
sealed channel under Electron's own Node and fails the build if that ever
stops being true. Reverting the fix keeps vitest green and fails the probe in
nine places, which is the point.
Proven end to end since: an Android release build → live relay → a real
desktop. hostname answered the Mac, stty size on the Mac's own pty
confirmed the phone's resize, Ctrl-C interrupted a real sleep, and dropping
wifi and mobile data re-attached with a fresh connection id and no leaked
channel.
Knock-on fix: host identity used to validate its stored keypair by running
a handshake — so the bug above quarantined and regenerated a perfectly good
identity on every launch, orphaning every device you had paired. Pairing now
survives a restart.
See your Mac's localhost on your phone
Tap a port and the phone dials 127.0.0.1 on the Mac through the sealed
channel. It is a raw TCP byte pipe, not an HTTP proxy — so WebSockets, hot
reload, service workers and cookies all survive untouched. Save a file on the
Mac and the page reloads on the phone.
Only 127.0.0.1 is dialable; there is no field for a host and no code path
that builds one. Only ports something is listening on right now, minus the
app's own. And only after a person taps one — the tap is the consent, closing
the view is the revocation.
Start a session from the phone
Both phone clients have had a New Session button for a while, gated on a
create capability that no desktop ever advertised — so it could never appear,
and each client had invented its own frame shape against its own stand-in.
There is now one shape, {"t":"create"}, parsed and narrowed like every other
frame. The desktop advertises create only when its session layer can really
start one, and a session made this way is a real PTY from the same
startSession() the desktop's own button calls — same shell, same PATH, same
profile. A phone may name a folder only if the Mac is already offering it.
A session started from a phone now shows up on the desktop too: unfocused, with
an unread dot, so answering something on your phone never yanks the Mac out of
the terminal you were typing into.
(Both phone clients were also one byte off the wire spec — 80/48 where the
spec says 81/49 — and both stand-in hosts shared the bug, so the fixtures
agreed with each other and disagreed with reality. The stand-ins now import the
real framing instead of reimplementing it.)
The desktop speaks Apple's language
One sidebar, one toolbar, Settings bottom-left, liquid glass, both themes
first-class. Every page has a designed empty state now — the view's own glyph,
a title, the explanation, and the single thing to do next — instead of a bare
sentence floating in the middle of the window. Pages and Settings hold a
measure and centre it, so a wide display no longer parks everything in the
top-left corner beside an ocean of blank paper.
Three reachability allowlist entries came out and none went in:
CloseSessionConfirm, DebugPanel and FileViewer were each a setting that turned
nothing on. Hooks no longer offers two buttons called Refresh.
Roughly 87,800 fewer wake-ups a day
One shared renderer scheduler where N jobs cost one wake-up rather than N,
nothing armed at all while the window is hidden, and a panel that polled a
channel already pushing to it now subscribes instead.
The remote panel alone was a 500 ms interval — 172,800 wake-ups a day to move
labels that mostly change once a minute. Every one of those labels is a pure
function of now and one timestamp, so the moment it changes is computable,
and one wake-up scheduled for exactly that moment does the same job.
Windows, launched on Windows for the first time
The Windows installer has shipped since 0.1.2 having never been run. It has now
been run, and it did not work. Three bugs, all found in the first sixty
seconds:
whichwas spawned as a literal command. It is not a Windows command.spec.binwas spawned wherespec.spawnwas meant. An npm-installed agent
CLI answers a Windows PATH lookup with a.cmdshim, andCreateProcess
will not run a batch file — so a tab died with a bareFile not found:and
no message.- Three
{ ...process.env, PATH }sites lost against Windows' ownPathkey.
With both spellings present, which one the child reads is undefined.
31 Windows test failures became 0.
Every macOS build was shipping the whole repository
electron-builder's per-platform files: list replaces the root allowlist
rather than extending it, so the mac: block had no allowlist at all — and
electron-builder falls back to "everything except what is negated". Invisible
until ios/ and android/ existed, at which point the app reached 1.0 GB.
It is 287 MB now. The identical latent bug in the win: block is fixed in the
same pass, before it could be rediscovered the hard way.
Full detail in CHANGELOG.md.
Install
macOS 12 or later, Apple silicon: open -arm64.dmg and drag the app
to Applications. There is no Intel Mac build — macOS 27 runs on none.
Windows 10 or later, x64: run -x64-setup.exe. There is no separate
ARM build; Windows on ARM runs the x64 one. The Windows build has now
been launched on Windows and the three first-launch failures that
found are fixed. The test suite is not ported yet, so it runs on the
Windows runner without gating the installer.
Neither build is signed. macOS will refuse the first launch: either
right-click the app and choose Open, or clear the quarantine flag:
xattr -dr com.apple.quarantine "/Applications/Terminal Deck.app"Windows SmartScreen will warn instead: choose More info, then
Run anyway. The -portable.exe needs no installation and cannot
update itself.
Terminal Deck runs agent CLIs; it does not bundle them. At least one of
Claude Code, Codex CLI or Gemini CLI needs to be installed and
authenticated already.
The app checks for new versions and installs them itself, so the
.zip and latest*.yml files are for the updater rather than for
you. SHA256SUMS.txt lists the checksum of every artifact below.
What's Changed
New Contributors
Full Changelog: v0.1.2...v0.1.3
v0.1.2
Install
macOS 12 or later, Apple silicon: open -arm64.dmg and drag the app
to Applications. There is no Intel Mac build — macOS 27 runs on none.
Windows 10 or later, x64: run -x64-setup.exe. There is no separate
ARM build; Windows on ARM runs the x64 one. The Windows build has
never been launched on Windows — it is published so it can be.
Neither build is signed. macOS will refuse the first launch: either
right-click the app and choose Open, or clear the quarantine flag:
xattr -dr com.apple.quarantine "/Applications/Terminal Deck.app"Windows SmartScreen will warn instead: choose More info, then
Run anyway. The -portable.exe needs no installation and cannot
update itself.
Terminal Deck runs agent CLIs; it does not bundle them. At least one of
Claude Code, Codex CLI or Gemini CLI needs to be installed and
authenticated already.
The app checks for new versions and installs them itself, so the
.zip and latest*.yml files are for the updater rather than for
you. SHA256SUMS.txt lists the checksum of every artifact below.
Full Changelog: v0.1.1...v0.1.2
Terminal Deck 0.1.1
Updates now install from inside the app. 0.1.0 will offer this one and replace itself.
macOS 12 or later, Apple silicon. Still unsigned — right-click and Open on first launch.
Terminal Deck 0.1.0
First release. macOS 12 or later, Apple silicon.
Open terminaldeck-0.1.0-arm64.dmg and drag the app to Applications. There is no Intel build — macOS 27 runs on no Intel Mac.
The build is unsigned. macOS will refuse it on first open: right-click the app, choose Open, then confirm. The app cannot update itself for the same reason — Squirrel.Mac will not replace a bundle it cannot verify — so it will tell you when a new version exists and send you here.
You bring your own agent CLI: Claude Code, Codex CLI or Gemini CLI, already installed and signed in.