<?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: CodenificienT</title>
    <description>The latest articles on DEV Community by CodenificienT (@codenificient).</description>
    <link>https://dev.to/codenificient</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4050404%2F52da94ab-406d-4cd9-8a51-5eaab47acae8.png</url>
      <title>DEV Community: CodenificienT</title>
      <link>https://dev.to/codenificient</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/codenificient"/>
    <language>en</language>
    <item>
      <title>The Aspiring AI Engineer: Educative Learning Path</title>
      <dc:creator>CodenificienT</dc:creator>
      <pubDate>Tue, 28 Jul 2026 03:51:04 +0000</pubDate>
      <link>https://dev.to/codenificient/the-aspiring-ai-engineer-educative-learning-path-1453</link>
      <guid>https://dev.to/codenificient/the-aspiring-ai-engineer-educative-learning-path-1453</guid>
      <description>&lt;p&gt;Published on Aug 28th, 2025&lt;/p&gt;

&lt;p&gt;I've just finished &lt;strong&gt;Module 1: Learn Python&lt;/strong&gt; from the &lt;a href="https://www.educative.io/path/become-a-machine-learning-engineer" rel="noopener noreferrer"&gt;Machine Learning Engineer Career Path&lt;/a&gt; on &lt;a href="http://Educative.com" rel="noopener noreferrer"&gt;Educative.com&lt;/a&gt;, and I'm excited to share what I've learned! This foundational module has equipped me with the essential Python programming skills needed to tackle machine learning algorithms and data science projects.&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 &lt;strong&gt;What I Accomplished&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Over the course of Module 1, I completed &lt;strong&gt;40+ hands-on Python exercises&lt;/strong&gt; that covered everything from basic syntax to building interactive applications. Each exercise was designed to reinforce programming concepts through practical, real-world scenarios.&lt;/p&gt;




&lt;h2&gt;
  
  
  📚 &lt;strong&gt;Core Concepts Mastered&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;1. Python Fundamentals &amp;amp; Syntax&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Variables &amp;amp; Data Types&lt;/strong&gt;: Learned to work with strings, integers, floats, and boolean values&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Input/Output Operations&lt;/strong&gt;: Mastered &lt;code&gt;print()&lt;/code&gt; statements and &lt;code&gt;input()&lt;/code&gt; functions for user interaction&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Basic Operations&lt;/strong&gt;: Arithmetic operations, string concatenation, and type conversion&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Example from my work:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Hello.py - My first Python program
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Welcome to the Machine Learning course by Educative!!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;2. Control Flow &amp;amp; Decision Making&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Conditional Statements&lt;/strong&gt;: Implemented &lt;code&gt;if&lt;/code&gt;, &lt;code&gt;elif&lt;/code&gt;, and &lt;code&gt;else&lt;/code&gt; statements for program logic&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Comparison Operators&lt;/strong&gt;: Used &lt;code&gt;==&lt;/code&gt;, &lt;code&gt;!=&lt;/code&gt;, &lt;code&gt;&amp;lt;&lt;/code&gt;, &lt;code&gt;&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;=&lt;/code&gt;, &lt;code&gt;&amp;gt;=&lt;/code&gt; for decision making&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Logical Operators&lt;/strong&gt;: Combined conditions with &lt;code&gt;and&lt;/code&gt;, &lt;code&gt;or&lt;/code&gt;, and &lt;code&gt;not&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Real-world application:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Conditionals Movies.py - Age-appropriate movie recommendations
&lt;/span&gt;&lt;span class="n"&gt;age&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Enter your age: &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;You can watch R-rated movies&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;You can watch PG-13 movies&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;You can watch PG movies&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;3. Loops &amp;amp; Iteration&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;For Loops&lt;/strong&gt;: Iterated through lists, ranges, and sequences&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;While Loops&lt;/strong&gt;: Created programs that run until specific conditions are met&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Loop Control&lt;/strong&gt;: Used &lt;code&gt;break&lt;/code&gt; and &lt;code&gt;continue&lt;/code&gt; statements effectively&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Practical example:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# While Loops.py - Interactive user input handling
&lt;/span&gt;&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Enter your name (or &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;quit&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt; to exit): &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;quit&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;break&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Hello, &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;4. Data Structures&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Lists&lt;/strong&gt;: Created, modified, and manipulated ordered collections&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Dictionaries&lt;/strong&gt;: Built key-value pairs for storing related information&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Data Manipulation&lt;/strong&gt;: Added, removed, and updated elements in collections&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Hands-on practice:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Lists.py - Working with collections
&lt;/span&gt;&lt;span class="n"&gt;fruits&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;apple&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;banana&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;orange&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;fruits&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;grape&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Available fruits: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;fruits&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;5. Functions &amp;amp; Code Organization&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Function Definition&lt;/strong&gt;: Created reusable code blocks with &lt;code&gt;def&lt;/code&gt; statements&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Parameters &amp;amp; Return Values&lt;/strong&gt;: Built functions that accept input and produce output&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Code Reusability&lt;/strong&gt;: Organized code into logical, maintainable functions&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Advanced function example:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# function adv layers.py - Interactive storytelling
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;jungle_adventure&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;You find two paths: one goes to a river, the other to a mountain. Where do you go? &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;river&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;You swim with dolphins!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;mountain&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;You find an ancient temple!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;You wander into the savannah and get lost.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;jungle_adventure&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;6. File Operations&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Reading Files&lt;/strong&gt;: Opened and processed data from text files&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Writing Files&lt;/strong&gt;: Created and updated files to store information&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;File Management&lt;/strong&gt;: Handled file paths, error handling, and data persistence&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Practical file handling:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# file diary.py - Personal journal system
&lt;/span&gt;&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;diary.txt&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;a&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nb"&gt;file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;entry&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Write your diary entry: &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nb"&gt;file&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;entry&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;7. Graphics &amp;amp; Visualization&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Turtle Graphics&lt;/strong&gt;: Created visual patterns and shapes using Python's turtle module&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Color Manipulation&lt;/strong&gt;: Applied different colors and styles to graphics&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Geometric Drawing&lt;/strong&gt;: Built hexagons, spirals, and complex patterns&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Creative coding:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# graphics hexagon.py - Geometric art
&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;turtle&lt;/span&gt;
&lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;turtle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Turtle&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forward&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;right&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🎮 &lt;strong&gt;Interactive Projects Built&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;1. Temperature Converter&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Built a comprehensive temperature conversion tool that handles Celsius, Fahrenheit, and Kelvin conversions with user-friendly menus and multiple conversion options.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;2. Personal Habit Tracker&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Created an interactive habit tracking system that allows users to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Add multiple habits to track&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Record daily completion status&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;View progress over time&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Maintain streaks and motivation&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;3. Mini Chatbot&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Developed a simple conversational bot that demonstrates:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;User input processing&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Conditional responses&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Basic AI interaction patterns&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Program flow control&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;4. Interactive Adventure Story&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Built a text-based adventure game featuring:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;User choice-driven narratives&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Multiple story paths&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Dynamic responses&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Function-based story structure&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  💡 &lt;strong&gt;Key Learning Insights&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;1. Problem-Solving Approach&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Break down complex problems&lt;/strong&gt; into smaller, manageable pieces&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Start with pseudocode&lt;/strong&gt; before writing actual code&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Test incrementally&lt;/strong&gt; as you build features&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Iterate and improve&lt;/strong&gt; based on testing results&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;2. Code Organization&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Functions are your friend&lt;/strong&gt; - they make code reusable and maintainable&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Meaningful variable names&lt;/strong&gt; improve code readability&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Comments matter&lt;/strong&gt; - they help you and others understand your code&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Consistent formatting&lt;/strong&gt; makes debugging easier&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;3. User Experience&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Clear prompts&lt;/strong&gt; guide users through your programs&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Error handling&lt;/strong&gt; prevents crashes and improves usability&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Feedback loops&lt;/strong&gt; keep users engaged and informed&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Intuitive interfaces&lt;/strong&gt; make programs accessible to everyone&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔮 &lt;strong&gt;How This Prepares Me for Machine Learning&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;1. Algorithm Foundation&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Control flow skills&lt;/strong&gt; will be essential for implementing ML algorithms&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Loop structures&lt;/strong&gt; are crucial for training models and processing data&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Conditional logic&lt;/strong&gt; helps in decision trees and classification systems&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;2. Data Handling&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;File operations&lt;/strong&gt; prepare me for reading datasets and saving results&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Data structures&lt;/strong&gt; knowledge is fundamental for working with NumPy arrays and Pandas DataFrames&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Input processing&lt;/strong&gt; skills will be needed for data preprocessing&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;3. Problem-Solving Mindset&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Breaking down complex problems&lt;/strong&gt; is exactly what's needed for ML model development&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Testing and iteration&lt;/strong&gt; mirrors the process of training and tuning ML models&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;User interaction&lt;/strong&gt; skills will help in building ML applications and dashboards&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🎯 &lt;strong&gt;What's Next: Module 2 Preview&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;With Module 1 complete, I'm now ready to tackle &lt;strong&gt;Module 2: Python Libraries&lt;/strong&gt;, where I'll learn to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Work with NumPy for numerical computing&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use Pandas for data manipulation and analysis&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create visualizations with Matplotlib and Seaborn&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Apply data science techniques to real datasets&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🏆 &lt;strong&gt;Key Takeaways&lt;/strong&gt;
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Python is powerful yet accessible&lt;/strong&gt; - perfect for beginners entering the ML field&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Hands-on practice is essential&lt;/strong&gt; - theory alone isn't enough to build programming confidence&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Building real projects accelerates learning&lt;/strong&gt; - practical applications reinforce theoretical concepts&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Foundation matters&lt;/strong&gt; - strong Python skills will make learning ML libraries much easier&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Problem-solving is a skill&lt;/strong&gt; - it improves with practice and experience&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  💬 &lt;strong&gt;Final Thoughts&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Module 1 has been an incredible foundation-building experience. Starting with simple "Hello World" programs and progressing to interactive applications has given me the confidence to tackle more complex machine learning challenges. The hands-on approach of Educative's platform has made learning Python engaging and practical.&lt;/p&gt;

