Browse Source

React vs KMP post

codeskraps 2 months ago
parent
commit
f3728d50a2
37 changed files with 1868 additions and 144 deletions
  1. 1 1
      content/posts/2024/git_ssh_command.md
  2. 1 1
      content/posts/2024/gitignore_not_working.md
  3. 0 0
      content/posts/2024/mvi_architecture.md
  4. 126 0
      content/posts/2024/react_vs_kmp.md
  5. 21 14
      public/index.xml
  6. 204 0
      public/posts/2024/git_ssh_command/index.html
  7. 153 0
      public/posts/2024/gitignore_not_working/index.html
  8. 313 0
      public/posts/2024/mvi_architecture/index.html
  9. 232 0
      public/posts/2024/react_kmp/index.html
  10. 232 0
      public/posts/2024/react_vs_kmp/index.html
  11. 30 12
      public/posts/index.html
  12. 21 14
      public/posts/index.xml
  13. 31 22
      public/sitemap.xml
  14. 19 1
      public/tags/android/index.html
  15. 10 3
      public/tags/android/index.xml
  16. 1 1
      public/tags/architecture/index.html
  17. 2 2
      public/tags/architecture/index.xml
  18. 4 4
      public/tags/git/index.html
  19. 7 7
      public/tags/git/index.xml
  20. 51 17
      public/tags/index.html
  21. 36 22
      public/tags/index.xml
  22. 129 0
      public/tags/ios/index.html
  23. 21 0
      public/tags/ios/index.xml
  24. 19 1
      public/tags/kmp/index.html
  25. 10 3
      public/tags/kmp/index.xml
  26. 19 1
      public/tags/kotlin/index.html
  27. 10 3
      public/tags/kotlin/index.xml
  28. 1 1
      public/tags/mvi/index.html
  29. 2 2
      public/tags/mvi/index.xml
  30. 1 1
      public/tags/mvvm/index.html
  31. 2 2
      public/tags/mvvm/index.xml
  32. 129 0
      public/tags/react-native/index.html
  33. 21 0
      public/tags/react-native/index.xml
  34. 2 2
      public/tags/ssh/index.html
  35. 4 4
      public/tags/ssh/index.xml
  36. 1 1
      public/tags/viewmodel/index.html
  37. 2 2
      public/tags/viewmodel/index.xml

+ 1 - 1
content/posts/git_ssh_command.md → content/posts/2024/git_ssh_command.md

@@ -1,6 +1,6 @@
 +++
 title = 'Configuring SSH Keys for Individual Git Commands'
-date = 2024-10-02T16:56:53+02:00
+date = 2024-04-02T16:56:53+02:00
 tags = ['git', 'ssh']
 draft = false
 +++

+ 1 - 1
content/posts/gitignore_not_working.md → content/posts/2024/gitignore_not_working.md

@@ -1,6 +1,6 @@
 +++
 title = 'When .gitignore Doesnt Seem to Work: A Quick Fix'
-date = 2024-10-02T18:14:23+02:00
+date = 2024-06-02T18:14:23+02:00
 tags = ['git']
 draft = false
 +++

+ 0 - 0
content/posts/mvi_architecture.md → content/posts/2024/mvi_architecture.md


+ 126 - 0
content/posts/2024/react_vs_kmp.md

@@ -0,0 +1,126 @@
++++
+title = 'React Native vs Kotlin Multiplatform'
+date = 2024-10-03T17:16:34+02:00
+tags = ['react-native', 'kotlin', 'kmp', 'android', 'ios']
+draft = false
++++
+## Introduction
+
+In the ever-evolving world of mobile app development, choosing the right cross-platform framework can be a game-changer for businesses and developers alike. Two prominent contenders in this space are React Native and Kotlin Multiplatform (KMP). Both offer unique approaches to the challenge of writing code once and deploying it across multiple platforms. This article will dive deep into the strengths and considerations of each, helping you make an informed decision for your next project.
+<!--more-->
+## Background
+
+### React Native: Meta's JavaScript-Powered Solution
+
+React Native, created by Meta (formerly Facebook), burst onto the scene in 2015. It was born out of the need for faster mobile development without sacrificing the quality of the user experience. React Native is a comprehensive platform that allows developers to use JavaScript and React, a popular web framework, to build mobile applications that feel truly native.
+
+### Kotlin Multiplatform: JetBrains' Kotlin-Based Approach
+
+Kotlin Multiplatform, developed by JetBrains, takes a different approach. Introduced in 2017, KMP is an SDK (Software Development Kit) and an extension of the Kotlin programming language that enables sharing code between different platforms, including iOS, Android, web, and desktop. Unlike React Native, which focuses primarily on mobile, KMP aims to be a comprehensive solution for all platforms.
+
+## Language and Learning Curve
+
+### React Native: JavaScript for the Web Developer
+
+React Native's use of JavaScript as its primary language is a significant advantage for many developers, especially those with a web development background. JavaScript's popularity and the vast ecosystem of tools and libraries make it an accessible choice for beginners and experienced developers alike.
+
+{{< highlight javascript >}}
+import React from 'react';
+import { Text, View } from 'react-native';
+
+const HelloWorldApp = () => {
+  return (
+    <View style={{ flex: 1, justifyContent: "center", alignItems: "center" }}>
+      <Text>Hello, world!</Text>
+    </View>
+  );
+}
+
+export default HelloWorldApp;
+{{< /highlight >}}
+
+This familiarity can lead to faster onboarding and development cycles, particularly for teams already versed in web technologies.
+
+### KMP: Kotlin's Modern Features at Your Fingertips
+
+Kotlin Multiplatform, on the other hand, leverages the power and expressiveness of the Kotlin language. While it may have a steeper learning curve for those not familiar with Kotlin, it offers numerous benefits.
+
+{{< highlight kotlin >}}
+expect class Platform()
+expect fun Platform.name(): String
+
+expect fun hello(): String
+
+fun greet(): String = hello() + " on " + Platform().name()
+
+class Greeting {
+    fun greeting(): String = greet()
+}
+{{< /highlight >}}
+
+These features can lead to more robust, maintainable code, which can be especially beneficial for larger, more complex projects.
+
+## Ecosystem and Libraries
+
+### React Native: A Vast Universe of Packages
+
+React Native benefits from the enormous JavaScript ecosystem. With npm (Node Package Manager) at its disposal, developers have access to hundreds of thousands of packages and libraries. This vast selection means that for almost any functionality you need, there's likely a pre-built solution available.
+
+### KMP: Young but Growing Rapidly
+
+While Kotlin Multiplatform's ecosystem is younger and smaller compared to React Native, it's growing at an impressive rate. The Kotlin community is active and enthusiastic, continuously contributing new libraries and tools.
+
+What's particularly exciting is Google's increasing support for KMP. They're updating core Android libraries like Room to be KMP-compatible, which is a strong sign of the technology's promising future.
+
+## Pros of React Native
+
+1. **Reusable Code**: Write once, run anywhere. React Native allows for significant code reuse between iOS and Android platforms, potentially saving development time and resources.
+
+2. **Performance**: While not quite at native levels, React Native's performance has improved significantly over the years. For many applications, the difference is negligible.
+
+3. **Native UI Components**: React Native uses the platform's standard rendering APIs, resulting in a UI that looks and feels native to each platform.
+
+4. **Hot Reloading**: This feature allows developers to see changes in real-time without recompiling the entire app, significantly speeding up the development process.
+
+5. **Native Code Integration**: When needed, React Native allows easy integration with native code, providing flexibility for performance-critical sections or platform-specific features.
+
+## Pros of Kotlin Multiplatform
+
+1. **Modular Integration**: One of KMP's standout features is its ability to be integrated modularly into existing applications. This means you can start small, perhaps sharing just a few key components between platforms, without having to rewrite your entire app.
+
+2. **Easy Migration Path**: The modular nature of KMP allows for a gradual migration. You can start by moving small, non-UI parts of your app to KMP, then progressively share more code as you become comfortable with the technology.
+
+3. **Single Codebase for Business Logic**: KMP shines in its ability to share business logic across platforms. This can lead to more consistent behavior across different versions of your app and reduce the chances of platform-specific bugs.
+
+4. **Native UI Experience**: Unlike some cross-platform solutions, KMP encourages the use of native UI frameworks for each platform. This results in apps that look and feel completely native, adhering to platform-specific design guidelines.
+
+5. **Native Performance**: Since KMP compiles to native code, it can achieve performance levels very close to fully native applications.
+
+## Conclusion
+
+Both React Native and Kotlin Multiplatform offer compelling solutions for cross-platform development, each with its own strengths and considerations.
+
+React Native, as a comprehensive platform, excels in:
+- Rapid development, especially for teams with web development experience
+- A vast ecosystem of libraries and tools
+- Significant code sharing between platforms
+
+Kotlin Multiplatform, as a flexible SDK, shines in:
+- Gradual adoption and integration with existing native apps
+- Strong typing and modern language features
+- Sharing business logic while maintaining native UIs
+
+The choice between React Native and KMP often comes down to your team's expertise, project requirements, and long-term goals. If you're already building native Android apps with Kotlin, KMP offers an attractive path to sharing code with iOS without compromising on the native experience.
+
+One of the most compelling aspects of Kotlin Multiplatform, particularly for teams already developing on one platform, is its flexibility in code sharing. If you're already building an app for Android, for instance, KMP allows you to leverage that existing codebase and share as much or as little as you want with iOS. This approach doesn't force you to commit to a complete rewrite or to share everything. Instead, you can strategically choose which parts of your codebase to share, be it just the business logic or even portions of the UI.
+
+This flexibility is a game-changer because it allows you to:
+
+1. Gradually introduce cross-platform development into your workflow
+2. Maintain platform-specific optimizations where needed
+3. Reuse complex business logic without sacrificing the native feel of your app
+4. Reduce development time and potential bugs by having a single source of truth for shared components
+
+In essence, KMP's approach recognizes that not all parts of an app need to be or should be shared across platforms. It gives you the power to decide how much code reuse makes sense for your specific project, allowing you to balance development efficiency with platform-specific requirements.
+
+As both technologies continue to evolve, they're likely to shape the future of cross-platform development. Whether you choose React Native as your development platform or Kotlin Multiplatform as your SDK, you're selecting a powerful tool capable of delivering high-quality, cross-platform applications. The key is to assess your project's needs, your team's capabilities, and your long-term goals to make the choice that best aligns with your development strategy.

+ 21 - 14
public/index.xml

@@ -8,7 +8,7 @@
     <language>en-us</language>
     <managingEditor>me@codeskraps.com (codeskraps)</managingEditor>
     <webMaster>me@codeskraps.com (codeskraps)</webMaster>
-    <lastBuildDate>Wed, 02 Oct 2024 18:14:23 +0200</lastBuildDate>
+    <lastBuildDate>Thu, 03 Oct 2024 17:16:34 +0200</lastBuildDate>
     <atom:link href="https://codeskraps.com/index.xml" rel="self" type="application/rss+xml" />
     <item>
       <title>About Me</title>
@@ -17,27 +17,34 @@
       <guid>https://codeskraps.com/about/</guid>
       <description>&lt;p&gt;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;  &#xA;  &#xA;  &#xA;      &#xA;      &#xA;  &lt;picture&gt;&#xA;  &lt;img class=&#34;img-fluid&#34; src=&#34;https://codeskraps.com/images/me_codeskraps.gif?v=9df9e0930034eb1e10990a99d3ef1056&#34; alt=&#34;me&#34; loading=&#34;lazy&#34; height=&#34;107&#34; width=&#34;150&#34; /&gt;&#xA;&lt;/picture&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;m a passionate and highly motivated software engineer with a deep-rooted love for technology that dates back to my first computer, an Amstrad 8256. From those early days of programming as a hobby, I&amp;rsquo;ve turned my passion into a successful career, specializing in mobile development with a focus on Android.&lt;/p&gt;&#xA;&lt;!-- raw HTML omitted --&gt;&#xA;&lt;h2 id=&#34;professional-journey&#34;&gt;Professional Journey&lt;/h2&gt;&#xA;&lt;p&gt;Currently, I&amp;rsquo;m leading the mobile team at Game Golf, where I oversee all aspects of our mobile app development. My experience spans various domains, including:&lt;/p&gt;</description>
     </item>
+    <item>
+      <title>React Native vs Kotlin Multiplatform</title>
+      <link>https://codeskraps.com/posts/2024/react_vs_kmp/</link>
+      <pubDate>Thu, 03 Oct 2024 17:16:34 +0200</pubDate><author>me@codeskraps.com (codeskraps)</author>
+      <guid>https://codeskraps.com/posts/2024/react_vs_kmp/</guid>
+      <description>&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;&#xA;&lt;p&gt;In the ever-evolving world of mobile app development, choosing the right cross-platform framework can be a game-changer for businesses and developers alike. Two prominent contenders in this space are React Native and Kotlin Multiplatform (KMP). Both offer unique approaches to the challenge of writing code once and deploying it across multiple platforms. This article will dive deep into the strengths and considerations of each, helping you make an informed decision for your next project.&lt;/p&gt;</description>
+    </item>
+    <item>
+      <title>Simplifying MVI Architecture</title>
+      <link>https://codeskraps.com/posts/2024/mvi_architecture/</link>
+      <pubDate>Fri, 27 Sep 2024 13:45:09 +0200</pubDate><author>me@codeskraps.com (codeskraps)</author>
+      <guid>https://codeskraps.com/posts/2024/mvi_architecture/</guid>
+      <description>&lt;p&gt;Model-View-Intent (MVI) is a powerful architectural pattern for building user interfaces, especially in Android development. In this post, we&amp;rsquo;ll explore a helper class that simplifies the implementation of MVI, making it easier to manage state, handle user intents, and emit actions in your application.&lt;/p&gt;</description>
+    </item>
     <item>
       <title>When .gitignore Doesnt Seem to Work: A Quick Fix</title>
-      <link>https://codeskraps.com/posts/gitignore_not_working/</link>
-      <pubDate>Wed, 02 Oct 2024 18:14:23 +0200</pubDate><author>me@codeskraps.com (codeskraps)</author>
-      <guid>https://codeskraps.com/posts/gitignore_not_working/</guid>
+      <link>https://codeskraps.com/posts/2024/gitignore_not_working/</link>
+      <pubDate>Sun, 02 Jun 2024 18:14:23 +0200</pubDate><author>me@codeskraps.com (codeskraps)</author>
+      <guid>https://codeskraps.com/posts/2024/gitignore_not_working/</guid>
       <description>&lt;p&gt;As developers, we&amp;rsquo;ve all been there. You&amp;rsquo;ve added a file or folder to your &lt;code&gt;.gitignore&lt;/code&gt;, but Git keeps tracking it anyway. What gives? Let&amp;rsquo;s dive into why this happens and how to fix it.&lt;/p&gt;</description>
     </item>
     <item>
       <title>Configuring SSH Keys for Individual Git Commands</title>
-      <link>https://codeskraps.com/posts/git_ssh_command/</link>
-      <pubDate>Wed, 02 Oct 2024 16:56:53 +0200</pubDate><author>me@codeskraps.com (codeskraps)</author>
-      <guid>https://codeskraps.com/posts/git_ssh_command/</guid>
+      <link>https://codeskraps.com/posts/2024/git_ssh_command/</link>
+      <pubDate>Tue, 02 Apr 2024 16:56:53 +0200</pubDate><author>me@codeskraps.com (codeskraps)</author>
+      <guid>https://codeskraps.com/posts/2024/git_ssh_command/</guid>
       <description>&lt;p&gt;When working with Git repositories, you often need to authenticate using SSH keys. While you can configure SSH settings globally, there are times when you need to use a specific SSH key for just one command. This is particularly useful when cloning a new repository or adding a submodule, where there isn&amp;rsquo;t yet a local &lt;code&gt;.git/config&lt;/code&gt; file to modify.&lt;/p&gt;</description>
     </item>
-    <item>
-      <title>Simplifying MVI Architecture</title>
-      <link>https://codeskraps.com/posts/mvi_architecture/</link>
-      <pubDate>Fri, 27 Sep 2024 13:45:09 +0200</pubDate><author>me@codeskraps.com (codeskraps)</author>
-      <guid>https://codeskraps.com/posts/mvi_architecture/</guid>
-      <description>&lt;p&gt;Model-View-Intent (MVI) is a powerful architectural pattern for building user interfaces, especially in Android development. In this post, we&amp;rsquo;ll explore a helper class that simplifies the implementation of MVI, making it easier to manage state, handle user intents, and emit actions in your application.&lt;/p&gt;</description>
-    </item>
     <item>
       <title>Projects</title>
       <link>https://codeskraps.com/projects/</link>

+ 204 - 0
public/posts/2024/git_ssh_command/index.html

