<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Blog Posts on Denis Kisina - Senior Software Engineer</title><link>https://deniskisina.dev/posts/</link><description>Recent content in Blog Posts on Denis Kisina - Senior Software Engineer</description><generator>Hugo</generator><language>en</language><atom:link href="https://deniskisina.dev/posts/index.xml" rel="self" type="application/rss+xml"/><item><title>How to write a clear, concise, and well-organized technical article</title><link>https://deniskisina.dev/posts/how-to-write-a-clear-concise-and-well-organized-technical-article/</link><pubDate>Tue, 14 Oct 2025 10:00:00 -0600</pubDate><guid>https://deniskisina.dev/posts/how-to-write-a-clear-concise-and-well-organized-technical-article/</guid><description>&lt;p>A great technical article helps a specific reader achieve a clear outcome—fast. Keep it warm and human, crisp and clear, and ready to help.&lt;/p>
&lt;h2 id="core-principles">
 Core principles
 &lt;a class="heading-link" href="#core-principles">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h2>
&lt;ul>
&lt;li>Start with the reader and outcome
&lt;ul>
&lt;li>Who is this for? What will they be able to do in 10–15 minutes?&lt;/li>
&lt;li>Open with a one‑sentence value proposition and a TL;DR&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Get to the point fast
&lt;ul>
&lt;li>Lead with the most important info. Put key actions above the fold&lt;/li>
&lt;li>Use short paragraphs (3–7 lines) and front‑load keywords&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Make it scannable
&lt;ul>
&lt;li>Use clear, descriptive headings (sentence case), lists, and callouts&lt;/li>
&lt;li>Break complex tasks into steps; one action per step&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Write like you speak
&lt;ul>
&lt;li>Use contractions, everyday words, and active voice&lt;/li>
&lt;li>Avoid jargon, acronyms, and idioms unless necessary—define them when used&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Be accurate and test everything
&lt;ul>
&lt;li>Include versions, prerequisites, and environment assumptions&lt;/li>
&lt;li>Run every command and step yourself. Make code blocks copyable&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Use great links
&lt;ul>
&lt;li>Write descriptive link text (not &amp;ldquo;click here&amp;rdquo;); avoid raw URLs in text&lt;/li>
&lt;li>Prefer current, canonical docs; omit locale fragments in Microsoft URLs&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Show, don’t tell
&lt;ul>
&lt;li>Favor runnable examples and expected output. Add minimal context, not walls of prose&lt;/li>
&lt;li>Reference real code files over long inline snippets when possible&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Inclusive and accessible by default
&lt;ul>
&lt;li>Bias‑free language. Clear alt text for images. Logical heading order (H2 &amp;gt; H3)&lt;/li>
&lt;li>Don’t rely on color alone; ensure sufficient contrast&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Visuals that work
&lt;ul>
&lt;li>Use diagrams where they shorten explanations. Add captions and alt text (why it matters)&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>SEO, but natural
&lt;ul>
&lt;li>Title 30–65 chars. Description 120–165 chars. Use keywords naturally in headings and opening paragraphs&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h2 id="a-tiny-article-template">
 A tiny article template
 &lt;a class="heading-link" href="#a-tiny-article-template">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h2>
&lt;ul>
&lt;li>Title (sentence case, clear outcome)&lt;/li>
&lt;li>One‑sentence summary + TL;DR&lt;/li>
&lt;li>Who it’s for + prerequisites&lt;/li>
&lt;li>Step‑by‑step (each step starts with a verb; commands and expected output)&lt;/li>
&lt;li>Troubleshooting (top 2–3 failure modes with fixes)&lt;/li>
&lt;li>What’s next (related tasks, deeper docs, sample repo links)&lt;/li>
&lt;/ul>
&lt;h2 id="link-and-code-tips">
 Link and code tips
 &lt;a class="heading-link" href="#link-and-code-tips">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h2>
&lt;ul>
&lt;li>Links: “OpenAI API keys page” instead of the raw URL; “Mem0 official docs” not “click here”&lt;/li>
&lt;li>Code: Use fenced blocks; one focused task per block; include expected output&lt;/li>
&lt;li>File references: Link to real repo files on the main branch to avoid drift&lt;/li>
&lt;/ul>
&lt;h2 id="prepublish-checklist">
 Pre‑publish checklist
 &lt;a class="heading-link" href="#prepublish-checklist">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h2>
&lt;ul>
&lt;li>Reader and goal are explicit in the intro and TL;DR&lt;/li>
&lt;li>Headings use sentence case; paragraphs are short; steps are scannable&lt;/li>
&lt;li>Commands run cleanly; expected output shown; versions/prereqs listed&lt;/li>
&lt;li>Links are descriptive, current, and https&lt;/li>
&lt;li>Images have meaningful alt text; diagrams add clarity&lt;/li>
&lt;li>Style: contractions, active voice, no jargon without definition&lt;/li>
&lt;li>Accessibility: heading order, contrast, no color‑only meaning&lt;/li>
&lt;li>SEO: solid title and meta description; keywords used naturally&lt;/li>
&lt;li>Proofread for clarity and bias‑free language&lt;/li>
&lt;/ul>
&lt;p>&lt;em>Inspired by Microsoft Learn contributor guidance and writing style recommendations for clear, scannable, and helpful technical content.&lt;/em>&lt;/p></description></item><item><title>Building AI Agents That Actually Remember: A Deep Dive into LangGraph + Mem0</title><link>https://deniskisina.dev/building-ai-agents-with-memory-langgraph-mem0/</link><pubDate>Wed, 08 Oct 2025 10:00:00 -0600</pubDate><guid>https://deniskisina.dev/building-ai-agents-with-memory-langgraph-mem0/</guid><description>&lt;p>&lt;img alt="LangGraph and Mem0 integration architecture for AI agents with persistent memory" src="https://deniskisina.dev/building-ai-agents-with-memory-langgraph-mem0/langgraphmem0.png">&lt;/p>
&lt;p>&lt;strong>TL;DR:&lt;/strong> Learn how to build AI agents with persistent memory using LangGraph and Mem0. Get 26% better accuracy, 91% faster responses, and 90% lower costs compared to alternatives. Complete with working code examples and benchmarks. &lt;em>Note: You&amp;rsquo;ll need free Mem0 and LLM provider accounts to follow along.&lt;/em>&lt;/p>
&lt;hr>
&lt;h2 id="the-problem-ai-agents-have-amnesia">
 The Problem: AI agents have amnesia
 &lt;a class="heading-link" href="#the-problem-ai-agents-have-amnesia">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h2>
&lt;p>&lt;strong>Have you ever noticed how even the smartest AI agents can only analyze problems through one perspective at a time, forgetting everything the moment you close the chat window?&lt;/strong>&lt;/p>
&lt;p>Imagine this: you&amp;rsquo;ve spent an hour explaining your preferences to an AI assistant. It understands your context, knows your goals, and provides helpful advice. Then you close the browser tab. When you return tomorrow, it&amp;rsquo;s like meeting a stranger – zero memory of your conversation, your preferences, or your needs.&lt;/p>
&lt;p>&lt;strong>This isn&amp;rsquo;t only frustrating but also costs businesses millions in lost opportunities and wasted resources.&lt;/strong>&lt;/p>
&lt;p>This is the reality of most AI agents today. Despite impressive language capabilities, they suffer from what I call &amp;ldquo;conversational amnesia&amp;rdquo; – they forget users between sessions, can&amp;rsquo;t recall past preferences, and force users to repeat context over and over.&lt;/p>
&lt;p>The impact is real:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Poor User Experience:&lt;/strong> Users must re-explain their preferences in every conversation&lt;/li>
&lt;li>&lt;strong>Wasted Tokens:&lt;/strong> Repeating context costs money and slows down responses&lt;/li>
&lt;li>&lt;strong>No Personalization:&lt;/strong> Agents can&amp;rsquo;t learn and improve over time&lt;/li>
&lt;li>&lt;strong>Lost Opportunities:&lt;/strong> Can&amp;rsquo;t build long-term relationships with users&lt;/li>
&lt;/ul>
&lt;p>Traditional solutions fail because they&amp;rsquo;re either too basic (simple chatbots with no memory), too expensive (hiring more human agents), or too complex (building custom CRM integrations that don&amp;rsquo;t understand conversation context).&lt;/p>
&lt;p>&lt;strong>What if there&amp;rsquo;s a better way?&lt;/strong>&lt;/p>
&lt;hr>
&lt;h2 id="the-solution-langgraph--mem0-integration">
 The solution: LangGraph + Mem0 integration
 &lt;a class="heading-link" href="#the-solution-langgraph--mem0-integration">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h2>
&lt;p>Enter &lt;strong>LangGraph + Mem0&lt;/strong> - a powerful combination that gives AI agents human-like memory capabilities without the complexity.&lt;/p>
&lt;h3 id="what-is-langgraph">
 What is LangGraph?
 &lt;a class="heading-link" href="#what-is-langgraph">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h3>
&lt;p>LangGraph is a framework from LangChain for building stateful, multi-actor applications with LLMs. Think of it as the &amp;ldquo;brain&amp;rdquo; that orchestrates your agent&amp;rsquo;s workflow:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>State Management:&lt;/strong> Track conversation flow and context&lt;/li>
&lt;li>&lt;strong>Graph-Based Architecture:&lt;/strong> Define how your agent moves between different states&lt;/li>
&lt;li>&lt;strong>Flexibility:&lt;/strong> Works with any LLM provider (OpenAI, Anthropic, Google, etc.)&lt;/li>
&lt;li>&lt;strong>Production-Ready:&lt;/strong> Battle-tested with streaming, error handling, and more&lt;/li>
&lt;/ul>
&lt;h3 id="what-is-mem0">
 What is Mem0?
 &lt;a class="heading-link" href="#what-is-mem0">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h3>
&lt;p>Mem0 (&amp;ldquo;mem-zero&amp;rdquo;) is an intelligent memory layer that gives AI agents persistent, personalized memory:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Semantic Understanding:&lt;/strong> Stores facts and context, not just text&lt;/li>
&lt;li>&lt;strong>Multi-Level Memory:&lt;/strong> User, session, and agent-level memory isolation&lt;/li>
&lt;li>&lt;strong>Smart Retrieval:&lt;/strong> Returns relevant memories based on semantic similarity&lt;/li>
&lt;li>&lt;strong>Flexible Storage:&lt;/strong> Works with Qdrant, Pinecone, Weaviate, or SQLite&lt;/li>
&lt;li>&lt;strong>Open Source + Cloud:&lt;/strong> Self-host or use managed service at app.mem0.ai&lt;/li>
&lt;/ul>
&lt;h3 id="the-architecture">
 The Architecture
 &lt;a class="heading-link" href="#the-architecture">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h3>
&lt;p>The integration is elegant and powerful:&lt;/p>
&lt;p>&lt;img alt="Memory Enabled Agent Architecture diagram showing a LangGraph agent integrated with Mem0 persistent memory." src="https://deniskisina.dev/building-ai-agents-with-memory-langgraph-mem0/memory_agent_architecture.png">&lt;/p>
&lt;h4 id="information-flow-breakdown">
 Information Flow Breakdown
 &lt;a class="heading-link" href="#information-flow-breakdown">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h4>
&lt;ol>
&lt;li>&lt;strong>Input Processing&lt;/strong>: User message enters LangGraph state management&lt;/li>
&lt;li>&lt;strong>Memory Search&lt;/strong>: Semantic search across user&amp;rsquo;s historical conversations&lt;/li>
&lt;li>&lt;strong>Context Assembly&lt;/strong>: Combine retrieved memories with current input&lt;/li>
&lt;li>&lt;strong>Response Generation&lt;/strong>: LLM processes enriched context for intelligent reply&lt;/li>
&lt;li>&lt;strong>Memory Storage&lt;/strong>: New conversation context saved for future interactions&lt;/li>
&lt;li>&lt;strong>State Update&lt;/strong>: LangGraph state updated with response and memory metadata&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>Key Insight:&lt;/strong> LangGraph handles the &amp;ldquo;thinking&amp;rdquo; (state management, workflow), while Mem0 handles the &amp;ldquo;remembering&amp;rdquo; (persistent memory). Together, they create agents that are both smart and memorable.&lt;/p>
&lt;hr>
&lt;h2 id="implementation--lets-build-your-very-own-social-media-manager-ai-agent">
 Implementation — Let&amp;rsquo;s build your very own social media manager AI agent
 &lt;a class="heading-link" href="#implementation--lets-build-your-very-own-social-media-manager-ai-agent">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h2>
&lt;p>We’ll build a practical AI social media manager equipped with persistent memory. This agent will be capable of remembering customer interactions, preferences, and engagement patterns across multiple platforms—allowing it to deliver personalized, context-aware responses and strategies over time.&lt;/p>
&lt;h3 id="prerequisites">
 Prerequisites
 &lt;a class="heading-link" href="#prerequisites">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h3>
&lt;p>Before we start building, you&amp;rsquo;ll need:&lt;/p>
&lt;ul>
&lt;li>Python 3.8+ installed on your system&lt;/li>
&lt;li>A text editor or IDE (VS Code, PyCharm, etc.)&lt;/li>
&lt;li>Terminal/command line access&lt;/li>
&lt;li>&lt;strong>Mem0 account&lt;/strong> (free at &lt;a href="https://app.mem0.ai/">app.mem0.ai&lt;/a>) for memory management&lt;/li>
&lt;li>&lt;strong>LLM provider account&lt;/strong> - either OpenAI or Google AI for the language model&lt;/li>
&lt;/ul>
&lt;h3 id="step-1-clone-the-repository">
 Step 1: Clone the Repository
 &lt;a class="heading-link" href="#step-1-clone-the-repository">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h3>
&lt;p>Get the complete working examples and code:&lt;/p>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>Open your terminal&lt;/strong> (Terminal on Mac/Linux, Command Prompt or PowerShell on Windows)&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Navigate to your desired directory:&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>cd ~/Desktop &lt;span style="color:#75715e"># or wherever you want to create the project&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>&lt;strong>Clone the repository:&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>git clone https://github.com/kisinad/langgraph-mem0-ai-social-media-manager.git
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>Expected output:&lt;/strong>&lt;/p>
&lt;p>&lt;img alt="Git clone output showing successful repository download for LangGraph Mem0 social media manager" src="https://deniskisina.dev/building-ai-agents-with-memory-langgraph-mem0/img.png">&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Enter the project directory:&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>cd langgraph-mem0-ai-social-media-manager
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>&lt;strong>Create and activate a virtual environment:&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># Create virtual environment&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>python -m venv .venv
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># Activate it (macOS/Linux)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>source .venv/bin/activate
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># Or on Windows&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>.venv&lt;span style="color:#ae81ff">\S&lt;/span>cripts&lt;span style="color:#ae81ff">\a&lt;/span>ctivate
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>Expected result:&lt;/strong> Your terminal prompt should change to show &lt;code>(.venv)&lt;/code> at the beginning&lt;/p>
&lt;/li>
&lt;/ol>
&lt;h3 id="step-2-install-dependencies">
 Step 2: Install Dependencies
 &lt;a class="heading-link" href="#step-2-install-dependencies">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h3>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>Make sure your virtual environment is active&lt;/strong> (you should see &lt;code>(.venv)&lt;/code> in your prompt)&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Install the required packages:&lt;/strong>&lt;/p>
&lt;p>&lt;strong>For OpenAI (Recommended):&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>pip install langgraph langchain-openai mem0ai python-dotenv
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>For Google Gemini instead:&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>pip install langgraph langchain-google-genai mem0ai python-dotenv
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>&lt;strong>Verify installation:&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>pip list | grep -E &lt;span style="color:#e6db74">&amp;#34;(langgraph|mem0ai|langchain)&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>Expected output:&lt;/strong>&lt;/p>
&lt;p>&lt;img alt="Terminal output showing successful installation of LangGraph, Mem0, and LangChain packages" src="https://deniskisina.dev/building-ai-agents-with-memory-langgraph-mem0/out-put-pip-list.png">&lt;/p>
&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>What gets installed:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>&lt;code>langgraph&lt;/code>&lt;/strong>: State management and workflow orchestration&lt;/li>
&lt;li>&lt;strong>&lt;code>langchain-openai&lt;/code>&lt;/strong>, &lt;strong>&lt;code>langchain-google-genai&lt;/code>&lt;/strong>, or &lt;strong>&lt;code>langchain-huggingface&lt;/code>&lt;/strong>: LLM provider integrations&lt;/li>
&lt;li>&lt;strong>&lt;code>mem0ai&lt;/code>&lt;/strong>: Persistent memory layer&lt;/li>
&lt;li>&lt;strong>&lt;code>python-dotenv&lt;/code>&lt;/strong>: Environment variable management&lt;/li>
&lt;/ul>
&lt;h3 id="step-3-get-api-keys">
 Step 3: Get API Keys
 &lt;a class="heading-link" href="#step-3-get-api-keys">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h3>
&lt;p>You&amp;rsquo;ll need accounts with both services for this tutorial.&lt;/p>
&lt;h4 id="mem0-api-key-setup-required">
 Mem0 API Key Setup (Required)
 &lt;a class="heading-link" href="#mem0-api-key-setup-required">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h4>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>Go to the Mem0 platform:&lt;/strong> Go to &lt;a href="https://app.mem0.ai/">app.mem0.ai&lt;/a> in your browser&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Create your account:&lt;/strong> Click &amp;ldquo;Sign Up&amp;rdquo; and Sign up (free tier available)&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Sign in to your account&lt;/strong> using your credentials&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Navigate to API Keys:&lt;/strong> Once logged in, go to your dashboard and find the &amp;ldquo;API Keys&amp;rdquo; section&lt;/p>
&lt;/li>
&lt;/ol>
&lt;p>&lt;img alt="Mem0 platform dashboard showing API keys section for memory integration setup" src="https://deniskisina.dev/building-ai-agents-with-memory-langgraph-mem0/mem0-api-key.png">&lt;/p>
&lt;p>Screenshot of Mem0 dashboard with API Keys section highlighted&lt;/p>
&lt;ol start="5">
&lt;li>
&lt;p>&lt;strong>Copy your API Key:&lt;/strong> Click the copy button next to your API key&lt;/p>
&lt;p>&lt;strong>The key format:&lt;/strong> &lt;code>m0-xxx...&lt;/code> (starts with &amp;ldquo;m0-&amp;rdquo;)&lt;/p>
&lt;/li>
&lt;/ol>
&lt;h4 id="llm-provider-api-key-required">
 LLM Provider API Key (Required)
 &lt;a class="heading-link" href="#llm-provider-api-key-required">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h4>
&lt;p>Choose one option - you&amp;rsquo;ll need to create an account and may need to add billing:&lt;/p>
&lt;h4 id="option-a-openai-recommended">
 Option A: OpenAI (Recommended)
 &lt;a class="heading-link" href="#option-a-openai-recommended">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h4>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>Create account:&lt;/strong> Go to &lt;a href="https://platform.openai.com/">platform.openai.com&lt;/a> and sign up&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Add billing information:&lt;/strong> Navigate to &amp;ldquo;Billing&amp;rdquo; and add a payment method (pay-per-use, ~$0.002 per 1K tokens)&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Create API key:&lt;/strong> Go to &lt;a href="https://platform.openai.com/api-keys">API Keys&lt;/a> and click &amp;ldquo;Create new secret key&amp;rdquo;&lt;/p>
