Skip to content
Home » Looking For Notepad++ On MacOS? Try Linelark

Looking For Notepad++ On MacOS? Try Linelark

Most text editors are in an arms race to become an IDE. Linelark Notepad is going the other way — and it found something interesting on the road back.

It’s a native macOS editor, built in SwiftUI over a hand-rolled AppKit text stack, and the whole download is 6.4 MB. That’s not a typo. Your average Electron editor spends more than that deciding what font to use. But the reason it caught my attention isn’t the size — it’s a single environment variable.

The feature nobody else shipped

Here’s a problem you’ve hit if you use a command-line coding agent. You open a terminal next to your editor, you start Claude Code or whatever else, and the agent knows exactly one thing about your context: the working directory. It knows the folder. It has no idea which of the four hundred files in that folder you’re actually staring at.

So you paste the path. Every session. Forever.

Linelark runs one shell per tab, rooted in that file’s folder, and exports $LINELARK_FILE into it. Switch tabs, and you switch to a shell that already knows where you are. That alone would be a nice touch, except an environment variable is inert — Claude Code doesn’t read the environment. So there’s a menu item, Terminal ▸ Set Up Claude Code Integration…, which installs a SessionStart hook into your own ~/.claude that hands the path over as context at the start of every session. It tells you exactly what it’s about to write, it’s idempotent, and it refuses to touch a settings file it can’t parse.

It’s a small feature. It is also the first time I’ve seen an editor treat “which file is on screen” as something the AI in the pane below deserves to know.

The editor underneath

Strip away the clever bits and you still have a genuinely good text editor, which is the part people usually skip. Syntax highlighting covers 69 languages from a database the developer authored and curated by hand rather than importing from somewhere else — which sounds like a boast until you notice the practical consequences: .m maps to Objective-C rather than MATLAB, and block-comment tokens only appear for languages where they’re actually legal inline.

The highlighter scans a line at a time and caches the state each line ends in, so a block comment opened three thousand lines up still colours correctly, and an edit only invalidates the cache from its own line down. Files up to 256 KB repaint whole; bigger ones paint what you can see and walk the cache forward quietly.

The file-handling is the unglamorous stuff that separates a text editor from a toy:

  • Eleven encodings — UTF-8, UTF-8 BOM, UTF-16 LE/BE, Latin-1, Windows-1252/1251, Mac Roman, Shift-JIS, EUC-JP, US-ASCII — with Reinterpret as when the guess was wrong
  • Line endings detected on open, preserved on save, converted from the menu when you want them converted
  • Language detected from the extension, the whole filename (MakefileDockerfile) or the shebang
  • Column selection with ⌥-drag, a column editor for number sequences, and the full complement of line operations — sort, dedupe, join, move, duplicate
  • Find in Files across an open folder with extension filters and clickable results

There’s a session snapshot that backs up untitled tabs and unsaved edits while you type, so quitting doesn’t nag you about unsaved work and a crash doesn’t cost you anything. Five original themes, light/dark/follow-system, and a document map with a draggable viewport.

The same file, twice, honestly

You can split the editor into two or three columns, two rows, or a 2×2 grid, and drag tabs between panes the way VS Code moves editors between groups. Fine — table stakes.

What’s less common is opening the same file in two panes and having it behave correctly. Both views share one buffer: type in either and the other follows, undo reaches across, bookmarks are shared, and each pane keeps its own selection and scroll position. Closing one view leaves the file open in the other. The layout and every pane’s tabs come back on relaunch.

The developer is upfront that this cuts both ways — an undo in one pane changes what the other pane is looking at, which is inherent to sharing a buffer but easy to mistake for a bug. That kind of honesty shows up repeatedly in the project’s own documentation, and it’s rare enough to be worth naming.

Plugins that can’t read their own secrets

Linelark plugins are JavaScript — a folder with a manifest and a script, each running in its own JavaScriptCore context, so two plugins share no heap and can’t reach into each other’s state. Commands appear under the Plugins menu, and an edit a plugin makes is an ordinary undoable edit, named after the command in the Undo menu.

