Where the Pomodoros End

At some point in every software developer’s career (and likely so for other knowledge work), they are subjected to a tomato-based hazing ritual known as "the Pomodoro Technique".

The process is always the same:

The Initiate overhears the Senior Engineer Cabal during one of their cloaked rituals—the Morning Standup—as they describe the number of Pomodoros a task will take. During their open office peer one-on-one, the Initiate vocalizes their curiosity of how Italian tomatoes map to man-months, to which the Senior Engineer coyly responds:

  • A Pomodoro is a 25-minute span of uninterrupted work.
  • Each Pomodoro is followed by a 5-minute, uninterrupted break.
  • Use INSERT_TIMER_APP_HERE to keep track of your Pomodoros. All other timer apps suck.

And off the Initiate goes, never to be seen again. Not because they’re working, but because they’re testing alternative Pomodoro tracking apps. Only 173 to go...

Even if this story is only a shoddy attempt at half a polite chuckle, the Pomodoro Technique is both very real, very misunderstood, adored, and occasionally even effective.


What about those interruptions? Leaving distractions—called “internal interruptions” in the lingo—aside for a moment, what are you supposed to do if others interrupt you?

According to the original Scripture, you are supposed to “inform effectively, negotiate quickly to reschedule the interruption, and call back the person who interrupted you as agreed.”

For such a prescriptive schedule of work, there’s nothing to acknowledge when that interruption is to be rescheduled for. Furthermore, as a leader I’m interrupted constantly, so this is not a small issue: it’s core to how I need to work.

  • Do I tackle all interruptions right now? If so, what is this timer doing?
  • Do I reschedule interruptions to take the place of my break? Not much of a break, then, is it? And breaks are why I need something like this!
  • Do I reschedule interruptions for after the next break? If so, does that count as a part of my next Pomodoro, or is this some sort of extrajudicial task?
  • Do I schedule some sort of “Office Hours” like a professor trying to corral a group of hormal late teens? Now you’re just being ridiculous. And that’s coming from me, who’s writing all this nonsense.

Where Pomodoros go to die

Interruptions kill Pomodoros. This is why so much of the language, writing, and culture of Pomodoro users talks about “protecting the Pomodoro.”

When your work is about interruption—when your work is about being the interruptable one—then you yourself have taken the Pomodoro Technique to a farm upstate.

Now what?

I’m still working on the same problem, but the solution I’m using today works better than I initially expected:

Run that timer all day

For a few months now I’ve had a small device running in the corner of my office. On it displays the current time, and most importantly a buzzer goes off at :25 and :55 when it’s “time” to take a break, and at :30 and :00 when that “break” would be over.

Do I actually take those breaks? Almost never, but the little buzzer keeps me informed of the break time I’m missing through my various meetings and interruptions, and my subconscious does a remarkable job of nudging me each time the buzzer goes off just how much of a debt I’ve accumulated. Practically speaking I only get to pay up a couple times a day, but now it’s become a conscious, guilt-free choice both to take the interruption and to take the break(s) I’ve neglected.

When I first started using the Pomodoro Technique circa 2009, my emotional takeaway was the feeling that I’d taken control of my time, no longer controlled by it. My tomato timer may be dead and gone, but this new timer has resurrected that feeling of control and determination, and I look forward to working with it for even longer.

ABRPT: Shuffle Playback by Album

TL;DR: I made a thing! You can shuffle your Spotify Saved Albums here.

Code here.

I have a relatively ecclectic library of music. In the above screenshot is an English electronic band, a French disco artist, and two American bands: one rock, and one bluegrass.

With a library like this, it can be downright jarring to shuffle everything.

Each music app has its own way of dealing with this problem, but none do so completely. Playlists? Terrible if a song fits more than one mood or genre or whatever. Tagging? Way too manual and finicky. Recommendations? Too biased and will eventually converge on one style of music.

I've dealt with each long enough to know how to get them to work, but I had really hoped there was a better way. After more than a decade of these sorts of jagged, jarring, manual, and often lackluster listening experiences, I had an idea: what if I could shuffle my library by album, rather than by song?

I know this isn't a novel idea. I have two of those oldschool, drum-based CD changers, each of which supports this exact feature. That said it's always felt like an ancillary feature, and hard to control. What if I could see a queue of those CDs, filter out CDs that I don't feel like today, etc.?

I have plenty of issues with Spotify. They don't pay their artists enough. It's a terrible solution for long-term library "storage", as they're constantly breaking whether a song or album is Saved to your collection. Their library of music is incomplete in selective ways. Their recommendations are White-centered.

That said they're the best option to try out this idea, and this was an opportunity to try Glitch.

Starting with the latter, I would use Glitch again for this sort of one-off, temporary-by-default project. I don't expect to run anything on Glitch long-term (though I know they support that), but it's fantastic for quickly standing up an experiment. The biggest frustration was using JavaScript and Node again, which I would prefer to continue avoiding in the future.

But using Spotify for this worked great! If you go to the ABRPT app, you can (after Glitch warms up the app) log in with Spotify and see a preview of what random 8 albums ABRPT wants to queue up. Clicking Apply appends those albums (song-by-song due to a limitation of the Spotify API) to the end of your Play Queue.

