contact Me

Use the form on the right to contact me.

You are welcome, to contact me regarding the topics of this page, my open source projects, or my work. Please use the contact form and leave a valid email address for me to respond to.

Thank you.

Egidestr. 9
44892 Bochum



Random thoughts, bright ideas and interesting experiments. In short the ramblings of a fulltime nerd.


A fun week full of experiments

Jakob Westhoff

During the last week I have been away on a hackathon with friends. We rented a big vacation home and made ourselves comfortable there. We didn't have any special topic or project to work on. Everybody just met there to have fun playing around with whatever he wanted to test, learn or discuss. As always it hasn't only been a lot of fun, but quite a productive week as well.

An experimental Grid of L8s

After receiving further L8s. I planed on integrating a Grid feature into my node-l8smartlight library. I wanted to control a grid of multiple L8s, as if they were one big matrix with a greater amount of pixels. In order to do that I introduced an abstraction layer, which transparently maps between a matrix of the available L8s pixels, and their respective local coordinates and operations. The whole process is completely transparent to the user. I took a small video of it during the hackathon, which demonstrates the first working implementation of it.

Before releasing a new version of the library I will have to cleanup and document the created code further. However you are welcome to play around with what is there already. You will find the current state in the master branch of the node-l8smartlight repository over on github.

An experimental FTP2HTTP gateway in Go

After my initial work on the L8s was finished I wanted to do something new. Learning a new programming language? I have been curious about Go for quite some time now. Therefore I started to fiddle around with it. After a short period of time I was comfortable with the basics of the language. In order to further explore it I needed a simple, but yet interesting little project for me to realize. After a discussion with a friend about the fact, that a lot of people still use FTP for import/export of data in and out of there systems (especially ERP-Systems). I realized I could ease the pain in a certain project myself by having a HTTP2FTP bridge. The idea was born: Create an application, which acts as a FTP-Server to the outside world, while querying a HTTP-Backend, once a file is requested for download, a folder listed, or something uploaded. This would allow me to directly integrate a FTP interface into a web application without pain or the maintenance overhead of a real FTP server, which is then synced via cron or some other worker with the real web application.

FTP Access to the virtual files and folders which map to HTTP endpoint

FTP Access to the virtual files and folders which map to HTTP endpoint

I decided that this project would be ideal, to allow to learn further things about the Go language. One and a half days later, the first version was ready and mostly worked as I wanted it to be. If you want to take a peak at the project head over to my http2ftp repository on github. Or simply install the tool inside your Go environment with the following command:

$ go get

As I potentially will use this gateway myself I might change and update it in the future. However you should think of it as an experiment in its current state, which is most likely not ready for production use ;). As I said I developed it with 1 1/2 days of Go knowledge.

An experimental update of my JavaScript Seeds

Some time ago I published an article on the basic setup I use for new JavaScript projects. Since then I adapted and refined this setup while using it during my day to day work. I used the last day of the hackathon to integrate a lot of the changes and updates, which accumulated during the last months in different projects back into my JavaScript Seeds. Furthermore I realized, that I am using specialized versions of those bootstrapped environments for different use cases. For example I created a modified version, which integrates Facebooks React framework, to allow smooth and easy development in conjunction with all the other technologies I like to use. Therefore I reorganized those environments and put them into their own organization on github: BootstrapJS.

This organization hosts all the different versions of my environments. Currently there is one for vanilla JavaScript as well as the afore mentioned React variant.

As the build file (Gruntfile.js) got more and more complex, to the point, where it afflicted pain on me during updates ;), I decided to split it up into different files, each reflecting one build scenario. Those scenarios can now be found inside the Build Support folder. In addition the main build steps are now executed in parallel to speed things up a little. Further changes involve a more semantically correct naming of folders, package updates as well as configurable build Parameters(.json) and some minor tweaks.

Just head over to the repositories and take a look. Pull requests are always welcome. If you have similar setups, maybe involving another technology stack, like browserify instead of requirejs, drop me a line and we can give it a separate repository inside the BootstrapJS organization. The more the merrier.

