BrettTerpstra.com - The Mad Science of Brett Terpstra https://brettterpstra.com/ Brett's Favorites 2023 Part II https://brett.trpstra.net/link/535/16488991/bretts-favorites-2023-part-ii https://brett.trpstra.net/link/535/16488991/bretts-favorites-2023-part-ii 时间追踪 应用 笔记软件 太空 科幻书籍 健康心理厨房工具消费品

总结:
文章提到了作者最喜爱的应用和书籍,包括时间追踪应用Timing和Noteplan,以及作者对科幻小说和心理治疗的介绍。此外,还有关于厨房工具和其他硬件的推荐。

I decided to make a “Brett’s Favorites 2023” part 2. I missed a few things in the first list. This will be a shorter post, but should cover some gaps I left in the first one.

Apps I Missed

Timing
I use Timing every day for keeping track of how I spend my time on my computer (and my iPhone). When I start a new project, at the end of the day I open up the main window and add rules by dragging and dropping relevant files and keywords, so time spend on that project is automatically tracked moving forward. I even made an importer for Doing that combines my time tracking with my What Was I Doing? file.
Noteplan
I got back into Noteplan in the latter half of 2023. I love the idea of combining my notes and brainstorming with scheduling, todos, and time blocking. All using Markdown. It’s a beautiful idea and superbly executed.

A Little Fiction

I read a ton in 2023, mostly via audiobooks. So “read” might be a stretch, but I do love audiobooks. I won’t list everything I’ve read here, but a couple of standouts:

Flux by Jeremy Robinson
I read so many books from Jeremy Robinson this year. He weaves excellent sci-fi stories. Also check out Infinite. The twists are insidiously satisfying.
In the lives of Puppets by TJ Klune
There’s a space for queer Sci-Fi, and TJ Klune does an amazing job of occupying it. This book takes the idea of a future dominated by robots and few (one?) remaining human and makes it a truly heartwarming journey. Thanks to Jesse Darst for cluing me into this one.

Therapuetic

No Bad Parts by Richard C. Schwartz
I’ve been doing a lot of therapy this year and only recently discovered Internal Family Systems, which has been a game changer. I won’t explain the psychology of it here, but if you want to learn more about the parts of you that might prevent you from being your true self, definitely check this out. I bought the e-book version for my Kindle, but also bought the audiobook version for its guided meditations.
What My Bones Know: A Memoir of Healing from Complex Trauma
This was the year I realized I had Complex PTSD, and I did a lot of reading around it. This one serves more as a memoir than a treatment plan, so take it along with some actual therapy. A lot of hope here, though.
Overtired
The Mental Health Corner on Overtired means a lot to me. I get to share my journey through CPTSD, ADHD, and Bipolar, as well as hear from people who go through very similar things to me. It’s kind of its own version of therapy (though it can’t replace actual therapy.) If you have issues of your own, you’ll probably be able to relate to me, Christina, and Jeff as we share. I recommend checking it out.

Kitchen

The Wicked Healthy Cookbook
If you’re vegan or aspiring to be, this book is a must-have. Truly delicious food and techniques that even a non-vegan can appreciate. I’m pescatarian for the time being, but cooking without meat, dairy, or (in my case) gluten means I’m always looking for recipes that actually taste amazing but fit my diet.
The Vegan Chinese Kitchen
I’ve been into Chinese cooking lately, and it’s pretty easy to make it vegan. I also recommend Yeung Man Cooking (also available as a digital version for $20), and the author has a YouTube channel worth checking out.
Misen Carbon Steel Pans
I have been through countless non-stick pan solutions over the years. I long for the convenience, but nothing seemed to stand the test of time. Our trusty cast iron pan outlasted all of them by miles, and with a good chain mail scrubber1, they’re very easy to care for. Then I tried carbon steel pans and have decided that that’s the way forward. They become more non-stick over time as a a natural result of material and seasoning, rather than quickly losing some chemical coating and becoming a stickier mess than your typical aluminum pan. I admit I’m awful at properly caring for non-stick pans, which is why I needed a solution that just got better the more you used it (and could handle high heats). Misen has always impressed me, and their carbon steel pans have proven to be an excellent solution.
Milk Street Nakiri
My favorite chef’s knife is still my Misen, but this “vegetable knife” is pretty amazing. It’s a great form factor, and I love it. If you want to spend about half as much, there are plenty of similar options. I can vouch for the Milk Street one, though. Lightweight, sharp, textured blade for gripping between thumb and forefinger.
Tumbler Diamond Rolling Knife Sharpener
I love a sharp kitchen knife, but have never been great at sharpening myself or sending my knives off for professional sharpening. That’s why I jumped on this when I discovered it, and it’s been 100% worth the investment. Definitely get the strop, too.

Other Hardware

I said I didn’t buy a lot of hardware this year, but I dug through my Amazon purchases and found the stuff that I actually love.

Elgato Stream Deck Pedal
I’m all in on Elgato stuff, from my Wave XLR to my multiple Stream Decks. But what was missing was buttons for my feet, and the Stream Deck Pedal has filled that gap nicely. I tried a few other, cheaper USB pedal solutions before I gave in and purchased this, and I’ll tell you that nothing else works as well. Whether you need a cough button, control over your Twitch stream lighting, or just want to be able to launch an automation with your foot, it’s a lot of fun.
Minoston Z-Wave Outlet Mini Plug-in Socket
I’m only dipping my toes in Homekit, with a lot of hope for Matter, but for now my home automation is mostly Insteon and Z-Wave. These little plugs have made automating the Christmas lights I use for warming up various rooms super easy.
Tineco Pure ONE S15 Pet Smart Cordless Vacuum Cleaner
I was a big fan of Dyson stick vacuums, but they kept breaking on me. Too much maintenance. So I decided to try something new. This one has been excellent. I’ve been using it for about 6 months and have only had to clean it once. Plus I love/hate the little headlight it has on it; I love it because it helps me see all the grit I’m picking up, but I hate it because it makes it obvious when I’m going too fast.
  1. Wait, you didn’t know about chain mail? You can scrub the living hell out of a cast iron (or carbon steel) pan with chain mail and it won’t destroy the seasoning or cause any rusting. If you like heavy cookware, you need one of these. Do not use it on a non-stick pan. 

Like or share this post .


BrettTerpstra.com is supported by readers like you. Click here if you'd like to help out.

Twitter | Mastodon | GitHub | Privacy Policy

]]> 2023-12-09T15:18:00-06:00 The Soulver giveaway winners! https://brett.trpstra.net/link/535/16488230/the-soulver-giveaway-winners https://brett.trpstra.net/link/535/16488230/the-soulver-giveaway-winners Soulver, winners, giveaway, discount, apps

总结: Soulver的赠品活动已经结束,获奖名单已经公布。获奖者是Knut Focke、Chris Metze、René Quesnel和Vihang Khare。未中奖者可以使用折扣码BrettTerpstra获得30%的折扣。接下来的赠品活动将在2024年8月的每个星期一举行。读者可以在社交媒体上关注最新消息。BrettTerpstra.com通过读者支持。

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

The winners!

Congratulations to:

  • Knut Focke
  • Chris Metze
  • René Quesnel
  • Vihang Khare

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 Soulver is still worth checking out. You can still save 30% off the direct version using the code BrettTerpstra. It will revolutionize your problem solving.

By the way, Soulver is also available on Setapp, along with hundreds of other amazing apps. You should probably get a subscription.

Next up is SpamSieve. Check back every Monday through August, 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!

Like or share this post .


BrettTerpstra.com is supported by readers like you. Click here if you'd like to help out.

Twitter | Mastodon | GitHub | Privacy Policy

]]> 2023-12-08T13:00:00-06:00 Brett's Favorites 2023 https://brett.trpstra.net/link/535/16487596/bretts-favorites-2023 https://brett.trpstra.net/link/535/16487596/bretts-favorites-2023 Setapp, Apps, iOS, Mac, Favorites 总结: 本文介绍了作者在过去一年里喜欢的各种Mac和iOS应用程序,包括一些老牌但仍然很棒的应用,以及一些新的应用。作者还提到了一些硬件设备,以及他个人的一些项目,包括编码工作。这些应用和项目对作者的工作和生活有着重要的作用。

Welcome to my yearly post about stuff I’ve loved in the last year. I love doing this because it reminds me how amazing the Mac/iOS app ecosystem is these days. I can’t list every app I use in this post, it would take forever, but I can highlight some of the outstanding ones. I’m going to do this all in one epic post this year. It’s going to get long. You could always use Gather to convert it to Markdown, and then make use of all of Marked’s navigation tools 😇.

Apps available on Setapp will be noted. As I mention frequently, Setapp is a great deal at $10/month for 200+ excellent apps. If you’re a Setapp user, you should always try to use the Setapp version of your favorite apps to make sure the developer gets a piece of your subscription! If you’re not, you should seriously consider signing up. This link gives me a little kickback when you join!

The categories are presented with items in no particular order. I could have made them alphabetical, or attempted to rank them, but no, I present you with an unorganized stream of consciousness. Welcome to the inside of my head.

The Old But Awesome Stuff

I’m going to quickly list some repeats that are still favorites here at the top. These are apps I’ve used for years and still rely on every day, but I’ve talked about them plenty and you’ve probably heard about them before. So just a quick list of my perennial favorites.

HoudahSpot
Find everything on your Mac, even the stuff that Spotlight misses.
iThoughtsX Setapp
My favorite mind mapping tool. All the power and flexibility you need without becoming a chore to use. This one is on the giveaway list, so stay tuned for that next year!
Curio
The ever-evolving brainstorming/project management tool that continues to amaze. Watch for a giveaway coming soon (New Year’s Day!).
1Password
With the new Passkey and Authenticator possibilities in 1Password, it’s a no-brainer for me. I’ve trusted it for years and it’s never let me down.
BetterTouchTool Setapp
I talk about BetterTouchTool all the time. Maybe too much. But it’s the most amazing automation tool I’ve found. Second place for me is Keyboard Maestro, which just got a new version (v11) in the last few months.
MailMate
The stalwart email app for Mac that I depend on. Customizable shortcut keys, plugin architecture, Markdown capabilities… I’ve never found anything close.
Choosy
Choosy is long in the tooth but still working great. Instead of opening a link in your default browser, you can pop up a selection of any browser on your system, and you can create rules for handling different types of links with specific browsers.
Hazel
I use Hazel every day, but I don’t even think about it most of the time. It just sits in the background, managing my files and doing crazy automations when I give a file a certain naming pattern or put it in a certain folder. For example, if I save an image to my desktop with a name like brettsfavorites2023@2x%%r1600ohc.png, Hazel will (r)esize it to 1600px width, (c)onvert it to JPEG, create a (h)alf-size 1x version, and (o)ptimize the images. Then I just drag the results to a Dropzone target to have them added to my blog and an image tag for the pair placed in my clipboard.
Bartender Setapp
Without Bartender my menu bar would be out of control. But with it, I can hide all of the menu bar icons I don’t need all of the time, and quickly access them with a hotkey search.
Default Folder X Setapp
Early in the Sonoma release DFX stopped working for me (all fixed now), and I didn’t realize exactly how dependent on it I was until it wasn’t there anymore. Save and open dialogs on your Mac need this.
PopClip
I use PopClip all day, every day. It pops up a menu every time you select text with your mouse. The available extensions are outstanding, and I have my own custom actions, too. One example is my URL Preview extension, so when I use SearchLink to grab a URL for an app I’m writing about but I’m not sure the result is correct, I just select the url and click the preview button in the popup. I get a tiny little web browser floating over my text, and if it’s the correct link, I hit escape and go back to writing.
TextExpander
You hear about TextExpander every month when they sponsor this blog, so it makes this quicker list. It’s another app that, on the occasion it stops working, so do I. I don’t even remember how to type some of the things it makes automatic for me. One example is sending nvUltra beta invites. I just hit R to reply to an email request, type ,,nvub, and have an email with all of the necessary links and info ready to send. Or I can generate a new license for Marked by typing ,,mlic, and TextExpander will use the Paddle API to make me a license and insert all of the text I would send to explain how to use it. And I just linked that reference to Marked by typing /m. Infinite possibilities.
TaskPaper Setapp
I have a TaskPaper file in every project folder, and I use tools like na to quickly manage them from the command line. But nothing beats opening up the actual TaskPaper app for speedy task management and ease of use with lots of keyboard shortcuts.
Hookmark Setapp
I’ve preached the Hookmark gospel a lot here. Their recent improvements to the “bookmarking” concept (plus the Pinboard integration) have made this an invaluable tool for keeping my projects together. I have this post linked to a few web pages, my nvUltra notes on it, and the Markdown versions of previous installments of my Favorites series for reference. I just hit my shortcut key and navigate between them with ease.

New(ish) Stuff

OmniFocus 4
The latest version of OmniFocus is a major revamp of the app. I don’t think it will be available in time for this post to go up, but let me at least tease it by saying if you love OmniFocus already, you’re going to love v4, and if you’ve disliked it in the past for any reason, it’s time to give it another look. An honorary mention here goes to Things — the latest version is a top-notch app, especially if OmniFocus just feels more powerful than you need.
MacUpdater
This app has quickly become one of my day-to-day favorites. It keeps all of my apps up-to-date without me having to deal with download/install prompts every time I launch them. See the release notes for an update if you want to, install available updates with a single click, and always have the latest and greatest versions of apps ready to run. It auto-scans for updates in the background, so you don’t even have to remember to check it to keep everything updated.
Ivory
I’m all in on Mastodon, and all out on Twitter. And Ivory is my favorite Mastodon client on both Mac and iOS. It does everything I need it to, beautifully. If you ever enjoyed TweetBot, this is kind of that, but for Mastodon.
Tailscale
What a great tool. I hook it up to my GitHub account and then every device on my network is accessible through a private VPN from anywhere in the world. I have it running on all of my Macs, my iPad, and my Synology, and I can get direct access to any device without any additional hassle.
Kaleidoscope
Kaleidoscope has made huge bounds in functionality this year. It was already my diff tool of choice (on any platform), but they’ve added new integrations, debugging features, and awesome support for Git history and merging. (Full disclosure, Kaleidoscope has sponsored this blog. This opinion is unpaid!)
Descript
I can’t imagine making podcasts without Descript anymore. It does fairly reliable transcriptions, but the real magic is that you can edit the podcast by editing the text of the transcription. Makes it easy to search for parts you remember need an edit, remove filler words, and add things like chapter titles and cover art to make a ready-to-publish MP3.
Paletro Setapp
I think I’ve mentioned this one before, but if you like command palettes in your favorite editor (e.g. P in Sublime), this adds the same concept to any app on your Mac. Hit the keyboard shortcut and every menu item (including Quick Actions and Services) are instantly available via keyboard.
Screens Setapp
I use Screens all the time for connecting to my various Macs, especially the mini that runs headless in my basement. Versus the Screen Sharing tools in macOS, it adds Screens Connect, which helps you connect to known machines from anywhere, stored credentials, and curtain mode, which masks the display of the remote Mac you connect to. Clipboard sharing, display selection (when there are multiple montiors), and easy drag-and-drop file transfers make it a pretty seamless experience.
Dato
I can’t use Fantastical with my work calendar, unfortunately (if I could, I’d be using that). But Dato works with my calendar, shows a great summary of calendar events in my menu bar, and makes joining a Zoom call a one-click process from either the menu bar or the notifications it provides. Solid tool that I use daily.
Affinity Photo
The Affinity apps continue to blow me away, and I use Affinity Photo almost daily. It completely replaced Photoshop for me a couple of years ago. Honorable mentions to Acorn and RetroBatch from Flying Meat for regularly helping me with my image processing.
iTerm
I’ve tried all the terminal apps that have been popping up. Warp is great, for sure. But I always come back to iTerm. It got so many of the special features right that it feels like all the other developers are just trying to keep up with it.
Loopback
I love Rogue Amoeba (also a previous sponsor), and Loopback is an amazing tool for audio routing. If you, like me, have multiple audio inputs and outputs, it makes creating virtual devices for them (or any combination of them) a drag-and-drop affair. For example, I use my Echo Dot for playing Spotify music, and route it through my Komplete 6 as a secondary input. I created a Loopback device that combines that secondary input with my main computer audio and adds the ability to mute the device using the media keys.
Bike Setapp
Bike is a new entrant this year. I generally think in mind maps, but there’s always a place for a solid outliner. I used to use Tree, but it fell into disrepair, and Bike is coming along nicely. As you would expect from Hog Bay Software, the query tools and automation capabilities are receiving lots of love. Plus the file format is just text (HTML, to be precise) and your outlines can be used anywhere. Much like TaskPaper, it’s easy to automate using command line tools, but more fun to work with inside the app.
TextBuddy
I love TextBuddy so much. It does everything you want to do with text, from wrapping/unwrapping, escaping, translating, converting tabs to spaces, even reading text from images and working with it. And it does it elegantly with keyboard shortcuts. No buttons to hit, just paste your text (or send it via Service shortcut), hit T and type to find the conversion you want to run. It’s even extensible with JavaScript, and can also run your favorite Services (like SearchLink!).
DevUtils Setapp
This is another new one to me. It’s a collection of simple tools a developer would make use of, such as url encoding, JSON formatting/validation, JSON/YAML conversion, Unix Time converter, and dozens of others. It can detect what type of data is on your clipboard when you click its menu bar icon, offering an accurate guess of which tool(s) you’ll need to handle it. It can also copy straight back to clipboard, so some things are simply a matter of copying text, clicking the icon (global and Service shortcuts available), and pasting the result.
Tower
I’ve mentioned Tower before (also a previous sponsor), but it’s come a long way this year. One of the most ingenious features is the undo command (Z) that can undo literally any Git operation. You know, the ones that usually require filtering through the reflog and making cherry pick commits to fix. It makes using Git a pleasure, and taps into all of the powerful features it offers, just with drag and drop instead of command line futzing.
CleanShot X Setapp
I mentioned this one last year, but I would be remiss not to let you know how much I love it again. CleanShot X is one of the most useful and elegant utilities on the Mac right now. For all your screenshot needs, including things like automatic email pixelation and annotation, it just can’t be beat.

iOS

I haven’t found a lot of new stuff on iOS that I love this last year, but mostly because I primarily use my phone for email, messaging, and gaming. There are a few standouts in my daily use, though.

Spark
Spark gets a mention as my favorite email client. I haven’t sprung for the premium features, I find that the base package does everything I need it to. Smart inbox, easily configured sidebar, snoozing, pinning, and great search. Combined with SaneBox (sponsor) and MailMate on my Mac, I’m quite happy with my email management system.
Finity
Rabbi Eric Linder introduced me to this game and it did the impossible task of replacing Threes, my all-time favorite waiting room game. It’s an infinite puzzle that you’ll never beat, but it’s so much fun to play.
Grindstone
Grindstone is still one of my favorite games. Even though I’ve 3-starred all the levels, they offer daily challenges with worldwide leaderboards that keep me coming back.
Artifact
Apple News hasn’t impressed me that much lately, but Artifact is a constant source of headlines I actually care about, across multiple categories. And the AI-generated summaries are great. It will even rewrite headlines to be less click-baity if enough people report them.
Night Vision
I don’t use this app as often as the others, but I like the concept. It makes your iPhone’s LiDAR camera available as a kind of night vision camera, allowing you to see objects in complete darkness. Handy for stumbling through the house at night when you can’t sleep but don’t want to wake anybody up.

Hardware

I apparently didn’t buy much other hardware this year, and my list is pretty much exactly the same as last year’s. Check it out here. I will mention my UHK, though:

Ultimate Hacking Keyboard
My perennial favorite keyboard, and I got the V2 this year with box white switches, wooden wrist rests, and the new thumb modules. I’ve gotten a few other people on board with this one and haven’t heard about anybody being disappointed with the purchase. I’m typing on it right now and loving it. UHK recently released the Riser 60, a mechanism for getting steeper tenting (two halves raised in the middle). Ordered mine immediately, just waiting for it to ship!

Personal Projects

I did a lot of coding this year. My bipolar has been stable for the last 6 months, so I’m taking a healthier-than-usual approach to coding. No all-night coding binges, just steady improvements of some of my favorite tools.

SearchLink
SearchLink is a child who takes care of me in my old age. I put a lot of love into it, and it works to make my life easier. If you haven’t seen it, it makes writing a post like this one a cinch. I haven’t switched over to my browser once since I started writing. I just give it text like [Kaleidoscope](!s +mac) and hit the keyboard shortcut, and it inserts a link (with title attribute) to the app in question. Works for dozens of search types. I recently added back Google searching using the API (as opposed to scraping DuckDuckGO, though that’s still available), and my results are 99% correct on the first try.
NA (Next Action)
I made a lot of progress on NA this year, converting it to a gem, adding the ability to update and modify tasks, and improving overall performance. As I mentioned above, I use TaskPaper-formatted files in every one of my projects to track bugs, todos, and feature requests, and NA makes working with those files from the command line easy and fun.
Marked 2
Marked didn’t see as much innovation as usual this last year, but it continues to do what it does very well: previewing Markdown and exporting HTML and beautiful PDFs. Multi-document features, writing tools, regex searching, bookmarking in long documents… it does it all. The biggest challenge this year was updating for Sonoma, which broke significant parts of Marked.
Bunch
Bunch got a ton of love early this year. It’s been stable for a few months now, almost every feature request handled and all bugs squashed (that were squashable). It’s received coverage on multiple sites and even print write-ups in a couple of magazines. I’m pretty proud of it as a project, and think it fits nicely into the Mac automation space.
mdless
mdless was my most recent coding obsession, and probably my last one for the year. It previews Markdown on the command line, outputting formatted text to your terminal. Perfect for reading those README files after you clone a project! Combined with Gather (a previous coding obsession this year), it can actually work as a Lynx-style browser.
nvUltra
I know, I know. It’s so close. The beta is very, very stable, we’re just working on a couple of refinements (and some MAS purchase issues) before release. If you’re reading this and you’re not on the beta already, contact me to get added.

Well, that’s my wrap-up for 2023. Hopefully you found some gems along the way. If you have apps you think I should check out, please come tell me about them in the forum! (If you comment on this post, it will automatically create a forum topic).

Like or share this post on Mastodon or .


BrettTerpstra.com is supported by readers like you. Click here if you'd like to help out.

Twitter | Mastodon | GitHub | Privacy Policy

]]> 2023-12-08T10:31:00-06:00 Backblaze makes it astonishingly easy to store, use, and protect data [Sponsor] https://brett.trpstra.net/link/535/16486039/backblaze-makes-it-astonishingly-easy-to-store-use-and-protect-data-sponsor https://brett.trpstra.net/link/535/16486039/backblaze-makes-it-astonishingly-easy-to-store-use-and-protect-data-sponsor Backblaze, backup, security, data storage, affordable 总结:

本文介绍了Backblaze的云备份服务,该服务提供了自动备份、数据安全、多种还原选项等功能。用户可以使用Backblaze来保护个人和企业的文件和数据,提供了各种安全措施保护数据的安全性。除此之外,Backblaze还受到多家权威媒体的推荐,用户可以通过试用期了解服务,并选择不同的许可选项来节省费用。整体来说,Backblaze提供了便捷、安全、可靠、价格实惠的数据存储解决方案。

Thanks to Backblaze for sponsoring BrettTerpstra.com this week! I’ve been a user for years and it’s saved my hide many times. It’s so easy to set up, and just as importantly, easy to restore files whenever needed. Everybody should have a good cloud backup, and Backblaze is the best I’ve found.

Backblaze Computer Backup offers unlimited and automatic backup for individuals and businesses for just $9/month.

With Backblaze, you can back up documents, photos, music, movies, and more to the cloud. Available for both Macs and PCs, it’s easy and automatic—all you have to do is create an account and your files will start backing up. You can even back up external drives! Backblaze has over three exabytes of data under storage and has restored 55+ billion files for customers.

In the event of hardware failure, accidents, or ransomware, Backblaze offers multiple restore options—you can access your data from anywhere in the world with our web and mobile apps for iOS and Android. You can download files from the web or receive a USB hard drive with all your data shipped to your door. If you return the hard drive within 30 days, you get a full refund!

Protect business data and manage backups for your organization through a centrally-managed admin. Deploying Backblaze on thousands of workstations across your organization is easy!

We offer 30 days of Version History by default and one-year file retention for free so you don’t have to worry about accidentally deleting your data or keeping old file versions. For extra protection, you can upgrade to Forever Version History for just $0.006/GB per month.

Backblaze takes security seriously. All data is stored in our secure data centers with 24-hour staff, biometric security, and redundant power. Here are a few of our security measures:

  • You can use a private encryption key for additional security, ensuring only this key can unlock your backup.
  • Files are encrypted before being transmitted over SSL and stored encrypted.
  • Backblaze’s code is native to Mac and PC and doesn’t use Java.
  • Two-factor verification via ToTP and SMS is available for all Backblaze accounts.

Backblaze is recommended by The New York Times, Inc. Magazine, MacWorld, PCWorld, Lifewire, Wired, Tom’s Guide, 9to5Mac, and more. Recently listed on the NASDAQ Stock Exchange under BLZE, Backblaze is committed more than ever to bringing easy and affordable data storage that you can trust.

Backblaze Computer Backup starts at $9/month. You can save $9 annually by signing up for an annual license, or save $27 when you sign up for a two year license.

Get started with a 15-day no credit card required free trial by going to backblaze.com/terpstra.

Like or share this post on Mastodon or .


BrettTerpstra.com is supported by readers like you. Click here if you'd like to help out.

Twitter | Mastodon | GitHub | Privacy Policy

]]> 2023-12-07T08:49:00-06:00 mdless with document transclusion https://brett.trpstra.net/link/535/16484987/mdless-with-document-transclusion https://brett.trpstra.net/link/535/16484987/mdless-with-document-transclusion MultiMarkdown, transclusion, file, include, path

总结: 最新版本的编码工具包含了MultiMarkdown,并且增加了文件引入的功能。通过使用双大括号插入另一个文件的内容,路径可以是相对或绝对路径,还可以在元数据中指定transclude base。这个功能对大部分用户来说可能并不是非常有用,但对一些用户来说会非常方便。

The latest version of mdless, my most recent coding obsession, now includes MultiMarkdown document transclusion.

File transclusion is the ability to tell MultiMarkdown to insert the contents of another file inside the current file being processed.

