
Brett Terpstra
Brett is a writer and developer living in Minnesota, USA. You can follow him as ttscoff on Twitter, GitHub, and Mastodon. Sign up for the email newsletter, and keep up with this blog by adding it to your favorite news reader.
Thanks to Curio for sponsoring BrettTerpstra.com this week!
What if your digital notebook allowed you to create at-a-glance dashboards and checklists using queries to pull in and consolidate information from all across your project into lists, mind maps, or Kanban collections?
We call them Smart Collections and that’s what we’re introducing in Curio 25 Professional, the latest release of our flagship note-taking and brainstorming app for macOS.
Create a new list, mind map, or Kanban stack then specify a query expression. Immediately it will dynamically fill itself with matching figures from across your notebook. A query can be as simple as starts soon
or #remind
or as sophisticated as (@george priority>4) or due<2w or #active group:priority
.
Even better, these dynamic collections contain live instances of the original figures. Edit an item’s text or change dates, tags, or other meta attributes, and those changes are instantly reflected back to the original figures.
In addition to Smart Collections, Curio 25’s Search shelf has been completely overhauled to support this powerful query language. And the query language itself, also used by Curio’s instant Quick Find feature, has been greatly extended with even more functionality to help you find exactly what you’re looking for.
Curio, first introduced almost 20 years ago, is the most advanced notebook application for note-taking, brainstorming, and research. It provides all the tools and functionality you need to be more productive and get stuff done.
New traditional license purchasers can save 20% using the code TERPSTRA
. Visit zengobi.com to learn more today!
Web excursions brought to you in partnership with CleanMyMac X, all the tools to speed up your Mac, in one app.
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.
Thanks to TextExpander for sponsoring BrettTerpstra.com this week! Read on for some ways TextExpander can aid your ChatGPT experience.
Everyone’s talking about ChatGPT, the AI text generation tool, and what it’ll mean for the future of work. Why would a company pay someone to code or write when a machine can do just as well or better than a human?
There’s just one little snag: the rule of GIGO—garbage in, garbage out—still applies. Give ChatGPT a vague prompt, and it’ll return a vague response. To obtain truly excellent answers and content, you must give it more input—detailed, exact instructions specifying the result you want. It’s an emerging art called prompt engineering.
You may spend hours developing a great prompt that gives you the exact results you want. But then what? That’s where TextExpander comes in. It’s a powerful auto-complete tool that’s the perfect complement to ChatGPT.
To prove it, we’ve created a Public Group of amazing ChatGPT Snippets that we’ve collected from TextExpander users. Want to format ChatGPT’s output in Markdown? Try the Snippet gpt.format1
. Want to translate the contents of your clipboard into Spanish? Try gpt.translate
.
Those just scratch the surface. Thanks to writing instructor Ryan Briggs, we have the gpt.peermemo
Snippet, which evaluates the quality of a technical memo, and gpt.storyreversalsteps
, which identifies all the twists and turns from a scene of a screenplay.
To learn more, check out How to Use ChatGPT with TextExpander and keep your eyes on the TextExpander blog for more ChatGPT Snippets and tips.
When you’re ready to try it out, get 20% off using the code TERPSTRA. Head to textexpander.com/terpstra today!
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 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.
Check out Setapp today and get access to the best Mac and iOS apps out there.
Thanks to Kaleidoscope for sponsoring BrettTerpstra.com this week!
Review versions of text and image files—and even folders full of files—with the world’s most powerful file comparison app.
Kaleidoscope gives you powerful tools to use at each stage of the development cycle.
Compare directories side by side: With powerful data filtering, Kaleidoscope makes it easy to filter for what you are looking for and drill down to see more.
Version Control: View grouped changes from Git, Subversion, Mercurial, Bazaar, or Perforce in one clear changeset.
Xcode Debugger: Use the new ksp
and kspo
debug commands to send any debug output to Kaleidoscope.
Unix Tooling: Integrate the ksdiff
tool with the power of the command line. Send anything that can be written to a file or a Unix pipe to Kaleidoscope for inspection.
Three-Way Merge: Working on a branch? Let Kaleidoscope help you merge your changes cleanly and easily on first attempt.
Works with content from anywhere: Kaleidoscope accepts content no matter where it’s located. Drag and drop files and folders, or use the Clipboard, macOS Services, the Share menu, or the command line, as well as many pre-configured integrations.
Get 20% off by using coupon code TERPSTRA
at kaleidoscope.app.
Web excursions brought to you in partnership with Udemy. Learn Anything.
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.
Thanks to TextExpander for sponsoring BrettTerpstra.com this week!
Can you not remember things as well as you used to?
TextExpander is a powerful auto-complete tool that also serves as a potent memory aid. For instance, if you code in Swift, TextExpander user Christian Walters has created a handy Snippet Group to automate things like animations, buttons, and ForEach loops. If you want to create a button, simply type swbt
and TextExpander handles the rest.
But what if you can’t remember the swbtn abbreviation? No problem. TextExpander’s powerful inline search feature helps you quickly look up the Snippet you need.
Do you sometimes forget names, addresses, and other key bits of information? We all do. Create a TextExpander Snippet for it and give it a name you can easily remember, like “Business Address.” Now you can use TextExpander inline search to quickly pull up and insert that address anywhere you type.
Would you like to know more? Learn about TextExpander best practices to discover the best ways to name and abbreviate your Snippets so they’re always easy to find.
When you’re ready to try it out, get 20% off using the code TERPSTRA
. Head to textexpander.com/terpstra today!
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
.
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
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##.
Becomes:
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##
.
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## {}
Becomes:
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##
Becomes:
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.
Download 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
Download 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