Skip to content

Releases: webteractive/zetty

v0.1.42

Choose a tag to compare

@hadefication hadefication released this 27 Aug 11:59

Multiple agent accounts

Run more than one login side by side — a work account in one tab, a personal one
in the next. Supported for Claude Code and Codex.

Open Settings (⌘,) → Accounts → Add Account…. Zetty creates a private config
directory for the account, seeds it from your existing setup, and can open a
terminal to sign in on the spot — or you can create the account now and sign in
later. Your existing login is untouched and stays available as Default.

Choose an account three ways:

  • Per project — Project Settings → General → Account. Every new pane in
    that project uses it, and clones inherit their source's.
  • Per pane — with agents enabled, the new-tab/split chooser lists each agent
    once per account.
  • For an open pane — right-click its gutter → Account ▸. Because a
    program reads its environment once at startup, this reopens the pane in the
    same slot on the new account.

A status-bar chip names the focused pane's account and agent; tab pills and
sidebar rows carry a matching colored dot. Nothing appears until you create your
first account.

Each account keeps its own credentials, settings and history. Skills, commands
and agent instructions are shared by symlink so your tooling follows you;
settings are copied so each account keeps its own; plugin directories are never
shared, because two agents writing through one link corrupts them.

Control CLI

zetty accounts                  # list accounts and their config directories
zetty accounts --probe          # ...and ask each one who it's signed in as
zetty new-tab --account work    # open a tab on a specific account
zetty split --account personal  # likewise for a split

zetty status shows the account for any pane not on the default login. An
unknown --account name is an error rather than a silent fall back to the
default — landing on the wrong account is the mistake this feature exists to
prevent.

Fixes

  • Preserved sessions survive a bad environment variable. libghostty
    validates its config all-or-nothing, so one directive it refused previously
    dropped the pane's launch command too, leaving a plain shell instead of a
    reattached session. The launch command is now kept regardless.
  • Project Settings no longer erases fields it doesn't show. Saving the sheet
    rebuilt settings from a blank record, silently clearing anything set elsewhere.
  • Codex accounts get agent status dots. Each agent reads its hooks from its
    own config directory, so hooks are now installed per account.

v0.1.41

Choose a tag to compare

@hadefication hadefication released this 27 Aug 01:37

If Zetty won't launch after updating, reinstall from the DMG

A small number of installs came out of an earlier update with an incomplete
app bundle. They fail at launch with a macOS crash dialog naming
Library not loaded: @rpath/ZettyGhostty.framework/… — the app never
reaches its own code, so "Check for Updates…" can't reach you and this
release can't repair it on its own. The zetty CLI shares that binary, so it
fails the same way.

Download the DMG below and drag Zetty into Applications, replacing the
existing copy
, then clear the quarantine flag:

xattr -d com.apple.quarantine /Applications/zetty.app

Nothing of yours is inside the app bundle — projects, tabs, splits, settings
and preserved zmx sessions all live elsewhere and come back on first launch.
To check a copy without launching it:

test -f /Applications/zetty.app/Contents/Frameworks/ZettyGhostty.framework/Versions/A/ZettyGhostty \
  && echo OK || echo "BROKEN — reinstall from the DMG"

Updates keep your working copy until the new one is verified

This release fixes the bug behind the notice above.

Installing an update replaces Zetty with itself, which a running app can't do —
so Zetty hands the swap to a small helper that waits for it to quit. That helper
used to delete the installed app and then copy the new one into place. If
anything interrupted it in between — a restart, a full disk, a killed process —
you were left with whatever the copy had managed to write. A bundle missing even
one file won't launch, and there's no way back from inside an app that can't
start.

The swap is now staged:

  • The new bundle is checked before the installed one is touched. An
    incomplete download never gets the chance to overwrite a working app.
  • Your current version is moved aside, not deleted, and only removed once
    the new copy is verified in place.
  • A failed copy is rolled back — the previous version is restored and
    relaunched, so an interrupted update leaves you with a working Zetty rather
    than nothing.
  • Zetty relaunches on every path, including the ones that give up.