You can include a document by inserting a relative path between two pairs of curly brackets:

{{myfile.md}}

The path is relative to the current document, which won’t work if you’re piping text to mdless. In that case it would need to be an absolute path, or have transclude base specified in the metadata.

To provide a base for transclusion paths, just add transclude base to your document’s metadata, either as MultiMarkdown metadata, or as a YAML header:

transclude base: ~/Documents/myproject/chapters

It’s probably not a super useful feature to 90% of mdless users, but should be handy for some.

Like or share this post on Mastodon or .


BrettTerpstra.com is supported by readers like you. Click here if you'd like to help out.

Twitter | Mastodon | GitHub | Privacy Policy

]]> 2023-12-06T13:51:00-06:00 The SaneBox giveaway winners! https://brett.trpstra.net/link/535/16484889/the-sanebox-giveaway-winners https://brett.trpstra.net/link/535/16484889/the-sanebox-giveaway-winners SaneBox, winners, subscription, discount, email service BrettTerpstra.com, giveaway, readers, support, promotion

总结: SaneBox举行了抽奖活动,五位幸运读者获得了1年订阅SaneBox的奖励。未中奖的读者也可使用优惠码获得订阅折扣。BrettTerpstra.com受到读者支持,正在举行活动并提供促销。

Well, the SaneBox drawing has happened I have winners to announce! The following readers have won a 1-year subscription to the handiest email service out there!

  • Andreas Lauritzen
  • Dániel Krausz
  • Jamie Peloquin
  • Esteban Umerez
  • Greg Johnson

Congrats to the winners! If you didn’t win, I’d still recommend checking out SaneBox. Use this link to save $25 on your subscription. It will bring a sanity to your email that you’ve only imagined was possible.

Don’t forget to sign up for the Soulver giveaway that’s happening Friday!

Like or share this post .


BrettTerpstra.com is supported by readers like you. Click here if you'd like to help out.

Twitter | Mastodon | GitHub | Privacy Policy

]]> 2023-12-05T12:11:00-06:00 Soulver giveaway! https://brett.trpstra.net/link/535/16481839/soulver-giveaway https://brett.trpstra.net/link/535/16481839/soulver-giveaway Soulver, calculator, notepad, giveaway, license
Soulver是一款智能替代计算器应用,结合了记事本和计算器的功能,能够使用文字和数字一起进行计算,自动保存工作内容,四个Soulver许可证价值34.95美元每个将在12月8日抽出获奖者。进入抽奖需要提供名字和姓氏,RSS订阅者需要访问网站参与。该系列活动将持续到2024年8月,并且欢迎提出你想看到的应用程序。

I’m excited to offer the next giveaway, 4 licenses ($34.95 value each) for Soulver. Ever wish you could type out a math problem in words and have the answers handed to you? Soulver combines a notepad with a calculator and gives you instant answers.

From the developer:

Soulver is a smart replacement for your calculator app. Use it to work things out, explore different scenarios and play around with numbers. You can use words alongside numbers and almost never encounter an error. And all your work is automatically saved for you so you can reference it later.

Check out the Soulver site for more info.

Sign up below to enter. Winners will be randomly drawn on Friday, December 08, at 12pm Central. The drawing is for 4 licenses ($34.95 value each) for Soulver, 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!

Giveaway ends in...

You need to view this post on brettterpstra.com to enter.

Stay tuned for more giveaways every week through August, 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!

Like or share this post on Mastodon or .


BrettTerpstra.com is supported by readers like you. Click here if you'd like to help out.

Twitter | Mastodon | GitHub | Privacy Policy

]]> 2023-12-04T08:00:00-06:00 The Tower giveaway winners! https://brett.trpstra.net/link/535/16479203/the-tower-giveaway-winners https://brett.trpstra.net/link/535/16479203/the-tower-giveaway-winners Tower giveaway, winners, announcement, discount, next giveaways 总结:

本文是关于Tower赠品活动的结束和获奖者的公布。获奖者是Suzuki Airi和Gavin Jerman。未中奖的人可以参加新用户50%折扣活动。同时,文章还提到了未来的赠品活动。读者可以通过订阅或者关注作者的社交媒体得到最新信息。整个活动由Brett Terpstra支持。

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

The winners!

Congratulations to:

  • Suzuki Airi
  • Gavin Jerman

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 Tower is still worth checking out. If you use Git for anything, Tower can make your life easier. Until Dec 5th you can get 50% off for new users on any plan. Just visit git-tower.com to purchase.

Next up is Soulver. Check back every Monday through August, 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!

Like or share this post on Mastodon or .


BrettTerpstra.com is supported by readers like you. Click here if you'd like to help out.

Twitter | Mastodon | GitHub | Privacy Policy

]]> 2023-12-01T12:15:00-06:00 mdless gets all the colors https://brett.trpstra.net/link/535/16477495/mdless-gets-all-the-colors https://brett.trpstra.net/link/535/16477495/mdless-gets-all-the-colors 改进,主题,颜色代码,TaskPaper渲染,更新日志

总结: 该文章介绍了mdless 2.1.6版本的更新,包括使用十六进制颜色代码进行主题设置,解决了列表和段落中颜色显示的问题,改进了TaskPaper的渲染和自动检测功能,并新增了显示更新日志的--changes标志。

I just pushed v2.1.6 of mdless. Once all these 2.0 changes are confirmed to be stable, I’ll let this project go for a while, but right now there’s lots to improve on and I’m enjoying it as a way to blow off steam.

The biggest change in 2.1.6 is the ability to use hex codes when theming. If you didn’t know, the first time mdless is run, it saves a theme file to ~/.config/mdless/mdless.theme. You can edit this file to change what colors different elements display as. You can also create additional NAME.theme files and trigger them with --theme NAME, or set the :theme: setting in your ~/.config/mdless/config.yml.

With the latest version, you can use 3 or 6-digit RGB codes in addition to color names. Where previously you were limited to the default ANSI colors like red, blue, magenta, cyan, etc., you can now insert something like eccc87 where a color name would usually go. You can affect background colors by prefixing with bg or on_, e.g. bgeccc87. The depth of color that can be displayed depends on your terminal, but at minimum this opens up 256 colors for theming, a 32x increase in options.

I also fixed a couple of issues where span elements in list items would cause the coloration to change. And when there’s a space between list items, they get rendered as paragraphs within list items (standard for most Markdown parsers), causing the coloring to be unexpectedly the same as regular paragraphs. Now mdless strips out regular paragraph coloring on paragraphs contained in list items, so every paragraph within a list gets the list item coloring.

In TaskPaper rendering, documents will now respond to --list to list projects, and --section to list just certain project(s) contents. These no longer have to be numeric (for Markdown or TaskPaper); fuzzy text matching can pick a section (or multiple sections) for you. I also improved the TaskPaper auto-detection by adding a routine that removes all lines that match project or task regular expressions, and if there’s nothing left, it assumes it’s a TaskPaper document. Let me know how this works in the real world.

Lastly, I added a --changes flag that will display the changelog (using mdless for readability), so when you update you can see what changed just by running mdless --changes.

Check out the project page for the full changelog and more details!

Like or share this post .


BrettTerpstra.com is supported by readers like you. Click here if you'd like to help out.

Twitter | Mastodon | GitHub | Privacy Policy

]]> 2023-11-30T10:47:00-06:00 SaneBox giveaway surprise! https://brett.trpstra.net/link/535/16477304/sanebox-giveaway-surprise https://brett.trpstra.net/link/535/16477304/sanebox-giveaway-surprise SaneBox, giveaway, email, subscription, BrettTerpstra.com 总结:

本文介绍了SaneBox赞助BrettTerpstra.com,并提供5个免费1年订阅SaneBox的机会。SaneBox是一个帮助你保持电子邮件收件箱清洁的服务,通过训练可以将特定类型的电子邮件移动到自定义文件夹中,创造一个干净的收件箱。另外,@SaneBlackHole功能可以将某些发件人的邮件屏蔽,让其在不经过退订或请求删除数据的情况下消失。想要参与抽奖的读者需要在BrettTerpstra.com上查看并分享此文章。

Thanks to SaneBox for sponsoring BrettTerpstra.com this week! Instead of a monthly sponsored post this month, the good folks at SaneBox have decided to join my giveaway series and offer 5 free 1-year subscriptions to SaneBox to BrettTerpstra.com readers. Just sign up below for a chance to win.

If you somehow haven’t heard of SaneBox yet, it’s a service that keeps your email inbox clean. You can train certain types of emails to go to your @SaneLater folder, or any custom folder, just by moving an email once. Future emails like it will automatically go to that folder. Forget setting up complicated filters and rules, a week of training and you’ll have a clean inbox that contains only the messages you actually need to see. I especially love the @SaneBlackHole feature which lets me banish certain senders to a, well, black hole, where their messages disappear and I don’t have to go through any hassle of unsubscribing or requesting data removal to stop the incoming messages.

Sign up below for a chance at one of 5 1-year subscriptions, a $299 value. Winners will be drawn next Wednesday, December 6th.

Giveaway ends in...

You need to view this post on brettterpstra.com to enter.

Like or share this post .


BrettTerpstra.com is supported by readers like you. Click here if you'd like to help out.

Twitter | Mastodon | GitHub | Privacy Policy

]]> 2023-11-30T08:00:00-06:00 Tower giveaway! https://brett.trpstra.net/link/535/16469906/tower-giveaway https://brett.trpstra.net/link/535/16469906/tower-giveaway Git GUI, Tower, giveaway, sign up, BrettTerpstra.com

1. 一篇关于Git GUI Tower的介绍和赠品的文章,作者提供了两个1年价值99美元的Tower许可证作为赠品。 2. 要参加赠品需要在作者的网站上注册,每个参与者需要提供名字和姓氏。 3. 赠品于12月1日进行抽奖,每个获奖者将获得一个1年价值99美元的Tower许可证。 4. 作者承诺未来几年每周都会举办赠品活动,读者可以期待更多的赠品。 5. 作者表示网站内容需要读者的支持,鼓励读者点赞和分享。

总结: 本文介绍了一次关于Tower Git GUI的赠品活动,包括如何参与、赠品内容和未来赠品的计划,以及对读者们的呼吁。

I’m excited to offer the next giveaway, 2 1-year licenses ($99 value each) for Tower. Tower is the absolute best Git GUI out there. If you use Git for work or personal projects, its in-depth integration with the entire Git toolset makes life easier, even if you’re already well-versed in the command line. It includes great GitHub integration for pull requests and issues.

From the developer:

All of Git’s Power (And None of the Pain). Pull Requests, Single-line staging, Interactive Rebase, Submodules, Git LFS, Git-Flow, File History, Blame, Cherry-Pick.

Check out the Tower site for more info.

Sign up below to enter. Winners will be randomly drawn on Friday, December 01, at 12pm Central. The drawing is for 2 1-year licenses ($99 value each) for Tower, 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!

Giveaway ends in...

You need to view this post on brettterpstra.com to enter.

Stay tuned for more giveaways every week through August, 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!

Like or share this post .


BrettTerpstra.com is supported by readers like you. Click here if you'd like to help out.

Twitter | Mastodon | GitHub | Privacy Policy

]]> 2023-11-27T08:00:00-06:00 mdless updates for Thanksgiving weekend https://brett.trpstra.net/link/535/16468853/mdless-updates-for-thanksgiving-weekend https://brett.trpstra.net/link/535/16468853/mdless-updates-for-thanksgiving-weekend 更新, 配置文件, 内联样式, 任务清单, 强调标记
内联样式和嵌套列表是在版本2.0中进行了重大更新,解决了代码和列表的格式问题,可以在命令行和配置文件中进行永久性设置。另外,还加入了任务清单的高亮显示,链接格式、强调标记等多种Markdown处理选项,方便用户根据需要进行设置。

总结: 更新配置文件后,mdless版本2.0解决了内联样式和嵌套列表的格式问题,同时增加了任务清单的高亮显示,丰富了Markdown处理选项,提升用户的使用体验。

I made a few major updates to mdless 2.0 (first announced a couple days ago) over the holiday weekend. Note that you can make all of the new options permanent in the config file (see Easily Update Config). Options specified on the command line will always override anything in the config file, so you can disable options permanently but enable them on a per-run basis using command line flags.

Inline Styling

The first problem I ran into was that if a link, emphasis, or other inline element came in the middle of a line, everything after that element would fail to be styled. So I added in a routine that I created for Doing that can take the text preceding an element and determine what the escape sequence would be at the end of that text, right before the new element. Then I can restore that sequence after the new element.

Nested Lists

Second, and this was a real pain, nested lists weren’t working. Like at all. I didn’t notice it at first because my test files had very basic lists in them, but lists were being flattened, ordered list sequencing was completely out of whack, and nested paragraphs and code blocks within lists were getting totally borked. Fixing this was a pain. Redcarpet only provides “text” and “type” to the list rendering functions, so you have no idea if it’s nested, at what level, etc. You can start a class variable counter and increment it with each ordered item, but as soon as it nests or starts a new list, you’re in trouble, and lists aren’t rendered in sequence anyway, so an array structure to keep track of them is impossible. They’re rendered inside out, so any kind of basic counter will be off as soon as you have a nested ordered list. Fixing this took me three days, and I went through a dozen solutions before one worked. I think the current solution is pretty solid, seems to handle all of the aforementioned issues and maintain accurate numbering with multiple nested, ordered lists. Also indents paragraphs and code blocks within lists.

I am running into an issue where a numbered item can sometimes have an unnecessary line break after it. I haven’t yet been able to track down where that’s coming from. Also, nested code blocks are indented, but one less indent than their parent list item. These will be fixed in future releases.

TaskPaper highlighting

I also added TaskPaper highlighting to mdless. You can run it with --taskpaper true to force TaskPaper highlighting, or run it with --taskpaper auto to detect TaskPaper formatting either from the file extension or test whether it has at least 1 project and 6 total tasks between projects based on regular expressions. Not the most elegant way to detect it, I’m sure, but it seems to work well in my testing. You can add:

:taskpaper: :auto

to ~/.config/mdless/config.yml to make auto a permanent setting (or use true or false to force it either way).

If TaskPaper highlighting is enabled, no other Markdown processing will be done. TaskPaper formatting intersects with Markdown formatting in ways that can cause unpredictable results. So @tags and values are highlighted, project names are highlighted, and task markers get colored. Other than that, it’s just displayed as is.

As mentioned in an update to the 2.0 announcement, mdless can now render links as inline, reference, or reference-per-paragraph, grouping the references below the paragraph or element that refers to them. Just run with --links paragraph or --links reference to enable either, and these can be made permanent in the config file by adding :links: :reference (or :inline or :paragraph).

Emphasis Markers

The initial release hid the markers around emphasis, e.g. **bold** would just render as bold, applying colors from your theme but leaving out the ** surrounding it. That’s now configurable in the theme settings:

emphasis:
  bold: b
  bold_character: "**"
  italic: u i
  italic_character: "_"
  bold-italic: b u i

You can leave the character settings empty to not display any characters at all (as per previous behavior).

Other Markdown Rendering Options

Redcarpet has flags available for lax spacing (requiring newlines around HTML blocks) and intra-emphasis (where a_underscored_filename would get rendered with italics in the middle). Disabling intra-emphasis means that underscored filenames (and other words) stay as is.

These can be implemented in mdless using --[no-]intra-emphasis and --[no-]lax-spacing, and both options can be made permanent in the config file.

:lax_spacing: true
:intra_emphasis: false

This one is simple, I just added highlighting for [[wiki links]]. It can be toggled with --[no-]wiki-links and uses the colors specified for link brackets and link text. Make it permanent with :wiki_links: true.

Easily Update Config

By the way, you can overwrite the config file with current command line flags and any new keys that have been added by running with --update-config. Any other flags on the command line will be set in the config, and any new keys that may have been added since your config file was created will be added with their default values.

The config file is found at ~/.config/mdless/config.yml. Options specified there can be overridden by using command line flags at any time. This file is automatically written on the first run where the file doesn’t exist, so you can scrap preferences and start again just by deleting the file and running mdless (any command line options used on that first run will be set in the config file, otherwise the default value for each option will be used).

Other Stuff

  • Pad numbers on headline listing to preserve indentation
  • Image rendering with chafa improved, still have to figure out a way to make sure content breaks properly around the embedded image
  • Only detect mmd headers on first line
  • Scrub invalid UTF-8 in document to remove characters that break regexes

Check out the project page for installation and usage details.

Like or share this post .


BrettTerpstra.com is supported by readers like you. Click here if you'd like to help out.

Twitter | Mastodon | GitHub | Privacy Policy

]]> 2023-11-26T13:24:00-06:00 The Default Folder X giveaway winners! https://brett.trpstra.net/link/535/16467738/the-default-folder-x-giveaway-winners https://brett.trpstra.net/link/535/16467738/the-default-folder-x-giveaway-winners Default Folder X, winners, giveaway, coupon, apps

Default Folder X举办的赠品活动已经结束,获奖者已经产生。恭喜Alexander Allori和Michael X获奖。未获奖的人可以使用优惠券BRETT-DFX-2023享受20%的折扣。未来几个月还会有更多的赠品活动。同时,可以向Brett Terpstra.com推荐你想要看到的应用程序。感谢读者的支持。

The Default Folder X giveaway has ended, and I have winners to announce!

The winners!

Congratulations to:

  • Alexander Allori
  • Michael X

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 Default Folder X is still worth checking out. Trust me, you need this. You might not realize how limited your standard open and save dialogs are until you’ve experienced Default Folder X. You can still save 20% by using the coupon BRETT-DFX-2023 at checkout.

By the way, Default Folder X is also available on Setapp, along with hundreds of other amazing apps. You should probably get a subscription.

Next up is Tower. Check back every Monday through August, 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!

Like or share this post .


BrettTerpstra.com is supported by readers like you. Click here if you'd like to help out.

Twitter | Mastodon | GitHub | Privacy Policy

]]> 2023-11-24T13:00:00-06:00 mdless 2.0 https://brett.trpstra.net/link/535/16466517/mdless-2-dot-0 https://brett.trpstra.net/link/535/16466517/mdless-2-dot-0 Markdown, mdless, update, terminal handling, code highlighting 更新了mdless至2.0版本,进行了完全改版,采用了新的Markdown解析方式,并且加入了自定义渲染和前后处理。表格清理效果更好,脚注可以更灵活地显示在段落后或者末尾。代码高亮更加准确,有序列表也可以正确显示编号。整体来说,是一个很大的进步。如果你在终端里使用Markdown并花费时间在README文件上,可以试试使用mdless来代替打开浏览器或者编辑器预览。详情和安装指南请参考链接。

I’ve updated mdless to 2.0. Well, 2.0.5 at this point. It’s a complete overhaul of the command line Markdown parser/viewer.

It’s been a pretty popular project, and is being used on all kinds of OSs, but it got frustrating as the whole thing was based on regular expressions for parsing and users expected it to handle some more complex markup than it could. So for the reboot, I switched to using RedCarpet for parsing, then added my own terminal handling to that via a custom renderer and pre/post processing.

Table cleanup is better than ever. Footnotes can still be displayed directly after the paragraph that references them, or at the end of the display. Code highlighting (with Pygments) is more accurate than ever. Ordered lists are properly numbered, regardless of the numbering in the Markdown. There are a few differences in the way things like code blocks nested in lists are displayed (they’re no longer indented), but overall it’s a big step up.

If you’re into Markdown and spend time in the Terminal, let mdless display those README files for you, rather than opening up a dedicated viewer or editor with a preview. See the project page for more details and installation instructions.

Like or share this post .


BrettTerpstra.com is supported by readers like you. Click here if you'd like to help out.

Twitter | Mastodon | GitHub | Privacy Policy

]]> 2023-11-23T09:19:00-06:00 Default Folder X giveaway! https://brett.trpstra.net/link/535/16461612/default-folder-x-giveaway https://brett.trpstra.net/link/535/16461612/default-folder-x-giveaway Default Folder X, macOS, giveaway, sign up, app 在brettterpstra.com的最新赠品活动中,我们有机会赢得两个总值为39.95美元的Default Folder X许可证。这个macOS的惊人扩展使文件夹导航变得更加容易,标记变得更好,并实现了灵活的收藏夹功能,还允许为每个应用程序设置特定的默认文件夹。登录参与抽奖,必须提供名和姓,赠品将在11月24日中午12点中央时间随机抽取。此外,还要关注更多未来的赠品活动。总结: Default Folder X是macOS的一个优秀扩展,可以使文件夹导航更加高效,提供灵活的收藏夹功能,以及为每个应用程序设置特定的默认文件夹。要参与赠品活动,需要在brettterpstra.com上查看详情并提供完整的姓名。

I’m excited to offer the next giveaway, 2 licenses ($39.95 value each) for Default Folder X. Default Folder X is an amazing extension for your open and save dialogs on macOS. It makes navigating folders easier, tagging better, and implements flexible favorites and allows specific default folders for every app. You can set up favorite folders, accessible with keyboard shortcuts, have every app track it’s most recent save-to folder, and much more.

From the developer:

Make your Open and Save dialogs work as quickly as you do. Track recently used files and folders in every app, reopen recently closed Finder windows, Copy and Move files in file dialogs.

Check out the Default Folder X site for more info.

Sign up below to enter. Winners will be randomly drawn on Friday, November 24, at 12pm Central. The drawing is for 2 licenses ($39.95 value each) for Default Folder X, 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!

Giveaway ends in...

You need to view this post on brettterpstra.com to enter.

Stay tuned for more giveaways every week through August, 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!

Like or share this post .


BrettTerpstra.com is supported by readers like you. Click here if you'd like to help out.

Twitter | Mastodon | GitHub | Privacy Policy

]]> 2023-11-20T08:00:00-06:00 The Noteplan giveaway winners! https://brett.trpstra.net/link/535/16459610/the-noteplan-giveaway-winners https://brett.trpstra.net/link/535/16459610/the-noteplan-giveaway-winners Noteplan, winners, giveaway, apps, suggestions
Noteplan举办的赠品活动已经结束,获奖者已经公布。如果你没赢得奖品,可以考虑购买Noteplan,这是一个非常棒的便携式笔记、待办事项和项目管理解决方案。BrettTerpstra.com每周都会进行赠品活动,接下来的赠品活动包括……如果你对某个应用程序有兴趣,可以在社交媒体上联系作者。此外,他提到网站的支持来源于读者,保留所有权利。

总结: Noteplan举办了赠品活动,公布了获奖者名单。未中奖的人可以考虑购买Noteplan。BrettTerpstra.com每周都会进行赠品活动,保留所有权利。

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

The winners!

Congratulations to:

  • Erik Wessel-Berg
  • David Blue
  • Brandon Ballentine
  • Carley Knight
  • Paolo Sturbini

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 Noteplan is still worth checking out. If you like portable solutions for managing notes, todos, and projects, you can’t beat Noteplan.

By the way, Noteplan is also available on Setapp, along with hundreds of other amazing apps. You should probably get a subscription.

Next up is Default Folder X. Check back every Monday through August, 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!

Like or share this post .


BrettTerpstra.com is supported by readers like you. Click here if you'd like to help out.

Twitter | Mastodon | GitHub | Privacy Policy

]]> 2023-11-17T13:00:00-06:00 Kaleidoscope 4.3: Improved Git Merge Context and Git File History [Sponsor] https://brett.trpstra.net/link/535/16457520/kaleidoscope-4-dot-3-improved-git-merge-context-and-git-file-history-sponsor https://brett.trpstra.net/link/535/16457520/kaleidoscope-4-dot-3-improved-git-merge-context-and-git-file-history-sponsor Kaleidoscope, file comparison, Git merges, features, coupon code

总结: Kaleidoscope是一款强大的文件比较应用程序,特别适用于代码和Git合并。最新的Kaleidoscope 4.3版本提供了许多创新功能,包括改进的Git Merge Context Shelf和Git File History,支持文件重命名和分支名称显示,以及Markdown内容的美观渲染。该应用还提供了各种实用功能,如语法着色、比较转换为可内联编辑的合并文档、文本过滤器等。订阅费用为每月8美元,并且学生和教师可获得更多折扣。

Thanks to Kaleidoscope for sponsoring BrettTerpstra.com this week! This app just keeps getting better. If you have any need for comparing files (especially if you code and do Git merges), it can’t be beat.

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.

The brand new Kaleidoscope 4.3 continues to innovate by improving the previously introduced Git Merge Context Shelf and Git File History. Kaleidoscope now also detects file renames and shows branch names. When used with a service such as GitHub, GitLab or Bitbucket, Kaleidoscope now supports jumping to commits, branches, and tickets referenced in commit messages. And it beautifully renders Markdown content in commit messages, which makes browsing and comparing commits so much nicer.

Here are some of the features we added in Kaleidoscope 4:

  • Syntax coloring, with multiple built-in themes.
  • Transform any comparison into a merge document that can be edited inline.
  • Text filters to clean up diffs by removing irrelevant data, such as time stamps, object addresses and unique identifiers.
  • Kaleidoscope Prism, a new helper app in the menu bar to quickly launch comparisons even if Kaleidoscope is not running.
  • Debugger integration for Python developers.
  • File properties show metadata, including size, file type, dates, and encoding.
  • A welcome window that speeds up the processes of creating new comparisons or finding recent ones.

Subscriptions start at $8 per month for a yearly plan. Use the coupon code TERPSTRA (valid until December 31, 2023) to get 20% off for the first year. As a student or teacher, the price is reduced even further.

Learn more about Kaleidoscope and start your 14-day free trial today.

Like or share this post on Mastodon or .


BrettTerpstra.com is supported by readers like you. Click here if you'd like to help out.

Twitter | Mastodon | GitHub | Privacy Policy

]]> 2023-11-16T08:00:00-06:00 Noteplan giveaway! https://brett.trpstra.net/link/535/16449348/noteplan-giveaway https://brett.trpstra.net/link/535/16449348/noteplan-giveaway Noteplan, giveaway, subscription, Markdown, organization

这是一篇关于Noteplan软件的赠阅活动的文章。文章介绍了Noteplan软件的特点和功能,表示有5个1年订阅的赠阅活动。软件支持Markdown格式,可以用于组织笔记和任务。活动的截止日期是11月17日,赢家会在当天抽出。文章最后还提到了之后会有更多的赠阅活动,并鼓励读者参与。整体来看,这是一篇为了推广Noteplan软件而进行的赠阅活动文章。