&lt;p&gt;I'm excited to continue this journey and can't wait to see how these Python fundamentals will translate into machine learning expertise. The road to becoming a Machine Learning Engineer is well-paved with these essential programming skills!&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Ready to start your own ML journey? Check out the&lt;/em&gt; &lt;a href="https://www.educative.io/path/become-a-machine-learning-engineer" rel="noopener noreferrer"&gt;&lt;em&gt;Machine Learning Engineer Career Path&lt;/em&gt;&lt;/a&gt; &lt;em&gt;on&lt;/em&gt; &lt;a href="http://Educative.com" rel="noopener noreferrer"&gt;&lt;em&gt;Educative.com&lt;/em&gt;&lt;/a&gt;&lt;em&gt;!&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Tags&lt;/strong&gt;: #Python #MachineLearning #Programming #Educative #LearningJourney #DataScience #Coding #MLCareerPath&lt;/p&gt;

</description>
      <category>python</category>
      <category>machinelearning</category>
      <category>careergrowth</category>
      <category>educative</category>
    </item>
    <item>
      <title>Day 4 of Demolishing my Stack of Unfinished Projects: Secret Chat</title>
      <dc:creator>CodenificienT</dc:creator>
      <pubDate>Tue, 28 Jul 2026 03:50:56 +0000</pubDate>
      <link>https://dev.to/codenificient/day-4-of-demolishing-my-stack-of-unfinished-projects-secret-chat-532j</link>
      <guid>https://dev.to/codenificient/day-4-of-demolishing-my-stack-of-unfinished-projects-secret-chat-532j</guid>
      <description>&lt;p&gt;Published on Aug 21st, 2025&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;🚀 Made some progress&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Welcome back to my "Demolishing My Stack of Unfinished Projects" series! This week, I'm excited to share the story of how I transformed a simple chat idea into a fully-featured, production-ready real-time messaging application called &lt;strong&gt;CodeniChat&lt;/strong&gt; (formerly Secret Chat Bolt).&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;🎯 The Project That Started It All&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Secret Chat&lt;/strong&gt; began as one of those "wouldn't it be cool if..." moments. I had this idea for a secure, real-time chat application that could handle multiple rooms, user invitations, and password resets. You know the drill - you start with enthusiasm, then life happens, and suddenly it's been months with just a README file and some half-baked code.&lt;/p&gt;

