Joel Hooks

Follow this blog

Using a dSLR as a Webcam for Live Streaming

Broadcasting on the internet is here to stay. More and more we are seeing people use sites like Twitch and Youtube to deliver real-time video and audio to connect with their audience. Increasingly over the years as a remote worker video chats have…

🧠 skill recordings creator vision

This is a collection of thoughts around the nature of our business from November 2018 and what it might look like going forward. Some of it was implemented, some not! Posting it here for posterity. We help content creators build a “community brand…

How I think about sending a lot of email.

"FUCK YOU SPAMMER!" For the first year or so of egghead's existence I avoided sending email. I was nervous. I didn't even want to send receipts when we charged people, because I thought they'd see the receipt and just cancel leaving John and I…

🌲 Shadow Newsletter for Evergreen Emails in ConvertKit

For years I spent immense amounts of effort broadcasting one-off emails to to my newsletter. Millions of them! This is fine, a broadcast does the job of delivering your emails to the eager recipients at the other end of the wire. Mission accomplished…

Badass: Making Users Awesome by Kathy Sierra

What is a badass? I love the word itself, because there is practically no way to use it in a negative way. It's a good word. In Kathy Sierra's book, the word badass is used to describe an expert. Somebody that has learned a skill, crossed the…

Transforming exported CSV data for use in a React chart.

There are many ways to build a new feature for your applications. For me, when I need a new tool, component, or functionality I like to take a step back and think about it in terms of data. What data do I have, what data do I need, and how am I going…

A handy npm script for creating a new Gatsby blog post

This blog is built with Gatsby and uses MDX for the post content. It's a great setup, and so far I've enjoyed using it very much. One thing I missed from my old Octopress/Jekyll configuration was the ability to run a rake task to create a new post…

Exporting Drip Tags for Import into Convertkit

If you need to migrate your email list subscribers from Drip to Convertkit , you will run into the problem of importing each of your tags as an individual list into Convertkit . If you follow the official recommendation , they suggest that you…

2018 in Review

I've done these posts for several years in a row, and this year as I sit down to write it out, there's a bit of a blank spot. 2018 was a pretty good year. But why? Hah, and more importantly why should YOU care?? These posts aren't about the reader…

I've got a confession to make 😭

We don’t have a single test covering our front-end/UI for egghead.io. It’s embarrassing. You know how it is. Testing is a good idea. It’s objectively better than the opposite, which in our case is click testing, twitter notifications, and relying…

how we work at egghead.io in 2018

egghead.io is a platform to empower humans, built to challenge the status quo of how we work and learn new skills. We produce high quality, concise web development screencasts created by expert open-source contributors and other talented…

Living and learning in 2017

Make all the big life changes at once... In 2016 we moved our family of 6 out of our home of 15 years across the country to settle in Vancouver, WA. That's quite a lot of change for everybody involved. My partner lived her entire life in Fort Worth…

Why we hire consultants to help build egghead.io

Over the past few years we have built egghead.io from a relatively simple “video blog” and into a full blown platform for developers to publish their knowledge about software development as screencasts and get paid for it. The process has been…

2016 was amazing. Best year yet.

2016 as a year took a lot of criticism as a year. Beloved celebrities died in a seemingly endless parade of "noooooooo". We were subjected to a painful and divisive US federal election cycle, which resulted in another shameless ass-clown getting…

Setting goals for (my version of) success.

There is this amazing conference in Las Vegas once a year called MicroConf. It's a gathering of like-minded entrepreneurs that (for the most part) are boot-strapping their business. This means that they aren't taking outside investment, specifically…

Build an Image Gallery Using React, Redux and redux-saga

Building an Image Gallery The image gallery we will build is a simple application that displays an array of image URLs loaded from a service (Flickr), and allows the user to select them individually. It will be built with React, using Redux and redux…

2015 Year in Review

It’s been two years since I woke up dreading a workday. And I work almost every day. When we first set out to build egghead, I told my parter John that all he had to do was make amazing content, and that I would do the rest . {% emoji flushed %} For…

Bootstrapping egghead.io to feed my family: 2014 in Review

2014 Year in Review It's that time of the year. People dusting off the blog and endeavoring to capture the past 12 months of their life in a wordy nutshell. It's something that I've never participated in, but I thought I'd give it a try. I quit my…

Let's Make Full-Ass AngularJS Directives

With best intentions we set forth to create the mighty directive. The steepest slope of the dreaded AngularJS learning curve. The "place where the jQuery goes." So what is a directive? We've talked about this before , and decided that they are not…

Stop writing For loops. Start using underscore.

How many for loops did you write today? This week? Sure. That's harmless enough. Ugly and weird, but not something to really complain about. But this is all too common: Which on the scale of bad code, isn't even that bad, but you start throwing…

How to Build a Subscription Service on Rails: A Noob's Guide

There are few things as nerve-wracking as pushing your first subscription website into production. Am I covering all the bases? Will everything break and leave me in a pit of customer support sadness? How do I even take payments? Are they just going…

How to Record a High Quality Screencast

Audio: convert mono to stero add a slight delay to one channel use an EQ add a touch of reverb (not too much) add a little compression

Why I Built an AngularJS Training Site on Rails

If you're into AngularJS at all, you are probably familiar with the kickass AngularJS video training from egghead.io. If you haven't seen egghead.io, it is a collection of 50+ short "bite-sized" training videos, largely focused on the AngularJS…

Configuring Dependency Injection in AngularJS

Dependency injection is the act of supplying values or object instances (dependencies) to target objects from outside of the target object. In many (most?) cases this is automated by a framework, such as AngularJS. This means that a given target…

Learn AngularJS this Weekend

