DIY Slack Busy Light

My adventure of recreating this DIY Raspberry Pi Busy Light by @eliostruyf for Slack.

A few months back, after listening to Deep Work and trying it out, I was hooked. I found I could accomplish the most difficult and daunting of tasks with absolute understanding and concentration. Though working from a small home with a young family and a couple of pets, needing to communicate at work, and my own personality traits, the absolute best I can do is 90 minute spans. 90 minutes of head down, no notifications, no distractions, no Slack, concentrated work – followed by a bit of a break, then another session. (I realize this is likely more Pomodoro technique than off-to-a-cabin-for-a-week true deep work, however the high level premise is the same, I get into a state of flow).

Setting up less notifications in my life, filtering all input, building timers, blocking out time for sessions, remembering to do it, and sticking to it, was all the easy stuff. Avoiding my family’s interruptions, was impossible. My wife, three year old daughter, and eleven month old son are all living their lives in our small home, feet away from me at any given time. They would randomly pop in, yell, knock, throw things, cry, text, ask, poke, question, hug etc. Breaking the session. Not only demotivating as it scratches the record on my focus that I just mentally committed too, but it would take around ten or more minutes to refocus and realign after they had left, leaving me a bit scrambled and a bit behind. Best illustrated in this comic:

My wife sympathized with me, and we both knew we needed some sort of way to indicate I was in these sessions, or on a call. The classic ‘door open/close’ or ‘headphones on/off’ wouldn’t work in our family, and shooting a text seemed unideal as that may backfire, ignite a conversation or trigger some reminder that may fill the brain with life instead of work. We both agreed that some sort of red light outside the door would be best.

I was thinking just a single LED light. I’d drill a hole in the door jam, and run some wires from a Raspberry Pi or other small computer or bluetooth device to turn the light on or off. This was the plan.

Then searching “DIY Busy Light” to see what else others have done, returned an amazing post by the very impressive @estruyf (which to my surprise, had only been posted days earlier) that took me away. It amazed me how good it looked and sounded. The code written for the project was minimal and well done. The parts looks awesome. I had never played with a Raspberry PI, or any DIY hardware, but this all excited me a great deal. I quickly ordered up everything.

I won’t go into detail on the hardware side as @estruyf’s post explains it all, but after a lengthy international shipping wait, it was easy enough put together.

I opted to not get the Pibow case and picked my own, but I was unable to put everything together because of the way my case and the holes of the board aligned the same, opposed to the Pibow that is wider and doesn’t use the Pis back two holes. Having no long tiny screws around to makeshift something myself, I ended up purchasing some legitimate standoffs and they worked well to pinch the whole thing together while giving the correct amount of even space between. Overall I was happy with how it turned out and I liked the darker backing and bolts:

On the software side, I use Slack for my work instead of Microsoft Teams as the tutorial guides for. And despite how my family will see only green or red, I recognized that I have more than just two states, each state needing to reflect differently in both Slack and on the Busy Light.

I began by defining those states in a JSON file, now hosted on Gist:

Life is complicated, so to me it was understandable to have this many different states. Basically, there are times I don’t want to be interrupted by work, other times family, sometimes both, and sometimes I welcome interruptions, and am open to new chats. Additionally, at my job communication is oxygen, so I do like to be explicit about why I’m not responsive during my normal work hours, and what state I’m in instead of just online or offline. (The rainbow status is just for fun, it’s available in the API so we’ve made it a signal that I want a hug from my daughter).

I next needed a consistent and quick method to reference and set these statuses. I didn’t want to memorize this table, or second guess myself on which version of an emoji to use. Even with knowing the keyboard shortcuts, I find the Slack UI a bit clunky for status setting – so I wrote a small Alfred workflow in PHP:

This Alfred Workflow pulls down, caches, and parses that JSON file of my statuses, displays them for quick selection, then when selected fires off a simple CURL to the Slack API, which sets my emoji status and online/offline presence. (I’ve opted to not share this code as it uses Slack Legacy Tokens, which are now unavailable).

