Thesis

I find using GUI applications such as Obsidian to be cumbersome and not optimal for how I take notes and utilize information gathering. However, I did like some aspects of Obsidian such as templates. I also wanted to develop a system that utilized the Zettelkasten note taking system to it’s fullest, while also learning how to develop CLIs.

I achieved all of these objectives by writing a custom CLI utility in Go using the Cobra framework which allows note creation, template parsing, and initalizing new note vaults as needed, while maintaining 100% compatability with Obsidian and other note taking applications if need be.

Workflow

Go will have to communicate with both the shell/terminal to get some info such as the current date and time, etc. and also be able to write/update markdown files for the daily notes/categories. For the daily note, we also havbe to consider that we must first check if the note exists, and if it does then we open that daily note. If it doesn’t exist, we create it. This does mean that we have to be careful not to overwrite notes as we use them. Notes must also be able to populate the date form.

Implemented commands

  • zettk-cli new [args] [TITLE] -> Creates a new note with the supplied TITLE, arg allows choice of custom template
    • --template or -t will allow us to specify a specific template
    • --type specifies if it’s a reference, permanent note, etc. zettk-cli daily -> Opens the daily note for the current day, or creates it if it doesn’t exist
  • zettk-cli sp -> Opens the /scratchpad/scratchpad.md markdown for quick notes
  • zettk-cli find -> Searches the settlekasten for note, and provides some basic data such as when it was created, when it was last edited, etc.
    • --inbox only searches the inbox
    • --archive only searches the archive
    • --reference only searches references
    • The info returned should also specify which directory the note is in (Inbox, Reference, Archive)
  • zettk-cli open finds and opens the zettlekasten note using your choice of editor
  • zettk-cli init initalizes a new zettlekasten with filesystem

Need to Implement

  • Perform refactoring
  • Add in potential support for Typst or leave that to neovim plugin management

Notes

  • Directory management has been a complete pain in the ass to manage, Go needs better defaults

Resources

GitHub Repository