Forklift as a Finder replacement

forklift

The Finder in macOS has always been very simple. Too simple, really. I’ve tried just about every replacement app I could find and all of them have come up short in one way or another. If they’re too simple, then why bother? If they’re too complicated they tend to be slow or cumbersome to use. Either way, they introduce friction and just get in the way.

I’ve used Cocoatech’s Pathfinder on and off for years and it’s a well-done and powerful app. Version 8 was recently released, adding a ton of cool flexibility around “modules”. Too much flexibility for me, I’ve found.

I started testing Forklift by BinaryNights and I think I may have found a Finder replacement with a usable level of complexity that doesn’t get in the way.

Here’s why I like it:

  • Remote connections. I use Transmit for heavy-duty remote file management but having a few frequently used servers right in Forklift’s sidebar is handy
  • Integration with command line tools. I can access command line scripts that act on selected files in Forklift.
  • Editing files in preview pane. I can select a text file and not only see the file’s contents, but I can edit it right in place.
  • Multi Rename. I rename files with consistent patterns all the time. With Forklift I can save them as presets and they’re always right at hand.
  • Creating files. I just want to create a new text file in whatever folder I’m viewing. There’s a button in Forklift’s toolbar for this.
  • Viewing hidden files. I can easily toggle display of hidden files.
  • Open in Terminal. There’s a button that opens the current directory in iTerm.

All of these features are available in one form or another with other apps or scripts, but Forklift puts them together in a nice, usable way that doesn’t also overcomplicate things when all I want to do is manage a few files.

I Hate Peter Merholz - Glassdog

Glassdog in 2004:

Ito, however, in his quote, uses the word “weblog,” a term I’m not familiar with. I think it’s a derivation of ‘blog,’ which means “to vomit with vehemence and much noise.”

Never gets old.

Fun With Server Apps This Week

I’ve been having fun with a few new, and new to me, servers and apps this week. Here’s a quick summary.

Fathom

Fathom

Brett Terpstra mentioned the release of Fathom web analytics. I’ve been keeping my eye open for a simple replacement to the no-longer-supported Mint and Fathom looked close. It’s a single (Go) binary and was super easy to install. I’m testing it with baty.net and so far so good. It’s a lightweight alternative to Matomo for simple web stats.

I see people claim to have no interest in analytics on their blogs and good for them. While I’m in no way obsessed with analytics or “engagement,” it’s nice to know what and how often people are reading. Feel free to block the tracker.

GoAccess

GoAccess

GoAccess is an open source real-time web log analyzer and interactive viewer that runs in a terminal in *nix systems or through your browser.

When all I need is to quickly get a nice view of web server activity logs, GoAccess is very nice. It’s easy to install and use via either a terminal or web browser.

Gitea

Gitea

I often wish we all used Mercurial or Fossil for source code management, but we don’t. We use Git. That’s where all the tooling is, and it’s where Magit is, so I’m stuck with Git.

I don’t want to store my private projects in someone else’s app but I want a wiki an issue tracking so I’ve installed Gitea. Gitea is a single-binary app written in Go and runs against an SQLite database. It’s like the opposite of running a self-hosted Gitlab instance. Works great.

Caddy

Caddy is a clever, easy to use web server that automatically handles HTTPS. It’s also my favorite thing, a single binary, so installation was basically just copying a file to the server.

My needs are simple, so Caddy has fit the bill quite nicely. I’m running all of the above apps using Caddy as a proxy and it’s all handled by a 20-line config file. Nice.

Using Caddy for serving static content

I have a bunch of static files/websites laying around so I stood up an Amazon Lightsail instance and installed the Caddy web server.

static.baty.net

A cool thing about Caddy is that it handles provisioning and installing SSL certificates automatically from Let’s Encrypt without me doing anything. It also automatically redirects from http to https.

Here’s the entire config file (Caddyfile)

1
2
3
4
5
6
static.baty.net {
  root /home/jbaty/apps/static
  log /home/jbaty/logs/static.baty.net.log
  gzip
  browse
}

The browse directive enables directory browsing, and it even looks decent.

Caddy can do all sorts of neat tricks, like serving up Markdown files as HTML pages. Just drop Markdown files in a folder and add a markdown directive. I’m sure I’ll find a use for that. It would be neat if it could do the same with Org-mode files.

I’m sure I’ll explore the various plugins available. I see there’s one for Hugo sites, which looks interesting.

Having super-simple HTTPS automatically should be compelling for people looking to get on the HTTPS-everywhere train.

The Frictionless Joy of Using a Single Platform

I’ve had so much fun these past few months learning my way around (Arch) Linux on the desktop. Using a ThinkPad while mobile instead of a MacBook Pro or iPad has been a pleasant change of pace.

I settled on the i3 Window Manager and found it to be a totally new and mostly pleasant way of working with windows. I tried all sorts of cool software that I’d only read about before. I spent lots of time editing configuration files, tweaking the dickens out of every possible feature. This has provided countless hours of entertainment and I learned a lot.

However, I’m putting my Linux experiment on hold.

It’s the idea of Linux that I love. Wall to wall freely distributed, open source software is such a cool thing. Being free from reliance upon any one particular vendor is a great feeling. Having endless choices for how the operating system and software behave is liberating. I like having a variety of hardware options and not being stuck with a brand new laptop with the shittiest keyboard in the world. And I must admit, I don’t mind the nerd creds that using something like Arch provides. It makes me feel like I’m zagging, and I like zagging. Everyone (well, not everyone) I know uses a MacBook Pro and it’s fun being the guy using something totally different.

But I run into problems. The trouble starts when constantly switching between macOS and Linux. Keyboard shortcuts are close-but-not-quite the same. My shared dotfile configuration needs exceptions so that paths and apps work correctly on both systems. It’s death by a thousand cuts.

Were I to switch completely to Linux I’d have none of these issues. Someday I may go all Richard Stallman about software and that will be that. Until then, I’ll have to remain content being a “Mac Guy”.

I’m not yet ready to give up the wonderful software I’ve used and loved for a decade or more on my Mac. I’m not ready to find reliable substitutes for all the little tweaks and scripts I’ve collected over the years. Mostly, I’m not ready to put up with the constant friction of living in two similar-but-different environments.

The ThinkPad will remain at hand, though. I like using it as a single-purpose writing device. A screen split between Emacs, a Terminal, and a Browser makes for a pretty tight, if not completely distraction-free, writing environment. Plus, the keyboard is way better than the one on my MacBook Pro.

I’m also using the iPad more.

“But wait a minute,” you protest. “That’s two different platforms, right? Doesn’t that cause the same problems?”

Good question, but no, it doesn’t. The Mac and the iPad are entirely different devices. Switching between them doesn’t cause me to suffer from the “uncanny valley” problem. They are so different that I don’t try using them for the same things in the same way like I’ve been doing with macOS and Linux. Seems weird, maybe, but it makes sense to me.

I’m sure that I’ll hear about all sorts of ways to fix everything I’ve mentioned and that “It’s just a matter of editing foo.conf and memorizing 75 new key bindings.” Thanks, but no thanks. Not right now.

All this to say that I’m having fun tinkering with Linux but I’ll be sticking with my Macs and not worrying about whether every app I want to use is cross-platform. I won’t be worrying about /home vs /Users. I won’t have to give up any of my beloved tools. I won’t suffer the mental friction caused by subtle differences in how everything works.

The Intel NUC and Roon as My Music System

Figure 1: Intel NUC running Roon Core

Figure 1: Intel NUC running Roon Core

I have been using Roon to manage and play my music collection and it’s wonderful.

I wrote a little about my first impressions here. In fact, I like it so much that I paid the $499 fee for a lifetime subscription. This seems steep only until you consider it as a critical component of an audio system. (See how I rationalize?).

Figure 2: Roon Player running on my iMac

Figure 2: Roon Player running on my iMac

For the first couple of weeks I ran Roon “Core”, the brains of the system, on my iMac. This worked fine, but I wanted to offload the processing and storage to a dedicated device.

Enter Roon Optimized Core Kit, which is a custom Linux build (RoonServer) created specifically to run Roon Core on your own hardware. In my case, that hardware is the Intel NUC7i3BNH. The NUC is a tiny, headless, silent server perfect for running ROCK.

All of my music is stored on the NUC’s internal SSD drive. I don’t have a large library, but if I run out of room, I can easily plug one or more larger USB drives into the NUC and tell Roon Core where the music is stored on them. Roon manages all of my music regardless of where it’s stored. When I buy new music I only need to copy the files to the shared Roon drive and it’s automatically sorted, indexed, and fed into Roon’s music database.

The Roon Core software running on the NUC is managed via a web control panel. Once the initial installation is done, everything can be done headlessly. Updates to ROCK are done right within the Player app. Considering several moving parts, some rather technical, this has all worked flawlessly so far.

Figure 3: Roon's web control panel

Figure 3: Roon's web control panel

Using Roon, I can easily control all of my music, stored anywhere, using any device, and play it on any combination of HomePod, Sonos, and dedicated amplifier. If I get bored with my own music collection, Roon’s integration with the Tidal streaming music service gives me access to any music I could ever want, using the same system.

It’s pretty great.

Hugo Page Bundles

I haven’t paid much attention to Hugo’s Page Bundles since they were introduced, but I should have. Page Bundles let me put a blog post’s images and other assets in the same folder as the original Markdown file. This means the images for a post ride along right next to the post rather than way over there in the /static/img/2018 folder. Over the long term that should be handy.

Also, thanks to Kaushal Modi for pointing out that his ox-hugo package already supports Page Bundles.

1
2
3
:EXPORT_FILE_NAME: index
:EXPORT_HUGO_SLUG: hugo-bundles
:EXPORT_HUGO_BUNDLE: 2018/2018-05-24_hugo-bundles

Nice.

Packed The First of Many Boxes

I’m getting married next year. This means I’ll be selling my house and moving. I’ve been in this house since 2001, so I’m rather well entrenched.

I’m excited about the change, but I’m not looking forward to going through everything I own and deciding what to do with it. I may need a little Marie Kondō magic.

There’s no great rush, but I’ve just packed the first box of books. Of course I’m keeping all the books.

It’s begun!

Posting with ox-hugo so far

I’m a few days into using ox-hugo for publishing blog posts and so far it’s been great. There’s a bit of a learning curve, but I’m finding it to be worth it.

Here’s what the source Org-mode file looks like right now.

I like it!

Things I Write With

As someone who loves writing with analog tools, I have always switched willy nilly between pens, pencils, notebooks, types of paper, etc. I never seemed to find any consistent patterns. The past year has, finally, found me settling on a pretty stable set of writing tools.

It goes like this:

For day-to-day note taking, I use a pencil. Go figure, right? I tried using the Blackwings, which are wildly popular with the fancy pencil set. They write well enough, but they’re too long and no one talks about the elephant in the room; that big, clumsy, eraser with the sharp metal bits. They look funny and feel icky, so I switched to something I have grown to love - the Mitsu-bishi Hi-uni and 9850 pencils. They write at least as well as the Blackwings, cost less, and hold a point better.

For my daily updates in the Hobonichi Techo, I’m still in love with the Staedtler Pigment Liners. The fine, black, crisp line works great on the small pages of Tomoe River paper.

And for anything “fancy” like letters, postcards, or long-form journaling, I have settled on two fountain pens; The TWSBI Diamond 580 and the Pelikan M400.

I’m pretty happy with these choices. It’s been months since I’ve struggled with deciding what to write with.

Don MacAskill's AMA Reinforces My Optimism About Flickr

Don MacAskill, Reddit:

But Flickr isn’t Instagram and, under my watch, it won’t ever be. Flickr is all about a long-lasting, deep, abiding photographer community. It’s not about showing a photo to quickly gather some likes & comments today, only to never have that photo be seen again. It’s about engaging in visual storytelling that lasts forever.

I’m not interested in competing with Instagram and Snapchat, so if that’s your definition of “social” then my answer is no.

The possibilities around SmugMug’s purchase of Flickr has me so very excited. This Reddit AMA with MacAskill makes me feel even better about it.

Blue Apron after Five Years

I started receiving meals from Blue Apron five years ago today. For someone who’s been living alone, meal delivery services are wonderful. I hate shopping, I never know what to shop for anyway, and I’m not a great cook. When I do shop I’m forced to buy more than I need and things get thrown away. Or I just buy hot dogs and stuff to make nachos and desserts.

Blue Apron meals are always interesting, colorful, and delicious. They take some work to prepare, though. It seemed like I was always small-dicing what felt like 35 ingredients at every meal. So, I started looking for alternatives.

My sister had been using HomeChef and claimed the meals were super simple. I switched, and she was right. They also offered a two-meal/week plan. Blue Apron was limited to three meals. HomeChef also allowed me to choose between a nice variety of dishes each week. With Blue Apron I just took whatever they sent.

After nearly a year, I checked in on Blue Apron and found that they had made things simpler, now offer a two-meal plan, and have a decent selection of meals to choose from. I switched back and couldn’t be happier.

The photo above is of tonight’s dish, “Tokyo Beef & Rice Bowls with Soft-Boiled Eggs and Roasted Brocolli.” I used their photo here because mine didn’t turn out looking nearly that good, but it was delicious! So good in fact that it prompted me to write this post.

I’m happy to be back with Blue Apron. If you’re looking for a meal delivery service, I’d give the nod to Blue Apron, but you wouldn’t be disappointed with HomeChef either.

Org-Journal May Replace My Daybook.org File

The more I use Bastian Bechtold’s Org-journal the more I like it.

For the past few years I’ve kept a sort of “Daybook” using a datetree in a single Org-mode file. This works pretty well, but it’s always felt more suitable for shorter entries. I wanted something that would work with longer entries, so I tried Org-journal.

Org-journal uses one file per day. I first thought that this would make browsing my journal difficult, but it doesn’t. I find the built-in search to be easier to manage than using sparse trees or other search methods in an ordinary Org file.

I have found myself creating a journal entry using Org-journal for everything, including the things I’d normally put into my Daybook.

Org-journal even handles TODOs, and carries forward any unfinished TODOs from the previous day. It’s kind of like an automated Bullet Journal.

I export things I write each month to PDF files and print them out. (Yes, I’m that guy). With separate files for each day, I can do this by running something like cat 2018-05*.org > 2018-05-Journal.org and export the resulting file to a nicely-typeset PDF easily enough.

I’m not quite ready to completely let go of my habit of logging things into my Daybook, but the writing is on the wall.

Let's try using ox-hugo again

Last year, while looking for ways to create a blog using Org-mode, I ran across ox-hugo. It was clever, but I was uncomfortable with yet another layer of abstration between the source text and the rendered HTML. I may have gotten over that fear.

I’m slowly standardizing on using org-mode files for all of my writing. I’ll hate myself for this if I ever decide to stop using Emacs, but I’ll deal with that then.

Hugo has org-support built-in, but it only supports a subset of org-mode’s features. For example, URLs or org-formatted links in footnotes are not rendered as links in the final HTML files.

Ox-hugo works via the standard org-mode export dispatcher. The result is rendered as a normal Hugo Markdown file. This means that if I decide to stop using Org-mode for blog posts, or even move to another markdown-based site builder, all of my posts are still there and usable as-is.

Another nice feature is that all of my posts are in a single org-mode file, one subtree per post. I like this because I don’t have to create a properly-formatted markdown file in a specific folder in order to create a post. I just set the EXPORT_FILE_NAME property and ox-hugo takes in from there.

Of course I’m using a handy capture template, as provided by the ox-hugo docs. This lets me type C-c c h to quickly create a new draft post.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
(with-eval-after-load 'org-capture
  (defun org-hugo-new-subtree-post-capture-template ()
    "Returns `org-capture' template string for new Hugo post.
See `org-capture-templates' for more information."
    (let* ((title (read-from-minibuffer "Post Title: ")) ;Prompt to enter the post title
           (fname (org-hugo-slug title)))
      (mapconcat #'identity
                 `(
                   ,(concat "* TODO " title)
                   ":PROPERTIES:"
                   ,(concat ":EXPORT_FILE_NAME: " fname)
                   ":END:"
                   "%?\n")          ;Place the cursor here finally
                 "\n")))

  (add-to-list 'org-capture-templates
               '("h"                ;`org-capture' binding + h
                 "Hugo post"
                 entry
                 ;; It is assumed that below file is present in `org-directory'
                 ;; and that it has a "Blog Ideas" heading. It can even be a
                 ;; symlink pointing to the actual location of all-posts.org!
                 (file+olp "all-posts.org" "Blog Ideas")
                 (function org-hugo-new-subtree-post-capture-template))))

```

All subtrees marked as TODO are considered to be drafts. Toggling the status to DONE sets “draft = false” and also sets the publish date to the current time.

Tags are set just like normal org headings (e.g. “tag1:tag2”).

Being able to directly publish to my Hugo-based blog while still living in an Org-mode is pretty sweet.

Syncthing

Syncthing

I’ve been testing Syncthing as a replacement for Dropbox and so far it’s been great.

I am currently syncing over 25,000 files in 5 directories across two Macs and one Linux machine. It has worked nearly without a hitch. I say “nearly” because after changing the case of a few filenames those now show as “out of sync”. They synced fine but show as unsynced. I assume this is due to case-sensitive vs case-insensitive file systems. I’ll need to figure this out but it’s more an inconvenience than a problem1.

I’m still using Dropbox for things I’m sharing with others, and probably always will, but for things I don’t want anywhere near a “cloud”, Syncthing seems like a perfectly fine solution.


  1. The case-insensitive rename issue is known and tricky to solve. [return]

Publish Using Org Mode With Hugo

I write nearly everything except blog posts using Org-mode. Wouldn't it be nice to write blog posts with Org-mode, too? It would.

I was perusing the README for Easy Hugo and I'll be darned if it doesn't support using .org files automatically. All I need to do is use .org for the filename when creating a new post. Very nice.

Back to Netlify

baty.net is back to being built and deployed using Netlify. I moved everything to Amazon S3 a couple of months ago as a way to figure out how to do that. I still think S3 is a great way to host static sites that don’t change often, but I haven’t liked it quite as much for hosting a site that is updated frequently, like my blog.

Using S3 required a combination of sync scripts, invalidations, keys, cloudfront distribution configuration, etc. Overall it felt like more trouble than it was worth.

So, back to Netlify. It goes something like this:

  1. Create a “site” in Netlify
  2. Point it at a Github repo
  3. Update DNS

Now I have continuous deployment, automatic SSL, a global CDN, and a bunch of other stuff I don’t even use yet. For free.

Tracking my Time with Org-mode

Org-mode has time tracking built in. Of course it does.

I have been trying to consistently track my time spent on projects. This encourages me to decide what I should do next. It also makes me reconsider my priorities when I notice I’m not doing anything useful. As I tend to do, I have configured a few Capture Templates to help with this.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
'(("t" "Todo to Inbox" entry
   (file+headline "~/org/tasks.org" "Inbox")
   "* TODO %? \n %i\n")
  ("T" "Todo and Clock In" entry
   (file+headline "~/org/tasks.org" "Inbox")
   "* TODO %? \n %i\n" :clock-in t :clock-keep t)
  ("e" "Create Event" entry
   (file+datetree+prompt "~/org/events.org")
   "* %?\n%T" :empty-lines 0)
  ("E" "Create Event and Clock In" entry
   (file+datetree+prompt "~/org/events.org")
   "* %?\n%T" :clock-in t :clock-keep t)

