VersoWrite.·NoughtCalculate.·SkeinConnect.

Blog·25 August 2026

The case for plugins

Written by someone who decided against them, which is the only way to write it honestly.

Skein has no plugin system and never will. That makes me the worst person to explain what plugins are for, and the only one obliged to. An argument you make against a position you have already refused is worth nothing unless you put the other side at full strength first.

So, at full strength.

Plugins are not a feature list. They are permission.

The mistake people make about plugin ecosystems is counting them. Obsidian has over four thousand plugins and themes and more than 120 million downloads between them, and the number is the least interesting thing about it. What matters is that not one of those authors had to ask anybody.

Somewhere there is a historian whose entire working life runs through a Zotero library, a lawyer with a citation format nobody else on earth uses, and a researcher who needs their notes to talk to a lab instrument. I am never going to build those things. I should not build those things. In an app with an extension API they get built anyway, by the person who actually has the problem, on the evening they get annoyed enough. That is not a nice-to-have. For those people it is the difference between an app that fits and an app that does not.

And plugins are fast in a way I cannot be. A plugin author can ship a fix the afternoon they find the bug. Skein ships when I ship, and if you find something on a Friday you may be waiting.

Where plugins beat Skein outright

Excalidraw is the most-installed thing in Obsidian’s directory and Skein has no freehand drawing at all. Sync is one of the most wanted things in the ecosystem and Skein has none. There is no Zotero integration and there will not be one. There is no phone app today; an iPhone companion is started, which is a statement about work rather than a date, and nothing you can download. If a feature is not in Skein, you cannot add it, and no amount of philosophy makes that not a loss.

I have written up what the install counts say Skein should build, and what it built instead. This piece is about the other half: what the model itself costs, and why I still would not take it.

What it costs, in the vendor’s own words

Obsidian’s own documentation is admirably blunt about this, and I would rather quote them than characterise them:

Due to technical limitations, Obsidian cannot reliably restrict plugins to specific permissions or access levels.

In practice that means a community plugin can read the files on your computer, connect to the internet, and install other programs. This is not a flaw peculiar to Obsidian. It is what an extension API is. Once you let somebody else’s code run inside your app, it has whatever your app has, and your app is a program on a computer. Obsidian ships Restricted Mode on by default precisely because this is true, which is the right call.

The risk is not the one everybody names

The story people expect here is malware in an app store. That is not what happened, and getting it right matters more than scoring the point.

In April 2026 Elastic Security Labs published an analysis of a campaign it tracks as REF6598, which used Obsidian to deliver a remote access trojan to people working in finance and cryptocurrency. The plugin directory was never compromised. The attackers used two legitimate plugins, one that runs shell commands and one that hides interface elements, and reached victims through social engineering on LinkedIn and Telegram: get someone to open a vault you control, get them to turn on plugin sync, and their notes app runs your commands on their machine when they open it.

Read that again, because the shape of it is the whole argument. No review process failed. No malicious package slipped through. The capability was the weapon, and the capability is the product. You cannot screen your way out of that, because there is nothing to screen.

Credit where it is due

In May 2026 Obsidian rebuilt this. Every version of every plugin is now scanned automatically for malware, security problems and code quality, not just the first submission. Plugins will declare what they touch, network, filesystem, clipboard, and you will see it before you install. There are safety scorecards and verified authors. That is a serious piece of work and it is more than most marketplaces do.

Their post explaining it contains a sentence I have not been able to stop thinking about:

As coding agents accelerate the creation of plugins, the review queue was only getting longer.

That is the next ten years of every extension marketplace in one line. The supply of plausible-looking code is now effectively infinite, and the supply of people qualified to review it is not. Automated scanning is the only possible answer and it is a race, not a solution.

The argument that actually decided it

None of the above is why Skein has no plugins. Security is a reason to be careful, not a reason to refuse. The reason is duller and, I think, stronger.

A plugin API is a permanent promise about your internals. The moment other people’s code depends on how your editor is built, how your notes are stored, what your window is called, you cannot change those things any more. Not because it is hard. Because changing them breaks other people’s work, and breaking other people’s work is the one thing a platform may not do.

Here is what that looks like from the inside. Yesterday I spent a night on a bug where opening a vault put a file dialog on screen that could not be used. The cause was that Skein had six different answers to the question “which of these windows is the editor”, each of them a description of what an editor looks like: big enough, resizable, can become main. A macOS file dialog fits that description exactly, so the app picked the dialog and moved it. The fix was to stop describing the window and start asking it its name, which meant changing how several parts of the app identify themselves to each other.

In a codebase I entirely control, that fix took a night. With a plugin API in front of it, that same fix is a breaking change to a published interface, and the rational thing to do is not to make it. You add a seventh answer instead, and keep the six. Plugin systems quietly make an app conservative in exactly the place where it most needs to be free, which is its own foundations. Every mature extensible app I admire carries this weight, and you can feel it.

The part that is not philosophy

