RSSAmplifier

Blog

tty4.dev

Recent content on tty4.dev

tty4.devRSS feed ↗194 posts

Latest posts

Using Structured Outputs for reliable data in existing systems

The non-deterministic nature of LLMs can used as an advantage in existing systems. If the system being built has to solve a task that is unknown or imprecise at development time, an LLM can be used to solve exactly that task. This can also apply to data structures: if the system needs data in a specific format but the source is fairly unreliable, an LLM can be used to bring it into the right…

Fixing HTTP 502 errors of Services Behind an Application Load Balancer

tl;dr If a load balancer occasionally returns 502 while the backend looks perfectly healthy, check whether the backend’s keep-alive timeout is shorter than the load balancer’s idle timeout. If it is, the backend closes connections the load balancer still thinks are open. This post investigates random 502 Bad Gateway errors a monitoring job got. Even if it is written in relation to AWS,…

Hitting the ceiling of an ML model

This post is part of a series. Here is an overview of all posts. Over the past months I did multiple small improvements on the RSS digest I built. The predictor uses two models : One for predicting clicks and another one to predict favours. They are trained on different datasets and use different layers. One problem still remains The performance of the models was not fully like expected. Not…

MCP might be a better interface for internal tools

When developing internal tools, MCP servers and AI tools like Claude Desktop, Claude Code, or GitHub Copilot (= the MCP clients) can form the matching UI that adapts to the user’s needs. This article discusses when this makes sense and which conditions must be met. When internal tools are used In projects, it often happens that at some point a stakeholder, manager, or a (sub) team needs an…

Random links to understand Machine Learning and AI

When developing or learning something I usually find interesting links which I’d like to share. Writing a post for each one of the topics is quite unrealistic. So, to prevent tab-hoarding, I’ll use a format inspired by other blogs like Martin Fowler called Fragments . Some of the pages linked are quite old when seeing how the field has evolved in the past years, but help to build some…

Usage of Git worktrees

Recently, I read more and more about Git working trees being used for parallel agents for example in Cursor or VSCode . However, worktrees are also useful for maintaining an uninterrupted workflow when working on multiple things within the same repository. git worktree commands are used to manage working trees. They are executed from the main repository. Create a worktree git worktree add -b…

Client-side inference using onnxruntime

This post is part of a series. Here is an overview of all posts. tl;dr you can use the model here , play around and check the code. The ONNX Runtime for web makes it possible to serve an ML model and run inference within browsers. This enables ML on Edge and enhances the privacy of the user. Using the runtime I serve my latest favour model. It’s possible to use it here . Type in the data and…

5 practical use-cases for an ML-powered RSS digest

This post is part of a series. Here is an overview of all posts. Creating an RSS digest is fun, but it’s even more fun, when you have a real use-case for it. So this post checks the different possible ways of using it. Keep in mind that these are all ideas I have to use it, I’m sure there are many more, you can let me know if you have a nice idea. :)

Optimizing a model by using metrics

This post is part of a series. Here is an overview of all posts. The past post mentioned metrics to track the performance of a model. This post shows how to use them for optimizing a model and how it helped to improve the AUC from 0.59 to 0.84. Tracking metrics During the model training the following five metrics have been tracked: Loss : Measures prediction error; if training loss drops while…

Defining, tracking and training a machine learning model

This post is part of a series. Here is an overview of all posts. This continues the journey on creating a RSS digest. The final step to get a working machine learning model is to implement the training pipeline. In a previous post the data has been prepared. This post shows how to define the model, train it and use it for predictions. Defining the model PyTorchs nn.Module can be sub-classed and…

Building an RSS digest: All posts

This aims to give a better structure to read the posts about the RSS digest implementation. To give a better entrypoint about the existing posts and in which order to read what, if interested: Building an ML-powered RSS digest outlines the idea and motivation. Technical view of a recommendation system is a good entrypoint for a general overview of the system. Collecting labels to train a model for…

Note taking in 2026

Since my last post about note-taking many things have changed. Not so long after starting using Trilium I changed back to a flow based on the Foam VSCode extension + VSCode snippets. Although Trilium provides many helpful features like a good text search, desktop app, mobile site and many more, I found very early that it’s the wrong tool for my everyday usage as a software engineer. The main…

Dataset preparations for training a machine learning model

