2023.12.23.

2023.12.21.

2023.12.19.

It is more than funny (and sad) that Electron apps are so bloated now that they can’t even offer a proper universal binary. You have to pick the CPU family on download.

New Hookmark scripts for Reminders

I updated my Reminders/Hookmark integration script recently to make it faster on Sonoma. I also made sure that I have a “New Item” part too, so I can create reminders directly from Hookmark.

The “Get Address” script uses the backing SQLite database to find the ID of the selected reminder by title.

There are some caveats to keep in mind:

  1. We have to replace the remindersDatabasePath property with the proper database path which is different for everyone.
  2. Reminders are matched by title, so if we have multiple reminders with the same title, the script may fail to link the proper one.

Here are the scripts updated for Sonoma:

Get Address

use AppleScript version "2.4" -- Yosemite (10.10) or later
use scripting additions

-- Replace this with your Reminders database path.
property remindersDatabasePath : "/Users/yourusername/Library/Group Containers/group.com.apple.reminders/Container_v1/Stores/Data-some-UUID.sqlite"

tell application "System Events"
    tell its application process "Reminders"
        tell its window "Reminders"
            tell its splitter group 1
                tell its UI element 3
                    tell its UI element 2
                        tell its UI element 1
                            set reminderOutline to first UI element whose selected of UI element 1 is true
                            set theReminderName to value of UI element 2 of UI element 1 of UI element 1 of reminderOutline
                        end tell
                    end tell
                end tell
            end tell
        end tell
    end tell
end tell

set theSQLCommand to "/usr/bin/sqlite3 \"" & remindersDatabasePath & "\" \"SELECT ZCKIDENTIFIER from ZREMCDREMINDER WHERE ZTITLE = '" & theReminderName & "'\""
set theReminderIdentifier to do shell script theSQLCommand
set theURL to "x-apple-reminderkit://REMCDReminder/" & theReminderIdentifier
return "[" & theReminderName & "](" & theURL & ")"

New Item (this one can be a bit slow unfortunately)

tell application "Reminders"
    set theName to "$title"
    set theBody to "$user_link"
    set theReminder to make new reminder with properties {name:theName, body:theBody}
    set theReminderURL to the id of theReminder
    set theReminderURL to do shell script "echo \"" & theReminderURL & "\"|sed 's/x-apple-reminder:\\/\\//x-apple-reminderkit:\\/\\/REMCDReminder\\//g'"
    activate
end tell

theReminderURL

I haven’t tested these on earlier systems.

2023.12.17.

2023.12.16.

Checking the time on my Mac

  • Inspired by a recent post about keeping the menubar a bit more compact, I switched the menubar clock to the analog version.

  • Since clicking on the clock also toggles Notification Center, adding the Clock widget (with a monthly calendar) made sense, which is way more readable than the small one in the menubar.

    • I can even toggle Notification Center with the Globe-N keyboard shortcut for quick clock access.

  • On the other hand, I remembered a Mac app, called FuzzyClock. It’s an old app that shows you the time, kinda… Instead of displaying 8:23, it just says twenty past eight. Sadly, FuzzyClock doesn’t work on newer systems anymore, but I found FuzzyTime which is a modern, reimagined version of FuzzyClock.

    • What’s the point of these apps? Sometimes, maybe we’re too attached to being precise with our time, and not knowing exactly what the current time is can ease that, making us more focused.

  • Since I hid the digital clock because I wanted more space in my menubar, it’s not ideal if I see FuzzyTime running all the time. It takes up more space than the digital clock, but it would be nice to toggle it using a keyboard shortcut.

    • I used Keyboard Maestro to automate the display of FuzzyTime.

    • Pressing ⌃⌥⌘H will open FuzzyTime, and pressing the same shortcut again will just quit it, resulting an on/off toggle effect for FuzzyTime in the menubar, which is exactly what I want.

  • In essence, here’s how I check the time on my Mac now.

    • Oh, I and still have plenty of space for my app icons in the menubar.

What’s up with Twitter these days?

I read: What should I do with my Twitter:

I’ve been trying to figure out what to do with my Twitter/X account. I don’t want to leave it dormant, because the current policy is to reclaim usernames from accounts that don’t post, which creates a risk that someone will come along and claim to be me later on.

I was worried about this, but I don’t care anymore.

Then… The idle elite:

At this point, if you’re still on Twitter, it might be time to accept a hard fact about yourself: there’s not a single thing that its leadership could do that would push you off the site. Since the takeover almost a year ago they’ve fired everyone who cared, they’ve invited back 4chan, kiwifarms, and sundry other threat actors, they’ve started revenue sharing with the rape peddlers and insurrectionists, they’ve given priority lanes to every paying NFT and AI grifter, and even outright blamed the jews for their bad finances. That’s not even close to an exhaustive list!

Twitter is the worst “social media” site you can use nowadays. Look at what is happening with Threads and Mastodon over here.

I still don’t trust Meta, though.

2023.12.13.

Read “No Influence | skoo.bz”

Speaking of social media, that’s a very distracting place to post to. You see the feed before anything. It’s far too easy to get sucked into that feed before you remember why you came on there in the first place. At that point, I question what my purpose is being on there at all. You’re there to get attention. Bar none.

2023.12.12.

Follow-up on Apple and journaling:

I like the Journal app, even if it’s barebones as all 1.0 apps usually are. Since I mostly use default Apple apps, the recommendation feature works well for me.

It is a good base for more advanced features in the future (I guess we see nothing new until the next WWDC).

I’m going to keep Everlog around as an archive though.

2023.12.09.

2023.12.08.

Read “Michael Tsai – Blog – Mac Menu Bar Icons and the Notch”

On my 13” Intel MacBook Pro, the icons reached to about halfway across the screen. On the 14” M3 MacBook Pro, ironically a machine with a larger display, at least 3 icons get hidden.

This “design” (or lack thereof) is so dumb. It is utterly ridiculous to me that this is still how it “works” two years after the introduction of the redesigned MacBook Pro with a notch. How hard could it be to add an overflow menu with a “«” (or should it be “»”?) button that shows the remaining apps and icons that can’t be displayed? This entire situation with the notch is ironic, because the iPhone notch and “dynamic island” are so thoughtfully designed with zero compromises regarding the functionality of iOS. In fact, they actually provide a better user experience. Yet on the Mac, how the notch interacts with macOS is laughably incompetent. It is shockingly lazy regarding attention to detail, and results in an outright disruptive and confusing user experience.

Here’s my current menubar:

I try to keep my less frequently used icons (like Hookmark) on the left because I mostly invoke them from the keyboard anyway. But I hate when Docker gets stuck behind the notch, and I have to quit other apps on the right to get Docker back to the screen.

Apple should do something about this behavior because it’s really annoying. And no, I’m not going to install a 3rd-party app to fix these issues, even if I love its icon.

Read “Jack Wellborn: “I just recently discovered tha…” – Mastodon”

I just recently discovered that you can select and drag multiple Safari tabs by holding shift or command, just as you would to select and drag multiple items in Finder.

I’m sure it has been added recently or was hidden in the system for like 15 years.

Sadly it’s Safari only, so it doesn’t work on other system tabs like Finder or iA Writer.

Gordon Smith:

My use case is to select those tabs I want to save as a group, right click one of those tabs to add them all to a new Tab Group (to keep things neat and tidy).

Read “What I Miss Most About the iPod”

Little things like this have me thinking more and more about the control I have over my music library. I love having access to any song at any time. But, at the same time, I want more control. Apple could easily allow for smart playlist stacks to exist on the cloud. I’d have nothing to write about at that point. But, as we’ve seen with Sony lately, Apple could take away content at any point, even if you paid for it in their store. It would be a much more expensive route to maintain a physical CD collection that I then rip into a media library.

I still maintain my local music library in the Music app and buy music from the iTunes Store, Beatport, and sometimes CDs from Discogs (which I rip later).

At one point I even turned off iCloud Music Library and synced my music locally, which is still pretty cool, since it’s free and completely peer-to-peer. On the other hand, your music library turns into read-only mode, so I can’t edit my synced playlists on the device, which sucks (if I remember correctly, I can edit new playlists on the device).

