This is the blog, but if you want to know more about me and my projects, check out the Projects and About pages.

Context Powers Brand Safety at Studio71

Have you heard about the brand safety concerns on YouTube? Maybe you’ve heard it described as the “Adpocalypse”? Even if you haven’t caught wind of the madness over the last 12 months, surely you understand that anything mixed with “apocalypse” isn’t a good thing. As is common in “whatever-pocalypse” situations there was a fair bit of freak out, but Studio71 went to work!

The result of that work is Studio71 Context. Context is our Brand Safety scanning technology that we have been quietly testing over the last few months, and I couldn’t be more excited about how it has turned out. Context takes in all of the data we already know about the Studio71 creator and the amazing content they produce, leverages machine learning to fully understand every video uploaded, and works in tandem with our manual review team to make the right decisions at scale. What does that mean? It means we can ensure brands attach their message only to the content that makes sense for their brand and nothing else!

As I’m sure all other digital media companies can attest, the task of understanding video content is a difficult technical challenge and we couldn’t have developed and scaled Context as quickly as we did without the help of our partners at Google and Amazon, and the fact that this team has built a platform that is flexible and stable enough to build complex products on with confidence. In the 5+ years I’ve been at Studio71, Context is easily the most exciting project the Tech team has worked on and it looks like it may be the most successful as well.

Studio71 Context Video

I Went With the iPhone 8

iPhone 8

According to the press, and especially the fawning Apple bloggers, I don’t exist. Well, maybe I exist a little but I’m cheap, or stupid, or maybe confused…and cheap and stupid.

No, I didn’t leak the iOS 11 Gold Master (I’d hate to be that guy and run in to John Gruber at a well lit Philadelphia craft cocktail bar), I’m just the only person in the world that ordered an iPhone 8 (Plus)…on purpose.

It’s true, and I’d like to tell you why.

1. The iPhone 8 has all the best upgrades from the iPhone X

While I do wish both back cameras had Optical Image Stabilization, and the front crazy dot projection thing seems like it would be fun to play with for an hour or so, all the rest of the new stuff is also in the iPhone 8 Plus: Cameras, Processor, Inductive Charging, and Apple Logo

It’s still an iPhone, but the important thing is that when I take a picture of myself in one of my Apple-issued colorful floppy hats my picture will look just as good as the iPhone X.

2. I’m nervous about brand new things from Apple these days.

I’m pretty pissed about the 2016 Macbook Pro, and the number one reason I’m pissed about it is that it sucks. Specifically, it’s just not reliable and that’s the one thing I need my computer to be. I’m not going to be that guy who says that Apple is “screwed” and “it’s all over for them” but I will say the design seems to be winning our over reliability and usability recently (see: iOS 7, 2016 MBP, and Apple TV). Except for the Apple TV they do seem to eventually getting around to fixing things, but all the same, I’m going to pass on the iPhone X and give them a year to figure out the fallout from swipe up vs home button and Face ID.

3. Free case!

My iPhone 7 Plus case will work on the iPhone 8 Plus…so free case!

4. I can hide from calling it the “iPhone Ten”

I really don’t like the name “iPhone Ten,” and I really don’t want to talk to other people about the name. I never owned an iPod Touch because the constant assault charges on people saying “Oh, is that an iTouch?” would have been a huge burden, both financially and because you really can’t ever get your shoes completely clean after a stomping.

5. Battery life.

The iPhone 8 Plus has the best battery life of all of the new iPhones. The end.

Apple Watch Series 2 - A Short Review

Apple Watch

Yes, I finally got an Apple Watch as I’m currently using an iPhone 7 Plus for my daily driver phone. Yes, I got the Series 2 mid cycle because I got a good deal and I don’t really care enough about potential new features…and yes, I’m going to review it in an effort to reset the nearly year-long content gap on my blog.

