OpenSCAD, Programming, Woodworking

Generating Dovetails in OpenSCAD

I’ve written an OpenSCAD library for generating dovetail pins and tails. No longer will beautiful dovetail joints be solely in the domain of skilled woodworkers; now, anyone with a 3-D printer or CNC router can participate too.

Include it in your OpenSCAD script like so:

use <dovetails.scad>;

dovetail_pins() will generate just the pins of a dovetail joint. dovetail_tails() will generate just the tails of a dovetail joint.

board_with_dovetail_tails() and board_with_dovetail_pins() are much more useful; they will generate boards with pins or tails cut into each end.

If you render dovetails.scad on its own, it will output a pair of example boards with pins and tails.

There’s a second file in the repository called dovetail-box.scad. This file is an example of how to generate all of the boards needed to create a dovetailed box, and it shows how they’re oriented when fit together.  It’s also an example of generating pins and tails of different thicknesses.

The library is available on GitHub.

CNC, Maker, OpenSCAD, Woodworking, X-Carve

Today’s CNC Carving: Doll Bunk Bed Insert

My wife and I decided that we were spending far too much money on factory-carved objects, so we bought our own CNC router — a 1000mm X-Carve from Inventables.

I finished setting it up today, and the first carving on the agenda was a replacement insert for my daughter’s doll bunk bed:

The bed broke when someone stood on the bed to reach a shelf they weren’t supposed to reach. It would be a simple matter to cut out a new insert with a jigsaw, but where’s the fun and repeatable automation in that?

Continue reading

Christmas, Programming

Improve your Christmas gift opening with Randomizer

My wife and I wanted to find a way to do an orderly one-at-a-time Christmas gift opening this year rather than the usual everyone-at-once free-for-all, but while also still keeping all the kids mentally present, rather than having them zone out until it was their turn.

We decided to randomly choose the next person to open a gift each time so that the kids would always have a chance to be next, keeping them on their toes. My wife suggested the sensible idea of picking names out of a hat. While she ran some errands, instead of writing down eight names on slips of paper, I wrote a one-page web app to run on our living room TV that would randomly choose who got to open a gift next. It worked perfectly, creating a mini-contest every time someone finished opening their gift, causing all of the kids to fall silent and then yell out the “winner’s” name.

The web app is called Randomizer. Give it a list of choices, and it will flip through them game-show-style (with sound effects) until finally settling on a winner. It kept the attention of eight kids between the ages of 3 and 10, quieting everyone down as soon as the beeping started after each gift was opened.

Try a demo here (be sure to un-mute your speakers), or watch this GIF screencast:

Screencast of the Randomizer in action

You can add as many options as you want, and you can weight some options more heavily by including them multiple times. The options are stored in the URL fragment, so you can bookmark Randomizer for frequent decisions. Try #Yes,No, #Heads,Tails, or #Rock,Paper,Scissors.

Continue reading

Christmas, Life

Our 2016 Christmas Letter

I am trying something new this year. Instead of typing out the Christmas letter, I am dictating it to our new digital assistant, Alexa. Hopefully, this will save me some time, as I will be able to take care of some other important tasks while I update you on our lives. Yeah, hi, could I get two Big Macs, a large fry, and a medium chocolate shake? Actually, a large chocolate shake. Alexa, you’re not writing this part down, are you?

Continue reading

Alexa, Amazon, Programming, WordPress

Alexa, start a new post called, “I’m blogging this with my voice.”

I’ve written and published an Alexa skill that lets you check your blog notifications, moderate comments, and start new draft posts on your or Jetpack-enabled blog, all by speaking to any Alexa-enabled device.

Wapuu hugging an Amazon Echo Dot The skill is called “Blog Helper“; you’ll find it in the Skills section of your Alexa app or by saying, “Alexa, enable the Blog Helper skill.” After linking your account and choosing the blog you want to access, you can begin using the skill.

To check your notifications, just ask: Alexa, open Blog Helper and check my notifications.” Alexa will read the new ones to you one-by-one, marking each one as read as you listen to it.

You can create draft blog posts with Alexa too. Say, “Alexa, tell Blog Helper to create a new post called ‘My thoughts on gardening.'”  This skill will save the post as a draft so you can expound on your ideas later.

Comment moderation has never been easier (or more vocal). “Alexa, ask Blog Helper if I have any new comments,” and you’ll be able to approve, delete, or mark them as spam.

Blog Helper uses the REST API, and it’s completely open-source.


I Built a Tool Rack and Custom Tool Holders

We moved into a new house this summer, and it has a separate workshop with a built-in workbench. As I unpacked my tools, they ended up on the workbench in no particular order:

If I ever wanted to be able to find any of my tools or have space to use them, I needed to get organized. I started by removing two cabinets from this wall. (The first step in getting organized is not usually removing cabinets, and it took some time to convince my wife that this would work out.) You’ll have to take my word that the cabinets were up there, because I forgot to take a before picture.

Here’s an after picture of the cabinets. They were on the wall, but now they’re on the floor and will soon be in our laundry room.

