banorton/gote

Minimal CLI for note-taking

2

stars

150

commits

Go

primary language

Sep 7, 2026

updated

cli
golang
minimal
notes

README

Logo

gote

A CLI note-taking tool written in Go. Notes are plain Markdown files with tagging, pinning, search, and more.

Everything gote knows lives in two places: your notes, which are ordinary .md files in a directory you pick, and ~/.gote, which holds the index and nothing you would miss. Delete gote tomorrow and you still have a folder of Markdown.

Why another one

There are a lot of note CLIs. What is specific to this one:

  • Tags are the first line of the file, period-delimited (.project.urgent.work). No YAML frontmatter, no database — a note stays readable and greppable in any editor.
  • Search is built in, not shelled out. BM25 ranking with Snowball stemming, compiled into the binary. No ripgrep, fzf or external index required.
  • One static binary, no runtime. Nothing to install alongside it.
  • Two-letter commands compose a lister with an action. ro is recent + open, sv is search + view, tp is tag-filter + pin.

It is a single-user tool for people who already live in a terminal. There is no sync, no mobile app, no web UI, and no plugin system.

What it looks like

$ gote r
[a] gopl
[s] standup
[d] index_format
[f] search_design
[g] sourdough

(1/1)────────────────────────
[q]uit
[o]pen (default) [v]iew [d]elete [r]ename [c]opy [p]in [i]nfo
: a

$ gote s bm25
[a] search_design
[s] standup

(1/1)────────────────────────
[q]uit
[o]pen (default) [v]iew [d]elete [r]ename [c]opy [p]in [i]nfo
: v

$ gote t
design (2)
meeting (1)
personal (1)
reading (1)
recipe (1)
work (3)

Selection keys are the home row — a s d f g — so picking the third result never means reaching for a number key or an arrow.

A recorded walkthrough can be regenerated with vhs scripts/demo.tape.

Install

Download a binary from releases:

# macOS (Apple Silicon); swap for -mac-amd64, -linux-amd64, -linux-arm64, -win.exe
curl -L -o gote https://github.com/banorton/gote/releases/latest/download/gote-mac-arm64
chmod +x gote
mv gote /usr/local/bin/

With Go installed:

go install github.com/banorton/gote@latest

From source:

git clone https://github.com/banorton/gote && cd gote
go build -o gote . && mv gote /usr/local/bin/

Commands

CommandShortcutDescription
gote <note>Create or open note
gote <note> -t [template]Create from template
gote -d/-dt/-nt <note>Date/datetime/no-timestamp prefix
gote quickqOpen quick note
gote -Open last opened note
gote view - / gote info - / etc.Use - as last note alias in any command
gote quick save <name>qsSave quick note
gote recentrRecent notes
gote recent open/delete/pin/viewro/rd/rp/rvRecent + mode
gote search <query>sSearch titles + content
gote search --title <query>Search by title only
gote search -t .tag1.tag2Search by tags
gote search -w <date>Search by date
gote tagtList tags
gote tag .tag1.tag2Filter by tags
gote tag open/delete/pin/viewto/td/tp/tvTag filter + mode
gote pin <note>pPin a note
gote pinpInteractive pinned menu
gote pinned open/delete/view/unpinpo/pd/pv/puPinned + mode
gote unpin <note>uUnpin a note
gote delete <note>dMove to trash
gote trashList trash
gote recover <note>Restore from trash
gote getgInteractive select
gote templatetmplList templates
gote indexidxRebuild index (includes FTS)
gote index ftsRebuild FTS index only
gote configcShow config
gote config editceEdit config
gote info <note>iNote metadata
gote view <note>vPreview in browser
gote rename <note> -n <new>mvRename note
gote helphShow help
gote -vShow version

Examples

gote mynote              # create/open note
gote -d mynote           # with date prefix
gote mynote -t meeting   # from template

gote r                   # recent notes
gote ro                  # recent + open mode

gote s meeting           # search titles + content
gote s --title meeting   # title-only search
gote s -t .work          # search by tag
gote s -w 2412           # notes from Dec 2024
gote s -w 2412 2501      # date range

gote t .work.urgent      # filter by tags
gote p                   # pinned menu
gote g                   # interactive select

Configuration

Config at ~/.gote/config.json:

{
  "noteDir": "/path/to/notes",
  "editor": "vim",
  "fancyUI": false,
  "timestampNotes": "none",
  "defaultPageSize": 10
}
OptionDescription
noteDirNotes directory
editorEditor command
fancyUITUI mode with boxes and screen refresh
timestampNotes"none", "date", or "datetime"
defaultPageSizeResults per page

Tags

First line of note, period-separated:

.project.urgent.work

Data