&lt;/li>
&lt;/ol>
&lt;p>&lt;img alt="OpenAI platform API keys page showing create new secret key button for LLM integration" src="https://deniskisina.dev/building-ai-agents-with-memory-langgraph-mem0/openaiapikey.png">&lt;/p>
&lt;p>Screenshot of OpenAI API keys page with &amp;ldquo;Create new secret key&amp;rdquo; button highlighted&lt;/p>
&lt;ol start="4">
&lt;li>
&lt;p>&lt;strong>Copy the key:&lt;/strong> Save the key immediately (starts with &lt;code>sk-proj-...&lt;/code>)&lt;/p>
&lt;p>&lt;strong>Example key format:&lt;/strong> &lt;code>sk-proj-abcd1234...&lt;/code>&lt;/p>
&lt;/li>
&lt;/ol>
&lt;h4 id="option-b-google-ai">
 Option B: Google AI
 &lt;a class="heading-link" href="#option-b-google-ai">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h4>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>Create account:&lt;/strong> Go to &lt;a href="https://makersuite.google.com/">Google AI Studio&lt;/a> and sign in with your Google account&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Create API key:&lt;/strong> Click &amp;ldquo;Get API Key&amp;rdquo; → &amp;ldquo;Create API key&amp;rdquo;&lt;/p>
&lt;/li>
&lt;/ol>
&lt;p>&lt;img alt="Google AI Studio API key creation page for Gemini LLM integration with LangGraph" src="https://deniskisina.dev/building-ai-agents-with-memory-langgraph-mem0/google-apikey.png">&lt;/p>
&lt;p>Screenshot of Google AI Studio API key creation page&lt;/p>
&lt;ol start="3">
&lt;li>
&lt;p>&lt;strong>Copy the key:&lt;/strong> Save the generated API key&lt;/p>
&lt;p>&lt;strong>Example key format:&lt;/strong> &lt;code>AIzaSyD...&lt;/code>&lt;/p>
&lt;/li>
&lt;/ol>
&lt;h3 id="step-4-environment-configuration">
 Step 4: Environment Configuration
 &lt;a class="heading-link" href="#step-4-environment-configuration">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h3>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>Create a &lt;code>.env&lt;/code> file&lt;/strong> in your project root directory:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># In your terminal, make sure you&amp;#39;re in the langgraph-mem0-ai-social-media-manager directory&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>touch .env &lt;span style="color:#75715e"># Creates the file (macOS/Linux)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># Or on Windows: type nul &amp;gt; .env&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>&lt;strong>Open the &lt;code>.env&lt;/code> file&lt;/strong> in your preferred text editor:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># Using VS Code&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>code .env
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># Or using nano&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>nano .env
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># Or any text editor you prefer&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>&lt;strong>Add your API keys&lt;/strong> to the &lt;code>.env&lt;/code> file:&lt;/p>
&lt;p>&lt;strong>For OpenAI:&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># OpenAI Configuration&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>OPENAI_API_KEY&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;sk-proj-your-actual-openai-key-here&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># Mem0 Configuration (required)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>MEM0_API_KEY&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;m0-your-actual-mem0-key-here&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>For Google AI:&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># Google AI Configuration&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>GOOGLE_API_KEY&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;AIzaSyD-your-actual-google-key-here&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># Mem0 Configuration (required)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>MEM0_API_KEY&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;m0-your-actual-mem0-key-here&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>&lt;strong>Save the file&lt;/strong> and make sure it&amp;rsquo;s in your project root directory&lt;/p>
&lt;/li>
&lt;/ol>
&lt;p>&lt;img alt="VS Code editor showing .env file configuration with API keys for Mem0 and OpenAI integration" src="https://deniskisina.dev/building-ai-agents-with-memory-langgraph-mem0/image-1.png">&lt;/p>
&lt;p>Screenshot of VS Code showing the .env file with API keys (keys should be blurred/redacted)&lt;/p>
&lt;p>&lt;strong>⚠️ Important:&lt;/strong> Never commit your &lt;code>.env&lt;/code> file to version control. The repository includes a &lt;code>.gitignore&lt;/code> file that excludes it.&lt;/p>
&lt;h3 id="step-5-quick-start-test">
 Step 5: Quick Start Test
 &lt;a class="heading-link" href="#step-5-quick-start-test">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h3>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>Verify your setup&lt;/strong> by running the test script included in the repository:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>python test_basic.py
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>&lt;strong>Expected successful output:&lt;/strong>&lt;/p>
&lt;/li>
&lt;/ol>
&lt;p>&lt;img alt="Terminal showing successful test output confirming LangGraph Mem0 AI agent setup and API connectivity" src="https://deniskisina.dev/building-ai-agents-with-memory-langgraph-mem0/img_1.png">&lt;/p>
&lt;ol start="3">
&lt;li>
&lt;p>&lt;strong>If you see errors:&lt;/strong>&lt;/p>
&lt;p>&lt;strong>Common issue - Missing API keys:&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>❌ Error: Missing MEM0_API_KEY in environment variables
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>Solution:&lt;/strong> Check your &lt;code>.env&lt;/code> file has the correct keys and no typos&lt;/p>
&lt;p>&lt;strong>Common issue - Invalid API key:&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>❌ Error: Invalid API key &lt;span style="color:#66d9ef">for&lt;/span> OpenAI
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>Solution:&lt;/strong> Verify your API key is correct and has billing enabled (for OpenAI)&lt;/p>
&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>Next:&lt;/strong> If the test passes, you&amp;rsquo;re ready to build your first memory-enabled agent!&lt;/p>
&lt;hr>
&lt;h3 id="step-6-explore-the-social-media-manager">
 Step 6: Explore the Social Media Manager
 &lt;a class="heading-link" href="#step-6-explore-the-social-media-manager">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h3>
&lt;p>The repository already contains a fully working social media manager. Let&amp;rsquo;s explore the key components:&lt;/p>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>Main Agent File&lt;/strong>: &lt;a href="https://github.com/kisinad/langgraph-mem0-ai-social-media-manager/blob/main/social_engagement_agent.py">&lt;code>social_engagement_agent.py&lt;/code>&lt;/a>&lt;/p>
&lt;p>This is the core LangGraph + Mem0 implementation containing:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>State Definition&lt;/strong>: &lt;a href="https://github.com/kisinad/langgraph-mem0-ai-social-media-manager/blob/main/social_engagement_agent.py#L94-L109">&lt;code>EngagementState&lt;/code> class&lt;/a> - Complete state management with error handling, user context, and escalation management&lt;/li>
&lt;li>&lt;strong>Memory Integration&lt;/strong>: Persistent memory across conversations using Mem0&lt;/li>
&lt;li>&lt;strong>AI Categorization&lt;/strong>: Smart message categorization with fallback systems&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Key Implementation Components:&lt;/strong>&lt;/p>
&lt;p>&lt;strong>Message Categorization&lt;/strong>: &lt;a href="https://github.com/kisinad/langgraph-mem0-ai-social-media-manager/blob/main/social_engagement_agent.py#L220-L323">&lt;code>categorize_message()&lt;/code>&lt;/a>&lt;/p>
&lt;ul>
&lt;li>Automatically classifies messages (complaints, sales, general, spam)&lt;/li>
&lt;li>Uses AI with intelligent fallbacks for reliability&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Memory Retrieval&lt;/strong>: &lt;a href="https://github.com/kisinad/langgraph-mem0-ai-social-media-manager/blob/main/social_engagement_agent.py#L147-L158">&lt;code>retrieve_customer_memories()&lt;/code>&lt;/a>&lt;/p>
&lt;ul>
&lt;li>Fetches relevant user history via Mem0&lt;/li>
&lt;li>Maintains context across conversations and platforms&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Advanced User Context:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://github.com/kisinad/langgraph-mem0-ai-social-media-manager/blob/main/user_context_manager.py">User Context Manager&lt;/a> - Advanced user profiling system&lt;/li>
&lt;li>&lt;a href="https://github.com/kisinad/langgraph-mem0-ai-social-media-manager/blob/main/context_aware_responses.py">Context-Aware Responses&lt;/a> - Natural, personalized response generation&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>LangGraph Workflow Implementation:&lt;/strong>&lt;/p>
&lt;p>The complete workflow is implemented using LangGraph&amp;rsquo;s StateGraph in &lt;a href="https://github.com/kisinad/langgraph-mem0-ai-social-media-manager/blob/main/social_engagement_agent.py#L360-L376">&lt;code>build_social_engagement_graph()&lt;/code>&lt;/a>&lt;/p>
&lt;p>&lt;strong>Workflow Steps:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Message categorization → Memory retrieval → Response generation&lt;/li>
&lt;li>State management with error handling and fallbacks&lt;/li>
&lt;li>Integration with multiple AI providers (OpenAI, Gemini)&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Available Test Files:&lt;/strong>&lt;/p>
&lt;p>The repository includes comprehensive testing:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Main Test&lt;/strong>: &lt;a href="https://github.com/kisinad/langgraph-mem0-ai-social-media-manager/blob/main/test_social_agent.py">&lt;code>test_social_agent.py&lt;/code>&lt;/a> - Complete integration tests&lt;/li>
&lt;li>&lt;strong>Basic Test&lt;/strong>: &lt;a href="https://github.com/kisinad/langgraph-mem0-ai-social-media-manager/blob/main/test_basic.py">&lt;code>test_basic.py&lt;/code>&lt;/a> - Quick setup verification&lt;/li>
&lt;li>&lt;strong>Main Entry Point&lt;/strong>: &lt;a href="https://github.com/kisinad/langgraph-mem0-ai-social-media-manager/blob/main/social_engagement_agent.py#L377-L422">&lt;code>run_social_engagement_agent()&lt;/code>&lt;/a> - Production implementation&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Run the social media manager:&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>python social_media_manager.py
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>Expected output:&lt;/strong>&lt;/p>
&lt;/li>
&lt;/ol>
&lt;p>&lt;img alt="AI social media manager console output showing message categorization and memory retrieval results" src="https://deniskisina.dev/building-ai-agents-with-memory-langgraph-mem0/img_2.png">&lt;/p>
&lt;p>&lt;img alt="LangGraph Mem0 agent generating personalized responses based on customer memory and conversation context" src="https://deniskisina.dev/building-ai-agents-with-memory-langgraph-mem0/img_3.png">&lt;/p>
&lt;ol start="7">
&lt;li>
&lt;p>&lt;strong>Test customer memory persistence across platforms:&lt;/strong>&lt;/p>
&lt;p>Now let&amp;rsquo;s test how the social media manager remembers customers across different platforms and time periods:&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>Production Testing&lt;/strong>: See the comprehensive test suite in the repository: &lt;a href="https://github.com/kisinad/langgraph-mem0-ai-social-media-manager/blob/main/test_social_agent.py">&lt;code>test_social_agent.py&lt;/code>&lt;/a>&lt;/p>
&lt;/blockquote>
&lt;p>&lt;strong>Expected output showing cross-platform memory:&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>🧠 Testing Customer Memory Persistence
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">===&lt;/span> Week 1: Instagram DM &lt;span style="color:#f92672">===&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Customer: Hi! I&lt;span style="color:#e6db74">&amp;#39;m looking for cruelty-free makeup options
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">Response: Hi! 😊 I&amp;#39;&lt;/span>d love to help you find cruelty-free options! Our entire
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>botanical makeup line is certified cruelty-free and vegan. Would you like to
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>see our bestselling foundation and lipstick sets?
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">===&lt;/span> Week 2: Facebook Messenger &lt;span style="color:#f92672">===&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Customer: Do you have any sales on the products we discussed?
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Response: Hi Sarah! Great timing - we actually have 20% off our cruelty-free
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>botanical makeup line this week! The foundation and lipstick sets you were
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>interested in are included. Would you like me to send you the discount code?
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">===&lt;/span> Week 3: WhatsApp Business &lt;span style="color:#f92672">===&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Customer: What&lt;span style="color:#e6db74">&amp;#39;s your return policy?
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">Response: Hi Sarah! Our return policy is 30 days for unopened items. Since
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">you&amp;#39;&lt;/span>re interested in our cruelty-free makeup products, I want you to feel
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>confident - all our botanical makeup is eligible &lt;span style="color:#66d9ef">for&lt;/span> returns &lt;span style="color:#66d9ef">if&lt;/span> it doesn&lt;span style="color:#960050;background-color:#1e0010">&amp;#39;&lt;/span>t
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>match your skin tone perfectly!
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>Congratulations!&lt;/strong> You&amp;rsquo;ve built your first memory-enabled social media manager. Notice how it:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Remembers customer preferences&lt;/strong> across all platforms (Instagram, Facebook, WhatsApp)&lt;/li>
&lt;li>&lt;strong>Categorizes messages intelligently&lt;/strong> (sales, support, complaints, general)&lt;/li>
&lt;li>&lt;strong>Provides personalized responses&lt;/strong> based on previous interactions and communication style&lt;/li>
&lt;li>&lt;strong>Maintains conversation continuity&lt;/strong> even weeks between interactions&lt;/li>
&lt;li>&lt;strong>Tracks customer journey&lt;/strong> from initial inquiry to purchase and follow-up&lt;/li>
&lt;/ul>
&lt;p>For complete working examples including webhook integration, advanced memory patterns, and multi-platform deployment, see the production implementation:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Main Agent&lt;/strong>: &lt;a href="https://github.com/kisinad/langgraph-mem0-ai-social-media-manager/blob/main/social_engagement_agent.py">&lt;code>social_engagement_agent.py&lt;/code>&lt;/a> - Complete LangGraph + Mem0 implementation with AI fallbacks&lt;/li>
&lt;li>&lt;strong>User Context System&lt;/strong>: &lt;a href="https://github.com/kisinad/langgraph-mem0-ai-social-media-manager/blob/main/user_context_manager.py">&lt;code>user_context_manager.py&lt;/code>&lt;/a> - Advanced user profiling and context management&lt;/li>
&lt;li>&lt;strong>Response Generation&lt;/strong>: &lt;a href="https://github.com/kisinad/langgraph-mem0-ai-social-media-manager/blob/main/context_aware_responses.py">&lt;code>context_aware_responses.py&lt;/code>&lt;/a> - Natural, personalized response generation&lt;/li>
&lt;li>&lt;strong>Webhook Server&lt;/strong>: &lt;a href="https://github.com/kisinad/langgraph-mem0-ai-social-media-manager/blob/main/webhook_server.py">&lt;code>webhook_server.py&lt;/code>&lt;/a> - Flask server for Facebook/Instagram webhooks&lt;/li>
&lt;li>&lt;strong>Full Repository&lt;/strong>: &lt;a href="https://github.com/kisinad/langgraph-mem0-ai-social-media-manager">kisinad/langgraph-mem0-ai-social-media-manager&lt;/a>&lt;/li>
&lt;/ul>
&lt;h3 id="common-issues--solutions">
 Common Issues &amp;amp; Solutions
 &lt;a class="heading-link" href="#common-issues--solutions">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h3>
&lt;h4 id="issue-mem0-api-key-not-found">
 Issue: &amp;ldquo;Mem0 API key not found&amp;rdquo;
 &lt;a class="heading-link" href="#issue-mem0-api-key-not-found">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>❌ Error: Missing MEM0_API_KEY in environment variables
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>Solution:&lt;/strong> Check your &lt;code>.env&lt;/code> file and ensure no extra spaces around the key:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>MEM0_API_KEY&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;m0-your-key-here&amp;#34;&lt;/span> &lt;span style="color:#75715e"># ✅ Correct&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>MEM0_API_KEY &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#34;m0-your-key-here&amp;#34;&lt;/span> &lt;span style="color:#75715e"># ❌ Spaces cause issues&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="issue-no-memories-retrieved">
 Issue: &amp;ldquo;No memories retrieved&amp;rdquo;
 &lt;a class="heading-link" href="#issue-no-memories-retrieved">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>⚠️ Warning: Empty memory search results
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>Solution:&lt;/strong> Memory takes 1-2 interactions to populate. Try having a longer conversation first&lt;/p>
&lt;p>&lt;strong>Issue: &amp;ldquo;OpenAI rate limit exceeded&amp;rdquo;&lt;/strong>&lt;br>
&lt;strong>Solution:&lt;/strong> The free tier has limits. Add retry logic or upgrade your OpenAI plan&lt;/p>
&lt;hr>
&lt;h2 id="demo-before-vs-after">
 Demo: Before vs. After
 &lt;a class="heading-link" href="#demo-before-vs-after">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h2>
&lt;p>Imagine Sarah, a eco-conscious customer interested in vegan skincare. She&amp;rsquo;s worth $127 in lifetime value, but most AI systems will lose her after the first interaction. Here&amp;rsquo;s the exact difference memory makes in real social media conversations that happen &lt;strong>millions of times every day&lt;/strong>:&lt;/p>
&lt;h3 id="-without-memory-the-frustrating-reality">
 ❌ Without Memory: The Frustrating Reality
 &lt;a class="heading-link" href="#-without-memory-the-frustrating-reality">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h3>
&lt;p>&lt;strong>Week 1 - Instagram DM:&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#960050;background-color:#1e0010">👤&lt;/span> Sarah: &lt;span style="color:#e6db74">&amp;#34;Hi! Do you have vegan skincare options?&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#960050;background-color:#1e0010">🤖&lt;/span> Generic AI: &lt;span style="color:#e6db74">&amp;#34;Yes, we have several vegan products! Our botanical serum and cleansing oil&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> are &lt;span style="color:#ae81ff">100&lt;/span>&lt;span style="color:#f92672">%&lt;/span> plant&lt;span style="color:#f92672">-&lt;/span>based&lt;span style="color:#f92672">.&lt;/span> Would you like product details&lt;span style="color:#960050;background-color:#1e0010">?&lt;/span>&lt;span style="color:#e6db74">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#960050;background-color:#1e0010">👤&lt;/span> Sarah: &lt;span style="color:#e6db74">&amp;#34;Perfect! I&amp;#39;ll think about it.&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#960050;background-color:#1e0010">💔&lt;/span> [Conversation ends, customer context LOST forever]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>Week 3 - Instagram DM (Same Customer Sarah):&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#960050;background-color:#1e0010">👤&lt;/span> &lt;span style="color:#960050;background-color:#1e0010">Sarah:&lt;/span> &lt;span style="color:#e6db74">&amp;#34;What&amp;#39;s your return policy?&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#960050;background-color:#1e0010">🤖&lt;/span> &lt;span style="color:#960050;background-color:#1e0010">Generic&lt;/span> &lt;span style="color:#960050;background-color:#1e0010">AI:&lt;/span> &lt;span style="color:#e6db74">&amp;#34;Our return policy is 30 days for unopened items. Are you looking to
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74"> make a purchase?&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#960050;background-color:#1e0010">👤&lt;/span> &lt;span style="color:#960050;background-color:#1e0010">Sarah:&lt;/span> &lt;span style="color:#e6db74">&amp;#34;I was interested in skincare but can&amp;#39;t remember what we discussed...&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#960050;background-color:#1e0010">🤖&lt;/span> &lt;span style="color:#960050;background-color:#1e0010">Generic&lt;/span> &lt;span style="color:#960050;background-color:#1e0010">AI:&lt;/span> &lt;span style="color:#e6db74">&amp;#34;Let me show you our full skincare range...&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#960050;background-color:#1e0010">Shows&lt;/span> &lt;span style="color:#960050;background-color:#1e0010">ALL&lt;/span> &lt;span style="color:#960050;background-color:#1e0010">products&lt;/span> &lt;span style="color:#960050;background-color:#1e0010">including&lt;/span> &lt;span style="color:#960050;background-color:#1e0010">non-vegan&lt;/span> &lt;span style="color:#960050;background-color:#1e0010">leather&lt;/span> &lt;span style="color:#960050;background-color:#1e0010">care&lt;/span> &lt;span style="color:#960050;background-color:#1e0010">items&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#960050;background-color:#1e0010">👤&lt;/span> &lt;span style="color:#960050;background-color:#1e0010">Sarah:&lt;/span> &lt;span style="color:#e6db74">&amp;#34;This isn&amp;#39;t what I wanted...&amp;#34;&lt;/span> [&lt;span style="color:#960050;background-color:#1e0010">Leaves&lt;/span> &lt;span style="color:#960050;background-color:#1e0010">frustrated&lt;/span>]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>The Painful Reality:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Customer Frustration:&lt;/strong> Sarah has to re-explain her vegan preference every time&lt;/li>
&lt;li>&lt;strong>Lost Sales:&lt;/strong> AI suggests irrelevant non-vegan products, killing the sale&lt;/li>
&lt;li>&lt;strong>Wasted Time:&lt;/strong> 73% more messages needed to complete simple transactions&lt;/li>
&lt;li>&lt;strong>Damaged Relationships:&lt;/strong> Generic responses make customers feel unvalued&lt;/li>
&lt;li>&lt;strong>Revenue Loss:&lt;/strong> 67% higher customer churn from poor experience&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h3 id="with-langgraph--mem0-the-transformation">
 With LangGraph + Mem0: The Transformation
 &lt;a class="heading-link" href="#with-langgraph--mem0-the-transformation">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h3>
