2024.09.03.

Trying out Strflow for project-related status updates

I used Strflow today with OmniFocus, which is pretty good for an interstitial journal. I can quickly bring it up and leave a status update about projects. It is handy when making a phone call and logging what we discussed.

I made two shortcuts, which work on the selected action’s project:

  1. Journal About Selected OmniFocus Project: ask for a quick status update, then it automatically tags the note with the project name converted to a hashtag.
  2. Open Selected OmniFocus Project Timeline: opens the timeline based on the project name.

I created a journaling shortcut for OmniFocus a couple of months ago, but it is built on top of DEVONthink. It doesn’t automatically get the project, and storing these entries in DEVONthink will make my status updates get mixed with project-related assets, which I don’t like.

By the way, I can also add pictures to Strflow entries, which is kind of hard to do in DEVONthink.

I used to do interstitial journaling in TaskPaper, and I’m not sure yet if Strflow is better or worse than TaskPaper, but at least it is available on iOS, too.

These days, I’m using TaskPaper for “brainstorming,” not journaling. TaskPaper is a pretty cool outliner, so I can quickly create session notes related to the selected OmniFocus action. But these are just fleeting notes… I’m using TaskPaper as a temporary thinking tool.

I can also share Strflow notes with other apps, like Day One, or add them to Drafts, where I can process and export them to other places, transforming Drafts into a tool that migrates text-based information between apps.

Also, I like how the Strflow timeline was made to look like a chat app. In a way, it feels like the old Twitter feed, where we posted random thoughts to get them out of our heads. It is a private version of that.

2024.03.18.

Making my file archive portable in a different way

I looked into how Tailscale works behind the scenes, but I’m still not sure I need a 3rd-party tool to create a virtual network for my devices. There are a couple of cool uses of a network like this, like syncing DEVONthink and OmniFocus over WebDAV using my Mac mini. Still, I also have an Apple Watch, which doesn’t seem to work with Tailscale, so I can’t sync OmniFocus with my Mac mini there like I originally planned.

Initially, I was looking for something that could give me access to my Mac mini outside of my network to get to my file archive stored on my external drives connected to my Mac mini. But giving it a second thought, there is a good reason we have the distinction between Cold Storage and Active Storage.

For me, Active Storage is iCloud Drive, which is synced to all my devices. Cold Storage is not something that I should have access to all the time (not to mention ransomware and other dangers). So, from a security point of view, it’s a good thing that I have a local Mac server and a remote Linux server used for different things. Each of them requires a different level of security, and Tailscale merges them all into one network, which I’m not sure I’m comfortable with.

I’m thinking about shelving this whole idea of reaching my Mac mini server outside of my network and making a distinction between private networks and public networks. A public network means it should be available anywhere, but it should be end-to-end encrypted. This is what DEVONthink and OmniFocus do: each uses my WebDAV server running on my public server as a syncing backend, but these apps store data encrypted.

On the other hand, my private network should be guarded, and data stored there should have a good 3–2–1 backup plan instead.

So, instead of using the network as a transport layer to access my file archive, I’m thinking about using an external drive to bring a copy of my archive with me when I’m away.

2024.03.17.

Playing around with Tailscale

I’m playing around with Tailscale, but I’m not sure about the privacy aspect of being on a VPN all the time. I want to sync DEVONthink and OmniFocus using a WebDAV server on my Mac mini, but running Tailscale 24/7 raises some questions.

  1. Is it really end-to-end encrypted?
  2. Does all traffic go through the VPN?
  3. What about network issues when using a VPN? I’ve seen some connection drops in the OmniFocus sync logs when I used my Mac mini as a sync server.

I love the idea of having my private network of devices available everywhere. But I don’t trust random companies with my data, so I want to do my research before I start to use Tailscale with all my devices.

2023.11.23.

Publish bookmarks from DEVONthink

  • I’m messing with my bookmarks today.

  • I keep a lot of cool articles in DEVONthink as my central repository, but I also want to share some of these links here.

  • I’m testing a simple workflow for this using a DEVONthink smart group, which shows me all my bookmarks from my Decoding database that aren’t published yet.

  • This workflow desperately needs automation, but I want to start as simple as possible and see how it works in practice.

  • Here’s a demo video.

2023.01.11.

Re-reading 43folders.com

I recently started making read/review-related GTD projects to be more disciplined about consuming websites and books. I do this because I want to extract information from them and not just read and forget it.

The current one is 43folders.com, which is old, but still contains many valuable tips and tricks regarding Mac productivity. I’m unsure if there is anything like that today like the Mac blogging scene was from 2003-2008 – maybe MPU Talk — when everybody was obsessed with GTD, QuickSilver, Mac OS X, and productivity. Good times!

