A pile of knives

Our previous methodology of storing our knives was a pile in one of the drawers. In a nod to safety we had a scrap piece of wood in there as a divider to keep them separate from the non-pointy kitchen utensils.
It wasn’t the worst system. It wasn’t the best either. So I made a better one:

This took a few hours a few weeks ago and has made our knives a lot safer and easier to use. Grabbing one now doesn’t feel quite as fraught! I should have made it years ago.

Design Notes

  • The slots for the blades were made with kerf cuts on the table saw. I tried a few different manual saws because I aspire to being one of those philosophical back-to-basics handtool woodworkers. Turned out that the table saw blade was already the right width so I was able to save myself a lot of trouble.
  • Our drawer space is at a premium so having two rows of knives on the right lets save some space, while still making everything accessible.
  • This is highly customized to our random collection of knives. I designed it mostly by measuring the longest knives in each category (short ones in the front on the right, medium in the back on the right, long in their own compartment on the left) and then just going for it. Winging it is fun, but it did result in a lot of back and forth of test fitting.
  • The rows are slightly offset so that handles aren’t covering blades. I mean, of course they are, however, this wasn’t clear to me until I started to lay it out.
  • It’s a friction fit. We can easily remove it if we decide we want something else later on.
  • Made out of scrap pine and sealed with paste wax. I lightly rounded over all the edges with 120 grit sandpaper.

Front Garden

We had A2 Garden Guides design and landscape our front yard and it looks SO much better! Super happy with it:

And here’s the map they drew for us of what is what. This is really useful because our kiddo keeps asking us the names of things:

Descriptions

Azalea

Varieties ‘Hino Crimson’, ‘Boursault’, ‘Gaiety’.

Azalea

PJM Elite’

Azalea

Mt St. Helen’

Hydrangea

Hydrangea are shrubs grown for the large globes of flowers in the summer that dry and give winter interest. Varieties ‘Annabelle’ and variety unknown.

Gooseberry

Variety ‘Jeanne”

Hosta

We rounded out your hosta collection with a few more.

Heuchera

Shade plant with striking foliage.

Astilbe

Shade plant with feathery leaves and flowers.

Bleeding Heart

Late spring bloomer of pink and white heart-shaped flowers in a line on tendrils.

Arborvitae

Variety ‘Globe.’ Evergreen with soft flat fronds.

Viburnum

Viburnum mariesii is a shrub with white puffs of flowers.

Serviceberry

Amalanchier (common name Serviceberry) is a native shrub that produces white flowers in spring and edible red/black berries in June.

Hydrangea

Oakleaf Hydrangea ‘Peewee’ are shrubs grown for the large globes of flowers in the summer that dry and give winter interest.

Microbiota

Low growing evergreen provides winter interest.

Solomon Seal

Shade plant with white bell flowers.

Sedge

Carex pensylvanica is native to Michigan.

Strawberry flat

These are strawberries cultivated for eating, so make sure they stay well mulched to prevent rotten fruit. They will spread over the whole area.

Mulch (Hardwood)

Hardwood mulch is medium to dark brown, and will fade to a lighter brown after about a year. Thick applications will last 2 years.

Holly-tone (50lb)

Organic, natural fertilizer for acid-loving plants.

Plant-tone (50lb)

Organic, natural fertilizer to “ensure superior plant growth.”

Currant

Ribes americana is a native shrub with edible black berries.

Salzbaby.live Updater

Years ago when my daughter was born I put together a website/app thingy to help us keep people updated on the progress of her coming into the world. The idea was that it was a single page site that would display a single message at any one time. If you were curious how it was going, you could check the site and not bother us.

I wrote a quick iOS app to help me update it from the hospital. Lots of people liked it and followed along for the entire 40 hours or so it took for my daughter to enter the world. It cut way down on the number of “what’s happening?!” texts we got, although we still got a bunch wondering if the site was broken since it was taking so long.

I consider this an example of an app that is a, in Robin Sloan’s words, a “home-cooked meal”. An app that doesn’t need to be spun off into a SaaS or be open-sourced, or grow an audience. It’s just for the people it is for.

