A real login shell,
one per tab, that knows which file you are looking at.

Plenty of editors have a terminal panel. Two details here are narrower than that: the shell starts in the folder of the file you are on, and when a command rewrites the file above it, the tab already knows how to handle that.

Studio 1.19.0 · macOS 14+8.7 MB download
Linelark Studio with two terminals side by side below the editor, one running a build and one listing the project folder
Two shells, bound to the project folderStudio 1.19.0 · macOS 14+

What the panel actually starts, and what happens next.

A pseudo-terminal running your login shell, with an environment assembled deliberately rather than inherited wholesale — and a defined answer for the moment a command in it changes the file above it.

01

It starts in the file’s own folder

The working directory is the directory of the file in the tab, not the project root. If that folder has gone, it falls back to the open folder, and then to your home directory. Two tabs holding files in different folders give two shells in different places.

02

Or it belongs to a workspace folder instead

A terminal can be started for one of the workspace’s roots rather than for a file, which is the shell you want for a build or a test run. The panel asks which you meant when there is a real choice, and lets you switch between the shells that are already running.

03

Pinning keeps a shell past its tab

A file terminal ends with its tab unless you pin it. A pinned shell keeps running, and reopening that file takes it back over rather than starting a second one. A project terminal is pinned by definition.

04

The panel divides into up to three shells

Terminal ▸ Split Terminal (⌃⇧5) splits the panel into columns the way the editor splits into panes. A split is a second shell on the same binding — same file, same pin, ended by the same tab — started in the directory the shell it came from is currently in, which is usually the folder you just changed to.

05

A clean tab reloads itself, silently

Run a formatter and the tab updates. It does not ask, deliberately: once a terminal can write to these files, a confirmation per file would mean a dialog storm for a command you just typed yourself.

06

A tab with unsaved edits is never overwritten

It asks — “changed on disk. This tab has unsaved changes. Reload and discard them?” — with Reload and Keep Mine. Choosing Keep Mine moves the recorded modification date forward, so it does not ask again about the same change.

07

Your login shell, with -l

The shell is started as a login shell so ~/.zprofile and friends are read. Tools installed by Homebrew or a version manager are on PATH because the shell set it up the way it always does.

08

TERM and COLORTERM are set properly

TERM is xterm-256color and COLORTERM is truecolor, so programs that check before emitting 24-bit colour actually emit it.

09

TERM_PROGRAM says Linelark

That is the variable tools read to find out which terminal they are inside, and answering it honestly is how they adapt correctly.

10

Linelark_FILE names the front file

The working directory only ever said which folder. This says which file, which is the thing a command-line tool usually wants.

11

It is set or removed, never inherited

The app can itself be launched from one of these shells. Without clearing it, an untitled tab would inherit a stale value and claim to be somebody else’s file.

12

Debug leakage is stripped

OS_ACTIVITY_DT_MODE and friends are removed from the child environment, or programs launched from a development build think they are being debugged.

13

A model proxy that runs while a shell does

Studio can start CLIProxyAPI with your first terminal and stop it a few seconds after the last one closes, or when you quit. Point Claude Code or Codex at its local address and they can use the models of the other accounts you have signed in to there — a GPT or Gemini model from inside Claude Code, say. A proxy already running is used as it is and never stopped behind your back.

14

The side panels keep their full height

By default the terminal sits under the editor alone, so the folder tree and the right dock run the whole height of the window beside it. The titlebar’s layout switch, or Terminal ▸ Terminal Between Side Panels, runs it across the full width instead.

The environment a Linelark shell starts with.

Everything you already have, with these forced on top.

VariableValue and why
TERMxterm-256color — the baseline every curses program understands.
COLORTERMtruecolor — what programs check before using 24-bit colour.
TERM_PROGRAMLinelark — how a tool identifies its host terminal.
Linelark_FILEThe absolute path of the file in the tab above, or unset for an untitled one.
LANGDefaulted to en_US.UTF-8 only when neither LANG nor LC_ALL is already set.
Working directoryThe folder containing the file in the tab, falling back to the open folder, then home.

Read from the Linelark Studio 1.19.0 source, not from its documentation. Where the two disagree, this is the one that ships.

Before you make it your only terminal.

It is a real shell, but it is a shell in a side panel, and the edition you install decides whether it exists at all.

  • The App Store edition has no terminalThe sandbox rules that edition ships under do not permit spawning a login shell, so it is excluded from that build entirely along with git. The terminal is a Studio feature and Studio is the direct download.
  • Three columns is the ceilingThe panel splits into at most three shells side by side. iTerm2 and Terminal.app remain better terminals; this one is better positioned.
  • Terminals are not saved with the sessionA relaunch starts with no shells, and a split column is not restored at all — closing its pane ends it. Pinning survives a tab, not a quit.
  • A project terminal is not closed with its folderClosing a workspace leaves its shells running until they are closed by hand, because a running command is not something to end on your behalf.
  • No profiles, and no shell but yoursThere is one login shell, the one your account is configured with. Nothing in the panel chooses a different one or stores a set of named configurations.
  • Linelark_FILE is set at spawnA shell that is already running does not learn about a file you open afterwards — the variable was set when it started.
  • External changes are noticed, not watched continuouslyClean tabs are refreshed while the terminal is in use, and the prompt for a dirty tab arrives when the app is next activated. This is not a filesystem watcher reacting within milliseconds.
  • The proxy is yours to install and configureLinelark starts and stops CLIProxyAPI; it does not install it, sign you in to anything, or point your agents at it. EasyCLIProxyAPI does the setup, and the status bar’s Proxy dot links to it when no proxy is found. Turn off its own start-on-launch if you want the terminals to decide when the proxy runs.
  • Detection is by modification dateA change that leaves the modification date untouched is not detected. In practice that means ordinary tools are covered and deliberate timestamp preservation is not.

Open it on
your own files.

Apple-notarized, macOS 14 and newer, Intel and Apple silicon.

Download Studio 1.19.0 8.7 MB · every version, with checksums