<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>michalsn</title>
    <link>https://michalsn.dev/</link>
    <description>Recent content on michalsn</description>
    <generator>Hugo -- 0.154.2</generator>
    <language>en-us</language>
    <lastBuildDate>Tue, 21 Apr 2026 20:03:42 +0100</lastBuildDate>
    <atom:link href="https://michalsn.dev/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Meet Form Requests in CodeIgniter</title>
      <link>https://michalsn.dev/posts/form-requests-in-codeigniter/</link>
      <pubDate>Tue, 21 Apr 2026 20:03:42 +0100</pubDate>
      <guid>https://michalsn.dev/posts/form-requests-in-codeigniter/</guid>
      <description>Learn how Form Requests in CodeIgniter move validation and input normalization out of controllers with a small, runnable create-post example.</description>
    </item>
    <item>
      <title>Building an AI Chat with CodeIgniter, Ollama, and Neuron AI</title>
      <link>https://michalsn.dev/posts/building-an-ai-chat-with-codeigniter-ollama-and-neuron-ai/</link>
      <pubDate>Thu, 12 Feb 2026 19:55:21 +0100</pubDate>
      <guid>https://michalsn.dev/posts/building-an-ai-chat-with-codeigniter-ollama-and-neuron-ai/</guid>
      <description>Learn how to build a modern AI-powered chat application with CodeIgniter 4, featuring real-time SSE streaming, persistent conversation history, and function calling capabilities.</description>
    </item>
    <item>
      <title>Supercharge Your CodeIgniter 4 Applications with FrankenPHP Worker Mode</title>
      <link>https://michalsn.dev/posts/codeigniter-frankenphp-worker-mode/</link>
      <pubDate>Mon, 02 Feb 2026 07:32:17 +0100</pubDate>
      <guid>https://michalsn.dev/posts/codeigniter-frankenphp-worker-mode/</guid>
      <description>Discover how FrankenPHP&amp;rsquo;s worker mode delivers 2-3x performance improvements for CodeIgniter 4 applications with persistent database connections and zero-downtime request handling.</description>
    </item>
    <item>
      <title>Advanced Model Relations for CodeIgniter 4</title>
      <link>https://michalsn.dev/posts/advanced-model-relations-codeigniter4/</link>
      <pubDate>Sat, 03 Jan 2026 17:08:27 +0100</pubDate>
      <guid>https://michalsn.dev/posts/advanced-model-relations-codeigniter4/</guid>
      <description>Learn how to efficiently manage database relationships in CodeIgniter 4 with eager loading, lazy loading, and advanced relation patterns.</description>
    </item>
    <item>
      <title>Managing Dependencies in Application Modules: What Works for Your Users</title>
      <link>https://michalsn.dev/posts/managing-dependencies-in-application-modules/</link>
      <pubDate>Tue, 16 Dec 2025 16:39:11 +0100</pubDate>
      <guid>https://michalsn.dev/posts/managing-dependencies-in-application-modules/</guid>
      <description>How should modules manage their external dependencies? The answer isn&amp;rsquo;t purely technical - it depends on who&amp;rsquo;s installing them. This post explores the real-world trade-offs between Composer-managed, developer-friendly modules and self-contained, user-friendly packages.</description>
    </item>
    <item>
      <title>The Skipped Version Problem: How To Handle Module Updates</title>
      <link>https://michalsn.dev/posts/how-to-handle-module-updates/</link>
      <pubDate>Mon, 08 Dec 2025 15:20:39 +0100</pubDate>
      <guid>https://michalsn.dev/posts/how-to-handle-module-updates/</guid>
      <description>Updating modules sounds simple - until users skip versions. Suddenly migrations break, tables are missing, and update logic becomes a headache. See how a lightweight UpdateManifest can turn chaotic upgrades into a predictable, controlled process.</description>
    </item>
    <item>
      <title>Deferred Writes: Performance Optimization and Database Gotchas</title>
      <link>https://michalsn.dev/posts/deferred-writes/</link>
      <pubDate>Sun, 30 Nov 2025 10:34:02 +0100</pubDate>
      <guid>https://michalsn.dev/posts/deferred-writes/</guid>
      <description>A look behind the scenes of implementing deferred writes in the CodeIgniter 4 Settings package: how batching write operations improves performance, and the subtle database portability issue caused by NULL values in unique constraints.</description>
    </item>
    <item>
      <title>Building a Production-Ready File Handler for CodeIgniter 4 Settings</title>
      <link>https://michalsn.dev/posts/building-a-production-ready-file-handler-for-codeigniter-4-settings/</link>
      <pubDate>Wed, 29 Oct 2025 19:33:19 +0200</pubDate>
      <guid>https://michalsn.dev/posts/building-a-production-ready-file-handler-for-codeigniter-4-settings/</guid>
      <description>While CodeIgniter 4 Settings includes a database-backed handler, I wanted a file-based option that&amp;rsquo;s lightweight, fast, and safe for production use. I&amp;rsquo;ll walk through the challenges of handling concurrency, file locking, and caching, and explain the design choices behind the new FileHandler.</description>
    </item>
    <item>
      <title>Dead Letter Exchanges in RabbitMQ</title>
      <link>https://michalsn.dev/posts/dead-letter-exchanges-in-rabbitmq/</link>
      <pubDate>Mon, 15 Sep 2025 16:09:31 +0200</pubDate>
      <guid>https://michalsn.dev/posts/dead-letter-exchanges-in-rabbitmq/</guid>
      <description>Many people think Dead Letter Exchanges can handle only failures. In reality, they&amp;rsquo;re perfect for scheduling messages and delayed job processing. Let&amp;rsquo;s see how we can do it.</description>
    </item>
    <item>
      <title>Unix Signals in PHP: Building Bulletproof CLI Applications</title>
      <link>https://michalsn.dev/posts/unix-signals-in-php-building-bulletproof-cli-applications/</link>
      <pubDate>Thu, 21 Aug 2025 20:10:31 +0200</pubDate>
      <guid>https://michalsn.dev/posts/unix-signals-in-php-building-bulletproof-cli-applications/</guid>
      <description>Deep dive into Unix signal handling in PHP applications with object-oriented design patterns, edge cases, and production-ready implementations.</description>
    </item>
    <item>
      <title>When False CVEs Cause Real Problems</title>
      <link>https://michalsn.dev/posts/when-false-cves-cause-real-problems/</link>
      <pubDate>Tue, 29 Jul 2025 07:17:17 +0100</pubDate>
      <guid>https://michalsn.dev/posts/when-false-cves-cause-real-problems/</guid>
      <description>A closer look at CVE-2025-45406. An invalid vulnerability claim against CodeIgniter4 that caused real-world disruption, and a call for responsible disclosure.</description>
    </item>
    <item>
      <title>Event-Aware Pagination in CodeIgniter 4 Models</title>
      <link>https://michalsn.dev/posts/event-aware-pagination-in-codeigniter4-models/</link>
      <pubDate>Mon, 14 Jul 2025 17:45:17 +0100</pubDate>
      <guid>https://michalsn.dev/posts/event-aware-pagination-in-codeigniter4-models/</guid>
      <description>Discover why your CodeIgniter 4 pagination shows incorrect total counts when using model events, and implement a simple fix that ensures consistent filtering across both count and result queries.</description>
    </item>
    <item>
      <title>Implementing User Impersonation in CodeIgniter Shield</title>
      <link>https://michalsn.dev/posts/impersonation-with-codeigniter-shield/</link>
      <pubDate>Wed, 02 Jul 2025 20:10:32 +0100</pubDate>
      <guid>https://michalsn.dev/posts/impersonation-with-codeigniter-shield/</guid>
      <description>Implement secure user impersonation in CodeIgniter 4 using the Shield authentication system and a modular architecture.</description>
    </item>
    <item>
      <title>Getting Started with NeuronAI Workflows</title>
      <link>https://michalsn.dev/posts/getting-started-with-neuronai-workflows/</link>
      <pubDate>Fri, 20 Jun 2025 18:39:09 +0200</pubDate>
      <guid>https://michalsn.dev/posts/getting-started-with-neuronai-workflows/</guid>
      <description>Learn how to get started with NeuronAI Workflows by combining simple AI agents, tools, and APIs to automate basic tasks.</description>
    </item>
    <item>
      <title>Beyond MVC: Adding Managers to Your CodeIgniter 4 Applications</title>
      <link>https://michalsn.dev/posts/beyond-mvc-managers-in-codeigniter/</link>
      <pubDate>Sun, 15 Jun 2025 18:24:44 +0100</pubDate>
      <guid>https://michalsn.dev/posts/beyond-mvc-managers-in-codeigniter/</guid>
      <description>Learn how to extend the traditional MVC pattern with Managers in CodeIgniter 4 to handle complex business logic and create more maintainable applications.</description>
    </item>
    <item>
      <title>Managing Multiple .env Files for Multi-Client Applications in CodeIgniter 4</title>
      <link>https://michalsn.dev/posts/managing-multiple-env-files-in-codeigniter-4/</link>
      <pubDate>Mon, 02 Jun 2025 14:08:21 +0100</pubDate>
      <guid>https://michalsn.dev/posts/managing-multiple-env-files-in-codeigniter-4/</guid>
      <description>Extend CodeIgniter 4 to support multiple .env files for multi-client applications using a custom Boot class that automatically loads client-specific configurations based on domain detection.</description>
    </item>
    <item>
      <title>Scheduling Unique Tasks with CodeIgniter</title>
      <link>https://michalsn.dev/posts/scheduling-unique-tasks-with-codeigniter/</link>
      <pubDate>Tue, 06 May 2025 10:14:47 +0100</pubDate>
      <guid>https://michalsn.dev/posts/scheduling-unique-tasks-with-codeigniter/</guid>
      <description>&lt;p&gt;When you&amp;rsquo;re scheduling tasks in CodeIgniter 4, it&amp;rsquo;s not uncommon to run into issues where the same task gets triggered before the previous one finishes. This can cause anything from duplicate processing to race conditions and even server slowdowns.&lt;/p&gt;
