Uses and workflows: daily notes, journals and templates

Daily journalling preexisted note-taking apps, but I’d wager that Roam and similar tools popularised daily notes for a number of people who might otherwise not have considered their value. To be fair, daily notes and daily journalling aren’t exactly the same thing…

If you’re not familiar with Roam: open the app and you’ll be greeted with a note for today, titled with today’s date. The daily note is a useful anchor or entry point, and a useful way to give random notes a home without having to think about where else they might belong. Some people furnish the templates for their daily notes with for prompts for self-reflection.

I’ve kept a light journalling practice for most of my adult life. Journalling in Drafts has proven to be a great way to balance a little “whatever’s on my mind” self-reflection with some practical reviewing of recent/upcoming considerations, and a useful way to cultivate an intentional morning routine.

MY DAILY NOTES ACTION

The action consists of a single script step that first checks whether a journal already exists for the day. If there’s a journal, the action simply opens it (so serving as a journal launcher); if no journal exists, the action creates a new one, based on my template. I haven’t made the action available (it makes use of some idiosyncrasies specific to my way of working with Drafts), but in case anyone might find it useful, details follow. Insert my standard self-deprecating statement about the hackiness of my scripting and gratitude for any comments or queries that might help refine it here.

let today = new Date().toString("yyyyMMdd")
let ws = Workspace.find("Journal");
app.applyWorkspace(ws);
let drft = Draft.query(today + " » JOURNAL", "inbox", ["journal"],[],"created",true)

if (!drft[0]) {

// Query returns no draft, meaning no journal has been created yet. Let's make one. Variables first.

	let todaytime = today + new Date().toString("-HHmmss")
	let bwtime = today + new Date().addSeconds(5).toString("-HHmmss")
	let y8601 = new Date.parse("today").toString("yyyy-MM-dd")
	let day = new Date().toString("ddd")
	let bwlog = bwtime

// Get week number for tag. Source: https://weeknumber.com/how-to/javascript

	Date.prototype.getWeek = function() {
		var date = new Date(this.getTime());
		date.setHours(0, 0, 0, 0);
		// Thursday in current week decides the year.
  		date.setDate(date.getDate() + 3 - (date.getDay() + 6) % 7);
 		// January 4 is always in week 1.
  		var week1 = new Date(date.getFullYear(), 0, 4);
  		// Adjust to Thursday in week 1 and count number of weeks from date to week1.
  		return 1 + Math.round(((date.getTime() - week1.getTime()) / 86400000
                        - 3 + (week1.getDay() + 6) % 7) / 7);
	}

    var weekNumber = (new Date()).getWeek();
    var weekTag = new Date().toString("yyyy-") + weekNumber

// Create a new draft from the journal template, minus the template's title
    
	d = new Draft()
	templ = Draft.find("66F9A172-A4D2-45A9-84B3-6E184479E524")
	d.content = templ.content.split("\n").slice(1).join("\n")

// Insert variables: https://stackoverflow.com/questions/15604140/replace-multiple-strings-with-multiple-other-strings
		
	var mapObj = {tdate:todaytime,tday:day,tD8601:y8601,bwloglink:bwtime,ithDay:today};

	var re = new RegExp(Object.keys(mapObj).join("|"),"gi");
	d.content = d.content.replace(re, function(matched){
		return mapObj[matched];
	});

	d.addTag("journal");
	d.addTag(weekTag)
	d.update()
	editor.load(d)

// Select the ellipsis, ready for writing

	var pos = d.content.indexOf("...")
	editor.setSelectedRange(pos,3)

// Do something similar to create today's workout log, linked back to the daily journal

	dLogTempl = Draft.find("3BBE8149-484D-468B-BCD6-22E772AD72C7")

	dLog = new Draft()
	dLog.content = "# " + bwtime + " » BODYWORK:\n[[" + d.displayTitle + "]]" + "\n\n# WORKOUT LOG:" + dLogTempl.content.split("\n").slice(1).join("\n")
	dLog.addTag("logs");
	dLog.addTag("workoutlog");
	dLog.addTag(weekTag)
	let syntax = Syntax.find("builtIn", "TaskPaper");
	dLog.syntax = syntax;
	dLog.update()

} else {

// a journal already exists, so ignore everything else and just open it...
	editor.load(drft[0]);
}

