About this project
mTerm is a native macOS terminal emulator written in Swift, using AppKit for the window and a Metal renderer for the terminal view. It positions itself as an alternative to iTerm2 for developers who want a Mac-native feel, GPU-class rendering, and a deliberately small feature set rather than a large preference surface. It explicitly avoids AI features, cloud accounts, and shell rethinking.
Rendering and terminal emulation
The terminal view is Metal-rendered with a pixel-snapped glyph atlas, intended to keep text crisp at all sizes without GPU filtering blur. Bold and italic use the font's real faces rather than synthesized slants, with identical advance widths so columns stay aligned. Underline, faint, and inverse attributes are supported, including the codes that turn them off. Resizing reflows the buffer: wrapped lines rejoin and re-split at the new width, and a grid-size readout appears while dragging.
Compatibility targets xterm-256color for tools such as vim, neovim, htop, fzf, less, and git pagers. It supports 24-bit true color, alt-screen, scroll regions (DECSTBM), DEC line drawing, and synchronized output (DEC 2026). Mouse reporting covers SGR (1006) and legacy encodings for click, drag, motion, and wheel, with ⇧ held to select instead. Bracketed paste, focus events, and device/cursor-position reports are included. East Asian and fullwidth characters occupy two columns, and combining marks compose into the preceding glyph.
Tabs, navigation, and the command hub
The AppKit window has a tabbed sidebar that can be dragged to reorder, supports full-screen, and restores sessions (tabs, their directories, and profiles). ⌘K opens a hub over every tab in every window and every menu-bar command, ranked in one list. Tab rows show index, run state, title, directory, and foreground process. An empty query lists recent tabs with the previous one selected, so ⌘K ⏎ flips back; ⌘⌫ closes the highlighted tab. Actions are searchable by words users would arrive with, such as "cls" for Clear Screen or "blurry" for stroke weight, which opens Settings with the focus ring on that control.
Shell integration and tmux
Shell integration for zsh, bash, and fish uses OSC 133 to add gutter prompt markers color-coded by exit status and ⌘↑ / ⌘↓ prompt jumping. It does not modify user rc files; instead each shell gets a wrapper (ZDOTDIR for zsh, --rcfile for bash, a vendor_conf.d snippet for fish) that sources the real startup files first. tmux control mode is supported: running tmux -CC turns each tmux window into a real mTerm tab, with ⌘T and ⌘W mapping to tmux window creation and closing, and renames and window switches following tmux both ways. A tab shows its window's active pane. One session at a time; detaching ends the tabs.
Links, triggers, and profiles
⌘-click opens links: URLs go to the browser and file paths are revealed in Finder. Links are not visually distinguished until the pointer is over them with ⌘ held, when the link takes the theme accent color and an underline and the cursor becomes a hand. Only paths that exist on disk are offered, and a URL wrapping across rows is treated as one address. ⌘-click can also copy text set apart by color, such as inline code or a quoted draft, with a confirmation showing the text and character count.
Triggers combine a regex with an action: highlight, recolour, underline, open as URL, reveal in Finder, or run a command with $1 as the match. They are edited in Settings with an inline tester and stored in triggers.json. User rules are tried before two built-in rules for URLs and file paths, which can be disabled but not edited. Profiles define a named command, starting directory, environment, and optional pinned theme, stored one JSON file each under profiles/ so they can be shared or committed. They open via File > New Tab with Profile or ⌘⌥1–9, and ⌘T uses the default profile.
Settings, themes, and configuration
The Settings window has Appearance, Profiles, Triggers, General, and Notifications panes, with a search field that finds controls by name or by colloquial description. Themes include Tomorrow Night, Solarized (light and dark), Nord, Dracula, Gruvbox Dark, and mTerm's own light and dark, with import of iTerm2 .itermcolors files and automatic light/dark switching. Font family, size, stroke weight, and line spacing (1.0×–2.0×, default 1.15×) are adjustable live. Scrollback depth is configurable from 1k to 100k lines with per-tab cost shown. macOS notifications cover terminal attention events (bell, OSC 9 / OSC 777). Close-confirmation for running foreground processes and Clear Screen confirmation are togglable. Configuration lives under ~/Library/Application Support/mTerm/ in settings.json, state.json, profiles/*.json, and triggers.json; there is no separate config file in v1.
Installation and status
Installation is via Homebrew cask (brew install --cask d0x2a/tap/mterm), a signed and notarized universal DMG, or building from source with macOS 14+ and Xcode 15+ (or Swift 5.10+ command-line tools) using swift run -c release mTerm. The project is at v1.3.1 and states that all items in its SPEC.md definition of done have shipped. It reports that scrollback memory targets are met with room to spare while throughput falls short of the spec's aspirational figure; both measurements and the harness are documented in docs/BENCHMARKS.md. The license is MIT, copyright Dox2A Labs LLC.
Comments
0 people shared their preference · Deer Point appears after 10 participants
Sign in to join the discussion.