iTerm2-style terminal polish on a modern core. A native macOS terminal in ~3,500 lines of Swift, built on SwiftTerm's VT/xterm engine with its Metal GPU renderer β the same glyph-atlas approach Ghostty and Alacritty use β instead of iTerm2's twenty-year-old Objective-C core.
- GPU rendering β Metal glyph-atlas renderer on by default, CoreGraphics fallback one toggle away (Settings β General).
- Drop-down terminal β double-tap Control (configurable: any modifier, or a classic keyboard shortcut), slides from the top and covers the menu bar like iTerm2's hotkey window, joins every Space, floats over full-screen apps, keeps its sessions alive while hidden, pin button to disable auto-hide. System-wide double-tap detection needs Accessibility access (same as iTerm2); the shortcut mode needs no permissions.
- iTerm2 config compatibility β import profiles straight from
com.googlecode.iterm2.plist("New Bookmarks") or Dynamic Profiles JSON: colors, font, command, working directory (incl. "Recycle" β reuse previous), columns/rows, scrollback, transparency/blur, cursor type, option-as-meta, bell, and close-on-exit all map across..itermcolorsschemes import in the Colors tab. - Window styles β standard themed title bar, or compact with no title bar (traffic lights floating over the terminal), switchable live in Settings β General.
- Always-on background service β optional login item starts Term3 invisibly (no windows,
no Dock icon) with the drop-down hotkey armed.
βQcloses terminal windows but keeps the background service and its drop-down sessions alive;β₯βQquits completely. Launching the app again brings back the Dock icon and a regular window. Configure both in Settings β Hotkey Window β Background. Close/quit confirmations only appear when a session is actually running a job (idle prompts close silently). - Rich settings GUI β System Settings-style window with toolbar tabs:
- Profiles: multiple profiles with per-profile shell/args/login-shell, working directory (home / reuse previous / custom), environment variables, font + size, cursor style/blink, color scheme, transparency + background blur (iTerm2-style: 0% = opaque, uniform across the whole window, adjustable blur radius, optional opaque title bar, βU global toggle), padding, initial size, scrollback, TERM, option-as-meta, mouse reporting, bell, close-on-exit policy.
- Colors: 9 built-in schemes (Tokyo Night, Dracula, Catppuccin Mocha, Nord, One Dark,
Gruvbox, Solarized Dark/Light, Classic), live preview, full ANSI-16 + fg/bg/cursor/
selection editing, and
.itermcolorsimport for the whole iTerm2 theme ecosystem. - Every change applies live to all open terminals β no restart, no "apply" button.
- Splits & tabs β
βD/β§βDsplits with directional focus (ββ₯arrows), pane cycling (β]/β[), maximize active pane (β§ββ©), inactive-pane desaturation,βNfor a new window, andβTfor a new tab. - Broadcast input (
β₯βI) β type into every pane in the tab at once; broadcasting panes get a red outline. Restart an exited session from the Session menu. - cwd inheritance without shell integration β new tabs/splits start in the previous
session's directory, read via
libproc(OSC 7 also supported when the shell emits it). - Window titles that track the shell β
zsh β ~/src/project, updated live. - Find in scrollback β
βF(SwiftTerm's built-in find bar),βG/β§βGnext/previous. - Truecolor, 256-color, mouse reporting, OSC 8 hyperlinks, sixel & Kitty graphics β courtesy
of the SwiftTerm core. Per-session font zoom (
β+/β-/β0),βKclear, copy-on-select, visual/audible bell, quit confirmation.
make app # builds dist/Term3.app (release) with generated icon
make dmg # builds dist/Term3-<version>.dmg with Term3.app + Applications shortcut
make run # build + openRequires Xcode's Swift toolchain (Swift 5.9+ / macOS 13+). Dependencies resolve via SwiftPM,
with SwiftTerm vendored as a local package under Vendor/SwiftTerm.
Download the latest Term3-<version>.dmg from GitHub Releases, open it, and drag
Term3.app to Applications.
Current local builds are signed with the available Apple Development identity when present. They are not Developer ID notarized unless you build with a Developer ID Application certificate and submit the DMG for notarization.
| Action | Keys |
|---|---|
| New window / tab | βN / βT |
| Split vertically / horizontally | β₯V / β₯H (also βD / β§βD) |
| Focus pane in direction | ββ₯ββββ |
| Next / previous pane | β] / β[ |
| Maximize active pane | β§ββ© |
| Broadcast input to all panes in tab | β₯βI |
| Edit session's profile | βI |
| Close paneβtab / all panes in tab / window | βW / β₯βW / β§βW |
| Select tab by number | β1 β¦ β9 |
| Previous / next tab | β§β[ / β§β] |
| Find / next / previous / use selection | βF / βG / β§βG / βE |
| Clear buffer | βK |
| Scroll to top / end | βHome / βEnd |
| Font bigger / smaller / reset | β+ / β- / β0 |
| Use transparency | βU |
| Full screen | ββ© (also ββF) |
| Drop-down terminal | double-tap β (configurable, global) |
| Open profiles | βO |
| Settings | β, |
| Close windows, keep background service | βQ |
| Quit completely | β₯βQ |
Human-readable JSON at ~/Library/Application Support/Term3/settings.json
(export/import from Settings β Advanced).
Sources/Term3/
main.swift, AppDelegate.swift AppKit lifecycle, actions, dynamic menus
MainMenu.swift full menu bar built in code
Models.swift Profile / ColorScheme / AppSettings (Codable)
SettingsStore.swift JSON persistence + live-change notifications
TerminalSessionView.swift one pane: SwiftTerm view + transparency/desaturation, profiles
SplitTree.swift nested NSSplitView pane tree per tab
TerminalWindowController.swift windows, native tabs, titles, close confirmation
Dropdown.swift Carbon global hotkey + slide-down NSPanel
SettingsWindow.swift toolbar-tab settings window (AppKit shell)
SettingsPanes.swift, ProfilesPane.swift, KeyRecorder.swift SwiftUI panes
Automation.swift TERM3_AUTOMATION=1 test channel (drive + self-screenshot)
The terminal emulation, renderer, and PTY handling live in SwiftTerm; Term3 is the application layer (profiles, settings, windowing, hotkey) β so the core can track upstream improvements (or be swapped for libghostty someday) without touching the app.
Term3 is MIT licensed. See LICENSE.
Term3 vendors SwiftTerm under its MIT License. See THIRD_PARTY_NOTICES.md and
Vendor/SwiftTerm/LICENSE for the complete third-party notice.
Launch with TERM3_AUTOMATION=1 and the app listens for term3.automation distributed
notifications: type:<text>, splitV, splitH, newTab, newWindow, toggleDropdown,
openSettings:<tab>, setScheme:<name>, snap:<dir> (self-rendered window screenshots).
Disabled unless the env var is set.
- Session restore across launches
- Triggers/smart selection, shell-integration marks (Γ la iTerm2)
- tmux control mode
- libghostty renderer option when its embedding API stabilizes