<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
    <title>codethoughts.io</title>
    <subtitle>Codethoughts is a place where I share my thoughts, experiences, and learnings from my journey as a Engineering Leader, Solo Founder, and Software Engineer. I write about engineering leadership, development and architecture (both high and low-level), and personal growth. I hope you find something useful here!</subtitle>
    <link rel="self" type="application/atom+xml" href="/atom.xml"/>
    <link rel="alternate" type="text/html" href="/"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2026-02-22T00:00:00+00:00</updated>
    <id>/atom.xml</id>
    <entry xml:lang="en">
        <title>The perversion of AI discourse</title>
        <published>2026-02-22T00:00:00+00:00</published>
        <updated>2026-02-22T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Christian Kjær
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="/posts/2026-02-22-the-perversion-of-ai-discourse/"/>
        <id>/posts/2026-02-22-the-perversion-of-ai-discourse/</id>
        
        <summary type="html">&lt;p&gt;I&#x27;ve been thinking lately on what bothers me about how AI is being discussed and why the performative nature of the people in the space bothers me so much (amongst other things).&lt;&#x2F;p&gt;
&lt;p&gt;Over-hype for me has always soured the value of the tech being talked about. It didn&#x27;t matter much to me when it was about web3&#x2F;crypto, since I simply didn&#x27;t care about the tech itself.&lt;&#x2F;p&gt;
&lt;p&gt;For AI though, I feel different. It has quite substantial real-world applications and already brings quite a lot of value, but the overhype is causing the problems and deficiencies of the tech to be overlooked.&lt;&#x2F;p&gt;
&lt;p&gt;We would all benefit from being able to talk honestly and openly about AI, and I think the first step is identifying what is ruining the discourse.&lt;&#x2F;p&gt;
</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Hot Reloading in Rust? Subsecond and Dioxus to the rescue!</title>
        <published>2026-02-07T00:00:00+00:00</published>
        <updated>2026-02-07T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Christian Kjær
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="/posts/2026-02-07-rust-hot-reloading/"/>
        <id>/posts/2026-02-07-rust-hot-reloading/</id>
        
        <summary type="html">&lt;p&gt;I recently set out to finally get hot reloading working for my Rust GraphQL API, after getting annoyed by the usual &lt;code&gt;cargo watch&lt;&#x2F;code&gt; flow, which would kill my server in between code changes and it finishing the rebuild + setup.&lt;&#x2F;p&gt;
&lt;p&gt;I had previously played around with &lt;a rel=&quot;noopener nofollow noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;crates.io&#x2F;crates&#x2F;subsecond&quot;&gt;subsecond&lt;&#x2F;a&gt; from &lt;a rel=&quot;noopener nofollow noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;dioxuslabs.com&#x2F;&quot;&gt;Dioxus&lt;&#x2F;a&gt;, while it was still in beta, but hadn&#x27;t had much success. Sometime in August last year (2025), a few improvements got added in &lt;a rel=&quot;noopener nofollow noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;DioxusLabs&#x2F;dioxus&#x2F;pull&#x2F;4588&quot;&gt;PR #4588&lt;&#x2F;a&gt;, namely convenience functions for serving async functions with hot reloading. I did wish their own docs on &lt;a rel=&quot;noopener nofollow noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;dioxuslabs.com&#x2F;learn&#x2F;0.7&#x2F;essentials&#x2F;ui&#x2F;hotreload&#x2F;&quot;&gt;hot reloading&lt;&#x2F;a&gt; would have mentioned it 😮‍💨&lt;&#x2F;p&gt;
&lt;p&gt;So it was time to give it another try!&lt;&#x2F;p&gt;
</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Improved Turso (libsql) ergonomics in Rust</title>
        <published>2024-10-01T00:00:00+00:00</published>
        <updated>2024-10-01T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Christian Kjær
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="/posts/2024-10-01-improved-turso-ergonomics-in-rust/"/>
        <id>/posts/2024-10-01-improved-turso-ergonomics-in-rust/</id>
        
        <summary type="html">&lt;p&gt;I recently started using &lt;a rel=&quot;noopener nofollow noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;turso.tech&quot;&gt;Turso&lt;&#x2F;a&gt;, which is a great database option for serverless as well as to keep costs low. Its pricing is more than competitive with something like &lt;a rel=&quot;noopener nofollow noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;aws.amazon.com&#x2F;dynamodb&#x2F;pricing&#x2F;on-demand&#x2F;&quot;&gt;AWS DynamoDB&lt;&#x2F;a&gt;, which is quite interesting as a alternative to it.&lt;&#x2F;p&gt;
&lt;p&gt;One problem though, there&#x27;s no support by any good ORMs or similar in the Rust ecosystem for &lt;a rel=&quot;noopener nofollow noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;turso.tech&quot;&gt;Turso&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Instead, I was currently writing something like this, just to get a &lt;code&gt;User&lt;&#x2F;code&gt; out from the database via their session:&lt;&#x2F;p&gt;
</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Structuring your Engineering Organization</title>
        <published>2024-08-05T00:00:00+00:00</published>
        <updated>2024-08-05T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Christian Kjær
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="/posts/2024-08-05-structuring-your-engineering-organization/"/>
        <id>/posts/2024-08-05-structuring-your-engineering-organization/</id>
        
        <summary type="html">&lt;p&gt;From a couple of founders, to a small team, to being a “small startup”, moving into scale-up territory, and finally transitioning beyond, there are many changes your organization will go through.&lt;&#x2F;p&gt;
&lt;p&gt;But what should you aim for as you grow and need to delegate your responsibilities and you transition from a couple of founders, into a company of 300 or more?&lt;&#x2F;p&gt;
&lt;p&gt;Throughout my career I’ve seen many structures at different scales, and have thought a lot about the ideal structure I would land on for a Engineering company that develops Products (e.g. a SaaS company).&lt;&#x2F;p&gt;
&lt;p&gt;I’ll warn you though: This will be opinionated, but I do believe that there is a strong reasoning behind the structure I’ve ended up at—let&#x27;s dive in!&lt;&#x2F;p&gt;
</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Redirecting URLs with CloudFlare</title>
        <published>2024-07-31T00:00:00+00:00</published>
        <updated>2024-07-31T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Christian Kjær
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="/posts/2024-07-31-redirecting-urls-with-cloudflare/"/>
        <id>/posts/2024-07-31-redirecting-urls-with-cloudflare/</id>
        
        <summary type="html">&lt;p&gt;I recently moved my blog from &lt;a rel=&quot;noopener nofollow noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;codetalk.io&quot;&gt;https:&#x2F;&#x2F;codetalk.io&lt;&#x2F;a&gt; (now my commercial site) to &lt;a rel=&quot;noopener nofollow noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;codethoughts.io&quot;&gt;https:&#x2F;&#x2F;codethoughts.io&lt;&#x2F;a&gt;. This of course also meant, that everything linking to my old blog was now broken, which is not the best experience for any readers that I might have 😅&lt;&#x2F;p&gt;