I’m excited to offer the next giveaway, 5 1-year subscriptions ($99 value each) for Noteplan. If you love plain text (and Markdown), you’re going to love Noteplan for organizing all your notes and todos. Using plain text, you can create daily logs, digital bullet journals, track todos, and keep cross-linked notes for all your stuff. Also check out the web version coming soon!

From the developer:

Use the flexibility of Markdown to quickly create tasks. Add options for repeating to dos, easily move tasks into the future, and add tags and mentions. Speed up your workflow with natural language input and autocompletion of tags, mentions, and links.

Check out the Noteplan site for more info.

Sign up below to enter. Winners will be randomly drawn on Friday, November 17, at 12pm Central. The drawing is for 5 1-year subscriptions ($99 value each) for Noteplan, one per winner. Note that if you’re reading this via RSS, you’ll need to visit this post on brettterpstra.com to enter!

Giveaway ends in...

You need to view this post on brettterpstra.com to enter.

Stay tuned for more giveaways every week through August, 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!

Like or share this post .


BrettTerpstra.com is supported by readers like you. Click here if you'd like to help out.

Twitter | Mastodon | GitHub | Privacy Policy

]]> 2023-11-13T08:00:00-06:00 The Hazel giveaway winners! https://brett.trpstra.net/link/535/16440511/the-hazel-giveaway-winners https://brett.trpstra.net/link/535/16440511/the-hazel-giveaway-winners Hazel giveaway, winners, coupon, next giveaways, Brett Terpstra 总结:

文章宣布了Hazel赠品活动的获奖名单,同时提供了未中奖者使用折扣码购买产品的机会。接着介绍了即将举行的下一个赠品活动,并鼓励读者参与。最后,鼓励读者通过社交媒体分享或点赞,并表达了对读者支持的感谢。

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

The winners!

Congratulations to:

  • Bruno Martinelli
  • Mike
  • Simeon Attaway
  • Federico
  • Will

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 Hazel is still worth checking out (and I know you’re interested because there was a record number of entries for this one). It will revolutionize your file management and has all kinds of possibilities for automation. You can still use the coupon TERPSTRA2023 to get 20% off (click here to apply).

Next up is Noteplan. Check back every Monday through August, 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!

Like or share this post on Mastodon or .


BrettTerpstra.com is supported by readers like you. Click here if you'd like to help out.

Twitter | Mastodon | GitHub | Privacy Policy

]]> 2023-11-10T12:30:00-06:00 Halp: Universal help for Fish https://brett.trpstra.net/link/535/16436713/halp-universal-help-for-fish https://brett.trpstra.net/link/535/16436713/halp-universal-help-for-fish Fish, help, command, function, editor
总结:
这篇文章介绍了作者将自己的通用“help”命令移植到了Fish上。通过使用halp命令,用户可以方便地获取命令的帮助信息,无需考虑帮助信息来自哪个渠道。作者还提到了安装该函数的方法,以及如何编辑该函数以适应用户需求。此外,作者还分享了一个有用的Fish函数,可以让用户使用自己喜欢的文本编辑器编辑Fish函数。最后,作者鼓励读者查看他的公共Fish函数,并邀请他们点赞或分享这篇文章。

I’ve had it out there for a while, but I thought I’d point out that I’ve ported my universal “help” command to Fish. halp removes the hassle of figuring out whether a command’s help comes from man CMD, help CMD, CMD -h, or type CMD. Just run halp CMD (where CMD is the command you want help on) and it will figure out the rest.

To install the function, just save the halp.fish file to ~/.config/fish/functions. Once there, you can just type halp CMD to get an appropriate help screen, whether it has a man page, a help page, command line help, or is an alias or function. By default it’s set up to use Dash for Fish native commands (rather than opening your browser), but you can edit the function to change that (see the comments). That requires that you’ve installed the Fish docset (Dash Preferences->Downloads->User Contributed). My local version of the function also replaces the man $cmd line with open "dash://man%3A$cmd" to open man pages in Dash (requires the manpage docset). Edit as needed to make it work for you.

As an aside, if you regularly edit Fish functions, it can be handy to use your favorite text editor rather than Vim or the internal editor. I have a function called funcsubl that wraps the funced command with subl -w and autosaves after closing the window. You can modify this to work with any editor, you just need a “wait” flag (like subl -w). Here’s my version.

Check out all my public Fish functions in the GitHub repo.

Like or share this post .


BrettTerpstra.com is supported by readers like you. Click here if you'd like to help out.

Twitter | Mastodon | GitHub | Privacy Policy

]]> 2023-11-08T11:46:00-06:00 Hazel giveaway! https://brett.trpstra.net/link/535/16431556/hazel-giveaway https://brett.trpstra.net/link/535/16431556/hazel-giveaway Hazel、automations、files、sort、giveaway Hazel是一个可以根据文件的更改情况创建自动化的软件,可以对PDF文件进行自动归档、对下载文件进行分类、对新图像进行优化处理等。它支持根据文件名、日期或属性的组合进行重命名、分类和标签等操作。并且结合强大的模式匹配功能,可以根据自己的方式来处理文件。本次活动为Hazel的五个授权证书进行抽奖赠送,价值42美元每个,抽奖将在11月10日中午12点(中央标准时间)进行。活动截止时间见文章。此外,本文提到如果通过RSS阅读此篇文章,需要到brettterpstra.com上进行参与。还有更多类似的赠送活动将会在未来进行。

I’m excited to offer the next giveaway, 5 licenses ($42 value each) for Hazel. Hazel lets you create automations based on changes to files, allowing you to do things like automatically filing PDFs, sorting downloads, running optimizations on new images, or just about any file operation you can imagine.

From the developer:

Hazel can open, archive, tag and even upload. You can have Hazel rename your files or sort them into subfolders based on name, date or whatever combination of attributes you choose. Coupled with Hazel’s powerful pattern matching, you can create workflows to process your files, your way.

Check out the Hazel site for more info.

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

Giveaway ends in...

You need to view this post on brettterpstra.com to enter.

Stay tuned for more giveaways every week through August, 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!

Like or share this post .


BrettTerpstra.com is supported by readers like you. Click here if you'd like to help out.

Twitter | Mastodon | GitHub | Privacy Policy

]]> 2023-11-06T08:00:00-06:00 SearchLink gets Google Search back https://brett.trpstra.net/link/535/16429946/searchlink-gets-google-search-back https://brett.trpstra.net/link/535/16429946/searchlink-gets-google-search-back Google, API key, searches, SearchLink, DuckDuckGo

总结: Google现在再次提供API key来进行搜索,每天免费搜索限制为100次。用户可以将自己的API key添加到配置文件中,以便在搜索时使用Google的功能。如果当天用完了100次搜索,系统会自动切换回之前的DuckDuckGo搜索配置。使用Google进行搜索不会引起新的隐私问题,因为这些搜索不包含任何追踪数据。SL.ddg()方法在使用插件时也会测试是否存在API key,并且在可用时将使用Google。用户需要安装最新版本的SearchLink,并生成自己的API key。

So it turns out Google now offers an API (once again). It’s limited to 100 searches per day for the free version, so I don’t want to put my API key into the public distribution of SearchLink, but if you want to tap into Google’s power for your searches, you can now add your own API key to the config and get 100 searches per day for free. If you should, for whatever reason, run out of searches in a day, it should gracefully switch out to the previous DuckDuckGo configuration.

The !g search will now test for the presence of a Google API key, and if it exists, use Google for the search. You can also use !gg to force a Google search. If there’s not a key set up, it will continue operating as it has using DuckDuckGo. As far as privacy concerns go, these searches don’t include any tracking data, so using Google in this manner shouldn’t present any new issues. For anyone creating plugins, the SL.ddg() method will also test for an API key and use Google if available.

To use this, install the latest version (download below) and then see the wiki page I created to generate your own key.

Enjoy!

SearchLink v2.3.53

Generate Markdown links from web searches without leaving your editor.

Published 11/10/14.

Updated 11/05/23. Changelog

DonateMore info…

Like or share this post .


BrettTerpstra.com is supported by readers like you. Click here if you'd like to help out.

Twitter | Mastodon | GitHub | Privacy Policy

]]> 2023-11-05T16:27:00-06:00 The WordCounter giveaway winners! https://brett.trpstra.net/link/535/16428225/the-wordcounter-giveaway-winners https://brett.trpstra.net/link/535/16428225/the-wordcounter-giveaway-winners WordCounter giveaway, winners, announcement, tracking writing productivity, save 33% off purchase, next giveaways. 总结:

WordCounter的赠品活动已经结束,并且我有要宣布的获奖者!获奖者是Chris、Nick Taylor和Carley E Knight。如果你没收到邮件,请查看邮件中的详细信息。如果你没有赢得奖品,很抱歉,但你可以从今天开始追踪你的写作产出,并获得折扣优惠33%,使用代码DONTBESAD。接下来是下一个赠品活动,请每周一通过2024年8月检查,获取更多的赠品。下一个赠品包括:(这里省略具体赠品)。如果你想要推荐一个你想在这个系列中见到的应用,请在Twitter上或电子邮件中告诉我,并加入通知列表。喜欢或分享这篇文章。BrettTerpstra.com由像你一样的读者支持。所有材料 ©2023 Brett Terpstra。

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

The winners!

Congratulations to:

  • Chris
  • Nick Taylor
  • Carley E Knight

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 WordCounter is still worth checking out. You can start tracking your writing productivity today, and get going for NaNoWriMo! You can still save 33% off your purchase using the code DONTBESAD when you buy!

Next up is Hazel. Check back every Monday through August, 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!

Like or share this post .


BrettTerpstra.com is supported by readers like you. Click here if you'd like to help out.

Twitter | Mastodon | GitHub | Privacy Policy

]]> 2023-11-03T13:00:00-05:00 Tower - making Git easy (and enjoyable!) to use [Sponsor] https://brett.trpstra.net/link/535/16422495/tower-making-git-easy-and-enjoyable-to-use-sponsor https://brett.trpstra.net/link/535/16422495/tower-making-git-easy-and-enjoyable-to-use-sponsor Tower、Git、features、操作、方便、易用、撤销、重拍、合并、分支、代码改动、软件团队使用、折扣优惠、学生教师免费。 总结:

总结:Tower是一款专为使Git操作变得简单和愉快而设计的应用程序。它拥有多项功能,方便用户进行Git操作,包括撤销操作、重拍提交、合并冲突、分支管理和代码改动识别等。许多世界顶级的软件团队都在使用Tower进行日常工作,而且使用代码TERPSTRA25还可享受25%的折扣优惠。对于学生和教师,Tower Pro更是免费提供。

Thanks to Tower for sponsoring BrettTerpstra.com this week! I swear by this app, and anyone who uses Git for any part of their work or play should check it out.

Tower’s mission is simple: to make Git easy and enjoyable for everyone.

All the features of our native Git client have been carefully crafted with this specific goal in mind. Here are five examples:

  1. Undo any Git operation by simply pressing CMD+Z (or CTRL+Z on Windows). This convenient keystroke allows you to easily roll back any mistakes made.
  2. Use Drag and Drop to efficiently reorder commits, cherry-pick, merge/rebase branches, or create pull requests.
  3. Solve merge conflicts easily with Tower’s Merge Wizard, which provides clear context about the conflict.
  4. Review your repository’s branches with Tower’s “Branches Review” feature. This feature helps identify stale branches or those that have already been fully merged.
  5. Enable Syntax Coloring to quickly identify changes made in every diff. Tower supports almost 200 languages, making it easy to spot differences in code.

Some of the world’s best software teams use Tower every day - on both macOS and Windows.

Learn more about Tower and begin your 30-day free trial today! Use code TERPSTRA25 to get 25% off your first year. And if you are a student or teacher, you can get Tower Pro for free!

Like or share this post .


BrettTerpstra.com is supported by readers like you. Click here if you'd like to help out.

Twitter | Mastodon | GitHub | Privacy Policy

]]> 2023-11-02T08:00:00-05:00 Web Excursions for November 01, 2023 https://brett.trpstra.net/link/535/16420745/web-excursions-for-november-01-2023 https://brett.trpstra.net/link/535/16420745/web-excursions-for-november-01-2023 teleprompter, iOS/Mac, web version, Alfred workflow, Notes, console.table() 总结: teleprompter是一个简单的概念,但很多人都搞砸了。Teleprompter Premium是我最喜欢的iOS/Mac应用,同一开发商刚刚发布了一个网络版。它的价格比我预期的要高一些,但在11月3日之前注册可以获得终身50%的折扣。 很高兴看到新版本的Alfred workflow开始流行。它可以基于模板文件创建新项目。 我必须承认,Notes已经成为了一个强大的应用程序。我从来没有想到苹果会对它进行如此多的开发。 我终于明白了console.table()的实用性。 Backblaze可以安全地将您整个计算机备份到云端,价格实惠可靠。我非常信任它来保护我的所有数据。

Web excursions brought to you in partnership with Backblaze. Back up everything.

CloudPrompter
The idea of a teleprompter is simple, yet so many people screw it up. Teleprompter Premium is my favorite on iOS/Mac, and the same devs have just released a web version of the same. It’s a bit pricier than I think it should be, but you can get a lifetime 50% discount for signing up before Nov 3rd.
“Planter” redux for Alfred
Nice to see a new version of Planter taking root. An Alfred workflow for creating new projects based on a template file.
A Closer Look at Apple Notes’ Smart Folders
I have to admit Notes has become a killer app. I never would have guessed Apple would put this much development into it.
Quick tip: Getting all links from any web site into a spreadsheet using browser developer tools
I finally get how useful console.table() can be.

Backblaze securely backs up your entire computer to the cloud, affordably and reliably. I trust it with all my data. Check it out today.

Like or share this post on Mastodon or .


BrettTerpstra.com is supported by readers like you. Click here if you'd like to help out.

Twitter | Mastodon | GitHub | Privacy Policy

]]> 2023-11-01T14:00:00-05:00 Searchlink, not just for searching https://brett.trpstra.net/link/535/16420225/searchlink-not-just-for-searching https://brett.trpstra.net/link/535/16420225/searchlink-not-just-for-searching SearchLink, plugins, text filter, calendar, MakeADate. 总结: SearchLink是一个用于链接网站、应用程序页面、Gist嵌入以及其他博客、网页写作或展示注释的工具。文章介绍了如何安装和贡献插件,并提供了一些示例代码。此外,还介绍了几种可以使用SearchLink的插件,包括MixCase(用于随机大写字符)、Calendar(插入Markdown日历)、MakeADate(插入格式化日期)。该文章鼓励读者通过查看提供的代码,生成自己的插件,并鼓励分享。

First, I’ve created a repo for SearchLink plugins. This is mostly going to be example code, but you might find some useful ones in there. If you’ve never checked out SearchLink and do any kind of writing that requires linking to web sites/pages, app landing pages, Gist embeds, or basically any kind of blogging, web writing, or show notes, you should check it out.

See the plugin repository for details on installing and contributing. All of the available searches in SearchLink are defined as plugins, so you can also use those as examples.

Text Filters

One thing I wanted to explore was using SearchLink for more than just searches. I created a couple proofs of concept as plugins. Some of these make more sense as TextExpander snippets, but I wanted to experiment, so here’s what I came up with.

MixCase

This plugin is a text filter that will turn !mix A string of text into A STRInG of TExT, randomly capitalizing characters. It’s just to demonstrate how easily a text filter can be implemented (if you know a little Ruby, anyway).

Calendar

Another example of a text filter. This one can insert a Markdown calendar for any month and year. You can define the month and year like !cal 5 2024 to get a calendar for May, 2024. If you use !cal now it will insert a calendar for the current month and year. It can also print how many days are in a month with !days 2 2024 to show how many days are in February in 2024. Silly, and again would probably be better as a TextExpander snippet, but I’m just experimenting with extending SearchLink.

MakeADate

This is a port of a TextExpander snippet I use. It takes a natural language date and inserts a formatted date. It provides the following formats:

Abbr Result
!ddate tomorrow 8am 2023-11-02 8:00am
!dshort 2/2/24 6:30am 2024-2-2 6:30am
!diso tomorrow 1pm 2023-11-02 13:00
!dlong tomorrow 8am Thursday, November 2nd, 2023 at 8:00am

All of the searches can be abbreviated to two letters, with !diso becoming !di, !dlong becoming !dl, etc.

This plugin requires that PHP be installed on the system, either with the Apple Command Line Utilties (I think), or with Homebrew (brew install php).

Contributing

Use the fully-commented code in lyrics.rb (documented in the SearchLink wiki) to generate your own plugins, and reference the existing searches for inspiration. Feel free to fork and submit a PR to the plugin repository if you create something you’d like to share!

Like or share this post on Mastodon or .


BrettTerpstra.com is supported by readers like you. Click here if you'd like to help out.

Twitter | Mastodon | GitHub | Privacy Policy

]]> 2023-11-01T10:01:00-05:00 SearchLink Fixes https://brett.trpstra.net/link/535/16416050/searchlink-fixes https://brett.trpstra.net/link/535/16416050/searchlink-fixes 2.3.50, DuckDuckGo, fixes, tests, SearchLink v2.3.50 修复了DuckDuckGo响应中的一些问题,目前通过了所有测试,除了一个。该版本能够将网页搜索转换为Markdown链接。源代码托管在GitHub上,可以将其编译为命令行使用的gem。每个搜索都是SearchLink,并且可以很容易地添加新的搜索类型。如果您对SearchLink进行了扩展,请务必提交Pull Request,并参与开发。可以在链接中下载该版本,并查看详细信息。总结: 2.3.50版本修复了DuckDuckGo响应中的问题。该版本通过了大多数测试,但仍有一个测试未通过。SearchLink可以将网页搜索转换为Markdown链接,并提供了扩展功能。源代码托管在GitHub上,可以将其编译为命令行使用的gem。项目欢迎开发者提交Pull Request参与开发。

SearchLink 2.3.50 is out and contains fixes for some recent changes in DuckDuckGo’s responses. It currently passes all tests except for one (TMDB is returning a movie for the search result “Brad Pitt”, rather than the actor page, and when I add “actor” to the search it dumps out to IMDB, which I don’t fully understand).

Don’t forget that the source code is all neatly organized on GitHub and you can compile the whole thing as a gem for command line usage, if you like. Every search is a plugin and you can add new search types pretty easily. If you do extend SearchLink at all, be sure to make a Pull Request and be part of the development!

Download below, and see the SearchLink project page for more details!

SearchLink v2.3.50

Generate Markdown links from web searches without leaving your editor.

Published 11/10/14.

Updated 10/29/23. Changelog

DonateMore info…

Like or share this post .


BrettTerpstra.com is supported by readers like you. Click here if you'd like to help out.

Twitter | Mastodon | GitHub | Privacy Policy

]]> 2023-10-30T09:19:00-05:00 WordCounter giveaway! https://brett.trpstra.net/link/535/16415970/wordcounter-giveaway https://brett.trpstra.net/link/535/16415970/wordcounter-giveaway WordCounter, giveaway, licenses, writing productivity, tracking words

总结:这篇文章介绍了一个名为WordCounter的应用程序,以及一个赠品活动,提供3个价值19.99美元的许可证。WordCounter是一个可以追踪写作生产力的应用程序,能够记录你每天的写作成果和目标,并且可以在任何应用程序中自动记录写作量。它将写作过程中所产生的字数作为度量标准,给予作家实时反馈和鼓励,并且保留了每天的成就记录,帮助作家找到最适合他们的写作环境。想要参加赠品活动的读者需要在指定时间内报名。文章最后还提到了未来几年的赠品活动,并鼓励读者推荐希望在活动中推广的应用程序。

I’m excited to offer the next giveaway, 3 licenses ($19.99 value each) for WordCounter. Just in time for NaNoWriMo, WordCounter is an app for writers who want to track the most important metric in their daily goal: how many words you write and where. It records your writing productivity automatically in any app, allowing you to just write.

From the developer:

The WordCounter gives immediate feedback on your productivity as a writer, encourages you by showing you your daily output, gives you clarity about your daily goals, keeps a complete history of your daily achievements, assists with finding your perfect writing environment, counts what counts: words – the ultimate metric for writing.

Check out the WordCounter site for more info.

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

Giveaway ends in...

You need to view this post on brettterpstra.com to enter.

Stay tuned for more giveaways every week through August, 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!

Like or share this post .


BrettTerpstra.com is supported by readers like you. Click here if you'd like to help out.

Twitter | Mastodon | GitHub | Privacy Policy

]]> 2023-10-30T08:00:00-05:00 The Scrivener giveaway winners! https://brett.trpstra.net/link/535/16413505/the-scrivener-giveaway-winners https://brett.trpstra.net/link/535/16413505/the-scrivener-giveaway-winners Scrivener, giveaway, winners, coupon, next giveaways

总结: Scrivener的赠品活动已经结束,其中的赢家是Philip Zastrow,David Lynch和paul kesselma。如果你没有赢得赠品,可以使用优惠券Brett-Scriv-2023来购买Scrivener并节省20%的费用。下一轮的赠品活动将在未来的几个星期内进行,有关具体信息,请访问网站。请在社交媒体上点赞或分享此文章以获取更多相关信息。

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

The winners!

Congratulations to:

  • Philip Zastrow
  • David Lynch
  • paul kesselma

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 Scrivener is still worth checking out. If you’re a writer, you really should be using Scrivener, and you can still save 20% off using the coupon Brett-Scriv-2023 at checkout. You’ll want it for NaNoWriMo, or just for your next writing project!

Next up is WordCounter. Check back every Monday through August 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!

Like or share this post .


BrettTerpstra.com is supported by readers like you. Click here if you'd like to help out.

Twitter | Mastodon | GitHub | Privacy Policy

]]> 2023-10-27T13:00:00-05:00 Sanebox and implementing the Eisenhower Matrix [Sponsor] https://brett.trpstra.net/link/535/16411504/sanebox-and-implementing-the-eisenhower-matrix-sponsor https://brett.trpstra.net/link/535/16411504/sanebox-and-implementing-the-eisenhower-matrix-sponsor SaneBox, email management, Eisenhower Matrix, organized, efficient

总结: SaneBox是一个高级的电子邮件管理工具,通过与Eisenhower Matrix(艾森豪威尔矩阵)的结合,能够帮助用户实现电子邮件的高效整理和组织。通过创建自定义文件夹并将电子邮件分类到不同的象限,SaneBox可以根据用户的喜好和优先级来自动过滤和整理邮件。这种方法使用户能够将电子邮件管理变得有条不紊,从而获得一个独特的个性化电子邮件体验。如果你被一大堆电子邮件淹没,感到压力大,不妨尝试一下SaneBox和Eisenhower Matrix的组合。对于那些希望有一个高效有序的电子邮箱系统的人来说,这是一个值得尝试的选择。

Thanks to Sanebox for sponsoring BrettTerpstra.com again this week! I don’t know what I’d do without it!

Envision your email as a bustling conference hall, filled with diverse attendees. Professional correspondences, casual updates, informative newsletters, enticing promotions, and the occasional unwelcome intruder all vying for your attention. Now, consider a seasoned curator (inspired by the Eisenhower Matrix) coordinating the event, teamed up with an expert organizer (the prowess of SaneBox) to streamline the flow and ensure a harmonious gathering. This is the synergy we’re spotlighting.

SaneBox, our sophisticated digital tool, acquires proficiency much like a dedicated student mastering a new subject. Each interaction with your emails refines its algorithm, enhancing its efficiency. When combined with the strategic principles of the Eisenhower Matrix, which prioritizes tasks based on urgency and significance, you’re presented with a seamlessly integrated email management system.

Let’s get practical. The Custom Folders inside of SaneBox let you decide what’s important to you and where it belongs on the Eisenhower Matrix. Start by creating folders for each quadrant. The traditional Eisenhower Matrix works like this:

  • Urgent and Important (Quadrant I): These are tasks that need immediate attention and are crucial to your goals.
  • Not Urgent but Important (Quadrant II): These are tasks that contribute to your long-term goals and values but don’t require immediate attention.
  • Urgent but Not Important (Quadrant III): These tasks demand your immediate attention but aren’t critical to reaching your long-term goals.
  • Neither Urgent nor Important (Quadrant IV): These are the tasks that provide little to no value and can often be deferred or even deleted.

Once you’ve created your folders (and named them whatever you want), start moving emails into their appropriate places. It won’t take long for SaneBox to learn what’s important to you. Then you can be selective about which folders get attention and when.

But it’s more than just cleaning up. This method helps shape an email experience that feels uniquely yours. Merging the practical approach of the Eisenhower Matrix with SaneBox’s functions, your inbox goes from being chaotic to organized and manageable.

If you’re among those buried under a mountain of emails, feeling the strain, it’s worth trying the combination of SaneBox and the Eisenhower Matrix. And remember, signing up today can even get you a $25 discount on any subscription. Your emails deserve a system that works.

Like or share this post .


BrettTerpstra.com is supported by readers like you. Click here if you'd like to help out.

Twitter | Mastodon | GitHub | Privacy Policy

]]> 2023-10-26T08:00:00-05:00 Introducing the BrettTerpstra.com Forum https://brett.trpstra.net/link/535/16408585/introducing-the-brettterpstra-dot-com-forum https://brett.trpstra.net/link/535/16408585/introducing-the-brettterpstra-dot-com-forum nerdy, forum, projects, interaction, community

总结: 作者创建了一个名为"nerdy"的论坛,目的是为了集中讨论各种项目并增加与读者的互动。作者之前的项目讨论都分散在不同的地方,现在希望通过这个统一的论坛来解决这个问题。作者选择论坛的原因是因为它是异步的,可以按照自己的时间参与讨论,并通过邮件通知了解回复。论坛的网址是forum.brettterpstra.com,作者使用了DigitalOcean和Mailgun来提供托管和通知的服务。此外,作者还将博客评论转移到了论坛上,并邀请读者来参与讨论。最后,作者希望读者能积极参与,并将读者的社群变得更活跃。

I’ve created a forum for discussing all things nerdy, the BrettTerpstra.com Forum. I wanted a place to have conversations about my various projects, but also to allow more interaction with my readers. I’ll be active on it, and I hope you will too.

Right now every one of my projects has different discussion forums, mostly hosted on GitHub, but they’re separated by project and there’s no unified place for support, questions, feature requests, and actual interaction. This is my attempt to consolidate and also increase interaction with the community.

