Skip to content

bandoracer/term3

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

2 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Term3

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.

Features

  • 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. .itermcolors schemes 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. ⌘Q closes terminal windows but keeps the background service and its drop-down sessions alive; βŒ₯⌘Q quits 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 .itermcolors import for the whole iTerm2 theme ecosystem.
    • Every change applies live to all open terminals β€” no restart, no "apply" button.
  • Splits & tabs β€” ⌘D/β‡§βŒ˜D splits with directional focus (⌘βŒ₯arrows), pane cycling (⌘]/⌘[), maximize active pane (β‡§βŒ˜β†©), inactive-pane desaturation, ⌘N for a new window, and ⌘T for 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/β‡§βŒ˜G next/previous.
  • Truecolor, 256-color, mouse reporting, OSC 8 hyperlinks, sixel & Kitty graphics β€” courtesy of the SwiftTerm core. Per-session font zoom (⌘+/⌘-/⌘0), ⌘K clear, copy-on-select, visual/audible bell, quit confirmation.

Build & run

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 + open

Requires Xcode's Swift toolchain (Swift 5.9+ / macOS 13+). Dependencies resolve via SwiftPM, with SwiftTerm vendored as a local package under Vendor/SwiftTerm.

Download & install

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.

Keyboard shortcuts

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

Settings file

Human-readable JSON at ~/Library/Application Support/Term3/settings.json (export/import from Settings β†’ Advanced).

Architecture

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.

License & credits

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.

Testing hook

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.

Roadmap

  • Session restore across launches
  • Triggers/smart selection, shell-integration marks (Γ  la iTerm2)
  • tmux control mode
  • libghostty renderer option when its embedding API stabilizes

About

Native macOS terminal built with SwiftTerm and Metal rendering.

Topics

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors