What is a JSON feed? Learn more

JSON Feed Viewer

Browse through the showcased feeds, or enter a feed URL below.

Now supporting RSS and Atom feeds thanks to Andrew Chilton's feed2json.org service


Geoff Taylor

technology, photography and other interests

A feed by Geoff Taylor


Frozen Fountain

Permalink - Posted on 2018-01-07 18:59

Over several days of subfreezing temperatures, the fountain in the courtyard of my apartment building froze. The falling water wasn’t actually frozen, but it kind of looks that way in the picture.

  Frozen fountain
Frozen fountain
  Frozen fountain closeup
Frozen fountain closeup

Getting Old

Permalink - Posted on 2018-01-04 14:53

A sure sign that I’m getting old: I immediately downloaded Brighter and Bigger after reading this post by Dr. Drang.

Cleveland Marriott Downtown Lobby

Permalink - Posted on 2017-12-22 23:15

Lobby of the Cleveland Marriott Downtown at Key Center
Cleveland Marriott Downtown Lobby

How to mute alerts in Fantastical

Permalink - Posted on 2017-12-10 08:35

If you have a shared Reminders list, Fantastical for Mac will notify you if someone else updates it. I don’t need to see these notifications, but it took me a little while to discover how to mute alerts for specific Reminders lists.

It’s not, as one might suspect, unders Preferences > Alerts. You actually mute the alerts under Preferences > Calendars, and it’s not at all obvious that this is where you do it.

First, open Preferences (Fantastical > Preferences or ⌘,). Then go to Calendars and right-click the Reminders list that you want to mute. Select Get Info.

  Fantastical preferences screen

Check Ignore alerts and Ignore shared calendar notifications as shown in the screen shot below. Then click OK button.

  Fantastical preferences screen

This method also works for muting alerts from individual calendars.

Snowy Night at One Atlantic Center

Permalink - Posted on 2017-12-09 19:51

Snowy Night at One Atlantic Center
Snowy Night at One Atlantic Center

House-hunting workflows

Permalink - Posted on 2017-12-09 11:53

My wife and I are looking for a new house, and I quickly realized there were two common things that took a little more effort than I liked. First, collecting the important information (address, list price, Realtor.com URL) about each house in a place I could easily find it later, and second, searching for the nearest supermarket, pharmacy and other stores and services. Using Workflow, I was able to automate these tasks.

Save House to Bear

The first workflow is called Save House to Bear. It takes the information exported to in the share sheet by the Realtor.com app and saves it to a new note in Bear. The property address becomes the note’s title, and if the Realtor.com app exports a photo in the share sheet (it usually does), the photo will be added to the note.

  Animated GIF showing the workflow
Running the workflow from the share sheet in the Realtor.com app
  Property listing saved in a Bear note
A property listing saved in Bear

Search Near Address

The second workflow is called Search Near Address. When the workflow runs, it will ask you for the source of the search address. If you ran the workflow using the Run Workflow extension and Workflow detected an input address, it will ask you if you want to use the input address, the clipboard or a manually entered address. If no input address was detected, or if you didn’t run the workflow using the Run Workflow extension, it will ask if you want to use the clipboard or a manually entered address.

The workflow will then ask you for search terms, and it will show you businesses matching the search terms near the search address. Selecting one of the search results will open it in the Maps app.

  Address selection screen
Select the search address
  Search results
Search results

Automatically mount a network share using Keyboard Maestro

Permalink - Posted on 2017-10-21 11:41

Because of some constant issues with Time Machine that I just couldn’t resolve, I switched to Arq, which offers a similar “go back in time” backup solution. I’ve had a generally positive experience with Arq; it’s been much faster and more reliable than Time Machine for me.

The only problem — and this is unrelated to Arq itself — was that my network share would disconnect when my MacBook went to sleep, and I couldn’t find a simple, reliable way to automatically remount the share when waking my MacBook. Then, I happened to find this postfrom Gabe Weatherhead. The post is five years old, but his solution using Keyboard Maestro still works perfectly.

I added one condition to his setup: My MacBook must be connected to my home Wi-Fi network.

  Screenshot of Keyboard Maestro macro

I had tried Keyboard Maestro in the past, but I had never really found a compelling reason to purchase it. This simple macro has changed my mind, though, and I’m now a paying customer. Now to find more uses for it…

Lake Michigan Sunset 2

Permalink - Posted on 2017-10-14 01:19

Sunset over Lake Michigan as seen from an airplane
Lake Michigan sunset

Lake Michigan Sunset 1

