Welcome to the lab.

Web Excursions for March 14, 2023

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

swiftGPT.app - The native macOS app for ChatGPT
I’ve tried a few of these, and this one is my favorite for a native chat-like experience for ChatGPT on macOS. Includes cost tracking and chat history.
GPT CLI to auto-generate impressive commits in 1 second. My commit messages are pretty specifically geared toward auto-generating changelogs, but for non-changelog commits, this is pretty cool
Modern Font Stacks

System font stack CSS organized by typeface classification for every modern OS. The fastest fonts available. No downloading, no layout shifts, no flashes — just instant renders.

See a web page with a font style you want to steal? Here’s the Chrome extension to do it…
Mottle: Build your own chatbot using just a .txt file
I want to make an “Ask Brett” chatbot by uploading the entire contents of BrettTerpstra.com to this service.

CleanMyMac X

Howzit with named variables

I had a sleepless morning and decided to flesh out a Howzit feature I’ve been meaning to get around to. In case you’ve missed it, Howzit is my “Markdown makefile” tool that allows you to keep track of project notes, specs, and scripts in a convenient Markdown file that can be searched and neatly displayed, and can contain directives to execute project-related commands conveniently.

As of version 2.1.0, you can now define and name positional variables when creating a topic in your build notes. For example:

# My Project

## First Topic (var1, var2)

@run(cp "${var1}" "${var2}")

Web Excursions for March 06, 2023

Web excursions brought to you in partnership with Setapp. Get access to hundreds of Mac and iOS apps for one low monthly subscription fee.

This roundup got a little ChatGPT heavy, but with the release of the API on March 1st and the promise of a free-to-use version moving forward, seems like a good time to start exploring integrations.

Integrate ChatGPT into Slack using Cloudflare Workers. Nice proof of concept, and totally usable.
Scribble Diffusion
Turn your sketch into a refined image using AI. This is actually a really cool way to generate very specific AI images, using a rough sketch and a short description to get results closer to what I’m imagining (I’m not great at prompts). Fast sketch-to-image render times, too.
First look: Mac mini with M2 Pro
MacStadium’s Brian Stucki gives a first look at (and teardown of) the Mac mini with M2 Pro.
Using ChatGPT with BetterTouchTool
Andreas offers some ways to integrate ChatGPT and OpenAI into your system using BetterTouchTool. I swear that app can do anything.
Drafts ChatGPT Conversation Action
Use ChatGPT in Drafts.

Check out Setapp today and get access to the best Mac and iOS apps out there.

Web Excursions for February 22, 2023

Web excursions brought to you in partnership with Udemy. Learn Anything.

It’s been quite a while since I found a new terminal/IDE theme I thought was truly sexy.
MindPane - MindPane - Turns every web page into a Mind Map

MindPane is a Chrome extension that visualizes the web page you are reading as a Mind Map, where you can quickly get the main structure of the document, and easily navigate through topics.

A highly customizable macOS status bar replacement. I think I probably found this via OneThingWell, but I lost track…
Visualize your git commits with a heat map in the terminal, similar to GitHub’s contribution graph.
Safurai - AI Code Assistant
AI coding assistant for VS Code that can write code, add documentation, write tests, and refactor code for you automatically. Free in beta and almost enough to get me to switch to VS Code.

Udemy Banner

Gather 2.1 with saved presets

I put out version 2.1.0 of the Gather CLI today. It adds a couple of fixes and one feature that I think is worth mentioning.

Gather has a lot of command line options. This makes it very flexible, but it’s a PITA to remember all of the settings for a specific action. With v2.1+ you can add --save NAME to a long command to save it with a name, and then recall those flags and switches with --config NAME next time you run it.

For example, if you have a command such as:

gather --min-upvotes 1 --include-comments --metadata --nvu-add --fallback-title "Web Capture %date" https://brettterpstra.com/2023/01/16/searchlink-better-searches-better-results/ --save nvu

The --save nvu at the end will save all previous switches in the command. In the future I can just run:

gather --config nvu <URL>

