Your notes, your terminal.
A macOS CLI for Apple Notes — list, read, create, edit, delete, and search notes without leaving the command line. Built for humans and AI agents alike.
- macOS 14+ (Sonoma or later)
- Automation permission for Notes.app (System Settings > Privacy & Security > Automation)
brew install wangwalk/tap/inotesmake build
# binary at ./bin/inotesOr with SwiftPM directly:
swift build -c releaseinotes # show recent iCloud notes
inotes accounts # list all accounts
inotes show all # all iCloud notes
inotes folders # list folders with note counts
inotes mkfolder Projects # create a folder
inotes read 1 # read full note by index
inotes search "meeting" # search by title or contentinotes # recent notes (default)
inotes today # notes modified today
inotes show week # notes modified this week
inotes show all # all notes
inotes show --folder Work # notes in a specific folder
inotes show recent --limit 10 # limit resultsNotes in the system “Recently Deleted” folder are excluded.
inotes folders # all folders with note counts
inotes folders --json # JSON outputThe system “Recently Deleted” folder is excluded.
inotes mkfolder Projects
inotes mkfolder Work --account Exchange
inotes mkfolder Ideas --jsoninotes accounts # list all accounts (iCloud, Exchange, IMAP, etc.)
inotes accounts --json # JSON outputinotes read 1 # read by index
inotes read A3F2 # read by ID prefixinotes add --title "Meeting Notes"
inotes add -t "Ideas" -b "Draft outline" -f Projects
inotes add --title "Shopping list" --body "Milk, bread, eggs"When run interactively (without --no-input), missing title/body/folder will be prompted.
inotes edit 1 --title "Updated Title"
inotes edit 2 --body "New content" --folder Projects
inotes edit 5 -t "Title" -b "Body" -f Workinotes delete 1 # delete with confirmation
inotes delete 1 --force # skip confirmation
inotes delete 2 --dry-run # preview without deletinginotes search "quarterly review"
inotes search "TODO" --folder Work --limit 10Notes in the system “Recently Deleted” folder are excluded.
inotes status # check automation permissioninotes status --json{
"authorized" : true,
"automationPermission" : "granted"
}By default, inotes only shows notes from your iCloud account. Use --account or --all-accounts to access other accounts.
# List available accounts
inotes accounts
# Filter by account name (case-insensitive substring match)
inotes show all --account Exchange
inotes show all -a gmail
inotes folders --account iCloud
inotes search "draft" -a Exchange
# Show notes from all accounts
inotes show all --all-accounts
inotes folders --all-accountsThe -a/--account option is accepted on all commands. It affects commands that fetch notes/folders (e.g. show,
folders, read, add, edit, delete, search, mkfolder); for accounts and status it is currently
ignored.
Notes are identified by index or ID prefix:
- Index — a 1-based position from the most recent
showoutput (e.g.,1,2,3). - ID prefix — the first 4+ characters of a note's internal ID (e.g.,
A3F2).
| Flag | Short | Description |
|---|---|---|
| (default) | Human-readable table with indices | |
--json |
-j |
Machine-readable JSON |
--plain |
Tab-separated lines for scripting | |
--quiet |
-q |
Count only |
inotes show --json[
{
"body" : "Discussed Q1 plans",
"creationDate" : "2026-02-08T10:00:00Z",
"folder" : "Work",
"id" : "x-coredata://AB12CD34-...",
"modificationDate" : "2026-02-08T14:30:00Z",
"title" : "Meeting Notes"
}
]inotes accounts --json[
{
"id" : "x-coredata://0D80089A-.../ICAccount/p3",
"name" : "iCloud"
},
{
"id" : "x-coredata://76BBD5A1-.../EWSAccount/p3",
"name" : "Exchange"
}
]These options are available on all commands:
| Option | Short | Description |
|---|---|---|
--account <name> |
-a |
Filter by account name |
--all-accounts |
Include notes from all accounts (default: iCloud only) | |
--json |
-j |
Emit machine-readable JSON output |
--plain |
Emit stable tab-separated output | |
--quiet |
-q |
Only emit count output |
--no-color |
Disable colored output | |
--no-input |
Disable interactive prompts (for scripts and agents) | |
--version |
-V |
Print version |
--help |
-h |
Print help |
inotes uses AppleScript (osascript) to communicate with Notes.app. On first run, macOS will prompt you to allow Automation access.
inotes runs locally and does not send your notes to any server. It uses osascript to query Notes.app and prints results to stdout.
If you see "Permission denied" errors:
- Open System Settings > Privacy & Security > Automation.
- Find your terminal application (Terminal.app, iTerm, etc.).
- Enable access to Notes.
- Restart your terminal.
- Run
inotes statusto verify.
The reusable Swift core lives in Sources/INotesCore and can be consumed as a library dependency:
// Package.swift
.package(url: "https://github.com/wangwalk/inotes.git", from: "0.1.1")
// target dependency
.product(name: "INotesCore", package: "inotes")MIT