Note-taking with Obsidian

Sharing my note-taking migration from Joplin to Obsidian and how I use it everyday.

Joplin

I've been using Joplin as my primary note-taking app for the past 5 years. I migrated from Google Keep back when I was retooling for privacy.

Since that time, Joplin has released a self-hosted server, notebook icons, but not much else. It still suffered from many issues like its mobile app, on-demand syncing and plugin support.

joplin

Obsidian

I've known for the past year or so that everyone was hot for Obsidian, a new note-taking app that was developed during COVID-19. I tried it out, but its closed-source development and paid syncing solutions turned me off. I tried a community syncing plugin, but that didn't work reliably for me.

Since then, I have heard it constantly on the Self-Hosted podcast and have been recommended it by work colleagues. Here's an example of their daily standup notes, dynamically generated.

obsidian work

Over the busy holiday season, I needed a way to manage and track my tasks, errands and chores. This led to trying out Todoist and Obsidian again. From here I stumbled upon the community tasks plugin, figured out the Self-hosted LiveSync plugin holding me back last time, and this snowballed into moving everything over from Joplin.

The aha moment came when I was watching Nicole van der Hoeven's video on Obsidian task management with Dataview, Templates and Daily Notes. The combination of all three plugins showed off Obsidian's power and ease of use. I recommend going through Nicole's YouTube channel and picking out any Obsidian videos that may interest you.

Comparison

Features

A comparison of the features that matter to me beyond editing notes:

Feature Joplin Obsidian
Open-source Yes No
Mobile App Yes Yes
Notes are stored offline Yes Yes
Notes can be accessed without app Possible Yes
Encryption at rest Yes Possible
Encryption in transit Yes Possible
Sync across devices/platforms Yes Possible
File attachments Yes Yes
Plugins Yes Yes

Joplin has a clear lead here, but then when I compare the quality of the features, Obsidian is ahead.

Feature Winner
Desktop App Obsidian
Mobile App Obsidian
Quality of plugins Obsidian
Syncing between devices Obsidian (with plugins)
Sharing notes to others Same (with plugins)
Templating Neither, but Obsidian's plugin is better
Flexibility with notes Joplin

Joplin's Flexibility

Looking back at my time with Joplin, the only feature I miss is its flexibility with notes:

  • Each entry can either be a note or a to-do item.
  • Notes and to-do entries can live together in the same notebook
  • Notes can have the same name in the same folder
    • This is because Joplin names each file with a hash
  • Note titles can have reserved characters like /

joplin flexibility

Obsidian Plugins

Using plugins is a must-have for Obsidian as they add a lot of value and make the entire experience better. In alphabetical order, these are the plugins I currently use.

BRAT

BRAT makes it easy to install beta versions of other plugins. Some of the very popular plugins like Calendar or Periodic Notes haven't been updated in a while, but they have prerelease versions with new features that I wanted to use.

Commander

Commander allows customising the user interface to add commands to different parts of the user interface. I use it to add a button to run Periodic Note's switch active calendar set command to my sidebar.

commander

Custom File Explorer sorting

Custom File Explorer sorting as the name implies allows custom sorting in each folder.

By default, Obsidian only allows sorting globally by a few methods. I prefer File name (A to Z) by default, as it grows muscle memory of folders.

sort default

However, I name my stand-up notes using the day of the week, causing them to be out of order when drilling down.

sort before

Custom File Explorer sorting solves this by configuring the file sorting using a sortspec configuration file. The following code will now sort only the Stand Up folder and its files based on the time of creation:

---
sorting-spec: |
  target-folder: Stand Up/*
  order-asc: advanced created
---

sort after

Dataview

Dataview allows querying the metadata of notes to list, filter, sort or group their data. The results returned can be dynamic and always up to date. It provides a fast way to search, display and operate on indexed data.

One way I use Dataview is to display and track my gift card balances. Take this gift card for example, within the frontmatter, I set the store name and the amount.

gift cards

Then on another note, I create a dataview query to display them all in one table.

```dataview
TABLE amount as Amount
FROM "Money/Gift Cards"
SORT file.name
```

all gift cards

Editing Toolbar

Editing Toolbar adds a row at the top of each note to format the text within the document.

Front Matter Title

Front Matter Title allows customising a note's title in various places like the file explorer, search results and tab name based on its metadata.

From my previous gift card example with the Dataview plugin, I could change the note's title to show both the store name and amount by using {{store}} ${{amount}}.

front matter title

Iconize

Iconize allows adding icons to notes and folders. It is a native feature in Joplin that I loved, but not Obsidian.

iconize

Periodic Notes

Periodic Notes generates a daily, weekly or monthly note with one button or command. I use this alongside Templater to generate my daily tasks and stand-up notes.

I'm currently using the beta which supports multiple types of notes through calendar sets. I have my stand-up notes formatted to YYYY/[W]W/ddd MMM Do and my daily notes to YYYY/MM - MMMM/YYYY-MM-DD.

periodic notes calendar sets

Self-hosted LiveSync

Self-hosted LiveSync syncs notes, plugins and settings between devices. It uses CouchDB as the intermediary server. It also supports end-to-end encryption and path obfuscation.

You can have one primary device and add others are secondary devices using a password-protected setup URI. Each device can have its own sync settings and it comes with configuration presets. The customization sync for settings is still in beta and requires customising new plugins each time.

Every change is synced between devices which can slow it down. For example, if I create 500 files, and then delete them of all them, when another device syncs those changes, it will repeat the creation of the 500 files step first before deleting them right after. Joplin was much faster when syncing changes. After it is done syncing, I'm usually left with half a dozen popups asking me to reload Obsidian.

sync popups

sync popups 2

Another issue I run into often is sync conflicts. Often when I'm adding new folders or changing icons, it somehow always ends up in a conflict. Luckily the visual conflict resolver makes it easy to decide which version is the correct one to keep. I recommend adding ,\/workspace-mobile.json$ to the list of folders and files to ignore (and made a PR for it too) to stop it always appearing as a conflict.

sync conflict

Tasks

Tasks management adds features to checklists (- []) by supporting due dates, recurring tasks, filtering/querying tasks and displaying different statuses.

I was sold on this plugin when I saw the incomplete/in-progress status support (- [/]) which I discovered on the CGP Grey Sidekick Notepad. I'm currently using the Minimal theme to style my task statuses.

tasks style

To track and manage my tasks, I use Periodic Notes and Templater to create a new task list each day. Then, on another note, I aggregate them together using the plugin's query support:

all tasks

Click to see code
# To Do
```tasks
((not done) AND (scheduled before tomorrow)) OR ((not done) AND (no scheduled date))
path includes To Do

hide task count
```
# Rescheduled
```tasks
not done
scheduled AFTER today
path includes To Do
hide edit button
hide task count
```
# Done
```tasks
done
sort by filename reverse
path includes To Do
hide edit button
short mode
limit 10
```

Templater

Templater creates templates with variables and function results from JavaScript.

I've shared two of my templates below that I use to dynamically generate my daily tasks and stand-up notes. There is also a section on GitHub for others to showcase their templates.

My Templater Templates

Daily Tasks

This template pulls in tasks rescheduled and due today. It also has navigation links to move between days at the top with a link to 'All Tasks'.

daily tasks

Click to see code
<- [[<% tp.date.now("YYYY-MM-DD", -1) %>]] | [[All Tasks]] | [[<% tp.date.now("YYYY-MM-DD", 1) %>]] ->
# Tasks

- [ ]

# Rescheduled to Today

```tasks
scheduled {{date:YYYY-MM-DD}}

hide task count
```

# Due Today

```tasks
due {{date:YYYY-MM-DD}}

hide task count
```

Stand Up

This template pulls in everything from the previous stand-up notes sections to produce the What did I accomplish yesterday and What will I do today?.

standup

Click to see code
<%-*
var prevNote;
var dateFormat = "[Stand Up]/YYYY/[W]W/ddd MMM Do";

for (let i = -1; i > -100; i--) {
  prevNote = tp.date.now(dateFormat, i);
  if (await tp.file.exists(prevNote + ".md")) {
    var prevBreadcrumb = tp.date.now("ddd MMM Do", 0, prevNote, dateFormat);
    for (let j = 1; j < 7; j++) {
      let testDate = tp.date.now("ddd", j);
      if (testDate != "Saturday" && testDate != "Sunday") {
        var nextNote = tp.date.now(dateFormat, j);
        var nextBreadcrumb = tp.date.now("ddd MMM Do", 0, nextNote, dateFormat);
        break;
      }
    }
    break;
  }
}
-%>

<- [[<% prevNote + "|" + prevBreadcrumb %> | ]] | [[<% nextNote + "|" + nextBreadcrumb %>]] ->

# What did I accomplish yesterday

<%-*
let yesterday = await tp.file.include("[[" + prevNote + "#^What will I do today?]]");
tR += yesterday.substring(yesterday.indexOf("\n")+1).toString();
-%>

# What will I do today?

<%-*
let today = await tp.file.include("[[" + prevNote + "#^What will I do tomorrow?]]");
tR += today.substring(today.indexOf("\n")+1).toString();
-%>

# What will I do tomorrow?

- [ ]