The same completeness check now runs while Zetty is still open, right after the
disk image is unpacked, so a bad download surfaces as an error message instead
of a silent rollback you'd never see.

v0.1.40

Choose a tag to compare

@hadefication hadefication released this 26 Aug 04:22

Spaces — group related projects in the sidebar

Zetty's sidebar has always organized projects by state: Home, Pinned, Projects,
Scratch, Hibernating. Spaces add a section you define yourself — a named,
colorable, collapsible group holding whichever projects belong together.

A Space sits below Projects and behaves like the sections you already know:

  • Joining a Space clears the project's pin — a project lives in exactly one
    section, so members show no star.
  • Hibernating a member sends it to Hibernating like any other project,
    tagged with its Space's name; waking it returns it to that Space. The Space's
    header shows both counts as 3/1 (awake/dormant), and a Space with no awake members hides
    until one comes back.
  • Deleting a Space never deletes projects — they simply return to
    Pinned/Projects.
  • Collapse state, color, icon, and order all persist across quit and relaunch.

Home, scratch terminals, and clones are never members; a clone follows its source
into whatever Space that source belongs to.

Using them

Right-click a project → Move to Space ▸ (or New Space… to create one and
file the project in a single step). Right-click a Space header to rename it, edit
its color and icon, collapse it, Hibernate All / Wake All its projects,
or delete it. A Space header collapses from its chevron — the rest of the row is
a drag handle.

