macOS is a first-class host for the managed app, Unix PTY transport, built-in
engine, and self-contained .app packaging (including signed,
notarized .dmg release artifacts). Global hotkeys, default terminal
registration, and Homebrew remain out of scope.
- Avalonia desktop host (
osx-arm64/osx-x64) - Local shells through
dt-pty-host(forkpty, same framing as Linux) - Built-in terminal engine
- Settings at
~/Library/Application Support/Devolutions/Terminal/ - Native Command-key defaults for clipboard, tabs, windows, search, settings, selection, font sizing, full screen, and quit actions
- Native macOS application menu (with Avalonia's Services, Hide, Hide Others,
Show All, and Quit items), dynamic window and
NativeDockmenus, IsebergNativeMenumenu-bar integration, and Dock reopen after the last window is closed - Login-shell commandlines (
/bin/zsh -l) so Dock launches pick up~/.zprofileand HomebrewPATH TERM_PROGRAM=Devolutions.Terminaland extra Homebrew/MacPortsPATHentries on the PTY host- Command-click hyperlinks, Command-scroll zoom, Option-as-Meta, Kitty Super
public.html/public.rtfclipboard formats, Menlo/Apple Color Emoji fallbacks, and file-drop path pasting- Generated zsh/bash/fish/pwsh/sh profiles (
Devolutions.Terminal.macOS) - Hidden Windows inbox profiles that use
%SystemRoot% - Opening files and URIs with
open(1) - Notifications through
osascriptdisplay notification dterm:URL scheme declared inmacos/Info.plist(argv and Apple Event protocol activation)- NativeAOT desktop
.app+ zip packaging on Darwin (Iseberg included) - Signed, notarized
.dmgrelease artifacts viascripts/Release-MacOsPackage.ps1(CI only; ad-hoc unsigned zip/dmg locally or without Apple signing secrets)
- Homebrew cask
- Global hotkeys (broker /
dt -wstill work) - Default-terminal registration
dt-pty-host is built on restore for osx-arm64 /
osx-x64 (macOS 13+). dt-pty-host is compiled with Apple clang so it can
link libutil from the SDK.
dotnet test Devolutions.Terminal.slnx
dotnet publish src/Devolutions.Terminal -c Release -r osx-arm64 --self-contained
pwsh scripts/Build-MacOsPackage.ps1 osx-arm64 2026.3.0 artifacts/packages
pwsh scripts/Test-MacOsPackage.ps1 osx-arm64 artifacts/packages/*.zip
pwsh scripts/Test-MacOsRuntime.ps1 artifacts/packagesBuild-MacOsPackage.ps1 publishes the NativeAOT desktop with Iseberg enabled
unless MACOS_PUBLISH_DIR supplies an existing publish,
stages Devolutions Terminal.app with macos/Info.plist, moves the managed
bridge DLL into Contents/Resources/Devolutions.Iseberg.PowerShell.dll, generates
DevolutionsTerminal.icns from the original WT Distro vector artwork in
macos/DevolutionsTerminal.svg. Its librsvg-rendered 1024px transparent master,
macos/DevolutionsTerminal.png, is committed so packaging does not depend on
an additional SVG renderer. Xcode compiles that same master through
macos/AppIcon.icon for the native macOS 26 appearance system; the .icns
remains the fallback on earlier releases. The script then ad-hoc signs the
bundle and writes a zip plus SHA-256 manifest.
Published THIRD-PARTY-NOTICES*.txt files (including transitive dependency notices) are preserved in Contents/Resources alongside LICENSE, not in the code-only Contents/MacOS directory.
Test-MacOsLegalNotices.ps1 checks this layout without requiring Apple signing credentials.
Unix publishes exclude Windows-only ConPTY OpenConsole.exe hosts from the final publish list, including files supplied by RID-less project references.
Package validation and signing check every file under Contents/MacOS, not just top-level files.
Ordinary CI runs the release signing script with an ad-hoc identity on both actual app bundles, so nested-code failures are caught before a credentialed release.
Stage-MacOsNuGetPayload.ps1 creates the existing flat NuGet native layout from that app and signs the copied code as standalone executables/libraries.
Signed releases use the same Developer ID identity, Hardened Runtime, application entitlements, and secure timestamps; unsigned CI uses an ad-hoc identity.
Both actual macOS NuGet packages are extracted and checked by Test-MacOsNuGetPayload.ps1 on macOS before release publication.
The NuGet layout is not a notarized app bundle and does not inherit its stapled ticket.
open "artifacts/packages/Devolutions Terminal.app"Release DMGs use a Finder window layout with a branded installation background,
the app, and an Applications folder shortcut. The writable disk image is sized
from the app bundle (plus HFS+/Finder headroom) rather than a fixed volume
size. The background is maintained as macos/InstallerBackground.svg and
committed as macos/InstallerBackground.png for packaging.