<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Ahmet</title>
    <description>The latest articles on DEV Community by Ahmet (@ahmettkartal).</description>
    <link>https://dev.to/ahmettkartal</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F662099%2F51d2286d-1b0d-41ee-9118-1fb61c02cef8.jpeg</url>
      <title>DEV Community: Ahmet</title>
      <link>https://dev.to/ahmettkartal</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ahmettkartal"/>
    <language>en</language>
    <item>
      <title>Building an AI-Powered Expense Dashboard with Gemini and Google Sheets</title>
      <dc:creator>Ahmet</dc:creator>
      <pubDate>Fri, 24 Oct 2025 14:15:50 +0000</pubDate>
      <link>https://dev.to/ahmettkartal/building-an-ai-powered-expense-dashboard-with-gemini-and-google-sheets-hp3</link>
      <guid>https://dev.to/ahmettkartal/building-an-ai-powered-expense-dashboard-with-gemini-and-google-sheets-hp3</guid>
      <description>&lt;p&gt;&lt;em&gt;This post is my submission for &lt;a href="https://dev.to/deved/build-apps-with-google-ai-studio"&gt;DEV Education Track: Build Apps with Google AI Studio&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;I set out to build an intelligent expense tracking dashboard that could automatically parse financial information from natural language text using Google's Gemini AI. The key prompts I used focused on extracting structured expense data from unstructured text like "Lunch with client $45.20, taxi ride $15.00" and converting it into organized spreadsheet entries. I utilized Gemini's structured output capabilities with JSON schemas to ensure consistent data extraction, integrated Google Sheets API for real-time data synchronization, and implemented OAuth 2.0 authentication for secure access to user data.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F270xxweer1epwifyjalj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F270xxweer1epwifyjalj.png" alt="Dashboard" width="800" height="752"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzs655iih4rj72sr741vz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzs655iih4rj72sr741vz.png" alt="Login screen" width="800" height="610"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Live Demo&lt;/strong&gt;: &lt;a href="https://ai.studio/apps/drive/1miiXZhwEpeYskEf5ZvNpG_wO3p2g6dig" rel="noopener noreferrer"&gt;View the app in AI Studio&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The dashboard features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AI-Powered Text Processing&lt;/strong&gt;: Paste any expense-related text and watch Gemini automatically extract structured data&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real-Time Analytics&lt;/strong&gt;: Instant spending summaries, category breakdowns, and visual charts&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Google Sheets Integration&lt;/strong&gt;: Automatic synchronization with your personal spreadsheets&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Debt Tracking&lt;/strong&gt;: Separate tracking for IOUs and debts with due dates&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Export Capabilities&lt;/strong&gt;: Download your data as CSV files&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  My Experience
&lt;/h2&gt;

&lt;p&gt;Working through the Google AI Studio track was incredibly rewarding and opened my eyes to the power of structured AI outputs. Here are my key takeaways:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I learned:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Structured Output is Game-Changing&lt;/strong&gt;: Using Gemini's JSON schema capabilities transformed how I think about AI integration. Instead of parsing free-form text responses, I could get perfectly structured data every time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OAuth Integration&lt;/strong&gt;: Implementing secure Google authentication required careful attention to token management, refresh logic, and user consent flows.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What was surprising:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Gemini's Context Understanding&lt;/strong&gt;: The AI consistently understood relative dates ("yesterday", "last week") and inferred appropriate expense categories even from minimal context.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Error Handling Importance&lt;/strong&gt;: Building robust error handling for AI responses was crucial - the AI occasionally returned unexpected formats that needed graceful fallbacks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;User Experience Impact&lt;/strong&gt;: The combination of AI + familiar tools (Google Sheets) created an incredibly intuitive user experience that felt both powerful and approachable.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The most exciting part was seeing how Gemini could transform messy, real-world text into clean, structured data that users could immediately use for financial planning. This project demonstrated that the future of productivity apps lies in intelligent automation that works with existing workflows rather than replacing them entirely.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Set Up Locally
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Prerequisites
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Node.js (v16 or higher)&lt;/li&gt;
&lt;li&gt;A Google Cloud Platform account&lt;/li&gt;
&lt;li&gt;A Gemini API key&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  1. Clone and Install
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Download the project Google AI Studio&lt;/span&gt;
&lt;span class="nb"&gt;cd &lt;/span&gt;gemini-expense-dashboard
npm &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Create Google Cloud Project
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Step 1: Create a New Project
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;Go to the &lt;a href="https://console.cloud.google.com/" rel="noopener noreferrer"&gt;Google Cloud Console&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Click "Select a project" → "New Project"&lt;/li&gt;
&lt;li&gt;Enter a project name (e.g., "Expense Dashboard")&lt;/li&gt;
&lt;li&gt;Click "Create"&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  Step 2: Enable Required APIs
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;Navigate to "APIs &amp;amp; Services" → "Library"&lt;/li&gt;
&lt;li&gt;Search for and enable:

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Google Sheets API&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Google Drive API&lt;/strong&gt; (for file access)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  Step 3: Create OAuth 2.0 Client ID
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;Go to "APIs &amp;amp; Services" → "Credentials"&lt;/li&gt;
&lt;li&gt;Click "Create Credentials" → "OAuth client ID"&lt;/li&gt;
&lt;li&gt;If prompted, configure the OAuth consent screen:

