• Laser Cut Santa

    In December, I made a laser cut stained wood Santa piece for a Christmas gift. I always have to wait to publish anything about gifts, and tend to wait too long.

    I drew the image in Inkscape and laser cut it as a series of small shapes, stained each piece, glued them together and made a frame out of popular.

    Laser Cut Stained Wood Santa

    I think it turned out pretty well and like the 3d effect of the wood glued on top of other pieces.

  • Mallet Building

    Last weekend I built a woodworking mallet out of oak.

    I needed a mallet to help with assembling and banging on things without as much damage as a plain metal hammer would leave, so I built my own. Building a mallet is often used as a basic woodworking introductory project since it’s not very hard and is meant to be used.

    I built a wooden mallet

    I watched a few youtube videos to get the general idea and just went for it. Basically I cut a portion of an oak board in to three lengths for the head and made a handle of two longer pieces glued up together.

    The center of the three head pieces was cut twice at 5 degree angles to leave an inside partial V shape, but not coming all the way to a point. These three layers, now four pieces, were glued up in a stack with some dowels drilled in to help align them. The dowels were not necessary, but help add a bit of visual candy, I will probably leave them off in the future.

    The handle was made of two pieces glued together and then chiseled down and sanded to fit in the head. The handle is much more square than I expected, but works well for me and everyone’s preference will be different.

    After glueing it all together, I attached the handle with some wedges made of scrap wood. I pounded these in with a board, since I hadn’t finished the mallet yet. After that I cut the excess off with a flush cut saw and added some wood glue to help keep the wedges in.

    Next, I used a trim router to add the edging, which consisted of a chamfer on the head and a roundover on the handle. Then I sanded it all on a belt sander at 60grit before moving on to a random orbit sander progressively going up to 220grit.

    I finished the piece by oiling it with two coats of Tung Oil which should help prevent some scars from usage and protect the wood.

  • Finishing Tree Cookies

    Finished Decorative Wood Piece

    Finished Decorative Wood Piece

    For this project, I had some tree cookies from what might have been a Mesquite tree. I wanted to smooth them over and use one for a cake stand and maybe make a clock from another. I had 5 pieces originally in case some didn’t turn out, and one was used just for testing a tung oil finish.

    Unfinished Wood Cookies

    Unfinished Wood Cookies

    The tree slices or cookies, were pretty rough to start with. They were covered in chainsaw marks and uneven. I tried sanding them smooth using a handheld random orbit sander and a belt sander with no luck. There was too much material to take off, and they were too big for the planer or any saw. I finally had good luck using an angle grinder with a 36grit sandflap attachment to take the chainsaw marks off.

    Epoxy Drying

    Epoxy Drying

    After smoothing out the cookies, I wanted to use epoxy to the fill the cracks in. A couple of the pieces had holes that went all the way through and could look pretty neat after being filled. On two of the pieces, I just used plain clear epoxy and the other two I mixed in some gold colored powder hoping to add a neat effect. The plain epoxy never ended up curing correctly, but the gold was fine, though the bigger piece with gold didn’t look very good afterwards.

    Gold Filler

    Gold Filler

    The tung oil finish looked pretty splotchy on the outter parts of the wood, so on the one I really liked, I just cut off the edges to leave a funky decorative piece instead.

    • Gold Filler
    • Unpolished
    • Unpolished

  • Gold Picture Frames

    Last weekend I worked on building some picture frames from scratch. They didn’t turn out the way I hoped, but I will probably still use them.

    gold frames

    Gold Frames

    I wanted to make some custom sized frames to hold some photos and mats for the welcome table at our wedding, one will frame an 8x8 square photo, one an 11x14, and the last was for a 3 5x7 collage photo mat. Except for the 11x14+mat, the sizes I wanted are a little odd and hard to find. I want something like a 12x12, 12x23, and 15x18.

    I started with just plain 1x2 cedar boards from the Home Depot and first went over the edges with my router. I cut a slot down the back to hold the glass and photo, and then chamfered the other two sides on the front.

    After edging, I cut the boards to length on the mitre saw with a 45 degree angle for each corner. Next, I glued them up with some brad nails to hold the pieces while the glue set. The corners did not come out as clean and square as last time, but that is probably because of using less sturdy brad nails instead of corner clamps.

    Unpainted Frames

    Unpainted Frames

    I sanded them using my random orbit sander and then spray painted them all in a makeshift paint box. The paint box was made from pvc with a plastic drop cloth taped over it. Nothing special, but it worked.

    Paint Box

    Paint Box

    I used grey primer and then metallic gold spray paints. The shinyness of the gold was impressive and better than I expected. Unfortunately, it also showed off all the defects and rough patches.

    In The Paint Box

    In The Paint Box

    They didn’t turn out as nice as last time. I’ll probably sand them down and repaint to a flat black or other color.

  • Spark for ESP8266 Wifi Display

    Last year I created a simple ESP8266 based Wifi display using a Wemos D1 Mini and a 4x20 character LCD - Video 1 - Video 2. I used a php script for the backend because I wanted it show the time without having to add an RTC, and I didn’t want to format messages on the board. The php script will generate a preformatted message for the board, so it just has to split out the 4 separate lines. This was great, but I want to change the messages a little bit easier.

    ESP8266 WiFi Display

    Instead of using php this time, I went with Java which I’m much more familiar with, and will run the server on a Raspberry Pi. I have also set the wifi board to fallback to the old php script anytime the new Java server is unavailable. Since I’m using a Pi, it will be up and down a lot as I work on other projects, and don’t want the time on the display to be too far off. The message will change when it falls back, but I don’t mind.

    Change message page


    I created a Java app using Spark, which is a Java web app micro framework based on statics and Lambdas. It starts up super fast, typically only a couple hundred millis, and is very lightweight. This works great on something like a Pi or shared environments where resources are limited.

    Spark Helloworld

    import static spark.Spark.*;
    public class HelloWorld {
        public static void main(String[] args) {
            get("/hello", (req, res) -> "Hello World");


    Spark also works with template engines so in addition to services, you can generate html pages. I used Thymeleaf to create a basic message editing page that will display the current message.

    To send a Thymeleaf template response with Spark, create a Thymeleaf TemplateEngine and return the result of the engine.render method in your response:

    private static final TemplateEngine thymeleaf = new ThymeleafTemplateEngine();
    Spark.get("/yourPath", (req, res) -> {
      Map<String, Object> model = new HashMap<>();
      model.put("templateVariableName", value);
      model.put("variable2", message2);
      return thymeleaf.render(
          new ModelAndView(model, "templateFileName")

    build.gradle Dependencies

    compile group: 'com.sparkjava', name: 'spark-core', version: '2.6.+'
    compile group: 'com.sparkjava', name: 'spark-template-thymeleaf', version: '2.5.5'

    Basic Auth

    I didn’t want just anyone to be able to change the message, so I added an HTTP Basic Auth filter using QMetrics Spark Authentication library to require a username and password. This was the easiest route to get a minimal level of security, but please note that basic auth is not safe for plain text http connections and should only be used over https. Basic auth actually sends the username and password as a Base64 encoded header string, so without https anyone can decode them. In this case though, there is minimal risk.

    Spark.before(new BasicAuthenticationFilter(
    		"/*", new AuthenticationDetails(user, pass)));

    build.gradle Dependencies

    compile 'com.qmetric:spark-authentication:1.4'


    I wanted this app to be easy to run. Spark uses Jetty as an embedded http server, so it starts fast and there are only library dependencies, with nothing extra to install. A standard build will generate one jar with your code in it, but all the other libraries still need to be packaged together somehow. In the past, these would have been bundled together in a folder inside of a zip file, but a better approach is to use a fat jar.

    Gradle helps make this easy. You need to create a new build task to tell Gradle to include all the dependencies in the built jar, and to set the main class in the Manifest to make it a runnable jar. Now there is just one self contained jar to distribute which could be run with java -jar your-fat-jar.jar

    Gradle fatJar task

    task fatJar(type: Jar) {
    	manifest {
            attributes 'Implementation-Title': 'ESP8266 Wifi Display',
              'Implementation-Version': version,
              'Main-Class': 'com.mikelduke.java.wifidisplay.WifiDisplay'
        baseName = 'spark-wifi-display-all'
        from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
        with jar

    Gradle Build Command

    ./gradlew fatJar

    Run it

    I created a shell script to start the spark-wifi-display on my pi which can be run on startup. This script starts the java app in the background so it doesn’t need a user session and sets the property the app uses to set what port the server runs on.

    nohup java -Dserver.port=8081 -jar git/ESP8266WifiDisplay/spark-wifi-display/build/libs/spark-wifi-display-all-1.0.0.jar &

    Run on Heroku

    The spark-wifi-display app can even be deployed and run on Heroku. It’s probably not a good choice for a free dyno though, because the wifi module will hit it repeatedly. Heroku will sleep (turn off) free dynos for 6 hours a day, so it won’t be always on and will eat up the free pool of hours doing something which is fairly pointless, but it is possible.

    To enable running on Heroku, I had to add a stage task to the gradle build and create a Procfile to hold the run command.

    Gradle Build Task

    task stage(dependsOn: ['build', 'clean'])
    build.mustRunAfter clean


    web: java -Dsecured=true -Dserver.port=$PORT -jar spark-wifi-display/build/libs/spark-wifi-display-all-1.0.0.jar

    The secured property is set to true since this will be available on the internet after it’s deployed. The username and password can be set in the Heroku settings page as environment variables.

    Use it

    The edit message page is on the root ‘/’ for example http://your-ip:8080/ and the message formatted for the display is on ‘/message’ or as an example

subscribe via RSS