Welcome to the lab.

The Photos Workbench giveaway winners!

The Photos Workbench giveaway has ended, and I have winners to announce!

The winners!

Congratulations to:

  • Stuart Marshall
  • Thijs Hagen
  • Christopher Dahrén
  • Yinan Chen
  • Robert Gilmore

You should have received an email with details, please let me know if you didn’t hear anything!

But I didn’t win!

If you didn’t win, sorry, but Photos Workbench is still worth checking out. Make your photo management and organization life easier. Photos Workbench is a complete set of tools to that you’ll really appreciate if you have a sizeable photo collection (and who doesn’t these days?). You can still save 20% using this link or entering code PWTERPSTRA24 at checkout.

Next up is Unite 5. Check back every Monday through September, 2024 for more giveaways. The next giveaways include:

See the full list of upcoming giveaways!

If you want to suggest an app you’d like to see in this series, let me know on Twitter or Mastodon, and join the email list for notifications!

Photos Workbench giveaway!

I’m excited to offer the next giveaway, 5 licenses ($29 value each) for Photos Workbench. If you’ve had an iPhone or any digital camera for a while, Apple Photos is probably chock full of pictures. And you probably haven’t named, tagged, geocoded, or rated most of them. Photos Workbench works with Apple Photos to make all of these operations as simple as possible. Take the pain out of organizing your photos!

From the developer:

Photos Workbench works with Apple Photos to help you organize, name, and compare your photos. Batch change titles. Drag and drop photos onto a large map to add locations. One-click apply keywords using keyword palettes. Use ★★★★★ ratings to mark and find your best shots. Compare photos and find the images worth editing, printing, or sharing.

Check out the Photos Workbench site for more info.

Sign up below to enter. Winners will be randomly drawn on Friday, April 12, at 12pm Central. The drawing is for 5 licenses ($29 value each) for Photos Workbench, one per winner. Note that if you’re reading this via RSS, you’ll need to visit this post on brettterpstra.com to enter!

New rule: All signups must have a first and last name in order to be eligible. Entries with only a first name will be skipped by the giveaway robot. A lot of the vendors in this series require first and last names for generating license codes, and your cooperation is appreciated!

Sorry, this giveaway has ended.

Stay tuned for more giveaways every week through September, 2024 (and maybe beyond).

If you have an app you’d love to see featured in this series of giveaways, let me know. Also be sure to sign up for the mailing list or follow me on Mastodon so you can be (among) the first to know about these!

Back in my day… some thoughts on blogging then and now

I’ve been blogging for over 20 years now, making websites for 28 years, and before all of that I was running a BBS that had users from all over the U.S. (but only one phone line/modem, so it was slow communication). And I’ve seen an unsettling shift over the last 10 years that I feel like writing about.

It used to be (10, 20 years ago) that birds of a feather in the blogging world would share each other’s work and sustainably build audiences together. I was part of an informal “network” of blogs that frequently shared each other’s posts, when they were noteworthy, and getting “seen” was as easy as making good content. Getting mentioned on a larger site meant measurable traffic and often new subscribers to your work, and it was a meaningful way of building an audience. The audience I currently have is largely a product of those days.

My larger projects brought in new readers. 20 years ago MoodBlast was my starting point, then the Blogsmith Bundle got attention from Merlin Man, Marked got attention from Daring Fireball, and all of that netted new traffic and more followers. These days, it’s a lot harder, and the attention of major players has much less impact. Bunch got a fair amount of press. Write-ups in major online media outlets, features from creators like David Sparks, and even some print publications worldwide. And I saw a swell in the number of downloads every time, but none of it filtered back to building my readership. Not the way MoodBlast or Marked did a decade ago.

I think I’m doing better work than ever, and it is getting noticed, it just doesn’t tip the needle anymore. I’m not suffering for traffic, but “new” traffic is definitely coming from unusual and unpredictable places that are nearly impossible to capitalize on. Even getting linked on Hacker News doesn’t tip the needle the way it used to (or the way getting Dugg used to. IYKYN.). Gone are the days, seemingly, when I could make something new and have “major” bloggers notice my work, and thus increase readership. I don’t even know how to scratch the surface of the largest blogs anymore, and many of the independent blogs that I could count on have gone the way of the Dodo. And I, at the age of 45, do not have the energy and “hustle” required to make it on new platforms. I will continue doing what I’m doing, and will probably eventually follow my peers into digital obscurity. It’s not that I steadfastly refuse to adapt to new things, I try new things all the time, it’s that these platforms have come to reward behavior I don’t think is beneficial to the end user, and I tend to opt out. I’m not going to “hustle” to make more money for someone else, which is the way we’ve allowed everything to become structured.