I’m nervous about launching this because I fear nobody will talk and I’ll feel unpopular, but I won’t know until I try. I know, one more place to be active online, one more source of notifications, yet another place to chat. I know we all have too many of these. I chose this format over a Discord server or other synchronous communication because I like that it’s _a_synchronous. You can show up when you feel like it, and just get email notifications about responses to your conversations, waiting until you have the time to add to the discussion.

The forum is at forum.brettterpstra.com. Here’s a special invite link that will get you in and give you immediate access to introduce yourself and join/start a conversation.

I set this up using the Discord droplet on DigitalOcean, which is a very affordable way to host cloud applications, if you’re ever interested in building your own. I’m also using a free account at Mailgun to handle notification emails and such.

I’ve switched the comments on this blog over to using the forum as an embed. Each blog post will create a new topic on the forum, and you’ll be able to discuss and add comments via Discourse. It will require login (you can log in with GitHub or email), but should offer a saner way to handle comments on my posts. Give it a shot on this one and let me know what you think! In the process I’ve lost all comment history, but it is what it is.

I sincerely hope you’ll join, participate, and make a community out of my readership. Don’t be shy. I have 20,000 site viewers, 35,000 RSS subscribers, 13,000 Twitter followers, 2500 Mastodon followers, 9000 GitHub stars, and yet I still have a hard time getting interaction… I’d love to hear from you!

Like or share this post .


BrettTerpstra.com is supported by readers like you. Click here if you'd like to help out.

Twitter | Mastodon | GitHub | Privacy Policy

]]> 2023-10-24T12:14:00-05:00 Scrivener giveaway! https://brett.trpstra.net/link/535/16406637/scrivener-giveaway https://brett.trpstra.net/link/535/16406637/scrivener-giveaway Scrivener, writers, giveaway, licenses, app

总结: 这篇文章介绍了一次赠送活动,提供了3个Scrivener的许可证作为奖品。Scrivener是一款针对作家的终极应用程序,可以帮助组织故事、添加研究文献并提供各种写作支持。它拥有故事组织功能、角色追踪和完整的写作工具,是市面上最全面的写作应用程序之一。这次赠送活动将在10月27日中午12点随机抽取三名获奖者,每人获得一份价值59美元的Scrivener许可证。此外,文章还提到Scrivener被各类作家广泛使用,并不会教你如何写作,而是提供你开始写作和保持写作所需要的一切。在文章最后还提到了BrettTerpstra.com网站以及其他即将进行的赠送活动。

I’m excited to offer the next giveaway, 3 licenses ($59 value each) for Scrivener. Scrivener is the ultimate app for writers. Organize your story, add research, and get to writing with full support for notes, links, footnotes, rich text, Markdown and so much more. With story organization features, character tracking, and a complete set of writing tools, it’s the most fully-fledged writing app you’ll find. Get ready for NaNoWriMo! (By the way, it also integrates well with Marked 2.)

From the developer:

Scrivener is the go-to app for writers of all kinds, used every day by best-selling novelists, screenwriters, non-fiction writers, students, academics, lawyers, journalists, translators and more. Scrivener won’t tell you how to write—it simply provides everything you need to start writing and keep writing.

Check out the Scrivener site for more info.

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

Giveaway ends in...

You need to view this post on brettterpstra.com to enter.

Stay tuned for more giveaways every week through August (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 so you can be the first to know about these!

Like or share this post .


BrettTerpstra.com is supported by readers like you. Click here if you'd like to help out.

Twitter | Mastodon | GitHub | Privacy Policy

]]> 2023-10-23T08:00:00-05:00 iTunesIcon updated https://brett.trpstra.net/link/535/16405699/itunesicon-updated https://brett.trpstra.net/link/535/16405699/itunesicon-updated grabicon.rb, iTunes, app icon, automating giveaways, ImageMagick 抓取 iTunes 中的应用图标需要使用 grabicon.rb 脚本,该脚本可以自动化抓取应用程序的图标并进行处理。脚本支持定义平台(mac、iOS、iPad、iPhone)和图标大小(小、中、大或特定像素尺寸),如果本地应用程序找不到图标,则会在 iTunes 中搜索并返回第一个结果。对于 Mac 平台,可以从 Assets 文件中提取图标以获取更高分辨率的图标。对于 iOS 平台,脚本会自动进行圆角处理和调整图像大小。脚本还提供了多种选项和参数来定制图标的抓取和保存。该脚本作为自动化抓取应用图标的一部分,并且非常实用。 总结:

grabicon.rb 是一个用于从 iTunes 抓取应用图标的脚本工具。这个工具可以根据定义的平台和大小抓取图标。支持的平台有 Mac、iOS、iPad、iPhone,支持的大小有 small、medium、large 或者特定的像素尺寸。在搜索本地应用图标时,如果找不到匹配的图标,则会转而搜索 iTunes 并返回第一个结果。对于 Mac 平台,可以从 Assets 文件中提取图标以获得更高的分辨率。对于 iOS 平台,脚本会自动进行圆角处理和图像调整。脚本提供多种选项来定制图标的抓取和保存。该脚本已经通过 ImageMagick 进行了测试,可以正常工作并提供了很大的实用性。

A long time ago I published a tool called iTunesIcon that would grab an app icon from iTunes. It worked well in its time, but has been mostly broken in recent years. It was designed mostly for writers who were reviewing apps and needed to get an app’s icon for artwork, but could be used by anyone with a need for such things.

As part of automating the giveaways I’m running, I’ve had a need to start grabbing app icons again, so I’ve revived the project. This script requires installing ImageMagick for rounding the corners of iOS icons (brew install imagemagick).

I previously had a shell function called geticonpng that read a local app’s icon file. These days, most local Mac apps tend to store their icons in Assets.car archives, so the default .icns file only has images up to 256 pixels in most cases. I’ve worked around that. And when a local icon can’t be found, I’m falling back to searching iTunes, replicating the behavior of iTunesIcon. This script handles the following:

  • Allow defining platform (mac, iOS, iPad, iPhone)
  • Allow defining size (small, medium, large, or specific pixel dimensions)
  • If the platform is Mac, test for a local copy from which to extract the icon
  • If the platform is iOS or a local Mac app isn’t found, search iTunes and return the first result
  • If the platform is Mac and a local version is found, extract the icon from the Assets file to allow higher resolutions
  • If the platform is iOS, automatically round the corners and resize the image

Here’s the (Ruby) script. It handles all of the above.

Platform can be defined in two ways:

  1. Use the -d DEVICE flag when running the script. This can be ios, iphone, ipad, or mac
  2. Add a modifier to the search terms in the form of @ios, @iphone, @ipad, or @mac, e.g. OmniFocus @ipad

Similarly, size can be defined using:

  1. Use the -s SIZE flag, which can be s(mall), m(edium), or l(arge) or a specific pixel dimension (square), e.g. grabicon.rb -s small OmniFocus
  2. Use a modifier in the search terms in the form of %s(mall), %m(edium), %l(arge) or a specific pixel dimension, e.g. OmniFocus %1024

Modifiers in the search terms override flags given to the script.

If a local copy can be found, the asset will be extracted at any size specified. If searching iTunes, you’re generally limited to 1024px, depending on the assets the app has provided. The nearest icon format will be downloaded, and ImageMagick will convert to specific pixel dimensions. Note that when downloading an iOS icon, the artwork provided is square, so the script will round the corners and add 10% padding around the icon (using ImageMagick) to offer similar dimensions to what Mac icons have or what you see on your iOS device screen.

All options:

Usage: grabicon.rb 'APP NAME/SEARCH TERM' [@PLATFORM] [%SIZE]
       @ and % modifiers override options

OPTIONS:
    -p, --preview                    Show a Quick Look preview after saving
    -s, --size SIZE                  Size to save (small, medium, large, or pixels)
    -d, --device PLATFORM            Platform to search (mac, ios, iphone, ipad)
    -o, --output PATH                Path to save icon to (default ~/Desktop/ICON.png)
    -h, --help                       Display this screen

This is working well for me so far. I’ll publish the rest of the giveaway automation in the future, as it uses some ImageMagick commands I think might be useful to other people. But for now, this is the new iTunesIcon script.

To install the script, save the raw version to a file called grabicon.rb in your PATH, and then run chmod a+x PATH/TO/grabicon.rb. Once that’s done, just run grabicon.rb -h to see available options.

Like or share this post .


BrettTerpstra.com is supported by readers like you. Click here if you'd like to help out.

Twitter | Mastodon | GitHub | Privacy Policy

]]> 2023-10-22T15:27:00-05:00 Automating the giveaways https://brett.trpstra.net/link/535/16394621/automating-the-giveaways https://brett.trpstra.net/link/535/16394621/automating-the-giveaways 自动化、赠品、开发者、订阅、时间跟踪

总结: 这篇文章讲述了作者在博客上进行一系列赠品活动的情况。作者自豪地分享了他建立的令人印象深刻的自动化系统,用于管理赠品活动的各个方面。作者通过一个主YAML文件来管理每个赠品的信息,并使用脚本生成包括赠品公告、电子邮件、中奖者名单等在内的各种组成部分。赠品的实施方式可以是邮件、优惠券或代码,具体取决于开发者的偏好。作者还分享了他使用的各种脚本和工具,以及这些自动化流程带来了巨大的时间节省。最后,作者提到他愿意提供帮助,包括分享代码、免费的咨询以及收费的自定义开发服务。

You may have noticed I’m running a series of giveaways on this blog. Literally every developer I’ve reached out to has been willing to put up 1-10 licenses or 1-year subscriptions for their app, and I’m extremely pleased with the list I’ve put together. In an effort to keep track of all of them, I’ve built some (if I do say so myself) impressive automation around this project, and I thought I’d share. It’s some mad science, but it’s working great and I kinda want to brag about it.

For every giveaway, there are 5 major pieces:

  1. The announcement post containing the form to enter for the drawing, on Monday
  2. An announcement email to subscribers linking to the announcement post, also on Monday
  3. A followup email on Thursday reminding subscribers there’s still time to enter
  4. A drawing of the winners, and notification emails sent to them, on Friday
  5. An announcement post listing the winner’s names and upcoming giveaways, also on Friday

So here’s how it works. I have a master YAML file where each giveaway has the following info:

- app_name: Timing
  contact: [Hookmark link to email conversation with developer]
  dev_email: Daniel Gräfe <REDACTED>
  keywords: [productivity, time tracking, timing]
  dev_link: https://timingapp.com/
  offer: a 1-year subscription ($108 value)
  number_of_prizes: 1
  followup: I guarantee it will be useful for anyone who needs to know where they spend there time, for any reason.
  fulfillment: emails
  giveaway_slug: [secret giveaway slug]
  blurb: >
    I use Timing daily and it's helped me automatically track time that I would never have had the discipline to
    manage on my own. Billable hours, time I spend on personal projects, time I spend gaming, pretty much
    anything I do on my Mac, my iPhone, or my iPad gets tracked and I can easily categorize based on rules
    (that are as easy as dragging and dropping to generate). I even integrated it with
    [Doing](https://brettterpstra.com/projects/doing/) for adding depth to my "What Was I Doing" tracking.
  dev_blurb: >
    Just keep focusing on your work while Timing records your time automatically, then review your time when you
    want to. Record time faster than ever with just a few clicks. See when you worked on what and how
    productive you were.
  screenshot: /uploads/2023/09/timingscreenshot.jpg
  setapp: true

It takes me about 10 minutes to build an entry. I have to write out my personal blurb, get a developer blurb from the website, and generate images including a screenshot (usually pulled from the website and automatically sized and converted by a Hazel script when I save it to my desktop) and a blog header and winner post header1. (Social sharing images and WEBP versions are automatically generated from the header images using RetroBatch.) So that’s the bulk of the creation time.

Slotting a new giveaway in is simply a matter of adding a new entry like above to the YAML array, and I can slot them in at any point and all of the dates will adjust accordingly.

When my giveaways.rb script runs, it goes through this YAML file and generates all of the pieces mentioned above. It has a start date hardcoded for the start of this series, and then for each giveaway entry it adds 7 days, and sets a drawing date for the following Friday. It uses ERB templates to generate the giveaway announcement (including blurbs and screenshot), the two emails, and the winner announcement (including the followup text). The winner announcement, which gets saved to my drafts folder, includes a note letting me know exactly what command to run to execute the drawing, including how many winners to draw, where to pull the fulfillment codes from, etc. The winner announcement is also “hooked” to the conversation with the developer using Hookmark, so I can easily jump back to it. It also creates a list of upcoming giveaways, saved twice, once to a Markdown file with the secret slugs used to populate and query the Firebase database for the drawing, and once to a list that becomes publicly viewable.

The fulfillment key can be one of emails, coupons, or codes, and depends on the developer’s preference for fulfilling the giveaway. If there are coupons or codes, those get a YAML array listing them and they’re written out to an individual YAML file that the Giveaway Robot will read. The Giveaway Robot (the script that does the random picking of entrants) reads the appropriate type of fulfillment file and sends a notification email to each of the winners containing a link, a redeem code, or notification that their email has been shared with the developer (who gets cc’d based on the dev_email setting) who will be in touch with a license.

The emails that are generated are in Markdown format, saved locally. On the week that a giveaway is going to run, I run a script called create_giveaway_emails.rb APP_NAME, where app name is just something like App Tamer or Timing. That will find and render the generated Markdown files, apply my BrettTerpstra.com styling, and use the Sendy API to create and schedule both emails for the week.

All of these moving pieces of this are a lot to track, so the script includes notes at every pertinent point letting me know which script needs to be run, and also generates a calendar entry with an alert that links (Hookmark) to the necessary notes, which literally tell me exactly which command to run and what to do with the output.

There’s a Jekyll plugin that generates and runs the giveaway form. I just include:

{% giveaway SLUG ISO_END_DATE %}

which is generated automatically by the giveaways.rb script in the announcement post, and all entries will go to a Firebase database named for the SLUG. At the end of the giveaway, I just give the same slug to the “robot” and it uses random number generation to pick winners. The robot (run by the command in the winner announcement post note) generates emails to the winners, saves a list of names and emails, and outputs a list of winner names to the Terminal, ready for pasting into the winner announcement post. Actually it also uses pbcopy to put the list right into my clipboard and opens the winner post for pasting…

So, aside from the time it took to build all of this automation, my effort per giveaway is:

  • email discussion with the developer, nailing down number of copies and fulfillment options, 10m elapsed time per giveaway
  • edit the master YAML file with details, 10m
  • run the giveaways.rb script, 5s
  • on Sunday
    • edit and publish the generated giveaway post for the week, 2m
    • run the create_giveaway_emails.rb script to generate the emails, 5s
    • double check the emails and scheduling because I don’t fully trust the automation, 2m
  • on Wednesday
    • share the giveaway reminder to social media, 5m
  • on Friday
    • run the giveaway robot using the command already saved in the winners post, 1m
    • edit the giveaway post with the list of winners returned by the robot, 2m

So, now that the automation is built, it takes me approximately 23 minutes to add and run a giveaway. This would take me at least 3 hours per week if I were doing this manually every time, with the multiple posts, the multiple emails, and the drawing/notification, plus all of the tracking down of previous conversations and handling of codes for every giveaway. So this automation is easily saving me almost 3 hours per giveaway, and with nearly 40 giveaways currently lined up (and growing), that’s almost 120 hours of time saved already. Easily worth the ~8 hours I put into building it.

I doubt all of the scripts behind this will be of use to anyone else as is, but if you want to create any kind of similar automation, I’m available to help. If you just want to see my code to alter on your own, I’ll share it for free, and if you want to hire me to build something out for you, I charge a reasonable hourly fee. If I ever lose my cushy corporate job, this is exactly the kind of thing I would love to freelance on, so keep me in mind for that fateful day.

  1. All of these header images are the same background with an app icon rotated and positioned in the hand of the “giveaway robot,” but I haven’t yet been able to automate the generation of these images. I just need to extract a PNG from the app (easy), then size, rotate, and position it over a static background. RetroBatch can’t do it, so if anyone has any grand ideas, I’d love to hear them. I bet ImageMagick could do this, but I get into rabbit holes when I start looking into it… 

Like or share this post .


BrettTerpstra.com is supported by readers like you. Click here if you'd like to help out.

Twitter | Mastodon | GitHub | Privacy Policy

]]> 2023-10-14T08:00:00-05:00 The Hookmark giveaway winner! https://brett.trpstra.net/link/535/16394031/the-hookmark-giveaway-winner https://brett.trpstra.net/link/535/16394031/the-hookmark-giveaway-winner Hookmark giveaway, winner, congratulations, coupon, upcoming apps 总结: Hookmark赠品活动已经结束,获奖者是Marcus Phelan。如果你没有获胜,可以使用优惠券TTSCOFF在接下来的一周内享受30%的折扣。接下来是其他的应用赠品活动,可以在BrettTerpstra.com上获取更多信息。总的来说,这篇文章主要是宣布了Hookmark赠品活动的获胜者,同时提供了优惠信息和未来的赠品活动预告,希望读者可以关注并参与。

The Hookmark giveaway has ended, and I have a winner to announce!

The winners!

Congratulations to:

  • Marcus Phelan

You should have received an email and the developer will be in touch, please let me know if you didn’t hear anything!

But I didn’t win!

If you didn’t win, sorry, but Hookmark is still worth checking out. It will change the way you work. You can still save 30% off for the next week using coupon TTSCOFF at checkout (click on Add Discount)!

By the way, Hookmark is also available on Setapp, along with hundreds of other amazing apps. You should probably get a subscription.

Next up is TextExpander. Check back every Monday through June for more giveaways.

Other upcoming apps include:

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!

Like or share this post .


BrettTerpstra.com is supported by readers like you. Click here if you'd like to help out.

Twitter | Mastodon | GitHub | Privacy Policy

]]> 2023-10-13T12:35:00-05:00 Hookmark giveaway! https://brett.trpstra.net/link/535/16386371/hookmark-giveaway https://brett.trpstra.net/link/535/16386371/hookmark-giveaway Pro license, Hookmark, giveaway, tool, track Pro license是本文介绍的奖品,Hookmark是一个工具,通过这个工具可以追踪一切,包括链接、笔记、文档和任务。文章宣布的是一次赠品活动,随机抽取一个人获得Hookmark的Pro许可证。Hookmark可以将用户的研究和开发内容连接在一起,并且可以与其他应用程序进行连接。截止日期为10月13日,读者需要在brettterpstra.com上阅读此文章才能参加活动。总结:Pro许可证,赠品活动,用于追踪的工具,与其他应用程序连接,需要在brettterpstra.com上参加活动

I’m excited to offer the next giveaway, a Pro license ($69.99 value) for Hookmark. Hookmark is the ultimate tool for keeping track of all of your stuff. Your links, your notes, your documents, your tasks… Hookmark makes everything linkable and provides easy navigation between related objects. It takes a minute to work it into your workflow, but once you do, you’ll wonder how you lived without it.

From the developer:

Hookmark connects information in and between great apps such as Obsidian, Bookends, Zotero, DEVONthink, Craft, OmniOutliner Pro, Bike, Curio, Marked2, TextMate, Scrivener, Tinderbox, GoodTask, Nisus Writer, Nitro PDF, Skim, Sketch, Bike, OmniGraffle, HoudahSpot, LibreOffice, MailMate, Airmail, Apple Mail, Word, Excel, Powerpoint, BBEdit, Things and many more. Hookmark links your research and development!

Check out the Hookmark site for more info.

Sign up below to enter. A winner will be randomly drawn on Friday, October 13, at 12pm Central. The drawing is for a Pro license ($69.99 value) for Hookmark. Note that if you’re reading this via RSS, you’ll need to visit this post on brettterpstra.com to enter!

Giveaway ends in...

You need to view this post on brettterpstra.com to enter.

Stay tuned for more giveaways every week through April (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 so you can be the first to know about these!

Like or share this post .


BrettTerpstra.com is supported by readers like you. Click here if you'd like to help out.

Twitter | Mastodon | GitHub | Privacy Policy

]]> 2023-10-09T08:00:00-05:00 Marked and Bear https://brett.trpstra.net/link/535/16385532/marked-and-bear https://brett.trpstra.net/link/535/16385532/marked-and-bear Marked, Bear compatibility, Sonoma, custom preprocessor, syntax handling.

总结: 这篇文章介绍了最近发布的Marked版本修复了与Bear兼容性的问题,并提供了一个定制的预处理器来处理Bear语法。通过使用Bear样式和预处理器,用户可以在Marked中获得与Bear相同的预览样式,也可以选择自定义样式。用户可以按照文章提供的步骤来安装Bear样式和预处理器。文章还介绍了如何处理Bear特定的语法,并提供了相应的代码示例。最后,文章提到了可能将来直接在Marked中添加对Bear语法的支持的可能性。

Recent releases of Marked have fixed Bear compatibility on Sonoma. As part of this, I’ve updated the Bear style for Marked, and written a little custom preprocessor to handle Bear’s (CommonMark) syntax properly. If you want a Marked preview styled to look exactly like Bear (with all of Marked’s options for export, navigation, and other features), you can use the Bear style in combination with the preprocessor, but if you just want Bear’s syntax properly interpreted, you can use the preprocessor with the style of your choosing1.

To get the Bear style, go the the Style Gallery and open the Bear style. Click “Install” to add it to Marked in one click.

For the custom preprocessor to work, you’ll need Ruby available on your system. As far as I know, Ruby is still distributed with macOS (for now), and if you open Terminal and run which ruby, you should get a path back, e.g. /usr/bin/ruby. If this isn’t the case for you and you need further help, please post on the support forum and I’ll update the instructions as needed.

For handling Bear’s specific syntax, like [[links]], underlining, and strikethrough, you’ll need a custom preprocessor. Save the following to a file called bear-preprocessor.rb in a safe folder (one you won’t move in the future).

#!/usr/bin/env ruby
# frozen_string_literal: true

require 'cgi'

input = $stdin.read.force_encoding('utf-8')

input.gsub!(/\[\[(?<content>.*?)\]\]/) do
  m = Regexp.last_match
  title = CGI.escape(m['content']).gsub(/\+/, '%20')
  callback = CGI.escape("bear://x-callback-url/create?title=#{title}").gsub(/\+/, '%20')
  "[#{m['content']}](bear://x-callback-url/open-note?title=#{title}&x-error=#{callback})"
end

input.gsub!(/==(.*?)==/, '<mark>\1</mark>')

input.gsub!(/~~(.*?)~~/, '<del>\1</del>')

input.gsub!(/~(.*?)~/, '<span class="underline">\1</span>')

puts input

Open terminal and run chmod a+x /path/to/file/bear-preprocessor.rb. That will make it executable, then you can just add /path/to/file/bear-preprocessor.rb as your custom preprocessor path in Marked->Advanced preferences. (To get the absolute path for a file, right click it in Finder, hold down Option, and click ‘Copy “bear-preprocess.rb” as Pathname’. That will put the absolute path to the file in your clipboard, which you can paste for both the chmod command and the Custom Preprocessor field.)

