Dailies capture templates best practices

Hi, all—just getting my feet wet with org-roam. Thanks for creating something so wonderful.

I’ve used org-mode for a few years and am intrigued by both zettelkasten and Roam Research but don’t really have experience with either.

My question: what best practices are there for adding content to daily notes?

In particular, I currently have a capture template for org-mode that sets up a daily note that gets dumped into a date tree with slots for a gratitude journal, making a plan for the day, collecting random notes, and a brief daily review. I create the entire day’s template at the beginning of the day and then fill it in as I go along. This template is a few dozen lines of text, so I maintain it in a template file (i.e. instead of something like "%?", the template definition is (file "path/to/template.org")).

It looks like I could replicate something along these lines with a really complex :head tag in a org-roam-dailies-capture-templates entry, but that feels a bit kludgy. I’m wondering if the recommended practice would be to:

  1. use a template file (tried this, but I keep getting errors about using the wrong argument type)
  2. factor each item (i.e. gratitude journal entry, daily plan, daily review, etc.) into a separate capture template; OR
  3. put these kinds of things somewhere else (this isn’t really what people are discovering to be the best use for dailies; OR
  4. Something else entirely :slight_smile:

I realize any one of these probably could work, but I’m interested in best practices here regarding how to add to dailies and really, any sorts of developing best practices for using dailies. Thanks!

I use the :head argument here:

    (setq org-roam-dailies-capture-templates
          (let ((head "#+title: %<%Y-%m-%d (%A)>\n#+startup: showall\n* [/] Do Today\n* [/] Maybe Do Today\n* Journal\n"))
            `(("j" "journal" entry
               #'org-roam-capture--get-point
               "* %<%H:%M> %?"
               :file-name "daily/%<%Y-%m-%d>"
               :head ,head
               :olp ("Journal"))
              ("t" "do today" item
               #'org-roam-capture--get-point
               "[ ] %(princ as/agenda-captured-link)"
               :file-name "daily/%<%Y-%m-%d>"
               :head ,head
               :olp ("Do Today")
               :immediate-finish t)
              ("m" "maybe do today" item
               #'org-roam-capture--get-point
               "[ ] %(princ as/agenda-captured-link)"
               :file-name "daily/%<%Y-%m-%d>"
               :head ,head
               :olp ("Maybe Do Today")
               :immediate-finish t))))

I have factored the head in a let binding, and you could use elisp code to fetch your template at that point.

Thanks! I saw your earlier post about this setup, but I really like the way you’ve refactored the :head argument out using let to clean things up. It looks like you create top-level headings as buckets for each kind of content and then use :olp to drop things into each bucket as needed. That seems like a cleaner approach than the template I’m using now.

Also, I like your suggestion to use the let statement to read in a file template. It would be nice if dailies allowed file templates like org-roam-capture-templates does. I’ve started another thread to figure out why there’s a difference there.

edit: second paragraph