2023 State of the Tools

Several office tools arranged around paper and paper flags.
Photo by Dan Cristian Pădureț on Unsplash

It’s time for another review of my current toolkit!

With a new job and a new city, I needed to re-assemble my work computing setup from scratch and am now running MacBooks both at home and work, so there are a number of changes. I also completely overhauled our home network. Quite a few software things have stayed the same, though.


I’m now primarily on Apple (MacBook Air M2 at home, 14” MBP w/ M2 Pro for work). This is working well, with much better performance and battery life than when I was on Windows (even on an i7 Surface Laptop).

I also maintain a small Windows remote desktop machine at work for software and class instruction testing, and got an iPad Air for reading and paper markup. Plus our old Windows desktop I mostly use for gaming.

Photo of my office setup.
University office compute setup (without CalDigit).

I now use a 27” 4K ASUS ProArt display. It looks great, and also works as a docking station if you don’t need a lot of ports or an ethernet connection. So far, the single 27” monitor with the laptop open on a stand is working; don’t have a pressing need to get a second full-size monitor.

I’m still using a Kensington Expert Mouse, now paired with a Keychron K15 Pro low-profile Alice keyboard. I’m liking the Keychron a lot; it doesn’t have quite the slope of the Microsoft ergonomics I’ve been using for the last several years, but it doesn’t seem to be triggering RSI recurrence. For mobile, nothing has changed; still on iPhone and Apple Watch, and don’t anticipate switching.

Keyboard Configuration Notes

Since the Keychron is a third-party keyboard, it has two important limitations on Mac: it can’t send a Mac “globe” keycode, and it doesn’t support Touch ID. There isn’t a way to fix the Touch ID situation, but since I don’t use Caps Lock, thanks to this comment I do have a fix for the globe key issue, which is the easiest way to enter emojis.

  • In Via, the config tool used by Keychron keyboards, change the following mappings:
    • map Caps Lock to Control (much more useful IMO)
    • map a macro key (I use M1) to Caps Lock
  • In the modifier key settings in macOS, set Caps Lock to work as the Globe key

With this, I can hit M1 on the Keychron to enter an emoji or special character. I also have a few other keymaps set (photo above was taken before setting them up):

  • Lock key sequence on one of the macro keys
  • Move Del above Delete
  • Map previous Del to Home, and other keys, so the top right column is Home / PgUp / PgDn / End.
  • Pressing the rotary encoder is F13 (which mutes Zoom), so I have an easy-access zoom mute button with my volume control.

At work, I also use a CalDigit TS4 docking station to have some extra ports and Ethernet, and have a 4TB Crucial SSD for expanded storage on my MacBook.

Video Recording & Conferencing

I didn’t feel like I was getting a lot of value out of the Logitech Brio’s extra resolution, so when setting up at Drexel I got a C920s instead. It is good enough, but not great; I think the Anker PowerConf C200 I have at home is better.

For audio, I’m very pleased with my new setup: a Shure MV7X connected to a Focusrite Vocaster USB interface, with Sennheiser HD 600 for listening. Call and recording audio quality is outstanding, and the headphones sound very good both for calls and music.

I’m still using Camtasia for recording and editing lecture videos. I have added OBS to my toolkit, along with the iPhone app, for capture from my phone camera when I need another camera (e.g. for a document camera). Another useful addition has been MacWhisper for generating video captions. Its speech recognition accuracy and segmenting logic are both very good, and it is significantly less expensive than Audiate (although without the text-based video editing capabilities).

Recommendations I’m very pleased with my microphone setup, but usually still recommend the Blue Yeti, especially in the Yeticaster configuration, to most people looking to upgrade their Zoom audio quality. The Yeti is very good at significantly lower cost than a Shure setup, although it is heavier and bulkier. If you do want the Shure, the regular MV7 connects directly to USB without needing a second interface. I wanted a greater degree of control and decoupling in my own setup, as well as the hardware controls of the USB interface.

Interactive Software

My general interactive computing has seen some changes, due to moving to macOS and a new university that doesn’t use GSuite. I have a subscription to SetApp, which yields a number of useful utilities.


Primarily browsing with Firefox; keep Chrome around for Google apps, and use Edge on my home laptop for accessing university things (Edge logged in to my Drexel account is a decent “quick check work email” experience).

I’m now using NetNewsWire as my RSS reader, because Feedly did something or another that made me pretty uninterested in continuing to use their service. I don’t currently have a good bookmarking service, since Pinboard is in a very low-maintenance mode and its creator decided that defending JK Rowling would be a good use of his influence.

Reading and Writing

I still use Office for most of my general writing, spreadsheets, and presentations, more so now that I’m at Drexel, where we have Microsoft 365 instead of GSuite. I still use Google Docs for a lot of collaborative documents, since it’s the de facto standard for academic collaboration, and Overleaf for authoring LaTeX. I’ve also started using Bike Outliner for note-taking, and may start using it to outline drafts.

