Disclaimer: Lengthy Draft Period Most of this post was authored in June 2025 then sat around as a draft for 8 months (things got hard at work). But there's too much material for me to fully adjust it, so this is mostly a stale post with some small updates at the bottom X11, thank you for your service After struggling with getting awesomewm+X11 to respond fast enough to my leader keybind, for…
This fall I collaborated with my friend Brock on a guitar pedal project. It's based on a pedal schematic called "Yet Another Fuzz Face". Brock had done electronics projects but never designed and ordered a custom PCB. So I encouraged him to try inputting his schematic in KiCAD and designing a small circuit board he could mount into his guitar pedal enclosure. There was a pretty steep learning…
I made another custom desktop on the CNC with recesses for my split keyboard. I'm really happy with how it came out. I got the project finished up and installed over the Thanksgiving holiday break, and my wife painted two of the walls in my office - one has a logogram from the movie "Arrival", and the other is a geometric pattern. All this adds up to make my office looking and feeling so much…
I felt a need to review all the custom CAD projects I've done and write up something about them. Many of them are trivial and don't warrant any online posts or even sharing the models. But I knew I had done many, many of these and I wanted to survey them and look at patterns, skill building, actual utility, etc. The easiest data I have at hand is my git repo of .FCStd FreeCAD project…
I built a custom desktop on a CNC router. It's a 3-layer stack of 1/2" MDF. It has recessed areas for my split keyboard and coffee mug. Cables can tunnel through the middle layer of the desk. No this is not a desktop PC, it's literally the top of a desk. desktop view Project Goals Replace my add-on forearm rests with a single desktop Recess my split keyboard into the desk surface…
I propose to coin a new term: versiona non grata . This is to be used in software update mechanisms when a released version has severe problems and a forced update is warranted. You excommunicate that version and it becomes versiona non grata . Blogging this in case I actually created this phrase because it is great. But maybe it already exists and I just independently coined it.
I made another version of the kipra "kinda pragmatic" split ergonomic keyboard. It's a minor incremental evolution of the first version. Key changes are: thumb arc moved forward and outward quite a bit the extreme placement of v1 turned out to be not as great ergonomically as I predicted don't bother with hot swap sockets for the switches I'm ride or die for the moment on Kailh Choc…
For local development, json logs often have a bunch of fields you might want for production observability, but almost never care about for local development. The script below is a template you can use to filter out fields you know are noise while allowing all other fields to come through unchanged. It'll also pretty-print for easier reading. The basic approach is using jq to delete noise…
Hi product managers This post is written primarily for product managers instead of my usual engineering audience. I want to explain why engineers may be reluctant to build traditional numbers-based pagination. By this I mean a list page featuring page numbers counting up from page 1, often including both the total number of pages and links to jump to particular pages. 1 2 3 4 5 6 7 8 9 … 537 .…
I've run the full matrix of combinations of linux and macos between my work and personal setups. At this point I'm pretty comfortable switching. Linux will always have my heart but periodically I get fed up and just want a laptop that goes to sleep when you close the lid. I've recently seen some posts and since I did my most recent round of switching from an all-linux setup to…
I share links to tech articles and projects somewhat regularly in work slack, and a teammate recently asked how I keep up with industry pulse and trends. I'll snapshot my current resources even though it will quickly become outdated, but I also want to talk a little bit about the how things changed drastically in the last two years or so. So the basic narrative is: I got pretty deep into…
This guide will walk you through the process of building a kipra keybord. Parts List Caveat: parts availability changes quickly and vendor inventory tends to be come and go. Probably, you'll be able to get everything from 3 vendors, but some struggle may be involved. A pair of kipra v1 PCBs. I suggest PCBWay to fabricate boards for you The exact .zip file I uploaded to them is available in…
TL;DR (This post is over 4500 words. Sorry. Not sorry.) I made a split ergonomic keyboard called the kipra v1 using a generator tool called ergogen . kipra. It's kinda pragmatic. Introduction I've built a new split ergonomic mechanical keyboard called the "kipra". My daily driver for most of the past year has been a sofle choc, which is overall quite good and adequate for my current…
I've started a new position as Staff Engineer at Float Health. We're using a nice SaaS tool called Range for daily checkins as well as meeting agendas and notes. The workflow encourages everyone to write a small handful of bullets about the main things they worked on each day. We are lucky enough to have Range founder Dan Pupius working with us at Float Health, and I had to smile and…
I've been trying out a relatively new config file format called KDL . It's pronounced "cuddle" and here's a very quick run-down of what it's for and why I find it worth experimenting with. It's a general purpose data language that feels mostly like a blend of JSON, command line, and XML. So it would be useable for use cases including configuration files, data interchange,…
Motivation for this project So back in November 2022 there was a giveaway contest run by kbd.news . I entered and was one of the winners and we got a choice of various discount coupons, so I requested a discount over at bastardkb . I was very curious about the flexible PCBs Quentin uses in his low-profile dactyl-inspired builds. I had already made a DIY TBK Mini which is his 3x6+3 flavor. I 3D…
I have a lengthy history of cobbling together tools for working with documents written in markdown and getting them into PDF when interfacing with the default world who are not always plain text die hards. And I'm super excited about this post because this is finally actually both very easy and pretty nice. So I'll save some more of the journey and story for the bottom of this post, but…
Back Story For my entire time as a web developer, front end web layout has been a kludgey messy nightmare. I think about every few years since 1999 or so I spend a few days reading the latest CSS features that are the new hotness and advertised as finally going to solve pervasive problems with layout, centering, alignment, etc. I've just been through so many rounds of this nonsense: rounded…
This article was written for the Keyboard Builder's Digest Advent Calendar . I'm posting it to my blog below as well. Squeezebox Scorecard In this article I'll review some of the design experiments I've conducted in my squeezebox prototyping efforts and discuss each individually through the lens of an experimental hypothesis, trial in a prototype build, and results. The scooped…
So now that the Squeezebox v2209 is up and running, and given it's very unusual arrangement of keys (2 for pinky, 3 for ring, 4 for middle and index, 3 for thumb), I have to figure out which keymap to use for my base/alpha layer. Since I currently use dvorak both on my thinkpad keyboard and on my daily driver squeezebox v2112, there's some justification for keeping close to dvorak…
I have completed a new revision of the Squeezebox Keyboard - v2209. Side view of Squeezebox v2209 Top view Some quick project history checkpoints April 2021: First fully functional squeezebox prototype, v2104, is built Slots for column stagger adjustment are on the keywells Keywells mounted onto sawtooth wall for tailor fit height No splay Used flat (no tenting) 45 keys: 3x5 finger matrix plus a…
We over at my new project Focus Retreat Center have announced the dates for our inaugural Programming Retreat . We are so excited for this event! We have interesting applications rolling in and have already awarded several Residencies. If you are at all curious, please get in touch with us at team@focusretreatcenter.com or our contact form here . We are happy to answer any questions you may have…
Typing on the Squeezebox keyboard is coming along nicely. No real issues with it as my daily driver at the moment. I'm still tweaking my keymap but only in incremental ways. Keymap tweaks Reduce keys from 42 to 36 My main goal right now is to shrink from 42 keys to 36 by eliminating the outer most pinky columns. The reach there requires taking most fingers away from the home corner and is…
So I've been using the squeezebox as my daily driver keyboard for two weeks now. Here's my thoughts on this experience. But first a typing video: Typing video The Home Corner Works The design element of the middle and bottom rows being a steep 100 degree angle feels totally validated to me and I'd recommend other experimenters out there incorporate it into their designs. Even though…
Overview The Squeezebox Keyboard is a custom-designed ergonomic computer keyboard I have been working on for nearly a year now. The primary design driving factors include: Wanting the keys really close together both within a column and across columns If there was a nice switch smaller than the Kailh chocs, I'd be interested "Home corner" concept for the home row and bottom row taking…
Content warning: programmer discussing text editors. I have been down a path spurred primarily by 2 events: Development of the Atom editor becoming uncertain after microsoft acquired github and thinking it likely there was no room for both VS Code and Atom, and thus Atom would be sunset My rage quitting of workflowy after staring at the damn loading spinner and general disgust/contempt for…
I've made a second prototype of the Squeezebox Keyboard. It's a huge improvement over the first working prototype. Detail of assembled right hand side Improvements included in this version Key switches are hot swappable courtesy of Kailh hot-swap sockets This required a major level-up in my FreeCAD skills as there's a LOT of precise geometry Per-finger splay angle, adjustable for…
I designed and built a split ergonomic keyboard with some ideas I've been wanting to try for over a year. Here are the main features of the keyboard: Split design, obvs staggered linear columns customizable tailor fit column offsets tailor fit per-finger vertical offsets thumb cluster with 6 keys Squeezebox split keyboard The Squeezebox Keyboard rev 21a left side top view The Home Corner The…
So since I became a Staff Engineer last year, I've been studying up on the role. Mostly I've been devouring Will Larson's writing in article/blog form, and now all that material has been published in his book Staff Engineer . The writing is lucid and insightful and very narrowly on-topic so I've been reading it very closely. I just set up a book club at work to go through…
With two of us working from home, we were having trouble making due with a single wifi access point covering the whole house, especially considering our offices are at opposite sides. So we made a few attempts to address the problem and learned a bit along the way. Since the Internet service is coaxial and there were already cable runs splitting at the ISP point of entry and terminating in each of…
Everywhere I look in the tech world, I see everything everyone does being framed as "solving problems". "What problem are you trying to solve?" is a question asked at the start of many project inception documents. It occupies an early slide in most presentations. Whole company missions are framed as solving a particular problem. Many engineers list problem solving as one of their core skills. My…
My experience in the last decade have been that software developers are asked to learn new technologies with such frequency that novice level skills have become a semi-permanent norm that is expected and accepted. Here's some technologies: clojure edn kotlin maven VS Code vim elasticsearch kafka kafka connect kafka streams mongodb replication event sourcing, change data capture architecture,…
I own both an original ErgoDox (full hand acrylic case, from I think the 2nd massdrop) and a newer ErgoDox Infitity. The original works better for me and I wanted to share my experience and reasoning. There's a few things that are just simpler/nicer: flashing the original just requires a paperclip button press on the top of the keyboard and 1 command in the OS Flashing the infinity is a…
Last weekend I built a custom laptop tray design to fit my ThinkPad T480 laptop, my ergodox split keyboard, and my vertical mouse comfortably on my lap. We did 3 rounds of build/prototypes and I'm really happy with the one we have. Motivation and Context I have two main setups where I do my computing. I have a sit/stand desk in my office well-appointed with tented split keyboard,…
In my software development work, I encounter new syntaxes truly almost every day. <grumplezone> It's a gripe for me that our contemporary way of working introduces a huge new ecosystem of commands every 6 months. We're on AWS, here's the CLI with 3 dozen subcommands you'll need to learn. Oops, sorry it's GCP now. A lot of similar stuff but the CLI is completely distinct.…
When hopping in to an unfamiliar git repo, if it's a big sprawling repo or even a monorepo, it can be hard to know which parts are relevant. Well, if you know someone on your team's name, I have a script that can give you a pretty solid clue. Here's the pipeline and explanations. # Show me the hash of every commit by someone named Doe # for the last 3 months git log…
Editor's Note This article was originally written by Chris Potter and me when we worked at Reaction Commerce. It was published on April 15, 2020 on the Reaction Commerce Blog. Reaction Commerce was acquired by Mailchimp and the blog has disappeared, so I'm republishing here to keep the content available. I will need to reference it myself if I ever have to do graphql pagination again. To…
I've switched from Linux Mint to Arch Linux on both my work and personal setups now. The main motivating factors were roughly So many more packages were available in the Arch User Repository On Ubuntu/Mint I had accumulated ~100 custom installation scripts for new or obscure packages from git and assorted random web sites. With Arch the number of packages I have to script installation…
So I recently learned about cargo doc --open while attending the Colorado Gold Rust conference. However, on my linux mint machine it opened the docs in chrome instead of my default web browser which is firefox. Since I spent most of my morning rust coding time tracking down why that was and how to fix it, I figured I write a blog post about it. So here goes: By looking at the cargo source, I was…
So I had a bunch of YAML files with an array of key/value maps representing environment variables. I wanted to sort these to make comparing them across similar files easier. A web search pulled up this nice pipeline to handle the actual sorting: xclip -selection clipboard -o | awk '{printf("%s%s",$0,(NR%2)?"\t":"\n")}' | sort -k2,2n | tr '\t' '\n' | xclip…
I've updated my journaling tooling for my work journal. Here's how I do it. Writing Journal Entries First, a script computes the path to the specific journal (one per job/company) I'm using. #!/usr/bin/env bash # Strict mode boilerplate omitted for the blog, but is really there # http://redsymbol.net/articles/unofficial-bash-strict-mode/…
I learned a nice way of using bash arrays to hold command line arguments that are conditional or will be computed before passing as arguments to a separate program. There's 2 basic parts. Use a bash array to hold them declare -a opts=(one two three) Expand them properly using this syntax "${opts[@]}" Here's an annotated example: #!/usr/bin/env bash # Here's our…
So I've been trying to do as much of my local development from within docker containers. Each project I tweak things to be a little bit nicer than the last one. Most recently I went to update my tealeaves ssh key parser utility (which is coded in rust). Initially I was getting all manner of frustrating errors trying to get a reproducible version of rust installed with 1.30, clippy, and…
Starting this Spring when I changed OSes from mac to linux, I decided to experiment with using docker containers to isolate dangerous development tools from my local system. Given the npm malware attack yesterday, this seems like a good time to write up my results so far. Motivation OK I'll try not to get overly long-winded here, but let me just state broadly that I think the core fundamental…
I've recently been helping a client get their node.js mobile back end API server ready to launch a new service. In this post I'll outline the guidelines I use when I'm brought in to true-up a problematic node.js codebase. First, triage and repair server basics Before any real rescue efforts can happen, I need to work through the fundamental issues and get up to a bare minimum of a…
xfce4 problems I had some problems with xfce4 that eventually made it untenable. No way to make ctrl-w always close browser tab instead of being an emacs kill word keybinding xfwm4 would occassionally lock up and prevent me from dragging windows around. I had to run xfwm4 --replace to fix it. This is kind of a deal breaker for a window manager. Reordering window buttons in the window list by drag…
Here's some miscellaneous notes on what I've gotten set up on my new linux laptop so far. Distribution and Desktop Environment I tried 3: PopOS (ubuntu tweaked for system76, gnome-shell desktop) Xubuntu (ubuntu with Xfce4 desktop) Linux Mint Xfce4 (ubuntu with xfce4 desktop) I like to think that I don't care that much about my desktop environment but I couldn't find a good…
So I bought a laptop from System76 with linux and I'm slowly getting my tools and environment going. I've been using macos on macbook for a while, maybe 8 years or so, not sure. I'm pretty dang adjusted to it, and so far the shift back to linux has been pretty jarring. If I wait too long to write down thoughts, I'll skip them, so here's some stream-of-consciousness notes…
So I just went to my first meetup of the Denver/Boulder Rust meetup group. The group has been around a while but went inactive for over a year. I was and am really excited to get it going again. The meetup went really well! We had about 20 attendees and folks seemed pretty engaged and interested. One of our planned speakers canceled at the last minute due to a family emergency, but Joel Dice…