Other Experiments

Besides the experiments detailed in this post I used the time to work on some aspects of the Qafoo Profiler together with my fellow co-workers. I had a lot of fun developing solutions for certain aspects of this project. I am already looking forward to publicly announce some of them in the near future. Stay tuned!

Thanks for this great week

On a personal note I wanted to thank all the awesome people I had the chance to meet and talk to during the last week. As always it has been a blast. Thanks for the fun times. Hopefully see you all again next year :).

Keyboards and Markdown Editors for the iPad Air

Jakob Westhoff

This blogpost is a little different from the ones I usually write, as I wander off into the world of hardware accessories and tablets. In this case external Keyboards and Markdown editors for the iPad Air. I will talk about finished Soft- and Hardware products, ready for you to use instead of some development related topic, which I think is a first in this blog.

Why am I coming up with such a topic you might ask. The answer is quite simple: Instead of taking my MBP Retina with me wherever I go, I tend to get along with my iPad just fine most of the time. Especially if I know, that I am only going out to read something or write articles or documentation. The iPads astonishing battery life, as well as its very small form factor make it an ideal companion for me in such situations.

Hardware vs. Touch

Unfortunately I quickly had to realize, that doing quite a sophisticated amount of writing on a touch based keyboard isn't much fun. It works quite well if want to quickly answer an email, or issue a small chat message, but it is simply not working out once you are writing articles or fully featured project documentations. I started looking for external keyboards, that would allow me to harness my iPads advantages, while still having a real world hardware keyboard to type on. After quite some research I came up with three different models I wanted to test out:

  1. Zagg folio (Amazon-Link)
  2. Logitech Ultrathin (Amazon-Link)
  3. Belkin QODE Thin Type (Amazon-Link)

I ordered all of those keyboards over at amazon to check whether they would fit my personal usage criteria.

Zagg folio

Once they arrived I started with the Zagg folio. The folio is a solid piece of hardware. The keyboard feels robust and well manufactured. The pressure point of the keys seemed a little soft for me. Especially in contrast to the keys of my Macbook. In contrast to most other keyboards I had seen so far, the folio isn't just a cover. It is a full blown case, which opens and closes like book. The iPad is fixed in the upper part, while the lower part is the keyboard. This technique allows the iPad to be flexibly positioned on the top edge of the keyboard. Like with any laptop you may use the integrated hinge to change the inclination of the iPad. Futhermore the folio is the only one I have seen so far, that has LED-backlit keys, just like the Macbook, which eases operation in dark environments a lot.

Even though its way of holding the iPad seems to be really nice, it has been the main reason for me not to keep it. The problem with this kind of mounting, is that the center of mass is moved way to the end of the keyboard, where the iPad resides. This causes the whole construct to move and sometimes even fall over once you are interacting with the touch interface of the iPad, while it is inside the cover. Furthermore I only want to utilize the keyboard sometimes. In most situations I just want to use the iPad as a standalone device. Taking it out of the case every time, would of course be feasible, but didn't feel ideal.

Luckily there were still two more keyboards to try out.

Logitech Ultrathin

I moved on the Logitech Ultrathin. It is important to note here, that different models of this keyboard are available an older one, for iPad 2, 3 and 4 and a newer one for the iPad Air. In contrast to the Zagg the Logitech is a real cover, which is protecting the iPad if it is not used. It is fixed to it make use of the magnetic border, which is used by the SmartCover as well. In use the Keyboard is used as a stand for the tablet. A small groove is cut into case above the keyboard, which holds the iPad in place. It is firmly fixed this way. The tablet can be tilted once placed there, as the mount is placed on a hinge, which can be used to change the displays inclination. I liked the way of connecting the iPad a lot better, but the keys weren't what I have been looking for. There pressure point was way to soft for me. Furthermore the due to the really slim design of the keyboard, the keys didn't move far enough down for me. I never was sure, if I really pressed a key or not. Of course this is a very subjective opinion. Most likely I would have adapted the way the keyboard reacts to key presses quickly, but at a first glance I decided the Logitech wasn't going to be the one either.