I’ve switched back to Zotero, which I used during my Ph.D. and the couple years after. I liked PaperPile, but it is tied to Google accounts and requires Chrome.

For the last few months I’ve been using Highlights as my default PDF reader on both Mac and iPad, including for markup of student work; it doesn’t allow freehand drawing like Drawboard, which I miss sometimes, but it works well enough. I use Acrobat Pro for last-stage preparation and touchup of PDFs.

Switching to Mac has introduced a weird element to my document production workflow — Word now requires Microsoft cloud services to create workable PDFs (with tags, outlines, etc.) and behaves quite badly with fonts, and Acrobat Pro on Mac similarly does a very poor job and requires cloud services (also with font problems). Acrobat Pro for Windows still provides full-featured local PDF creation, so when I need to convert a Word document to PDF for class, I usually open it on my Windows remote machine and use Acrobat there.

General Productivity

I’m trying out Bike Outliner for general note-taking; it’s better than other non-cloud things I’ve tried, but the jury is still out. I’m also now using Taskpaper to track work to-dos and my runway document. I’m not entirely happy with it, but Bike doesn’t have good filtering capabilities, and the space of local-first infinite outliners or task managers that aren’t org-mode is rather thin. I’ve augmented it with a few user scripts and a custom style sheet, along with a command-line tool to print upcoming tasks across multiple Taskpaper files.

For better or worse, I’m now using Outlook for my e-mail and calendaring; it has definitely taken some acclamation, and on net I do prefer Gmail. Unfortunately, Drexel also disables IMAP, so if I want to write some scripts to fill in holes (which I’ve done before), I’ll need to do it with the Microsoft Graph API.

When I first started my new position, I tried out OneNote and To Do to see if they might meet my note-taking and task management needs, but To Do doesn’t allow the level of automation and fluid keyboard operation that I need.

At home, I use the Apple apps for email, calendar, and tasks, with our email on Fastmail and other things on iCloud.

System Utilities

There are a number of tools I use to make my day-to-day system usage better:

  • Commander One for file management, when I’m not just using Finder. I’ve also used Marta, but Commander One looks like a better option in the long term.

  • iTerm 2 as my terminal, with Hack as my terminal font. I’m very intrigued by Monaspace and am trying it out.

  • Soulver is a ridiculously useful little program for general calculations, including things I would have grabbed Excel for before.

  • Bartender to wrangle my menu bar icons.

  • iStat Menus for more useful status displays in the menu bar.

  • Secretive to store SSH authentication keys in Apple’s secure enclave.

  • 1Password for password management.

  • I just discovered Paste and will be trying it as a clipboard manager.


I also run quite a few different apps on my phone; a few that stand out:

  • OTP Auth for 2FA.
  • RPN48 for my primary calculator.
  • Signal (preferred) and WhatsApp for secure messaging.
  • RideWithGPS for bike ride logging.
  • Pixelmator to edit images.
  • ImgPlay for GIF editing.
  • UniChar to access a wider range of Unicode characters.
  • iPhone companions to much of the Mac software I use, such as NetNewsWire and Banktivity.

Command-Line Software

A lot of my computing is in the terminal. I tried fish for a while this year, but am now back on zsh. I’ve been trying oh-my-zsh, but I’m not sure about some of its configuration choices yet. Several augmentation utilities fill out my shell profile:

  • starship for my prompt.
  • direnv for managing per-project environment variables (including actiating a project’s Conda environment).
  • zoxide to navigate directories.

Beyond that, a very non-exhaustive list of tools I find useful:

  • nano for terminal text editing.
  • fd to search directory trees.
  • eza (successor to exa) for file listing. My terminal config aliases l to eza and ll to eza -l.
  • bat to view text & code files with syntax highlighting.
  • ripgrep to search file content.
  • dust and ncdu for analyzing disk usage.
  • jless to view JSON files.
  • tmux for terminal multiplexing.
  • watchexec to auto-rerun things on file changes (e.g. continuously rebuilding my website while working on it).
  • age for file encryption.
  • minisign when I need cryptographic signatures.
  • tokei to count source code.

Data Management

I’ve made some significant changes in my data management across the board this last year, so that seems to merit a section of its own.

I’m now storing university data on OneDrive, as that’s what Drexel provides. I also use OneDrive for most of my data syncing between my MacBook and iPad, although I share some files with iCloud. Each account has 5TB available, so it works pretty well. At home, I mostly use iCloud, and use an iCloud shared folder to share files between work and personal computers (I use separate Apple accounts for my home and work machines). I also store all photos in iCloud, and use shared albums to send files between my phone and university MacBook.

I use git for all of my source code storage and version management. To have greater control over when and where data files are synchronized and stored, I’ve started using git-annex for data archival (as well as the assets for my website). I still use syncthing for a few folders, but not as much as I used to.