@@ -0,0 +1,204 @@
+<!DOCTYPE html>
+<html lang="en-us">
+
+<head>
+    <title>
+Configuring SSH Keys for Individual Git Commands | codeskraps
+</title>
+
+    <meta http-equiv="content-type" content="text/html; charset=utf-8">
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+<meta name="description" content="Your website description">
+
+<meta name="generator" content="Hugo 0.134.3">
+
+
+<link rel="canonical" href="https://codeskraps.com/posts/2024/git_ssh_command/" >
+
+
+
+
+<link href="/css/style.min.ee0d47e4d4346c71a65a9e873108c81ffae54d60a2fc2338f6df394eb4b25a82.css" rel="stylesheet">
+
+
+
+
+</head>
+
+<body>
+
+    <div class="flexWrapper">
+        <header class="headerWrapper">
+    <div class="header">
+        <div>
+            <a class="terminal" href="https://codeskraps.com/">
+                <span>me@codeskraps.com ~ $</span>
+            </a>
+        </div>
+        <input class="side-menu" type="checkbox" id="side-menu">
+        <label class="hamb" for="side-menu"><span class="hamb-line"></span></label>
+        <nav class="headerLinks">
+            <ul>
+                
+                <li>
+                    <a href="https://codeskraps.com/projects/" title="" >
+                        ~/projects</a>
+                </li>
+                
+                <li>
+                    <a href="https://codeskraps.com/about/" title="" >
+                        ~/about</a>
+                </li>
+                
+                <li>
+                    <a href="https://codeskraps.com/posts/" title="" >
+                        ~/posts</a>
+                </li>
+                
+            </ul>
+        </nav>
+    </divi>
+    
+      <script async src="https://www.googletagmanager.com/gtag/js?id=G-YP8WK3KZF1"></script>
+      <script>
+        var doNotTrack = false;
+        if ( false ) {
+          var dnt = (navigator.doNotTrack || window.doNotTrack || navigator.msDoNotTrack);
+          var doNotTrack = (dnt == "1" || dnt == "yes");
+        }
+        if (!doNotTrack) {
+          window.dataLayer = window.dataLayer || [];
+          function gtag(){dataLayer.push(arguments);}
+          gtag('js', new Date());
+          gtag('config', 'G-YP8WK3KZF1');
+        }
+      </script>
+</header>
+
+
+        <div class="content">
+            <main class="main">
+                
+<div class="postWrapper">
+    <h1>Configuring SSH Keys for Individual Git Commands</h1>
+    
+    
+    <section class="postMetadata">
+        <dl>
+            
+                
+<dt>tags</dt>
+<dd><span></span>
+    <a href="/tags/git/">#Git</a><span></span>
+    <a href="/tags/ssh/">#Ssh</a></dd>
+            
+            
+            
+            
+                <dt>published</dt>
+                
+                <dd><time datetime="2024-04-02">April 2, 2024</time></dd>
+            
+            
+                <dt>reading time</dt>
+                <dd>3 minutes</dd>
+            
+        </dl>
+    </section>
+    
+    <div>
+        <p>When working with Git repositories, you often need to authenticate using SSH keys. While you can configure SSH settings globally, there are times when you need to use a specific SSH key for just one command. This is particularly useful when cloning a new repository or adding a submodule, where there isn&rsquo;t yet a local <code>.git/config</code> file to modify.</p>
+<h2 id="the-problem">The Problem</h2>
+<p>Imagine you&rsquo;re working on a project that requires you to clone a repository using a specific SSH key. Normally, you might edit your SSH config file or the repository&rsquo;s <code>.git/config</code> file. But what if you&rsquo;re just getting started and don&rsquo;t have these files set up yet?</p>
+<h2 id="the-solution">The Solution</h2>
+<p>Git provides a handy way to set configuration options for a single command using the <code>-c</code> flag. This allows you to specify the SSH command to use, including the path to your private key file.</p>
+<p>Here&rsquo;s the syntax:</p>
+<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>git -c core.sshCommand<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;ssh -i /path/to/private_key_file&#34;</span> &lt;git command&gt;</span></span></code></pre></div>
+<h2 id="examples">Examples</h2>
+<h3 id="cloning-a-repository">Cloning a Repository</h3>
+<p>To clone a repository using a specific SSH key:</p>
+<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>git -c core.sshCommand<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;ssh -i /path/to/private_key_file&#34;</span> clone git@github.com:username/repo.git</span></span></code></pre></div>
+<h3 id="adding-a-submodule">Adding a Submodule</h3>
+<p>Similarly, when adding a submodule:</p>
+<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>git -c core.sshCommand<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;ssh -i /path/to/private_key_file&#34;</span> submodule add git@github.com:username/submodule.git</span></span></code></pre></div>
+<h2 id="making-ssh-keys-available">Making SSH Keys Available</h2>
+<p>Before using SSH keys with Git, it&rsquo;s important to check which keys are already available on your system:</p>
+<ol>
+<li>
+<p><strong>Check Available Keys</strong>: List the contents of your SSH directory:
+<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>ls -al ~/.ssh</span></span></code></pre></div>
+This command will show you all files in your SSH directory, including your key files (typically with extensions like .pub for public keys).</p>
+</li>
+<li>
+<p><strong>Common Key Names</strong>: Look for files like:</p>
+<ul>
+<li>id_rsa, id_rsa.pub</li>
+<li>id_ed25519, id_ed25519.pub</li>
+<li>id_ecdsa, id_ecdsa.pub</li>
+</ul>
+</li>
+<li>
+<p><strong>Add to SSH Agent</strong>: If you find the key you want to use, ensure it&rsquo;s added to your SSH agent:
+<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>eval <span style="color:#e6db74">&#34;</span><span style="color:#66d9ef">$(</span>ssh-agent -s<span style="color:#66d9ef">)</span><span style="color:#e6db74">&#34;</span>
+</span></span><span style="display:flex;"><span>ssh-add ~/.ssh/your_private_key_file</span></span></code></pre></div></p>
+</li>
+<li>
+<p><strong>Verify Key in Git Host</strong>: Make sure the corresponding public key (the .pub file) is added to your Git host (e.g., GitHub, GitLab) in the SSH keys section of your account settings.</p>
+</li>
+</ol>
+<p>If you don&rsquo;t find any suitable keys, you may need to generate a new one. However, for the purposes of this guide, we&rsquo;re assuming you&rsquo;re working with existing keys.</p>
+<h2 id="adding-sshcommand-to-gitconfig">Adding sshCommand to .git/config</h2>
+<p>After cloning a repository using the method described above, you might want to make this configuration permanent for the specific repository. Here&rsquo;s how to add the sshCommand to your local <code>.git/config</code> file:</p>
+<ol>
+<li>
+<p>Navigate to your repository&rsquo;s root directory.</p>
+</li>
+<li>
+<p>Open the <code>.git/config</code> file in a text editor.</p>
+</li>
+<li>
+<p>Add the following lines under the <code>[core]</code> section (or create it if it doesn&rsquo;t exist):</p>
+<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-ini" data-lang="ini"><span style="display:flex;"><span><span style="color:#66d9ef">[core]</span>
+</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">sshCommand</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">ssh -i /path/to/private_key_file</span></span></span></code></pre></div>
+</li>
+<li>
+<p>Save and close the file.</p>
+</li>
+</ol>
+<p>Now, all Git commands for this repository will use the specified SSH key without needing the <code>-c</code> flag.</p>
+<h2 id="why-this-matters">Why This Matters</h2>
+<p>This technique is invaluable in several scenarios:</p>
+<ol>
+<li>
+<p><strong>Multiple SSH Keys</strong>: If you work with different Git hosts or have multiple accounts on the same host, you may need to use different SSH keys for different repositories.</p>
+</li>
+<li>
+<p><strong>Temporary Access</strong>: When you need to grant someone temporary access to clone a repo without modifying global SSH settings.</p>
+</li>
+<li>
+<p><strong>Automation</strong>: In CI/CD pipelines or scripts where you need to clone repositories with different authentication methods.</p>
+</li>
+<li>
+<p><strong>Testing</strong>: When troubleshooting SSH issues, this allows you to test different keys without changing your global configuration.</p>
+</li>
+</ol>
+<h2 id="conclusion">Conclusion</h2>
+<p>Using the <code>-c</code> flag with Git commands provides a flexible way to configure SSH settings on a per-command basis. This is especially useful when working with new repositories or in environments where you can&rsquo;t or don&rsquo;t want to modify global configurations. By mastering this technique, you can streamline your Git workflows and handle complex authentication scenarios with ease.</p>
+<p>Remember, while the <code>-c</code> flag method is convenient for one-off commands, for long-term projects, it&rsquo;s usually better to set up your SSH config file or the repository&rsquo;s <code>.git/config</code> for a more permanent solution.</p>
+    </div>
+</div>
+
+            </main>
+        </div>
+
+
+        <footer class="footer">
+    
+        <span>Built with <a href="https://gohugo.io" class="footerLink">Hugo</a> and <a href="https://github.com/LordMathis/hugo-theme-nightfall" class="footerLink">Nightfall</a> theme</span>
+    
+</footer>
+    </div>
+
+</body>
+
+</html>

+ 153 - 0
public/posts/2024/gitignore_not_working/index.html

@@ -0,0 +1,153 @@
+<!DOCTYPE html>
+<html lang="en-us">
+
+<head>
+    <title>
+When .gitignore Doesnt Seem to Work: A Quick Fix | codeskraps
+</title>
+
+    <meta http-equiv="content-type" content="text/html; charset=utf-8">
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+<meta name="description" content="Your website description">
+
+<meta name="generator" content="Hugo 0.134.3">
+
+
+<link rel="canonical" href="https://codeskraps.com/posts/2024/gitignore_not_working/" >
+
+
+
+
+<link href="/css/style.min.ee0d47e4d4346c71a65a9e873108c81ffae54d60a2fc2338f6df394eb4b25a82.css" rel="stylesheet">
+
+
+
+
+</head>
+
+<body>
+
+    <div class="flexWrapper">
+        <header class="headerWrapper">
+    <div class="header">
+        <div>
+            <a class="terminal" href="https://codeskraps.com/">
+                <span>me@codeskraps.com ~ $</span>
+            </a>
+        </div>
+        <input class="side-menu" type="checkbox" id="side-menu">
+        <label class="hamb" for="side-menu"><span class="hamb-line"></span></label>
+        <nav class="headerLinks">
+            <ul>
+                
+                <li>
+                    <a href="https://codeskraps.com/projects/" title="" >
+                        ~/projects</a>
+                </li>
+                
+                <li>
+                    <a href="https://codeskraps.com/about/" title="" >
+                        ~/about</a>
+                </li>
+                
+                <li>
+                    <a href="https://codeskraps.com/posts/" title="" >
+                        ~/posts</a>
+                </li>
+                
+            </ul>
+        </nav>
+    </divi>
+    
+      <script async src="https://www.googletagmanager.com/gtag/js?id=G-YP8WK3KZF1"></script>
+      <script>
+        var doNotTrack = false;
+        if ( false ) {
+          var dnt = (navigator.doNotTrack || window.doNotTrack || navigator.msDoNotTrack);
+          var doNotTrack = (dnt == "1" || dnt == "yes");
+        }
+        if (!doNotTrack) {
+          window.dataLayer = window.dataLayer || [];
+          function gtag(){dataLayer.push(arguments);}
+          gtag('js', new Date());
+          gtag('config', 'G-YP8WK3KZF1');
+        }
+      </script>
+</header>
+
+
+        <div class="content">
+            <main class="main">
+                
+<div class="postWrapper">
+    <h1>When .gitignore Doesnt Seem to Work: A Quick Fix</h1>
+    
+    
+    <section class="postMetadata">
+        <dl>
+            
+                
+<dt>tags</dt>
+<dd><span></span>
+    <a href="/tags/git/">#Git</a></dd>
+            
+            
+            
+            
+                <dt>published</dt>
+                
+                <dd><time datetime="2024-06-02">June 2, 2024</time></dd>
+            
+            
+                <dt>reading time</dt>
+                <dd>2 minutes</dd>
+            
+        </dl>
+    </section>
+    
+    <div>
+        <p>As developers, we&rsquo;ve all been there. You&rsquo;ve added a file or folder to your <code>.gitignore</code>, but Git keeps tracking it anyway. What gives? Let&rsquo;s dive into why this happens and how to fix it.</p>
+<h2 id="the-problem">The Problem</h2>
+<p>You&rsquo;ve added a file or directory to your <code>.gitignore</code>, but Git still tracks it. You might be thinking, &ldquo;Hey Git, I told you to ignore this!&rdquo;</p>
+<h2 id="why-it-happens">Why It Happens</h2>
+<p>Here&rsquo;s the catch: the <code>.gitignore</code> file only prevents untracked files from being added to the set of tracked files. It doesn&rsquo;t magically remove files that are already being tracked by Git.</p>
+<p>In other words, if you&rsquo;ve previously committed a file and then add it to <code>.gitignore</code>, Git will continue to track changes to that file. It&rsquo;s like telling your dog to ignore the treat that&rsquo;s already in its mouth - it&rsquo;s too late!</p>
+<h2 id="the-solution">The Solution</h2>
+<p>Fear not! There&rsquo;s a simple (if somewhat counterintuitive) fix. Here&rsquo;s what you need to do:</p>
+<ol>
+<li>
+<p>First, <strong>commit all your current changes</strong>. This is important to avoid losing any work.</p>
+</li>
+<li>
+<p>Then, run these two commands:</p>
+<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>git rm -rf --cached .
+</span></span><span style="display:flex;"><span>git add .</span></span></code></pre></div>
+</li>
+</ol>
+<p>Let&rsquo;s break down what these commands do:</p>
+<ul>
+<li><code>git rm -rf --cached .</code>: This removes all files from the Git repository (but not from your working directory).</li>
+<li><code>git add .</code>: This adds all the files back to the repository.</li>
+</ul>
+<p>The magic here is that when you add the files back, Git will respect your <code>.gitignore</code> rules.</p>
+<h2 id="a-word-of-caution">A Word of Caution</h2>
+<p>Remember, this process will un-track files that you&rsquo;ve told Git to ignore. If you want certain previously-tracked files to remain tracked, make sure they&rsquo;re not listed in your <code>.gitignore</code>.</p>
+<h2 id="conclusion">Conclusion</h2>
+<p>Git&rsquo;s behavior with <code>.gitignore</code> can be a bit surprising at first, but it makes sense when you understand how Git tracks files. By following these steps, you can ensure that your <code>.gitignore</code> rules are applied retroactively to your repository.</p>
+    </div>
+</div>
+
+            </main>
+        </div>
+
+
+        <footer class="footer">
+    
+        <span>Built with <a href="https://gohugo.io" class="footerLink">Hugo</a> and <a href="https://github.com/LordMathis/hugo-theme-nightfall" class="footerLink">Nightfall</a> theme</span>
+    
+</footer>
+    </div>
+
+</body>
+
+</html>

+ 313 - 0
public/posts/2024/mvi_architecture/index.html