I currently have iCloud Music Library turned on, but I always archive music files separately before importing them, and I also keep my library backed up by Time Machine. The problem with this approach is I have 3 Macs, so I have to pay attention to which one is holding the original song since iCloud Music Library doesn’t upload the original file but rather fetches the song from the iTunes Store. To avoid this problem, I basically keep a master library on my 16-inch MacBook Pro since I use that the most; all other devices are using the iCloud Music Library directly.

The iTunes Music Library and cloud streaming destroyed all of this, primarily because it wouldn’t allow syncing of smart playlists built off other smart playlists.

I tried this, and smart playlists based on top of other smart playlists are not synced to iOS devices. I couldn’t check if it syncs between Macs, which I want to know.

2023.12.07.

Using iA Writer as an end-to-end writing system

I’m a long-time Ulysses user, and I appreciate it since it’s a great Mac citizen, but I’m moving towards more open formats and possibly keeping more of my raw source files in Git.

I started using iA Writer a couple of months ago for my Zettelkasten writing, and having it as a backbone of my Jekyll site turned out to be great. On the other hand, I still kept my writing workflow in Ulysses, especially for long-form writings. I just wrote about how I use Ulysses projects in my writing workflow.

I wonder if having iA Writer as my only writing app is beneficial. I start to think it is, so I’ll discuss that in this post.

Keeping my writings in a Git repository

Git should be used by more people, not only by developers. It is a powerful system for keeping track of changes in a project, and it’s easy try out new ideas by creating new branches.

Git is made for text, so keeping writings in a repository is a natural workflow. For me, it’s new, though; I always used some form of library-based app for managing my writings where you can export the final product, but the raw material is usually kept in a proprietary database or file format.

iA Writer, on the other hand, uses standard text files – specifically Markdown files – and keeps them in the file system, so we can store our files in Git repositories, which can be edited directly as folders in iA Writer. I use Tower on the Mac and Working Copy on the iPad to manage all my Git repositories and to commit my changes.

The beauty of keeping my writings as simple text files is that I can work on them using multiple apps (even in Ulysses). I like the idea that I can write in iA Writer and edit my documents later in MacVim/ iVim or BBEdit. Different text editors are made for various purposes so that I can use the best one for the task. There is no one-size-fits-all.

Keeping my Markdown files simply in the filesystem, I can also capitalize on other tools like Tmux for managing Vim sessions; using it, I can even write in the Terminal (the original distraction-free writing environment) and have access to multiple panes.

Git is also an open system so I can push changes to any standard Unix-based server over SSH. Keeping my writings up-to-date between devices is not automatic but pretty straightforward to do.

Using Git for marking milestones

In Ulysses, I had this milestones-based workflow where the main writing group in the project got manually duplicated.

  • I kept groups where all sections were sheets, then duplicated these groups before significant edits and assigned version numbers for each group, like v1, v2, etc. These names had no meaning other than having a version number for the group.
  • The triggers for duplicating groups were the following:
    • Collected and sorted my Zettelkasten notes.
    • Finished the first draft.
    • Checked the grammar with Grammarly (which is just another form of editing).
    • The final version before publishing the post.

Since I can use Git directly with iA Writer, I no longer need to duplicate groups manually. I can use Git to keep the history and mark important milestones.

Keeping history in Git is pretty straightforward: I can commit my changes and have a version history on every file. I can create branches for each writing project, so my main branch only includes finished and published content. This is not that important since all of my posts are siloed into separate folders, but I still keep pull requests open for each article to comment on and see the history of changes in a nice interface.

Pull requests also mark a project’s start and end at the point of opening and merging. This is more of a psychological benefit I like to have: I feel a sense of accomplishment when I finish a project and merge it into the main branch.

Managing milestones is done through Git as well: I commit in Git that I "Published XYZ v1" or "Published XYZ v2", and then optionally, I tag these commits to mark the end of a milestone.

iA Writer can also publish my writings directly to my blog; this can be used as a marker when I reach a writing milestone. There is no need to duplicate anything locally, but I can export a manual version and keep it published as a hidden post on my blog if I want to return to a previous idea I removed.

I call these posts seedlings, and they aren’t visible in any listing, but they have a direct link, which I can use to preview how the final post will look on my blog.

I created seedlings as a tool primarily for gathering feedback from others on a document. It is my homegrown collaboration feature, which uses my site, where I’m entirely in control of my content. I can publish a hidden post, and then people can leave comments as feedback so we can collaborate without external tools.