I planned to build an 8’x8′ rack between the windows, comprising horizontal slats across a vertical frame. Here’s the architectural plan for the rack very professionally done on the back of a circular saw blade sleeve.

I built a simple rectangular frame out of 1×2 pine and then ripped 27 2 1/2″ slats out of half-inch plywood. The frame is screwed into the studs along the top and bottom; unfortunately, the middle vertical 1×2 wasn’t lined up with a stud, so I had to screw through a couple of the slats into the stud about an inch off of center.

Here’s the frame after attaching the first few slats around the outlet.

I re-used the 1×4 ledger board that was supporting the bottom of the cabinets to frame around the outlets. It’s already painted the same color as the wall, which is good, I guess.

(The outlet is crooked, not the frame.)

At this point, all slats are attached, and both outlets are still accessible. I left an inch between each slat, but if I were smart, I would have done the math necessary to adjust the spacing so as not to have extra space at the top of the frame. No one will ever look up there though.

Where this style of rack really shines is in the types of tool holders you can make, and the fact that they’re all essentially free. Try saying that about Slatwall.

The simplest one is the peg:

It ended up holding my level:

It’s just a dowel in a piece of scrap wood, with a half-inch groove in the back that fits over the slats.

Here’s a pro-tip that you won’t hear anywhere else: cut your grooves at a slight angle, like 3º or 4º, and your tool holders will point up ever so slightly, offsetting any sag from the weight of the tools that will be attached to them.

(This groove was cut at 5º, which was probably a little too extreme.)

Now for more example tool holders! All of the ones I’ve built so far were made from wood that’s been floating around in my scrap bin and was probably destined for the campfire.

Cut a few slots in wider stock to hang clamps! Ooh, ahh!

Use a Forstner bit to make a hammer holder! Unbelievable, but true!

Hang your mallet with the dignity it deserves!

Do you have surplus coat rack dowels? Not anymore — now you have earphone hangers!

Whatever these are called fit right into this oblong hole!

Wrenches! On pegs!

Files and screwdrivers can be dropped into appropriately sized holes!

This was going to be a saw holder, but I didn’t like how some of the saws hung, so I repurposed it as a scraper holder! How environmentally-friendly!

All this square needs to be happy is a slot for its straightedge.

These planes are hanging out down at the bottom on simple shelves, but I have a feeling they’ll be movin’ on up real soon.

Every tool can get a custom-designed holder, which should help keep the rack organized and encourage me to actually put the tools back on the rack.

Speaking of the rack, here’s the current state of the rack. I’ve only built half of what I planned, and I’ll eventually get to the rest, but I got the workbench about half-cleared off, which was just enough for me to get distracted by the extra space and start some new projects, so the rack will have to wait.

Apple, Firefox OS, iOS, Mozilla, Programming, Reenact

Reenact is dead. Long live Reenact.

Last November, I wrote an iPhone app called Reenact that helps you reenact photos. It worked great on iOS 9, but when iOS 10 came out in July, Reenact would crash as soon as you tried to select a photo.


It turns out that in iOS 10, if you don’t describe exactly why your app needs access to the user’s photos, Apple will (intentionally) crash your app. For a casual developer who doesn’t follow every iOS changelog, this was shocking — Apple essentially broke every app that accesses photos (or 15 other restricted resources) if they weren’t updated specifically for iOS 10 with this previously optional feature… and they didn’t notify the developers! They have the contact information for the developer of every app, and they know what permissions every app has requested. When you make a breaking change that large, the onus is on you to proactively send some emails.

I added the required description, and when I tried to build the app, I ran into another surprise. The programming language I used when writing Reenact was version 2 of Apple’s Swift, which had just been released two months prior. Now, one year later, Swift 2 is apparently a “legacy language version,” and Reenact wouldn’t even build without adding a setting that says, “Yes, I understand that I’m using an ancient 1-year-old programming language, and I’m ok with that.”

After I got it to build, I spent another three evenings working through all of the new warnings and errors that the untouched and previously functional codebase had somehow started generating, but in the end, I didn’t do the right combination of head-patting and tummy-rubbing, so I gave up. I’m not going to pay $99/year for an Apple Developer Program membership just to spend days debugging issues in an app I’m giving away, all because Apple isn’t passionate about backwards-compatibility. So today, one year from the day I uploaded version 1.0 to the App Store (and serendipitously, on the same day that my Developer Program membership expires), I’m abandoning Reenact on iOS.


…but I’m not abandoning Reenact. Web browsers on both desktop and mobile provide all of the functionality needed to run Reenact as a Web app — no app store needed — so I spent a few evenings polishing the code from the original Firefox OS version of Reenact, adding all of the features I put in the iOS and Android versions. If your browser supports camera sharing, you can now use Reenact just by visiting

It runs great in Firefox, Chrome, Opera, and Amazon’s Silk browser. iOS users are still out of luck, because Safari supports precisely 0% of the necessary features. (Because if web pages can do everything apps can do, who will write apps?)

One of these things just doesn't belong.

One of these things just doesn’t belong.

In summary: Reenact for iOS is dead. Reenact for the Web is alive. Both are open-source. Don’t trust anyone over 30. Leave a comment below.