&lt;p&gt;But this week, I decided enough was enough. It was time to demolish this unfinished project and turn it into something I could actually be proud of. I started off with a short prompt into the bolt.new platform&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;🛠️ The Tech Stack That Made It Possible&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Frontend&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Next.js 15&lt;/strong&gt; - The latest and greatest React framework&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;React 19&lt;/strong&gt; - Cutting-edge React with the new compiler&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;TypeScript&lt;/strong&gt; - Because type safety is not optional&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Tailwind CSS&lt;/strong&gt; - For rapid, beautiful UI development&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;shadcn/ui&lt;/strong&gt; - Pre-built, accessible components&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Backend &amp;amp; Database&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Neon Database&lt;/strong&gt; - Serverless PostgreSQL that scales with you&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Drizzle ORM&lt;/strong&gt; - Type-safe database operations&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;NextAuth.js&lt;/strong&gt; - Secure authentication system&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Bcryptjs&lt;/strong&gt; - Password hashing and security&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Real-time Features&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Server-Sent Events&lt;/strong&gt; - For real-time message updates&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;WebSocket-like functionality&lt;/strong&gt; - Without the complexity&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;🚀 The Week-Long Development Sprint&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Day 1: Foundation &amp;amp; Database&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;I started by setting up the database schema with Drizzle ORM. The beauty of using a modern ORM is that you can define your relationships once and let TypeScript handle the rest.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Core tables for the chat system&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;users&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;pgTable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;users&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;id&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;primaryKey&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
  &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;email&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;notNull&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;unique&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;notNull&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
  &lt;span class="na"&gt;password&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;password&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;notNull&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
  &lt;span class="na"&gt;createdAt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;timestamp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;created_at&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;defaultNow&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;rooms&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;pgTable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;rooms&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;id&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;primaryKey&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;notNull&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
  &lt;span class="na"&gt;isPrivate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;boolean&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;is_private&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="na"&gt;createdBy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;created_by&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;references&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="na"&gt;createdAt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;timestamp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;created_at&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;defaultNow&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;h3&gt;
  
  
  &lt;strong&gt;Day 2: Authentication &amp;amp; User Management&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;NextAuth.js made implementing authentication a breeze. I added signup, signin, and even a password reset flow that generates secure tokens and handles the entire reset process.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Password Reset Flow:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;User requests reset → Secure token generated&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Token stored with expiration → 24-hour validity&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;User clicks reset link → Token validated&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;New password set → Token marked as used&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Day 3: Real-Time Chat Core&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;This was the fun part! I implemented the core chat functionality with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Message grouping&lt;/strong&gt; - Consecutive messages from the same user are visually grouped&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Auto-scroll&lt;/strong&gt; - Intelligent scrolling that doesn't interfere with user reading&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Room management&lt;/strong&gt; - Public and private rooms with automatic user assignment&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Day 4: The Invitation System&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;One of the most requested features in any chat app - the ability to invite users to rooms. I built:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Invite modal&lt;/strong&gt; - Select users from a filtered list&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Pending invitations&lt;/strong&gt; - Sidebar display of received invites&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Accept/Decline actions&lt;/strong&gt; - One-click room joining&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Day 5: UI/UX Polish &amp;amp; Branding&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;I transformed the generic "ChatApp" into &lt;strong&gt;CodeniChat&lt;/strong&gt; with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Custom favicon&lt;/strong&gt; - SVG-based chat icon&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Responsive design&lt;/strong&gt; - Works on all devices&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Modern UI components&lt;/strong&gt; - Using shadcn/ui for consistency&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Footer addition&lt;/strong&gt; - Copyright and "made with love" message&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Day 6: Next.js 15 Upgrade&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;This was a significant milestone. I upgraded from Next.js 13 to Next.js 15, which involved:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;React 19 upgrade&lt;/strong&gt; - Latest React features&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;TypeScript improvements&lt;/strong&gt; - Stricter type checking&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Build optimization&lt;/strong&gt; - Better performance and smaller bundles&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Day 7: Deployment &amp;amp; Final Touches&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;The final day was all about getting this baby deployed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Vercel configuration&lt;/strong&gt; - Optimized for Next.js 15&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Environment setup&lt;/strong&gt; - Secure configuration management&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Final testing&lt;/strong&gt; - Ensuring everything works in production&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;🎨 Key Features That Make This App Special&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;1. Intelligent Message Grouping&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;groupedMessages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useMemo&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reduce&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="na"&gt;groups&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;GroupedMessage&lt;/span&gt;&lt;span class="p"&gt;[],&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;index&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;prevMessage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;index&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;nextMessage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;index&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;isFirstInGroup&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
      &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;prevMessage&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt;
      &lt;span class="nx"&gt;prevMessage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt;
      &lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;createdAt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getTime&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;prevMessage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;createdAt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getTime&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;// Group logic implementation...&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[]);&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;2. Smart Auto-Scroll&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;The app intelligently detects when users are reading older messages and won't force-scroll them to the bottom. But when they're at the bottom, new messages automatically appear.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;3. Room Invitation System&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Users can invite others to private rooms, and pending invitations are clearly displayed in the sidebar with accept/decline buttons.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;4. Password Reset Flow&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Complete password recovery system with secure token generation and validation.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;🚧 Challenges I Faced (And How I Overcame Them)&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;1. Next.js 15 Compatibility Issues&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Problem:&lt;/strong&gt; The upgrade introduced breaking changes in API routes and required new Suspense boundaries.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt; I updated all API route parameters to use &lt;code&gt;Promise&amp;lt;{ roomId: string }&amp;gt;&lt;/code&gt; and wrapped components using &lt;code&gt;useSearchParams()&lt;/code&gt; in Suspense boundaries.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;2. Vercel Deployment Issues&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Problem:&lt;/strong&gt; Next.js 15 peer dependency conflicts during deployment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt; Used &lt;code&gt;npm install --legacy-peer-deps&lt;/code&gt; in the build process and configured &lt;code&gt;vercel.json&lt;/code&gt; accordingly.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;3. Real-Time Message Updates&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Problem:&lt;/strong&gt; Implementing real-time features without WebSockets.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt; Used Server-Sent Events with a custom hook that handles reconnection and message buffering.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;📊 What I Learned&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;1. Modern React is Incredible&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;React 19 with the new compiler is a game-changer. The performance improvements and developer experience are noticeable from day one.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;2. TypeScript + Drizzle = Database Bliss&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Having type-safe database operations eliminates entire classes of bugs. I can't imagine building a production app without this combination.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;3. Component Libraries Save Time&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;shadcn/ui provided beautiful, accessible components that I could customize while maintaining consistency. This saved me hours of CSS work.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;4. Incremental Development Works&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;By building features one day at a time, I was able to test and refine each component before moving to the next. This prevented the "everything is broken" syndrome.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;🎯 What's Next for CodeniChat?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;While this project is now "complete" in terms of core functionality, I'm already thinking about future enhancements:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;File sharing&lt;/strong&gt; - Upload and share images, documents&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Voice messages&lt;/strong&gt; - Audio recording and playback&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;End-to-end encryption&lt;/strong&gt; - For truly private conversations&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Mobile app&lt;/strong&gt; - React Native version&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Push notifications&lt;/strong&gt; - For important messages&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;🏆 The Result: A Project I'm Actually Proud Of&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Secret Chat Bolt&lt;/strong&gt; went from being another unfinished project in my stack to a fully-functional, production-ready chat application. Here's what I accomplished in just one week:&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Complete authentication system&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Real-time messaging&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Room management&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;User invitations&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Password reset flow&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Modern, responsive UI&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Next.js 15 + React 19&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Production deployment&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;💡 Key Takeaways for Fellow Developers&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;1. Start Small, Build Incrementally&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Don't try to build everything at once. Pick one feature, implement it completely, then move to the next.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;2. Use Modern Tools&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Next.js 15, React 19, and Drizzle ORM made this project enjoyable instead of frustrating.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;3. Focus on User Experience&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Little details like message grouping and smart scrolling make a huge difference in how users perceive your app.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;4. Deploy Early and Often&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Getting your app running in production early helps identify issues you won't catch in development.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;🔗 Project Links&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Live Demo:&lt;/strong&gt; [Your deployed URL]&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;GitHub Repository:&lt;/strong&gt; [Your repo URL]&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Tech Stack:&lt;/strong&gt; Next.js 15, React 19, TypeScript, Neon DB, Drizzle ORM&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;🎉 Conclusion&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Secret Chat Bolt&lt;/strong&gt; is no longer part of my unfinished projects stack. It's a living, breathing application that people can actually use. The satisfaction of completing a project like this is incredible, and it's motivated me to tackle the next unfinished project in my stack.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Remember:&lt;/strong&gt; Every finished project started as an unfinished one. The key is to break it down into manageable pieces and tackle them one day at a time.&lt;/p&gt;