&lt;p>&lt;strong>But what if Sarah&amp;rsquo;s experience was completely different?&lt;/strong>&lt;/p>
&lt;p>&lt;em>Same customer, same needs, completely different outcome:&lt;/em>&lt;/p>
&lt;p>&lt;strong>Week 1 - Instagram DM:&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#960050;background-color:#1e0010">👤&lt;/span> &lt;span style="color:#960050;background-color:#1e0010">Sarah:&lt;/span> &lt;span style="color:#e6db74">&amp;#34;Hi! Do you have vegan skincare options?&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#960050;background-color:#1e0010">🧠&lt;/span> &lt;span style="color:#960050;background-color:#1e0010">Memory&lt;/span> &lt;span style="color:#960050;background-color:#1e0010">AI:&lt;/span> &lt;span style="color:#e6db74">&amp;#34;Yes, we have several vegan products! Our botanical serum and cleansing oil
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74"> are 100% plant-based. Would you like product details?&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#960050;background-color:#1e0010">👤&lt;/span> &lt;span style="color:#960050;background-color:#1e0010">Sarah:&lt;/span> &lt;span style="color:#e6db74">&amp;#34;Perfect! I&amp;#39;ll think about it.&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#960050;background-color:#1e0010">💾&lt;/span> [&lt;span style="color:#960050;background-color:#1e0010">Memory&lt;/span> &lt;span style="color:#960050;background-color:#1e0010">STORED:&lt;/span> &lt;span style="color:#e6db74">&amp;#34;Sarah - vegan skincare preference, interested in botanical serum +
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74"> cleansing oil, casual communication style, Instagram platform&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>Week 3 - Instagram DM (Same Customer Sarah):&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#960050;background-color:#1e0010">👤&lt;/span> &lt;span style="color:#960050;background-color:#1e0010">Sarah:&lt;/span> &lt;span style="color:#e6db74">&amp;#34;What&amp;#39;s your return policy?&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#960050;background-color:#1e0010">🧠&lt;/span> &lt;span style="color:#960050;background-color:#1e0010">Memory&lt;/span> &lt;span style="color:#960050;background-color:#1e0010">AI:&lt;/span> &lt;span style="color:#e6db74">&amp;#34;Hi Sarah! 😊 Our return policy is 30 days for unopened items. Since you were
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74"> interested in our vegan botanical serum and cleansing oil, I wanted to let you
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74"> know they&amp;#39;re both eligible for returns if they don&amp;#39;t work perfectly for you!&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#960050;background-color:#1e0010">👤&lt;/span> &lt;span style="color:#960050;background-color:#1e0010">Sarah:&lt;/span> &lt;span style="color:#e6db74">&amp;#34;That&amp;#39;s exactly what I needed to know! I&amp;#39;ll order both products now! 💚&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#960050;background-color:#1e0010">💡&lt;/span> [&lt;span style="color:#960050;background-color:#1e0010">Memory&lt;/span> &lt;span style="color:#960050;background-color:#1e0010">RETRIEVED:&lt;/span> &lt;span style="color:#e6db74">&amp;#34;Sarah prefers vegan products, previously interested in botanical
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74"> serum + cleansing oil, uses casual emoji-friendly communication&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>Week 5 - Instagram DM (Follow-up):&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#960050;background-color:#1e0010">👤&lt;/span> &lt;span style="color:#960050;background-color:#1e0010">Sarah:&lt;/span> &lt;span style="color:#e6db74">&amp;#34;The serum is amazing! Any other vegan products you&amp;#39;d recommend?&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#960050;background-color:#1e0010">🧠&lt;/span> &lt;span style="color:#960050;background-color:#1e0010">Memory&lt;/span> &lt;span style="color:#960050;background-color:#1e0010">AI:&lt;/span> &lt;span style="color:#e6db74">&amp;#34;So happy you love the botanical serum, Sarah! 🌿 Based on your vegan preferences
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74"> and purchase history, our new eco-friendly moisturizer just launched - it pairs
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74"> perfectly with the serum you&amp;#39;re already using. Plus sustainable packaging
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74"> that I know you&amp;#39;ll love!&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#960050;background-color:#1e0010">👤&lt;/span> &lt;span style="color:#960050;background-color:#1e0010">Sarah:&lt;/span> &lt;span style="color:#e6db74">&amp;#34;You know me so well! Adding to cart now! 🛒✨&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#960050;background-color:#1e0010">🎯&lt;/span> [&lt;span style="color:#960050;background-color:#1e0010">Memory&lt;/span> &lt;span style="color:#960050;background-color:#1e0010">RETRIEVED&lt;/span> &lt;span style="color:#960050;background-color:#1e0010">+&lt;/span> &lt;span style="color:#960050;background-color:#1e0010">UPDATED:&lt;/span> &lt;span style="color:#e6db74">&amp;#34;Sarah purchased botanical serum, loves it, values vegan +
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74"> eco-friendly products, loyal customer, prefers sustainable packaging&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>The Powerful Results:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Personal Recognition:&lt;/strong> Sarah feels valued and remembered across all interactions&lt;/li>
&lt;li>&lt;strong>Perfect Recommendations:&lt;/strong> AI suggests only relevant vegan products she&amp;rsquo;ll love&lt;/li>
&lt;li>&lt;strong>Faster Sales:&lt;/strong> 67% reduction in messages needed to complete purchase&lt;/li>
&lt;li>&lt;strong>Higher Value:&lt;/strong> $127 average order vs $43 without memory (+195% increase)&lt;/li>
&lt;li>&lt;strong>Customer Loyalty:&lt;/strong> 89% satisfaction rate, 97% higher repeat purchase rate&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="final-thoughts">
 Final Thoughts
 &lt;a class="heading-link" href="#final-thoughts">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h2>
&lt;p>Building AI agents with memory isn&amp;rsquo;t just about adding a feature – it&amp;rsquo;s about fundamentally changing how users interact with AI. When agents remember, they become partners rather than tools. They learn, adapt, and improve over time.&lt;/p>
&lt;p>The combination of LangGraph and Mem0 makes this accessible to every developer. You don&amp;rsquo;t need a PhD in machine learning or months of development time. In a few hours, you can build agents that rival the best commercial offerings.&lt;/p>
&lt;hr>
&lt;h2 id="resources--links">
 Resources &amp;amp; Links
 &lt;a class="heading-link" href="#resources--links">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h2>
&lt;h3 id="tutorial-implementation">
 Tutorial Implementation
 &lt;a class="heading-link" href="#tutorial-implementation">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>&lt;a href="https://github.com/kisinad/langgraph-mem0-ai-social-media-manager">Complete Repository&lt;/a>&lt;/strong> - Full production implementation&lt;/li>
&lt;li>&lt;strong>&lt;a href="https://github.com/kisinad/langgraph-mem0-ai-social-media-manager/blob/main/social_engagement_agent.py">Main Agent File&lt;/a>&lt;/strong> - Core LangGraph + Mem0 integration&lt;/li>
&lt;li>&lt;strong>&lt;a href="https://github.com/kisinad/langgraph-mem0-ai-social-media-manager/blob/main/user_context_manager.py">User Context Manager&lt;/a>&lt;/strong> - Advanced user profiling system&lt;/li>
&lt;li>&lt;strong>&lt;a href="https://github.com/kisinad/langgraph-mem0-ai-social-media-manager/blob/main/webhook_server.py">Webhook Integration&lt;/a>&lt;/strong> - Facebook/Instagram webhook server&lt;/li>
&lt;/ul>
&lt;h3 id="framework-documentation">
 Framework Documentation
 &lt;a class="heading-link" href="#framework-documentation">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>&lt;a href="https://docs.mem0.ai/">Mem0 Documentation&lt;/a>&lt;/strong>&lt;/li>
&lt;li>&lt;strong>&lt;a href="https://python.langchain.com/docs/langgraph">LangGraph Documentation&lt;/a>&lt;/strong>&lt;/li>
&lt;li>&lt;strong>&lt;a href="https://github.com/mem0ai/mem0">Mem0 GitHub Repository&lt;/a>&lt;/strong>&lt;/li>
&lt;li>&lt;strong>&lt;a href="https://mem0.ai/research">Mem0 Research Paper&lt;/a>&lt;/strong>&lt;/li>
&lt;li>&lt;strong>&lt;a href="https://mem0.dev/DiG">Mem0 Community Discord&lt;/a>&lt;/strong>&lt;/li>
&lt;/ul>
&lt;hr>
&lt;p>&lt;strong>The future of AI is personalized, contextual, and memorable. Start building it today.&lt;/strong>&lt;/p></description></item><item><title>Boost Copilot with Awesome GitHub Copilot Customizations</title><link>https://deniskisina.dev/awesome-github-copilot-community/</link><pubDate>Mon, 22 Sep 2025 10:00:00 -0600</pubDate><guid>https://deniskisina.dev/awesome-github-copilot-community/</guid><description>&lt;p>GitHub&amp;rsquo;s &lt;a href="https://github.com/github/awesome-copilot">&lt;strong>Awesome GitHub Copilot&lt;/strong>&lt;/a> repo is a community-led hub of custom instructions, reusable tips and custom chat modes that make AI-assisted coding smarter and more personal.&lt;/p>
&lt;p>I&amp;rsquo;ve been trying to supercharge my Copilot with the community-powered tweaks: custom chat modes, reusable prompts, and project-specific instructions.&lt;/p>
&lt;p>&lt;img alt="Awesome GitHub Copilot Repository" src="https://deniskisina.dev/images/awesome-copilot.png" title="Community-driven GitHub Copilot customizations and resources">&lt;/p>
&lt;h2 id="what-makes-it-awesome">
 What Makes It Awesome?
 &lt;a class="heading-link" href="#what-makes-it-awesome">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h2>
&lt;p>The &lt;a href="https://github.com/github/awesome-copilot">github/awesome-copilot&lt;/a> repository serves as a curated hub featuring three core components that elevate the Copilot experience:&lt;/p>
&lt;p>&lt;strong>🛠️ Custom Instructions&lt;/strong> - Tailored directives that help Copilot understand your specific coding preferences and project requirements, making suggestions more relevant and context-aware.&lt;/p>
&lt;p>&lt;img alt="Custom Instructions Example" src="https://deniskisina.dev/awesome-github-copilot-community/copilot-instructions.png" title="Example of custom instructions that guide Copilot behavior">&lt;/p>
&lt;p>&lt;strong>💬 Reusable Prompt Patterns&lt;/strong> - Proven templates that streamline common development tasks, from code reviews to documentation generation, saving developers significant time.&lt;/p>
&lt;p>&lt;img alt="Reusable Prompt Patterns" src="https://deniskisina.dev/awesome-github-copilot-community/prompt.png" title="Collection of reusable prompt templates for common development tasks">&lt;/p>
&lt;p>&lt;strong>🤖 Custom Chat Modes&lt;/strong> - Specialized conversation modes that adapt Copilot&amp;rsquo;s responses for different scenarios, whether you&amp;rsquo;re debugging, architecting, or exploring new technologies.&lt;/p>
&lt;p>&lt;img alt="Custom Chat Modes" src="https://deniskisina.dev/awesome-github-copilot-community/chatmodes.png" title="Specialized AI personas and conversation modes for different development contexts">&lt;/p>
&lt;h2 id="community-driven-innovation">
 Community-Driven Innovation
 &lt;a class="heading-link" href="#community-driven-innovation">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h2>
&lt;p>What sets this initiative apart is its community-first approach. Rather than top-down corporate directives, these customizations emerge from real developers solving actual problems. The repository welcomes contributions from practitioners who&amp;rsquo;ve discovered effective ways to enhance their AI-assisted workflows.&lt;/p>
&lt;p>Generic AI tools often miss context. These tested configurations close that gap, aligning Copilot’s power with real developer needs.&lt;/p>
&lt;h2 id="perfect-for-modern-development">
 Perfect for Modern Development
 &lt;a class="heading-link" href="#perfect-for-modern-development">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h2>
&lt;p>Whether you&amp;rsquo;re working on enterprise applications, contributing to open-source projects, or exploring new frameworks, the Awesome GitHub Copilot collection offers resources that adapt to your workflow. The customizations are particularly valuable for teams seeking consistency in their AI-assisted development practices.&lt;/p>
&lt;p>The initiative also includes framework-specific instructions, with templates covering popular technologies like Next.js and Tailwind CSS, though the community continues expanding coverage based on developer demand.&lt;/p>
&lt;h2 id="getting-started">
 Getting Started
 &lt;a class="heading-link" href="#getting-started">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h2>
&lt;p>Developers can immediately benefit by exploring the repository&amp;rsquo;s organized collection of customizations. The project encourages both adoption of existing patterns and contribution of new discoveries, fostering a collaborative ecosystem where AI-assisted development continues evolving.&lt;/p>
&lt;p>This community-driven approach to AI customization represents a significant step forward in making development tools more personalized and effective, demonstrating how collective developer expertise can enhance even the most advanced AI coding assistants.&lt;/p>
&lt;hr></description></item><item><title>How I Use GitHub Copilot to Review Code and Pull Requests</title><link>https://deniskisina.dev/posts/github-copilot-code-review/</link><pubDate>Mon, 15 Sep 2025 10:00:00 -0600</pubDate><guid>https://deniskisina.dev/posts/github-copilot-code-review/</guid><description>&lt;figure>&lt;img src="https://deniskisina.dev/images/wallpaper-copilot-generic-logo-dark.png"
 alt="GitHub Copilot logo on dark background" width="100%">&lt;figcaption>
 &lt;p>GitHub Copilot - code review assistant&lt;/p>
 &lt;/figcaption>
&lt;/figure>

&lt;p>Pull Requests (PR) are a central part of many teams’ workflows. PRs allow us to consolidate changes into a single, manageable unit that can be communicated, discussed, and refined. But this process can be time-consuming.&lt;/p>
&lt;p>Because of this, I&amp;rsquo;ve been exploring &lt;strong>GitHub copilot code review&lt;/strong> as a complement to the traditional code review process to reduce this overhead. GitHub Copilot offloads basic reviews to a copilot agent that catches issues like logic bugs, potential performance problems, anti-patterns, and even suggests fixes to improve code quality.&lt;/p>
&lt;p>When I first started using copilot, I primarily used it in my code editor for autocomplete and code suggestions. As copilot has grown and added new features, I have also expanded my use cases beyond my code editor and into other aspects of my day-to-day work, such as code reviews.  &lt;/p>
&lt;p>In this post, I will share my GitHub Copilot code review use cases and thoughts on the tool.&lt;/p>
&lt;h2 id="the-evolution-of-code-review">
 The Evolution of Code Review
 &lt;a class="heading-link" href="#the-evolution-of-code-review">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h2>
&lt;p>Traditionally, the main purpose of code review was bug finding — reviewers were expected to act as quality gates to catch errors before production. Over time, however, the role of reviews has shifted. Teams began to use PRs not just to catch bugs, but also to share knowledge, enforce design consistency, and build collective ownership of the codebase.
This shift means reviewers are now expected to focus on higher-level aspects of code: intent, maintainability, and architecture. The challenge is that low-level issues still consume time and attention, creating bottlenecks. This is where automation — and now AI — can play an important role.&lt;/p>
&lt;h2 id="what-is-ai-code-review">
 What Is AI Code Review?
 &lt;a class="heading-link" href="#what-is-ai-code-review">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h2>
&lt;p>It is an automated code assessment process that examines the code of a software application for potential problems and inefficiencies. It involves the use of machine learning models to identify and fix coding errors, optimize code performance, and make recommendations for improvements.&lt;/p>
&lt;h2 id="using-github-copilot-to-review-new-pull-requests">
 Using GitHub Copilot to Review New Pull Requests
 &lt;a class="heading-link" href="#using-github-copilot-to-review-new-pull-requests">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h2>
&lt;figure>&lt;img src="https://deniskisina.dev/images/copilot-review.png"
 alt="GitHub Copilot interface showing code review functionality" width="100%">&lt;figcaption>
 &lt;p>GitHub Copilot providing code review suggestions in the development environment&lt;/p>
 &lt;/figcaption>
&lt;/figure>

&lt;p>Before asking a teammate to spend their time on a pull request, I assign GitHub Copilot to perform an initial pass. Copilot quickly scans the changes, surfaces obvious bugs, suggests concise refactors, and drafts a clear pull-request summary that I can refine.&lt;/p>
&lt;h2 id="using-github-copilot-to-explain-unfamiliar-or-complex-code">
 Using GitHub Copilot to Explain unfamiliar or complex code
 &lt;a class="heading-link" href="#using-github-copilot-to-explain-unfamiliar-or-complex-code">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h2>
&lt;figure>&lt;img src="https://deniskisina.dev/images/copolit-omplex%20code.png"
 alt="GitHub Copilot explaining complex code functionality" width="100%">&lt;figcaption>
 &lt;p>GitHub Copilot providing detailed explanations of unfamiliar or complex code blocks&lt;/p>
 &lt;/figcaption>
&lt;/figure>

&lt;p>When I encounter unclear or cryptic code, I simply highlight the code block and ask GitHub Copilot to generate explanations to demystify its purpose. I simply highlight the code block and click the Copilot icon and prompt it to explain with:&lt;/p>
&lt;p>&lt;code>&amp;gt; “Explain what this function does.”&lt;/code>&lt;/p>
&lt;p>&lt;code>&amp;gt; “Summarize this code for me.” &lt;/code>&lt;/p>
&lt;p>&lt;code>&amp;gt; “What is the purpose of this block?”&lt;/code>&lt;/p>
&lt;p>To understand unfamiliar or complex code quickly, I highlight the snippet and ask Copilot, “What is this doing?” or request a high‑level summary, a step‑by‑step walkthrough, or a short list of key variables and side effects.
To keep the results reliable, I prompt precisely e.g.,&lt;/p>
&lt;p>&lt;code>&amp;gt; “Give a one‑sentence summary, then three risks” &lt;/code>&lt;/p>
&lt;p>cross‑check the output against the source, and use the explanation as a starting point for targeted tests or follow‑up questions.&lt;/p>
&lt;p>By providing concise explanations, copilot helps give me a clearer understanding of what the code is doing and why.&lt;/p>
&lt;h2 id="using-github-copilot-suggestions-when-reviewing-code">
 Using GitHub Copilot suggestions when reviewing code
 &lt;a class="heading-link" href="#using-github-copilot-suggestions-when-reviewing-code">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h2>