This script will convert [[wiki links]] into Bear internal links, which will open linked notes in Bear when clicked, and handle special cases like ~~strikethrough~~, ~underline~, and ==highlighting==`.

In addition, you’ll want to set your Processor to MultiMarkdown and enable “#Text is tag” and the sub-item “Style tags” in Preferences->Processor. Note that the #tag processing will only work if you’re not using a custom processor (custom preprocessor like above won’t override it).

If you need additional help setting this up, just ping me on http://support.markedapp.com.

If you’re using a non-Bear Style and want underlines formatted, you can modify a custom Style or add the following to Marked->Preferences->Style->Additional CSS and modify as desired:

.underline {
border-bottom: 1px solid rgb(222, 84, 86);;
}

I might eventually add support for Bear (CommonMark) syntax directly to Marked, but the whole purpose of the preprocessor functionality was to handle cases like this, and linking to Bear documents internally should be a case-by-case decision. The same part of the custom preprocessor that handles [[links]] could be repurposed for any system that allows internal [[linking]] and has a url handler syntax (like nvUltra, which I’ll post a preprocessor for when it’s available2, or Obsidian). You can also always set up CommonMark as a custom processor to get full compatibility.

  1. It won’t include underline styling unless you add it to your Style, as detailed below 

  2. you don’t believe me at this point, which is fully understandable, but it really is coming. 

Like or share this post .


BrettTerpstra.com is supported by readers like you. Click here if you'd like to help out.

Twitter | Mastodon | GitHub | Privacy Policy

]]> 2023-10-08T17:31:00-05:00 The Timing giveaway winner! https://brett.trpstra.net/link/535/16383214/the-timing-giveaway-winner https://brett.trpstra.net/link/535/16383214/the-timing-giveaway-winner Timing, giveaway, winner, email, apps

总结: 本文是关于Timing抽奖活动的结果公布,其中获奖者Scott Willsey将收到邮件并得到开发者联系。文章提到Timing可帮助人们了解自己的时间使用情况,并推荐了其他一些优秀的应用。接下来是每周一次的抽奖活动,并可以提出对其他应用的建议。

The Timing giveaway has ended, and I have a winner to announce!

The winners!

Congratulations to:

  • Scott Willsey

You should have received an email and the developer will be in touch, please let me know if you didn’t hear anything!

But I didn’t win!

If you didn’t win, sorry, but Timing is still worth checking out. I guarantee it will be useful for anyone who needs to know where they spend there time, for any reason.

By the way, Timing is also available on Setapp, along with hundreds of other amazing apps. You should probably get a subscription.

Next up is Hookmark. Check back every Monday through April for more giveaways.

Other upcoming apps include:

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!

Like or share this post .


BrettTerpstra.com is supported by readers like you. Click here if you'd like to help out.

Twitter | Mastodon | GitHub | Privacy Policy

]]> 2023-10-06T13:00:00-05:00 Marked and Bunch updates for Sonoma https://brett.trpstra.net/link/535/16381661/marked-and-bunch-updates-for-sonoma https://brett.trpstra.net/link/535/16381661/marked-and-bunch-updates-for-sonoma Marked, Bunch Beta, fixes, Sonoma, updates

总结: 这篇文章简要介绍了Marked和Bunch Beta的更新情况,这些更新主要解决了Sonoma上的问题,并修复了一些功能失效的情况。文章提到,Marked更新已经在直接购买渠道上线,并在Setapp和Mac App Store上进行审核中,而Bunch Beta版本的更新则主要修复了Sonoma上的问题,并且需要用户的反馈确认功能是否正常。

Just a quick note to let you know that there are new versions of Marked and Bunch Beta with some fixes for Sonoma.

The Marked update is live for direct customers, and in review for Setapp and Mac App Store customers. Watch for updates on your channel. It fixes an issue that prevented Marked from opening any files on Sonoma, and also crashes when using with Drafts’ or Bear’s “Preview in Marked” features. It should solve the issue for all versions of macOS.

The Bunch update is specifically to fix modifier keys not working when clicking Bunches in the menu. E.g. you’re supposed to be able to Cmd-Click a Bunch and open the text file in your editor of choice instead of launching it, and this wasn’t working anymore. The current release of the Beta should solve it. I would love some feedback on whether it’s working for you on Sonoma, and additionally whether I broke it for people on earlier versions of macOS. If the fix is solid, I’ll release it to the main channel. You can download the beta on the Downloads page.

Thanks for any feedback!

Like or share this post .


BrettTerpstra.com is supported by readers like you. Click here if you'd like to help out.

Twitter | Mastodon | GitHub | Privacy Policy

]]> 2023-10-05T12:11:00-05:00 Dropzone 4, the essential drag & drop productivity enhancer [Sponsor] https://brett.trpstra.net/link/535/16381391/dropzone-4-the-essential-drag-and-drop-productivity-enhancer-sponsor https://brett.trpstra.net/link/535/16381391/dropzone-4-the-essential-drag-and-drop-productivity-enhancer-sponsor Dropzone, Mac, productivity, shortcuts, drag-and-drop

总结: Dropzone是一个用于Mac的应用程序,它通过简化拖放操作,提高用户的日常工作效率。用户可以将常用操作设置为快捷方式,然后通过将文件拖放到相应的快捷图标上,执行保存的操作。Dropzone还具有许多自定义功能,用户可以根据自己的需求创建适合自己日常工作流程的快捷方式。此外,Dropzone还支持将文件上传到各种云服务,并提供扩展插件支持。现在,读者可以通过使用折扣码获取Dropzone 4 Pro终身许可证享受15%的折扣。

Thanks to Dropzone for sponsoring BrettTerpstra.com this week! I’ve been a Dropzone fan for many years now, and use it daily for everything from processing images to sharing files via my S3 account.

Dropzone brings everyday productivity shortcuts to your Mac. Set up your frequently used actions in the Dropzone interface, then simply drag and drop files into the shortcut icons to perform your saved actions. Move, copy, and share files in an instant, or even develop your own timesaving actions.

🚀 Drag-and-Drop Simplicity: Dropzone 4 lets you effortlessly drag and drop files and folders to your most-used destinations, whether it’s a specific folder, cloud service, or application. It will turbocharge drag & drop and help you get things done faster.

📁 Customizable Actions: Tailor Dropzone 4 to your unique needs with a plethora of customizable actions. Create workflows that suit your daily routine, from resizing images or shortening URLs to sending files via email, all with a simple drag-and-drop.

🗃️ Stash files for later: Drop Bar allows you to keep files handy you know you’ll need later, instead of having to dig them up from their folders. Simply drop files into Dropzone’s holding area, and they’ll stay put until you’re ready to use them again. The holding area is a feature you won’t want to give up, proving incredibly useful for putting together documents that pull in from many sources.

🌐 Cloud Integration: Upload to your favorite cloud services like Imgur, Google Drive, YouTube, SFTP servers and many more.

🧩 Extensive Plugin Support: Expand Dropzone 4’s capabilities with our library of actions available from aptonic.com/actions

🌟 Updated and improved for macOS Sonoma

Ready to supercharge your Mac experience? Join the thousands of satisfied users who have already discovered the magic of Dropzone 4. Download it today and transform the way you use drag & drop on your Mac.

For a limited time for BrettTerpstra.com readers, we’re also offering a 15% discount off a Dropzone 4 Pro Lifetime License with the coupon code BRETTTERPSTRA. Click here to receive the discount.

Like or share this post .


BrettTerpstra.com is supported by readers like you. Click here if you'd like to help out.

Twitter | Mastodon | GitHub | Privacy Policy

]]> 2023-10-05T08:00:00-05:00 Timing giveaway! https://brett.trpstra.net/link/535/16374917/timing-giveaway https://brett.trpstra.net/link/535/16374917/timing-giveaway giveaway, 1-year subscription, Timing, time tracking, productivity

总结: 这篇文章介绍了一项抽奖活动,奖品是一年期的订阅费用为108美元的Timing软件。该软件可以自动追踪时间,帮助用户记录工作时间、个人项目时间、游戏时间等,并且可以根据规则进行分类。文章还介绍了Timing的功能和优势,鼓励读者参与抽奖活动。

I’m excited to offer the next giveaway, a 1-year subscription ($108 value) for Timing. I use Timing daily and it’s helped me automatically track time that I would never have had the discipline to manage on my own. Billable hours, time I spend on personal projects, time I spend gaming, pretty much anything I do on my Mac, my iPhone, or my iPad gets tracked and I can easily categorize based on rules (that are as easy as dragging and dropping to generate). I even integrated it with Doing for adding depth to my “What Was I Doing” tracking.

From the developer:

Just keep focusing on your work while Timing records your time automatically, then review your time when you want to. Record time faster than ever with just a few clicks. See when you worked on what and how productive you were.

Check out the Timing site for more info.

Sign up below to enter. A winner will be randomly drawn on Friday, October 06, at 12pm Central. The drawing is for a 1-year subscription ($108 value) for Timing. Note that if you’re reading this via RSS, you’ll need to visit this post on brettterpstra.com to enter!

Giveaway ends in...

You need to view this post on brettterpstra.com to enter.

Stay tuned for more giveaways every week through April (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 so you can be the first to know about these!

Like or share this post .


BrettTerpstra.com is supported by readers like you. Click here if you'd like to help out.

Twitter | Mastodon | GitHub | Privacy Policy

]]> 2023-10-02T08:00:00-05:00 Historical weather for Journal CLI https://brett.trpstra.net/link/535/16373194/historical-weather-for-journal-cli https://brett.trpstra.net/link/535/16373194/historical-weather-for-journal-cli 更新、命令行日志工具、历史天气数据、月相、数据收集、心情信息、翻译等

总结: 这篇文章介绍了命令行日志工具的更新内容,包括可以添加过去日期的自然语言参数,获取历史天气数据,以及跟踪月相等功能。作者对工具的使用感到满意,并愿意帮助他人提供更多帮助。

I pushed a couple updates to Journal, my command line journaling tool today.

As a reminder, you can add a natural language argument to your journal command which will set the date of the entry, e.g. journal mood "yesterday 8pm". This allows you to create entries in post with historical data you might have missed. One thing that it didn’t do well, though, is to get the correct weather for any weather type questions in the journal when using past dates. This latest update is able to get historical weather data and insert it correctly in the entry. No changes required for the user, just enter a past date and Journal will figure it out.

Second, I’ve noticed my mood and sleep shifts with the moon phase. I’m not into astrology or anything, but that seemed like useful data to track and start to draw better conclusions from. So now a question type of weather.forecast will include the moon phase as a moon_phase key, and you can use weather.moon to get just the moon phase for its own entry. The forecast in Markdown will also now include the moon phase.

That’s it, just tying up some loose ends. Journal is working pretty well for me to collect data and provide my therapist with detailed mood/behavior information. Let me know if there’s anything it doesn’t do that might help you out!

The latest version can be installed with gem install journal-cli. Visit the Journal project page for more info.

Like or share this post .


BrettTerpstra.com is supported by readers like you. Click here if you'd like to help out.

Twitter | Mastodon | GitHub | Privacy Policy

]]> 2023-09-30T11:11:00-05:00 The CleanShot X giveaway winners! https://brett.trpstra.net/link/535/16372125/the-cleanshot-x-giveaway-winners https://brett.trpstra.net/link/535/16372125/the-cleanshot-x-giveaway-winners CleanShot X giveaway, winners, app for screenshots, automatic time tracking, upcoming apps

总结: 这篇文章宣布了CleanShot X赠品活动的获奖者,并推荐了一些其他值得注意的应用程序。同时,还提到了接下来的自动时间跟踪应用程序以及如何提前获得早期访问权限。

The Winners

The CleanShot X giveaway has ended, and I have three winners to announce!

Congratulations to:

  • Scott Rychnowski
  • Darren Everden
  • David Brown

Each winner should have received an email with a redeem link/code, please let me know if you didn’t hear anything!

But I Didn’t Win!

If you didn’t win, sorry, but CleanShot X is still worth checking out. It’s by far the best app for screenshots on the Mac, no matter where or how you’re using them.

You should also consider a subscription to Setapp, which will include CleanShot X among a couple hundred other amazing apps.

Coming Soon

Next up is Timing (the perfect app for automatic time tracking on Mac). Check back every Monday through December for more giveaways. Upcoming apps include:

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 early access!

Like or share this post .


BrettTerpstra.com is supported by readers like you. Click here if you'd like to help out.

Twitter | Mastodon | GitHub | Privacy Policy

]]> 2023-09-29T12:00:00-05:00 Automatically sort emails to custom folders with Sanebox [Sponsor] https://brett.trpstra.net/link/535/16369625/automatically-sort-emails-to-custom-folders-with-sanebox-sponsor https://brett.trpstra.net/link/535/16369625/automatically-sort-emails-to-custom-folders-with-sanebox-sponsor SaneBox, email clutter, custom folders, personalized email experience, adaptive technology

总结: SaneBox是一个强大的电子邮件管理工具,通过其自定义文件夹功能,用户可以根据自己的喜好和优先级来将邮件分类整理,从而创造一个个性化的电子邮件体验。这个功能的灵活性使用户能够根据工作习惯和优先级自由自在地组织邮件,提高工作效率。SaneBox的自适应技术将用户置于核心位置,为用户提供更高效、个性化的邮件管理服务。如果您还在为杂乱的收件箱而烦恼,不妨尝试一下SaneBox的自定义文件夹功能吧。

Thanks to Sanebox for sponsoring BrettTerpstra.com again this week! I just trained 3 new senders into custom Sanebox folders today (just by moving an email from them once) and will never have to see them in my Inbox again, and will be able to easily locate them when I do want to see them. It’s so easy!

SaneBox is once again under the spotlight for their cutting-edge solutions to the age-old problem of email clutter. Having earned the endorsement of seasoned professionals, it’s worth diving deeper into another feature that makes SaneBox the power tool for email management. One feature that is particularly enchanting? Custom Folders.

Imagine this: You receive countless emails daily from various sources. Newsletters from your favorite brands, updates from work, personal emails, bulk offers, and then, those pesky spam mails. Now, think of an assistant who not only sorts your emails but also does it exactly how you would. That means keeping in mind your unique preferences and priorities. That’s what SaneBox’s Custom Folder feature offers.

At the core of SaneBox is its learning ability. For example, as you shuffle emails in and out of folders like @SaneLater or @SaneBlackHole, SaneBox observes. Over time, it finds patterns in your preferences and ensures similar emails find their rightful place automatically in the future. It’s like training your dog to fetch. Once it learns which toy is its favorite, it fetches it every single time.

One particularly intriguing aspect of this feature is the flexibility it offers. Let’s say you’re working on a project, and you want all communications about it to be in one place. Simply create a Custom Folder named “@ProjectX.” As you get emails related to the project, drag a few to the new folder, and then SaneBox will quickly learn to play fetch.

The beauty of SaneBox’s Custom Folder feature lies in its adaptability. It’s not just about categorizing. It’s about creating an email ecosystem that aligns with your work habits and priorities. The more seamless a process is, the more likely you’ll be to use it. So that adaptability is critical.

In essence, SaneBox’s Custom Folder feature is more than just about organization. It’s about crafting a personalized email experience. It’s a testament to how adaptive technology can be when it’s designed with the user at its core.

If you’re still juggling with emails and feeling the stress of a cluttered inbox, perhaps it’s time to give SaneBox’s Custom Folder feature a try. And remember, signing up today can even get you a $25 discount on any subscription. Make your email work for you, not the other way around!

Like or share this post .


BrettTerpstra.com is supported by readers like you. Click here if you'd like to help out.

Twitter | Mastodon | GitHub | Privacy Policy

]]> 2023-09-28T08:00:00-05:00 Web Excursions for September 26, 2023 https://brett.trpstra.net/link/535/16366906/web-excursions-for-september-26-2023 https://brett.trpstra.net/link/535/16366906/web-excursions-for-september-26-2023 Snailed It, Rosemary Orchard, apps, Alex Hay, passing Dr. Drang, Apple Backblaze, drive stats report, SSD edition, hard drive reliability ffmpeg BrettTerpstra.com, readers, support 总结:

Snailed It接管了Alex Hay开发的几个应用程序,这些应用程序将得到关爱和照顾。Dr. Drang对Apple的技术痴迷让人爱不释手。Backblaze发布了半年一次的驱动统计报告(SSD版),他们收集的硬盘可靠性数据令人印象深刻。我从未知道ffmpeg可以做到这一点。BrettTerpstra.com得到读者的支持。

Web excursions brought to you in partnership with MindMeister, the best collaborative mind mapping software out there.

Toolbox Pro, Logger for Shortcuts, and Nautomate
Snailed It, run by my friend Rosemary Orchard, has taken custody of several apps developed by Alex Hay after his tragic passing last March. They’re in good hands, and will see the love he would want them to.
iPhone 15 Pro facts and estimates
I love it when Dr. Drang nerds out about Apple stuff.
The SSD Edition: 2023 Drive Stats Mid-Year Review
The semi-annual drive stats report from Backblaze is out (SSD edition). I love the amount of data they collect on hard drive reliability.
Adding sound wave overlays to videos and pictures using FFMPEG | Christian Heilmann
I did not know ffmpeg could do this. Thanks, Christian!

Check out MindMeister and start brainstorming, collaborating, and boosting productivity.

Like or share this post .


BrettTerpstra.com is supported by readers like you. Click here if you'd like to help out.

Twitter | Mastodon | GitHub | Privacy Policy

]]> 2023-09-26T13:44:00-05:00 CleanShot X giveaway! https://brett.trpstra.net/link/535/16364871/cleanshot-x-giveaway https://brett.trpstra.net/link/535/16364871/cleanshot-x-giveaway Mac apps, screenshot/recording app, elegant, giveaway, Brett Terpstra.com

总结: 这篇文章介绍了一款被作者认为是过去几年中最好的Mac应用程序,它是一款功能强大的屏幕截图/录制应用程序,同时还具备高度优雅的设计。作者还提供了三个价值29美元的许可证的赠品活动。

I’m super excited about this one, as I consider CleanShot X to be one of the best Mac apps developed in the last few years. Hands down the best screenshot/recording app, but also just a highly elegant app all around.

Note that if you’re reading this via RSS, you’ll need to visit the site to enter! Check out the CleanShot X website for more details on this amazing app.

I have three licenses ($29 value) to offer to BrettTerpstra.com readers. Sign up below and I’ll draw random winners on Friday, September 29th.

Giveaway ends in...

You need to view this post on brettterpstra.com to enter.

Stay tuned for more giveaways every week through December (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 so you can be the first to know about these!

Like or share this post .


BrettTerpstra.com is supported by readers like you. Click here if you'd like to help out.

Twitter | Mastodon | GitHub | Privacy Policy

]]> 2023-09-25T08:00:00-05:00 The Tap Forms giveaway winners! https://brett.trpstra.net/link/535/16361586/the-tap-forms-giveaway-winners https://brett.trpstra.net/link/535/16361586/the-tap-forms-giveaway-winners Tap Forms, giveaway, winners, database app, coupon 总结: 这篇文章宣布了Tap Forms的抽奖结果,同时还提供了一个以30%折扣购买直接版本的优惠券。文章还预告了接下来几周的抽奖活动,并鼓励读者在社交媒体上分享该帖子。

The Winners

The Tap Forms giveaway has ended, and I have two winners to announce!

Congratulations to:

  • Jonathan Laniado
  • Doug Lionetti

(I swear the giveaway robot has no preference for last names starting with L. It’s purely chance.)

Each winner should have received an email with a redeem link/code, please let me know if you didn’t hear anything!

But I Didn’t Win!

If you didn’t win, sorry, but Tap Forms is still worth checking out. You can easily store and work with any kind of data. It’s the missing database app for Mac and iOS. If you didn’t win, you can still save 30% on the direct version with the coupon BRETT-TF5-2023. Go to the site and click the Buy Now for Mac button to use the coupon, or download the free trial version and enter the coupon when using the in-app purchase.

Coming Soon

Next up is CleanShot X (the best screenshot app there is). Check back every Monday through December for more giveaways. Upcoming apps include:

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 early access!

Like or share this post .


BrettTerpstra.com is supported by readers like you. Click here if you'd like to help out.

Twitter | Mastodon | GitHub | Privacy Policy

]]> 2023-09-22T13:00:00-05:00 Journal updates with weather types and conditional questions https://brett.trpstra.net/link/535/16357253/journal-updates-with-weather-types-and-conditional-questions https://brett.trpstra.net/link/535/16357253/journal-updates-with-weather-types-and-conditional-questions journal-cli, 更新, 特性, 条件, bug fixes.

总结: 这篇文章介绍了 journal-cli 的更新内容,包括新特性和 bug 修复。用户现在可以根据指定的条件来确定是否提问,并且可以添加不同类型的天气数据。还提到了一些 bug 修复和一些使用上的注意事项。

In case you missed it, I recently released Journal, a CLI for keeping a journal with structured data that can be queried and analyzed. An update is live with a couple of nifty new features.

First, instead of just a type of weather for a question (which inserts the current condition and daily forecast), you can now specify sub-types of weather.current and/or weather.forecast. This outputs separate data entries to the JSON, and creates individual answers in the Markdown/Day One versions. You can still just use weather as the type to insert all data.

Second, you can now apply conditions to questions to determine whether they’ll be asked or not when creating an entry. Right now only time-based conditions are implemented, but I plan to add some functionality around basing a question’s appearance on the answer to a previous question, like “if health rating is less than 5, display the health notes question.” But for now you can add condition: before noon or condition: > 2pm to any question or section to only display the question(s) at certain times of day.

I needed these conditions because I like to create a mood entry in the morning with data about sleep and coffee, and in the evening I don’t want to repeat that data, but do want to ask some different questions about how the day went. I could create two separate journals for these, but this way I can compile all of my data in one file. Questions that are skipped get a null entry in the JSON, so when I’m parsing I just test for nil and skip entries that don’t contain the information I’m trying to output. Unanswered questions don’t get added to the Markdown/Day One entries at all.

This release includes a couple of bug fixes as well. I recently removed the requirement for the gum CLI, if it doesn’t exist it will now just use Readline for input. When using the gum inputs, you can’t CTRL-c to cancel an entry, which I’m trying to figure out a way around right now.

Update using gem install journal-cli. Visit the project page for more info and installation instructions.

Like or share this post .


BrettTerpstra.com is supported by readers like you. Click here if you'd like to help out.

Twitter | Mastodon | GitHub | Privacy Policy

]]> 2023-09-20T09:46:00-05:00 Tap Forms for Mac giveaway! https://brett.trpstra.net/link/535/16354183/tap-forms-for-mac-giveaway https://brett.trpstra.net/link/535/16354183/tap-forms-for-mac-giveaway BrettTerpstra.com, giveaways, Tap Forms, Mac version, free licenses

总结: BrettTerpstra.com开始了免费赠品活动,其中包括两个免费的Tap Forms for Mac许可证。Tap Forms是一款出色的数据库产品,可以让您在任何设备上组织和访问数据。此次赠品活动专为Mac版本而设。参与者需在指定时间内报名参加,赢家将有机会节省50美元购买费用。此活动是系列活动中的第一款免费软件赠品,将会有更多开发者提供免费软件,敬请期待。

I’m starting up giveaways again on BrettTerpstra.com, and I’m exited to kick it off with 2 free licenses for Tap Forms for Mac. It’s an amazing database product that lets you organize and access your data on any device. It’s available on Mac, iPhone, iPad and even Apple Watch. This giveaway is specifically for the Mac version.

From the developer:

Accounts, recipes, expenses, inventory — life is full of things that we don’t want to forget or misplace. Tap Forms helps you organize all kinds of things in one place — secure, searchable, and accessible on your Mac, iPhone, iPad, and Apple Watch.

Check out the Tap Forms site for more info.

Sign up below to enter. Two winners will be randomly drawn on Friday, Sept 22, at 12pm Central. Tap Forms for Mac costs $49.99, so this is a great chance at saving $50!

Giveaway ends in...

You need to view this post on brettterpstra.com to enter.

I reached out to my mailing list to see what products people were interested in, and Tap Forms was a top pick. I have several more developers lined up to offer free stuff, so stay tuned. If you have an app you’d love to see featured, let me know. Also be sure to sign up for the mailing list so you can be the first to know about these!

Like or share this post .


BrettTerpstra.com is supported by readers like you. Click here if you'd like to help out.

Twitter | Mastodon | GitHub | Privacy Policy

]]> 2023-09-18T08:00:00-05:00 A silly Jekyll plugin and a big Marked sale https://brett.trpstra.net/link/535/16349238/a-silly-jekyll-plugin-and-a-big-marked-sale https://brett.trpstra.net/link/535/16349238/a-silly-jekyll-plugin-and-a-big-marked-sale Jekyll plugin, countdown, 40% off sale, coupon, September 16th,

总结: 这篇文章介绍了一个Jekyll插件,可以用来实现倒计时功能。作者通过插件创建了一个倒计时,用于促销活动。文章中提到了一个40%折扣销售,截止日期是9月16日,使用特定的优惠码可以享受折扣优惠。

So, a long time ago I wrote this Jekyll plugin that does countdowns and I don’t think I ever really used it. You just give it an end date and it inserts a countdown into the post. But I needed something to count down to, so I’m running a 40% off Marked sale using the coupon COOLPLUGINBRO until Saturday, September 16th. Here’s your countdown:

Sale ends in...

Did it work? I hope so. Use this link to apply the coupon directly, or enter COOLPLUGINBRO at checkout. Learn more about Marked at marked2app.com.

Like or share this post .


BrettTerpstra.com is supported by readers like you. Click here if you'd like to help out.

Twitter | Mastodon | GitHub | Privacy Policy

]]> 2023-09-14T13:14:00-05:00 So you think you know productivity? [Sponsor] https://brett.trpstra.net/link/535/16348948/so-you-think-you-know-productivity https://brett.trpstra.net/link/535/16348948/so-you-think-you-know-productivity TextExpander, productivity methods, boost productivity, text expansion, save time. 总结: 本文介绍了TextExpander这一工具赞助BrettTerpstra.com网站,并提到了它可以帮助节省时间、提高生产力的特点。文章还列举了20种不同的生产力方法,包括番茄工作法、80/20法则和时间分块等,并介绍了TextExpander如何帮助用户在各行各业中提高工作效率。最后,文章提到了TextExpander的免费试用期和折扣码。通过text expansion,可以快速输入长文本,有助于节省时间和提高工作效率。

Thanks to TextExpander for sponsoring BrettTerpstra.com this week! I can’t count the number of hours I save using TextExpander. Oh wait, I can, because they email you a report every week to let you know…

So you think you know productivity? Can you name 20 different productivity methods?

Maybe you’ve heard of the Pomodoro method, the 80/20 rule, or time blocking, but have you heard of Eat the Frog? Have you set SMART goals for 2024? Ever developed an Eisenhower Matrix?

Over at the TextExpander blog, we’ve cataloged 20 of these productivity habits. There are lots of ways to boost your productivity.

One of the best ways to boost your productivity is through text expansion. Type something short and get something long. Do you find yourself writing the same emails repeatedly? Why? Let TextExpander handle it and save yourself hours and even days every year.

And that applies to pretty much every industry that involves typing:

TextExpander can handle short messages, emails, code, or pretty much any text you can throw at it, including formatted text and hyperlinks.

Try it out free for 30 days. Check out TextExpander today and get 20% off using the code TERPSTRA.

Like or share this post .


BrettTerpstra.com is supported by readers like you. Click here if you'd like to help out.

Twitter | Mastodon | GitHub | Privacy Policy

]]> 2023-09-14T08:00:00-05:00 Journal and integrations https://brett.trpstra.net/link/535/16342944/journal-and-integrations https://brett.trpstra.net/link/535/16342944/journal-and-integrations 日期类型、字典类型、集成应用、JSON格式、功能扩展

总结: 本文介绍了对Journal软件的功能改进,包括日期类型和字典类型的定义,以及与Obsidian等应用的集成。通过引入YAML数据,可以更好地控制结构化数据,便于构建分析工具。此外,文章还提到了版本更新和软件安装方法。

I’ve made some changes to Journal (I didn’t mess with the data format this time) that add some functionality and will maybe help with integrating with some apps like Obisidian.

First, you can now define a date type. Date entries will be parsed from natural language into date objects, so on the command line you can enter something like “yesterday 5pm” or “july 20 12pm” and get a proper date object added to your JSON and Markdown entries. Great for things like logging book review dates, workout days, etc.

You can also now define a dictionary type for a question, which along with a key definition creates a nested data set with any dot notation keys that match. So you can define the following:

mood:
  sections:
  - title: "Status"
    key: status
    questions:
      - key: health
        type: dictionary
      - key: health.rating
        type: numeric
        prompt: Health Rating
        min: 1
        max: 10
      - key: health.notes
      type: multiline
        prompt: Health Notes

The data that gets output will include this format in the JSON:

{
  "mood": {
    "status": {
      "health": {
        "rating": 5,
        "notes": "Just some notes on my health"
      }
    }
  }
}

This allows for more control over the structured data. It won’t be a big deal for most people as answers were already nested within section keys and could be grouped using dot syntax, this just allows the structure to go one level deeper which may help with building analytics tools.

The big change that will allow more integrations with apps like Obsidian is that all numeric and date answers are now included as YAML front matter in any individual Markdown files created. This will allow integration with existing tools like Obsidian Dataview, which allows you to create data views based on YAML data in your Obsidian notes. By pointing Journal to your Vault folder, you can have journal entries added to your vault and queryable with Dataview. I haven’t tested this, I just noted that it should be possible with the addition of the YAML data. For the time being I’m not including any string responses in the YAML, as that seems redundant since they’re also included in the body text and available to search.

This update won’t affect data saved to single Markdown files or added to Day One. If you have any ideas about how this could be made more useful, please let me know! Either via the Discussions or by contacting me directly.

Version 1.0.19 is out now, just install or upgrade with gem install journal-cli. See the project page for more details.

Like or share this post on Mastodon or .


BrettTerpstra.com is supported by readers like you. Click here if you'd like to help out.

Twitter | Mastodon | GitHub | Privacy Policy

]]> 2023-09-11T11:10:00-05:00 More na updates https://brett.trpstra.net/link/535/16340947/more-na-updates https://brett.trpstra.net/link/535/16340947/more-na-updates Command line tool, na, theming, new commands, changelog, TaskPaper files.

总结: 这篇文章介绍了命令行工具na的最新版本更新,包括了主题设置、新的命令和修复的问题等内容。na是一个用于读取和修改TaskPaper文件的工具。更新后的na版本增加了主题设置功能,使得用户可以自定义操作的颜色输出。此外,还添加了一些新的命令和改进,以及修复了一些问题。详细的更新内容可以在文章的changelog中查看。

I’ve put some more time into both Journal and na. The latest version of na represents quite a few hours of tinkering. See the na project page for full details. In case you’ve missed in previously, na is my command line tool for reading and modifying TaskPaper files in your projects.

I think the biggest thing I’ve added is theming. You can now control the colorized output of your actions using a file at ~/.local/share/na/theme.yaml. That file is automatically written by na if it runs and it doesn’t exist, and once it’s there, it should be pretty self explanatory. You can use {y} type placeholders (that would make the following text yellow, a full list of color abbreviations is at the top of the file), and you can also use {#RGB} and {#RRGGBB} codes to get specific colors outside of the usual ANSI coloring.

I’ve added new commands like tag (see na help tag), and a new --restore option to several commands for removing the @done tag from actions. There’s also a --replace flag you can tie into na update --search SEARCH_STRING --replace REPLACE_STRING to perform (wildcard-compatible) search and replace. Add --regex to do a regex search and replace.

There’s a bunch of other new stuff, so I’ll just post the collected changelog.

NEW

  • Global option --include_ext can be configured to use full extension when displaying filenames, allowing for command-clicking to open in compatible terminals
  • Tag command
  • Add --save NAME to na next to save more complex queries and run with na saved NAME (or just na NAME)
  • na saved --select flag to allow interactive selection of search(es)
  • Open the todos database in an editor with na todos --edit
  • A theme file is written to ~/.local/share/na/theme.yaml where you can modify the colors used for all displays
  • Allow TAG=~PATTERN comparison for regex matching in na tagged
  • na undo command to undo last change or last change to file specified in arguments
  • na update --search OLD_TEXT --replace NEW_TEXT (added –replace)

IMPROVED

  • When displaying actions wider than the screen, wrap at words and indent 2 spaces from start of action (after prefix)
  • When not showing notes, add an asterisk at the end of an action
  • When showing notes, indent to the beginning of the action
  • Add --project to archive, complete, and update to move a modified action to a new project when saving
  • Allow na saved --delete to handle multiple arguments
  • Allow wildcards when deleting saved searches
  • Refactor request for input, no change to user experience
  • Refined wildcard (?*) handling
  • Better error message for na next when no todo is matched
  • If STDOUT isn’t a TTY, don’t enable pagination, regardless of global setting
  • Disable pagination when using –omnifocus
  • Allow –find or –grep as synonyms for –search
  • --in TODO option for na complete
  • If a search string contains @tags and –exact or –regex isn’t specified, the @tags will be extracted and passed as a –tagged search.
  • Tag handling (including values and comparisons) in tags extracted from search strings
  • na complete --project PROJ flag to move to a specific project
  • na restore --project PROJ flag to move restored action to
  • Exit gracefully if tagged command is run with invalid arguments
  • Display action affected when using update command

FIXED

  • Change default :dirname coloring to fix an occasional highlighting issue
  • Error when creating new project in todo file
  • Error when last_modified.txt hasn’t been written yet
  • Nil error in action.pretty
  • Date tags containing hyphens triggered OR searches because they were initially interpreted as negative tag searches
  • Templating irregularities
  • Error thrown when running without $EDITOR variable defined in environment
  • New project not being added when requested
  • Error when na add --to PROJECT was a project that didn’t exist
  • --no-color wasn’t stripping templated hex codes
  • Escape search for tokens to allow parenthesis and other reserved characters

More details on the project page!

Like or share this post on Mastodon or .


BrettTerpstra.com is supported by readers like you. Click here if you'd like to help out.

Twitter | Mastodon | GitHub | Privacy Policy

]]> 2023-09-09T09:00:00-05:00 Timing -- automatic time tracking for Mac AND iOS [Sponsor] https://brett.trpstra.net/link/535/16338321/timing-automatic-time-tracking-for-mac-and-ios-sponsor https://brett.trpstra.net/link/535/16338321/timing-automatic-time-tracking-for-mac-and-ios-sponsor Timing, time tracking, app, vertical timeline, productivity

总结:
这篇文章介绍了Timing这款时间追踪应用的特点和优势。Timing可以自动跟踪用户使用各种应用、文档和网站的时间,并根据规则自动分类。它还可以导入iPhone和iPad的使用时间,提供完整的设备使用情况。此外,Timing还可以导入iPhone的电话记录和日历事件,确保不会漏掉任何会议和通话时间。Timing的全新垂直时间轴界面方便了用户快速了解时间分配情况。它是一款全面而易于使用的时间追踪应用,可以帮助用户更好地管理时间和提高工作效率。

Thanks to Timing for sponsoring BrettTerpstra.com this week! I’ve loved Timing for years, and the new vertical timeline view is an awesome upgrade to one of my most-used apps.

Time is your most precious resource. You need to know how you are spending it.

But time tracking is no fun.

Timing fixes that.
It automatically tracks all your time, without you lifting a finger:

  • Timing records how long you use each app, document, and website — without start/stop timers. These timmes can also be automatically categorized using rules, so you don’t have to do it manually.
  • It imports your iPhone and iPad usage from Screen Time, giving you a complete picture of all your device usage. No other time tracking app for Mac does this!
  • In addition, Timing will also import phone calls from your iPhone, so those don’t get lost.
  • The same goes for meetings you attend: Timing will automatically show events from your calendar, so you never forget to record time spent in meetings again.
  • But even when a meeting isn’t on your calendar, Timing automatically recognizes when a call ends and lets you record time for it, so that no meeting goes untracked.
  • Similarly, when you return to your Mac after a break, Timing will ask you what you did during your time away.

All of these features are optional and configurable, of course. And its brand-new vertical timeline makes it even easier to see what you did at a glance.

Timing is the one time-tracking app that will really give you a complete picture of where your time goes, all while taking you much less time to maintain than other time trackers.

Not convinced yet? Read what Brett himself has to say about Timing.
(Spoiler alert: He likes it, and it helps him be more productive.)
Or download the free 30-day trial today and get 10% off for the first year! And if you had tried Timing before and would like to give it another shot, feel free to reach out and we’ll send you a new trial.

Like or share this post .


BrettTerpstra.com is supported by readers like you. Click here if you'd like to help out.

Twitter | Mastodon | GitHub | Privacy Policy

]]> 2023-09-07T08:00:00-05:00 Important Journal CLI updates https://brett.trpstra.net/link/535/16338322/important-journal-cli-updates https://brett.trpstra.net/link/535/16338322/important-journal-cli-updates dot syntax, nested keys, data format, custom folders, tool usefulness

总结:
这篇文章介绍了一个工具的更新内容,修复了使用点语法嵌套键时出现的问题,并添加了自定义文件夹选项来保存条目。这些改进使得工具更加实用。

Just a couple quick updates to the Journal CLI I published yesterday that I wanted everyone who was trying it out to know about before they have too much data in it.

First, if keys were nested using dot syntax, e.g. health.rating and health.sleep, it would create a hash like:

{ 
  "health": {
    "health": {
      "rating" : 5, 
      "sleep": 7 
   }  
}

As you can see, the “health” key got doubled and nested inside of the section key. This isn’t the way it was supposed to work with the dot syntax. Version 1.0.15 fixes this, if a key is repeated it’s merged with the parent key instead of nesting.

I also added options for defining custom folders to save entries in. At the top level you can include entries_folder with a path to any folder on your system. Journals will all save to that folder with subdirectories for each of their keys. You can instead define entries_folder within a journal definition, allowing each journal to have a custom location. JSON and Markdown will be written to these folders based on settings.

That should help make this tool a bit more useful, sorry for changing the data format, but better sooner than later. Check out the project page for more details.

Like or share this post .


BrettTerpstra.com is supported by readers like you. Click here if you'd like to help out.

Twitter | Mastodon | GitHub | Privacy Policy

]]> 2023-09-07T08:00:00-05:00 Journal, a CLI for journaling https://brett.trpstra.net/link/535/16334303/journal-a-cli-for-journaling https://brett.trpstra.net/link/535/16334303/journal-a-cli-for-journaling couple's therapy, neurodivergence, command-line tool, data collection, journaling

总结:
这篇文章介绍了一种命令行工具,用于在夫妻治疗中收集数据并进行日记记录。这个工具可以处理数字、字符串和多行输入,并且可以创建Day One和Markdown版本的条目。它还可以记录每天的天气情况。虽然还没有实现查询数据集的功能,但作者认为通过统计分析可以对数据进行跟踪和相关性分析。通过这个工具,作者能够获得自己的情绪和日志的概览。希望这个工具能对其他人也有帮助。

I recently started couple’s therapy to try and improve the often-complicated relationship between myself (ADHD, bipolar) and my partner (autistic) and all of the unique problems that combination of neurodivergence presents. As part of this, I was asked to keep a journal containing certain data points. I started off journaling in Day One, but immediately realized that I was collecting some numeric data that I wouldn’t be able to do anything with unless it was stored in a database format of some kind. So I wrote a tool.

Journal is a command-line tool that takes a configuration of journals, sections, and questions, presents the questions on the command line, and records the answers to JSON, as well as optionally creating Day One and Markdown versions of the entries. It can handle numeric data, string and multiline input, as well as automatically recording the daily weather for each entry.

To use it you need Gum installed (brew install gum). If you want to use the Day One integration, you’ll also need to install the Day One CLI. Those are the only prerequisites. You can just use gem install journal-cli to get the journal command set up. It can handle multiple journal configurations and multiple output formats. It takes some configuration, but it’s very flexible (and will probably get more flexible as new needs arise).

I haven’t written the part of this that can query the datasets created yet. That’s going to be pretty individualized based on your needs, but I think everything should be there in the JSON to allow tracking and correlations with a little statistical analysis work. I’ll dig into it more once I’ve collected enough data. In the meantime, it’s also creating nicely-formatted Day One entries so I can get an overview of my moods and journals.

See the project page for details on setup and configuration. Hopefully others will find this useful, too!

Like or share this post on Mastodon or .


BrettTerpstra.com is supported by readers like you. Click here if you'd like to help out.

Twitter | Mastodon | GitHub | Privacy Policy

]]> 2023-09-06T00:00:00-05:00 A bit more na work https://brett.trpstra.net/link/535/16322833/a-bit-more-na-work https://brett.trpstra.net/link/535/16322833/a-bit-more-na-work I went on a trip to Minneapolis this weekend. It went really well; I saw some great friends, ate some great food, and spent some early mornings coding at the hotel. I was just coding to kill time when I couldn’t sleep, and playing with na seemed like the perfect way to do it.

The first thing I did was take a second stab at “decomposing” the main binary so that each command had its own file, just to make maintenance easier. Finally got that working properly. It won’t change anything for the user, but it’s so much nicer to look at.

In addition to the complete and archive commands I added last week, the update command now has a --restore flag that can be used to remove the @done tag from an action or actions. It’s the same as using --remove done, but I find it just a little more intuitive. This flag is mirrored as an na restore [SEARCH] (or na unfinish [SEARCH]) command.

I also added pagination, so for output that is longer than your screen, it will now pause using less or more if available, letting you page through with shortcut keys. This also applies to the help command, so it’s easier to wade through the extensive documentation that the command provides. You can disable this with na --no-pager [COMMAND], a setting which can be saved to your config.

I added an na completed command to view @done actions. It accepts --before, --on, and --after flags that recognize natural language dates and can be combined. You can also use --tagged TAG to find actions tagged with any combination of tags (use comma separated list or use the flag multiple times, include a + to make a tag mandatory, ! to negate). Any arguments passed to the command will function as a tokenized text search. And, of course, you can run it with --save [NAME] to save a complex search for later use with the na saved command.

Speaking of saved searches, I also changed the saved command to allow multiple saved searches to run at once. So now if you have a saved search for low priority and one for medium priority, you can run them both together with na saved lowprio medprio and get combined results.

Also:

  • --done flag not working on na next
  • Missing descriptions in help examples
  • When replacing a priority tag, remove any space before it the action text
  • Detect @tags in search strings and convert them to tag search with comparisons

Check out the project page for installation and usage details.

Like or share this post on Mastodon or .


BrettTerpstra.com is supported by readers like you. Click here if you'd like to help out.

Twitter | Mastodon | GitHub | Privacy Policy

]]>
2023-08-30T12:02:00-05:00
Stem the tide of unread emails with SaneBox Digest from SaneBox [Sponsor] https://brett.trpstra.net/link/535/16311855/stem-the-tide-of-unread-emails-with-sanebox-digest-from-sanebox-sponsor https://brett.trpstra.net/link/535/16311855/stem-the-tide-of-unread-emails-with-sanebox-digest-from-sanebox-sponsor Thanks to SaneBox for sponsoring BrettTerpstra.com again this week! I rely on my SaneBox Digest to get an overview of all the emails that (thankfully) skipped my inbox without having to wade through them all. Highly recommend!

Drowning in a deluge of daily emails and struggling to keep up with the significant ones? Enter SaneBox Digest, an exceptional feature of SaneBox that offers you a concise summary of your email activity. Instead of constantly wading through piles of unimportant emails, the Digest provides you with a neat overview of your day’s communications at a glance.

More than just a quick recap, the Digest integrates flawlessly into your SaneBox journey. It delivers a daily or weekly email that lists your unread messages and summarizes their content, enabling you to pinpoint crucial communications without being overwhelmed by the inconsequential ones. Think of it as your inbox’s personal news broadcaster, highlighting the headlines while filtering out the noise. With the Digest, you’re empowered to take control of your emails and ensure you’re always in the loop without the unnecessary clutter.

Check out SaneBox today and save $25!

Like or share this post on Mastodon or .


BrettTerpstra.com is supported by readers like you. Click here if you'd like to help out.

Twitter | Mastodon | GitHub | Privacy Policy

]]>
2023-08-24T08:00:00-05:00
Some na updates and new commands https://brett.trpstra.net/link/535/16308395/some-na-updates-and-new-commands https://brett.trpstra.net/link/535/16308395/some-na-updates-and-new-commands I’ve updated na with some new stuff I thought I’d share.

First off, I wanted an easy way to archive all @done actions in one swoop without having to use a lot of flags and switches to locate them and move them. So I added an archive command, which takes a search string as an argument, but also has a --done switch that will archive all @done tasks. So you can just run na archive --done, select the file to affect if there are multiple available, and presto, “archive all finished” is done, just like in TaskPaper.

NAME
    archive - Mark an action as @done and archive

SYNOPSIS

    na [global options] archive [command options] ACTION

COMMAND OPTIONS
    --all             - Act on all matches immediately (no menu)
    -d, --depth=DEPTH - Search for files X directories deep (default: 1)
    --done            - Archive all done tasks
    -e, --regex       - Interpret search pattern as regular expression
    --file=PATH       - Specify the file to search for the task (default: none)
    -n, --note        - Prompt for additional notes. Input will be appended to any existing note. If STDIN input (piped) is detected, it
                        will be used as a note.
    -o, --overwrite   - Overwrite note instead of appending
    --tagged=TAG      - Match actions containing tag. Allows value comparisons (may be used more than once, default: none)
    -x, --exact       - Match pattern exactly

EXAMPLE

    # Find "An existing task", mark @done if needed, and move to archive
    na archive "An existing task"

I also added a complete command that will add a @done tag to whatever action matches your search (menu provided for multiple results), or all matches using the --all switch. It’s basically a shortcut for na update --finish SEARCH_STRING. It’s aliased as finish as well. Both the archive and complete commands have a --note switch that allows you to add a note (prompted if there’s nothing piped to it). All of the matching options from the update command are available, including --tagged for searching by tag and --regex for doing a regular expression search. complete has a --archive switch that will simultaneously add a @done tag and move the action to the Archive.

NAME
    complete - Find and mark an action as @done

SYNOPSIS

    na [global options] complete [command options] ACTION

COMMAND OPTIONS
    -a, --archive     - Add a @done tag to action and move to Archive
    --all             - Act on all matches immediately (no menu)
    -d, --depth=DEPTH - Search for files X directories deep (default: 1)
    -e, --regex       - Interpret search pattern as regular expression
    --file=PATH       - Specify the file to search for the task (default: none)
    -n, --note        - Prompt for additional notes. Input will be appended to any existing note. If STDIN input (piped) is detected, it
                        will be used as a note.
    -o, --overwrite   - Overwrite note instead of appending
    --tagged=TAG      - Match actions containing tag. Allows value comparisons (may be used more than once, default: none)
    -x, --exact       - Match pattern exactly

EXAMPLES

    # Find "An existing task" and mark @done
    na complete "An existing task"

    # Alias for complete
    na finish "An existing task"

I know of a few people making extensive use of na. If you’re among them and have a feature request, don’t be shy about posting an issue or contacting me directly.

Check out the project page for more info.

Like or share this post on Mastodon or .


BrettTerpstra.com is supported by readers like you. Click here if you'd like to help out.

Twitter | Mastodon | GitHub | Privacy Policy

]]>
2023-08-22T08:00:00-05:00
Convert RegExRX native files to Markdown snippets https://brett.trpstra.net/link/535/16306720/convert-regexrx-native-files-to-markdown-snippets https://brett.trpstra.net/link/535/16306720/convert-regexrx-native-files-to-markdown-snippets I love RegExRX for testing regular expressions. It has all the features I could want from such an app, including the ability to copy a working regex out prepared for a range of languages. It’s what I’ve stuck with for years.

As I experiment with my regexes, I’ll save them in RegExRX, creating a .regexrx file in my Snippets folder (where Snibbets works). In order to make these searchable with Snibbets, I use a script to convert the XML-based .regexrx file to a Markdown file with the flags, search string, and the replace string and test text if they exist. I turned this into a gem for anyone who should happen to run into such a need.

You can install the tool with gem install regexrx2md. Once installed, just use regexrx2md -o MARKDOWN_DIRECTORY SOURCE_DIRECTORY to output a bunch of Markdown files from a directory of .regexrx files. You can also convert a single file just by providing a file link as the argument instead of a directory.

There are options for manipulating the filename, the Markdown template, and the output directory. See the docs for more info. While I hope this is useful to someone, it was something I useful enough to me to invest the time in, so it’s already paid off sufficiently. I just thought I’d share… just in case.

Like or share this post on Mastodon or .


BrettTerpstra.com is supported by readers like you. Click here if you'd like to help out.

Twitter | Mastodon | GitHub | Privacy Policy

]]>
2023-08-21T08:00:00-05:00
Kaleidoscope 4.1: Now with Git File History (and a special coupon) [Sponsor] https://brett.trpstra.net/link/535/16300740/kaleidoscope-4-dot-1-now-with-git-file-history-and-a-special-coupon-sponsor https://brett.trpstra.net/link/535/16300740/kaleidoscope-4-dot-1-now-with-git-file-history-and-a-special-coupon-sponsor Thanks to Kaleidoscope for sponsoring BrettTerpstra.com again this week! The addition of Git History diffing is excellent, and I’m excited to share it with everybody.

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.

Now with version 4.1, Kaleidoscope continues to innovate by directly integrating with Git to show you a history for a single file. This makes it incredibly easy to track changes to a file over time. Check out this blog post for a detailed overview of how you can use this powerful new integration.

As Michael Tsai wrote: “… Kaleidoscope makes some of these tasks really easy. There are many ways to get it to open a single file, and then it automatically loads the history (and even the previous version, if you want). It’s easy to navigate the history to pick which versions you want to compare. I’ve seen many different apps implement this type of interface, and Kaleidoscope’s version may be the best.”

Dave Verwer: “The UI of clicking through the history of a file with A and B buttons is simple and brilliant.”

In case you missed it, here are some of the most exciting features we added to Kaleidoscope with version 4:

  • Syntax coloring, with multiple built-in themes.
  • Transform any comparison into a merge document that can be edited inline.
  • Text filters to clean up diffs by removing irrelevant data, such as time stamps, object addresses and unique identifiers.
  • Kaleidoscope Prism, a new helper app in the menu bar to quickly launch comparisons even if Kaleidoscope is not running.
  • Debugger integration for Python developers.
  • File properties show metadata, including size, file type, dates, and encoding.
  • A welcome window that speeds up the processes of creating new comparisons or finding recent ones.

Subscriptions start at $8 per month for a yearly plan. Use the coupon code TERPSTRA (valid until August 31, 2023) to get 20% off for the first year. Check it out today!

Like or share this post on Mastodon or .


BrettTerpstra.com is supported by readers like you. Click here if you'd like to help out.

Twitter | Mastodon | GitHub | Privacy Policy

]]>
2023-08-17T08:00:00-05:00
Web Excursions for August 14, 2023 https://brett.trpstra.net/link/535/16296073/web-excursions-for-august-14-2023 https://brett.trpstra.net/link/535/16296073/web-excursions-for-august-14-2023 Brett holding map

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

zmd: Access Handy Utilities and Services in CLI
zmd (zmd.ee) is an experiment by Mighil. It hosts a bunch of handy ulities and services you can access in CLI via curl.
BatchPhoto 5
Batch photo processing app BatchPhoto just released version 5, updated for modern platforms and OSs, and adding SFTP upload and hot folders.
Instant Coffee – Bold Bean Coffee Roasters
I’ve been using this instant coffee when traveling for years. It won’t beat a cup from your favorite brewing setup, but it beats the pants off of most coffees they offer in hotel rooms. Just add hot water and stir.
Kelly R. Minter (Ask a Therapist) - YouTube
Another great resource for CPTSD and RTS, with special interest in LGBTQ+ folks.
Angel DeSantis - YouTube
Angel is a YouTuber who grew up in an apocalyptic christian cult and offers tips on dealing with Religious Trauma Syndrome and Complex PTSD. I’ve found her very helpful lately.

CleanMyMac X

Like or share this post on Mastodon or .


BrettTerpstra.com is supported by readers like you. Click here if you'd like to help out.

Twitter | Mastodon | GitHub | Privacy Policy

]]>
2023-08-14T11:05:00-05:00
Orchard Resales: get yourself a Mac mini, cheap [Sponsor] https://brett.trpstra.net/link/535/16281370/orchard-resales-get-yourself-a-mac-mini-cheap-sponsor https://brett.trpstra.net/link/535/16281370/orchard-resales-get-yourself-a-mac-mini-cheap-sponsor Thanks to Orchard Resales for sponsoring BrettTerpstra.com this week! If you’re looking for an older Mac mini to use as a server or entertainment center, you can pick up used 2012/2014 models dirt cheap!

I use a 2012 Mac mini as a basement server, running headless (no keyboard or monitor) and controlled over screen sharing. It runs Docker (and a few containers that give me things like network speed charts and VPN tunneling), Plex, and all of my home automation with all of my controllers hooked up to its USB ports. I also have a Synology, but you can easily set up file storage and serving with a Mac mini and a big external RAID drive. The one I run in my basement is a 2012 with a 500GB SSD and 16GB RAM. I’ve never needed to upgrade it any further to get everything I need out of it.

Want to set up your own, or have another use in mind for an old mini? Well, thanks to Orchard Resales you can pick one up for as little as $50 US. Deck one out with 16GB of RAM and an SSD and you’ll come out around $100. For a whole server, and it’s as easy to set up as using a Mac. And if you need spare parts, you can get non-functional Mac minis starting at just $15.

No, these can’t run the latest macOS, but for 99% of uses, they don’t need to, and if you’re really into it, you can use OpenCore Legacy Patcher to get all the functionality you need.

Check out Orchard Resales today and get started with your own server! Or buy a bunch and make a server farm!

Like or share this post on Mastodon or .


BrettTerpstra.com is supported by readers like you. Click here if you'd like to help out.

Twitter | Mastodon | GitHub | Privacy Policy

]]>
2023-08-03T08:00:00-05:00
Sanebox: your email lifesaver [Sponsor] https://brett.trpstra.net/link/535/16278141/sanebox-your-email-lifesaver https://brett.trpstra.net/link/535/16278141/sanebox-your-email-lifesaver Thanks to Sanebox for sponsoring BrettTerpstra.com again this week! I’ve been using it for years and I can’t imagine my email inbox without it.

Drowning in emails? Enter SaneBox — your lifesaver. It’s a VIP service that sifts through your inbox, separates the important from the trivial, and serves up a neat digest. It works with any email provider, saving you 12+ precious hours every month.

But that’s not all. Fed up with pesky marketers? SaneBlackHole sends them packing with one click. Worried about forgotten follow-ups? SaneReminders has got your back. Too many non-urgent emails? Just hit the SaneSnooze button. And those countless attachments? SaneAttachments organizes them in your Dropbox, Evernote, Box - you name it.

TechCrunch, Forbes, The New York Times, all vouch for it. Sign up today and save $25 on any subscription. It’s about time we tamed our inboxes.

Like or share this post on Mastodon or .


BrettTerpstra.com is supported by readers like you. Click here if you'd like to help out.

Twitter | Mastodon | GitHub | Privacy Policy

]]>
2023-08-01T09:45:00-05:00
Personal update: CPTSD edition https://brett.trpstra.net/link/535/16275514/personal-update-cptsd-edition https://brett.trpstra.net/link/535/16275514/personal-update-cptsd-edition I’m afraid you’ve been seeing a lot of sponsored posts and not enough posts from me lately, so I thought I’d try to explain why.

After a relationship in my life was destabilized and I had an outsized reaction to it, I started trying to figure out what was going on with me. I was pointed toward Complex PTSD and from there I discovered that Religious Trauma Syndrome, while not a part of the DSM, was a recognized thing, and that the causes and symptoms fit me perfectly.

I’ve spent the last couple of weeks trying to unpack what this means for me. So much of the me I’ve come to know is explained by this: my attention issues, my memory problems, my emotional dysregulation, my drug addictions, and even my Bipolar Disorder can all be tied to RTS and CPTSD.

I grew up as a “different” kid in a fundamentalist church. As a young child I had urges and thoughts that I constantly feared would send me to hell. When I wasn’t worried about my eternal soul, I was worried about my non-Christian friends and their eternal souls. By the time I was in Middle School I was drinking and trying to cope with what amounts to a constant fight or flight response, in addition to grief.

Being neurodivergent, queer, and highly sensitive was not a good combination for me in the church I grew up in. And I was taught to put all of my value, all credit for my successes, and all forms of attachment into God, not earthly things. So when I decided the church wasn’t good for me (or, in my mind, for anyone), I had the secondary trauma of leaving. Becoming emotionally estranged from my family, losing my Christian friends, and losing a god, the one thing that I had ever believed could save me. I still have a lot to learn about attachment theory, but it’s safe to say that I never felt securely attached to any people in my life, from my earliest memories. Which, to be fair, are very sparse, because a symptom of CPTSD is amnesia, if I understand it correctly. I’ve always wondered why everyone else remembered so many things from their younger years and I only had occasional memories of moments. Not events, not periods, nothing substantial, only snippets. I couldn’t remember who was there, how I felt about them, only whether I felt safe or scared in that moment. And most of what I remember is feeling scared.

I started therapy with a new counselor last week. She actually has a psychology PhD and does trauma-informed therapy, and I think she’ll be much more helpful than my last therapist. I have high hopes. All I know is that if it doesn’t work out I absolutely have to keep working to find a good fit, because this shit is more than I know how to deal with on my own, and I can’t expect the people in my life to deal with it for me. All of my insecurities have been laid bare, I’m reacting to the world from a raw and frightened place non-stop, and it’s exhausting. I need to learn how to find security, validation, and love within myself and not depend on external sources just to exist. And that’s something I never learned how to do as a Christian. It’s been 30 years since I stopped believing, and I’m still not a whole person.

I’m an atheist these days, and it was a hard fought battle against my ingrained thoughts. I declared myself agnostic in my late teens, but it seriously took 20 years for me to stop looking over my shoulder and wondering if I was making a serious mistake that would definitely doom me to eternity in Hell. I’m over that now, I think, but I still watch anti-theist YouTube all the time, and it makes me wonder if part of me is still scared. I don’t have any interest in the god of the Bible — he’s a real asshole. And I was raised to believe that any other version of God was heresy — even other sects of Christians were going to hell. If you didn’t worship the specific version of God that was defined by my church, you were going to burn. So if I can’t accept that religion, then there’s no religion that would calm my nervous system. It was trained into me as a child. I’m constitutionally incapable of having Faith (capital F), and I was taught that without Faith you’re doomed, and now I’m just trying to put it all behind me. I’m flailing a bit.

I had to tell my parents I couldn’t see them for Saturday morning breakfast for a while. They’ve always been kind to me. They (and their friends) have prayed for my eternal soul. They raised me the way they were raised and I don’t blame them for repeating the trauma. But every time I see them I’m re-traumatized and I didn’t realize what was happening until now. I’ve been to the hospital multiple times with heart problems, and guess what? It was almost always within 24 hours of having breakfast with my parents. I’ve decided that’s not a coincidence. They were very understanding, and I really believe they want the best for me, I just can’t disassociate them from my childhood trauma. Hopefully I can let go of that and reestablish a relationship with my parents.

So that’s why I haven’t been writing. I’ve been trying to grapple with 45 years of fear I had successfully avoided until now. I’ll be back. I’m reading, I’m going to therapy, I’m working to understand and develop tools for moving forward. I’m going to be stronger for having all of this laid bare and being forced to deal with it.

Like or share this post on Mastodon or .


BrettTerpstra.com is supported by readers like you. Click here if you'd like to help out.

Twitter | Mastodon | GitHub | Privacy Policy

]]>
2023-07-30T15:04:00-05:00
BetterTouchTool: Introducing floating menus [Sponsor] https://brett.trpstra.net/link/535/16251230/bettertouchtool-introducing-floating-menus-sponsor https://brett.trpstra.net/link/535/16251230/bettertouchtool-introducing-floating-menus-sponsor Thanks to BetterTouchTool for sponsoring BrettTerpstra.com this week! I am a huge fan of BetterTouchTool and use it all day every day on my Mac. I wouldn’t know what to do without it. From customizing my keyboard shortcuts to adding infinite gestures to my trackpad to running my entire Stream Deck setup, there’s nothing this little utility can’t do.

I think BetterTouchTool is well known to readers of this blog (thanks Brett!), so I won’t go into the details of the many things you can do with it. Instead I want to promote a powerful new feature that has been added to BTT recently and is currently in beta phase: Floating Menus.

Imagine them as highly flexible, widget-like menus that you can place virtually anywhere on your screen.  You can attach them to specific positions in specific windows, to specific screens, the current mouse position and many more. You can specify whether they float on top, stick them to your desktop or have them behave like normal windows (and more). 

They can always be visible, expand on mouse hover or be shown/hidden via any trigger in BTT.

A Floating Menu contains either standard buttons, or widgets like sliders or even web view items. Their appearance is completely customizable. All items are fully scriptable via AppleScript or Javascript, and soon there will be a plugin system to load custom widgets.

The Floating Menus will soon become the basis for numerous existing BetterTouchTool features, such as Stream Deck and Notch Bar support and several predefined actions. These will gradually transition to utilize the Floating Menu rendering and scripting engine making them more flexible and robust by streamlining maintenance & future development.

Additionally, the upcoming (entirely new) version of the iOS BTT Remote app will be capable of rendering your custom Floating Menus on your iPhone or iPad. 

You can find various Floating Menu examples on share.folivora.ai. For example have a look at the Notch menu, which is invisible by default but expands from your Macbook’s Notch on hover. Another nice example is the “Mini Emoji Menu” preset: it places a little transparent dot on the left edge of the active window, which, when hovered, shows multiple custom emoji which you can insert by clicking.

The documentation for this new feature is already available, and you can always come to the community site to discuss or request features. Now that I have a solid working base, I can easily built on it, so please report any bugs and request any feature you can think of!

Try BetterTouchTool now (45 day free trial) or go and purchase a license with this 20% coupon code: BTBTT2023.

Like or share this post on Mastodon or .


BrettTerpstra.com is supported by readers like you. Click here if you'd like to help out.

Twitter | Mastodon | GitHub | Privacy Policy

]]>
2023-07-20T08:00:00-05:00
Web Excursions for June 29, 2023 https://brett.trpstra.net/link/535/16214159/web-excursions-for-june-29-2023 https://brett.trpstra.net/link/535/16214159/web-excursions-for-june-29-2023 Brett holding map

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

Post-Twitter Diaspora Options
Some opinions on Mastodon and Bluesky. Personally I wish ill of Bluesky and have high hopes for Mastodon. But I’m certain it won’t pan out like that.
Brave Search No Longer Using Bing
A Michael Tsai two-fer this week.

Their own index, based on Tailcat, is working better than DuckDuckGo/Bing for me now. Hopefully, Apple will add built-in support to Safari. Worth testing out, even if Brave isn’t going to be my primary browser…

Xnapper
I’m still a die-hard CleanShot fan, but this little tool makes some gorgeous screenshots ready for social sharing, with tools for auto-balancing, changing backgrounds, and redacting email addresses and other text. Simple and beautiful.
Pixabay
A large collection of excellent royalty-free photos and audio tracks.
LaunchBar/Ask-ChatGPT
A ChatGPT LaunchBar action. Allows continuing conversation, predefined prompts, clipboard interaction, and can open results as a Markdown file ready for use.

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

Like or share this post on Mastodon or .


BrettTerpstra.com is supported by readers like you. Click here if you'd like to help out.

Twitter | Mastodon | GitHub | Privacy Policy

]]>
2023-06-29T11:58:00-05:00
Sanebox, your email concierge [Sponsor] https://brett.trpstra.net/link/535/16213929/sanebox-your-email-concierge-sponsor https://brett.trpstra.net/link/535/16213929/sanebox-your-email-concierge-sponsor As I’ve said before, I’m a long time user and lover of Sanebox. Thanks to them for sponsoring again this week. Here’s a user story from Thomas Yuan.

Well, here’s a funny thing: I started using SaneBox because my email was an utter disaster, and I needed something to save me from the deluge. Little did I know that I was stepping into a world where email isn’t just manageable, it’s… well, sane. I know, I know…

SaneBox is like having your own personal email concierge. It’s not just a filter - oh no, that’s underselling it. It’s like a highly-trained butler who goes through your mail, knows what’s important, and presents you with only the choicest pieces of correspondence.

Everything else? Neatly sorted away, out of sight, out of mind.

Setting up SaneBox is as easy as pie. And I’m not talking about some complicated lattice-top apple pie here. I mean one of those simple, comforting pumpkin pies. You just connect your email account, and voila, SaneBox starts its magic. It learns from your actions, your patterns, tailoring its sorting to your specific needs.

Now, the main feature here is the @SaneLater folder. It’s like a second inbox, except it’s where all the non-urgent emails go to hang out. Newsletter from that one store you bought socks from 3 years ago? That’s a @SaneLater item. Automated system alert about a software update? You bet that’s going in @SaneLater.

What’s more, you can customize it to your heart’s content. There’s @SaneBlackHole for those pesky emails you never want to see again, and @SaneNews for newsletters and the like. You can even create your own folders, and SaneBox will learn to sort your emails accordingly.

And don’t get me started on @SaneReminders. Ever sent an email and needed a reminder if nobody replies? Just CC or BCC to 1week@sanebox.com, and if there’s no reply in a week, it pops back up in your inbox. It’s like a boomerang made out of pure organizational power.

Sure, there are other email management tools out there. But SaneBox stands out for its simplicity, its flexibility, and, most of all, its effectiveness. It’s like it took my unruly, wild-west email inbox and turned it into a sleek, streamlined, email-answering machine. And, in a world where every spare minute counts, who wouldn’t want that?

So, if you’ve got an email inbox that’s more like a black hole, give SaneBox a whirl. I promise you, you won’t be disappointed. It’s affordable, efficient, and pretty darn fun to use.

And here’s a pro tip: if you’re ever unsure about a feature, just explore their help center. It’s packed with useful guides and tips. It’s like the cherry on top of the SaneBox sundae.

SaneBox isn’t just a tool, it’s a lifestyle change. It’s a way to take back control of your inbox and, by extension, your digital life. It’s helped me, and I’m pretty sure it’ll help you too. So why wait? Start living the sane way today.

Sanebox is an inexpensive choice. You can get a free trial to experience the difference in email management without any commitment. Plus, the app offers flexible monthly plans starting at just $7.

Check out SaneBox today, sign up and save $25 on your subscription.

Like or share this post on Mastodon or .


BrettTerpstra.com is supported by readers like you. Click here if you'd like to help out.

Twitter | Mastodon | GitHub | Privacy Policy

]]>
2023-06-29T08:00:00-05:00
Remembering Yeti https://brett.trpstra.net/link/535/16210634/remembering-yeti https://brett.trpstra.net/link/535/16210634/remembering-yeti Yeti the cat

My cat died a couple weeks ago. I had him for 20 years and he’s left a large hole in my life. I know not everybody gets cats the way cat people do, but he was honestly one of my closest friends. I just wanted to write a bit about him now that the grief is a bit less raw and just remember him for the legend he was.

My ex and I were around when Yeti’s mom had her litter. She had health problems and sadly had to be euthanized shortly after Yeti and his siblings were weaned. I had my pick of the litter. I had recently lost a tuxedo cat (Trouble) to a pit bull attack, and thought I’d take the one tuxedo in the litter. Aditi’s mom suggested I also take this one bashful kitten who had a hairline similar to mine. I agreed. Jezebel (the Tuxedo) became Aditi’s cat, and Yeti almost immediately became very bonded to me. I’ve always been thankful I was talked into taking him.

Yeti and Jezebel

Both Yeti and Jezebel were polydactyl, and Yeti’s front paws had six toes each. I almost named him Big Foot, but given his long, thick white hair, “Yeti” seemed more apropos.

Yeti displayed what can only be anthropomorphized as “empathy.” He always understood when I was sad or sick and would lay by me, placing one paw on my thigh, or curl up on the couch behind me and put his paw on my shoulder. And when I was happy or comfortable, he would be in my lap. He loved to sit facing me with his paws on my chest and give me nose bumps. He learned very young that licking my nose repeatedly was a bit painful, and would just give one lick or tap and then stop.

Speaking of understanding pain, Yeti learned at a very young age that his claws and teeth hurt me, and after he got past the part of his life where he would try to climb my leg with his sharp little kitten claws, he never bit or scratched anybody, ever. I once held him while a urinary crystal was removed through his urethra; he held onto my arm and yowled, but never clawed or bit, which was impressive. I think if someone was squeezing a rock through my private bits I would probably try to bite the nearest arm I could.

Yeti resting his paw on my shoulder

Jezebel passed away under the care of Aditi a few years back. We honestly never expected Yeti to outlive her, but he lived to 19 years and 9 months and I enjoyed every minute of it. I’ve spent more time with Yeti than with any human in my entire life. He was always around. I never even saw my parents that much from 0-18. And I’ve never had a romantic relationship longer than about 13 years. So Yeti was my longest relationship and the “partner” I’ve spent the most of my life with. I appreciate humans and all, but Yeti and I never had a fight or even a misunderstanding. He was just always there for me. I gave him all my love, and he returned it.

Yeti crawling into Elle's shirt

Yeti has been living with my partner Elle and I for about 5 years now. It took him a while, but he eventually accepted Elle as his other person. He worked his way into her heart and Elle loved him as much as I did. He helped pull our little “family” together, and I know she’s missing him right now, too.

The last couple years have been full of health scares. He went from 20 pounds to 6 pounds at the end. He had a bout of pancreatitis, and then kidney failure. We’d been expecting him to die for quite a while now, so we had plenty of time to prepare for this. And he gave me the best ending I could imagine…

Yeti saying goodbye

He was energetic and loving on Thursday, and then at 2am on Friday he crawled under my covers and fell asleep. That was the last time he moved on his own. He spent the day with me Friday, with his paw in my hand or on my leg. I would place him in the middle of the couch and then work on my laptop on the side, and he would pull himself over to me to put his paw on me or bury his head in my thigh. I took him to bed with me that night. On Saturday at 5:15am, I rolled over and put my hand on him. He took two deep breaths and then exhaled his last. Man, he waited until I woke up to say goodbye. Seriously, he was the most caring cat you’ll ever meet.

I will always miss Yeti, but he gave me a great 20 years in the prime of my life. I’m not nearly as devastated as I thought I’d be. It was all so peaceful. He stayed by me all the way to the end, and I’ll be eternally grateful that he passed peacefully at home and I didn’t have to make the decision to end his life in a cold vet’s office. I’ve done that with beloved pets a dozen times over the years, and it’s a horrible thing to go through. Yeti gave me a fairy tale of an ending.

I made a video out of 20 years’ worth of pictures. It’s too long, but if you want to enjoy it and have the patience for it, consider it my tribute to the best cat ever.

YouTube Video

Like or share this post on Mastodon or .


BrettTerpstra.com is supported by readers like you. Click here if you'd like to help out.

Twitter | Mastodon | GitHub | Privacy Policy

]]>
2023-06-27T11:19:00-05:00
Snibbets 2.0.34 https://brett.trpstra.net/link/535/16195268/snibbets-2-dot-0-34 https://brett.trpstra.net/link/535/16195268/snibbets-2-dot-0-34 I released a new version of Snibbets this morning that solves one peculiarity: if you have multiple snippets in one file but any of them don’t contain code blocks, then the titles and display would get weird.

Now you can have sections of a snippet file (separated by ATX headers) that contain just notes. If a section contains just notes and no code, then the notes will be output for that section, even when not using --notes or having all_notes: true set in config.

This just allows for uses of Snibbets as both a note reference and a snippet manager. It probably won’t effect people who are using it “as intended,” but opens up new use cases.

To get the latest version, use gem install snibbets. See the project page for more details.

Like or share this post on Mastodon or .


BrettTerpstra.com is supported by readers like you. Click here if you'd like to help out.

Twitter | Mastodon | GitHub | Privacy Policy

]]>
2023-06-17T09:43:00-05:00
Doing with multiple sections https://brett.trpstra.net/link/535/16160573/doing-with-multiple-sections https://brett.trpstra.net/link/535/16160573/doing-with-multiple-sections Funny story: I got a feature request for mdless to allow multiple sections to be specified in the output, but I misread the notification as a request for Doing. So I spent a couple hours adding multiple section handling to an array of Doing commands and happily reported the result to the user, who was very confused by the version number I gave him. I apologized and have now added multiple section handling to mdless, which was a lot less work than adding it to Doing. So I might as well write a blog post about the Doing feature nobody asked for, I guess.

Most of Doing’s many commands allow for the specification of a particular section, e.g. the show command can limit its results to just one section, or the tag command can tag the last X entries from a given section. Now, almost all of these commands can take multiple sections, either specified as -s section1,section2 or by using multiple -s flags in the same command, e.g. doing show -s currently -s later.

This allows a little more flexibility, especially for display commands. It also means you can perform actions on a more limited set of entries without limiting it to just a single set. It (obviously) doesn’t apply to the now command or other entry commands because an entry can only be in one section.

By the way, section names are fuzzy matched, so you can specify that you want results from both Currently and Later (assuming you have such sections) with -s curr,lat.

If I expand this further, I’ll allow negative arguments as well, such as doing show -s -archive to exclude the Archive section. But for now it’s just multiple sections.

That’s all for now, just figured I’d mention it since I put the effort into it. You can update to the latest with gem install doing (which might require sudo, depending on your setup).

Like or share this post on Mastodon or .


BrettTerpstra.com is supported by readers like you. Click here if you'd like to help out.

Twitter | Mastodon | GitHub | Privacy Policy

]]>
2023-06-03T11:54:00-05:00
Some Ultimate Hacking Keyboard configuration tips https://brett.trpstra.net/link/535/16150699/some-ultimate-hacking-keyboard-configuration-tips https://brett.trpstra.net/link/535/16150699/some-ultimate-hacking-keyboard-configuration-tips uhk-key-cluster-rb.jpg

This post will only be of interest to those using the Ultimate Hacking Keyboard (UHK), specifically with the lefthand key cluster module. I recently added some customizations I thought might be worth mentioning to those who happen to have this setup. For those who don’t, maybe read on and be tempted by the possibilities…

The latest version of the Agent software for the UHK allows the definition of up to four additional Function layers, or sets of keys that are mapped when a modifier is held down. You’re probably used to the Mod layer, which is how you turn I/J/K/L into arrow keys, etc. when you hold the Mod key, and the Fn layer, which turns 1 into F1 when you hold the Fn key. By clicking the down arrow on the layer bar, you can now check boxes next to Fn2-Fn5 layers to enable them. Then you can assign keys to trigger them, which is where the key cluster module comes in.

The key cluster module provides 3 extra keys to the right of your B key and Space key (by default it’s the Mod key, but I swap my Mod and Space keys). I initially assigned these to R on the top (B when Mod is held, creating Run and Build buttons in Xcode and other IDEs, and a Refresh button in most other apps), and Enter and Backspace on the bottom two keys (Numpad Return and Forward Delete when Mod or Fn is held). But then I realized they could further function as triggers for other layers.

You can assign a secondary function to any key, which is an action that’s performed when it’s held while another key is pressed. For example, I change the default Mouse key into Caps Lock (which becomes my Hyper key along with Karabiner Elements), and use the secondary function on the Tab key so that when it’s held in combination with other keys, it triggers the Mouse layer.

The bottom left key of the module is a very natural reach for the left thumb, and was the first layer I created. I added a Fn2 layer, and then assigned the secondary function of that key to trigger the Fn2 layer when held. Now I can map anything on the right side, and on the left side I can map anything easily reached by my remaining fingers when my left thumb is holding the module key down.

I assigned A-G (home row) keys to F20-F24, which I then use with BetterTouchTool to trigger actions. I also assigned the block of keys from Y-O down to N-. on the right side to produce characters I commonly use in coding, such as curly/square/angle brackets. It took a while to get used to using those instead of reaching for the actual keys, but it does speed things up with a little practice.

Then I added a Fn3 layer, and made it so that when the right bottom button of the module was held, the other two buttons turn into PgUp and PgDown, and B and Space turn into Home and End. This is essentially the same as holding down my (repositioned) right Mod key and using the arrow cluster on my right hand, but gives me easy one-handed left-handed scrolling while my right hand is on the trackpad. I haven’t added anything else to that layer yet.

The top key on the module triggers the Fn4 layer, which simply turns the bottom two keys into [ and ] for forward back navigation.

I’ll expand the Fn3/4 keymaps as I find needs for them, but one step at a time. I’ve made the mistake of programming complex layers (and entire other keymaps) and then having to make extensive cheat sheets to remember where everything is until I develop muscle memory for them.

Bonus tip: The Fn layer by default only affects the number keys, so there’s a whole lot of room for mapping other functions to letter keys. I turn a block of keys on the right to be media controls:

I hope that provides some interesting ideas for your own customizations. If you’re interested in this kind of thing but haven’t looked into the UHK, I highly recommend checking it out. Splurge on the wrist wrests and the key module!

Like or share this post on Mastodon or .


BrettTerpstra.com is supported by readers like you. Click here if you'd like to help out.

Twitter | Mastodon | GitHub | Privacy Policy

]]>
2023-05-27T12:20:00-05:00
Never let your email inbox exceed its quota again [Sponsor] https://brett.trpstra.net/link/535/16132268/never-let-your-email-inbox-exceed-its-quota-again-sponsor https://brett.trpstra.net/link/535/16132268/never-let-your-email-inbox-exceed-its-quota-again-sponsor Thanks to Sanebox for sponsoring BrettTerpstra.com this week! Sanebox has just introduced a new feature called Deep Clean, a way to reclaim your storage quota with smart batch deletes of old emails. Check it out for free and save yourself the headache of running out of space.

Is your email close to going over its storage limit? With our new free tool Deep Clean, you’ll never have to worry again. Use Deep Clean to quickly sort and delete unnecessary emails in bulk so you never have to pay for extra storage again. The best part? It’s free.

Get It for Free

Like or share this post on Mastodon or .


BrettTerpstra.com is supported by readers like you. Click here if you'd like to help out.

Twitter | Mastodon | GitHub | Privacy Policy

]]>
2023-05-18T10:40:00-05:00
NiftyMenu update for Ventura https://brett.trpstra.net/link/535/16105972/niftymenu-update-for-ventura https://brett.trpstra.net/link/535/16105972/niftymenu-update-for-ventura niftymenuheader-rb.jpg

Not so long ago I wrote a little script that would generate an HTML playground of any MacOS app’s menu bar, primarily for the purpose of generating screenshots. It has a full automation API and you can script screenshots with fuzzy name matching, meaning menu items names and positions can change and your automated screenshots will still work. It’s a very specific use case, but I shared it because it took way too much time and I would love it if it helped even one other person.

Yesterday I updated the menu styling to match Ventura, which uses new submenu indicators, slightly smaller font sizes by default, and slight changes to background opacity and hue. The results should look like a passable rendition of the latest operating system now. You can check out the demo here.

NiftyMenu also got its own project page on this site, with full documentation and installation instructions.

Like or share this post on Mastodon or .


BrettTerpstra.com is supported by readers like you. Click here if you'd like to help out.

Twitter | Mastodon | GitHub | Privacy Policy

]]>
2023-05-04T08:51:00-05:00
Web Excursions for April 29, 2023 https://brett.trpstra.net/link/535/16097178/web-excursions-for-april-29-2023 https://brett.trpstra.net/link/535/16097178/web-excursions-for-april-29-2023 Brett holding map

Web excursions brought to you in partnership with Backblaze. Back up everything.

Everything wrong with Twitter’s new verification system.
I lost my blue checkmark in April, and by the time it happened, I was grateful to have it gone. It used to actually mean something, now it’s just a badge of support for Musk and his leadership.
Default Folder X 6.0: A tour of what’s new
Love the Quick Search idea. Beta is available for download if you’re a registered DFX user.
Pixelmator Photo gets AI-powered selective adjustments and a new
Pixelmator is now Photomator, and comes with AI selection tools that are very tempting.
Auto Tape Wrapping Machine Is Amazing For Cable Management
I wish I was handier (and had a lot more tools), this is exactly the kind of hack I would love to build on a whim.
What the Chef!?
Enter your available ingredients, get a recipe to use them. In my experimentation, it actually did a great job without requiring a grocery store trip for additional ingredients.

Backblaze securely backs up your entire computer to the cloud, affordably and reliably. I trust it with all my data. Check it out today.

Like or share this post on Mastodon or .


BrettTerpstra.com is supported by readers like you. Click here if you'd like to help out.

Twitter | Mastodon | GitHub | Privacy Policy

]]>
2023-04-29T10:15:00-05:00
SaneBox could be your secret weapon against email overload [Sponsor] https://brett.trpstra.net/link/535/16094378/sanebox-could-be-your-secret-weapon-against-email-overload-sponsor https://brett.trpstra.net/link/535/16094378/sanebox-could-be-your-secret-weapon-against-email-overload-sponsor Thanks to SaneBox for sponsoring BrettTerpstra.com again this week! I don’t know what I would do without it.

Ever feel like you’re drowning in a sea of emails? You’re not alone. We know the struggle of managing important emails while fighting spam messages with flashy sales. For every 10 emails from sources you don’t even remember subscribing to, you get one important one. When you find it, it feels like you’ve already finished a long task, doesn’t it?

Finding important messages shouldn’t feel like a battle between you and your inbox. In fact, why do you have to sort through all these unimportant files in the first place?

In a world of relentless digital communication, email overload is a common struggle. But SaneBox can help you to conquer your inbox once and for all! Using AI, SaneBox learns your email habits and sorts incoming messages precisely, so you can achieve the ultimate victory: a perfectly organized inbox.

Let’s explore this service in a quick overview!

Why SaneBox Stands Out

  • AI-Powered: SaneBox’s algorithms learn your email behavior and customize your inbox management experience. So, if you want to see your favorite brand’s discounts in the same inbox as your collaborator’s messages, you’ve got it!
  • Personalized Prioritization: High-priority emails stay in your main inbox, while lower-priority messages move to a separate folder for later review.
  • Focus-Driven Features: With tools like Do Not Disturb, you can pause incoming emails and concentrate on your tasks without distractions. You can come back to them whenever you’re ready.
  • Universal Compatibility: SaneBox works with any email service. So whether you’re using Gmail, Yahoo, or Outlook, you can tame that inbox.

Key SaneBox Features

  • Smart Filtering: Automatically sorts emails based on your habits and priorities as soon as they reach your inbox. It’s like having a personal assistant to filter your inbox (but without the awkward daily interactions).
  • SaneNoReplies: Tracks messages you’ve sent without a response, making it easy to follow up.
  • Customizable Folders: Organize your emails effortlessly with custom-made folders for all your categories and priorities.

When it comes to pricing, Sanebox is an inexpensive choice. You can get a free trial to experience the difference in email management without any commitment. Plus, the app offers flexible monthly plans starting at just $7. It’s really that affordable!

Check out SaneBox today, sign up today and save $25 on your subscription.

Like or share this post on Mastodon or .


BrettTerpstra.com is supported by readers like you. Click here if you'd like to help out.

Twitter | Mastodon | GitHub | Privacy Policy

]]>
2023-04-27T08:00:00-05:00
Web Excursions for April 25, 2023 https://brett.trpstra.net/link/535/16091472/web-excursions-for-april-25-2023 https://brett.trpstra.net/link/535/16091472/web-excursions-for-april-25-2023 Brett holding map

Web excursions brought to you in partnership with Backblaze. Back up everything.

Swell AI: Automate writing podcast shownotes & articles

Swell AI automates writing articles, summaries, social posts, time-stamped show notes and more for your podcasts and videos.

Luciole - Typeface

Luciole (French for “firefly”) is a new typeface developed explicitly for visually impaired people.

LetsAsk.AI
Another way to build a chatbot for a website, using your own data. Tested it out with the Marked help website, did a pretty good job. Not good enough to include the chatbot in the help yet, but I see potential.
kudoai/duckduckgpt

DuckDuckGo add-on that brings the magic of ChatGPT to search results.

Trackify
Analytics for Spotify. If you like seeing your music listening quantified in various ways, this is an intriguing service for just that.

Backblaze securely backs up your entire computer to the cloud, affordably and reliably. I trust it with all my data. Check it out today.

Like or share this post on Mastodon or .


BrettTerpstra.com is supported by readers like you. Click here if you'd like to help out.

Twitter | Mastodon | GitHub | Privacy Policy

]]>
2023-04-25T12:48:00-05:00
Static blogs and Mastodon https://brett.trpstra.net/link/535/16087044/static-blogs-and-mastodon https://brett.trpstra.net/link/535/16087044/static-blogs-and-mastodon mastodon-rss-rb.jpg

I use FeedPress to handle this blog’s RSS feeds. It reads my statically-generated RSS feed and gives me subscriber stats, as well as the ability to send new posts to social media endpoints. But it lacks Mastodon integration, and I’m spending most of my time on Mastodon lately (find me at @ttscoff@nojack.easydns.ca). So I wanted my new posts on this blog to automatically post to Mastodon. The script in this post could be used with any blog that generates an RSS feed, but is mostly geared toward static blogs.

I got started with a post from Dr. Drang called “Announcing New Posts on Mastodon”. It included a Python script that I referenced to create a Ruby script for my needs. Thanks to the Doc for getting me started!

You can find the script here. See below for configuration and usage.

Configuration

To configure the script, at minimum, you need your Mastodon endpoint and an auth key. Your endpoint is generally your Mastodon instance URL with /api/v1/statuses appended to it, e.g. https://mastodon.social/api/v1/statuses. I’m not sure if this is ever not the case. The auth key can be generated by going to your Mastodon homepage, clicking the Settings gear icon, and choosing Development. Create a new application with any name, your blog url as the website, and leave the Redirect URI as is. Make sure it at least has permission to write:statuses. You’ll then see a client key, a client secret, and an access token. All you need is the access token for this script.

Set up the script by updating MASTODON_ENDPOINT (as described above) and MASTODON_AUTH (with your access token).

You’ll also need to configure the RSS feed. The script can parse JSON or XML feeds of your blog (local files or URLs) to find the latest post. If you want to use a JSON feed, set JSON_FEED to either a local JSON file (~ is fine for your HOME directory) or a JSON feed url. If you’re using an XML feed, set JSON_FEED to nil, and set RSS_FEED to either a local file or url. With FeedPress, my JSON is generated from my XML and both feeds can take a few minutes to update, and the most immediate list of posts I have is the local atom.xml file generated with my site, so that’s what I have mine set to. That way I can run this script immediately after a new deploy and still get the latest post.

The rest of the settings in the script are the template used for the status (POST_TEMPLATE), an optional query string that can be appended to the URL for campaign tracking, etc. (QUERY_STRING), and then a few options for updating front matter. I imagine most people won’t need the front matter bit, but the options are commented if you need them.

It records what it posts to a local JSON file (location set with TOOTS_DB), so it won’t post the same thing twice. Optionally, it can go back and add a mastodon: [TOOT_URL] key to the original Markdown for the post. I’m using this to render a Mastodon link on each post that links to the toot so that people can reply/share it from their Mastodon account (since Mastodon doesn’t/can’t offer a “Toot This” link the way Twitter can, as far as I know)1. For most people this step is probably unnecessary, and can be disabled entirely by setting the ADD_FRONT_MATTER constant at the top of the script to false.

Usage

All of the necessary config is commented, should be pretty easy to get running. Rather than rely on Ruby’s Net/HTTP library, it just uses curl to make the call, so you need a curl binary available (this is default on most systems).

To use the script, save it as toot.rb and run chmod a+x toot.rb on it. If properly configured, you can just run ./toot.rb to toot the latest post from your feed. If you want to test, use --debug (or just -d), and it will set the visibility=direct parameter that will make the resulting Mastodon post show up only for you (private).

You can run ./toot.rb --last-ten to toot the last 10 posts. Use ./toot.rb -h to see available options.

By default, when the script creates a new toot, it will notify you on STDERR. It will also output NEW_TOOT: [TOOT_URI] to STDOUT, which is what I use to detect whether a new toot was created and trigger a rebuild. You can disable all output with --silent (or -s).

Updating Front Matter

If you want to use the front matter updating “as is” in the script, it requires that your blog posts be named to match the url. It takes the url path, substitutes slashes for dashes, and removes index.html and any trailing slash from the url to create the slug, then adds .md. So if your post is at https://brettterpstra.com/2023/04/21/im-on-shrooms-like-right-now/, the resulting file it will look for is 2023-04-21-im-on-shrooms-like-right-now.md. If your naming scheme is anything else, it would require manual editing to work.

For reference, I have this script run as part of my Rakefile :deploy task. Once the site is fully deployed, it runs toot.rb and toots the latest post. If the script returns NEW_TOOT on STDOUT (meaning the post has never been tooted before and the front matter for the tooted post has been updated), it will re-render and deploy the site again so that the Mastodon link on the newest post goes live. Presumably, although that’s about to be tested when I publish this post. It’s a bit of a hacky workaround, but I can’t toot it until the post is live, and I can’t get the Mastodon link until it’s tooted, so it takes twice to get it right. It will only ever toot a post once, so updates and re-renders won’t be doubled.

task :generate_deploy do
  # [Deploy tasks...]
  toot
end

def toot
  exe = File.join(__dir__, 'toot.rb')
  res = `#{exe}`.strip
  Rake::Task[:generate_deploy].invoke if res =~ /^NEW_TOOT/