But most of the time, I "collaborate" with myself, so I’m leaving comments on my seedlings as notes, which can be migrated back to the actual draft.

Creating pull requests for writings

GitHub pull requests are powerful tools, not just for coding but for writing, too. As I develop my writings, I can keep track of them in separate branches and associated pull requests in my Writings repository.

Pull requests allow me to annotate my text files with comments, which can serve as a built-in to-do system for my writing projects. There is a similar feature is built into Ulysses, where I can have annotations and notes on a sheet, which is one of the benefits of having a library-based app backing my raw content.

On the other hand, using open formats makes using different tools for different jobs on the same content possible. So, in this case, pull requests can be used as an annotation and journaling system around the post I’m writing. When I’m done, I can merge the PR into the main branch as I do in my software development workflow, then publish the final article on my blog.

Writing in the Terminal

Using Vim in the Terminal for writing is a new experience for me. I usually work all day in the Terminal, but I have yet to consider it a writing environment. Technically, it is the original "distraction-free writing app."

My primary text editor is Vim; next to iA Writer, I started using Tmux to keep my writing sessions open with Vim inside. It is my favorite place to do development work and works well for writing projects, too.

The beauty of plain text is immediately apparent in the Terminal. My eyes love the nice Gruvbox Dark theme, and more importantly, all of my CLI tools are just a couple of keyboard shortcuts away.

I’ve started to use my Mac more for writing-related projects lately. It is one of the most flexible environments (alongside my iPad) for managing my blog and my Zettelkasten. I spent a lot of time optimizing my Terminal environment for development, so having it available for writing is beneficial since the command line is the best place to work on any plain-text project – the two just pair really well since the UI is also text-based.

I can also jump into a running Tmux session from my iPad using Blink and continue my writing session from where I left off.

Section-based writing

In Ulysses, I used sheets for every section. I don’t have sections in iA Writer, but I can have separate Markdown files and include them as content blocks. Content blocks are not a standard Markdown feature, but they are so easy to work with that I’m fine if other apps don’t support them.

Sections are numbered and represent a sequence. When I want to create a new section, I add a unique number in the sequence. I name my sections 001.md, 002.md, 003.md etc. This workflow is similar to how Stephen Wolfram manages his notebooks in project folders: he creates a new file in the folder and starts writing.

I have a bunch of other conventions too. When I’m doing designs, I’ll typically keep my notes in files with names like Notes–01.nb or SWNotes–01.nb. It’s like my principle of not having too many file categories: I don’t tend to try to categorize different parts of the design. I just sequentially number my files, because typically it’ll be the most recent–or most recent few–that are the most relevant when I continue with a particular design. And if the files are just numbered sequentially, it’s easy to find them; one’s not trying to remember what name one happened to give to some particular direction or idea.

A long time ago I started always naming my sequential files file–01, file–02, etc. That way pretty much any sorting scheme will sort the files in sequence. And, yes, I do often get to file–10, etc. But in all these years I have yet to get even close to file–99.

I see this workflow being similar since writing projects can contain other types of assets, not just Markdown. Markdown files in iA Writer can also include code blocks, which can be stored as separate files. Think about that for a second.

Separate code snippets mean I can run these files directly in the Terminal using Ruby, Swift, or any other CLI tool. This gives me an interactive thinking space for code, like outlining, journaling, or mind-mapping. We have interactive notebooks in different environments, but I can make my writing projects similar with automation. It can be a great way to test and document code.

Let’s say I’m working on a new software project: I can have a docs folder that contains Markdown files linking to external sources in the actual code. Additionally, I can use iA Writer to embed source files as content blocks. When exporting the final version, source files are converted to Markdown code blocks in the output document.

Section-based writing also allows me to work on any part of the text at any time. This is a more natural bottom-up approach that is better than trying to fit my writing into a linear flow, where I start my post with the intro and then write the rest from top to bottom. Writing is the act of trying to fit random ideas together into a final story arc.

Using iA Writer Authorship for marking Zettelkasten notes

One of the main reasons I want to keep all my writing in iA Writer is their new Authorship feature.

It was intended to mark content pasted from other authors or generated by AI, but I want to hack around its intended purpose by marking text that was added from my Zettelkasten differently.