&lt;ul&gt;
&lt;li&gt;Choose "External" user type&lt;/li&gt;
&lt;li&gt;Fill in app information:

&lt;ul&gt;
&lt;li&gt;App name: "Expense Dashboard"&lt;/li&gt;
&lt;li&gt;User support email: your email&lt;/li&gt;
&lt;li&gt;Developer contact: your email&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Add your domain to authorized domains&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Set up the OAuth client:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Application type&lt;/strong&gt;: Web application&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Name&lt;/strong&gt;: "Expense Dashboard Client"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Authorized JavaScript origins&lt;/strong&gt;: 

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;http://localhost:3000&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Authorized redirect URIs&lt;/strong&gt;: 

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;http://localhost:3000&lt;/code&gt; (for development)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Click "Create" and copy the Client ID&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  Step 4: Add Test Users
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;In the OAuth consent screen, scroll to "Test users"&lt;/li&gt;
&lt;li&gt;Click "Add users"&lt;/li&gt;
&lt;li&gt;Add email addresses of users who will test the application&lt;/li&gt;
&lt;li&gt;Save the configuration&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  3. Create Your Google Sheet
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Create a new &lt;a href="https://docs.google.com/spreadsheets" rel="noopener noreferrer"&gt;Google Sheet&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;Set up the headers in Sheet1 (for expenses):

&lt;ul&gt;
&lt;li&gt;Column A: ID&lt;/li&gt;
&lt;li&gt;Column B: Date&lt;/li&gt;
&lt;li&gt;Column C: Description&lt;/li&gt;
&lt;li&gt;Column D: Category&lt;/li&gt;
&lt;li&gt;Column E: Amount&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Set up the headers in Sheet2 (for debts):

&lt;ul&gt;
&lt;li&gt;Column A: ID&lt;/li&gt;
&lt;li&gt;Column B: Creditor&lt;/li&gt;
&lt;li&gt;Column C: Amount&lt;/li&gt;
&lt;li&gt;Column D: Due Date&lt;/li&gt;
&lt;li&gt;Column E: Description&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Copy the Sheet ID from the URL: &lt;code&gt;https://docs.google.com/spreadsheets/d/[SHEET_ID]/edit&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  4. Configure the Application
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Update Configuration File
&lt;/h4&gt;

&lt;p&gt;Edit &lt;code&gt;config.ts&lt;/code&gt; with your credentials:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Your Google Sheet ID (found in the URL of your Google Sheet)&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;SPREADSHEET_ID&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;your-spreadsheet-id-here&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Sheet names for expenses and debts&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;SHEET_NAME&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Sheet1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;DEBTS_SHEET_NAME&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Sheet2&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Your OAuth 2.0 Client ID from Google Cloud Console&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;OAUTH_CLIENT_ID&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;your-client-id-here.apps.googleusercontent.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Your Gemini API Key&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;GEMINI_API_KEY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;your-api-key&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5. Run the Application
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Start the development server&lt;/span&gt;
npm run dev

&lt;span class="c"&gt;# The app will be available at http://localhost:3000&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  6. First-Time Setup
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Open the application in your browser&lt;/li&gt;
&lt;li&gt;Click "Sign in with Google"&lt;/li&gt;
&lt;li&gt;Grant the necessary permissions&lt;/li&gt;
&lt;li&gt;Start adding expenses by pasting text like:

&lt;ul&gt;
&lt;li&gt;"Lunch with client $45.20, taxi ride $15.00"&lt;/li&gt;
&lt;li&gt;"Coffee $4.50, parking $8.00"&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Troubleshooting
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;OAuth errors&lt;/strong&gt;: Ensure your Client ID is correct and the domain is authorized&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sheets API errors&lt;/strong&gt;: Verify the API is enabled and you have access to the spreadsheet&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gemini API errors&lt;/strong&gt;: Check that your API key is valid and has sufficient quota&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>deved</category>
      <category>learngoogleaistudio</category>
      <category>ai</category>
      <category>gemini</category>
    </item>
    <item>
      <title>Serverless API Load Tester</title>
      <dc:creator>Ahmet</dc:creator>
      <pubDate>Mon, 18 Dec 2023 06:40:12 +0000</pubDate>
      <link>https://dev.to/ahmettkartal/serverless-api-load-tester-3if9</link>
      <guid>https://dev.to/ahmettkartal/serverless-api-load-tester-3if9</guid>
      <description>&lt;p&gt;Hello everyone ✌🏻,&lt;br&gt;
Recently I needed a load tester tool that simply sends requests to my Rest API. I created a simple project. Here is what I have come up with!&lt;br&gt;
You can reach the &lt;a href="https://github.com/ahmettkartal/serverless-api-load-tester/" rel="noopener noreferrer"&gt;https://github.com/ahmettkartal/serverless-api-load-tester/&lt;/a&gt; repo from here.&lt;/p&gt;

&lt;h2&gt;
  
  
  Before You Begin
&lt;/h2&gt;