end

In Closing

I hope that FeedPress eventually adds Mastodon sharing to its social services, but my current setup really likes having the actual URL for the associated Mastodon post available, so that wouldn’t do much good in this scenario anyway. I hope this script is helpful to other people using static blog setups and wanting Mastodon integration.

If you do generate your own RSS feed and don’t currently get statistics from it, I do recommend checking out FeedPress. It’s affordable, and great for blogs and podcasts.

Again, you can find the script in this gist.

  1. I considered just using JavaScript to load the JSON record that this script creates and inject a Mastodon link on the front end (avoiding multiple renders), but for a few reasons decided I’d rather add a hardcoded link at render time. 

Like or share this post on Mastodon or .


BrettTerpstra.com is supported by readers like you. Click here if you'd like to help out.

Twitter | Mastodon | GitHub | Privacy Policy

]]>
2023-04-21T12:49:00-05:00
Markdown to Bike conversion https://brett.trpstra.net/link/535/16078222/markdown-to-bike-conversion https://brett.trpstra.net/link/535/16078222/markdown-to-bike-conversion I’m liking outlining in Jesse Grossjean’s latest app, Bike, for my outlining needs. It’s a simple outliner that can save the content of its outlines to Bike files, OPML documents, or plain text. And its native document format is plain HTML that’s easy to work with.