&lt;p&gt;What's the next unfinished project in your stack that you're going to demolish? Let me know in the comments below!&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This post is part of my "Demolishing My Stack of Unfinished Projects" series, where I tackle one unfinished project per week and turn it into something I can be proud of. Follow along for more project completion stories, technical deep-dives, and lessons learned from the trenches of software development.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; #NextJS #React #TypeScript #ChatApp #FullStack #WebDevelopment #ProjectCompletion #RealTimeChat #Database #Authentication&lt;/p&gt;

</description>
      <category>endtoendencryption</category>
      <category>cursoride</category>
      <category>bolt</category>
    </item>
    <item>
      <title>Day 3 of Demolishing my Stack of Unfinished Projects: SmartNotes Project</title>
      <dc:creator>CodenificienT</dc:creator>
      <pubDate>Tue, 28 Jul 2026 03:50:49 +0000</pubDate>
      <link>https://dev.to/codenificient/day-3-of-demolishing-my-stack-of-unfinished-projects-smartnotes-project-j2f</link>
      <guid>https://dev.to/codenificient/day-3-of-demolishing-my-stack-of-unfinished-projects-smartnotes-project-j2f</guid>
      <description>&lt;p&gt;Published on Aug 18th, 2025&lt;/p&gt;

&lt;h1&gt;
  
  
  &lt;strong&gt;The Setup: When Everything Seems Perfect&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;After successfully implementing a chatbot based on ChatGPT in my portfolio (as detailed in my previous "Redesign Portfolio" post), I was feeling pretty good about myself. The AI integration was working smoothly, users could ask questions about my skills and projects, and I had successfully created content embeddings that made the chatbot intelligent and contextually aware.&lt;/p&gt;

&lt;p&gt;Little did I know that this "completed" project was about to become the perfect candidate for my "Unfinished Projects" series.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;The Crisis: When OpenAI Goes Silent&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;It started with a simple error message: "OpenAI API account suspended." At first, I thought it was a simple configuration issue. Maybe I had accidentally exposed my API key or hit some rate limit. But after checking my environment variables and account status, I realized the problem was deeper.&lt;/p&gt;

&lt;p&gt;My OpenAI account was suspended, and suddenly, my "completed" AI chat functionality was completely broken. Suddenly, my SmartNotes app which also powers the chat functionality went offline.&lt;/p&gt;

&lt;p&gt;This was supposed to be a finished project. Instead, it had become the latest addition to my stack of unfinished work.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;The Panic: Scrambling for Solutions&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;The immediate challenge was clear: either abandon the chat functionality entirely or find an alternative solution. Given that I had already invested significant time in building the user interface and database integration, abandoning it wasn't an option.&lt;/p&gt;

&lt;p&gt;I started researching alternatives:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Claude API&lt;/strong&gt;: Limited availability and different pricing structure&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Local AI models&lt;/strong&gt;: Required significant computational resources&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Hugging Face&lt;/strong&gt;: Promising, but I had no experience with their inference API&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The clock was ticking, and my portfolio was broken.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;The Discovery: Hugging Face to the Rescue&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;After several hours of research and testing, I discovered that Hugging Face offered inference APIs that could potentially replace OpenAI's functionality. The catch? I had to completely rewrite the AI integration layer.&lt;/p&gt;

&lt;p&gt;This wasn't just a simple API swap - it was a complete architectural overhaul. I had to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Replace OpenAI's embedding model with Hugging Face alternatives&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Find a suitable text generation model&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Handle different response formats&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement proper error handling for a new service&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;The Implementation: Building Resilience&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Model Selection Hell&lt;/strong&gt; Finding the right model on Hugging Face proved more challenging than expected. My first attempts failed spectacularly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;microsoft/DialoGPT-medium&lt;/code&gt; - "No inference provider available"&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;gpt2&lt;/code&gt; and &lt;code&gt;distilgpt2&lt;/code&gt; - Limited conversational capabilities&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;Qwen/Qwen3-4B&lt;/code&gt; - Finally worked with the &lt;code&gt;nebius&lt;/code&gt; provider&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Database Architecture Evolution&lt;/strong&gt; The migration also exposed a fundamental issue: my MongoDB setup wasn't ideal for production use. I decided to migrate to Neon PostgreSQL, which meant:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Updating Prisma schema&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Migrating existing data&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Handling different ID types&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Testing the new connection&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Streaming Responses: The Silver Lining&lt;/strong&gt; One positive outcome was implementing streaming text responses. Instead of waiting for complete AI responses, users now see text appear word-by-word, creating a ChatGPT-like experience that's actually better than the original implementation.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;The Fallback System: Never Trust a Single Service&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;I learned a valuable lesson about building robust systems. I implemented a multi-layered fallback approach:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Vector Search&lt;/strong&gt;: Primary method using Pinecone embeddings&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Text Search&lt;/strong&gt;: Fallback to simple text matching&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Intelligent Responses&lt;/strong&gt;: Pre-built responses for common queries&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This ensures that even if the AI service fails, users still get helpful responses.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;The Current State: Better Than Before&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;What started as a crisis has evolved into a more robust, scalable system. The new implementation includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;✅ Hugging Face AI integration via Nebius&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;✅ Streaming text responses&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;✅ PostgreSQL database backend&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;✅ Comprehensive error handling&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;✅ Multiple fallback mechanisms&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Lessons Learned: Why This Project Wasn't Really "Finished"&lt;/strong&gt;
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Single Point of Failure&lt;/strong&gt;: Relying on one AI service provider is risky&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Production vs. Development&lt;/strong&gt;: What works in development might fail in production&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Resilience by Design&lt;/strong&gt;: Building fallback systems from the start saves time and maintains user experience&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Definition of "Complete"&lt;/strong&gt;: A project isn't truly finished until it can handle real-world failures gracefully&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;The Unfinished Projects Paradox&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;This experience taught me something important about my "Unfinished Projects" series. Sometimes, what appears to be a finished project is actually just waiting for the right failure to reveal its incompleteness.&lt;/p&gt;

&lt;p&gt;The AI chat integration wasn't truly finished until it could survive the loss of its primary service provider. In that sense, the "unfinished" phase was actually a blessing - it forced me to build something more robust than I originally planned.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;What's Next: The Never-Ending Journey&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Even now, I'm not sure this project is truly "finished." I'm already planning improvements:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;User analytics for chat interactions&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Conversation history persistence&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Multi-language support&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Integration with more AI models&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Conclusion: Embracing the Unfinished&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;This project taught me that "unfinished" isn't always a negative state. Sometimes, it's the catalyst for building something better than originally envisioned. The AI chat integration that almost wasn't has become one of my portfolio's most resilient features.&lt;/p&gt;

&lt;p&gt;For developers facing similar challenges, remember: every obstacle is an opportunity to improve your architecture. What seems like a setback might actually be pushing you toward a better solution.&lt;/p&gt;