Anyway… I started to archive interesting articles linked on 43 Folders into DEVONthink. Sadly, many of those blogs are no longer around, but archive.org has them saved.

Screenshot 2023 01 11 at 11 46 54

2022.12.26.

Downloading YouTube videos with DEVONthink

  • How I download YouTube videos into DEVONthink automatically.

    • 1. While browsing YouTube or checking my subscriptions from Reeder, I can save videos to my Decoding playlist.

    • 2. By subscribing to the channel using its hidden RSS feed from DEVONthink, I can get saved videos into my Decoding database.

    • 3. DEVONthink watches this RSS feed via a smart rule and downloads videos using yt-dlp.

    • 4. The script saves videos into my inbox folder at ~/Library/Application Support/DEVONthink 3/Inbox, which automatically gets imported by DEVONthink.

    • 5. From here, I can organize downloaded videos, start watching them and take notes.

Tweaking workflows

  • I constantly tweak my workflows this time of the year. I usually provide tools for others—that’s what I do for a living—but I also have to keep my knives sharp.

  • This year I’m tweaking two things.

  • Take better notes while watching a video.

  • Moving my Zettelkasten over to Bike.

    • I like to think about my Zettelkasten being a large outline. Keeping it inside Bike could be beneficial.

      • I’m trying to mimic the analog Zettelkasten (or Antinet).

        • I won’t use an analog one since I like the digital one’s benefits better, but I also want ideas from the analog one.

        • I’m a programmer and I use my Zettelkasten to understand coding concepts. I have some code snippets stored in SnippetsLab, so it’s easier to link to those from my Zettelkasten outline than keeping them on paper.

      • I can use the classical Luhmann IDs to add an ID each note.

      • I can nest notes under each other.

        • I can easily link notes together thanks to the Bike and Hook integration.

    • Disadvantages

      • I don’t have backlinks, but I’m not sure I need that inside a Zettelkasten.

2022.07.02.

Reduce context switches in the OmniFocus Inbox using a Process perspective

I watched a video from Cal Newport on how he uses a simple text file for the sense-making of a bunch of new information. He mentioned that instead of processing his emails one by one, he captures the essence of every email into his text file, then starts to categorize it, organize it by projects, etc. This gave me an idea about solving a similar problem I had with my GTD inbox for a while now.

GTD recommends that we process our stuff in the inbox sequentially, without grouping beforehand. The problem with this approach is that many items related to different projects are scattered in our inbox, so we’re jumping in and out of projects while processing our inbox. This constant context switching drains energy from our brain.

If we want to spare our attention, it is a good idea to group our unprocessed inbox items by project, so we can reduce the context switching when we process them. Using this approach for the GTD Process and Organize steps will ensure that we clean things related to each project in one go, not randomly.

I will show you how to do this inside OmniFocus, but you can also steal this approach for Things using a similar “Process” tag.

Why is this a problem?

The point is to add a temporary structure to information in the inbox. I usually do some form of project planning and next action creation when I’m emptying my inbox. The problem is that I constantly switch thoughts about many different things as I go through each item. It would be nice to have them batched and grouped by their project. This can reduce the attention switching to different topics/projects.

Let’s say we have an inbox like this:

  • Item 1 (could be about Project X)
  • Item 2 (could be about Project Y)
  • Item 3 (could be about Project Z)
  • Item 4 (could be about Project X) ← This is where I will have to return to “Project X” again. This item can even be connected to “Item 1” somehow.

I hate when I have to switch my current context (not my GTD context, but the current mindset that I’m in) and go back to a project I already thought about and assigned a next action to; possibly, I even closed its support material since then.

Having new information pre-organized by projects (or topics) can reduce the load of thinking about a project twice or more in an inbox processing session.

Using the Process workflow

  1. The first step is to create a new perspective in OmniFocus called Process with the rules shown on the screenshot above. You’ll use this perspective to process things instead of the standard OmniFocus Inbox.
  2. It’s essential to have everything corralled into the OmniFocus Inbox, so you can stop jumping around different inboxes, but more importantly, have everything pre-organized by the project. Go through your inboxes (email, Slack, DEVONthink, etc.) and link a new action to all unprocessed items in OmniFocus. The Hook app can help a lot with this step.
  3. Open the Process perspective, where you’ll see your unorganized stuff sitting in the Inbox waiting to be pre-organized. You must quickly go through each item and assign it to an existing or new project (don’t assign tags). You don’t have to come up with the final name for a new project. Set whatever comes to your mind; the important thing is to pre-organize unprocessed items in this step. If you don’t know where to assign it, just skip it, or move it into a singular action list related to an area.
  4. When you have pre-organized everything, you can click the clean-up button (or press Command-K) to see all of your unprocessed items grouped by project. Now you can go through each item and deal with them in the context of its project instead of having them all over the place.

