If you use Waybar on your Linux desktop (for example with Omarchy ), you might want to see the time in different timezones without opening a browser or running extra apps. waybar-worldclock is a small utility that shows your local time in the bar and displays world times in the tooltip when you hover over it. Installation git clone https://github.com/alexzeitler/waybar-worldclock.git cd…
If you are using Claude Code and want it to interact with a real browser - navigating pages, taking screenshots, clicking elements - the Chrome DevTools MCP server is the way to go. On Linux with Wayland, getting this to work requires a few extra steps. Here is what I learned. The problem The Chrome DevTools MCP server uses Puppeteer under the hood. When you add it to your Claude Code config in…
The problem Upgrading a Rails app from one version to the next means figuring out what changed in the default rails new output. You end up tabbing between RailsDiff in the browser, copying file names, and pasting diffs back into your editor. If you are using an AI agent to help with the upgrade, it cannot access that information on its own - you become the middleman. What Rails Diff MCP does Rails…
The idea Building HTML mockups with AI agents works surprisingly well - until you need to tell the agent which element to change. Describing "the second card in the pricing section" in plain text wastes tokens and is error-prone. Copying the full HTML back and forth is even worse. Aceto takes a different approach: you point at an element in the browser, the agent gets a precise CSS selector. No…
The problem Claude Code is multimodal. It can read and reason about images using the Read tool. But when you run Claude Code on a remote server over SSH, there's no way to paste an image from your local clipboard into the session. The clipboard lives on your local machine, while Claude Code runs on the server. I ran into the same issue with Neovim and built sshimg.nvim to solve it. Now I've built…
The problem When you write Markdown locally, pasting images is trivial - plenty of Neovim plugins handle it. But when you're editing files on a remote server over SSH, your clipboard lives on a different machine than your editor. The remote Neovim has no access to your local clipboard, so none of those plugins work. I ran into this while writing blog posts and documentation on remote machines.…
What's it all about? In my previous post , I showed how to run Dropbox as a systemd user service so it keeps syncing even when no user is logged in. That setup works well — but it introduces a few new challenges: The Dropbox desktop app might not start anymore. When Dropbox runs as a systemd service, the desktop app finds the already running daemon but fails to show a tray icon because the…
The Problem Dropbox stops syncing when no user is logged in. On a headless server or a machine that isn't always attended, this means your files go stale whenever the session ends. The Solution Run Dropbox as a systemd user service with loginctl enable-linger . This keeps Dropbox running at boot — no active session required. 1. Create the service file Place this at…
What's it all about? If you're dealing with invoicing in Germany or Europe, chances are you've heard of XRechnung and ZUGFeRD . Starting January 2025, e-invoicing became mandatory for B2B transactions in Germany. The European standard EN 16931 defines a semantic data model for electronic invoices and supports two XML syntaxes: UBL 2.1 and UN/CEFACT CII . XRechnung is the German compliance profile…
What's it all about? QMD is a quite popular mini cli search engine for your docs, knowledge bases, meeting notes, whatever. qmd has been created by Tobi Luetke, the founder of Shopify and can be found on GitHub . It allows you to index Markdown files from several locations on your computer. You can search with keywords or natural language. QMD combines BM25 full-text search, vector semantic…
I've switched my tech stacks several times in the past 10+ years. Something that has been consistently there throughout these times has been tmux . Here's how I'm using it with Rails + AI TUIs. So what's tmux? tmux is a terminal multiplexer. It lets you switch easily between several programs in one terminal, detach them (they keep running in the background) and reattach them to a different…
If you have been following me on X for the past few months, you might have noticed that I've moved on from ASP.NET Core to Ruby on Rails. Some people asked why... TL;DR If you are looking for a detailed technical - or even performance - comparison between Ruby on Rails and ASP.NET Core, this article is not for you - it only contains opinions, learnings and stories from everyday usage. Setting the…
How systems should be built: easy to change when business changes. How most systems are built: easy to change when tech changes. Reality: business changes much more frequently than the technology.
Just noticed DBeaver has projects, you can organize your connections. You can start a new project via File/New: You pick a custom project location by unchecking "Use default location": The active project can be selected here:
Derek's statement... The gist of Derek's video , which he published yesterday, is this: Typical API Design consists of building around database records and Create Read Update Delete. Making nothing more than a UI or HTTP API around a database. But that database schema was driven by business processes. But if those business processes don't live in your system, then trying to evolve your schema can…
Sometimes you want to change urls in 11ty without breaking them. There are several posts out there explaining how it can be done when your site is running using Netlify, but there's little content how to do it with plain 11ty. Lucky me, I found this post , which shows a solution by introducing a new 11ty template named eleventy-redirect.njk in the root folder. In your posts (the ones to which the…
The State of ASP.NET Core MVC ASP.NET Core TagHelpers have been around for quite some time but only few people seem to like them. Here's why I think they're awesome. ASP.NET Core - and even more: MVC - is one of the most underrated Web Frameworks. This might be an unpopular opinion these days when Single Page Apps, JSX/TSX, Next.js and SSR are all the rage. Even Microsoft thinks they need to move…
Babu has created a series of posts on how to handle PII using Marten : Personally Identifiable Information masking in Marten documents using partial update/patching Encrypting Personally Identifiable Information at rest in Marten documents Encrypting and crypto-shredding of PII data in Marten documents using HashiCorp Vault
You can create multiple feeds using 11ty. For example, if you want to split Posts and TILs (Today I Learned). Create a new collection til in .eleventy.js : eleventyConfig. addCollection ( "til" , function ( collectionApi ) { return collectionApi. getFilteredByTag ( "til" ); }); Create a new til.njk template for the feed. ---json { "permalink": "til.xml", "eleventyExcludeFromCollections": true,…
Photo by Michelle Ding on Unsplash Thanks to Omakub I got introduced to Zellij : Zellij is a terminal workspace. It has the base functionality of a terminal multiplexer (similar to tmux or `screen) but includes many built-in features that would allow users to extend it and create their own personalized environment. This is how a Zellij window could look like, showing the output from…
Photo by Dayne Topkin on Unsplash Recently I've been tipping my toes into Ruby/Rails water and I wanted to give the Rails Event Store a try. When I tried to install the gems on Ubuntu, I got an error: find_executable: checking for pg_config... no when installing the pg Ruby gem on Ubuntu. Here's how I handled it. The reason for that is quite obvious: the installer tries to refer a library named…
Photo by Viktor Forgacs on Unsplash C# records are a great addition to the language. They are immutable, have value semantics, and are great for modeling data. But when it comes to model binding in ASP.NET Core, things are getting a bit more complicated. Let's see how we can deal with C# records in ASP.NET Core model binding. What are C# records? C# records are a new feature in C# 9. They are a…
Photo by Vincent van Zalinge on Unsplash HTMX and Alpine.js are a great combination. Here's how to listen to HTMX HX-Trigger response header events from Alpine.js. HTMX allows you to listen for Events from the HTTP Response using the HX-Trigger response header (the last line matters) like this: HTTP/1.1 200 OK Content-Type : text/html; charset=utf-8 Date : Sat, 10 Feb 2024 22:46:58 GMT Server :…
Photo by Sigmund on Unsplash If you're running nginx in a Docker container, you might want to rotate the logs. Here's how to do it using Docker Compose and logrotate . Consider the following docker-compose.yml : version: '3.7' services: nginx: image: nginx:1.19.6-alpine ports: - 80 :80 volumes: - ./nginx.conf:/etc/nginx/nginx.conf - ./logs:/var/log/nginx The default location for nginx…
Photo by Chris Ried on Unsplash For some tasks like writing I prefer to have my displays set to monochrome / grayscale. This is how I do it on Xubuntu / XFCE. There are several solutions out there that use xrandr or ddcutil but none of them worked for me. I'm using Xubuntu 22.04.2 LTS on a late 2012 Mac mini for some tasks. So here is how you would do it using xrandr : xrandr --output HDMI-3 --…
Photo by Soundtrap on Unsplash A while ago I posted how to annotate epub using Logseq . This time I'll show you, how to annotate Podcasts or more generic, MP3 files - using Linux. First of all we need to create a .mp3 file from a Podcast. I'm using the Podcasts browser extension (available for Firefox and Chrome) from here . It looks a bit like a lightweight version of Spotify. You can search for…
Photo by Ahmed Zayan on Unsplash We often use shell aliases to make our life easier. However, when we try to use them in shell scripts (hence, subshells) it seems to get harder. Let's say we have the following alias to run the AWS CLI in a docker container that is using the current directory as the working directory: alias aws= 'docker run --rm -it -v ~/.aws:/root/.aws -v $(pwd):/aws…
Photo by Luke Chesser on Unsplash Gyula recently asked for a decent cookieless analytics tool on Twitter: Okay. I don't wanna use Google analytics, I don't wanna anger my users with cookie popups, but wanna be GDPR compliant and I wanna have analytics on my website at the same time. What should I do? Any recommendations? — GYN (@gyulanemeth85) November 1, 2023 I suggested to use GoAccess to…
Photo by Mika Baumeister on Unsplash After dabbling around with some Elixir courses I wanted to dig into the event sourcing sample named " franklin " by Mike Zornek . Mike provides a README , so let's just run mix setup and see what happens: ** (Mix) You 're trying to run :franklin on Elixir v1.12.2 but it has declared in its mix.exs file it supports only Elixir ~> 1.14.0 To be honest, I…
I'm journaling my Elixir learnings in Logseq. Until today I've accepted the fact that LogSeq doesn't support Elixir syntax highlighting. But today I came across the "Extensions plus" plugin for Logseq, which - besides some other features - adds syntax highlighting for Elixir: Make sure to restart Logseq to make the plugin work. Also, make sure "elixir" is checked in the plugin settings:
Photo by Vlad Shagov on Gitu I've decided to learn Elixir . Not just poking a bit into the language but to be able to build full stack Elixir distributed applications and eventually SaaS. I don't want to talk much about the why for now but you can find a hint or two on my social media channels. This post aims to summarize the learning materials I've used so far and the building blocks I intend to…
Photo by Kelly Sikkema on Unsplash When possible, I'm trying to read books in epub format or as printed books. Most of my notes and journals live in Logseq. So I was asking myself: "How could I bring my ebook highlights and notes to Logseq?" While it isn't possible right now to load epub files into Logseq like you can do with PDF files , it is possible to reference your calibre notes and…
Photo by Dim Hou on Unsplash Whenever I've created a new project in Rider and added some files to the project, Rider was asking to add these file to Git / Version control: Ticking "Don't ask again" only helps for this project, but of course there must be a global setting. Indeed, a setting can be found in File | Settings | Version Control | Confirmation : So let's create a new project and add a…
Photo by Nathan Bingle on Unsplash The other day I was integration testing a Saga in the kliento code base. The tests failed and I wanted to skim through the logs to find something meaningful. Scrolling through thousands of lines of log in a monochrome style is no fun... (to me this approach sometimes is easier than debugging anyway). First things first: how do I get this output? When spinning up…
I love JetBrains Rider and I'm using it on every Platform: Xubuntu, macOS and Windows. That's great a great experience but sharing Live Templates between the platforms is a bit tricky. Things might be easier if you're using JetBrains sync but I'm using the repository sync for ages now... . The obvious option might be to use the "Save" button in the "Live Template" settings. However, if this would…
Photo by Mufid Majnun on Unsplash I'm printing out websites on purpose. This may sound like an April Fool's joke, but I'm serious. But I don't print them on paper, I print them as PDF files for the following reasons: I'm using Logseq as a "second brain". Logseq comes with a ton of useful features and one of them are PDF annotations. Here's the official video demoing the feature: Logseq to me by…
Photo by Jeswin Thomas on Unsplash As you might have noticed on Twitter that I started to evaluate Wolverine (formerly known as "JasperFx") to become the Message Bus for my SaaS apps (e.g. kliento). One of the benefits of Wolverine: it's part of the "Critter Stack for .NET". If you want to understand what that means, I recommend this blog post by Jeremy D. Miller. Another thing you might know…
This is more or less a follow up to the previous post . As said in the post already, I was playing around with Startup.cs style of application start up together with Entity Framework Core / ASP.NET Identity scaffolding. So after I got Identity scaffolded, I re-added the Startup.cs and wanted to move on with migrations. My Program.cs looked like this: public class Program { public static void Main…
The other day I tried to scaffold ASP.NET Identity for Sqlite (actually I wanted to scaffold it for Postgres but that's another story) from the CLI: dotnet aspnet-codegenerator identity -dc IdentityDbContext -u AppUser -f -gl -dbProvider sqlite Straight forward, but I got this error: IdentityGeneratorTemplateMode2 does not contain a definition for 'UseSQLite'. The project I was trying to add…
While reviewing some PDF articles I took notes that I wanted to delete later on using macOS Preview app. But it didn't work as expected. Here's the crime scene: The most obvious things to try are hitting the backspace key (also together with ⇧ and/or ⌘). But this didn't work. Lucky me, there's a workaround. Open the "Inspector" using ⌘ + i shortcut: There you can select a note and once it's…
Photo by Kenny Eliason on Unsplash I've been facing an issue with the ASP.NET developer certificates for ASP.NET Core 7 apps using HTTPS on macOS: ERR_SSL_VERSION_OR_CIPHER_MISMATCH Whatever I tried ( dotnet dev-certs https [ --clean / --trust ]), I couldn't get it to work. I also removed the certs manually from macOS Keychain. Then I found this issue on GitHub which suggested adding this…
Photo by Glenn Carstens-Peters on Unsplash Recently I learned how to navigate to a folder quickly when opening or saving files on macOS using ⇧ + ⌘ + G on the keyboard. This shortcut also works when having folders open in Finder:
Photo by Georg Bommeli on Unsplash After playing around with ASP.NET developer certificates on macOS I couldn't get it back to work. Whenever the app started, I got this exception on startup: Unable to configure HTTPS endpoint. No server certificate was specified, and the default developer certificate could not be found or is out of date. Whatever I tried ( dotnet dev-certs https [ --clean /…
Photo by Olga Deeva on Unsplash I got some feedback for my previous post : Will the single view approach work with ASP.NET Razor Pages instead of MVC Views and Controllers? Well, I'm a total Razor Pages noob, but this didn't stop me to give it a try. Long story short: it works, but I might be doing it totally wrong. Here's the source: Biggest issue upfront: how do we get multiple GET handlers in…
Artwork by Ashley Willis on GitHub I'm running on Xubuntu 22.04 day in day out working with .NET most of the time, so downtime is not an option. .NET 6 SDK was installed using the dotnet6 package from Ubuntu . Shortly after Microsoft released .NET 7, I wanted to upgrade, but it did not work because of this error: Package 'dotnet-sdk-7.0' has no installation candidate So, no .NET 7 for me…
Photo by Clint Adair on Unsplash A few months ago, the HTMX team published an essay on so-called template fragments to adhere to the Locality of Behavior (and in my opinion also cohesion) principle in server side rendered views. If you're using a template engine it is likely you end up with several views like typical parent / child/detail views: Until now, it has been common that this results in…
Photo by Clint Patterson on Unsplash Alpine.js allows you set javascript objects in the scope of a HTML tag using the x-data attribute: < div x-data = "{ open: false }" > < button @ click = "open = ! open" > Toggle Content </ button > < div x-show = "open" > Content... </ div > </ div > The data is a plain javascript object whose properties are available to all child elements of the outer div .…
Photo by José Martín Ramírez Carrasco on Unsplash Even if you don't use B2B SaaS, you might have seen urls like https://theleaddeveloper.slack.com , where you can have your own subdomain on slack.com for your Slack channel. While playing around with some nginx settings, I noticed that this could actually be used for dynamic subdomains per tenant. Long story short, here's the solution (which can…
Photo by Adeolu Eletu on Unsplash Sometimes you need a screenshot of an application window with specific dimensions. On Linux, you can use the xdotool commandline tool, which is a fake keyboard/mouse input and window management tool for x11. Using xdotool , resizing a Firefox window to 1024 x 768 pixels is as easy as this command: xdotool search "Mozilla Firefox" windowsize 1024 768 However,…
Photo by Florian Klauer on Unsplash Today I tried to deconstruct a C# record with properties and I failed. First, how do you deconstruct a record with positional parameters? It's as easy like this: public record Person ( string FirstName, string LastName ) ; var janeDoe = new Person( "Jane" , "Doe" ); var (lastName, firstName) = janeDoe; That's it. My naïve approach (the record is simplyfied for…