Dominik Berner

Software delivery specialist, C++ Coder, Agilist, Rock Climber

C++, CMake, Conan and a Play Store: Building a Multi-ABI Qt6 Android App Bundle
C++, CMake, Conan and a Play Store: Building a Multi-ABI Qt6 Android App Bundle

C++ and Qt are a powerful combination for cross-platform development, but building for Android introduces unique challenges. While for a long time it was enough to just build the software and wrap it into an apk, modern Android development often requires handling multiple ABIs, integrating with Java tooling, and managing dependencies in a cross-compiled environment. This sounds tough, but by combining CMake, Conan, and Qt6’s cross-build capabilities, it becomes manageable.

Agentic Coding is Brute-Force Software Engineering
Agentic Coding is Brute-Force Software Engineering

Writing code faster is not the same as delivering better software. There is an inconvenient truth about agentic and AI-assisted coding: it is brute-force software engineering. It can help you write code faster, but it does not help you deliver better software faster. Working with AI-assisted coding is a productivity boost. Features get implemented in mere hours instead of days and weeks, each iteration on the software becomes cheaper and faster. This sounds like the holy grail of software development, but is it?

Making Releases a Non-Issue: Speeding Up Delivery for Embedded Devices
Making Releases a Non-Issue: Speeding Up Delivery for Embedded Devices

Shipping software for embedded devices has traditionally meant long release cycles, risky upgrades and “Big Bang” releases. But it doesn’t have to be that way. Being able to ship updates to your devices faster and more reliably can be a game-changer for your business. It means being able to ship earlier, respond to customer feedback more quickly, and fix bugs on the fly. When shipping software becomes a routine and safe, teams can focus on delivering value instead of managing risky releases. Moving from a few releases every odd year to a few releases every month will be a game-changer and it is not as hard as you might think.

Encryption at Rest for a Raspberry Pi using Yocto
Encryption at Rest for a Raspberry Pi using Yocto

As embedded devices store more and more sensitive data, encryption-at-rest becomes a critical requirement. Especially for devices that are publicly accessible or deployed in untrusted environments, protecting data while the device is powered down is essential. Together with secure boot, encryption at rest ensures that data stored on the device remains confidential and tamper-proof, even if the device is physically compromised. This article describes how to implement LUKS encryption for embedded Linux devices based on the Raspberry Pi Compute Module 4 using the yocto Project. (Warning, this is a long read!)

Bringing Secure Boot to Embedded Linux with Yocto
Bringing Secure Boot to Embedded Linux with Yocto

Security is no longer optional for embedded devices, especially not with the Cyber Resilience Act coming into effect. Unfortunately, adding secure boot to embedded Linux devices is often not straightforward. In this post, we share our experience implementing secure boot for an embedded Linux device based on the Raspberry Pi Compute Module 4 using the Yocto Project. (Warning, this is a long read!)

Cyber Resilience Act verstehen: Praktische Umsetzung statt Mythos
Cyber Resilience Act verstehen: Praktische Umsetzung statt Mythos

Der EU Cyber Resilience Act (CRA) wird zu einer wegweisenden Regulierung für Softwaresicherheit in Europa. Mit dem geplanten Inkrafttreten ab September 2026 müssen Unternehmen, die Software oder eingebettete Geräte entwickeln, seine Anforderungen erfüllen - sonst riskieren sie den Zugang zum EU-Markt zu verlieren. Das klingt zunächst einschüchternd, ist aber oft weniger überwältigend als gedacht. Dieser Beitrag bietet einen praxisnahen Überblick darüber, was der CRA verlangt, was Unternehmen etablieren müssen und wie sie Schritt für Schritt beginnen können.

std::expected in C++23: A Better Way to Handle Errors
std::expected in C++23: A Better Way to Handle Errors

How to handle errors in C++ has been a constant point of debate. Do you use exceptions, error code, out-parameters or return nullptrs on failure? And how do you convey information on the nature of the failure? With C++17 we got std::optional for “value or nothing” semantics, but it lacks error context. C++23 - finally - introduces std::expected, a type that encapsulates either a value or an error, making error handling explicit and composable. Let’s explore how std::expected can improve your C++ code.

Building a local AI agent with Llama.cpp and C++
Building a local AI agent with Llama.cpp and C++

Large Language Models (LLMs) and AI agents are everywhere and there are tons of online services that let you use them. But what if you want to build your own, local AI agent that can run on your own hardware, without relying on cloud services? No problem - starting there is not as difficult as one might think. There is a great open source project called llama.cpp that makes it easy to run LLMs on your own hardware. Let’s see how to get stated with a simple AI agent using llama.cpp, CMake and C++.

Faster build times with artifact based CI
Faster build times with artifact based CI

CI/CD pipelines are a standard part of many software development workflows. However, many teams still struggle with long build times, flaky tests and inefficient workflows. Apart from driving the cost of CI up, these issues can lead to frustration and reduced productivity up to quality issues as developers may not run the full test suites before deploying their changes. One approach to address these challenges is to use artifact based CI, which can significantly improve the efficiency and reliability of your CI/CD pipelines.

The 7 CMake anti-patterns that eat your time and energy
The 7 CMake anti-patterns that eat your time and energy

“CMake is hard and our builds are a nightmare!” If that sounds familiar, you’re not alone. CMake has a reputation for being painful to use - but most of that pain comes from bad practices, not the tool itself.In this post, I’ll break down 7 of the most common CMake anti-patterns I see in real projects. These issues often creep in from legacy setups or lack of modern CMake knowledge, and they tend to slow teams down, cause frustration, and make build systems nearly unmaintainable.