We’ve switched our home endpoint backup from Backblaze to Kopia, to have them more under our control and to manage costs as Backblaze pricing has increased. It’s configured to store backups on our NAS, which synchronizes them to cloud storage regularly.

Recommendations Kopia is working well for us, with our requirements and infrastructure, but I still recommend Backblaze for most people, as it’s dead-easy to set up.

I’m still using dvc for experiment data. Recent versions have introduced some annoying regressions, but I don’t have a better solution yet.

Programming and Data Analysis

Visual Studio Code is still my primary programming editor across all languages I use.

I’m still using Python and Rust as my primary research languages. I’ve started dabbling in R again, as we use it in the class I taught this fall; I’m not sure long-term if what the R/Python balance will be for statistical analysis and visualization. I’ve also started using Quarto in place of Jupyter in some projects, and for rendering my data tools documentation.

The Polars library has been a useful addition for data processing, both in Python and Rust; it’s replaced Pandas for larger-scale data processing.

I’ve started using more TypeScript in my JavaScript programming, and that’s been quite useful; my website is entirely TypeScript now. TypeScript’s type system is one of the more expressive I’ve used, which has been fun, but it also has several escape hatches that turn the guarantees one would usually expect from a typechecker into more of set of best-effort guidelines. It still gives me higher confidence in code correctness. I expect a lot of my JavaScript work will be in TypeScript going forward, mostly with Deno when not in the browser.

Finally (on the general-purpose front), I’ve also been writing more Tcl in various places. I find it severely underappreciated and quite like it as a glue and scripting language, and the Jim interpreter makes it highly portable.

As noted above, I’m still using DVC for research data management and analysis pipeline automation. To work around the limitations of DVC’s pipeline language, I’ve moved away from the templates and weird TCL scripts I’ve experimented with in the past and now use jsonnet to generate non-trivial pipelines (see the Book Data Tools for an example).

One significant change in my programming across languages is that I have started using autoformatters when they are available. For Rust, this is the standard rust fmt; for Python, I’m using Ruff (it’s also replaced flake8 as my primary linter); and for TypeScript & JavaScript, I’m using deno fmt. I’m also using either Prettier or formatters built in to VS Code extensions for other languages like yaml and jsonnet.

I’m still using Conda — usually with conda-forge — for installing research software and Python development dependencies. It remains the best solution I’ve found for reproducible, cross-platform software environment installation.

Now that I’m back on Mac, I’m using Dash again for reading documentation, although I still do quite a bit of that in the browser.

Other Software & Services

In no particular order:

  • Banktivity for personal finance tracking.
  • Unsplash and The Noun Project to source images.
  • A number of other things that don’t come to mind right now.
  • Typeface for selecting fonts.

University Compute

I’m still getting my university compute needs and resources figured out, but I’ve started with one server node in our data center, with dual 64-core Epyc 7662, 256GB RAM, and an Nvidia A40 GPU.

Home Network

I completely overhauled our home network this year to get better Wi-Fi, upgraded network storage, and a firewall that hasn’t taken up conscientious objection to software updates. I’ve also standardized on Debian Stable across our servers.

It was time to replace our old QNAP NAS; its Atom CPU was old enough that it didn’t have hardware-accelerated crypto, and was having increasing trouble keeping up with the amount of data I wanted to run through it. I replaced it this year with a RockPro64 in Pine’s NAS case, with 2 8TB Toshiba hard drives. This machine runs Debian Stable, with syncthing, Samba, and git-annex for its primary data transfer roles. It also serves as our primary backup host with Kopia Backup.

NAS Configuration Details


  • RockPro64 board (RK3366 hex-core ARM CPU)
  • Pine NAS case
  • IO CREST SI-PEX40138 PCIe/SATA adapter (4x SATA ports + M.2 SATA slot)
  • 2x Toshiba N300 8TB NAS HDDs
  • Transcend 128GB M.2 SATA SSD (scratch space)
  • Pine eMMC module (boot drive)
  • Mid-profile heat sink
After some experimentation, I settled on formatting the primary storage with XFS on top of LVM RAID1, with the physical volumes encrypted on top of an integrity layer (using cryptsetup’s built-in integrity configuration support, so the integrity is a cryptographic MAC). ZFS is nice, but doesn’t use the kernel’s crypto accelerator support and doesn’t use Arm’s AES extensions on its own.

I also bought an R5C to serve as our firewall & router. This little box has an RK3568 SOC and 2 2.5Gbps Ethernet ports on the PCIe bus. It’s also running Debian stable, and thanks to inindev’s images is able to run a stock Debian install instead of Friendly’s images with difficult-to-update kernels. A 5-port switch and a TP-Link TL-WA3001 Wifi6 router complete our home network.

I’m using Tailscale for VPN connections between home, cloud, and my devices when on the move. It works great, and is much easier than managing Wireguard myself (or messing with our old router’s OpenVPN support). I also use a Tornado VPS server to host my website (behind Bunny CDN) and handle other coordination between home and remote devices.