<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Claus Guttesen</title>
    <description>The latest articles on DEV Community by Claus Guttesen (@cguttesen).</description>
    <link>https://dev.to/cguttesen</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2570591%2Fdc26ced8-a07a-4ba1-8410-6945fbf52818.png</url>
      <title>DEV Community: Claus Guttesen</title>
      <link>https://dev.to/cguttesen</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/cguttesen"/>
    <language>en</language>
    <item>
      <title>A Git-like tool to keep track of configuration files</title>
      <dc:creator>Claus Guttesen</dc:creator>
      <pubDate>Thu, 15 May 2025 16:59:06 +0000</pubDate>
      <link>https://dev.to/cguttesen/a-git-like-tool-to-keep-track-of-configuration-files-490b</link>
      <guid>https://dev.to/cguttesen/a-git-like-tool-to-keep-track-of-configuration-files-490b</guid>
      <description>&lt;h1&gt;
  
  
  Kitty - A secure, encryption-focused configuration management tool written in Rust
&lt;/h1&gt;

&lt;p&gt;I built Kitty to solve a problem I faced while managing configuration files across servers: I wanted Git-like tracking for system config files, but with built-in encryption and the ability to keep files in their original locations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is Kitty?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Secure configuration management tool with Git-like commands&lt;/li&gt;
&lt;li&gt;Files remain in their original locations (no need to symlink like with dotfiles managers)&lt;/li&gt;
&lt;li&gt;All stored content is encrypted with ChaCha20-Poly1305&lt;/li&gt;
&lt;li&gt;Password-protected repository access&lt;/li&gt;
&lt;li&gt;Choose between file-based or SQLite storage&lt;/li&gt;
&lt;li&gt;Works with system files that might require elevated privileges&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Core features:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Track, version, and restore configuration files&lt;/li&gt;
&lt;li&gt;See differences between tracked and current versions&lt;/li&gt;
&lt;li&gt;Filter and group tracked files&lt;/li&gt;
&lt;li&gt;Restore previous versions when needed&lt;/li&gt;
&lt;li&gt;Privilege handling for system files&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Kitty is designed for sysadmins, DevOps engineers, and anyone who wants to securely track configuration files without moving them into a Git repository.&lt;/p&gt;

&lt;p&gt;The project is open source and written in Rust. It focuses on security first, with all sensitive content encrypted, making it suitable for tracking credentials and other sensitive configurations.&lt;/p&gt;

&lt;p&gt;GitHub repo: &lt;a href="https://github.com/kometen/kitty" rel="noopener noreferrer"&gt;https://github.com/kometen/kitty&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I'd love feedback from the HN community, especially on the security model and additional features that would be useful for your configuration management workflow.&lt;/p&gt;

</description>
      <category>rust</category>
      <category>management</category>
      <category>programming</category>
      <category>cli</category>
    </item>
    <item>
      <title>Encrypt messages on device and share using a link</title>
      <dc:creator>Claus Guttesen</dc:creator>
      <pubDate>Thu, 27 Mar 2025 16:51:51 +0000</pubDate>
      <link>https://dev.to/cguttesen/encrypt-messages-on-device-and-share-using-a-link-1gk5</link>
      <guid>https://dev.to/cguttesen/encrypt-messages-on-device-and-share-using-a-link-1gk5</guid>
      <description>&lt;p&gt;I wrote a webapplication with great help from Claude AI, where you can create a message, have it encrypted, upload the encrypted message to a server, share a link and decrypt it using a key downloaded to your device.&lt;/p&gt;

&lt;p&gt;Decrypting messages can be done without registering an account. Encrypting messages requires a registration. A profile is registered at Bitwarden, and a passkey is registered on your device. I can't read the profile at Bitwarden, apart from a random uuid.&lt;/p&gt;