As an aside, Jesse just released Shortcut actions for Bike, making it possible to do some automation of Bike and Bike documents. I haven’t played around with it much yet, but if you’re into Shortcuts, check out what’s available.

One thing that Bike lacks is an easy way to convert Markdown lists to Bike outlines. It can actually read indented plain text just fine, but the list markers are included in the node text, and blank lines become empty nodes instead of being compressed. Running a list through a Markdown processor and saving as .bike can often create an invalid file, as Bike requires every list item to contain a paragraph tag, not bare text.

I initially played around with running Markdown through a Markdown processor and then manipulating the output, but ultimately went with a much simpler version that compresses newlines and removes list markers, putting the resulting indented text in your clipboard. Pasting the result into a Bike document should almost always yield the expected result.

Save the script below as md_to_bike in your PATH and run chmod a+x path/to/md_to_bike. It can be called as a pipe or on a file. To call it as a pipe, run cat myfile.md | md_to_bike. To call it on a file, just provide the path to the file as an argument: mmd_to_bike path/to/myfile.md. The results will be placed in your clipboard, ready to paste into a Bike document.

md_to_bike.rbraw
"
#!/usr/bin/env ruby
# frozen_string_literal: true

# This script takes simple Markdown lists and converts them for use in
# Bike (https://www.hogbaysoftware.com/bike/), a Mac outliner app from
# Hog Bay Software.
#
# It doesn't handle nested code blocks or any non-list Markdown. It just
# turns simple lists into text Bike will recognize when it's pasted into
# a Bike document. Multiple paragraphs in a list item become additional
# nodes at the same level.

