<?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>Forem: DevForge</title>
    <description>The latest articles on Forem by DevForge (@devforge).</description>
    <link>https://forem.com/devforge</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3500738%2F7cff9682-86a0-4ffb-a0cb-9aa09dfc66dc.png</url>
      <title>Forem: DevForge</title>
      <link>https://forem.com/devforge</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/devforge"/>
    <language>en</language>
    <item>
      <title>Building an ERC-20 Token From A to Z (Hardhat + OpenZeppelin)</title>
      <dc:creator>DevForge</dc:creator>
      <pubDate>Thu, 18 Dec 2025 01:45:23 +0000</pubDate>
      <link>https://forem.com/devforge/building-an-erc-20-token-from-a-to-z-hardhat-openzeppelin-1dpc</link>
      <guid>https://forem.com/devforge/building-an-erc-20-token-from-a-to-z-hardhat-openzeppelin-1dpc</guid>
      <description>&lt;p&gt;&lt;strong&gt;⚠️ Disclaimer&lt;/strong&gt;&lt;br&gt;
This article is for &lt;strong&gt;educational purposes only.&lt;/strong&gt;&lt;br&gt;
The token created here is &lt;strong&gt;not money, has no intrinsic value&lt;/strong&gt;, and &lt;strong&gt;is not associated with any real-world brand or stablecoin.&lt;/strong&gt;&lt;br&gt;
Do not impersonate existing projects or tickers. Always use your own unique token name and symbol.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why I Wrote This Article&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Many people entering crypto ask the same questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“Why did a random token appear in my wallet?”&lt;/li&gt;
&lt;li&gt;“Why do I see a balance but can’t sell it?”&lt;/li&gt;
&lt;li&gt;“How are ERC-20 tokens actually created?”&lt;/li&gt;
&lt;li&gt;“Why does a token look real if it’s fake?”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The best way to truly understand this is simple:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Create your own ERC-20 token once.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When you do that, everything suddenly makes sense:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;balances&lt;/li&gt;
&lt;li&gt;wallets&lt;/li&gt;
&lt;li&gt;approvals&lt;/li&gt;
&lt;li&gt;fake tokens&lt;/li&gt;
&lt;li&gt;approvals&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This article walks through the entire process &lt;strong&gt;from zero to deployment&lt;/strong&gt;, step by step.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What We Will Build&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We will build a &lt;strong&gt;clean educational ERC-20 token&lt;/strong&gt; with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;OpenZeppelin ERC-20 implementation&lt;/li&gt;
&lt;li&gt;Role-based access control&lt;/li&gt;
&lt;li&gt;Pausable transfers&lt;/li&gt;
&lt;li&gt;Minting&lt;/li&gt;
&lt;li&gt;Deployment with Hardhat&lt;/li&gt;
&lt;li&gt;Adding the token to MetaMask&lt;/li&gt;
&lt;li&gt;Understanding how wallets detect balances&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;1. What Is ERC-20 (Plain English)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;ERC-20 is not a currency.&lt;br&gt;
It’s simply a standard interface — a set of functions that wallets and dApps know how to call.&lt;/p&gt;

&lt;p&gt;At minimum, an ERC-20 token has:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;balanceOf(address)&lt;/li&gt;
&lt;li&gt;transfer(address, amount)&lt;/li&gt;
&lt;li&gt;totalSupply()&lt;/li&gt;
&lt;li&gt;name(), symbol(), decimals()&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;❗ &lt;strong&gt;Important&lt;/strong&gt;&lt;br&gt;
An ERC-20 contract does not know its price.&lt;br&gt;
Price exists only if:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a market exists&lt;/li&gt;
&lt;li&gt;liquidity exists&lt;/li&gt;
&lt;li&gt;someone is willing to trade&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No liquidity → no price → no real value.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Environment Setup&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Requirements&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Node.js (LTS)&lt;/li&gt;
&lt;li&gt;npm&lt;/li&gt;
&lt;li&gt;MetaMask wallet&lt;/li&gt;
&lt;li&gt;Sepolia test ETH&lt;/li&gt;
&lt;li&gt;RPC provider (Alchemy, Infura, etc.)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Create the Project&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mkdir my-token
cd my-token
npm init -y
npm install --save-dev hardhat @nomicfoundation/hardhat-toolbox dotenv
npx hardhat

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;&lt;code&gt;Create a JavaScript project&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Install OpenZeppelin&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;OpenZeppelin provides audited, production-grade smart contracts.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;npm install @openzeppelin/contract&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Writing the ERC-20 Token Contract&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Create contracts/MyToken.sol:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

