Howdy, I’m a web developer based in Berlin. I like birds, JavaScript, kimchi pancakes, Golang, Functional Reactive Programming and all that. This blog is where I publish things when I feel like it. Find out more about me on

I currently work on a making web analytics fair and transparent for everyone with Offen (I blog over there too if you’re interested). I sometimes publish tiny pieces of software on GitHub and on npm.

You can email me at


  • Automate everything that is not part of the problem you're solving

    When faced with the decision if something is worth automating or not, the default reaction for most developers and product managers will be simple: estimating the time spent on a manual task, and comparing it with the time it would take to automate the task away. Whatever takes the least time wins. When building Offen, the decision of what to automate came up quite a few times as well, and I have realized that only looking at time spent might be a bit short-sighted.

  • Why Offen doesn't have a public dashboard

    There seems to be a trend among this current wave of privacy friendly analytics providers like Fathom, Simple Analytics, Goatcounter, Plausible and others (my project Offen is probably a fringe part of this wave as well to be transparent) and also affiliated websites to make the stats for their websites publicly accessible. It serves as a nice instant demo for the product, and it is supposed to show off their approach towards “privacy friendliness”. Offen does not have such an easily accessible demo. If you want to have a look at how it works, you will need to download the binaries and run a local version that is populated with random data. This might seem overly complicated, but there’s a good reason why it works that way. In the following, I will explain this to you from my perspective as a user of the internet.

  • Building Offen

    With browser vendors adding more and more tracking protection with every release, a plethora of privacy enhancing browser extensions and AdTech companies getting better every day at fingerprinting and circumventing tracking restrictions (think using DNT headers in order to fingerprint and track users) it feels like the year 2019 is finding the internet in some sort of privacy arms race.

  • Run automated MongoDB backups to S3 using AWS Lambda and Zappa

    MongoDB comes with a backup tool called mongodump which is what you should be using when you have the resources to set up a dedicated backup job that is able to install / run the CLI tools that are needed.

  • Compile to JS like it's 2010 again: A sneak peek into ClojureScript, Elm and ReasonML

    Recently, we’ve been seeing some kind of a renaissance of Compile-to-JS languages. When Babel and ES6 made the first wave of languages like CoffeScript obsolete, the toolchain that evolved around Babel (and TypeScript) made transpiling your code mainstream and probably even the de-facto standard for writing largish applications that run in the browser.

  • Programming is not about competing with others

    The title says it all. Programming is a team effort. There is no winning, no hierarchy of performance, no #1 programmer: in the end you all commit to the same codebase, you build the same product.

  • Testing and testable JavaScript for absolute beginners and occasional programmers

    Writing tests for your software is an established practice in most development environments nowadays. It also makes a lot of sense. Code that is subject to changes and changes will need some sort of plan for knowing it still does what is it actually expected to do. Tests do that for you.

  • Deploying to GitHub Pages using Circle CI 2.0

    GitHub Pages is GitHub’s free service for hosting static websites (like this blog) and assets. Its usage is extremly straight forward but requires little repetitive chunks of manual work each time you want to update something (unless you use their built-in jekyll tool). The number of smallish and static side projects I maintain recently reached critical mass, so I looked into using Circle CI for automating the deployment to GitHub pages.

  • What I learned building an webhook lets you build conversational chatbots that interface easily with lots of existing messaging services. The promise is: “define your logic once (no coding!!!), reach users across many platforms”. Trouble is these bots are kind of oblivious. If you haven’t talked to them in the last 10 minutes, they will likely have forgotten about you and what the two of you have been talking about the last time.

  • Awesomeness Mainstreaming

    I’ll start by assuming you are just like me. You’re a developer, you went to a few conferences and meetups. You enjoyed going there. You learned quite a lot of new things. You’ve seen lots of people who might be labeled a “rockstar” by others. Stupid term, I know, but well, we’re having quite the time right? Afterwards, let’s go crazy, let’s do aracde games, karaoke all of that. Dive bar? Sure thing, chicken wing. Oh, yes and we’re super inclusive, right, so everyone is welcome. Just come along and be a super awesome person with us. Amazing, isn’t it?

  • Building a Telegram Bot using express.js

    The Telegram messaging app has an extensive Bot API that is available to the public. I published a Node.js client library to npm. The library explicitly lacks a hook for setting up long polling as it is actually quite easy to build a simple express app that handles incoming messages for you.

  • The problem with "best practices"

    Software development seems to be all about best practices today. For every task that needs to be done, there seems to be the one single way to do it. Depending on who you ask that is of course.

  • Wiring up React and Backbone.js

    Backbone is a piece of software I love very much. Compared to other behemoth like frameworks I admire the fact that it encourages me to do things right while thinking about them myself. And if I need answers I can just read its source code and get the answers that I need. It basically taught me development that goes further than $('#logo').magicPluginDust().

  • Learn AMD in Y Minutes

    In 2014, I wrote an introduction to the Asynchronous Module Definiton for the fantastic Learn X in Y minutes. And although I abandoned require.js by now and have become a die-hard browserify fanboi (just like I used to be a require.js fanboi…) I still think modular JavaScript is an idea that should be propagated, even in 2016, so here you go with the original introduction.

subscribe via RSS