Belkin QODE Thin Type

My third and last try out was the Belkin keyboard. In contrast to the two others the QODE Thin Type is created from aluminum. It feels cleanly manufactured and well designed. In contrast to the Logitech the iPad can't be titled once positioned inside the keyboard. I however didn't feel the need to do that anyways, as the inclination seemed to be okey for me. I really much like the pressure point of the QODE, as it is very similar to my Macbooks. The haptic perception of the whole Keyboard is quite pleasing. The keys have got an acceptable size and positioning. Only the Ä and - keys are in a strange place. However I got used to that quickly and quite easily.

One feature of the keyboard, which I really like is that it does not have any kind of on-/off-switch. Once the iPad is placed in the keyboard it is automatically switched on. Take it out and the keyboard is disabled again. Establishing the bluetooth connection to iPad once the devices are paired is about a second. I enjoy the capability of taking the iPad out of its keyboard stand at any time, without taking care of disconnecting the keyboard, or switching it of in order to get my touch keyboard back. Furthermore I don't need to switch the keyboard back on once the iPad is placed inside of it. Once paired everything just magically behaves as it should.

As you might have imagined after this lengthy descriptions of the pros and cons of each keyboard I decided to keep the Belkin QODE Thin Type and sent back the rest. I am still very happy with this keyboard. As a matter of fact, I am currently writing this article on my iPad, while sitting in a cafe, drinking a cappuccino enjoying the sunny weather :).

Markdown Editors

Once I found a proper keyboard I started searching for a nice Markdown editor for the iPad, as I mostly write texts formatted this way nowadays. Until now I used a simple plain text editor on the tablet. However there had to be something better out there. I wanted a certain degree of syntax highlighting, assistance with lists and codeblocks, as well as clean typography. Furthermore I needed Dropbox or iCloud syncing functionality to easily switch between my Mac and my iPad.

After reading myself through the internet again, I came up with 2 editors, which seemed to fit my bill nicely:

  1. iA Writer
  2. Byword 2

iA Writer

I already knew iA Writer, as I had been using it on OS X for more than a year now. Therefore bought it for the iPad to test it out. It mostly is a clone of the OS X version, provides a very clean and structured interface combined with clearly visible, but yet unobtrusive syntax highlighting. It allows to sync texts via iCloud.

The only thing, that didn't seem ideal was the font the developers chose. It is the same they are using on the Mac, where it looks clean and well placed. However with the small screen estate of the iPad it seemed unnecessary wide and spacey. Don't get me wrong I still like the iPad version of iA Writer very much, but it seemed to me there might be a even better alternative out there.

Byword 2

I went to the Appstore again and bought Byword in its current version 2 release. It seemed to be almost identical to iA Writer on a first glance. It had a clean and structured user interface, uncluttered and focused on it's main purpose: Writing. It has nice and unobtrusive syntax highlighting, just like iA Writer did. It provides assistance with lists and other common Markdown elements. Furthermore it supports Dropbox and iCloud for synchronization of documents. I am quite sure once iOS 8 is released it will support the new file dialog as well, to provide easy access to other cloud storage solutions.

But best of all the chosen font did really fit the iPads screen size. Still being clearly visible and easy to read it managed to look, like it had been created just for that device.

I am staying with Byword for now. I even switched my main Markdown editor on OS X from iA Writer to Byword as I like the consistency across platforms.


I hope you enjoyed this non development topic post, as much as I enjoyed testing out all the different approaches to solve my hardware problems :). Maybe this post makes it a little easier for you, if you are looking for a similar solution. If you got any further questions, which I might answer about the presented Hard- and Software solutions. Drop me a line in the comments and I will try to answer it to your satisfaction.

The L8 Smartlight and a Nodejs SDK

Jakob Westhoff

Update: The API does now support Promises. You may freely chose which kind of asynchronous handling you want to use.

Update: The full documentation of the API is now available.

Yesterday my L8 Smartlight finally arrived. After having backed it on Kickstarter about 2 years ago, I had already given up on ever holding the final product in my hands. Even though the team behind the L8 had massive problems with it they delivered in the end.