AngularJS has a reputation for a steep learning curve. It's definitely complex, but follows the 80/20 rule. 20% of the features are what you will use 80% of the time . If you are new to AngularJS and have a weekend to study, there are some very high…

Using AngularJS? Stop using jQuery as a crutch.

Have you ever heard (or said!) this: "Directives? That's where the jQuery goes." I definitely have. In an effort to better understand @joshdmiller 's excellent ng-boilerplate , I wanted to understand its dependency on Boostrap. More specifically, I…

The basics of using ui-router with AngularJS

URL routing is a popular approach to matching the contents of a URL to specific functionality within a web application. URL routes programatically present specific content to users based on the URL that they are visiting. It is a popular approach…

AngularJS Directives That Override Standard HTML Tags

Directives are the heart and soul of AngularJS. They are incredibly powerful. AngularJS sets out to extend the grammar of the browser to supply semantics that facilitate the creation of web applications, going beyond the standard hyper-linked web…

Why Doesn't My Photography Studio Website Appear in Search Results?

This is a series of post examining why our Fort Worth photography studio website performs poorly in Google search results, and why it fails to convert the visitors it does get into new clients. The first post sought to analyze Google Analytics…

Optimizing a Photography Studio Website for Converstion and SEO: The Analysis

The internet is a competitive place for small businesses, and this is especially true when we are talking about portrait photographers. My lovely wife is a family photographer in Fort Worth , Texas. She's been doing portrait photography…

Coming to Terms With Enterprise JavaScript

What is enterprise javascript? Good question. One that might even make you chuckle 1 a little bit on the inside. The word "enterprise" is definitely a loaded term. It could be considered by some to be a buzzword. Others might say "Why are we talking…

The Paralyzing Grip of Fear

My sons love playing basketball. After a certain age (around 12), youth sports change. The court or field is no longer filled with kids that were dragged to the game by their parents. These kids are here because they love playing the game. So what do…

What I Learned From Brennan Dunn's Consultancy Masterclass

Consulting is something that I truly love. Helping businesses succeed, helping employees to stop focusing on mundane repeatable tasks, helping enterprises drive large scale commerce... these are truly activities that I enjoy. Getting into the mix…

My Sketchnotes and Thoughts from BaconBizConf 2013

It is hard to explain how excited I was when Amy announced BaconBizConf in April of 2013. A small conference devoted to like-minded people that either are, or want to be, bootstrapping product businesses. The speaker lineup included personal "gurus…

Lessons Learned: A Year with a Large AngularJS Project

After a year of working with a large AngularJS project, I thought I'd share a few of the lessons that I learned in the process. Firstly, I love AngularJS. It suits my needs exceedingly well, and I expect it will be my goto for the forseeable future…

Size and Composition of Effective Software Teams

The success or failure of any project is based on the team or teams working on it. Teams are like fingerprints and snowflakes. They are composed of individuals with unique experiences and skillsets. When we set out to build large applications in a…

AngularJS, Dependency Injection, and when is a singleton not a Singleton?

The Singleton is the Highlander of design patterns. There can be only one . An example of a Singleton implementation might look something like this: from Tom Roggero The above JavaScript is from an answer from StackOverflow that seemed resonable…

A rose by any other name?

I posted an article about using models to assist in creating leaner, meaner controllers. It resulted in a lively conversation in the comments that spawned an interesting rebuttal from Rob Conery that essentially says I am full of it, and the…

Modeling Data and State in Your AngularJS Application

Respect your data. Contain your state. Data and state are the foundation of your application. These two items should be absolutely respected. As you work through the AngularJS documentation, these two items are generally stored on the controllers…

5 Essential VIM Plugins That Greatly Increase my Productivity

There are a lot of VIM plugins to choose from. An individual's list of what would be considered "essential" is largely a personal matter. For any given plugin, there is also probably going to be an excellent alternative plugin that does the same…

It is Tiny. One Week Developing With an 11" MacBook Air

For as long as I can remember, all of my computer upgrades have been "bigger and badder." Outside of moving from a FULL ATX DESKTOP WORKSTATION to a laptop, Moore's law has played out nicely. Every few years I'd get something bigger and better. Not…

Getting to Know VIM

It's like coming full circle. When I was first introduced to computers, they very much resembled what I see in Terminal today. I've always had a distinct fondness for the command line interface. That said, when I started using computers…

VIM Adventures: A Fun Way to Pick up Some Basic Skills

Vim Adventures is a fun browser based game that teaches basic VIM skills while adventuring. It is kind of silly, and can be a bit... frustrating... but that is the point. This is VIM after all! No pain, no gain ;)

Using Custom Jasmine Matchers to Make Unit Tests More Readable

Image from purplemattfish I'm a stickler for the "single assertion per test" guideline. One of the pillars of good unit tests is readability. Multiple asserts undermine this principle and make tests that are more difficult to read, understand, and…

Practical Object Oriented Design is Excellent

I've been reading the Rough Cut of Practical Object Oriented Design , and I have been absolutely enjoying every page. It isn't very often that a technical book comes along that really strikes me as a "new classic," but this one qualifies. Sandi…

On Transitioning to JavaScript From AS3/Flex

I'm currently working on a large enterprise JS application, and enjoying myself quite a bit. We've implemented standards and practices that remove most of the bad parts of JS dev. We are using straight up JS with AngularJS . We are covering our…

Code Review: How to Make Friends and Influence Developers

I'm a huge fan of peer review, especially with Atlassian's Crucible tool. It can be hard to introduce code review to a group that isn't used to doing it, or has had bad experiences with "hostile" review process in the past. It can be a very…

Fresh Start: Migrating from Wordpress to Octopress

I've been wanting to part ways with WordPress for some time. It's been expensive, running a VPS for the hosting. I've been "attacked" on multiple occasions that result in blacklisting from the Google when I ran on much less expensive shared hosting…