Though I never forget to switch a status when I step out for a break or lunch, knowing myself, there was about a 100% chance of me forgetting to set an “In a meeting” status as I prepare and log into one. I automated this status setter with the Google Calendar Slack App. This app reads my meetings calendar and adjusts my Slack Status while in a scheduled meeting.

I furthered this automation to my Pomodoro timer (which I use to block out and keep on track of my 90min deep work sessions) so when my timer starts up, theres a call to an external workflow, triggering the Slack Status Workflow to set to DeepWork and go offline. Once the timer completes it clears the emoji and sets me to Active.

Everything boiled down to Slack being the canonical source of my current state, and defining a small pool of what that could be. Slack allows for easy automation and integration, and my JSON file allowed for easy editing and modifications. With this setup, the Busy Light just needed to read and reflect Slacks state.

To poll Slack, compare the emoji status and online/offline presence to the list of statuses, and determine the colour and send a request for the Busy Light, I thought about running a cron job on the Raspberry Pi itself, a single Python script that’d be under 100 lines, however, for several reasons I explain further below I opted to keep the RPI as a standalone server that only handled request. I only wanted the stable and simple Flask server by @estruyf on it.

So to bridge Slack and the Busy Light, instead I built a widget on my personal Dashboard “Albert”. Albert is an Express app that displays data from a personal PHP data API I have for myself (called ‘Artemis’, which supplies data to the Dashboard from other APIs like Google, current weather, stats on Things.app, etc).

The widget I wrote for the Dashboard in my API Service polls every 15 seconds, reading Slack, figuring out the status, and sending off a request to the Busy Light if it differs from the previous state sent. Making the Busy Light responsive within a quarter of a minute.

Besides being easier to debug and work on and writing in PHP instead of Python, another big draw of not writing the script on the Pi itself was that my Dashboard has a UI and a setup that allows for easily creating beautiful views for the data. Here’s some screen shots of the widget in four different sample states:

This Dashboard and widget is open all day on my second monitor, providing me a constant glimpse of Slack (despite the app not being open) and the Busy Light (despite the door being closed), which has proven very helpful for preventing accidental incorrect statuses.


So does it work?

A fair amount of time and energy (both things I don’t have) went into setting this up. It would be funny if for all the investments made that the light was ignored and useless. However, I’ve had the light up for about two weeks now and it’s been great. It works consistently, reliably, without fail, and most importantly the “red” is respected in our household. I’m getting in around 2-3 (uninterrupted) deep work sessions a day.


If I had to do it all over again:

I would opt out of using the Pogo pins. Despite how easy they look in the video on their site, for me I found they had to be tapped every so slightly in just the right angle after they were installed and already snug, nudged just right to get the lights up running. This problem would take about 5 extra minutes every time it was moved. I ended up switching which pins I used for ground and power and that helped a little, but it was just annoying to fix every time I worked on it. Luckily, I won’t be moving it anymore so this is a non-issue now and I will keep it as is, but I’d recommend instead to get a Zero WH and Unicorn HAT Mini so there’s a tight, solid, and reliable connection without all the fussing.

Secondly, when buying standoffs, I’d look for a kit that included longer screws, the small one-size provided in the kit I chose presented some challenges when putting the Pi on the case together, and made a simple task a litter harder and less secure than it ought to be.

Lastly, in my list statuses, there’s a few states that are starting to feel redundant and perhaps not as unique and useful as I had thought, like ‘On a Call’ vs ‘In a Meeting’. If I was starting up, I’d likley make the list as small as possible and grow it based on need instead of starting with a big list. Luckily, Alfred results in workflows order by frequency of use by default, so right about now after weeks of use, it will be evident which states I don’t use, and I can trim them off, refining the list.


Ah, this thing is so cool:


