Linelark Notepad Studio
What shipped in 1.14.0.
The folder tree and the plugin panels follow the filesystem
- The tree has always needed a button pressed, and so has every plugin panel. A file made in the terminal, a branch switched, a
git pull, an agent writing to disk — all of them left both describing a state that was no longer true, and the only way to find out was to ask. - There is now one watch per window over the folders that window has open, and it follows those folders by construction rather than by every command that changes them remembering to say so.
- An event is classified once, into two things. Relisting a directory is what the tree needs and is wasted on a
git status; a panel’s redraw is ten subprocesses in the GitHub panel’s case and is wasted on a file whose bytes changed where it already sat. One rule does the whole of it — a hidden entry is content and never listing, because the tree does not draw hidden entries — which is exactly why a commit made in a terminal reaches the GitHub panel and leaves the tree alone. - A burst is one refresh. Without that, a save is three refreshes and an
npm installfreezes the tree for its whole duration, because a debounce that keeps restarting never gets back to rest.
Reveal in Folder Tree
- On a tab’s context menu and on every Find in Files result: the tree opens the folders down to that file, scrolls to it and marks it. Before this the tree could highlight the front tab but never reveal it, so a file reached from a search was drawn as selected only if its folders happened to be open already — a highlight on a row nobody could see.
- What it needed first was for the tree to stop keeping its open folders inside each row. That state could not be reached from a search result or a tab, and it was thrown away whenever the sidebar switched panels — so the tree also forgot its shape every time you glanced at the function list. That is fixed for nothing as a consequence.
- Recent Files does not have one yet.
⌘W closes the window when it closed the last tab
- It closed the tab and stopped there, so closing tabs one by one ended at a window that ⌘W then did nothing to at all. Close Window is on ⌥⇧⌘W, which nobody reaches for by accident, so the honest description of the old behaviour is that the window could not be closed from the keyboard by someone who did not already know that.
- Safari’s rule, which is what ⌘W means on this platform: the tab goes, and if it was the only one the window goes with it. Only from the three gestures that mean “close this one” — ⌘W, the tab’s ✕ and its Close item — and never from Close All, which is a statement about tabs and deliberately leaves the window standing. The app quits after its last window closes, so ⌘W on the last tab of the only window quits Linelark, after the same unsaved-changes question.
The Claude Code panel reaches your tabs on first launch
- The right dock shipped two panels side by side and only one of them could read the tabs above it. The panel running the vendor’s
claudeexported the socket and nothing that read it, so it reached the editor only after somebody found Set Up Claude Code Integration… and ran it — which most never will. - The app is the one launching that pane, so it now simply says so on the command line. The installed integration is not made redundant: it stays the route for every shell the app does not launch — the panel below the editor, iTerm, anywhere else — and only a registration can serve those.
- Unlike the headless panel, this one is not narrowed to Linelark’s own tools and nothing is pre-approved. A panel whose whole premise is the vendor’s tool unmodified is the last place to drop the MCP servers you configured, and a prompt in a terminal you are watching is a question you can answer.
The terminal can draw with Metal
- Preferences ▸ Terminal ▸ Draw with Metal, off by default. The path it replaces lays out every visible row through CoreText on each invalidation, and a scroll invalidates the whole view, so scrolling a tall pane costs most of a core for as long as the trackpad is moving.
- Turning it on needs nothing installed and nothing rebuilt — the shader is compiled once at first use, about 150 ms — and a renderer that will not start leaves the view where it was and says why in the same pane rather than failing silently.
Plugins can import a web page
importWebPage()opens a browser the user drives: they type the address, watch the page load, review what was extracted and press Import. Nothing reaches the plugin until then, and what it gets is the text, the title, the URL and the format — never a bridge into the page, shared cookies, or a way to evaluate script in it.- It has to be called straight from something you clicked, so a plugin cannot put a browser on screen from a timer. The host API is at generation 11.
Two things that were in the way
- A backup now costs what you typed, not what you have open. The session snapshot copied every unsaved buffer out whole a couple of seconds after each burst of typing, so a large unsaved file was rewritten in full for one line. Above 64 KB the edits are appended beside the snapshot instead, and the snapshot itself is rewritten only when that record has grown to half its size. Every record carries its own length and checksum and is replayed only as far as it checks out, because the crash a backup exists for can land in the middle of writing one.
- A rebuilt pane no longer takes the keyboard out of a shell. Hosting an editor and focusing a terminal both have to finish on the next turn of the run loop, so which one the app reached second decided who had the keyboard — and that order shifts with how the app was built. A pane rebuilt around the tab already in it now asks for nothing at all: only a tab arriving in a pane takes the keyboard, which is you asking for that document.
Known limits in 1.14.0
- The watch is FSEvents, which reports local volumes. A project on a network share may produce nothing at all, and the panel header’s refresh button and View ▸ Refresh Folder Tree remain the answer there.
- It does not reload your open tabs, and that is deliberate: relisting a directory is not a decision and replacing what is on screen is. A tab with no unsaved edits still reloads itself while a shell or a writing agent is running, and otherwise you are asked the next time the app comes forward.
- The Metal renderer and the Claude Code panels are Studio only — the sandboxed Mac App Store edition has no terminal at all — and so is the web importer, which needs WebKit and the network.
- Backups are journalled only above 64 KB, and the snapshot is still rewritten whole each time the journal reaches half of it, which a long session editing one large file reaches more than once. Nothing is flushed to the disk by force, so what a power cut costs is whatever the filesystem had not yet written — the same bargain the snapshot has always made, and the reason the debounce is seconds rather than minutes.
- The keyboard is settled for a pane being rebuilt, not for the first pane of a window appearing in the same moment a terminal asks for focus: both of those are somebody asking, and the later one still wins. It takes a window opening straight onto a terminal to reach it.
- Code folding and recorded macros remain roadmap items with no promised date.