&lt;p>There have been times I have had a deadline to complete a task and code review, I don’t always have the time to check every detail manually. That’s where I lean on GitHub copilot.  That&amp;rsquo;s where I will ask GitHub Copilot to help me evaluate different aspects of the pull request. For example, I’ll sometimes ask copilot to double-check if the code is syntactically correct or if it follows standard best practices. While I can’t upload our internal company standards directly, I still compare copilot’s suggestions against what I know of our conventions.
One recent case involved reviewing some Java code, where I noticed a potential null reference issue. Instead of writing out a full explanation, I asked copilot to analyze the snippet and confirm if my concern was valid. Its response highlighted the exact risk I had spotted and suggested a safer approach, which made my review more precise and actionable.&lt;/p>
&lt;p>Another example was when a developer instantiated a new HttpClient directly in multiple methods. I suspected this could lead to resource leaks and performance issues, so I asked copilot for alternatives. It recommended using a HttpClient built through HttpClient.newBuilder() as a shared resource or leveraging a connection pool, which aligned with best practices in Java and reinforced my feedback.&lt;/p>
&lt;h2 id="wrapping-it-up">
 Wrapping it Up!
 &lt;a class="heading-link" href="#wrapping-it-up">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h2>
&lt;p>Simply writing down code is only half to complete the job. The real test comes in reviewing it properly and catching potential issues before they can slip into production. That’s where GitHub Copilot has been a game-changer for me.&lt;/p></description></item><item><title>From Code Completion to Autonomous Development: The Evolution of Agentic Coding</title><link>https://deniskisina.dev/posts/agentic-coding-revolution/</link><pubDate>Sat, 06 Sep 2025 10:00:00 -0600</pubDate><guid>https://deniskisina.dev/posts/agentic-coding-revolution/</guid><description>&lt;figure>&lt;img src="https://deniskisina.dev/posts/agentic-coding-revolution/hero-image.jpg"
 alt="Black and white robot toy on red wooden table representing the evolution of AI and automation" width="100%">&lt;figcaption>
 &lt;p>Photo by &lt;!-- raw HTML omitted -->Andrea De Santis&lt;!-- raw HTML omitted --> on &lt;!-- raw HTML omitted -->Unsplash&lt;!-- raw HTML omitted -->&lt;/p>
 &lt;/figcaption>
&lt;/figure>

&lt;p>As generative AI moves from novelty to necessity, developer workflows are entering their most transformative phase yet a quiet revolution: &lt;strong>agentic AI coding&lt;/strong>. Unlike traditional assistants that simply provide information, agentic systems can reason, act, and collaborate; turning knowledge into outcomes and redefining how software gets created.&lt;/p>
&lt;p>This isn&amp;rsquo;t just another incremental improvement; it&amp;rsquo;s a fundamental shift in how we conceive, create, and maintain software. With AI already generating the majority of pull requests at Anthropic and contributing significantly to code at Cognition Labs, the role of the developer is evolving into that of an orchestrator.&lt;/p>
&lt;p>In this article, we’ll explore how coding has evolved from autocomplete to autonomy—and what agentic coding means for the future of software engineering.&lt;/p>
&lt;h2 id="automation-vs-ai-workflows-vs-ai-agents">
 Automation vs. AI Workflows vs. AI Agents
 &lt;a class="heading-link" href="#automation-vs-ai-workflows-vs-ai-agents">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h2>
&lt;p>To understand why agentic coding represents such a leap forward, it helps to distinguish it from earlier approaches to automation and AI integration.&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>Automation&lt;/strong> relies on predefined, rule-based logic to execute deterministic tasks. It&amp;rsquo;s fast, reliable, but rigid—great for sending a Slack alert when a new lead signs up, but not for handling unexpected scenarios.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>AI Workflows&lt;/strong> take this a step further by calling large language models (LLMs) through APIs to handle more complex, flexible tasks. They&amp;rsquo;re powerful for pattern recognition and adaptable rules—like analyzing and routing leads with ChatGPT—but still limited by their reliance on structured workflows and training data.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>AI Agents&lt;/strong> go beyond both, designed to perform non-deterministic, adaptive tasks autonomously. They reason, act, and adapt to new variables, simulating human-like problem solving. For example, an AI agent could perform a full internet search on every inbound lead and continuously update information, without needing a rigid set of rules.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;h2 id="the-three-waves-of-ai-assisted-development">
 The Three Waves of AI-Assisted Development
 &lt;a class="heading-link" href="#the-three-waves-of-ai-assisted-development">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h2>
&lt;h3 id="wave-1-llm-code-generation-2020-2022">
 Wave 1: LLM Code Generation (2020-2022)
 &lt;a class="heading-link" href="#wave-1-llm-code-generation-2020-2022">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h3>
&lt;p>The first wave emerged with groundbreaking Large Language Models specifically trained on code datasets. This period saw the development of specialized code LLMs like OpenAI Codex, GPT-3, and CodeT5, which demonstrated that transformer architectures could understand programming semantics and generate functional code from natural language descriptions.&lt;/p>
&lt;p>&lt;strong>Key Characteristics:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Prompt-to-Code Translation&lt;/strong>: Models could interpret natural language requirements and generate corresponding code snippets&lt;/li>
&lt;li>&lt;strong>Multi-Language Support&lt;/strong>: Early models supported popular languages like Python, JavaScript, Java, and C++&lt;/li>
&lt;li>&lt;strong>Functional Correctness&lt;/strong>: Achieved meaningful accuracy on basic programming tasks&lt;/li>
&lt;/ul>
&lt;figure class="video">
 &lt;video controls preload="metadata" width="100%" autoplay muted loop="true">
 &lt;source src="https://deniskisina.dev/videos/ai-completion.mov" >
 &lt;/video>
 &lt;/figure>
 
&lt;p>&lt;em>Early AI coding tools could generate basic functions but struggled with complex algorithms or domain-specific code&lt;/em>&lt;/p>
&lt;p>&lt;strong>Performance Benchmarks:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>HumanEval&lt;/strong>: Early models like PaLM 8B achieved ~3.6% pass@1&lt;/li>
&lt;li>&lt;strong>MBPP&lt;/strong>: Basic completion rates around 5-15% for complex problems&lt;/li>
&lt;li>&lt;strong>CodeBLEU&lt;/strong>: Focused on syntactic similarity rather than execution correctness&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Limitations&lt;/strong>:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Static Generation&lt;/strong>: No iterative refinement or error correction&lt;/li>
&lt;li>&lt;strong>Context Isolation&lt;/strong>: Unable to understand broader codebase relationships&lt;/li>
&lt;li>&lt;strong>Limited Domain Knowledge&lt;/strong>: Struggled with specialized libraries and frameworks&lt;/li>
&lt;li>&lt;strong>Manual Integration Required&lt;/strong>: Developers needed significant post-processing&lt;/li>
&lt;li>&lt;strong>No Tool Integration&lt;/strong>: Couldn&amp;rsquo;t interact with compilers, debuggers, or development environments&lt;/li>
&lt;/ul>
&lt;h3 id="wave-2-ai-coding-assistants-2022-2024">
 Wave 2: AI Coding Assistants (2022-2024)
 &lt;a class="heading-link" href="#wave-2-ai-coding-assistants-2022-2024">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h3>
&lt;p>The second wave brought AI directly into development environments through sophisticated IDE integrations. Tools like GitHub Copilot, Cursor, Windsurf, and IBM&amp;rsquo;s watsonx Code Assistant transformed how developers interact with AI during daily workflows.&lt;/p>
&lt;p>&lt;strong>Core Capabilities:&lt;/strong>&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Intelligent Autocomplete&lt;/strong>: Context-aware code suggestions understanding project structure and patterns&lt;/li>
&lt;li>&lt;strong>Conversational Chat&lt;/strong>: Interactive code discussions within the development environment&lt;/li>
&lt;li>&lt;strong>Code Understanding&lt;/strong>: Advanced explanation capabilities for existing codebases&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>Enterprise Impact and Adoption:&lt;/strong>&lt;/p>
&lt;p>IBM&amp;rsquo;s enterprise deployment research revealed key insights:&lt;/p>
&lt;p>&lt;strong>Primary Use Cases:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Code Understanding (72%)&lt;/strong>: Explaining existing code and answering programming questions&lt;/li>
&lt;li>&lt;strong>Code Generation (56%)&lt;/strong>: Creating new code snippets and functions&lt;/li>
&lt;li>&lt;strong>Documentation Generation (40%)&lt;/strong>: Automated comment creation&lt;/li>
&lt;li>&lt;strong>Test Generation (36%)&lt;/strong>: Creating unit tests and scenarios&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Developer Productivity:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>57% reported increased effectiveness&lt;/strong>&lt;/li>
&lt;li>&lt;strong>Quality rating: 3.2/5&lt;/strong> (&amp;ldquo;Acceptable&amp;rdquo; with room for improvement)&lt;/li>
&lt;li>&lt;strong>Response time: 2.88/5&lt;/strong>, indicating need for optimization&lt;/li>
&lt;li>&lt;strong>Significant learning acceleration&lt;/strong> in &amp;ldquo;exploration mode&amp;rdquo;&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Collaboration Patterns:&lt;/strong>&lt;/p>
&lt;p>&lt;strong>1. Acceleration Mode&lt;/strong>: AI assists when developers know their direction&lt;/p>
&lt;ul>
&lt;li>Faster implementation of known patterns&lt;/li>
&lt;li>Reduced keystrokes and boilerplate generation&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>2. Exploration Mode&lt;/strong>: AI helps when developers need inspiration&lt;/p>
&lt;ul>
&lt;li>Discovering alternative approaches&lt;/li>
&lt;li>Learning new libraries and frameworks&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Quality and Trust:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Only 2-4% used AI output without modification&lt;/strong>&lt;/li>
&lt;li>&lt;strong>89% felt responsible for validating AI-generated content&lt;/strong>&lt;/li>
&lt;li>&lt;strong>23-35% used outputs primarily for learning&lt;/strong> rather than direct implementation&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Enterprise Challenges:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Specialized Technology&lt;/strong>: Need for legacy system and industry-specific library support&lt;/li>
&lt;li>&lt;strong>Cultural Barriers&lt;/strong>: Developer concerns about appearing less skilled&lt;/li>
&lt;li>&lt;strong>Quality Variability&lt;/strong>: Inconsistent output requiring careful validation&lt;/li>
&lt;li>&lt;strong>Training Requirements&lt;/strong>: Teams needed prompt engineering education&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Measurable Impact:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>21% faster task completion&lt;/strong> for routine implementations&lt;/li>
&lt;li>&lt;strong>40% reduction&lt;/strong> in time to understand new codebases&lt;/li>
&lt;li>&lt;strong>60% improvement&lt;/strong> in code comment completeness&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Evolution Toward Wave 3:&lt;/strong>
Wave 2 assistants established trust in AI-generated code and created familiar human-AI collaboration patterns, but revealed limitations requiring more autonomous, multi-step reasoning capabilities that led to Wave 3 agentic systems.&lt;/p>
&lt;p>&lt;em>💡 &lt;strong>Image Placement Suggestion&lt;/strong>: Split-screen comparison showing traditional IDE vs. AI-enhanced IDE with Copilot suggestions and chat interface&lt;/em>&lt;/p>
&lt;h3 id="wave-3-agentic-coding-2024-present">
 Wave 3: Agentic Coding (2024-Present)
 &lt;a class="heading-link" href="#wave-3-agentic-coding-2024-present">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h3>
&lt;p>Agentic coding represents autonomous AI that can plan, execute, test, and deploy entire features with minimal human intervention. These agents operate with unprecedented autonomy, making decisions, using tools, and adapting their approach based on results.&lt;/p>
&lt;h2 id="understanding-agentic-coding-beyond-assistance-to-autonomy">
 Understanding Agentic Coding: Beyond Assistance to Autonomy
 &lt;a class="heading-link" href="#understanding-agentic-coding-beyond-assistance-to-autonomy">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h2>
&lt;p>Agentic coding agents possess four key characteristics that distinguish them from previous AI tools:&lt;/p>
&lt;h3 id="1-autonomous-decision-making">
 1. Autonomous Decision Making
 &lt;a class="heading-link" href="#1-autonomous-decision-making">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h3>
&lt;p>Unlike traditional coding assistants that respond to prompts, agentic systems make independent decisions about architecture, implementation patterns, and tool usage.&lt;/p>
&lt;h3 id="2-multi-step-workflow-execution">
 2. Multi-Step Workflow Execution
 &lt;a class="heading-link" href="#2-multi-step-workflow-execution">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h3>
&lt;p>Agents can plan and execute complex, multi-file changes across entire codebases without constant human guidance.&lt;/p>
&lt;h3 id="3-tool-integration-and-environment-manipulation">
 3. Tool Integration and Environment Manipulation
 &lt;a class="heading-link" href="#3-tool-integration-and-environment-manipulation">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h3>
&lt;p>Agentic systems can interact with development tools, version control, testing frameworks, and deployment pipelines.&lt;/p>
&lt;h3 id="4-learning-and-adaptation">
 4. Learning and Adaptation
 &lt;a class="heading-link" href="#4-learning-and-adaptation">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h3>
&lt;p>These agents learn from codebase patterns, project conventions, and previous interactions to improve their suggestions.&lt;/p>
&lt;h2 id="the-four-modalities-of-agentic-coding">
 The Four Modalities of Agentic Coding
 &lt;a class="heading-link" href="#the-four-modalities-of-agentic-coding">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h2>
&lt;figure>&lt;img src="https://deniskisina.dev/posts/agentic-coding-revolution/Infographic%20showing%20the%20four%20modalities%20with%20tool%20examples.png"
 alt="Infographic showing the four modalities of agentic coding: IDE Plugins, AI-Native IDEs, CLI Tools, Web Interfaces, with tool examples">&lt;figcaption>
 &lt;p>Infographic: The Four Modalities of Agentic Coding (IDE Plugins, AI-Native IDEs, CLI Tools, Web Interfaces) with representative tools. Created with Canva.&lt;/p>
 &lt;/figcaption>
&lt;/figure>

&lt;h2 id="real-world-agentic-coding-use-cases">
 Real-World Agentic Coding Use Cases
 &lt;a class="heading-link" href="#real-world-agentic-coding-use-cases">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h2>
&lt;p>Based on my experience implementing these tools in enterprise environments, here are the most impactful applications:&lt;/p>
&lt;h3 id="1-intelligent-code-generation">
 1. Intelligent Code Generation
 &lt;a class="heading-link" href="#1-intelligent-code-generation">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h3>
&lt;p>AI agents can now build complete applications from a single prompt, autonomously selecting appropriate technologies, generating code across multiple files, and deploying functional systems.&lt;/p>
&lt;figure class="video">
 &lt;video controls preload="metadata" width="100%" autoplay muted loop="true">
 &lt;source src="https://deniskisina.dev/videos/agent-ai-in-action-2.mp4" >
 &lt;/video>
 &lt;/figure>
 
&lt;p>&lt;em>Demonstration of agentic AI coding in action, showing complete application generation from natural language prompts&lt;/em>&lt;/p>
&lt;p>&lt;strong>Key Benefits:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Flow-based architecture&lt;/strong> where components are organized into distinct nodes for decision-making, file operations, and code analysis&lt;/li>
&lt;li>&lt;strong>Autonomous technology selection&lt;/strong> based on project requirements&lt;/li>
&lt;li>&lt;strong>Multi-file coordination&lt;/strong> across entire codebases without manual intervention&lt;/li>
&lt;/ul>
&lt;h3 id="2-comprehensive-test-generation">
 2. Comprehensive Test Generation
 &lt;a class="heading-link" href="#2-comprehensive-test-generation">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h3>
&lt;p>Agentic systems automatically generate complete test suites with edge cases, mock setups, and realistic test data. Unlike traditional code completion, these agents understand testing patterns and create comprehensive validation scenarios.&lt;/p>
&lt;p>&lt;strong>Implementation Pattern:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Autonomous test architecture&lt;/strong> with proper mocking and dependency injection&lt;/li>
&lt;li>&lt;strong>Edge case generation&lt;/strong> based on code analysis and business logic&lt;/li>
&lt;li>&lt;strong>Realistic test data factories&lt;/strong> that mirror production scenarios&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Productivity Impact&lt;/strong>: Teams report 60% faster test coverage achievement with agentic test generation compared to manual writing.&lt;/p>


 
 &lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
 &lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="allowfullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/UkXUldJDHIo?autoplay=0&amp;controls=1&amp;end=0&amp;loop=0&amp;mute=0&amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"
 >&lt;/iframe>
 &lt;/div>

&lt;p>&lt;em>Claude Code generating a complete test suite - demonstration of agentic test generation in action&lt;/em>&lt;/p>
&lt;h3 id="3-intelligent-debugging-and-reverse-engineering">
 3. Intelligent Debugging and Reverse Engineering
 &lt;a class="heading-link" href="#3-intelligent-debugging-and-reverse-engineering">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h3>
&lt;p>Agentic systems excel at analyzing complex codebases, identifying root causes rather than symptoms, and suggesting architectural improvements during debugging sessions.&lt;/p>
&lt;p>&lt;strong>Real-World Workflow:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Pattern recognition&lt;/strong> across error logs and stack traces&lt;/li>
&lt;li>&lt;strong>Cross-file analysis&lt;/strong> to identify systemic issues&lt;/li>
&lt;li>&lt;strong>Proactive refactoring&lt;/strong> suggestions to prevent future bugs&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Enterprise Example&lt;/strong>: Agents can analyze production logs, identify recurring NullPointerExceptions, trace them to missing validation logic, and propose comprehensive fixes across multiple service layers.&lt;/p>


 
 &lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
 &lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="allowfullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/E8_UNGTJrEg?autoplay=0&amp;controls=1&amp;end=0&amp;loop=0&amp;mute=0&amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"
 >&lt;/iframe>
 &lt;/div>

&lt;p>&lt;em>Live debugging session showing agentic analysis of a production incident - demonstration of intelligent debugging capabilities&lt;/em>&lt;/p>
&lt;h3 id="4-automated-documentation-generation">
 4. Automated Documentation Generation
 &lt;a class="heading-link" href="#4-automated-documentation-generation">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h3>
&lt;p>Agentic documentation systems create comprehensive API docs, architectural diagrams, and onboarding guides by understanding code relationships and business context.&lt;/p>
&lt;p>&lt;strong>Autonomous Features:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>API documentation&lt;/strong> with realistic request/response examples&lt;/li>
&lt;li>&lt;strong>Architecture visualization&lt;/strong> showing component relationships&lt;/li>
&lt;li>&lt;strong>Code pattern explanation&lt;/strong> for complex business logic&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Enterprise Value&lt;/strong>: Documentation stays synchronized with code changes automatically, reducing maintenance overhead by 70%.&lt;/p>


 
 &lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
 &lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="allowfullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/QYchuz6nBR8?autoplay=0&amp;controls=1&amp;end=0&amp;loop=0&amp;mute=0&amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"
 >&lt;/iframe>
 &lt;/div>