&lt;p&gt;To help with that, &lt;a href=&#34;https://github.com/codeigniter4/tasks&#34;&gt;CodeIgniter Tasks&lt;/a&gt; provides a built-in method called &lt;code&gt;singleInstance()&lt;/code&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Chained Jobs with CodeIgniter Queue</title>
      <link>https://michalsn.dev/posts/chained-queue-jobs-in-codeigniter/</link>
      <pubDate>Thu, 17 Apr 2025 20:03:24 +0100</pubDate>
      <guid>https://michalsn.dev/posts/chained-queue-jobs-in-codeigniter/</guid>
      <description>&lt;p&gt;Job queues help handle background tasks like sending emails, generating reports, or resizing images - keeping your application fast and responsive. But what if you need tasks to run in a specific order? That’s where chained jobs shine.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Edu Snake Game in Vanilla Javascript</title>
      <link>https://michalsn.dev/posts/edu-snake-game-in-vanilla-javascript/</link>
      <pubDate>Wed, 26 Mar 2025 09:21:49 +0100</pubDate>
      <guid>https://michalsn.dev/posts/edu-snake-game-in-vanilla-javascript/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve recently developed a simple yet educational browser-based game called &lt;a href=&#34;https://github.com/michalsn/edu-snake-game&#34;&gt;Edu Snake Game&lt;/a&gt;. Built with vanilla JavaScript and the Canvas API, this game adds a learning element to the classic Snake gameplay.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Effortless multi-language content translation in your models</title>
      <link>https://michalsn.dev/posts/effortless-multi-language-content-translation/</link>
      <pubDate>Sun, 29 Dec 2024 21:32:17 +0100</pubDate>
      <guid>https://michalsn.dev/posts/effortless-multi-language-content-translation/</guid>
      <description>Simplify handling translatable content in your CodeIgniter 4 projects with the CodeIgniter Translatable library.</description>
    </item>
    <item>
      <title>Setting up OCI8 and Oracle XE with Docker on macOS</title>
      <link>https://michalsn.dev/posts/setting-up-oci8-and-oracle-xe-with-docker/</link>
      <pubDate>Mon, 23 Dec 2024 19:40:57 +0100</pubDate>
      <guid>https://michalsn.dev/posts/setting-up-oci8-and-oracle-xe-with-docker/</guid>
      <description>&lt;p&gt;Integrating OCI8 with a PHP environment can be challenging, but recent updates have simplified the process significantly. Follow this guide to get everything set up seamlessly.&lt;/p&gt;