&lt;p&gt;Initially I considered setting up rewrite rules somewhere for each individual post, but then thought of a much smarter way, using CloudFlare’s &lt;em&gt;Redirect Rules&lt;&#x2F;em&gt;, to instead redirect all direct links to posts and throw them to the new location on codethoughts.io.&lt;&#x2F;p&gt;
&lt;p&gt;The documentation for these rules are a bit sparse, so I thought I’d share how I did. First though, let’s set some context:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;The base domain changed from &lt;a rel=&quot;noopener nofollow noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;codetalk.io&quot;&gt;https:&#x2F;&#x2F;codetalk.io&lt;&#x2F;a&gt; —&amp;gt; &lt;a rel=&quot;noopener nofollow noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;codethoughts.io&quot;&gt;https:&#x2F;&#x2F;codethoughts.io&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;All posts live under the &lt;code&gt;&#x2F;posts&#x2F;&lt;&#x2F;code&gt; path on the domain&lt;&#x2F;li&gt;
&lt;li&gt;All post slugs are identical in dates and names&lt;&#x2F;li&gt;
&lt;li&gt;We no longer have a &lt;code&gt;.html&lt;&#x2F;code&gt; ending on the new blog (i.e. what previously might have been &lt;code&gt;https:&#x2F;&#x2F;codetalk.io&#x2F;posts&#x2F;a-blog-post.html&lt;&#x2F;code&gt; would now be &lt;code&gt;https:&#x2F;&#x2F;codetalk.io&#x2F;posts&#x2F;a-blog-post&#x2F;&lt;&#x2F;code&gt;)&lt;&#x2F;li&gt;
&lt;li&gt;We’re on the free CloudFlare plan, so there’s a limit to which expressions we can use&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Static SPAs: Exploration of Leptos, Dioxus, and Next.js</title>
        <published>2024-07-05T00:00:00+00:00</published>
        <updated>2024-07-05T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Christian Kjær
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="/posts/2024-07-05-static-spas-exploration-of-leptos-dioxus-and-nextjs/"/>
        <id>/posts/2024-07-05-static-spas-exploration-of-leptos-dioxus-and-nextjs/</id>
        
        <summary type="html">&lt;p&gt;One of my absolute favorite methods of deploying Frontends is to pre-generate all routes statically, and then let each route load the dependencies they need for interactivity.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Load times are fast&lt;&#x2F;li&gt;
