My Journalling Setup in Notion
Posted on: 11 July 2022
I make a habit of journalling daily, and you can read about this practice here. I started this journal in Notion as a way of getting up to speed with the app. I use the Mac app on my laptop and the Android app on my phone. Notion has stood the test of time, 15 months on, so what do I like about it for journalling?
Notion is a nice bit of software. It’s powerful, yet clean and intuitive. At its heart, it’s a note-taking app, but it features powerful ways to organise your data such as databases and lookups. As a developer, databases are my bread and butter, so I liked the concept of being able to take notes but organise my data into structures too.
Notion also has a neat concept of views: a way to visualise your data based on certain criteria and groupings.
Lastly, Notion has an API. This is what attracted me to it, as it allows me to pull in my journalling & meta data from Notion and mess around with it in code.
My journalling setup
My journal entries are stored in a single database. There’s no limit to the number of entries you can store in a database, so this isn’t a concern. Alongside my journal entry, I track various metrics for that day as well. These are easily captured by a defined set of fields in the database.
Below is a list of the various field types I use. For an in-depth explanation of why I log them as part of my journalling practice, check out my post on why I journal.
The primary date field which I display on my main view is actually a Formula field. This provides a small time-saver when creating new entries. The formula used is as follows:
formatDate(prop("Auto Date"), "MMM D, YYYY")
This field simply acts as a formatter for another formula field: “Auto Date”. Auto Date holds the important formula here:
if(empty(prop("Override Date")), prop("Created"), prop("Override Date"))
Here you can see it checks for a value in the “Override Date” field. This is a standard Date field in Notion, but is hidden by default when composing a new entry (more on that later).
If this field is empty, it will instead use the value of a “Created” field, which is a simple “Created Time” field type, and is always equal to the timestamp an entry was created.
What this results in, by default, is a formatted “Date” equal to the date an entry was created (typically, today).
The “Override Date” is used, typically, for when I don’t get chance to log that day, and I need to back-date an entry. I'll simply select yesterday’s date from the date-picker on the “Override Date” field.
Lastly, I created another formula field called “Day”, which takes the value of “Auto Date” and formats it into the day of the week:
formatDate(prop("Auto Date"), "dddd")
This is useful for, for example, filtering weekend journal entries only in views, and serves as a useful at-a-glance context for the entry.
This is a standard multi-select field containing 20 or so tags. Some are defunct, some seldom used, but the tags remain to preserve past entries. Any number of tags can be associated with a journal entry.
I keep track of to-dos with 2 simple numeric fields: “To-dos Completed” and “To-dos Remaining”, with the former being optional, as I treat it as 0 by default.
In addition to this, I created a “Todos” formula field, which constructs a nicer, condensed representation of the status of my to-dos on a given day:
format(if(empty(prop("Todos Completed")), 0, prop("Todos Completed"))) + " done / " + format(prop("Todos Remaining")) + " todo"
This results in the string: “0 done / 3 todo” (for example), and works well in “card” previews of entries.
There's a strong case for integrating with an external to-do service to pull this data in. But I'm not a heavy to-do user, so manually keeping track of to-dos completed and to-dos remaining requires little effort.
I keep track of TV programmes watched with a very simple text field and a strict format for recording. The TV show name followed by the episode in brackets in the format: “S0E00”. If I’ve watched multiple episodes of a show that day, I’ll separate the individual episodes with a comma, e.g.: “TV Show (S0E00, S0E01)”.
This strict formatting allows me to parse the string on my website and determine which episodes I’ve watched of each show.
This is a simple URL Field in Notion. I just copy and paste the URL of my review of the film in Letterboxd.
A simple multiline text field where I enter podcasts I’ve listened to that day, in the format “Show - Episode title”. Multiple podcasts are separated by a semi-colon. As with TV, sticking to a strict format for this allows me to reliably parse it on my website.
“Food” is a Relation field type, and links to a separate database in Notion, called “Food”. Here, I keep track of all the food I eat, including the ingredients, brands and source of the recipe. Linking to an item in the food database on days where I eat this, allows me to keep track of what meals I eat most often, and when.
This works as a useful system for meal planning and inspiration too, as I can see what meals I haven’t cooked in a while, and which I eat a lot.
To keep track of books, I have 2 fields: “Book Started” and “Book Finished”. I use the latter to display books I’ve read on my website, and the former currently just as an internal metric for me for how long a book has taken me to finish.
How I visualise my data
Notion allows you to categorise your data and visualise it using "Views". Over my time journalling, I've built up a collection of these:
- Side Project
- Child A
- Child B
- Social Calendar
- TV & Film
- By Month
- Health & Relationships
- Completed To-dos
Views are great as they often foreshadow data I'd like to present publicly on my website. They come in 6 different layouts: Table, Board, Timeline, Calendar, List & Gallery. I tend to mostly use Table & Calendar. Below is a summary of what I use each for:
What: Posts tagged with "Side Project"
Why: A really useful "birdseye view" indicator of when I'm most productive on side projects. Often I feel this comes in fits and bursts, and this calendar view usually backs that theory up. Useful for giving me a nudge to dedicate more time to side projects. A prime candidate for converting into a proper page on my site.
Child A / Child B
What: Posts tagged with "Child A" / "Child B"
Why: I like to keep a fairly balanced account of the development and my observations of my two children. These 2 calendar views help me track that. Being able to isolate posts with mentions of each child in allows me to more easily browse "updates" for that child.
What: Posts tagged with "Books" or a value in the "Book started" or "Book Finished" field
Why: This list view collates posts where I talk about a book I'm reading, or indicate I've started or finished a book. Used as a note-taker if I read something that day I want to remember.
What: Posts tagged with "Social"
Why: Since working fully remote, I’m more mindful of how often I get out and do something social with people outside of my immediate family. This calendar view helps me to quickly see how social I’ve been recently.
TV & Film
What: Posts containing a value in the "TV" or "Film" fields
Why: A calendar view for seeing trends of time spent sitting on the couch - an inactive indicator, to a degree. This view got turned into a TV page on my site (films to follow later).
What: All posts, grouped by month
Why: A pretty slow view to render (more on this later), but useful for scrolling through the "headlines" for a particular month, or glancing at key metrics (I show title, tags, film, TV & todos remaining data on this view).
What: Posts containing a value in the "Podcasts" field
Why: A calendar view in the same vein as TV & film, but for podcasts. This view also recently got turned into a Podcast page on my site.
What: Posts tagged with "Fitness"
Why: A seldom used calendar view, pretty much superseded by Strava. I don't do anything with my fitness-tagged post data at the moment, as walk and run data is exported by Strava to a Google Sheet and displayed on my feed page.
Health & Relationships
What: Posts tagged with "Health" or "Relationships"
Why: A really helpful calendar view highlighting periods of mental fatigue, among other things. Useful for pre-empting burnout or just for validation that things have been hard recently (and that they'll get better; they always do).
What: All posts, grouped by tag
Why: An experimental table-layout view for seeing the last 10 posts for a particular tag. What would be incredibly useful is to just see the relevant content for that tag, to save skimming the whole post; but this was a structural step too far in Notion when creating my setup. Useful for seeing frequency of tags at a glance, as Notion shows only the last 10 most recent posts for each tag by default.
What: Posts containing a value in the "Todos Completed" field
Why: A good metric of productivity. A calendar view showing when I've completed to-dos. Useful for spotting lulls in productivity and trends, e.g. most common days of the week I tend to complete tasks.
What: Posts where the value of the "Day" field is "Monday"
Why: I play a weekly game of football with friends on Monday evenings. I invariably summarise the game for my own satisfaction; I use this table view of Monday posts to browse these.
Room for improvement
Notion is slow. Sometimes. On my 8 year old Macbook Pro, sometimes views can take up to 10 seconds to load. It all feels a little clunky, when in theory, most of the data could be stored offline and refreshed in the background.
On the Android app on my phone (3-year-old Pixel 3), it's better. But it's a long way from being a snappy experience. Most of the time, this is fine. But if I was a power user and relied on Notion a lot for my work, this would be irksome.
Tagging posts is a great way to group themes together and see frequency at a glance, but it's not very easy to browse just that content. E.g. see all my Child A journal entries. This isn't so much a limitation of Notion as it is the way I've set it up. Fortunately, I don't very often need to browse my journal entries in this way.
One solution would be to create a new "sub" entry for each subject I talk about, but this would increase friction when typing out a journal entry and make the whole process less smooth. So, for now, my setup is fine.
How I pull this data into my Eleventy website
Netlify's API client and permission system is easy to use and works nicely for what I need. But this is a post for another day. Stay tuned!