&lt;p&gt;The journey from "finished" to "unfinished" to "better than finished" is what makes development exciting. Embrace the chaos, build resilience, and never stop improving.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Technical Stack Used:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Next.js 15.0.0&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Hugging Face Inference API&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Neon PostgreSQL&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Prisma ORM&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Pinecone Vector Database&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Streaming text responses&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Multi-layered fallback system&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Resources:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://huggingface.co/models" rel="noopener noreferrer"&gt;Hugging Face Models&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://neon.tech/" rel="noopener noreferrer"&gt;Neon PostgreSQL&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Fault_tolerance" rel="noopener noreferrer"&gt;Building Resilient Systems&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;This blog post captures the emotional journey, technical challenges, and valuable lessons learned while maintaining the honest, problem-solving tone that your "Unfinished Projects" series is known for. It shows how "unfinished" can actually lead to better outcomes!&lt;/p&gt;

</description>
      <category>openai</category>
      <category>portfoliowebsite</category>
      <category>pinecone</category>
    </item>
    <item>
      <title>16 Redesigning my Portfolio Website</title>
      <dc:creator>CodenificienT</dc:creator>
      <pubDate>Tue, 28 Jul 2026 03:50:42 +0000</pubDate>
      <link>https://dev.to/codenificient/16-redesigning-my-portfolio-website-1ee6</link>
      <guid>https://dev.to/codenificient/16-redesigning-my-portfolio-website-1ee6</guid>
      <description>&lt;p&gt;Published on Aug 18, 2025&lt;/p&gt;

&lt;h1&gt;
  
  
  A New Era of AI-Powered Coding Begins
&lt;/h1&gt;

&lt;p&gt;I have installed Cursor on my laptop this weekend, and I am amazed at how much it speeds up my coding. I have a new debugging buddy!!&lt;/p&gt;

&lt;p&gt;This week, I have made several updates to the Portfolio website.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;The Challenge: When OpenAI Falls Short&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;In my previous post, I shared the excitement of implementing a chatbot based on ChatGPT for my portfolio website. The initial experience was promising - I successfully created content embeddings and integrated them with OpenAI's API. However, as many developers know, relying on a single service provider can lead to unexpected roadblocks.&lt;/p&gt;

&lt;p&gt;When my OpenAI account encountered issues, I faced a critical decision: abandon the chat functionality or find an alternative solution. I chose the latter, embarking on a journey that would transform my portfolio's AI capabilities and teach me valuable lessons about building robust, fallback-ready systems.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;The Migration: Embracing Open Source AI&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;The transition from OpenAI to Hugging Face wasn't just a simple API swap - it was a complete architectural evolution. Here's what I learned:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Model Selection Complexity&lt;/strong&gt; Finding the right model on Hugging Face proved more challenging than expected. After testing several options:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;microsoft/DialoGPT-medium&lt;/code&gt; - No inference provider available&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;gpt2&lt;/code&gt; and &lt;code&gt;distilgpt2&lt;/code&gt; - Limited conversational capabilities&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;Qwen/Qwen3-4B&lt;/code&gt; - Perfect fit with the &lt;code&gt;nebius&lt;/code&gt; provider&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;2. Database Architecture Evolution&lt;/strong&gt; The migration also prompted a database upgrade from MongoDB to Neon PostgreSQL. This wasn't just about changing providers - it was about building a more scalable, production-ready foundation for my portfolio.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Technical Implementation: Building Resilience&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Streaming Responses for Better UX&lt;/strong&gt; One of the most significant improvements was implementing streaming text responses. Instead of waiting for complete AI responses, users now see text appear word-by-word, creating a ChatGPT-like experience:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Streaming implementation with word-by-word appearance&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;stream&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ReadableStream&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="nf"&gt;start&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;controller&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;encoder&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;TextEncoder&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;words&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt; &lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nx"&gt;words&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;word&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;index&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;controller&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;enqueue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;encoder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;word&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt; &lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;index&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;words&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="nx"&gt;controller&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;close&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="nx"&gt;index&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&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;p&gt;&lt;strong&gt;Robust Fallback System&lt;/strong&gt; I implemented a multi-layered fallback approach:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Vector Search&lt;/strong&gt;: Primary method using Pinecone embeddings&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Text Search&lt;/strong&gt;: Fallback to simple text matching&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Intelligent Responses&lt;/strong&gt;: Pre-built responses for common queries&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;User Experience Improvements&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Input Focus Management&lt;/strong&gt; Users can now have continuous conversations without losing focus:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nf"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;inputRef&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;inputRef&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;focus&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Response Filtering&lt;/strong&gt; Hidden internal AI processing tags for cleaner output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;cleanResponse&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/&amp;lt;think&amp;gt;.*&lt;/span&gt;&lt;span class="se"&gt;?&lt;/span&gt;&lt;span class="sr"&gt;&amp;lt;&lt;/span&gt;&lt;span class="se"&gt;\/&lt;/span&gt;&lt;span class="sr"&gt;think&amp;gt;/g&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;Performance &amp;amp; Scalability&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Database Optimization&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Migrated from MongoDB to Neon PostgreSQL&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Updated Prisma schema for better type safety&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implemented proper ID handling for vector search&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;API Efficiency&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Reduced response times with streaming&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implemented proper error handling&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Added comprehensive logging for debugging&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Lessons Learned&lt;/strong&gt;
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Always Have a Plan B&lt;/strong&gt;: Building fallback systems from the start saves time and maintains user experience&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Open Source is Powerful&lt;/strong&gt;: Hugging Face provides enterprise-grade AI capabilities without vendor lock-in&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;User Experience Matters&lt;/strong&gt;: Small details like input focus and streaming responses significantly improve perceived performance&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Database Architecture&lt;/strong&gt;: Choosing the right database from the start prevents migration headaches later&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Current Status &amp;amp; Future Plans&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;The chat functionality is now fully operational with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;✅ Hugging Face AI integration via Nebius&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;✅ Streaming text responses&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;✅ PostgreSQL database backend&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;✅ Robust error handling&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;✅ Clean, professional UI&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Next Steps:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Implement user analytics for chat interactions&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add conversation history persistence&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Explore multi-language support&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Integrate with more AI models for specialized responses&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Conclusion&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;This migration taught me that technical challenges often lead to better solutions. What started as a simple API replacement evolved into a more robust, scalable, and user-friendly chat system. The journey from OpenAI to Hugging Face wasn't just about solving a problem - it was about building something better.&lt;/p&gt;

&lt;p&gt;For developers facing similar challenges, remember: every obstacle is an opportunity to improve your architecture and learn new technologies. The result is often a more resilient and feature-rich application.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Technical Stack Used:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Next.js 15.0.0&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Hugging Face Inference API&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Neon PostgreSQL&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Prisma ORM&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Pinecone Vector Database&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Tailwind CSS&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;TypeScript&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Resources:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://huggingface.co/models" rel="noopener noreferrer"&gt;Hugging Face Models&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://neon.tech/" rel="noopener noreferrer"&gt;Neon PostgreSQL&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.pinecone.io/" rel="noopener noreferrer"&gt;Pinecone Vector Database&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;This blog post captures the technical journey, challenges faced, and solutions implemented while maintaining the professional tone and technical depth that your readers expect. It also provides valuable insights for other developers who might face similar migration challenges.&lt;/p&gt;