&lt;p>&lt;em>Time-lapse of automatic documentation generation during a feature development cycle - demonstration of agentic documentation capabilities&lt;/em>&lt;/p>
&lt;h3 id="5-intelligent-refactoring">
 5. Intelligent Refactoring
 &lt;a class="heading-link" href="#5-intelligent-refactoring">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h3>
&lt;p>&lt;strong>Architectural Intelligence&lt;/strong>: Agentic refactoring goes beyond simple code cleanup to suggest architectural improvements, pattern implementations, and performance optimizations based on industry best practices.&lt;/p>
&lt;p>&lt;strong>Advanced Capabilities:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Service-oriented architecture (SOA)&lt;/strong> recommendations for scalable systems&lt;/li>
&lt;li>&lt;strong>Domain-driven design (DDD)&lt;/strong> pattern implementation&lt;/li>
&lt;li>&lt;strong>Performance optimization&lt;/strong> through algorithmic improvements&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Case Study&lt;/strong>: Converting a 200-line monolithic function into a clean, testable service architecture with proper separation of concerns and dependency injection.&lt;/p>


 
 &lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
 &lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="allowfullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/u8tvVxUOwvY?autoplay=0&amp;controls=1&amp;end=0&amp;loop=0&amp;mute=0&amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"
 >&lt;/iframe>
 &lt;/div>

&lt;p>&lt;em>Before/after comparison showing intelligent refactoring of legacy code into modern architecture - demonstration of agentic refactoring capabilities&lt;/em>&lt;/p>
&lt;p>The evolution from simple code completion to autonomous agentic coding represents the most significant shift in software development since the advent of high-level programming languages. As engineers, we&amp;rsquo;re not just gaining new tools—we&amp;rsquo;re fundamentally changing how we think about software creation.&lt;/p>
&lt;p>The future belongs to engineers who can effectively collaborate with AI agents, combining human creativity, domain expertise, and ethical judgment with AI&amp;rsquo;s computational power, consistency, and tireless execution.&lt;/p>
&lt;hr>
&lt;h2 id="additional-resources-and-learning">
 Additional Resources and Learning
 &lt;a class="heading-link" href="#additional-resources-and-learning">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h2>
&lt;h3 id="essential-reading">
 Essential Reading
 &lt;a class="heading-link" href="#essential-reading">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h3>
&lt;ul>
&lt;li>&lt;a href="https://www.anthropic.com/engineering/claude-code-best-practices">Anthropic&amp;rsquo;s Claude Code Best Practices&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://aws.amazon.com/blogs/devops/amazon-q-developer-agentic-coding-experience/">AWS DevOps: Agentic Coding Experience&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.deeplearning.ai/short-courses/claude-code-a-highly-agentic-coding-assistant/">DeepLearning.AI: Claude Code Course&lt;/a>&lt;/li>
&lt;/ul>
&lt;h3 id="tool-documentation">
 Tool Documentation
 &lt;a class="heading-link" href="#tool-documentation">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h3>
&lt;ul>
&lt;li>&lt;a href="https://github.com/features/copilot">GitHub Copilot Workspace&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://cursor.sh/docs">Cursor AI Documentation&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://claude.ai/code">Claude Code CLI Guide&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://aws.amazon.com/q/developer/">Amazon Q Developer&lt;/a>&lt;/li>
&lt;/ul>
&lt;h3 id="community-and-discussion">
 Community and Discussion
 &lt;a class="heading-link" href="#community-and-discussion">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h3>
&lt;ul>
&lt;li>&lt;a href="https://www.reddit.com/r/ChatGPTCoding/">r/ChatGPTCoding - Agentic Coding Discussions&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://news.ycombinator.com/">Hacker News: Agentic AI Developments&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://stackoverflow.blog/2025/04/17/wait-what-is-agentic-ai/">Stack Overflow: Agentic AI Blog&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>What Is Quishing and How to Avoid It</title><link>https://deniskisina.dev/posts/what-is-quishing-and-how-to-avoid-it/</link><pubDate>Mon, 09 Jun 2025 00:00:00 +0000</pubDate><guid>https://deniskisina.dev/posts/what-is-quishing-and-how-to-avoid-it/</guid><description>&lt;p>&lt;a href="https://deniskisina.dev/posts/what-is-quishing-and-how-to-avoid-it/#quishing-the-qr-code-phishing-scam">Quishing: The QR Code Phishing Scam&lt;/a>&lt;/p>
&lt;p>&lt;a href="https://deniskisina.dev/posts/what-is-quishing-and-how-to-avoid-it/#how-quishing-works">How Quishing Works&lt;/a>&lt;/p>
&lt;p>&lt;a href="https://deniskisina.dev/posts/what-is-quishing-and-how-to-avoid-it/#common-signs-of-a-quishing-attack">Common Signs of a Quishing Attack&lt;/a>&lt;/p>
&lt;p>&lt;a href="https://deniskisina.dev/posts/what-is-quishing-and-how-to-avoid-it/#real-world-examples">Real-World Examples&lt;/a>&lt;/p>
&lt;p>&lt;a href="https://deniskisina.dev/posts/what-is-quishing-and-how-to-avoid-it/#how-to-protect-yourself">How to Protect Yourself&lt;/a>&lt;/p>
&lt;p>&lt;a href="https://deniskisina.dev/posts/what-is-quishing-and-how-to-avoid-it/#what-to-do-if-youre-a-victim">What to Do if You’re a Victim&lt;/a>&lt;/p>
&lt;p>&lt;a href="https://deniskisina.dev/posts/what-is-quishing-and-how-to-avoid-it/#final-thoughts">Final Thoughts&lt;/a>&lt;/p>
&lt;h1 id="quishing-the-qr-code-phishing-scam">
 Quishing: The QR Code Phishing Scam
 &lt;a class="heading-link" href="#quishing-the-qr-code-phishing-scam">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h1>
&lt;p>&lt;img alt="QR code Scanning" src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fybvx1p06m1ershfybj5.jpg">&lt;/p>
&lt;p>Quishing (or &lt;strong>QR code phishing&lt;/strong>) is a new twist on the familiar phishing scam. In quishing, attackers use malicious QR codes to trick victims into visiting fake websites or downloading malware. QR codes are those black-and-white square barcodes you scan with your phone’s camera. Cyber criminals know that many people trust QR codes for quick tasks (like viewing menus, paying bills, or signing up for deals), and they exploit this trust. As the Australian Cyber Security Centre explains, quishing “uses QR codes instead of text-based links” to fool people into giving up personal data or installing harmful software. Cloudflare’s security team similarly warns that quishing aims to steal sensitive information (passwords, financial data, PII – personally identifiable information) by redirecting you to malicious sites. In short, quishing replaces a clickable link with a scannable code to carry out scams.&lt;/p>
&lt;h1 id="how-quishing-works">
 How Quishing Works
 &lt;a class="heading-link" href="#how-quishing-works">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h1>
&lt;p>In a typical quishing attack, a scammer generates a harmful QR code that hides a bad URL or a virus-laden file. They might email or text the QR code to you, put it on a fake flyer, or even stick it over a real QR code in a public place. When you scan the code with your smartphone camera, it takes you to a malicious website or automatically downloads malware. Often, the site will look legitimate (for example, mimicking a bank or company login page) and ask you to enter passwords or payment information. As SoSafe’s security guide explains, after scanning a quishing QR code “victims are asked to provide sensitive information like login credentials or bank details or to download malicious software”. In another twist (called QRLJacking), attackers can even swap a QR code on a login screen so that scanning it logs you into the attacker’s account instead of your own.&lt;/p>
&lt;p>Quishing works so well because QR codes hide their destination. Unlike regular links, you usually can’t see where a QR code will take you until after you scan it. Many email filters also can’t read QR codes embedded in images, so a phishing email with a QR image may slip past security filters. Attackers exploit this by using urgency or curiosity: they might send a message like “Scan this code to watch a missed voicemail” or “Scan to claim a prize.” Because QR codes look official and scanning seems easy, people often don’t hesitate. But once scanned, the scammer’s trap is sprung: your device is now connected to a fake site or a malicious download.&lt;/p>
&lt;p>Key steps in a quishing scam include:&lt;/p>
&lt;ul>
&lt;li>
&lt;p>Creation: The attacker creates a QR code that links to a fraudulent website or a malicious file (for example, a fake login page or a virus download).&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Delivery: They place the QR code where people will scan it – this could be in an email, text message, social post, a flyer, or even a sticker on a public sign.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Scanning: The victim uses a smartphone to scan the code. The device is taken to the attacker-controlled site or service. Sometimes the site immediately downloads malware onto the device.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Exploitation: The site may ask the user to enter credentials (like passwords or credit card numbers). Once entered, the attacker steals this information. They might also gain access to the device itself if malware was installed, enabling identity theft, financial fraud, or ransomware attacks.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;h1 id="common-signs-of-a-quishing-attack">
 Common Signs of a Quishing Attack
 &lt;a class="heading-link" href="#common-signs-of-a-quishing-attack">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h1>
&lt;p>Quishing scams use many of the same tricks as email phishing, so the red flags are similar to other scams – plus a few QR-specific ones. Watch out for these warning signs:&lt;/p>
&lt;ul>
&lt;li>
&lt;p>Unsolicited QR codes: Be suspicious if you receive a QR code out of the blue, especially from an unknown sender. For example, if you get an unexpected email or text saying “scan this QR code now” with no clear context, that’s a red flag.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Urgency or incentives: Messages that pressure you to scan quickly (“Offer ends soon!”) or promise big rewards (“Win $100 if you scan this code”) are common lures. Scammers use fear and greed to get you to act without thinking. SoSafe notes that attackers often incite “fear and urgency” to trick victims into scanning fraudulent QR codes.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Poor context or grammar: If the QR code comes with a generic greeting, spelling mistakes, or strange wording, treat it cautiously. Legitimate organizations usually address you by name and provide clear context.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Misleading placement or design: On posters, flyers, or stickers, look for signs of tampering. IBM warns to check if the QR code sticker looks pixelated, misaligned, or placed over an existing code. A sticker that doesn’t match the rest of the design (for instance, a newer-looking sticker on an old sign) could be hiding a malicious code.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Suspicious destination: After scanning, check the web address carefully. If your phone shows the URL or name of the site it’s going to, look for anything unusual. A slight typo or unfamiliar domain should make you back out immediately. Also be cautious if your phone suddenly asks for downloads or app permissions after scanning; attackers sometimes request extra permissions that aren’t needed for viewing content.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Asking for private info: Legitimate QR codes rarely ask for sensitive data. If the site you landed on immediately asks for login credentials, your Social Security number, or bank details, it’s almost certainly a scam.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Where you found the QR code: Consider the context. A random QR code on a street lamp or a parking meter that was never there before might be malicious. IBM notes that attackers have even pasted fake codes on devices like parking machines or menus during COVID-19 to trick people.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>Always trust your instincts: if something seems off about a QR code or the website it leads to, don’t scan it.&lt;/p>
&lt;h1 id="real-world-examples">
 Real-World Examples
 &lt;a class="heading-link" href="#real-world-examples">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h1>
&lt;p>Cybercriminals have already carried out many quishing attacks. Some notable cases include:&lt;/p>
&lt;ul>
&lt;li>
&lt;p>Parking meter fraud: In one Texas case, scammers placed fake QR code stickers on parking kiosks. Drivers who scanned to “pay” were taken to a bogus site and ended up handing their credit card details directly to the fraudsters. A similar scam occurred in Atlanta, where fake parking tickets with QR codes were placed on cars. The city later warned that they do not use QR codes on tickets – the codes led to scam payment pages.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Workplace phishing: Employees at a company received emails claiming to have a voicemail. The email had a QR code that supposedly would let them listen to the message. Scanning it took victims to a fake Microsoft login page. Unsuspecting users entered their usernames and passwords, giving the attackers direct access to their accounts.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Banking scam: Customers of a bank got emails or letters asking them to scan a QR code to “consent to a new data policy.” Scanning redirected them to a website that looked exactly like the bank’s login page. When customers entered their details, hackers captured their account credentials.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Unsolicited gift (“Brushing”) scam: Some people have received free small gifts in the mail along with a note and a QR code. The note says to scan the code to register the gift or learn about the sender. In reality, scanning takes you to a spoof website that asks for personal or financial information. The U.S. Postal Inspection Service describes this as another form of quishing, where criminals look innocent (giving a small gift) to trick you into scanning a malicious QR code.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Educational campaign QR: Not all QR codes are malicious, but even marketers have shown how easy it is to exploit trust. For example, a popular Coinbase ad at the 2022 Super Bowl featured a QR code that bounced around the screen, offering free Bitcoin for app downloads. This legitimate code worked brilliantly (app installs jumped 309%), but it also demonstrated how many people would scan an unknown code on a TV. Scammers have used the same idea to bait victims. In fact, just before that ad aired, news outlets reported on “crypto QR scams” where attackers forced people to withdraw money via QR-enabled crypto ATMs. These cases highlight that quishing can show up anywhere: in emails, ads, parking meters, or even free gifts.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>These real incidents show that quishing is versatile. It can target anyone – commuters, shoppers, workers, or even bank customers – by using a QR code in a context where people would least expect it.&lt;/p>
&lt;h1 id="how-to-protect-yourself">
 How to Protect Yourself
 &lt;a class="heading-link" href="#how-to-protect-yourself">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h1>
&lt;p>You can take several practical steps to reduce your risk of falling for quishing:&lt;/p>
&lt;ul>
&lt;li>
&lt;p>Only scan trusted QR codes: If you didn’t expect a QR code from someone, don’t scan it. Only use codes from official or known sources. IBM’s advice is clear: “Think before you scan – make sure that you’re only scanning codes from reputable sources.” If a code comes via an unsolicited email or message, verify its legitimacy first.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Inspect the code: When you see a QR code in public, look closely. Is it part of the original sign or does it look like a sticker slapped on later? A code that is misaligned, blurry, or placed over another code could be malicious. If it looks suspicious, don’t scan it.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Preview the link: Use your phone’s camera or a trusted QR scanner that shows you the URL before you open it. Many modern smartphones let you see the website address after you scan and before you tap to go there. Check that address carefully. If the URL doesn’t match what you expect (for example, it’s not the official bank site), don’t proceed.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Verify websites and information: If scanning leads to a website that asks for personal info, double-check everything. Look at the website’s address bar: is the domain name spelled correctly and secure (https)? Does the page design (logo, layout) match the real company’s website? If in doubt, close the site and navigate manually by typing the known website address into your browser.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Be cautious with downloads and permissions: Don’t download apps or files from QR codes unless you are absolutely sure of the source. If a code makes your phone ask for unusual permissions, cancel it. The Cyber.gov.au advice also says: avoid downloading apps via QR; instead, use official app stores.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Keep devices secure: Always install the latest updates for your phone and apps. Use a reputable security app on your device if possible. Enable two-factor authentication (2FA) on your online accounts. Even if a scammer steals your password, 2FA can block them from logging in.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Stay alert and informed: Learn about current scam tactics and tell others. If a deal sounds too good to be true, it usually is. The IBM security team warns not to “let the convenience of scanning a QR code cloud your good judgment”.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>By following these tips — verifying codes, checking links, and maintaining good security habits — you can make yourself a much harder target for quishing.&lt;/p>
&lt;h1 id="what-to-do-if-youre-a-victim">
 What to Do if You’re a Victim
 &lt;a class="heading-link" href="#what-to-do-if-youre-a-victim">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h1>
&lt;p>If you think you may have fallen for a quishing scam, act quickly:&lt;/p>
&lt;ul>
&lt;li>
&lt;p>Cut off the connection: If you just scanned a suspicious QR code, immediately close the website or app it opened. Avoid clicking any buttons on that site.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Change your passwords: If you entered any login credentials (for email, banking, or other accounts), change those passwords right away. Pick strong, unique passwords. This prevents the attacker from using stolen credentials.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Alert your bank or financial institutions: If you gave out any financial or personal information (like credit card or Social Security numbers), contact your bank or credit card company at once. They can monitor your accounts for fraud or freeze them if needed.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Scan for malware: Run a security scan on your device. If you downloaded something unwanted (an app or file) from the QR code, uninstall it and scan your phone for viruses or malware.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Check your accounts: Keep an eye on your bank statements, credit card activity, and credit reports for any strange charges or new accounts you didn’t open.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Report the scam: Tell the authorities. In the United States, you can report identity theft and phishing to the Federal Trade Commission at identitytheft.gov. The US. Postal Inspection Service asks that you email &lt;a href="mailto:spam@uspis.gov">spam@uspis.gov&lt;/a> if you see a suspicious QR code or suspect a quishing attempt in mail-related scams. Providing information about the scam can help authorities warn others and possibly catch the scammers.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Learn from it: Finally, make sure you and those around you are more aware. Explain the scam to friends or family so they don’t fall victim too.
Prompt action can greatly reduce the damage if you’ve been targeted.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;h1 id="final-thoughts">
 Final Thoughts
 &lt;a class="heading-link" href="#final-thoughts">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h1>
&lt;p>QR codes offer real convenience, but that convenience can be abused. Quishing is becoming more common as people grow accustomed to scanning codes in everyday life. The key takeaway is to stay cautious. Treat every unexpected QR code as you would a suspicious email link: stop and think before you scan. As IBM’s security team reminds us, “Don’t let added convenience lower your guard.” By following the guidelines above and remaining vigilant, you can enjoy the benefits of QR codes without becoming the next victim of quishing. In the war against cyber scams, awareness and common-sense habits are your best defenses.&lt;/p></description></item><item><title>Test GitHub Action workflows locally</title><link>https://deniskisina.dev/test-github-action-workflows-locally/</link><pubDate>Sat, 10 May 2025 21:51:54 -0500</pubDate><guid>https://deniskisina.dev/test-github-action-workflows-locally/</guid><description>&lt;p>Developing a &lt;a href="https://docs.github.com/en/actions">GitHub Actions workflow&lt;/a> is time-consuming. The process involves repeatedly committing and pushing your changes to your workflows to the remote repository to test them.&lt;/p>
&lt;p>This increases the time spent working and pollutes the repository with unnecessary commits and logs creating unnecessary clutter in the repository version history.&lt;/p>
&lt;p>This increases the time spent working and pollutes the repository with unnecessary commits and logs, creating unnecessary clutter in the repository&amp;rsquo;s version history.&lt;/p>
&lt;p>Fortunately, there are tools to test &lt;a href="https://docs.github.com/en/actions">GitHub Actions workflow&lt;/a> locally before pushing the workflows to the repository. One of the more widely used tool is called &lt;a href="https://nektosact.com/introduction.html">act&lt;/a> that uses &lt;a href="https://www.docker.com/">Docker&lt;/a> containers to run and test your actions locally
This tool allows you to run GitHub Actions workflows directly on your local machine, with YAML syntax support.&lt;/p>
&lt;h2 id="what-is-act">
 What is act?
 &lt;a class="heading-link" href="#what-is-act">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h2>
&lt;p>The goal of &lt;a href="https://nektosact.com/introduction.html">act&lt;/a> is to provide a way to spin up a GitHub Action locally, running it in a Docker container as if it were running in GitHub.&lt;/p>
&lt;h2 id="installing-act-cli">
 Installing &lt;code>act&lt;/code> CLI
 &lt;a class="heading-link" href="#installing-act-cli">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h2>
