<?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: Dhanush K</title>
    <description>The latest articles on DEV Community by Dhanush K (@xdk0d3r).</description>
    <link>https://dev.to/xdk0d3r</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%2F3991296%2Fa8ce9a98-6d3d-495b-ad7a-b09abe37a2da.png</url>
      <title>DEV Community: Dhanush K</title>
      <link>https://dev.to/xdk0d3r</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/xdk0d3r"/>
    <language>en</language>
    <item>
      <title>Building My First Web Backend Project: A URL Shortener with FastAPI and SQLite</title>
      <dc:creator>Dhanush K</dc:creator>
      <pubDate>Mon, 28 Sep 2026 17:06:00 +0000</pubDate>
      <link>https://dev.to/xdk0d3r/building-my-first-web-backend-project-a-url-shortener-with-fastapi-and-sqlite-327k</link>
      <guid>https://dev.to/xdk0d3r/building-my-first-web-backend-project-a-url-shortener-with-fastapi-and-sqlite-327k</guid>
      <description>&lt;p&gt;After completing my Personal Expense Tracker, I started my fourth project: a &lt;strong&gt;URL Shortener&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This was also my &lt;strong&gt;first web backend project&lt;/strong&gt;, so this project was a step beyond the CLI applications I had built previously.&lt;/p&gt;

&lt;p&gt;The goal was to learn how a backend application connects a web interface, server-side logic, and a database together.&lt;/p&gt;

&lt;p&gt;For this project, I used &lt;strong&gt;Python, FastAPI, SQLite, Jinja2, HTML, and CSS&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Does a URL Shortener Do?
&lt;/h2&gt;

&lt;p&gt;A URL Shortener converts a long URL into a shorter URL.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://example.com/some/very/long/path/to/a/page
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;can become:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://localhost:8000/aB72xK
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When someone opens the shortened URL, the application uses the short code to find the original URL in the database and redirects the user.&lt;/p&gt;

&lt;p&gt;The basic flow is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Long URL
   ↓
Generate short code
   ↓
Store short code + original URL
   ↓
Display short URL
   ↓
User opens short URL
   ↓
Find original URL
   ↓
Redirect
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  From CLI Applications to a Web Application
&lt;/h2&gt;

&lt;p&gt;My previous projects were mainly command-line applications.&lt;/p&gt;

&lt;p&gt;With this project, I wanted to understand what happens when a user interacts with an application through a browser.&lt;/p&gt;

&lt;p&gt;The basic architecture became:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Browser
   ↓
FastAPI
   ↓
SQLite
   ↓
FastAPI
   ↓
Browser
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This was one of the most useful parts of the project because I could see how the different pieces fit together instead of learning them individually.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why FastAPI?
&lt;/h2&gt;

&lt;p&gt;I had already started learning the fundamentals of &lt;strong&gt;FastAPI&lt;/strong&gt; before beginning this project.&lt;/p&gt;

&lt;p&gt;I had worked with API routes such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GET&lt;/li&gt;
&lt;li&gt;POST&lt;/li&gt;
&lt;li&gt;PUT/PATCH&lt;/li&gt;
&lt;li&gt;DELETE&lt;/li&gt;
&lt;li&gt;Path parameters&lt;/li&gt;
&lt;li&gt;Query parameters&lt;/li&gt;
&lt;li&gt;Request models&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For the URL Shortener, I wanted to take the next step and use FastAPI to build an actual web application.&lt;/p&gt;

&lt;p&gt;Instead of returning JSON for everything, I used FastAPI to serve HTML pages and process form submissions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Using Jinja2 for the Interface
&lt;/h2&gt;

&lt;p&gt;For V1, I intentionally decided not to use JavaScript.&lt;/p&gt;

&lt;p&gt;Instead, I used &lt;strong&gt;Jinja2&lt;/strong&gt; for server-side rendering.&lt;/p&gt;

&lt;p&gt;The flow is simple:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;HTML Form
   ↓
FastAPI receives the request
   ↓
Process the URL
   ↓
Generate short code
   ↓
Store in SQLite
   ↓
Render the template again
   ↓
Display the shortened URL
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This gave me a better understanding of the traditional server-rendered web application approach.&lt;/p&gt;

&lt;p&gt;I also learned how FastAPI can serve static CSS files separately from the Jinja2 templates.&lt;/p&gt;

&lt;h2&gt;
  
  
  Database Design
&lt;/h2&gt;

&lt;p&gt;The database is intentionally simple.&lt;/p&gt;

&lt;p&gt;The application uses a single &lt;code&gt;urls&lt;/code&gt; table:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;urls
├── short_code
└── original_url
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;short_code&lt;/code&gt; is the primary key.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;short_code:   aB72xK
original_url: https://example.com/some/long/url
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When the user visits &lt;code&gt;/aB72xK&lt;/code&gt;, the application searches for that short code and retrieves the corresponding original URL.&lt;/p&gt;