</description>
      <category>portfolio</category>
      <category>openai</category>
      <category>huggingface</category>
      <category>neondatabase</category>
    </item>
    <item>
      <title>15 Redesigning my portfolio website</title>
      <dc:creator>CodenificienT</dc:creator>
      <pubDate>Tue, 28 Jul 2026 03:50:35 +0000</pubDate>
      <link>https://dev.to/codenificient/15-redesigning-my-portfolio-website-3a9j</link>
      <guid>https://dev.to/codenificient/15-redesigning-my-portfolio-website-3a9j</guid>
      <description>&lt;p&gt;Published on Jun 21st, 2025&lt;/p&gt;

&lt;h2&gt;
  
  
  Thanks, NeonDB !
&lt;/h2&gt;

&lt;p&gt;I just started using NeonDB thanks to their generous free tier. I have migrated the SmartNotes application to NeonDB and recreated the notes.&lt;/p&gt;

&lt;h3&gt;
  
  
  June 19th, 2025 Update
&lt;/h3&gt;

&lt;p&gt;On Juneteenth, I started the migration process to Neon DB. I rewrote the Prisma queries and updated the database links. The app is able to generate a new Prisma client and create new tables on the remote database.&lt;/p&gt;

&lt;h3&gt;
  
  
  June 20th, 2025 Update
&lt;/h3&gt;

&lt;p&gt;The chat application works again for the SmartNotes app. However, there are lots of error messages in the Terminal, and I am not ready to deal with those right now. Will follow up on the next post..&lt;/p&gt;

</description>
      <category>portfolio</category>
      <category>prisma</category>
      <category>neondatabase</category>
    </item>
    <item>
      <title>14 Redesigning my Portfolio website</title>
      <dc:creator>CodenificienT</dc:creator>
      <pubDate>Tue, 28 Jul 2026 03:50:28 +0000</pubDate>
      <link>https://dev.to/codenificient/14-redesigning-my-portfolio-website-1c61</link>
      <guid>https://dev.to/codenificient/14-redesigning-my-portfolio-website-1c61</guid>
      <description>&lt;p&gt;Published on Jun 20th, 2025&lt;/p&gt;

&lt;p&gt;Currently the chat functionality on my portfolio is down because my website was probably accessed from abroad and my Open AI account got suspended.&lt;/p&gt;

&lt;h3&gt;
  
  
  Read the fine print
&lt;/h3&gt;

&lt;p&gt;My account violated the terms of use which I did not read. I am now in the process of using some open source alternatives to get my chat functionality working again.&lt;/p&gt;

&lt;p&gt;I also moved a few portfolio applications away from Supabase to Neon and the chat database to Neon from MongoDB. I am still relying on Pinecone to store my vector embeddings. I can see a future enhancement where I store everything in the Neon thanks to pgvector to reduce my dependencies.&lt;/p&gt;

&lt;h3&gt;
  
  
  June 20th, 2025 Udpate
&lt;/h3&gt;

&lt;p&gt;I worked on the portfolio for a few hours today. I am trying to swap out OpenAI and replace with HuggingFace. The inference website does not seem to work because there’s a mismatch between our OpenAI embeddings and the current version of the SmartNotes app.&lt;/p&gt;

&lt;p&gt;Recap: We created a note taking application called SmartNotes which has a chatbot. Trying to copy over the same code to my portfolio to so that both apps are using the same notes and the same database.&lt;/p&gt;

&lt;p&gt;I will recreate the Pinecone index using a different embedding model and reconnect to HugggingFace.&lt;/p&gt;

</description>
      <category>portfolio</category>
      <category>openai</category>
      <category>huggingface</category>
    </item>
    <item>
      <title>13 Redesigning my Portfolio Website</title>
      <dc:creator>CodenificienT</dc:creator>
      <pubDate>Tue, 28 Jul 2026 03:50:22 +0000</pubDate>
      <link>https://dev.to/codenificient/13-redesigning-my-portfolio-website-54f5</link>
      <guid>https://dev.to/codenificient/13-redesigning-my-portfolio-website-54f5</guid>
      <description>&lt;p&gt;Published on Jan 17th, 2024&lt;/p&gt;

&lt;h1&gt;
  
  
  Added Chat functionality
&lt;/h1&gt;

&lt;p&gt;I recently created a chatbot based on ChatGPT where I learned to create content embeddings to empower ChatGPT to chat with our data. The experience went as well as could be expected.&lt;/p&gt;

&lt;p&gt;I have added more information from my portfolio website to the Pinecone vector store and now the same chatbot is functional on tioye.dev&lt;/p&gt;

&lt;h2&gt;
  
  
  Removed the Chat page
&lt;/h2&gt;

&lt;p&gt;Since the chatbox is a popup window mimicking the chatbots on familiar websites, I have removed the initial placeholder chat page from the website. I have upgraded the navigation link to a button that triggers that chat window. Therefore, the Chat functionality can be triggered from any page. When the chat window is covering information on a page, the window can be closed and reopened without losing the conversation data.&lt;/p&gt;

&lt;h2&gt;
  
  
  Open chat
&lt;/h2&gt;

&lt;p&gt;Currently, the chatbot can answer questions about my portfolio, and is based on GPT 3.5 turbo. I do not require login to use the chat. I do not anticipate many visitors using the chat functionality, and this should be good for several months&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1705524726827%2F82613a12-89d9-4f81-b7c9-66d08cc86835.png%2520align%3D" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1705524726827%2F82613a12-89d9-4f81-b7c9-66d08cc86835.png%2520align%3D" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>portfolio</category>
      <category>chatgpt</category>
    </item>
    <item>
      <title>12 Redesigning my portfolio website</title>
      <dc:creator>CodenificienT</dc:creator>
      <pubDate>Tue, 28 Jul 2026 03:50:15 +0000</pubDate>
      <link>https://dev.to/codenificient/12-redesigning-my-portfolio-website-1a99</link>
      <guid>https://dev.to/codenificient/12-redesigning-my-portfolio-website-1a99</guid>
      <description>&lt;p&gt;Published on &lt;a href="https://codenificient.hashnode.dev/12-redesigning-my-portfolio-website" rel="noopener noreferrer"&gt;Jan 4th, 2024&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The new version of the portfolio is live
&lt;/h2&gt;

&lt;p&gt;I have completed the Landing, Resume and Blog pages and I have edited the domain names on Vercel to point to tioye.dev. The previous build on Vercel is officially retired.&lt;/p&gt;

&lt;h3&gt;
  
  
  New Landing Page, New Beginnings
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1704409663729%2F4d646214-ba98-4b5d-9376-b68bb2ad46e5.png%2520align%3D" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1704409663729%2F4d646214-ba98-4b5d-9376-b68bb2ad46e5.png%2520align%3D" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The theme is light mode by default. The deployed site feels faster and there is a big button to download a PDF copy of my resume.&lt;/p&gt;