&lt;p&gt;Make sure you have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AWS Account&lt;/li&gt;
&lt;li&gt;Node.js installed&lt;/li&gt;
&lt;li&gt;Serverless Framework installed&lt;/li&gt;
&lt;li&gt;AWS SQS queue created with default settings&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Don't worry if you're new to configuring the Serverless Framework or setting up AWS credentials. You can follow this &lt;a href="https://www.serverless.com/framework/docs/getting-started" rel="noopener noreferrer"&gt;documentation&lt;/a&gt;. Also, you can follow up on how to setup AWS credentials from this &lt;a href="https://www.serverless.com/framework/docs/providers/aws/guide/credentials" rel="noopener noreferrer"&gt;documentation&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Configuring the SQS Queue
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;This project sends requests using &lt;a href="https://aws.amazon.com/sqs/" rel="noopener noreferrer"&gt;AWS SQS&lt;/a&gt;. You can create a simple FIFO queue with default settings.&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Once your queue is created, you'll need to update the queue ARN and URL in the &lt;code&gt;config.development.json&lt;/code&gt; file under the &lt;code&gt;config&lt;/code&gt; folder. Alternatively, you can set these variables in the &lt;code&gt;run.sh&lt;/code&gt; file for local development.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Replace &lt;code&gt;YOUR_SQS_QUEUE_ARN_HERE&lt;/code&gt; and &lt;code&gt;YOUR_SQS_QUEUE_URL_HERE&lt;/code&gt;, with your actual queue information.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Deploying the Project
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Deploy the project to AWS using the Serverless Framework with this command:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;serverless deploy --stage development
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;If you want to create a new stage, you have to create the stage's config file under the &lt;code&gt;config&lt;/code&gt; folder with the stage's name. For example, for a stage called &lt;code&gt;production&lt;/code&gt;, create a file named &lt;code&gt;config.production.json&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Running the Project
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;After the deployment process, you'll get an endpoint like &lt;code&gt;https://endpoint_key.execute-api.eu-central-1.amazonaws.com/development&lt;/code&gt;. This URL serves as your base endpoint.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;To add a request to the queue you can use the &lt;code&gt;{{url}}/load-tests&lt;/code&gt; endpoint. Below, you'll find an example of sample data you can use:&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{   
    "iteration" : 100,
    "request_data" : {
        "method" : "post",
        "url" :"YOUR_LOAD_TEST_ENDPOINT",
        "data" : {
            "key" :"value"
        },
        "headers" : {
            "Content-Type": "application/json"
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;I used &lt;a href="https://webhook.site" rel="noopener noreferrer"&gt;webhook.site&lt;/a&gt; for testing. It is a great tool.&lt;br&gt;
Also you can find the Postman collection at the repo&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The &lt;code&gt;iteration&lt;/code&gt; parameter denotes the number of requests, and the &lt;code&gt;request_data&lt;/code&gt; configures Axios. &lt;/p&gt;

&lt;p&gt;That is it! Now you have your load tester tool 🥳. If you have additional ideas or any problems, please write me ✌🏻.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Display Current Git Branch on iTerm2</title>
      <dc:creator>Ahmet</dc:creator>
      <pubDate>Thu, 04 Nov 2021 07:10:32 +0000</pubDate>
      <link>https://dev.to/ahmettkartal/display-current-git-branch-on-iterm2-3ko8</link>
      <guid>https://dev.to/ahmettkartal/display-current-git-branch-on-iterm2-3ko8</guid>
      <description>&lt;p&gt;As a Windows user, I generally use &lt;a href="https://conemu.github.io" rel="noopener noreferrer"&gt;Conemu Console&lt;/a&gt; for my console and it has a sweet future in which you can see the current git branch on the terminal. After using Mac I wanted to see the same future on iTerm2. I found the way and I want to share it with you 🙂&lt;/p&gt;

&lt;h4&gt;
  
  
  .zshrc file
&lt;/h4&gt;

&lt;p&gt;Firstly create and edit a .zshrc file that will use for terminal configuration.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;touch ~/.zshrc; open ~/.zshrc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  parse_git_branch
&lt;/h4&gt;

&lt;p&gt;Customize your terminal whatever you want with this file. You can use the following bash code to display the git branch.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;parse_git_branch() {
    git branch 2&amp;gt; /dev/null | sed -n -e 's/^\* \(.*\)/[\1]/p'
}
COLOR_DEF='%f'
COLOR_DIR='%F{197}'
COLOR_GIT='%F{39}'
NEWLINE=$'\n'
setopt PROMPT_SUBST
export PROMPT='${COLOR_DIR}%d ${COLOR_GIT}$(parse_git_branch)${COLOR_DEF}${NEWLINE}%% '
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And that is it! Restart your terminal. You will see the current branch on your terminal 🙂&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmj0nvp72sz3lam7yc3nv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmj0nvp72sz3lam7yc3nv.png" alt="Image description" width="800" height="273"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  More customization
&lt;/h4&gt;

&lt;p&gt;If you want more customization you can edit the &lt;strong&gt;PROMPT&lt;/strong&gt; variable in the .zshrc file. For example, you can add your current computer user.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;parse_git_branch() {
    git branch 2&amp;gt; /dev/null | sed -n -e 's/^\* \(.*\)/[\1]/p'
}
COLOR_DEF='%f'
COLOR_USR='%F{243}'
COLOR_DIR='%F{197}'
COLOR_GIT='%F{39}'
NEWLINE=$'\n'
setopt PROMPT_SUBST
export PROMPT='${COLOR_USR}%n@%M ${COLOR_DIR}%d ${COLOR_GIT}$(parse_git_branch)${COLOR_DEF}${NEWLINE}%% '
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8s50najp5xbias761rd9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8s50najp5xbias761rd9.png" alt="Image description" width="800" height="137"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  More color!
&lt;/h4&gt;

&lt;p&gt;If you want to change color, just edit the color code.&lt;br&gt;
Change &lt;strong&gt;COLOR_USR='%F{243}'&lt;/strong&gt; to &lt;strong&gt;COLOR_USR='%F{229}'&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You can find the color code schema in the following image.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjrdqzc6quy8fa2y3dq9d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjrdqzc6quy8fa2y3dq9d.png" alt="Image description" width="642" height="443"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://misc.flogisoft.com/bash/tip_colors_and_formatting" rel="noopener noreferrer"&gt;Image Source&lt;/a&gt;&lt;/p&gt;

</description>
      <category>iterm2</category>
      <category>mac</category>
      <category>terminal</category>
      <category>github</category>
    </item>
    <item>
      <title>Create Your Own Browser Extension</title>
      <dc:creator>Ahmet</dc:creator>
      <pubDate>Mon, 30 Aug 2021 00:18:28 +0000</pubDate>
      <link>https://dev.to/ahmettkartal/create-your-own-browser-extension-3emc</link>
      <guid>https://dev.to/ahmettkartal/create-your-own-browser-extension-3emc</guid>
      <description>&lt;h5&gt;
  
  
  Hello Dev.to 🖖
&lt;/h5&gt;

&lt;p&gt;This is my first article on this platform. Please enjoy your reading and see you on next articles 🙂&lt;/p&gt;

&lt;h2&gt;
  
  
  What is an extension?
&lt;/h2&gt;

&lt;p&gt;Extensions are small software that runs on browsers and provides additional features to browsers and websites. It is very easily accessible in terms of user experience. Also, it is very easy to develop for software developers, for these reasons the popularity of extensions is constantly increasing.&lt;/p&gt;

&lt;h1&gt;
  
  
  Let's build step by step
&lt;/h1&gt;

&lt;p&gt;In this article, we will make a very small and simple plugin that will find the IP address we use. We will use the &lt;a href="https://www.ipify.org" rel="noopener noreferrer"&gt;Ipify&lt;/a&gt; API for get the IP information.&lt;/p&gt;

&lt;h3&gt;
  
  
  1- Manifest.json file
&lt;/h3&gt;

&lt;p&gt;We start our project by first creating a folder. The first file we will necessarily add to this folder will be manifest.json. This file will be a guide file like the contents of our plugin.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
 &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"IP Finder"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
 &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
 &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Find your ip with this extension"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
 &lt;/span&gt;&lt;span class="nl"&gt;"manifest_version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;name =&amp;gt; Name of extension&lt;/li&gt;
&lt;li&gt;version =&amp;gt; Version of extension&lt;/li&gt;
&lt;li&gt;description =&amp;gt; Description of extension&lt;/li&gt;
&lt;li&gt;manifest_version =&amp;gt; The manifest version that we will use in the extension&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The manifest.json file is sufficient to create an extension. You can start testing your extension after enabling developer mode of your browser 👏&lt;/p&gt;

&lt;h3&gt;
  
  
  2- Enabling developer mode on the browser
&lt;/h3&gt;

&lt;p&gt;To test your plugin, you need to activate developer mode on your browser. You can find in the (chrome://extensions) section of your browser.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fje16427fywdfkkviisq2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fje16427fywdfkkviisq2.png" alt="Enabling developer mode" width="800" height="273"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After this step, the &lt;strong&gt;Load Unpacked&lt;/strong&gt; button will appear on your screen which you can install your plugin. Now select your extension folder and start testing.&lt;/p&gt;
&lt;h3&gt;
  
  
  3- Plugin view and functionality
&lt;/h3&gt;

&lt;p&gt;We will use HTML and Js to create the overview and functionality of our extension. Firstly, create &lt;strong&gt;&lt;em&gt;app.js&lt;/em&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;em&gt;app.html&lt;/em&gt;&lt;/strong&gt; files to project. Then introduce these files to manifest file so that we can use them.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"IP Finder"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Find your ip with this extension"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"manifest_version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"web_accessible_resources"&lt;/span&gt;&lt;span class="p"&gt;:[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"matches"&lt;/span&gt;&lt;span class="p"&gt;:[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;all_urls&amp;gt;"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"resources"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"app.js"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"default_popup"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"app.html"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;matches =&amp;gt; The extension will work in case of which urls you have&lt;/li&gt;
&lt;li&gt;resources =&amp;gt; Source files to create the extension action&lt;/li&gt;
&lt;li&gt;default_popup =&amp;gt; HTML file that will create the general interface of the extension&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We will use HTML for the extension's interface. Create a button to trigger the API for pulling IP information into the app.html file, also create a paragraph element to reflect the returned result on the screen. You can add style to the body element for the size of the plugin.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!doctype html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"en"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;style&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;body&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;min-width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;400px&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/style&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;Find My IP&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;p&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"result"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"find"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Find&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"app.js"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At the app.js file, create a click function for the button. In the function, create a GET request and send this request to the API. After the request fetch this returned JSON response and print the IP information on the screen.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;find&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;onclick&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Create Request&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;xmlHttp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;XMLHttpRequest&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="c1"&gt;// Request to ipify for ip information&lt;/span&gt;
    &lt;span class="nx"&gt;xmlHttp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;GET&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://api.ipify.org?format=json&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;xmlHttp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Cast request response to JSON object&lt;/span&gt;
        &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;obj&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;xmlHttp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;responseText&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="c1"&gt;// Display IP information to our extension&lt;/span&gt;
        &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;result&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;innerHTML&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ip&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
        &lt;span class="c1"&gt;// Display error information to our extension&lt;/span&gt;
        &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;result&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;innerHTML&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;An Error Occurred&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;⚠️ Finally, you made an update on the plugin, source codes will not update dynamically. So, in case of a change, don't forget to refresh the source code on the extensions page.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F02cy44qfgtiqunbtje8n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F02cy44qfgtiqunbtje8n.png" alt="Refresh extension" width="800" height="392"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For the full code &lt;a href="https://github.com/ahmettkartal/ip-finder-extension" rel="noopener noreferrer"&gt;Github ahmettkartal&lt;/a&gt;&lt;/p&gt;

</description>
      <category>browser</category>
      <category>extension</category>
    </item>
  </channel>
</rss>