&lt;p&gt;If it exists, the application redirects the user.&lt;/p&gt;

&lt;p&gt;If it doesn't exist, the application returns a not-found response.&lt;/p&gt;

&lt;h2&gt;
  
  
  Generating the Short Code
&lt;/h2&gt;

&lt;p&gt;For V1, I kept the implementation simple.&lt;/p&gt;

&lt;p&gt;The application generates a &lt;strong&gt;6-character code&lt;/strong&gt; using letters and numbers.&lt;/p&gt;

&lt;p&gt;The generated code becomes the identifier for the stored URL.&lt;/p&gt;

&lt;p&gt;I didn't try to build a complex algorithm for generating short URLs because the main learning goal was understanding the complete backend workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keeping the V1 Scope Small
&lt;/h2&gt;

&lt;p&gt;One thing I wanted to follow with this project was &lt;strong&gt;scope control&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;There are many things that could be added to a URL shortener:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Analytics&lt;/li&gt;
&lt;li&gt;URL expiration&lt;/li&gt;
&lt;li&gt;Custom short codes&lt;/li&gt;
&lt;li&gt;User accounts&lt;/li&gt;
&lt;li&gt;URL management&lt;/li&gt;
&lt;li&gt;Click tracking&lt;/li&gt;
&lt;li&gt;Authentication&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But I didn't want V1 to become unnecessarily complicated.&lt;/p&gt;

&lt;h3&gt;
  
  
  Current V1 Scope
&lt;/h3&gt;

&lt;p&gt;The completed V1 includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;URL shortening&lt;/li&gt;
&lt;li&gt;6-character short code generation&lt;/li&gt;
&lt;li&gt;SQLite storage&lt;/li&gt;
&lt;li&gt;URL redirection&lt;/li&gt;
&lt;li&gt;Simple HTML + CSS interface&lt;/li&gt;
&lt;li&gt;Jinja2 server-side rendering&lt;/li&gt;
&lt;li&gt;Empty-input handling&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's enough for the application to demonstrate the fundamental URL-shortening workflow.&lt;/p&gt;

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

&lt;p&gt;This project connected several concepts I had been learning separately.&lt;/p&gt;

&lt;p&gt;I practiced:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Building a web application with FastAPI&lt;/li&gt;
&lt;li&gt;Connecting FastAPI with SQLite&lt;/li&gt;
&lt;li&gt;Designing a simple database&lt;/li&gt;
&lt;li&gt;Separating database operations into a database class&lt;/li&gt;
&lt;li&gt;Generating identifiers&lt;/li&gt;
&lt;li&gt;Handling redirects&lt;/li&gt;
&lt;li&gt;Using Jinja2 templates&lt;/li&gt;
&lt;li&gt;Processing HTML form submissions&lt;/li&gt;
&lt;li&gt;Serving static CSS&lt;/li&gt;
&lt;li&gt;Structuring a small web application&lt;/li&gt;
&lt;li&gt;Deploying a backend application&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The biggest takeaway for me was understanding the relationship between the &lt;strong&gt;browser, backend, and database&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Project Structure
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;url-shortener/
├── main.py
├── database.py
├── requirements.txt
├── templates/
│   └── index.html
├── static/
│   └── style.css
├── .gitignore
├── LICENSE
└── README.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  V1 Complete
&lt;/h2&gt;

&lt;p&gt;With the core workflow working, I consider &lt;strong&gt;V1 complete&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I intentionally stopped here instead of continuously adding features.&lt;/p&gt;

&lt;p&gt;The project is small, but it represents an important step in my learning path: moving from CLI applications into web backend development.&lt;/p&gt;

&lt;p&gt;This was my &lt;strong&gt;first web backend project&lt;/strong&gt;, and it gave me practical experience with how a browser-based application communicates with a backend and database.&lt;/p&gt;

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

&lt;p&gt;Project #4 started with a simple question:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How does a shortened URL actually work?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Building it helped me understand the answer from the backend side.&lt;/p&gt;

&lt;p&gt;A short URL isn't simply a smaller version of a long URL. It's a short identifier that the application stores and uses to find the original URL.&lt;/p&gt;

&lt;p&gt;For me, this project was less about building a feature-rich URL shortener and more about learning the fundamentals of web backend development.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Project #4 — URL Shortener: V1 Complete.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Links
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Live Demo:&lt;/strong&gt; &lt;a href="https://url-shortener-k5ed.onrender.com/" rel="noopener noreferrer"&gt;https://url-shortener-k5ed.onrender.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Source Code:&lt;/strong&gt; &lt;a href="https://github.com/xDK0d3r/url-shortener" rel="noopener noreferrer"&gt;https://github.com/xDK0d3r/url-shortener&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  A Different Perspective
&lt;/h3&gt;