Don’t worry, I’ll be quick.

  • It feels nice on my wrist and the strap doesn’t bother me when typing as much as previous watches.
  • The fitness features are nice, and the primary reason I got the watch.
  • Siri isn’t good. Even worse than on my iPhone. Just starting a timer takes WAY too long and the act of sending a text is insanely frustrating.
  • It needs a killer app.
  • Unlocking my iMac with my watch is awesome.
  • I’m not sad I bought it.

Strange Loop - Exploring Conversational Interfaces with Amazon Alexa and Go

St. Louis Peabody Opera House

Nothing hums like the Strange Loop conference machine! I just spoke at the conference yesterday in St. Louis and already the video of my talk is up and has 150+ views on YouTube!

Here is the YouTube video:

Strange Loop Alexa Talk

Here are my slides:

Thanks, Strange Loop! It was an honor to be included in this year’s roster of speakers at such a great conference. Hopefully, I’ll see you in 2017!

If anyone out there would like to hear this talk, I’d love tweak it and give it again if I get the chance. Let me know!

The Nodejs CA Bug From Hell...and Mozilla

Can I tell you about this doozy of a bug we just resolved at Studio71? When I say doozy, I mean a total mess and the path led us down to some questionable npm package decisions and eventually to Mozilla…and thankfully nothing overly stupid that we did!

Lets back up though…

Studio71’s stack is pretty simple by design. We have an API and offline data system that is written in Clojure which powers the various web applications, the largest of which is built with React.JS on top of a Nodejs middleware.

Make sense? Ok, lets get in to the bug.

Late the other night we got reports of something not working on one of our apps. It seemed like the app just couldn’t connect to a particular outside service. We’ll check on it in the morning. By morning we had even more reports of various, seemingly unrelated, services breaking. We dove in and found a lot of issues in the logs about not being able to verify the local CA cert for SSL connections. For those who aren’t aware, this isn’t an SSL to our servers, but when our app is making SSL connections to other services. The log message was saying we could verify the third party connection because something was wrong with our local Certificate Authority file. Ok…lets update the system’s CA file. No change. I can curl and wget from these web services fine, but the node application is unable to. Why is that?!

It doesn’t help that I’m less than familiar with our Node application. We’re in the middle of some “corporate restructuring” which means I’m down 2/3 of my JS developers at the moment. Nothing else is moving while I frantically read up on CA certs, Node JS in general, and better familiarize myself with the inner workings of how we request outside services in Node. I discover we use the ssl-root-cas module…but everything looks fine and it’s set to fetch and use the latest CA during the build process. I take a break. I get back on it looking for other ways things can break. Maybe I need to update the calls and point the CA location to the system’s CA file…but the stage server works fine, so why should I have to do that here? I certainly don’t want a bunch of production file paths all over the code every time we make an SSL request. Lets take another break. Back at it, looking through the build logs when I see…

* Mozilla's root CA store
* generated from

…and then, thankfully, I visited that URL. Probably out of something to do rather than anything else as it was late and I had run out of viable ideas hours ago…but I’m oh so happy I did because I saw…

Mozilla Maintenance

Well that doesn’t look like a CA cert…ah, dammit.

Those assholes!

Mozilla put that page on maintenance and the node module downloaded an HTML file rather than a CA file. Grrrrrrrrrrrrrr! Ok, ok, the need for a maintenance page can certainly come up. Why did that module download the damn HTML file?! …well, that’s Mozilla’s fault too. If you click that link and watch your Network tab, you’ll see a 302 temporary redirect to the maintenance page (totally fine) and then a 200 OK response from the maintenance page! A 200?! Come on! They return a 200 code and the node module downloads the file, stores it, and then tries to use it as a CA for all request. That’s not gonna work.

I’ve created and submitted a pull request on GitHub that updates the module to check the response content type in addition to the status code: I’ll never get that day of work back, but in the end these in the weeds moments are kinda fun…right?

mikeflynn @ GitHub thatmikeflynn @ Twitter