This post is part of a series. Here is an overview of all posts. Before running the training of a model the following things need to be done: Features need to be selected: deciding which input variables/attributes will be used to make predictions Featuresets need to be labelled: annotating the data with the correct outputs/targets Dataset need to be prepared: organizing features into a structured…

Training two models for better results in recommendation systems

This post is part of a series. Here is an overview of all posts. The first version of the machine learning model I’ve created for the recommendation system based on my RSS feed should be trained on two labels: The click & favorite label. The initial idea was to have two labels represented as an array: [ P(click), P(favoured) ] . A clicked and favoured article would look like [1, 1] . And the…

docfind - the static search for the VSCode site

In the past I’ve been writing about some approaches I did for creating a static search for this page. The search is removed due to the additional maintenance needed when creating the site, but my interest in this topic still exists to some degree. Recently, I stumbled upon this blog entry about the static search created for the VSCode website. It’s called docfind and uses also…

Technical view of a recommendation system

This post is part of a series. Here is an overview of all posts. This post in the series about building an RSS digest takes a look at the system. The following gives an overview of the components to be build. The rectangles are components and the ellipses / circles are outputs. In the following sections the components and their outputs will be described more closely

Selecting the features for the RSS digest

This post is part of a series. Here is an overview of all posts. The previous post described how to label articles in a feed reader and store the labels. The post also contained this small view on the idea: Label articles → Create model → Use model to predict click/fav rate. This post will focus on a sub-step of the “Create model” part: Feature Engineering . Features are the input data…

Collecting labels to train a model for an RSS digest

This post is part of a series. Here is an overview of all posts. As written in a post before I aim to create an RSS digest for the feeds I subscribed to. The very high-level idea is: Label articles → Create model → Use model to predict click/fav rate. The first step towards this goal is to label articles in the feed reader. This article describes which labels will be collected and how/where…

Building an ML-powered RSS digest

This post is part of a series. Here is an overview of all posts. RSS is one of my favorite ways to consume tech news and blogs. Although it seems to be pretty dead for the broad masses, RSS feeds enable nice features through feed readers: Subscribe to and collect multiple sources at one place - no browsing and manual search needed. No push notifications - I can read it whenever I want. Self-hosted…

Temporary script, turned into a long-term solution

It was in one of my first jobs where I got tasked to serve a customer a file with some interesting data points about users of a system created for him. All the customer wanted to create a JSON file and place it on an SFTP server on regular basis, so that he could pull it and do some magic with Power BI. I was instructed to not use too many resources on it, because it was supposed to be only a…

I deleted my Windows installation

Until recently I had two installations on my computer: One SSD contained my Windows installation and the other one Fedora. I decided to uninstall Windows, as I kept it mainly due to few reasons which proved wrong: Old data laying there Keep my Windows skills up to date For the case I need to solve a problem where Fedora can’t help All of this proved wrong. I didn’t boot Windows for…

Agent Skills - a thin alternative to the Model Context Protocol?

Just a year passed since the Model Context Protocol (MCP) has been introduced by Anthropic and despite of the traction it got in 2025, it got already concurrency by Anthropic itself: Agent Skills . Also, it seems that OpenAI is experimenting with the idea . This makes it worth to have a short look at the differences between the two. I also post some links below if you want to see examples for…

Improving loading times of this site

Although I haven’t posted something on here for a pretty long-time I didn’t forget that this page exists. Recently, I wanted to do something small. So, I checked this site for something which was bugging me already for a long time: The loading time and size of artifacts loaded. Although it is a very simple static site, I saw loading times of ~7-10 seconds in my self-experiments. Also,…

Building RAG is hard

Building Retrieval-augmented generation (RAG) is hard. At least if you want to get helpful and reliable results. Take as an example the IIOT (Industrial Internet of Things) world: No one wants to be responsible for a document management system powered by an LLM and RAG that cites incorrect results, potentially leading to machines being maintained improperly. At best, it costs the company money. At…

How GitHub Copilot Serves 400 Million Completion Requests a Day

At QCon San Francisco Dave Cheney gave an insightful talk about how GitHub Copilot works under the hood and is able to serve 400 Million completion requests a day. Basically, every request goes through a Proxy that makes use of HTTP/2 and allows to keep the connection open. The powerful HTTP handler in Go makes it possible to drop requests without the need of closing a connection. The large load…

Experiencing Cross-Team Collaboration

The company I’m working for is organizing an event which brings people from different teams together and allows them to work on a topic for one week. After day two I can say that I enjoy this very much as it enables knowledge sharing and collaboration between teams. The topic we’re working on is exciting and makes fun. It’s different from my usual day-to-day work and a great…

