<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Ian Ochieng</title>
    <description>The latest articles on DEV Community by Ian Ochieng (@gilads-otiannoh24).</description>
    <link>https://dev.to/gilads-otiannoh24</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3390968%2Ffa11f724-649b-41c7-8c17-b8d4611d52cb.png</url>
      <title>DEV Community: Ian Ochieng</title>
      <link>https://dev.to/gilads-otiannoh24</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/gilads-otiannoh24"/>
    <language>en</language>
    <item>
      <title>Refactoring Without Restarting: What 6 Months of Rebuilding My CodeIgniter App Taught Me About Growth</title>
      <dc:creator>Ian Ochieng</dc:creator>
      <pubDate>Tue, 07 Oct 2025 23:46:58 +0000</pubDate>
      <link>https://dev.to/gilads-otiannoh24/refactoring-without-restarting-what-6-months-of-rebuilding-my-codeigniter-app-taught-me-about-1ahg</link>
      <guid>https://dev.to/gilads-otiannoh24/refactoring-without-restarting-what-6-months-of-rebuilding-my-codeigniter-app-taught-me-about-1ahg</guid>
      <description>&lt;p&gt;It’s been about six months since I restarted a project that’s become a big part of my developer journey — a web app I maintain for a SACCO.&lt;br&gt;&lt;br&gt;
I’ve rebuilt it several times over the years, but this latest version has really tested my patience, skills, and growth as a developer.&lt;/p&gt;

&lt;p&gt;When I first started, everything looked great. I was moving fast, adding features, improving UI, integrating packages — the usual excitement. But over time, the lack of &lt;strong&gt;tests&lt;/strong&gt; and &lt;strong&gt;framework support&lt;/strong&gt; hit me like a wall. &lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 The Pain of Progress
&lt;/h2&gt;

&lt;p&gt;The project runs on &lt;strong&gt;CodeIgniter 4&lt;/strong&gt;, which I love for its simplicity, but let’s be honest — it doesn’t have the kind of community support or ecosystem that something like Laravel or Node.js has.&lt;br&gt;&lt;br&gt;
When you can’t just &lt;code&gt;composer require&lt;/code&gt; a solution, you end up &lt;em&gt;becoming&lt;/em&gt; the package maintainer yourself. 😅&lt;/p&gt;

&lt;p&gt;That part was both empowering and exhausting. I wrote custom helpers, small internal libraries, and unique workflows to fill the gaps. But because I wasn’t writing tests, the codebase slowly became... unstable.&lt;/p&gt;

&lt;p&gt;I’d fix one bug, and two more would pop up somewhere else. The logs were inconsistent, and I kept finding small cracks in places I thought were solid. Every fix started to feel like pulling a loose thread on a sweater — you never knew what else might unravel.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔍 When I Realized I Needed Tests
&lt;/h2&gt;

&lt;p&gt;After a few months of firefighting, it hit me:  &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I wasn’t dealing with bad code — I was dealing with &lt;strong&gt;untested&lt;/strong&gt; code.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I could make changes confidently only if I had a safety net. So I decided that for the next two months, I’ll focus purely on &lt;strong&gt;writing tests&lt;/strong&gt; — not new features, not refactors, just tests.  &lt;/p&gt;

&lt;p&gt;I want to cover:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;All custom helper packages I’ve built.&lt;/li&gt;
&lt;li&gt;The core logic that handles member records, transactions, and reporting.&lt;/li&gt;
&lt;li&gt;Critical flows that tend to break whenever something else changes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s going to be a painful process, but I finally understand why people say &lt;em&gt;“untested code is legacy code the moment it’s written.”&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🧩 Framework FOMO and the Temptation to Restart
&lt;/h2&gt;

&lt;p&gt;Since I started this project, I’ve used other frameworks — &lt;strong&gt;Laravel&lt;/strong&gt;, &lt;strong&gt;Node.js&lt;/strong&gt;, and even &lt;strong&gt;TempestPHP&lt;/strong&gt;, a new one that’s been catching my eye lately.&lt;br&gt;&lt;br&gt;
Every time I try something new, I see features and design patterns that make me want to go back and “rebuild everything again.”&lt;/p&gt;