&lt;p&gt;I also wrote about this project on &lt;strong&gt;CoderLegion&lt;/strong&gt;, where I focused more on the development process, project architecture, and the decisions I made while building the V1.&lt;/p&gt;

&lt;p&gt;If you're interested in a different perspective on the same project, you can read it here:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://coderlegion.com/28967/building-a-url-shortener-with-fastapi-and-sqlite-v1-complete" rel="noopener noreferrer"&gt;Read my CoderLegion article →&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>fastapi</category>
      <category>webdev</category>
      <category>backend</category>
    </item>
    <item>
      <title>Personal Expense Tracker V2 — Edit, Validation &amp; Error Handling</title>
      <dc:creator>Dhanush K</dc:creator>
      <pubDate>Sun, 13 Sep 2026 07:12:53 +0000</pubDate>
      <link>https://dev.to/xdk0d3r/personal-expense-tracker-v2-edit-validation-error-handling-2935</link>
      <guid>https://dev.to/xdk0d3r/personal-expense-tracker-v2-edit-validation-error-handling-2935</guid>
      <description>&lt;p&gt;I’ve completed &lt;strong&gt;V2&lt;/strong&gt; of my Personal Expense Tracker 🚀&lt;/p&gt;

&lt;p&gt;This project started as a way to practice &lt;strong&gt;Python OOP, SQL, and SQLite&lt;/strong&gt; by building something practical instead of only studying theory.&lt;/p&gt;

&lt;p&gt;V1 focused on getting the core CRUD operations working.&lt;/p&gt;

&lt;p&gt;With V2, I focused on making the application more reliable and user-friendly.&lt;/p&gt;

&lt;h2&gt;
  
  
  🆕 What I Added in V2
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ✏️ Edit Expenses
&lt;/h3&gt;

&lt;p&gt;Users can now modify an existing expense.&lt;/p&gt;

&lt;p&gt;The edit flow allows changing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Amount&lt;/li&gt;
&lt;li&gt;Category&lt;/li&gt;
&lt;li&gt;Description&lt;/li&gt;
&lt;li&gt;Date&lt;/li&gt;
&lt;li&gt;Cancel the operation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This also gave me more practical experience working with SQL &lt;code&gt;UPDATE&lt;/code&gt; statements and designing application flow around user choices.&lt;/p&gt;

&lt;h3&gt;
  
  
  🛡️ Input Validation
&lt;/h3&gt;

&lt;p&gt;I also added validation for user input.&lt;/p&gt;

&lt;p&gt;The application now handles things such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Invalid menu choices&lt;/li&gt;
&lt;li&gt;Invalid amount input&lt;/li&gt;
&lt;li&gt;Negative or zero amounts&lt;/li&gt;
&lt;li&gt;Invalid category selection&lt;/li&gt;
&lt;li&gt;Empty descriptions&lt;/li&gt;
&lt;li&gt;Invalid dates&lt;/li&gt;
&lt;li&gt;Impossible dates such as &lt;code&gt;2026-02-30&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example, instead of allowing invalid input to crash the program, the application asks the user to provide a valid value.&lt;/p&gt;

&lt;h3&gt;
  
  
  ⚠️ Error Handling
&lt;/h3&gt;

&lt;p&gt;While implementing validation, I also started thinking more carefully about where errors can happen and how the application should respond.&lt;/p&gt;

&lt;p&gt;One important lesson was that &lt;strong&gt;input validation is not just about preventing crashes&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It is about defining what the application considers valid input and controlling the flow when the user provides something unexpected.&lt;/p&gt;

&lt;h2&gt;
  
  
  🧠 What I Learned
&lt;/h2&gt;

&lt;p&gt;V2 taught me more than just how to add an edit feature.&lt;/p&gt;

&lt;p&gt;I learned about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Designing validation rules before implementing them&lt;/li&gt;
&lt;li&gt;Using &lt;code&gt;try/except&lt;/code&gt; for user input&lt;/li&gt;
&lt;li&gt;Separating application flow from business logic&lt;/li&gt;
&lt;li&gt;Handling different types of invalid input&lt;/li&gt;
&lt;li&gt;Thinking about edge cases&lt;/li&gt;
&lt;li&gt;Designing better CLI user interaction&lt;/li&gt;
&lt;li&gt;Keeping the project scope under control&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One thing I learned during this version is that &lt;strong&gt;not every possible improvement needs to be implemented immediately&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;There are still things I could add, such as more advanced database error handling and additional checks, but I decided to stop V2 at the scope I originally defined.&lt;/p&gt;

&lt;p&gt;That is also part of learning software development: knowing when a version is complete.&lt;/p&gt;

&lt;h2&gt;
  
  
  🏗️ Current Architecture
&lt;/h2&gt;

&lt;p&gt;The project currently follows a simple separation of responsibilities:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;main.py
   ↓
ExpenseManager
   ↓