&lt;p>Note: Requirements - &lt;code>nektos/act&lt;/code> uses Docker to run your workflow on your machine. So, first, you need to have Docker (&lt;a href="https://www.docker.com/products/docker-desktop/">Docker Desktop&lt;/a> for Mac and Windows, and Docker Engine for Linux) set up on your system.&lt;/p>
&lt;p>If you use a Mac, you can use &lt;a href="v">Homebrew&lt;/a> to install it by running the following command in your terminal:&lt;/p>
&lt;pre tabindex="0">&lt;code>brew install act
&lt;/code>&lt;/pre>&lt;h2 id="run-your-workflow">
 Run your workflow
 &lt;a class="heading-link" href="#run-your-workflow">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h2>
&lt;p>To run your workflow on your machine, just navigate to your repository folder and run command &lt;a href="https://nektosact.com/introduction.html">&lt;code>act&lt;/code>&lt;/a> at the terminal. It will run all workflows that are triggered by a &lt;a href="https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#push">GitHub push event&lt;/a> in your &lt;code>.github/workflows&lt;/code> folder. Run command &lt;code>act&lt;/code>&lt;/p>
&lt;figure class="video">
 &lt;video controls preload="metadata" width="849px" autoplay muted loop="true">
 &lt;source src="https://deniskisina.dev/videos/demos.mp4" >
 &lt;/video>
 
 &lt;figcaption>Run act&lt;/figcaption>
 &lt;/figure>
 
&lt;h2 id="conclusion">
 Conclusion
 &lt;a class="heading-link" href="#conclusion">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h2>
&lt;p>&lt;a href="https://nektosact.com/introduction.html">act&lt;/a> is a valuable tool for developers who regularly work with GitHub Actions and want to test and debug their workflows locally.&lt;/p>
&lt;h2 id="nb">
 NB:
 &lt;a class="heading-link" href="#nb">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h2>
&lt;p>If you encounter this error :&lt;/p>
&lt;pre tabindex="0">&lt;code>error getting credentials - err: exec: &amp;#34;docker-credential-desktop&amp;#34;: executable file not found in $PATH, out: 
&lt;/code>&lt;/pre>&lt;p>&lt;img alt="executable file not found in $PATH" src="https://deniskisina.dev/images/error.png">&lt;/p>
&lt;p>Update the in &lt;code>~/.docker/config.json&lt;/code> change &lt;code>credsStore&lt;/code> to &lt;code>credStore&lt;/code>&lt;/p></description></item><item><title>Automating Blog Deployment with Hugo and GitHub Actions</title><link>https://deniskisina.dev/automating-blog-deployment-hugo-github-actions/</link><pubDate>Fri, 02 May 2025 07:50:48 -0500</pubDate><guid>https://deniskisina.dev/automating-blog-deployment-hugo-github-actions/</guid><description>&lt;h2 id="overview">
 Overview
 &lt;a class="heading-link" href="#overview">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h2>
&lt;p>Improving and streamlining my blogging workflow has been on my TODO list for a while now, and since migrating to Hugo, I have gotten the kick I needed.&lt;/p>
&lt;p>After setting up my blog using Hugo, I posted about the migration process and the steps involved in moving from WordPress to Hugo. My current blogging workflow is manual; to publish a new post, I create a markdown file in the project directory and run the &lt;code>hugo&lt;/code> command. This builds the site by combining the Markdown content with HTML templates and outputs a set of static HTML files in the public directory—ready to be served by any standard web server. After that, I copy the public folder using scp, and just like that, the new post was live.&lt;/p>
&lt;p>It got me thinking about automating the deployment process of my blog using GitHub Actions, given that I already have a GitHub repository for the blog site.&lt;/p>
&lt;h2 id="what-are-github-actions-how-does-a-github-action-work">
 What are GitHub Actions? How does a Github Action work?
 &lt;a class="heading-link" href="#what-are-github-actions-how-does-a-github-action-work">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h2>
&lt;p>GitHub Actions is a continuous integration and continuous delivery (CI/CD) platform. At the most basic level, it is a series of processes executed in response to an event in a GitHub repository called a &amp;ldquo;workflow,&amp;rdquo; defined in a text file (YAML) placed under the &lt;code>.github/workflows&lt;/code> directory inside your project directory. A workflow consists of a set of &amp;ldquo;jobs&amp;rdquo; that can be executed in parallel, and each job consists of multiple &amp;ldquo;steps&amp;rdquo; executed sequentially.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yml" data-lang="yml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">name&lt;/span>: &lt;span style="color:#ae81ff">Example Workflow&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">on&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">push&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">branches&lt;/span>: [ &lt;span style="color:#ae81ff">main ]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">pull_request&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">branches&lt;/span>: [ &lt;span style="color:#ae81ff">main ]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">jobs&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">job1&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">name&lt;/span>: &lt;span style="color:#ae81ff">Job 1&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">runs-on&lt;/span>: &lt;span style="color:#ae81ff">ubuntu-latest&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">steps&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#f92672">name&lt;/span>: &lt;span style="color:#ae81ff">Step 1-1 - Checkout repository&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">uses&lt;/span>: &lt;span style="color:#ae81ff">actions/checkout@v4&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#f92672">name&lt;/span>: &lt;span style="color:#ae81ff">Step 1-2 - Run a script&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">run&lt;/span>: &lt;span style="color:#ae81ff">echo &amp;#34;Hello from Job 1, Step 1-2!&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">job2&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">name&lt;/span>: &lt;span style="color:#ae81ff">Job 2&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">runs-on&lt;/span>: &lt;span style="color:#ae81ff">ubuntu-latest&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">needs&lt;/span>: &lt;span style="color:#ae81ff">job1&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">steps&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#f92672">name&lt;/span>: &lt;span style="color:#ae81ff">Step 2-1 - Run another script&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">run&lt;/span>: &lt;span style="color:#ae81ff">echo &amp;#34;Hello from Job 2, Step 2-1! Job 1 completed.&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="why-automate-the-deployment">
 Why automate the deployment?
 &lt;a class="heading-link" href="#why-automate-the-deployment">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h2>
&lt;p>Today, creating or updating a post on the blog involves a manual and repetitive process:
Make changes locally.
Build the static site using the hugo command.
Copy the generated files from the &lt;code>public/&lt;/code> directory.
Transfer them to the remote server.
This Workflow is both time-consuming and prone to error. Given these limitations, why not automate the process to streamline content deployment and reduce friction?&lt;/p>
&lt;h2 id="workflow">
 Workflow
 &lt;a class="heading-link" href="#workflow">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h2>
&lt;p>Starting to gather the various bits and pieces, we should first establish our desired Workflow as the final target we wish to achieve. The desired Workflow for this scenario would be:&lt;/p>
&lt;ol>
&lt;li>Working locally with our website files. (Try new features, add/update posts, etc.)&lt;/li>
&lt;li>When we feel happy with what we have done, commit the changes. (Or commit as many times as we feel necessary)&lt;/li>
&lt;li>Push changes to remote repository. (usually origin/master)&lt;/li>
&lt;li>Done. (Automatic deployment)&lt;/li>
&lt;/ol>
&lt;p>&lt;img alt="GitHub Workflow" src="https://deniskisina.dev/images/blog-workflow.png">&lt;/p>
&lt;h2 id="build-job">
 Build job
 &lt;a class="heading-link" href="#build-job">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yml" data-lang="yml">&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">jobs&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e"># Build job&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">build&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">runs-on&lt;/span>: &lt;span style="color:#ae81ff">ubuntu-latest&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">concurrency&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">group&lt;/span>: &lt;span style="color:#ae81ff">${{github.workflow}} - ${{github.ref}}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">steps&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#f92672">name&lt;/span>: &lt;span style="color:#ae81ff">Checkout&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">uses&lt;/span>: &lt;span style="color:#ae81ff">actions/checkout@v4&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">with&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">submodules&lt;/span>: &lt;span style="color:#66d9ef">true&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">fetch-depth&lt;/span>: &lt;span style="color:#ae81ff">0&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#f92672">name&lt;/span>: &lt;span style="color:#ae81ff">Setup Hugo&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">uses&lt;/span>: &lt;span style="color:#ae81ff">peaceiris/actions-hugo@v3&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">with&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">hugo-version&lt;/span>: &lt;span style="color:#e6db74">&amp;#39;latest&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">extended&lt;/span>: &lt;span style="color:#66d9ef">true&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#f92672">name&lt;/span>: &lt;span style="color:#ae81ff">Build with Hugo&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">run&lt;/span>: &lt;span style="color:#ae81ff">hugo --minify&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#f92672">name&lt;/span>: &lt;span style="color:#ae81ff">Upload public dir&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">uses&lt;/span>: &lt;span style="color:#ae81ff">actions/upload-artifact@v4&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">with&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">name&lt;/span>: &lt;span style="color:#ae81ff">public-artifact&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">path&lt;/span>: &lt;span style="color:#ae81ff">public/&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The build job gathers and installs all dependencies for running hugo and generating the static assets. The content is generated in the directory called public. Finally, it uploads this directory to the artifacts of this workflow, so they can be accessed from the other jobs, in our case the deploy job.&lt;/p>
&lt;h1 id="deploy-job">
 Deploy job
 &lt;a class="heading-link" href="#deploy-job">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h1>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yml" data-lang="yml">&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e"># Deploy job&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">deploy&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">runs-on&lt;/span>: &lt;span style="color:#ae81ff">ubuntu-latest&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">needs&lt;/span>: &lt;span style="color:#ae81ff">build&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">steps&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#f92672">name&lt;/span>: &lt;span style="color:#ae81ff">Download public dir&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">uses&lt;/span>: &lt;span style="color:#ae81ff">actions/download-artifact@v4&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">with&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">name&lt;/span>: &lt;span style="color:#ae81ff">public-artifact&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">path&lt;/span>: &lt;span style="color:#ae81ff">public&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#f92672">name&lt;/span>: &lt;span style="color:#ae81ff">Deploy blog&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">uses&lt;/span>: &lt;span style="color:#ae81ff">appleboy/scp-action@v0.1.7&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">with&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">host&lt;/span>: &lt;span style="color:#ae81ff">${{ secrets.FTP_HOST }}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">username&lt;/span>: &lt;span style="color:#ae81ff">${{ secrets.FTP_USER }}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">key&lt;/span>: &lt;span style="color:#ae81ff">${{ secrets.KEY }}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">port&lt;/span>: &lt;span style="color:#ae81ff">${{ secrets.PORT }}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">source&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;public/&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">target&lt;/span>: &lt;span style="color:#ae81ff">${{ secrets.TARGET_DIR }}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">strip_components&lt;/span>: &lt;span style="color:#ae81ff">1&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>This job consists of 2 simple steps. First, download the artifacts from the previous job and then upload them to Hostinger, using the account credentials has write permissions to this directory.&lt;/p>
&lt;h2 id="conclusion">
 Conclusion
 &lt;a class="heading-link" href="#conclusion">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h2>
&lt;p>I&amp;rsquo;m really happy with how simple it was to set up this workflow using GitHub Actions. It only took a few hours to set up the blog, and now I have something simple and robust enough for me to write posts and iterate with little to no overhead. I&amp;rsquo;m looking forward to writing more posts, and I hope you&amp;rsquo;ll join me on this journey!&lt;/p>
&lt;h2 id="references">
 References
 &lt;a class="heading-link" href="#references">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://github.com/features/actions">Github Actions&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://gohugo.io/">Hugo&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>The Secret AI Revolution: How SMEs Are Solving 6 Critical Business Challenges</title><link>https://deniskisina.dev/posts/sme-ai-transformation-secrets/</link><pubDate>Wed, 15 Jan 2025 09:00:00 -0600</pubDate><guid>https://deniskisina.dev/posts/sme-ai-transformation-secrets/</guid><description>&lt;figure>&lt;img src="https://deniskisina.dev/posts/sme-ai-transformation-secrets/sme-ai-hero.jpg"
 alt="Small business owner using AI tools on laptop with digital transformation icons floating around" width="100%">&lt;figcaption>
 &lt;p>SMEs are leveraging AI to compete with enterprise-level efficiency and innovation&lt;/p>
 &lt;/figcaption>
&lt;/figure>

&lt;p>While Fortune 500 companies dominate AI headlines, a quiet revolution is happening in small and medium enterprises (SMEs). These nimble organizations are secretly deploying AI solutions to solve critical business challenges—and the results are remarkable.&lt;/p>
&lt;p>As someone who&amp;rsquo;s worked extensively with enterprise AI implementations, I&amp;rsquo;ve witnessed firsthand how SMEs are achieving what was once exclusive to tech giants. The democratization of AI tools has leveled the playing field, and smart SMEs are capitalizing on this opportunity.&lt;/p>
&lt;p>Let&amp;rsquo;s explore the six core pain points SMEs face and the AI solutions that are transforming their operations.&lt;/p>
&lt;h2 id="1-labor-cost-crisis-ai-as-your-ultimate-efficiency-multiplier">
 1. Labor Cost Crisis: AI as Your Ultimate Efficiency Multiplier
 &lt;a class="heading-link" href="#1-labor-cost-crisis-ai-as-your-ultimate-efficiency-multiplier">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h2>
&lt;p>&lt;strong>The Pain Point&lt;/strong>: Customer service overwhelm, manual data entry errors, time-consuming report generation, and prohibitive staffing costs are bleeding SMEs dry.&lt;/p>
&lt;h3 id="ai-powered-solutions">
 AI-Powered Solutions:
 &lt;a class="heading-link" href="#ai-powered-solutions">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h3>
&lt;p>&lt;strong>Intelligent Customer Service&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>GPT-powered chatbots&lt;/strong> and &lt;strong>Kimi Chat&lt;/strong> handle 80% of routine inquiries&lt;/li>
&lt;li>24/7 multilingual support eliminates timezone barriers for global SMEs&lt;/li>
&lt;li>Human agents focus on complex, high-value interactions&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Process Automation Champions&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>UiPath with AI&lt;/strong> automates invoice processing, order management, and financial reporting&lt;/li>
&lt;li>&lt;strong>Otter.ai&lt;/strong> transforms meetings into searchable transcripts and action items&lt;/li>
&lt;li>&lt;strong>Claude Code&lt;/strong> generates custom automation scripts for repetitive tasks&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Impact Metrics&lt;/strong>: 30-50% reduction in labor costs, with teams refocusing on strategic initiatives rather than manual processes.&lt;/p>
&lt;figure>&lt;img src="https://deniskisina.dev/posts/sme-ai-transformation-secrets/ai-customer-service.jpg"
 alt="AI chatbot interface showing multilingual customer support with analytics dashboard" width="100%">&lt;figcaption>
 &lt;p>AI-powered customer service systems handle 80% of routine inquiries while providing 24/7 multilingual support&lt;/p>
 &lt;/figcaption>
&lt;/figure>

&lt;h2 id="2-customer-acquisition-nightmare-precision-marketing-with-ai">
 2. Customer Acquisition Nightmare: Precision Marketing with AI
 &lt;a class="heading-link" href="#2-customer-acquisition-nightmare-precision-marketing-with-ai">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h2>
&lt;p>&lt;strong>The Pain Point&lt;/strong>: Traditional advertising feels like throwing money into a black hole. Private domain traffic management is complex, and customer acquisition costs keep rising.&lt;/p>
&lt;h3 id="ai-marketing-arsenal">
 AI Marketing Arsenal:
 &lt;a class="heading-link" href="#ai-marketing-arsenal">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h3>
&lt;p>&lt;strong>Intelligent Advertising Optimization&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Meta Advantage+&lt;/strong> and &lt;strong>Google AI&lt;/strong> advertising deliver precise targeting with continuous optimization&lt;/li>
&lt;li>&lt;strong>ChatGPT&lt;/strong> and &lt;strong>Copy.ai&lt;/strong> generate high-converting copy for multiple platforms&lt;/li>
&lt;li>&lt;strong>Jasper AI&lt;/strong> creates entire content campaigns in minutes&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Private Domain Intelligence&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>HubSpot&amp;rsquo;s AI&lt;/strong> identifies high-value prospects and personalizes outreach&lt;/li>
&lt;li>&lt;strong>Silicon-based outbound systems&lt;/strong> automate lead qualification&lt;/li>
&lt;li>&lt;strong>Klaviyo&amp;rsquo;s AI&lt;/strong> predicts customer lifetime value and optimal engagement timing&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Measurable Results&lt;/strong>: 20-40% reduction in advertising costs, 50%+ improvement in conversion rates, and predictable customer acquisition pipelines.&lt;/p>
&lt;figure>&lt;img src="https://deniskisina.dev/posts/sme-ai-transformation-secrets/ai-marketing-dashboard.jpg"
 alt="Marketing analytics dashboard showing AI-optimized campaigns with conversion metrics and ROI data" width="100%">&lt;figcaption>
 &lt;p>AI marketing tools deliver precise targeting and campaign optimization, reducing advertising costs by 20-40%&lt;/p>
 &lt;/figcaption>
&lt;/figure>

&lt;h2 id="3-data-driven-decision-making-from-gut-feelings-to-ai-insights">
 3. Data-Driven Decision Making: From Gut Feelings to AI Insights
 &lt;a class="heading-link" href="#3-data-driven-decision-making-from-gut-feelings-to-ai-insights">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h2>
&lt;p>&lt;strong>The Pain Point&lt;/strong>: Inventory management based on intuition, unpredictable cash flow, and reactive rather than proactive business planning.&lt;/p>
&lt;h3 id="ai-analytics-powerhouse">
 AI Analytics Powerhouse:
 &lt;a class="heading-link" href="#ai-analytics-powerhouse">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h3>
&lt;p>&lt;strong>Predictive Intelligence&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Microsoft Power BI&lt;/strong> and &lt;strong>Tableau&lt;/strong> with AI provide automated trend analysis&lt;/li>
&lt;li>&lt;strong>QuickBooks AI&lt;/strong> offers real-time cash flow monitoring and risk alerts&lt;/li>
&lt;li>&lt;strong>DeepSeek&lt;/strong> transforms Excel data into actionable insights without complex formulas&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Competitive Intelligence&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Bright Data&lt;/strong> automatically tracks competitor pricing and product launches&lt;/li>
&lt;li>&lt;strong>Perplexity AI&lt;/strong> generates comprehensive market research reports&lt;/li>
&lt;li>&lt;strong>Crayon&lt;/strong> monitors competitor content and marketing strategies&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Business Impact&lt;/strong>: 30% reduction in inventory waste, 3x faster decision-making speed, and proactive risk management.&lt;/p>
&lt;figure>&lt;img src="https://deniskisina.dev/posts/sme-ai-transformation-secrets/ai-analytics-dashboard.jpg"
 alt="Business intelligence dashboard with predictive analytics, cash flow forecasting, and inventory optimization charts" width="100%">&lt;figcaption>
 &lt;p>AI analytics transform raw data into actionable insights, enabling 3x faster decision-making and proactive risk management&lt;/p>
 &lt;/figcaption>
&lt;/figure>

&lt;h2 id="4-product-innovation-bottleneck-ai-accelerated-development">
 4. Product Innovation Bottleneck: AI-Accelerated Development
 &lt;a class="heading-link" href="#4-product-innovation-bottleneck-ai-accelerated-development">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h2>
&lt;p>&lt;strong>The Pain Point&lt;/strong>: Lengthy design cycles, unclear user requirements, and products that miss market timing.&lt;/p>
&lt;h3 id="ai-innovation-accelerators">
 AI Innovation Accelerators:
 &lt;a class="heading-link" href="#ai-innovation-accelerators">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h3>