I have two versions of my TODO and EVENT capture templates. Using the uppercase versions cause the clock to start as soon as I create the entry. For example, if the phone rings or someone walks into my office, I hit C-c c E and a new “Event” entry will be created with the clock already running.

To help easily manage jumping between clocked entries, I’m using org-mru-clock.

When it’s time to send some invoices, or just to see how long things are taking, I can run a quick Clock Report that looks something like this:

Clock Report

Nifty.

It’s hard for me to remember to always start a clock, so I’m still looking for ways to make that easier. For now though, just building the habit is a good start.

Logging Food With Org-mode

For some reason I enjoy recording what and where I eat. Usually I do this in a paper notebook, but I decided try it using Org-mode files instead.

To make entry as easy as possible, I created a new capture template.

1
2
3
4
5
...
("F" "Food Log" entry
        (file+datetree+prompt "~/org/food.org")
                "* %?\n%t\n%^{Meal}p%^{Type}p")
...

Now, I can type C-c c F to bring up the capture template and quickly fill in details about a meal. This is then saved automatically in my ~/org/food.org file and put in the proper location, organized by date. It looks like this so far…

Food log

The %^{Meal}p and %^{Type}p parts of the capture template are for setting “Properties”. In this case I am asked to enter the Meal and Type properties. Properties allow Org-mode to act like a rudimentary database. Switching to Column view shows a table of the values for each property, like this:

Column view

I’m including an active timestamp with each entry (using %t in the template) so that they will be included in Org’s Agenda for that day.

There’s no real need to log my meals, but Org-mode makes it quick and painless so why not?

My Photos are a Disorganized Mess

I've made a huge mistake

My photos have become a disorganized mess. For years I’ve known where all of my photos were. I kept them in dated folders, period. Sometimes the specifics of how I organized things changed, but I could always count on any given photo being in something like ~/Photos/2018/04-April-2018/ThisIsANicePhoto.jpg.

Then the iPhone and Apple Photos came along. Initially, nothing changed. I would plug my phone into the computer, copy the photos from it, delete them from the phone, and move them to the proper folder, where they belonged. Go ahead, narrow your eyes at me, but it was a great, predictable system and it meant that every photo ended up in the same place. Be it film or digital, taken with the iPhone or some other camera, a photo went into a folder forever.

At some point I decided not to do it that way. I tired of moving images off the phone and dealing with them. I decided to use Apple Photos to store my iPhone photos. Zero friction, right? I’d continue to manage non-iPhone photos as I always had, then just copy the keepers into Photos so I had a “complete” library.

As you can imagine, I now have two libraries, and neither of them is complete.

This was a huge mistake.

To fix this, I’m going to have to essentially merge two similar-but-not-the-same libraries. What do you think the odds are of me not losing anything or ending up with tons of duplicates? That’s right, the odds are zero.

Don’t ever let me try anything like that again.