To save a command you do have to have a valid call, which means you must include --stdin, --paste, or pass a URL as an argument in the command. The URL provided is not stored, only the command line options used in the call (meaning if the command uses --stdin, future calls to that config will also require STDIN input).

The config files are stored as YAML in ~/.config/gather/configs/*.yml. These files can be edited by hand, and you can duplicate a file with a new name to create a new config manually. The --config NAME flag just searches for a NAME.yml file in this directory, so it doesn’t have to be created with the --save flag.

The nvu.yml file created by the command above looks like:

acceptedOnly: false
fallbackTitle: Web Capture %date
file: ''
html: false
includeComments: true
includeSource: true
includeTitle: true
inlineLinks: false
metadata: true
metadataYaml: false
minUpvotes: 1
nvAdd: false
nvUrl: false
nvuAdd: true
nvuNotebook: ''
nvuUrl: false
paragraphLinks: true
paste: false
readability: true
stdin: false
titleOnly: false
unicode: true
urlOpen: false
urlTemplate: ''

You can use --config NAME in Shortcuts/Services. You’ll need to define the configuration on the command line (or manually create it), but can then reference it from anywhere you can call Gather.

To update to the latest version, download the package below. If you’ve successfully installed via Homebrew, you should be able to just run brew upgrade gather-cli.

Gather CLI v2.1.0

A Frankenstinian combination of html2text and Arc90 Readability. This command line tool makes clipping web pages into Markdown text without ads and comments simple.

Published 01/04/12.

Updated 02/07/23. Changelog

DonateMore info…

Increment Templated Service/PopClip update

I’ve updated the Increment Templated Service and PopClip extension. It’s a small update, but the tool is useful enough that I want to highlight it.

The Increment Templated Service and PopClip extension allow you to write text with placeholders, and then repeat that text multiple times, using the placeholders to make changes in each iteration.

For example:

Here's paragraph ##1..3##.


Here's paragraph 1.
Here's paragraph 2.
Here's paragraph 3.

It gets more complex, and you can define start/end points, increment values, use string arrays, and reference index numbers in each iteration. See the PopClip extension docs for a more detailed explanation (anything that works in the PopClip extension also works in the Service.)

The update that I’ve just released allows reference placeholders to contain more complex math equations. In an iteration, you can include ##x## for a 1-indexed reference, or ##i## for a zero indexed reference. Previously you could include one mathematical operator, e.g. ##i*10## in the placeholder. Now you can include any mathematical expression, e.g. ##(i+5)*20/3##. Not a big deal, and if I didn’t think this little tool deserved more attention, the update on its own wouldn’t be enough to prompt a post. But it’s one of those tools that you don’t use every day, but when you need it, it’s a timesaver. Worth having in your toolkit, either as a Service (Quick Action), or as a PopClip extension.

Just as a side tip, you can use % as a modulus operator in equations, so getting even-odd numbering is as easy as ##i%2##.

Last minute update

Shortly after writing this, I decided to add one more feature to the Service/extension. You can now specify an array of strings after a modifier, allowing insertion of strings based on an index. To do so, include a # separator, followed by a comma-separated list of strings. They’ll be inserted based on the result of the index reference (zero-indexed, so 0 is the first element). For example:

div-##one,two,three,four,five##.##i%2#odd,even## {}


div-one.odd {}
div-two.even {}
div-three.odd {}
div-four.even {}
div-five.odd {}

You can also do parallel arrays:

hello ##mother,father,sister,brother##, you are a ##i#parent,parent,sibling,sibling##


hello mother, you are a parent
hello father, you are a parent
hello sister, you are a sibling
hello brother, you are a sibling

That should cover what few variations aren’t already handled.

Downloads for both versions below.

Increment Templated Service v3.0.2

Repeats a selected block of text a specified number of times, replacing placeholders with the count of the current item with variable start and end numbers.

Published 07/01/12.

Updated 02/06/23. Changelog

DonateMore info…

Brett's PopClip Extensions v1.45.2

A few PopClip extensions for Markdown writing and other useful tools

Published 11/30/14.

Updated 02/07/23. Changelog

DonateMore info…