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

An integrated terminal is not unusual — VS Code, Nova and Zed all have one. What is worth describing is narrower: the shell starts in the file’s own folder, and when a command you run rewrites the file you are editing, the editor already knows what to do about it.

Studio 1.4.0 · macOS 14+6.5 MB download

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

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.

03

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.

04

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.

05

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.

06

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.

07

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.

08

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.

09

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.

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.4.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.
  • One shell per tab, and it goes with the tabClosing the tab ends its shell. There is no session that outlives the file it was opened beside.
  • No tabs, splits or profiles inside the panelIt is one shell in one panel. iTerm2 and Terminal.app remain better terminals; this one is better positioned.
  • 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.
  • 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.

Choose a release 6.5 MB · versioned checksums on the download page