You can also drag: a project onto a Space header to file it, out into Projects to
ungroup it, or a Space header itself to reorder the whole group with its members
(Space headers stay within their own band — they can't be dragged above Projects).
Members keep the order you filed them in; re-picking the same Space from the menu
moves one to the bottom.

From the command line

zetty new-space "Client Acme" --color teal --icon briefcase.fill
zetty add-project ~/work/acme-api --space "Client Acme"
zetty move-to-space sipra "Side Projects"     # or --none to ungroup
zetty hibernate --space "Client Acme"          # and wake --space
zetty rename-space "Client Acme" --to "Acme"   # --to avoids quoting
zetty remove-space "Acme"                      # keeps the projects

zetty status now renders Space headers, including empty ones. add-project --space
errors on a Space that doesn't exist rather than creating one, so a typo can't
quietly produce a second near-identical Space.

Notes

Existing workspaces load unchanged — every project simply starts ungrouped. Space
names are case-insensitively unique, which is what lets the CLI address them by name.

v0.1.39

Choose a tag to compare

@hadefication hadefication released this 18 Aug 16:30

Home, wherever you actually work

The permanent Home project no longer has to sit in your home directory.

  • Point it anywhere with zetty-home-path in ~/.config/zetty/config (e.g. zetty-home-path = ~/Projects), or without touching the file: right-click Home → Project Settings… → Working Directory, with Choose… (the panel can create a new folder) and Use Default. The row is unique to Home — every other project stays rooted where it was added.
  • The config wins over the path saved in your workspace, so a change lands on the next launch or a ⇧⌘, reload, and removing the key moves Home back to ~.
  • It applies to new tabs and panes. Shells already running keep their working directory, and a preserved zmx session keeps the one it was created with.
  • A path that no longer exists is ignored — Home stays at ~ rather than opening nowhere.

Fixes

  • The pane gutter's scroll to bottom button has been removed: it did nothing in panes running an agent CLI. The action is still on the pane's right-click menu and ⌘↓ while the cause is tracked down.

v0.1.38

Choose a tag to compare

@hadefication hadefication released this 15 Aug 10:54

What's new

  • Added Close Zetty to the Zetty application menu with the standard Command-H shortcut.
  • Closing from the menu now behaves exactly like the red window button: the workspace and terminal sessions stay running behind the Zetty menu-bar item.
  • Reordered the application lifecycle actions to Close Zetty, Quit Zetty, then Shutdown Zetty.

v0.1.37

Choose a tag to compare

@hadefication hadefication released this 15 Aug 10:17

What's new

This maintenance release makes Zetty's macOS release pipeline clean and more reliable.

  • Removed compiler warnings from process inspection and keyboard focus handling.
  • Simplified terminal module ownership to prevent duplicate static linking.
  • Completed Developer Tools and App Intents bundle metadata.
  • Made universal macOS packaging use a deterministic destination.

No terminal session or shutdown behavior changed in this release.

v0.1.36

Choose a tag to compare

@hadefication hadefication released this 15 Aug 06:58

What's new

  • Closing Zetty's main window now keeps projects running from a bold Z menu-bar item and hides the Dock icon until the window is restored.
  • The menu-bar project and tab list now shows live agent status dots and focuses the selected destination when reopened.
  • Quit now exits immediately while preserving eligible sessions; the separate confirmed Shut Down Zetty… action stops all services and sessions.
  • Pane actions now include Scroll to Bottom alongside the existing split controls.

The hidden-window status menu focuses on active projects and tabs; lifecycle actions remain in the regular Zetty application menu.

v0.1.35

Choose a tag to compare

@hadefication hadefication released this 13 Aug 17:12

What's new

Fixed

  • The file peek is no longer blank on macOS 15. ⌘-clicking a path (or
    zetty view) opened the read-only viewer with the file loaded, correctly
    coloured — and nothing drawn, because the text view was laid out zero points
    wide. It now gets a width to lay out into. If you saw an empty peek panel on
    macOS 15, this is that bug; macOS 26 was never affected, which is why it took
    a diagnostics paste to find.
  • The clone copy-back diff (Merge to Source… on a clone whose source isn't a
    git repo) could render blank on macOS 15 for the same reason. Fixed alongside.

Thanks to everyone who sent a "Copy diagnostics" paste from the peek footer —
that button is what turned four rounds of guessing into a one-line fix.

v0.1.34

Choose a tag to compare

@hadefication hadefication released this 13 Aug 08:21

What's new

The file peek can now explain itself.

A blank peek — panel open, header filled in, no text — looks exactly the same
whether the file couldn't be read, the syntax highlighter returned nothing
usable, the colours came out invisible against your background, or the text
never got laid out. That made it effectively impossible to act on a report.

  • Copy diagnostics — a new button in the peek's footer puts the recent
    viewer log, plus your build and macOS version, on the clipboard. If a peek
    ever comes up blank, paste that into an issue and it says which step emptied
    it.
  • The same lines go to the macOS unified log, so they can also be collected
    after the fact:
    log show --last 15m --predicate 'subsystem == "co.webteractive.zetty"' --style compact
  • Opening a file that turns out to be missing or to be a directory is no longer
    silent when it comes from ⌘-click or the file tree.

Nothing is sent anywhere, and the file's own contents are never recorded — only
counts (how many characters, how many of them are visible ink, which colours
were used).

v0.1.33

Choose a tag to compare

@hadefication hadefication released this 13 Aug 03:37

What's new

Fixed

  • The file viewer no longer opens an empty panel. ⌘-clicking a path — or
    clicking a file in a pane's file tree — could open a peek that showed the
    filename, the path and the Open in ▾ button, but nothing at all where the
    file's contents should be. It looked like the viewer was broken; usually there
    was simply nothing to draw.

    A peek now always tells you what happened:

    • an empty file says "This file is empty"
    • a file whose contents couldn't be read says so, with how many bytes were
      actually available — the case that matters for files stored in the cloud and
      not yet downloaded, which look completely normal in the file tree
    • a file with no readable text says that too

    Syntax highlighting also got sturdier: if the highlighter returns nothing
    usable, the peek falls back to showing the file's plain text instead of
    showing you an empty panel.