@@ -0,0 +1,313 @@
+<!DOCTYPE html>
+<html lang="en-us">
+
+<head>
+    <title>
+Simplifying MVI Architecture | codeskraps
+</title>
+
+    <meta http-equiv="content-type" content="text/html; charset=utf-8">
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+<meta name="description" content="Your website description">
+
+<meta name="generator" content="Hugo 0.134.3">
+
+
+<link rel="canonical" href="https://codeskraps.com/posts/2024/mvi_architecture/" >
+
+
+
+
+<link href="/css/style.min.ee0d47e4d4346c71a65a9e873108c81ffae54d60a2fc2338f6df394eb4b25a82.css" rel="stylesheet">
+
+
+
+
+</head>
+
+<body>
+
+    <div class="flexWrapper">
+        <header class="headerWrapper">
+    <div class="header">
+        <div>
+            <a class="terminal" href="https://codeskraps.com/">
+                <span>me@codeskraps.com ~ $</span>
+            </a>
+        </div>
+        <input class="side-menu" type="checkbox" id="side-menu">
+        <label class="hamb" for="side-menu"><span class="hamb-line"></span></label>
+        <nav class="headerLinks">
+            <ul>
+                
+                <li>
+                    <a href="https://codeskraps.com/projects/" title="" >
+                        ~/projects</a>
+                </li>
+                
+                <li>
+                    <a href="https://codeskraps.com/about/" title="" >
+                        ~/about</a>
+                </li>
+                
+                <li>
+                    <a href="https://codeskraps.com/posts/" title="" >
+                        ~/posts</a>
+                </li>
+                
+            </ul>
+        </nav>
+    </divi>
+    
+      <script async src="https://www.googletagmanager.com/gtag/js?id=G-YP8WK3KZF1"></script>
+      <script>
+        var doNotTrack = false;
+        if ( false ) {
+          var dnt = (navigator.doNotTrack || window.doNotTrack || navigator.msDoNotTrack);
+          var doNotTrack = (dnt == "1" || dnt == "yes");
+        }
+        if (!doNotTrack) {
+          window.dataLayer = window.dataLayer || [];
+          function gtag(){dataLayer.push(arguments);}
+          gtag('js', new Date());
+          gtag('config', 'G-YP8WK3KZF1');
+        }
+      </script>
+</header>
+
+
+        <div class="content">
+            <main class="main">
+                
+<div class="postWrapper">
+    <h1>Simplifying MVI Architecture</h1>
+    
+    
+    <section class="postMetadata">
+        <dl>
+            
+                
+<dt>tags</dt>
+<dd><span></span>
+    <a href="/tags/kotlin/">#Kotlin</a><span></span>
+    <a href="/tags/kmp/">#Kmp</a><span></span>
+    <a href="/tags/android/">#Android</a><span></span>
+    <a href="/tags/mvi/">#Mvi</a><span></span>
+    <a href="/tags/architecture/">#Architecture</a><span></span>
+    <a href="/tags/mvvm/">#Mvvm</a><span></span>
+    <a href="/tags/viewmodel/">#Viewmodel</a></dd>
+            
+            
+            
+            
+                <dt>published</dt>
+                
+                <dd><time datetime="2024-09-27">September 27, 2024</time></dd>
+            
+            
+                <dt>reading time</dt>
+                <dd>4 minutes</dd>
+            
+        </dl>
+    </section>
+    
+    <div>
+        <p>Model-View-Intent (MVI) is a powerful architectural pattern for building user interfaces, especially in Android development. In this post, we&rsquo;ll explore a helper class that simplifies the implementation of MVI, making it easier to manage state, handle user intents, and emit actions in your application.</p>
+<h2 id="the-mvi-helper-class">The MVI Helper Class</h2>
+<p>First, let&rsquo;s look at the complete helper class:</p>
+<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-kotlin" data-lang="kotlin"><span style="display:flex;"><span><span style="color:#66d9ef">interface</span> <span style="color:#a6e22e">StateReceiver</span>&lt;STATE&gt; {
+</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">suspend</span> <span style="color:#66d9ef">fun</span> <span style="color:#a6e22e">updateState</span>(transform: <span style="color:#66d9ef">suspend</span> (STATE) <span style="color:#f92672">-&gt;</span> STATE)
+</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">suspend</span> <span style="color:#66d9ef">fun</span> <span style="color:#a6e22e">withState</span>(block: <span style="color:#66d9ef">suspend</span> (STATE) <span style="color:#f92672">-&gt;</span> Unit)
+</span></span><span style="display:flex;"><span>}
+</span></span><span style="display:flex;"><span>
+</span></span><span style="display:flex;"><span><span style="color:#66d9ef">suspend</span> <span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">fun</span> &lt;<span style="color:#66d9ef">reified</span> <span style="color:#a6e22e">TYPE</span> : <span style="color:#a6e22e">STATE</span>, <span style="color:#a6e22e">STATE</span>&gt; <span style="color:#a6e22e">StateReceiver</span>&lt;STATE&gt;.withType(
+</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">crossinline</span> block: <span style="color:#66d9ef">suspend</span> (TYPE) <span style="color:#f92672">-&gt;</span> Unit
+</span></span><span style="display:flex;"><span>) {
+</span></span><span style="display:flex;"><span>    withState { state <span style="color:#f92672">-&gt;</span>
+</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">if</span> (state <span style="color:#66d9ef">is</span> TYPE) {
+</span></span><span style="display:flex;"><span>            block(state)
+</span></span><span style="display:flex;"><span>        }
+</span></span><span style="display:flex;"><span>    }
+</span></span><span style="display:flex;"><span>}
+</span></span><span style="display:flex;"><span>
+</span></span><span style="display:flex;"><span><span style="color:#66d9ef">suspend</span> <span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">fun</span> &lt;<span style="color:#66d9ef">reified</span> <span style="color:#a6e22e">TYPE</span> : <span style="color:#a6e22e">STATE</span>, <span style="color:#a6e22e">STATE</span>&gt; <span style="color:#a6e22e">StateReceiver</span>&lt;STATE&gt;.updateWithType(
+</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">crossinline</span> transform: <span style="color:#66d9ef">suspend</span> (TYPE) <span style="color:#f92672">-&gt;</span> TYPE
+</span></span><span style="display:flex;"><span>) {
+</span></span><span style="display:flex;"><span>    withType&lt;TYPE, STATE&gt; { state <span style="color:#f92672">-&gt;</span>
+</span></span><span style="display:flex;"><span>        updateState { transform(state) }
+</span></span><span style="display:flex;"><span>    }
+</span></span><span style="display:flex;"><span>}
+</span></span><span style="display:flex;"><span>
+</span></span><span style="display:flex;"><span><span style="color:#66d9ef">interface</span> <span style="color:#a6e22e">StateProvider</span>&lt;STATE&gt; {
+</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">val</span> state: StateFlow&lt;STATE&gt;
+</span></span><span style="display:flex;"><span>}
+</span></span><span style="display:flex;"><span>
+</span></span><span style="display:flex;"><span><span style="color:#66d9ef">interface</span> <span style="color:#a6e22e">IntentReceiver</span>&lt;INTENT&gt; {
+</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">fun</span> <span style="color:#a6e22e">handleIntent</span>(intent: INTENT)
+</span></span><span style="display:flex;"><span>}
+</span></span><span style="display:flex;"><span>
+</span></span><span style="display:flex;"><span><span style="color:#66d9ef">interface</span> <span style="color:#a6e22e">ActionProvider</span>&lt;ACTION&gt; {
+</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">val</span> action: Flow&lt;ACTION&gt;
+</span></span><span style="display:flex;"><span>}
+</span></span><span style="display:flex;"><span>
+</span></span><span style="display:flex;"><span><span style="color:#66d9ef">interface</span> <span style="color:#a6e22e">ActionReceiver</span>&lt;ACTION&gt; {
+</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">suspend</span> <span style="color:#66d9ef">fun</span> <span style="color:#a6e22e">sendAction</span>(block: <span style="color:#66d9ef">suspend</span> () <span style="color:#f92672">-&gt;</span> ACTION)
+</span></span><span style="display:flex;"><span>}
+</span></span><span style="display:flex;"><span>
+</span></span><span style="display:flex;"><span><span style="color:#66d9ef">interface</span> <span style="color:#a6e22e">StateModule</span>&lt;STATE&gt; : StateReceiver&lt;STATE&gt;, StateProvider&lt;STATE&gt;
+</span></span><span style="display:flex;"><span><span style="color:#66d9ef">interface</span> <span style="color:#a6e22e">IntentModule</span>&lt;INTENT&gt; : IntentReceiver&lt;INTENT&gt;
+</span></span><span style="display:flex;"><span><span style="color:#66d9ef">interface</span> <span style="color:#a6e22e">ActionModule</span>&lt;ACTION&gt; : ActionReceiver&lt;ACTION&gt;, ActionProvider&lt;ACTION&gt;
+</span></span><span style="display:flex;"><span>
+</span></span><span style="display:flex;"><span><span style="color:#66d9ef">interface</span> <span style="color:#a6e22e">MVIViewModel</span>&lt;STATE, INTENT, ACTION&gt; : StateModule&lt;STATE&gt;, IntentModule&lt;INTENT&gt;, ActionModule&lt;ACTION&gt;
+</span></span><span style="display:flex;"><span>
+</span></span><span style="display:flex;"><span><span style="color:#66d9ef">class</span> <span style="color:#a6e22e">MVIViewModelDelegate</span>&lt;STATE, INTENT, ACTION&gt;(
+</span></span><span style="display:flex;"><span>    initial: STATE
+</span></span><span style="display:flex;"><span>) : MVIViewModel&lt;STATE, INTENT, ACTION&gt; {
+</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">private</span> <span style="color:#66d9ef">val</span> _state = MutableStateFlow(initial)
+</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">override</span> <span style="color:#66d9ef">val</span> state: StateFlow&lt;STATE&gt; = _state.asStateFlow()
+</span></span><span style="display:flex;"><span>
+</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">private</span> <span style="color:#66d9ef">val</span> _action = Channel&lt;ACTION&gt;()
+</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">override</span> <span style="color:#66d9ef">val</span> action: Flow&lt;ACTION&gt; = _action.receiveAsFlow()
+</span></span><span style="display:flex;"><span>
+</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">override</span> <span style="color:#66d9ef">suspend</span> <span style="color:#66d9ef">fun</span> <span style="color:#a6e22e">updateState</span>(transform: <span style="color:#66d9ef">suspend</span> (STATE) <span style="color:#f92672">-&gt;</span> STATE) {
+</span></span><span style="display:flex;"><span>        _state.update { transform(<span style="color:#66d9ef">it</span>) }
+</span></span><span style="display:flex;"><span>    }
+</span></span><span style="display:flex;"><span>
+</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">override</span> <span style="color:#66d9ef">suspend</span> <span style="color:#66d9ef">fun</span> <span style="color:#a6e22e">withState</span>(block: <span style="color:#66d9ef">suspend</span> (STATE) <span style="color:#f92672">-&gt;</span> Unit) {
+</span></span><span style="display:flex;"><span>        block(_state.<span style="color:#66d9ef">value</span>)
+</span></span><span style="display:flex;"><span>    }
+</span></span><span style="display:flex;"><span>
+</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">override</span> <span style="color:#66d9ef">suspend</span> <span style="color:#66d9ef">fun</span> <span style="color:#a6e22e">sendAction</span>(block: <span style="color:#66d9ef">suspend</span> () <span style="color:#f92672">-&gt;</span> ACTION) {
+</span></span><span style="display:flex;"><span>        _action.trySend(block())
+</span></span><span style="display:flex;"><span>    }
+</span></span><span style="display:flex;"><span>
+</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">override</span> <span style="color:#66d9ef">fun</span> <span style="color:#a6e22e">handleIntent</span>(intent: INTENT) {
+</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">throw</span> NotImplementedError()
+</span></span><span style="display:flex;"><span>    }
+</span></span><span style="display:flex;"><span>}</span></span></code></pre></div>
+<h2 id="understanding-the-mvi-helper-class">Understanding the MVI Helper Class</h2>
+<p>Let&rsquo;s break down the key components of our MVI helper class:</p>
+<h3 id="core-interfaces">Core Interfaces</h3>
+<ol>
+<li><code>StateReceiver&lt;STATE&gt;</code>: Allows updating and accessing the current state.</li>
+<li><code>StateProvider&lt;STATE&gt;</code>: Provides access to the state as a <code>StateFlow</code>.</li>
+<li><code>IntentReceiver&lt;INTENT&gt;</code>: Handles user intents.</li>
+<li><code>ActionProvider&lt;ACTION&gt;</code>: Provides a flow of actions.</li>
+<li><code>ActionReceiver&lt;ACTION&gt;</code>: Allows sending actions.</li>
+</ol>
+<h3 id="composite-interfaces">Composite Interfaces</h3>
+<ol>
+<li><code>StateModule&lt;STATE&gt;</code>: Combines state receiving and providing.</li>
+<li><code>IntentModule&lt;INTENT&gt;</code>: Wraps intent receiving.</li>
+<li><code>ActionModule&lt;ACTION&gt;</code>: Combines action receiving and providing.</li>
+<li><code>MVIViewModel&lt;STATE, INTENT, ACTION&gt;</code>: The main interface combining all MVI components.</li>
+</ol>
+<h3 id="helper-functions">Helper Functions</h3>
+<ol>
+<li><code>withType</code>: Allows type-safe state access.</li>
+<li><code>updateWithType</code>: Enables type-safe state updates.</li>
+</ol>
+<h3 id="the-mviviewmodeldelegate">The MVIViewModelDelegate</h3>
+<p>This class implements the <code>MVIViewModel</code> interface, providing a concrete implementation of the MVI pattern.</p>
+<h2 id="example-implementation">Example Implementation</h2>
+<p>Let&rsquo;s implement a simple counter application using our MVI helper class. Note that we can use either data classes or sealed interfaces for our State, Intent, and Action definitions:</p>
+<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-kotlin" data-lang="kotlin"><span style="display:flex;"><span><span style="color:#75715e">// Define our State, Intent, and Action
+</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span><span style="color:#66d9ef">data</span> <span style="color:#66d9ef">class</span> <span style="color:#a6e22e">CounterState</span>(<span style="color:#66d9ef">val</span> count: Int = <span style="color:#ae81ff">0</span>)
+</span></span><span style="display:flex;"><span>
+</span></span><span style="display:flex;"><span><span style="color:#66d9ef">sealed</span> <span style="color:#66d9ef">interface</span> <span style="color:#a6e22e">CounterIntent</span> {
+</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">object</span> <span style="color:#a6e22e">Increment</span> : CounterIntent
+</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">object</span> <span style="color:#a6e22e">Decrement</span> : CounterIntent
+</span></span><span style="display:flex;"><span>}
+</span></span><span style="display:flex;"><span>
+</span></span><span style="display:flex;"><span><span style="color:#66d9ef">sealed</span> <span style="color:#66d9ef">interface</span> <span style="color:#a6e22e">CounterAction</span> {
+</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">data</span> <span style="color:#66d9ef">class</span> <span style="color:#a6e22e">ShowToast</span>(<span style="color:#66d9ef">val</span> message: String) : CounterAction
+</span></span><span style="display:flex;"><span>}
+</span></span><span style="display:flex;"><span>
+</span></span><span style="display:flex;"><span><span style="color:#66d9ef">class</span> <span style="color:#a6e22e">CounterViewModel</span> : MVIViewModel&lt;CounterState, CounterIntent, CounterAction&gt; <span style="color:#66d9ef">by</span> MVIViewModelDelegate(CounterState()) {
+</span></span><span style="display:flex;"><span>
+</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">init</span> {
+</span></span><span style="display:flex;"><span>        handleIntent()
+</span></span><span style="display:flex;"><span>    }
+</span></span><span style="display:flex;"><span>
+</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">private</span> <span style="color:#66d9ef">fun</span> <span style="color:#a6e22e">handleIntent</span>() = viewModelScope.launch {
+</span></span><span style="display:flex;"><span>        withState { state <span style="color:#f92672">-&gt;</span>
+</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">when</span> (<span style="color:#66d9ef">val</span> intent = receiveIntent()) {
+</span></span><span style="display:flex;"><span>                <span style="color:#66d9ef">is</span> <span style="color:#a6e22e">CounterIntent</span>.Increment <span style="color:#f92672">-&gt;</span> updateState { <span style="color:#66d9ef">it</span>.copy(count = <span style="color:#66d9ef">it</span>.count + <span style="color:#ae81ff">1</span>) }
+</span></span><span style="display:flex;"><span>                <span style="color:#66d9ef">is</span> <span style="color:#a6e22e">CounterIntent</span>.Decrement <span style="color:#f92672">-&gt;</span> updateState { <span style="color:#66d9ef">it</span>.copy(count = <span style="color:#66d9ef">it</span>.count - <span style="color:#ae81ff">1</span>) }
+</span></span><span style="display:flex;"><span>            }
+</span></span><span style="display:flex;"><span>            checkCounterValue(state.count)
+</span></span><span style="display:flex;"><span>        }
+</span></span><span style="display:flex;"><span>    }
+</span></span><span style="display:flex;"><span>
+</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">private</span> <span style="color:#66d9ef">suspend</span> <span style="color:#66d9ef">fun</span> <span style="color:#a6e22e">checkCounterValue</span>(count: Int) {
+</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">if</span> (count % <span style="color:#ae81ff">10</span> <span style="color:#f92672">==</span> <span style="color:#ae81ff">0</span> <span style="color:#f92672">&amp;&amp;</span> count <span style="color:#f92672">!=</span> <span style="color:#ae81ff">0</span>) {
+</span></span><span style="display:flex;"><span>            sendAction { <span style="color:#a6e22e">CounterAction</span>.ShowToast(<span style="color:#e6db74">&#34;Counter is now </span><span style="color:#e6db74">$count</span><span style="color:#e6db74">!&#34;</span>) }
+</span></span><span style="display:flex;"><span>        }
+</span></span><span style="display:flex;"><span>    }
+</span></span><span style="display:flex;"><span>}</span></span></code></pre></div>
+<p>In this example:</p>
+<ol>
+<li>We define our <code>State</code> as a data class, and our <code>Intent</code> and <code>Action</code> as sealed interfaces.</li>
+<li>The <code>CounterViewModel</code> uses the <code>MVIViewModelDelegate</code> to implement the <code>MVIViewModel</code> interface.</li>
+<li>We handle intents in the <code>handleIntent</code> function, updating the state based on the received intent.</li>
+<li>The <code>checkCounterValue</code> function demonstrates how to send actions when certain conditions are met.</li>
+</ol>
+<h2 id="using-the-viewmodel-in-the-ui">Using the ViewModel in the UI</h2>
+<p>Here&rsquo;s how you might use this ViewModel in an Android Activity or Fragment:</p>
+<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-kotlin" data-lang="kotlin"><span style="display:flex;"><span><span style="color:#66d9ef">class</span> <span style="color:#a6e22e">CounterActivity</span> : AppCompatActivity() {
+</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">private</span> <span style="color:#66d9ef">val</span> viewModel: CounterViewModel <span style="color:#66d9ef">by</span> viewModels()
+</span></span><span style="display:flex;"><span>
+</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">override</span> <span style="color:#66d9ef">fun</span> <span style="color:#a6e22e">onCreate</span>(savedInstanceState: Bundle?) {
+</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">super</span>.onCreate(savedInstanceState)
+</span></span><span style="display:flex;"><span>        setContentView(<span style="color:#a6e22e">R</span>.layout.activity_counter)
+</span></span><span style="display:flex;"><span>
+</span></span><span style="display:flex;"><span>        <span style="color:#75715e">// Collect state
+</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>        lifecycleScope.launch {
+</span></span><span style="display:flex;"><span>            viewModel.state.collect { state <span style="color:#f92672">-&gt;</span>
+</span></span><span style="display:flex;"><span>                updateUI(state)
+</span></span><span style="display:flex;"><span>            }
+</span></span><span style="display:flex;"><span>        }
+</span></span><span style="display:flex;"><span>
+</span></span><span style="display:flex;"><span>        <span style="color:#75715e">// Collect actions
+</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>        lifecycleScope.launch {
+</span></span><span style="display:flex;"><span>            viewModel.action.collect { action <span style="color:#f92672">-&gt;</span>
+</span></span><span style="display:flex;"><span>                <span style="color:#66d9ef">when</span> (action) {
+</span></span><span style="display:flex;"><span>                    <span style="color:#66d9ef">is</span> <span style="color:#a6e22e">CounterAction</span>.ShowToast <span style="color:#f92672">-&gt;</span> <span style="color:#a6e22e">Toast</span>.makeText(<span style="color:#66d9ef">this</span><span style="color:#a6e22e">@CounterActivity</span>, action.message, <span style="color:#a6e22e">Toast</span>.LENGTH_SHORT).show()
+</span></span><span style="display:flex;"><span>                }
+</span></span><span style="display:flex;"><span>            }
+</span></span><span style="display:flex;"><span>        }
+</span></span><span style="display:flex;"><span>
+</span></span><span style="display:flex;"><span>        <span style="color:#75715e">// Send intents
+</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>        incrementButton.setOnClickListener {
+</span></span><span style="display:flex;"><span>            viewModel.handleIntent(<span style="color:#a6e22e">CounterIntent</span>.Increment)
+</span></span><span style="display:flex;"><span>        }
+</span></span><span style="display:flex;"><span>        decrementButton.setOnClickListener {
+</span></span><span style="display:flex;"><span>            viewModel.handleIntent(<span style="color:#a6e22e">CounterIntent</span>.Decrement)
+</span></span><span style="display:flex;"><span>        }
+</span></span><span style="display:flex;"><span>    }
+</span></span><span style="display:flex;"><span>
+</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">private</span> <span style="color:#66d9ef">fun</span> <span style="color:#a6e22e">updateUI</span>(state: CounterState) {
+</span></span><span style="display:flex;"><span>        counterTextView.text = state.count.toString()
+</span></span><span style="display:flex;"><span>    }
+</span></span><span style="display:flex;"><span>}</span></span></code></pre></div>
+<h2 id="conclusion">Conclusion</h2>
+<p>The MVI helper class we&rsquo;ve explored simplifies the implementation of the MVI pattern, providing a clean and type-safe way to manage state, handle user intents, and emit actions. By using this helper class, you can create more maintainable and testable view models, leading to more robust applications.</p>
+<p>Remember that you can use either data classes or sealed interfaces for your State, Intent, and Action definitions, depending on your specific needs. This flexibility allows you to choose the most appropriate structure for each component of your MVI architecture.</p>
+<p>While this helper class provides a solid foundation, you may need to adapt it to fit the specific needs of your project.</p>
+    </div>
+</div>
+
+            </main>
+        </div>
+
+
+        <footer class="footer">
+    
+        <span>Built with <a href="https://gohugo.io" class="footerLink">Hugo</a> and <a href="https://github.com/LordMathis/hugo-theme-nightfall" class="footerLink">Nightfall</a> theme</span>
+    
+</footer>
+    </div>
+
+</body>
+
+</html>