Since I mainly edit my Zettelkasten notes in iA Writer, using the same app as an end-to-end workflow for my final writing projects makes sense. I can switch between my notes and writings and copy and paste text into my drafts. Here’s where the Authorship feature comes into the picture. Since I can paste my Zettelkasten notes as text acquired from other sources, iA Writer would mark these paragraphs in a different style. I actually like this since edits are clearly visible over my original Zettelkasten text.

I have a global Authorship setup in my iA Writer settings, where my Zettelkasten is marked as "Other." This feature was intended for text copied from text-related AI apps, but if you think about it, my Zettelkasten is a "thinking partner," according to Luhmann, so in that sense, marking it as authored by "Other" sources makes sense.

Zettelkasten provides a system that, much like GTD, outlines the necessary physical steps for learning about something, generates new ideas from that knowledge, and links concepts to write a cohesive long-form text.

Creating a story is like developing a skeleton. We will add our precise thoughts on top of this skeleton. These thoughts can come from our heads, or if we use an active note-taking system, our notes can serve as a basis for them.

When we use these notes, we still have to form them in a way that makes sense in the context of the current story. The Authorship feature lets me highlight the differences between a piece of text that is just a source of a draft and the actual text I edited.

Since most of my articles contain notes developed in my Zettelkasten, I want to see these differences. Visually getting a difference between the original note and the edited version makes sense. It lets me visualize the differences between texts from other sources or texts I’m actively writing.

Using iA Writer as an end-to-end writing app

As I mentioned, I’m editing my Zettelkasten in iA Writer. I’m also editing my writings in iA Writer. How about including AI in the same app as well?

I developed a tool a few months ago called RubyGPT, a Ruby gem that lets me use ChatGPT in the Terminal. I also integrated it into iA Writer using Apple Script so I can have an ongoing ChatGPT chat session saved into a Markdown file. These chat sessions are stored in my ~/Documents/Chats folder, which is also added to my iA Writer library. Sadly, this tool only works in macOS, although I can export ChatGPT chat sessions from Drafts, too, where I’m using this action to have a similar workflow.

All my writing-related plain text lives inside iA Writer, so I consider the app an end-to-end tool for all my writing needs. In theory, I can do this with Ulysses, too, which can also work on external files, but iA Writer doesn’t hide the Markdown syntax, so I can see the original text as John Gruber intended.

With the Authorship feature, I can also see the changes I made to externally generated text, regardless of whether it’s coming from an AI source or my Zettelkasten. I still have to do the work and edit this text into a proper post.

I love this integrated workflow of starting with reading, having highlights processed into notes, getting these notes under control, and then using them as the building blocks of my posts. This workflow lets me naturally develop ideas and use them in places where they make sense.

No need to force anything.

I can write about whatever I feel like at the moment.

2023.12.06.

Read “Web Apps Are Better Than No Apps”

Since web apps can’t just use the components provided by the operating system, they have to recreate everything from scratch. And this creates a lot of burden for developers and, I think, lowers the quality floor. Creating beautiful, compelling apps is possible, but it requires so much work. People building native apps get it all “for free”. In fact, this could be one of the reasons Apple still has such a vibrant ecosystem of great artisanal apps since developers can build most things out of nice ready-made components.

Well, yeah!

Coloring visited links

  • One annoying thing that happened today’s “beautiful” web is that we forgot that we have this CSS selector.

    • a:visited

  • I was also sinful in this, since I just pushed a change which adds proper a:visited support to my site.

    • This is mostly annoying for me, since I see almost all links as visited, but can be helpful for readers.

  • Now you can see visited links in a different color than the default links.

2023.12.05.

2023.12.04.

Read “How I Take and Publish Notes – Jim Nielsen’s Blog”

Jim writing about his reading note publishing process:

I like to let my notes sit for a couple days (or even weeks). I find that if I come back to a note and still find it interesting/insightful that means it’s worth keeping, so I put in the work of cleaning it up and publishing it.

I don’t do this. If I see something interesting, I usually publish it immediately (like this post). On the other hand, I have a Zettelkasten site, which contains more in-depth notes that are also coming from reading notes. However, that site is so new that I haven’t really published anything that counts as reading notes there yet.