FileLocation
Notes~/gotes/*.md
Index~/.gote/index.json
Tags~/.gote/tags.json
FTS Index~/.gote/fts.json
Pins~/.gote/pins.json
Templates~/.gote/templates/*.md
Trash~/.gote/trash/
Config~/.gote/config.json

License

MIT

Contributors

banorton

150 commits

banorton/gote

Minimal CLI for note-taking

2

stars

150

commits

Go

primary language

Sep 7, 2026

updated

cli
golang
minimal
notes

README

Logo

gote

A CLI note-taking tool written in Go. Notes are plain Markdown files with tagging, pinning, search, and more.

Everything gote knows lives in two places: your notes, which are ordinary .md files in a directory you pick, and ~/.gote, which holds the index and nothing you would miss. Delete gote tomorrow and you still have a folder of Markdown.

Why another one

There are a lot of note CLIs. What is specific to this one:

  • Tags are the first line of the file, period-delimited (.project.urgent.work). No YAML frontmatter, no database — a note stays readable and greppable in any editor.
  • Search is built in, not shelled out. BM25 ranking with Snowball stemming, compiled into the binary. No ripgrep, fzf or external index required.
  • One static binary, no runtime. Nothing to install alongside it.
  • Two-letter commands compose a lister with an action. ro is recent + open, sv is search + view, tp is tag-filter + pin.

It is a single-user tool for people who already live in a terminal. There is no sync, no mobile app, no web UI, and no plugin system.

What it looks like

$ gote r
[a] gopl
[s] standup
[d] index_format
[f] search_design
[g] sourdough

(1/1)────────────────────────
[q]uit
[o]pen (default) [v]iew [d]elete [r]ename [c]opy [p]in [i]nfo
: a

$ gote s bm25
[a] search_design
[s] standup

(1/1)────────────────────────
[q]uit
[o]pen (default) [v]iew [d]elete [r]ename [c]opy [p]in [i]nfo
: v

$ gote t
design (2)
meeting (1)
personal (1)
reading (1)
recipe (1)
work (3)

Selection keys are the home row — a s d f g — so picking the third result never means reaching for a number key or an arrow.

A recorded walkthrough can be regenerated with vhs scripts/demo.tape.

Install

Download a binary from releases:

# macOS (Apple Silicon); swap for -mac-amd64, -linux-amd64, -linux-arm64, -win.exe
curl -L -o gote https://github.com/banorton/gote/releases/latest/download/gote-mac-arm64
chmod +x gote
mv gote /usr/local/bin/

With Go installed:

go install github.com/banorton/gote@latest

From source:

git clone https://github.com/banorton/gote && cd gote
go build -o gote . && mv gote /usr/local/bin/

Commands

CommandShortcutDescription
gote <note>Create or open note
gote <note> -t [template]Create from template
gote -d/-dt/-nt <note>Date/datetime/no-timestamp prefix
gote quickqOpen quick note
gote -Open last opened note
gote view - / gote info - / etc.Use - as last note alias in any command
gote quick save <name>qsSave quick note
gote recentrRecent notes
gote recent open/delete/pin/viewro/rd/rp/rvRecent + mode
gote search <query>sSearch titles + content
gote search --title <query>Search by title only
gote search -t .tag1.tag2Search by tags
gote search -w <date>Search by date
gote tagtList tags
gote tag .tag1.tag2Filter by tags
gote tag open/delete/pin/viewto/td/tp/tvTag filter + mode
gote pin <note>pPin a note
gote pinpInteractive pinned menu
gote pinned open/delete/view/unpinpo/pd/pv/puPinned + mode
gote unpin <note>uUnpin a note
gote delete <note>dMove to trash
gote trashList trash
gote recover <note>Restore from trash
gote getgInteractive select
gote templatetmplList templates
gote indexidxRebuild index (includes FTS)
gote index ftsRebuild FTS index only
gote configcShow config
gote config editceEdit config
gote info <note>iNote metadata
gote view <note>vPreview in browser
gote rename <note> -n <new>mvRename note
gote helphShow help
gote -vShow version

Examples

gote mynote              # create/open note
gote -d mynote           # with date prefix
gote mynote -t meeting   # from template

gote r                   # recent notes
gote ro                  # recent + open mode

gote s meeting           # search titles + content
gote s --title meeting   # title-only search
gote s -t .work          # search by tag
gote s -w 2412           # notes from Dec 2024
gote s -w 2412 2501      # date range

gote t .work.urgent      # filter by tags
gote p                   # pinned menu
gote g                   # interactive select

Configuration

Config at ~/.gote/config.json:

{
  "noteDir": "/path/to/notes",
  "editor": "vim",
  "fancyUI": false,
  "timestampNotes": "none",
  "defaultPageSize": 10
}
OptionDescription
noteDirNotes directory
editorEditor command
fancyUITUI mode with boxes and screen refresh
timestampNotes"none", "date", or "datetime"
defaultPageSizeResults per page

Tags

First line of note, period-separated:

.project.urgent.work

Data

FileLocation
Notes~/gotes/*.md
Index~/.gote/index.json
Tags~/.gote/tags.json
FTS Index~/.gote/fts.json
Pins~/.gote/pins.json
Templates~/.gote/templates/*.md
Trash~/.gote/trash/
Config~/.gote/config.json

License

MIT

Contributors

banorton

150 commits

Languages

Go

99.1%