The Hardware

At first sight the L8 is of high quality. The hardware leaves a very nice impression. Its seems to be a solid product. There are some people, which seem to have gotten a bad batch, as they say their devices burned out just after using it a couple of minutes. Fortunately I don't seem to have gotten one of those faulty lights. As far as the hardware goes the L8 is nicely done. The software side however unfortunately looks quite different.

iOS and Android Integration

The L8 can be paired with iOS and Android devices via Bluetooth LE. After the pairing is completed it shows all different kinds of notifications once EMail, WhatsApp messages, or other kind of communication is received. This part actually works quite well. Even though I only tested it with my iPhone. Therefore I can't say anything about the Android support. The shipped App for iOS surely wouldn't win a design award, but it is functional and does what it has been built for.

Development Resources

As a developer I of course wanted to fiddle around with the L8, taking a look at what I could do with it, that nobody else had thought of yet ;). I therefore headed over to the L8 Github repository to check out, what kinds of SDKs were available. Unfortunately I wasn't really happy with what I found there. There is an iOS and an Android SDK. Even though those have been used to create the applications available for each of the platforms, they didn't seem to be very stable nor sophisticated. Furthermore I didn't want to write a iOS or Android application, but something, that could run on a desktop machine, or a Raspberry Pi. I searched for something like a low level C SDK, but didn't find anything. My eyes fell upon a JavaScript SDK. I thought now we are talking and took a look at it. To my regret this SDK was based on the SerialPort API, that is offered by Chrome to Chrome-Apps. Furthermore the library code seemed to have been written in a real hurry. I thought to myself: Okey there you have a starting point. Try to adapt this SDK to nodejs.

My Nodejs SDK

After an hour of back and forth I realized, that this endeavor wasn't going to work. The codebase simply was to much of a mess, to be properly wrapped and integrated into a nodejs environment. Furthermore I didn't really like the API itself. I googled my way through the internet hoping someone might have documented the protocol of the L8 in order to allow me implementing my own SDK without having to reverse engineer everything. Luckily the L8 creators themselves published a protocol specification of what they call SmartLightControlProtocol (SLCP). After reading it I decided to get going implementing my own L8 nodejs SDK called l8smartlight. Even though it is far from being feature complete at the moment, I like what is already possible with it. It took me more time, then I expected to implement the different functionality, as the documentation isn't accurate at all points, which made me reverse engineer parts of the protocol anyways ;). Currently the SDK allows to control of the full LED matrix as well as the SuperLED, to configure orientation, put scrolling text on the L8 as well as to execute some other functionalities. Most of the Command protocol is implemented and encapsulated under a nice and easily usable API. The protocol to query the L8 for information about its various sensors is currently in the works. I hope to push an update soon.

Using a simple snippet like this is all, that needs to be done in order to show splashes of beautiful colors on the LED matrix. Of course only your imagination is the limit :)

var L8 = require("l8smartlight").L8;

var SERIAL_PORT = "/dev/tty.usbmodem1413411";

var l8 = new L8();, null, function(error, response) {
  var colors = [{r: 0, g: 15, b: 15},{r: 15, g: 15, b: 0},
                {r: 0, g: 15, b: 0}, {r: 15, g: 0, b: 0}];
  var currentIndex = 0;

  var next = function() {
    var matrix = Array.apply(null, new Array(8*8)).map(function() {
      return colors[currentIndex];
    l8.setMatrix(matrix, function(error, response) {
      currentIndex = (currentIndex + 1) % colors.length;
      setTimeout(next, 250);

Hopefully you will have as much fun playing with this library and the L8 as I had developing it. The source code is very well documented. Take a look at Library/L8.js, until I got some time writing proper docs and some more examples. The file contains a lot of details about available methods, options and return values. For the future I am planing a promise based API as well, in order to easily manage the callback hell, that comes with all the asynchronous operations. However this API will be optional of course. The SDK is available via npm as well, allowing you to easily consume it in your own projects.

Have fun and stay tuned for updates.