Database / storage.py
   ↓
SQLite
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;main.py&lt;/code&gt; handles the CLI/application flow, &lt;code&gt;ExpenseManager&lt;/code&gt; handles the application logic, and &lt;code&gt;storage.py&lt;/code&gt; handles database operations.&lt;/p&gt;

&lt;h2&gt;
  
  
  📌 V2 Status
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;V2 is now complete.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The project currently supports:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Add expenses&lt;/li&gt;
&lt;li&gt;✅ View expenses&lt;/li&gt;
&lt;li&gt;✅ Edit expenses&lt;/li&gt;
&lt;li&gt;✅ Delete expenses&lt;/li&gt;
&lt;li&gt;✅ Category selection&lt;/li&gt;
&lt;li&gt;✅ Input validation&lt;/li&gt;
&lt;li&gt;✅ Date validation&lt;/li&gt;
&lt;li&gt;✅ Basic error handling&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The main goal of this version was not to build a huge application.&lt;/p&gt;

&lt;p&gt;It was to take the working V1 and make it &lt;strong&gt;more reliable while strengthening my understanding of Python, OOP, SQL, SQLite, and application design.&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;📌 &lt;strong&gt;GitHub Repository:&lt;/strong&gt; &lt;a href="https://github.com/xDK0d3r/personal-expense-tracker" rel="noopener noreferrer"&gt;Personal Expense Tracker&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I’ll continue improving the project in future versions when there is something meaningful to learn or add.&lt;/p&gt;

&lt;p&gt;Thanks for reading! 🚀&lt;/p&gt;

</description>
      <category>database</category>
      <category>learning</category>
      <category>python</category>
      <category>softwaredevelopment</category>
    </item>
    <item>
      <title>Personal Expense Tracker — V1 Complete: Building the Core Working Stage</title>
      <dc:creator>Dhanush K</dc:creator>
      <pubDate>Wed, 02 Sep 2026 17:56:33 +0000</pubDate>
      <link>https://dev.to/xdk0d3r/-personal-expense-tracker-v1-complete-building-the-core-working-stage-3loh</link>
      <guid>https://dev.to/xdk0d3r/-personal-expense-tracker-v1-complete-building-the-core-working-stage-3loh</guid>
      <description>&lt;p&gt;I’ve completed &lt;strong&gt;V1 of my Personal Expense Tracker&lt;/strong&gt;, a small &lt;strong&gt;learning project&lt;/strong&gt; built with &lt;strong&gt;Python and SQLite&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This project was created primarily to learn by building rather than following a tutorial step by step.&lt;/p&gt;

&lt;p&gt;The goal of V1 was not to build a production-ready expense tracker.&lt;/p&gt;

&lt;p&gt;The goal was:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Build the core application flow, understand the responsibilities of each layer, and make the fundamental functionality work end-to-end.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;With that goal achieved, I consider &lt;strong&gt;V1 complete&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I Built This Project
&lt;/h2&gt;

&lt;p&gt;I wanted to strengthen my understanding of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Python OOP&lt;/li&gt;
&lt;li&gt;Classes and objects&lt;/li&gt;
&lt;li&gt;Object responsibilities&lt;/li&gt;
&lt;li&gt;SQL and SQLite&lt;/li&gt;
&lt;li&gt;CRUD operations&lt;/li&gt;
&lt;li&gt;Database design&lt;/li&gt;
&lt;li&gt;Separating application responsibilities&lt;/li&gt;
&lt;li&gt;How different layers communicate with each other&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of learning these concepts separately, I decided to combine them into one small practical project.&lt;/p&gt;

&lt;p&gt;That's why I consider this primarily a &lt;strong&gt;learning project&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The objective was not to create a feature-rich application immediately, but to understand the fundamentals by actually building something.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;The application is a command-line Personal Expense Tracker.&lt;/p&gt;

&lt;p&gt;The core V1 functionality includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Adding an expense&lt;/li&gt;
&lt;li&gt;Viewing expenses&lt;/li&gt;
&lt;li&gt;Deleting an expense&lt;/li&gt;
&lt;li&gt;Storing expenses in SQLite&lt;/li&gt;
&lt;li&gt;Using SQLite-generated IDs&lt;/li&gt;
&lt;li&gt;Separating the application into different responsibilities&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The database currently contains an &lt;code&gt;expenses&lt;/code&gt; table:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Column&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;id&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;INTEGER PRIMARY KEY&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;amount&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;REAL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;category&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;TEXT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;description&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;TEXT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;date&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;TEXT&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Application Architecture
&lt;/h2&gt;

&lt;p&gt;One of the main things I wanted to learn was how to organize responsibilities in an application.&lt;/p&gt;

&lt;p&gt;I structured the project into three main layers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;main.py
   ↓
ExpenseManager
   ↓
Database
   ↓
