Linelark Notepad Studio
What shipped in 1.15.0.
A new version is offered from the titlebar
- The Studio edition has never had a way to learn that a new version exists. The App Store keeps the sandboxed build current; the direct download has relied on you going to look. A button now appears beside Linelark’s own name when a newer release has been published — Update to Linelark 1.16.0 — counts the download up in its own title, and then offers to open the verified image.
- There is no button the rest of the time, which is almost all of the time. One that sat there saying “up to date” would be a permanent reminder of a question nobody asked.
- It reads the same manifest the download page reads, so the app and the site describe one release rather than two. Taking a download from the network is a larger thing than reading a version number, though: it cannot name a host —
httpsondownloads.linelark.com, compiled in — and the checksum in the manifest proves only that the bytes arrived intact, since whoever writes the manifest writes its digest too. What proves the image is Linelark is its Developer ID signature, checked against this project’s team before the image is ever offered. - Verifying is not installing. It stops at a checked image in your Downloads folder and opens it, so the drag to Applications stays yours and Gatekeeper still checks notarization at first launch. Replacing a running app needs a helper that outlives it, which is the most security-critical code an app can carry and is not worth adding for the sake of one drag.
Plugins can read what a command printed
- A plugin could already hand command lines to a shell in the terminal panel, where you can watch them, stop them and answer a password prompt — and get nothing back. That is right for a build and useless for
xcodebuild -list -json, so a panel that wanted to offer the schemes in a project, the targets in a Makefile or the scripts in apackage.jsonhad to ask you to type what the tool already knows. runQueryis the missing half: one command, no shell, no terminal, resolving with an exit status and the two streams. The host API is at generation 12.- It is its own declaration and its own switch, not a wider reading of the one that already exists. An ordered permission where “may run commands in the terminal” implied “may run hidden commands and read their output” would have widened a yes already on disk without asking anybody — and a plugin genuinely needs both, since a shell you can watch and a query that reports back are not versions of each other.
- There is no list of blessed executables, because that would only put some particular toolchain’s vocabulary in the editor. What is enforced is the part that is not theatre: no shell at all, so quoting is not a category of problem; an argument list refused whole if anything in it is not a string, since a value vanishing out of the middle of an argv yields a different command rather than a failed one; a deadline; a size cap enforced as the bytes arrive; and a command that fails reported as an answer rather than as an error, because tools exit non-zero for ordinary reasons.
The terminal header lost two buttons and gained a useful one
- The pin and Clear are gone from the header. A pin is a statement about a tab closing hours from now, sitting beside buttons that do something the moment they are pressed — and on a project terminal it was not even a control, just a filled pin saying “this one stays”. Clear sat next to the restart arrow looking like a second way to say the same thing. Both keep their place in the Terminal menu, where Clear already had ⌃⌘K.
- In their place is ⇄, the button the Claude Code panes have: it ends the shell and puts the chooser back up, so a terminal that should now be about a different file or project is two clicks rather than a hunt through the picker.
- And the restart arrow now restarts the pane whose header it is. In a split it acted on whichever column had the keyboard, so pressing it in one column could restart the other.
A release can no longer quietly lose the one before it
- Publishing overwrites the single manifest the site reads, so the version being replaced has to be copied into the public archive first — a hand step that had been missed twice, taking 1.6.2 and 1.7.0 off the download and changelog pages while their versioned URLs went on serving them perfectly well.
- The deploy now refuses to publish while the live version is missing from that archive, and asks before the build rather than after five minutes of compiling and a round trip to Apple. It is asked of the published manifest rather than of the checkout, because the version at risk is whichever one is actually live.
Known limits in 1.15.0
- The update button offers a download; it does not install one. There is no background update, no silent replacement, and nothing is ever fetched without the button being pressed.
- The check is Studio-only, as is everything a plugin query touches. The Mac App Store edition updates itself and has no terminal, no network for plugins and no command running at all.
- A plugin’s query has to come from something you clicked, and an
awaitends that click — so two queries awaited one after the other lose the second, and a plugin asks for several at once instead. Loosening it would mean a plugin that can start processes with nobody at the machine. - There is still no watchdog over a plugin’s own script: one that never returns hangs the app, because the only way to interrupt it is private API that cannot ship on the App Store.
- Code folding and recorded macros remain roadmap items with no promised date.