I should also tell you the unglamorous constraint, because leaving it out would let me take credit for a principle I am not being tested on. Skein is sandboxed and distributed through the Mac App Store, and Apple’s review guidelines say this:

Apps should be self-contained in their bundles, and may not read or write data outside the designated container area, nor may they download, install, or execute code which introduces or changes features or functionality of the app, including other apps.

So the decision is partly made for me. Discount my philosophy accordingly. What I can honestly claim is that I chose the distribution, knowing that, and would make the same choice again: the sandbox is also why Skein can tell you it makes no network connections at all, and “none” is a promise you can verify in a way that “only these ones” is not.

What is in the box instead

Everything Skein does, it does in core, and it has since the first release. Live queries with four ways to read the answer. Canvas. Tables, templates, quick capture, callouts, footnotes, tasks, version history, a graph, Notion and Obsidian import, PDF annotation. The features page is the whole list, and the list is the product.

The thing this buys you is not fewer downloads. It is that there is one answer to every question. One query language rather than three that disagree about what a tag is. One place to set your font size instead of a plugin that exists because there is no place. Nothing to keep updated, nothing to abandon you, and no note left holding syntax that nothing renders any more.

When you should use Obsidian instead

If you need freehand drawing, a sync service, your notes on a phone this year, a Zotero pipeline, or the ability to write JavaScript that runs against your vault, use Obsidian. I mean that plainly rather than as a rhetorical move. It is a better app for those people and no argument on this page changes it.

And the reason I can say that without flinching is the same reason any of this is defensible. Your notes are Markdown files in a folder you chose. Skein’s canvases are JSON Canvas, the same open format Obsidian writes, so those boards open in either app. Move between them whenever you like. If a notes app has earned the right to have opinions, it is only because leaving it is cheap.

The list, then

If you have read this far you are entitled to the specifics rather than the principle. On the left is the list you would go and assemble in Obsidian. On the right is where that job already lives in Skein, in the app you downloaded, updated as one thing.

What you would installWhere it lives in Skein
Dataview, Tasks, Kanban, CalendarLive queries. One engine over your frontmatter with four ways to read the answer: list, table, board and calendar. Four of Obsidian's most-installed plugins are one feature wearing four hats.
Advanced TablesThe table editor. Tab between cells, add and move columns, and the pipes stay lined up as you type.
Templater, QuickAddTemplates with real tokens, and quick capture from anywhere with a hotkey.
AdmonitionCallouts, in core, in the same syntax Obsidian later adopted.
Tag WranglerRename a tag across the whole vault in one action.
Recent Files, HomepageRecently opened in the ribbon, and any note you like opening on launch.
GitVersion history. Every save keeps a version, with a diff and a restore, kept beside the vault rather than in a repository you have to run.
ImporterImport from Notion, Ulysses, Bear, Craft and iA Writer, converting each app's own syntax and never overwriting.
Editing Toolbar, Outliner, LinterA formatting bar you can switch off, list editing that renumbers itself, and one Markdown engine so the editor, reading mode and export cannot disagree.
OmnisearchOne search. Titles as you type, ranked full-text matches beneath them, and Cmd+Return expands into every occurrence grouped per note. Opening a result lands on the match itself rather than at the top of the note.
AnnotatorPDFs read inside a note. Select text to highlight it and jump to a page with #page=3. Your marks live in a small readable file beside the PDF, and the PDF itself is never rewritten.
Periodic NotesDaily notes in a folder you name, and a journal you can walk: step through the days you actually wrote something, or jump to a date.
IconizeAn icon and a colour for any folder, chosen from the system set. Kept in the vault in .skein/folders.json rather than in a preferences database, so it travels with the notes.
Style Settings, Minimal Theme SettingsAppearance is a settings screen. Light, dark or follow the system, three curated themes, text width, line spacing, the editor face and the typography that face really has. No stylesheet to drop in and nothing to keep updated.
Typewriter Scroll, Focus mode pluginsFocus and typewriter modes in the View menu. Dim everything but the paragraph you are in, keep the line you are writing in the middle of the window, either, both or neither.
Custom File Explorer sortingSort the sidebar by name or by when you last touched a note, from the button above it.
Note Refactor, Block reference pluginsBlock references you name yourself, so a link still means something a year later.

There are no download numbers in that table, and their absence is deliberate. Obsidian’s figures are cumulative downloads rather than users: never decremented, so an old plugin carries years of update traffic and a fast-releasing one carries its own cadence. They are worth an order of magnitude and not a decimal place, and a table needing re-verification every month is a table that will quietly go false. The names carry the argument without help.

It is also not a scoreboard. Every plugin named there is somebody else’s good work, and several of them are better at their one job than the thing I built. The claim is narrower and duller: this is the list you would otherwise assemble yourself, and here it arrives assembled, with one place to change a setting and nothing to break when a maintainer moves on.

See what is in the box, or download it and have a look. It is free, and it does not ask you to make an account.