SQLite
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;code&gt;main.py&lt;/code&gt; — UI Layer
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;main.py&lt;/code&gt; is responsible for interacting with the user through the CLI.&lt;/p&gt;

&lt;p&gt;Its responsibilities include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Displaying the menu&lt;/li&gt;
&lt;li&gt;Taking user input&lt;/li&gt;
&lt;li&gt;Calling the appropriate operation&lt;/li&gt;
&lt;li&gt;Displaying results&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The UI does not directly handle SQL operations.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;expense_manager.py&lt;/code&gt; — Application Layer
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;ExpenseManager&lt;/code&gt; acts as the middle layer between the UI and storage.&lt;/p&gt;

&lt;p&gt;It coordinates application operations and communicates with the database object.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;main.py
   ↓
ExpenseManager.add_expense()
   ↓
Database.insert_expense()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This helped me understand the difference between the application's operation and the actual persistence of data.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;storage.py&lt;/code&gt; — Persistence Layer
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;Database&lt;/code&gt; class handles communication with SQLite.&lt;/p&gt;

&lt;p&gt;Its responsibilities include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Creating the database connection&lt;/li&gt;
&lt;li&gt;Initializing the database&lt;/li&gt;
&lt;li&gt;Creating the table&lt;/li&gt;
&lt;li&gt;Inserting expenses&lt;/li&gt;
&lt;li&gt;Retrieving expenses&lt;/li&gt;
&lt;li&gt;Deleting expenses&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This keeps database-related responsibilities separate from the UI.&lt;/p&gt;

&lt;h2&gt;
  
  
  Understanding Object Relationships
&lt;/h2&gt;

&lt;p&gt;Another important part of this project was understanding how objects can work together.&lt;/p&gt;

&lt;p&gt;The application creates a database object and passes it to &lt;code&gt;ExpenseManager&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Conceptually:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;main.py
   │
   ├── creates Database
   │
   └── creates ExpenseManager
             │
             └── uses Database
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The manager receives the database dependency instead of creating its own database internally.&lt;/p&gt;

&lt;p&gt;This was one of the OOP concepts I wanted to understand through practical implementation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why V1 Is Complete
&lt;/h2&gt;

&lt;p&gt;There is an important distinction between:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"V1 is complete"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;and&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"the project is finished."&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;V1 is complete because its intended scope has been achieved.&lt;/p&gt;

&lt;p&gt;The core application flow works:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User
 ↓
CLI
 ↓
ExpenseManager
 ↓
Database
 ↓
SQLite
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;An expense can be added and stored, stored expenses can be retrieved and displayed, and expenses can be deleted.&lt;/p&gt;

&lt;p&gt;The different layers can communicate with each other correctly.&lt;/p&gt;

&lt;p&gt;That is the foundation I wanted to establish in V1.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Learned From V1
&lt;/h2&gt;

&lt;p&gt;The biggest lesson wasn't simply learning SQLite syntax or Python syntax.&lt;/p&gt;

&lt;p&gt;It was understanding &lt;strong&gt;responsibility&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I learned to think about the application as separate parts with different jobs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;UI
→ communicates with the user

Manager
→ coordinates application operations

Storage
→ communicates with the database
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Along the way, I gained practical experience with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Python classes&lt;/li&gt;
&lt;li&gt;Constructors and attributes&lt;/li&gt;
&lt;li&gt;Methods&lt;/li&gt;
&lt;li&gt;Object relationships&lt;/li&gt;
&lt;li&gt;Passing dependencies between objects&lt;/li&gt;
&lt;li&gt;SQLite tables&lt;/li&gt;
&lt;li&gt;Primary keys&lt;/li&gt;
&lt;li&gt;CRUD operations&lt;/li&gt;
&lt;li&gt;SQL queries&lt;/li&gt;
&lt;li&gt;Multi-module Python projects&lt;/li&gt;
&lt;li&gt;Debugging&lt;/li&gt;
&lt;li&gt;Git and GitHub&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What I Didn't Focus On in V1
&lt;/h2&gt;

&lt;p&gt;I deliberately didn't try to make V1 handle every possible invalid input or edge case.&lt;/p&gt;

&lt;p&gt;Comprehensive validation and robust error handling were not the main goals of this version.&lt;/p&gt;

&lt;p&gt;Instead, I decided to make the &lt;strong&gt;core functionality work first&lt;/strong&gt; and move robustness-related improvements into V2.&lt;/p&gt;

&lt;p&gt;This gives the project a clearer progression:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;V1
Core Working Stage
       ↓
V2
Robustness + Additional Core Operation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What's Coming in V2?
&lt;/h2&gt;

&lt;p&gt;Now that the core working stage is complete, V2 will focus on improving the application's robustness and functionality.&lt;/p&gt;

&lt;p&gt;The planned V2 work includes:&lt;/p&gt;

