Develop extensions for NoteDeck (a Misskey client, "Misskey Pro") from VS Code. NoteDeck's plugins, widgets, column queries, skills and themes are plain files in its settings folder; this extension opens that folder, checks AiScript through the running NoteDeck, pushes your edits into it and runs its capabilities, all through NoteDeck's local HTTP API on 127.0.0.1:19820.
For AiScript syntax highlighting install the official AiScript extension (.vsix from its releases; it is not in the Marketplace yet). Its intellisense is built on an older AiScript than the one NoteDeck runs, so rely on NoteDeck's validator (below) for correctness. This extension only adds what is NoteDeck-specific and works alongside it.
| Command | What it does | Needs |
|---|---|---|
| NoteDeck: Open settings folder | Adds NoteDeck's settings folder to the workspace (or opens it in a new window). The folder is what File → Open settings folder opens in NoteDeck | nothing |
| NoteDeck: Set API token | Stores the token in VS Code's secret storage | – |
| NoteDeck: Check connection | Pings NoteDeck; the status bar item shows the result | token |
| NoteDeck: Validate AiScript | Sends the current .is file to NoteDeck's validator; problems appear in the Problems panel. Also runs on save (notedeck.validateOnSave) |
token (no permission) |
| NoteDeck: Push this file to NoteDeck | For .is files under plugins/, widgets/ or queries/: replaces the source in the running NoteDeck through plugins.update / widgets.update / queries.update. Active plugins and widgets restart with the new source. NoteDeck asks for confirmation |
token + plugins.write / widgets.write / queries.write |
| NoteDeck: New plugin… / New widget… | Creates it through NoteDeck (so the meta file is right), then opens the .is file |
token + plugins.write / widgets.write |
| NoteDeck: Run capability… | Pick any capability, enter parameters as JSON, see the result in the NoteDeck output channel | token + whatever the capability needs |
Plus completions in .is files for Nd:*, event names inside Nd:on("…") and capability ids inside Nd:call("…") (fetched from the running NoteDeck), and snippets: ndplugin, ndwidget, ndquery, ndcommand, ndon, ndcall, and ndskill in Markdown.
NoteDeck reads the files when it starts and when something is created or edited through its own UI or API. It does not watch the folder, so a file saved from VS Code is not picked up until the next restart. Push sends the file through the same API the in-app editor uses, which also records the edit in NoteDeck's history and restarts the plugin or widget if it is active.
- Issue a token in NoteDeck under Settings → Permissions → API tokens, name it
vscode, and run NoteDeck: Set API token. - External tools get a read-only permission set by default. In the same Permissions window, under the External principal, allow
plugins.write/widgets.write/queries.writefor pushing and creating. - Run NoteDeck: Open settings folder. If NoteDeck has never been started on this machine the folder does not exist yet; start NoteDeck once, or set
notedeck.settingsDir.
If you changed NoteDeck's HTTP API port, or run a development build (different port), set notedeck.apiUrl.
Not in the Marketplace yet. Download the .vsix from a release (or build it, see below), then Extensions → … → Install from VSIX.
npm install
npm run dev # esbuild watch → dist/extension.js
npm run build
npm run lint # biome
npm run typecheck # tsc
npm test # vitest (settings folder resolution, diagnostics mapping, completion context)
npm run package # notedeck-vscode-<version>.vsixPress F5 in VS Code to launch an Extension Development Host with this folder.
The extension only talks to NoteDeck's local endpoints: GET /api, GET /api/capabilities and POST /api/capabilities/{id}/execute. Nothing is sent anywhere else.
The Raycast, Stream Deck, Obsidian and browser integrations are for using NoteDeck from other apps. This one is for the people who build things for NoteDeck. Same API, nothing added to NoteDeck itself.
MIT. NoteDeck itself is AGPL-3.0; this extension is a separate client of its public API.