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:



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


PJM Elite’


Mt St. Helen’


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


Variety ‘Jeanne”


We rounded out your hosta collection with a few more.


Shade plant with striking foliage.


Shade plant with feathery leaves and flowers.

Bleeding Heart

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


Variety ‘Globe.’ Evergreen with soft flat fronds.


Viburnum mariesii is a shrub with white puffs of flowers.


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


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


Low growing evergreen provides winter interest.

Solomon Seal

Shade plant with white bell flowers.


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.”


Ribes americana is a native shrub with edible black berries. 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?!


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(" Updater")
            TextField("Enter Update", text: $message)
                .frame(height: 100.0)
            Button(action: {
                self.POSTfunction(message: self.message)
            }) {

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! dict, options: []) 
        HTTPPostJSON(url: "", data: data) { (err, result) in
            if(err != nil) {
            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.


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

	# 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); 


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:

		<title>Is the Salz Baby Here Yet?</title>
			body {
			#answer {
				position: fixed;
				top: 50%;
				left: 50%;
				transform: translate(-50%, -50%);
				-webkit-transform: translate(-50%, -50%);

			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">

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

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


				print $contents;


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.


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:

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.


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:


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.

Success metrics

Arguably the single most important part of any project that everyone skips is defining what makes a project successful.

The Traps to Avoid

Doing so focuses the project and, more importantly, will help you ignore three big traps:

  • Taking on other people’s definitions of success.
  • Never finishing.
  • Grabbing onto tantalizing data that don’t actually support your goals.

Other People’s Ideas of Success

Often–always, actually-–when working on a project people will offer opinions and ideas on what you should do with it. This is human nature and is a lovely thing. If you’re not sure in what you want though, well, it’s easy to take on their thoughts as your own. Feedback is good, taking it all in means that you’re not secure in why you’re doing what you’re doing.

A lot of what people will suggest means success is going to have to do with capitalism. Always remember that you are not required to monetize your joy.

Never Finishing

Finishing anything is hard. It’s so hard.

The last 10% of even the best scoped projects is always 1000% of the work. Nothing will kill your momentum during that difficult phase more than not knowing what you’re actually shooting for.

You get lost, flail about for a bit, and put it down forever. It’ll make you feel guilty for a long time too whenever you think about it.

Tantalizing Data

Social Media figured out years ago that people like having numbers attached to their posts. Engagement metrics are, frankly, super fun because it’s a nice dopamine hit to see strangers interact with your posts! My guess is that with any interrogation though you’ll find that your reasons for posting are not to see analytics numbers tick up.

You’re probably, at a minimum, more interested in a specific audience liking and retweeting your work. Or, the actual reason you’re posting on social media might be to sell your project, generate commissions, share it with a group, keep a diary for yourself, OR any number of totally valid reasons to use social media.

A large number of favs, shares, and/or retweets is rarely going to be your project’s actual goal. If it is, you can go and buy those likes and retweets from many numerous shady websites with a minimum amount of fuss.

A Personal Example

To personalize this: the primary goal of the posts on this blog are to help me organize my thoughts and to reference them later on. A secondary goal is to share posts with my social circles. A tertiary goal is for random folks on the internet to find the posts when they’re looking for specific information.

This post was written as a reminder to myself to avoid mistakes I’ve made in the past. I’ve walked directly into all of the three traps above and will likely continue to do so. If anyone else reads this post hopefully they’ll be able to use it as ammunition against me the next time I dive in headfirst into a project without a goal.

If my primary goal was to achieve some sort of Elite Blogger Status I’d have to do things a lot differently. Probably there would be no cryptic posts about goal setting! Not going after that particular goal frees me up do what I actually want with this little corner of the internet and not obsess too much over analytics numbers.