If you don't have an active Spotify device, this may fail; start Spotify playback on the device you want, and try again.

If you want to check out the code, it's all available here on Glitch. Check it out, and let me know what you think!

Gizmo 21: Today Display

TL;DR: The Today Display holds a single 2.5" by 3" index card, just big enough for the most important notes and tasks for the day. The STL is available on Thingiverse.

This design was inspired by the Analog Kickstarter. I liked the idea of a card holder to localize my daily tasks, but I already have a "productivity system". Everybody does. I already have a rolling backlog of work that needs to be done. Most people do. All I wanted was a card holder.

Furthermore, a full-size index card (3"x5") is too big for a single day's tasks: cutting the cards in half produces just the right size for the most important work I need to accomplish, and nothing more.


I keep yesterday's card around long enough to help update my team with any leftover notes. With any luck, though, I've spent a few moments at the end of the previous day starting today's card:

At the top of the card, I put the date. Along the left edge of the card are bullets: a dot for a task, and a dash for some critical but not actionable detail. As mentioned above, if I think it won't fit on the card, it belongs somewhere else.

Don't overthink it.

What's With the Logo?

Did you ever have a random idea that you couldn't get out of your head? The most ridiculous, out-of-nowhere idea provides its own rationale as it lives between your ears. So it was with this logo.

Initially I was just playing around with various forms. As with most visual work, I doodled and doodled and doodled. Eventually, I started playing around with two of my favorite characters: the ambersand (&) and the question mark (?).

If you'll excuse my over-the-top nerdiness here, take a second and think about these little things: on the one hand, a visual portmanteau of the Latin word "et", and on the other a "lightning flash" to end a sentence. Beautiful! Unique! Absolutely incredible.

As I was playing with them, I realized you could flip the ampersand, and connect it to the question mark. It was a really fun corruption of those symbols, and it stuck in my brain.

At some point in a project I realized I'm losing steam—maybe it's interest, maybe time, maybe energy—and my solution to that is always the same: lower the bar, and ship. Now that I had a logo idea that I liked, I dropped it into Sketch and shipped it as fast as I possibly could. Plain color. "Good enough" Bezier curves fitting the transition between the two characters. Export to SVG. Move on.

After I deployed it, though, it haunted me a bit: did it "mean" anything? Well, no. Did it need to? Well, no. If it did, what would it?

Again, the logo doesn't mean anything. It's not special. It's an accident, and I love it. But your brain needs it to mean something. If you're like that, too, take your pick:

  • If God has a favorite question, it's "And?" What a model to live up to. "Schoon, I could really use this help." Sure. And? "Schoon, this happened." And?
  • "And" is always better than "but", and a question is always better than a statement.
  • The URL is the backbone of the Internet, and the "query" component of the URL is how you share information via URL. What two characters provide that query structure? The ambersand and the question mark.

And now that I've published even this ridiculous screed, my brain can rest.


Thanks to Jason Karns for the title idea. This is mostly edited from a Twitter thread, so for other comments and commentary, see the thread.

I really thought I had finally built a simple, maintainable, modern, single-page application.


When I returned to this project after only six months, every build resulted in nothing but errors. Errors as far as the eye could see.

No environment should be this hostile.

At some point I just can't afford to keep trying. JavaScript is an otherwise accessible, easy to learn language (as computer languages go, anyway), and you can be productive very quickly.

You just can't walk away.

Just like Hotel California, you can check into writing a JavaScript application, but you can never leave. You are doomed to repair broken dependency after broken promise, ad infinitum.

I've never experienced anything like this from a programming environment, before or since.

For better or worse, browsers remain a ubiquitous application host, and one required of any business, no matter how small.

So what do you do?

One option might be compile-to-JS, and I want to keep an eye on that space. None of those options are so mature or so stable or so accessible that they can really compete, though! And culturally, they feel just as churn-driven as the environment they hope to replace.

What else?

I've spent a non-insignificant part of my JavaScript career replacing server-rendered applications, but I need to take my small business the other way. Environments like Go and Ruby have a more stable API, and the served-up HTML has FAR more device compatibility.

Why not?

Perhaps ironically, the reason not to is that it feels like untested water. So many modern applications moved away from 100% server rendering, touting it as "faster" and "better for users".

Is that still true? Who is pushing the boundaries of an alternative?

One way or the other, I feel left without a choice. JavaScript libraries, frameworks, and even developers feel hostile, even abusive.

I've used too many to expect the next to be any different, and I've been using them too long to expect them to improve.

I'm disappointed.

I'm disappointed because I really want this ubiquitous, accessible development environment to change.

I'm disappointed because I still feel it WILL change, and I might miss it.

I'm disappointed because I can't wait for it to change to stay here, on the web, making apps.

Project Kong: Reuniting

The final episode of my Project Kong series, a fun (and adorable, if I do say so myself) demonstration of how it works.


Project Kong: Tracking via Bluetooth