+ 232 - 0
public/posts/2024/react_kmp/index.html

@@ -0,0 +1,232 @@
+<!DOCTYPE html>
+<html lang="en-us">
+
+<head><script src="/livereload.js?mindelay=10&amp;v=2&amp;port=49508&amp;path=livereload" data-no-instant defer></script>
+    <title>
+React Native vs Kotlin Multiplatform: Choosing the Right Cross-Platform Development Approach | codeskraps
+</title>
+
+    <meta http-equiv="content-type" content="text/html; charset=utf-8">
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+<meta name="description" content="Your website description">
+
+<meta name="generator" content="Hugo 0.134.3">
+
+
+<link rel="canonical" href="http://localhost:49508/posts/2024/react_kmp/" >
+
+
+
+
+<link href="/css/style.min.ee0d47e4d4346c71a65a9e873108c81ffae54d60a2fc2338f6df394eb4b25a82.css" rel="stylesheet">
+
+
+
+
+</head>
+
+<body>
+
+    <div class="flexWrapper">
+        <header class="headerWrapper">
+    <div class="header">
+        <div>
+            <a class="terminal" href="http://localhost:49508/">
+                <span>me@codeskraps.com ~ $</span>
+            </a>
+        </div>
+        <input class="side-menu" type="checkbox" id="side-menu">
+        <label class="hamb" for="side-menu"><span class="hamb-line"></span></label>
+        <nav class="headerLinks">
+            <ul>
+                
+                <li>
+                    <a href="http://localhost:49508/projects/" title="" >
+                        ~/projects</a>
+                </li>
+                
+                <li>
+                    <a href="http://localhost:49508/about/" title="" >
+                        ~/about</a>
+                </li>
+                
+                <li>
+                    <a href="http://localhost:49508/posts/" title="" >
+                        ~/posts</a>
+                </li>
+                
+            </ul>
+        </nav>
+    </divi>
+    
+      <script async src="https://www.googletagmanager.com/gtag/js?id=G-YP8WK3KZF1"></script>
+      <script>
+        var doNotTrack = false;
+        if ( false ) {
+          var dnt = (navigator.doNotTrack || window.doNotTrack || navigator.msDoNotTrack);
+          var doNotTrack = (dnt == "1" || dnt == "yes");
+        }
+        if (!doNotTrack) {
+          window.dataLayer = window.dataLayer || [];
+          function gtag(){dataLayer.push(arguments);}
+          gtag('js', new Date());
+          gtag('config', 'G-YP8WK3KZF1');
+        }
+      </script>
+</header>
+
+
+        <div class="content">
+            <main class="main">
+                
+<div class="postWrapper">
+    <h1>React Native vs Kotlin Multiplatform: Choosing the Right Cross-Platform Development Approach</h1>
+    
+    
+    <section class="postMetadata">
+        <dl>
+            
+                
+<dt>tags</dt>
+<dd><span></span>
+    <a href="/tags/react-native/">#React-Native</a><span></span>
+    <a href="/tags/kotlin/">#Kotlin</a><span></span>
+    <a href="/tags/kmp/">#Kmp</a><span></span>
+    <a href="/tags/android/">#Android</a><span></span>
+    <a href="/tags/ios/">#Ios</a></dd>
+            
+            
+            
+            
+                <dt>published</dt>
+                
+                <dd><time datetime="2024-10-03">October 3, 2024</time></dd>
+            
+            
+                <dt>reading time</dt>
+                <dd>6 minutes</dd>
+            
+        </dl>
+    </section>
+    
+    <div>
+        <h2 id="introduction">Introduction</h2>
+<p>In the ever-evolving world of mobile app development, choosing the right cross-platform framework can be a game-changer for businesses and developers alike. Two prominent contenders in this space are React Native and Kotlin Multiplatform (KMP). Both offer unique approaches to the challenge of writing code once and deploying it across multiple platforms. This article will dive deep into the strengths and considerations of each, helping you make an informed decision for your next project.</p>
+<h2 id="background">Background</h2>
+<h3 id="react-native-metas-javascript-powered-solution">React Native: Meta&rsquo;s JavaScript-Powered Solution</h3>
+<p>React Native, created by Meta (formerly Facebook), burst onto the scene in 2015. It was born out of the need for faster mobile development without sacrificing the quality of the user experience. React Native is a comprehensive platform that allows developers to use JavaScript and React, a popular web framework, to build mobile applications that feel truly native.</p>
+<h3 id="kotlin-multiplatform-jetbrains-kotlin-based-approach">Kotlin Multiplatform: JetBrains&rsquo; Kotlin-Based Approach</h3>
+<p>Kotlin Multiplatform, developed by JetBrains, takes a different approach. Introduced in 2017, KMP is an SDK (Software Development Kit) and an extension of the Kotlin programming language that enables sharing code between different platforms, including iOS, Android, web, and desktop. Unlike React Native, which focuses primarily on mobile, KMP aims to be a comprehensive solution for all platforms.</p>
+<h2 id="language-and-learning-curve">Language and Learning Curve</h2>
+<h3 id="react-native-javascript-for-the-web-developer">React Native: JavaScript for the Web Developer</h3>
+<p>React Native&rsquo;s use of JavaScript as its primary language is a significant advantage for many developers, especially those with a web development background. JavaScript&rsquo;s popularity and the vast ecosystem of tools and libraries make it an accessible choice for beginners and experienced developers alike.</p>
+<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-javascript" data-lang="javascript"><span style="display:flex;"><span><span style="color:#66d9ef">import</span> <span style="color:#a6e22e">React</span> <span style="color:#a6e22e">from</span> <span style="color:#e6db74">&#39;react&#39;</span>;
+</span></span><span style="display:flex;"><span><span style="color:#66d9ef">import</span> { <span style="color:#a6e22e">Text</span>, <span style="color:#a6e22e">View</span> } <span style="color:#a6e22e">from</span> <span style="color:#e6db74">&#39;react-native&#39;</span>;
+</span></span><span style="display:flex;"><span>
+</span></span><span style="display:flex;"><span><span style="color:#66d9ef">const</span> <span style="color:#a6e22e">HelloWorldApp</span> <span style="color:#f92672">=</span> () =&gt; {
+</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">return</span> (
+</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&lt;</span><span style="color:#a6e22e">View</span> <span style="color:#a6e22e">style</span><span style="color:#f92672">=</span>{{ <span style="color:#a6e22e">flex</span><span style="color:#f92672">:</span> <span style="color:#ae81ff">1</span>, <span style="color:#a6e22e">justifyContent</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#34;center&#34;</span>, <span style="color:#a6e22e">alignItems</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#34;center&#34;</span> }}<span style="color:#f92672">&gt;</span>
+</span></span><span style="display:flex;"><span>      <span style="color:#f92672">&lt;</span><span style="color:#a6e22e">Text</span><span style="color:#f92672">&gt;</span><span style="color:#a6e22e">Hello</span>, <span style="color:#a6e22e">world</span><span style="color:#f92672">!&lt;</span><span style="color:#960050;background-color:#1e0010">/Text&gt;</span>
+</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&lt;</span><span style="color:#960050;background-color:#1e0010">/View&gt;</span>
+</span></span><span style="display:flex;"><span>  );
+</span></span><span style="display:flex;"><span>}
+</span></span><span style="display:flex;"><span>
+</span></span><span style="display:flex;"><span><span style="color:#66d9ef">export</span> <span style="color:#66d9ef">default</span> <span style="color:#a6e22e">HelloWorldApp</span>;</span></span></code></pre></div>
+<p>This familiarity can lead to faster onboarding and development cycles, particularly for teams already versed in web technologies.</p>
+<h3 id="kmp-kotlins-modern-features-at-your-fingertips">KMP: Kotlin&rsquo;s Modern Features at Your Fingertips</h3>
+<p>Kotlin Multiplatform, on the other hand, leverages the power and expressiveness of the Kotlin language. While it may have a steeper learning curve for those not familiar with Kotlin, it offers numerous benefits.</p>
+<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-kotlin" data-lang="kotlin"><span style="display:flex;"><span><span style="color:#66d9ef">expect</span> <span style="color:#66d9ef">class</span> <span style="color:#a6e22e">Platform</span>()
+</span></span><span style="display:flex;"><span><span style="color:#66d9ef">expect</span> <span style="color:#66d9ef">fun</span> <span style="color:#a6e22e">Platform</span>.name(): String
+</span></span><span style="display:flex;"><span>
+</span></span><span style="display:flex;"><span><span style="color:#66d9ef">expect</span> <span style="color:#66d9ef">fun</span> <span style="color:#a6e22e">hello</span>(): String
+</span></span><span style="display:flex;"><span>
+</span></span><span style="display:flex;"><span><span style="color:#66d9ef">fun</span> <span style="color:#a6e22e">greet</span>(): String = hello() + <span style="color:#e6db74">&#34; on &#34;</span> + Platform().name()
+</span></span><span style="display:flex;"><span>
+</span></span><span style="display:flex;"><span><span style="color:#66d9ef">class</span> <span style="color:#a6e22e">Greeting</span> {
+</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">fun</span> <span style="color:#a6e22e">greeting</span>(): String = greet()
+</span></span><span style="display:flex;"><span>}</span></span></code></pre></div>
+<p>These features can lead to more robust, maintainable code, which can be especially beneficial for larger, more complex projects.</p>
+<h2 id="ecosystem-and-libraries">Ecosystem and Libraries</h2>
+<h3 id="react-native-a-vast-universe-of-packages">React Native: A Vast Universe of Packages</h3>
+<p>React Native benefits from the enormous JavaScript ecosystem. With npm (Node Package Manager) at its disposal, developers have access to hundreds of thousands of packages and libraries. This vast selection means that for almost any functionality you need, there&rsquo;s likely a pre-built solution available.</p>
+<h3 id="kmp-young-but-growing-rapidly">KMP: Young but Growing Rapidly</h3>
+<p>While Kotlin Multiplatform&rsquo;s ecosystem is younger and smaller compared to React Native, it&rsquo;s growing at an impressive rate. The Kotlin community is active and enthusiastic, continuously contributing new libraries and tools.</p>
+<p>What&rsquo;s particularly exciting is Google&rsquo;s increasing support for KMP. They&rsquo;re updating core Android libraries like Room to be KMP-compatible, which is a strong sign of the technology&rsquo;s promising future.</p>
+<h2 id="pros-of-react-native">Pros of React Native</h2>
+<ol>
+<li>
+<p><strong>Reusable Code</strong>: Write once, run anywhere. React Native allows for significant code reuse between iOS and Android platforms, potentially saving development time and resources.</p>
+</li>
+<li>
+<p><strong>Performance</strong>: While not quite at native levels, React Native&rsquo;s performance has improved significantly over the years. For many applications, the difference is negligible.</p>
+</li>
+<li>
+<p><strong>Native UI Components</strong>: React Native uses the platform&rsquo;s standard rendering APIs, resulting in a UI that looks and feels native to each platform.</p>
+</li>
+<li>
+<p><strong>Hot Reloading</strong>: This feature allows developers to see changes in real-time without recompiling the entire app, significantly speeding up the development process.</p>
+</li>
+<li>
+<p><strong>Native Code Integration</strong>: When needed, React Native allows easy integration with native code, providing flexibility for performance-critical sections or platform-specific features.</p>
+</li>
+</ol>
+<h2 id="pros-of-kotlin-multiplatform">Pros of Kotlin Multiplatform</h2>
+<ol>
+<li>
+<p><strong>Modular Integration</strong>: One of KMP&rsquo;s standout features is its ability to be integrated modularly into existing applications. This means you can start small, perhaps sharing just a few key components between platforms, without having to rewrite your entire app.</p>
+</li>
+<li>
+<p><strong>Easy Migration Path</strong>: The modular nature of KMP allows for a gradual migration. You can start by moving small, non-UI parts of your app to KMP, then progressively share more code as you become comfortable with the technology.</p>
+</li>
+<li>
+<p><strong>Single Codebase for Business Logic</strong>: KMP shines in its ability to share business logic across platforms. This can lead to more consistent behavior across different versions of your app and reduce the chances of platform-specific bugs.</p>
+</li>
+<li>
+<p><strong>Native UI Experience</strong>: Unlike some cross-platform solutions, KMP encourages the use of native UI frameworks for each platform. This results in apps that look and feel completely native, adhering to platform-specific design guidelines.</p>
+</li>
+<li>
+<p><strong>Native Performance</strong>: Since KMP compiles to native code, it can achieve performance levels very close to fully native applications.</p>
+</li>
+</ol>
+<h2 id="conclusion">Conclusion</h2>
+<p>Both React Native and Kotlin Multiplatform offer compelling solutions for cross-platform development, each with its own strengths and considerations.</p>
+<p>React Native, as a comprehensive platform, excels in:</p>
+<ul>
+<li>Rapid development, especially for teams with web development experience</li>
+<li>A vast ecosystem of libraries and tools</li>
+<li>Significant code sharing between platforms</li>
+</ul>
+<p>Kotlin Multiplatform, as a flexible SDK, shines in:</p>
+<ul>
+<li>Gradual adoption and integration with existing native apps</li>
+<li>Strong typing and modern language features</li>
+<li>Sharing business logic while maintaining native UIs</li>
+</ul>
+<p>The choice between React Native and KMP often comes down to your team&rsquo;s expertise, project requirements, and long-term goals. If you&rsquo;re already building native Android apps with Kotlin, KMP offers an attractive path to sharing code with iOS without compromising on the native experience.</p>
+<p>One of the most compelling aspects of Kotlin Multiplatform, particularly for teams already developing on one platform, is its flexibility in code sharing. If you&rsquo;re already building an app for Android, for instance, KMP allows you to leverage that existing codebase and share as much or as little as you want with iOS. This approach doesn&rsquo;t force you to commit to a complete rewrite or to share everything. Instead, you can strategically choose which parts of your codebase to share, be it just the business logic or even portions of the UI.</p>
+<p>This flexibility is a game-changer because it allows you to:</p>
+<ol>
+<li>Gradually introduce cross-platform development into your workflow</li>
+<li>Maintain platform-specific optimizations where needed</li>
+<li>Reuse complex business logic without sacrificing the native feel of your app</li>
+<li>Reduce development time and potential bugs by having a single source of truth for shared components</li>
+</ol>
+<p>In essence, KMP&rsquo;s approach recognizes that not all parts of an app need to be or should be shared across platforms. It gives you the power to decide how much code reuse makes sense for your specific project, allowing you to balance development efficiency with platform-specific requirements.</p>
+<p>As both technologies continue to evolve, they&rsquo;re likely to shape the future of cross-platform development. Whether you choose React Native as your development platform or Kotlin Multiplatform as your SDK, you&rsquo;re selecting a powerful tool capable of delivering high-quality, cross-platform applications. The key is to assess your project&rsquo;s needs, your team&rsquo;s capabilities, and your long-term goals to make the choice that best aligns with your development strategy.</p>
+    </div>
+</div>
+
+            </main>
+        </div>
+
+
+        <footer class="footer">
+    
+        <span>Built with <a href="https://gohugo.io" class="footerLink">Hugo</a> and <a href="https://github.com/LordMathis/hugo-theme-nightfall" class="footerLink">Nightfall</a> theme</span>
+    
+</footer>
+    </div>
+
+</body>
+
+</html>

+ 232 - 0
public/posts/2024/react_vs_kmp/index.html

@@ -0,0 +1,232 @@
+<!DOCTYPE html>
+<html lang="en-us">
+
+<head>
+    <title>
+React Native vs Kotlin Multiplatform | codeskraps
+</title>
+
+    <meta http-equiv="content-type" content="text/html; charset=utf-8">
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+<meta name="description" content="Your website description">
+
+<meta name="generator" content="Hugo 0.134.3">
+
+
+<link rel="canonical" href="https://codeskraps.com/posts/2024/react_vs_kmp/" >
+
+
+
+
+<link href="/css/style.min.ee0d47e4d4346c71a65a9e873108c81ffae54d60a2fc2338f6df394eb4b25a82.css" rel="stylesheet">
+
+
+
+
+</head>
+
+<body>
+
+    <div class="flexWrapper">
+        <header class="headerWrapper">
+    <div class="header">
+        <div>
+            <a class="terminal" href="https://codeskraps.com/">
+                <span>me@codeskraps.com ~ $</span>
+            </a>
+        </div>
+        <input class="side-menu" type="checkbox" id="side-menu">
+        <label class="hamb" for="side-menu"><span class="hamb-line"></span></label>
+        <nav class="headerLinks">
+            <ul>
+                
+                <li>
+                    <a href="https://codeskraps.com/projects/" title="" >
+                        ~/projects</a>
+                </li>
+                
+                <li>
+                    <a href="https://codeskraps.com/about/" title="" >
+                        ~/about</a>
+                </li>
+                
+                <li>
+                    <a href="https://codeskraps.com/posts/" title="" >
+                        ~/posts</a>
+                </li>
+                
+            </ul>
+        </nav>
+    </divi>
+    
+      <script async src="https://www.googletagmanager.com/gtag/js?id=G-YP8WK3KZF1"></script>
+      <script>
+        var doNotTrack = false;
+        if ( false ) {
+          var dnt = (navigator.doNotTrack || window.doNotTrack || navigator.msDoNotTrack);
+          var doNotTrack = (dnt == "1" || dnt == "yes");
+        }
+        if (!doNotTrack) {
+          window.dataLayer = window.dataLayer || [];
+          function gtag(){dataLayer.push(arguments);}
+          gtag('js', new Date());
+          gtag('config', 'G-YP8WK3KZF1');
+        }
+      </script>
+</header>
+
+
+        <div class="content">
+            <main class="main">
+                
+<div class="postWrapper">
+    <h1>React Native vs Kotlin Multiplatform</h1>
+    
+    
+    <section class="postMetadata">
+        <dl>
+            
+                
+<dt>tags</dt>
+<dd><span></span>
+    <a href="/tags/react-native/">#React-Native</a><span></span>
+    <a href="/tags/kotlin/">#Kotlin</a><span></span>
+    <a href="/tags/kmp/">#Kmp</a><span></span>
+    <a href="/tags/android/">#Android</a><span></span>
+    <a href="/tags/ios/">#Ios</a></dd>
+            
+            
+            
+            
+                <dt>published</dt>
+                
+                <dd><time datetime="2024-10-03">October 3, 2024</time></dd>
+            
+            
+                <dt>reading time</dt>
+                <dd>6 minutes</dd>
+            
+        </dl>
+    </section>
+    
+    <div>
+        <h2 id="introduction">Introduction</h2>
+<p>In the ever-evolving world of mobile app development, choosing the right cross-platform framework can be a game-changer for businesses and developers alike. Two prominent contenders in this space are React Native and Kotlin Multiplatform (KMP). Both offer unique approaches to the challenge of writing code once and deploying it across multiple platforms. This article will dive deep into the strengths and considerations of each, helping you make an informed decision for your next project.</p>
+<h2 id="background">Background</h2>
+<h3 id="react-native-metas-javascript-powered-solution">React Native: Meta&rsquo;s JavaScript-Powered Solution</h3>
+<p>React Native, created by Meta (formerly Facebook), burst onto the scene in 2015. It was born out of the need for faster mobile development without sacrificing the quality of the user experience. React Native is a comprehensive platform that allows developers to use JavaScript and React, a popular web framework, to build mobile applications that feel truly native.</p>
+<h3 id="kotlin-multiplatform-jetbrains-kotlin-based-approach">Kotlin Multiplatform: JetBrains&rsquo; Kotlin-Based Approach</h3>
+<p>Kotlin Multiplatform, developed by JetBrains, takes a different approach. Introduced in 2017, KMP is an SDK (Software Development Kit) and an extension of the Kotlin programming language that enables sharing code between different platforms, including iOS, Android, web, and desktop. Unlike React Native, which focuses primarily on mobile, KMP aims to be a comprehensive solution for all platforms.</p>
+<h2 id="language-and-learning-curve">Language and Learning Curve</h2>
+<h3 id="react-native-javascript-for-the-web-developer">React Native: JavaScript for the Web Developer</h3>
+<p>React Native&rsquo;s use of JavaScript as its primary language is a significant advantage for many developers, especially those with a web development background. JavaScript&rsquo;s popularity and the vast ecosystem of tools and libraries make it an accessible choice for beginners and experienced developers alike.</p>
+<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-javascript" data-lang="javascript"><span style="display:flex;"><span><span style="color:#66d9ef">import</span> <span style="color:#a6e22e">React</span> <span style="color:#a6e22e">from</span> <span style="color:#e6db74">&#39;react&#39;</span>;
+</span></span><span style="display:flex;"><span><span style="color:#66d9ef">import</span> { <span style="color:#a6e22e">Text</span>, <span style="color:#a6e22e">View</span> } <span style="color:#a6e22e">from</span> <span style="color:#e6db74">&#39;react-native&#39;</span>;
+</span></span><span style="display:flex;"><span>
+</span></span><span style="display:flex;"><span><span style="color:#66d9ef">const</span> <span style="color:#a6e22e">HelloWorldApp</span> <span style="color:#f92672">=</span> () =&gt; {
+</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">return</span> (
+</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&lt;</span><span style="color:#a6e22e">View</span> <span style="color:#a6e22e">style</span><span style="color:#f92672">=</span>{{ <span style="color:#a6e22e">flex</span><span style="color:#f92672">:</span> <span style="color:#ae81ff">1</span>, <span style="color:#a6e22e">justifyContent</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#34;center&#34;</span>, <span style="color:#a6e22e">alignItems</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#34;center&#34;</span> }}<span style="color:#f92672">&gt;</span>
+</span></span><span style="display:flex;"><span>      <span style="color:#f92672">&lt;</span><span style="color:#a6e22e">Text</span><span style="color:#f92672">&gt;</span><span style="color:#a6e22e">Hello</span>, <span style="color:#a6e22e">world</span><span style="color:#f92672">!&lt;</span><span style="color:#960050;background-color:#1e0010">/Text&gt;</span>
+</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&lt;</span><span style="color:#960050;background-color:#1e0010">/View&gt;</span>
+</span></span><span style="display:flex;"><span>  );
+</span></span><span style="display:flex;"><span>}
+</span></span><span style="display:flex;"><span>
+</span></span><span style="display:flex;"><span><span style="color:#66d9ef">export</span> <span style="color:#66d9ef">default</span> <span style="color:#a6e22e">HelloWorldApp</span>;</span></span></code></pre></div>
+<p>This familiarity can lead to faster onboarding and development cycles, particularly for teams already versed in web technologies.</p>
+<h3 id="kmp-kotlins-modern-features-at-your-fingertips">KMP: Kotlin&rsquo;s Modern Features at Your Fingertips</h3>
+<p>Kotlin Multiplatform, on the other hand, leverages the power and expressiveness of the Kotlin language. While it may have a steeper learning curve for those not familiar with Kotlin, it offers numerous benefits.</p>
+<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-kotlin" data-lang="kotlin"><span style="display:flex;"><span><span style="color:#66d9ef">expect</span> <span style="color:#66d9ef">class</span> <span style="color:#a6e22e">Platform</span>()
+</span></span><span style="display:flex;"><span><span style="color:#66d9ef">expect</span> <span style="color:#66d9ef">fun</span> <span style="color:#a6e22e">Platform</span>.name(): String
+</span></span><span style="display:flex;"><span>
+</span></span><span style="display:flex;"><span><span style="color:#66d9ef">expect</span> <span style="color:#66d9ef">fun</span> <span style="color:#a6e22e">hello</span>(): String
+</span></span><span style="display:flex;"><span>
+</span></span><span style="display:flex;"><span><span style="color:#66d9ef">fun</span> <span style="color:#a6e22e">greet</span>(): String = hello() + <span style="color:#e6db74">&#34; on &#34;</span> + Platform().name()
+</span></span><span style="display:flex;"><span>
+</span></span><span style="display:flex;"><span><span style="color:#66d9ef">class</span> <span style="color:#a6e22e">Greeting</span> {
+</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">fun</span> <span style="color:#a6e22e">greeting</span>(): String = greet()
+</span></span><span style="display:flex;"><span>}</span></span></code></pre></div>
+<p>These features can lead to more robust, maintainable code, which can be especially beneficial for larger, more complex projects.</p>
+<h2 id="ecosystem-and-libraries">Ecosystem and Libraries</h2>
+<h3 id="react-native-a-vast-universe-of-packages">React Native: A Vast Universe of Packages</h3>
+<p>React Native benefits from the enormous JavaScript ecosystem. With npm (Node Package Manager) at its disposal, developers have access to hundreds of thousands of packages and libraries. This vast selection means that for almost any functionality you need, there&rsquo;s likely a pre-built solution available.</p>
+<h3 id="kmp-young-but-growing-rapidly">KMP: Young but Growing Rapidly</h3>
+<p>While Kotlin Multiplatform&rsquo;s ecosystem is younger and smaller compared to React Native, it&rsquo;s growing at an impressive rate. The Kotlin community is active and enthusiastic, continuously contributing new libraries and tools.</p>
+<p>What&rsquo;s particularly exciting is Google&rsquo;s increasing support for KMP. They&rsquo;re updating core Android libraries like Room to be KMP-compatible, which is a strong sign of the technology&rsquo;s promising future.</p>
+<h2 id="pros-of-react-native">Pros of React Native</h2>
+<ol>
+<li>
+<p><strong>Reusable Code</strong>: Write once, run anywhere. React Native allows for significant code reuse between iOS and Android platforms, potentially saving development time and resources.</p>
+</li>
+<li>
+<p><strong>Performance</strong>: While not quite at native levels, React Native&rsquo;s performance has improved significantly over the years. For many applications, the difference is negligible.</p>
+</li>
+<li>
+<p><strong>Native UI Components</strong>: React Native uses the platform&rsquo;s standard rendering APIs, resulting in a UI that looks and feels native to each platform.</p>
+</li>
+<li>
+<p><strong>Hot Reloading</strong>: This feature allows developers to see changes in real-time without recompiling the entire app, significantly speeding up the development process.</p>
+</li>
+<li>
+<p><strong>Native Code Integration</strong>: When needed, React Native allows easy integration with native code, providing flexibility for performance-critical sections or platform-specific features.</p>
+</li>
+</ol>
+<h2 id="pros-of-kotlin-multiplatform">Pros of Kotlin Multiplatform</h2>
+<ol>
+<li>
+<p><strong>Modular Integration</strong>: One of KMP&rsquo;s standout features is its ability to be integrated modularly into existing applications. This means you can start small, perhaps sharing just a few key components between platforms, without having to rewrite your entire app.</p>
+</li>
+<li>
+<p><strong>Easy Migration Path</strong>: The modular nature of KMP allows for a gradual migration. You can start by moving small, non-UI parts of your app to KMP, then progressively share more code as you become comfortable with the technology.</p>
+</li>
+<li>
+<p><strong>Single Codebase for Business Logic</strong>: KMP shines in its ability to share business logic across platforms. This can lead to more consistent behavior across different versions of your app and reduce the chances of platform-specific bugs.</p>
+</li>
+<li>
+<p><strong>Native UI Experience</strong>: Unlike some cross-platform solutions, KMP encourages the use of native UI frameworks for each platform. This results in apps that look and feel completely native, adhering to platform-specific design guidelines.</p>
+</li>
+<li>
+<p><strong>Native Performance</strong>: Since KMP compiles to native code, it can achieve performance levels very close to fully native applications.</p>
+</li>
+</ol>
+<h2 id="conclusion">Conclusion</h2>
+<p>Both React Native and Kotlin Multiplatform offer compelling solutions for cross-platform development, each with its own strengths and considerations.</p>
+<p>React Native, as a comprehensive platform, excels in:</p>
+<ul>
+<li>Rapid development, especially for teams with web development experience</li>
+<li>A vast ecosystem of libraries and tools</li>
+<li>Significant code sharing between platforms</li>
+</ul>
+<p>Kotlin Multiplatform, as a flexible SDK, shines in:</p>
+<ul>
+<li>Gradual adoption and integration with existing native apps</li>
+<li>Strong typing and modern language features</li>
+<li>Sharing business logic while maintaining native UIs</li>
+</ul>
+<p>The choice between React Native and KMP often comes down to your team&rsquo;s expertise, project requirements, and long-term goals. If you&rsquo;re already building native Android apps with Kotlin, KMP offers an attractive path to sharing code with iOS without compromising on the native experience.</p>
+<p>One of the most compelling aspects of Kotlin Multiplatform, particularly for teams already developing on one platform, is its flexibility in code sharing. If you&rsquo;re already building an app for Android, for instance, KMP allows you to leverage that existing codebase and share as much or as little as you want with iOS. This approach doesn&rsquo;t force you to commit to a complete rewrite or to share everything. Instead, you can strategically choose which parts of your codebase to share, be it just the business logic or even portions of the UI.</p>
+<p>This flexibility is a game-changer because it allows you to:</p>
+<ol>
+<li>Gradually introduce cross-platform development into your workflow</li>
+<li>Maintain platform-specific optimizations where needed</li>
+<li>Reuse complex business logic without sacrificing the native feel of your app</li>
+<li>Reduce development time and potential bugs by having a single source of truth for shared components</li>
+</ol>
+<p>In essence, KMP&rsquo;s approach recognizes that not all parts of an app need to be or should be shared across platforms. It gives you the power to decide how much code reuse makes sense for your specific project, allowing you to balance development efficiency with platform-specific requirements.</p>
+<p>As both technologies continue to evolve, they&rsquo;re likely to shape the future of cross-platform development. Whether you choose React Native as your development platform or Kotlin Multiplatform as your SDK, you&rsquo;re selecting a powerful tool capable of delivering high-quality, cross-platform applications. The key is to assess your project&rsquo;s needs, your team&rsquo;s capabilities, and your long-term goals to make the choice that best aligns with your development strategy.</p>
+    </div>
+</div>
+
+            </main>
+        </div>
+
+
+        <footer class="footer">
+    
+        <span>Built with <a href="https://gohugo.io" class="footerLink">Hugo</a> and <a href="https://github.com/LordMathis/hugo-theme-nightfall" class="footerLink">Nightfall</a> theme</span>
+    
+</footer>
+    </div>
+
+</body>
+
+</html>

+ 30 - 12
public/posts/index.html

@@ -92,16 +92,17 @@ Posts | codeskraps
     <div>
         
 
-        <a class="postListLink" href="https://codeskraps.com/posts/gitignore_not_working/">
+        <a class="postListLink" href="https://codeskraps.com/posts/2024/react_vs_kmp/">
             
             <div class="postListItem" role="listitem">
                 <div class="postHeader">
-                    <span class="postTitle">When .gitignore Doesnt Seem to Work: A Quick Fix</span>
+                    <span class="postTitle">React Native vs Kotlin Multiplatform</span>
                     
-                    <time class="postDate" datetime="2024-10-02">October 2, 2024</time>
+                    <time class="postDate" datetime="2024-10-03">October 3, 2024</time>
                 </div>
                 <div class="postExcerpt">
-                    <p><p>As developers, we&rsquo;ve all been there. You&rsquo;ve added a file or folder to your <code>.gitignore</code>, but Git keeps tracking it anyway. What gives? Let&rsquo;s dive into why this happens and how to fix it.</p></p>
+                    <p><h2 id="introduction">Introduction</h2>
+<p>In the ever-evolving world of mobile app development, choosing the right cross-platform framework can be a game-changer for businesses and developers alike. Two prominent contenders in this space are React Native and Kotlin Multiplatform (KMP). Both offer unique approaches to the challenge of writing code once and deploying it across multiple platforms. This article will dive deep into the strengths and considerations of each, helping you make an informed decision for your next project.</p></p>
                 </div>
             </div>
         </a>
@@ -109,16 +110,16 @@ Posts | codeskraps
 
         
 
-        <a class="postListLink" href="https://codeskraps.com/posts/git_ssh_command/">
+        <a class="postListLink" href="https://codeskraps.com/posts/2024/mvi_architecture/">
             
             <div class="postListItem" role="listitem">
                 <div class="postHeader">
-                    <span class="postTitle">Configuring SSH Keys for Individual Git Commands</span>
+                    <span class="postTitle">Simplifying MVI Architecture</span>
                     
-                    <time class="postDate" datetime="2024-10-02">October 2, 2024</time>
+                    <time class="postDate" datetime="2024-09-27">September 27, 2024</time>
                 </div>
                 <div class="postExcerpt">
-                    <p><p>When working with Git repositories, you often need to authenticate using SSH keys. While you can configure SSH settings globally, there are times when you need to use a specific SSH key for just one command. This is particularly useful when cloning a new repository or adding a submodule, where there isn&rsquo;t yet a local <code>.git/config</code> file to modify.</p></p>
+                    <p><p>Model-View-Intent (MVI) is a powerful architectural pattern for building user interfaces, especially in Android development. In this post, we&rsquo;ll explore a helper class that simplifies the implementation of MVI, making it easier to manage state, handle user intents, and emit actions in your application.</p></p>
                 </div>
             </div>
         </a>
@@ -126,16 +127,33 @@ Posts | codeskraps
 
         
 
-        <a class="postListLink" href="https://codeskraps.com/posts/mvi_architecture/">
+        <a class="postListLink" href="https://codeskraps.com/posts/2024/gitignore_not_working/">
             
             <div class="postListItem" role="listitem">
                 <div class="postHeader">
-                    <span class="postTitle">Simplifying MVI Architecture</span>
+                    <span class="postTitle">When .gitignore Doesnt Seem to Work: A Quick Fix</span>
                     
-                    <time class="postDate" datetime="2024-09-27">September 27, 2024</time>
+                    <time class="postDate" datetime="2024-06-02">June 2, 2024</time>
                 </div>
                 <div class="postExcerpt">
-                    <p><p>Model-View-Intent (MVI) is a powerful architectural pattern for building user interfaces, especially in Android development. In this post, we&rsquo;ll explore a helper class that simplifies the implementation of MVI, making it easier to manage state, handle user intents, and emit actions in your application.</p></p>
+                    <p><p>As developers, we&rsquo;ve all been there. You&rsquo;ve added a file or folder to your <code>.gitignore</code>, but Git keeps tracking it anyway. What gives? Let&rsquo;s dive into why this happens and how to fix it.</p></p>
+                </div>
+            </div>
+        </a>
+
+
+        
+
+        <a class="postListLink" href="https://codeskraps.com/posts/2024/git_ssh_command/">
+            
+            <div class="postListItem" role="listitem">
+                <div class="postHeader">
+                    <span class="postTitle">Configuring SSH Keys for Individual Git Commands</span>
+                    
+                    <time class="postDate" datetime="2024-04-02">April 2, 2024</time>
+                </div>
+                <div class="postExcerpt">
+                    <p><p>When working with Git repositories, you often need to authenticate using SSH keys. While you can configure SSH settings globally, there are times when you need to use a specific SSH key for just one command. This is particularly useful when cloning a new repository or adding a submodule, where there isn&rsquo;t yet a local <code>.git/config</code> file to modify.</p></p>
                 </div>
             </div>
         </a>

+ 21 - 14
public/posts/index.xml

@@ -8,28 +8,35 @@
     <language>en-us</language>
     <managingEditor>me@codeskraps.com (codeskraps)</managingEditor>
     <webMaster>me@codeskraps.com (codeskraps)</webMaster>
-    <lastBuildDate>Wed, 02 Oct 2024 18:14:23 +0200</lastBuildDate>
+    <lastBuildDate>Thu, 03 Oct 2024 17:16:34 +0200</lastBuildDate>
     <atom:link href="https://codeskraps.com/posts/index.xml" rel="self" type="application/rss+xml" />
+    <item>
+      <title>React Native vs Kotlin Multiplatform</title>
+      <link>https://codeskraps.com/posts/2024/react_vs_kmp/</link>
+      <pubDate>Thu, 03 Oct 2024 17:16:34 +0200</pubDate><author>me@codeskraps.com (codeskraps)</author>
+      <guid>https://codeskraps.com/posts/2024/react_vs_kmp/</guid>
+      <description>&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;&#xA;&lt;p&gt;In the ever-evolving world of mobile app development, choosing the right cross-platform framework can be a game-changer for businesses and developers alike. Two prominent contenders in this space are React Native and Kotlin Multiplatform (KMP). Both offer unique approaches to the challenge of writing code once and deploying it across multiple platforms. This article will dive deep into the strengths and considerations of each, helping you make an informed decision for your next project.&lt;/p&gt;</description>
+    </item>
+    <item>
+      <title>Simplifying MVI Architecture</title>
+      <link>https://codeskraps.com/posts/2024/mvi_architecture/</link>
+      <pubDate>Fri, 27 Sep 2024 13:45:09 +0200</pubDate><author>me@codeskraps.com (codeskraps)</author>
+      <guid>https://codeskraps.com/posts/2024/mvi_architecture/</guid>
+      <description>&lt;p&gt;Model-View-Intent (MVI) is a powerful architectural pattern for building user interfaces, especially in Android development. In this post, we&amp;rsquo;ll explore a helper class that simplifies the implementation of MVI, making it easier to manage state, handle user intents, and emit actions in your application.&lt;/p&gt;</description>
+    </item>
     <item>
       <title>When .gitignore Doesnt Seem to Work: A Quick Fix</title>
-      <link>https://codeskraps.com/posts/gitignore_not_working/</link>
-      <pubDate>Wed, 02 Oct 2024 18:14:23 +0200</pubDate><author>me@codeskraps.com (codeskraps)</author>
-      <guid>https://codeskraps.com/posts/gitignore_not_working/</guid>
+      <link>https://codeskraps.com/posts/2024/gitignore_not_working/</link>
+      <pubDate>Sun, 02 Jun 2024 18:14:23 +0200</pubDate><author>me@codeskraps.com (codeskraps)</author>
+      <guid>https://codeskraps.com/posts/2024/gitignore_not_working/</guid>
       <description>&lt;p&gt;As developers, we&amp;rsquo;ve all been there. You&amp;rsquo;ve added a file or folder to your &lt;code&gt;.gitignore&lt;/code&gt;, but Git keeps tracking it anyway. What gives? Let&amp;rsquo;s dive into why this happens and how to fix it.&lt;/p&gt;</description>
     </item>
     <item>
       <title>Configuring SSH Keys for Individual Git Commands</title>
-      <link>https://codeskraps.com/posts/git_ssh_command/</link>
-      <pubDate>Wed, 02 Oct 2024 16:56:53 +0200</pubDate><author>me@codeskraps.com (codeskraps)</author>
-      <guid>https://codeskraps.com/posts/git_ssh_command/</guid>
+      <link>https://codeskraps.com/posts/2024/git_ssh_command/</link>
+      <pubDate>Tue, 02 Apr 2024 16:56:53 +0200</pubDate><author>me@codeskraps.com (codeskraps)</author>
+      <guid>https://codeskraps.com/posts/2024/git_ssh_command/</guid>
       <description>&lt;p&gt;When working with Git repositories, you often need to authenticate using SSH keys. While you can configure SSH settings globally, there are times when you need to use a specific SSH key for just one command. This is particularly useful when cloning a new repository or adding a submodule, where there isn&amp;rsquo;t yet a local &lt;code&gt;.git/config&lt;/code&gt; file to modify.&lt;/p&gt;</description>
     </item>
-    <item>
-      <title>Simplifying MVI Architecture</title>
-      <link>https://codeskraps.com/posts/mvi_architecture/</link>
-      <pubDate>Fri, 27 Sep 2024 13:45:09 +0200</pubDate><author>me@codeskraps.com (codeskraps)</author>
-      <guid>https://codeskraps.com/posts/mvi_architecture/</guid>
-      <description>&lt;p&gt;Model-View-Intent (MVI) is a powerful architectural pattern for building user interfaces, especially in Android development. In this post, we&amp;rsquo;ll explore a helper class that simplifies the implementation of MVI, making it easier to manage state, handle user intents, and emit actions in your application.&lt;/p&gt;</description>
-    </item>
   </channel>
 </rss>

+ 31 - 22
public/sitemap.xml

@@ -3,39 +3,36 @@
   xmlns:xhtml="http://www.w3.org/1999/xhtml">
   <url>
     <loc>https://codeskraps.com/about/</loc>
+  </url><url>
+    <loc>https://codeskraps.com/tags/android/</loc>
+    <lastmod>2024-10-03T17:16:34+02:00</lastmod>
   </url><url>
     <loc>https://codeskraps.com/</loc>
-    <lastmod>2024-10-02T18:14:23+02:00</lastmod>
+    <lastmod>2024-10-03T17:16:34+02:00</lastmod>
   </url><url>
-    <loc>https://codeskraps.com/tags/git/</loc>
-    <lastmod>2024-10-02T18:14:23+02:00</lastmod>
+    <loc>https://codeskraps.com/tags/ios/</loc>
+    <lastmod>2024-10-03T17:16:34+02:00</lastmod>
   </url><url>
-    <loc>https://codeskraps.com/posts/</loc>
-    <lastmod>2024-10-02T18:14:23+02:00</lastmod>
+    <loc>https://codeskraps.com/tags/kmp/</loc>
+    <lastmod>2024-10-03T17:16:34+02:00</lastmod>
   </url><url>
-    <loc>https://codeskraps.com/tags/</loc>
-    <lastmod>2024-10-02T18:14:23+02:00</lastmod>
+    <loc>https://codeskraps.com/tags/kotlin/</loc>
+    <lastmod>2024-10-03T17:16:34+02:00</lastmod>
   </url><url>
-    <loc>https://codeskraps.com/posts/gitignore_not_working/</loc>
-    <lastmod>2024-10-02T18:14:23+02:00</lastmod>
+    <loc>https://codeskraps.com/posts/</loc>
+    <lastmod>2024-10-03T17:16:34+02:00</lastmod>
   </url><url>
-    <loc>https://codeskraps.com/posts/git_ssh_command/</loc>
-    <lastmod>2024-10-02T16:56:53+02:00</lastmod>
+    <loc>https://codeskraps.com/posts/2024/react_vs_kmp/</loc>
+    <lastmod>2024-10-03T17:16:34+02:00</lastmod>
   </url><url>
-    <loc>https://codeskraps.com/tags/ssh/</loc>
-    <lastmod>2024-10-02T16:56:53+02:00</lastmod>
+    <loc>https://codeskraps.com/tags/react-native/</loc>
+    <lastmod>2024-10-03T17:16:34+02:00</lastmod>
   </url><url>
-    <loc>https://codeskraps.com/tags/android/</loc>
-    <lastmod>2024-09-27T13:45:09+02:00</lastmod>
+    <loc>https://codeskraps.com/tags/</loc>
+    <lastmod>2024-10-03T17:16:34+02:00</lastmod>
   </url><url>
     <loc>https://codeskraps.com/tags/architecture/</loc>
     <lastmod>2024-09-27T13:45:09+02:00</lastmod>
-  </url><url>
-    <loc>https://codeskraps.com/tags/kmp/</loc>
-    <lastmod>2024-09-27T13:45:09+02:00</lastmod>
-  </url><url>
-    <loc>https://codeskraps.com/tags/kotlin/</loc>
-    <lastmod>2024-09-27T13:45:09+02:00</lastmod>
   </url><url>
     <loc>https://codeskraps.com/tags/mvi/</loc>
     <lastmod>2024-09-27T13:45:09+02:00</lastmod>
@@ -43,11 +40,23 @@
     <loc>https://codeskraps.com/tags/mvvm/</loc>
     <lastmod>2024-09-27T13:45:09+02:00</lastmod>
   </url><url>
-    <loc>https://codeskraps.com/posts/mvi_architecture/</loc>
+    <loc>https://codeskraps.com/posts/2024/mvi_architecture/</loc>
     <lastmod>2024-09-27T13:45:09+02:00</lastmod>
   </url><url>
     <loc>https://codeskraps.com/tags/viewmodel/</loc>
     <lastmod>2024-09-27T13:45:09+02:00</lastmod>
+  </url><url>
+    <loc>https://codeskraps.com/tags/git/</loc>
+    <lastmod>2024-06-02T18:14:23+02:00</lastmod>
+  </url><url>
+    <loc>https://codeskraps.com/posts/2024/gitignore_not_working/</loc>
+    <lastmod>2024-06-02T18:14:23+02:00</lastmod>
+  </url><url>
+    <loc>https://codeskraps.com/posts/2024/git_ssh_command/</loc>
+    <lastmod>2024-04-02T16:56:53+02:00</lastmod>
+  </url><url>
+    <loc>https://codeskraps.com/tags/ssh/</loc>
+    <lastmod>2024-04-02T16:56:53+02:00</lastmod>
   </url><url>
     <loc>https://codeskraps.com/categories/</loc>
   </url><url>

+ 19 - 1
public/tags/android/index.html

@@ -92,7 +92,25 @@ Android | codeskraps
     <div>
         
 
-        <a class="postListLink" href="https://codeskraps.com/posts/mvi_architecture/">
+        <a class="postListLink" href="https://codeskraps.com/posts/2024/react_vs_kmp/">
+            
+            <div class="postListItem" role="listitem">
+                <div class="postHeader">
+                    <span class="postTitle">React Native vs Kotlin Multiplatform</span>
+                    
+                    <time class="postDate" datetime="2024-10-03">October 3, 2024</time>
+                </div>
+                <div class="postExcerpt">
+                    <p><h2 id="introduction">Introduction</h2>
+<p>In the ever-evolving world of mobile app development, choosing the right cross-platform framework can be a game-changer for businesses and developers alike. Two prominent contenders in this space are React Native and Kotlin Multiplatform (KMP). Both offer unique approaches to the challenge of writing code once and deploying it across multiple platforms. This article will dive deep into the strengths and considerations of each, helping you make an informed decision for your next project.</p></p>
+                </div>
+            </div>
+        </a>
+
+
+        
+
+        <a class="postListLink" href="https://codeskraps.com/posts/2024/mvi_architecture/">
             
             <div class="postListItem" role="listitem">
                 <div class="postHeader">

+ 10 - 3
public/tags/android/index.xml

@@ -8,13 +8,20 @@
     <language>en-us</language>
     <managingEditor>me@codeskraps.com (codeskraps)</managingEditor>
     <webMaster>me@codeskraps.com (codeskraps)</webMaster>
-    <lastBuildDate>Fri, 27 Sep 2024 13:45:09 +0200</lastBuildDate>
+    <lastBuildDate>Thu, 03 Oct 2024 17:16:34 +0200</lastBuildDate>
     <atom:link href="https://codeskraps.com/tags/android/index.xml" rel="self" type="application/rss+xml" />
+    <item>
+      <title>React Native vs Kotlin Multiplatform</title>
+      <link>https://codeskraps.com/posts/2024/react_vs_kmp/</link>
+      <pubDate>Thu, 03 Oct 2024 17:16:34 +0200</pubDate><author>me@codeskraps.com (codeskraps)</author>
+      <guid>https://codeskraps.com/posts/2024/react_vs_kmp/</guid>
+      <description>&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;&#xA;&lt;p&gt;In the ever-evolving world of mobile app development, choosing the right cross-platform framework can be a game-changer for businesses and developers alike. Two prominent contenders in this space are React Native and Kotlin Multiplatform (KMP). Both offer unique approaches to the challenge of writing code once and deploying it across multiple platforms. This article will dive deep into the strengths and considerations of each, helping you make an informed decision for your next project.&lt;/p&gt;</description>
+    </item>
     <item>
       <title>Simplifying MVI Architecture</title>
-      <link>https://codeskraps.com/posts/mvi_architecture/</link>
+      <link>https://codeskraps.com/posts/2024/mvi_architecture/</link>
       <pubDate>Fri, 27 Sep 2024 13:45:09 +0200</pubDate><author>me@codeskraps.com (codeskraps)</author>
-      <guid>https://codeskraps.com/posts/mvi_architecture/</guid>
+      <guid>https://codeskraps.com/posts/2024/mvi_architecture/</guid>
       <description>&lt;p&gt;Model-View-Intent (MVI) is a powerful architectural pattern for building user interfaces, especially in Android development. In this post, we&amp;rsquo;ll explore a helper class that simplifies the implementation of MVI, making it easier to manage state, handle user intents, and emit actions in your application.&lt;/p&gt;</description>
     </item>
   </channel>

+ 1 - 1
public/tags/architecture/index.html

@@ -92,7 +92,7 @@ Architecture | codeskraps
     <div>
         
 
-        <a class="postListLink" href="https://codeskraps.com/posts/mvi_architecture/">
+        <a class="postListLink" href="https://codeskraps.com/posts/2024/mvi_architecture/">
             
             <div class="postListItem" role="listitem">
                 <div class="postHeader">

+ 2 - 2
public/tags/architecture/index.xml

@@ -12,9 +12,9 @@
     <atom:link href="https://codeskraps.com/tags/architecture/index.xml" rel="self" type="application/rss+xml" />
     <item>
       <title>Simplifying MVI Architecture</title>
-      <link>https://codeskraps.com/posts/mvi_architecture/</link>
+      <link>https://codeskraps.com/posts/2024/mvi_architecture/</link>
       <pubDate>Fri, 27 Sep 2024 13:45:09 +0200</pubDate><author>me@codeskraps.com (codeskraps)</author>
-      <guid>https://codeskraps.com/posts/mvi_architecture/</guid>
+      <guid>https://codeskraps.com/posts/2024/mvi_architecture/</guid>
       <description>&lt;p&gt;Model-View-Intent (MVI) is a powerful architectural pattern for building user interfaces, especially in Android development. In this post, we&amp;rsquo;ll explore a helper class that simplifies the implementation of MVI, making it easier to manage state, handle user intents, and emit actions in your application.&lt;/p&gt;</description>
     </item>
   </channel>

+ 4 - 4
public/tags/git/index.html

@@ -92,13 +92,13 @@ Git | codeskraps
     <div>
         
 
-        <a class="postListLink" href="https://codeskraps.com/posts/gitignore_not_working/">
+        <a class="postListLink" href="https://codeskraps.com/posts/2024/gitignore_not_working/">
             
             <div class="postListItem" role="listitem">
                 <div class="postHeader">
                     <span class="postTitle">When .gitignore Doesnt Seem to Work: A Quick Fix</span>
                     
-                    <time class="postDate" datetime="2024-10-02">October 2, 2024</time>
+                    <time class="postDate" datetime="2024-06-02">June 2, 2024</time>
                 </div>
                 <div class="postExcerpt">
                     <p><p>As developers, we&rsquo;ve all been there. You&rsquo;ve added a file or folder to your <code>.gitignore</code>, but Git keeps tracking it anyway. What gives? Let&rsquo;s dive into why this happens and how to fix it.</p></p>
@@ -109,13 +109,13 @@ Git | codeskraps
 
         
 
-        <a class="postListLink" href="https://codeskraps.com/posts/git_ssh_command/">
+        <a class="postListLink" href="https://codeskraps.com/posts/2024/git_ssh_command/">
             
             <div class="postListItem" role="listitem">
                 <div class="postHeader">
                     <span class="postTitle">Configuring SSH Keys for Individual Git Commands</span>
                     
-                    <time class="postDate" datetime="2024-10-02">October 2, 2024</time>
+                    <time class="postDate" datetime="2024-04-02">April 2, 2024</time>
                 </div>
                 <div class="postExcerpt">
                     <p><p>When working with Git repositories, you often need to authenticate using SSH keys. While you can configure SSH settings globally, there are times when you need to use a specific SSH key for just one command. This is particularly useful when cloning a new repository or adding a submodule, where there isn&rsquo;t yet a local <code>.git/config</code> file to modify.</p></p>

+ 7 - 7
public/tags/git/index.xml

@@ -8,20 +8,20 @@
     <language>en-us</language>
     <managingEditor>me@codeskraps.com (codeskraps)</managingEditor>
     <webMaster>me@codeskraps.com (codeskraps)</webMaster>
-    <lastBuildDate>Wed, 02 Oct 2024 18:14:23 +0200</lastBuildDate>
+    <lastBuildDate>Sun, 02 Jun 2024 18:14:23 +0200</lastBuildDate>
     <atom:link href="https://codeskraps.com/tags/git/index.xml" rel="self" type="application/rss+xml" />
     <item>
       <title>When .gitignore Doesnt Seem to Work: A Quick Fix</title>
-      <link>https://codeskraps.com/posts/gitignore_not_working/</link>
-      <pubDate>Wed, 02 Oct 2024 18:14:23 +0200</pubDate><author>me@codeskraps.com (codeskraps)</author>
-      <guid>https://codeskraps.com/posts/gitignore_not_working/</guid>
+      <link>https://codeskraps.com/posts/2024/gitignore_not_working/</link>
+      <pubDate>Sun, 02 Jun 2024 18:14:23 +0200</pubDate><author>me@codeskraps.com (codeskraps)</author>
+      <guid>https://codeskraps.com/posts/2024/gitignore_not_working/</guid>
       <description>&lt;p&gt;As developers, we&amp;rsquo;ve all been there. You&amp;rsquo;ve added a file or folder to your &lt;code&gt;.gitignore&lt;/code&gt;, but Git keeps tracking it anyway. What gives? Let&amp;rsquo;s dive into why this happens and how to fix it.&lt;/p&gt;</description>
     </item>
     <item>
       <title>Configuring SSH Keys for Individual Git Commands</title>
-      <link>https://codeskraps.com/posts/git_ssh_command/</link>
-      <pubDate>Wed, 02 Oct 2024 16:56:53 +0200</pubDate><author>me@codeskraps.com (codeskraps)</author>
-      <guid>https://codeskraps.com/posts/git_ssh_command/</guid>
+      <link>https://codeskraps.com/posts/2024/git_ssh_command/</link>
+      <pubDate>Tue, 02 Apr 2024 16:56:53 +0200</pubDate><author>me@codeskraps.com (codeskraps)</author>
+      <guid>https://codeskraps.com/posts/2024/git_ssh_command/</guid>
       <description>&lt;p&gt;When working with Git repositories, you often need to authenticate using SSH keys. While you can configure SSH settings globally, there are times when you need to use a specific SSH key for just one command. This is particularly useful when cloning a new repository or adding a submodule, where there isn&amp;rsquo;t yet a local &lt;code&gt;.git/config&lt;/code&gt; file to modify.&lt;/p&gt;</description>
     </item>
   </channel>

+ 51 - 17
public/tags/index.html

@@ -92,13 +92,13 @@ Tags | codeskraps
     <div>
         
 
-        <a class="postListLink" href="https://codeskraps.com/tags/git/">
+        <a class="postListLink" href="https://codeskraps.com/tags/android/">
             
             <div class="postListItem" role="listitem">
                 <div class="postHeader">
-                    <span class="postTitle">Git</span>
+                    <span class="postTitle">Android</span>
                     
-                    <time class="postDate" datetime="2024-10-02">October 2, 2024</time>
+                    <time class="postDate" datetime="2024-10-03">October 3, 2024</time>
                 </div>
                 <div class="postExcerpt">
                     <p></p>
@@ -109,13 +109,13 @@ Tags | codeskraps
 
         
 
-        <a class="postListLink" href="https://codeskraps.com/tags/ssh/">
+        <a class="postListLink" href="https://codeskraps.com/tags/ios/">
             
             <div class="postListItem" role="listitem">
                 <div class="postHeader">
-                    <span class="postTitle">Ssh</span>
+                    <span class="postTitle">Ios</span>
                     
-                    <time class="postDate" datetime="2024-10-02">October 2, 2024</time>
+                    <time class="postDate" datetime="2024-10-03">October 3, 2024</time>
                 </div>
                 <div class="postExcerpt">
                     <p></p>
@@ -126,13 +126,13 @@ Tags | codeskraps
 
         
 
-        <a class="postListLink" href="https://codeskraps.com/tags/android/">
+        <a class="postListLink" href="https://codeskraps.com/tags/kmp/">
             
             <div class="postListItem" role="listitem">
                 <div class="postHeader">
-                    <span class="postTitle">Android</span>
+                    <span class="postTitle">Kmp</span>
                     
-                    <time class="postDate" datetime="2024-09-27">September 27, 2024</time>
+                    <time class="postDate" datetime="2024-10-03">October 3, 2024</time>
                 </div>
                 <div class="postExcerpt">
                     <p></p>
@@ -143,13 +143,13 @@ Tags | codeskraps
 
         
 
-        <a class="postListLink" href="https://codeskraps.com/tags/architecture/">
+        <a class="postListLink" href="https://codeskraps.com/tags/kotlin/">
             
             <div class="postListItem" role="listitem">
                 <div class="postHeader">
-                    <span class="postTitle">Architecture</span>
+                    <span class="postTitle">Kotlin</span>
                     
-                    <time class="postDate" datetime="2024-09-27">September 27, 2024</time>
+                    <time class="postDate" datetime="2024-10-03">October 3, 2024</time>
                 </div>
                 <div class="postExcerpt">
                     <p></p>
@@ -160,13 +160,13 @@ Tags | codeskraps
 
         
 
-        <a class="postListLink" href="https://codeskraps.com/tags/kmp/">
+        <a class="postListLink" href="https://codeskraps.com/tags/react-native/">
             
             <div class="postListItem" role="listitem">
                 <div class="postHeader">
-                    <span class="postTitle">Kmp</span>
+                    <span class="postTitle">React-Native</span>
                     
-                    <time class="postDate" datetime="2024-09-27">September 27, 2024</time>
+                    <time class="postDate" datetime="2024-10-03">October 3, 2024</time>
                 </div>
                 <div class="postExcerpt">
                     <p></p>
@@ -177,11 +177,11 @@ Tags | codeskraps
 
         
 
-        <a class="postListLink" href="https://codeskraps.com/tags/kotlin/">
+        <a class="postListLink" href="https://codeskraps.com/tags/architecture/">
             
             <div class="postListItem" role="listitem">
                 <div class="postHeader">
-                    <span class="postTitle">Kotlin</span>
+                    <span class="postTitle">Architecture</span>
                     
                     <time class="postDate" datetime="2024-09-27">September 27, 2024</time>
                 </div>
@@ -244,6 +244,40 @@ Tags | codeskraps
 
 
         
+
+        <a class="postListLink" href="https://codeskraps.com/tags/git/">
+            
+            <div class="postListItem" role="listitem">
+                <div class="postHeader">
+                    <span class="postTitle">Git</span>
+                    
+                    <time class="postDate" datetime="2024-06-02">June 2, 2024</time>
+                </div>
+                <div class="postExcerpt">
+                    <p></p>
+                </div>
+            </div>
+        </a>
+
+
+        
+
+        <a class="postListLink" href="https://codeskraps.com/tags/ssh/">
+            
+            <div class="postListItem" role="listitem">
+                <div class="postHeader">
+                    <span class="postTitle">Ssh</span>
+                    
+                    <time class="postDate" datetime="2024-04-02">April 2, 2024</time>
+                </div>
+                <div class="postExcerpt">
+                    <p></p>
+                </div>
+            </div>
+        </a>
+
+
+        
     </div>
 </div>
 

+ 36 - 22
public/tags/index.xml

@@ -8,50 +8,50 @@
     <language>en-us</language>
     <managingEditor>me@codeskraps.com (codeskraps)</managingEditor>
     <webMaster>me@codeskraps.com (codeskraps)</webMaster>
-    <lastBuildDate>Wed, 02 Oct 2024 18:14:23 +0200</lastBuildDate>
+    <lastBuildDate>Thu, 03 Oct 2024 17:16:34 +0200</lastBuildDate>
     <atom:link href="https://codeskraps.com/tags/index.xml" rel="self" type="application/rss+xml" />
-    <item>
-      <title>Git</title>
-      <link>https://codeskraps.com/tags/git/</link>
-      <pubDate>Wed, 02 Oct 2024 18:14:23 +0200</pubDate><author>me@codeskraps.com (codeskraps)</author>
-      <guid>https://codeskraps.com/tags/git/</guid>
-      <description></description>
-    </item>
-    <item>
-      <title>Ssh</title>
-      <link>https://codeskraps.com/tags/ssh/</link>
-      <pubDate>Wed, 02 Oct 2024 16:56:53 +0200</pubDate><author>me@codeskraps.com (codeskraps)</author>
-      <guid>https://codeskraps.com/tags/ssh/</guid>
-      <description></description>
-    </item>
     <item>
       <title>Android</title>
       <link>https://codeskraps.com/tags/android/</link>
-      <pubDate>Fri, 27 Sep 2024 13:45:09 +0200</pubDate><author>me@codeskraps.com (codeskraps)</author>
+      <pubDate>Thu, 03 Oct 2024 17:16:34 +0200</pubDate><author>me@codeskraps.com (codeskraps)</author>
       <guid>https://codeskraps.com/tags/android/</guid>
       <description></description>
     </item>
     <item>
-      <title>Architecture</title>
-      <link>https://codeskraps.com/tags/architecture/</link>
-      <pubDate>Fri, 27 Sep 2024 13:45:09 +0200</pubDate><author>me@codeskraps.com (codeskraps)</author>
-      <guid>https://codeskraps.com/tags/architecture/</guid>
+      <title>Ios</title>
+      <link>https://codeskraps.com/tags/ios/</link>
+      <pubDate>Thu, 03 Oct 2024 17:16:34 +0200</pubDate><author>me@codeskraps.com (codeskraps)</author>
+      <guid>https://codeskraps.com/tags/ios/</guid>
       <description></description>
     </item>
     <item>
       <title>Kmp</title>
       <link>https://codeskraps.com/tags/kmp/</link>
-      <pubDate>Fri, 27 Sep 2024 13:45:09 +0200</pubDate><author>me@codeskraps.com (codeskraps)</author>
+      <pubDate>Thu, 03 Oct 2024 17:16:34 +0200</pubDate><author>me@codeskraps.com (codeskraps)</author>
       <guid>https://codeskraps.com/tags/kmp/</guid>
       <description></description>
     </item>
     <item>
       <title>Kotlin</title>
       <link>https://codeskraps.com/tags/kotlin/</link>
-      <pubDate>Fri, 27 Sep 2024 13:45:09 +0200</pubDate><author>me@codeskraps.com (codeskraps)</author>
+      <pubDate>Thu, 03 Oct 2024 17:16:34 +0200</pubDate><author>me@codeskraps.com (codeskraps)</author>
       <guid>https://codeskraps.com/tags/kotlin/</guid>
       <description></description>
     </item>
+    <item>
+      <title>React-Native</title>
+      <link>https://codeskraps.com/tags/react-native/</link>
+      <pubDate>Thu, 03 Oct 2024 17:16:34 +0200</pubDate><author>me@codeskraps.com (codeskraps)</author>
+      <guid>https://codeskraps.com/tags/react-native/</guid>
+      <description></description>
+    </item>
+    <item>
+      <title>Architecture</title>
+      <link>https://codeskraps.com/tags/architecture/</link>
+      <pubDate>Fri, 27 Sep 2024 13:45:09 +0200</pubDate><author>me@codeskraps.com (codeskraps)</author>
+      <guid>https://codeskraps.com/tags/architecture/</guid>
+      <description></description>
+    </item>
     <item>
       <title>Mvi</title>
       <link>https://codeskraps.com/tags/mvi/</link>
@@ -73,5 +73,19 @@
       <guid>https://codeskraps.com/tags/viewmodel/</guid>
       <description></description>
     </item>
+    <item>
+      <title>Git</title>
+      <link>https://codeskraps.com/tags/git/</link>
+      <pubDate>Sun, 02 Jun 2024 18:14:23 +0200</pubDate><author>me@codeskraps.com (codeskraps)</author>
+      <guid>https://codeskraps.com/tags/git/</guid>
+      <description></description>
+    </item>
+    <item>
+      <title>Ssh</title>
+      <link>https://codeskraps.com/tags/ssh/</link>
+      <pubDate>Tue, 02 Apr 2024 16:56:53 +0200</pubDate><author>me@codeskraps.com (codeskraps)</author>
+      <guid>https://codeskraps.com/tags/ssh/</guid>
+      <description></description>
+    </item>
   </channel>
 </rss>

+ 129 - 0
public/tags/ios/index.html

@@ -0,0 +1,129 @@
+<!DOCTYPE html>
+<html lang="en-us">
+
+<head>
+    <title>
+Ios | codeskraps
+</title>
+
+    <meta http-equiv="content-type" content="text/html; charset=utf-8">
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+<meta name="description" content="Your website description">
+
+<meta name="generator" content="Hugo 0.134.3">
+
+
+<link rel="canonical" href="https://codeskraps.com/tags/ios/" >
+  <link href="https://codeskraps.com/tags/ios/index.xml" rel="alternate" type="application/rss+xml" title="codeskraps" >
+  <link href="https://codeskraps.com/tags/ios/index.xml" rel="feed" type="application/rss+xml" title="codeskraps" >
+
+
+
+
+<link href="/css/style.min.ee0d47e4d4346c71a65a9e873108c81ffae54d60a2fc2338f6df394eb4b25a82.css" rel="stylesheet">
+
+
+
+
+</head>
+
+<body>
+
+    <div class="flexWrapper">
+        <header class="headerWrapper">
+    <div class="header">
+        <div>
+            <a class="terminal" href="https://codeskraps.com/">
+                <span>me@codeskraps.com ~ $</span>
+            </a>
+        </div>
+        <input class="side-menu" type="checkbox" id="side-menu">
+        <label class="hamb" for="side-menu"><span class="hamb-line"></span></label>
+        <nav class="headerLinks">
+            <ul>
+                
+                <li>
+                    <a href="https://codeskraps.com/projects/" title="" >
+                        ~/projects</a>
+                </li>
+                
+                <li>
+                    <a href="https://codeskraps.com/about/" title="" >
+                        ~/about</a>
+                </li>
+                
+                <li>
+                    <a href="https://codeskraps.com/posts/" title="" >
+                        ~/posts</a>
+                </li>
+                
+            </ul>
+        </nav>
+    </divi>
+    
+      <script async src="https://www.googletagmanager.com/gtag/js?id=G-YP8WK3KZF1"></script>
+      <script>
+        var doNotTrack = false;
+        if ( false ) {
+          var dnt = (navigator.doNotTrack || window.doNotTrack || navigator.msDoNotTrack);
+          var doNotTrack = (dnt == "1" || dnt == "yes");
+        }
+        if (!doNotTrack) {
+          window.dataLayer = window.dataLayer || [];
+          function gtag(){dataLayer.push(arguments);}
+          gtag('js', new Date());
+          gtag('config', 'G-YP8WK3KZF1');
+        }
+      </script>
+</header>
+
+
+        <div class="content">
+            <main class="main">
+                
+
+<div>
+    <div class="listHeader">
+        <h1>Ios</h1>
+    </div>
+
+    
+
+    <div>
+        
+
+        <a class="postListLink" href="https://codeskraps.com/posts/2024/react_vs_kmp/">
+            
+            <div class="postListItem" role="listitem">
+                <div class="postHeader">
+                    <span class="postTitle">React Native vs Kotlin Multiplatform</span>
+                    
+                    <time class="postDate" datetime="2024-10-03">October 3, 2024</time>
+                </div>
+                <div class="postExcerpt">
+                    <p><h2 id="introduction">Introduction</h2>
+<p>In the ever-evolving world of mobile app development, choosing the right cross-platform framework can be a game-changer for businesses and developers alike. Two prominent contenders in this space are React Native and Kotlin Multiplatform (KMP). Both offer unique approaches to the challenge of writing code once and deploying it across multiple platforms. This article will dive deep into the strengths and considerations of each, helping you make an informed decision for your next project.</p></p>
+                </div>
+            </div>
+        </a>
+
+
+        
+    </div>
+</div>
+
+
+            </main>
+        </div>
+
+
+        <footer class="footer">
+    
+        <span>Built with <a href="https://gohugo.io" class="footerLink">Hugo</a> and <a href="https://github.com/LordMathis/hugo-theme-nightfall" class="footerLink">Nightfall</a> theme</span>
+    
+</footer>
+    </div>
+
+</body>
+
+</html>

+ 21 - 0
public/tags/ios/index.xml

@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
+  <channel>
+    <title>Ios on codeskraps</title>
+    <link>https://codeskraps.com/tags/ios/</link>
+    <description>Recent content in Ios on codeskraps</description>
+    <generator>Hugo</generator>
+    <language>en-us</language>
+    <managingEditor>me@codeskraps.com (codeskraps)</managingEditor>
+    <webMaster>me@codeskraps.com (codeskraps)</webMaster>
+    <lastBuildDate>Thu, 03 Oct 2024 17:16:34 +0200</lastBuildDate>
+    <atom:link href="https://codeskraps.com/tags/ios/index.xml" rel="self" type="application/rss+xml" />
+    <item>
+      <title>React Native vs Kotlin Multiplatform</title>
+      <link>https://codeskraps.com/posts/2024/react_vs_kmp/</link>
+      <pubDate>Thu, 03 Oct 2024 17:16:34 +0200</pubDate><author>me@codeskraps.com (codeskraps)</author>
+      <guid>https://codeskraps.com/posts/2024/react_vs_kmp/</guid>
+      <description>&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;&#xA;&lt;p&gt;In the ever-evolving world of mobile app development, choosing the right cross-platform framework can be a game-changer for businesses and developers alike. Two prominent contenders in this space are React Native and Kotlin Multiplatform (KMP). Both offer unique approaches to the challenge of writing code once and deploying it across multiple platforms. This article will dive deep into the strengths and considerations of each, helping you make an informed decision for your next project.&lt;/p&gt;</description>
+    </item>
+  </channel>
+</rss>

+ 19 - 1
public/tags/kmp/index.html

@@ -92,7 +92,25 @@ Kmp | codeskraps
     <div>
         
 
-        <a class="postListLink" href="https://codeskraps.com/posts/mvi_architecture/">
+        <a class="postListLink" href="https://codeskraps.com/posts/2024/react_vs_kmp/">
+            
+            <div class="postListItem" role="listitem">
+                <div class="postHeader">
+                    <span class="postTitle">React Native vs Kotlin Multiplatform</span>
+                    
+                    <time class="postDate" datetime="2024-10-03">October 3, 2024</time>
+                </div>
+                <div class="postExcerpt">
+                    <p><h2 id="introduction">Introduction</h2>
+<p>In the ever-evolving world of mobile app development, choosing the right cross-platform framework can be a game-changer for businesses and developers alike. Two prominent contenders in this space are React Native and Kotlin Multiplatform (KMP). Both offer unique approaches to the challenge of writing code once and deploying it across multiple platforms. This article will dive deep into the strengths and considerations of each, helping you make an informed decision for your next project.</p></p>
+                </div>
+            </div>
+        </a>
+
+
+        
+
+        <a class="postListLink" href="https://codeskraps.com/posts/2024/mvi_architecture/">
             
             <div class="postListItem" role="listitem">
                 <div class="postHeader">

+ 10 - 3
public/tags/kmp/index.xml

@@ -8,13 +8,20 @@
     <language>en-us</language>
     <managingEditor>me@codeskraps.com (codeskraps)</managingEditor>
     <webMaster>me@codeskraps.com (codeskraps)</webMaster>
-    <lastBuildDate>Fri, 27 Sep 2024 13:45:09 +0200</lastBuildDate>
+    <lastBuildDate>Thu, 03 Oct 2024 17:16:34 +0200</lastBuildDate>
     <atom:link href="https://codeskraps.com/tags/kmp/index.xml" rel="self" type="application/rss+xml" />
+    <item>
+      <title>React Native vs Kotlin Multiplatform</title>
+      <link>https://codeskraps.com/posts/2024/react_vs_kmp/</link>
+      <pubDate>Thu, 03 Oct 2024 17:16:34 +0200</pubDate><author>me@codeskraps.com (codeskraps)</author>
+      <guid>https://codeskraps.com/posts/2024/react_vs_kmp/</guid>
+      <description>&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;&#xA;&lt;p&gt;In the ever-evolving world of mobile app development, choosing the right cross-platform framework can be a game-changer for businesses and developers alike. Two prominent contenders in this space are React Native and Kotlin Multiplatform (KMP). Both offer unique approaches to the challenge of writing code once and deploying it across multiple platforms. This article will dive deep into the strengths and considerations of each, helping you make an informed decision for your next project.&lt;/p&gt;</description>
+    </item>
     <item>
       <title>Simplifying MVI Architecture</title>
-      <link>https://codeskraps.com/posts/mvi_architecture/</link>
+      <link>https://codeskraps.com/posts/2024/mvi_architecture/</link>
       <pubDate>Fri, 27 Sep 2024 13:45:09 +0200</pubDate><author>me@codeskraps.com (codeskraps)</author>
-      <guid>https://codeskraps.com/posts/mvi_architecture/</guid>
+      <guid>https://codeskraps.com/posts/2024/mvi_architecture/</guid>
       <description>&lt;p&gt;Model-View-Intent (MVI) is a powerful architectural pattern for building user interfaces, especially in Android development. In this post, we&amp;rsquo;ll explore a helper class that simplifies the implementation of MVI, making it easier to manage state, handle user intents, and emit actions in your application.&lt;/p&gt;</description>
     </item>
   </channel>

+ 19 - 1
public/tags/kotlin/index.html

@@ -92,7 +92,25 @@ Kotlin | codeskraps
     <div>
         
 
-        <a class="postListLink" href="https://codeskraps.com/posts/mvi_architecture/">
+        <a class="postListLink" href="https://codeskraps.com/posts/2024/react_vs_kmp/">
+            
+            <div class="postListItem" role="listitem">
+                <div class="postHeader">
+                    <span class="postTitle">React Native vs Kotlin Multiplatform</span>
+                    
+                    <time class="postDate" datetime="2024-10-03">October 3, 2024</time>
+                </div>
+                <div class="postExcerpt">
+                    <p><h2 id="introduction">Introduction</h2>
+<p>In the ever-evolving world of mobile app development, choosing the right cross-platform framework can be a game-changer for businesses and developers alike. Two prominent contenders in this space are React Native and Kotlin Multiplatform (KMP). Both offer unique approaches to the challenge of writing code once and deploying it across multiple platforms. This article will dive deep into the strengths and considerations of each, helping you make an informed decision for your next project.</p></p>
+                </div>
+            </div>
+        </a>
+
+
+        
+
+        <a class="postListLink" href="https://codeskraps.com/posts/2024/mvi_architecture/">
             
             <div class="postListItem" role="listitem">
                 <div class="postHeader">

+ 10 - 3
public/tags/kotlin/index.xml

@@ -8,13 +8,20 @@
     <language>en-us</language>
     <managingEditor>me@codeskraps.com (codeskraps)</managingEditor>
     <webMaster>me@codeskraps.com (codeskraps)</webMaster>
-    <lastBuildDate>Fri, 27 Sep 2024 13:45:09 +0200</lastBuildDate>
+    <lastBuildDate>Thu, 03 Oct 2024 17:16:34 +0200</lastBuildDate>
     <atom:link href="https://codeskraps.com/tags/kotlin/index.xml" rel="self" type="application/rss+xml" />
+    <item>
+      <title>React Native vs Kotlin Multiplatform</title>
+      <link>https://codeskraps.com/posts/2024/react_vs_kmp/</link>
+      <pubDate>Thu, 03 Oct 2024 17:16:34 +0200</pubDate><author>me@codeskraps.com (codeskraps)</author>
+      <guid>https://codeskraps.com/posts/2024/react_vs_kmp/</guid>
+      <description>&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;&#xA;&lt;p&gt;In the ever-evolving world of mobile app development, choosing the right cross-platform framework can be a game-changer for businesses and developers alike. Two prominent contenders in this space are React Native and Kotlin Multiplatform (KMP). Both offer unique approaches to the challenge of writing code once and deploying it across multiple platforms. This article will dive deep into the strengths and considerations of each, helping you make an informed decision for your next project.&lt;/p&gt;</description>
+    </item>
     <item>
       <title>Simplifying MVI Architecture</title>
-      <link>https://codeskraps.com/posts/mvi_architecture/</link>
+      <link>https://codeskraps.com/posts/2024/mvi_architecture/</link>
       <pubDate>Fri, 27 Sep 2024 13:45:09 +0200</pubDate><author>me@codeskraps.com (codeskraps)</author>
-      <guid>https://codeskraps.com/posts/mvi_architecture/</guid>
+      <guid>https://codeskraps.com/posts/2024/mvi_architecture/</guid>
       <description>&lt;p&gt;Model-View-Intent (MVI) is a powerful architectural pattern for building user interfaces, especially in Android development. In this post, we&amp;rsquo;ll explore a helper class that simplifies the implementation of MVI, making it easier to manage state, handle user intents, and emit actions in your application.&lt;/p&gt;</description>
     </item>
   </channel>

+ 1 - 1
public/tags/mvi/index.html

@@ -92,7 +92,7 @@ Mvi | codeskraps
     <div>
         
 
-        <a class="postListLink" href="https://codeskraps.com/posts/mvi_architecture/">
+        <a class="postListLink" href="https://codeskraps.com/posts/2024/mvi_architecture/">
             
             <div class="postListItem" role="listitem">
                 <div class="postHeader">

+ 2 - 2
public/tags/mvi/index.xml

@@ -12,9 +12,9 @@
     <atom:link href="https://codeskraps.com/tags/mvi/index.xml" rel="self" type="application/rss+xml" />
     <item>
       <title>Simplifying MVI Architecture</title>
-      <link>https://codeskraps.com/posts/mvi_architecture/</link>
+      <link>https://codeskraps.com/posts/2024/mvi_architecture/</link>
       <pubDate>Fri, 27 Sep 2024 13:45:09 +0200</pubDate><author>me@codeskraps.com (codeskraps)</author>
-      <guid>https://codeskraps.com/posts/mvi_architecture/</guid>
+      <guid>https://codeskraps.com/posts/2024/mvi_architecture/</guid>
       <description>&lt;p&gt;Model-View-Intent (MVI) is a powerful architectural pattern for building user interfaces, especially in Android development. In this post, we&amp;rsquo;ll explore a helper class that simplifies the implementation of MVI, making it easier to manage state, handle user intents, and emit actions in your application.&lt;/p&gt;</description>
     </item>
   </channel>

+ 1 - 1
public/tags/mvvm/index.html

@@ -92,7 +92,7 @@ Mvvm | codeskraps
     <div>
         
 
-        <a class="postListLink" href="https://codeskraps.com/posts/mvi_architecture/">
+        <a class="postListLink" href="https://codeskraps.com/posts/2024/mvi_architecture/">
             
             <div class="postListItem" role="listitem">
                 <div class="postHeader">

+ 2 - 2
public/tags/mvvm/index.xml

@@ -12,9 +12,9 @@
     <atom:link href="https://codeskraps.com/tags/mvvm/index.xml" rel="self" type="application/rss+xml" />
     <item>
       <title>Simplifying MVI Architecture</title>
-      <link>https://codeskraps.com/posts/mvi_architecture/</link>
+      <link>https://codeskraps.com/posts/2024/mvi_architecture/</link>
       <pubDate>Fri, 27 Sep 2024 13:45:09 +0200</pubDate><author>me@codeskraps.com (codeskraps)</author>
-      <guid>https://codeskraps.com/posts/mvi_architecture/</guid>
+      <guid>https://codeskraps.com/posts/2024/mvi_architecture/</guid>
       <description>&lt;p&gt;Model-View-Intent (MVI) is a powerful architectural pattern for building user interfaces, especially in Android development. In this post, we&amp;rsquo;ll explore a helper class that simplifies the implementation of MVI, making it easier to manage state, handle user intents, and emit actions in your application.&lt;/p&gt;</description>
     </item>
   </channel>

+ 129 - 0
public/tags/react-native/index.html

@@ -0,0 +1,129 @@
+<!DOCTYPE html>
+<html lang="en-us">
+
+<head>
+    <title>
+React-Native | codeskraps
+</title>
+
+    <meta http-equiv="content-type" content="text/html; charset=utf-8">
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+<meta name="description" content="Your website description">
+
+<meta name="generator" content="Hugo 0.134.3">
+
+
+<link rel="canonical" href="https://codeskraps.com/tags/react-native/" >
+  <link href="https://codeskraps.com/tags/react-native/index.xml" rel="alternate" type="application/rss+xml" title="codeskraps" >
+  <link href="https://codeskraps.com/tags/react-native/index.xml" rel="feed" type="application/rss+xml" title="codeskraps" >
+
+
+
+
+<link href="/css/style.min.ee0d47e4d4346c71a65a9e873108c81ffae54d60a2fc2338f6df394eb4b25a82.css" rel="stylesheet">
+
+
+
+
+</head>
+
+<body>
+
+    <div class="flexWrapper">
+        <header class="headerWrapper">
+    <div class="header">
+        <div>
+            <a class="terminal" href="https://codeskraps.com/">
+                <span>me@codeskraps.com ~ $</span>
+            </a>
+        </div>
+        <input class="side-menu" type="checkbox" id="side-menu">
+        <label class="hamb" for="side-menu"><span class="hamb-line"></span></label>
+        <nav class="headerLinks">
+            <ul>
+                
+                <li>
+                    <a href="https://codeskraps.com/projects/" title="" >
+                        ~/projects</a>
+                </li>
+                
+                <li>
+                    <a href="https://codeskraps.com/about/" title="" >
+                        ~/about</a>
+                </li>
+                
+                <li>
+                    <a href="https://codeskraps.com/posts/" title="" >
+                        ~/posts</a>
+                </li>
+                
+            </ul>
+        </nav>
+    </divi>
+    
+      <script async src="https://www.googletagmanager.com/gtag/js?id=G-YP8WK3KZF1"></script>
+      <script>
+        var doNotTrack = false;
+        if ( false ) {
+          var dnt = (navigator.doNotTrack || window.doNotTrack || navigator.msDoNotTrack);
+          var doNotTrack = (dnt == "1" || dnt == "yes");
+        }
+        if (!doNotTrack) {
+          window.dataLayer = window.dataLayer || [];
+          function gtag(){dataLayer.push(arguments);}
+          gtag('js', new Date());
+          gtag('config', 'G-YP8WK3KZF1');
+        }
+      </script>
+</header>
+
+
+        <div class="content">
+            <main class="main">
+                
+
+<div>
+    <div class="listHeader">
+        <h1>React-Native</h1>
+    </div>
+
+    
+
+    <div>
+        
+
+        <a class="postListLink" href="https://codeskraps.com/posts/2024/react_vs_kmp/">
+            
+            <div class="postListItem" role="listitem">
+                <div class="postHeader">
+                    <span class="postTitle">React Native vs Kotlin Multiplatform</span>
+                    
+                    <time class="postDate" datetime="2024-10-03">October 3, 2024</time>
+                </div>
+                <div class="postExcerpt">
+                    <p><h2 id="introduction">Introduction</h2>
+<p>In the ever-evolving world of mobile app development, choosing the right cross-platform framework can be a game-changer for businesses and developers alike. Two prominent contenders in this space are React Native and Kotlin Multiplatform (KMP). Both offer unique approaches to the challenge of writing code once and deploying it across multiple platforms. This article will dive deep into the strengths and considerations of each, helping you make an informed decision for your next project.</p></p>
+                </div>
+            </div>
+        </a>
+
+
+        
+    </div>
+</div>
+
+
+            </main>
+        </div>
+
+
+        <footer class="footer">
+    
+        <span>Built with <a href="https://gohugo.io" class="footerLink">Hugo</a> and <a href="https://github.com/LordMathis/hugo-theme-nightfall" class="footerLink">Nightfall</a> theme</span>
+    
+</footer>
+    </div>
+
+</body>
+
+</html>

+ 21 - 0
public/tags/react-native/index.xml

@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
+  <channel>
+    <title>React-Native on codeskraps</title>
+    <link>https://codeskraps.com/tags/react-native/</link>
+    <description>Recent content in React-Native on codeskraps</description>
+    <generator>Hugo</generator>
+    <language>en-us</language>
+    <managingEditor>me@codeskraps.com (codeskraps)</managingEditor>
+    <webMaster>me@codeskraps.com (codeskraps)</webMaster>
+    <lastBuildDate>Thu, 03 Oct 2024 17:16:34 +0200</lastBuildDate>
+    <atom:link href="https://codeskraps.com/tags/react-native/index.xml" rel="self" type="application/rss+xml" />
+    <item>
+      <title>React Native vs Kotlin Multiplatform</title>
+      <link>https://codeskraps.com/posts/2024/react_vs_kmp/</link>
+      <pubDate>Thu, 03 Oct 2024 17:16:34 +0200</pubDate><author>me@codeskraps.com (codeskraps)</author>
+      <guid>https://codeskraps.com/posts/2024/react_vs_kmp/</guid>
+      <description>&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;&#xA;&lt;p&gt;In the ever-evolving world of mobile app development, choosing the right cross-platform framework can be a game-changer for businesses and developers alike. Two prominent contenders in this space are React Native and Kotlin Multiplatform (KMP). Both offer unique approaches to the challenge of writing code once and deploying it across multiple platforms. This article will dive deep into the strengths and considerations of each, helping you make an informed decision for your next project.&lt;/p&gt;</description>
+    </item>
+  </channel>
+</rss>

+ 2 - 2
public/tags/ssh/index.html

@@ -92,13 +92,13 @@ Ssh | codeskraps
     <div>
         
 
-        <a class="postListLink" href="https://codeskraps.com/posts/git_ssh_command/">
+        <a class="postListLink" href="https://codeskraps.com/posts/2024/git_ssh_command/">
             
             <div class="postListItem" role="listitem">
                 <div class="postHeader">
                     <span class="postTitle">Configuring SSH Keys for Individual Git Commands</span>
                     
-                    <time class="postDate" datetime="2024-10-02">October 2, 2024</time>
+                    <time class="postDate" datetime="2024-04-02">April 2, 2024</time>
                 </div>
                 <div class="postExcerpt">
                     <p><p>When working with Git repositories, you often need to authenticate using SSH keys. While you can configure SSH settings globally, there are times when you need to use a specific SSH key for just one command. This is particularly useful when cloning a new repository or adding a submodule, where there isn&rsquo;t yet a local <code>.git/config</code> file to modify.</p></p>

+ 4 - 4
public/tags/ssh/index.xml

@@ -8,13 +8,13 @@
     <language>en-us</language>
     <managingEditor>me@codeskraps.com (codeskraps)</managingEditor>
     <webMaster>me@codeskraps.com (codeskraps)</webMaster>
-    <lastBuildDate>Wed, 02 Oct 2024 16:56:53 +0200</lastBuildDate>
+    <lastBuildDate>Tue, 02 Apr 2024 16:56:53 +0200</lastBuildDate>
     <atom:link href="https://codeskraps.com/tags/ssh/index.xml" rel="self" type="application/rss+xml" />
     <item>
       <title>Configuring SSH Keys for Individual Git Commands</title>
-      <link>https://codeskraps.com/posts/git_ssh_command/</link>
-      <pubDate>Wed, 02 Oct 2024 16:56:53 +0200</pubDate><author>me@codeskraps.com (codeskraps)</author>
-      <guid>https://codeskraps.com/posts/git_ssh_command/</guid>
+      <link>https://codeskraps.com/posts/2024/git_ssh_command/</link>
+      <pubDate>Tue, 02 Apr 2024 16:56:53 +0200</pubDate><author>me@codeskraps.com (codeskraps)</author>
+      <guid>https://codeskraps.com/posts/2024/git_ssh_command/</guid>
       <description>&lt;p&gt;When working with Git repositories, you often need to authenticate using SSH keys. While you can configure SSH settings globally, there are times when you need to use a specific SSH key for just one command. This is particularly useful when cloning a new repository or adding a submodule, where there isn&amp;rsquo;t yet a local &lt;code&gt;.git/config&lt;/code&gt; file to modify.&lt;/p&gt;</description>
     </item>
   </channel>

+ 1 - 1
public/tags/viewmodel/index.html

@@ -92,7 +92,7 @@ Viewmodel | codeskraps
     <div>
         
 
-        <a class="postListLink" href="https://codeskraps.com/posts/mvi_architecture/">
+        <a class="postListLink" href="https://codeskraps.com/posts/2024/mvi_architecture/">
             
             <div class="postListItem" role="listitem">
                 <div class="postHeader">

+ 2 - 2
public/tags/viewmodel/index.xml

@@ -12,9 +12,9 @@
     <atom:link href="https://codeskraps.com/tags/viewmodel/index.xml" rel="self" type="application/rss+xml" />
     <item>
       <title>Simplifying MVI Architecture</title>
-      <link>https://codeskraps.com/posts/mvi_architecture/</link>
+      <link>https://codeskraps.com/posts/2024/mvi_architecture/</link>
       <pubDate>Fri, 27 Sep 2024 13:45:09 +0200</pubDate><author>me@codeskraps.com (codeskraps)</author>
-      <guid>https://codeskraps.com/posts/mvi_architecture/</guid>
+      <guid>https://codeskraps.com/posts/2024/mvi_architecture/</guid>
       <description>&lt;p&gt;Model-View-Intent (MVI) is a powerful architectural pattern for building user interfaces, especially in Android development. In this post, we&amp;rsquo;ll explore a helper class that simplifies the implementation of MVI, making it easier to manage state, handle user intents, and emit actions in your application.&lt;/p&gt;</description>
     </item>
   </channel>