Cool URIs don't change

During Easter, there was a sale on domains at my hosting provider, and I saw my moment had come and secured a domain I had been eyeing for several weeks. As you can see, the site has now moved from blog.dkwr.de to tty4.dev . Somehow it all looks more pleasing to my eye, and besides that, the domain is just plain cool and hopefully easier to remember. But in keeping with “Cool URIs…

A New Home for Home Assistant

I was thinking about moving my Home Assistant instance away from my homelab to an own instance, e.g. to a Raspberry Pi. The strength of my homelab is that it’s more powerful than a Raspberry Pi. But I found that this has also a few downsides like a higher power consumption. While the noise of the fan is ok for me, it also leads to a higher power consumption. Furthermore, devices on the other…

Overview of Messaging in Distributed Systems

Messaging in distributed systems is a problem field which has own patterns and aspects. This post takes a brief look at the most important concepts and intends to be used as a primer for further research. Synchronous vs. asynchronous First, let’s check the difference between synchronous and asynchronous requests: Synchronous: A service client makes a request to a service and expects an…

Implementing Retrieval-augmented generation (RAG) with an own LLM

In my last post I wrote about Retrieval-augmented generation ( RAG ) and why it’s needed . This post shows a practical implementation for the LLM created in my repository . Choosing a Framework RAG can be implemented manually, but there are a few frameworks which help to implement the pipeline and make things easier. I decided to use LlamaIndex for this post, but there are few others like:…

Retrieval-Augmented Generation in Large Language Models: The Theory

This post is part of a series. Here is an overview of all posts. In my former posts I wrote about my experiences in building an LLM from Scratch. While fine-tuning worked well to make the model better in a specific domain, it opens up the question if the model needs to be re-trained every time when new information is available or how to enhance it with domain-specific knowledge. The need for…

Fine-tuning LLMs Locally vs. In The Cloud

This post is part of a series. Here is an overview of all posts. This is a short write-up about my experience of training and fine-tuning an LLM. It intends to give an overview about the dimensions which impact good hardware has on training. I’ve done this in the course of working with the “Build an LLM from Scratch” book. You can find my review in another post, if interested.…

Book review: Building an LLM (From Scratch)

There are many free resources which try to explain what LLMs are and how they work internally. Same applies for implementations. But looking at code and explanations didn’t give me the feeling that I really understand from the ground up how they work. Especially what exactly the transformer architecture is and how it’s implemented. Luckily, 2024 Sebastian Raschka published the book…

Visiting the largest computer museum of the world

When driving in Germany on the Autobahn and passing a medium-sized or larger city you’ll see a sign which shows a tourist attraction nearby. For Paderborn it’s the Heinz Nixdorf MuseumsForum (short: HNF). The HNF is one of the (if not the ) largest computer museum of the world. This year a dream came true and I visited it. The museum isn’t just about computers: It gives visitors…

Retrospective on Androids: The Team that Built the Android Operating System

I just completed Androids: The Team that Built the Android Operating System by Chet Haase and can fully recommend this book. It’s a book which provides insights into the first days of the Android OS. The book gives an overview of why Android was started and which underlying ideas led to the big market growth in a highly competitive field. Also, it shows some tricks that were used to work in…

Hexagonal Architecture: The Good And The Hard Parts

There’s a lot of stuff written about Hexagonal Architecture. I also wrote some things about it, but covered just the basics. Now with more experience of using the Hexagonal Architecture style in Java with Spring Boot, I thought it’s time to reflect what are the good and the hard parts of it. Few Words For The Beginning You may notice that I don’t write “The Good And The Bad…

Move Code Changes Between Branches With Git Patch Files

With patch files Git provides an easy-to-use way to move code changes between branches. A patch file contains information about the changed lines in a comparable way like it’s shown when doing a git diff . Here’s how to use it. Move code from branch A to branch B Move code from branch A to branch B , where branch B does not depend on branch A . On branch A create patch file: git…

Use dnsmasq for local DNS with wildcard support

Recently, I set up new projects in my homelab . Generally, my homelab is reachable via the domain atlas.internal . All projects have their own subdomains like git.atlas.internal , files.atlas.internal , etc.. But beside of that I can reach them also via an opened port. Security-wise that’s no problem, as my homelab is reachable only within my home network. The annoyances of this setup…

Trying local LLMs

