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

Trophäe  — Gaea Schoeters, btb

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 »
Kein Guter Mann  — Andreas Izquierdo, DuMont

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.

Discontinuing of Projects  — 

Starting with this year, I have decided to discontinue all of my open source projects.

Read »

2025

Zirric: Going Virtual  — 

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 »
Zirric: A new Beginning  — 

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?

Read »

2024

The current state of Lithia after 2 years  — 

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

24hrs format for html inputs in Firefox  — 

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.

Read »

2022

My Personal View on Acorn  — 

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 »
Statically read files with go:embed  — 

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 »
Atomic Design  — 

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 »
Open Policy Agent  — 

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 »
Overriding Go values with ldflags  — 

You can override Go values with ldflags during the build.

Read »
Kubernetes without Load Balancers?  — 

All the hosted Kubernetes solutions I know of want you to pay roughly 10$ pre month for each load balancer.

Read »
Kind is the new minikube  — 

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 »
Bash scripts with Gum  — 

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 new Garbage Collection Memory Limit  — 

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 »
Announcing Puffery for macOS and the command line  — 

Two years ago, I created Puffery for iOS, which allows sending push notifications to your iOS devices.

Read »
Extracting Tailwind constants using theme  — 

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.

Read »
Ultra-fast Hugo GitHub actions  — 

I created a GitHub workflow to automatically build and deploy my website to GitHub Pages.

Read »
Templates for specific folders in Hugo  — 

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.

Read »
Overriding internal Hugo templates  — 

You can override internal Hugo templates with your own templates.

Read »
Hugo's Syntax Highlighting is static  — 

Unlinke many other static site generators, the syntax highlighting of Hugo does not use client-side JavaScript, which is great!

Read »
Hugo Assets placed in Folders  — 

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.

Read »
Starting the journey about creating a new programming language  — 

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 »
Designing and scoping my programming language Lithia  — 

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 »
Angular *ngFor trackBy  — 

When iterating over an array of objects in Angular, the change detection compares the references of the objects to detect changes.

Read »
Go Data Race Detector  — 

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 »
Kubernetes Overview for Beginners  — 

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  — 

Iterating over a map in Go is not predictable. This is a design decision to avoid relying on memory layout.

Read »
NSDataAsset reduces Code signing overhead  — 

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 »
Attaching to UIScrollView's parent with Auto Layout  — 

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.

Read »
SwiftPM can detect breaking api changes  — 

Starting with Swift 5.6 the Swift Package Manager can automatically detect Breaking API changes. Really great for libs!

Read »
Missing Async XCTests on Linux  — 

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 »
WKWebView Configuration Cookies not working  — 

Cookies in WKWebView are broken. When manually setting a Cookie using the Configuration, it will be ignored by the web view.

Read »
Getting your IP address  — 

Sometimes you need your local IP address on the command line to automatically pass it to a script.

Read »
Swift custom table of contents lib  — 

If the default Table Of Contents / Index Set for iOS does not fit your use cases. This library might be interesting:

Read »
Debugging Swift in VS Code in 2022  — 

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

UINavigationBar black after Xcode 13 upgrade  — 

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.

Read »
There is a modular version manager: asdf!  — 

Today I learned about asdf, which is a pluggable version manager.

Read »
Reminder: websites contain weird characters  — 

Copying contents from the web often copies weird characters, like the invisible character U+FEFF or “Zero Width No-Break Space”.

Read »
Having two admin dev accounts is a bad idea  — 

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 »
Adopting Swift Async Await in Vapor  — 

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!

Read »
UIApplication.shared not in Extensions  — 

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.

Read »
Converting simple iOS apps to tvOS is easy!  — 

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 great swagger decorators!  — 

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 powerful  — 

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 »
Static Table enums  — 

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.

Read »
Reminder: base64 is not secure!  — 

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 »
SwiftGen has evolved!  — 

I haven’t used SwiftGen for a long time, but wow, it has improved a lot. I am a bit impressed.

iOS apps require account deletion  — 

Since WWDC21 all iOS apps that provide registration are also required to provide the deletion of those accounts.

Invalid Gradle Private Key  — 

Gradle did reject my ssh key due to invalid privatekey.

Read »
Swift and Firebase  — 

Nothing especially new here, but a reminder: Firebase might be a good choice if you need realtime updates.

Read »
CSS Rotate und Skew  — 

With CSS skew you can simulate a perspective effect. If you want to additionally rotate the element, use rotate first then skew.

Read »
SwiftUI @main AppDelegate  — 

When using @main on a SwiftUI.App and @UIApplicationDelegateAdaptor(AppDelegate.self) you can still have an AppDelegate without handling SwiftUI manually as without @main.

Read »
Android Permission now requires a description  — 

Now, Android apps require a description for each permission. Back then, it was optional.

Read »
Updating Bitrise binary uploads  — 

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 »
SwiftUI translations and UIKit  — 

Nothing new today, but a quick reminder:

Read »
Localization order  — 

When maintaining multiple locales within your project, try to keep line numbers consistent across all locales. Also keep the order of translations consistent.

Read »
Localizcable vs Swift unicode escapes  — 

Localizable.strings doesn’t support unicode \unnnn escapes, but only \Unnnn! In Swift the \U is for UTF-16 escapes like \Unnnnnnnn.

ftp-simple vscode workspace  — 

ftp-simple allows opening FTP connections as VS Code workspace!

NSDataDetector  — 

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

Android XML Translations  — 

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 is not animatable  — 

UIImageView image is not animatable. Instead use transitions!

UICollectionViewCell alpha  — 

Wnat your UICollectionViewCell transparent? Set alpha on contentView! => Setting alpha on the UICollectionViewCell itself doesn’t work.

SwiftUI random colors  — 

When setting the background color randomly in SwiftUI, you will be able to detect every single repaint! Might be helpful while debugging.

Read »
Missing UIView animation delay  — 

UIView animate does not delay if there are no changes.

Read »
Fucking SwiftUI  — 

This cheat sheet is actually not bad!

Read »
Coordinator [unowned self]  — 

An [unowned self] in a Coordinator is okay.

Read »

2020

Swift Coverage for VS Code  — 

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 »
Upgrading a server-side Swift project to Vapor 4  — 

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.

Read »
Swift, VS Code and you  — 

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

Debugging Swift in VS Code the old way  — 

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 »
Swifducks: simple Redux store with multiple reducers  — 

A simple example implementation of the Redux pattern with multiple reducers and listeners.

Read »
ReactifSwift: async function composition  — 

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.

Read »
InferIt: a Constraint Solving Package Manager  — 

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 0.3.0 released  — 

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 »
SDE 2.7.0 released  — 

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’s SourceKit LSP and SDE Roadmap  — 

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 »
Elegant Objects  — Yegor Bugayenko,

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 »
ArgumentOverture  — 

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

Refactoring RxJS Code in Angular  — 

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 »
Never miss a dismiss in Ionic anymore  — 

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 »
CommandMine  — 

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 »
Why I created Rock for Swift CLIs  — 

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 »