Link Diary January 2026
Happy new year! :)
-
- Swiping is bad, seriously
- Jaw dropping drone show
- Bye Bye, Big Tech
- OpenClaw, pretty wild
- Once registered some domains?
- Proper protein from a plant
- So many ways
- Modelling techniques
- East Bay Punk History
- We need more Vitamin D
- Better Toon Shader
- Decent list of Linux resources
- The risks that come with AI agents on your PC
Running Age Of Empires 2 with Linux/Steam
It did not work out of the box with the Proton Experimental. Also not with the Proton-GE 10.
I tried a bunch of Proton versions and Proton 8.0-5 launched it.
Set firefox the default browser in CLI
I could not find where the desktop file for firefox was, while clearly installed.
This helped:
locate *firefox*desktop
So then with the finding of the proper name I was able to
xdg-settings set default-web-browser firefox_firefox.desktop
ZSH Intro and globbing cheat sheet
I switched to zsh, inspired by Bread, and getting familiar with it.
Find all docker containers that will restart
Port were blocked after clean reboot already. Turns out, some docker compose files bring a restart-directive that causes that. So, always stop it properly.
docker ps
Stop what you don't need.
docker stop ID ID ID
Some may always restart not matter what, so check it.
for container in $(docker ps -a -q); do
restart_policy=$(docker inspect --format '{{.HostConfig.RestartPolicy.Name}}' $container)
if [[ "$restart_policy" == "always" || "$restart_policy" == "unless-stopped" ]]; then
name=$(docker inspect --format '{{.Name}}' $container)
echo "Container $name has restart policy: $restart_policy"
fi
done
Query a mongoDB
I have a Peertube project here using Go and MongoDB.
To connect to MongoDB I use the mongodb-compass.
But how to write queries?
Speaking of MongoDB, I see "bson" everywhere, as if "json" wasn't good enought. Turns out it isn't.
Diving into Firefox
I take the DID as an opportunity to try new things … being stuck on Google Tools for the past years.
I'm on Linux, not all of that may apply to
What I dig:
- Surely only for Linux-Fanboys: Copy (via simple marking as you're supposed to), and simple middle-mouse-click into the address bar replaces the URL. Awesome. Suck it, Chrome!
The Android Calendar and NextCloud
In NextCloud I have a Calender for the web browser. Great. I want this syncing with my phone back and forth to replace Google Calender.
Some NextCloud Apps in Google PlayStore cost money and they do not in the F-Droid store. So, F-Droid it is.
I imported my Gmail calendars using Google's ICS export. Imported in NextCloud into an existing calendar then worked easily.
With F-Droid I installed the App NextCloud (it's like a webview to NextCloud whereas the PlayStore App "Nexcloud" is only for files - very confusing).
I installed Calender from Fossify. There's a DAVx5 sync option, but I can only see Google Calenders.
I install the DAVx5 App with F-Droid (because in PlayStore is costs and because nextcloud says so). I connect this with my NextCloud. I activate calendars to sync. Now they appear in the list but I chose the same names and used the gmail address to setup NextCloud, now it's all double.
I tried to rename them in NextCloud but it does not sync anymore. I really had to uninstall and re-install DAVx5. In that process I also changed my email and with this they clearly separate in the calender selection.
- Have NextCloud & Calender
- Install DAVx5
- connect to NextCloud
- select calendars to sync
- Install Kalender
- select the NextCloud Calenders
When adding an event, it does not instantly sync but in intervals. Sync can be enforced.
The Thunderbird Calendar and NextCloud
Connecting the NextCloud Calender was fairly simple. Added a new calendar as "On the network", giving my NextCloud URL and username. It asked for password and presented the calenders as options to sync.
Remove Youtube Music from MyActivity Youtube history
I collect the Video picks by going through my history on https://myactivity.google.com . Unfortnuately that also list every song I listened to you Youtube Play Music, search queries and of all useless things: Shorts. Super not helpful.
This script removes these entries:
[...document.querySelectorAll('span')]
.filter(s => s.textContent.trim() === 'YouTube Music')
.forEach(s => s.closest('c-wiz')?.remove());
[...document.querySelectorAll('span')]
.filter(s => s.textContent.trim() === 'YouTube')
.forEach(s => {
const cwiz = s.closest('c-wiz');
if (!cwiz) return;
if(cwiz.innerText.includes("Searched for ")) {
cwiz.remove();
return;
}
const durationDiv = cwiz.querySelector('div[aria-label*="Video duration"]');
if (!durationDiv) return;
const durationText = durationDiv.textContent.trim();
// Check if duration starts with "0:" (less than 1 minute = Short)
if (durationText.startsWith('0:') || durationText.startsWith('1:')) {
cwiz.remove();
}
});
Video-Picks
- Provider returned HTTP Status 400 for
- All resolution methods failed
Useful links to learn and understand Linux.

Discussion