tdo is a opinionated, command line based note-taking system. Demo video
- Can help you manage a daily log, todos, journal and notes
- Review pending and upcoming todos, past journal entries and more
- Integrates with git to commit and backup your notes automatically, check tdo.nvim for neovim integration
- Has interactive fuzzy searching capabilities powered by fzf
- Can integrate with other tools in pipes and subshells for extended functionality
- Supports all editors, set
$EDITOR
to your choice
- ripgrep, fzf
- bat (optional, for syntax highlighting in search)
- coreutils (required on macOS, for gdate command)
git clone https://github.com/2kabhishek/tdo
cd tdo
./install.sh
-
NOTES_DIR
should point to your notes directory -
TODOS_DIR
optional, should point to your todos directory, default:NOTES_DIR/todos
-
JOURNAL_DIR
optional, should point to your journal directory, default:NOTES_DIR/entries
-
EDITOR
set to your choice of editor
If you want to customize the setup or are facing issues with installation, you can set up tdo manually.
Change these commands according to your needs.
# Link tdo to a directory that's in PATH (~/.local/bin here)
ln -sfnv "$PWD/tdo.sh" ~/.local/bin/tdo
# Create a notes dir if not already present
mkdir -p $HOME/Projects/Notes
# Add the NOTES_DIR env var to your shell config ~/.bashrc, ~/.zshrc etc
echo "NOTES_DIR=$HOME/Projects/Notes" >> ~/.zshrc
# Add sample templates to your NOTES_DIR
cp -irv templates $NOTES_DIR
# Reload shell config
source ~/.zshrc
If you want to sync your notes across devices, you can set up a git repo on the $NOTES_DIR and add GitHub/GitLab as remote.
cd $NOTES_DIR
git init
git add .
git commit -m 'init: notes'
git remote add origin <your-remote-git-url>
git push origin main
tdo will automatically commit every change with a timestamp like 03 Feb 11:33
as commit message.
If you use Neovim, I highly recommend using tdo.nvim, it seamlessly integrates tdo
and nvim
and adds some useful features on top.
tdo
to open today's todostdo <offset_days>
to open todos fromoffset_days
in the past or future, e.g:tdo 1
,tdo -2
tdo <note_title>
to open or create anote_tile.md
note, use folder names to categorise notes, e.g:tdo tech/vim-tips
tdo note
ortdo n
to create a new note with the current timestamp indrafts
tdo entry
ortdo e
to open today's journal entrytdo entry <offset_days>
to open journal entry fromoffset_days
in the past or future, e.g:tdo e -3
tdo find <text>
ortdo f
to interactively search fortext
in all your notestdo find
without any search term to review all your notestdo todo
ortdo t
to show all your pending todostdo commit <path>
ortdo c
to commit changes in path, happens automatically, needed for plugins and integrations
Run
tdo h
to get help info on the command line
tdo
expects an opinionated directory structure to function.
- Notes live in the
notes
sub-dir, use these for long term knowledge management, second brain - Notes use the templates/note.md file as template
- Todos live in the
todos
sub-dir, use these for short term notes, daily todos - Todos use the templates/todo.md file as template
- Journal entries live in
entries
sub-dir, use these for personal notes, life logging - Journal entries use the templates/entry.md file as template
βββ todos
βΒ Β βββ 2023
βΒ Β βββ 11
βΒ Β Β Β βββ 2023-11-29.md
βββ entries
βΒ Β βββ 2024
βΒ Β βββ 02
βΒ Β Β Β βββ 2024-02-03.md
βββ notes
βΒ Β βββ tech
βΒ Β Β Β βββ quit-vim.md
βΒ Β Β Β βββ arch-btw.md
βββ templates
Β Β βββ entry.md
Β Β βββ note.md
Β Β βββ todo.md
You can configure tdo
by either defining environment variables or via a $HOME/.config/tdorc
file.
ADD_ENTRY_TIMESTAMP
[boolean]
: Whether to add a time stamp when usingtdo entry
ortdo e
.ADD_NEW_NOTE_TIMESTAMP
[boolean]
: Whether to add a time stamp when creating new notes withtdo <note_title>
.FILE_NAME_AS_TITLE
[boolean]
: Whether to add the file name as title when creating new notes withtdo <note_title>
. Iftrue
, then it adds<note_title>
as a markdown title in the first line of the new note.ENTRY_TIMESTAMP_FORMAT
[string]
: can be any bash string such as a date format expression. It is ignored ifADD_ENTRY_TIMESTAMP
is set tofalse
.NOTE_TIMESTAMP_FORMAT
([string]
: can be any bash string such as a date format expression. It is ignored ifADD_NEW_NOTE_TIMESTAMP
is set tofalse
.
ADD_ENTRY_TIMESTAMP=true
ADD_NEW_NOTE_TIMESTAMP=false
FILE_NAME_AS_TITLE=false
# Reads ## Mon, 12:00 PM
ENTRY_TIMESTAMP_FORMAT="## %a, %I:%M %p"
# Reads ## Fri. Apr 06, 2024 - 06:48 PM
NOTE_TIMESTAMP_FORMAT="## %a. %b %d, %Y - %I:%M %p"
configs defined in
tdorc
will override corresponding environment variables
You tell me!
After trying out every note management system under the sun I had decided on using plain markdown notes powered by nvim2k.
tdo is a spiritual successor and complimentary tool to that, taking the same principles and making it more accessible and simple.
- cmtr β Fast git commits
- mkrepo β Spin up new GitHub repos from the CLI
- ghpm β Manage all your GitHub repos
- gsync β Sync your git repos
- dots2k β Dev Environment
- nvim2k β Personalized Editor
- sway2k β Desktop Environment
- qute2k β Personalized Browser
β hit the star button if you found this useful β
Source | Blog | Twitter | LinkedIn | More Links | Other Projects