&lt;p>&lt;strong>Rapid Prototyping&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Midjourney&lt;/strong> and &lt;strong>DALL-E&lt;/strong> create product concepts in minutes&lt;/li>
&lt;li>&lt;strong>Figma AI&lt;/strong> generates design variations and user flows&lt;/li>
&lt;li>&lt;strong>GitHub Copilot&lt;/strong> accelerates custom software development&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>User-Centric Development&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>MonkeyLearn&lt;/strong> analyzes customer feedback for feature prioritization&lt;/li>
&lt;li>&lt;strong>Hotjar AI&lt;/strong> identifies user behavior patterns and pain points&lt;/li>
&lt;li>&lt;strong>Amplitude AI&lt;/strong> predicts feature adoption and user engagement&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Service Personalization&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Ada Health&lt;/strong> provides AI-powered preliminary consultations&lt;/li>
&lt;li>&lt;strong>Khanmigo&lt;/strong> creates personalized learning experiences&lt;/li>
&lt;li>&lt;strong>Intercom&amp;rsquo;s Resolution Bot&lt;/strong> delivers contextual customer support&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Innovation Velocity&lt;/strong>: 50% shorter development cycles, data-driven feature decisions, and higher customer satisfaction scores.&lt;/p>
&lt;figure>&lt;img src="https://deniskisina.dev/posts/sme-ai-transformation-secrets/ai-product-design.jpg"
 alt="Split screen showing traditional design process vs AI-accelerated design with Midjourney and Figma AI generating prototypes" width="100%">&lt;figcaption>
 &lt;p>AI design tools like Midjourney and Figma AI reduce product development cycles by 50%&lt;/p>
 &lt;/figcaption>
&lt;/figure>

&lt;h2 id="5-legal-and-compliance-risks-ai-as-your-digital-legal-guardian">
 5. Legal and Compliance Risks: AI as Your Digital Legal Guardian
 &lt;a class="heading-link" href="#5-legal-and-compliance-risks-ai-as-your-digital-legal-guardian">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h2>
&lt;p>&lt;strong>The Pain Point&lt;/strong>: Contract vulnerabilities, time-consuming legal processes, and crisis management reactivity.&lt;/p>
&lt;h3 id="ai-compliance-suite">
 AI Compliance Suite:
 &lt;a class="heading-link" href="#ai-compliance-suite">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h3>
&lt;p>&lt;strong>Contract Intelligence&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>LawGeex&lt;/strong> reviews contracts in 10 minutes with 94% accuracy&lt;/li>
&lt;li>&lt;strong>Ironclad AI&lt;/strong> generates standard contracts and tracks obligations&lt;/li>
&lt;li>&lt;strong>Kira Systems&lt;/strong> extracts key terms and identifies potential risks&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Reputation Management&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Brandwatch&lt;/strong> monitors brand mentions across digital channels&lt;/li>
&lt;li>&lt;strong>Crisis GPT&lt;/strong> generates real-time response strategies&lt;/li>
&lt;li>&lt;strong>Hootsuite Insights&lt;/strong> predicts potential PR issues before they escalate&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Risk Mitigation&lt;/strong>: 70% reduction in legal risks, 5x faster crisis response, and proactive compliance monitoring.&lt;/p>
&lt;figure>&lt;img src="https://deniskisina.dev/posts/sme-ai-transformation-secrets/ai-legal-compliance.jpg"
 alt="Legal AI interface showing contract analysis, risk assessment, and compliance monitoring dashboard" width="100%">&lt;figcaption>
 &lt;p>AI legal tools like LawGeex review contracts with 94% accuracy in 10 minutes, reducing legal risks by 70%&lt;/p>
 &lt;/figcaption>
&lt;/figure>

&lt;h2 id="6-cost-effective-ai-implementation-your-practical-roadmap">
 6. Cost-Effective AI Implementation: Your Practical Roadmap
 &lt;a class="heading-link" href="#6-cost-effective-ai-implementation-your-practical-roadmap">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h2>
&lt;h3 id="sme-friendly-ai-tool-stack">
 SME-Friendly AI Tool Stack:
 &lt;a class="heading-link" href="#sme-friendly-ai-tool-stack">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Business Function&lt;/th>
&lt;th>Recommended Tools&lt;/th>
&lt;th>Monthly Cost&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Customer Service Automation&lt;/td>
&lt;td>Zoho Chatbot, Intercom&lt;/td>
&lt;td>$0-$500&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Content Generation&lt;/td>
&lt;td>ChatGPT Plus, Copy.ai&lt;/td>
&lt;td>$100-$500&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Data Analytics&lt;/td>
&lt;td>Power BI, Google Analytics AI&lt;/td>
&lt;td>$60-$300&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Design Assistance&lt;/td>
&lt;td>Midjourney, Canva AI&lt;/td>
&lt;td>$200-$400&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Legal Compliance&lt;/td>
&lt;td>LawGeex (pay-per-use)&lt;/td>
&lt;td>$50-$300 per review&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Process Automation&lt;/td>
&lt;td>Zapier, UiPath Community&lt;/td>
&lt;td>$0-$400&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="implementation-strategy">
 Implementation Strategy:
 &lt;a class="heading-link" href="#implementation-strategy">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h3>
&lt;ol>
&lt;li>&lt;strong>Start with Pain Points&lt;/strong>: Identify your most time-consuming processes&lt;/li>
&lt;li>&lt;strong>Pilot Programs&lt;/strong>: Test one tool at a time to validate ROI&lt;/li>
&lt;li>&lt;strong>No-Code First&lt;/strong>: Prioritize tools requiring minimal technical expertise&lt;/li>
&lt;li>&lt;strong>Measure Everything&lt;/strong>: Track time savings, cost reduction, and quality improvements&lt;/li>
&lt;li>&lt;strong>Scale Gradually&lt;/strong>: Expand successful implementations across departments&lt;/li>
&lt;/ol>
&lt;figure>&lt;img src="https://deniskisina.dev/posts/sme-ai-transformation-secrets/ai-implementation-roadmap.jpg"
 alt="Infographic showing AI implementation phases from pilot to scale with timeline and key milestones" width="100%">&lt;figcaption>
 &lt;p>Strategic AI implementation roadmap: Start small, measure impact, scale gradually&lt;/p>
 &lt;/figcaption>
&lt;/figure>

&lt;h2 id="the-sme-ai-advantage">
 The SME AI Advantage
 &lt;a class="heading-link" href="#the-sme-ai-advantage">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h2>
&lt;p>What I find fascinating is that SMEs often implement AI faster than large enterprises. Without legacy system constraints and bureaucratic approval processes, they can deploy solutions in weeks rather than months.&lt;/p>
&lt;p>&lt;strong>Key Success Factors I&amp;rsquo;ve Observed:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Leadership buy-in&lt;/strong> from day one&lt;/li>
&lt;li>&lt;strong>Employee training&lt;/strong> focused on AI collaboration rather than replacement&lt;/li>
&lt;li>&lt;strong>Iterative improvement&lt;/strong> based on real usage data&lt;/li>
&lt;li>&lt;strong>Vendor partnerships&lt;/strong> that provide ongoing support and optimization&lt;/li>
&lt;/ul>
&lt;h2 id="looking-forward-the-ai-native-sme">
 Looking Forward: The AI-Native SME
 &lt;a class="heading-link" href="#looking-forward-the-ai-native-sme">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h2>
&lt;p>The SMEs implementing AI today aren&amp;rsquo;t just solving current problems—they&amp;rsquo;re building sustainable competitive advantages. As AI capabilities continue advancing, these early adopters will have the experience, processes, and culture to leverage new developments immediately.&lt;/p>
&lt;p>&lt;strong>My Prediction&lt;/strong>: Within two years, AI adoption will be the primary differentiator between thriving SMEs and those struggling to compete. The tools exist, the costs are manageable, and the benefits are proven.&lt;/p>
&lt;p>The question isn&amp;rsquo;t whether your SME should adopt AI—it&amp;rsquo;s how quickly you can start and how strategically you can implement it.&lt;/p>
&lt;figure>&lt;img src="https://deniskisina.dev/posts/sme-ai-transformation-secrets/ai-future-sme.jpg"
 alt="Modern small business office with employees collaborating with AI tools, showing the future of AI-native SMEs" width="100%">&lt;figcaption>
 &lt;p>The future belongs to AI-native SMEs that can adapt quickly and implement strategically&lt;/p>
 &lt;/figcaption>
&lt;/figure>

&lt;hr>
&lt;p>&lt;em>Are you an SME owner exploring AI implementation? I&amp;rsquo;d love to hear about your challenges and successes. Connect with me on &lt;a href="https://www.linkedin.com/in/denis-kisina/">LinkedIn&lt;/a> to continue the conversation about practical AI adoption strategies.&lt;/em>&lt;/p>
&lt;p>&lt;strong>About the Author&lt;/strong>: Denis Kisina is a Software Engineer specializing in enterprise AI integration and digital transformation. He helps organizations implement practical AI solutions that deliver measurable business value while maintaining operational excellence.&lt;/p></description></item><item><title>Migrating from WordPress to Hugo</title><link>https://deniskisina.dev/migrate-from-wordpress-to-hugo/</link><pubDate>Mon, 08 Jul 2024 06:15:22 -0500</pubDate><guid>https://deniskisina.dev/migrate-from-wordpress-to-hugo/</guid><description>&lt;p>This past weekend, I switched this blog site from WordPress to &lt;a href="https://gohugo.io/">Hugo&lt;/a>, a static site generator.&lt;/p>
&lt;p>I checked out Hugo a few weeks back and was surprised at how user-friendly it was. Getting started felt smooth and effortless.&lt;/p>
&lt;p>In this post, I will explain why I switched from WordPress and how I successfully migrated my site in just a few hours on a weekend afternoon.&lt;/p>
&lt;h2 id="why-i-moved-from-wordpress-to-hugo">
 Why I moved from WordPress to Hugo
 &lt;a class="heading-link" href="#why-i-moved-from-wordpress-to-hugo">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h2>
&lt;p>WordPress has been my go-to anytime I need to build something without custom features or significant user-generated content. WordPress and the plethora of plugins were easy enough to set up and maintain.&lt;/p>
&lt;p>While WordPress offers a lot of flexibility, I found it a bit feature-heavy for my simple blogging needs and has no version control.&lt;/p>
&lt;h2 id="why-hugo">
 Why Hugo
 &lt;a class="heading-link" href="#why-hugo">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h2>
&lt;p>You can search for &amp;ldquo;WordPress to Hugo&amp;rdquo; on Google and find numerous posts discussing why people make the switch. Here are my reasons:&lt;/p>
&lt;ul>
&lt;li>It is blazing fast. My blog builds in ~ 1 second.&lt;/li>
&lt;li>Content as Markdown. Owning your content and knowing it&amp;rsquo;s not locked up with a vendor or in a database gives you peace of mind.&lt;/li>
&lt;li>I like working with plain old HTML and CSS. The templating language allows me to do that.&lt;/li>
&lt;li>The development and support community are top-notch.&lt;/li>
&lt;li>Host the built site anywhere you want.&lt;/li>
&lt;li>Hugo&amp;rsquo;s single binary (few dependencies) makes it incredibly portable.&lt;/li>
&lt;/ul>
&lt;h2 id="getting-started">
 Getting Started
 &lt;a class="heading-link" href="#getting-started">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h2>
&lt;p>Setting up a local environment is easy, quick, and lightweight. Visit the official site and follow the &lt;a href="https://gohugo.io/installation/">documentation&lt;/a> there.&lt;/p>
&lt;p>I run macOS, so &lt;a href="https://gohugo.io/installation/macos/">installing Hugo&lt;/a> was easy.&lt;/p>
&lt;p>Once that&amp;rsquo;s done, select a &lt;a href="https://themes.gohugo.io/">theme&lt;/a> and follow its instructions, and you are good to go.&lt;/p>
&lt;p>This blog runs on &lt;a href="https://github.com/luizdepra/hugo-coder/">Hugo-Coder&lt;/a> theme.&lt;/p>
&lt;h2 id="migrating-content">
 Migrating content
 &lt;a class="heading-link" href="#migrating-content">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h2>
&lt;p>Hugo&amp;rsquo;s &lt;a href="https://gohugo.io/tools/migrations/#wordpress">official migration tutorial&lt;/a> recommends several tools to export posts from WordPress.&lt;/p>
&lt;p>I used the &lt;a href="https://github.com/lonekorean/wordpress-export-to-markdown">wordpress-export-to-markdown&lt;/a> converter, which produced much cleaner output, but no comments.&lt;/p>
&lt;p>I also tried the below tools as well, but settled on the above:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://github.com/SchumacherFM/wordpress-to-hugo-exporter?tab=readme-ov-file">SchumacherFM/wordpress-to-hugo-exporter&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/palaniraja/blog2md">Blogger to Markdown&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/lonekorean/wordpress-export-to-markdown">wordpress-export-to-markdown&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="keep-urls-unchanged">
 Keep URLs Unchanged
 &lt;a class="heading-link" href="#keep-urls-unchanged">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h2>
&lt;p>Another crucial issue after transitioning to Hugo is ensuring that the previous URLs remain unchanged. On one hand, the new URLs of posts should stay consistent with those in WordPress. In my situation, I incorporated the following settings into the Hugo configuration.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yml" data-lang="yml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">permalinks&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">page&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">posts&lt;/span>: &lt;span style="color:#e6db74">&amp;#39;/:year/:month/:slug/&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">projects&lt;/span>: &lt;span style="color:#e6db74">&amp;#39;/project/:slug/&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">section&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">posts&lt;/span>: &lt;span style="color:#e6db74">&amp;#39;/blog&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">projects&lt;/span>: &lt;span style="color:#e6db74">&amp;#39;/projects&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>This is &lt;a href="https://gohugo.io/content-management/urls/">documented&lt;/a> and can cover various scenarios.&lt;/p>
&lt;h2 id="publish-to-webserver">
 Publish to webserver
 &lt;a class="heading-link" href="#publish-to-webserver">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h2>
&lt;p>Deploying the website was a breeze. Run &lt;code>hugo server&lt;/code> to generate the static content. This creates a &lt;code>/public&lt;/code> folder that you can compress into a ZIP and securely transfer to your web server via SFTP.&lt;/p>
&lt;p>I set up a GitHub Actions workflow based on this &lt;a href="https://zartman.xyz/blog/gh-static-deploy/">post&lt;/a> to automate this process. This workflow streamlines site-building and synchronizes it with the web server using rsync.&lt;/p></description></item><item><title>Conquering Your System Design Interview: A Book Guide</title><link>https://deniskisina.dev/conquering-your-system-design-interview-book-guide/</link><pubDate>Mon, 03 Jun 2024 08:26:06 -0500</pubDate><guid>https://deniskisina.dev/conquering-your-system-design-interview-book-guide/</guid><description>&lt;p>System design interviews are nerve-wracking but essential to the software engineering interview process. These interviews assess your ability to design scalable, reliable, and maintainable software systems. But fear not! With the right study materials, you can confidently approach your next system design interview. This guide highlights various resources, from foundational texts to interview prep guides, to help you ace your interview.&lt;/p>
&lt;h2 id="building-your-foundation">
 Building Your Foundation
 &lt;a class="heading-link" href="#building-your-foundation">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Designing Data-Intensive Applications by Martin Kleppmann:&lt;/strong> This classic text explores data management challenges in large-scale systems. Kleppmann dives deep into data storage solutions, scalability considerations, and how to design data pipelines. While not strictly an interview prep guide, this book provides a strong foundation for understanding the core principles of system design.&lt;/li>
&lt;li>&lt;strong>Designing Distributed Systems by Brendan Burns:&lt;/strong> If you’re looking for a more theoretical approach, Designing Distributed Systems offers a comprehensive overview of distributed system concepts. This book covers consistency models, fault tolerance, and distributed transactions. Grasping these fundamental concepts will equip you to tackle various system design problems.&lt;/li>
&lt;/ul>
&lt;h2 id="sharpening-your-interview-skills">
 Sharpening Your Interview Skills
 &lt;a class="heading-link" href="#sharpening-your-interview-skills">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>System Design Interview – An Insider’s Guide (Volume 1 &amp;amp; 2) by Alex Xu:&lt;/strong> This two-volume set provides a comprehensive approach to system design interviewing. Author Alex Xu, a former Facebook engineer, shares practical advice on approaching common system design problems and presents detailed explanations for various systems, from photo-sharing applications to news feeds.&lt;/li>
&lt;li>&lt;strong>Grokking the System Design Interview:&lt;/strong> This popular online course offers a structured approach to preparing for system design interviews. It includes lectures, practice problems, and mock interviews to help you hone your problem-solving and communication skills.&lt;/li>
&lt;li>&lt;strong>Grokking Microservice Design Patterns and Grokking the Advanced System Design Interview:&lt;/strong> If you’re looking to take your preparation a step further, consider these Grokking companion courses. These resources delve deeper into specific design patterns and advanced system design concepts.&lt;/li>
&lt;/ul>
&lt;h2 id="for-those-getting-hands-on">
 For Those Getting Hands-On
 &lt;a class="heading-link" href="#for-those-getting-hands-on">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Hands-On System Design: Learn System Design, Scaling Applications, Software Development Design Patterns with Real Use-Cases by Harsh Kumar Ramchandani:&lt;/strong> This resource offers a practical approach to system design, focusing on real-world use cases. Through this book, you’ll gain experience designing systems for common applications like social media platforms and e-commerce sites.&lt;/li>
&lt;/ul>
&lt;h2 id="beyond-the-technical">
 Beyond the Technical
 &lt;a class="heading-link" href="#beyond-the-technical">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>The Design of the Design: Essays of a Computer Scientist by Frederick P. Brooks Jr.:&lt;/strong> This thought-provoking book explores the art and philosophy of system design from a broader perspective. While not directly focused on technical details, Brooks’ insights on design principles and decision-making can be invaluable for any aspiring system designer.&lt;/li>
&lt;/ul>
&lt;h2 id="for-the-truly-enthusiastic">
 For the Truly Enthusiastic
 &lt;a class="heading-link" href="#for-the-truly-enthusiastic">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Synchronization Algorithms and Concurrent Programming by Gadi Taubenfield:&lt;/strong> This text dives into the complexities of concurrent programming, a critical skill for designing scalable and reliable distributed systems. This book is a deep dive and is recommended for those with a strong foundation in programming concepts.&lt;/li>
&lt;/ul>
&lt;p>This list provides a starting point for your system design interview preparation journey. The best resources for you will depend on your current knowledge base and learning style. So, grab a book, explore some online courses, and get ready to impress your interviewers with your system design prowess!&lt;/p></description></item><item><title>Configuring Spring Boot Application with AWS Secrets Manager</title><link>https://deniskisina.dev/configuring-springboot-app-with-aws-secrets-manager/</link><pubDate>Wed, 08 May 2024 08:12:10 -0500</pubDate><guid>https://deniskisina.dev/configuring-springboot-app-with-aws-secrets-manager/</guid><description>&lt;p>In modern application development, securely managing and storing sensitive data, such as private keys, service account numbers, and environment-specific configurations, is crucial. Recently, we faced a challenge where we needed to move our Spring Boot application’s secrets and configuration data from GitLab’s deployment platform storage and Docker System Environment variables to AWS Secrets Manager.&lt;/p>
&lt;p>Initially, our application was connecting to the PostgreSQL database using properties passed through the pipeline environment. However, to integrate with AWS Secrets Manager, we needed to restructure and refactor the application’s flow.&lt;/p>
&lt;h2 id="understanding-java-apis-for-environment-configuration">
 Understanding Java APIs for Environment Configuration
 &lt;a class="heading-link" href="#understanding-java-apis-for-environment-configuration">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h2>