&lt;h4&gt;
  
  
  Next steps
&lt;/h4&gt;

&lt;p&gt;Now that my updated portfolio is live, my free time going forward will be split between the AWS certification prep work, interview preparation, job applications / coding challenges, fixing the broken portfolio projects, and adding an AI powered chatbot to the portfolio.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.tioye.dev/" rel="noopener noreferrer"&gt;My Newly Deployed site&lt;/a&gt;&lt;/p&gt;

</description>
      <category>portfolio</category>
      <category>nextjs</category>
      <category>vercel</category>
    </item>
    <item>
      <title>My world in 2023</title>
      <dc:creator>CodenificienT</dc:creator>
      <pubDate>Tue, 28 Jul 2026 03:50:08 +0000</pubDate>
      <link>https://dev.to/codenificient/my-world-in-2023-pja</link>
      <guid>https://dev.to/codenificient/my-world-in-2023-pja</guid>
      <description>&lt;p&gt;Published on &lt;a href="https://codenificient.hashnode.dev/my-world-in-2023" rel="noopener noreferrer"&gt;Dec 31st, 2023&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://codenificient.hashnode.dev/my-world-in-2023" rel="noopener noreferrer"&gt;A summary&lt;/a&gt; of the major events&lt;/p&gt;

&lt;h1&gt;
  
  
  Graduation: Class of 2023
&lt;/h1&gt;

&lt;p&gt;The 2023 year ended on a high note for me as I have completed grad school with my Master degree in Computer Science. Before I start freaking out about job interviews, and my 6-figure student loan, it would be a great time to &lt;strong&gt;reminisce&lt;/strong&gt; about the major events that have shaped the past year.&lt;/p&gt;

&lt;h3&gt;
  
  
  Facing deportation?
&lt;/h3&gt;

&lt;p&gt;Early in January 2023, I was panicking about the registration deadline at the University of Louisville. The automated system was not allowing me to register for my classes due to the unpaid tuition balance from the previous Fall semester. Past the registration deadline, I would miss the semester, which would have several implications for my immigration status and student visa. It was a worrisome situation which was remedied at the last minute. I started classes a week late&lt;/p&gt;

&lt;h3&gt;
  
  
  Summer of Uncertainty
&lt;/h3&gt;

&lt;p&gt;I got a 3.5 gpa during the Spring 2023 semester and was ready for my final semester. The remaining tuition balance from the Spring semester now remains to be paid. This time, there was no big check to provide to the bursar. I spent the summer trying several solutions. My income from the part time internship under the CPT was sufficient to make a small dent on the balance. I have considered selling my vehicle, but the offers were too low. The final solution came from the graduate school as they found some scholarship funds which they applied towards the tuition balance to allow me to register for my final semester. I feel fortunate about this outcome and will be empowered to pay it forward some day.&lt;/p&gt;

&lt;h3&gt;
  
  
  Graduated, now what?
&lt;/h3&gt;

&lt;p&gt;Getting my master was the hardest thing I have ever done. There was a time that felt like everything that could have gone wrong has gone wrong. But I have persevered until I completed what I have started. I feel like if I can get through that, then I can get through anything! I am ready to go to many job interviews, until I land my first tech role. Bring it on!&lt;/p&gt;

</description>
      <category>graduates</category>
    </item>
    <item>
      <title>11 Redesigning my portfolio website</title>
      <dc:creator>CodenificienT</dc:creator>
      <pubDate>Tue, 28 Jul 2026 03:50:02 +0000</pubDate>
      <link>https://dev.to/codenificient/11-redesigning-my-portfolio-website-24bm</link>
      <guid>https://dev.to/codenificient/11-redesigning-my-portfolio-website-24bm</guid>
      <description>&lt;p&gt;Published on &lt;a href="https://codenificient.hashnode.dev/11-redesigning-my-portfolio-website" rel="noopener noreferrer"&gt;Dec 29th, 2023&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Enter TypeScript and Next.js 14
&lt;/h1&gt;

&lt;p&gt;I am continuing the process of visually overhauling my portfolio website. A few weeks after upgrading my site to Next.js, I have started using TypeScript for my web applications. I have spent the Fall semester finishing my master's degree, and contemplating several ways I can improve my portfolio website.&lt;/p&gt;

&lt;p&gt;I am now a recent graduate applying for my first full-time role in tech, and upgrading my portfolio site to TypeScript along with several visual improvements is a must.&lt;/p&gt;

&lt;h3&gt;
  
  
  Old Version
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1703902646323%2Ff6f0d743-f9e0-4c9a-b5be-5dbe09455396.png%2520align%3D" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1703902646323%2Ff6f0d743-f9e0-4c9a-b5be-5dbe09455396.png%2520align%3D" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  New Version
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1703902655965%2F7fd1d7fb-12a9-49b1-8aa6-3c090ff1239a.png%2520align%3D" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1703902655965%2F7fd1d7fb-12a9-49b1-8aa6-3c090ff1239a.png%2520align%3D" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  New Version with Dark Mode
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1703902666534%2F8876cde5-6d15-4525-a793-cf853126fdd5.png%2520align%3D" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1703902666534%2F8876cde5-6d15-4525-a793-cf853126fdd5.png%2520align%3D" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I have added a dark mode toggler to the improved navigation bar and I am planning to remove a few pages. I plan to add a chat page based on a vector database of my bio so users can chat with my data.&lt;/p&gt;

&lt;p&gt;Another noteworthy improvement is that the inclusion of TailwindCSS has reduced my coding time dramatically. It took me a week to get the main user interface working last time. This time, less than an hour. I already feel like a 10x developer :)!&lt;/p&gt;

&lt;h4&gt;
  
  
  Coming Soon!
&lt;/h4&gt;

&lt;p&gt;For now, I am deploying the new version of my portfolio on a separate vercel endpoint &lt;a href="https://tioyedev2024.vercel.app/" rel="noopener noreferrer"&gt;https://tioyedev2024.vercel.app/&lt;/a&gt; and my website &lt;strong&gt;&lt;a href="https://tioye.dev/" rel="noopener noreferrer"&gt;https://tioye.dev/&lt;/a&gt;&lt;/strong&gt; still points to previous build. I plan to make the switch once the 3 main pages, Landing, Resume and Experience, are deployed on the new endpoint&lt;/p&gt;

</description>
      <category>nextjs</category>
      <category>graduation</category>
    </item>
    <item>
      <title>10 Redesigning my portfolio app</title>
      <dc:creator>CodenificienT</dc:creator>
      <pubDate>Tue, 28 Jul 2026 03:49:55 +0000</pubDate>
      <link>https://dev.to/codenificient/10-redesigning-my-portfolio-app-ina</link>
      <guid>https://dev.to/codenificient/10-redesigning-my-portfolio-app-ina</guid>
      <description>&lt;p&gt;Published on &lt;a href="https://codenificient.hashnode.dev/10-redesigning-my-portfolio-app" rel="noopener noreferrer"&gt;Mar 16th, 2023&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://codenificient.hashnode.dev/10-redesigning-my-portfolio-app" rel="noopener noreferrer"&gt;Hashnode c&lt;/a&gt;onnected