We knew for our son we wanted to do this again. And, because nothing can be easy, it turned out I needed to rewrite the app. Who knew that Swift would change in the intervening years?!

Components

iOS App

After being frustrated that the code I’d hacked together 5 years ago didn’t magically work with no bugs I ended up starting over from scratch using SwiftUI. Swift is better than it was 5 years ago, but still a frustrating language to jump into to “get something done real quick”. The documentation is bad.

Anyway, here’s the code for the view:

@State private var message: String = ""

var body: some View {
    VStack {
        Form {
            Text("Salzbaby.live Updater")
            TextField("Enter Update", text: $message)
                .frame(height: 100.0)
                .textFieldStyle(RoundedBorderTextFieldStyle()
            )
            Button(action: {
                self.POSTfunction(message: self.message)
            }) {
                Text("Submit")
                    .multilineTextAlignment(.center)
            }
        }
    }
}

And that ends up looking like this in the app:

Type in the box, tap “submit” and it fires off a POST request to a file on the server. The passcode is a hardcoded string that I have replaced below so you don’t “hack” me. The server checks for it over on its end.

Here’s the main function for the post request:

func POSTfunction(message: String) { 
        //Create dict and then convert to JSON
        var dict = Dictionary<String, String>()
        dict["passcode"] = "lolno"
        dict["message"] = message
        let data = try! JSONSerialization.data(withJSONObject: dict, options: []) 
        
        // https://stackoverflow.com/questions/32201926/post-json-request-in-swift
        HTTPPostJSON(url: "https://salzbaby.live/SECRETPHPFILE.php", data: data) { (err, result) in
            if(err != nil) {
                print(err!.localizedDescription)
                return
            }
            print(result ?? "")
        }
    }

The app is then sideloaded onto the devices I physically plug into my computer. This does not scale, but it does not need to.

Server

Aside from general NGINX and SSL setup, over on the server I have a PHP file with one job to process the POST request:

<?php
	# Get JSON as a string
	$json_str = file_get_contents('php://input');

	# Get as an object
	$json_obj = json_decode($json_str);

	if($json_obj->passcode == "lolno") {
		$fn = "SECRETTEXTFILE.txt"; 
		$file = fopen($fn, "w+"); 
		$size = filesize($fn); 

		fwrite($file, $json_obj->message); 

		fclose($file); 
	}
?>

PHP’s motto should be: “your server is already running it so why not abuse it?”

Shouldn’t this be saving to a database instead of a txt file? Yes. Absolutely.

Web Site

The site is a bespoke templating library that does server side rendering and delivers an HTML file to your browser that displays the text in the txt file in the middle of your screen:

<!DOCTYPE  HTML>
<html>
	<head>
		<title>Is the Salz Baby Here Yet?</title>
		<style>
			body {
				height:100%;
			}
			#answer {
				text-align:center;
				font-size:4em;
				position: fixed;
				top: 50%;
				left: 50%;
				transform: translate(-50%, -50%);
				-webkit-transform: translate(-50%, -50%);
			}

		</style>
	</head>
	<body>
		<!-- 
			Hi there, nerds! Here's what you're after:

			The text of the page update is being read from a plaintext file. I have a bespoke iOS app on my phone and am sending a POST request to the server to overwrite the file whenever I make a request. It's simple, it works, and, there's no history by design.

			I'll show you the code sometime! Just not now!
		//-->
		<script type="text/javascript">
		</script>


		<div id="answer">
			<?php
				$fn = "answer.txt"; 
				$file = fopen($fn, "r"); 

				$contents = fread($file, filesize($fn)); 

				fclose($file); 

				print $contents;
			?>
		</div>

	</body>
</html>

This file was more or less the same as it was before just with a more direct comment to the many nerds in my social network. This is me making good on the promise to show you how it all worked.

Conclusion

Programmers overcomplicate everything all the time. The hardest part of this for me was limiting the feature set to only the basics. Since this is never going to be used by anyone else I could afford to cut every corner there is. Heck, there’s no notification on whether or not the update went through. You go to the site to see it there. That’s extremely poor UX!

