Author: Krishna

  • My Favorite Alfred Workflows

    My Favorite Alfred Workflows

    Alfred is my go-to application launcher. It goes well beyond launching applications, particularly if you have the Alfred PowerPack.

    Below are four of my most used Alfred Workflows. All are free, with the ability to install each automatically within the application:

    Unit Converter

    Alfred UnitConverter.

    Quickly convert units (inches to km, degrees to radians, etc.) from Alfred. Use the keyword conv followed by a number, and Alfred shows you a list of common conversions.

    Currency Converter

    Alfred currency converter.

    Ever want to know what $15.72US converts to in English pounds? Currency Converter makes currency conversions like this one instantaneously.

    Coffee Coffee

    Alfred coffee coffee.

    There’s no real need for a dedicated “keep Mac awake” app with Coffee Coffee. Type coffee to keep your Mac awake indefinitely. Type coffee 15 and your Mac will stay awake for 15 minutes, and so on. Super useful.

    About Mac

    This Workflow displays your Mac’s specs right from within Alfred. With it, I no longer need to visit System Settings. Quickly identify macOS version number, memory, storage, resolution, uptime and more by simply typing about within Alfred’s text field.

    -Krishna

  • Two Key Photoshop Settings Most New Designers Overlook

    Two Key Photoshop Settings Most New Designers Overlook

    No matter how much memory you have on your computer, it seems that Photoshop always wants more. And when Photoshop exhausts all available RAM on your machine, it uses your computer’s internal storage. This can become an issue of your computer’s internal boot drive is almost full. The less space you have on your boot drive, the more performance degradation will occur, culiminating in the dreaded “Scratch Disk is Full” dialog.

    To prepare against this inevitability, I strongly recommend having a dedicated Scratch Disk connected to your computer. A Scratch Disk acts as temporary virtual memory that can be used to store, read and write project data. Instead of writing this data to my Mac’s internal drive, Photoshop will write to an external storage device connected to my Mac. The sole purpose of this drive is to act as a Scratch Disk. For the type of work that I do, a 512GB SSD more than suffices. 

    Photoshop ScratchDisk.

    Most Adobe applications include the option to assign a dedicated Scratch Disk, so the very same storage device I’m already using for Photoshop can serve as a scratch disk for Illustrator, Premiere, After Effects etc. Visit your Photoshop > Settings > Scratch Disks tab to assign your Scratch Disk. If need be, more than one scratch disk can be assigned. This can be helpful if you’re working with really, really large or complex files. If Photoshop can’t find your dedicated scratch disk (because its unplugged, etc.), it will use your computer’s internal drive. 

    The second key setting I recommend adjusting is under Photoshop > Settings > Performance.  You’ll want to adjust these settings based on your intended use case. I typically work with files that are 9” x 12” at 600ppi. The largest size canvas I work with is 24” x 36”. As such, I have provisioned Photoshop to use half of my system’s memory. For History and Cache, I opted for the “Web / UI Design” option, electing to have 20 History States instead of 50. (History states refer to the number of Undos available.) The larger the number, the more the RAM usage.

    Photoshop Performance.

    Your mileage (and settings) may vary. But it’s important to be aware of these factors as they can play a dramatic role in how Photoshop performs.

    -Krishna

  • FrugalMac: My Mac Software Stack: July 2026

    FrugalMac: My Mac Software Stack: July 2026

    As of mid July 2026, here is an inventory of the apps I have installed on my 14” M5 Pro MacBook Pro (aka FrugalMac). All prices are listed in US dollars. For convenience, I’ve arranged my software stack into categories

    MacOS apps2.

    Essentials:

    Alfred 5.x with PowerPack (~ $80)* – app launcher, clipboard manager, text expansion

    HyperKey (free) – remap CapsLock key to Shift Option Command Control combo

    Rectangle 0.96 (free) – window management

    1password ($36 / year) – password manager

    BBEdit 16 (free version) – text editor

    Fantastical ($59 / year) – advanced calendaring app

    Utilities:

    Mole ($9) – app management, disk analysis, cleanup

    Bloom ($16) – Finder replacement

    Carbon Copy Cloner ($50) – disk cloning backup

    EasyDMG (free) – one click DMG installs

    Ghostty (free) – powerful Terminal replacement

    Image2Icon (free) – make custom icons

    macShot (free) – screenshot maker

    Recordly (free) – screen recording software with intelligent zoom

    SiliconScope (free) – menubar stats for Apple Silicon Macs

    Synergy ($19) – share one keyboard and mouse across multiple computers

    Backblaze ($99 / year) – encrypted cloud backups

    PastePal ($15) – Universal Clipboard for iPhone and Mac

    Helium (free) – privacy first Chrome-based browser

    Productivity:

    MS Teams** (web app)

    MS Word** (web app)

    OneDrive** (web app)

    Notion Calendar (web app)

    Zoom (free**)

    RSS / Blogging/ Social Media:

    Indigo ($36 / year) – Mastodon / BlueSky client

    NetNewsWire (free) – RSS reader

    Instagram (web app)

    YouTube (web app)

    MarsEDIT ($60) – Blogging

    Design:

    Adobe Creative Cloud ($50/month)**

    Pica (free) – font mangement 

    Pika (free) – color picker

    * purchased a MegaSupporter license more than a decade ago

    ** provided by the college

    One-time purchases: $249

    First year subscriptions: $230

    Total cost: $479

    Software costs ebb and flow, so this is just a snapshot of where things are at almost two months in with my new Mac laptop. My needs and requirements will most certainly grow and change over time. 

    -Krishna

  • ClipArt Studio Lets You Make Collages in a Web Browser

    ClipArt Studio Lets You Make Collages in a Web Browser

    Every now and then I come across a really neat website that brings genuine delight. Such is certainly the case with ClipArt Studio

    The site presents itself as a virtual cutting board. On the left panel are two tabs where you can select from magazines or images. (All usable content comes from the Interactive Archive magazine rack and Wikimedia Commons CCO.)

    Clipart studio.

    To use it, simply drag a magazine cover or image onto the cutting board and you are given options to rotate, trim, scale or place an image in front or behind other images you’re working with. Trimming can be accomplished through a virtual X-acto knife or a simplified lasso tool. This isn’t Photoshop precision – it’s very much mimicking the act of making imprecise cuts akin to using a blade or a pair of scissors

    Users can not only make a collage, they can download their creations as a JPG or PNG. Users can also upload their own photos to use within this interactive application. And the best part is after you make your collage, you don’t have to clean up any leftover paper scraps

    Hat tip to Kottke.org.

    -Krishna

  • FrugalMac: On the Topic of Backups

    FrugalMac: On the Topic of Backups

    Backups are important. As I’ve often stated to my design students: “There are two types of computer users in the world: Those who have lost data and those who are about to lose data.”

    I’ll leave the sermonizing to others on why backups are important. For my own needs, having backup data is not merely an option: it’s essential.

    My Mac backup tool of choice has always been SuperDuper, by Shirt Pocket Software. I’ve been using it for longer than I remember. It’s served my needs throughout its tenure. I didn’t mind its somewhat dated looks, but lately it’s been giving me some issues, and I decided it was time to investigate other players in this space.

    SuperDuper’s main competitor is Carbon Copy Cloner (CCC, for short), by Bombich Software. Before committing, I downloaded the program (currently at version 7.15) and took advantage of its free 30 day trial. I won’t go through an exhaustive list of its features, but I was very impressed with how easy it was to get up and running. CCC’s on-boarding is excellent. Even though I consider myself to be a Mac power user, I was impressed by how easy and intuitive it was to set up a new backup task with Carbon Copy Cloner.

    Within a day of using it, I purchased a license.

    This isn’t to say that SuperDuper is bad. It’s not. I just want more than what SuperDuper can give me. Without making this a full-blown review, I wanted to highlight a few Carbon Copy Cloner features that won me over.

    1. Tool tips are on by default during the on-boarding, and provide step-by-step guidance.
    2. CCC feels fresh and sports a modern macOS look. Commonly used features are easily accessible without having to hunt for them.
    3. CCC lets users customize drive icons from within the app. I didn’t expect this, but I was delighted the feature exists.
    4. CCC speaks “user friendly” – you don’t have to be a geek to understand it.
    5. Awesome customer service. I emailed a question to Bombich Software and received a courteous, informative reply.

    Right-clicking on a source or destination drive shows the connectivity chain of a storage device. A small, but nice touch.

    CCC drive settings.

    Status updates are shown in CCC’s menu bar. At a glance, I can check when a backup task was last run, and whether or not the backup was successful.

    CCC menu items Large.

    And that’s just scratching the surface of what the program can really do. As a SuperDuper user for many years, Carbon Copy Cloner won me over with its meticulous attention to detail and ease of use. As such, it rightfully earns its place in my FrugalMac build.

    -Krishna

  • Video: Creating an Environment Digitally from Start to Finish

    Video: Creating an Environment Digitally from Start to Finish

    Taking a slight detour from my usual “how to” instructional videos, I wanted to share my process of creating an environment from start to finish. I work in Photoshop, and start with a large, dominant shape using polygon lasso tool. From there, I consider depth, scale, and focal point.

    Orange monolith.

    -Krishna

  • The Pleasant Feeling of a Forced Reprieve

    The Pleasant Feeling of a Forced Reprieve

    A sobering fact: There’s not much you can do on a modern computer without the Internet.

    But there was a time when that didn’t matter. My first computer was an Apple IIGS. It came with a display, CPU, keyboard and a 3.5” and 5.25” floppy drive. I remember spending countless hours messing about on this wonderful little computer – exploring the file system, running AppleWorks, and playing a few games. All without any network connectivity whatsoever. 

    A few short years later, I remember begging my dad to purchase an Applied Engineering Datalink 2400 baud modem for my IIGS. With this device, I could connect to online services like GEnie or one of the many local bulliten boards in our town. GEnie was expensive ($6US per hour), so I used it sparingly. (I remember it took the better part of 40 minutes to download a Breakout clone.)

    I spent hours hopping from one BBS to another, all for the price of tying up our family’s phone line. “I’m on the modem!” was a common refrain I’d yell when my mom or dad tried to use our landline. I’m sure it was annoying for them, because within a few months they succumbed and purchased a dedicated phone line for my computer shenanigans

    I’m writing this post on my MacBook Pro. Our neighborhood has had no power or Internet for the past few hours, thanks to a thunderstorm. As I sit and type this, I feel a sense of solitude.

    So while there’s not much I can do with a modern computer when the Internet’s down, I don’t seem to really mind.

    -Krishna

  • FrugalMac: Dipping My Toes into Making Bespoke Automation Tools

    FrugalMac: Dipping My Toes into Making Bespoke Automation Tools

    In spite of my engineering background, I’ve never considered myself to be a coder. In college, I took a few required programming courses in both Assembler and C++. Those two classes, while informative, were never my cup of tea. (I also took a Fortran class as a freshman, and let’s just say – my very first introduction to the subject of programming was a nightmare.)

    I preferred solving Karnaugh maps and building analog amplifiers.

    Although my engineering days are long behind me, I still carry the engineer’s mindset: fixing problems and using tools to improve my productivity. Automation scratches that engineering itch.

    Up until recently, my instant go-to has been to purchase software tools to solve specific problems. There’s nothing wrong with that. It’s often easier and more efficient to buy a working solution than to make one from scratch.

    With my new MacBook Pro (aka FrugalMac), and some time on my hands, I wanted to try my own hand at solving some productivity problems before resorting to a purchase. In other words, I wanted to make my own bespoke tools. 

    My first challenge was to create an automation that would automatically delete files in a specific folder after a specific interval of time. Whether I’m writing or teaching, I take a lot of screenshots. As such, these files accumulate inside my Screenshots folder. The same holds true for the resultant resized images that I use for posting content online.

    To summarize, I wanted a script that would allow my Mac to:

    1) Automatically delete images from the Screenshots folder after 3 days.

    2) Delete images from the resized images folder after 7 days.

    As a bonus, I wanted the script to be reusable, should I wish to perform similar tasks on other folders on my Mac. I wasn’t exactly sure how to go about this task, so I consulted with ChatGPT. It suggested I start by creating a shell script.

    Part 1: Evaluating Files for Deletion

    The shell script’s job is to examine the files within a specific folder and delete those that meet the specified condition. For reuse, the script would require three input parameters:

    1) TARGET: The folder path. (i.e. where to evaluate files for deletion) 

    2) RETENTION_DAYS: The number of days to hold the file before deletion.

    3) DRYRUN: a TRUE / FALSE toggle for testing the specified condition without deleting any files.

    Because these values are passed into the script rather than hard-coded, the same script can be reused for any folder simply by supplying different parameters.

    After iteration and testing, below is the resultant shell script (called cleanup-folder.sh):

    #!/bin/zsh
    
    # ============================================================
    # cleanup-folder.sh
    #
    # Deletes files older than a specified number of days from
    # one target folder.
    #
    # Subfolders are not scanned.
    #
    # Usage:
    #
    #   cleanup-folder.sh "/path/to/folder" retention_days dryrun
    #
    # Examples:
    #
    #   cleanup-folder.sh "$HOME/Screenshots" 3 false
    #   cleanup-folder.sh "$HOME/Screenshots/resized images" 7 true
    #
    # Arguments:
    #
    #   $1  TARGET folder
    #   $2  RETENTION_DAYS
    #   $3  DRYRUN: true or false
    #
    # Important:
    #
    #   Files are permanently deleted. They are not moved to Trash.
    # ============================================================
    
    TARGET="$1"
    RETENTION_DAYS="$2"
    DRYRUN="${3:-false}"
    
    ############################################################
    # Validate Inputs
    ############################################################
    
    if [[ -z "$TARGET" ]]; then
        echo "Error: No target folder provided."
        exit 1
    fi
    
    if [[ -z "$RETENTION_DAYS" ]]; then
        echo "Error: No retention period provided."
        exit 1
    fi
    
    if [[ ! "$RETENTION_DAYS" =~ '^[0-9]+$' ]]; then
        echo "Error: Retention period must be a whole number."
        exit 1
    fi
    
    if [[ "$DRYRUN" != "true" && "$DRYRUN" != "false" ]]; then
        echo "Error: Dry-run setting must be true or false."
        exit 1
    fi
    
    if [[ ! -d "$TARGET" ]]; then
        echo "Error: Target folder does not exist:"
        echo "$TARGET"
        exit 1
    fi
    
    ############################################################
    # Convert Days to Minutes
    #
    # Using minutes avoids the unintuitive behavior of find's
    # -mtime test, which counts completed 24-hour periods.
    ############################################################
    
    RETENTION_MINUTES=$((RETENTION_DAYS * 24 * 60))
    
    ############################################################
    # Process Files
    #
    # -mindepth 1 prevents find from evaluating the target folder.
    # -maxdepth 1 prevents it from entering subfolders.
    ############################################################
    
    if [[ "$DRYRUN" == "true" ]]; then
        echo "DRY RUN: Files older than $RETENTION_DAYS day(s) in:"
        echo "$TARGET"
    
        find "$TARGET" \
            -mindepth 1 \
            -maxdepth 1 \
            -type f \
            -mmin +"$RETENTION_MINUTES" \
            -print
    else
        echo "Deleting files older than $RETENTION_DAYS day(s) in:"
        echo "$TARGET"
    
        find "$TARGET" \
            -mindepth 1 \
            -maxdepth 1 \
            -type f \
            -mmin +"$RETENTION_MINUTES" \
            -delete
    fi
    
     
     

    The script can be run from the Terminal:

    ~/Scripts/cleanup-folder.sh ~/Screenshots 3 false

    In the example above, I’m telling the script to:

    • examine the Screenshots folder,
    • delete files older than 3 days, and
    • actually perform the deletion (false)

    For testing purposes, I can substitute true for the final argument, causing the script to simply list the files that would be deleted.

    One interesting lesson I learned during development involved the find command. My original version relied on -mtime, which groups files into completed 24-hour periods. That produced some unintuitive results where files lingered longer than expected. I eventually switched to -mmin, converting days into minutes, which made the retention period much more precise.

    I also modified the script so that it only processes files in the specified folder rather than descending into subfolders. That allowed me to assign different retention periods to my Screenshots folder and its resized images subfolder without the two interfering with each other.

    One important note: the script permanently deletes matching files rather than moving them to the Trash. Since these folders only contain temporary working files, I was comfortable with that tradeoff.

    Part 2: Scheduling the Task

    After getting the script working properly with manual intervention, I was ready to automate it. Automating the script required two things: supplying the input parameters and telling macOS when to execute it. The shell script knows how to perform the cleanup, but it doesn’t know when to run. That’s where a LaunchAgent comes in. A LaunchAgent is defined by a small property list (.plist) file that tells macOS:

    • what program to run
    • what arguments to supply
    • when to run it.

    Using the Terminal, I created a file called com.krishna.cleanup-screenshots.plist and placed it into my $HOME/Library/LaunchAgents folder. Inside this file are the Program Arguments (containing the three inputs) and Calendar Interval (I want the script to run at 3AM every day).

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
    "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    
    <plist version="1.0">
    <dict>
    
        <key>Label</key>
        <string>com.krishna.cleanup-screenshots</string>
    
    <key>ProgramArguments</key>
    <array>
        <string>/bin/zsh</string>
        <string>/Users/kms/Scripts/cleanup-folder.sh</string>
        <string>/Users/kms/Screenshots</string>
        <string>3</string>
        <string>false</string>
    </array>
    
    
    <!-- Run once whenever the LaunchAgent is loaded -->
        <key>RunAtLoad</key>
        <true/>
    
        <!-- Run every six hours -->
        <key>StartInterval</key>
        <integer>21600</integer>
    </dict>
    </plist>
    
     
     

    Originally, I scheduled the LaunchAgent to run every morning at 3:00 AM using StartCalendarInterval. During testing, however, I discovered that relying on a fixed time wasn’t ideal for my workflow. Instead, I updated the LaunchAgent to run whenever I log into my Mac (RunAtLoad) and then every six hours thereafter (StartInterval).

    That change makes the automation far more resilient. Rather than depending on a specific time of day, the cleanup simply runs periodically in the background while I use my Mac.

    Part 3: Letting the Mac Run the Task

    The Mac manages its tasks through launchd. As I understand it, here’s what happens:

    At 3:00 AM each day, launchd loads the LaunchAgent defined by com.krishna.cleanup-screenshots.plist. The LaunchAgent then starts /bin/zsh, which executes cleanup-folder.sh using the arguments supplied in the plist.  Or, put another way:

    Login


    launchd


    LaunchAgent (.plist)

    passes folder path
    passes retention period
    passes dry-run setting


    cleanup-folder.sh

    examines files


    Deletes files older than
    the specified retention period
    
    
    
    
    

    I applied the same approach for my resized images folder. All I needed to do was create a separate .plist file (called com.krishna.cleanup-resized-images.plist) with its own custom arguments.

    Screenshots -> retain for 3 days

    resized images -> retain for 7 days

    Both LaunchAgents use the exact same shell script.

    Summary:

    What I like most about this solution isn’t that it automatically deletes screenshots. It’s that the automation is modular. The shell script performs one job well, while each LaunchAgent provides the configuration for a specific task. If I later decide to automate cleanup for another folder, I don’t need to write another script. I simply create another LaunchAgent with a different folder path and retention period.

    FrugalMac tip: This entire solution uses tools already included with macOS:

    • zsh (shell)
    • find
    • launchd
    • LaunchAgents (.plist files)

    No third-party utilities are required.

    Wouldn’t using a program like Hazel be easier? Yes. But would it be as satisfying for me? Definitely not. 

    -Krishna

    I updated this article on 7/12 to reflect the fixes I incorporated, as well as improve overall clarity.

  • FrugalMac: Do I Need to Install Standalone Microsoft apps?

    FrugalMac: Do I Need to Install Standalone Microsoft apps?

    At work, our college uses Microsoft products, such as Word, Teams, and OneDrive. In the past, I have begrudgingly installed these items as stand alone apps on my Mac.

    Why the begrudgement?

    Simply put: These apps are big, bloated and stacked with performance inefficiencies

    With my FrugalMac build, I asked myself one question: “Do I really need to install stand-alone apps from Microsoft, or could I get by with using the web versions?”

    MS web apps.

    So I took it upon myself to set up Word, OneDrive, and Teams as web applications on my Mac. Conveniently, Safari includes an option to turn any web page into a dock-able app, so that’s exactly what I did. Incidentally, these “apps” reside within the Applications folder located within my Users folder.

    The verdict is still out. All three apps seem to launch quickly enough in my brief testing. I have no idea if this approach will suffice for my needs, but if I can keep extra software (particularly from Microsoft) from encroaching itself on my new Mac laptop, it’s worth giving it a go.

    -Krishna

  • FrugalMac: Text Expansion

    FrugalMac: Text Expansion

    Text expansion is my most frequently used Mac automation. Instead of typing in the same phrases over and over again, I can distill them into text expansion macros. 

    For example, if I were to type a small snippet, such as:

    ;wel

    it will expand to:

    Welcome to the course! Please make sure to review the syllabus and purchase the text we will be using this term. I look forward to seeing you in class.
    
    Best, 
    
    
    Prof. Krishna

    In a nutshell, I simply type in a few characters, and out comes some boilerplate text. Pretty nifty, right?

    Prior to setting up my new M5 Pro MacBook Pro (aka FrugalMac), I used a commercially available Mac text expansion app called Typinator. I’ve used Typinator for almost a decade at this point. It’s excellent at what it does, but it’s mostly overkill for my needs.

    Instead of blindly installing Typinator onto my new Mac, I dug in a little deeper to investigate whether text expansion capabilities were already present within the software currently available on my laptop. 

    Lo and behold, they were!

    Alfred’s PowerPack includes text expansion capabilities. They’re located inside Alfred’s Preferences panel, within Features > Snippets. Snippets can be organized into Collections. In my case, my Signatures Collection includes custom e-mail signoffs. I have different sign-offs depending upon whether I’m replying to a student or a colleague. I have set up an Academics Collection which includes commonly used phrases that I frequently use when responding to common inquries from my students. 

    Alfred Snippets.

    Within each collection are related snippets. Below is a screenshot showing one of my custom snippets. The keyword, in this case, is the trigger. Typing it will cause Alfred to optionally auto-expand with the boilerplate text I’ve provided. One nice convenience with Alfred is the ability to place the cursor where you want, after an expansion. This is done by way of the {cursor} argument. Once the expansion is complete, the cursor automatically moves to where the {cursor} argument is located. I can quickly type in the student’s first name, without having to skip a beat.

    Alfred individual Snippet.

    Alfred does 90% of what I want in terms of its text expansion capabilities. It would be terrific if I could add dynamic input during a text expansion, as Typinator already provides, but it’s not a deal breaker. I have to admit that there’s a certain sense of satisfaction in making the most out of what I already have.

    -Krishna