// app.hideActionList();
// app.hideDraftList();
editor.activate();

THE TEMPLATE

The template is stored in a draft, and contains tokens that are dynamically replaced when the script runs and a new journal is created. This allows me to tweak the template easily without having to adjust the action, and maintains a version history of the different iterations of my morning template, thus recording changes in my morning routine over time.

# DAILY JOURNAL TEMPLATE
# tdate » JOURNAL (tday)
[Calendar view](shortcuts://run-shortcut?name=View%20Date&input=tD8601)

	> drafts://x-callback-url/runAction?action=RandoAphorism

## FIRST THOUGHTS

...

## PRIMARY ACTS / BASELINE
- [ ] track sleep
- [ ] [Review yesterday's drafts](drafts://x-callback-url/runAction?text=&action=Drafts%20yesterday)
- [ ] review the plan for this week [[map:WEEKLY REVIEW]]
- [ ] workout: [[bwloglink]] 
- [ ] read [something from the Reeder queue](shortcuts://run-shortcut?name=Random%20Reeder%20%28Read%20Later%29)

## TODAY

A few more notes about the template:

  • The “Calendar view” link runs a shortcut that opens Fantastical on the date that corresponds with the note. This is a quick way to open today’s schedule. Also, looking back, it’s useful to be able to call up the schedule associated with a past daily journal.
  • The action immediately below the calendar view link serves up a quote drawn from a Drafts workspace I use to hold quotes; I could automate this (have the template created with a quote automatically inserted), but I like to select a quote that feels in some way relevant for the day. The “RandoAphorism” action allows me to reload a new random quote until I get one that resonates for me, at which point it replaces the link in the daily journal with that quote. Filtering through a few quotes each morning is a good way to put eyes on them, and I usually find something that sparks within a few tries, if not immediately.
  • “Review yesterday’s drafts” just loads a workspace focusing on all drafts modified yesterday. Starting my day with this has proven really useful for picking up on whatever I was thinking, feeling or working on the day before; a good way to guard against losing the thread when stressed or busy.
  • “Review the plan for this week”: I keep a list of things to focus on in an iThoughts map, organised by week. I’ve adjusted the GitHub Markdown syntax definition so that I can link to maps in iThoughts with the prefix “map:” in a Drafts wiki-link.
  • “Read something from the Reeder queue” loads a random “read later” item in Reeder. I’m trying to make this more of a daily habit to balance out my inclination to gather a lot of reading material and never getting around to reading it…

Improvements considered while writing this up

  • An action that opens the template for edits. Right now I simply search for it when I need it. I don’t adjust the template that frequently, but frequently enough that an action like this would be useful.
  • An adjustment to the syntax definition to run a Shortcut from a wiki-style link — e.g. [[sc:Title of shortcut]] instead of a shortcut url.
  • I have considered automating the daily note action via Shortcuts. I already run a shortcut overnight (4am) that appends completed tasks from Reminders to yesterday’s daily note, so it’s entirely feasible to have the creation of the daily note run automatically. For now, though, I value the ritual of triggering it manually.
6 Likes

Great stuff, Jacob. Thanks for writing it up.

Little note, you can already do straight URLs with wiki-style links in the default syntaxes. If you want your shortcut trigger to be tappable without using link mode or a preview, you could use:

[[url:shortcuts://run-shortcut?name=View%20Date&input=tD8601]]

Doesn’t hide the URL like rolling into the syntax, but maybe helpful. (more details on supported link types)

2 Likes

Mmm! I must admit I’d forgotten about that URL prefix, and how that would make a link instantly tappable. That gives me a further nudge towards updating my syntax definition for tappable natural language Shortcut links. Nice!

2 Likes