&lt;p>Java provides several APIs to interact with the application’s environment, including retrieving and setting environment variables. One such API is &lt;strong>System.getenv()&lt;/strong>, which returns a &lt;strong>Map&amp;lt;String, String&amp;gt;&lt;/strong> containing the current system environment variables.&lt;/p>
&lt;p>Example&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-java" data-lang="java">&lt;span style="display:flex;">&lt;span>Map&lt;span style="color:#f92672">&amp;lt;&lt;/span>String, String&lt;span style="color:#f92672">&amp;gt;&lt;/span> env &lt;span style="color:#f92672">=&lt;/span> System.&lt;span style="color:#a6e22e">getenv&lt;/span>();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">for&lt;/span> (Map.&lt;span style="color:#a6e22e">Entry&lt;/span>&lt;span style="color:#f92672">&amp;lt;&lt;/span>String, String&lt;span style="color:#f92672">&amp;gt;&lt;/span> entry : env.&lt;span style="color:#a6e22e">entrySet&lt;/span>()) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> System.&lt;span style="color:#a6e22e">out&lt;/span>.&lt;span style="color:#a6e22e">println&lt;/span>(entry.&lt;span style="color:#a6e22e">getKey&lt;/span>() &lt;span style="color:#f92672">+&lt;/span> &lt;span style="color:#e6db74">&amp;#34;=&amp;#34;&lt;/span> &lt;span style="color:#f92672">+&lt;/span> entry.&lt;span style="color:#a6e22e">getValue&lt;/span>());
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="integrating-aws-secrets-manager-with-spring-boot">
 Integrating AWS Secrets Manager with Spring Boot
 &lt;a class="heading-link" href="#integrating-aws-secrets-manager-with-spring-boot">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h2>
&lt;p>To integrate AWS Secrets Manager with our Spring Boot application, we used the &lt;code>aws-java-sdk-secretsmanager&lt;/code> library provided by AWS. This library allows us to retrieve secrets from AWS Secrets Manager and use them in our application.&lt;/p>
&lt;p>Example&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-java" data-lang="java">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">import&lt;/span> software.amazon.awssdk.services.secretsmanager.SecretsManagerClient;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">import&lt;/span> software.amazon.awssdk.services.secretsmanager.model.GetSecretValueRequest;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">import&lt;/span> software.amazon.awssdk.services.secretsmanager.model.GetSecretValueResponse;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>SecretsManagerClient secretsManager &lt;span style="color:#f92672">=&lt;/span> SecretsManagerClient.&lt;span style="color:#a6e22e">builder&lt;/span>().&lt;span style="color:#a6e22e">build&lt;/span>();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>GetSecretValueRequest getSecretValueRequest &lt;span style="color:#f92672">=&lt;/span> GetSecretValueRequest.&lt;span style="color:#a6e22e">builder&lt;/span>()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> .&lt;span style="color:#a6e22e">secretId&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;YOUR_SECRET_ARN&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> .&lt;span style="color:#a6e22e">build&lt;/span>();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>GetSecretValueResponse getSecretValueResponse &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">null&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">try&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> getSecretValueResponse &lt;span style="color:#f92672">=&lt;/span> secretsManager.&lt;span style="color:#a6e22e">getSecretValue&lt;/span>(getSecretValueRequest);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>} &lt;span style="color:#66d9ef">catch&lt;/span> (Exception e) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// Handle the exception&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">if&lt;/span> (getSecretValueResponse.&lt;span style="color:#a6e22e">secretString&lt;/span>() &lt;span style="color:#f92672">!=&lt;/span> &lt;span style="color:#66d9ef">null&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> String secretValue &lt;span style="color:#f92672">=&lt;/span> getSecretValueResponse.&lt;span style="color:#a6e22e">secretString&lt;/span>();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// Use the secret value in your application&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>In this example, we first create an instance of &lt;strong>SecretsManagerClient&lt;/strong> and then use the &lt;strong>getSecretValue&lt;/strong> method to retrieve the secret value from AWS Secrets Manager.
The &lt;strong>secretId&lt;/strong> parameter is the ARN (Amazon Resource Name) of the secret you want to retrieve.
Once we have the secret value, we can use it in our application, such as setting environment variables or configuring database connections.&lt;/p>
&lt;h2 id="conclusion">
 Conclusion
 &lt;a class="heading-link" href="#conclusion">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h2>
&lt;p>By integrating AWS Secrets Manager with our Spring Boot application, we can securely store and retrieve sensitive data, such as database credentials and API keys. This approach improves the security and maintainability of our application, as we no longer need to store sensitive data in version control systems or Docker environment variables.&lt;/p></description></item><item><title>How Go Gained Ground in the Programming World</title><link>https://deniskisina.dev/go-language-growth-in-programming-world/</link><pubDate>Wed, 14 Feb 2024 07:50:48 -0500</pubDate><guid>https://deniskisina.dev/go-language-growth-in-programming-world/</guid><description>&lt;p>Google’s &lt;a href="https://go.dev/">Go language, or Golang&lt;/a>, has achieved a remarkable feat: it has climbed to the eighth spot in the Tiobe index of programming language popularity after being absent from the top 10 for almost six years. The last time Go was in the top 10 was in July 2017, when it ranked ninth. What explains this resurgence of Go, and what makes it a compelling choice for developers today?&lt;/p>
&lt;p>&lt;a href="https://go.dev/">Go&lt;/a> was first announced by Google in November 2009 as a language that aimed to combine the simplicity and readability of Python with the performance and concurrency of C++. It quickly gained attention and popularity, winning the Tiobe Language of the Year award in 2009. However, the hype faded, and Go dropped to 122nd in the Tiobe index in 2015.&lt;/p>
&lt;p>The &lt;a href="https://www.tiobe.com/tiobe-index/">Tiobe index&lt;/a> measures the popularity of programming languages through a formula that evaluates the number of skilled engineers, courses, and third-party vendors for each language based on searches of Google, Bing, Wikipedia, and other websites.&lt;/p>
&lt;p>But &lt;a href="https://go.dev/">Go&lt;/a> did not give up. It adopted a strict release cycle every six months, backed by Google’s support and resources. It also improved its features and syntax, making the language more expressive and powerful. Go also benefited from the rise of cloud computing and containerization. Go is preferred for building scalable, distributed, and microservice-based applications.&lt;/p>
&lt;p>Today, &lt;a href="https://go.dev/">Go&lt;/a> is used in many software domains, such as web development, Cloud &amp;amp; Network Services, Command-line Interfaces (CLIs), and Development Operations &amp;amp; Site Reliability Engineering. It has a large and active community of developers contributing to its open-source ecosystem and libraries. It also has a reputation for being fast, reliable, and easy to learn and use. According to the Tiobe index, Go has a rating of 1.73%, which means it is used by 1.73% of all software engineers worldwide.&lt;/p>
&lt;p>Go’s rise in the Tiobe index is a testament to its resilience and relevance in the modern programming world. It shows that Go has overcome its initial challenges and established itself as a viable and valuable language for many use cases. &lt;a href="https://go.dev/">Go&lt;/a> is here to stay, and it might even surpass some of the big four languages (Python, C, C++, and Java) in the near future.&lt;/p></description></item><item><title>Understanding Software Design Patterns</title><link>https://deniskisina.dev/understanding-software-design-patterns/</link><pubDate>Fri, 09 Feb 2024 07:14:06 -0500</pubDate><guid>https://deniskisina.dev/understanding-software-design-patterns/</guid><description>&lt;p>Software design patterns are general, reusable solutions to commonly occurring problems within a given context in software design. They represent best practices and can speed development by providing tested, proven development paradigms.&lt;/p>
&lt;h2 id="categories-of-patterns">
 Categories of Patterns
 &lt;a class="heading-link" href="#categories-of-patterns">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h2>
&lt;p>Design patterns can be categorized based on their intent or purpose. There are 3 broad categories that design patterns are dived into - &lt;strong>Creational&lt;/strong>, &lt;strong>Structural&lt;/strong>, and &lt;strong>Behavioral&lt;/strong>&lt;/p>
&lt;h3 id="creational-patterns">
 Creational Patterns
 &lt;a class="heading-link" href="#creational-patterns">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h3>
&lt;p>Creational patterns deal with object creation mechanisms, trying to create objects in a manner suitable to the situation. The basic form of object creation could result in design problems or add complexity to the design. Creational design patterns solve this problem by controlling the creation of this object. Examples include:&lt;/p>
&lt;ul>
&lt;li>Factory Method&lt;/li>
&lt;li>Abstract Factory&lt;/li>
&lt;li>Builder&lt;/li>
&lt;li>Singleton&lt;/li>
&lt;/ul>
&lt;h3 id="structural-patterns">
 Structural Patterns
 &lt;a class="heading-link" href="#structural-patterns">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h3>
&lt;p>Structural patterns explain how to assemble objects and classes into larger structures while keeping the structures flexible and efficient. Examples include:&lt;/p>
&lt;ul>
&lt;li>Composite&lt;/li>
&lt;li>Decorator&lt;/li>
&lt;li>Facade&lt;/li>
&lt;li>Adapter&lt;/li>
&lt;li>Proxy&lt;/li>
&lt;/ul>
&lt;h3 id="behavioral-patterns">
 Behavioral Patterns
 &lt;a class="heading-link" href="#behavioral-patterns">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h3>
&lt;p>Behavioral patterns are about identifying common communication patterns between objects and realizing these patterns. Examples include:&lt;/p>
&lt;ul>
&lt;li>State&lt;/li>
&lt;li>Command&lt;/li>
&lt;li>Chain of Responsibility&lt;/li>
&lt;li>Observer&lt;/li>
&lt;li>Strategy&lt;/li>
&lt;li>Iterator&lt;/li>
&lt;li>Mediator&lt;/li>
&lt;li>Template&lt;/li>
&lt;/ul>
&lt;h2 id="design-principles">
 Design Principles
 &lt;a class="heading-link" href="#design-principles">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h2>
&lt;p>Design principles guide us to design better software. They are like a beacon guiding a lost sailor. The most important principles are “Keep it simple” and “Loose coupling.” Other principles include:&lt;/p>
&lt;ul>
&lt;li>Keep it flexible&lt;/li>
&lt;li>Separation of concern&lt;/li>
&lt;li>Principle of modularity&lt;/li>
&lt;li>DRY: don’t repeat yourself&lt;/li>
&lt;li>SOLID: Single responsibility principle, open-closed principle, Liskov substitution principle, Interface segregation principle, Dependency inversion principle&lt;/li>
&lt;/ul>
&lt;h2 id="facade-service-class">
 Facade (Service class)
 &lt;a class="heading-link" href="#facade-service-class">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h2>
&lt;p>The Facade pattern provides a unified interface to a set of interfaces in a subsystem. Facade defines a higher-level interface that makes the subsystem easier to use. Advantages include:&lt;/p>
&lt;ul>
&lt;li>Shields clients from subsystem components, thereby reducing the number of objects that clients deal with, making the system easier to use.&lt;/li>
&lt;li>Promotes weak coupling between the client and subsystem.&lt;/li>
&lt;/ul>
&lt;h2 id="strategy-pattern">
 Strategy Pattern
 &lt;a class="heading-link" href="#strategy-pattern">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h2>
&lt;p>The Strategy pattern defines a family of algorithms, encapsulates each one, and makes them interchangeable. Strategy lets the algorithm vary independently from clients that use it.&lt;/p>
&lt;p>Advantages include:&lt;/p>
&lt;ul>
&lt;li>We can easily add new algorithms without changing the context class.&lt;/li>
&lt;li>The Strategies are better reusable.&lt;/li>
&lt;li>Very extendable.&lt;/li>
&lt;/ul>
&lt;p>Disadvantages include:&lt;/p>
&lt;ul>
&lt;li>Clients must know the existence of different strategies, and a client must understand how the strategies differ.&lt;/li>
&lt;li>It increases the number of objects in the application.&lt;/li>
&lt;/ul>
&lt;h2 id="template-method">
 Template Method
 &lt;a class="heading-link" href="#template-method">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h2>
&lt;p>The Template Method pattern defines the skeleton of an algorithm in a superclass but lets subclasses override specific steps of the algorithm without changing its structure. Advantages include:&lt;/p>
&lt;ul>
&lt;li>No code duplication.&lt;/li>
&lt;li>Reusable code.&lt;/li>
&lt;li>Easy to implement and readable.&lt;/li>
&lt;li>Flexible.&lt;/li>
&lt;li>Clean Architecture.&lt;/li>
&lt;/ul>
&lt;p>Disadvantages include:&lt;/p>
&lt;ul>
&lt;li>It might violate the Liskov Substitution principle by suppressing a default step implementation via a subclass.&lt;/li>
&lt;li>Enforces a particular design.&lt;/li>
&lt;li>Maintenance issue.&lt;/li>
&lt;/ul>
&lt;h2 id="observer-pattern">
 Observer Pattern
 &lt;a class="heading-link" href="#observer-pattern">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h2>
&lt;p>The Observer pattern defines a one-to-many dependency between objects so that all its dependents are notified and updated automatically when one object changes state. Advantages include:&lt;/p>
&lt;ul>
&lt;li>Loose coupling.&lt;/li>
&lt;li>Open closed principle.&lt;/li>
&lt;li>Easy to add new observers.&lt;/li>
&lt;/ul>
&lt;h2 id="composite-pattern">
 Composite Pattern
 &lt;a class="heading-link" href="#composite-pattern">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h2>
&lt;p>The Composite pattern composes objects into tree structures to represent part-whole hierarchies. Composite lets clients treat individual objects and compositions of objects uniformly. Advantages include:&lt;/p>
&lt;ul>
&lt;li>Lean, easy-to-understand code.&lt;/li>
&lt;li>Great expandability.&lt;/li>
&lt;/ul>
&lt;p>Disadvantages include:&lt;/p>
&lt;ul>
&lt;li>Complicate implementation.&lt;/li>
&lt;/ul>
&lt;h2 id="iterator-pattern">
 Iterator Pattern
 &lt;a class="heading-link" href="#iterator-pattern">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h2>
&lt;p>The Iterator pattern provides a way to access the elements of an aggregate object sequentially without exposing its underlying representation.&lt;/p>
&lt;h2 id="command-pattern">
 Command Pattern
 &lt;a class="heading-link" href="#command-pattern">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h2>
&lt;p>The Command pattern encapsulates a request as an object, letting you parameterize clients with queues, requests, and operations.&lt;/p>
&lt;p>In conclusion, understanding and applying design patterns improves code readability, testability, and maintainability and allows developers to communicate using well-known, understood terminology.&lt;/p></description></item><item><title>What is the Difference Between replace() vs. replaceAll() method in Java String Class?</title><link>https://deniskisina.dev/java-replace-vs-replaceall-method/</link><pubDate>Sat, 07 Oct 2023 10:51:34 -0500</pubDate><guid>https://deniskisina.dev/java-replace-vs-replaceall-method/</guid><description>&lt;p>Although the String java class methods &lt;strong>replace()&lt;/strong> and &lt;strong>replaceAll()&lt;/strong> replace occurrences in a string with a given character or string, they serve different purposes and work differently internally. Knowing how both methods work is essential to understand why one option is preferable.&lt;/p>
&lt;p>In this article, I will explain the difference between &lt;strong>replace&lt;/strong> vs. &lt;strong>replaceAll&lt;/strong> methods in the Java String class.&lt;/p>
&lt;h2 id="java-stringreplace-method">
 Java String.replace() method: 
 &lt;a class="heading-link" href="#java-stringreplace-method">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h2>
&lt;p>The method creates a new String object where specified characters or substrings are replaced with new ones.&lt;/p>
&lt;p>&lt;strong>Note:&lt;/strong> Java strings are immutable, meaning they cannot be changed. The replace() method creates a new string.&lt;/p>
&lt;p>The method has two signatures:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-java" data-lang="java">&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> replace(&lt;span style="color:#66d9ef">char&lt;/span> oldChar, &lt;span style="color:#66d9ef">char&lt;/span> newChar)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> replace(CharSequence target, CharSequence replacement)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The first method replaces all occurrences of a specified oldChar with a newChar. In contrast, the second replaces all occurrences of a specified target CharSequence with a replacement CharSequence (CharSequence is a superclass of String, meaning it accepts String as an argument).&lt;/p>
&lt;h3 id="example-1">
 Example 1
 &lt;a class="heading-link" href="#example-1">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h3>
&lt;p>Replace all occurrences of the character &amp;lsquo;o&amp;rsquo; with &amp;lsquo;x&amp;rsquo;.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-java" data-lang="java">&lt;span style="display:flex;">&lt;span>String originalString &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#34;o1o2o3o4&amp;#34;&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>String newString &lt;span style="color:#f92672">=&lt;/span> s.&lt;span style="color:#a6e22e">replace&lt;/span>(&lt;span style="color:#e6db74">&amp;#39;o&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;x&amp;#39;&lt;/span>); 
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// Original String: -&amp;gt; &amp;#34;o1o2o3o4&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// New String: -&amp;gt; &amp;#34;x1x2x3x4&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="example-2">
 Example 2
 &lt;a class="heading-link" href="#example-2">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h3>
&lt;p>Replace all occurrences of the string &amp;ldquo;red&amp;rdquo; with &amp;ldquo;black&amp;rdquo;.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-java" data-lang="java">&lt;span style="display:flex;">&lt;span>String originalString &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#34;The red car and the red house are both red.&amp;#34;&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>String newString &lt;span style="color:#f92672">=&lt;/span> originalString.&lt;span style="color:#a6e22e">replace&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;red&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;black&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// Original String: The red car and the red house are both red.&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// New String: The black car and the black house are both black.&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="java-stringreplaceall-method">
 Java String.replaceAll() method: 
 &lt;a class="heading-link" href="#java-stringreplaceall-method">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h2>
&lt;p>The method &lt;strong>replaceAll()&lt;/strong> replaces each substring matching the given regex with the replacement.&lt;/p>
&lt;h3 id="signature">
 Signature:
 &lt;a class="heading-link" href="#signature">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h3>
&lt;p>&lt;code>public replaceAll(String regex, String replacement)&lt;/code>&lt;/p>
&lt;h3 id="example">
 Example:
 &lt;a class="heading-link" href="#example">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-java" data-lang="java">&lt;span style="display:flex;">&lt;span>String originalString &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#34;The red car and the red house are both reddish.&amp;#34;&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// Replace all substrings matching the regex &amp;#34;red\\w*&amp;#34; with &amp;#34;black&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>String newString &lt;span style="color:#f92672">=&lt;/span> originalString.&lt;span style="color:#a6e22e">replaceAll&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;red\\w*&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;black&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// Original String: The red car and the red house are both reddish.&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// New String: The black car and the black house are both black.&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="conclusion">
 Conclusion
 &lt;a class="heading-link" href="#conclusion">
 &lt;i class="fa fa-link" aria-hidden="true">&lt;/i>
 &lt;/a>
&lt;/h2>
&lt;p>Starting from Java 9+, the &lt;strong>replace()&lt;/strong> the method was optimized to remove regex. However, the &lt;strong>replaceAll()&lt;/strong> method still calls the &lt;code>java.util.regex.Pattern.compile()&lt;/code> method every time it is invoked, even if the first argument (regex) is not a regular expression. This leads to a significant overhead.&lt;/p>
&lt;p>This it is recommended to use &lt;strong>replaceAll()&lt;/strong> only when the first argument is a real regex; otherwise, use &lt;strong>replace()&lt;/strong>, which does not have the performance drawback of regex.&lt;/p></description></item></channel></rss>