Links to build your own:

My Journey as a WordPress.com VIP Intern

For a decade I’ve been building WordPress websites, as both a freelancer and at a digital marketing agency. In that time I had built nearly 200 custom WordPress themes and plugins for just as many sites. I had worked alone (on a small team of marketers, but never with other developers). I was self taught, self driven, and was a guru of my stack, my platform, and a master to the 100 or so sites that were actively hosted with us. I created intricate solutions to complex problems. I knew the clients, I knew the code, I always had a fix and solution to any issue. I saw problems before they occurred. I got paid well enough, was constantly busy, worked remotely, was good friends with the owner, had benefits, bonus’s, flexible hours, and on and on. For a long time, I had a very comfortable and stable life.

However, in early 2018 a sort of perfect storm started brewing:

  • My wife and I started planning our future with more children, a bigger house, more property, a second car, savings, retirement planning, investments, college savings. We needed much more than my current employer could possibly provide.
  • I was growing tired of working alone, I wanted to be in a team. I pushed myself to go outside of my comfort zone to my first WordPress Meetup, and a month later at the next one, I was giving my first ever presentation on Gutenberg.
  • I had begun answering developer questions on Stack Exchange, it became my hobby, my passion. I was enjoying it more than building sites, solving the little problems developers and talking with them was the best part of my work day.
  • The agency I worked for was having some legal turbulence which created some doubts in my long term future there.
  • I was getting into my late 20s, nervous about my growth and skills getting stagnant in the industry. I worried I would be designing and building small business websites for another decade, until I became low hanging fruit replaced by the next generation of WYSIWYG builders.

This combo of factors, mixed with encouragement from employees of Automattic from the Meetups, lead to me looking for new opportunities.

Now, jumping ships may be normal to some people, but this was a big deal for me, I never saw myself anywhere else, doing anything else. I had worked at the same place for 8 years, done the same thing for 10+ years. After three months of internal debate, some interviews at various agencies, and preparing myself, my portfolio, and my resume, I decided to apply to WordPress.com VIP as a Developer. I chose this role as it focused around the maintaining of websites and solving developer problems, which is “my thing“.

After a nerve-wrecking interview, I was turned down and given suggestions to improve some specific areas and re-apply in a years time. I was devastated, but remained motivated. So, like in any good story, I pushed on through adversary and I self-boot-camped my skills, doubled down on learning, gave myself sort of a years course on what to learn and when.

However, to my surprise, a few months later I was approached and made aware of an opening in the VIP Internship program. It was an honour to even be remembered or considered! My wife and I had to weigh the options though: stay at my job where employment and perks were known, or, take a chance on an internship which offered no benefits, no vacation, and would only last 4 – 12 months with no guarantee of employment. At this time, we had a new mortgage, a one year old daughter. A lot to think about. After a day of deliberation, it was clear to us that being part of WordPress.com VIP and Automattic would be the best move for my career, my happiness, and our future.

With a heavy heart I quit my job. Four months in now I know that joining the VIP Internship Mentorship program was the best decision I have ever made in my life.


The first month of the mentorship was a blur. In the first half hour or so of the movie Goodfellas, there’s a scene were Henry walks Karen through the back door of an exclusive club. They go through a maze of loud and exciting rooms and activities, start greeting and exchanging with people, then a table and lamp are brought to them as they approach the performer on stage, giving them the best seat in the house. This is what my first month was like, I felt like Karen. Here I was, accustom to building small business websites, and suddenly I’m greeted by an incredible team, given all these tools and access, then put to work on websites for huge companies. I was so excited and dizzy with all the knowledge I had to take in, all the things I had to sort out and work on. I was a big fish that just left my small pond and found myself in an incredible lake.