This video touches on the basics of what we need from Bluetooth and the little RedBear we installed earlier in the series: tracking. Bluetooth, particularly the current standard for Bluetooth Low Energy, makes a good platform for wirelessly tracking physical objects.

In our case, BLE is what Kong will use to track the person it's trying to follow and protect; a small wearable on the person makes the individual “visible” to Kong.

Project Kong: What is AI?

This video is an admittedly very shallow dive into the theory of AI, all to support the question, "Where does Kong need to go from here?" If you're looking for a deeper dive, here are a few respources:

  • I lumped quite a few specific algorithms into the general bucket of “heuristics”. For more specific versions of what I was talking about, consider A*, a heuristic based search (specifically path-finding) algorithm.
  • Wikipedia (of course) has a pretty comprehensive article on neural networks.
  • The libraries Donkey Car uses for neural networks: Keras and Tensorflow

Project Kong: Using the RC Controller

This video has our first modification to the Donkey Car; we restore the use of the original remote control. To do so we use a RedBear Duo to read the PWM signals comming from the RC receiver, forwarding them on as control codes over a serial connection made to the Raspberry Pi.

The both the code for the new SerialController part and the firmware for the Duo can be found on the project's GitHub page.


The music in this video includes “Sunrise”, “Nameless Beat”, and “DeadBeats” by TazLazuli. Their SoundCloud can be found at https://soundcloud.com/tazlazuli, with Twitter at twitter.com/tazlazuli.

Project Kong: Calibration & Test Drive

The hardware has been assembled. The software has been installed. In this episode, it's time to calibrate that software and take the whole rover for a spin.

This video starts with a quality of life improvement: we move the main power switch for the car itself to a much easier-to-access location. It's been life-changing for the rest of this project. As a part of that section of the video, I show the macroscopic I've used for all the adjustments: “opening up” the car like a book, mounting the custom components to the flat platform, etc.

Also, mounting tape.

After a quick run-through of how to boot everything up, the video walks through the basics of calibration. The original documentation can be found on the Donkey Car website.

Finally, we go for our first test drive! Huzzah!


The music in this video includes “Days Like These”, “Golden Hour”, and “In My Dreams” by LAKEY INSPIRED: https://soundcloud.com/lakeyinspired

Project Kong: Installing the Software

With the hardware fully assembled, this episode focuses on installing the software, connecting the car to the local Wi-Fi network, and creating the scaffolding for our Donkey Car project. This is the second of three in this series dedicated to assembling a Donkey Car without modification.

The accompanying documentation can be found on the Donkey Car website, but in particular, the following links will be helpful:

  • The Raspbian image we downloaded in this video can be found here.
  • The Etcher application I used to flash that image to an SD card can be downloaded from their website.
  • Introductory guides to SSH and Nano can be found here and here, respectively.


The music in this video is “Elevate” by LAKEY INSPIRED: https://soundcloud.com/lakeyinspired

Project Kong: Assembling the Hardware

The first step for Project Kong is to assemble the hardware sent by Arm for the Donkey Car. This video (originally intended for YouTube) walks through that process.

The actual hardware assembly (i.e. not the intro or outro) was the first thing I recorded for this series, and it may show. That said, I think it's a useful supplement to the official Donkey Car docs.

Best of luck, and do get in touch if you have any issues.

Project Kong: Overview

This video introduces the first videographed project: Kong.

Kong is a small, autonomous, beginner-friendly rover designed to help with elopement in children living on the Autism spectrum. It leverages the Donkey Car platform for the car, adding a RedBear Duo for Bluetooth scanning (and some other, wonderful capabilities revealed later).

JavaScriptural Exegesis

This is a recording from OpenSourceBridge 2017 of my talk, JavaScriptural Exegesis.

I had the privilege of giving this talk twice more: at Bellingham Codes later that fall, followed by LibertyJS in front of the biggest audience I've ever had the pleasure of presenting to. It's a flurry of “out of the text” conclusions drawn from the ECMA-262 Specification, and it was a delight to prepare.

Many thanks to both Test Double and Bellingham Codes for all of their support and feedback.

YouTube Shenanigans

I've been working on a simple video series for months. I've been learning how to shoot, organize, edit, practice, re-shoot, re-edit, render, and export video. I've been prototyping the project being recorded, writing scripts, and rebuilding the project as a one man film crew. I have designed and re-designed title cards and social media icons and banners.

And then I uploaded the above to YouTube.

First, I uploaded it to my personal Google Account, but I realized it would be safer to upload it to a separate, branded account. By YouTube's own recommendation, I created a Brand Account for this content. I uploaded the first few episodes, and went to bed.

The next morning, my account was disabled. No explanation.

In their typical tone, Google “helpfully” suggested I could request my account be reinstated. I did, and went back to waiting.

After a week, they disabled my Google Account (not the Brand Account), and reenabled it. Cue pats on the back.

I've gone through that rigamarole twice more, and still no satisfactory solution or explanation. If you've ever heard me say, “Choose a vendor that cares you exist,” this is exactly what I'm talking about. If this project was reliant on YouTube (to make money, it kinda is), it was dead on arrival, and I have no recourse.

Choose a vendor that cares you exist.

...The End.

View Archives