Why having a pre-organized inbox is better than a flat list of unknown stuff

I always get annoyed when I deal with something related to a big project in my inbox, and then 5 minutes later, another thing pops into my view about the same subject. I have to open the project and its support material again, get into the same mindset, and maybe even reconsider everything I figured out 5 minutes ago. It is a dumb way to plan things.

I’ve been pre-organizing inbox actions by the project for about a month now, and I can assure you that having unprocessed stuff grouped by the project can make a big difference. I can process my OmniFocus Inbox about 15-20% faster than before, but more importantly, I don’t feel tired after doing it. I stopped switching contexts for every item; instead, I’m spending more time at the project level and dealing with new things from this perspective.


I wrote a follow-up post to this one answering reader questions about this workflow.

2022.02.23.

Archive Hook bookmarks with DEVONthink

I was in a Tinderbox Meetup last week, which was more about Hook than Tinderbox. I’m not a Tinderbox user, but I’m interested in how other people use their tools.

In the middle of the call, somebody had a question about Hook bookmarks. More specifically, can Hook archive its bookmarks as archive.org does with websites in general? Well there is no feature like that in Hook, and to be honest, doesn’t even need to be, because Hook has great Apple Script integration, so we can query bookmarks from its database.

In conjunction with DEVONthink, we can archive our bookmarks from Hook and save them as Pinboard does. I made a script for this a while back and it’s really helpful. It runs once a week, archives all websites from my Hook database into DEVONthink.

Setting up the script

First, download the script from here.

The scripts collect everything into one group in DEVONthink, so you have to create one where the archive can be stored. I would advise a new database even if you don’t have something similar already.

Open the script you downloaded. You’ll see two lines at the top of the file.

set webArchiveDatabaseUUID to "databaseUUID"
set hookedWebsitesGroupUUID to "groupdUUID"

You have to replace the databaseUUID and the groupdUUID part with the UUID of the database and group from DEVONthink. To do this, open DEVONthink, ⌃click on the database in the sidebar, and pick “Copy Item Link”.

Now, replace databaseUUID, with the link you copied. You’ll see something like this.

set webArchiveDatabaseUUID to "x-devonthink-item://CA3A9072-0650-4AF3-A608-1786F9D1A98D"
set hookedWebsitesGroupUUID to "groupdUUID"

Now, remove the x-devonthink-item:// part, so the top of the script should look like this.

set webArchiveDatabaseUUID to "CA3A9072-0650-4AF3-A608-1786F9D1A98D"
set hookedWebsitesGroupUUID to "groupdUUID"

Go back to DEVONthink and copy the group’s link from the same database (it is important to keep the group in the same database) by ⌃clicking on it and picking “Copy Item Link” again.

Replace groupdUUID with the copied link in the script again.

set webArchiveDatabaseUUID to "CA3A9072-0650-4AF3-A608-1786F9D1A98D"
set hookedWebsitesGroupUUID to "x-devonthink-item://B6C2C659-5682-45B5-8D59-107A641F8C2D"

Remove the x-devonthink-item:// part and then save your changes. The top of the script should look something like this now.

set webArchiveDatabaseUUID to "CA3A9072-0650-4AF3-A608-1786F9D1A98D"
set hookedWebsitesGroupUUID to "B6C2C659-5682-45B5-8D59-107A641F8C2D"

Now comes the fun part. You can run the script and DEVONthink will start downloading your Hook bookmarks into the group you choose.

The first run can take a while depending on the size of your Hook database. Subsequent runs should be faster since the script downloads only newly added bookmarks.

It is important to know that the script doesn’t sync Hook and DEVONthink, deleted bookmarks from Hook will still be present in DEVONthink.

Also good to know, if you want to archive sites behind a login, you have to sign-in in DEVONthink before you run the script.

Triggers

I keep this script in the ~/Libary/Scripts/Applications/DEVONthink 3 folder, so it’s available from the script menu in macOS – or in my case, from FastScripts. This way, you can run the script manually from DEVONthink.

You can even make it run automatically. If you use FastScripts, you can create a new DEVONthink reminder on the group you created to store Hook’s bookmarks and set it to run an Apple Script like this every week.

on performReminder(theRecord)
	tell application "FastScripts"
		set scriptItem to first script item whose name is "Archive Hook Bookmarks"
		tell scriptItem to invoke
	end tell
end performReminder

If you want to run it outside of DEVONthink, you can use for example Lingon, which makes it possible to run any Apple Script in the background daily, weekly, monthly, or whatever interval you want.