Author: Jag Talon

Caps Warlock and Alarm Pup Released

I recently released two new apps on Caps Warlock and Alarm Pup.

Caps Warlock is an AutoHotkey script that I’ve been working on to make the Caps Lock key more useful. It adds useful keyboard shortcuts to desktop apps like Figma, Firefox, and Sublime Text. It doesn’t support that many apps yet, but I’m slowly adding features to it.

Alarm Pup is a countdown timer that I worked on during the holidays to help me take breaks and timebox tasks during the workday.

Try it out! I hope you find it useful.

Giving in 2021


Here’s a summary of my donations this year!

  • I’m continuing to donate to GiveWell through the Maximum Impact Fund. This money is granted to charities that save people’s lives by preventing deadly diseases like malaria (400k deaths/year) and vitamin A deficiency (200k deaths/year).
  • I donated more to GiveDirectly than I did last year to give money directly to the poorest households.
  • I made my donations more granular this year and added a date column, too. I like that I add additional rows instead of editing existing rows because it’s less error prone.
GiveWell (Employer Match)$1,000.00
GiveDirectly (COVID-19)$600
GiveWell (Employer Match)$1,000
GiveWell 01-01-2021 $300
GiveWell 02-01-2021 $300
GiveWell 03-01-2021 $300
GiveWell 04-01-2021 $300
GiveWell05-01-2021 $300
GiveWell06-01-2021 $300
GiveWell07-01-2021 $300
GiveWell08-01-2021 $300
GiveDirectly (Employer Match)12-06-2021$1,000

Ear Transit Released

I made a desktop app called Ear Transit! It’s a tiny tool that lets you listen to background noise on your computer even if you’re not connected to the internet. It currently has 4 background noises at the moment, but I’ll be adding more pretty soon. Right now it only runs on Windows, so I’m also hoping to port it to other operating systems when I find the time.

Playing multiple background noises on Ear Transit.

It’s written in HTML, CSS, and JS using the Sciter Engine, but I actually started out by building a prototype using Lazarus / Free Pascal. I loved the drag-and-drop interface builder and that it compiles everything to native code, but I struggled with it because I’m unfamiliar with the language and the tooling. I guess I’m just impatient, but I eventually gave up and went with the web development tools because that’s more familiar to me. I chose Sciter over Electron because of the small runtime—the whole thing weighs about 8MB compared to Electron which is at 80MB. I wanted the app to be as small as possible because all it does is play audio files.

The app at launch uses only 13MB of RAM so I’m very pleased with the leanness of the app. The memory usage does grow as you play the background noises though because the MP3s are loaded into RAM so I’ll have to look into ways of minimizing that.

Ear Transit on the app.

Head on over to to download Ear Transit! I hope you like it. I also recently released the code on Sourcehut.

Figma ♥ AutoHotKey

An illustration of a cat with the hotkey "ctrl+zzz"

I found out about AutoHotKey last week because I was looking for a lightweight alternative to Logitech Options. My plan was to remap the buttons on my mouse and be done with it. But after going through the AutoHotKey tutorial, I realized that it’s actually much more powerful than I thought. It got me excited because I felt like it could open up a whole world of customization possibilities to me.

The first thing I wanted to do with it was to improve my design workflow on Figma because I use this app quite a bit. To localize my hotkeys to Figma, I put this directive at the top of my Figma.ahk file:

; Look for Figma.exe
#IfWinActive, ahk_exe figma.exe

This means that everything written below this line will only apply to Figma.

Fast toggling between tools

Toggling between the Hand tool and Move tool.

I switch between the Hand tool (h) and the Move tool (v) a lot, but I often find myself looking down to readjust my hand on the keyboard because my left hand would rather hang out around the Ctrl and Alt keys area.

I figured it would be easier if I could switch between the tools with just my mouse. So I mapped the 4th and 5th extra buttons to h and v in AutoHotKey and that allowed me switch tools using my thumb. In AutoHotKey, these buttons are XButton1 and XButton2 so all I did was to point them to h and v respectively.

The v and h keys are now toggled using my thumb. Much easier!
; Hand Tool
; Trigger: 4th mouse button

; Move Tool
; Trigger: 5th mouse button

Switching between tabs

Moving between two tabs.

When I’m designing, I often have two tabs open: one file has the components (the component library) and another file has the instances. I move between these two files often which is why I want tab switching to be as effortless as possible.

I know that there are a few ways to switch tabs on Figma, but unfortunately none of them feel fluid to me. After some experimentation, I ended up mapping the left tilt of my scroll wheel to Ctrl + Shift + Tab and the right tilt to Ctrl + Tab. It’s simple, but it works wonderfully. It basically lets me switch tabs with just one finger!

The middle button can tilt left and right so I mapped that to switch between tabs.
; Move between tabs
; Trigger: Left and right wheel tilt

Running Figma plugins

Running quick actions and launching the Find and Replace plugin.

As far as I can tell, there’s no easy way to map a specific Figma plugin to a keyboard shortcut on Windows (you can do it on macOS though). The fastest way that I can think of is through “quick actions” which is triggered by pressing Ctrl + / and then typing in the plugin name. That got me thinking … maybe I could let AutoHotKey run quick actions and type in the plugin name for me?

This is where I started to see the power of AutoHotKey. It doesn’t just let you map a set of buttons to another set of buttons—it can also do any sort of arbitrary action for you! With my setup, whenever I press Ctrl + F, AutoHotKey runs the Find and Replace plugin by doing the following:

  1. Presses Ctrl + / to bring up quick actions.
  2. Waits a little bit because the quick actions search bar doesn’t show up instantaneously.
  3. Types in “find and replace” to bring up the plugin.
  4. Presses Return to run the plugin.