&lt;h3&gt;
  
  
  Validation
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Validating user input&lt;/li&gt;
&lt;li&gt;Validating expense IDs&lt;/li&gt;
&lt;li&gt;Handling invalid values&lt;/li&gt;
&lt;li&gt;Handling invalid menu input&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Error Handling
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Handling invalid user input gracefully&lt;/li&gt;
&lt;li&gt;Handling invalid/non-existent expense IDs&lt;/li&gt;
&lt;li&gt;Handling database-related errors&lt;/li&gt;
&lt;li&gt;Providing better user-facing error messages&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Edit Expense
&lt;/h3&gt;

&lt;p&gt;V2 will also introduce an &lt;strong&gt;Edit Expense&lt;/strong&gt; operation.&lt;/p&gt;

&lt;p&gt;The core expense operations will then become:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Create
Read
Update
Delete
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or simply:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CRUD
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will make the expense management functionality more complete.&lt;/p&gt;

&lt;h2&gt;
  
  
  V1 → V2
&lt;/h2&gt;

&lt;p&gt;The project's progression can be summarized as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;V1
│
├── Add Expense
├── View Expenses
├── Delete Expense
├── SQLite persistence
├── Layered architecture
└── Core application flow
        │
        ▼
V2
│
├── Edit Expense
├── Input validation
├── ID validation
├── Error handling
└── CLI refinement
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I intentionally want to keep these stages separate.&lt;/p&gt;

&lt;p&gt;V1 proves that the &lt;strong&gt;foundation works&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;V2 will make that foundation &lt;strong&gt;more robust and complete&lt;/strong&gt;.&lt;/p&gt;

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

&lt;p&gt;This project started as a learning exercise to understand Python OOP and SQLite by building something practical.&lt;/p&gt;

&lt;p&gt;Completing V1 gave me more than just another project for my GitHub repository.&lt;/p&gt;

&lt;p&gt;It helped me understand how a small application can be divided into responsibilities and how those components communicate with each other.&lt;/p&gt;

&lt;p&gt;I'm treating V1 as a &lt;strong&gt;completed learning milestone&lt;/strong&gt;, not as the final state of the application.&lt;/p&gt;

&lt;p&gt;The core working stage is done.&lt;/p&gt;

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

&lt;p&gt;📌 &lt;strong&gt;GitHub Repository:&lt;/strong&gt; &lt;a href="https://github.com/xDK0d3r/personal-expense-tracker" rel="noopener noreferrer"&gt;Personal Expense Tracker&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now it's time to build on that foundation.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;V1: Complete.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Core working stage: Achieved.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Next: V2 — Validation, Error Handling &amp;amp; Edit Expense.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>database</category>
      <category>learning</category>
      <category>python</category>
      <category>softwaredevelopment</category>
    </item>
    <item>
      <title>I Spent 7 Days Building a Simple Python To-Do List… Here's What It Actually Taught Me</title>
      <dc:creator>Dhanush K</dc:creator>
      <pubDate>Thu, 09 Jul 2026 17:37:36 +0000</pubDate>
      <link>https://dev.to/xdk0d3r/i-spent-7-days-building-a-simple-python-to-do-list-heres-what-it-actually-taught-me-3gi4</link>
      <guid>https://dev.to/xdk0d3r/i-spent-7-days-building-a-simple-python-to-do-list-heres-what-it-actually-taught-me-3gi4</guid>
      <description>&lt;p&gt;When I first thought about building a To-Do List application, I assumed it would take a day or two.&lt;/p&gt;

&lt;p&gt;After all, it's "just" a CRUD app... right?&lt;/p&gt;

&lt;p&gt;Seven days later, I realized I had underestimated how much there was to learn.&lt;/p&gt;

&lt;p&gt;This wasn't just about adding, editing, and deleting tasks. It became an exercise in thinking like a software developer instead of simply writing Python code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I Chose This Project
&lt;/h2&gt;

&lt;p&gt;My previous project was a Number Guessing Game. It helped me become comfortable with Python basics, but I wanted something closer to a real application.&lt;/p&gt;

&lt;p&gt;A To-Do List seemed like the perfect next step because it introduced concepts that many real-world applications use:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Creating, reading, updating, and deleting data (CRUD)&lt;/li&gt;
&lt;li&gt;Persistent storage&lt;/li&gt;
&lt;li&gt;Input validation&lt;/li&gt;
&lt;li&gt;Error handling&lt;/li&gt;
&lt;li&gt;Modular project structure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I wanted to build everything myself rather than copy a tutorial.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Reality
&lt;/h2&gt;

&lt;p&gt;The hardest part wasn't Python syntax.&lt;/p&gt;