These days, we all share our links into the morass of social media, where even our own followers have a hit-or-miss chance of seeing them, thanks to The Algorithm. We “like” creators’ work, but it just becomes a little tick in a metric that’s really only useful to advertising companies whose money is primarily going to the platform provider, not the creators that provide its content. Social media sites are invested in keeping you, the viewer, on their platform, and sending you to a third-party site is detrimental to their ad sales and attention metrics. This doesn’t, in general, benefit the creators. It benefits the platform. Medium and Substack are truly profitable for a select few, with an intense amount of attention and energy (i.e. hustle) involved in getting there. Creation of original content is not, by and large, rewarded by any of these platforms, and you’re ultimately creating content for a corporation to use as they like. Fewer and fewer creators are actually owning the content they create, and it’s disheartening.

Side note: I’ve been reticent to take on new sponsors lately. The returns just aren’t there for the sponsor anymore. I don’t know why, honestly, but my readership is happy to click on links but hesitant to actually spend money. The economy? I don’t know. I just know that I charge a reasonable rate for sponsored posts, but the feedback I’ve gotten from sponsors over the last couple of years is that it didn’t pay off. Which sucks for all of us. So if you like my work and would like to fund me regardless of sponsors, please become a subscriber!

Search Engine traffic is down for many of us because the major engines’ output is flooded with ads and content that is, at best, knock-off content designed to spam the results. I think Google and Microsoft have given up on trying to quell the “SEO” hackers, or even keep up with them. And now they want to spew AI-generated detritus all over the place. Original content is dying, if not dead.

This is all to say that I recognize that things have changed. I just don’t think it’s for the better. Gone are the halcyon days of independent bloggers sharing original work, and the knowledge networks that cropped up between them. Gone are the days of a rising tide that lifts all boats. The tide is just Social Media, and it is, at my most generous, not concerned with the boats. I think, in fact, it’s actively hostile toward them.

I will continue to share noteworthy things I find via Web Excursions and reviews. If you have an article or project you’d like to show my audience, contact me one of the many ways I’m available. And again, if you want to support my work, it’s just a click away.

The The Archive giveaway winners!

The The Archive giveaway has ended, and I have winners to announce!

The winners!

Congratulations to:

  • Devon Greene
  • Justin Tomich
  • Michalis Litke

You should have received an email with details, please let me know if you didn’t hear anything!

But I didn’t win!

If you didn’t win, sorry, but The Archive is still worth checking out. If you loved nvALT, The Archive is a great notetaking app that shines in its place. You can still save 33% on your purchase using the code DONTBESAD when purchasing.

Next up is Photos Workbench. Check back every Monday through September, 2024 for more giveaways. The next giveaways include:

See the full list of upcoming giveaways!

If you want to suggest an app you’d like to see in this series, let me know on Twitter or Mastodon, and join the email list for notifications!

CurlyQ and automated JavaScript execution

I’ve been wanting to add JavaScript execution to CurlyQ for a while and finally got around to it.

In case you’ve missed it, CurlyQ is my command-line web automation tool for fetching, parsing, and responding to web page content, designed to be used as part of a *NIX pipeline. It can grab titles, links, metadata, and more from any web page. As part of its functionality, it can also use Firefox or Chrome to save screenshots, and that’s part of what I’ve improved.

The screenshot command now accepts a --script parameter. This can be a JavaScript string, or - to read from STDIN, or a path to a file which will be read and executed before taking a screenshot. You can also now define an element ID to wait for before taking the screenshot (or executing the script) using --id ELEMENT_ID. As long as the ID is a valid element on the page, the screenshot will trigger once that element is loaded (via HTML or dynamically), with a timeout of 10 seconds. You can also define a --wait X flag in the command to wait for a specified number of seconds after executing a script before the screenshot is taken.

Further, I’ve added a new subcommand, execute, that has the same parameters as above and simply allows you to load a page in the browser and execute a script on it. I really wanted this because it’s the easiest way to automate NiftyMenu:

curlyq execute -b chrome -s "NiftyAPI.find('file/save').arrow().shoot('file-save')" file:///Users/ttscoff/Desktop/Code/niftymenu/dist/MultiMarkdown-Composer.html

That command will save a screenshot of the File->Save menu item for me, allowing me to fully automate menu screenshots for any of my apps. I can have NiftyMenu generate an up-to-date view of the app’s menu bar, with styling for the current OS, and output detailed screenshots with callouts automatically. This will be a huge timesaver when it comes to documentation.