It’s hacky, but it works! I also have Component Page plugin mapped to Ctrl + Alt + K and Similayer plugin mapped to Control + Alt + F.

; Function to run Figma Plugins
FigmaPlugin(searchQuery) {
	; This triggers Quick Action
	Send, ^/
	; Issues come up when things are typed instantaneously
	Sleep 500
	; Search for the plugin
	SendInput, %searchQuery%
	Send, {Enter}

; Run the Find and Replace Plugin
; Trigger: Control+F
FigmaPlugin("find and replace")

Super Nudge

Notice the X and Y values incrementing by 100 pixels.

Figma lets you move a selection with a keyboard: pressing the arrow key moves the selection by 1px and pressing the arrow key while holding down Shift moves the selection by 10px. But what if we want to move the selection over a larger distance?

I saw the question on Figma’s forum, and I wanted to see if I can do it myself with AutoHotKey. After a bit of research, I learned that you can specify the number of key presses with a one liner—no looping needed! Here’s an example: if I wanted to hold Shift and press the left arrow key ten times, I can type in Send, +{Left 10}. That’s it. Then I mapped this to caps lock because I almost never use that key:

; Nudge selection 100px to the top/bottom/left/right
; Trigger: CapsLock+[Up/Down/Left/Right]
CapsLock & Left::Send, +{Left 10}
CapsLock & Right::Send, +{Right 10}
CapsLock & Up::Send, +{Up 10}
CapsLock & Down::Send, +{Down 10}

What’s next

It’s only been a week, but I feel like I’ve already improved my workflow thanks to AutoHotKey. I’ll definitely be tweaking things as I go but for now I feel like I’m in a good place with it. My AutoHotKey scripts can be found here.

Screencast showing tool switching (using extra mouse buttons), tab switching (using middle button), and plugin launching (using hotkeys).

Organizing Photos / New Camera

The Lumix LX10 camera

I have a messy collection of photos (with the occasional screenshots) because I never got in the habit of organizing them in the past. I’ve also been stupidly storing them in a lot of different places (iCloud, OneDrive, Dropbox, Instagram, etc.), so it’s a bit of a pain to get them all in one place. That’s why I’ve been hesitating to do anything about it because I thought it would take me forever to go through and sort them all.

But the other week I finally had the energy to sit down and sort this digital mess. I got everything that I could into one folder and downloaded digiKam to help me manage the chaos. I slowly started sorting photos into their own albums and also started tagging people.

I’m pretty proud of the result, and now I feel like I’m at the point where I can start sharing these photos. I was looking for a place to host them, and I ended up going with Flickr. Now that they’re not owned by Yahoo! / Oath, I feel good about their future.

The album can be found on Flickr.

Organizing my old photos got me excited about taking new ones, so I also got a dedicated camera as well. I’ve taken most of my photos on my iPhone, but I’ve always been disappointed with the lack of zoom and how pixelated they look when I transfer them to my laptop. So I looked for a camera that’s both better than a phone, but smaller than an SLR and ended up getting the Panasonic Lumix LX10.

The Panasonic Lumix LX10 on my desk.

I’ve been trying it out this weekend, and I’m pretty happy about it! Here are some test shots that I took:

Test Shots 1:

Test Shots 2:

It’s my first time trying RAW photos, too, and it’s been fun processing those on darktable. Stay tuned for more photos!

Visiting Longwood Gardens

A row of flowering bushes at the Longwood Gardens

Today I got to visit Longwood Gardens. If you’ve never been, it’s basically a huge plot of land filled with a wide assortment of beautiful and pristine-looking plants. I think the last time I visited was 6 years ago so I definitely need to go to this place more often.

It was relaxing and it wasn’t hot outside so we just went on a stroll and gawked at plants for four hours. There were a lot of flowers this time of year so the air smelled sweet and was buzzing with bees.

Staycationing for my 30th

Having a picnic with Andrea and Finn at the park.

Yesterday was my 30th birthday! I wanted to celebrate by going on a little weekend vacation. We usually travel, but we decided to stay local this time because of COVID’s resurgence. So we just drove to a different part of town just three miles outside of our apartment to staycation at a hotel for the weekend.

We loved it. We walked around Rittenhouse Park, had picnics, met lots of dogs, and ate good food. Even though we stayed local, we appreciated the change of environment and we saw Philly from a more leisurely perspective.

Kettlebells, Shakespeare, and Stews

A bowl of North African bean stew with visible peppers, yogurt, and fennel fronds visible.

I had such a hard time working out from home in 2020. I bought a pull up bar, a pair of dumbbells, and a set of resistance bands, but I couldn’t get the habit of exercising to stick. I’ve been attending classes for so long that I didn’t really know how to work out on my own. But now that I’m vaccinated, I’ve started attending kettlebell classes at a nearby Muay Thai gym, and I’m feeling much stronger than I used to and I’m really enjoying it. I never really used kettlebells in the past, and it blows my mind how versatile this cannonball is.

I’ve been going out more often these days, too. Recently, I went out to see a live Shakespeare play for the first time called Pericles, Prince of Tyre. It was really fun to watch. The actors were so talented and animated. And it was free! It’s also impressive that they also did aerial gymnastics at the same time.

Clark Park before the show starts.
Clark Park before the show started.

Other than that, I got to make my favorite stew this week: North African bean stew. It’s pretty simple, but it does take a bit of time and requires a bit of mise en place. It’s definitely worth making, though.

A bowl of north african bean stew with visible peppers, yogurt, and fennel fronds visible.
A bowl of North African bean stew with visible peppers, yogurt, and fennel fronds visible.