&lt;li&gt;The user only downloads what they need (great for slower or mobile networks)&lt;&#x2F;li&gt;
&lt;li&gt;SEO is great in many cases, and okay in others&lt;&#x2F;li&gt;
&lt;li&gt;It can all still be deployed in the most optimal way which is CDN + Static Assets&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;I particularly care a lot about infrastructure scalability, maintainability, robustness, and cost. SSR typically makes each of these significantly worse compared to simply serving static files. I also don’t believe mixing your API into your Frontend code (i.e. &lt;a rel=&quot;noopener nofollow noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;nextjs.org&#x2F;docs&#x2F;app&#x2F;building-your-application&#x2F;data-fetching&#x2F;server-actions-and-mutations&quot;&gt;Server Actions&lt;&#x2F;a&gt;) will do you any favors when you start scaling up your teams, but that’s a topic for another day.&lt;&#x2F;p&gt;
&lt;p&gt;In this post we&#x27;ll explore how this can be setup and compare a couple of different frameworks. Let&#x27;s start with the overall results before we dive into the details:&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Framework&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;SSG Support&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;Hydration Support&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;Assets Chunking&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Next.js&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;✅&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;✅&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;✅ Chunk per page&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Leptos&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;✅&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;✅&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;❌ One single WASM bundle*&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Dioxus&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;✅**&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;✅&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;❌ One single WASM bundle*&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>How I structure work as a Solo Founder</title>
        <published>2024-06-26T00:00:00+00:00</published>
        <updated>2024-06-26T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Christian Kjær
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="/posts/2024-06-26-how-i-structure-my-work-as-a-solor-founder/"/>
        <id>/posts/2024-06-26-how-i-structure-my-work-as-a-solor-founder/</id>
        
        <summary type="html">&lt;p&gt;This is for sure something that will keep evolving over time, but I got inspired by &lt;a rel=&quot;noopener nofollow noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;news.ycombinator.com&#x2F;item?id=40742831&quot;&gt;this Hacker News post&lt;&#x2F;a&gt; to share in more detail how I organize myself and my work (you can see my short answer &lt;a rel=&quot;noopener nofollow noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;news.ycombinator.com&#x2F;item?id=40743669&quot;&gt;here&lt;&#x2F;a&gt;).&lt;&#x2F;p&gt;
&lt;p&gt;The question posed is great, so let’s start from there:&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;When working with a team, I&#x27;ve found that Scrum-like short-term goals and organized task backlogs really help keep me focused and on track with the work I have to do. For solo development, however, I&#x27;ve never really found any approach that sticks and often end up getting sidetracked and losing track of my objectives.&lt;&#x2F;p&gt;
&lt;p&gt;So my question to all of you is, what tools and techniques have you used to ensure you stick to your objectives?&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;You could rephrase this slightly to: How do I run &lt;em&gt;my own&lt;&#x2F;em&gt; project management?&lt;&#x2F;p&gt;
&lt;p&gt;For most Engineers, this is not actually something they’ve needed to do often, especially if working in larger corporations. The people that have worked at Startups are a mixed bag, where some learn the value of structure, and others managed to get by without since the fast-paced environment changes things around all the time anyways.&lt;&#x2F;p&gt;
&lt;p&gt;I’ve personally landed in the camp of: &lt;strong&gt;Structure is valuable, even crucial, but it should never get in my way. Best of both worlds sorta.&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Mobile: A different way using Rust?</title>
        <published>2024-06-25T00:00:00+00:00</published>
        <updated>2024-06-25T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Christian Kjær
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="/posts/2024-06-25-mobile-a-different-way/"/>
        <id>/posts/2024-06-25-mobile-a-different-way/</id>
        
        <summary type="html">&lt;aside class=&quot;mt-4 p-4 bg-aside&quot;&gt;
  💡
  &lt;p&gt;&lt;strong&gt;2026 update:&lt;&#x2F;strong&gt; These days I would highly recommend using &lt;a rel=&quot;noopener nofollow noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;docs.expo.dev&#x2F;workflow&#x2F;overview&#x2F;&quot;&gt;Expo + React Native&lt;&#x2F;a&gt; for Mobile + Web development, if Mobile is a core platform for you. There have been some amazing developments in the ecosystem, especiallt from &lt;a rel=&quot;noopener nofollow noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;expo.dev&#x2F;changelog&#x2F;sdk-55-beta&quot;&gt;Expo v55&lt;&#x2F;a&gt; and onwards.&lt;&#x2F;p&gt;

&lt;&#x2F;aside&gt;
&lt;p&gt;After having spent the better part of two months deep in the trenches of iOS development with Swift, I can comfortably say: Web Development simply is more mature.&lt;&#x2F;p&gt;
&lt;p&gt;Let’s just run over a few things I ran into that’s bad, broken, or made for a poor experience:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;A lot of issues with data handling in general
&lt;ul&gt;
&lt;li&gt;Turning iCloud on when using SwiftData will restrict core functionality such as the ability to have unique IDs on your data, meaning everyone now has to handle duplicates&lt;&#x2F;li&gt;
&lt;li&gt;iCloud (CloudKit) and data migrations don&#x27;t work really work, it just won’t run it making data changes in your models quite the chore&lt;&#x2F;li&gt;
&lt;li&gt;SwiftData generally has very bad performance, both in reads, writes, and inserts&lt;&#x2F;li&gt;
&lt;li&gt;It’s quite hard to control memorization and rendering performance (e.g. &lt;code&gt;@Query&lt;&#x2F;code&gt; in your &lt;code&gt;View&lt;&#x2F;code&gt;)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Swift itself is a bit of an &lt;em&gt;eh&lt;&#x2F;em&gt; language - it has many good parts and ergonomics, but also some weird design choices that make scaling codebases messy such as everything by default living in the global namespace and file names can’t clash&lt;&#x2F;li&gt;
&lt;li&gt;SwiftUI is generally great, except when you want to do anything non-standard, in which case you’ll quickly feel the pain&lt;&#x2F;li&gt;
&lt;li&gt;The feedback loop is slow: If you can run things in the Preview that’s the fastest, otherwise it’s a full Compile→Run→Simulator loop&lt;&#x2F;li&gt;
&lt;li&gt;UI performance issues are very easy to sneak in, and very hard to track down&lt;&#x2F;li&gt;
&lt;li&gt;Apple’s frameworks sure do have a lot of bugs and you’ll commonly see stuff being broken almost permanently&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Admittedly, these might be trivial gripes for someone that has spent years in the Mobile ecosystem, but they certainly didn’t make me fall in love with it. More importantly, it wasn’t really providing a great user experience either.&lt;&#x2F;p&gt;
&lt;p&gt;….so what’s the alternative?&lt;&#x2F;p&gt;
</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Setting up UniFFI for iOS, Simulators, and watchOS</title>
        <published>2024-06-24T00:00:00+00:00</published>
        <updated>2024-06-24T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Christian Kjær
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="/posts/2024-06-24-setting-up-uniffi-for-ios-simulators-and-watchos/"/>
        <id>/posts/2024-06-24-setting-up-uniffi-for-ios-simulators-and-watchos/</id>
        
        <summary type="html">&lt;p&gt;This is a part of the post &lt;a href=&quot;&#x2F;posts&#x2F;2024-06-25-mobile-a-different-way&#x2F;&quot;&gt;Mobile: A different way using Rust?&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;There are some great resources out there on UniFFI already such as &lt;a rel=&quot;noopener nofollow noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;forgen.tech&#x2F;en&#x2F;blog&#x2F;post&#x2F;building-an-ios-app-with-rust-using-uniffi&quot;&gt;this post&lt;&#x2F;a&gt;, but it doesn’t cover watchOS, so let’s take a quick tour through what I’ve set up in the example repository &lt;a rel=&quot;noopener nofollow noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;Tehnix&#x2F;template-mobile-wasm&quot;&gt;https:&#x2F;&#x2F;github.com&#x2F;Tehnix&#x2F;template-mobile-wasm&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;We&#x27;ve set up four crates:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;appy&lt;&#x2F;code&gt;: Our Leptos App, Capacitor, and the XCode project&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;capacitor-rs&lt;&#x2F;code&gt;: Bridging code between the Capacitor JS library and our Rust code&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;shared&lt;&#x2F;code&gt;: Our shared code that we might use in &lt;code&gt;appy&lt;&#x2F;code&gt;, and also want to expose in Swift to use in our Widgets or watchOS App&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;mobile&lt;&#x2F;code&gt;: Where we will generate the Swift bindings from via UniFFI, reexporting everything from &lt;code&gt;shared&lt;&#x2F;code&gt; that’s made available to UniFFI via the macros&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;I won’t go over the details to get these to play nicely with Cargo and Workspaces, check out the repository for that. Let’s instead focus on a simplified version of what &lt;code&gt;mobile&lt;&#x2F;code&gt; does (the rest assumes you’re in the &lt;code&gt;mobile&#x2F;&lt;&#x2F;code&gt; directory).&lt;&#x2F;p&gt;
</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Using Capacitor Plugins from Rust&#x2F;WASM</title>
        <published>2024-06-24T00:00:00+00:00</published>
        <updated>2024-06-24T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Christian Kjær
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="/posts/2024-06-24-using-capacitor-plugins-from-rust-wasm/"/>
        <id>/posts/2024-06-24-using-capacitor-plugins-from-rust-wasm/</id>
        
        <summary type="html">&lt;p&gt;This is a part of the post &lt;a href=&quot;&#x2F;posts&#x2F;2024-06-25-mobile-a-different-way&#x2F;&quot;&gt;Mobile: A different way using Rust?&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Capacitor is normally used in combination with JavaScript projects, so there is little help available if you want to use it in a Rust&#x2F;WASM project. Worry not! That&#x27;s exactly what we&#x27;ll take a look at in this post.&lt;&#x2F;p&gt;
&lt;p&gt;Since Capacitor is a JS framework there will be a little extra work involved in interacting with any plugins, but it’s honestly not a lot we need to do. Let’s take a quick tour through what I’ve set up in the example repository &lt;a rel=&quot;noopener nofollow noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;Tehnix&#x2F;template-mobile-wasm&quot;&gt;https:&#x2F;&#x2F;github.com&#x2F;Tehnix&#x2F;template-mobile-wasm&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>The Stack Part 4: A Federated GraphQL API</title>
        <published>2024-03-10T00:00:00+00:00</published>
        <updated>2024-03-10T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Christian Kjær
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="/drafts/2023-10-17-the-stack-part-4/"/>
        <id>/drafts/2023-10-17-the-stack-part-4/</id>
        
        <summary type="html">&lt;p&gt;In &lt;a href=&quot;&#x2F;posts&#x2F;2023-10-08-the-stack-part-2&#x2F;&quot;&gt;the last post&lt;&#x2F;a&gt; we built up two Frontend Apps, one using Next.js and another using Leptos (Rust&#x2F;WASM). In this post we will be building an API that our Apps can talk to. See the full overview of posts &lt;a href=&quot;&#x2F;posts&#x2F;2023-01-29-the-stack&#x2F;#what-will-we-be-covering&quot;&gt;here&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;At the end of this post we will have:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;A Federated GraphQL API using &lt;a rel=&quot;noopener nofollow noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.apollographql.com&#x2F;docs&#x2F;federation&#x2F;&quot;&gt;Apollo Federation v2&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;A supergraph, using &lt;a rel=&quot;noopener nofollow noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.apollographql.com&#x2F;docs&#x2F;router&#x2F;&quot;&gt;Apollo Router&lt;&#x2F;a&gt;, composing our services into a single GraphQL API.&lt;&#x2F;li&gt;
&lt;li&gt;Three small &lt;a rel=&quot;noopener nofollow noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;async-graphql&#x2F;async-graphql&quot;&gt;Rust-based GraphQL&lt;&#x2F;a&gt; Subgraphs.&lt;&#x2F;li&gt;
&lt;li&gt;Automatic deployment of our services to AWS Lambda.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;There is quite a lot to cover. My recommendation is to clone down the Part 4 branch in the &lt;a rel=&quot;noopener nofollow noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;codetalkio&#x2F;the-stack&#x2F;tree&#x2F;part-4-api&quot;&gt;GitHub repository&lt;&#x2F;a&gt; and use this post as an explanation of what is set up.&lt;&#x2F;p&gt;
</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Component overview</title>
        <published>2023-11-29T00:00:00+00:00</published>
        <updated>2023-11-29T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Christian Kjær
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="/drafts/component-overview/"/>
        <id>/drafts/component-overview/</id>
        
        <summary type="html">&lt;p&gt;Generated Table of Contents by inserting a &lt;code&gt;{{ toc() }}&lt;&#x2F;code&gt; shortcode with a depth of 3:&lt;&#x2F;p&gt;
&lt;!-- toc --&gt;
&lt;p&gt;This shortcode actually just inserts &lt;code&gt;&amp;lt;!-- toc --&amp;gt;&lt;&#x2F;code&gt; which gets replaced by running the &lt;code&gt;preprocess_post(resource=page)&lt;&#x2F;code&gt; macro on it, which calls &lt;code&gt;generate_toc(toc, level, depth)&lt;&#x2F;code&gt; under-the-hood.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;summary&quot;&gt;&lt;a href=&quot;#summary&quot; aria-label=&quot;Anchor link for: summary&quot;&gt;Summary&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Mark the summary cutoff point by placing &lt;code&gt;&amp;lt;div&amp;gt;&amp;lt;&#x2F;div&amp;gt;&amp;lt;!-- more --&amp;gt;&lt;&#x2F;code&gt; at the desired location.&lt;&#x2F;p&gt;
</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>The Stack Part 3: Building a Frontend</title>
        <published>2023-10-16T00:00:00+00:00</published>
        <updated>2023-10-16T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Christian Kjær
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="/posts/2023-10-16-the-stack-part-3/"/>
        <id>/posts/2023-10-16-the-stack-part-3/</id>
        
        <summary type="html">&lt;p&gt;In &lt;a href=&quot;&#x2F;posts&#x2F;2023-10-08-the-stack-part-2&#x2F;&quot;&gt;the last post&lt;&#x2F;a&gt; we set up our deployment, fully automated on merge to our &lt;code&gt;main&lt;&#x2F;code&gt; branch. In this post we will be building our UI (Frontend) applications. See the full overview of posts &lt;a href=&quot;&#x2F;posts&#x2F;2023-01-29-the-stack&#x2F;#what-will-we-be-covering&quot;&gt;here&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;At the end of this post we will have:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;A &lt;a rel=&quot;noopener nofollow noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;nextjs.org&#x2F;&quot;&gt;Next.js&lt;&#x2F;a&gt; Frontend app with support for localization, using Tailwind CSS.&lt;&#x2F;li&gt;
&lt;li&gt;A &lt;a rel=&quot;noopener nofollow noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;leptos-rs&#x2F;leptos&quot;&gt;Leptos&lt;&#x2F;a&gt; Rust&#x2F;WASM Frontend app with support for localization, using Tailwind CSS.&lt;&#x2F;li&gt;
&lt;li&gt;Automatic deployment of our Apps AWS using CDK, statically hosted using S3 + CloudFront.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;We are essentially hedging our bets by building both a JavaScript-based Frontend, which is the safe bet, and a Rust&#x2F;WASM-based Frontend, which is the future bet. We will be using the same GraphQL API for both, so we can easily switch between them.&lt;&#x2F;p&gt;
&lt;p&gt;There is quite a lot to cover. My recommendation is to clone down the Part 3 branch in the &lt;a rel=&quot;noopener nofollow noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;codetalkio&#x2F;the-stack&#x2F;tree&#x2F;part-3-frontend&quot;&gt;GitHub repository&lt;&#x2F;a&gt; and use this post as an explanation of what is set up.&lt;&#x2F;p&gt;
</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>The Stack Part 2: Automating Deployments via CI</title>
        <published>2023-10-08T00:00:00+00:00</published>
        <updated>2023-10-08T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Christian Kjær
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="/posts/2023-10-08-the-stack-part-2/"/>
        <id>/posts/2023-10-08-the-stack-part-2/</id>
        
        <summary type="html">&lt;p&gt;In &lt;a href=&quot;&#x2F;posts&#x2F;2023-10-07-the-stack-part-1&#x2F;&quot;&gt;the last post&lt;&#x2F;a&gt; we created our Control Tower structure with all of our AWS Accounts in it. In this post we will be automating our deployment process for each of these environments. See the full overview of posts &lt;a href=&quot;&#x2F;posts&#x2F;2023-01-29-the-stack&#x2F;#what-will-we-be-covering&quot;&gt;here&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;At the end of this post we will have:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;A workflow for bootstrapping our AWS Accounts for CDK (&lt;a rel=&quot;noopener nofollow noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;codetalkio&#x2F;the-stack&#x2F;blob&#x2F;part-2-automatic-deployments&#x2F;.github&#x2F;workflows&#x2F;cd-bootstrap.yml&quot;&gt;see here&lt;&#x2F;a&gt;).&lt;&#x2F;li&gt;
&lt;li&gt;A workflow for deploying our CDK stacks, including synthesizing and testing before (&lt;a rel=&quot;noopener nofollow noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;codetalkio&#x2F;the-stack&#x2F;blob&#x2F;part-2-automatic-deployments&#x2F;.github&#x2F;workflows&#x2F;cd-deploy.yml&quot;&gt;see here&lt;&#x2F;a&gt;).&lt;&#x2F;li&gt;
&lt;li&gt;Set up automatic staggered deployments when changes are merged to our &lt;code&gt;main&lt;&#x2F;code&gt; branch.&lt;&#x2F;li&gt;
&lt;li&gt;And fallback to manual deployments if we need to.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;If you want to jump straight to the code, you can find it in the &lt;a rel=&quot;noopener nofollow noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;codetalkio&#x2F;the-stack&#x2F;tree&#x2F;part-2-automatic-deployments&quot;&gt;GitHub repository&lt;&#x2F;a&gt; which links directly to the Part 2 branch.&lt;&#x2F;p&gt;
&lt;p&gt;Otherwise, let&#x27;s jump in!&lt;&#x2F;p&gt;
</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>The Stack Part 1: Setting up your AWS Account Structure</title>
        <published>2023-10-07T00:00:00+00:00</published>
        <updated>2023-10-07T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Christian Kjær
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="/posts/2023-10-07-the-stack-part-1/"/>
        <id>/posts/2023-10-07-the-stack-part-1/</id>
        
        <summary type="html">&lt;p&gt;In &lt;a href=&quot;&#x2F;posts&#x2F;2023-01-29-the-stack&#x2F;&quot;&gt;the last post&lt;&#x2F;a&gt; we went over the overall goals of &amp;quot;The Stack&amp;quot; and what we will be building. In this post we&#x27;ll be setting up our AWS Account structure. See the full overview of posts &lt;a href=&quot;&#x2F;posts&#x2F;2023-01-29-the-stack&#x2F;#what-will-we-be-covering&quot;&gt;here&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;!-- toc --&gt;
&lt;p&gt;As a reminder, here is the structure we are aiming for:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Control Tower&lt;&#x2F;strong&gt;: This is your central place to control access and policies for all accounts in your organization&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Production Multi-tenant&lt;&#x2F;strong&gt;: Your primary production account for multi-tenant setup, and most likely were the majority of users will be&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Production Single-tenant&lt;&#x2F;strong&gt;: While desirable to avoid the operation overhead for single-tenant setups, its good to think in this from the get-go&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Integration Test&lt;&#x2F;strong&gt;: This will be the account that IaC deployments get tested on to ensure rollout works&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Preview&lt;&#x2F;strong&gt;: This will be used to spin up Preview Environments later on&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Individual Developer&lt;&#x2F;strong&gt;: Individual developer accounts to allow easy testing of IaC testing and exploration&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Monitoring&lt;&#x2F;strong&gt;: Centralize monitoring and observability into one account, allowing access to insights without access to sensitive logs or infrastructure from the other accounts&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Logs&lt;&#x2F;strong&gt;: Centralized storage of logs, which may require different access considerations than metrics and traces&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>&quot;The Stack&quot;: Everything you&#x27;ll need</title>
        <published>2023-01-29T00:00:00+00:00</published>
        <updated>2023-01-29T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Christian Kjær
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="/posts/2023-01-29-the-stack/"/>
        <id>/posts/2023-01-29-the-stack/</id>
        
        <summary type="html">&lt;p&gt;This will be a series of blog posts where we will build up the perfect infrastructure setup for the majority of usecase, aka &amp;quot;The Stack&amp;quot;. We&#x27;ll be building everything on top of AWS.&lt;&#x2F;p&gt;
&lt;p&gt;Before diving in, let&#x27;s first establish some goals:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Performant&lt;&#x2F;strong&gt;: Latency and performance is important as this will serve end-users.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Low cost&lt;&#x2F;strong&gt;: We want our base cost to be low, and our costs to scale well with high traffic. Ideally, it should cost nothing if no users are using it.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Low operational overhead&lt;&#x2F;strong&gt;: It&#x27;s &amp;gt;=2023, nobody wants to nurse servers or services anymore, things should scale up and down without intervention or oversight.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;High flexibility&lt;&#x2F;strong&gt;: Everything should be built with the foresight of future scalability, both organizationally, code-wise, and in the way things fit together.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Modular&lt;&#x2F;strong&gt;: Pieces of the infrastructure should be opt-out, e.g. if you don&#x27;t need Pub&#x2F;Sub, it can be skipped.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Obviously, this is my personal opinion on it, but I&#x27;ll be sharing the thinking behind each of the choices as we go along.&lt;&#x2F;p&gt;
&lt;p&gt;Some technology choices upfront:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Everything will be infrastructure as code using &lt;a rel=&quot;noopener nofollow noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;aws&#x2F;aws-cdk&quot;&gt;AWS CDK&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;We&#x27;ll be using &lt;a rel=&quot;noopener nofollow noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.rust-lang.org&quot;&gt;Rust&lt;&#x2F;a&gt; throughout for each service, as it allows us to squeeze out the most performance while still giving us a nice developer experience.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener nofollow noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.apollographql.com&#x2F;docs&#x2F;federation&#x2F;&quot;&gt;Federated GraphQL&lt;&#x2F;a&gt; will be our way of facilitating microservices.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>API Migration &amp; Modernization: Getting Creative</title>
        <published>2022-01-01T00:00:00+00:00</published>
        <updated>2022-01-01T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Christian Kjær
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="/drafts/2022-01-01-api-migration-and-modernization/"/>
        <id>/drafts/2022-01-01-api-migration-and-modernization/</id>
        
        <content type="html" xml:base="/drafts/2022-01-01-api-migration-and-modernization/">&lt;p&gt;What are the motivations?&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Modernizing Frontend, getting rid of legacy complexity (redux, reducers, epics, selectors, etc)&lt;&#x2F;li&gt;
&lt;li&gt;Sunsetting legacy REST API to move towards GraphQL API&lt;&#x2F;li&gt;
&lt;li&gt;Handling older clients still using your legacy API&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Your AWS Bill Tells a Story</title>
        <published>2022-01-01T00:00:00+00:00</published>
        <updated>2022-01-01T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Christian Kjær
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="/drafts/2022-01-01-your-aws-bill-tells-a-story/"/>
        <id>/drafts/2022-01-01-your-aws-bill-tells-a-story/</id>
        
        <content type="html" xml:base="/drafts/2022-01-01-your-aws-bill-tells-a-story/">&lt;p&gt;What are we looking for?&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Scalability&lt;&#x2F;li&gt;
&lt;li&gt;Inefficiencies&lt;&#x2F;li&gt;
&lt;li&gt;Changes (are they expected or surprising?)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;How do we do it?&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Go to the AWS Bill breakdown&lt;&#x2F;li&gt;
&lt;li&gt;Compare each post to the previous month&lt;&#x2F;li&gt;
&lt;li&gt;Spot anything you cannot answer&lt;&#x2F;li&gt;
&lt;li&gt;Create actions based on this&lt;&#x2F;li&gt;
&lt;li&gt;Monthly review&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>&quot;The Stack&quot;: Everything you&#x27;ll need</title>
        <published>2022-01-01T00:00:00+00:00</published>
        <updated>2022-01-01T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Christian Kjær
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="/drafts/2023-01-01-the-stack/"/>
        <id>/drafts/2023-01-01-the-stack/</id>
        
        <content type="html" xml:base="/drafts/2023-01-01-the-stack/">&lt;h1 id=&quot;governance-and-setup&quot;&gt;&lt;a href=&quot;#governance-and-setup&quot; aria-label=&quot;Anchor link for: governance-and-setup&quot;&gt;Governance and setup&lt;&#x2F;a&gt;&lt;&#x2F;h1&gt;
&lt;p&gt;Goals: Low cost, high flexibility, modular approach to infrastructure pieces.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Mermaid diagram&lt;&#x2F;li&gt;
&lt;li&gt;Control Tower and audit trail&lt;&#x2F;li&gt;
&lt;li&gt;Billing alerts and tags&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h1 id=&quot;deployment-and-ci&quot;&gt;&lt;a href=&quot;#deployment-and-ci&quot; aria-label=&quot;Anchor link for: deployment-and-ci&quot;&gt;Deployment and CI&lt;&#x2F;a&gt;&lt;&#x2F;h1&gt;
&lt;ul&gt;
&lt;li&gt;AWS CDK
&lt;ul&gt;
&lt;li&gt;Speed up https:&#x2F;&#x2F;pgrzesik.com&#x2F;posts&#x2F;speed-up-cdk-deploments&#x2F;&lt;&#x2F;li&gt;
&lt;li&gt;CDK Watch https:&#x2F;&#x2F;aws.amazon.com&#x2F;blogs&#x2F;developer&#x2F;increasing-development-speed-with-cdk-watch&#x2F;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Deployments
&lt;ul&gt;
&lt;li&gt;Canary environment&lt;&#x2F;li&gt;
&lt;li&gt;Dev environments?&lt;&#x2F;li&gt;
&lt;li&gt;Canary deployment and rollback&lt;&#x2F;li&gt;
&lt;li&gt;Blue&#x2F;green?&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;CI
&lt;ul&gt;
&lt;li&gt;Build&lt;&#x2F;li&gt;
&lt;li&gt;Deploy to integration&lt;&#x2F;li&gt;
&lt;li&gt;Check&lt;&#x2F;li&gt;
&lt;li&gt;Deploy canary to production&lt;&#x2F;li&gt;
&lt;li&gt;Check canary specifically?&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h1 id=&quot;database&quot;&gt;&lt;a href=&quot;#database&quot; aria-label=&quot;Anchor link for: database&quot;&gt;Database&lt;&#x2F;a&gt;&lt;&#x2F;h1&gt;
&lt;ul&gt;
&lt;li&gt;DynamoDB&lt;&#x2F;li&gt;
&lt;li&gt;Aurora Serverless v2?
&lt;ul&gt;
&lt;li&gt;Not fully serverless&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h1 id=&quot;frontend-web-and-mobile&quot;&gt;&lt;a href=&quot;#frontend-web-and-mobile&quot; aria-label=&quot;Anchor link for: frontend-web-and-mobile&quot;&gt;Frontend: Web and Mobile&lt;&#x2F;a&gt;&lt;&#x2F;h1&gt;
&lt;ul&gt;
&lt;li&gt;S3 + CloudFront
&lt;ul&gt;
&lt;li&gt;Tiny Leptos todo app as example&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Mobile build
&lt;ul&gt;
&lt;li&gt;PWA?
&lt;ul&gt;
&lt;li&gt;https:&#x2F;&#x2F;web.dev&#x2F;learn&#x2F;pwa&#x2F;getting-started&#x2F;&lt;&#x2F;li&gt;
&lt;li&gt;https:&#x2F;&#x2F;firt.dev&#x2F;notes&#x2F;pwa-ios&#x2F;&lt;&#x2F;li&gt;
&lt;li&gt;http:&#x2F;&#x2F;pwabuilder.com&lt;&#x2F;li&gt;
&lt;li&gt;Notifications are coming https:&#x2F;&#x2F;webkit.org&#x2F;blog&#x2F;12945&#x2F;meet-web-push&#x2F;&lt;&#x2F;li&gt;
&lt;li&gt;https:&#x2F;&#x2F;medium.com&#x2F;@firt&#x2F;whats-new-on-ios-12-2-for-progressive-web-apps-75c348f8e945&lt;&#x2F;li&gt;
&lt;li&gt;Doesn&#x27;t really seem ideal&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Capacitor?
&lt;ul&gt;
&lt;li&gt;https:&#x2F;&#x2F;capacitorjs.com&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h1 id=&quot;backend-api-and-services&quot;&gt;&lt;a href=&quot;#backend-api-and-services&quot; aria-label=&quot;Anchor link for: backend-api-and-services&quot;&gt;Backend: API and Services&lt;&#x2F;a&gt;&lt;&#x2F;h1&gt;
&lt;ul&gt;
&lt;li&gt;API Gateway + Lambda
&lt;ul&gt;
&lt;li&gt;CloudFront in front for better traffic price&lt;&#x2F;li&gt;
&lt;li&gt;Federated schema + two services&lt;&#x2F;li&gt;
&lt;li&gt;Authentication cached via API Gateway&lt;&#x2F;li&gt;
&lt;li&gt;Pin Router Lambda to versions of Subgraphs for safe deployments&lt;&#x2F;li&gt;
&lt;li&gt;Lambda Pricing
&lt;ul&gt;
&lt;li&gt;$0.20 per 1M requests&lt;&#x2F;li&gt;
&lt;li&gt;$0.0000133334 for every GB-second (1024 MB Memory = $0.0000000167 per 1ms)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;API Gateway Pricing
&lt;ul&gt;
&lt;li&gt;HTTP APIs: $1.11&#x2F;million&lt;&#x2F;li&gt;
&lt;li&gt;REST APIs: $3.50&#x2F;million&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;WAF
&lt;ul&gt;
&lt;li&gt;https:&#x2F;&#x2F;www.wellarchitectedlabs.com&#x2F;security&#x2F;300_labs&#x2F;300_multilayered_api_security_with_cognito_and_waf&#x2F;3_prevent_requests_from_accessing_api_directly&#x2F;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Websockets via API Gateway
&lt;ul&gt;
&lt;li&gt;$1.14 per million messages&lt;&#x2F;li&gt;
&lt;li&gt;$0.285 per million connection minutes&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h1 id=&quot;queues-and-pub-sub&quot;&gt;&lt;a href=&quot;#queues-and-pub-sub&quot; aria-label=&quot;Anchor link for: queues-and-pub-sub&quot;&gt;Queues and Pub&#x2F;Sub&lt;&#x2F;a&gt;&lt;&#x2F;h1&gt;
&lt;ul&gt;
&lt;li&gt;SQS
&lt;ul&gt;
&lt;li&gt;From 1 Million to 100 Billion Requests&#x2F;Month: $0.40&#x2F;million&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;SNS
&lt;ul&gt;
&lt;li&gt;Mobile Push Notifications: $0.50 per 1 million requests&lt;&#x2F;li&gt;
&lt;li&gt;Email&#x2F;Email-JSON: $2.00 per 100,000 notifications&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;SES
&lt;ul&gt;
&lt;li&gt;$0.10&#x2F;1000 emails&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Pub&#x2F;sub setup, SNS vs EventBridge Pipes
&lt;ul&gt;
&lt;li&gt;https:&#x2F;&#x2F;www.altostra.com&#x2F;blog&#x2F;aws-pub-sub&lt;&#x2F;li&gt;
&lt;li&gt;https:&#x2F;&#x2F;aws.amazon.com&#x2F;pub-sub-messaging&#x2F;&lt;&#x2F;li&gt;
&lt;li&gt;DynamoDB Streams into EventBridge
&lt;ul&gt;
&lt;li&gt;https:&#x2F;&#x2F;docs.aws.amazon.com&#x2F;eventbridge&#x2F;latest&#x2F;userguide&#x2F;eb-pipes-dynamodb.html&lt;&#x2F;li&gt;
&lt;li&gt;https:&#x2F;&#x2F;aws.amazon.com&#x2F;eventbridge&#x2F;pipes&#x2F;&lt;&#x2F;li&gt;
&lt;li&gt;$0.40&#x2F;million requests entering a Pipe&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;ETL setup? Fargate? Analytics&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h1 id=&quot;file-and-media-processing&quot;&gt;&lt;a href=&quot;#file-and-media-processing&quot; aria-label=&quot;Anchor link for: file-and-media-processing&quot;&gt;File and Media processing&lt;&#x2F;a&gt;&lt;&#x2F;h1&gt;
&lt;ul&gt;
&lt;li&gt;AWS Elemental MediaConvert
&lt;ul&gt;
&lt;li&gt;https:&#x2F;&#x2F;docs.aws.amazon.com&#x2F;AmazonS3&#x2F;latest&#x2F;userguide&#x2F;tutorial-s3-batchops-lambda-mediaconvert-video.html&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;S3 Intelligent Tiering (objects larger than 1MB)&lt;&#x2F;li&gt;
&lt;li&gt;Image resizing via Lambd@Edge
&lt;ul&gt;
&lt;li&gt;https:&#x2F;&#x2F;aws.amazon.com&#x2F;blogs&#x2F;networking-and-content-delivery&#x2F;resizing-images-with-amazon-cloudfront-lambdaedge-aws-cdn-blog&#x2F;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h1 id=&quot;internal-applications&quot;&gt;&lt;a href=&quot;#internal-applications&quot; aria-label=&quot;Anchor link for: internal-applications&quot;&gt;Internal Applications&lt;&#x2F;a&gt;&lt;&#x2F;h1&gt;
&lt;ul&gt;
&lt;li&gt;Access control? SSO? Cognito?
&lt;ul&gt;
&lt;li&gt;https:&#x2F;&#x2F;aws.amazon.com&#x2F;blogs&#x2F;networking-and-content-delivery&#x2F;authorizationedge-using-cookies-protect-your-amazon-cloudfront-content-from-being-downloaded-by-unauthenticated-users&#x2F;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h1 id=&quot;monitoring-and-observability&quot;&gt;&lt;a href=&quot;#monitoring-and-observability&quot; aria-label=&quot;Anchor link for: monitoring-and-observability&quot;&gt;Monitoring and observability&lt;&#x2F;a&gt;&lt;&#x2F;h1&gt;
&lt;ul&gt;
&lt;li&gt;Xray
&lt;ul&gt;
&lt;li&gt;Cross-account
&lt;ul&gt;
&lt;li&gt;https:&#x2F;&#x2F;docs.aws.amazon.com&#x2F;xray&#x2F;latest&#x2F;devguide&#x2F;xray-console-crossaccount.html&lt;&#x2F;li&gt;
&lt;li&gt;https:&#x2F;&#x2F;aws.amazon.com&#x2F;about-aws&#x2F;whats-new&#x2F;2022&#x2F;11&#x2F;amazon-cloudwatch-cross-account-observability-multiple-aws-accounts&#x2F;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;CloudWatch Dashboards&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h1 id=&quot;local-development&quot;&gt;&lt;a href=&quot;#local-development&quot; aria-label=&quot;Anchor link for: local-development&quot;&gt;Local development&lt;&#x2F;a&gt;&lt;&#x2F;h1&gt;
&lt;ul&gt;
&lt;li&gt;Stitching all the pieces together&lt;&#x2F;li&gt;
&lt;li&gt;Frontend against deployed backend&lt;&#x2F;li&gt;
&lt;li&gt;Frontend against local backend&lt;&#x2F;li&gt;
&lt;li&gt;Backend against deployed database&lt;&#x2F;li&gt;
&lt;li&gt;Backend against local database&lt;&#x2F;li&gt;
&lt;li&gt;SQS locally?&lt;&#x2F;li&gt;
&lt;li&gt;Pub&#x2F;Sub locally?&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h1 id=&quot;pull-request-development&quot;&gt;&lt;a href=&quot;#pull-request-development&quot; aria-label=&quot;Anchor link for: pull-request-development&quot;&gt;Pull Request development&lt;&#x2F;a&gt;&lt;&#x2F;h1&gt;
&lt;ul&gt;
&lt;li&gt;Preview Environments for PRs&lt;&#x2F;li&gt;
&lt;li&gt;Run local Frontend + Backend against Deployed?&lt;&#x2F;li&gt;
&lt;li&gt;SQS and Pub&#x2F;Sub?&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h1 id=&quot;support&quot;&gt;&lt;a href=&quot;#support&quot; aria-label=&quot;Anchor link for: support&quot;&gt;Support&lt;&#x2F;a&gt;&lt;&#x2F;h1&gt;
&lt;ul&gt;
&lt;li&gt;Amazon Connect?
&lt;ul&gt;
&lt;li&gt;https:&#x2F;&#x2F;docs.aws.amazon.com&#x2F;connect&#x2F;latest&#x2F;adminguide&#x2F;tutorial1-create-helpdesk.html&lt;&#x2F;li&gt;
&lt;li&gt;Unlikely to be an ideal solution compared to e.g. Intercom&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Common JSON patterns in Haskell, Rust, and TypeScript</title>
        <published>2020-04-05T00:00:00+00:00</published>
        <updated>2020-04-05T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Christian Kjær
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="/posts/2020-04-05-common-json-patterns-in-haskell-rust-and-javascript/"/>
        <id>/posts/2020-04-05-common-json-patterns-in-haskell-rust-and-javascript/</id>
        
        <summary type="html">&lt;p&gt;A lot of web development is transforming JSON one way or another. In TypeScript&#x2F;JavaScript, this is straightforward, since JSON is built into the language. But can we also achieve good ergonomics in Haskell and Rust?&lt;&#x2F;p&gt;
&lt;p&gt;&lt;em&gt;Dear reader, I am glad you asked! 🙌&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;The comparisons we will see are not meant to show if one approach is better than another. Instead, it is intended to be a reference to become familiar with common patterns across multiple languages. Throughout this post, we will utilize several tools and libraries.&lt;&#x2F;p&gt;
&lt;p&gt;The core of working with JSON in Haskell and Rust is covered by:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;noopener nofollow noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;hackage.haskell.org&#x2F;package&#x2F;aeson&quot;&gt;Aeson&lt;&#x2F;a&gt;: a Haskell JSON serialization&#x2F;deserialization library.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener nofollow noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;serde.rs&quot;&gt;Serde&lt;&#x2F;a&gt;: a Rust JSON serialization&#x2F;deserialization library.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;The ergonomics is then improved in Haskell by grabbing one of the following options:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;noopener nofollow noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;hackage.haskell.org&#x2F;package&#x2F;lens&quot;&gt;Lens&lt;&#x2F;a&gt;: a heavy-weight library to transform and work with records (and much more!).&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener nofollow noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;shayne-fletcher-da&#x2F;ghc-proposals&#x2F;blob&#x2F;record-dot-syntax&#x2F;proposals&#x2F;0000-record-dot-syntax.md&quot;&gt;Record Dot Syntax&lt;&#x2F;a&gt;: an upcoming language extension in Haskell, which &lt;a rel=&quot;noopener nofollow noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;ghc-proposals&#x2F;ghc-proposals&#x2F;pull&#x2F;282#issuecomment-608329102&quot;&gt;recently got accepted&lt;&#x2F;a&gt; by the GHC steering Committee.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;We&#x27;ll go through typical use-cases seen in TypeScript&#x2F;JavaScript codebases, and see how we can achieve the same in Haskell and Rust.&lt;&#x2F;p&gt;
</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Visual Studio Code on iPad</title>
        <published>2020-03-20T00:00:00+00:00</published>
        <updated>2020-03-20T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Christian Kjær
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="/posts/2020-03-20-visual-studio-code-on-ipad/"/>
        <id>/posts/2020-03-20-visual-studio-code-on-ipad/</id>
        
        <summary type="html">&lt;p&gt;With Apple increasing their focus on making the iPad a viable device for work, it is time to revisit using my iPad as a workstation for programming.&lt;&#x2F;p&gt;
&lt;p&gt;I rely heavily on command-line tools and language-specific tools (rust-analyser, node, ghcide, etc.) for my day-to-day programming, and my current setup features:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;noopener nofollow noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;blink.sh&quot;&gt;Blink&lt;&#x2F;a&gt; with mosh to a remote server.&lt;&#x2F;li&gt;
&lt;li&gt;Neovim and &lt;a rel=&quot;noopener nofollow noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;zolrath&#x2F;wemux&quot;&gt;wemux&lt;&#x2F;a&gt; on the remote server.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener nofollow noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;ish.app&quot;&gt;iSH&lt;&#x2F;a&gt; to play around with very simple CLI needs locally on the iPad.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;On my computer, I use Visual Studio Code, and it&#x27;s long been a wish to get that running somehow on my iPad. This is an attempt to make VS Code available on the iPad under the restrictions that we have to deal with.&lt;&#x2F;p&gt;
</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Live Migration of DynamoDB Tables</title>
        <published>2020-03-19T00:00:00+00:00</published>
        <updated>2020-03-19T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Christian Kjær
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="/posts/2020-03-19-live-migration-of-dynamodb-tables/"/>
        <id>/posts/2020-03-19-live-migration-of-dynamodb-tables/</id>
        
        <summary type="html">&lt;p&gt;Recently I was faced with the challenge of having to migrate a set of AWS DynamoDB tables to completely new tables. We wanted to achieve this without affecting any of our users, and without having a maintenance window while migrating data from the old table to the new ones.&lt;&#x2F;p&gt;
&lt;p&gt;The following will be a very high-level overview of how you:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Get all your DynamoDB events onto a queue&lt;&#x2F;li&gt;
&lt;li&gt;Replicate your DynamoDB tables to the new tables (or even a different region)&lt;&#x2F;li&gt;
&lt;li&gt;Continuously synchronize your original tables to your new tables
&lt;ul&gt;
&lt;li&gt;Restart the migration if you made an error&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Complete the switchover after validating everything looks OK&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Mobile Haskell (iOS)</title>
        <published>2018-02-07T00:00:00+00:00</published>
        <updated>2018-02-07T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Christian Kjær
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="/posts/2018-02-07-mobile-haskell/"/>
        <id>/posts/2018-02-07-mobile-haskell/</id>
        
        <summary type="html">&lt;p&gt;A lot of progress has been going on to make Haskell work on mobile natively, instead of e.g. generating JavaScript via GHCJS and using that. Unfortunately, not much documentation exists yet on how to build a project using these tools all together.&lt;&#x2F;p&gt;
&lt;p&gt;This post will be an attempt to piece together the tools and various attempts into a coherent step-by-step guide. We will start by setting up the tools needed, and then build an iOS app that runs in both the simulator and on the device itself (i.e. a x86 build and an arm build).&lt;&#x2F;p&gt;
</summary>
        
    </entry>
    <entry xml:lang="en">
        <title> Using Electron with Haskell</title>
        <published>2016-05-11T00:00:00+00:00</published>
        <updated>2016-05-11T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Christian Kjær
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="/posts/2016-05-11-using-electron-with-haskell/"/>
        <id>/posts/2016-05-11-using-electron-with-haskell/</id>
        
        <summary type="html">&lt;p&gt;&lt;em&gt;If you want to grab the whole code from this post, it can be found at &lt;a rel=&quot;noopener nofollow noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;codetalkio&#x2F;Haskell-Electron-app&quot;&gt;codetalkio&#x2F;Haskell-Electron-app&lt;&#x2F;a&gt;.&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Not much literature exist on using &lt;code&gt;Electron&lt;&#x2F;code&gt; as a GUI tool for Haskell development, so I thought I&#x27;d explore the space a little. Being initially a bit clueless on how &lt;code&gt;Electron&lt;&#x2F;code&gt; would launch the Haskell web server, I was watching &lt;a rel=&quot;noopener nofollow noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;youtu.be&#x2F;mUAu7lcgYWE?t=6m54s&quot;&gt;the Electron meetup talk by Mike Craig from Wagon HG&lt;&#x2F;a&gt; (they use &lt;code&gt;Electron&lt;&#x2F;code&gt; with Haskell) and noticed they actually mention it on the slides:&lt;&#x2F;p&gt;
</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Compiling SCSS and JavaScript in Hakyll</title>
        <published>2016-05-10T00:00:00+00:00</published>
        <updated>2016-05-10T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Christian Kjær
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="/posts/2016-05-10-compiling-scss-and-js-in-hakyll/"/>
        <id>/posts/2016-05-10-compiling-scss-and-js-in-hakyll/</id>
        
        <summary type="html">&lt;p&gt;This seems to be an often asked question, so I thought I&#x27;d try and share the approach that I&#x27;ve arrived at after having explored a couple of solutions to the problem. If you want to see the full code in action, check out the &lt;a rel=&quot;noopener nofollow noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;codetalkio&#x2F;codetalk.io&#x2F;blob&#x2F;v1.0.0&#x2F;site.hs#L9&quot;&gt;repo for the codetalk.io site&lt;&#x2F;a&gt; (linking to v1.0.0 is intended, in case the code changes later on).&lt;&#x2F;p&gt;
</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Briefly on the purpose of Functors, Applicatives and Monads</title>
        <published>2015-11-28T00:00:00+00:00</published>
        <updated>2015-11-28T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Christian Kjær
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="/posts/2015-11-28-briefly-on-the-purpose-of-functors-applicatives-and-monads/"/>
        <id>/posts/2015-11-28-briefly-on-the-purpose-of-functors-applicatives-and-monads/</id>
        
        <summary type="html">&lt;p&gt;In a recent thread on &lt;a rel=&quot;noopener nofollow noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.reddit.com&#x2F;r&#x2F;haskell&#x2F;&quot;&gt;&#x2F;r&#x2F;haskell&lt;&#x2F;a&gt; about how
to &lt;a rel=&quot;noopener nofollow noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.reddit.com&#x2F;r&#x2F;haskell&#x2F;comments&#x2F;3tpom7&#x2F;amp_how_do_you_motivate_this_in_teaching&#x2F;&quot;&gt;motivate the AMP proposal in teaching&lt;&#x2F;a&gt;, I read a comment that finally helped me understand the purpose of &lt;code&gt;Functor&lt;&#x2F;code&gt;s, &lt;code&gt;Applicative&lt;&#x2F;code&gt;s and &lt;code&gt;Monad&lt;&#x2F;code&gt;s.&lt;&#x2F;p&gt;
</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>S3 bucket specific policy</title>
        <published>2015-11-18T00:00:00+00:00</published>
        <updated>2015-11-18T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Christian Kjær
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="/posts/2015-11-18-s3-bucket-specific-policy/"/>
        <id>/posts/2015-11-18-s3-bucket-specific-policy/</id>
        
        <summary type="html">&lt;p&gt;I have recently started caring a bit more about security on my AWS
applications, and to this end Identity &amp;amp; Access Management (IAM) users are a great way to limit access to
a need-to-use-only basis.&lt;&#x2F;p&gt;
&lt;p&gt;Recently I set up my IRC server to download its configuration and install files
from an S3 bucket. This meant that it needed to have read access to a specific
bucket, and for this an IAM role was created.&lt;&#x2F;p&gt;
&lt;p&gt;There are two ways to generate policies:&lt;&#x2F;p&gt;
&lt;!-- toc --&gt;
&lt;p&gt;I will generally advise to either use the generator completely or at least use
it for the basis of the policy you want to create.&lt;&#x2F;p&gt;
</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Setting up UnrealIRCd and Anope IRC Services on EC2</title>
        <published>2015-11-18T00:00:00+00:00</published>
        <updated>2015-11-18T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Christian Kjær
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="/posts/2015-11-18-setting-up-unrealircd-and-anope-on-ec2/"/>
        <id>/posts/2015-11-18-setting-up-unrealircd-and-anope-on-ec2/</id>
        
        <summary type="html">&lt;p&gt;Having recently discovered &lt;a href=&quot;http:&#x2F;&#x2F;sameroom.io&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;sameroom.io&lt;&#x2F;a&gt; I wanted to update the codetalk IRC server to be compliant with their
authentication method. This basically just meant enabling &lt;code&gt;SASL&lt;&#x2F;code&gt; support, but
while I was tinkering with stuff anyways, I thought I might as well streamline
the setup process for the IRC server. In short, everything is fully automated and
set up on AWS using &lt;code&gt;EC2&lt;&#x2F;code&gt; and &lt;code&gt;S3&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;This will go through the process of doing exactly that, by talking about:&lt;&#x2F;p&gt;
</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Irssi notifications on iOS and Android</title>
        <published>2014-09-25T00:00:00+00:00</published>
        <updated>2014-09-25T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Christian Kjær
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="/posts/2014-09-25-irssi-notifications-on-ios-and-android/"/>
        <id>/posts/2014-09-25-irssi-notifications-on-ios-and-android/</id>
        
        <summary type="html">&lt;p&gt;Or really anywhere that &lt;a rel=&quot;noopener nofollow noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;pushover.net&quot;&gt;https:&#x2F;&#x2F;pushover.net&lt;&#x2F;a&gt; supports.&lt;&#x2F;p&gt;
&lt;p&gt;In light of the &lt;a href=&quot;&#x2F;posts&#x2F;2014-09-24-local-notifications-from-irssi-on-a-remote-server&#x2F;&quot;&gt;earlier article&lt;&#x2F;a&gt;, I thought I&#x27;d might as well supercharge my IRC setup. So, now we&#x27;re gonna get some notifications for our mobile devices via pushover.&lt;&#x2F;p&gt;
</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Local notifications from irssi on a remote server</title>
        <published>2014-09-24T00:00:00+00:00</published>
        <updated>2014-09-24T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Christian Kjær
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="/posts/2014-09-24-local-notifications-from-irssi-on-a-remote-server/"/>
        <id>/posts/2014-09-24-local-notifications-from-irssi-on-a-remote-server/</id>
        
        <summary type="html">&lt;p&gt;So, if you&#x27;re like me and like to have your IRC client (in this instance &lt;a rel=&quot;noopener nofollow noreferrer&quot; target=&quot;_blank&quot; href=&quot;http:&#x2F;&#x2F;www.irssi.org&quot;&gt;irssi&lt;&#x2F;a&gt;) running on a server in a &lt;code&gt;tmux&lt;&#x2F;code&gt; or &lt;code&gt;screen&lt;&#x2F;code&gt; session to never miss out on the conversation, you might feel like you&#x27;re missing some of the benefits of running a local IRC client.&lt;&#x2F;p&gt;
&lt;p&gt;In particular, I was missing local notifications when someone would highlight my nickname. I could of course use a bouncer, but hey! it&#x27;s no fun running &lt;code&gt;irssi&lt;&#x2F;code&gt; locally and having to close it for a reboot just as you&#x27;ve gotten it precisely the way you like it 🙂...&lt;&#x2F;p&gt;
&lt;p&gt;So, how does one solve this problem?&lt;&#x2F;p&gt;
</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Deploying with Vagrant</title>
        <published>2014-02-13T00:00:00+00:00</published>
        <updated>2014-02-13T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Christian Kjær
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="/posts/2014-02-13-deploying-with-vagrant/"/>
        <id>/posts/2014-02-13-deploying-with-vagrant/</id>
        
        <summary type="html">&lt;p&gt;&lt;em&gt;UPDATE: I wouldn&#x27;t really recommend this approach anymore! Instead you should look into &lt;a rel=&quot;noopener nofollow noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.docker.com&quot;&gt;Docker&lt;&#x2F;a&gt; for containerization and &lt;a rel=&quot;noopener nofollow noreferrer&quot; target=&quot;_blank&quot; href=&quot;http:&#x2F;&#x2F;docs.haskellstack.org&#x2F;en&#x2F;stable&#x2F;README&#x2F;&quot;&gt;Stack&lt;&#x2F;a&gt; for the Haskell side&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;I recently started looking into ways that I could improve my current deployment workflow. Since my server doesn&#x27;t have much RAM, I currently build the binaries locally in a Virtual Machine (VM from here on out) and then send them to the server using &lt;code&gt;scp&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Although I can&#x27;t do much about the server part (except buying a bigger server), I can do something about what I do locally. I set out to check what possibilities I had, and ended up looking at &lt;a href=&quot;http:&#x2F;&#x2F;www.vagrantup.com&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; title=&quot;Vagrant&quot; alt=&quot;Vagrant&quot;&gt;Vagrant&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
</summary>
        
    </entry>
</feed>