You can update/install the latest version of CurlyQ with gem install curlyq. The improvements in this post are available as of version 0.0.12. Enjoy!

On using a CDN

If you run a website and aren’t serving your assets from a CDN, I want to highly recommend that you do so. I’ve seen significant performance improvements simply by redirecting my image, CSS, and JS requests to a CDN instead of serving them from a server like DreamHost. I like DreamHost just fine, but the time it takes to serve a file and the download speeds it offers are not… optimal.

The idea behind a CDN is that your assets are served from a speed-tuned network of servers that can deliver the fastest speeds using servers located as close as possible to the end user. I can serve up a 1MB image file in about 1/2 the time using a CDN versus serving directly from DreamHost.

Automating the Dimspirations workflow

First, there seems to be a misconception that Dimspirations are generated with AI or some other such trickery. I want to assure you that, while the entire process of posting them is automated, each Dimspiration is lovingly crafted by me in Affinity Photo1.

I wanted to detail the automation though, partially for my own reference, and partially just because I’m pretty proud of the system.

The Template

First, I have a template I load up in Affinity Photo. It has guides for all of the various formats that will be produced from the single output file. All I have to do is make sure that the text and necessary parts of background images fit into the smallest guide rectangle, and that the rest of the space is filled with a reasonable amount of background image or matching color. The tallest output is the iPhone version, which on occasion just gets filled with a background color, but I can usually make a background pattern or image fit nicely for iPhone and still look good for all of the other formats.

Affinity Photo template

I have a Dimspirations Bunch that opens the template in Affinity Photo, loads up the Desktop and Dimspirations folder in Finder tabs (for keeping track of the rest of the process below), and opens up Adobe Stock in my browser for grabbing those sweet, sweet background images. So to get started on a Dimspiration, I just hit Hyper-D, Shift-D (my assigned shortcuts in Bunch).

The new Dimspiration gets saved-as with a slugified version of the title I want it to have on the site, e.g. “The end of the world” gets saved as the-end-of-the-world.afphoto. Then I output a JPEG of the whole image with the same slug (populated by default), tag it with .dim in the save panel, and save it to the Desktop.

Hazel and RetroBatch

Hazel watches the Desktop for .dim JPEGS, removes the .dim tag, and automatically opens the image in a RetroBatch applet called “Dimspiration.”

RetroBatch applet

The RetroBatch applet saves various formats with -rb suffix (3 desktop wallpapers, 1 iPhone wallpaper, Twitter and Facebook preview images, an Instagram-ready version, and the 1x and 2x versions of the square image for the website). Upon writing the files, they then get sent to ImageOptim for optimization. The optimized files get saved to a new “Dimspirations” folder.

Hazel watches the “Dimspirations” folder and copies wallpaper formats to an upload folder, where Hazel (again) uploads those images to Flickr as screenshots in a DimPapers album, then deletes the copied files.

Hazel then moves all of the image files to the Dimspire.me website assets folder.

Rake and Howzit

I then open up iTerm (visor mode because I’m not an animal), switch to the dimspire.me directory, and run rake. The wallpaper download zips, WEBP and AVIF versions, and Markdown post are created. The Rake task looks for new JPEGs, extracts their base name, and generates Markdown files for any new ones. It automatically adds YAML frontmatter to each post:

  • A title extrapolated from the image slug, where end-of-the-world becomes “End of the world”
  • the base image slug, which is used to extrapolate the square and @2x versions for display
  • a “manifest” section with a list of files in the zip download
  • An ALT tag auto-generated with textra, which runs Apple’s built-in OCR on the image to extract its text
  • a short url created with a curl call to dim.moi
A dimspiration post

The Rake task outputs the Markdown file’s filename, which I can just ⌘-Click (iTerm) to open in MultiMarkdown Composer, where I double check the ALT tag and add a snarky caption as the body content.

In my Howzit buildnotes file I have sections for previewing and deploying, so I can just run howzit -r deploy to deploy the site, which calls the necessary Rake tasks and uses rsync to copy the entire rendered site to the server. CSS and JS (and all images) are served from a CDN which uses versioning like filename.1234.css, and if I want to upload changes to any of these files, I need to bump the version number before rendering, so the Howzit task will ask me upon deploy if it should bump the version. If I haven’t made any changes and have only added a new Dimspiration, I can just hit n and it will avoid clearing the CDN cache.

buildnotes.md for dimspire.me