/*
    MyToken — an educational ERC-20 token.
    NOT money. NOT a stablecoin.
*/

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/access/AccessControl.sol";
import "@openzeppelin/contracts/utils/Pausable.sol";

contract MyToken is ERC20, AccessControl, Pausable {
    bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE");
    bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE");

    constructor(uint256 initialSupply)
        ERC20("My Educational Token", "MYT")
    {
        _grantRole(DEFAULT_ADMIN_ROLE, msg.sender);
        _grantRole(MINTER_ROLE, msg.sender);
        _grantRole(PAUSER_ROLE, msg.sender);

        _mint(msg.sender, initialSupply);
    }

    function mint(address to, uint256 amount)
        external
        onlyRole(MINTER_ROLE)
    {
        _mint(to, amount);
    }

    function pause() external onlyRole(PAUSER_ROLE) {
        _pause();
    }

    function unpause() external onlyRole(PAUSER_ROLE) {
        _unpause();
    }

    function _update(address from, address to, uint256 amount)
        internal
        override
        whenNotPaused
    {
        super._update(from, to, amount);
    }
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Key Concepts Here&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Name and symbol are just strings&lt;/li&gt;
&lt;li&gt;The contract itself stores balances&lt;/li&gt;
&lt;li&gt;Tokens exist only after mint&lt;/li&gt;
&lt;li&gt;If you don’t mint → balance will be zero&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;5. Hardhat Configuration&lt;/strong&gt;&lt;br&gt;
Create hardhat.config.js:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;require("@nomicfoundation/hardhat-toolbox");
require("dotenv").config();

module.exports = {
  solidity: "0.8.20",
  networks: {
    sepolia: {
      url: process.env.SEPOLIA_RPC,
      accounts: process.env.PRIVATE_KEY ? [process.env.PRIVATE_KEY] : [],
    },
  },
};

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;6. Environment Variables&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Create .env (never commit this):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SEPOLIA_RPC=https://eth-sepolia.g.alchemy.com/v2/YOUR_API_KEY
PRIVATE_KEY=0xYOUR_PRIVATE_KEY

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;7. Deployment Script&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Create scripts/deploy.js:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const hre = require("hardhat");

async function main() {
  const [deployer] = await hre.ethers.getSigners();

  console.log("Deploying with address:", deployer.address);

  const initialSupply = hre.ethers.parseUnits("1000", 18);

  const MyToken = await hre.ethers.getContractFactory("MyToken");
  const token = await MyToken.deploy(initialSupply);

  await token.waitForDeployment();

  console.log("Token deployed at:", await token.getAddress());
}

main().catch(console.error);

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;8. Compile and Deploy&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npx hardhat compile
npx hardhat run scripts/deploy.js --network sepolia

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You will receive a contract address.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;9. Adding the Token to MetaMask&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Switch MetaMask to Sepolia&lt;/li&gt;
&lt;li&gt;Go to Assets → Import token&lt;/li&gt;
&lt;li&gt;Paste the contract address&lt;/li&gt;
&lt;li&gt;MetaMask auto-fills symbol &amp;amp; decimals&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If balance shows 0, check:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;correct network&lt;/li&gt;
&lt;li&gt;minted address&lt;/li&gt;
&lt;li&gt;decimals&lt;/li&gt;
&lt;li&gt;wallet cache (reload MetaMask)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;10. Why Tokens Can Appear “Out of Nowhere”&lt;/strong&gt;&lt;br&gt;
Here’s the critical realization:&lt;/p&gt;

&lt;p&gt;Wallets do not store tokens.&lt;/p&gt;

&lt;p&gt;A wallet simply calls:&lt;br&gt;
&lt;code&gt;balanceOf(yourAddress)&lt;/code&gt;&lt;br&gt;
If any contract returns a non-zero number → the wallet displays it.&lt;/p&gt;

&lt;p&gt;That means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;someone can mint tokens to your address&lt;/li&gt;
&lt;li&gt;without asking&lt;/li&gt;
&lt;li&gt;without permission&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Your wallet will still show them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;11. Why Name, Symbol, and Icon Mean Nothing&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Blockchains have:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;no global registry of names&lt;/li&gt;
&lt;li&gt;no trademark enforcement&lt;/li&gt;
&lt;li&gt;no “official token” flag&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Anyone can deploy:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;any name&lt;/li&gt;
&lt;li&gt;any symbol&lt;/li&gt;
&lt;li&gt;any decimals&lt;/li&gt;
&lt;li&gt;any logo
The only real identity of a token is:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;its contract address&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;12. The Core Security Lesson&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Once you understand this, many scams become obvious:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“free tokens” → meaningless balances&lt;/li&gt;
&lt;li&gt;fake stablecoins → just ERC-20 contracts&lt;/li&gt;
&lt;li&gt;approval traps → dangerous permissions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Knowledge beats fear.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;ERC-20 tokens are just smart contracts.&lt;br&gt;
Balances are just numbers.&lt;br&gt;
Price comes from markets, not from code.&lt;br&gt;
Trust comes from verification, not appearance.&lt;/p&gt;

&lt;p&gt;Creating your own token once is the fastest way to understand all of this.&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>web3</category>
      <category>ethereum</category>
      <category>blockchain</category>
    </item>
    <item>
      <title>Building a 3D Rotating Cube for a Shoe Store with HTML &amp; CSS</title>
      <dc:creator>DevForge</dc:creator>
      <pubDate>Mon, 17 Nov 2025 17:20:26 +0000</pubDate>
      <link>https://forem.com/devforge/building-a-3d-rotating-cube-for-a-shoe-store-with-html-css-4em5</link>
      <guid>https://forem.com/devforge/building-a-3d-rotating-cube-for-a-shoe-store-with-html-css-4em5</guid>
      <description>&lt;h1&gt;
  
  
  🌀 Building a 3D Rotating Cube for a Shoe Store with HTML &amp;amp; CSS
&lt;/h1&gt;

&lt;p&gt;Have you ever seen those flashy website templates or ad mockups with a rotating 3D cube — each side showing a product?&lt;br&gt;
I saw a few frameworks selling such templates and thought: &lt;em&gt;why not build one myself, from scratch?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;So I created a &lt;strong&gt;3D Rotating Cube&lt;/strong&gt; entirely in &lt;strong&gt;HTML, CSS, and a bit of JS&lt;/strong&gt; — perfect for e-commerce, product showcases, or creative portfolios.&lt;/p&gt;


&lt;h2&gt;
  
  
  🎥 Demo
&lt;/h2&gt;

&lt;p&gt;👉 &lt;em&gt;&lt;a href="https://www.youtube.com/watch?v=HV_7-rM-I7o" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=HV_7-rM-I7o&lt;/a&gt;&lt;/em&gt;&lt;br&gt;
👉 &lt;em&gt;&lt;a href="https://github.com/renocmon-cloud/3dkub" rel="noopener noreferrer"&gt;https://github.com/renocmon-cloud/3dkub&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  💡 Idea
&lt;/h2&gt;

&lt;p&gt;The idea was simple: a rotating cube where each face is clickable — linking to a different shoe (or any product page).&lt;br&gt;
It spins smoothly in 3D, stops on hover, and even works on touch devices.&lt;/p&gt;

&lt;p&gt;This could be useful for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fashion or shoe stores&lt;/li&gt;
&lt;li&gt;Product galleries&lt;/li&gt;
&lt;li&gt;Interactive 3D landing pages&lt;/li&gt;
&lt;li&gt;Or just learning cool CSS 3D transformations!&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  🧱 How It Works
&lt;/h2&gt;

&lt;p&gt;The cube is built using &lt;strong&gt;6 divs&lt;/strong&gt;, each representing one face.&lt;br&gt;
We use &lt;code&gt;transform: rotateY()&lt;/code&gt; and &lt;code&gt;translateZ()&lt;/code&gt; to position them in 3D space.&lt;/p&gt;
&lt;h3&gt;
  
  
  🧩 Structure
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"scene"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"cube"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"shoe1.html"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"face face-front"&lt;/span&gt;  &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"background-image:url('images/img1.jpg')"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"shoe2.html"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"face face-back"&lt;/span&gt;   &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"background-image:url('images/img2.jpg')"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"shoe3.html"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"face face-right"&lt;/span&gt;  &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"background-image:url('images/img3.jpg')"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"shoe4.html"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"face face-left"&lt;/span&gt;   &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"background-image:url('images/img4.jpg')"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"shoe5.html"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"face face-top"&lt;/span&gt;    &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"background-image:url('images/img5.jpg')"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"shoe6.html"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"face face-bottom"&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"background-image:url('images/img6.jpg')"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Each &lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt; tag acts as a clickable face with its own background image.&lt;/p&gt;


&lt;h2&gt;
  
  
  🎨 CSS Magic
&lt;/h2&gt;

&lt;p&gt;The CSS handles the 3D layout and animation.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.cube&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;transform-style&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;preserve-3d&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;animation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;spin&lt;/span&gt; &lt;span class="m"&gt;10s&lt;/span&gt; &lt;span class="n"&gt;infinite&lt;/span&gt; &lt;span class="n"&gt;linear&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;@keyframes&lt;/span&gt; &lt;span class="n"&gt;spin&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nt"&gt;from&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;transform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;rotateX&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0deg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;rotateY&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0deg&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nt"&gt;to&lt;/span&gt;   &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;transform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;rotateX&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;360deg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;rotateY&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;360deg&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;Hovering the cube pauses the rotation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.scene&lt;/span&gt;&lt;span class="nd"&gt;:hover&lt;/span&gt; &lt;span class="nc"&gt;.cube&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;animation-play-state&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;paused&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;cursor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;pointer&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;It looks smooth because of &lt;strong&gt;&lt;code&gt;perspective&lt;/code&gt;&lt;/strong&gt;, which gives the illusion of depth.&lt;/p&gt;




&lt;h2&gt;
  
  
  📱 Mobile Support
&lt;/h2&gt;

&lt;p&gt;A few lines of JavaScript let mobile users tap the cube to pause/resume rotation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;cube&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.cube&lt;/span&gt;&lt;span class="dl"&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;scene&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.scene&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;isPaused&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;scene&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;touchstart&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="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;isPaused&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;isPaused&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nx"&gt;cube&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;animationPlayState&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;isPaused&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;paused&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;running&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🚀 Try It Yourself
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Copy the HTML/CSS/JS code.&lt;/li&gt;
&lt;li&gt;Replace the image URLs with your own product pictures.&lt;/li&gt;
&lt;li&gt;Open it in a browser — voilà, you have a rotating 3D cube!&lt;/li&gt;
&lt;/ol&gt;




</description>
      <category>javascript</category>
      <category>showdev</category>
      <category>html</category>
      <category>css</category>
    </item>
    <item>
      <title>🎲 Game 21 — Cheburashka &amp; Gena</title>
      <dc:creator>DevForge</dc:creator>
      <pubDate>Sat, 18 Oct 2025 16:41:01 +0000</pubDate>
      <link>https://forem.com/devforge/how-i-built-game-21-cheburashka-gena-in-python-tkinter-21mh</link>
      <guid>https://forem.com/devforge/how-i-built-game-21-cheburashka-gena-in-python-tkinter-21mh</guid>
      <description>&lt;p&gt;Built in Pure Python + Tkinter&lt;br&gt;
🐊 Introduction&lt;/p&gt;

&lt;p&gt;It started as a small side project — just a cheerful, nostalgic mini-game.&lt;br&gt;
That’s how 🎲 Game 21 — Cheburashka &amp;amp; Gena was born — a cartoon-style dice game where you play against the famous Russian duo Cheburashka and Gena the Crocodile.&lt;/p&gt;

&lt;p&gt;You roll dice, collect points, and watch cartoon faces react to your luck — all made entirely in pure Python.&lt;/p&gt;

&lt;p&gt;🧩 Gameplay&lt;/p&gt;

&lt;p&gt;Roll dice to get as close to 21 points as possible —&lt;br&gt;
but if you go over, you lose!&lt;/p&gt;

&lt;p&gt;Decide whether to roll again or stop, then watch your AI opponents — Cheburashka and Gena — take their turns automatically.&lt;br&gt;
The one closest to 21 wins.&lt;/p&gt;

&lt;p&gt;🖼️ Features&lt;/p&gt;

&lt;p&gt;🎮 Cartoon-styled interface&lt;br&gt;
🎵 Procedural sound &amp;amp; music&lt;br&gt;
🏆 Local leaderboard (SQLite)&lt;br&gt;
🌈 Dynamic color themes&lt;br&gt;
🗣️ English &amp;amp; Russian languages&lt;/p&gt;

&lt;p&gt;Run it instantly:&lt;/p&gt;

&lt;p&gt;python game21.py&lt;/p&gt;

&lt;p&gt;GitHub → github.com/renocmon-cloud/Game21_v8_1&lt;/p&gt;

&lt;p&gt;Website → belcantorest.me&lt;/p&gt;

&lt;p&gt;🎨 Design &amp;amp; UI&lt;/p&gt;

&lt;p&gt;A custom CartoonButton class makes Tkinter look alive — rounded corners, shadows, gradient fills, and small “bounce” animations.&lt;br&gt;
No images — everything is generated procedurally with Pillow.&lt;/p&gt;

&lt;p&gt;Each theme (Sunny ☀️, Ocean 🌊, Mint 🌿) has its own color palette, or you can let it switch automatically for variety.&lt;/p&gt;

&lt;p&gt;🎵 Sound &amp;amp; Music&lt;/p&gt;

&lt;p&gt;No sound files — just math.&lt;br&gt;
Python generates short WAVs for dice rolls and melodies using wave, math, and struct.&lt;br&gt;
It’s a tiny, built-in synthesizer 🎹&lt;/p&gt;

&lt;p&gt;🧠 Lessons Learned&lt;/p&gt;

&lt;p&gt;Tkinter can look modern with creativity&lt;/p&gt;

&lt;p&gt;Procedural art and sound are pure joy&lt;/p&gt;

&lt;p&gt;SQLite is perfect for small games&lt;/p&gt;

&lt;p&gt;Simplicity can be surprisingly powerful&lt;/p&gt;

&lt;p&gt;💬 Conclusion&lt;/p&gt;

&lt;p&gt;Game 21 — Cheburashka &amp;amp; Gena is a love letter to simplicity and charm.&lt;br&gt;
No frameworks, no assets — just Python, imagination, and a bit of nostalgia.&lt;/p&gt;

</description>
      <category>python</category>
      <category>tkinter</category>
      <category>gamedev</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Free Professional Invoice Generator</title>
      <dc:creator>DevForge</dc:creator>
      <pubDate>Sun, 28 Sep 2025 22:41:47 +0000</pubDate>
      <link>https://forem.com/devforge/free-professional-invoice-generator-429j</link>
      <guid>https://forem.com/devforge/free-professional-invoice-generator-429j</guid>
      <description>&lt;p&gt;Managing invoices can often feel overwhelming — especially for freelancers, startups, and small businesses.&lt;br&gt;
That’s why I created the &lt;strong&gt;Professional Invoice Generator&lt;/strong&gt; — a free, browser-based tool that helps you design, preview, and export &lt;strong&gt;professional invoices&lt;/strong&gt; in minutes.&lt;/p&gt;

&lt;p&gt;This project is &lt;strong&gt;open-source&lt;/strong&gt;, works entirely in your browser, and requires &lt;strong&gt;no installation&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;🔗 &lt;strong&gt;Live Demo:&lt;/strong&gt; &lt;a href="https://www.belcantorest.me/" rel="noopener noreferrer"&gt;belcantorest.me&lt;/a&gt;&lt;br&gt;
📦 &lt;strong&gt;Source Code:&lt;/strong&gt; &lt;a href="https://github.com/renocmon-cloud/Invoice" rel="noopener noreferrer"&gt;GitHub Repository&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  ✨ Why Use This Tool?
&lt;/h2&gt;

&lt;p&gt;Unlike traditional invoicing software or expensive SaaS platforms, this generator is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🖥 100% &lt;strong&gt;browser-based&lt;/strong&gt; (no backend or database required)&lt;/li&gt;
&lt;li&gt;🌍 Supports &lt;strong&gt;US&lt;/strong&gt; and &lt;strong&gt;EU (VAT)&lt;/strong&gt; invoice styles&lt;/li&gt;
&lt;li&gt;🖼 Lets you &lt;strong&gt;upload your company logo&lt;/strong&gt; for branding&lt;/li&gt;
&lt;li&gt;📲 Generates &lt;strong&gt;QR codes&lt;/strong&gt; for instant payments&lt;/li&gt;
&lt;li&gt;💾 Allows you to &lt;strong&gt;save/load JSON data&lt;/strong&gt; for future use&lt;/li&gt;
&lt;li&gt;🖨 Exports directly to &lt;strong&gt;PDF&lt;/strong&gt; or &lt;strong&gt;Print&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ⚡ Key Features
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Seller &amp;amp; Buyer details&lt;/li&gt;
&lt;li&gt;Invoice number, issue date, and due date&lt;/li&gt;
&lt;li&gt;Multiple currencies: &lt;strong&gt;USD, EUR, GBP, INR, JPY, BTC&lt;/strong&gt;, and more&lt;/li&gt;
&lt;li&gt;Discounts and customizable tax rates&lt;/li&gt;
&lt;li&gt;EU extras: VAT IDs, IBAN/SWIFT support&lt;/li&gt;
&lt;li&gt;Smart item management (add, duplicate, remove, clear all)&lt;/li&gt;
&lt;li&gt;Bank and payment details with QR code generation&lt;/li&gt;
&lt;li&gt;Real-time invoice preview&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🚀 How It Works
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Open the &lt;a href="https://www.belcantorest.me/" rel="noopener noreferrer"&gt;demo&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Fill in your company &amp;amp; client details.&lt;/li&gt;
&lt;li&gt;Add items, taxes, and discounts.&lt;/li&gt;
&lt;li&gt;Customize payment details (bank, SWIFT, reference).&lt;/li&gt;
&lt;li&gt;Preview your invoice in real time.&lt;/li&gt;
&lt;li&gt;Export as &lt;strong&gt;PDF&lt;/strong&gt; or print directly.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  💡 Perfect For
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Freelancers who need quick, professional invoices&lt;/li&gt;
&lt;li&gt;Small businesses avoiding complex accounting tools&lt;/li&gt;
&lt;li&gt;Startups that want a free and customizable invoicing system&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  📜 License
&lt;/h2&gt;

&lt;p&gt;This project is released under the &lt;strong&gt;MIT License&lt;/strong&gt; — free to use, modify, and share.&lt;/p&gt;

&lt;p&gt;🔗 Try it now: &lt;a href="https://www.belcantorest.me/" rel="noopener noreferrer"&gt;belcantorest.me&lt;/a&gt;&lt;br&gt;
💻 Explore the code: &lt;a href="https://github.com/renocmon-cloud/Invoice" rel="noopener noreferrer"&gt;GitHub Repository&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;👉 If you find this tool useful, feel free to ⭐ the GitHub repo and share it with others!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>devops</category>
      <category>css</category>
    </item>
    <item>
      <title>Smart Expense Tracker Pro</title>
      <dc:creator>DevForge</dc:creator>
      <pubDate>Thu, 25 Sep 2025 13:24:30 +0000</pubDate>
      <link>https://forem.com/devforge/smart-expense-tracker-pro-50pf</link>
      <guid>https://forem.com/devforge/smart-expense-tracker-pro-50pf</guid>
      <description>&lt;p&gt;📋 &lt;strong&gt;Project Overview&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Introducing Smart Expense Tracker Pro — a next-generation personal finance solution that goes far beyond basic expense tracking.&lt;/p&gt;

&lt;p&gt;Built entirely with &lt;strong&gt;KendoReact&lt;/strong&gt;’s free component library, this application demonstrates just how quickly and effortlessly developers can create enterprise-grade, production-ready applications.&lt;/p&gt;

&lt;p&gt;With its modern design, advanced analytics, and intelligent budgeting features, Smart Expense Tracker Pro is a powerful showcase of what’s possible when innovation meets simplicity.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdr74u5ceoffy99pztb8e.png" 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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdr74u5ceoffy99pztb8e.png" alt=" " width="800" height="365"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🎯 &lt;strong&gt;Key Highlights&lt;/strong&gt;&lt;br&gt;
🔐 &lt;strong&gt;Multi-User Authentication&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Secure, seamless login &amp;amp; registration&lt;/p&gt;

&lt;p&gt;Personalized dashboards &amp;amp; settings&lt;/p&gt;

&lt;p&gt;Reliable data isolation for privacy&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdllumfbyr8nvrmewq74v.png" 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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdllumfbyr8nvrmewq74v.png" alt=" " width="800" height="337"&gt;&lt;/a&gt;&lt;br&gt;
💰 &lt;strong&gt;Smart Financial Management&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Visual Budget Tracking: Color-coded progress indicators&lt;/p&gt;

&lt;p&gt;Multi-Currency Support: Real-time currency conversions&lt;/p&gt;

&lt;p&gt;Expense Categorization: 10+ categories with icons&lt;/p&gt;

&lt;p&gt;Priority System: Critical, High, Medium, Low levels&lt;/p&gt;

&lt;p&gt;Recurring Transactions: Daily, weekly, monthly, yearly&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6voe8nb5t27v5p2baxtf.png" 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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6voe8nb5t27v5p2baxtf.png" alt=" " width="800" height="331"&gt;&lt;/a&gt;&lt;br&gt;
📊 &lt;strong&gt;Advanced Analytics&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Interactive charts &amp;amp; graphs&lt;/p&gt;

&lt;p&gt;Monthly trend insights&lt;/p&gt;

&lt;p&gt;Real-time calculations &amp;amp; instant updates&lt;/p&gt;

&lt;p&gt;Flexible custom date ranges&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1hgxu37k6z96vg1mn8jy.png" 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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1hgxu37k6z96vg1mn8jy.png" alt=" " width="800" height="309"&gt;&lt;/a&gt;&lt;br&gt;
📱 &lt;strong&gt;Modern User Experience&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Light &amp;amp; Dark themes&lt;/p&gt;

&lt;p&gt;Fully mobile-optimized&lt;/p&gt;

&lt;p&gt;Accessibility-first approach&lt;/p&gt;

&lt;p&gt;Smooth, elegant animations&lt;/p&gt;

&lt;p&gt;🛠️ &lt;strong&gt;Powered by KendoReact&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This application leverages 19+ &lt;strong&gt;KendoReact&lt;/strong&gt; components, proving their versatility and scalability.&lt;br&gt;
Every component is pushed to its maximum potential, making the app both powerful and easy to use.&lt;/p&gt;

&lt;p&gt;🌟 &lt;strong&gt;What Makes This App Stand Out&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;✅ Enterprise-Grade Architecture — scalable, maintainable, and extensible&lt;br&gt;
✅ Production-Ready Quality — error handling, validation, and loading states built-in&lt;br&gt;
✅ Real-World Utility — useful for individuals, small businesses, or as the foundation of a SaaS product&lt;br&gt;
✅ Modern React Practices — optimized performance, hooks, context, clean code&lt;/p&gt;

&lt;p&gt;📈 &lt;strong&gt;Business Value&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For Individuals: Simplifies personal budgeting &amp;amp; money management&lt;/p&gt;

&lt;p&gt;For Businesses: Streamlines expense reporting &amp;amp; accounting&lt;/p&gt;

&lt;p&gt;For Education: A practical tool for teaching financial literacy&lt;/p&gt;

&lt;p&gt;For SaaS Startups: A ready-made foundation for scalable financial apps&lt;/p&gt;

&lt;p&gt;🔮 &lt;strong&gt;The Road Ahead&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Planned enhancements include:&lt;/p&gt;

&lt;p&gt;AI-powered insights for smarter budgeting&lt;/p&gt;

&lt;p&gt;OCR receipt scanning for automatic expense entry&lt;/p&gt;

&lt;p&gt;Investment tracking &amp;amp; goal setting&lt;/p&gt;

&lt;p&gt;Collaborative budgeting for families &amp;amp; teams&lt;/p&gt;

&lt;p&gt;PWA &amp;amp; real-time sync for cross-device usage&lt;/p&gt;

&lt;p&gt;💡 &lt;strong&gt;Key Takeaways&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;KendoReact Mastery: Component composition, performance optimization, accessibility-first design&lt;/p&gt;

&lt;p&gt;React Excellence: Hooks, context API, clean architecture, maintainability&lt;/p&gt;

&lt;p&gt;Innovation in Action: A real, production-ready financial solution built entirely with free &lt;strong&gt;KendoReact&lt;/strong&gt; tools&lt;/p&gt;

&lt;p&gt;🏆 &lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Smart Expense Tracker Pro is more than just a project — it’s a living example of how KendoReact empowers developers to build apps that are:&lt;/p&gt;

&lt;p&gt;Sophisticated yet simple&lt;/p&gt;

&lt;p&gt;Feature-rich yet lightweight&lt;/p&gt;

&lt;p&gt;Professional yet accessible&lt;/p&gt;

&lt;p&gt;👉 This project doesn’t just show what can be done — it proves that KendoReact enables anyone to build software that rivals commercial products in quality, performance, and design.&lt;/p&gt;

&lt;p&gt;🔗 Live Demo: &lt;a href="https://expense-tracker-beta-ashy.vercel.app/" rel="noopener noreferrer"&gt;https://expense-tracker-beta-ashy.vercel.app/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;💻 Source Code: &lt;a href="https://github.com/renocmon-cloud/expense-tracker" rel="noopener noreferrer"&gt;https://github.com/renocmon-cloud/expense-tracker&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🎥 Demo Video: &lt;a href="https://www.youtube.com/watch?v=R0TF-9V4Tag" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=R0TF-9V4Tag&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>kendoreactchallenge</category>
      <category>react</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
