Features and limitations
Documentation index · Project overview
This reference describes the development tree on main. Published releases
may trail it; changes not yet released are listed under [Unreleased] in the
changelog.
Configuration keys and defaults are maintained in Configuration;
the user guide says where each feature lives and how to use it.
Terminal and text
- A Swift VT parser with true colour, alternate screens, scrollback, query responses, synchronized output and bracketed paste.
- Unicode text, East Asian widths, combining marks and emoji, with Core Text font fallback. AppKit IME composition is drawn outside the terminal grid.
- Metal 4 rendering — one render pass per frame — with a glyph atlas, instanced quads and line damage tracking. Needs a GPU with Metal 4: every Apple silicon Mac; not a virtual machine's paravirtual GPU.
- OSC 8 hyperlinks, focus reporting and the Kitty keyboard protocol.
Speed and efficiency
- Measured core-feed throughput of 317.3 MiB/s, with printable runs classified 16 bytes at a time with NEON. This benchmark excludes PTY I/O, rendering and display; it is not an end-to-end application throughput. The screen follows at the display's pace.
- Scroll regions, history scrolling and inserted or deleted lines shift the rendered rows instead of rebuilding them; scrolling allocates no screen rows.
- Cold scrollback compressed in memory as it arrives: 100,000 lines of 120 columns added about 11 MiB of resident memory in the measured workload. Search, reflow and copy read history in place; other text and workloads can compress differently.
- Typing, paste and input-method text request the panel's maximum frame rate (120 Hz on ProMotion); Low Power Mode, an inactive window and thermal pressure lower it otherwise.
- An idle blinking cursor is animated by Core Animation; an idle shell causes no periodic wakeups; a hidden pane's reader runs at background priority after two seconds; an occluded window does not draw.
- Glyph atlases and GPU instance buffers sized to what is on screen: a 24-byte quad, atlases that grow on demand.
- iTerm2
imgcatinline PNG and animated GIF's first frame (OSC 1337), including multipart transmission, cell/pixel/percent/auto sizing and aspect preservation. The same sandboxed decoder, placement table, erase/scroll semantics and image budgets as kitty graphics; downloads are refused. - iTerm2 cwd/host reports, marks, clear history, cursor shape, background Dock attention, numeric cell-size reports and permission-gated clipboard copy; VS Code OSC 633 command boundaries/cwd and ConEmu OSC 9;12 prompt marks.
- Kitty OSC 21 colours, OSC 22 mouse shapes with a bounded per-screen stack, and OSC 5522 text clipboard writes under the OSC 52 permission and size cap. See the OSC verdict table for deliberate limitations, accepted no-ops and refusals.
- Kitty graphics with direct RGB, RGBA and PNG transmission and placement,
zlib-compressed or not (
o=z, whatkitten icatsends for an image it scales to fit). Erasing the main screen (clear, ⌃L, Clear Screen) removes the images on it; erasing the scrollback (clear'sED 3, Clear History) removes the ones in history — as kitty does. An image wholly inside a scroll region moves with it and is cropped at its margins; one straddling a margin stays put, as kitty's page rule says. Up to 8192 pixels a side and 16 million pixels an image.
Protocol coverage and dated verification results are in Conformance. Rendering measurements and their conditions are in Performance.
Windows and navigation
- Split panes, pane zoom, font zoom and restoration of window arrangements and working directories. Reopening a closed pane restores its arrangement, not the terminated process.
- A full-screen window with one pane is presented directly to the display, not through the window server's compositor: about a frame less from keypress to glass. A split, or anything AppKit draws over the text, brings the compositor back while it shows.
- Scrollback search with case-sensitive and regular-expression modes, in a find bar that narrows with a split pane and moves to the bottom while the cursor or the current match is under it; text selection, copy and export. Clear Screen, Clear History and Reset Terminal are separate commands with different effects. At a ready integrated prompt, Clear Screen keeps the complete editor display and input cursor at the top without sending input to the shell. Alternate-screen programs and editors whose prompt has scrolled into history are left intact.
- A command palette (⇧⌘P), configurable shortcuts, themes and a native
Settings window — a sidebar of eight categories, System Settings style —
backed by
~/.config/corta/config. - Rounded glass surfaces for the command palette, connection form, command history, directory candidates and centered stopped/failed pane panels. Connect to Host scrolls in small windows; About and Command History open centered over the invoking window, within its display's usable bounds.
- Working-directory commands (reveal, copy,
cdto the parent or project root, open a pane there), shell/directory/environment presets, and localpath:line:columnreferences that can open in an editor.
Claude Code state and generic program notifications
- Claude Code is currently the only CLI with a dedicated task-state integration. Development and real acceptance used Claude Code 2.1.310; other versions need independent verification. Its OSC 7501 reports distinguish working, waiting, done, idle and failure on tabs, the Dock and the Agents list.
- Generic OSC 9/777/99 notifications and OSC 9;4 progress are available to any program. They do not establish completion or permission state. Claude's own message channels require explicit selection in Claude's settings; Corta's default identity does not enable Claude's OSC 9;4 progress. OSC 21337 is generic metadata; Claude 2.1.310 leaves its sender disabled.
- Other coding CLIs have no dedicated task-state adapter. A recognised foreground process can be listed as State unknown; process detection does not mean its turns, failures or permission requests are integrated. Corta does not install hooks or tool configuration automatically.
See the user guide and verification limits.
Shell and remote work
- OSC 133 shell integration: prompt marks (an empty Return draws none),
command history, command-output
copy/export, navigation between commands and long-task notifications.
Standard local zsh sessions load the bundled hooks automatically with
directory-completion = trueorhistory-suggestions = true. For explicit startup-file installation in zsh, bash or fish, use Settings ▸ Terminal ▸ Shell Integration. - Built-in directory suggestions for standard local zsh sessions, with
faint alternatives and inline previews, Left/Right selection and Tab
acceptance, including consecutive subdirectory levels. Up/Down keep command history navigation; Shift+Tab passes
through. Disable the optional feature in Settings or with
directory-completion = false(usage). Local hooks load without changing the user's startup files. - Built-in local zsh history suggestions: the most recent prefix match
appears as a faint suffix. Right/End accepts without executing, Esc
dismisses, and Tab and history navigation keep native bindings. No
history-file reads or startup-file edits; zsh-autosuggestions takes
precedence. Disable with
history-suggestions = false(usage). - Optional command-status rules in the prompt margin, with textual tooltips and gray interrupted marks for exit status 130.
- Remote context reported by shell integration, a host indicator and reconnect
action. SSH connections use system OpenSSH, including its configuration,
agent and
ProxyJump; Corta does not provide its own SSH implementation. - One connect sheet for a terminal (SSH) and for files (SFTP), behind one
toolbar button, with host, user, port and private-key fields, each passed
to OpenSSH as its own argument; empty ones fall to
~/.ssh/config. It suggests recent connections, with the fields they used and when, and theHostnames in~/.ssh/config(read, never executed), leaving out hosts that only take git. A terminal connection is remembered once established — ssh has a terminal on the server — not when Connect is pressed. From a remote pane it offers that host's files first. A pane opened from it names that destination in its title until the remote shell reports its own. - A session that ends, a connection that drops and a pane that fails show one panel over the dimmed, still-readable output (selectable once the session has ended): what ended, how, the raw reason under Details, and Reconnect, New Session or Try Again — which start at the pane's size and font size.
- An SFTP browser for listing, transferring, renaming and deleting remote files
and directories, with managed local copies for editing: Back and Forward, a
breadcrumb path, sortable columns, hidden files on request, a row menu, drag
and drop to upload (the listing or folder row outlined, naming the
destination) and to Finder, and transfers in a toolbar popover with
speed and time left. The first connection to a host in a run requires
confirmation; a remote report alone cannot open it. Passwords, key
passphrases, one-time codes and new host keys are asked in a dialog
through OpenSSH's
SSH_ASKPASSand never saved; cancelling a password ends the connection attempt, cancelling a key's passphrase skips the key. A failed connection says why in a sentence, ssh's diagnostics under Details. - Optional OSC 52 clipboard writes, disabled by default. Clipboard reads from terminal output are not implemented.
See Security for the boundaries between terminal output, local files, remote connections and child-process input.
macOS integration
- Open and focus Shortcuts actions. These actions do not send commands to a shell.
- Secure Keyboard Entry under Shell, with an indicator of engaged state.
- Persistent input-source status (
A,中,あ,한and other language codes) in an independent upper-right toolbar group. Automatic display follows enabled non-Latin keyboard layouts and IMEs; Latin-only setups hide it. Settings also offer prompt-right placement with long-command avoidance, custom colors and always/off modes. The toolbar badge stays while a program runs — Claude Code, an editor on the alternate screen; shell integration hides only the prompt-placed badge during execution. Private IME modes that macOS does not expose use neutral styling. - Sparkle updates through Corta ▸ Check for Updates…, plus an optional daily background check.
Appearance and system status
- A bottom status bar, off by default, with individually selectable local CPU, load, memory, network rates, home-volume free space and four thermal levels. Click for host, macOS version, chip, core count and total memory. Windows share one sampler; hidden bars stop polling. SSH panes still show local data.
- A graphical theme editor in Appearance settings, with separate light/dark previews, color pickers and HEX fields, save/cancel and source-color reset. It saves through the existing configuration file; manual editing remains supported. Built-ins are copied, while custom themes can be edited.
- View → Local host details and Terminal settings expose host configuration even with the bar disabled. View → Theme editor opens color editing directly.
- System Monospaced is the default font; Settings ▸ Appearance also lists
every installed monospaced family whose four faces keep one width (D12),
grouped as Apple's or the user's and labelled when it carries CJK,
in Light, Regular or Medium, at 10–24 pt (13 by default) and a line
spacing of 1.0–1.4 (1.18). A CJK font of the user's choice can lead the
fallback (
font-family-cjk), monospaced or not; otherwise CJK fallback follows the system language (PingFang SC / TC, Hiragino Sans, Apple SD Gothic Neo; kana and Hangul always their own face), wide fallback glyphs are centred in their cells, emoji can draw monochrome where a text face has the glyph, fallback can be switched off, and East Asian Ambiguous characters can be two cells, with configurable size and fixed fallback for missing characters. A configured family that is missing or uneven draws as System Monospaced, and the Font Status row says why. - Cursor shapes are block, bar and underline, with independent blinking; the default is a nonblinking block. Programs retain temporary DECSCUSR control.
How Corta compares
All three offer native macOS interfaces and GPU rendering. Corta combines a Swift terminal core, one shared configuration for text and GUI editing, and an integrated SSH, SFTP and remote-editing workflow. Here is how their implementation and integration choices compare.
| Corta | iTerm2 | Ghostty | |
|---|---|---|---|
| Main implementation | Swift | Objective-C and Swift | Zig core; Swift on macOS, GTK on Linux |
| App platforms | macOS | macOS | macOS and Linux |
| Native UI | AppKit, with SwiftUI settings | Native macOS app | SwiftUI on macOS; GTK on Linux |
| Rendering | Metal 4, with Core Text shaping and font fallback | Metal GPU renderer, configurable | Metal on macOS; OpenGL on Linux |
| Settings | One text file, also edited by the native Settings window | Settings UI and profiles; dynamic profiles | Text configuration, with support for multiple files |
| Integration examples | Shortcuts, OpenSSH, SFTP browser and managed remote editing | tmux control-mode integration, Python API and triggers | macOS Shortcuts and AppleScript; embeddable libghostty libraries |
Last checked 2026-10-13. Other terminals change faster than this page; treat a row as a snapshot and follow the links for the current state. The competitor rows were checked against the official iTerm2 repository, settings documentation, dynamic profiles, tmux integration, Python API and features, and the official Ghostty repository, features, configuration and AppleScript guide.
For native tmux -CC integration or a Python scripting API, consider
iTerm2. For a
terminal app that also runs on Linux, consider
Ghostty; its macOS app also offers
AppleScript automation
from 1.3.0. Corta's macOS-only scope and exclusion of tmux control mode,
built-in AI and a scripting engine are
settled decisions. Ordinary tmux sessions run inside
Corta as terminal programs.
Known limits
- VT conformance is incomplete. The 2026-10-07 esctest2 run recorded 131 passed, 334 known bugs and 102 failed out of 567. The historical 82.0% figure combines passes and known bugs; it is not a pass rate. Raw results retain the failing names.
- Windowed input latency is above target. Full screen with one pane measured 49.1–50.8 ms p50 and 82.9–84.2 ms p99 for a person typing on one M5 MacBook Air with a 60 Hz panel (2026-10-13). Windowed panes use the compositor; the full-screen improvement is a measured comparison on that setup, not a guaranteed difference on every Mac. See Performance §5.17 for the method and hardware.
- Bundled shell integration covers zsh, bash and fish. Other shells need their own OSC 133 hooks for command boundaries; without them notifications use a heuristic.
- Emoji presentation sequences take two columns. Standardized text-default characters with VS16 (⚠️, ✍️, 🖼️) occupy a wide pair, including at a line boundary. Programs must count the full sequence, not each scalar.
- Kitty graphics support direct transmission only. File-based transmission is rejected by design. Animation and Unicode-placeholder placement are absent.
- Prompt marks are not nested. Inside
sshto a host whose shell marks its own prompts (OSC 133), the remote commands are recorded as commands of their own, thesshcommand itself is never recorded as finished, and its exit status marks the last remote prompt. - Remote editing uses managed local copies, not general directory sync. Preserve any local edits before removing Corta's application data.
- Input and accessibility reports remain open. A Settings shortcut failure has not been reproduced; VoiceOver selection reading needs a follow-up listening pass. See Conformance and the changelog.
Built-in multiplexing, cross-platform support, tmux control mode, built-in AI, RTL text and terminal title queries are outside the current scope. The rationale is maintained in Design and Decisions.
Remote-edit uploads check the remote content as well as size and modification
time. Each upload sends the version approved in the prompt. If the local copy
changes after that prompt, Corta asks for a new decision; further saves during
an upload remain pending edits. Once connected, a remote-edit operation that
runs past 120 seconds is stopped and its upload offered again. Managed copies remain on disk with private
file modes. Restored sessions retain arrangement and directory metadata,
with restore-windows = true by default, and start fresh processes without
restoring terminal text. See data-at-rest policy.