&lt;p&gt;Write a message (optional):&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmi30a15tee2gehigdodq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmi30a15tee2gehigdodq.png" alt="Write message" width="700" height="454"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Encrypt in browser, store encrypted message on server, and download key (optional).&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftdwig0koypc9l54wcl4w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftdwig0koypc9l54wcl4w.png" alt="Encrypt and download key" width="700" height="454"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Decrypt message with key.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbz3qruw92zb1war73xdz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbz3qruw92zb1war73xdz.png" alt="Descrypt message" width="700" height="454"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The code is available at &lt;a href="https://github.com/kometen/rocket-ssr" rel="noopener noreferrer"&gt;https://github.com/kometen/rocket-ssr&lt;/a&gt;. An example can be opened at &lt;a href="https://obscura.bsky.dk/message/gKSxqMBjzj1Su0QAViN6zg" rel="noopener noreferrer"&gt;https://obscura.bsky.dk/message/gKSxqMBjzj1Su0QAViN6zg&lt;/a&gt;. Use the key &lt;code&gt;sSjMGidFJzDuG6h2LNsxBHGr/dwgIoP+CWAOGgxRXZ8=&lt;/code&gt; to decrypt it.&lt;/p&gt;

&lt;p&gt;Enjoy.&lt;/p&gt;

&lt;p&gt;It is build using the Rust based Rocket framework, Bitwardens passwordless service. And the example is based on &lt;a href="https://github.com/davidzr/passwordless-rust" rel="noopener noreferrer"&gt;https://github.com/davidzr/passwordless-rust&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>encrypt</category>
      <category>rust</category>
      <category>passwordless</category>
      <category>passkey</category>
    </item>
    <item>
      <title>DNS-load-balancing</title>
      <dc:creator>Claus Guttesen</dc:creator>
      <pubDate>Sat, 14 Dec 2024 17:54:44 +0000</pubDate>
      <link>https://dev.to/cguttesen/dns-load-balancing-4jpb</link>
      <guid>https://dev.to/cguttesen/dns-load-balancing-4jpb</guid>
      <description>&lt;p&gt;If you sometimes need to use a DNS-server in kubernetes at work you can add this to your network-settings. But reconfiguring the settings can be tedious.&lt;/p&gt;

&lt;p&gt;I wrote a DNS-forwarder that could talk to one or more public DNS-servers and the kubernetes DNS-server, and let it handle the rest. This way I always have a working DNS-resolution even if not all DNS-servers are reachable. The DNS-load-balancer can be found at &lt;a href="https://github.com/kometen/dns-load-balancer/" rel="noopener noreferrer"&gt;https://github.com/kometen/dns-load-balancer/&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;As an example here is my config.toml:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ cat /usr/local/etc/dns-load-balancer/config.toml
[[servers]]
address = "1.1.1.1"
use_tls = true
description = "Cloudflare DNS"

[[servers]]
address = "8.8.8.8"
use_tls = true
description = "Google DNS"

[[servers]]
address = "10.152.183.10"
use_tls = false
description = "Kubernetes DNS"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When the Wireguard VPN-tunnel is not connected to the kubernetes-cluster:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ host postgresql.invoice.svc.cluster.local
DNS resolution failed: Failed to resolve hostname: postgresql.invoice.svc.cluster.local.
Root cause: no record found for Query { name: Name("postgresql.invoice.svc.cluster.local."), query_type: AAAA, query_class: IN }
Error: Failed to resolve hostname: postgresql.invoice.svc.cluster.local.

Caused by:
    no record found for Query { name: Name("postgresql.invoice.svc.cluster.local."), query_type: AAAA, query_class: IN }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When connected:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ host postgresql.invoice.svc.cluster.local
postgresql.invoice.svc.cluster.local has address 10.152.183.95
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Had I configured the Kubernetes DNS as the only DNS-server, either in network-settings or in config.toml no nameresolution would take place. By adding Cloudflare and Google nameresolution will usually work and only fail if the Wireguard VPN is not connected and I query for services in Kubernetes.&lt;/p&gt;

</description>
      <category>rust</category>
      <category>dns</category>
      <category>network</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
