
Hi, I'm Valentin Knabel!
Developer, cyclist, coffee nerd, human.
Open Source, kindness, honesty, vegan.
It is fine to be imperfect, as long as we are honest and have fun along the way.
2026
Das Buch weiß von der ersten Minute an zu fesseln. Im Kern stehen hier die Moralvorstellungen eines Jägers und wohin diese führen können. Es wird nicht gewertet. Die Geschichte wird nur aus seiner Sicht erzählt.
Read »
Langsam erzählt, etwas zäh in der Mitte. Zwischendurch unangenehm zu lesende Passagen, da diese nicht richtig zu dem Zeitpunkt reflektiert wurden. Schönes, emotionales Ende. Aber man fragt sich beim Lesen öfters wieso. Aber genauso solche Menschen gibt es und waren in der Zeit normal.
Starting with this year, I have decided to discontinue all of my open source projects.
Read »2025
A few years ago while I started working on Lithia, I decided to use whatever takes me to my goal. Getting finished was the primary focus. And I did.
Read »
After a long time of procrastination I finally resumed my work on my new programming language. Back then I wrote about the current state of Lithia and how I arrived in a dead end regarding the language design. Sure I proposed some large changes, but if a lazy evaluated programming language with a parensless call syntax becomes a strict evaluated programming language with a regular call syntax and multiple additional features, is it still the same boat… language?
2024