I quickly confirmed my suspicion that Automattic / WordPress.com VIP was an amazing place to work. It is truly wonderful how the distributed company works so efficiently and well. The team demonstrated themselves as being the hardest working, most dedicated, passionate, and helpful group of people I’ve ever had the pleasure of working with. Working along side them has been an honour and a privilege. Everyone shares the same unified goals and visions and helps each other to get there as a single entity. I was where I needed to be, where I wanted to be.

After the haze of the first month cleared, my second and third months were, in contrast, hectic, and the most mentally exhausting span of my life. I spent my days both learning best practices, as well as handling website performance issues. I was giving 100% every day, and was totally wiped by 5pm. It was hard, really hard, but I knew this was what I signed up for. This program isn’t a shallow-end of the pool deal. It is a program for those who want to grow, and grow fast. Again, this is a big lake, and you are thrown into it – but in the best possible way.

The learning encompassed many factors, it wasn’t just raw technical info. I’ve learned how to work in a strong team, how to handle big clients, how to use sustainable workflows, communicate more effectively, document properly, and how to provide true white glove service. For the technical side, I learned how to build WordPress sites for maintainability, security, performance, and for scale.

As I hit the fourth month mark, suddenly everything “clicked” and the mayhem slowed down. I was able to keep on top of things, able to filter out irrelevant info. I knew my role, my coworkers, my purpose, how to start charting my own course. I felt more like a part of the team and started acting more like it. I found my footing.


In a short fraction of a year, I can now confidently audit code and point out security and performance concerns (the type of code that I used to write!). I feel the mentorship program has sanded off all of my rough edges, shown me a clear path to being a VIP level Developer, and has overall turned me into a better developer and person. It has upgraded me.

With my first term complete, moving forward I’ve decided to continue my mentorship for another four months. I will be focused on helping new mentees acclimate to the program, while further improving and refining my skills. Once ready, I plan on applying for the VIP Developer role. Working for VIP and Automattic is my dream job, and I can’t wait to call it home and my coworkers family.

Do great things: Apply to VIP or the mentorship program today!

Home Made Pizza Recipe

🍕 My famous pizza dough recipe. Anyone who knows me knows I‘m legend for my home made pizza. If you’re over for dinner you best know you’re getting pizza. This recipe is tweaked from over 6 years of Pizza Friday’s.

Makes a 16″ pie:

  • 1 CUP warm water
  • 1 TSP yeast
  • 1/2 TSP salt
  • 1 TSP garlic powder
  • 1 TBSP sugar
  • 1 TBSP italian seasoning blend
  • 1 1/4 TBSP melted butter
  • 2 2/3 CUPs white flour
  • 2 TBSP cornmeal

Dough:

  1. Activate yeast in the warm water for 10min until frothy. Stir/shake occasionally
  2. In separate bowl mix salt, garlic, sugar, seasoning, butter, and flour
  3. Mix yeast water into the dry ingredients
  4. Kneed as needed (about 10min or until your hands start cramping up)
  5. Add tablespoon of water or flour as needed if too sticky or dry. Should be somewhat sticky but shouldn’t actually stick to your hand.
  6. Roll into ball, add few drops of oil, roll ball around bowl coating sides with oil.
  7. leave in bowl, cover bowl with plastic wrap. Let sit for 2 hour in somewhat warm area.

Assembly:

  1. Roll dough on pizza stone (if you don’t have one, don’t bother, just call Dominos).
  2. coat bottom in cornmeal
  3. Cut all favorite ingredients, tiny, dice it all.
  4. Sauce with Hunts Chunky Original pasta sauce (my personal choice)
  5. Thin layer of cheddar cheese and parm
  6. Sprinkle dryer toppings (onion, spinach, garlic)
  7. Layer of mozzarella cheese
  8. Add wetter toppings (olives, peppers), add meat
    • Italian sausage is a must
  9. Final layer of mozzarella cheese
  10. Bacon bits and cherry tomato slices on top

Bake at 400 for 17min. Broil for 2 min until golden bubbly cheese goodness.