&lt;h2 id=&#34;adding-oci8-support-to-php&#34;&gt;Adding OCI8 support to PHP&lt;/h2&gt;
&lt;p&gt;Oracle has streamlined the process for adding OCI8 support to PHP. Clear, user-friendly instructions are available in &lt;a href=&#34;https://gist.github.com/syahzul/d61d8ccea7c5959a84ed52d14159d8a9&#34;&gt;this Gist&lt;/a&gt;. Follow the steps outlined to prepare your PHP environment for OCI8.&lt;/p&gt;
&lt;h2 id=&#34;setting-up-oracle-xe-in-docker&#34;&gt;Setting up Oracle XE in Docker&lt;/h2&gt;
&lt;p&gt;Once your PHP environment is ready, you can move on to Docker setup. We&amp;rsquo;ll use the Oracle XE image available on Docker Hub: &lt;a href=&#34;https://hub.docker.com/r/gvenzl/oracle-xe&#34;&gt;gvenzl/oracle-xe&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Eager and Lazy Loading in CodeIgniter 4</title>
      <link>https://michalsn.dev/posts/codeigniter-model-relations/</link>
      <pubDate>Thu, 12 Dec 2024 10:30:52 +0100</pubDate>
      <guid>https://michalsn.dev/posts/codeigniter-model-relations/</guid>
      <description>Learn how to efficiently manage database queries in CodeIgniter 4 using eager and lazy loading techniques.</description>
    </item>
    <item>
      <title>User tracking with JavaScript</title>
      <link>https://michalsn.dev/posts/user-tracking-with-javascript/</link>
      <pubDate>Wed, 06 Nov 2024 18:06:23 +0100</pubDate>
      <guid>https://michalsn.dev/posts/user-tracking-with-javascript/</guid>
      <description>&lt;p&gt;If you’ve ever wanted to capture info about your users, you might be interested in this little experiment.&lt;/p&gt;
