Home

Awesome

note: Minimalistic Note Taking

note is designed to help you to quickly jot down text onto a space, similar to a bulletin board; in your terminal. Notes are stored in a sqlite database file and upon creation the note is assigned an ID.

In note, all notes are organized into spaces. A space is simply a category or label you assign to your notes. The space can be any UTF-8 encoded string and the only rule is that a space cannot include the comma character: ,.

Space starting with the period, ., is considered a hidden space. Hidden spaces will not be shown by default, when printing notes or spaces. Removal of a note is a move operation to the .trash space, if permanent delete is not explicitly specified.

Besides the ID and space, notes contain only a limited set of metadata. Timestamps for when the note was created, as well as last updated, as well as the pin field. Pinned notes are organized together at the top or bottom, depending on the sort order, when printed in table or list form.

Consider using this program if you vibe with some or all of these note features:

Why note

There are a couple of contenders to this program. Most alternatives to note store their notes in text files in the filesystem, with various tricks of organization. The most feature complete alternatives I found either focuses on files or had too many off-topic features like: git repository synchronization, encryption, image storage and more.

The goal of note is to give you a simple and powerful interface to manage your notes, with just enough built in to organize your notes the way you want to, but without the requirement of a specific structure. If you want to, you (or your machine) can simply jot down some notes.

Installation

You can download one of the pre-built binaries from the releases page. At the time of writing, binaries are built for Linux and Windows targets. macOS will be built soon.

Source

This program is written in Go, which means building (reading and contributing) the source code is simple.

To install this program you need the following pre-requisites:

  1. Go
  2. GCC
  3. go-sqlite3

When you have installed Go and GCC, usually with your system package manager, the rest of the installation can be done by running the commands below. CGO_ENABLED=1 is specified because go-sqlite3 requires GCC.

CGO_ENABLED=1 go install github.com/mattn/go-sqlite3
go install github.com/bdazl/note@latest

Usage

Below is a snippet output from note help, that should give you an overview of the available operations that can be performed:

CommandDescription
initInitialize note configuration and database
addAdd new note
showShow content of specific note(s)
findFind notes containing a pattern
editEdit content of note
pinPin note(s) to top
unpinUnpin note(s) from top
moveMove note to another space
removeRemove note(s) with id(s)
cleanEmpty the .trash space
listLists notes from one or more spaces
tableLists available notes in a table format
spaceLists all or some spaces
idLists all or some IDs
importImport notes from JSON or YAML file
exportExport notes to JSON or YAML file
helpHelp about any command
versionVersion of this program
completionGenerate the autocompletion script for the specified shell

Init note

The first time you use note you need to initialize a configuration and a database. This is done by calling the init sub-command:

note init

This will store a configuration and a database file. The locations of these files can be modified by specifying -c and --db respectively. These arguments are global to all commands and, if specified, will override the config initialized above. The configuration can be a wide array of formats.

See the Configuration section for a discussion on where the files are located, if default values are used.

Add note

There are three main methods of adding your note. The quickest way is to simply invoke note like this:

note add This is My First Note
note add "This is Another Note"

You can write a note with your default $EDITOR:

note add

If no such editor exist, a default has been chosen for you. It is possible to define the editor in the configuration file.

A note can also be created by specifying a file that you want note to read:

note add -f some.txt

note can also read from standard input (-):

echo note made by other program | note add -f -

Spaces

All notes belong to a space, which can be any string you define:

note add -s MySpace This is a Song

By default, your notes will fall into the main space. You can list all spaces occupied with one or more notes, by running:

note space [id...]

If you specify one (or more) id:s in the above command, only spaces occupied by the notes you specify will be shown. You can also use the alias note spc [ids...] which is equivalent to the previous statement.

To list IDs occupied by a space, you can use the following command, and similarly to the space command above, if you specify one or more positional arguments - only ID's in those spaces will be shown

note id [space...]

Content of notes

To get an overview of your notes, it's often useful to get a table. This can be done simply with:

note

If you want to have control over how many preview words will be shown, use the specific sub-command:

note table --preview 5 [space...]

To retrieve the content of specific note(s), invoke get:

note get id [id...]

To list the full content of your notes, invoke the list (or ls) command, you can specify any number of space(s) as a filter. There are also a number of sorting, limiting and styling options to this command:

note ls [space...]

Edit notes

Edit note in $EDITOR:

note edit id

Pin/unpin note(s) to the top:

note pin id [id...]
note unpin id [id...]

Move note to space:

note move space id [id...]

Import/export

Notes can be exported and imported to JSON or YAML. By default the export is printed to standard output:

note export [file]

Configuration

note uses the excellent libraries cobra and viper to handle command line arguments and the configuration file. This is an example of a configuration file:

db: /home/user/.local/share/note/note.db
space: main
editor: vim
color: auto
style: light

When using Linux and macOS, the Freedesktop XDG Base Directory Specification is used to determine where the configuration and database files are stored, by default. Windows has its own set of environment variables and fallback values.If the environment variable is not available a fallback value will be used.

Below is a table that tries to illustrate how the different OS default directories are constructed, where the Data directory is the base directory of the database and Config is the base directory of the configuration file. Default values will then be Data/note/note.db and Config/note/note.yaml respectively:

OSDirectoryEnvironment VariableFallback
LinuxData$XDG_DATA_HOME~/.local/share
LinuxConfig$XDG_CONFIG_HOME~/.config
macOSData$XDG_DATA_HOME~/Library/Application Support
macOSConfig$XDG_CONFIG_HOME~/Library/Application Support
WindowsData%APPDATA%%USERPROFILE%/AppData/Roaming
WindowsConfig%LOCALAPPDATA%%USERPROFILE%/AppData/Local

Environment variables

These environment variables can be used in all operating systems:

Environment variableDescription
DBDatabase file to use
EDITOREditor program to use

Configuration file parameters

ParameterDescription
dbDefault database file
spacePlace notes in this space, by default
editorThe editor program to open, when creating or editing new notes
colorDefault color option, one of: auto, no or never, yes or always
styleDefault style option, one of: minimal, light or full

Precedence

Some parameters can be specified in file, as environment variables and as command line arguments. The precedence for these are in the (reverse) order you just read: if you supply the DB environment and the --db command line parameter, the command line parameter will be used. This means that running the following command will initialize a database file named cmd.db:

DB=env.db note init --db-only --db cmd.db

License

MIT License