Note taking script

Teaser ↓

Another note-taking app? Yes, there are billions. Basic CRUD for the CLI? Absolutely. No databases, no config files, no setup – just a single bash script and a plain text directory. Unapologetically terminal-first – works over SSH, in tmux, on a Raspberry Pi, or on a 15-year-old laptop. If you have a shell, you have a notes app.

No linking, no Zettelkasten, no forcing it into more than text (yes, you can write Markdown, but it’s optional).

If you’re here for the code – it’s one file. Read it, break it, change it. That’s the point.

note ↓

Note taking bash script.

needs: fzf, ripgrep (rg)

note --help

Usage:

note n "title"          → new note with explicit title
note "text"             → create/reopen note
note l                  → list
note o                  → open (fzf)
note s                  → search (rg|fzf)
note c                  → cat latest n notes
note rm                 → move to .trash
note pull               → git pull
note push               → git push
note --longhelp | less  → full help
note h                  → this help

Storage: /home/b/notes

Multiple parameters to run same command, for example

note
# and
note open

are the same (neat little dual pane tui is presented), and if you add a parameter (file name approximation)

note open gemma

it will open first filename that has some gemma in there. Search is similar.

note s

will open neat little tui as well, piping ripgrep output to fzf and behaving like file selector.

note c
note c 3

should cat last changed note or last 3 changed notes.

note list

should list files/notes to stdout, not sure if this is needed (open does similar job).

Text editor, by default $EDITOR variable is used, if undefined it will try to load hx (helix) or vim or nano. Configure to your needs. By default notes will be stored in $HOME/notes, configure as needed.

Not needing the specific title is the idea as well, so

note nice weather today

shall make a note with filename ‘2026-04-27-nice-weather-today.md’.

misc ↓

about fzf scrolling ↓

Up and down will select files, shift+up and shift+down will scroll the text pane on the right (mice should also work).

Scrot (‘open note’ fzf tui): note image

Note syncing ↓

of $HOME/notes is up to the user. I use git.

noteurls (‘plugin’) ↓

Separated script with similar tui that will extract urls from notes and open one or two in browser (tab toggles selected).

llm-md-fix ↓

Fix markdown using local gemma4 model. Will write ‘fixed’ version to stdout. (Much faster version would be node cli tool markdownlint --fix some.md)

noteweb ↓

Display notes in localy generated html page (needs rewrite).

pipe to ↓

Find the 1st note that has ‘jobs’ in the title and pipe to terminal markdown renderer:

note c jobs | glow -w 120

Pretty neat markdown render in terminal. Glow is in Trixie repos.

convert to html and open in browser ↓

note c jobs | pandoc -s -f markdown -t html5 -H style.css -o tmp.htm && xdg-open tmp.htm

Would take first note that has ‘jobs’ in its name.

Where style.css might be:

<style type="text/css">
    p, ul, li   { font-family: "Noto Serif", serif; font-size: large }
    /* .date   {font-size: small;} */
    a       { font-family: "Noto Serif", serif; font-size: large }
    pre     { font-size: large; color: #f5f5f5; background-color: #464876; padding: 20px; border-radius: 5px;}
blockquote  { margin: 0; color: #111111; border-left: 1px solid #999999;}
    h1      { text-align: center; font-family: 'Noto Sans', sans; font-size: xxx-large }
    h2, h3, h4      { font-family: "Noto Sans", sans; }
    hr      { border-top: 1px solid black; visibility: hidden; }
    a:link  { text-decoration: none; color: #111155; }
    a:visited { text-decoration: none; color: #111155; }
    a:hover { text-decoration: underline; }
    a:active { text-decoration: underline; }
    body, html {
        background-color: #F5F5F5;
        color: #111111;
        line-height: 1.6;
        }
</style>