Jakob Gillich

Getting started with bhyve

I’ve been running a home server for a few years, but my upload is just too poor to do anything serious with it, so I got myself a cheap dedicated server. Installed FreeBSD, because lets try bhyve, their new-ish hypervisor. The default “frontend” to bhyve is quite complex, so I used vm-bhyve instead, which can definitely compete with Docker in ease of use. So let’s install it. It is in ports, but the package usually outdated, so make sure you install from source.

Read more →

This Week in CloudFM 1

or: How to implement XML parsing in just 500 lines of Rust. A weekly blog about my progress on CloudFM, a offline-first, multi-backend music player. Not the best start for a series like this, but last week my SDD died. Then I wasted an entire evening trying to install OpenSuse Tumbleweed (something something SecureBoot). Bottom line, I did some stuff, but not even close to what I wanted to achieve. What’s new hyperdav got all required functionality.

Read more →


Over the last few months, I’ve been working on a next-generation music player for the age of “servers connected to the internet”, also known as the “cloud”. Because I am bad at naming things, I called it CloudFM. You don’t actually need to click the link, because there’s nothing to see there. I’m mainly putting this out there because I want to regularly share progress I’ve made. But let’s start with what I’ve done so far.

Read more →


I wrote a Jamendo API client in Rust today. And it was easy. Yes, Rust is quite hard to learn. But after you’ve grasped the concepts it’s built around, like ownership and lifetimes, it all makes sense. Unlike JavaScript, which never made any sense.

Including npm modules in TypeScript

I’ve written quite a lot JavaScript and Node.js code over the last few years. Unlike many, I think it’s a great language and server platform. However, the lack of static types does regularly introduce errors that are hard to find. That’s why I decided to use TypeScript for a new project. The website describes it as a superset of JavaScript, with typings being optional. I was quite surprised to find out this is not true, at all.

Read more →

Self-contained development environments using Nix

Nix is a package manager that works a bit differently. It allows you to install any version of any package alongside each other. Since you can’t, for example, have multiple python executables, nix-shell is used to give you a environment with all the dependencies you need. Let’s say you have a Rust project. You create a default.nix in your project directory: with import <nixpkgs> { }; rustPlatform.buildRustPackage rec { name = "my-project-${version}"; version = "0.1"; src = ./.; buildInputs = [ openssl pkgconfig ]; depsSha256 = "160ar8jfzhhrg5rk3rjq3sc5mmrakysynrpr4nfgqkbq952il2zk"; } This defines a Rust package in the current directory, with the openssl dependency.

Read more →

Another Year, Another Static Site Generator

This year’s hotness: Hugo. Being the web hipster that I am, of course I switched. Not that I didn’t have a good reason, I had already written two or three posts with Middleman, so it felt really old and used. On a serious note, Middleman does feel a bit limiting when you build more complex sites with it. But maybe using static site generators for anything other than simple blogs and documentation is just a bad idea.

Read more →

CORS Proxying with nginx

CORS is a very advanced security technology designed to waste your time. It works for production environments, but oh Firefox can I please just send some requests to that API to test my app? The answer is no, so this is how to configure nginx and make your local dev environment so much more secure: server { listen 8080; location / { if ($request_method = 'OPTIONS') { add_header 'Access-Control-Allow-Origin' '*'; add_header 'Access-Control-Allow-Credentials' 'true'; add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Typ'; add_header 'Content-Type' 'text/plain charset=UTF-8'; add_header 'Content-Length' 0; return 204; } add_header 'Access-Control-Allow-Origin' '*' always; add_header 'Access-Control-Allow-Credentials' 'true' always; add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS' always; add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Typ' always; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass; } } To make your life extra difficult, the creators decided you can’t use wildcards for Access-Control-Allow-Headers, enjoy changing this config for any new headers you want to use.

Read more →


After reading about it so many times, I finally tried NixOS. Never heard of it? Definitely check out their web site, but if you’re not into functional programming, you probably won’t understand what it is all about. At least I didn’t, until I tried it. And it blew my mind. But let me break it down for you. NixOS NixOS is basically a regular Linux distro, it runs on the desktop as well as on the server.

Read more →

The state of video production on Linux

As a regular listener of the Linux Action Show and similar shows JB produces, I’ve always known video production on Linux isn’t the best experience ever. Never would I have imagined how bad things really are. I had a really simple task. Record a video, add a few titles, done. Doesn’t sound hard, does it? Well, apparently it is - on Linux. I tried pretty much all editing software that is available: Pitivi Pitivi looks like a modern GNOME 3 app, great.

Read more →