<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>~/.didev</title><link>https://davidisaksson.dev/</link><description>Recent content on ~/.didev</description><image><title>~/.didev</title><url>https://davidisaksson.dev/img/cover.jpg</url><link>https://davidisaksson.dev/img/cover.jpg</link></image><generator>Hugo -- 0.159.1</generator><language>en-us</language><lastBuildDate>Tue, 25 Nov 2025 13:18:31 +0000</lastBuildDate><atom:link href="https://davidisaksson.dev/index.xml" rel="self" type="application/rss+xml"/><item><title>Dynamic images in Hugo</title><link>https://davidisaksson.dev/posts/dynamic-images/</link><pubDate>Tue, 25 Nov 2025 13:18:31 +0000</pubDate><guid>https://davidisaksson.dev/posts/dynamic-images/</guid><description>&lt;div class="dynamic-image " style=""&gt;
&lt;center&gt;
&lt;img src="https://davidisaksson.dev/img/dynamic-images-hugo-light.svg" alt="Excalidraw&amp;#39;d Hugo logo" class="light-mode-img"&gt;
&lt;img src="https://davidisaksson.dev/img/dynamic-images-hugo-dark.svg" alt="Excalidraw&amp;#39;d Hugo logo" class="dark-mode-img"&gt;
&lt;/center&gt;
&lt;/div&gt;
&lt;p&gt;As you may have noticed, this website can be displayed in either light or dark
mode (toggle with sun/moon top left of page or with &lt;code&gt;Alt+T&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;An issue is that images and diagrams are perfectly visible in light mode, but
when flipping over to dark mode they either are surrounded by a big white box
or lost all contrast if the background is transparent, or vice versa.&lt;/p&gt;</description></item><item><title>Setting up a local reverse proxy with Nginx Proxy Manager and Let's Encrypt</title><link>https://davidisaksson.dev/posts/reverse-proxy/</link><pubDate>Sun, 23 Nov 2025 13:07:44 +0200</pubDate><guid>https://davidisaksson.dev/posts/reverse-proxy/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;This is part 2 on the topic of a short series about setting up DNS hosting with
Cloudflare and using DNS-01 challenges to get TLS certificates from Let&amp;rsquo;s Encrypt&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;See part 1:
&lt;a href="https://davidisaksson.dev/posts/dns-migration-to-cloudflare/"&gt;Moving DNS hosting from Namecheap to Cloudflare&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In this post I am sharing my experience setting up a reverse proxy that acts as
a frontend for my internal self-hosted web services.&lt;/p&gt;
&lt;h2 id="what-and-why"&gt;What and why?&lt;/h2&gt;
&lt;p&gt;A &lt;a href="https://www.cloudflare.com/learning/cdn/glossary/reverse-proxy/"&gt;reverse
proxy&lt;/a&gt; is a
service that acts as an entry point to one or more kinds of services, often web
services, but it can vary. The reverse proxy is a layer in-between the user and
service.&lt;/p&gt;</description></item><item><title>Weekly and daily note templates in Obsidian</title><link>https://davidisaksson.dev/posts/weekly-and-daily-note-templates-in-obsidian/</link><pubDate>Sun, 15 Jun 2025 22:37:52 +0200</pubDate><guid>https://davidisaksson.dev/posts/weekly-and-daily-note-templates-in-obsidian/</guid><description>&lt;p&gt;I use &lt;a href="https://obsidian.md/"&gt;Obsidian&lt;/a&gt; extensively for both personal use and
work.&lt;/p&gt;
&lt;p&gt;Today I&amp;rsquo;m sharing a trick using the
&lt;a href="https://github.com/SilentVoid13/Templater"&gt;Templater&lt;/a&gt; plugin that makes it
possible to create daily and weekly notes that based on their file names can
auto-generate links in-between them. Super handy!&lt;/p&gt;
&lt;p&gt;Install Templater and in the template directory of your vault, we will create
two files, &amp;ldquo;Daily Template&amp;rdquo; and &amp;ldquo;Weekly Template&amp;rdquo;.&lt;/p&gt;
&lt;h2 id="weekly-note-template"&gt;Weekly note template&lt;/h2&gt;
&lt;p&gt;Here is an example of how a generated week note could look like&lt;/p&gt;</description></item><item><title>Moving DNS hosting from Namecheap to Cloudflare</title><link>https://davidisaksson.dev/posts/dns-migration-to-cloudflare/</link><pubDate>Fri, 16 May 2025 16:20:00 +0200</pubDate><guid>https://davidisaksson.dev/posts/dns-migration-to-cloudflare/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;This is part 1 of a short series about setting up DNS hosting with Cloudflare
and using DNS-01 challenges to get TLS certificates from Let&amp;rsquo;s Encrypt for
locally hosted web services in a homelab.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;See part 2:
&lt;a href="https://davidisaksson.dev/posts/reverse-proxy/"&gt;Setting up a local reverse proxy with Nginx Proxy Manager and Let&amp;rsquo;s Encrypt&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I bought this domain via Namecheap a few years back. Namecheap&amp;rsquo;s services has been working fine. Not a very expensive domain name and the DNS hosting was good. My requirements for DNS hosting are very simple &amp;ndash; I want to be able to add some extra records and keep them up to date via &lt;a href="https://www.cloudflare.com/learning/dns/glossary/dynamic-dns/"&gt;Dynamic DNS (DDNS)&lt;/a&gt; if (when) my IP addresses change due to e.g. DHCP leases running out so the domain name always points to a valid IP address.&lt;/p&gt;</description></item><item><title>Debug stripped executables with detached symbols in GDB</title><link>https://davidisaksson.dev/posts/detached-debug-symbols/</link><pubDate>Sun, 27 Apr 2025 14:11:02 +0200</pubDate><guid>https://davidisaksson.dev/posts/detached-debug-symbols/</guid><description>&lt;p&gt;Say you have an executable that will be shipped to target machines and you don&amp;rsquo;t want to include any debug symbols, but at the same time if an annoying bug occurs you&amp;rsquo;d like to debug the executable with symbols. Is it possible to have both ways? As a matter of fact, yes!&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.sourceware.org/gdb/"&gt;GNU Debugger (GDB)&lt;/a&gt; has a feature where it can load a separate symbols file to make it easier to debug stripped executables. This would allow you to ship stripped binaries, archive symbols files and when needed load them both into a debug session.&lt;/p&gt;</description></item><item><title>Using Tailscale in pfSense to access my LAN</title><link>https://davidisaksson.dev/posts/tailscale-on-pfsense/</link><pubDate>Mon, 21 Apr 2025 11:47:02 +0200</pubDate><guid>https://davidisaksson.dev/posts/tailscale-on-pfsense/</guid><description>&lt;div class="dynamic-image " style=""&gt;
&lt;center&gt;
&lt;img src="https://davidisaksson.dev/img/tailscale-pfsense-header-light.png" alt="Tailscale &amp;#43; pfSense" class="light-mode-img"&gt;
&lt;img src="https://davidisaksson.dev/img/tailscale-pfsense-header-dark.png" alt="Tailscale &amp;#43; pfSense" class="dark-mode-img"&gt;
&lt;/center&gt;
&lt;/div&gt;
&lt;p&gt;In this post we&amp;rsquo;re going to explore how to set up &lt;strong&gt;Tailscale&lt;/strong&gt; in &lt;strong&gt;pfSense&lt;/strong&gt; to be able to both route all traffic through pfSense for secure browsing and how to route traffic to local subnets with split DNS to resolve local hostnames.&lt;/p&gt;
&lt;h2 id="my-history-with-vpns"&gt;My history with VPNs&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;ve had a &lt;a href="https://www.pfsense.org/"&gt;pfSense&lt;/a&gt; box now for a few years and been relying on its &lt;a href="https://en.wikipedia.org/wiki/OpenVPN"&gt;OpenVPN&lt;/a&gt; integration to access my internal network from the outside. This has been working fine, but a few years ago I stumbled upon &lt;a href="https://www.zerotier.com/"&gt;ZeroTier&lt;/a&gt; which is a kind of VPN service that via &lt;a href="https://en.wikipedia.org/wiki/UDP_hole_punching"&gt;UDP hole punching&lt;/a&gt; can create a flat and global network without the need to open ports. This technology is called &lt;a href="https://en.wikipedia.org/wiki/SD-WAN"&gt;Software-Defined Wide Area Network (SD-WAN)&lt;/a&gt;. I could now use ZeroTier to access firewalled devices without opening any ports!&lt;/p&gt;</description></item><item><title>Ctrl+P in Docker container</title><link>https://davidisaksson.dev/posts/ctrl-p-in-docker/</link><pubDate>Sun, 21 Jul 2024 20:43:02 +0200</pubDate><guid>https://davidisaksson.dev/posts/ctrl-p-in-docker/</guid><description>&lt;p&gt;I strive to be efficient on the command line, and some of my favourite keyboard
shortcuts in Bash are the ones that allows me to navigate and execute previous
commands easily. Some of which are back and forward through the command history
with &lt;code&gt;Ctrl+P&lt;/code&gt; and &lt;code&gt;Ctrl+N&lt;/code&gt; combined with &lt;code&gt;Ctrl+J&lt;/code&gt; for executing the command.&lt;/p&gt;
&lt;h2 id="the-problem"&gt;The problem&lt;/h2&gt;
&lt;p&gt;This is all well and good until you jump in to a Docker container and suddenly
&lt;code&gt;Ctrl+P&lt;/code&gt; isn&amp;rsquo;t working as expected anymore.&lt;/p&gt;</description></item><item><title>Back up your Bitwarden vault in a future-proof and secure way</title><link>https://davidisaksson.dev/posts/bitwarden-backup/</link><pubDate>Sun, 19 Nov 2023 20:55:26 +0100</pubDate><guid>https://davidisaksson.dev/posts/bitwarden-backup/</guid><description>&lt;p&gt;&lt;img alt="DALL-E: An image designed to visually represent a secure and futuristic data vault, embodying the themes of advanced technology and data security. This image, featuring the Bitwarden logo, is styled with a high-tech aesthetic." loading="lazy" src="https://davidisaksson.dev/img/bw-backup-header.png"&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Update (2026-04-07):&lt;/strong&gt; The Todoist API used in the post has been deprecated. It is now updated to use the newer &lt;code&gt;/api/v1&lt;/code&gt; path. See &lt;a href="https://developer.todoist.com/api/v1/"&gt;https://developer.todoist.com/api/v1/&lt;/a&gt; for more information.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;Your Bitwarden vault contains (hopefully) all of your passwords and other sensitive data, so it would be good to have a backup of it in case something goes wrong.&lt;/p&gt;</description></item><item><title>Format JSON in Vim with jq</title><link>https://davidisaksson.dev/posts/format-json-in-vim/</link><pubDate>Thu, 13 Apr 2023 21:15:07 +0200</pubDate><guid>https://davidisaksson.dev/posts/format-json-in-vim/</guid><description>&lt;p&gt;&lt;a href="https://stedolan.github.io/jq/"&gt;jq&lt;/a&gt; is a very powerful command-line tool
designed to manipulate JSON data. One of its great features is that it
automatically formats JSON output for better readability:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ echo &lt;span style="color:#e6db74"&gt;&amp;#39;{&amp;#34;is_jq_awesome&amp;#34;: true}&amp;#39;&lt;/span&gt; | jq
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;is_jq_awesome&amp;#34;&lt;/span&gt;: true
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="but-in-vim"&gt;But in Vim?&lt;/h2&gt;
&lt;p&gt;Can we utilize this inside of Vim? Of course!&lt;/p&gt;
&lt;p&gt;In Vim, there&amp;rsquo;s a feature called &lt;em&gt;filter commands&lt;/em&gt; that enables us to use
external applications to modify our buffers. Filter commands take a &lt;em&gt;range&lt;/em&gt;,
which is a set of contiguous lines, and a &lt;em&gt;command&lt;/em&gt; that processes these lines.
This feature is exactly what we need for our purpose.&lt;/p&gt;</description></item><item><title>Backup files quick with Bash's brace expansion</title><link>https://davidisaksson.dev/posts/brace-expansion/</link><pubDate>Sat, 08 Apr 2023 17:35:12 +0200</pubDate><guid>https://davidisaksson.dev/posts/brace-expansion/</guid><description>&lt;p&gt;Alright, here&amp;rsquo;s a quick trick that I use at least a few times a week.&lt;/p&gt;
&lt;h2 id="problem"&gt;Problem&lt;/h2&gt;
&lt;p&gt;Let&amp;rsquo;s say we have a file that we want to make a copy of for whatever reason. In
this example we&amp;rsquo;re creating a backup of the SSH server config before modifying
it:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This is fine and dandy, but a bit verbose&amp;hellip; We&amp;rsquo;re writing the same string two
times and to be frank, it&amp;rsquo;s not fun.&lt;/p&gt;</description></item><item><title>Closing a stale SSH connection</title><link>https://davidisaksson.dev/posts/closing-stale-ssh-connections/</link><pubDate>Tue, 04 Apr 2023 19:03:48 +0200</pubDate><guid>https://davidisaksson.dev/posts/closing-stale-ssh-connections/</guid><description>&lt;p&gt;Suppose you&amp;rsquo;re connected to a remote host with SSH and after a while the SSH
session goes stale. The terminal is unresponsive and no keypress seem to take
effect. There might be something with the network, the remote host is
restarting or maybe your machine has been in hibernation, there could be
multiple reasons for a stale session.&lt;/p&gt;
&lt;p&gt;The first solution that might come to mind is to just close the terminal
emulator and create another one, but &lt;strong&gt;there is a better way&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>Downloading Jenkins artifacts via the CLI</title><link>https://davidisaksson.dev/posts/download-jenkins-artifacts/</link><pubDate>Sun, 02 Apr 2023 18:28:29 +0200</pubDate><guid>https://davidisaksson.dev/posts/download-jenkins-artifacts/</guid><description>&lt;h2 id="problem"&gt;Problem&lt;/h2&gt;
&lt;p&gt;I recently needed to download an artifact from a Jenkins build to my remote dev machine.
The remote machine has access to the Jenkins controller, so I just ran &lt;code&gt;wget&lt;/code&gt; with the link.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ wget https://jenkins.local/job/.../artifact/my_artifact.tar.gz
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I got this back:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;HTTP request sent, awaiting response... &lt;span style="color:#ae81ff"&gt;403&lt;/span&gt; Forbidden
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2023-04-02 17:43:27 ERROR 403: Forbidden.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Jenkins required authentication&amp;hellip;&lt;/p&gt;
&lt;h2 id="solution"&gt;Solution&lt;/h2&gt;
&lt;h3 id="api-token"&gt;API token&lt;/h3&gt;
&lt;p&gt;To authenticate ourselves we need to supply username and an &lt;em&gt;API token&lt;/em&gt;.
The token can be generated in the Web-UI:&lt;/p&gt;</description></item><item><title>About me</title><link>https://davidisaksson.dev/about/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://davidisaksson.dev/about/</guid><description>&lt;h1 id="about-me"&gt;About me&lt;/h1&gt;
&lt;p&gt;Hi, David here.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m a software engineer, homelabber, Linux enthusiast and security advocate.&lt;/p&gt;
&lt;p&gt;If you want to reach out to me, message me somewhere. If you want to do it securely, you can get my &lt;a href="https://davidisaksson.dev/davidisaksson.asc"&gt;PGP public key here🔑&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Email me at &lt;code&gt;david.av.isaksson&lt;/code&gt; at &lt;code&gt;protonmail&lt;/code&gt; dot &lt;code&gt;com&lt;/code&gt;&lt;/p&gt;</description></item><item><title>Talks</title><link>https://davidisaksson.dev/talks/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://davidisaksson.dev/talks/</guid><description>&lt;h3 id="nix-bottom-up"&gt;&lt;em&gt;Nix: Bottom Up&lt;/em&gt;&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Knowit Tech Talk, Jönköping, March 2026&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/z92hldB_cNc?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;h3 id="från-ide-till-pde-personal-development-environment"&gt;&lt;em&gt;Från IDE till PDE (Personal Development Environment)&lt;/em&gt;&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Knowit Tech Talk, Jönköping, March 2025&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="memory-safety-in-rust-vs-c"&gt;&lt;em&gt;Memory safety in Rust vs C&lt;/em&gt;&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Knowit Tech Talk, Umeå, May 2024&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="recreateing-arpwatch-and-learning-go-with-ai"&gt;&lt;em&gt;Recreateing Arpwatch and learning Go with AI&lt;/em&gt;&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Knowit Tech Talk, Jönköping, Feb 2023&lt;/p&gt;</description></item></channel></rss>