Repository navigation
Releases
Corta v1.5.1
Corta v1.5.1
Changed
- About Corta opens in the middle of its display, as other apps' About
windows do, instead of over the window it was opened from. Command
History still opens centered over its window.
Tests and tooling
- SwiftLint now reports nothing over the project's sources, tests and
scripts (1,813 findings before). Each rule kept or adjusted in
.swiftlint.ymlsays why; the generatedCharacterWidth.swiftis
excluded, and the pane controller's file length is judged by
docs/DESIGN.md§4.1 instead. Long functions and types were split into
named steps, extensions andType+Area.swiftfiles, tuples became named
types, andtry!became thrown or reported errors. Behaviour is
unchanged; the frame-CPU baseline is at parity. - The build has no compiler warnings, and Periphery's two scans read
together report no dead code: unused imports, an unused sort overload,
the canvasclearColorand an unused clipboard accessor are gone.
docs/TESTING.mdexplains the package scan on a toolchain whose SwiftPM
builds withswiftbuild.
See CHANGELOG.md for the full history.
Requires macOS 26.0 or later on a Mac with Apple silicon.
Install
Download Corta-1.5.1.dmg and its .sha256 file.
shasum -a 256 -c Corta-1.5.1.dmg.sha256Open the disk image, drag Corta into Applications, then eject the disk image.
SHA-256 9941ec782f387ff8e03e49f251af8dffcf118be4d4f2edd68c7bd135b52dddb7
Built with Xcode 26.6 (17F113)
Corta v1.5.0
Corta v1.5.0
Added
-
Terminal compatibility: title save/restore, live dark/light reports, coloured
single/double/curly underlines, XTGETTCAP capability answers, and Neovim's
underline-style probe. Programs can set/query/reset selection colours and
restore default text, background and cursor colours to the live theme. -
Built-in history suggestions for standard local zsh: type a command prefix
to see the most recent matching suffix faintly, accept with Right/End or
dismiss with Esc. Tab and shell history navigation stay native. Enabled
by default, configurable withhistory-suggestionsand a Terminal settings
toggle; yields to zsh-autosuggestions and leaves startup files unchanged. -
OSC ecosystem coverage (#411): iTerm2 inline PNG/GIF first-frame images,
multipart transfer, host/cwd, marks, clear history, cursor, attention and
clipboard extensions; VS Code shell-integration marks; ConEmu prompt marks;
kitty colour, pointer and bounded text clipboard protocols. A tested OSC
verdict table records implemented forms, no-ops, refusals and limits. -
Claude Code task-state integration on native tabs and the Dock, with a
pane-jumping Agents list in the command palette and Window menu. Claude
Code is currently the only CLI with a dedicated task-state integration;
other tools have process detection and generic protocol support only.
OSC 7501 status,
OSC 9/777/99 notifications, OSC 9;4 progress and OSC 21337 tab metadata
are bounded and sanitised. Background attention uses fixed Corta text;
program notices are labelled pane messages and coalesced per pane. Claude
Code’sdonesignal is distinct from idle; process-only detection shows
unknown state, and ordinary messages or bells do not imply permission or
completion. Tab indicators remain centered when the native tab strip
resizes their accessory. Delayed program notices do not repeat an already
announced wait for permission, and notification authorization includes Dock
badges. -
Right-click a pane to find text, copy the clicked command’s output, or
open/copy a link or file reference under the pointer. -
Paste warnings for shell pipes, sudo, recursive forced deletion,
backslash continuations and concealed Unicode characters, including with
bracketed paste enabled. Review a visible text preview, cancel, or suppress
warnings for that pane;paste-warningselectsdangerous,alwaysoroff.
Fixed
-
Clear Screen (⌘K) immediately keeps a ready integrated shell's prompt and
unsubmitted input visible, with the editing cursor intact. Multiline
prompts, wrapped input, wide characters and deferred wrapping keep their
cell data. No keystrokes are sent to the child and no command is executed.
Scrollback is kept; Clear History and Reset Terminal keep their separate
roles. Alternate-screen applications and editors taller than the screen
are left intact. -
About and Command History open centered over the invoking window, within
the current display's usable area. A window already open stays where the
user put it. Command History uses a fixed size to keep its filters usable,
and shows a localized empty state and command count. -
Rounder Liquid Glass across Corta's floating surfaces. Connect to Host
(and the file browser's host step) has a glass capsule host field, a large
Terminal / Files switch, glass cards for Advanced and suggestions, and glass
Cancel / Connect buttons. The command palette is rounder with a search
glyph and soft row highlights; Command History has a glass search field,
toggles, row buttons and results card; a pane's stopped/failed card is glass
with glass buttons; directory candidates sit in a glass capsule. Connect to
Host is never taller than its window: in a small one it scrolls. -
Stopped and failed session panels are centered in their pane, with the
primary recovery action still receiving keyboard focus. Connection labels
use Host and Open in consistently across the terminal and file browser. -
In zsh vi insert mode (
bindkey -v), Esc over a history or directory
suggestion now dismisses it and enters command mode in one press. -
A finished-command mark printed by a live full-screen program, such as a
log viewed inless -R, no longer turns off its bracketed paste or
keyboard protocol; a crashed program's shell still ends the command at
its next prompt. -
Paste warnings also catch a shell fed without a pipe:
bash <(curl …),
source <(…)andsh -c "$(curl …)". Very large warned pastes preview
their first 64 KiB instead of stalling before the dialog. -
Typing past the end of zsh history no longer rescans the whole history on
every key while history suggestions are on. -
Eight unfinished kitty (OSC 99) notifications no longer block every later
one for the rest of the session; the stalest incomplete message is dropped. -
The command palette no longer selects an agent pane by default, so Return
runs a command; agent matches sort after commands while searching. -
Moving the mouse no longer resets the cursor on every move, which fought
the split divider's resize cursor; a program-chosen pointer shape is kept. -
Copy Command Output is disabled on the alternate screen, where it could
copy an unrelated earlier command's output. -
Clicking a notification from a pane that has since closed brings its
window forward instead of doing nothing. -
The cursor image used for the caret follows program cursor and colour
changes (OSC 10/11/12) like the live cursor. -
A refused or failed kitty clipboard write (OSC 5522) now replies with a
fixedEPERMorEIOstatus, so a waiting program does not hang. -
Marks set with iTerm2's
OSC 1337;SetMarkare now stops for Previous /
Next Command (⌘↑ / ⌘↓), even without shell integration. -
Closing one kitty notification no longer discards another program notice
that arrived just before it. -
A program's wait for permission after a terminal reset (RIS) is announced
again instead of being taken for the wait already announced. -
A selection colour set by a program (OSC 17, kitty OSC 21) keeps the
theme's translucency, so box drawing and underlines inside the selection
stay visible. -
With
directory-completion = false,cdinput now gets history
suggestions instead of no hint at all. -
An iTerm2 inline image is limited to 4096 cells across and down, as kitty
placements are. -
Spaces typed after underlining ends no longer keep an invisible underline
colour, which kept them from being trimmed as blank. -
Directory candidates now appear in a compact, bordered panel beside the
input, flipping above it near the bottom and staying within the pane's
horizontal bounds. The panel no longer paints a full-width strip over
previous output; inline previews and terminal row counts are unchanged. -
Clear stale agent waiting, subtask and progress metadata at reported shell
command boundaries after an abrupt CLI exit, including a CLI left on the
alternate screen. Preserve explicit completion
on clean exit; interruption is Idle and a known failed exit is Failed. -
Cancel resolved fixed attention notices, recheck visibility before delivery,
and deduplicate BEL and kind changes within the same waiting episode.
Generic bells cannot overwrite a pending program message; late cancelled
submissions finish before replacement delivery. -
Reserve a main status slot alongside 32 subtasks. Keep generic OSC 21337
decoration separate so it cannot hide Done or compete with typed state. -
Match development and acceptance version Claude Code 2.1.310 in captured
wire regressions. Document the supported task states and notification
channels, actual sending conditions, unsupported features and verification
limits; other Claude versions are not guaranteed.
Tests and tooling
- Regression checks now assert visible prompt/input cells and cursor state
after Clear Screen, plus continued editing in real shells. Local zsh
completion is verified through three consecutive directory levels;
no completion defect was reproduced and its logic is unchanged. - Limit the existing SwiftLint source inventory to project sources and
scripts, excluding generated build trees; no lint cleanup is included.
See CHANGELOG.md for the full history.
Requires macOS 26.0 or later on a Mac with Apple silicon.
Install
Download Corta-1.5.0.dmg and its .sha256 file.
shasum -a 256 -c Corta-1.5.0.dmg.sha256Open the disk image, drag Corta into Applications, then eject the disk image.
SHA-256 91ec83bfe10887e0ddaf0a6801b044918578b42a13f91447bcd98f8791c4ed32
Built with Xcode 26.6 (17F113)
Corta v1.4.0
Corta v1.4.0
Added
- The project overview, the user guide and troubleshooting are now available
in every language the app speaks: Simplified and Traditional Chinese,
Japanese, Korean, German, French, Spanish and Brazilian Portuguese. A
language bar with flags at the top of each switches between them, and each
translation says which English version it follows.
Changed
-
Run PNG decoding in an independently signed App Sandbox helper app,
replacing the deprecated runtime sandbox interface. -
A pane whose session ended, whose connection dropped or that stopped
working now shows one panel over its dimmed output, which stays
readable — and, once the session has ended, selectable: what ended and
how in a sentence — a dropped
ssh connection names its host and explains exit code 255 — with the
raw reason under Details. Reconnect and New Session start at
once; the panel says the output is cleared, instead of asking again.
Settings… is offered only where a setting can be the cause. -
Connect to Host replaces the separate SSH and Remote Files sheets:
one toolbar button, a Terminal / Files switch, the user, port and key
under Advanced, and recent hosts with their port, key and when they were
last used — forget one with its ✕ or its menu. Hosts that only take git
(github.com, aHostwithUser git) are no longer suggested. From a
remote pane the sheet offers that host's files first. -
The SFTP password dialog says once whom it is for, names what the field
wants (password, passphrase or answer), and its Cancel reads Cancel
Connection. A failed SFTP connection says why — sign-in refused, host
unreachable, host key unknown or changed, no SFTP — with Try Again and
Edit Connection, and ssh's output under Details.
Fixed
- Discard cancelled or superseded font scans and SSH host suggestions.
- Rebuilding Corta reuses one Metal pipeline archive path instead of adding
a new path to Metal's bounded usage index on every build, which could
eventually logMDB_MAP_FULL. Routine accessibility query logs now
require an explicit diagnostic switch instead of filling Xcode's console. - Large SFTP listings convert and sort in the background; superseded work
cannot replace a newer directory or sort order. - Opening remote editing no longer hashes the old cache on the main thread.
Cleanup runs in the background with a per-run work budget. - Remote-edit operations time out after 120 seconds once connected, releasing
a stuck upload and offering its approval again for retry. - Idle block-cursor capture resumes from GPU completion without blocking
the main thread or holding the renderer lock; failed captures back off. - Release SFTP stderr listeners with their channels and prevent PTY signals
from racing child-process reaping. - Cancelling an SFTP password prompt no longer opens it again. OpenSSH
read the cancelled prompt as an empty password, tried it and asked again,
up to three times or more; Cancel now ends that connection attempt.
Cancelling a key's passphrase still only skips that key. - Dropping files from Finder on the SFTP browser uploads them again — into
the folder shown, or the folder row they land on. The drop never reached
the listing. - A terminal connection made from the connect sheet is remembered as a
recent host once it is established, not when Connect is pressed: a host
that refused the connection, or offers no shell, no longer appears. - Reconnect and New Session start the new session at the pane's
size and font size. The child started at the configured window size and
was resized afterwards, so a remote banner and prompt were laid out at
the wrong width, and a ⌘+ zoom was lost. - A pane's failure page is no longer white in a dark window: its colours
were resolved against the app's appearance instead of the window's. - The failure page no longer mentions a Try Again button it does not show.
See CHANGELOG.md for the full history.
Requires macOS 26.0 or later on a Mac with Apple silicon.
Install
Download Corta-1.4.0.dmg and its .sha256 file.
shasum -a 256 -c Corta-1.4.0.dmg.sha256Open the disk image, drag Corta into Applications, then eject the disk image.
SHA-256 dc0aebd53e160fdef4071d00be47dee7c7c724353f0bd40eb9ac9cb3fbfd52ca
Built with Xcode 26.6 (17F113)
Corta v1.3.1
Corta v1.3.1
Fixed
- A large Kitty graphics image no longer freezes every window while it
arrives. Its base64 and zlib were decoded while the pane's state was
locked, and each frame waits for that lock: a 4Kkitten icatheld
the whole app for about 110 ms. The decode now runs with the lock
released, and the image is placed at the same point in the output. - A screen of Chinese, Japanese or Korean text Corta has not drawn
before — a new tab, a zoom step, a page of new output — no longer holds
every window for tens of milliseconds while its characters are drawn
for the first time. New characters are drawn about 8 ms' worth per
screen refresh, shared by every pane, and the rest appear over the next
few frames. - On macOS 26, every terminal window now renders offscreen and presents its
drawable through a classic Metal queue. This avoids the normal Metal 4
drawable presentation path suspected in the repeated WindowServer crashes
of #380. The reporter confirmed a diagnostic build launches normally
on the affected Mac; macOS 27 keeps its measured presentation behavior.
Thanks to @FrankChen-CLC for the investigation and the fix (#386).
Security
- Exported terminal text and Corta's private state — recent hosts,
directory history, window state, the remote-edit manifest — drop any ACL
entry the folder hands down before a byte is written.0600set the mode
bits only: a folder granting another account inherited read access passed
it on to each file, and the rename andchmodkept it. - Updating a shell rc file or the config file keeps its permissions from
the first byte. The new copy was written at the umask andchmoded
after, so a private~/.zshrcholding exported tokens was readable by
other accounts for a moment, and for good if thechmodfailed. - Directory suggestions believe only the pane's own zsh. Any output — a
catted file, a remote shell overssh— could forge the prompt marks
and a suggestion report, and the overlay that appeared took Tab,
Left/Right and Esc from every prompt after it and drew the attacker's
text beside the cursor as if typed. The automatic zsh bootstrap now signs
each report with a per-session secret. A folder name's bidi overrides and
zero-width characters show as U+FFFD, as in the terminal itself.
See CHANGELOG.md for the full history.
Requires macOS 26.0 or later on a Mac with Apple silicon.
Install
Download Corta-1.3.1.dmg and its .sha256 file.
shasum -a 256 -c Corta-1.3.1.dmg.sha256Open the disk image, drag Corta into Applications, then eject the disk image.
SHA-256 229808795792083b98ab95ca4070f7d7a4b8880683927035dcd0ab28ab0ff1aa
Built with Xcode 26.6 (17F113)
Corta v1.3.0
Corta v1.3.0
Added
- Settings ▸ Appearance ▸ Font chooses the terminal font again: System
Monospaced, or any installed monospaced family whose regular, bold and
italic faces keep one width, grouped as Apple's or yours, with a line
saying where the chosen font comes from and whether it carries its own
CJK design. The list follows fonts installed while Corta runs (#372). A
family whose rows are one em tall, as many CJK families declare, gets at
least the configured line spacing, so rows no longer touch. - Typography preferences in Settings ▸ Appearance and the config file:
font-weight(light,regular,medium),line-spacing(1.0–1.4,
default 1.18),font-fallbackandemoji-rendering(color,
monochrome); and in Settings ▸ Terminal,ambiguous-width(narrow,
wide) for East Asian Ambiguous characters, where box drawing then spans
both its cells. - Chinese, Japanese and Korean fall back to the face for the system
language — PingFang SC, PingFang TC, Hiragino Sans or Apple SD Gothic Neo
— and kana and Hangul always to their own script's face, so Japanese
kanji are no longer drawn in Chinese forms on a Japanese Mac. - Settings ▸ Appearance ▸ CJK Font and
font-family-cjkchoose the font
Chinese, Japanese and Korean are drawn in — any installed font with CJK
characters, monospaced or not — ahead of the system language's (#374). - Double (
SGR 21,4:2) and curly (SGR 4:3) underlines, and the ITU
T.416 colon forms of SGR colours (38:2::r:g:b). Other sequences with a
colon are still ignored whole. An underline colour (SGR 58) is
consumed rather than misread as attributes.
Changed
- Config file:
font-sizenow defaults to 13 and takes 10–24 in whole
points; a value outside that range is clamped to it the next time Corta
writes the file. Set it again if you used a size above 24 or below 10. - The terminal's side padding is 10 pt on each side (the left was 14).
SGR 21turns on a double underline, as xterm, VTE and kitty read it,
instead of being ignored.
Fixed
- A symbol the font lacks, such as a prompt's
❯, is no longer drawn bold
beside regular text, nor below the line: macOS answered SF Mono Medium
with Menlo Bold. Arrows, dingbats, geometric and technical symbols from a
fallback font are now drawn in its regular weight and centred where the
font centres its own; braille, Powerline and Nerd Font icons, and pieces
whose height is their meaning (scan lines, bracket pieces, corner
triangles), keep their place. - System Monospaced is drawn in its Regular weight, as every other family
and the CJK and symbol fallbacks are, so text and its fallbacks share one
weight. It was Medium, which left Chinese and Japanese a step lighter
beside it. - CJK in bold text is bold: it was drawn in PingFang SC Regular whatever
the style, and now uses PingFang SC Semibold under a bold face. font-familyin the config file is no longer replaced withsystem. A
family that is not installed, or not one width, draws as System
Monospaced and Settings shows a Font Status row saying why (#372).
Security
- Command History's Run sends Return only for a command its row showed
whole, measured as drawn. The check counted up to 80 characters, more
than the column shows at the window's default width, and a wide
character counted as one: a forged history entry could hide the end of
the command it ran. Run also fills, rather than runs, a command whose
row output rewrote after the list last showed it. - Hovering a line built of combining-mark clusters no longer freezes the
window: joining a row's text took time in the square of its width, and
a link or file-reference check on such a line ran for seconds on every
mouse move. Such a cluster also no longer shifts where a match on the
rest of the line is drawn. - A keyboard-protocol pop (
CSI < n u) costs the depth of the stack, not
thenthe program asked for: a stream of large pops kept the pane
busy far beyond its size. - A long-task notification is titled with the tab's name you gave it, or
its directory. It used the window title, which a program sets with OSC
0 or 2, so any output could post a notification worded as Corta's own.
See CHANGELOG.md for the full history.
Requires macOS 26.0 or later on a Mac with Apple silicon.
Install
Download Corta-1.3.0.dmg and its .sha256 file.
shasum -a 256 -c Corta-1.3.0.dmg.sha256Open the disk image, drag Corta into Applications, then eject the disk image.
SHA-256 2080b19158df17d446fc5efd3b849e1dbd74e9085829dc4c5c73f122c46f1686
Built with Xcode 26.6 (17F113)
Corta v1.2.3
Corta v1.2.3
Added
- The user guide has a Coming from another terminal section: the Corta key
for each habit carried over from iTerm2, Ghostty or Terminal.app (⌥ as
Meta, copy on select, a hotkey window, OSC 52 writes), and what has no
equivalent. README.zh-CN.md, a Simplified Chinese summary of the README's first
screen and installation steps.docs/DECISIONS.mdopens with an index of every decision and its status.
Changed
- The README is shorter: one table of measured figures, each naming the
release it was measured on, and the comparison with iTerm2 and Ghostty
moved to the feature reference. "What is planned" links to the open
issues instead of an empty milestones page.
Fixed
- Rapid clicks on New Tab always append and select the rightmost tab, even
while the previous tab's selection transition is still in progress;
toolbar actions keep their owning window throughout the transition. - SFTP rename, new-folder and upload dialogs keep the directory they opened
for when navigation finishes behind them, and refuse a replacement
connection. Remote-edit change detection, upload snapshots and saving a
copy elsewhere process file contents off the main thread; an older change
check cannot replace a newer edit or an approved baseline. - A pane no longer stops drawing for good after a few ordinary pauses. A frame
dropped just before the window was minimised, covered, moved to another
Space or put to sleep was taken for a stalled GPU when drawing resumed, and
the fourth time in a pane's life it showed the renderer failure. Only a
queue that finishes nothing for a second counts now, and a rebuilt one that
draws for ten seconds starts the count again. - Waits that end in a failure no longer count time the Mac spent asleep: a
shell starting, an image decoding or a remote file opening across a closed
lid is not reported as timed out on wake. quick-terminal-keyrefuses a Shift-only key such asshift+a, which would
have taken capital A away from every application.- A connection that drops on its first request after connecting is reported
by its real cause, not as a lost connection. Closing an SFTP browser or
remote edit no longer waits on the main thread for ssh to exit, and a
dropped connection no longer ties up a thread per pending request while its
cause is read. - The idle block cursor gives up on a GPU busy with other work after 100 ms
instead of holding the window for up to two seconds. - zsh history is saved to
~/.zsh_historyagain with directory completion
on. macOS's/etc/zshrcsetHISTFILEwhileZDOTDIRstill named Corta's
temporary startup folder, so history went there and was deleted with it.
Each zsh session's startup folder is now removed when the session ends,
not only when Corta quits. - Clicking a task notification handles the click on the main thread whichever
thread the system delivers it on.
Security
- A dropped file path, and the directory typed by Go to Parent Directory and
Go to Project Root, is quoted by Unicode scalar. An apostrophe or backslash
joined to a combining mark in a file or folder name was written unescaped,
which closed the quotes and let the rest of the name run as a command. - An SFTP upload, including saving a remote edit, keeps the mode of the file
it replaces — and its group where the server allows — and a file reached
through a symbolic link keeps its target's mode. Replacing a file used to
leave it at the server's default mode, so a private (0600) file such as
.envcould become readable by other users on the host. A new remote file
asks for the local file's permissions, narrowed by the server's umask.
Uploaded files also keep a real access time instead of 1970.
See CHANGELOG.md for the full history.
Requires macOS 26.0 or later on a Mac with Apple silicon.
Install
Download Corta-1.2.3.dmg and its .sha256 file.
shasum -a 256 -c Corta-1.2.3.dmg.sha256Open the disk image, drag Corta into Applications, then eject the disk image.
SHA-256 acbbc747fe76bd49a7b3c446beafcf6a719b322b6a9471307af5ddbd897746bb
Built with Xcode 26.6 (17F113)
Corta v1.2.2
Corta v1.2.2
Changed
- Building a frame's instances takes a third or more less CPU when the whole
screen changes: the per-cell reads of the terminal core and the glyph
cache's ASCII hits are inlined. Text joined by combining marks, emoji
modifiers or flag pairs no longer allocates per character as it arrives.
Removed
- Directory-history favourites. Nothing in the app could ever mark a
directory as one, so the history now ranks by frecency alone; a history
file that still carries the old flag loads as before. - The experimental per-window render thread (
CORTA_RENDER_THREAD=1), which
was off by default and never shown to save power. Every window renders on
the main thread, as it always has by default.
Fixed
- A selection disappears when the program running in the pane rewrites the
text it covers. Claude Code's in-place redraws left a highlight lying
across unrelated text that a click could not remove (#341). - The input-source badge beside the prompt takes its text colour from the
terminal theme, as the directory hint does, so a theme darker or lighter
than macOS no longer draws it dark on dark (#348). - After a crash, restored tabs keep the tab that was selected and the names
given to them: switching or renaming a tab now saves the arrangement, as
moving or resizing a window already did. - A pane no longer risks drawing its whole session in a fallback font
with no letters when macOS's font service hiccups as the pane opens: the
terminal font's fallback list is applied to the font already loaded
instead of looking the font up again. - A split's focus ring, and the settings rows' status icons, follow
Increase Contrast when it is switched while Corta runs, instead of
keeping the width and colour they had until the focus next moved. - The
cddirectory-completion hint takes its colour from the theme —
built-in or defined in the config file — instead of the system label
colour, which drew the alternatives almost black on a dark theme while
macOS itself was in Light mode. A theme change recolours a hint already
showing, and Increase Contrast strengthens it. - The user guide and configuration reference no longer promise a directory
switcher: directory history is recorded and can be cleared in Settings,
but nothing in the app lists it yet. Troubleshooting entries that had
drifted below "Going back to your old terminal" are back under their
topics, and release-specific notes read as current behaviour.
See CHANGELOG.md for the full history.
Requires macOS 26.0 or later on a Mac with Apple silicon.
Install
Download Corta-1.2.2.dmg and its .sha256 file.
shasum -a 256 -c Corta-1.2.2.dmg.sha256Open the disk image, drag Corta into Applications, then eject the disk image.
SHA-256 e5e1aa71a4e0ff0fe02aa2a25b055363b8a21951fc568318db67028025e85685
Built with Xcode 26.6 (17F113)
Corta v1.2.1
Corta v1.2.1
Added
- The SFTP browser and remote editing ask for a password, a key passphrase,
a one-time code or a new host key in a dialog, through OpenSSH's own
SSH_ASKPASS, so a host that takes only a password can be browsed and a
new host no longer has to be accepted in a terminal first. Nothing is
saved; the host-key dialog shows the fingerprint and defaults to Cancel. - The SSH and SFTP connect sheet has user, port and private-key fields
beside the host, the same for both: SFTP can now reach a non-default port
without a~/.ssh/configalias, and a chosen key is offered first, with
otherssh-agentkeys left out. Recent connections remember the fields they were made with.
Changed
- The remote badge at the front of a window title reads Remote: instead
of the⟂symbol, and a connection opened from the connect sheet names
the destination you typed instead of host unknown. Browse Remote Files…
in such a pane connects to that destination without asking for it again.
Fixed
- Configuration and user guides now include every scalar setting in the
complete example and distinguish automatic zsh hooks, remote editing and
protocol queries from older behaviour; documented defaults are checked
against the implementation. - Release preparation and packaging checks accept version-independent README
download instructions, so editing installation prose no longer breaks the
release pipeline. - Renaming a tab and then clicking or switching to another tab, closing a
tab or entering full screen saves the name, instead of leaving the tab
blank and its editor stranded where the tab used to be. - SFTP and remote editing work for a host whose
~/.ssh/configentry has a
RemoteCommand, which made ssh refuse the file channel, and no longer
inheritRequestTTY forceor become aControlMasterthemselves.
See CHANGELOG.md for the full history.
Requires macOS 26.0 or later on a Mac with Apple silicon.
Install
Download Corta-1.2.1.dmg and its .sha256 file.
shasum -a 256 -c Corta-1.2.1.dmg.sha256Open the disk image, drag Corta into Applications, then eject the disk image.
SHA-256 a3d731e48b8df06e04f4e7dcab3bb00358226b884d339dc5b4a086ed94585257
Built with Xcode 26.6 (17F113)
Corta v1.2.0
Corta v1.2.0
Corta 1.2 is a performance release: faster from the byte a program writes
to the pixel on the panel, lighter in memory, and quieter when nothing is
happening. Figures are from one Apple M5 MacBook Air, before and after on
the same machine and toolchain; Performance has each
method and what it does not show.
Changed
- 2.3× the output throughput. The parser and grid take 355.9 MiB/s,
up from 158.0, and output arriving from a shell 317.3 MiB/s, up from
137.2. Runs of printable text are classified 16 bytes at a time with NEON;
common CJK text skips the width table (+23%), andyesruns 70% faster. - A frame less from keypress to glass in full screen. A full-screen
window with one pane presents its frames directly to the display instead
of through the window server's compositor. A person typing sees the median
drop from 64–68 ms to 49–51 ms and the worst cases halve (p99 154–180 →
83–84 ms). Nothing visible changes;CORTA_DIRECT_FULLSCREEN=0turns it
off for a comparison. - The panel's full refresh rate while you type. Typing, committed
input-method text, paste and mouse reports lift the frame-rate ceiling to
the panel's maximum — 120 Hz on ProMotion — and it settles a second after
the last key. Critical thermal pressure still limits it. - Scrolling reuses what is already drawn. Scroll regions, history and
inserted or deleted lines shift the rendered rows instead of rebuilding
them: a one-line region scroll takes 0.026 ms of CPU a frame instead of
0.130, and output arriving while you read history 0.010 ms instead of
0.096. Screen rows keep their memory as they scroll. - Scrollback in a fraction of the memory. Cold history is compressed in
memory as it arrives, off the terminal lock: 100,000 lines of 120 columns
take 11.4 MiB instead of 185. Search, resize and reflow read it in place. - Smaller GPU footprint. A rendered quad is 24 bytes instead of 48, and
glyph atlases grow on demand: four panes at a prompt hold about 1 MiB of
atlas instead of 81 MiB. The atlas's rectangle table is uploaded only when
it changes. - Quieter at rest. An idle blinking cursor is animated by Core Animation
instead of redrawn every half second; an idle shell no longer wakes its
reader four times a second; a pane you cannot see drops its reader to
background priority after two seconds, and returns to interactive
priority the moment you type or paste. - Kitty images are decoded by the sandboxed helper straight into memory the
GPU reads, with no copy through the app, then moved into GPU-private
storage; raw RGB/RGBA images are converted in place. - The disk image is an APFS volume compressed with lzma, about 15% smaller
to download than 1.1.9's. Opening it shows a fixed window with Corta, an
arrow and the Applications folder. - Changing the font size (⌘= / ⌘− / ⌘0, a pinch or Settings) keeps the
window's frame; only the rows and columns refit, as in full screen and
with splits. - An ended session shows a compact, centred card with accessible
New Session and Close Pane buttons that fit narrow panes. - An opt-in per-window render thread (
CORTA_RENDER_THREAD=1) is available
for testing; it stays off by default.
Fixed
- With View ▸ Show Tab Bar on, a new window opens at the configured
rows
instead of two or three rows short. - Kitty images inside a scroll region — and lines inserted or deleted around
them, as vim, less and tmux do — move with their text and are cropped at
the region's edge, including in the alternate screen and with scrollback
off. - A Kitty image near the 16-million-pixel limit whose width needed padding
for the GPU was refused; it now shows. Narrow images and many small ones
no longer fill the image budget early, and an image whose upload met a
busy GPU is retried instead of staying blank. - In full screen, a frame whose rendering failed is redrawn instead of
being presented as drawn. - Square table corners stop at the strokes they join instead of protruding
past the border, at every display scale. - Directory suggestions hide while an input method composes text, so they
no longer overlap the preedit or the candidate window. - Input-method and accessibility cell positions match what is drawn while a
live resize briefly makes the grid taller than its pane. - Idle blinking cursors give way to the drawn cursor before new output
renders, so a cursor is never shown twice. - Automatic focus reports no longer raise a hidden pane's reader priority;
only your input does. - With
CORTA_RENDER_THREAD=1, a GPU that stops responding no longer takes
the app down when a pane closes or the font changes.
Security
- The image decoder's sandbox is verified by the test suite instead of by a
deliberate denied file read on every image, which logged a sandbox
violation for each picture shown. - Every pull request is scanned by CodeQL (Swift, C, Python and workflows)
and dependency review before it can merge.
See CHANGELOG.md for the full history.
Requires macOS 26.0 or later on a Mac with Apple silicon.
Install
Download Corta-1.2.0.dmg and its .sha256 file.
shasum -a 256 -c Corta-1.2.0.dmg.sha256Open the disk image, drag Corta into Applications, then eject the disk image.
SHA-256 5c4d825b1d1c92496b716f58be24587e238540f35229a55735a095ccdf8b3e59
Built with Xcode 26.6 (17F113)
Corta v1.1.9
Corta v1.1.9
Changed
- Future releases use a signed, notarised disk image (
.dmg) for installation
and automatic updates. Earlier releases keep their original ZIP files.
Added
- Discussions now have forms for questions and early ideas; bug reports ask
for diagnostic information when Corta freezes or crashes.
Fixed
- Cancelled SFTP uploads keep only their confirmed contiguous prefix before
resuming; out-of-order in-flight writes could leave a hole that a retry
skipped by trusting the partial file length. - Focusing a window by its Shortcuts identity brings the requested window
forward even while macOS is still activating the application. - A screen overflowing the glyph atlas no longer makes every unrelated cell
change re-shape an entire frame of text; deferred first paints that fit
still fill in across frames.
Security
-
Inline images (the Kitty graphics protocol) are decoded in a separate,
sandboxed process with no access to files or the network, so a flaw in
the system's PNG decoder can no longer reach anything Corta has been
allowed to read. -
Updates are checked harder: Corta refuses an update feed that is not
signed with its update key, with no grace period, and checks a
downloaded update's signature before unpacking it rather than after. The
feed's notes, links and flags were not covered by any signature before. -
The update feed's own check now refuses an entry that carries release
notes, a link or an update flag, which Sparkle would act on and the
update's signature does not cover; the feed has never published any. The
release check also refuses an app in which any part could be debugged,
load another developer's libraries, or search outside the app for them. -
The SFTP browser and remote editing no longer forward your SSH agent, X11
or ports to the host, and never run aLocalCommand, whatever
~/.ssh/configsays for it — assftpitself does. AForwardAgent yes
meant for interactive logins reached a host named by a remote shell's own
report. -
Retrying a failed transfer after Change Host no longer sends it to the
new host. The row named the host it was queued for, and Retry ran on
whichever host the browser was connected to by then. -
Run in the command history fills, rather than runs, a command the
list cannot show whole: more than one line, longer than 80 characters, or
holding a tab. The records come from shell-integration marks that any
program's output can imitate, so a part you never saw could run. -
A working-directory report (OSC 7) is believed only where the kernel puts
the shell or the running program. Any output — a remote shell, orcatof
a file — could name a local folder by leaving out the host, and new tabs,
splits, restored windows and the directory history followed it. -
Editing a remote file by ⌘-click or Edit copies at most 64 MB, and any
download stops if the server sends more than the size it stated, or more
than a READ asked for. A server that gave no size could fill the disk with
no progress row to cancel from. -
The SFTP browser shows control, right-to-left and zero-width characters in
a remote name as�, and saves them as_, soinvoice\u{202E}fdp.shno
longer reads asinvoicehs.pdf. -
Remote-edit copies are removed 30 days after their last use (when remote
editing is next used), unless they hold an edit not yet uploaded or
dismissed. A file opened once stayed in
Application Support, and its backups, for good. -
Exported output and selections are written readable by you only (
0600). -
A remote-edit copy from 1.0.x, which recorded no content digest, now asks
the conflict question before its first upload, as the security notes
always said; size and time alone miss a same-size change within the
second. Upload Anyway records the digest for next time.
Added
- A pane whose session has ended says so until you act: a bar names the
exit code or the signal, and offers New Session (or Reconnect for
anssh-style command) and Close Pane. The last output stays readable
and selectable, and no caret is drawn. A program that exits back to the
shell's prompt is not the session ending, and shows nothing.
Fixed
- Two uploads to the same remote file no longer share one partial file. The
second could finish and report success while the first, still writing
through its own handle, changed the file it had committed. Transfers to
one destination now take turns, from any browser window, folder transfer
or remote-edit save, and a transfer from zero writes a partial of its own. - On a server without
posix-rename, a failed overwrite can no longer lose
both files. The old file is renamed aside rather than removed, put back if
the new one cannot take its name, and removed only once it has; if even
putting it back fails, the error says where both copies are. - Save Local Copy Elsewhere no longer deletes the file you agreed to
replace when the copy then fails. The copy is made beside it first and
only then renamed over it. - A transfer whose source shrinks, grows, is rewritten or replaced while it
is read now fails, and leaves the destination as it was. It used to
commit what it had read — a truncated or mixed file — and report success. - Ctrl-C reaches a program that stopped reading in the middle of a paste's
last chunk. With nothing of the paste still queued, Ctrl-C waited behind
the blocked write instead of interrupting the program. - Opening a remote file no longer waits forever on a server whose SFTP
service never answers: the connection is given up after 30 seconds, a
cancelled open stops waiting at once, closing the pane cancels its opens,
and the next open connects afresh. - The Quick Terminal no longer disappears just after it was summoned, when
the summon came while an earlier hide was still sliding out. - A setting changed in Settings no longer writes over an edit to the config
file made a moment earlier, before Corta had read it. - Changing the font size while a frame was still being drawn could show
glyphs from the new size in that frame. The glyph atlas now leaves the
textures a queued frame uses alone. - Plain-text search stays fast on long lines with a near-miss query, and
stops promptly when the query changes, instead of finishing a scan that
could take hundreds of milliseconds. - Clicking a long-task notification lands on the pane that posted it, not
the first pane of its window with a command of the same number. - VoiceOver's selected text includes the last selected character, and a
single selected character is reported as a selection. - A cancelled upload resumes from where it stopped on OpenSSH servers,
instead of starting over: every write moved the partial's timestamp, so
it no longer looked like the same file. - Uploading a folder that was moved or deleted while it waited in the queue
now fails, instead of creating an empty remote folder and reporting
success; an unreadable subfolder fails the upload too.
See CHANGELOG.md for the full history.
Requires macOS 26.0 or later on a Mac with Apple silicon.
Install
Download Corta-1.1.9.dmg and its .sha256 file.
shasum -a 256 -c Corta-1.1.9.dmg.sha256Open the disk image, drag Corta into Applications, then eject the disk image.
SHA-256 8351a5e98d91745f5c7651ae692ed846b7b0670fbf1aa8ce2432c9f0efe0931f
Built with Xcode 26.6 (17F113)