Permalink - Posted on 2017-10-14 01:16

Sunset over Lake Michigan as seen from an airplane
Lake Michigan sunset

Gizmodo's field guide to RSS

Permalink - Posted on 2017-09-12 12:26

This is a good introduction to RSS (or a refresher for a lot of people) from Gizmodo. For following blogs, it really is better than Twitter or Facebook because you never miss a post.

(Here’s my RSS feed. 🙂)

How check sorting was automated

Permalink - Posted on 2017-09-12 12:23

Interesting story from Tedium about how check sorting was automated.

Halide: My favorite camera app

Permalink - Posted on 2017-09-06 20:20

Halide app icon

When I first got my iPhone 6S, one of the features I was most interested in was the ability to capture RAW photos. The native camera app can’t capture RAW photos, but there are a number of third-party apps that can. At first I was using Manual, which captures RAW photos and gives you full control over various settings such as ISO, focus and white balance. (There’s also an automatic setting that takes care of all of that for you.) I still Iike Manual, but I recently read about Halide and decided to give it a try. I found it to be a powerful camera app that’s surprisingly easy to use.

  The Halide interface
Halide's main interface, shown against a neutral background to highlight the controls.

Basic controls

At the top of the screen — in what Halide calls the Quick Bar — are a few basic controls that are available in manual mode and automatic mode. A white icon indicates that the option is turned off; a yellow icon means that it’s turned on.

  • Flash control  Flash (on or off; there's no automatic option).
  • Location control  Location: If it's off, location won't be included in the photo's metadata. Unlike with most other camera apps that I've used, location is off by default, and Halide doesn't ask for permission to use location until you turn it on.
  • Grid and level control  Grid and level indicator: Rather than being a single horizontal line as in other camera apps, the level indicator is a rectangle that aligns with the middle rectangle of the grid. It turns yellow when the phone is perfectly level.
  • RAW control  RAW: If it's on, photos are captured as Digital Negative (DNG) files, Adobe's implementation of the RAW image format. (All iOS apps that can capture RAW photos capture them as DNG files.) If this setting is off, photos are captured as JPEG files, just like with the native camera app.
  • Settings button  A control that provides access to the user manual and allows you to rearrange some of the controls on the Quick Bar.
  • Histogram control  Histogram: If on, a live histogram is displayed on-screen. (This article from B&H Photo and Video provides an overview of histograms in digital photography. It's written for users of digital cameras, rather than camera apps, but the same concepts in the "How to Read the Histogram" section also apply to apps like Halide.)
  • Automatic mode indicator or Manual mode indicator  A mode indicator (automatic or manual). Tapping the indicator changes modes.
  • Control to change between front and rear cameras  A control to change between the front and rear cameras.


Most of Halide’s controls are adjusted with gestures, so it’s easy to control with one hand, even in manual mode. The settings you would most commonly change while taking a photo (exposure compensation, focus and shutter speed) can easily be changed by swiping or dragging with your thumb while holding the camera with one hand.

Automatic mode

In automatic mode, denoted by Automatic mode indicator at the top of the screen, Halide only provides one other adjustment — exposure compensation (EV). As with other controls in Halide, you adjust it with gestures. Drag up on the screen to increase the EV, down to decrease it. Double-tap the EV indicator to reset it to 0.0.

Manual mode

In manual mode, indicated by Manual mode indicator at the top of the screen, you can adjust ISO, white balance and shutter speed. ISO is adjusted by tapping the ISO button button in the Quick Bar and adjusting the ISO control that appears above the focus controls. White balance is controlled by tapping the white balance icon to the right of the manual indicator; the icon indicates the current white balance setting and thus varies depending on the selected setting.

  All white balance icons
All of the available white balance modes. This menu is displayed when you tap the white balance icon, and the white balance icon always reflects the currently selected mode.

Shutter speed is adjusted in the same way that exposure compensation is adjusted in automatic mode. (The EV indicator becomes the shutter speed indicator, denoted by S, in manual mode.) Drag up to increase shutter speed (for a longer exposure) or down to decrease shutter speed (for a shorter exposure).


In manual mode or automatic mode, you can use either autofocus or manual focus. The focus control can conveniently be controlled simply by swiping. With autofocus engaged, just swipe right to activate manual focus, and drag the slider to adjust the focus manually. Swiping left will reactivate autofocus. (Tapping the Autofocus button button will also activate or deactivate autofocus.)

Focus peaking

Halide includes a focus peaking feature, activated by tapping the Focus peaking button button. With focus peaking turned on, Halide highlights in green the parts of the image with the sharpest contrast.

Photo view

Halide’s photo view displays a very limited subset of the photo’s metadata: file type (JPEG or RAW1), date and time, shutter speed and ISO. To see all metadata, you’ll need another tool (I like ViewExif) but it’s nice to be able to see at least some metadata without leaving Halide.

In this view, you can also “favorite” a photo by swiping right (a feature I don’t often use) or delete a photo by swiping left (a feature I find to be very convenient). There are also buttons that perform the same functions if you don’t like the gesture-based controls.

Swipe right to favorite Swipte left to delete
Swipe right to "favorite" a photo. Swipe left to delete.

Changing orientation

When rotating the phone from portrait to landscape (and vice versa), the controls that rotate or change position do so in a very natural looking way (with one exception noted below). While it’s not anything that would make or break an app, it’s an extra little detail that makes Halide that much nicer to use.

In many apps, rotating the phone means that the entire interface rotates, and not in a very graceful way. In Halide, the controls at the top of the screen briefly disappear and then reappear in the correct place when the phone is rotated. When rotating the phone counterclockwise into landscape orientation (so that the shutter button is under your right hand), the EV button (in automatic mode) or shutter speed button (in manual mode) smoothly rotates into the correct orientation. (The small preview of the last photo taken rotates as well.) When rotating clockwise to landscape (so that the shutter button is under your left hand), however, the EV/shutter speed button and last photo preview swap places. While it doesn’t look bad, it’s just not as smooth as the other interface changes.


Halide’s documentation, which simulates a paper user manual, is attractive but not very informative; it’s little more than a “getting started” guide. The website contains descriptions of a few key features (but not necessarily how to actually use them), but no real documentation. I had to figure out a few of the settings myself, but now that I have, I find Halide easy to use. Still, I think it would be helpful if the app had better documentation.

The missing feature

One feature I’d like to see in Halide is RAW+JPEG capture. RAW files retain all of the image data, but they generally don’t look good without some post-processing, and not every photo app on iOS can handle RAW files. If you want to share RAW files via email, text or social media, you need to convert them to JPEGs first.

JPEG files on the other hand are processed in-camera. Some of the image data is lost during that processing, but JPEGs are universally readable and usually look good enough to be shared.

Manual, the app I mentioned at the beginning of this post, can capture a RAW image and a full-resolution JPEG at the same time. It’s not a deal breaker for me, but it would be nice if Halide added a similar feature in a future release.

Aside from that, however, Halide is probably the best camera app I’ve used. I use it for all of my iPhone photography except throwaway JPEGs (for which I still use the native camera app).

  1. The photo view just displays the photos from your phone’s camera roll, so you may also see PNG files if you have screen shots in your camera roll. 

Sunset and storm

Permalink - Posted on 2017-09-02 20:40

Sunset and storm over the Gulf of Mexico
Sunset and storm, Gulf of Mexico


Permalink - Posted on 2017-08-18 20:31

Unobstruct app icon

A week ago Troy Gaul released a universal iOS app called Unobstruct. It’s a Safari Content Blocker that removes those annoying floating bars that are used on sites like Medium.

Medium web page without Obstruct Medium web page with Unobstruct
Left: A Medium web page without Unobstruct.
Right: The same page with Unobstruct. The bottom "Open in app" and social media buttons have been removed.

There are some floating bars — primarily those found at the top of web pages on sites like Medium and Bloomberg — that Unobstruct doesn’t automatically block. (Unobstruct doesn’t block them because they’re often needed for page navigation on sites that use them.) Fortunately, Unobstruct includes an Action Extension that allows you to manually remove them.

Top floating bar on Medium web page Unobstruct Action Extension
Left: A Medium web page with a top floating bar (highlighted by red rectangle).
Right: The Unobstruct Action Extension (highlighted by red rectangle).
  Web page with floating top bar removed
The same page after the top floating bar has been removed by the Action Extension.

Unobstruct is 99 cents in the App Store. It’s a universal app, so it works on both iPad and iPhone (where it’s really useful since those bars take up so much space on the smaller screen).

Sunset on the Cuyahoga River

Permalink - Posted on 2017-08-13 21:26

Sunset on the Cuyahoga River
Sunset on the Cuyahoga River

Storm Clouds and Control Tower at ATL

Permalink - Posted on 2017-08-13 19:45

Storm clouds behind the control tower at Hartsfield-Jackson Atlanta International Airport
Storm clouds behind the control tower at ATL

Test Driving Transmit 5

Permalink - Posted on 2017-07-21 21:03

I’ve been a Transmit user since version 3 and have always liked it (and Panic, the company behind Transmit). When Transmit 5 was released with support for Amazon Drive, I was eager to try it.

Amazon lets Prime members store an unlimited number of photos, including RAW files — which is unique among cloud storage providers, to my knowledge — on Amazon Drive for free. It seemed like a good addition to my backup plan, and it would give me access to all of my photos on my phone or iPad (assuming I knew which ones I needed, since the Amazon Drive app doesn’t show previews of RAW files).

But because my photos are on an external hard drive, and Amazon doesn’t allow the sync folder to be on an external drive, there were a couple of things I didn’t like. First, I had to upload photos by dragging them to the Amazon Drive app, so I couldn’t do anything close to an automatic upload. Second, there was no good way to see my files in a traditional files-and-folders interface. I was hoping Transmit 5 could solve these problems.

Setting up the connection

Setting up the connection was simple. Just add a new server by clicking Servers > Add New Server or by clicking the + button at the bottom of the servers pane.

Select “Amazon Drive,” click Next, and you’ll be presented with an Amazon login screen.

  New server setup screen
Set up a new server

After you log in, Transmit will set up the new connection, and you’ll see a screen like the one below where you can change various attributes like the name of the connection.

  Amazon Drive setup screen
Amazon Drive configuration

Click Save, and you’re done.

On the front end, it works like any other connection in Transmit. You can browse the files in a Finder-like view, and you can preview them with Quick Look. (The files are still on a remote server, though, so Quick Look isn’t as fast as it is when previewing a local file.) One problem solved.

  Files and folders on Amazon Drive
There are my photos


One of Transmit’s great features is its ability to synchronize a local folder and a remote folder. If I could use Transmit to synchronize my Pictures folder on my external hard drive with my Pictures folder on Amazon Drive, that would solve the other problem.

Unlike in Transmit 4, where the Sync screen was behind a button that had both an intuitive icon and a “Sync” label, the Sync screen in Transmit 5 is hidden behind this unlabeled button that doesn’t really scream “synchronize” to me: Transmit Sync button

But once I found it, the screen looked (interface updates aside) and worked exactly like it did in Transmit 4.

  Transmit Sync screen
Same basic screen with an updated design

I simulated the sync first, and it took about one and a half minutes to determine that the local folder contained 378 files that weren’t on Amazon Drive. I proceeded to synchronize the folders, and everything went fine for about an hour. (I think Transmit is probably slower to upload that Amazon’s own app, but the extra features offered by Transmit are worth the trade-off to me.)

After about an hour (and all except 15 files successfully uploaded), uploads started failing. According to the message in Transmit, the Amazon token had expired; I suspect this was due to rate limiting. I simply closed the connection, reopened it, and synchronized again to fix the problem.


This is just a nice touch, but the Panic website has Apple Pay enabled, and it was super easy to use. My MacBook is too old to support it, but it worked perfectly on my iPad. I just tapped the “Buy With  Pay” link and authorized it via Touch ID. My serial number was displayed in the browser and sent via email almost immediately.

In the end, Transmit 5 solved my problems with Amazon Drive well enough that I thought it was worth the $35 price tag. (It’s currently discounted; the regular price will be $45.)

Ben Gibbard Covers 'The Concept'

Permalink - Posted on 2017-07-21 17:20

Here’s Ben Gibbard covering a great ’90s song, Teenage Fanclub’s “The Concept.” I have to admit I didn’t like it at first, but it hooked me on the second listen. Can’t wait to hear the rest of the album.

Publishing Live Photos with Jekyll and LivePhotosKit JS

Permalink - Posted on 2017-07-15 12:54

I recently posted three Live Photos using LivePhotosKit JS. My blog is built with Jekyll, and I wanted the Live Photos to display correctly on large and small screens. Since getting it to work took some trial and error, and there aren’t a lot of helpful resources other than Apple’s documentation, I wrote this post to explain how I got it to work.

The Apple way

First I tried Apple’s recommended method, adding the appropriate data- attributes to a <div> element:

<div    data-live-photo    data-photo-src="{{ site.url }}/images/live-photos/IMG_7280.JPG"    data-video-src="{{ site.url }}/images/live-photos/IMG_7280.MOV"    style="width: 640px; height: 852px">         </div>

But I ran into a problem. It looked fine on a big screen, but the picture overflowed the <div>’s parent container on the iPhone screen in portrait orientation.

  Screen shot of the webpage on macOS
It looked the way I expected on macOS.
  Screen shot of the broken webpage on iOS
On iOS... not so great.

If you want it to be viewable on different screen sizes, Apple’s method doesn’t really work.

Media queries

My first thought was to use media queries to control the size of the <div>, but LivePhotosKit complained about the <div> having a width and height of zero. After a little more experimentation, I concluded that CSS wouldn’t work. It seems that LivePhotosKit expects the <div> to have a style attribute with a non-zero width and height.


To appropriately set expectations, I’ll introduce this next part by saying that my front-end development skills are pretty amateur, and my solution isn’t elegant. This is how I finally got the Live Photos to render correctly on large and small screens.

In the post’s front matter, I listed the photo, the video and a caption for each Live Photo I wanted to display on the page:

live_photos:    -        photo: IMG_7280.JPG        video: IMG_7280.MOV        caption: Taxiing in the rain in Atlanta    -        photo: IMG_7337.JPG        video: IMG_7337.MOV        caption: Sunset at <a href="https://maps.google.com/?q=37.0046,-122.188">Shark Fin Cove</a>    -        photo: IMG_7341.JPG        video: IMG_7341.MOV        caption: There were lots of rabbits on the cliffs above the cove.

In the body of the post, I put an empty <div> to serve as the container for the Live Photos:

<div id="live-photo-container"></div>

Finally, I have an include called scripts.html that’s included in my post template. I added this to the end of scripts.html:

{% if page.live_photos %}<script>    $(document).ready(function() {        var divWidth;        var divHeight;        if (screen.width < 640) {            divWidth = "320px";            divHeight = "426px";        }        else {            divWidth = "640px";            divHeight = "852px";        }        {% for p in page.live_photos %}        $("#live-photo-container").append('<div data-live-photo data-photo-src="{{ site.url }}/images/live-photos/{{ p.photo }}" data-video-src="{{ site.url }}/images/live-photos/{{ p.video }}" style="width: ' + divWidth + '; height: ' + divHeight + '">');        $("#live-photo-container").append('<p class="live-photo-caption">{{ p.caption }}</p>');        {% endfor %}    });</script><script src="https://cdn.apple-livephotoskit.com/lpk/1/livephotoskit.js"></script>{% endif %}

{% if page.live_photos %} ensures that the JavaScript is executed, and LivePhotosKit JS is loaded, only if the post contains Live Photos.

The script is wrapped in jQuery’s $(document).ready() function to make sure the <div> with ID live-photo-container is present before the Live Photo <div> elements are added to the page. If the screen is less than 640 pixels wide, the width is set to 320px, and the height is set to 426px. Otherwise, the width and height are set to 640px and 852px.

Then for each Live Photo defined in the post’s front matter, jQuery is used to append a <div> with the proper attributes to the <div> with ID live-photo-container. Finally, LivePhotosKit JS is loaded to do the heavy lifting.

It’s not an elegant solution. It only handles two broad screen sizes, and the Live Photo isn’t centered on iOS. But it works well enough for now.

Screen shot of the webpage rendered correctly on iOS
You can actually see the whole image on iOS now.

A few oddities

In case you want to try this for yourself, here are a few issues I encountered.

When I was testing locally on my MacBook (using bundle exec jekyll serve), Firefox was the only browser that would actually render both the photo and the video elements on macOS. Safari and Chrome just rendered the static photo and showed in place of the normal control. Neither Safari nor Chrome would play the video on iOS. They behaved in the same way as Safari and Chrome on macOS.

The Live Photos rendered correctly in all browsers (sort of; see below) only after I moved everything to my web server.

In my experience, browser compatibility wasn’t consistent with the list of supported browsers in Apple’s documentation. On macOS, Live Photos on the web are best viewed in Chrome. Safari and Firefox work, but the performance is a little worse when transitioning from photo to video.

On iOS, Safari was the only browser that worked for me, but it crashed frequently, usually after playing one of the videos for the first time. Chrome on iOS didn’t work at all for me. It crashed almost immediately on both my iPhone 6S and my iPad Pro.

Live Photos from California

Permalink - Posted on 2017-07-07 20:45

A few Live Photos I took on a recent trip to California, posted using LivePhotosKit JS. To see the video, hover your mouse pointer over the “LIVE” button in the top right corner of the photo. On a phone or tablet, tap and hold the picture.

For best results, use Safari if you’re on iOS. Chrome seems to work best on macOS. It works fine on macOS but seems to be a little buggy on iOS. (Apple says Chrome may work on Android, and any of the major browsers should work on Windows, but I haven’t tried those.)