However, despite the length of the list of feature requests requests…it did its job admirably. Folks from all of our disparate social circles got to check in on us when they were thinking of us and get a glimpse into what was going on. And as people woke up on the 27th and saw the update we started to get trickled in congratulations from all over. The Workantile slack even started a thread to notify people whenever there was an update, which was heartwarming to watch.

I’m glad we did this and the site will show this very important message until the registration on the domain name lapses in about a year:

UPDATE

A friend emailed me after the birth to say that he’d asked the Internet Archive to archive the site when it updated. He said “When he’s older and you explain to him how you set up a website, tell him another nerd archived it.”

This was such a gift and I’m so thankful for my friend who did this:


http://web.archive.org/web/20200526145350/https://salzbaby.live/

http://web.archive.org/web/20200526182423/https://salzbaby.live/

http://web.archive.org/web/20200526193713/https://salzbaby.live/

http://web.archive.org/web/20200527033742/https://salzbaby.live/

http://web.archive.org/web/20200527120404/https://salzbaby.live/

Caspian Orion Salzman

Our son was born on May 27th 2020 at 7:17am. He was 21.25” long and 8lbs 12oz.

I told him this when he was born. Perhaps this is too much to lay at the feet of a baby, born into a country on fire, but I think he can do it:

Promise you’ll be kind.
Promise you’ll be good.
Promise to fight for justice.

He is named after Caspian from the Chronicles of Narnia, although I’m learning to like the Phish song as well. Orion is after the constellation. It’s vast and encompasses many stories. Later he can decide which one he likes best.

2×4 Bench, Rustic Strength

Finally finished this bench I’d been slowly working on. This was the second attempt at a similar design. Both found homes with friends. The first one will live near a firepit and this one will end up inside as a bench near an entrance. Final size is about 33″ wide by 16″ tall.

The wood came from scrap 2x4s and the box joint configuration created a surprisingly strong bench!

Started by milling the 2x4s on the thickness planer and table saw to get square edges and flat faces. None of them were acceptable without this step for the finish quality I was going for.

After milling, I cut the top and sides to slightly longer than needed. Then I attacked worst part of this project: the glue up. I didn’t want to have any screws or nails involved so gluing involved a lot of clamps and annoyances. Once it dried I evened out the legs and top ends with a circular saw, chiseled and hand planed everything reasonably flat and then sanded (a lot). Finished with a few coats of clear shellac.

I’d been wanting to try this technique for a while. After trying it? It’s neat, but oh-so-fiddly to get right. What I learned is that I never want to use 2x4s for “fine” furniture again if it can be avoided.

Cutting Boards, Racing Stripes Edition

Made two cutting boards yesterday! I have the week off from work and so naturally spent a few hours in the shop. One is spoken for, but another is still available as of yet ($40). Edit: Both are sold! Talk to me if you want one though since I’ll do another batch later this month!

Dimensions are around 9″x12″ with rounded edges. Pattern is: red oak, oak, walnut, red oak. The walnut came from a friend who had it in his basement and the rest is from Urbanwood. Finished with Howards Butcher Block Conditioner.

A Cutting Board, A Cut

A Cutting Board

Finished this cutting board yesterday. Made from oak and walnut. I love the grain on this, it’s wild and varied and unexpected. Measures about 8″x12″ with rounded corners and two usable sides.

The knot at the top is filled in with clear epoxy, which worked well and is a nice detail. I’m curious to see how it will wear over time.

Finish is a beeswax+mineral oil blend from Howard called Butcher Block Conditioner. Wood is from Urbanwood.

If you like the look of the above and would like one of your own, I’m open for commissions. Contact me and we can figure out a price and delivery date!

A Cut

About halfway through making this I did something very dumb and ended up with four stitches in the side of my index finger. I’ll spare you the details, but will tell you the lesson I learned:

Your hand is not a clamp. Never use it as one, even if it seems convenient.

It was nice to confirm that my chisel sharpening technique is good. The wonderful person who stitched me up said it was a clean cut. Something I do after I hurt myself is google for similar injuries. It’s comforting knowing you’re not alone and a great relief when you don’t pull up any obits.

