A lightweight, local-first, Obsidian-inspired notes CLI for PowerShell 7.
Minimal Notes keeps the model simple: your notes are plain markdown files in a local vault, and the CLI adds the connective tissue around them. The project now ships as both a reusable PowerShell module and a thin CLI wrapper.
This project aims for the useful core of Obsidian without the heavyweight app shell:
- local markdown files
- wiki links and backlinks
- fast capture and retrieval
- lightweight metadata and aliases
- scriptable PowerShell workflows
- note creation and opening
- full-text search and fuzzy note finding
- interactive note picker
- wiki links, backlinks, and unresolved-link detection
- quick capture to inbox or daily notes
- orphan and recent note views
- agenda from frontmatter dates
- metadata-aware task collection from markdown checkboxes
- reusable note templates with placeholder expansion
- dashboard, report, and review views
- weekly and monthly notes
- related-note suggestions and Mermaid graph output
- merge, split, and repair-link refactoring tools
- frontmatter properties, tags, aliases, and validation
- stale-note views, saved queries, and preview-only dedupe
- JSON config file with env-var override precedence
- safe note rename with automatic link updates
- terminal preview
From the project folder:
pwsh -NoProfile -File .\note.ps1 help
pwsh -NoProfile -File .\note.ps1 new "Project Ideas"
pwsh -NoProfile -File .\note.ps1 new "Meeting Notes" --status active --due 2026-03-20 --tags work,meeting
pwsh -NoProfile -File .\note.ps1 capture "remember this"
pwsh -NoProfile -File .\note.ps1 template new meeting
pwsh -NoProfile -File .\note.ps1 new "Sprint Review" --template meeting
pwsh -NoProfile -File .\note.ps1 dashboard
pwsh -NoProfile -File .\note.ps1 weekly
pwsh -NoProfile -File .\note.ps1 merge "Draft" "Project Archive"
pwsh -NoProfile -File .\note.ps1 props "Project Ideas" unset priority
pwsh -NoProfile -File .\note.ps1 stale 60
pwsh -NoProfile -File .\note.ps1 query save work-today tasks today
pwsh -NoProfile -File .\note.ps1 config init
pwsh -NoProfile -File .\note.ps1 tasks
pwsh -NoProfile -File .\note.ps1 tasks today
pwsh -NoProfile -File .\note.ps1 props "Project Ideas" set status active
pwsh -NoProfile -File .\run-tests.ps1The repository intentionally ignores the contents of vault/ by default.
- your real notes are treated as private local data
- the repo tracks code, docs, tests, and
vault/.gitkeep - if you want to version a vault later, you can change
.gitignoredeliberately
minimal-notes/
note.ps1
MinimalNotes.psm1
MinimalNotes.psd1
run-tests.ps1
tests/
templates/
vault/
new Create a note from a title or path-like name.
open Open an existing note, or create it if missing.
list List notes in the vault, optionally filtered.
search Literal full-text search across all markdown notes.
find Fuzzy-find notes by title, slug, or path.
pick Interactively choose a note to open.
capture Append a quick note to inbox.md or today's daily note.
orphans List notes with no inbound wiki links.
recent List recently modified notes, newest first.
stale List notes untouched for at least N days.
config Show, initialize, or locate the JSON config file.
dashboard Show a compact multi-section vault overview.
agenda Show notes with due or scheduled frontmatter dates.
report Summarize recent note and task activity for a time window.
review Show a daily or weekly review checklist and focus items.
tasks Collect markdown checkbox tasks across the vault.
Supports open, done, all, today, and overdue views.
related Suggest notes related to a target note by links and tags.
graph Print a Mermaid note-link graph for one note or the full vault.
merge Merge one note into another and rewrite inbound links.
split Split a heading section into a new linked note.
repair-links Attempt to repair unresolved wiki links using fuzzy note matches.
query Save, list, show, run, or delete read-only saved queries.
dedupe Preview likely duplicate notes without changing files.
template List, preview, or create note templates.
props Read or update frontmatter properties for a note.
rename Rename a note file and update wiki links that point to it.
unresolved List unresolved wiki links across the vault or in one note.
create-unresolved Create notes for one unresolved link target or all missing targets.
links Show outgoing wiki links from a note.
backlinks Show notes that link to a note.
tags List all tags, or notes containing a tag.
preview Print a note to the terminal.
daily Open or create a daily note at daily/YYYY-MM-DD.md.
weekly Open or create a weekly note at weekly/YYYY-Www.md.
monthly Open or create a monthly note at monthly/YYYY-MM.md.
path Print the current vault path.
help Show this help.
$env:MINIMAL_NOTES_VAULT = "C:\Users\user\Documents\notes"
$env:MINIMAL_NOTES_CONFIG = "C:\Users\user\Documents\minimal-notes.config.json"
$env:MINIMAL_NOTES_TEMPLATES = "C:\Users\user\Documents\note-templates"
$env:MINIMAL_NOTES_EDITOR = "notepad.exe"
$env:MINIMAL_NOTES_NO_OPEN = "1"If MINIMAL_NOTES_EDITOR is not set, the script tries code first and falls back to notepad.exe.
Environment variables override config file values.
You can use the reusable module directly:
Import-Module .\MinimalNotes.psd1 -Force
Invoke-MinimalNotesCli -Command list
Get-MinimalNotesVaultPathInitialize a starter config:
pwsh -NoProfile -File .\note.ps1 config init
pwsh -NoProfile -File .\note.ps1 configExample:
{
"vault": "C:\\Users\\user\\Documents\\notes",
"templates": "C:\\Users\\user\\Documents\\note-templates",
"queries": "C:\\Users\\user\\Documents\\saved-queries.json",
"editor": "notepad.exe",
"noOpen": false,
"defaults": {
"staleDays": 30,
"dashboardLimit": 5
}
}Create a note:
pwsh -NoProfile -File .\note.ps1 new "PowerShell Ideas"
pwsh -NoProfile -File .\note.ps1 new "Meeting Notes" --status active --due 2026-03-20 --tags work,meeting --project "Q2 Planning"Create and use a template:
pwsh -NoProfile -File .\note.ps1 template new meeting
pwsh -NoProfile -File .\note.ps1 template show meeting
pwsh -NoProfile -File .\note.ps1 new "Weekly Sync" --template meetingAdd links inside it:
# PowerShell Ideas
Tags: #powershell #ideas
Look at [[Terminal UI]] and [[Daily Review]].Work with notes:
pwsh -NoProfile -File .\note.ps1 links "PowerShell Ideas"
pwsh -NoProfile -File .\note.ps1 backlinks "Terminal UI"
pwsh -NoProfile -File .\note.ps1 find termui
pwsh -NoProfile -File .\note.ps1 pick termui
pwsh -NoProfile -File .\note.ps1 open "Weekly Sync" --template meeting --tags work,meetingWhen fuzzy note or template matches tie on score, Minimal Notes prefers the most recently modified match.
Capture and review:
pwsh -NoProfile -File .\note.ps1 capture "remember to simplify the picker"
pwsh -NoProfile -File .\note.ps1 capture daily "ship the prototype"
pwsh -NoProfile -File .\note.ps1 orphans
pwsh -NoProfile -File .\note.ps1 recent 5
pwsh -NoProfile -File .\note.ps1 dashboard
pwsh -NoProfile -File .\note.ps1 agenda
pwsh -NoProfile -File .\note.ps1 tasks
pwsh -NoProfile -File .\note.ps1 tasks today
pwsh -NoProfile -File .\note.ps1 tasks overdue
pwsh -NoProfile -File .\note.ps1 review
pwsh -NoProfile -File .\note.ps1 report weeklyRead or update frontmatter properties:
pwsh -NoProfile -File .\note.ps1 props "Project Ideas"
pwsh -NoProfile -File .\note.ps1 props "Project Ideas" set status active
pwsh -NoProfile -File .\note.ps1 props "Project Ideas" add tags work,planning
pwsh -NoProfile -File .\note.ps1 props "Project Ideas" add aliases "Idea Bank"
pwsh -NoProfile -File .\note.ps1 props "Project Ideas" unset priorityFrontmatter looks like:
---
status: active
tags:
- work
- planning
aliases:
- Idea Bank
---Built-in validation currently covers:
status:open,active,in-progress,blocked,waiting,done,completed,cancelled,canceled,archivedpriority:low,medium,normal,high,urgentdueandscheduled: parseable dates like2026-03-20
Agenda reads frontmatter like:
---
status: active
priority: high
scheduled: 2026-03-14
due: 2026-03-16
---Then:
pwsh -NoProfile -File .\note.ps1 agenda
pwsh -NoProfile -File .\note.ps1 agenda today
pwsh -NoProfile -File .\note.ps1 agenda overdue
pwsh -NoProfile -File .\note.ps1 agenda all
pwsh -NoProfile -File .\note.ps1 tasks
pwsh -NoProfile -File .\note.ps1 tasks today
pwsh -NoProfile -File .\note.ps1 tasks overdueTask output includes note context when available, such as project, status, priority, scheduled, and due.
You can also set those common properties at note creation time with new or with open when it creates a missing note:
pwsh -NoProfile -File .\note.ps1 new "Meeting Notes" --status active --priority high --due 2026-03-20 --scheduled 2026-03-18 --tags work,meeting --aliases "Weekly Sync,Staff Meeting" --project "Q2 Planning"Templates are plain markdown files stored in templates/. They support a few built-in placeholders:
{{title}}{{slug}}{{date}}{{time}}{{datetime}}{{year}}{{month}}{{day}}
Maintain link structure:
pwsh -NoProfile -File .\note.ps1 rename "Project Ideas" "Project Archive"
pwsh -NoProfile -File .\note.ps1 unresolved
pwsh -NoProfile -File .\note.ps1 create-unresolved all
pwsh -NoProfile -File .\note.ps1 related "Project Archive"
pwsh -NoProfile -File .\note.ps1 graph "Project Archive"
pwsh -NoProfile -File .\note.ps1 merge "Project Draft" "Project Archive"
pwsh -NoProfile -File .\note.ps1 split "Project Archive" "Decisions" "Project Decisions"
pwsh -NoProfile -File .\note.ps1 repair-links
pwsh -NoProfile -File .\note.ps1 stale 45
pwsh -NoProfile -File .\note.ps1 query save work-today tasks today
pwsh -NoProfile -File .\note.ps1 query run work-today
pwsh -NoProfile -File .\note.ps1 dedupe
pwsh -NoProfile -File .\note.ps1 configCalendar and overview workflows:
pwsh -NoProfile -File .\note.ps1 dashboard
pwsh -NoProfile -File .\note.ps1 report monthly
pwsh -NoProfile -File .\note.ps1 review weekly
pwsh -NoProfile -File .\note.ps1 weekly
pwsh -NoProfile -File .\note.ps1 monthlyFocus: turn frontmatter into day-to-day utility.
agendadriven by fields likedue,scheduled,status, andprioritysmartertasksthat include note context such as project, status, and prioritynote templates for common frontmatter and note shapesbetterpropssupport, includingunset, clearer list editing, and stronger validationweekly and monthly note workflows built on top of the existing daily note model
Focus: make the vault easier to navigate as it grows.
related <note>suggestions from links, tags, aliases, and text overlapstricter orphan and stale-note viewslocal note maps or Mermaid graph exportsaved queries and richer search filters that combine text, tags, props, and task statedashboards that summarize recent notes, tasks, unresolved links, and due itemsreports or review views built from agenda, task, and note activity
Focus: help reorganize a growing vault safely.
merge two notes and rewrite incoming linkssplit sections into new linked notesrepair broken or ambiguous links with suggestionsdedupe near-duplicate notes by title or content similarityextendrenameto handle more path-move and alias-update cases
Focus: keep the codebase maintainable as features expand.
split the project into a reusable PowerShell module plus a thin CLI wrapperadd deeper parsing and unit tests alongside the current smoke testsintroduce a config file for vault defaults, editor, templates, and display preferencesimprove performance for larger vaults, potentially with an optional lightweight index
agendametadata-awaretaskstemplatesmodule refactordashboards or reportsrelated/graph tooling- merge/split/repair refactoring commands
Run the local test suite:
pwsh -NoProfile -File .\run-tests.ps1run-tests.ps1 expects Pester 5 or later. If needed:
Install-Module Pester -Scope CurrentUser -Force -SkipPublisherCheckCurrent local status:
- 72 tests passing
- 0 failures