&lt;p&gt;But not this time.  &lt;/p&gt;

&lt;p&gt;This time, I’m sticking with it.&lt;br&gt;&lt;br&gt;
I’ve restarted this project too many times already, and I’ve realized that &lt;strong&gt;real growth comes from improving what you already have&lt;/strong&gt;, not starting over every time you see something shinier.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚙️ What cspine Taught Me About Value
&lt;/h2&gt;

&lt;p&gt;Somewhere along this journey, I built &lt;strong&gt;&lt;a href="https://www.npmjs.com/package/@gilads-otiannoh24/cspine" rel="noopener noreferrer"&gt;cspine&lt;/a&gt;&lt;/strong&gt; — a small AlpineJS plugin to make it easier working with its CSP build.&lt;br&gt;&lt;br&gt;
I didn’t expect much from it, but it slowly started getting traction: &lt;strong&gt;two stars on GitHub&lt;/strong&gt; and around &lt;strong&gt;50 weekly downloads&lt;/strong&gt; on npm - it was more at some point.&lt;/p&gt;

&lt;p&gt;That may not sound like much, but to me, it means something powerful — &lt;strong&gt;someone out there found value in something I built&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It made me realize I should start sharing my experiences more — writing about my learning process, the frameworks I try, the errors I fight through.&lt;br&gt;&lt;br&gt;
Maybe through blog posts like this one. Maybe through platforms like &lt;strong&gt;Dev.to&lt;/strong&gt; or &lt;strong&gt;Hashnode&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
Because even the messy parts of this journey can help someone else.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧭 Looking Ahead
&lt;/h2&gt;

&lt;p&gt;Right now, my focus is clear:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Write tests for the SACCO app.
&lt;/li&gt;
&lt;li&gt;Stabilize the codebase and remove inconsistencies.
&lt;/li&gt;
&lt;li&gt;Keep improving the developer experience of my custom packages.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I don’t plan to restart this project again — I’ve come too far to throw it away.&lt;br&gt;&lt;br&gt;
The goal now is &lt;strong&gt;refinement&lt;/strong&gt;, not reinvention.&lt;/p&gt;

&lt;p&gt;And honestly?&lt;br&gt;&lt;br&gt;
Even though the logs are sometimes inconsistent and debugging drives me insane, I’m proud of what I’ve built.&lt;br&gt;&lt;br&gt;
I’ve learned more from this “broken” codebase than I could have from a dozen tutorials.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚡ Final Thoughts
&lt;/h2&gt;

&lt;p&gt;The inconsistencies and frustrations still scare me.&lt;br&gt;&lt;br&gt;
But they also remind me that I’m building something real — something that’s growing with me.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“This is what the next level of growth looks like — messy, painful, but absolutely worth it.”&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;em&gt;Thanks for reading. If you’ve gone through similar growing pains with a long-term project, I’d love to hear your story.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>ci4</category>
      <category>php</category>
    </item>
    <item>
      <title>Introducing Jengo React Starter Kit – Build CI4 Apps with React &amp; Inertia.js Effortlessly</title>
      <dc:creator>Ian Ochieng</dc:creator>
      <pubDate>Sun, 27 Jul 2025 04:09:32 +0000</pubDate>
      <link>https://dev.to/gilads-otiannoh24/introducing-jengo-react-starter-kit-build-ci4-apps-with-react-inertiajs-effortlessly-p8i</link>
      <guid>https://dev.to/gilads-otiannoh24/introducing-jengo-react-starter-kit-build-ci4-apps-with-react-inertiajs-effortlessly-p8i</guid>
      <description>&lt;p&gt;Hi devs 👋,&lt;/p&gt;

&lt;p&gt;After working with &lt;strong&gt;CodeIgniter 4&lt;/strong&gt;, &lt;strong&gt;React&lt;/strong&gt;, and &lt;strong&gt;Inertia.js&lt;/strong&gt; across a few projects, I found myself repeating the same setup steps over and over again — composer configs, Webpack, directory structure, React + Inertia integration... You know the drill.&lt;/p&gt;