&lt;p&gt;It was deciding &lt;strong&gt;how the application should work&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Questions like these came up constantly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How should I store each task?&lt;/li&gt;
&lt;li&gt;Should I use a list or a dictionary?&lt;/li&gt;
&lt;li&gt;Where should file handling happen?&lt;/li&gt;
&lt;li&gt;When should data be saved?&lt;/li&gt;
&lt;li&gt;What should &lt;code&gt;main.py&lt;/code&gt; be responsible for?&lt;/li&gt;
&lt;li&gt;How can I keep the code organized as the project grows?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These aren't syntax problems.&lt;/p&gt;

&lt;p&gt;They're software design problems.&lt;/p&gt;

&lt;p&gt;And solving them taught me far more than memorizing Python functions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Features I Built
&lt;/h2&gt;

&lt;p&gt;The finished application includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;➕ Add tasks&lt;/li&gt;
&lt;li&gt;✏️ Edit tasks&lt;/li&gt;
&lt;li&gt;🗑️ Delete tasks&lt;/li&gt;
&lt;li&gt;✅ Mark tasks as completed&lt;/li&gt;
&lt;li&gt;📋 View all tasks&lt;/li&gt;
&lt;li&gt;💾 Save tasks automatically to a JSON file&lt;/li&gt;
&lt;li&gt;📂 Load tasks when the application starts&lt;/li&gt;
&lt;li&gt;⚠️ Input validation&lt;/li&gt;
&lt;li&gt;🛡️ Exception handling&lt;/li&gt;
&lt;li&gt;🧩 Modular project structure&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Over the course of seven days, I strengthened my understanding of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Functions&lt;/li&gt;
&lt;li&gt;Lists and dictionaries&lt;/li&gt;
&lt;li&gt;Loops (&lt;code&gt;for&lt;/code&gt; and &lt;code&gt;while&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Conditional statements&lt;/li&gt;
&lt;li&gt;CRUD operations&lt;/li&gt;
&lt;li&gt;File handling&lt;/li&gt;
&lt;li&gt;JSON data persistence&lt;/li&gt;
&lt;li&gt;Exception handling&lt;/li&gt;
&lt;li&gt;Input validation&lt;/li&gt;
&lt;li&gt;Modular programming&lt;/li&gt;
&lt;li&gt;Separating application logic from data storage&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;More importantly, I learned that building software is about making good design decisions—not just writing code.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Biggest Lesson
&lt;/h2&gt;

&lt;p&gt;Before this project, I often thought programming was mainly about knowing the right syntax.&lt;/p&gt;

&lt;p&gt;Now I think differently.&lt;/p&gt;

&lt;p&gt;The syntax is usually the easy part.&lt;/p&gt;

&lt;p&gt;Understanding the problem, designing the solution, organizing the code, and deciding how everything fits together—that's where the real learning happens.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next?
&lt;/h2&gt;

&lt;p&gt;This project is now feature-complete for its current scope.&lt;/p&gt;

&lt;p&gt;I'm continuing to build more Python projects to improve my problem-solving skills and deepen my understanding of software development.&lt;/p&gt;

&lt;p&gt;Each project is a little more challenging than the last, and that's exactly the goal.&lt;/p&gt;




&lt;p&gt;📂 &lt;strong&gt;GitHub Repository:&lt;/strong&gt; &lt;em&gt;&lt;a href="https://github.com/xDK0d3r/todo-list" rel="noopener noreferrer"&gt;https://github.com/xDK0d3r/todo-list&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;🌐 &lt;strong&gt;Portfolio:&lt;/strong&gt; &lt;em&gt;&lt;a href="https://xdk0d3r.github.io/" rel="noopener noreferrer"&gt;https://xdk0d3r.github.io/&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;If you're also learning Python by building projects, I'd love to hear what you're working on or any feedback you have on this project.&lt;/p&gt;

&lt;p&gt;Thanks for reading! 🚀&lt;/p&gt;

</description>
      <category>python</category>
      <category>beginners</category>
      <category>showdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>I Built My Personal Portfolio Website with GitHub Pages</title>
      <dc:creator>Dhanush K</dc:creator>
      <pubDate>Mon, 29 Jun 2026 17:17:32 +0000</pubDate>
      <link>https://dev.to/xdk0d3r/i-built-my-personal-portfolio-website-with-github-pages-95f</link>
      <guid>https://dev.to/xdk0d3r/i-built-my-personal-portfolio-website-with-github-pages-95f</guid>
      <description>&lt;p&gt;I just launched my personal portfolio website using GitHub Pages.&lt;/p&gt;

&lt;p&gt;It brings together my projects, GitHub repositories, and ways to connect with me in one place.&lt;/p&gt;

&lt;p&gt;I'm currently learning Python backend development and documenting my journey by building projects and sharing what I learn.&lt;/p&gt;

&lt;p&gt;Feedback is always welcome!&lt;/p&gt;

&lt;p&gt;🔗 Portfolio: &lt;a href="https://xdk0d3r.github.io/" rel="noopener noreferrer"&gt;https://xdk0d3r.github.io/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>portfolio</category>
      <category>githubpages</category>
      <category>python</category>
      <category>showdev</category>
    </item>
    <item>
      <title>My First Python Project: Lessons Learned While Building a Number Guessing Game</title>
      <dc:creator>Dhanush K</dc:creator>
      <pubDate>Sat, 27 Jun 2026 15:11:00 +0000</pubDate>
      <link>https://dev.to/xdk0d3r/my-first-python-project-lessons-learned-while-building-a-number-guessing-game-559i</link>
      <guid>https://dev.to/xdk0d3r/my-first-python-project-lessons-learned-while-building-a-number-guessing-game-559i</guid>
      <description>&lt;p&gt;Hello everyone! 👋&lt;/p&gt;

&lt;p&gt;I'm a self-taught Python learner, and today I completed my very first programming project—a command-line Number Guessing Game.&lt;/p&gt;

&lt;p&gt;It isn't a large project, but finishing it feels like an important milestone because it's the first application I built from start to finish on my own.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I Choose This Project
&lt;/h2&gt;

&lt;p&gt;After learning the basics of Python, I wanted to build something practical instead of only solving small exercises.&lt;/p&gt;

&lt;p&gt;A number guessing game seemed like the perfect beginner project because it combines many fundamental programming concepts into one application.&lt;/p&gt;

&lt;h2&gt;
  
  
  Project Features
&lt;/h2&gt;

&lt;p&gt;The game includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🎲 Random number generation between 1 and 100&lt;/li&gt;
&lt;li&gt;🎯 Five attempts to guess the correct number&lt;/li&gt;
&lt;li&gt;⌨️ User input validation&lt;/li&gt;
&lt;li&gt;✅ Handles invalid input using exception handling&lt;/li&gt;
&lt;li&gt;📏 Range validation (only accepts numbers from 1–100)&lt;/li&gt;
&lt;li&gt;💬 Helpful feedback after each guess ("Too Big" or "Too Small")&lt;/li&gt;
&lt;li&gt;🏆 Win and lose conditions&lt;/li&gt;
&lt;li&gt;🧩 Organized code using multiple functions instead of one large script&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;This project helped me understand how different Python concepts work together in a real application.&lt;/p&gt;

&lt;p&gt;Some of the topics I practiced include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Variables&lt;/li&gt;
&lt;li&gt;Functions&lt;/li&gt;
&lt;li&gt;Return values&lt;/li&gt;
&lt;li&gt;Conditional statements (&lt;code&gt;if&lt;/code&gt;, &lt;code&gt;elif&lt;/code&gt;, &lt;code&gt;else&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;While loops&lt;/li&gt;
&lt;li&gt;Exception handling with &lt;code&gt;try&lt;/code&gt; and &lt;code&gt;except&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;User input validation&lt;/li&gt;
&lt;li&gt;Using Python's &lt;code&gt;random&lt;/code&gt; module&lt;/li&gt;
&lt;li&gt;Breaking a program into smaller, reusable functions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One lesson I learned is that separating code into functions makes the program much easier to understand and maintain.&lt;/p&gt;

&lt;h2&gt;
  
  
  Challenges
&lt;/h2&gt;

&lt;p&gt;The biggest challenge was making the program accept only valid input.&lt;/p&gt;

&lt;p&gt;I didn't want the game to crash if the user entered letters or special characters, so I implemented exception handling and input validation until a valid number was entered.&lt;/p&gt;

&lt;p&gt;I also wanted to ensure the player could only enter numbers between 1 and 100, which added another layer of validation.&lt;/p&gt;

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

&lt;p&gt;This project is feature-complete for its current scope.&lt;/p&gt;

&lt;p&gt;I have ideas for future versions, such as difficulty levels, score tracking, and replay support, but for now I'm leaving the project as it is and moving on to build new applications.&lt;/p&gt;

&lt;p&gt;My goal is to keep creating projects that gradually become more challenging while improving my Python skills.&lt;/p&gt;

&lt;h2&gt;
  
  
  Source Code
&lt;/h2&gt;

&lt;p&gt;You can check out the complete project on GitHub:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub Repository:&lt;/strong&gt; &lt;a href="https://github.com/xDK0d3r/Number-Guessing-Game" rel="noopener noreferrer"&gt;https://github.com/xDK0d3r/Number-Guessing-Game&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Every experienced developer started somewhere.&lt;/p&gt;

&lt;p&gt;This Number Guessing Game is my first completed Python project, and I'm excited to continue learning by building more projects and sharing my progress along the way.&lt;/p&gt;

&lt;p&gt;If you're also learning Python, I'd love to hear what you're working on.&lt;/p&gt;

&lt;p&gt;Happy coding! 🚀&lt;/p&gt;

</description>
      <category>python</category>
      <category>beginners</category>
      <category>programming</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
