xargs me

Desperately Accumulating Knowledge

Full Custom KeyPoard


Feature Summary:

  • single piece machined aluminum case
  • flat split true matrix layout
  • large hand separation
  • ten keyless
  • Macintosh layout with symmetric standard modifiers
  • integrated Apple Magic Trackpad and palm rest
  • Cherry MX Blue keyswitches
  • full n-key rollover matrix

Ancestry of KeyPoard is a cross between HumbleHacker and Apple Wireless Keyboard.


I’ve been looking for the perfect keyboard and was disappointed when I did not find it.

I own a Kinesis Contoured and its where I fell in love with the non staggered layout, but I really didn’t like some of the layout choices such as putting the +/= on the top left. Sure I could remap it, but there isn’t enough room to put it in the right place. So I knew I wanted a keyboard with a more standard layout. Which means TypeMatrix and HumbleHacker were also out.

The other keyboard I regularly use is the Apple Wireless Keyboard. I really like the design philosophy of Apple products where everything is beautifully designed yet functional. This lead me to design a keyboard as simple as possible with the fewest parts.

Keyboards have so much legacy behind them. Modern keyboards copy the staggering of keys mindlessly from the original typewriters. Apple showed us a completely flat keyboard works, which is unlike most keyboards with varying row heights.

I wasn’t going to find my perfect keyboard. I was going to have to make it myself which is where the story of KeyPoard begins. I’ll let you figure out why the b is upside down.



This layout emulates the standard Macintosh, except I had room to sneak in another control key. This makes the modifers nice and symmetric.

The keyboard uses R3 keycaps to make the entire keyboard flat like the Apple Wireless Keyboard. The keywells have good hand separation accomplished with an integrated Apple Magic Trackpad in the middle.



The case is machined out of a single block of aluminum. Yes this makes it expensive, but this is what you need to do for simplicy of design.

The integrated palm rest is to reduce wrist angle. Regular keyboards are terrible for the wrist with their positive keyboard slopes. The keys are as low as possible without the need to reach deep into the keywells to further minimize wrist angle.


I am not creating a PCB for this keyboard. Instead I took inspiration from lowpoly and going to hand wire the matrix like he did with The Apple M0110 Today. As for the controller I will be using a Teensy 2.0.


I was originally going to use hasu’s tmk_keyboard firmware, but in the end I used the Phantom-Keyboard firmware which has now been moved to Teensy-Keyboard. The history is a bit lost now, but the current Teensy-Keyboard firmware integrated my configuration enhancements.


I’ve been using the KeyPoard for the last few days and its amazing! Since I was used to the Kinesis Advantage matrix layout I was able to go at full typing speeds with relative ease. There were a few minor build hickups and for all the details see the Build Log.

Note: This was originally posted on geekhack.org, but due to their ups and downs I’ve decided to permanately move this post here.

Servlet 3 + Spring Without XML

Software should be simple but we keep putting up artifical barriers to our end goals. XML configuration is one of those barriers as it is annoying to maintain and refactor.

The XML burden was reduced with Spring 2.5 with the addition of annotation based configuration, but you still needed to bootstrap Spring in XML.

However in Servlet 3 and Spring 3.1 we can now drop XML completely and have 100% code based configuration. This includes the web.xml! This is all thanks to the Servlet 3 spec!

I wrote simple “Hello world” XML free Spring project, but instead of going over the code now, I thought I would explain from the bottom up. The bootstraping process of Spring can be a bit of magic, so hopefully this will actualize the process.

XML free bootstrap process:

  1. Servlet 3 container finds all classes implementing ServletContainerInitializer
  2. Container executes a Spring implementation SpringServletContainerInitializer
  3. SpringServletContainerInitializer finds all classes implementing WebApplicationInitializer
  4. Spring executes our root configuration implementation WebApp
  5. Our root configuration create a new Spring context AnnotationConfigWebApplicationContext
  6. The context finds all classes with the @Configuration annotation
  7. The context executes our controller configuration ControllerConfiguration
  8. Our controller configuration finds all classes with the @Controller annotation
  9. The configuration creates our controller RootController
  10. Finally the context we created in step 5 is fed into the Spring Servlet DispatcherServlet

Now when we hit http://localhost:8080 the request goes to the DispatcherServlet which is configured to handle / with the RootController.

There are just two caveats at the moment. First your application container must support Servlet 3 for this to work. I used the Jetty 8 Maven plugin for testing. Second Spring 3.1 is currently in RC1. You can start playing with it now, but just remember to upgrade to the release version when it comes out next month.

With all the configuration in code it is so easy to refactor and navigate. No more back and forth with XML.

Why Are D20s So Popular?

I have to shamefully admit I never owned a D20 until recently. While at the game shop I noticed they sold sets of dice as D4, D6, D8, D12, and D20. Curious. What is so special about these shapes?

What is interesting is these shapes are Platonic solids. Platonic solids look “nice” because every face is the same shape and every angle between every shape is the same. And what is unbelievable there are only 5 of them! That bears repeating. There is a finite number of such shapes, and there are only FIVE OF THEM! Of all the possible shapes in 3D there are only 5 such shapes? Euclid proved this in Elements.

So my first thought was if that was true then what about that trick of subdividing an icosahedron to tessellate a sphere? Why doesn’t that create a platonic solid with 80 sides? Its because the first subdivision creates a shape where some vertices terminate 5 edges and others terminate 6 edges.

This is very sad as it mean we can never have an uniform Geodesic Grid larger than 20 faces. This is because subdivision of a single triangle becomes a four triangles in the shape of a triforce. This means two adjacent subdivided triangles now share a vertex with 6 edges. There does not exist a regular shape with each vertex having 6 edges.

So D20 are popular because that’s as large as nice shapes get.