<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>My personal blog</title>
    <link>https://jens.dev/index.html</link>
    <description>Recent content on My personal blog</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <lastBuildDate>Thu, 26 Mar 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://jens.dev/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>TurboQuant in gguf-runner: roughly half the memory at nearly the same speed</title>
      <link>https://jens.dev/2026/03/26/turboquant-kv-cache-optimization.html</link>
      <pubDate>Thu, 26 Mar 2026 00:00:00 +0000</pubDate>
      <guid>https://jens.dev/2026/03/26/turboquant-kv-cache-optimization.html</guid>
      <description>&lt;h2 id=&#34;a-more-technical-follow-up&#34;&gt;A more technical follow-up&lt;/h2&gt;&#xA;&lt;p&gt;In the &lt;a href=&#34;https://jens.dev/2026/02/17/gguf-runner-blogpost.html&#34;&gt;previous post&lt;/a&gt; I introduced &lt;strong&gt;gguf-runner&lt;/strong&gt;, a small Rust CLI for running GGUF models locally on CPU.&lt;/p&gt;&#xA;&lt;p&gt;In the &lt;a href=&#34;https://jens.dev/2026/03/08/gguf-runner-update.html&#34;&gt;follow-up&lt;/a&gt; I wrote about vision support, release binaries, and a number of smaller improvements.&lt;/p&gt;&#xA;&lt;p&gt;This post is about one of the more practical changes: adding &lt;strong&gt;TurboQuant&lt;/strong&gt; as a new KV-cache mode that cuts KV-cache memory sharply without giving up much throughput.&lt;/p&gt;&#xA;&lt;p&gt;Repo: &lt;a href=&#34;https://github.com/apimeister/gguf-runner&#34;&gt;https://github.com/apimeister/gguf-runner&lt;/a&gt;&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;why-the-kv-cache-matters-so-much&#34;&gt;Why the KV-cache matters so much&lt;/h2&gt;&#xA;&lt;p&gt;For long-context inference, the KV-cache quietly becomes one of the dominant costs.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Building containers on Codeberg</title>
      <link>https://jens.dev/2026/03/15/building-containers-on-codeberg.html</link>
      <pubDate>Sun, 15 Mar 2026 00:00:00 +0000</pubDate>
      <guid>https://jens.dev/2026/03/15/building-containers-on-codeberg.html</guid>
      <description>&lt;p&gt;I have been moving more and more of my smaller projects over to Codeberg lately.&lt;/p&gt;&#xA;&lt;p&gt;For plain git hosting and Forgejo based CI, it is a very pleasant setup. The one area where I had to do a bit more work than expected was container builds.&lt;/p&gt;&#xA;&lt;p&gt;At first glance this looks like it should be boring:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;write a &lt;code&gt;Dockerfile&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;add a CI step&lt;/li&gt;&#xA;&lt;li&gt;build the image&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;But on a hosted Codeberg runner this is exactly the type of thing where the defaults are not quite the defaults you may be used to from GitHub Actions or from your own machine.&lt;/p&gt;</description>
    </item>
    <item>
      <title>gguf-runner updates: vision support, releases, and many small improvements</title>
      <link>https://jens.dev/2026/03/08/gguf-runner-update.html</link>
      <pubDate>Sun, 08 Mar 2026 00:00:00 +0000</pubDate>
      <guid>https://jens.dev/2026/03/08/gguf-runner-update.html</guid>
      <description>&lt;h2 id=&#34;a-quick-follow-up&#34;&gt;A quick follow-up&lt;/h2&gt;&#xA;&lt;p&gt;In the &lt;a href=&#34;https://jens.dev/2026/02/17/gguf-runner-blogpost.html&#34;&gt;previous post&lt;/a&gt; I introduced &lt;strong&gt;gguf-runner&lt;/strong&gt;, a small Rust CLI for running GGUF models locally with a focus on:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;CPU-only inference&lt;/li&gt;&#xA;&lt;li&gt;mmap-based model loading&lt;/li&gt;&#xA;&lt;li&gt;a small, scriptable command line interface&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;If you haven’t read that one yet, it explains the motivation and the general design of the project.&lt;/p&gt;&#xA;&lt;p&gt;This post is a follow-up covering some of the more recent additions, most notably &lt;strong&gt;vision support&lt;/strong&gt;, along with a few practical improvements like &lt;strong&gt;GitHub release binaries&lt;/strong&gt;, better documentation, and a number of performance tweaks.&lt;/p&gt;</description>
    </item>
    <item>
      <title>gguf-runner: a minimal GGUF CLI</title>
      <link>https://jens.dev/2026/02/17/gguf-runner-blogpost.html</link>
      <pubDate>Tue, 17 Feb 2026 00:00:00 +0000</pubDate>
      <guid>https://jens.dev/2026/02/17/gguf-runner-blogpost.html</guid>
      <description>&lt;p&gt;I’ve been playing with local LLMs again.&lt;/p&gt;&#xA;&lt;p&gt;Not in the “let’s build a platform” way. More in the “I want a tiny tool I can keep in &lt;code&gt;~/bin&lt;/code&gt; and forget about” way.&lt;/p&gt;&#xA;&lt;p&gt;So I built &lt;strong&gt;gguf-runner&lt;/strong&gt;: a small Rust CLI to run &lt;strong&gt;GGUF&lt;/strong&gt; models locally, &lt;strong&gt;CPU-only&lt;/strong&gt;, with a focus on &lt;em&gt;low memory overhead&lt;/em&gt; and a clean “pipes and scripts” workflow.&lt;/p&gt;&#xA;&lt;p&gt;Repo: &lt;a href=&#34;https://github.com/apimeister/gguf-runner&#34;&gt;https://github.com/apimeister/gguf-runner&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;memory-first-gguf--mmap&#34;&gt;Memory first: GGUF + mmap&lt;/h2&gt;&#xA;&lt;p&gt;The core idea behind gguf-runner is simple:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Letting an LLM Review Our Pull Requests (So You Don’t Have To)</title>
      <link>https://jens.dev/2025/08/08/pr-reviews.html</link>
      <pubDate>Fri, 08 Aug 2025 00:00:00 +0000</pubDate>
      <guid>https://jens.dev/2025/08/08/pr-reviews.html</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;This post is a cross-post from &lt;a href=&#34;https://downtozero.cloud/&#34;&gt;Down to Zero&lt;/a&gt;. Canonical source: &lt;a href=&#34;https://downtozero.cloud/posts/2025/pr-reviews/&#34;&gt;https://downtozero.cloud/posts/2025/pr-reviews/&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;We love automation. We use it to power our infrastructure, to scale workloads down to zero, and—increasingly—to shrink the amount of human attention needed to ship high-quality code. One place that still felt stubbornly manual was &lt;strong&gt;pull-request reviews&lt;/strong&gt;. Between Cursor as our IDE, ChatGPT/Codex for prototyping, and &lt;code&gt;gemini-cli&lt;/code&gt; for quick checks, our local workflows were fast—but CI still waited for a human.&lt;/p&gt;</description>
    </item>
    <item>
      <title>An epaper picture frame</title>
      <link>https://jens.dev/2024/08/25/an-epaper-picture-frame.html</link>
      <pubDate>Sun, 25 Aug 2024 14:00:00 +0000</pubDate>
      <guid>https://jens.dev/2024/08/25/an-epaper-picture-frame.html</guid>
      <description>&lt;p&gt;I was recently on the lookout for a e-paper version of a picture frame that could be battery powered. After an inital short search, and a short excourse to aliexpress (to build my own version) I found something that resembled what I was looking for.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://framelabs.eu/en/&#34;&gt;https://framelabs.eu/en/&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;This site demonstrates nice picture frames with an embedded e-paper display. It is also battery powered and has quite a long battery life.&lt;/p&gt;&#xA;&lt;p&gt;Digging through the site, I just found one obstacle (that I also found on aliexpress DIY sets). The display only supports 16 greyscale colors. Which seems a little low, but the restriction comes from the epaper display. So I tried it out by ordering one 13inch picture frame.&lt;/p&gt;</description>
    </item>
    <item>
      <title>A Special Purpose HTTP Proxy in Rust</title>
      <link>https://jens.dev/2024/07/10/a-special-purpose-http-proxy-in-rust.html</link>
      <pubDate>Wed, 10 Jul 2024 14:00:00 +0000</pubDate>
      <guid>https://jens.dev/2024/07/10/a-special-purpose-http-proxy-in-rust.html</guid>
      <description>&lt;p&gt;I recently purchased some IoT device based on a pre-built ESP32 firmaware. I wanted to move the server part into the cloud, so I wanted to secure the HTTP calling request with TLS and some form of authentication.&lt;/p&gt;&#xA;&lt;p&gt;Since the IoT device did not have any TLS or authentication in place, I decided on locally hosting a proxy which transforms HTTP into HTTPS and inject an authnetication in form of an API-KEY.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Getting Started with Kubernetes</title>
      <link>https://jens.dev/2023/06/05/getting-started-with-kubernetes.html</link>
      <pubDate>Mon, 05 Jun 2023 10:08:54 +0000</pubDate>
      <guid>https://jens.dev/2023/06/05/getting-started-with-kubernetes.html</guid>
      <description>&lt;p&gt;The more engines we migrated, the more we reached the limits of our approach.&lt;/p&gt;&#xA;&lt;p&gt;Deployments grew more and more complex, since we could not check or validate our YAML before bringing it to an actual machine. Sizing Hardware also was an issue, since adding or removing machines still was a manual task.&lt;/p&gt;&#xA;&lt;p&gt;The deployment was still error prone and relied on bash script execution on the target host. Analyzing issues become more complex.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Scaling BusinessWorks in Kubernetes</title>
      <link>https://jens.dev/2023/06/05/scaling-businessworks-in-kubernetes.html</link>
      <pubDate>Mon, 05 Jun 2023 10:08:54 +0000</pubDate>
      <guid>https://jens.dev/2023/06/05/scaling-businessworks-in-kubernetes.html</guid>
      <description>&lt;p&gt;Scaling our services in Kubernetes represented a multitude of problems.&lt;/p&gt;&#xA;&lt;p&gt;As long as our engine contain multiple process starter, the engine can only be manually scaled. Only the developer/maintainer of that engine knows how it behaves if we scale from 1 instance to 2.&lt;/p&gt;&#xA;&lt;p&gt;Also every Starter in BusinessWorks comes with its own special need in term of parallelism. For Example a Queue receiver can scale horizontally, where as a Topic Consumer cannot.&#xA;Also Timer based processes need a guarantee that only one instance is running at one point in time.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Server-Timing HTTP header for Axum in Rust</title>
      <link>https://jens.dev/project/axum-server-timing.html</link>
      <pubDate>Tue, 02 May 2023 18:13:50 +0000</pubDate>
      <guid>https://jens.dev/project/axum-server-timing.html</guid>
      <description>&lt;p&gt;The “axum-server-timing” project on GitHub provides an Axum layer to inject the Server-Timing HTTP header into responses. This allows developers to measure and report the performance of server-side operations. The project includes examples demonstrating how to use this layer to include timing information, such as duration and descriptions, in HTTP responses.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/JensWalter/axum-server-timing&#34;&gt;https://github.com/JensWalter/axum-server-timing&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>A HTTP Server-Timing Header for axum</title>
      <link>https://jens.dev/2023/04/20/a-http-server-timing-header-for-axum.html</link>
      <pubDate>Thu, 20 Apr 2023 00:00:00 +0000</pubDate>
      <guid>https://jens.dev/2023/04/20/a-http-server-timing-header-for-axum.html</guid>
      <description>&lt;p&gt;Recently I was wondering how I could track the timings of an API I wrote and was looking for ways to implement something to keep track of the individual stages of a request process.&lt;/p&gt;&#xA;&lt;p&gt;So the overall timing is logged as time in the access log, usually provided by some ingress provider or load balance. But that only shows part of the story, I also wanted to drill down into the timing of subsections of the process.&lt;/p&gt;</description>
    </item>
    <item>
      <title>A Solar Powered GitHub Runner</title>
      <link>https://jens.dev/2023/04/15/solar-powered-github-runner.html</link>
      <pubDate>Sat, 15 Apr 2023 09:08:05 +0000</pubDate>
      <guid>https://jens.dev/2023/04/15/solar-powered-github-runner.html</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://downtozero.cloud/posts/assets/2023/solar-powered-github-runner/&#34;&gt;This is a cross-posting from downtozero.cloud&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;The more our little project progresses, the more code we produce. And like most of our community these days, we host our code on GitHub.&lt;/p&gt;&#xA;&lt;p&gt;So during development we discussed the implications of a DownToZero architecture for something like a GitHub process. We quickly identified two types of actions that need to be performed on the infrastructure.&lt;/p&gt;&#xA;&lt;p&gt;The first is the CI build, which should always provide immediate feedback to the developer. It checks for compliance as well as code integrity and is usually deeply involved in the development process. These jobs are time-sensitive because someone is usually waiting for them.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Reaping some benefits of containerization</title>
      <link>https://jens.dev/2023/02/27/reaping-some-benefits.html</link>
      <pubDate>Mon, 27 Feb 2023 18:08:54 +0000</pubDate>
      <guid>https://jens.dev/2023/02/27/reaping-some-benefits.html</guid>
      <description>&lt;p&gt;We just started the migration and saw some impressive results very early on.&lt;/p&gt;&#xA;&lt;h3 id=&#34;deployment&#34;&gt;Deployment&lt;/h3&gt;&#xA;&lt;p&gt;We started with some very heavy custom scripting to deploy large composites. These composite container definitions for BW engines, SQL script, EMS definitions and file system deployment. Overall, this process became so complex that even a &amp;ldquo;simple&amp;rdquo; composite deployment could easily take 2-3 hours.&lt;/p&gt;&#xA;&lt;p&gt;By splitting the composite into containers and building our composite structure on top of Docker Compose, deployment times were now down to minutes (up to 5 minutes for container pulls and restarts). This is a huge improvement over existing deployment times.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Containerizing a BusinessWorks Stack</title>
      <link>https://jens.dev/2023/02/27/containerizing-businessworks.html</link>
      <pubDate>Mon, 27 Feb 2023 14:08:54 +0000</pubDate>
      <guid>https://jens.dev/2023/02/27/containerizing-businessworks.html</guid>
      <description>&lt;p&gt;Containerizing BusinessWorks 5 comes with its own set of challenges. Most of these are related to the surrounding ecosystem and the architectures that have evolved around it.&lt;/p&gt;&#xA;&lt;p&gt;In a classic scenario, a BusinessWorks engine runs within an administrator domain and reports its lifecycle through Hawk. Deployment of an engine is also typically handled by a combination of these tools.&lt;/p&gt;&#xA;&lt;p&gt;It is important to note that only BusinessWorks provides the interface implementations. The other tools are used to manage/monitor/maintain BW engines and keep them running.&lt;/p&gt;</description>
    </item>
    <item>
      <title>The Classic BusinessWorks Stack</title>
      <link>https://jens.dev/2023/02/27/classic-businessworks-stack.html</link>
      <pubDate>Mon, 27 Feb 2023 12:08:54 +0000</pubDate>
      <guid>https://jens.dev/2023/02/27/classic-businessworks-stack.html</guid>
      <description>&lt;p&gt;Since I already defined the software stack as a whole, let define how things worked before the migration started.&lt;/p&gt;&#xA;&lt;h1 id=&#34;how-sources-and-dependencies-are-kept&#34;&gt;How Sources and Dependencies are kept.&lt;/h1&gt;&#xA;&lt;p&gt;All the sources were in one big mono-repo.&#xA;This repo defined engines that followed the definition of backend systems.&#xA;So for each system (with all its services) we had a source project.&#xA;Shared functionality was distributed through project libraries so that it could be pulled into multiple engines.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Modernizing a Classic Tibco stack</title>
      <link>https://jens.dev/2023/02/27/modernizing-stack.html</link>
      <pubDate>Mon, 27 Feb 2023 10:08:54 +0000</pubDate>
      <guid>https://jens.dev/2023/02/27/modernizing-stack.html</guid>
      <description>&lt;p&gt;This will be a series of posts about the steps we took to migrate an existing environment to the cloud.&lt;/p&gt;&#xA;&lt;p&gt;All the steps we took here took us about 5 years to implement and I will post several articles about the major steps we took.&lt;/p&gt;&#xA;&lt;p&gt;For now, this is a work in progress and I will update this page as each new article comes out.&lt;/p&gt;&#xA;&lt;h3 id=&#34;lets-define-what-we-mean-by-tibco-classic-stack&#34;&gt;Lets define what we mean by Tibco classic stack&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://jens.dev/2023/02/27/classic-businessworks-stack.html&#34;&gt;The Classic BusinessWorks stack&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;lets-start-with-containerization&#34;&gt;Lets start with containerization&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://jens.dev/2023/02/27/containerizing-businessworks.html&#34;&gt;Containerizing a BusinessWorks Stack&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://jens.dev/2023/02/27/reaping-some-benefits.html&#34;&gt;Reaping some benefits of containerization&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;migration-to-container-orchestration--kubernetes&#34;&gt;Migration to Container Orchestration / Kubernetes&lt;/h3&gt;</description>
    </item>
    <item>
      <title>KEDA external Scaler for Oracle in Rust</title>
      <link>https://jens.dev/project/keda-oracle-scaler.html</link>
      <pubDate>Sun, 22 May 2022 18:13:50 +0000</pubDate>
      <guid>https://jens.dev/project/keda-oracle-scaler.html</guid>
      <description>&lt;p&gt;The project “keda-oracle-scaler” on GitHub is designed to scale KEDA (Kubernetes-based Event Driven Autoscaling) targets based on the results of Oracle database table queries. It allows KEDA to adjust the number of replicas for a Kubernetes deployment depending on the data selected from an Oracle table. This can help in dynamically scaling applications based on real-time database metrics.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/apimeister/keda-oracle-scaler&#34;&gt;https://github.com/apimeister/keda-oracle-scaler&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Write a KEDA external Scaler for Oracle in Rust</title>
      <link>https://jens.dev/2022/05/22/write-a-keda-external-scaler-for-oracle-in-rust.html</link>
      <pubDate>Sun, 22 May 2022 10:13:50 +0000</pubDate>
      <guid>https://jens.dev/2022/05/22/write-a-keda-external-scaler-for-oracle-in-rust.html</guid>
      <description>&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://keda.sh/&#34;&gt;KEDA&lt;/a&gt; (Kubernetes Event-driven Autoscaling) is as the name says a scaling framwork for kubernetes. This frameword can scale based in internal scalers as well as externally defined scalers. Here I wate to write a Rust based scaler, which implements ths gRPS &lt;a href=&#34;https://keda.sh/docs/2.7/scalers/external/&#34;&gt;external scaler interface&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;overview&#34;&gt;Overview&lt;/h2&gt;&#xA;&lt;p&gt;The proto definition gives the following interface.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;service ExternalScaler {&#xA;    rpc IsActive(ScaledObjectRef) returns (IsActiveResponse) {}&#xA;    rpc StreamIsActive(ScaledObjectRef) returns (stream IsActiveResponse) {}&#xA;    rpc GetMetricSpec(ScaledObjectRef) returns (GetMetricSpecResponse) {}&#xA;    rpc GetMetrics(GetMetricsRequest) returns (GetMetricsResponse) {}&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;For now I am ignoring the option for the streaming service. That leaves me with the isActive and GetMetrics invocations.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to access Azure Key Vault in Rust</title>
      <link>https://jens.dev/2021/02/13/how-to-access-azure-key-vault-in-rust.html</link>
      <pubDate>Sat, 13 Feb 2021 10:13:50 +0000</pubDate>
      <guid>https://jens.dev/2021/02/13/how-to-access-azure-key-vault-in-rust.html</guid>
      <description>&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;&#xA;&lt;p&gt;Since the Azure SDK for Rust is still not published on &lt;a href=&#34;https://crates.io/&#34;&gt;crates.io&lt;/a&gt;, here is an example how to use the current git repo for accessing an Azure Key Vault.&lt;/p&gt;&#xA;&lt;h2 id=&#34;cargotoml&#34;&gt;Cargo.toml&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-toml&#34; data-lang=&#34;toml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#111&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#75af00&#34;&gt;package&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75af00&#34;&gt;name&lt;/span&gt; &lt;span style=&#34;color:#111&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#d88200&#34;&gt;&amp;#34;keyvault-sample&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75af00&#34;&gt;version&lt;/span&gt; &lt;span style=&#34;color:#111&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#d88200&#34;&gt;&amp;#34;0.1.0&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75af00&#34;&gt;edition&lt;/span&gt; &lt;span style=&#34;color:#111&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#d88200&#34;&gt;&amp;#34;2018&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#111&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#75af00&#34;&gt;dependencies&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75af00&#34;&gt;azure_key_vault&lt;/span&gt; &lt;span style=&#34;color:#111&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#111&#34;&gt;{&lt;/span&gt; &lt;span style=&#34;color:#75af00&#34;&gt;git&lt;/span&gt; &lt;span style=&#34;color:#111&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#d88200&#34;&gt;&amp;#34;https://github.com/Azure/azure-sdk-for-rust.git&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#111&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75af00&#34;&gt;azure_identity&lt;/span&gt; &lt;span style=&#34;color:#111&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#111&#34;&gt;{&lt;/span&gt; &lt;span style=&#34;color:#75af00&#34;&gt;git&lt;/span&gt; &lt;span style=&#34;color:#111&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#d88200&#34;&gt;&amp;#34;https://github.com/Azure/azure-sdk-for-rust.git&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#111&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75af00&#34;&gt;tokio&lt;/span&gt; &lt;span style=&#34;color:#111&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#111&#34;&gt;{&lt;/span&gt; &lt;span style=&#34;color:#75af00&#34;&gt;version&lt;/span&gt; &lt;span style=&#34;color:#111&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#d88200&#34;&gt;&amp;#34;1&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#75af00&#34;&gt;features&lt;/span&gt; &lt;span style=&#34;color:#111&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#111&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#d88200&#34;&gt;&amp;#34;full&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#111&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;mainrs&#34;&gt;main.rs&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#00a8c8&#34;&gt;use&lt;/span&gt; &lt;span style=&#34;color:#111&#34;&gt;azure_identity&lt;/span&gt;::&lt;span style=&#34;color:#111&#34;&gt;token_credentials&lt;/span&gt;::&lt;span style=&#34;color:#111&#34;&gt;ClientSecretCredential&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#00a8c8&#34;&gt;use&lt;/span&gt; &lt;span style=&#34;color:#111&#34;&gt;azure_identity&lt;/span&gt;::&lt;span style=&#34;color:#111&#34;&gt;token_credentials&lt;/span&gt;::&lt;span style=&#34;color:#111&#34;&gt;TokenCredentialOptions&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#00a8c8&#34;&gt;use&lt;/span&gt; &lt;span style=&#34;color:#111&#34;&gt;azure_key_vault&lt;/span&gt;::&lt;span style=&#34;color:#111&#34;&gt;KeyVaultClient&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#[tokio::main]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#00a8c8&#34;&gt;async&lt;/span&gt; &lt;span style=&#34;color:#00a8c8&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#75af00&#34;&gt;main&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;()&lt;/span&gt; -&amp;gt; &lt;span style=&#34;color:#111&#34;&gt;Result&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;(),&lt;/span&gt; &lt;span style=&#34;color:#111&#34;&gt;Box&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#00a8c8&#34;&gt;dyn&lt;/span&gt; &lt;span style=&#34;color:#111&#34;&gt;std&lt;/span&gt;::&lt;span style=&#34;color:#111&#34;&gt;error&lt;/span&gt;::&lt;span style=&#34;color:#111&#34;&gt;Error&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#111&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;//azure credentials&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#00a8c8&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#111&#34;&gt;client_id&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#d88200&#34;&gt;&amp;#34;11111111-1111-1111-1111-111111111111&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;to_string&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;();&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#00a8c8&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#111&#34;&gt;client_secret&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#d88200&#34;&gt;&amp;#34;super_secret_key&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;to_string&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;();&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#00a8c8&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#111&#34;&gt;tenant_id&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#d88200&#34;&gt;&amp;#34;11111111-1111-1111-1111-111111111111&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;to_string&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;();&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;//keyvault data&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#00a8c8&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#111&#34;&gt;keyvault_name&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#d88200&#34;&gt;&amp;#34;my-personal-key-vault&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#00a8c8&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#111&#34;&gt;secret_name&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#d88200&#34;&gt;&amp;#34;sb-connection-string&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#00a8c8&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#111&#34;&gt;creds&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#111&#34;&gt;ClientSecretCredential&lt;/span&gt;::&lt;span style=&#34;color:#111&#34;&gt;new&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;tenant_id&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;client_id&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;client_secret&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#111&#34;&gt;TokenCredentialOptions&lt;/span&gt;::&lt;span style=&#34;color:#111&#34;&gt;default&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;(),&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#111&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#00a8c8&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#00a8c8&#34;&gt;mut&lt;/span&gt; &lt;span style=&#34;color:#111&#34;&gt;client&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#111&#34;&gt;KeyVaultClient&lt;/span&gt;::&lt;span style=&#34;color:#111&#34;&gt;new&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;creds&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#111&#34;&gt;keyvault_name&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#00a8c8&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#111&#34;&gt;secret&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#111&#34;&gt;client&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;get_secret&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;secret_name&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;).&lt;/span&gt;&lt;span style=&#34;color:#00a8c8&#34;&gt;await&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;?&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#75af00&#34;&gt;println!&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#d88200&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#d88200&#34;&gt;{}&lt;/span&gt;&lt;span style=&#34;color:#d88200&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;secret&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;());&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#111&#34;&gt;Ok&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;(())&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#111&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>DownToZero.cloud - a sustainable cloud alternative</title>
      <link>https://jens.dev/project/down-to-zero-cloud.html</link>
      <pubDate>Tue, 29 Dec 2020 02:13:50 +0000</pubDate>
      <guid>https://jens.dev/project/down-to-zero-cloud.html</guid>
      <description>&lt;p&gt;As the creator of Down to Zero, I designed this product for businesses and organizations deeply conscious of their environmental impact and committed to sustainable practices. Down to Zero offers reliable, scalable, and cost-effective cloud solutions specifically aimed at minimizing carbon footprints. Our key target users include eco-friendly companies, startups focused on sustainability, and enterprises looking to reduce energy consumption in their IT operations. Additionally, businesses seeking secure and customizable cloud infrastructure with dedicated support will find immense value in our services.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
