I am a web developer from Germany, mostly working with Ruby on Rails, but also like to do Frontend Javascript with Vue, Svelte, Server-Deployment with Docker, Ansible, Terraform on Hetzner Cloud or build small mobile Apps with Flutter.
(this post was written by hand btw - because I despise AI Slop rhythm, emojis and structure sooooo much) I was recently asked to give a short AI-Coding Workshop for another company, which is outside my usual work. That made me recollect my thoughts on the whole matter, because there is kind of a rift in the industry, and also in the developer community. On the one side, we have principled…
For my personal projects, I used to use Sentry-hosted, but it usually dropped some events if there were a bad bot. I also don’t want to pay for a couple of errors of my side projects. So I found Bugsink as an alternative. Already using kamal for deploying the Rails apps, so I thought it would be a good idea to use it for Bugsink as well, as the integration with HTTPS/SSL with Kamal-Proxy is…
In the end of March 2025, I had the honor to present at the Ruby Frankfurt meetup. The topic was a deep dive into Kamal, the deployment tool for Rails 8. You can find the online presentation in Reveal.JS here . In summary: during the last 6 months I migrated a rather large Rails app from our company (our Applicant-Tracking-System for Empfehlungsbund) from a Capistrano-like Ansible playbook into a…
Insprired by a recent blog post of Bohidar Batsov I decided to simplify my Zshrc. About 10ish years ago, I started to use Zsh and used the Oh-My-Zsh distribution for a pleasant OOTB experience. But over the years, I don’t really use most of the stuff, but never really took the time to clean it up, as having NO zsh config just leaves a very ugly prompt by default. As Bohidar, I also added Starship…
Recently, Hetzner announced the new S3-compatible storage service. At the same time, we are using Gitlab CE as our main development back-end since their early 1.0 versions - as issues back-end, customer inquiries management, container registry, CI-CD with runners, company chat via Mattermost, and of course as a git repository. During the last 5 years or so, we were running Gitlab as the Omnibus…
On 1st Jan 2025 B2B companies will be required to send invoices in a machine-readable format. The name/spec in Germany is called ZUGFeRD (Zentraler User Guide des Forums elektronische Rechnung Deutschland). As not all receiving companies will be able to process a raw XML file, it is best to produce a PDF/A-3 file with embedded XML. This is also known as X-Rechnung in Germany. To enable the whole…
On a recent larger migration, we wanted to move our whole app, including the database to a new server. The easiest way while keeping consistency was to put the app in maintenance mode, so no new data would be written to the (old) database. On the other hand, we have many read-only requests, so we could keep the app running for those, without any global maintenance page. Simplest way: App wide…
In the past, I built several e-Mail processing features using Ruby that predate the official ActionMailbox - Such as: Bounce processing, e-mail notifications, newsletters, order confirmations, forwardings etc. So before, I always used a IMAP client run by a great mail_room to fetch emails from a mailbox and process them by directly supplying them to Sidekiq queue. The internal Mail routing (Which…
Packs is a code organization technique introduced by Shopify and Gusto. It’s a “specification” for organizing (lots of) code in a Rails application. In short, you can imagine that you split your Majestic Monolith internally into multiple local “microservices” that are still part of the same Rails application. Each “pack” is a separate directory and partially mimics the Rails application structure…
To speed up our build and deployment time, we recently implemented test parallelization for our two biggest app. By doing so, we reduced the total deployment time of one service from 50min down to <20min. Both services had problems with flaky tests, that are gone now. In this post, I will outline the steps we took to achieve this + scripts. Parallelization + distribution of tests We use…