There are quite a lot of tools which try to give the same experience as ChatGPT or claude.ai: A nice UI with model selections etc. Recently, I just wanted to try out different models and found once more that Simon Willisons llm was the best hassle-free solution for this. Just install the Python package and you’re good to go (see the official page ). llm integrates different plugins to…

Generating recommendations for blog posts with machine learning

I already wrote twice how to generate recommendations for blog posts with machine learning: Calculate automatically the similarity between my posts Getting a higher confidence in spaCy similarity I’m pretty happy about the results and it works without any problems since one year. So, I’ve done a little cleanup of the code and decided to publish it. You can find the code and general…

Git rebase fails because of uncommitted changes, but there are no uncommitted changes

Recently I got the following error when I was doing a git rebase master : error: Your local changes to the following files would be overwritten by checkout: <Omitted list of files> Please commit your changes or stash them before you switch branches. Aborting error: could not detach HEAD git status showed no unstaged changes, and I confirmed that there were no changes in .gitignore d files."…

Define An Extensible Or Generic JPA Repository

The @NoRepositoryBean annotation allows to define an extensible / generic JPA repository in Spring Boot: @NoRepositoryBean public interface BaseAnimalRepository < T > extends JpaRepository < T, Long > From the documentation of the @NoRepositoryBean : This will typically be used when providing an extended base interface for all repositories in combination with a custom repository base class to…

Capture Logs In Spring Boot Tests

To assert that a specific message is logged in a Spring Boot application, the OutputCaptureExtension can be used. Here&rsquo;s an example test: @ExtendWith (OutputCaptureExtension. class ) public class MyServiceTest { private MyService myService = new MyService(); private static final String MESSAGE = "Hello World!" ; @Test public void testLogMessage (CapturedOutput output) { myService. logMessage…

Ceramic Designs Generated By Claude

Few weeks ago my girlfriend took me to a pottery workshop. While I like the idea behind it (painting, firing, &hellip;) I faced one problem: The last time I was doing art by intention was probably 12 years ago in school. I got told that the best thing is to paint something &lsquo;simple&rsquo; and to paint it according to a template. A color gradient is maybe the most simple thing, but I thought…

Cleaning Up My Digital Life

Currently, I don&rsquo;t blog that much. This site has a second priority due to summer and other things I do (which I may also be blogging about in the future). One of these things is cleaning up my digital life. So, first I have resolved some issues on my homelab , refactored the docker compose scripts and cleaned old data. It feels more organized and more stable now. Furthermore it reflects my…

Revisiting the HTC Desire (Bravo)

Recently I was thinking about the Smartphones I had and remembered my first one: The HTC Desire (codename Bravo , sometimes also A8181 ). That was 13 years ago! Out of interest I checked eBay and saw that someone was selling it for 15€. I&rsquo;m not an impulsive buyer, but this time nostalgia won. When I unpacked it first, I was surprised. I didn&rsquo;t remember it being that small. Here&rsquo;s…

Wasm Component Model By Example

It&rsquo;s time to get some practice after answering what the Wasm component model is. You can find the code at GitHub Preparations Before we start, prepare the environment: You need the latest version of Rust. Install cargo component : cargo install cargo-component Install wasm-tools cargo install wasm-tools Install a Wasm runtime which supports the component model, like wasmtime : curl…

Wasm: What Is The Component Model

In the beginning of this year the WASI preview 2 reached a milestone by being launched . It got enabled by two things: the WIT IDL and the component model . Let&rsquo;s check in this post what it is. From the WASI repository : WASI Preview 2 represents a major milestone for WASI. It marks the moment when WASI has fully rebased on the Wit IDL and the component model type system and semantics,…

Recommended Apps, Websites And Services For Traveling To Japan

I&rsquo;m back from Japan and want to give a small collection of tips for apps, websites and services which I found useful before and during my trip. eSIM First, I really recommend to get an eSIM. This will help you to get around easily. Navigating and checking out for restaurants or even translation or product searches will make your life a lot easier. I think that having an internet connection…

Wasm: The Garbage Collection proposal

While you can compile languages that rely on a Garbage Collector to Wasm already, there is a big downside: They need to ship with a Garbage Collector. For example: PHP to Wasm compiled modules ship with a compiled GC. That&rsquo;s contrary to the idea of Webassembly to serve thin modules. Furthermore it doesn&rsquo;t make much sense to come with a compiled GC, because the host most of the time…