Apple Notes for VS Code
Browse and edit your Apple Notes without leaving VS Code. The extension adds
a sidebar tree (drag it into the Secondary Side Bar for a right-hand panel)
where notes open as regular Markdown files — edit them like any other file
and save straight back to Notes.
There's no private API use and no direct writes to NoteStore.sqlite.
Everything goes through JXA (osascript -l JavaScript), i.e. the same
scripting interface Shortcuts and AppleScript use.
macOS only. Apple Notes has no scripting interface on other platforms,
so this extension does nothing there.
Features
- Tree view of your Notes folders and notes in the VS Code sidebar
- Open, edit, and save notes as Markdown
- Create, rename, move, and delete notes and folders
- Full-text search across notes
- Jump to a note in Notes.app from the sidebar
Requirements
- macOS with Notes.app
- VS Code 1.85 or later
- On first use, macOS will prompt for permission to let VS Code control
Notes (Apple Events / TCC). This is expected — not a bug — and is required
for the extension to work.
Installation
This extension isn't published to the Marketplace yet. To install it locally:
git clone https://github.com/Dach3r/apple-notes-vscode.git
cd apple-notes-vscode
pnpm install
pnpm run compile
Then package and install the .vsix:
pnpm run package
code --install-extension apple-notes-vscode-0.2.0.vsix
Building a production installer
To generate a new .vsix for distribution (e.g. for the Marketplace):
pnpm install
pnpm run package
Notes:
publisher in package.json must match the target Marketplace publisher
account id exactly (case-sensitive), or upload fails with
Publisher ID '<x>' provided in the extension manifest should match the publisher ID '<y>' under which you are trying to publish this extension.
- Use
--no-dependencies because vsce shells out to npm ls to verify the
dependency tree, which fails on this repo's pnpm-managed node_modules
(missing transitive devDependencies that pnpm doesn't hoist). This flag
skips that check; it's safe here since production dependencies are bundled
by esbuild into dist/extension.js at build time.
vsce package runs the vscode:prepublish script automatically, which
builds the bundle in production mode (minified, no sourcemaps).
- The output file is named
<name>-<version>.vsix from package.json. Bump
version before building a new release.
- To publish directly instead of just packaging:
./node_modules/.bin/vsce publish --no-dependencies (requires a Personal
Access Token — see vsce login).
Known limitations (v0.2)
- Headings, real checklists, and blockquotes do not round-trip. Saving a
# heading stores it as bold text; a - [ ] checklist stores as plain
☐ text; numbered lists become bullet lists with the number kept as text.
You'll see a confirmation dialog listing exactly what will degrade before
any save that would lose structure.
- Delete is soft-delete. Notes moves the note to "Recently Deleted"; there
is no API for a permanent purge.
- Smart folders reject moves — Notes itself returns error -10000.
- Password-protected/shared notes are visible but not specially handled yet.
- Tags, pinned state, and real checklist items are read-only via Notes'
scripting interface and are out of scope for this version (would require
either Full Disk Access +
NoteStore.sqlite, or pre-built Shortcuts).
Development
pnpm install
pnpm run watch # esbuild in watch mode
# F5 in VS Code -> Extension Development Host
Useful scripts:
pnpm run lint # eslint
pnpm run check-types # tsc --noEmit
Contributing
Issues and pull requests are welcome. If you're proposing a larger change,
please open an issue first to discuss the approach.
Disclaimer
This is an independent, unofficial project. It is not affiliated with,
endorsed by, or sponsored by Apple Inc. "Apple Notes" and "Notes" are
trademarks of Apple Inc.
License
MIT