The site runs on Jekyll, so mass updating the posts can be done just by searching and replacing in Markdown files. The Rakefile has tasks for updating all of the zip downloads with any new versions of the images that have been added (and updating the manifest data in every post with any changes), batch adding any missing ALT tags, and creating all missing WEBP and AVIF versions at once. Whenever I just run rake, all of these tasks execute in sequence, so every time I publish it’s filling in any missing pieces, not just the latest post. It takes about 20 seconds to run all of the tasks on all of the posts at this point, though the zip creation (which rebuilds all zips on every update) will take increasingly longer as the number of posts grows. I’ll deal with making it more incremental when that actually becomes a burden.

So my (manual) part of the process is:

  1. Lovingly craft a Dimspiration in Affinity Photo and save it to the Desktop
    • Wait a minute for Hazel/RetroBatch/ImageOption to do their things
  2. cd to the Dimspire.me website directory and run rake
  3. Open the created post and edit two lines
  4. Run howzit -r deploy (which with my aliases and fuzzy completion is just bld dep, and thanks to Fish’s directory-sensitive history, is just a matter of typing BF)

As always, if you have any questions about any part of this that you’d be interested in implementing on your own, please join us in the forum and ask away! And as always, I’d love it if you checked out Dimspirations and the Dimspirations Store.

  1. Affinity was recently acquired by Canva. How much are we betting that it switches from the sweet $50/version pricing to unaffordable subscription pricing within a year? They’ve promised to always keep it “reasonable,” but that’s a very subjective term. 

The Archive giveaway!

I’m excited to offer the next giveaway, 3 licenses ($19.99 value each) for The Archive. While everyone is waiting for nvUltra to finally be released, The Archive stepped in quite a while ago to fill the gap left as nvALT (and Notational Velocity) get long in the tooth. If you’re a fan of the modal note taking of NV, you’ll love The Archive.

This is not an April Fools joke!

From the developer:

A tool should serve you, not the other way around. Use The Archive your own way and don’t be forced into unnatural habits. Note-taking, Getting Things Done, a thinking environment, or even as a database for entomology (scientific study of insects) – The Archive will do the job.

Check out the The Archive site for more info.

Sign up below to enter. Winners will be randomly drawn on Friday, April 05, at 12pm Central. The drawing is for 3 licenses ($19.99 value each) for The Archive, one per winner. Note that if you’re reading this via RSS, you’ll need to visit this post on brettterpstra.com to enter!

New rule: All signups must have a first and last name in order to be eligible. Entries with only a first name will be skipped by the giveaway robot. A lot of the vendors in this series require first and last names for generating license codes, and your cooperation is appreciated!

Sorry, this giveaway has ended.

Stay tuned for more giveaways every week through September, 2024 (and maybe beyond).

If you have an app you’d love to see featured in this series of giveaways, let me know. Also be sure to sign up for the mailing list or follow me on Mastodon so you can be (among) the first to know about these!

The EagleFiler giveaway winners!

The EagleFiler giveaway has ended, and I have winners to announce!

The winners!

Congratulations to:

  • Olivia S Hanley
  • Ashley Stewart

You should have received an email with details, please let me know if you didn’t hear anything!

But I didn’t win!

If you didn’t win, sorry, but EagleFiler is still worth checking out. Capture web pages, emails, Evernote items, or any file on your Mac and make them easily searchable and trackable. You can still save 20% on your purchase with the code TERPSTRA2023 at the C-Command store.

Next up is The Archive. Check back every Monday through September, 2024 for more giveaways. The next giveaways include:

See the full list of upcoming giveaways!

If you want to suggest an app you’d like to see in this series, let me know on Twitter or Mastodon, and join the email list for notifications!

Web Excursions for March 29, 2024

Web excursions brought to you in partnership with CleanMyMac X, all the tools to speed up your Mac, in one app.

N₁₀ - Attention Management App for Mac
A simple, elegant Mac app that allows you to set an intention, define how much time you plan to put into it, and then just sit, quietly reminding you of what you want to be working on with subtle but all-encompassing animations. Perfect for those of us who say “OK, now I’m really going to work on this” and then find ourselves doing something entirely different within five minutes H/T Jason Rhemus and props to props to developer Sam Stephenson.
Again with man pages and BBEdit - All this
Really nice trick for Terminal junkies who use BBEdit. I have a similar trick for sublime, and one that opens man pages in Preview, but this one provides additional navigation that none of mine have.
Mimestream
“A native macOS email client for Gmail.” This looks so good, especially considering MailPlane is dead. If only I didn’t have iCloud and Exchange email accounts I need to deal with, too.
Interstellar Resin Keycap
I ordered this keycap to replace my custom rocket keycap that I use for my hyper key. Available in 2.25u (Enter) size. It should arrive today and I’m very excited. I’ll post pictures once I’ve installed it!

CleanMyMac X