The security design is where it gets genuinely interesting. A plugin that wants the network declares its hosts in the manifest, and you grant them — exact hosts, no wildcards, so api.example.com never quietly means evil.api.example.com. Consent is opt-in, revocable while the plugin is running, and tied to a fingerprint of what you agreed to, so a plugin that updates itself to reach four new hosts loses the yes it had.

And the credentials never reach the plugin. There is no API call that returns a stored secret — only hasSecret(name), which answers a boolean. The host attaches the key to outbound requests bound for the host it was tied to, as a header, after the plugin’s own headers of that name have been dropped. The plugin can prove a key exists and can cause it to be sent somewhere it was already allowed to send. It cannot read it.

A plugin can also do git — branch, status, diffs, history, and with a second explicit grant, stage, commit, fetch, pull and push. Force, reset, clean and merge aren’t in the API at all, and pull is fast-forward only. You can’t hand a sidebar a job it has no way to finish.

There’s a published catalog with six plugins at the time of writing — Compare Files, Document Preview, GitHub, Scratch Notes, Sort Lines and Story Bible — and the app verifies the archive size and SHA-256 before installing anything. Plugins can also contribute sidebar panels and full-document previews, but they do it by returning a description of what to show. Linelark draws every pixel. No WKWebView, no plugin-supplied CSS, nothing that can mishandle your theme or run script inside a preview.

Two editions, one caveat

Linelark Notepad Studio is the version you can have today: free, 6.4 MB, macOS 14 Sonoma or newer, universal for Apple silicon and Intel, notarized, no account required. It’s the full thing — terminal, plugin installs, network, git.

Linelark Notepad for the Mac App Store is listed as preparing. It’s sandboxed, which means no terminal, no Claude Code hook, and no plugin network — the sandboxed build ships without the network entitlement entirely, so a request there isn’t just refused, it couldn’t leave the process. Good engineering, but know which one you’re getting.

What it doesn’t do

The project publishes its own list of limits, which made this section easy to write and is itself a point in its favour. The ones you’d actually notice:

  • Single window. Panes are per-window and there’s one window. If you work across two displays, this will bother you.
  • The folder tree doesn’t watch the filesystem. Files created outside the app need a manual refresh.
  • Bookmarks don’t survive closing the tab. They live as long as the tab does.
  • No plugin watchdog. Plugin commands run on the main thread, and JavaScriptCore’s execution time limit is private API that an App Store build can’t touch. A plugin that throws is caught and reported by name; a plugin that loops forever hangs the editor.
  • The function list is regex-based, so it approximates rather than parses. No language server, no go-to-definition, no refactoring. That’s the “not an IDE” part, stated plainly.
  • Find in Files caps at 5,000 hits and skips binaries and files over 4 MB.
  • Code blocks inside a plugin preview aren’t syntax-highlighted, and a preview re-renders whole when the text settles rather than incrementally.

The verdict

Linelark isn’t trying to replace your IDE, and if you want one, this review has been a waste of your time. What it is: the editor you reach for when you need to open a 40 MB log, fix an encoding, run a regex replace across a folder, or edit a config file without waiting eleven seconds for a workspace to index.

The AI angle is the part I keep coming back to. Not because it’s flashy — it’s one environment variable and a hook file — but because it identifies a real, boring, universal friction in working with coding agents and just fixes it. Most tools chasing the AI wave are bolting a chat panel onto the side. This one asked what the agent actually doesn’t know, and told it.

It’s free, it’s 6.4 MB, and it doesn’t want your email address. The cost of finding out is about ninety seconds.


Download Linelark Notepad Studio 1.3.0

Linelark Notepad Studio 1.3.0 · Free · macOS 14 Sonoma or newer · Apple silicon and Intel · 6.4 MB · linelark.com

Disclosure: this article was written with material supplied by Linelark’s developer.