In 2021 I started working on the current Go implementation of my own experimental programming language called Lithia. Now it is available in version v0.0.19. Infrequently I also wrote some words about it on this blog. It has been designed to be an experiment, that is able to teach some lessons and that can be fulfilled.
Read »2023
My system language on my linux machine is set to English, but as a German raised with 24-hour days, I simply cannot wrap my head around to get the 12-hours am/pm format intuitively. By the time I learned that am is in the morning and pm is in the evening. But when it comes to 12:00 as the mid of the day and 0:00 in the night, I’m lost.
2022
Acorn is an application deployment framework for k8s, that tries to simplify instead of introducing another layer of indirection. I won’t cover all details and problems it tries to solve here, instead I’d like to share some experiences and thoughts.
Read »Did you ever want to access the contents of an auxiliary file from within your repository to access the contents at runtime? This file could include some static settings like the version of the application, translations for user-facing texts, GraphQL requests or SQL queries. The typical solution to this problem is shipping your binary with the auxiliary files.
Read »Today I stumbled upon Atomic Design. It is some kind of architectural pattern for the user interface. The goal is to build a reusable UI that is easy to understand and maintain.
Read »With OPA you implement decisions of policies, not their enforcement. This avoids confusion between multiple servers that might come from different implementations of the policies.
Read »All the hosted Kubernetes solutions I know of want you to pay roughly 10$ pre month for each load balancer.
Read »I have been playing around with minikube for quite some time now. Though as I run minikube on my Mac, I experienced multiple bugs regarding accessing the cluster and it’s published ports.
Read »I gave the newest tool of Charm Gum a try. It allows to create interactive bash scripts in just a few lines of code.
Read »Go 1.19 introduced a new option to customize the runtime Garbage Collection behavior: Memory Limit. This might be interesting when embedding Go within a mobile application.
Read »Two years ago, I created Puffery for iOS, which allows sending push notifications to your iOS devices.
Read »When using tailwind, you might be forced to manually write SCSS by hand.
With @apply some classes; you can embed whole classes with all their styles into your own rules.
I created a GitHub workflow to automatically build and deploy my website to GitHub Pages.
Read »In Hugo you can simply create a folder within content/ and a template within layouts/_default/. It will be used for the index route of that folder - even if your template did not specify a layout.
You can override internal Hugo templates with your own templates.
Read »Unlinke many other static site generators, the syntax highlighting of Hugo does not use client-side JavaScript, which is great!
Read »If you need assets for a specific document or blog post, you can simply create a folder with your desired name and place your assets in there. Rename the markdown file to index.md.
This is planned to be a series of blog posts about designing and developing my own programming language, where I want to share some pitfalls, my learnings, design decisions, experience and the development process.
Read »Once you have decided you want to create your own programming language, you need to create a broader concept. Every programming language is unique in its own way. Your goal is to find out in which way. And you need to find your reason why you want to create it in the first place.
Read »When iterating over an array of objects in Angular, the change detection compares the references of the objects to detect changes.
Read »You can run your Go program or your tests with the Data Race detection enabled. This might cost some performance and memory, but in case a data race is being detected, that’s worth it!
Read »I have never done anything productive with Kubernetes before. But it is a really tough topic to get started with. It’s overwhelming.
Read »Iterating over a map in Go is not predictable. This is a design decision to avoid relying on memory layout.
Read »I had completely forgotten about NSDataAsset. Maybe I should move some of my JSON files into asset catalogs. According to @emergetools that should remove some code signing overhead from the app size.
Read »When using auto layout with a UIScrollView, subviews may not attach to the top edge of the scroll view’s parent. Else you cannot scroll, but the handle shrinks the more you scroll.
Starting with Swift 5.6 the Swift Package Manager can automatically detect Breaking API changes. Really great for libs!
Read »Async tests do not work on Linux, only on macOS. Instead you need to implement a helper function that runs the test async by relying on expectations.
Read »Cookies in WKWebView are broken. When manually setting a Cookie using the Configuration, it will be ignored by the web view.
Read »Sometimes you need your local IP address on the command line to automatically pass it to a script.
Read »If the default Table Of Contents / Index Set for iOS does not fit your use cases. This library might be interesting:
Read »
Back in 2019 I wrote an article about how to debug your Swift Package Manager projects in Visual Studio Code. In late december 2021, the Swift Server Working group released a brand new extension for vscode, which dramatically improves debugging your Swift code. Especially for linux! Time for an update!
Read »2021
In case your UINavigationBar has been set to a custom color and the navigation bar is not translucent, you will experience a visual regression when updating to Xcode 13.
The navigation bar background will be black - until you start scrolling. Then it behaves as expected.
Today I learned about asdf, which is a pluggable version manager.
Read »Copying contents from the web often copies weird characters, like the invisible character U+FEFF or “Zero Width No-Break Space”.
I tried to keep my work stuff separate from my personal stuff on the same machine. I created two admin users, set up a group for homebrew and set the permissions accordingly.
Read »A few months ago Swift 5.5 has been released and made async/await available. And in 4.50.0 Vapor added support for it, too!
UIApplication.shared isn’t available within an iOS app extension.
To annotate your code paths not needed in an extension, but using UIApplication.shared, just use the @available(iOSApplicationExtension, unavailable) annotation.
Converting a simple and small iOS app was far easier than expected. Of course webviews, gesture recognizers, navbars, etc. are not supported or work differently, but at a first glance there are not a lot parts with visual regressions!
Nestjs has very great decorators to annotate your routes, dtos and controllers. This makes it really easy to keep your Swagger or OpenAPI documentation up to date.
Read »XPath is a really powerful tool to query XML documents, if you are forced to. But in contrast to JSON queries, XPath does not return the actual values, but the nodes or attribtes you queried.
Read »Using enums in Swift for static Table View Data Sources is really great.
Especially when declaring them as enum X: Int and using the rawValue to reflect the section or row index.
I have never actually seen serious code that’s running in production, that uses base64 encoding for password for over a decade. Today I did.
Read »I haven’t used SwiftGen for a long time, but wow, it has improved a lot. I am a bit impressed.
Since WWDC21 all iOS apps that provide registration are also required to provide the deletion of those accounts.
Nothing especially new here, but a reminder: Firebase might be a good choice if you need realtime updates.
Read »With CSS skew you can simulate a perspective effect.
If you want to additionally rotate the element, use rotate first then skew.
When using @main on a SwiftUI.App and @UIApplicationDelegateAdaptor(AppDelegate.self) you can still have an AppDelegate without handling SwiftUI manually as without @main.
Now, Android apps require a description for each permission. Back then, it was optional.
Read »Bitrise binary uploads cannot be updated after saving. Instead they need to be deleted and recreated. Thus all workflow steps need to be updated if they rely on the data.
Read »When maintaining multiple locales within your project, try to keep line numbers consistent across all locales. Also keep the order of translations consistent.
Read »Localizable.strings doesn’t support unicode \unnnn escapes, but only \Unnnn!
In Swift the \U is for UTF-16 escapes like \Unnnnnnnn.
ftp-simple allows opening FTP connections as VS Code workspace!
How to detect a URL in a String using NSDataDetector - free Swift 5.1 example code and tips https://www.hackingwithswift.com/example-code/strings/how-to-detect-a-url-in-a-string-using-nsdatadetector
The Android Studio tooling for Android apps checks and validates all translation keys. Even if they are present within the base language. This comes in handy after greater refactorings.
Read »UIImageView image is not animatable. Instead use transitions!
Wnat your UICollectionViewCell transparent? Set alpha on contentView!
=> Setting alpha on the UICollectionViewCell itself doesn’t work.
When setting the background color randomly in SwiftUI, you will be able to detect every single repaint! Might be helpful while debugging.
Read »2020