&lt;p&gt;With features like automatic page view tracking that logs details about your visitors’ browsers, devices, and more, plus the ability to log custom events like clicks, it’s perfect for anyone who enjoys tinkering with web analytics.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;PageViewEvents&lt;/code&gt; JavaScript class provides a streamlined way to capture and send data about page views and user interactions on your site.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Alerts for htmx and CodeIgniter 4</title>
      <link>https://michalsn.dev/posts/codeigniter-htmx-alerts/</link>
      <pubDate>Thu, 26 Sep 2024 12:35:09 +0100</pubDate>
      <guid>https://michalsn.dev/posts/codeigniter-htmx-alerts/</guid>
      <description>Discover how to set up alerts in a CodeIgniter 4 application using htmx and the codeigniter-htmx-alerts library.</description>
    </item>
    <item>
      <title>Working with PHP, Ollama and embeddings</title>
      <link>https://michalsn.dev/posts/working-with-php-ollama-and-embeddings/</link>
      <pubDate>Sun, 09 Jun 2024 09:44:19 +0100</pubDate>
      <guid>https://michalsn.dev/posts/working-with-php-ollama-and-embeddings/</guid>
      <description>Learn how to work with PHP, Ollama, and embeddings to enhance your AI capabilities using Retrieval Augmented Generation (RAG).</description>
    </item>
    <item>
      <title>CodeIgniter Markdown Pages</title>
      <link>https://michalsn.dev/posts/codeigniter-markdown-pages/</link>
      <pubDate>Fri, 29 Dec 2023 12:17:23 +0100</pubDate>
      <guid>https://michalsn.dev/posts/codeigniter-markdown-pages/</guid>
      <description>&lt;p&gt;Markdown Pages project allows you to map Markdown files to collections and easily list or read data from them.&lt;/p&gt;