&lt;p&gt;So I decided to package it all up into something clean and reusable:&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://packagist.org/packages/jengo/react-starter-kit" rel="noopener noreferrer"&gt;&lt;code&gt;jengo/react-starter-kit&lt;/code&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;A Composer-powered starter kit for building full-stack apps using:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;CodeIgniter 4&lt;/strong&gt; – a fast PHP framework&lt;/li&gt;
&lt;li&gt;⚛️ &lt;strong&gt;React&lt;/strong&gt; – frontend library of choice&lt;/li&gt;
&lt;li&gt;🧭 &lt;strong&gt;Inertia.js&lt;/strong&gt; – the glue between backend and frontend&lt;/li&gt;
&lt;li&gt;🎨 &lt;strong&gt;Tailwind CSS + DaisyUI&lt;/strong&gt; – modern UI styling&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ✨ Features
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;⚡ Pre-configured Inertia.js bridge for CI4&lt;/li&gt;
&lt;li&gt;⚛️ React + Webpack setup ready to go&lt;/li&gt;
&lt;li&gt;🎨 Tailwind CSS + DaisyUI support out of the box&lt;/li&gt;
&lt;li&gt;📁 Opinionated folder structure for smooth separation of concerns&lt;/li&gt;
&lt;li&gt;🚀 Dev server powered by CI4's php server at port &lt;code&gt;:8080&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;🧪 Includes a clean welcome page with layout structure&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🚀 Quick Start
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;composer create-project jengo/react-starter-kit my-app

&lt;span class="nb"&gt;cd &lt;/span&gt;my-app
npm &lt;span class="nb"&gt;install
&lt;/span&gt;npm run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Visit &lt;a href="http://localhost:8080" rel="noopener noreferrer"&gt;http://localhost:8080&lt;/a&gt; and you're up and running!&lt;/p&gt;




&lt;h2&gt;
  
  
  🔍 Folder Structure
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;app/Controllers/       &lt;span class="c"&gt;# Backend routes/controllers&lt;/span&gt;
resources/js/Pages/    &lt;span class="c"&gt;# React components&lt;/span&gt;
resources/js/Shared/   &lt;span class="c"&gt;# Shared layouts/components&lt;/span&gt;
public/                &lt;span class="c"&gt;# Web root&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  📸 Welcome Page Preview
&lt;/h2&gt;

&lt;p&gt;A basic layout is already set up with a simple welcome message:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Home.jsx&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Home&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Layout&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h2&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;🎉 Welcome to Jengo React Starter Kit&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h2&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        You're now running a full-stack app powered by&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;strong&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;CodeIgniter 4&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;strong&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;, &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;strong&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;React&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;strong&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;, and&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;strong&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Inertia.js&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;strong&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;.
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Layout&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🤔 Why This?
&lt;/h2&gt;

&lt;p&gt;There wasn’t a starter kit that bridged CodeIgniter 4 with React and Inertia.js in a clean, modern way — especially one that embraced Tailwind and developer ergonomics.&lt;/p&gt;

&lt;p&gt;So I created one — and I’ll keep improving it as I use it in real-world projects.&lt;/p&gt;




&lt;h2&gt;
  
  
  📦 Package Link
&lt;/h2&gt;

&lt;p&gt;👉 &lt;a href="https://packagist.org/packages/jengo/react-starter-kit" rel="noopener noreferrer"&gt;https://packagist.org/packages/jengo/react-starter-kit&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🛠️ Maintained by Me
&lt;/h2&gt;

&lt;p&gt;I’m also maintaining a modern &lt;a href="https://github.com/gilads-otiannoh24/inertia-ci4" rel="noopener noreferrer"&gt;InertiaJS adapter for CI4&lt;/a&gt; that this starter kit uses under the hood.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 Let Me Know What You Think
&lt;/h2&gt;

&lt;p&gt;Would love your feedback!&lt;br&gt;
Try it out, drop a star ⭐ on the repo if it helps you, and feel free to suggest improvements or contribute.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Happy coding,&lt;/strong&gt;&lt;br&gt;
—Ian (a dev who believes AI &amp;amp; tools should empower creators everywhere)&lt;/p&gt;

</description>
      <category>ci4</category>
      <category>react</category>
      <category>php</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