&lt;/h3&gt;

&lt;p&gt;Today I followed the incredibly useful blog post by &lt;a href="https://catalins.tech/hashnode-api-how-to-display-your-blog-articles-on-your-portfolio-page/" rel="noopener noreferrer"&gt;CatalinPit&lt;/a&gt; and I connected my portfolio blog directly to Hashnode, skipping GraphCMS. This negates the need to create a duplicate post in GraphCMS after posting on Hashnode.&lt;/p&gt;

&lt;h3&gt;
  
  
  Revalidate: 600
&lt;/h3&gt;

&lt;p&gt;I have kept the default refresh period in Vercel to 10 minutes. New blog posts on Hashnode will show up on my portfolio within 10 minutes, provided the Vercel platform rebuilds the new page in sub-30 seconds as usual.&lt;/p&gt;

&lt;h3&gt;
  
  
  GitHub actions untouched
&lt;/h3&gt;

&lt;p&gt;I have not messed with anything I have already set up in GitHub. My latest blog should be synched to my GH profile every sunday as usual&lt;/p&gt;

&lt;h3&gt;
  
  
  One caveat
&lt;/h3&gt;

&lt;p&gt;The GraphCMS version of my blog was based on blog series which are almost mirrored from Hashnode. Unfortunately, the Series feature was glued onto Hashnode after the fact and the GraphQL API does not support fetching blogs based on blog series. I have attempted a simple fetch to grab the blog series, but I was getting error messages. Currently, I have removed the blog series header from the portfolio site. I have replaced the series badge on each blog post with an avatar of the author, aka, yours truly!&lt;/p&gt;

</description>
      <category>blogging</category>
      <category>graphql</category>
      <category>hashnode</category>
      <category>nextjs</category>
    </item>
    <item>
      <title>1 Startup Series: Connecting my Admin frontend to the backend</title>
      <dc:creator>CodenificienT</dc:creator>
      <pubDate>Tue, 28 Jul 2026 03:49:48 +0000</pubDate>
      <link>https://dev.to/codenificient/1-startup-series-connecting-my-admin-frontend-to-the-backend-2f7h</link>
      <guid>https://dev.to/codenificient/1-startup-series-connecting-my-admin-frontend-to-the-backend-2f7h</guid>
      <description>&lt;p&gt;Published on &lt;a href="https://codenificient.hashnode.dev/1-startup-series-connecting-my-admin-frontend-to-the-backend" rel="noopener noreferrer"&gt;Feb 16th, 2023&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://codenificient.hashnode.dev/1-startup-series-connecting-my-admin-frontend-to-the-backend" rel="noopener noreferrer"&gt;My solar e&lt;/a&gt;nergy startup platform FasoLara has reached a new milestone recently and I decided to start a new blog series about it!&lt;/p&gt;

&lt;p&gt;The project management platform has been a long journey since I published my first commit to GitHub in October 2020. What started based on a simple idea quickly became a behemoth of a software engineering project for my beginner programmer skills. I have poured thousands of hours into research, tutorials and coding to figure out how to put something like this together. Since then, I have made multiple changes to the FasoLara repository.&lt;/p&gt;

&lt;p&gt;The platform is currently open source, but I am using a private fork to publish the 3 different components to the Vercel platform. I had a basic demo of the admin dashboard with 6 pages before I removed all the sample data, then upgraded everything to the app directory in NextJS 13 and connected the dashboard to the backend server featuring Apollo GraphQL server v4.&lt;/p&gt;

&lt;p&gt;Yesterday, February 15th, 2023, I added Next-Auth to handle authentication. Initial testing of the next-auth version seems to work with the &lt;code&gt;appDir&lt;/code&gt; in Next.JS 13. It is far from the login experience that I want. It will take more effort to iron out the details because proper documentation is still rare&lt;/p&gt;

&lt;h4&gt;
  
  
  Lots of testing needs to be done
&lt;/h4&gt;

&lt;p&gt;Although I have successfully connected the Cypress testing framework to the frontend app, I have yet to do the same on the admin app. I am managing a lot of complexity with lots of new packages.&lt;/p&gt;

&lt;h4&gt;
  
  
  Every mistake under the sun
&lt;/h4&gt;

&lt;p&gt;I have lost count of how many times I made breaking changes to the code base trying to implement new features on the main branch only to hard reset the branch after tens of hours of work that I could have done on a new branch instead. I can say that I am moving fast and breaking things per facebook's motto!&lt;/p&gt;

&lt;h4&gt;
  
  
  Mobile app on the backburner
&lt;/h4&gt;

&lt;p&gt;I have 3 sample pages that I made on the mobile application. I would have liked to have at least a fully functional landing page on the React Native application component by now, but that might take a while since I can only focus on breaking one thing at a time! I have not finished the Figma designs of the mobile application. Now that I have a decent idea of the backend server capabilities and have dozens of detailed GraphQL schemas to support it, I can make more progress on building the server and admin dashboard in lockstep. Later, when I get stuck on both of those, I will switch my attention to the mobile application. I think once I have a functional admin dashboard which is the centerpiece of the platform, mobile development will benefit greatly from the experience.&lt;/p&gt;

&lt;h4&gt;
  
  
  Fun while it lasted
&lt;/h4&gt;

&lt;p&gt;I have enjoyed crafting some of the User Interface components from scratch and learning how to put together primitive components using JSX and SASS, it has become quickly obvious that I was spending time on the less important things. I have recently added ChakraUI to my tech stack and the increasing number of available ready-to-go components in Chakra has accelerated development considerably. The project contains enough complexity for a lifetime, and it was refreshing to move away from getting lost in some of the smaller weeds so I can focus on sorting out getting lost in some of the bigger weeds such as authentication and role-based authorization using NextAuth and a homemade authentication scheme based on GraphQL.&lt;/p&gt;

&lt;h4&gt;
  
  
  Battle of Syssiphus
&lt;/h4&gt;

&lt;p&gt;Building so many separate applications within the same platform feels like a battle of Syssiphus based on the sheer amount of work that needs to be done and redone. I can say I have rebuilt the admin dashboard 2 or 3 times already. The irony of duplicating work by trying to avoid duplicated work. But I also know that duplicating work 2-5 times is much better than duplicating that work on 20 different pages, some of which will need to be redone a few more times in the future based on updates in the backend and changes done to the underlying MongoDB document models.&lt;/p&gt;

&lt;h4&gt;
  
  
  Next steps...
&lt;/h4&gt;

&lt;p&gt;I look forward to a shorter blog post in the next article where I document how I managed to get authentication 'working' on the admin dashboard. It feels good to see how things are shaping up since I had no idea I could pull off all the progress made so far. Upgrading the entire project to TypeScript was such a huge surprise based on how little TypeScript I know and how it took less than 10 hours in total to get the whole project converted to TypeScript. It's all on the up and up from here!!!&lt;/p&gt;

</description>
      <category>fullstack</category>
      <category>nextjs</category>
      <category>buildinpublic</category>
    </item>
  </channel>
</rss>