&lt;p&gt;In addition to the Markdown parser, we also have the ability to parse YAML sections, where you can put a lot of useful information.&lt;/p&gt;
&lt;p&gt;How to start:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;composer michalsn/codeigniter-markdown-pages
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Basic usage:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$markdownPages &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;service&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;markdownpages&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;ROOTPATH&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;pages&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// Get the first directory
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$dir &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; $markdownPages&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;dirs&lt;/span&gt;()&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;first&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;echo&lt;/span&gt; $dir&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;getName&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// prints: Quick Start
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;echo&lt;/span&gt; $dir&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;getSlug&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// prints: quick-start
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;foreach&lt;/span&gt;($dir&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;getFiles&lt;/span&gt;()&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;items&lt;/span&gt;() &lt;span style=&#34;color:#66d9ef&#34;&gt;as&lt;/span&gt; $file) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;echo&lt;/span&gt; $file&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;getName&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// prints: Installation
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;echo&lt;/span&gt; $file&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;getSlug&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// prints: installation
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;echo&lt;/span&gt; $file&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;getPath&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// prints: quick-start/installation
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;echo&lt;/span&gt; $content&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;parse&lt;/span&gt;()&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;getContent&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// prints: parsed markdown from file
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;echo&lt;/span&gt; $content&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;parse&lt;/span&gt;()&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;getMeta&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// prints: parsed YAML as key -&amp;gt; value
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This project use &lt;a href=&#34;https://github.com/lonnieezell/myth-collection&#34;&gt;Collection&lt;/a&gt; class pretty much everywhere so please get familiar with it to use this package comfortably.&lt;/p&gt;</description>
    </item>
    <item>
      <title>CodeIgniter Queue</title>
      <link>https://michalsn.dev/posts/codeigniter-queue/</link>
      <pubDate>Sat, 14 Oct 2023 15:36:19 +0100</pubDate>
      <guid>https://michalsn.dev/posts/codeigniter-queue/</guid>
      <description>&lt;p&gt;While CodeIgniter 4 itself doesn&amp;rsquo;t have a built-in queue system, I have built one which rely on the database handler.&lt;/p&gt;
&lt;p&gt;But what is a queue? It&amp;rsquo;s a system that allows you to schedule and manage background tasks or jobs to be executed in the given order. These jobs can include sending emails, processing data, generating reports, and more. Using a queue system helps offload time-consuming or resource-intensive tasks from the main application, ensuring that the application remains responsive.&lt;/p&gt;</description>
    </item>
    <item>
      <title>CodeIgniter Tags</title>
      <link>https://michalsn.dev/posts/codeigniter-tags/</link>
      <pubDate>Thu, 28 Sep 2023 09:31:27 +0100</pubDate>
      <guid>https://michalsn.dev/posts/codeigniter-tags/</guid>
      <description>&lt;p&gt;Tags provide a way to organize content and improve the user&amp;rsquo;s experience by helping them discover related articles and navigate through a website&amp;rsquo;s content more efficiently. They are particularly useful in content-heavy websites or blogs where there&amp;rsquo;s a wide range of topics and subjects covered.
This blog also uses tags system. These tags help categorize and organize content to make it more accessible and searchable.&lt;/p&gt;
&lt;p&gt;Since there was no tags library for CodeIgniter 4, I decided to write one. The &lt;a href=&#34;https://github.com/michalsn/codeigniter-tags&#34;&gt;codeigniter-tags&lt;/a&gt; is designed to work with many content types at once, so we can use it in many models.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Auth0 CodeIgniter 4 package</title>
      <link>https://michalsn.dev/posts/auth0-codeigniter-4-package/</link>
      <pubDate>Wed, 16 Aug 2023 18:31:53 +0100</pubDate>
      <guid>https://michalsn.dev/posts/auth0-codeigniter-4-package/</guid>
      <description>Learn how to integrate Auth0 with CodeIgniter 4 to add secure user authentication and authorization features.</description>
    </item>
    <item>
      <title>Using Kinde with CodeIgniter 4</title>
      <link>https://michalsn.dev/posts/using-kinde-with-codeigniter-4/</link>
      <pubDate>Thu, 27 Jul 2023 10:04:27 +0100</pubDate>
      <guid>https://michalsn.dev/posts/using-kinde-with-codeigniter-4/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://kinde.com&#34;&gt;Kinde&lt;/a&gt; is an identity and access management platform that provides authentication and authorization services for web applications. It&amp;rsquo;s one of the direct auth0 competitors.&lt;/p&gt;
&lt;p&gt;The first thing that strikes you from the business side is that we get more options in the free version as well as higher limits for active users. It is also less expensive than auth0 when we finally reach the free limits. For startups that often use a cloud-based authentication model, this is a significant convenience.&lt;/p&gt;</description>
    </item>
    <item>
      <title>CodeIgniter Signed Url</title>
      <link>https://michalsn.dev/posts/codeigniter-signed-url/</link>
      <pubDate>Wed, 28 Dec 2022 10:11:43 +0100</pubDate>
      <guid>https://michalsn.dev/posts/codeigniter-signed-url/</guid>
      <description>&lt;p&gt;Signing URLs may be very useful when we want to prevent manual URL manipulation or when the given address should have an expiration date. &lt;a href=&#34;https://github.com/michalsn/codeigniter-signed-url&#34;&gt;CodeIgniter Signed URL&lt;/a&gt; package makes it very easy.&lt;/p&gt;</description>
    </item>
    <item>
      <title>CodeIgniter HTMX</title>
      <link>https://michalsn.dev/posts/codeigniter-htmx/</link>
      <pubDate>Mon, 12 Dec 2022 09:30:53 +0100</pubDate>
      <guid>https://michalsn.dev/posts/codeigniter-htmx/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://htmx.org&#34;&gt;HTMX&lt;/a&gt; is gaining in popularity. No wonder, because in a world overflowing with Javascript-based sites that getting more and more complicated to achieve even tiny result, this solution turns out to be a pleasant return to the past - in quite a good way.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Generating a custom domain link in CodeIgniter 4</title>
      <link>https://michalsn.dev/posts/generating-a-custom-domain-links-in-codeigniter-4/</link>
      <pubDate>Sun, 31 Jul 2022 16:01:38 +0200</pubDate>
      <guid>https://michalsn.dev/posts/generating-a-custom-domain-links-in-codeigniter-4/</guid>
      <description>&lt;p&gt;How can we handle generation of a custom domain link in CodeIgniter 4? Although this is not a built-in feature, we can deal with it in a fairly simple way.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Serverless Codeigniter 4</title>
      <link>https://michalsn.dev/posts/serverless-codeigniter-4/</link>
      <pubDate>Thu, 07 Jul 2022 18:24:14 +0200</pubDate>
      <guid>https://michalsn.dev/posts/serverless-codeigniter-4/</guid>
      <description>&lt;p&gt;Serverless has been very popular for several years now. When we need very high performance it can be a very good alternative to traditional server solutions. Therefore, this time we will try to run CodeIgniter 4 in a serverless environment.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Verification of CNAME record for custom domain</title>
      <link>https://michalsn.dev/posts/verify-cname-for-domain/</link>
      <pubDate>Mon, 22 Nov 2021 16:10:35 +0200</pubDate>
      <guid>https://michalsn.dev/posts/verify-cname-for-domain/</guid>
      <description>&lt;p&gt;When we give users option to connect their own domain to our service, we must also check that the DNS record has the correct &lt;code&gt;CNAME&lt;/code&gt; settings before we approve such a domain.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Setting dynamic subdomains for every user account</title>
      <link>https://michalsn.dev/posts/setting-dynamic-subdomains-for-every-user-account/</link>
      <pubDate>Mon, 18 Oct 2021 11:42:57 +0200</pubDate>
      <guid>https://michalsn.dev/posts/setting-dynamic-subdomains-for-every-user-account/</guid>
      <description>&lt;p&gt;What if we want every user in our application to have his data served through his own subdomain? I will show you how to do it in CodeIgniter 4 framework.&lt;/p&gt;</description>
    </item>
    <item>
      <title>INSERT ON DUPLICATE KEY UPDATE with CodeIgniter 4</title>
      <link>https://michalsn.dev/posts/insert-on-duplicate-key-update-with-codeigniter-4/</link>
      <pubDate>Fri, 15 Oct 2021 13:10:11 +0200</pubDate>
      <guid>https://michalsn.dev/posts/insert-on-duplicate-key-update-with-codeigniter-4/</guid>
      <description>&lt;p&gt;I recently had to use a query with &lt;strong&gt;INSERT ON DUPLICATE KEY UPDATE&lt;/strong&gt;, but CodeIgniter 4 does not have built-in support for this type of query because it is not available in all database drivers.&lt;/p&gt;</description>
    </item>
    <item>
      <title>CodeIgniter 4 &#43; Mix with versioning</title>
      <link>https://michalsn.dev/posts/codeigniter-4-mix-versioning/</link>
      <pubDate>Wed, 25 Aug 2021 21:05:40 +0200</pubDate>
      <guid>https://michalsn.dev/posts/codeigniter-4-mix-versioning/</guid>
      <description>&lt;p&gt;Last time I showed you how to easily integrate Mix with CodeIgniter 4. This time we&amp;rsquo;ll complete the integration process by implementing a helper which will make using versioned assets very convenient and easy.&lt;/p&gt;</description>
    </item>
    <item>
      <title>CodeIgniter 4 &#43; Mix</title>
      <link>https://michalsn.dev/posts/codeigniter-4-mix/</link>
      <pubDate>Mon, 23 Aug 2021 23:04:33 +0200</pubDate>
      <guid>https://michalsn.dev/posts/codeigniter-4-mix/</guid>
      <description>&lt;p&gt;Today we are going to look at configuring CodeIgniter 4 in conjunction with &lt;a href=&#34;https://laravel.com/docs/8.x/mix&#34;&gt;Mix&lt;/a&gt;. Mix is one of the components that comes with the Laravel framework.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Integrating CodeIgniter 4 with Auth0</title>
      <link>https://michalsn.dev/posts/integrating-codeigniter-4-with-auth0/</link>
      <pubDate>Sun, 06 Jun 2021 15:51:17 +0200</pubDate>
      <guid>https://michalsn.dev/posts/integrating-codeigniter-4-with-auth0/</guid>
      <description>Understand the basics of setting up a search functionality in your Hugo site.</description>
    </item>
    <item>
      <title>Upload files directly to S3 with Dropzone.js</title>
      <link>https://michalsn.dev/posts/upload-files-directly-to-s3-with-dropzonejs-and-codeigniter-4/</link>
      <pubDate>Sun, 09 May 2021 16:49:45 +0200</pubDate>
      <guid>https://michalsn.dev/posts/upload-files-directly-to-s3-with-dropzonejs-and-codeigniter-4/</guid>
      <description>&lt;p&gt;Uploading files directly to S3 requires a few changes to the way Dropzone handles uploads, but it&amp;rsquo;s nothing particularly difficult.&lt;/p&gt;</description>
    </item>
    <item>
      <title>UUID with CodeIgniter 4</title>
      <link>https://michalsn.dev/posts/uuid-with-codeigniter-4/</link>
      <pubDate>Sat, 24 Apr 2021 18:24:51 +0200</pubDate>
      <guid>https://michalsn.dev/posts/uuid-with-codeigniter-4/</guid>
      <description>&lt;p&gt;Up until now, working with UUIDs and CodeIgniter 4 hasn&amp;rsquo;t been much fun, but that has now changed with the &lt;a href=&#34;https://github.com/michalsn/codeigniter4-uuid&#34;&gt;codeigniter4-uuid&lt;/a&gt; library.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Open Source</title>
      <link>https://michalsn.dev/projects/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://michalsn.dev/projects/</guid>
      <description>&lt;p&gt;Here are some of my personal open source projects that I&amp;rsquo;m currently working on or have worked on in the past.&lt;/p&gt;
&lt;h3 id=&#34;codeigniter-relations&#34;&gt;&lt;a href=&#34;https://github.com/michalsn/codeigniter-relations&#34;&gt;CodeIgniter Relations&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;A powerful package that brings elegant relationship management to CodeIgniter 4 applications. It simplifies working with related data across multiple tables with support for eager loading, lazy loading, and nine different relationship types, while preventing N+1 query problems.&lt;/p&gt;
&lt;h3 id=&#34;codeigniter-module-manager&#34;&gt;&lt;a href=&#34;https://github.com/michalsn/codeigniter-module-manager&#34;&gt;CodeIgniter Module Manager&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This package provides a structured system for managing the complete lifecycle of modules in CodeIgniter 4. It enables organizing functionality into self-contained, reusable components with distinct phases for discovery, installation, updates, and maintenance, offering granular control over module activation.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Privacy Policy</title>
      <link>https://michalsn.dev/privacy/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://michalsn.dev/privacy/</guid>
      <description>&lt;p&gt;We use cookies only to improve your experience and to enable optional functionality such as analytics.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You can accept or deny cookies using the cookie banner.&lt;/li&gt;
&lt;li&gt;No personal data is stored by this website.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;third-party-services&#34;&gt;Third-Party Services&lt;/h3&gt;
&lt;h4 id=&#34;utterances-comments&#34;&gt;Utterances (Comments)&lt;/h4&gt;
&lt;p&gt;Comments are powered by &lt;a href=&#34;https://utteranc.es/&#34;&gt;Utterances&lt;/a&gt;, a GitHub-based open-source commenting system. Utterances:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Does &lt;strong&gt;not track visitors&lt;/strong&gt; or serve ads&lt;/li&gt;
&lt;li&gt;Stores comments as GitHub issues in this repository&lt;/li&gt;
&lt;li&gt;Loads a script from &lt;code&gt;https://utteranc.es/&lt;/code&gt; to render the comment section&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For more information, see &lt;a href=&#34;https://utteranc.es/&#34;&gt;Utterances&lt;/a&gt; and &lt;a href=&#34;https://docs.github.com/en/site-policy/privacy-policies&#34;&gt;GitHub’s Privacy Statement&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