Due to the circumstances, I’m going to keep this cutting board because you should always keep your enemies close.

Charcuterie Board

For Thanksgiving we volunteered to bring a charcuterie board. Naturally that meant I needed to make the actual board itself in addition to us bringing the things that went on it.

Here’s the front and back of the finished board. Determining which is the front and which is the back is left as an exercise to the reader:

I made this out of walnut and red oak. The contrast in color and grain texture between the two woods ended up looking really nice. Here it is just after glue up:

After the glue was dry I planed it down. Cut the ends to length and rounded over the edges. Sanded up to about 220, raised the grain with water, then sanded again.

Finished it with Howard Butcher Block Conditioner (essentially just a mixture of mineral oil and beeswax).

My wife put it all together on Thanksgiving. Here’s the board loaded up with meat, cheeses, olives, and fruit. The bowl on the right is filled with cranberries and lactaid pills:

Live Edge Table

Glamor shots of a table’s natural habitat: outside in the leaves

My friend, Kyle, needed a table for an upcoming performance art show related to playing and running tabletop games. He wanted a table that could act as a physical document of play. The table as a sort of participant in the games. After his shows he’ll be using it for running other games over the years, and likely it will also become a dining room table.

Beyond that the thought was to make something that looked natural and would also show its scars visibly. Over time, and with use, the table will pick up scratches, dings, and nicks. If someone spills something on it, the finish might run or dissolve and that is okay (and desirable!). The hope is that over time the table itself has a clear and readable history.

Here’s some additional shots of the table:

Wood Selection

I source as much of my wood from Urbanwood as possible including everything for this project:

A Gnarly Slab

After a lot of searching I found the perfect slab of pine for the top of the table. Plenty of knots “ugly” spalting and damage from bugs. The price for it had been reduced and reduced again. Under many other circumstances it would be a terrible piece of wood to use for a tabletop. However, for this the gnarlier the slab of wood the better!

To get the right length and width for the top it needed to be subdivided and glued back together.

Here are some shots of dividing the slab up so I could get the right width and length from it and then planing it down to the right thickness:

Apron and Legs

For the apron and the legs I went with oak. It’s hard and stable and matches the pine top well. Similar to the top, we wanted legs with interesting details. The knots here don’t have much of an effect on the strength of the table, but they make the legs far more interesting to look at and give it a tactile feel. Here’s some progress shots just before glue up matching the boards together, and then after the hanger bolts were installed.

Finish

The table is finished with an amber shellac. Shellac should probably never be used for the top of a table. It’s not terribly durable and can dissolve in alcohol. At a minimum if you want to use shellac you should do a final coat of wax. Again though, it’s perfect for this: provides a nice finish that will degrade over time as people use it.

Here’s a before picture alongside a detail shot of it after the shellac was applied:

Conclusion

This was a really fun project! I can’t wait to check back in on the table in a year or two or ten to see what has happened with it. Woodworkers can often get obsessed with making our pieces as permanently perfect as possible. It was a refreshing challenge to make something that was intended to be used and show its scars proudly.

If you’re interested in collaborating on a project, or commissioning a table like this of your own, please reach out!

Williams Street Bikeway

Today was my first use of the new protected bike lanes on Williams Street. I picked it up at Thompson and took it all the way to Main Street and it was wonderful!

I generally feel safe riding my bike in Ann Arbor and do so almost every weekday of the year (except for February, which is the worst). Despite this I wasn’t prepared for just how much safer I felt in the protected bike lanes. When you bike you get used to the idea that all cars can be weaponized against you. After a while a defensive posture becomes part of riding. Like, you learn pretty quickly to make direct eye contact with drivers just to remind them you’re there before they turn into you.

But in the bikeway? It felt safe! I was biking and smiling and felt relaxed. Unless a driver is being willfully dangerous you are actually protected.

My conclusion after using this bikeway just once is that we need a lot more bikeways around town. The more protected lanes we have the more we can recommend biking as a primary mode of transportation. And if we’re serious about the climate emergency that city council just declared we need more as quickly as we can get them.