require 'shellwords'
require 'fcntl'

stdin = $stdin.read.strip if $stdin.stat.size.positive? || $stdin.fcntl(Fcntl::F_GETFL, 0).zero?

if !stdin && ARGV.count != 1
  exe = File.basename(__FILE__)
  puts "#{exe} requires one argument"
  puts "#{exe} [markdown file]"
  Process.exit 1
end

source = ARGV[0]

# Read input file
content = stdin ? stdin : IO.read(source).strip
# Remove spaces from empty lines
content.gsub!(/^\s*\n/, "\n")
# Replace consecutive empty lines with a single newline
content.gsub!(/\n+/, "\n")

# Replace 2 or 4 spaces with tabs (based on detected indentation)
m = content.match(/^ {2,4}/) # find first indentation
indentation = m ? m[0].length : 1 # determine whether first indent is 2 or 4 spaces
content.gsub!(/^( {#{indentation}})+(?=\S)/) do |m| # Replace leading spaces with tabs
  mtch = Regexp.last_match(0)
  mtch ? "\t" * (mtch.length / indentation) : m # tab * detected indent / detected indentation
end

# Replace markdown list markers
content.gsub!(/(\s*)[+*\-] /, '\1')

# Copy result to clibpoard
`echo #{Shellwords.escape(content)} | pbcopy`

puts "Results in clipboard. Paste into a Bike document."

Hope that’s of use to somebody.

Like or share this post on Mastodon or .


BrettTerpstra.com is supported by readers like you. Click here if you'd like to help out.

Twitter | Mastodon | GitHub | Privacy Policy

]]>
2023-04-18T13:09:00-05:00
Snibbets plain text code snippet manager reborn https://brett.trpstra.net/link/535/16073537/snibbets-plain-text-code-snippet-manager-reborn https://brett.trpstra.net/link/535/16073537/snibbets-plain-text-code-snippet-manager-reborn Snibbets banner

Over 20 years of writing scripts and apps I’ve collected a lot of “snippets” of code that I save whenever I solve a problem and think I’ll want the solution again in the future. I like these snippets to include notes and links, and I need to be able to easily search them and grab the code when I need it without much effort. That’s why I wrote Snibbets back in 2020.

I’ve now refactored Snibbets as a gem and vastly improved its capabilities. I wanted the simplicity of creating snippets in nvUltra and searching them quickly from the command line, getting just the code I need with a few keystrokes. I keep iTerm in Visor mode, so it’s a hotkey away, and just as convenient as any quick find panel in a dedicated snippet management app.

Snibbets now has its own project page where you can read all about its features and options. You can also see all the code, file bug reports, and make feature requests on GitHub.

Here’s a quick overview, though.

Snippets Are Markdown Files

A snippet is just a Markdown file, where the filename becomes the title, optionally with additional extensions that help the syntax highlighter, e.g. symbolize hash keys.rb.md. The document can contain tags in MultiMarkdown metadata format, titles as # headlines, additional notes, and the code snippet either indented or fenced with optional language specifier. A single document can contain multiple snippets, separated with headlines as titles for each one.

Snippets all go into one folder. You don’t need to organize them into directories, that would defeat the purpose of the full text search in Snibbets. You can open that directory in any app that can handle it, such as nvUltra or Obsidian, and have full access for editing and creating new snippets.

Searching Your Snippets

To search your snippets, just run snibbets SEARCH TERMS. It will use a combination of Spotlight, find, and grep to find matches. If there’s more than one match, you’ll get a menu, and if the selected file contains more than one snippet, you’ll get a second menu. The code from the snippet is output to the console without any accompanying notes.

You can run with --edit to open the selected snippet in your editor to see all of the notes or update the code. You can also use --nvultra to open the snippet in nvUltra, assuming you’re on the beta. You can also run with --copy to copy just the code to your clipboard in addition to displaying it in the console. Run snibbets -h to see all available options.

Filtering

When multiple results/snippets are detected, a menu is generated. If you have fzf installed, it will be used for the menu, allowing fuzzy searching to narrow results. If you don’t have fzf but do have gum installed, that will be used and is almost as good for this purpose. Failing that, Snibbets will generate its own menu and you’ll have to enter a number to get the snippet. fzf and gum are far superior, so I recommend installing one or the other.

Syntax Highlighting

I put a lot of time into syntax highlighting. You can use either Pygments or Skylighting (separate installations), and you can configure the theme. Syntax definitions are picked up from the filename and from language specifiers on fenced code blocks. It looks really great using Skylighting and the Nord theme (as shown in the video above). To enable this, edit your config (snibbets --configure) to include:

highlight: true
highlighter: skylighting
highlight_theme: nord

Snibbets will avoid highlighting anything going to the clipboard or being piped or redirected to other commands. Keeps things tidy.

It’s a simple tool1, but it makes it feasible for me to store all of my code snippets in a way that allows nvUltra to become my main code snippet manager, and gives me instant access to any snippet from the command line. Just what I needed.

Check out the project page or see it on GitHub.

Support Brett's work with a donation, or sponsor me on GitHub!

  1. though you wouldn’t know it based on the number of hours I’ve put into it lately. 

Like or share this post on Mastodon or .


BrettTerpstra.com is supported by readers like you. Click here if you'd like to help out.

Twitter | Mastodon | GitHub | Privacy Policy

]]>
2023-04-16T10:33:00-05:00
Syntax highlighting is fun, and you won't believe this one weird trick https://brett.trpstra.net/link/535/16071938/syntax-highlighting-is-fun-and-you-wont-believe-this-one-weird-trick https://brett.trpstra.net/link/535/16071938/syntax-highlighting-is-fun-and-you-wont-believe-this-one-weird-trick highlighted code screenshot

Over the last couple of days I got obsessed with wrangling my code snippet collection, once again. It’s not healthy, but it is what it is. I dug back into Snibbets, a tool for managing code snippets as plain text Markdown files that I started back in 2020. I actually got it to a really good point today, but I’m realizing that it’s getting bloated enough that it needs to become a gem before I’m ready to hype it up. The current version and mostly-up-to-date documentation are up on GitHub, though, so feel free to peek in the meantime.

But that’s not what I’m here to tell you about. In the process of working on Snibbets, I wrote a little routine that could turn a file extension into a programming language name for tagging purposes, and vice versa. It seemed ripe for making a little one-off utility, so I’ve posted a standalone version to GitHub. I’m going to be using it when I’m doing technical writing and including code samples in languages I don’t usually work with. When you create a fenced code block, you can add a “lexer” to the opening fence, e.g. ~~~ruby, which helps most platforms with properly syntax highlighting it. But then I find myself working on someone else’s Terraform code and I’m unsure whether that’s a supported language for syntax highlighting. Now I can just run lexers.rb terraform or lexers.rb tf and it will tell me all about it. What the available lexers are, what common extensions are associated with it, you know, the works.

I built this by taking the output of pygmentize -L lexers and running it through a few regular expressions to make a parseable data set. Then I took the output of skylighting -l to add a few more lexers (though those don’t have extensions listed and I don’t know many of the more obscure ones, so that data serves to search for a valid lexer, but nothing else). The script itself just builds a queryable object out of the data and offers a few different ways to get at the data (you can see the whole set at the bottom of the script). The easiest way to use it is like I mentioned above: just pass a file extension or language name to it as an argument and it will give you back the info you need. There’s more documentation in the comments of the script.

Just thought I’d share it! Check out the gist if you’re interested.

Like or share this post on Mastodon or .


BrettTerpstra.com is supported by readers like you. Click here if you'd like to help out.

Twitter | Mastodon | GitHub | Privacy Policy

]]>
2023-04-14T15:40:00-05:00
I forgot about the Titlecase API https://brett.trpstra.net/link/535/16070204/i-forgot-about-the-titlecase-api https://brett.trpstra.net/link/535/16070204/i-forgot-about-the-titlecase-api I made a little web service back in 2015 and somewhere in the following 7 years I forgot about it. I’ve been adding title-casing to various projects and plugins and keep writing new code for it… which was the whole reason I built the API to begin with.

It just accepts a text string and returns an AP titlecased version as plain text. That’s it. No bells or whistles, but if you need to incorporate title casing into a script or a Shortcut or anything else that can make a quick call to the web, it’s a great answer.

Just make a call to https://brettterpstra.com/titlecase/?title=the%20text%20to%20titlecase, where title= contains the url encoded string you want to title case. You can play with it on the test page, which will also show you the url to use to get the same result.

That’s all. It’s a silly little thing, but if I’ve forgotten about it, I bet everyone else did, too, and it might just be handy for someone.

Like or share this post on Mastodon or .


BrettTerpstra.com is supported by readers like you. Click here if you'd like to help out.

Twitter | Mastodon | GitHub | Privacy Policy

]]>
2023-04-13T14:32:00-05:00
Just checking in https://brett.trpstra.net/link/535/16068629/just-checking-in https://brett.trpstra.net/link/535/16068629/just-checking-in I haven’t been posting much besides sponsored posts and web excursions for a while now. I figured it was time for a checkin for the sake of those who check this blog regularly, and especially for the benefit of those who offer financial support to me and all my projects.

As you probably know, I have bipolar disorder. Most of my project releases and blogging spurts correlate with manic episodes. And manic episodes are bad for me — they result in a severe sleep deficit that is shortening my life. But I’ve been remarkably stable lately, the downside of which is no late night coding/creating binges or the inescapable bursting of ideas that I just have to share with the world. It means I do my job, I maintain and support my commercial software, I fix reported bugs in my free projects, and I go to bed. It doesn’t lead to a lot of fun software releases, blog posts, or new ideas in general. Sleep is good, stagnation kills me.

I’ve recently been realizing that my version of “stable” is more akin to depression. The thing is, I can’t take antidepressants without risking triggering a manic phase, which leaves me in a position where I either have to be depressed, or deal with the life-shortening effects of constant mood fluctuation. But I think I have a potential solution…


I removed the meat of this post because it was causing friction with my loved ones. I don’t want my activities to cause any undue harm, so I’ll save further sharing on this topic until everything is… decriminalized.


So that’s my check-in for now. You can hear more up-to-the-minute updates on my progress (as well as Jeff and Christina’s) by tuning into the Mental Health Corner on Overtired. I appreciate all of the support (monetary, pull requests, and even just kind emails) that you all have continued to provide for me. It really helps me stay motivated to maintain my 100+ projects and create new stuff!

Like or share this post on Mastodon or .


BrettTerpstra.com is supported by readers like you. Click here if you'd like to help out.

Twitter | Mastodon | GitHub | Privacy Policy

]]>
2023-04-12T15:41:00-05:00
Keep your software up-to-date effortlessly with MacUpdater [Sponsor] https://brett.trpstra.net/link/535/16060213/keep-your-software-up-to-date-effortlessly-with-macupdater-sponsor https://brett.trpstra.net/link/535/16060213/keep-your-software-up-to-date-effortlessly-with-macupdater-sponsor Thanks to MacUpdater for sponsoring BrettTerpstra.com this week! I’m a dedicated user and swear by this app for keeping my system updated. The latest version just makes everything even easier.

MacUpdater scans and displays all installed software on your Mac — see at a glance which apps or plugins are out of date, and click to automatically update them!

  • MacUpdater provides version information for over 60,000 apps (and growing) and over 6,000 of the most popular apps can be updated directly from within MacUpdater with a single click
  • MacUpdater also now supports automatic, zero-click PKG installs
  • The Pro edition adds support for audio and media plugins
  • MacUpdater is flexible — you can control MacUpdater from the main app, the menubar, or the command line
  • It’s a universal build and fully compatible with Apple Silicon

What’s new in MacUpdater 3

  • Optional zero-click, fully-automatic, scheduled app updates (PRO)
  • Added Apple-silicon migration assistant to help move to new Macs
    • Find out which of your Rosetta-based apps could be ‘Apple Silicon’-native if you update or upgrade to the latest version
    • Find out which of your ‘Rosetta’ based apps could be Silicon-native if you reinstall them
  • Track supported branches other than the ‘Latest Version’
    • When an app vendor also supports an old branch of an app with further updates, users have the choice of either using the latest version or tracking the updates to the major version which they are using
    • You can see a list of apps that currently support this feature (more will be added based on user requests)
  • Select how apps should be updated (auto, custom updater, manual update)
  • Attach and display Finder-compatible tags and comments to your apps, and support custom homepages or updater apps via clickable comments

Save 15% on MacUpdater with code BRETTTERPSTRAQ1. Check it out today!

Like or share this post on Mastodon or .


BrettTerpstra.com is supported by readers like you. Click here if you'd like to help out.

Twitter | Mastodon | GitHub | Privacy Policy

]]>
2023-04-06T08:00:00-05:00
Find which of your favorite apps are on Setapp, revisited https://brett.trpstra.net/link/535/16056931/find-which-of-your-favorite-apps-are-on-setapp-revisited https://brett.trpstra.net/link/535/16056931/find-which-of-your-favorite-apps-are-on-setapp-revisited Back in 2019 I wrote a little script that would parse your Applications folder and tell you which of your apps were available on Setapp. The goal was to help you figure out which apps you were already using that were also on Setapp, so you could use the Setapp version and direct a little of your subscription fee to your favorite developers.

The script parses the setapps/apps page to see what apps are available, and the markup has changed since I originally wrote the script. Thankfully, Chuck Plater updated the script in a fork to work with the current markup. I’ve implemented his changes in the original script and it’s once again working fine.

To use the script, save it to a text file called onsetapp.rb, then run chmod a+x onsetapp.rb on it. Once you’ve done that, you should be able to execute ./onsetapp.rb and get a list of applications you use that are also available on Setapp.

Thanks to Chuck for the fix. I hope all Setapp subscribers will go to the trouble of using the Setapp version of apps they already own, it really does help the developers (and this script makes it easy). If you’re not already a Setapp user, here’s my affiliate link to start using hundreds of apps for $10 a month.

onsetapp.rbraw
"
#!/usr/bin/env ruby
# encoding: utf-8

# Read /Applications/Setapp to get apps already installed
installed_setapp_apps = Dir.glob('/Applications/Setapp/*.app')
installed_setapp_apps.map! {|app|
  File.basename(app,'.app')
}

# Grab the All Apps page from Setapp to get all available apps
apps_page = `curl -SsL https://setapp.com/apps`
setapp_apps = apps_page.force_encoding('utf-8').scan(/<app-details\s*name=\"(.*?)\"/m).map {|match|
  match[0]
}

# Read /Applications for non-Setapp apps on the system
apps = Dir.glob('/Applications/*.app')
apps.map! {|app|
  basename = File.basename(app,'.app')
  # Setapp disallows version numbers in app names. Strip them from
  # /Application apps for consistency in matching
  basename.sub!(/\s*\d+$/,'')
  basename
}

setapp_apps.sort.uniq.each {|app|
  if apps.include?(app)
    # App is on Setapp
    out = "Setapp has: #{app}"
    if installed_setapp_apps.include?(app)
      # Setapp version is installed (or at least proxied)
      out += " (Installed)"
    end
    $stdout.puts out
  end
}

Like or share this post on Mastodon or .


BrettTerpstra.com is supported by readers like you. Click here if you'd like to help out.

Twitter | Mastodon | GitHub | Privacy Policy

]]>
2023-04-04T16:58:00-05:00
Curio 25 with Smart Collections [Sponsor] https://brett.trpstra.net/link/535/16026152/curio-25-with-smart-collections https://brett.trpstra.net/link/535/16026152/curio-25-with-smart-collections 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!

Like or share this post on Mastodon or .


BrettTerpstra.com is supported by readers like you. Click here if you'd like to help out.

Twitter | Mastodon | GitHub | Privacy Policy

]]>
2023-03-16T08:00:00-05:00