I like Laravel Herd and Ploi for many things, but sometimes I want a deployment setup that is boring in a different way. One VPS. One Linux user. One app directory. systemd keeps the processes alive. Traefik handles HTTPS. GitHub Actions can trigger deploys, but the server itself knows how to update the app. No Kubernetes. No “platform engineering” project hiding in the corner. Just enough…
I save too many links. Some are docs. Some are blog posts. Some are GitHub issues I will definitely read later, which is a sentence everyone believes about themselves for about five seconds. Saving links is not the hard problem anymore. I can bookmark something in the browser, save a post on X, clip an article, send myself a message or throw a URL into any number of read-it-later apps. The hard…
I keep running into the same small problem: someone said something useful in WhatsApp, I know it was there, but I can’t find it anymore. This happens with family plans, rough dates, gift ideas, links someone sent me, or the classic “we already talked about this, didn’t we?” message. WhatsApp search is okay if you know the exact word. It is not great as a long-term memory. Since I already use…
Note: This project was originally released as Clawdbot , then renamed to Moltbot , and is now called OpenClaw . If you followed this guide under one of the previous names, the steps are the same — only the package and command names have changed. This guide has been updated to reflect the current name. OpenClaw seems to be the biggest hype in January 2026. Many people talk about it, the amount of…
I love reading before bed, but I always forget the time and have to find the right button to turn off the bedside lamp. This is one of those tiny annoyances that’s perfect for home automation. The beauty of this solution is its simplicity: the Kindle only connects to Wi-Fi when you turn it on, making it a perfect trigger for automation. # How it works When you activate your Kindle, it connects to…
# Quick recap Last time I’ve explained my motiviation behind building a project like this, what features I’ve built (like a notification system for the digital timetable of my kid) and what my plans were for the future. Over half a year later and I still use many of the things I’ve built, discarded some, and removed things that didn’t work. # What worked All features I’ve implemented initially…
# My personal definition of a Life OS The term “Life OS” is often associated with a note taking system helping you manage your life. It does so by giving you structures to organize your thoughts, tasks, and goals. For me, that’s not enough. An Operating System should be able to manage your life, not just help you manage it. It should be able to automate tasks, remind you of important things and be…
# What is Firecrawl? Turn websites into LLM-ready data Power your AI apps with clean data crawled from any website. It’s also open-source. Source It’s a project that enables you to scrape and crawl websites and get well-formatted data. It also handles JavaScript rendering, which is a common issue when scraping websites. And the best part: it’s open source and you can host it yourself. # Installing…
You’ve honed your skills and expanded your toolbelt – now it’s time to ensure your knowledge and experience don’t go to waste. In a fast-paced work environment, it’s all too common to leave things undocumented, thinking we’ll remember the details later. But then life happens – maybe just the weekend, a vacation, or another project pulls us away. When we finally return to that task or project, we…
In my previous post , we explored the power at your fingertips to speed up everyday tasks and bring efficiency to the forefront of your workflow. Let’s imagine you invested the time to know how to use your hammer. And now you’re hooked. You want more. That’s when you notice: Many tasks are repetitive, complex, or simply lack a clear, simple shortcut. This is where specialized tools come in – tools…
Efficiency is a mindset . You don’t get efficient by learning just one or two skills alone. Instead, you want to master the basics and get into a mental state where you’re always looking for ways to improve. This series is about building a foundation of skills and hopefully inspiring you to keep questioning and improving your workflows. Imagine a carpenter who needs 10 minutes just to hold his…
Librechat.ai is an open source AI chat platform that you can host yourself. In this tutorial, we will install Librechat AI using Docker and Traefik. I’ve had some hoops to jump through to get everything working, so I thought I’d share the steps I took to get it up and running. This guide assumes you are using an external network called web to route all your traffic through Traefik. # Step 1:…
Typesense is a fast, typo-tolerant search engine that is easy to set up and use. In this tutorial, we will set up Typesense on a VPS and configure it to use SSL certificates. We will use a cheap VPS from Hetzner, but you can use any VPS provider that you prefer. # Prerequisites Before we start, you will need the following: A VPS with Ubuntu 22.04 with at least 1GB of RAM and 1 CPU core A domain…
I wanted to be able to message my bot in Mattermost and have him respond to me. Since I’ve wanted to use OpenAI to generate text and already have a web service for this in place which is connected to a few other accounts I wanted to be able to generate the response in this service instead of having to write a plugin for Mattermost. But for this to work I needed to be able to know when someone…
As a developer, I often find myself digging through documentation to solve problems or learn about new tools. Sometimes, I encounter issues with finding the right information, or the search functionality is limited. That’s when I had an idea: What if we could create a natural language search for our agency’s documentation using cutting-edge AI technology? In this article, I’ll walk you through my…
If you have ever encountered a situation where a Zigbee device becomes unavailable in Home Assistant, you may be wondering how to easily reconnect it. Screenshot of some unavailable devices in the Home Assistant UI Although there’s no apparent method to do this in the UI, it’s surprisingly easy to accomplish! # Steps to reconnect an unavailable Zigbee device Open the Settings → Devices & Services…
Update 2023-04-15: Since version 1.18 of Weaviate you can use API key authentication , thus making the header authentication plugin unnecessary. # What is Weaviate? Weaviate is an open-source vector search engine. It allows you to store data objects and vector embeddings from your favorite ML-models, and scale seamlessly into billions of data objects. Source In other words, it’s a search engine…
# Introduction If you’ve been using Docker for a while, you may have noticed that it can quickly use up a lot of disk space. Especially after testing out a few images, updating existing ones you may find your host slowly but surely filling up. In this quick tip, I’ll show you how to use the built-in command docker system prune to clear up space used by Docker. # What does docker system prune do?…
# Introduction Pipedream is a powerful and flexible platform for building and automating workflows. It allows you to connect a wide variety of apps and services, and trigger actions based on events or data from those services. With Pipedream, you can automate all kinds of tasks, from sending emails and texts to updating social media or setting reminders. One example of how you can use Pipedream is…
I recently had to migrate an older installation of a Mattermost instance to a new server. Unfortunately, the old install method wasn’t supported anymore and relied on a MySQL-database, which isn’t officially supported anymore. Since there currently is no direct migration path from MySQL to PostgreSQL which is officially vetted by Mattermost, to following path outlines how you can manually migrate…
You can use a Mattermost bot and the Mattermost API to automate writing messages to your users. I couldn’t find any tutorials how to make it seem like the bot messaged you or one of your users. If you want to achieve exactly that, this article is for you. # Create a bot integration As an admin, select the grid icon in the top left of your Mattermost instance and select “Integrations”. The grid…
When working with an ecommerce client, I had the requirement to display images in uniform boxes. This was way before we had things like object-fit . The big problem was: the images the client provided where far from uniform. Some images were landscape oriented, others in portrait, some were squared. They also differed in file size and type, some being over 5MB in size, others the opposite. I…
I recently built deine-mutter.timkley.dev , a small project which returns a random “your mom” joke. You can use an API like this for all kinds of things. For example, I used pipedream.com to create a weekly workflow which sends a random joke to my teammate. You know, keeping it professional. Maybe you also need a small API like this and want to get a better grasp how to do this. In this article…
When I first started writing my blog I used getinsights.io for analytics to see how much traffic my site got. Seeing the first visitors finding articles on search engines was very motivating for me. Using Google Analytics was never an option for me. I don’t need half of its features and I didn’t want to jump through the GDPR hoops. What I wasn’t happy about when using Insights was the interface…
This article is for you, if: you want to visualise Home Assistant statistics over a longer period than the dashboard allows you want to know more about how the database of Home Assistant works generally You’ll learn the following: How the default database of Home Assistant works How to connect to the database and run simple queries Use a little more complex SQL to generate daily data How to…
From time to time you’ll want to update your Home Assistant instance you’ve previously set up to the latest version. Using docker compose this is really simple, you just have to run two simple commands and need a little patience. If you’ve used my guide to run Home Assistant this works with nearly no downtime. # How to update your containers SSH into the server running your Home Assistant instance…
Screenshot of a console showing a warning about an Alpine expression error If you ran into the above error before, one of the most common causes is forgetting to define exactly one root element. So, if your code looks like this: <template x-if="loading"> Loading... </template> You need to change it to this (instead of a div you may use any other valid HTML element): <template x-if="loading">…
In every bigger project I’ve worked on (especially in e-commerce) there comes a time where you need to tie different parts of your JavaScript together. Maybe you want to track something when a user interacts with your site or does something of value (like adding a product to the cart). Or you need to trigger some behaviour in a totally different component. The most straightforward approach is to…
Update 2024-06-04: updated the guide for the “new” year. Finally, a Raspberry Pi 4 with 8GB RAM came into stock that wasn’t outrageously priced. Quick tip: remember where you’ve placed your Micro SD card from your last bricked Pi so you don’t have to wait for the delivery of a new one. I’m assuming you have basic knowledge of Linux (for example, how to connect to another computer with SSH), so…
TL;DR: Scroll to the bottom to see how to use nunjucks whitespace control to correctly render an include within a markdown file. When I was writing my Create an API proxy with Cloudflare Workers article I wanted to dynamically include the widget for what I last scrobbled so everyone could see what the purpose should be. I knew I could set a default template engine for markdown files , which is…
{% from ‘macros.njk’ import alert %} In this article we’ll discover how to use Cloudflare Workers to consume third party APIs without the need for your own server or compromising on security. I used this to create this dynamic widget on my homepage to show which song I listened to last, scrobbled from Spotify to Last.fm : {% include 'last-scrobble.njk' %} # Why don’t you use Javascript? You might…
With the introduction of Web Vitals by Google in May 2020, almost everyone has probably heard of or got in touch with web performance. Either because you are a developer looking at and developing against these new metrics or because you do client work and every client waved their bad Google performance report in your face. # What has changed? It’s not like performance reports didn’t exist prior to…
This small tutorial is directed at people who want a great wireless network experience in their own home but this setup might also be suitable for small businesses with just a few access points. We recently moved into a new flat. COVID doesn’t seem to go away in the near future and our company will offer working completely remote with or without the virus. So having a good internet and network…
I wanted to create a new version of my website for quite some time. The old version was just one site which was also statically generated HTML. I was using gulp along with a plugin so I could use Twig templates , mainly because I hate to repeat myself in templates, even if it’s just a few hundred lines of markup. I learned the hard way that missing abstraction is the source of many bugs that never…
Implementing dark mode with TailwindCSS is not that new. Experimental support was added in September 2020 and being promoted to a first class citizen in November 2020 when TailwindCSS was updated to v2. I’m currently using version 3 of TailwindCSS with the amazing Typography plugin . Dark mode is already activated because I am using the JIT (just-in-time) mode and is leveraging…
Since years I’ve been a big fan of GitLab. I started there because I could host my own private repos without any costs. At this time, GitHub only allowed private repos for paying customers. I started using GitHub for my own projects in August 2021 with GitHubs announcement of Codespaces being available for everyone with a teams plan. Just hitting . in the browser and having a full-blown VS Code…
You probably heard of Vim . Chances are you probably got stuck in Vim and angrily tried to exit it by smashing your mouse and keyboard. Picture of a Tweet mocking how it looks when first users of Vim try to quit it. You maybe know by now to exit Vim by typing :q (or :q! if you want to be really sure Vim quits). Typing a colon tells Vim you want to enter a command (given you are in the so-called…
One of our clients provides a marketplace. You can book a package and get a complete website with content, e-commerce functionality and the possibility to add your own content and define your brand colours. The project was built with TailwindCSS and our config looked something like this: module.exports = { theme: { extend: { colors: { 'primary-dark': '#1c3d5a', primary: '#3490dc', 'primary-light':…
# The problem We relaunched the e-commerce site from one of our clients in the end of 2019. It was a big relaunch, impacting the overall design, template and frontend architecture. The only thing pretty much left unchanged was the backend. The main goals defined with the client were: optimise PageSpeed metrics Improve usability and therefore conversion rate After months of implementing, the…