When developing Swift in Visual Studio Code there were a few cases, where I preferred Xcode. Beside the obvious cases like iOS Development, managing certificates and provisioning profiles, there was one big case left: Writing unit tests.
Read »The past few days I created a new server using Vapor and hit vapor new <project> --auth which created a Vapor 3 server. Later I upgraded the young project to Vapor 4, but found some lack of practical information about the upgrade on the internet. So here I share my subjective experience and try to give you some tips.

Editors like Visual Studio Code live from a wide range of extensions and customization. In contrast there are IDEs like Xcode and AppCode, which have everything set up and are ready to go. In order to provide a rich set of features, they cannot not offer the same level of flexibility. Which editor you might want to use is a highly personal decision.
Read »2019
Running and debugging your targets in Visual Studio Code is not prepared by default. Especially for us Swift developers this might come unexpected, especially in comparison to Xcode. In VS Code we require extensions and configs for this purpose.
Read »A simple example implementation of the Redux pattern with multiple reducers and listeners.
Read »Async operators debounce, throttle or delay that functional reactive programming libraries as RxSwift and ReactiveSwift provide are super useful and expressive. Though their biggest benefit lays within composability.
The initial idea behind InferIt was to create some mixture of a constraint solver and a dependency manager: you would just tell it what to install and it would gather as much information as possible to install it.
Read »Archery is about doing something with your project’s metadata. The new version 0.3.0 puts everything on steroids and allows you to script your metadata. A detailed overview of all changes can be found on GitHub.
Read »Today I released the new 2.7.0 update to SDE for VS Code and the companion project sourcekite has been updated, too.
Read »2018
Apple recently announced to develop a language server for Swift and C-family languages. Or said more clearly: Apple started development to support every editor implementing the language server protocol like VS Code, Sublime Text, Jet Brains‘ IDEs and Atom.
Read »
Writing things down is part of my learning process. These thoughts came up while reading through Yegor Bugayenko’s book Elegant Objects about a more declarative and less procedural approach of object oriented programming. This is more a personal document than a book review or summary and as I already knew some topics, I do not mention several chapters or details, I might explain concepts different than the original author and many examples from Java, Ruby or C++ cannot be applied to Swift as they would already solve the issue.
Read »A Swift Playground aiming to provide some functional helpers to parse arguments for command line tools. It uses Overture and is build for high composability, flexibility and little impact on your project’s freedom to evolve.
Read »2017
Do you work with legacy RxJS code? Have you ever revisited your first few observables in your application? Do you need to fix bugs in an app of your learning phase? Are you still learning best practices for writing reactive code? This guide is for you. Even if you don’t have anything to do with Angular, you may find this interesting. I will show you a way of how to improve your reactive streams in order to understand their functionality in many isolated, but tiny steps. Some of them may offer external dependencies, but we will always show, how to do it manually.
Read »Have you ever experienced, that some loading indicators just don’t want to dismiss and literally stay forever? Maybe while users tried to login? The short story: you probably forgot to dismiss a loading indicator in some cases.
Read »Command mine is a concept of a swift library for parsing command line arguments. It is designed to support asynchronous implementations of CLIS, that may even be used inside frameworks.
Read »I excessively make use of the official Swift Package Manager as I usually do some CLIs or other stuff. For this use case it is really great. When developing Apps, Carthage and CocoaPods come in handy, which are great, too. For Web Development there are yarn and NPM, which support project based and global installs. Then there are gem (global) and bundler (project) for ruby based dependencies.
Read »