<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Nitin Kumar</title>
    <description>The latest articles on Forem by Nitin Kumar (@nitinkumar30).</description>
    <link>https://forem.com/nitinkumar30</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%2F728171%2F6ffac7d5-ccb6-4f20-be03-cd45a915414b.jpg</url>
      <title>Forem: Nitin Kumar</title>
      <link>https://forem.com/nitinkumar30</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/nitinkumar30"/>
    <language>en</language>
    <item>
      <title>Built with Google Gemini: AI Essay Generator with Gemini</title>
      <dc:creator>Nitin Kumar</dc:creator>
      <pubDate>Tue, 03 Mar 2026 12:47:15 +0000</pubDate>
      <link>https://forem.com/nitinkumar30/ai-essay-generator-with-gemini-34pc</link>
      <guid>https://forem.com/nitinkumar30/ai-essay-generator-with-gemini-34pc</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/mlh-built-with-google-gemini-02-25-26"&gt;Built with Google Gemini: Writing Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built with Google Gemini
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;This Python script leverages the Google Gemini API to automate the generation of essays based on specific criteria defined in a CSV file. It's engineered to create datasets of student-like essays, complete with a specified type and percentage of errors, making it ideal for training NLP models, developing educational software, or generating content at scale.&lt;/li&gt;
&lt;li&gt;The script intelligently infers the desired error type (e.g., spelling, grammar, punctuation) from the input CSV's filename, generates a unique essay for each row, and saves the output directly back into the same file, creating a seamless and efficient workflow.&lt;/li&gt;
&lt;/ol&gt;

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

&lt;p&gt;I've uploaded my project to GitHub named &lt;a href="https://github.com/nitinkumar30/gemini-essay-generator/" rel="noopener noreferrer"&gt;gemini-essay-generator&lt;/a&gt;&lt;/p&gt;


  
  Your browser does not support the video tag.


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

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Technical Skills&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Gained hands-on experience with &lt;strong&gt;Python scripting and data handling&lt;/strong&gt; using &lt;code&gt;pandas&lt;/code&gt; for reading/writing CSV files.&lt;/li&gt;
&lt;li&gt;Learned to &lt;strong&gt;interact with the Google Gemini API&lt;/strong&gt;, including constructing prompts dynamically and handling API responses.&lt;/li&gt;
&lt;li&gt;Practiced &lt;strong&gt;error handling and validation&lt;/strong&gt;, ensuring the generated essays met word count and error constraints.&lt;/li&gt;
&lt;li&gt;Understood &lt;strong&gt;dependency management&lt;/strong&gt; in Python projects and how a &lt;code&gt;requirements.txt&lt;/code&gt; ensures reproducible environments.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Soft Skills&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Improved &lt;strong&gt;problem-solving and debugging&lt;/strong&gt; when working with APIs and CSV-based data.&lt;/li&gt;
&lt;li&gt;Learned to &lt;strong&gt;manage project structure&lt;/strong&gt;, separate configuration (API keys, CSVs) from logic, and read/interpret open-source code.&lt;/li&gt;
&lt;li&gt;Strengthened &lt;strong&gt;attention to detail&lt;/strong&gt;, especially while ensuring generated essays had the required type and percentage of errors.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Unexpected Lessons&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Saw firsthand how &lt;strong&gt;automated AI generation&lt;/strong&gt; can still require validation and retries — AI outputs are not always deterministic.&lt;/li&gt;
&lt;li&gt;Learned that &lt;strong&gt;file naming conventions&lt;/strong&gt; can be leveraged to encode metadata (like error types) in a simple, scalable way.&lt;/li&gt;
&lt;li&gt;Realized the importance of &lt;strong&gt;lockfiles and reproducible environments&lt;/strong&gt;; without them, collaborators may get inconsistent results.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Key Takeaway&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Working on this project highlighted the combination of &lt;strong&gt;data engineering, API integration, and reproducibility&lt;/strong&gt; in real-world Python projects, and how thoughtful automation can save significant time when generating content at scale.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  Google Gemini Feedback
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;What Worked Well&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;project structure was clear&lt;/strong&gt;, with a single main script and example CSV that made it easy to understand how input/output worked.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API integration&lt;/strong&gt; with Google Gemini was straightforward; the existing functions for sending prompts and receiving responses worked reliably.&lt;/li&gt;
&lt;li&gt;Using &lt;strong&gt;pandas for CSV handling&lt;/strong&gt; made batch processing simple and efficient, even for multiple essays at once.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;filename-based configuration&lt;/strong&gt; (to encode error type) was a clever, lightweight solution that avoided complex configuration files.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Challenges / Where I Needed More Support&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Initially, understanding &lt;strong&gt;how the Gemini API expected prompts and formatting&lt;/strong&gt; took some trial and error; the API documentation assumed familiarity with prompt engineering.&lt;/li&gt;
&lt;li&gt;Handling &lt;strong&gt;edge cases with essay generation&lt;/strong&gt; was tricky — sometimes the model returned fewer words than expected or misapplied the error types, requiring multiple retries.&lt;/li&gt;
&lt;li&gt;The project relied on &lt;strong&gt;&lt;code&gt;requirements.txt&lt;/code&gt; and pip&lt;/strong&gt;, so setting up a fully reproducible environment across different systems could be tricky without virtual environments or a lockfile.&lt;/li&gt;
&lt;li&gt;Some &lt;strong&gt;error handling and logging&lt;/strong&gt; could be more robust; debugging failures when the API response was invalid required manual intervention.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Key Takeaway&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Overall, the project worked well for learning &lt;strong&gt;AI prompt integration, batch processing, and reproducibility&lt;/strong&gt;, but highlighted the importance of &lt;strong&gt;robust error handling, reproducible environments, and clear API documentation&lt;/strong&gt; for scaling such tools.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Sure.&lt;/p&gt;

&lt;p&gt;Done.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>geminireflections</category>
      <category>gemini</category>
      <category>pythonai</category>
    </item>
    <item>
      <title>Transition from pip to uv package manager</title>
      <dc:creator>Nitin Kumar</dc:creator>
      <pubDate>Tue, 03 Mar 2026 12:30:27 +0000</pubDate>
      <link>https://forem.com/nitinkumar30/transition-from-pip-to-uv-package-manager-3ike</link>
      <guid>https://forem.com/nitinkumar30/transition-from-pip-to-uv-package-manager-3ike</guid>
      <description>&lt;p&gt;So, you've already got your traditional pip package manager &amp;amp; transition to uv package manager? Or you're someone who's new to package manager topic? &lt;/p&gt;




&lt;h2&gt;
  
  
  Python Package Manager
&lt;/h2&gt;

&lt;p&gt;Let's understand what a package manager mean.&lt;/p&gt;

&lt;p&gt;A Python package manager is a tool that automates the process of installing, updating, configuring, and removing software packages (libraries) written for Python. Think of it as the software that connects your project to repositories of reusable code, fetches packages (and their dependencies), and manages them on your system or in specific environments.&lt;/p&gt;




&lt;h2&gt;
  
  
  Choosing uv over traditional pip
&lt;/h2&gt;

&lt;p&gt;Now, let's understand why to choose &lt;a href="https://github.com/astral-sh/uv" rel="noopener noreferrer"&gt;uv&lt;/a&gt; over &lt;a href="https://github.com/pypa/pip" rel="noopener noreferrer"&gt;pip&lt;/a&gt; although both are open source !&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;uv&lt;/th&gt;
&lt;th&gt;pip&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Out-of-the-Box Availability&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Package installation speed&lt;/td&gt;
&lt;td&gt;Installs JupyterLab in 2.618 seconds&lt;/td&gt;
&lt;td&gt;Installs JupyterLab in 21.409 seconds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reproducible installs&lt;/td&gt;
&lt;td&gt;Supports reproducible installs based on native locking&lt;/td&gt;
&lt;td&gt;Supports reproducible installs through requirements.txt and pip-tools&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Removal of transitive dependencies&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Maturity and ecosystem support&lt;/td&gt;
&lt;td&gt;Offers a new and growing ecosystem with increasing adoption&lt;/td&gt;
&lt;td&gt;Offers a mature ecosystem and long-standing adoption&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Licensing&lt;/td&gt;
&lt;td&gt;Distributed under the MIT license&lt;/td&gt;
&lt;td&gt;Distributed under the MIT license&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Supporting organization&lt;/td&gt;
&lt;td&gt;Developed by Astral, a private company focused on high-performance Python tooling&lt;/td&gt;
&lt;td&gt;Developed by the Packaging Authority (PyPA), part of the Python Software Foundation (PSF)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;You can learn more about their comparison in &lt;a href="https://realpython.com/uv-vs-pip/" rel="noopener noreferrer"&gt;realpython's blog&lt;/a&gt; or &lt;a href="https://www.youtube.com/watch?v=6pttmsBSi8M" rel="noopener noreferrer"&gt;this youtube video&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Working of uv package manager
&lt;/h2&gt;

&lt;p&gt;So, it's clear why uv &amp;amp; not pip. But how does uv even works? How is it so fast than pip.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bootstrapping &amp;amp; Setup
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;uv&lt;/strong&gt; is distributed as a single compiled binary and can install Python versions, create virtual environments, and manage dependencies without requiring a pre-configured Python toolchain. Because it is written in Rust, startup time is nearly instant and it works consistently across platforms. In contrast, &lt;strong&gt;pip&lt;/strong&gt; requires Python to already be installed and must be combined with tools like &lt;code&gt;venv&lt;/code&gt; or &lt;code&gt;virtualenv&lt;/code&gt;, making initial project setup more fragmented and error-prone. In CI environments, reducing setup steps can noticeably decrease build times, especially across multiple pipeline runs.&lt;/p&gt;

&lt;h3&gt;
  
  
  Dependency Resolution
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;uv&lt;/strong&gt; uses a high-performance dependency resolver (inspired by modern solvers like PubGrub) that computes a fully consistent dependency graph before installation begins. This process is deterministic and optimized for speed, especially in large projects. While &lt;strong&gt;pip&lt;/strong&gt; introduced a backtracking resolver in version 20.3, it can still be noticeably slower on complex dependency trees and may require multiple resolution attempts, increasing install time. In large dependency graphs, resolution with pip can take several seconds to minutes depending on conflicts, whereas uv often resolves the same graphs in a fraction of that time due to optimized algorithms.&lt;/p&gt;

&lt;h3&gt;
  
  
  Lockfile &amp;amp; Reproducibility
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;uv&lt;/strong&gt; generates and enforces a native &lt;code&gt;uv.lock&lt;/code&gt; file, ensuring reproducible installs across machines and CI pipelines. Every transitive dependency is pinned automatically. &lt;strong&gt;pip&lt;/strong&gt; does not provide built-in lockfile support, relying instead on &lt;code&gt;requirements.txt&lt;/code&gt; or external tools like &lt;code&gt;pip-tools&lt;/code&gt;, which adds workflow complexity and can reduce determinism. Native locking reduces human error and prevents “works on my machine” problems that frequently arise in pip-based setups without strict version pinning.&lt;/p&gt;

&lt;h3&gt;
  
  
  Downloading Packages
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;uv&lt;/strong&gt; performs parallel downloads and aggressively reuses a global cache, significantly reducing network and installation time. Benchmarks commonly show large projects installing in a fraction of the time compared to traditional tooling (for example, JupyterLab installing in roughly 2–3 seconds in controlled tests). &lt;strong&gt;pip&lt;/strong&gt; typically handles downloads more sequentially and, while it caches packages, it does not optimize parallel fetching to the same extent, making cold installs slower. In some public comparisons, uv demonstrates installation speeds up to 5–10× faster than pip for large dependency sets.&lt;/p&gt;

&lt;h3&gt;
  
  
  Installation &amp;amp; Disk Efficiency
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;uv&lt;/strong&gt; installs packages in parallel and uses hard-linking or symlinking from a shared global cache when possible, reducing redundant disk writes and saving storage across environments. &lt;strong&gt;pip&lt;/strong&gt; installs packages sequentially and copies files into each environment, which can increase disk usage and slow down repeated environment creation in large projects. In multi-environment setups, uv’s deduplicated caching can significantly reduce storage overhead compared to pip’s per-environment duplication model.&lt;/p&gt;

&lt;h3&gt;
  
  
  Virtual Environment Management
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;uv&lt;/strong&gt; integrates virtual environment creation and management directly into its workflow, allowing commands like &lt;code&gt;uv venv&lt;/code&gt; and &lt;code&gt;uv sync&lt;/code&gt; to streamline setup. &lt;strong&gt;pip&lt;/strong&gt; does not manage environments itself, requiring manual environment activation; mistakes in activation can lead to unintended global package installations and dependency conflicts. Consolidating environment and dependency management in one tool reduces operational friction and configuration mistakes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Python Version Management
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;uv&lt;/strong&gt; can download and manage multiple Python versions as part of its unified toolchain, reducing the need for additional version managers. &lt;strong&gt;pip&lt;/strong&gt; cannot manage Python interpreters, forcing developers to rely on separate tools such as system package managers or &lt;code&gt;pyenv&lt;/code&gt;, increasing setup fragmentation. A unified toolchain simplifies onboarding and standardizes development environments across teams.&lt;/p&gt;

&lt;h3&gt;
  
  
  Performance at Scale
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;uv&lt;/strong&gt; is optimized for performance at scale, leveraging parallelism, aggressive caching, and compiled execution. In many real-world benchmarks, it demonstrates multiple-fold speed improvements over traditional workflows, especially in cold installs and CI/CD pipelines. &lt;strong&gt;pip&lt;/strong&gt;, being implemented in Python and not heavily parallelized, can become a bottleneck in large CI/CD pipelines or enterprise-scale dependency graphs, where repeated installs compound time costs across builds.&lt;/p&gt;




&lt;h2&gt;
  
  
  How to setup
&lt;/h2&gt;

&lt;p&gt;Now, that we know what's uv &amp;amp; how it's faster than pip, let's move to the implementation part.&lt;/p&gt;

&lt;p&gt;What are the steps we need to perform to implement uv in our project. Let's begin from scratch. Took help from &lt;a href="https://docs.astral.sh/uv/getting-started/installation/" rel="noopener noreferrer"&gt;uv documentation&lt;/a&gt; JFYI.&lt;/p&gt;

&lt;h3&gt;
  
  
  Install uv
&lt;/h3&gt;

&lt;p&gt;macOS / Linux&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;curl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-LsSf&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;https://astral.sh/uv/install.sh&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;sh&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Windows (PowerShell)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;irm&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;https://astral.sh/uv/install.ps1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;iex&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or via pip (not recommended for full feature usage, but possible):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;pip&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;install&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;uv&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;; you may use &lt;strong&gt;pipx&lt;/strong&gt; instead of &lt;strong&gt;pip&lt;/strong&gt; for installation in isolated environment.&lt;/p&gt;

&lt;p&gt;Verify installation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;uv&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--version&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Create new project
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;uv&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;init&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;PROJECT_NAME&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;PROJECT_NAME&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;; PROJECT_NAME is the name of your project&lt;/p&gt;

&lt;p&gt;This creates:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;pyproject.toml&lt;/li&gt;
&lt;li&gt;.venv (optional depending on config)&lt;/li&gt;
&lt;li&gt;Basic project structure&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Install dependencies
&lt;/h3&gt;

&lt;p&gt;Now, you need to add dependencies/libraries you need to install in your project. You've got 2 options - one with a requirements.txt file where your dependencies are present &amp;amp; another one without anything but you know what all dependencies you need.&lt;/p&gt;

&lt;p&gt;If you've got requirements.txt file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;uv&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;add&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-r&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;requirements.txt&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you don't have that file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;uv&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;add&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;PACKAGE_NAME&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;then, ensure your environment is in sync with the &lt;code&gt;pyproject.toml&lt;/code&gt; and &lt;code&gt;uv.lock&lt;/code&gt; files:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;uv&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;sync&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;With this approach, you simply run &lt;code&gt;uv sync&lt;/code&gt; when another developer clones the project, and &lt;strong&gt;uv&lt;/strong&gt; automatically creates the virtual environment and installs the correct dependencies. Checkout &lt;a href="https://youtu.be/QxLXhE1fxc4?si=bgFic07UQy3frdjZ" rel="noopener noreferrer"&gt;this YouTube video&lt;/a&gt; for reference.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;And, that's it !! You're good to use uv as your package manager instead of pip.&lt;/p&gt;

&lt;p&gt;If you need to install any other package, just run uv add command &amp;amp; it'll automatically add in current virtual env, updates uv.lock file &amp;amp; add package to .toml file. &lt;/p&gt;

&lt;p&gt;No need of requirements.txt file now to install same packages, just put &lt;code&gt;uv sync&lt;/code&gt; &amp;amp; all files will be updated based on the shared .toml file.&lt;/p&gt;




&lt;p&gt;What exactly happens after we do &lt;code&gt;uv sync&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Read uv.lock&lt;/li&gt;
&lt;li&gt;Create a virtual environment (if not present)&lt;/li&gt;
&lt;li&gt;Install the exact pinned versions from the lock file&lt;/li&gt;
&lt;li&gt;Reproduce the same dependency tree deterministically&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So yes — everything needed for dependencies gets recreated automatically.&lt;/p&gt;

&lt;p&gt;If you still need requirements.txt file to deploy on services not using uv, simply do&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;uv&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-o&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;requirements.txt&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;So, for sharing dependencies related to your project, just share .toml &amp;amp; .lock files &amp;amp; run &lt;code&gt;uv sync&lt;/code&gt; in new system &amp;amp; it'll automatically install all dependencies.&lt;/p&gt;




&lt;p&gt;Some errors:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;You might get error while updating updating uv (&lt;code&gt;uv self update&lt;/code&gt;), for resolution check &lt;a href="https://github.com/astral-sh/uv/issues/6774#issuecomment-2439804875" rel="noopener noreferrer"&gt;this github resolution issue comment&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You might get error while installing dependencies before doing &lt;code&gt;uv init&lt;/code&gt;, this is due to no .toml file. You need to initialize uv project first by doing &lt;code&gt;uv init&lt;/code&gt; even if you've project opened. It'll automatically take your project name &amp;amp; initialize with required files &amp;amp; you can install dependencies.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;Hope you liked this tutorial on uv implementation in your python project. Let me know in comments how was your experience with uv &amp;amp; how much time is preserved by using it. &lt;/p&gt;

&lt;p&gt;!! HAPPY DEVELOPING !! KEEP DEVELOPING !!&lt;/p&gt;

&lt;p&gt;If this helped you even a little, feel free to connect with me on 👉 &lt;a href="https://linkedin.com/in/nitin30kumar" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>uv</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Guide to publish your first PyPI library 🚀</title>
      <dc:creator>Nitin Kumar</dc:creator>
      <pubDate>Sun, 08 Feb 2026 18:33:55 +0000</pubDate>
      <link>https://forem.com/nitinkumar30/guide-to-publish-your-first-pypi-library-1bnh</link>
      <guid>https://forem.com/nitinkumar30/guide-to-publish-your-first-pypi-library-1bnh</guid>
      <description>&lt;p&gt;👀 Do you also want to be included in that &lt;em&gt;elite&lt;/em&gt;, &lt;em&gt;mysterious&lt;/em&gt;, and totally brag-worthy list of contributors for a &lt;strong&gt;public PyPI package&lt;/strong&gt;?&lt;br&gt;
Yes? No? Still scrolling like it’s an Instagram reel? 📱&lt;br&gt;
Cool, let’s fix that.&lt;/p&gt;


&lt;h2&gt;
  
  
  Why to create a py package? 🤔🐍
&lt;/h2&gt;

&lt;p&gt;Before you start dreaming about PyPI fame (and GitHub stars 🌟 that your relatives won’t understand), pause for a reality check.&lt;/p&gt;

&lt;p&gt;First, decide if your project is actually &lt;strong&gt;PyPI-worthy&lt;/strong&gt;. Before touching configs, sanity-check that your project is reusable (no hardcoded paths, credentials, or &lt;em&gt;“works only on my laptop”&lt;/em&gt; local files 💻❌) &amp;amp; has a clear entry point (functions/CLI).&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If your script is “run once and forget” — PyPI is &lt;strong&gt;overkill&lt;/strong&gt; 💀&lt;br&gt;
If others (or future-you, after 3 months of memory loss 🧠) can reuse it → &lt;strong&gt;publish it&lt;/strong&gt; 🚀&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Think of it like the World Cup 🏏 — not every gully cricketer makes it to the squad, but the good ones do 😉&lt;br&gt;
Same rules apply here.&lt;/p&gt;


&lt;h2&gt;
  
  
  📂 Folder structure needed (yes, structure matters)
&lt;/h2&gt;

&lt;p&gt;Just like India’s budget announcements 📊 — boring, structured, but &lt;em&gt;very important&lt;/em&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;my_package/
│
├── src/
│   └── my_package/
│       ├── __init__.py
│       ├── core.py
│       └── utils.py
│
├── tests/
│   └── test_basic.py
│
├── README.md
├── LICENSE
├── pyproject.toml
├── MANIFEST.in
└── .gitignore
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mess this up, and PyPI will treat your package the way Twitter treats breaking news — &lt;strong&gt;harshly&lt;/strong&gt; 😬🐦.&lt;/p&gt;




&lt;h3&gt;
  
  
  Content of &lt;code&gt;pyproject.toml&lt;/code&gt; ❤️‍🔥
&lt;/h3&gt;

&lt;p&gt;This is the &lt;strong&gt;heart of deployment&lt;/strong&gt;.&lt;br&gt;
Mess this up and your package dies faster than a government promise during elections 🗳️😌.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="nn"&gt;[build-system]&lt;/span&gt;
&lt;span class="py"&gt;requires&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="py"&gt;["setuptools&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;61.0&lt;/span&gt;&lt;span class="s"&gt;", "&lt;/span&gt;&lt;span class="err"&gt;wheel&lt;/span&gt;&lt;span class="s"&gt;"]&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;span class="py"&gt;build-backend&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"setuptools.build_meta"&lt;/span&gt;

&lt;span class="nn"&gt;[project]&lt;/span&gt;
&lt;span class="py"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"my-package"&lt;/span&gt;
&lt;span class="py"&gt;version&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"0.1.0"&lt;/span&gt;
&lt;span class="py"&gt;description&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Utility to validate API responses using schema rules"&lt;/span&gt;
&lt;span class="py"&gt;readme&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"README.md"&lt;/span&gt;
&lt;span class="py"&gt;license&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="py"&gt;file&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"LICENSE"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="py"&gt;authors&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="err"&gt;{&lt;/span&gt; &lt;span class="py"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"FIRSTNAME LASTNAME"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="py"&gt;email&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"your@email.com"&lt;/span&gt; &lt;span class="err"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="py"&gt;requires-python&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="py"&gt;"&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;3.8&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;
&lt;span class="py"&gt;dependencies&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="nn"&gt;[project.urls]&lt;/span&gt;
&lt;span class="py"&gt;Homepage&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"https://github.com/yourname/my-package"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Yes, every line matters.&lt;br&gt;
No, PyPI doesn’t care if “it worked locally” 😌❌.&lt;/p&gt;


&lt;h3&gt;
  
  
  Contents of &lt;code&gt;MANIFEST.in&lt;/code&gt; (don’t skip 🙏)
&lt;/h3&gt;

&lt;p&gt;Ensures non-code files are packaged.&lt;br&gt;
Skipping this is like hosting the World Cup final without a trophy 🏆 — technically possible, emotionally devastating.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight make"&gt;&lt;code&gt;&lt;span class="k"&gt;include&lt;/span&gt;&lt;span class="sx"&gt; README.md&lt;/span&gt;
&lt;span class="k"&gt;include&lt;/span&gt;&lt;span class="sx"&gt; LICENSE&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Without this, your PyPI page may break.&lt;br&gt;
And users &lt;em&gt;will&lt;/em&gt; judge you silently 🤐.&lt;/p&gt;


&lt;h2&gt;
  
  
  Key rules 🚨
&lt;/h2&gt;

&lt;p&gt;There are some key rules while uploading your package on the PyPI website. These are non-negotiable — like ICC rules during finals 😤🏏:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Name must be &lt;strong&gt;unique&lt;/strong&gt; on PyPI (yes, &lt;code&gt;utils&lt;/code&gt;, &lt;code&gt;helpers&lt;/code&gt;, &lt;code&gt;test-lib&lt;/code&gt; are already taken 😑)&lt;/li&gt;
&lt;li&gt;Version must follow &lt;strong&gt;semver&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Once uploaded → &lt;strong&gt;cannot overwrite&lt;/strong&gt; the same version (PyPI never forgets 😈)&lt;/li&gt;
&lt;/ol&gt;


&lt;h2&gt;
  
  
  Requirements 📋
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;A sample project which should adhere to these conditions
&lt;/li&gt;
&lt;li&gt;Any code editor. I’m using &lt;a href="https://code.visualstudio.com/download" rel="noopener noreferrer"&gt;VS Code&lt;/a&gt; here (because obviously 💙)&lt;/li&gt;
&lt;li&gt;A valid package name should be &lt;strong&gt;unique&lt;/strong&gt; ⚠️&lt;/li&gt;
&lt;li&gt;A PyPI &amp;amp; test.pypi Account&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;; PyPI account can be created from &lt;a href="https://pypi.org/account/register/" rel="noopener noreferrer"&gt;here&lt;/a&gt; &amp;amp; tutorial for the same is in &lt;a href="https://www.youtube.com/watch?v=6YguKyOtxFY" rel="noopener noreferrer"&gt;this youtube video&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;TestPyPI account can be created from &lt;a href="https://test.pypi.org/" rel="noopener noreferrer"&gt;here&lt;/a&gt; &amp;amp; tutorial for the same is in &lt;a href="https://youtu.be/4gG8Ans-imw?t=173" rel="noopener noreferrer"&gt;this youtube video&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Yes, two accounts.&lt;br&gt;
No, PyPI doesn’t trust you immediately — neither should it 😌🔐.&lt;/p&gt;


&lt;h2&gt;
  
  
  Steps to create &amp;amp; upload 🚀
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Install build tools 🛠️
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--upgrade&lt;/span&gt; build twine
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;build&lt;/code&gt; → creates wheel &amp;amp; source&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;twine&lt;/code&gt; → uploads to PyPI (your final boss 🎮)&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  Build your package 📦
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python &lt;span class="nt"&gt;-m&lt;/span&gt; build
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;If this executes successfully (pray to the Python gods 🐍🙏), it will create:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dist/
├── my_package-0.1.0-py3-none-any.whl
└── my_package-0.1.0.tar.gz
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If it fails — congrats 🎉, you’re officially learning 🤨&lt;/p&gt;




&lt;h3&gt;
  
  
  Upload to testPyPI (optional but smart 🧠)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;twine upload &lt;span class="nt"&gt;--repository&lt;/span&gt; testpypi dist/&lt;span class="k"&gt;*&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then install your uploaded package from testPyPI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--index-url&lt;/span&gt; https://test.pypi.org/simple/ my-package
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Test import + functionality here.&lt;br&gt;
Break things &lt;strong&gt;now&lt;/strong&gt;, not in production 😬🔥.&lt;/p&gt;




&lt;h3&gt;
  
  
  Upload to real PyPI 🌍
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;twine upload dist/&lt;span class="k"&gt;*&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;; make sure &lt;code&gt;dist/*&lt;/code&gt; uploads everything inside dist/.&lt;/p&gt;

&lt;p&gt;And boom 💥 — &lt;strong&gt;Congratulations&lt;/strong&gt;, you’ve just uploaded your own package! 🎉🎉&lt;br&gt;
Take a moment. Screenshot it. Flex on LinkedIn 😎.&lt;/p&gt;




&lt;h2&gt;
  
  
  Something more 👀
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Common mistakes ❌
&lt;/h3&gt;

&lt;p&gt;❌ Hardcoded paths&lt;br&gt;
❌ Forgot README / LICENSE&lt;br&gt;
❌ Version conflict&lt;br&gt;
❌ Import errors due to bad structure&lt;br&gt;
❌ Uploading secrets accidentally (this one hurts the most 💀🔐)&lt;/p&gt;




&lt;h3&gt;
  
  
  Pro tips 💡
&lt;/h3&gt;

&lt;p&gt;✅ Add CLI using entry-points&lt;br&gt;
✅ Automate release via GitHub Actions&lt;br&gt;
✅ Tag versions (&lt;code&gt;v0.1.0&lt;/code&gt;)&lt;br&gt;
✅ Add &lt;code&gt;__version__&lt;/code&gt; inside package&lt;br&gt;
✅ Use &lt;code&gt;ruff&lt;/code&gt; / &lt;code&gt;black&lt;/code&gt; before publishing&lt;/p&gt;

&lt;p&gt;Clean code = happy users 😊.&lt;/p&gt;




&lt;p&gt;Hope you’ve successfully created your &lt;strong&gt;first package on PyPI&lt;/strong&gt; 🐍🎯&lt;br&gt;
Do share your package name in comments — let’s hype each other like World Cup fans 🇮🇳🏏.&lt;/p&gt;

&lt;p&gt;I’ve recently committed &lt;a href="https://pypi.org/project/pyshrink/" rel="noopener noreferrer"&gt;pyshrink&lt;/a&gt;. Do check it out 👀✨.&lt;/p&gt;

&lt;p&gt;Also, if you’ve got questions, confusion, or existential doubts about packaging — comment it out 💬😄.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Author&lt;/strong&gt;&lt;br&gt;
😎 &lt;a href="https://linkedin.com/in/nitin30kumar/" rel="noopener noreferrer"&gt;Nitin Kumar&lt;/a&gt; &lt;/p&gt;

</description>
      <category>python</category>
      <category>pylib</category>
      <category>tutorial</category>
      <category>learning</category>
    </item>
    <item>
      <title>Guide to Publishing a Python Project as a VS Code Extension</title>
      <dc:creator>Nitin Kumar</dc:creator>
      <pubDate>Sat, 07 Feb 2026 20:10:20 +0000</pubDate>
      <link>https://forem.com/nitinkumar30/guide-to-publishing-a-python-project-as-a-vs-code-extension-4emf</link>
      <guid>https://forem.com/nitinkumar30/guide-to-publishing-a-python-project-as-a-vs-code-extension-4emf</guid>
      <description>&lt;h1&gt;
  
  
  How I Built and Published My Own VS Code Extension (Yes, You Can Too 😌)
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy37uuhuwbvusncqd95nt.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%2Fy37uuhuwbvusncqd95nt.png" alt="PyShrink VSCode Extension" width="800" height="280"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Have you ever built a small tool and thought,&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Hmm… this would actually be useful inside VS Code 🤔”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And then immediately followed it up with:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Nah, publishing a VS Code extension sounds complicated.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Yeah… same.&lt;br&gt;
&lt;strong&gt;But I did it anyway.&lt;/strong&gt; And surprisingly, it wasn’t &lt;em&gt;that&lt;/em&gt; painful (for once).&lt;/p&gt;

&lt;p&gt;So in this article, I’ll walk you through &lt;strong&gt;how to convert your Python project into a VS Code Extension and publish it to the VS Code Marketplace&lt;/strong&gt; — step by step, in a casual, no-BS way.&lt;/p&gt;

&lt;p&gt;Think of this as a &lt;strong&gt;tutorial&lt;/strong&gt;, not a corporate manual 📘&lt;br&gt;
(We already have enough of those in 2026.)&lt;/p&gt;


&lt;h2&gt;
  
  
  What You’ll Need (a.k.a. Prerequisites)
&lt;/h2&gt;

&lt;p&gt;Before we summon the VS Code gods, make sure you have these things ready:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;✅ A &lt;strong&gt;VS Code Marketplace account&lt;/strong&gt;&lt;br&gt;
👉 &lt;a href="https://marketplace.visualstudio.com/vscode" rel="noopener noreferrer"&gt;Create one here&lt;/a&gt;&lt;br&gt;
&lt;em&gt;(Corporate account preferred, unless you enjoy random verification issues)&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;✅ A &lt;strong&gt;Python project&lt;/strong&gt; you actually want to ship&lt;br&gt;
Mine was: &lt;a href="https://github.com/nitinkumar30/pyshrink-vscode" rel="noopener noreferrer"&gt;pyshrink&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;✅ &lt;strong&gt;Visual Studio Code&lt;/strong&gt; (obviously)&lt;br&gt;
👉 &lt;a href="https://code.visualstudio.com/download" rel="noopener noreferrer"&gt;Download VS Code&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;✅ A &lt;strong&gt;stable internet connection&lt;/strong&gt;&lt;br&gt;
Because npm without internet is just… meditation 🧘‍♂️&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Let’s Get Our Hands Dirty 🧑‍💻
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;I’m assuming your Python project already exists in a directory called &lt;code&gt;project1&lt;/code&gt;&lt;br&gt;
(Rename it if you like — VS Code doesn’t judge, people do.)&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  Environment Setup (The “Please Don’t Skip This” Section)
&lt;/h2&gt;

&lt;p&gt;Before creating a VS Code extension, we need Node.js tooling.&lt;br&gt;
Yes, even for a Python project. Welcome to modern development 😬&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 1: Check Node.js version
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;node &lt;span class="nt"&gt;-v&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Step 2: Check npm version
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nt"&gt;-v&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;If these commands fail, pause everything and &lt;strong&gt;install Node.js first&lt;/strong&gt;.&lt;br&gt;
No shortcuts here.&lt;/p&gt;


&lt;h3&gt;
  
  
  Step 3: Install required global tools
&lt;/h3&gt;

&lt;p&gt;We’ll install:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;yo&lt;/code&gt; → scaffolding tool&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;generator-code&lt;/code&gt; → VS Code extension generator&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;vsce&lt;/code&gt; → VS Code Extension CLI
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; yo generator-code vsce
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 4: Verify npm global path (optional but helpful)
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm config get prefix
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This helps when VS Code or your terminal pretends it “can’t find” globally installed packages 🙃&lt;/p&gt;


&lt;h2&gt;
  
  
  Scaffold Your VS Code Extension
&lt;/h2&gt;

&lt;p&gt;Now comes the magic ✨&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 1: Generate the extension boilerplate
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;yo code
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;You’ll be prompted with a bunch of questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;TypeScript or JavaScript?&lt;/li&gt;
&lt;li&gt;Extension name?&lt;/li&gt;
&lt;li&gt;Description?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 &lt;strong&gt;Choose TypeScript if you’re unsure.&lt;/strong&gt;&lt;br&gt;
It’s basically JavaScript with better life choices.&lt;/p&gt;

&lt;p&gt;Once done, you’ll have a shiny new extension structure ready to customize.&lt;/p&gt;


&lt;h2&gt;
  
  
  Configure VS Code Commands (Where Your Extension Gets a Brain 🧠)
&lt;/h2&gt;

&lt;p&gt;Your extension doesn’t do anything unless you tell VS Code &lt;strong&gt;what commands it supports&lt;/strong&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 1: Edit &lt;code&gt;package.json&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Look for:&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="err"&gt;contributes.commands&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is where you define commands like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;--help&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--run&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;or any custom command your tool needs&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Step 2: Add activation events
&lt;/h3&gt;

&lt;p&gt;Inside the same &lt;code&gt;package.json&lt;/code&gt;, add your commands under:&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="err"&gt;activationEvents&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Technically, VS Code &lt;em&gt;might&lt;/em&gt; infer them automatically…&lt;br&gt;
But let’s not rely on assumptions — that’s how bugs are born 🐛&lt;/p&gt;


&lt;h2&gt;
  
  
  Compile TypeScript (Yes, This Matters)
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Step 1: Compile the extension
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run compile
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This generates the &lt;code&gt;extension.ts&lt;/code&gt; output required for VS Code to run your extension.&lt;/p&gt;


&lt;h3&gt;
  
  
  Common Error (Almost Guaranteed 😅)
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;❌ Cannot find module &lt;code&gt;vscode&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Quick fix:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm i &lt;span class="nt"&gt;--save-dev&lt;/span&gt; @types/vscode @types/node
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run compile again and breathe.&lt;/p&gt;




&lt;h2&gt;
  
  
  Test Your Extension Locally (Before the World Sees It)
&lt;/h2&gt;

&lt;p&gt;This is where we test the extension &lt;strong&gt;inside VS Code itself&lt;/strong&gt;, using something called &lt;strong&gt;Extension Dev Host&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Think of it as a sandbox version of VS Code that won’t embarrass you publicly.&lt;/p&gt;




&lt;h3&gt;
  
  
  Steps to test
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Press &lt;strong&gt;F5&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;In the new VS Code window:&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Press &lt;strong&gt;CTRL + SHIFT + P&lt;/strong&gt;

&lt;ol&gt;
&lt;li&gt;Run your commands (&lt;code&gt;--help&lt;/code&gt;, etc.)&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Your output should appear under the &lt;strong&gt;OUTPUT&lt;/strong&gt; tab.&lt;/p&gt;




&lt;h3&gt;
  
  
  If Extension Dev Host Doesn’t Open 😤
&lt;/h3&gt;

&lt;p&gt;This is a known VS Code issue.&lt;br&gt;
Check this GitHub thread:&lt;br&gt;
👉 &lt;a href="https://github.com/microsoft/vscode/issues/58470" rel="noopener noreferrer"&gt;https://github.com/microsoft/vscode/issues/58470&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Fix it before moving on — publishing broken extensions is how legends are &lt;em&gt;not&lt;/em&gt; made.&lt;/p&gt;




&lt;h2&gt;
  
  
  Package Your VS Code Extension 📦
&lt;/h2&gt;

&lt;p&gt;Now for the fun part — turning your project into a &lt;code&gt;.vsix&lt;/code&gt; file.&lt;/p&gt;

&lt;h3&gt;
  
  
  Important Rule
&lt;/h3&gt;

&lt;p&gt;Make sure &lt;strong&gt;README.md exists in the root directory&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;vsce&lt;/code&gt; &lt;em&gt;will&lt;/em&gt; refuse to cooperate otherwise.&lt;/p&gt;




&lt;h3&gt;
  
  
  Step 1: Compile again (just to be safe)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run compile
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 2: Package the extension
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx vsce package
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🎉 You’ll now see a &lt;code&gt;.vsix&lt;/code&gt; file — this is your extension, ready for the marketplace.&lt;/p&gt;




&lt;h2&gt;
  
  
  Upload to VS Code Marketplace 🚀
&lt;/h2&gt;

&lt;p&gt;Time to go public.&lt;/p&gt;

&lt;h3&gt;
  
  
  Steps to publish
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Sign in to &lt;strong&gt;Visual Studio Marketplace&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Go to &lt;strong&gt;Publisher Management&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Select your publisher&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;New Extension → Visual Studio Code&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Upload your &lt;code&gt;.vsix&lt;/code&gt; file&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Continue&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Review auto-filled details (tags matter for SEO 👀)&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Save &amp;amp; Upload&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Wait while it shows &lt;em&gt;“verifying”&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Once verified, make it &lt;strong&gt;Public&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Congrats — you’re officially a VS Code Extension Author 🎩&lt;/p&gt;




&lt;h2&gt;
  
  
  Editing &amp;amp; Re-uploading Your Extension
&lt;/h2&gt;

&lt;p&gt;Any time you change your code:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Compile TypeScript&lt;/li&gt;
&lt;li&gt;Package Extension&lt;/li&gt;
&lt;li&gt;Upload to marketplace&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Yes, every time.&lt;br&gt;
No, there’s no shortcut (yet).&lt;/p&gt;




&lt;h2&gt;
  
  
  Example Extension &amp;amp; Final Thoughts
&lt;/h2&gt;

&lt;p&gt;You can check out my sample project here:&lt;br&gt;
👉 GitHub: &lt;a href="https://github.com/nitinkumar30/pyshrink-vscode/" rel="noopener noreferrer"&gt;https://github.com/nitinkumar30/pyshrink-vscode/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Or try my first published extension directly:&lt;br&gt;
👉 VS Code Marketplace: &lt;strong&gt;Pyshrink&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you’ve:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Built your own extension 🚀&lt;/li&gt;
&lt;li&gt;Got stuck somewhere 🧩&lt;/li&gt;
&lt;li&gt;Or have a cool idea brewing ☕&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Drop a comment with your extension link or issue — I’ll try to help ASAP. 😄&lt;/p&gt;

&lt;p&gt;And if this helped you even a little, feel free to connect with me on&lt;br&gt;
👉 &lt;a href="https://linkedin.com/in/nitin30kumar/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Happy hacking &amp;amp; may your extensions never crash on activation 😄&lt;/p&gt;

</description>
      <category>vscode</category>
      <category>vscodextension</category>
      <category>python</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>How to Build India's Cheapest (Yet Most Effective) Penetration Testing Tool 🔥</title>
      <dc:creator>Nitin Kumar</dc:creator>
      <pubDate>Sun, 21 Dec 2025 18:45:19 +0000</pubDate>
      <link>https://forem.com/nitinkumar30/how-to-build-indias-cheapest-yet-most-effective-penetration-testing-tool-4m5h</link>
      <guid>https://forem.com/nitinkumar30/how-to-build-indias-cheapest-yet-most-effective-penetration-testing-tool-4m5h</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Hey there, cyber warriors! Ever wondered how security researchers make those jaw-dropping demos where a simple USB stick can bring down an entire network? Well, buckle up because today we're diving deep into the world of HID (Human Interface Device) attacks using none other than the legendary Digispark ATTiny85 – your ticket to penetration testing glory without burning a hole in your pocket! 💸&lt;/p&gt;

&lt;p&gt;In a country where we're masters at making the most with the least (जैसे कि मुंबई में 10 फ़ुट के कमरे में 5 लोग रहना), it shouldn't surprise you that we can build a professional-grade pentesting tool for less than the price of a decent Dosa! 😂&lt;/p&gt;

&lt;p&gt;Let's get started with this mind-blowing journey of turning a ₹350 chip into a security professional's secret weapon!&lt;/p&gt;

&lt;h2&gt;
  
  
  Objective
&lt;/h2&gt;

&lt;p&gt;Our main objective here (drumroll please 🥁) is to create an affordable, stealthy HID device that mimics a wireless mouse/keyboard dongle capable of executing pre-programmed attacks autonomously upon insertion. Think of it as your personal digital jadoo (magic) that works as soon as it touches the target system.&lt;/p&gt;

&lt;p&gt;🎯 Specific Goals:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Build a functional HID attack device under ₹500&lt;/li&gt;
&lt;li&gt;  Make it appear as a legitimate wireless mouse dongle&lt;/li&gt;
&lt;li&gt;  Execute automated payload sequence: wake system → open browser to specific URL → close browser → execute shutdown command&lt;/li&gt;
&lt;li&gt;  Ensure device maintains HID functionality post-attack (for stealth)&lt;/li&gt;
&lt;li&gt;  Keep everything undetected by traditional antivirus solutions (because who doesn't love flying under the radar? 🦅)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Hardware Requirements
&lt;/h2&gt;

&lt;p&gt;Remember how we said we're going budget-friendly? Well, here's where we prove it! 🤑&lt;/p&gt;

&lt;h3&gt;
  
  
  Main Hardware (The Hero of Our Story):
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Digispark ATTiny85 USB Development Board&lt;/strong&gt; – ₹350-500 [&lt;a href="https://techtonics.in/product/digispark-attiny85-usb-development-board/" rel="noopener noreferrer"&gt;Techtonics Purchase Link&lt;/a&gt;]&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;This little beauty is cheaper than your monthly chai consumption but more dangerous to unpatched systems!&lt;/em&gt; 💻💥&lt;/p&gt;

&lt;h3&gt;
  
  
  Optional Accessories (Because We Like to Dress Up Our Toys):
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;USB Enclosure/Case&lt;/strong&gt; – ₹100-200 (To make it look fancy like those premium wireless mouse dongles)&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;USB Extension Cable&lt;/strong&gt; – ₹50 (For harvesting those components, just like mom uses empty containers 🥡)&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Breadboard Jumper Wires&lt;/strong&gt; (if not included) – ₹30&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Soldering Kit&lt;/strong&gt; (If you're feeling extra DIY) – ₹200-500 [&lt;a href="https://www.robokits.co.in/" rel="noopener noreferrer"&gt;Local Electronics Store&lt;/a&gt;]&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;💡 &lt;em&gt;Pro Tip: You can always salvage components from old USB devices lying around. Remember, in Indian households, nothing goes to waste!&lt;/em&gt; 🏠🗑️&lt;/p&gt;

&lt;h3&gt;
  
  
  Other Alternatives (For Those Who Want to Spend More 💸):
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Arduino Pro Micro&lt;/strong&gt; – ₹600-800 [&lt;a href="https://robokits.co.in/development-board/boards-compatible-with-aruduino/pro-micro-5v-16m-mini-leonardo-microcontroller-development-board" rel="noopener noreferrer"&gt;Robokits Purchase Link&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Pre-made BadUSB Modules&lt;/strong&gt; – ₹800-1200 [&lt;a href="https://nilgiristores.in/product/badusb-development-board-usb-atmega32u4-virtual-keyboard-module/" rel="noopener noreferrer"&gt;Nilgiri Stores Purchase Link&lt;/a&gt;]&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;But why spend more when you can build the same thing for less? As they say, "सस्ता सोना चाँदी से भी चमकदार होता है!"&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Software Requirements
&lt;/h2&gt;

&lt;p&gt;Let's get our digital workspace ready – it's time to install some serious stuff!&lt;/p&gt;

&lt;h3&gt;
  
  
  Arduino IDE (The Boss Software) 👑:
&lt;/h3&gt;

&lt;p&gt;Absolutely free and open-source! No excuses for not downloading this:&lt;/p&gt;

&lt;p&gt;🔗 Download Link: &lt;a href="https://www.arduino.cc/en/software" rel="noopener noreferrer"&gt;https://www.arduino.cc/en/software&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;It's like downloading WhatsApp but for hardware hackers!&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Digistump Board Package (The Magical Add-on):
&lt;/h3&gt;

&lt;p&gt;Don't worry, no magic wand required, just some simple copy-pasting! Follow these steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Open Arduino IDE&lt;/li&gt;
&lt;li&gt; Go to &lt;code&gt;File&lt;/code&gt; → &lt;code&gt;Preferences&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt; In "Additional Boards Manager URLs" field, paste: &lt;code&gt;http://digistump.com/package_digistump_index.json&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt; Click &lt;code&gt;OK&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt; Go to &lt;code&gt;Tools&lt;/code&gt; → &lt;code&gt;Board&lt;/code&gt; → &lt;code&gt;Boards Manager&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt; Search for "Digistump"&lt;/li&gt;
&lt;li&gt; Install "Digistump AVR Boards by Digistump"&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;💡 &lt;em&gt;This is like adding a new channel to your TV – suddenly you can see way cooler content!&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How To: The Complete DIY Guide 🛠️
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 1: Assembling Hardware (Or Not Assembling, Depending on Your Mood)
&lt;/h3&gt;

&lt;p&gt;The beauty of the Digispark (yes, there's beauty in simplicity!) is that it comes pre-assembled. You just need to plug it in... well, almost!&lt;/p&gt;

&lt;p&gt;But if you're feeling fancy and want to make it look like a premium wireless mouse dongle, here's the plan:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Option 1: Plug &amp;amp; Play&lt;/strong&gt; – Just use the existing micro-USB connector. Fast, easy, no soldering required. Perfect for those who hate DIY with a passion!&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Option 2: Stealth Mode&lt;/strong&gt; (काला घोड़ा अंधेरे में दौड़ता है):&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Desolder the micro-USB connector (if you're brave enough 🤯)&lt;/li&gt;
&lt;li&gt; Salvage an old USB-A male connector (from a broken mouse or an extension cable)&lt;/li&gt;
&lt;li&gt; Solder wires directly to the ATTiny85 chip:

&lt;ul&gt;
&lt;li&gt;  VCC → 5V&lt;/li&gt;
&lt;li&gt;  GND → GND&lt;/li&gt;
&lt;li&gt;  D+ → Pin 3&lt;/li&gt;
&lt;li&gt;  D- → Pin 4&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt; Enclose everything in a nice USB-shaped case&lt;/li&gt;

&lt;li&gt; Add some hot glue for that premium waterproof feel! 😎&lt;/li&gt;

&lt;/ol&gt;

&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 2: What Will We Do Exactly?
&lt;/h3&gt;

&lt;p&gt;Here's the evil plan (but a very authorized one!):&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Device wakes up the sleeping computer (because we're polite like that 😇)&lt;/li&gt;
&lt;li&gt; Automatically opens a browser to visit your specified website &lt;/li&gt;
&lt;li&gt; Closes the browser (keeping things clean like our moms taught us!)&lt;/li&gt;
&lt;li&gt; Opens Command Prompt (CMD)&lt;/li&gt;
&lt;li&gt; Executes a shutdown command with a 60-second countdown &lt;/li&gt;
&lt;li&gt; Maintains mouse functionality so it looks like a genuine wireless mouse dongle (nobody suspects the cute little mouse!)&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Step 3: The Payload – What Makes This Device Dangerous 😈
&lt;/h3&gt;

&lt;p&gt;Here's the exact code that will bring tears to a system administrator's eyes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;"DigiKeyboard.h"&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;DigiKeyboard&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;DigiKeyboard&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sendKeyStroke&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Initialize&lt;/span&gt;
  &lt;span class="n"&gt;DigiKeyboard&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// Wait for system to fully wake up&lt;/span&gt;
  &lt;span class="n"&gt;DigiKeyboard&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// Open Run dialog&lt;/span&gt;
  &lt;span class="n"&gt;DigiKeyboard&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sendKeyStroke&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;KEY_R&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;MOD_GUI_LEFT&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;DigiKeyboard&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// Launch Chrome/Edge with the specified URL&lt;/span&gt;
  &lt;span class="n"&gt;DigiKeyboard&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"chrome.exe https://nitinkumar30.netlify.app/"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;DigiKeyboard&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sendKeyStroke&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;KEY_ENTER&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;DigiKeyboard&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;8000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// Close browser&lt;/span&gt;
  &lt;span class="n"&gt;DigiKeyboard&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sendKeyStroke&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;KEY_F4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;MOD_ALT_LEFT&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;DigiKeyboard&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// Open CMD&lt;/span&gt;
  &lt;span class="n"&gt;DigiKeyboard&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sendKeyStroke&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;KEY_R&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;MOD_GUI_LEFT&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;DigiKeyboard&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;DigiKeyboard&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"cmd"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;DigiKeyboard&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sendKeyStroke&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;KEY_ENTER&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;DigiKeyboard&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// Execute shutdown command&lt;/span&gt;
  &lt;span class="n"&gt;DigiKeyboard&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"shutdown /s /t 60"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;DigiKeyboard&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sendKeyStroke&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;KEY_ENTER&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;loop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Nothing to do here (single shot attack)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;💡 Understanding the Payload:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;code&gt;DigiKeyboard.delay()&lt;/code&gt; – Gives system time to process actions&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;sendKeyStroke(KEY_R, MOD_GUI_LEFT)&lt;/code&gt; – Equivalent to pressing Windows Key + R&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;DigiKeyboard.print()&lt;/code&gt; – Types text characters&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;MOD_ALT_LEFT&lt;/code&gt; / &lt;code&gt;MOD_GUI_LEFT&lt;/code&gt; – Modifier keys (Alt, Windows key)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 4: Instructions to Upload Payload (The Moment of Truth!) ⚡
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Open Arduino IDE&lt;/strong&gt; – Make sure you've installed the Digistump package as discussed earlier&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Select Board Settings&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;  Go to &lt;code&gt;Tools&lt;/code&gt; → &lt;code&gt;Board&lt;/code&gt; → Select "Digispark (Default - 16.5mhz)"&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Paste Your Payload Code&lt;/strong&gt; – Copy-paste the code from above into the IDE&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Click Verify&lt;/strong&gt; – Make sure there are no compilation errors. If there are, double-check your typing (we've all been there! 👀)&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Click Upload&lt;/strong&gt; – This is where things get interesting!&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;NOW (and only NOW) plug in your Digispark&lt;/strong&gt; – This device uploads code when connected, not before!&lt;/li&gt;
&lt;li&gt; Watch for the success message: "Micronucleus done. Thank you!" (It's like the device is saying "thanks for making me dangerous!")&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;⏰ &lt;em&gt;Important Timing Tip: You have 60 seconds after clicking upload to plug in the device. Set an alarm if you're prone to forgetting!&lt;/em&gt; ⏰&lt;/p&gt;

&lt;h2&gt;
  
  
  Testing &amp;amp; Deployment (The Fun Part!) 🎯
&lt;/h2&gt;

&lt;p&gt;Before unleashing this digital beast on actual targets (with proper written permissions, of course!), let's test it safely:&lt;/p&gt;

&lt;h3&gt;
  
  
  Safe Testing Protocol:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt; Prepare a test computer (one you own or have explicit permission to test)&lt;/li&gt;
&lt;li&gt; Save all work (no one likes losing data!)&lt;/li&gt;
&lt;li&gt; Plug in your Digispark and watch the magic unfold 🎩✨&lt;/li&gt;
&lt;li&gt; If shutdown command executes, quickly cancel it by typing &lt;code&gt;shutdown /a&lt;/code&gt; in CMD&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Deployment Tips:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  The device maintains HID functionality post-attack, so it appears as a legitimate mouse even after the payload execution&lt;/li&gt;
&lt;li&gt;  Most systems don't have USB-based antivirus scanning for HID devices (which is why this method works so well!)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;💡 &lt;em&gt;Security Pro Tip: This attack is so effective because it bypasses traditional antivirus detection. AVs are looking for malicious files, not legitimate keyboard inputs!&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Method Works Like Magic ✨
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Undetectable &amp;amp; Stealthy:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Appears as Standard HID Device&lt;/strong&gt; – Your Digispark looks like any other USB mouse or keyboard to the system&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;No File Write Required&lt;/strong&gt; – Unlike USB drives, this device doesn't mount as storage, so it can't be scanned by file-based antivirus&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Keyboard/Mouse Input&lt;/strong&gt; – Antivirus won't flag you for typing "shutdown /s" because, technically, that's what it looks like to the system&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Physical Appearance&lt;/strong&gt; – With proper casing, it literally looks like a wireless mouse dongle, making it completely innocuous in appearance&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As they say, the best hiding place is in plain sight! 🙈&lt;/p&gt;

&lt;h2&gt;
  
  
  Legal &amp;amp; Ethical Reminder (Read This Before Getting Overconfident!) ⚠️
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;🚨 SERIOUS BUSINESS SECTION – PLEASE READ CAREFULLY 🚨&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This technique is EXTREMELY powerful and should only be used in authorized penetration testing scenarios with:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Written permission&lt;/strong&gt; from the system/network owner&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Proper documentation&lt;/strong&gt; and approval from relevant authorities&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Compliance with IT Act 2000&lt;/strong&gt; (India) and similar regulations elsewhere&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Responsible disclosure&lt;/strong&gt; practices if vulnerabilities are found&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;❌ DON'TS:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Don't plug this into random public computers (like in cyber cafes)&lt;/li&gt;
&lt;li&gt;  Don't use it to prank friends (trust us, they won't find it funny when their computer shuts down)&lt;/li&gt;
&lt;li&gt;  Don't test on systems you don't own without explicit written permission&lt;/li&gt;
&lt;li&gt;  Don't lose your job/face legal consequences because you thought this was a joke 😅&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;✅ DOs:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Use in authorized pentesting engagements&lt;/li&gt;
&lt;li&gt;  Document all testing activities&lt;/li&gt;
&lt;li&gt;  Follow responsible disclosure practices&lt;/li&gt;
&lt;li&gt;  Educate organizations about USB security risks&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;Let's wrap this up faster than a shutdown command executes! 😂&lt;/p&gt;

&lt;p&gt;We've learned how to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Build a professional-grade HID attack device for under ₹500 💰&lt;/li&gt;
&lt;li&gt;  Make it appear absolutely legitimate as a wireless mouse dongle 🖱️&lt;/li&gt;
&lt;li&gt;  Program it to execute automated payloads without file-based antivirus detection 🛡️&lt;/li&gt;
&lt;li&gt;  Understand the technical aspects while keeping costs minimal 📉&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Key Takeaways:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Cost-Effective&lt;/strong&gt;: ₹350 hardware gives you professional capabilities&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Undetectable&lt;/strong&gt;: Appears as legitimate HID device &lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Autonomous&lt;/strong&gt;: Executes attacks without user interaction&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Reusable&lt;/strong&gt;: Can be reprogrammed for different payloads&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Stealthy&lt;/strong&gt;: Maintains mouse functionality for disguise&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The Digispark ATTiny85 is like the "Aam Aadmi" of penetration testing hardware – affordable, accessible, and shockingly effective! Whether you're a security professional, researcher, or hobbyist, this device proves that sometimes the cheapest solution is the most powerful one.&lt;/p&gt;

&lt;p&gt;So go ahead, build your own, test responsibly, and remember – with great power (and cheap hardware) comes great responsibility! 👨‍💻✨&lt;/p&gt;

&lt;p&gt;And hey, if this article helped you, you know what to do – smash that like button! (Just kidding, there's no like button, but you get the point 😂)&lt;/p&gt;

</description>
      <category>cybersecurity</category>
      <category>arduino</category>
      <category>badusb</category>
      <category>securitytesting</category>
    </item>
    <item>
      <title>Quick Fix for Git's "Error Setting Certificate File" Issue</title>
      <dc:creator>Nitin Kumar</dc:creator>
      <pubDate>Wed, 09 Apr 2025 10:16:04 +0000</pubDate>
      <link>https://forem.com/nitinkumar30/git-certificate-error-eradication-1jkj</link>
      <guid>https://forem.com/nitinkumar30/git-certificate-error-eradication-1jkj</guid>
      <description>&lt;p&gt;Have you anytime got an error regarding git while uploading files to remote repo via git from your system about setting certificate file?&lt;/p&gt;




&lt;p&gt;Use case :-)&lt;/p&gt;

&lt;p&gt;I've just experienced this &amp;amp; let me tell you, I've just ran the PUSH command of git:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git push &lt;span class="nt"&gt;-u&lt;/span&gt; origin main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The exact error I've got was:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;unable&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="k"&gt;access&lt;/span&gt; &lt;span class="s1"&gt;'https://github.com/nitinkumar30/BDD-allure-test-project.git/'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;error&lt;/span&gt; &lt;span class="n"&gt;setting&lt;/span&gt; &lt;span class="n"&gt;certificate&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;C&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Program&lt;/span&gt; &lt;span class="n"&gt;Files&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Git&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;mingw64&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ssl&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;certs&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ca&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;bundle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;crt&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The file actually didn't exists &amp;amp; need to put it inside. Also, when I've checked the certificate file - &lt;strong&gt;ca-bundle.crt&lt;/strong&gt;, it was present in another location. &lt;/p&gt;




&lt;p&gt;Solution :-)&lt;/p&gt;

&lt;p&gt;The specified file &lt;strong&gt;ca-bundle.crt&lt;/strong&gt; should be present &amp;amp; your git should pointing to that certificate while connecting/interacting with the remote repo. But, while pushing code, we're getting file isn't present in the specified directory. It's present in another directory. &lt;br&gt;
So, we can point our git to new directory where that certificate is present. I've tried searching &amp;amp; got it in the directory - &lt;strong&gt;C:/Program Files/Git/usr/ssl/certs/ca-bundle.crt&lt;/strong&gt; instead of &lt;strong&gt;C:/Program Files/Git/mingw64/ssl/certs/ca-bundle.crt&lt;/strong&gt; . &lt;/p&gt;

&lt;p&gt;We can directly do this using following git command of &lt;code&gt;git config&lt;/code&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git config &lt;span class="nt"&gt;--global&lt;/span&gt; http.sslCAInfo C:&lt;span class="se"&gt;\P&lt;/span&gt;rogram Files&lt;span class="se"&gt;\G&lt;/span&gt;it&lt;span class="se"&gt;\u&lt;/span&gt;sr&lt;span class="se"&gt;\s&lt;/span&gt;sl&lt;span class="se"&gt;\c&lt;/span&gt;erts&lt;span class="se"&gt;\c&lt;/span&gt;a-bundle.crt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This'll direct it to the certificate file for git. &lt;/p&gt;

&lt;p&gt;But but but wait, here's a catch. Now, git is directing that certificate to both the locations right? How to remove the old redirected directory for bundle certificate?&lt;/p&gt;

&lt;p&gt;We've a command to delete/unset all old certificate bundle directory.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git config &lt;span class="nt"&gt;--global&lt;/span&gt; &lt;span class="nt"&gt;--unset-all&lt;/span&gt; http.sslCAInfo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And, to check all the locations where this certificate is directing, we can check with following git command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git config &lt;span class="nt"&gt;--global&lt;/span&gt; &lt;span class="nt"&gt;--get-all&lt;/span&gt; http.sslCAInfo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But one more problem here, when we're running our file again to push, we're getting another error:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="n"&gt;error&lt;/span&gt; &lt;span class="n"&gt;setting&lt;/span&gt; &lt;span class="n"&gt;certificate&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;C&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Program&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Why so?&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Because of the space between the command 'Program' &amp;amp; 'Files' although it's a folder name, it'll take it as 2 different entities.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Now to resolve it, we'll edit the command like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt; git config &lt;span class="nt"&gt;--global&lt;/span&gt; http.sslCAInfo C:/Program&lt;span class="se"&gt;\ &lt;/span&gt;Files/Git/usr/ssl/certs/ca-bundle.crt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;; '\' will ignore the space between 'Program' &amp;amp; 'Files'. Hence, will run as expected. &lt;/p&gt;

&lt;p&gt;You can now check all the set paths of certificate bundle. &lt;/p&gt;

&lt;p&gt;Hope this helped you, in case you've got this error anytime during your git. It's a small yet typical error one gets who might take whole day to debug. &lt;/p&gt;

&lt;p&gt;I'm btw, using PyCharm Community to run &amp;amp; connect to my github repo directly.&lt;/p&gt;

</description>
      <category>git</category>
      <category>github</category>
      <category>errors</category>
      <category>programming</category>
    </item>
    <item>
      <title>Implement BDD in python using behave &amp; allure</title>
      <dc:creator>Nitin Kumar</dc:creator>
      <pubDate>Tue, 08 Apr 2025 10:59:31 +0000</pubDate>
      <link>https://forem.com/nitinkumar30/implement-bdd-in-python-using-behave-allure-56c3</link>
      <guid>https://forem.com/nitinkumar30/implement-bdd-in-python-using-behave-allure-56c3</guid>
      <description>&lt;p&gt;So, what's BDD, Behave, Allure? Let's first understand this.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Behavior-Driven Development (BDD) is a development approach that enhances collaboration between developers, testers, and non-technical stakeholders by using natural language to define the software’s behavior. It focuses on the what (desired outcomes) instead of the how (implementation). Using Gherkin syntax (Given-When-Then), BDD helps define test scenarios in an easy-to-understand format, making requirements clear for everyone involved.  &lt;/p&gt;

&lt;p&gt;Behave is a Python BDD framework that allows writing tests in Gherkin syntax. It integrates with tools like Selenium to automate browser interactions. Behave lets you define test scenarios in feature files and link them to Python functions (step definitions). It automatically executes these tests to verify application behavior in real-world scenarios.  &lt;/p&gt;

&lt;p&gt;Allure is a popular test reporting framework that provides an interactive, user-friendly interface for visualizing test results. It integrates with various testing frameworks (including Behave) and generates detailed reports that help teams understand the health of their applications.  &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Now, that you understood what each of them means, let's understand how to actually implement BDD in python using behave &amp;amp; allure.&lt;/p&gt;




&lt;p&gt;Before going through the code, let's see the project structure for clear understanding:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.\
│
├── config\
│   └── configreader.py     # File created for some methods to call from defined properties files
│
├── features\
│   ├── login.feature     # Sample demo login feature created
│   └── loginAgain.feature  # Actual usable login feature file used
│
├── screenshots\      # Directory used to store screenshots
│   ├── 1.png
│   ├── 2.png
│   └── 3.png
│
├── steps\
│   ├── test_steps.py     # Step def file for the login feature file
│   └── utils.py    # Additional methods created as a utility file
│
├── xpaths\
│   └── loginPage.properties    # Expected xpaths for the login page is described here
│
└──  config.properties    # All the configuration related data is present here

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

&lt;/div&gt;



&lt;p&gt;This is the low-end structure of it. Folder structure will depend on how big is your project.&lt;/p&gt;




&lt;p&gt;We've different type of files present:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;.feature files (gherkin language)&lt;/li&gt;
&lt;li&gt;.py files (of course)&lt;/li&gt;
&lt;li&gt;.properties files (where main data is being hold)&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;Following are the recommended (important) libraries to install:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://behave.readthedocs.io/en/latest/" rel="noopener noreferrer"&gt;behave&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://allurereport.org/docs/" rel="noopener noreferrer"&gt;allure-behave&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.selenium.dev/documentation/" rel="noopener noreferrer"&gt;selenium&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;Required Tools:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;PyCharm Community as an IDLE (Download from &lt;a href="https://www.jetbrains.com/pycharm/download/?section=windows" rel="noopener noreferrer"&gt;here&lt;/a&gt; )&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;First, we need to create a feature file which is being created typically by Business Analyst. Following is the code for sample feature file (login.feature)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Feature: Login functionality validation using credentials

  Scenario Outline: Successful login with provided credentials
    Given User is on login page
    When User provides valid login credentials as &amp;lt;username&amp;gt; and &amp;lt;password&amp;gt;
    Then User will be displayed with a current page title

    Examples: Valid
      | username | password |
      | nitin    | kumar    |
      | black    | eagle    |

    Examples: Invalid
      | username | password |
      | nitin    | nitin    |

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

&lt;/div&gt;



&lt;p&gt;Here; we're taking 3 different credentials for testing, 2 are valid &amp;amp; last one is invalid credentials.&lt;/p&gt;




&lt;p&gt;Now, that we've created the feature file, we need to create a step def file as well to implement them. So, we've test_steps.py as step def files should always starts from 'test_' keyword.&lt;/p&gt;

&lt;p&gt;First, we need to import all the libraries, methods &amp;amp; necessary data we've created:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import time

from behave import given, when, then
from selenium import webdriver
from selenium.webdriver.common.by import By

from config.configreader import *
from utils import *
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, we need to implement all the @given, @when &amp;amp; &lt;a class="mentioned-user" href="https://dev.to/then"&gt;@then&lt;/a&gt; from feature files.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@given('User is on login page')
def step_impl(context):
    context.driver = webdriver.Chrome()
    context.driver.get(get_property_value('URL'))
    addScreenshot(context, '1')
    time.sleep(2)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;here; 1st &amp;amp; 2nd line is understandable. In 3rd line, we're initializing Chrome driver. In 4th line, we're importing some data 'URL' from properties file &amp;amp; in 5th line, I'm taking screenshot &amp;amp; adding it into our allure report with filename as '1'. Then, I'm taking a 2secs nap.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@when('User provides valid login credentials as {username} and {password}')
def step_impl(context, username, password):
    context.driver.find_element(By.XPATH, get_loginPage_xpath_value('XPATHusername')).send_keys(username)
    context.driver.find_element(By.XPATH, get_loginPage_xpath_value('XPATHpassword')).send_keys(password)
    addScreenshot(context, '2')
    context.driver.find_element(By.XPATH, get_loginPage_xpath_value('XPATHloginBtn')).click()

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

&lt;/div&gt;



&lt;p&gt;Here; we're just providing credentials &amp;amp; clicking on login button.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@then('User will be displayed with a current page title')
def step_impl(context):
    time.sleep(2)
    assert context.driver.title == get_property_value(
        'titleHomepage'), 'Wrong title captured or wrong web portal redirected !'
    addScreenshot(context, '3')
    context.driver.quit()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;; Here, we're just checking the page's title &amp;amp; validating it with the provided data in config file.  &lt;/p&gt;




&lt;p&gt;One file which I want to highlight is utils.py file where a method I've created - addScreenshot().&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;def addScreenshot(context, filename):
    screenshot_path = 'screenshots/' + filename + '.png'
    # Capture the screenshot
    context.driver.save_screenshot(screenshot_path)

    # Attach the screenshot to the Allure report
    with open(screenshot_path, 'rb') as file:
        allure.attach(file.read(), filename, attachment_type=allure.attachment_type.PNG)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;; Here, I've captured the screenshot &amp;amp; added into the allure report which is customized with our reporting part.&lt;/p&gt;




&lt;p&gt;Now, every file we've created. Other files you can check in my &lt;a href="https://github.com/nitinkumar30/BDD-allure-test-project" rel="noopener noreferrer"&gt;GitHub Repository&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;We need to run the project now. To run &amp;amp; see the report, we need a 2-step command to run. &lt;/p&gt;

&lt;p&gt;Go to terminal of our IDLE &amp;amp; run following 2 commands.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; behave features/loginAgain.feature -f allure_behave.formatter:AllureFormatter -o loginAgain

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

&lt;/div&gt;



&lt;p&gt;; loginAgain.feature is the feature file we're running &amp;amp; loginAgain is the directory where all the reporting files will be generated&lt;/p&gt;

&lt;p&gt;and then ...&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; allure serve loginAgain
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;;loginAgain is the same directory we've generated above.&lt;/p&gt;

&lt;p&gt;The report will be generated &amp;amp; will be displayed in your browser as html file&lt;/p&gt;




&lt;p&gt;Keep Testing | Keep Automating | Keep Learning &lt;/p&gt;

&lt;p&gt;Feel free to reach out to me via &lt;a href="https://linkedin.com/in/nitin30kumar/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;, &lt;a href="https://instagram.com/nitinkumar30.py/" rel="noopener noreferrer"&gt;Instagram&lt;/a&gt; or checkout my &lt;a href="https://nitinkumar30.netlify.app/" rel="noopener noreferrer"&gt;Portfolio&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>bdd</category>
      <category>python</category>
      <category>testing</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Add SSH key in GitLab account</title>
      <dc:creator>Nitin Kumar</dc:creator>
      <pubDate>Wed, 22 Jan 2025 09:24:09 +0000</pubDate>
      <link>https://forem.com/nitinkumar30/add-ssh-key-in-gitlab-account-45j9</link>
      <guid>https://forem.com/nitinkumar30/add-ssh-key-in-gitlab-account-45j9</guid>
      <description>&lt;p&gt;Today, we'll see how we can add SSH key to our GitLab account so that we can push, pull &amp;amp; perform tasks from our GitLab in local machine.&lt;/p&gt;

&lt;p&gt;First, we need to have a GitLab account without any SSH key (preferred).&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%2F61a5aec3e8wwyx1xfea4.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%2F61a5aec3e8wwyx1xfea4.png" alt="No SSL certificate" width="800" height="461"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, we need to create SSL certificate. Remember, Gitlab only allows some hashing methods for this. Following is the list:&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%2F8jdk5nndesuahoifhtds.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%2F8jdk5nndesuahoifhtds.png" alt="List of hashing methods" width="800" height="395"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, we need to open Command Prompt in our local machine &amp;amp; enter following command:-&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ssh-keygen -t ed25519 -C "YOUR_MAIL_ID"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;; since I want to use ed25519 hashing algo, I've used that. For others, use those names.&lt;/p&gt;

&lt;p&gt;Then, just press enter for the prompts, for simplicity, it'll ask for the filename &amp;amp; any passphrase we wanna use.&lt;br&gt;
Keys will be generated after you press enter. It'll look like this :- &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%2Fescawtzwkmgaqb79e94u.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%2Fescawtzwkmgaqb79e94u.png" alt="Generated keys" width="800" height="244"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, files will be generated like below :-&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%2Flk1bizou47k2xs3y0tq4.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%2Flk1bizou47k2xs3y0tq4.png" alt="Files generated" width="385" height="192"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You open the file with extension .pub just generated &amp;amp; copy whole file content. &lt;/p&gt;

&lt;p&gt;Go to the &lt;a href="https://gitlab.com/-/user_settings/ssh_keys" rel="noopener noreferrer"&gt;SSL page in Gitlab&lt;/a&gt; &amp;amp; click on &lt;em&gt;Add new Key&lt;/em&gt; button&lt;/p&gt;

&lt;p&gt;In the SSL content, paste the key copied from file. &lt;br&gt;
Put other details as needed &amp;amp; click on Add Key button.&lt;/p&gt;

&lt;p&gt;Your key will be added successfully with other SSH key &amp;amp; fingerprint details.&lt;/p&gt;

&lt;p&gt;Now, just to check your gitlab is connected to your local machine, put below command &amp;amp; press Enter :-&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; ssh -vT git@gitlab.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You must see a message 'Welcome to Gitlab, [YOUR_USERNAME]!' in the screen along with some other details.&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%2Fbtis9bkjfv5bwyp914fv.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%2Fbtis9bkjfv5bwyp914fv.png" alt="Validating github connection" width="529" height="364"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Feel free to reach out to me via &lt;a href="https://linkedin.com/in/nitin30kumar/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;, &lt;a href="https://instagram.com/nitinkumar30.py/" rel="noopener noreferrer"&gt;Instagram&lt;/a&gt; or checkout my &lt;a href="https://nitinkumar30.netlify.app/" rel="noopener noreferrer"&gt;Portfolio&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;HAPPY HACKING !!!&lt;/p&gt;

</description>
      <category>gitlab</category>
      <category>sslkey</category>
      <category>ssh</category>
    </item>
    <item>
      <title>My VAPT Learning Journey</title>
      <dc:creator>Nitin Kumar</dc:creator>
      <pubDate>Sun, 15 Dec 2024 20:06:49 +0000</pubDate>
      <link>https://forem.com/nitinkumar30/journey-in-vapt-self-training-58k3</link>
      <guid>https://forem.com/nitinkumar30/journey-in-vapt-self-training-58k3</guid>
      <description>&lt;p&gt;I'm very passionate about Cyber Security, and so I was thinking of starting a series where I'll try to update you about the progress, topics, and related labs each day for better hands-on practice.&lt;/p&gt;

&lt;p&gt;The topics will be mostly from &lt;a href="https://portswigger.net/" rel="noopener noreferrer"&gt;Portswigger Website&lt;/a&gt;. Also, for some more practical discussion, I'll refer to &lt;a href="https://application.security/" rel="noopener noreferrer"&gt;Kontra&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you're also a beginner &amp;amp; want to begin your journey in Cyber Security, you can follow my VAPT tutorial with labs series &amp;amp; if you're an expert or in this journey, you can help me out with some suggestions.&lt;/p&gt;

&lt;p&gt;Following are the topics that I'll cover during this journey:&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Server Side topics&lt;/strong&gt;
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://portswigger.net/web-security/sql-injection" rel="noopener noreferrer"&gt;SQL injection&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://portswigger.net/web-security/authentication" rel="noopener noreferrer"&gt;Authentication&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://portswigger.net/web-security/file-path-traversal" rel="noopener noreferrer"&gt;Path traversal&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://portswigger.net/web-security/os-command-injection" rel="noopener noreferrer"&gt;Command injection&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://portswigger.net/web-security/logic-flaws" rel="noopener noreferrer"&gt;Business logic vulnerabilities&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://portswigger.net/web-security/information-disclosure" rel="noopener noreferrer"&gt;Information disclosure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://portswigger.net/web-security/access-control" rel="noopener noreferrer"&gt;Access control&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://portswigger.net/web-security/file-upload" rel="noopener noreferrer"&gt;File upload vulnerabilities&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://portswigger.net/web-security/race-conditions" rel="noopener noreferrer"&gt;Race conditions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://portswigger.net/web-security/ssrf" rel="noopener noreferrer"&gt;Server-side request forgery (SSRF)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://portswigger.net/web-security/xxe" rel="noopener noreferrer"&gt;XXE injection&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://portswigger.net/web-security/nosql-injection" rel="noopener noreferrer"&gt;NoSQL injection&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://portswigger.net/web-security/api-testing" rel="noopener noreferrer"&gt;API testing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://portswigger.net/web-security/web-cache-deception" rel="noopener noreferrer"&gt;Web cache deception&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Client Side topics&lt;/strong&gt;
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://portswigger.net/web-security/cross-site-scripting" rel="noopener noreferrer"&gt;Cross-site scripting (XSS)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://portswigger.net/web-security/csrf" rel="noopener noreferrer"&gt;Cross-site request forgery (CSRF)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://portswigger.net/web-security/cors" rel="noopener noreferrer"&gt;Cross-origin resource sharing (CORS)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://portswigger.net/web-security/clickjacking" rel="noopener noreferrer"&gt;Clickjacking&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://portswigger.net/web-security/dom-based" rel="noopener noreferrer"&gt;DOM-based vulnerabilities&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://portswigger.net/web-security/websockets" rel="noopener noreferrer"&gt;WebSockets&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Advanced topics&lt;/strong&gt;
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://portswigger.net/web-security/deserialization" rel="noopener noreferrer"&gt;Insecure deserialization&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://portswigger.net/web-security/llm-attacks" rel="noopener noreferrer"&gt;Web LLM attacks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://portswigger.net/web-security/graphql" rel="noopener noreferrer"&gt;GraphQL API vulnerabilities&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://portswigger.net/web-security/server-side-template-injection" rel="noopener noreferrer"&gt;Server-side template injection&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://portswigger.net/web-security/web-cache-poisoning" rel="noopener noreferrer"&gt;Web cache poisoning&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://portswigger.net/web-security/host-header" rel="noopener noreferrer"&gt;HTTP Host header attacks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://portswigger.net/web-security/request-smuggling" rel="noopener noreferrer"&gt;HTTP request smuggling&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://portswigger.net/web-security/oauth" rel="noopener noreferrer"&gt;OAuth authentication&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://portswigger.net/web-security/jwt" rel="noopener noreferrer"&gt;JWT attacks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://portswigger.net/web-security/prototype-pollution" rel="noopener noreferrer"&gt;Prototype pollution&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://portswigger.net/web-security/essential-skills" rel="noopener noreferrer"&gt;Essential skills&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;Let me know my plan &amp;amp; your ideas, suggestions, or pointers to discuss this. I'm open to collaboration too. I'll try to create more concise but informative blogs on each topic &amp;amp; it's solution.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;We can check our leaderboard/dashboard &lt;a href="https://portswigger.net/web-security/dashboard" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;To get started, you need to create an account in Portswigger &amp;amp; my main focus will be on this website only. &lt;/p&gt;

&lt;p&gt;Let's Hack !!&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Bibliography&lt;/strong&gt;
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://medium.com/databulls/what-exactly-is-vapt-vulnerability-assessment-and-penetration-testing-6626fdd7f24e" rel="noopener noreferrer"&gt;What exactly is VAPT (Vulnerability Assessment and Penetration Testing) ?&lt;/a&gt; by &lt;a class="mentioned-user" href="https://dev.to/ismailtasdelen"&gt;@ismailtasdelen&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://medium.com/@devedium/a-developers-guide-to-web-app-vapt-essentials-481bc60656c6" rel="noopener noreferrer"&gt;A Developer’s Guide to Web App VAPT Essentials&lt;/a&gt; by @devedium &lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>vapt</category>
      <category>cybersecurity</category>
      <category>appsec</category>
      <category>learning</category>
    </item>
    <item>
      <title>Erasing evidence after attacking a host</title>
      <dc:creator>Nitin Kumar</dc:creator>
      <pubDate>Fri, 06 Sep 2024 18:21:02 +0000</pubDate>
      <link>https://forem.com/nitinkumar30/erasing-evidence-after-attacking-a-host-2lg0</link>
      <guid>https://forem.com/nitinkumar30/erasing-evidence-after-attacking-a-host-2lg0</guid>
      <description>&lt;p&gt;After attacking any host, the most important part is removing any evidence. If any ethical hacker got evidence about the attacker(i.e. you), then you might be in legal trouble. So, today, we'll look into some common methods to remove evidence from the host machine so that ALMOST every trace can be removed, almost because every criminal does leave some or the other trace that can be traced back. Small things might lead to the attacker. &lt;/p&gt;

&lt;p&gt;For eg:- Let's say you're using the Tor Browser for searching something on the dark web. If you've maximized the browser, you might get traced with the window size and other details.&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;For our convenience, we'll be using &lt;a href="https://www.kali.org/get-kali/#kali-platforms" rel="noopener noreferrer"&gt;Kali Linux&lt;/a&gt; &amp;amp; work on it only. In real life, you might be compromising some other machine, but the method and process of clearing the tracks are exactly the same.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;How to wipe out all the logs and bash history so that we can get undetected after completing our attack.&lt;/p&gt;




&lt;p&gt;Topics covered:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Delete the history of commands executed in terminal&lt;/li&gt;
&lt;li&gt;Delete the history file, optional to the 1st one&lt;/li&gt;
&lt;li&gt;Delete system logs&lt;/li&gt;
&lt;li&gt;Delete auth logs used during login &amp;amp; sudo runs&lt;/li&gt;
&lt;li&gt;Empty the file contents for not being suspicious&lt;/li&gt;
&lt;li&gt;Delete logs &amp;amp; services used&lt;/li&gt;
&lt;li&gt;Delete all files under the temporary directory&lt;/li&gt;
&lt;li&gt;BONUS KNOWLEDGE&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;Open the terminal &amp;amp; execute some commands for it:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;In order to not get caught, we need to delete all the history commands run during the attack. So, to perform it, simply type:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;;-c is for clear, after executing it, no history will be present.&lt;/p&gt;

&lt;p&gt;We can also delete the history file. In order to search the history file, simply type the below command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;echo $HISTFILE
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To remove the history file, just type:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;rm .bash_history
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;(If your history file name is bash_history)&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;P.S.:- You don't need to perform it if history is cleared.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;After clearing history, we need to delete the system log. For that, we need to change the directory to /var/ directory. So, run the command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd /var/log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This directory contains all the logs of the tools and the services used in the machine. We now need to delete the logs of the tools and the services used during our attack. &lt;/p&gt;

&lt;p&gt;One of the important file we need to delete is auth.log file. This is the auth logs which stores any login attempts done during our attack. Let's say we've used SSH service, it'll log that too. So, we need to delete it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo rm auth.log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Another important file we need to delete is sys.log file. It registers the system information. For that, write the command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo rm sys.log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let's suppose we don't want to remove/delete a file, because deleting them might be suspicious &amp;amp; might be recovered from recovery tools. So, for that, what we do it make the file empty.&lt;/p&gt;

&lt;p&gt;Let's say we've a log file called kern.log which stores the kernel logs, we need to empty this file. First check the contents of the file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cat kern.log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, to empty the file contents, type the command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo truncate -s 0 kern.log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, the contents of the file are empty.&lt;/p&gt;

&lt;p&gt;Now, we need to remove/delete the logs &amp;amp; services that we used during the attack. So, let's say we've used PostgreSQL, we need to navigate to that directory using cd:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Let's say we need to delete the file &lt;strong&gt;postgresql-16-main.log&lt;/strong&gt;, we'll give the command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo rm postgresql-16-main.log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, we need to delete all the files under the temporary directory so that whatever services or tools we've used/installed can be made undetected. To perform that, type the command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo rm -rf /tmp/*
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;strong&gt;BONUS KNOWLEDGE&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Let's learn how to securely delete any file so that data recovery tools can't even recover them. For that, we need to install another tool - secure-delete&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo apt install secure-delete
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





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

&lt;/div&gt;



&lt;p&gt;Now, in order to permanently delete any file, let's say file name is file.py, type the command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo shred -vfzu file.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Also, we need to permanently delete the tools we've used during the attack right? For that, write the below command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo apt remove --purge secure-delete
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The last thing we need to do here is restart the machine/system so that it also clears the active memory consumption. For that, type the command:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;And your system will be restarted..!&lt;/p&gt;




&lt;p&gt;This was a small thing, yet a big thing that might help you after successfully attacking the host. It's the last yet important step to how to stay safe from unethical hacking. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This knowledge &amp;amp; article is strictly for educational purposes!!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;HAPPY HACKING HACKERS !!!&lt;/p&gt;

&lt;p&gt;Liked it? Give it a star &amp;amp; save it, so that next time you try something SUSPICIOUS, don't forget to try them out.&lt;/p&gt;

&lt;p&gt;Connect with me on &lt;a href="https://www.linkedin.com/in/nitin30kumar/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; or &lt;a href="https://github.com/nitinkumar30" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ethicalhacking</category>
      <category>erasingevidence</category>
      <category>hacker</category>
      <category>linux</category>
    </item>
    <item>
      <title>Slack chatGPT AI bot</title>
      <dc:creator>Nitin Kumar</dc:creator>
      <pubDate>Wed, 10 Jul 2024 20:41:40 +0000</pubDate>
      <link>https://forem.com/nitinkumar30/slack-chatgpt-ai-bot-2aoc</link>
      <guid>https://forem.com/nitinkumar30/slack-chatgpt-ai-bot-2aoc</guid>
      <description>&lt;h2&gt;
  
  
  Features
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;ol&gt;
&lt;li&gt;OpenAI chatGPT bot for &lt;a href="https://app.slack.com/" rel="noopener noreferrer"&gt;Slack app&lt;/a&gt; mostly used in corporate
&lt;/li&gt;
&lt;li&gt;This bot is another app to be used as a chatGPT integrated there
&lt;/li&gt;
&lt;li&gt;.env file for all generated tokens
&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Working
&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%2F7oq2ivvrox4cimeclyrx.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%2F7oq2ivvrox4cimeclyrx.png" alt="Image description" width="800" height="320"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Tokens used
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;SLACK_BOT_TOKEN&lt;/li&gt;
&lt;li&gt;SLACK_APP_TOKEN&lt;/li&gt;
&lt;li&gt;OPENAI_API_KEY&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Applications used
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://app.slack.com/" rel="noopener noreferrer"&gt;Slack web app&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://platform.openai.com/" rel="noopener noreferrer"&gt;Chat GPT&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  How to's
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. generate OpenAI token
&lt;/h3&gt;

&lt;p&gt;Step 1: Navigate to &lt;a href="https://platform.openai.com/settings/profile?tab=api-keys" rel="noopener noreferrer"&gt;openAI web app&lt;/a&gt;&lt;br&gt;&lt;br&gt;
Step 2: Login and click on &lt;strong&gt;Create new secret key&lt;/strong&gt; button&lt;br&gt;&lt;br&gt;
Step 3: Provide a name to the token to be generated &amp;amp; click on &lt;strong&gt;Create secret key&lt;/strong&gt; button&lt;br&gt;&lt;br&gt;
Step 4: Paste the token hence generated&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Create &amp;amp; configure app in slack
&lt;/h3&gt;

&lt;p&gt;Step 1: Navigate to &lt;a href="https://api.slack.com/apps?new_app=1" rel="noopener noreferrer"&gt;Slack API web app&lt;/a&gt;&lt;br&gt;&lt;br&gt;
Step 2: Click on &lt;strong&gt;Create New App&lt;/strong&gt; button&lt;br&gt;&lt;br&gt;
Step 3: Click &lt;strong&gt;from scratch&lt;/strong&gt; &amp;gt;&amp;gt; provide App name &amp;gt;&amp;gt; Select the workspace from your profile &amp;gt;&amp;gt; Click on &lt;strong&gt;Create App&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Step 4: Go to &lt;strong&gt;OAuth &amp;amp; Permissions&lt;/strong&gt; from left menu bar &amp;gt;&amp;gt; Add Bot token scopes (chat:write &amp;amp; chat:write.public)&lt;br&gt;&lt;br&gt;
Step 5: Click on &lt;strong&gt;Install to workspace&lt;/strong&gt;  &amp;gt;&amp;gt; Click &lt;strong&gt;Allow&lt;/strong&gt; button&lt;br&gt;&lt;br&gt;
Step 6: Copy the &lt;strong&gt;Bot User OAuth Token&lt;/strong&gt; hence generated&lt;br&gt;&lt;br&gt;
Step 7: Go to &lt;strong&gt;Basic Information&lt;/strong&gt; &amp;gt;&amp;gt; App-Level Tokens &amp;gt;&amp;gt; Generate Token and Scopes &amp;gt;&amp;gt; Provide any token name &amp;gt;&amp;gt; Add Scope (connections:write) &amp;gt;&amp;gt; Click on &lt;strong&gt;Generate&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Step 8: Copy the token hence generated&lt;br&gt;
Step 9: Go to &lt;strong&gt;Socket Mode&lt;/strong&gt; &amp;amp; enable socket mode&lt;br&gt;
Step 10: Go to &lt;strong&gt;Interactivity &amp;amp; Shortcuts&lt;/strong&gt; &amp;amp; enable it(if not already)&lt;br&gt;&lt;br&gt;
Step 11: Go to &lt;strong&gt;Event Subscriptions&lt;/strong&gt; &amp;gt;&amp;gt; enable &lt;strong&gt;Enable Events&lt;/strong&gt; &amp;gt;&amp;gt; Click on **&lt;br&gt;
Subscribe to bot events** &amp;gt;&amp;gt; Add Bot user events (message.im &amp;amp; app_mention) &amp;gt;&amp;gt; Click on &lt;strong&gt;Save Changes&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Step 12: Now, reinstall the app (As we've done in step 5)&lt;br&gt;&lt;br&gt;
Step 13: Go to &lt;strong&gt;App Home&lt;/strong&gt; &amp;gt;&amp;gt; Enable &lt;strong&gt;Allow users to send Slash commands and messages from the messages tab&lt;/strong&gt;  &lt;/p&gt;




&lt;h2&gt;
  
  
  How to run
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;First run the python script&lt;/li&gt;
&lt;li&gt;Then, navigate to the slack web app and type the prompt
&lt;/li&gt;
&lt;li&gt;You'll get response in slack web app
&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Bibliography
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.linkedin.com/posts/nitin30kumar_connections-streamline-communication-activity-7216512913161781248-er-Z?utm_source=share&amp;amp;utm_medium=member_desktop" rel="noopener noreferrer"&gt;Linkedin post&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://github.com/nitinkumar30/slack_chatBot/" rel="noopener noreferrer"&gt;GitHub Repo&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://youtu.be/Luujq0t0J7A?si=4Eqm3vjPnXSmmftn" rel="noopener noreferrer"&gt;Reference YouTube Link&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Author
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://linkedin.com/in/nitin30kumar/" rel="noopener noreferrer"&gt;Nitin Kumar&lt;/a&gt;  &lt;/p&gt;




&lt;p&gt;Keep building bots !!&lt;/p&gt;

</description>
      <category>aitools</category>
      <category>slackchatbot</category>
      <category>chatgpt</category>
      <category>aibot</category>
    </item>
    <item>
      <title>Challenges for a perfect resume</title>
      <dc:creator>Nitin Kumar</dc:creator>
      <pubDate>Wed, 20 Mar 2024 09:49:05 +0000</pubDate>
      <link>https://forem.com/nitinkumar30/challenges-for-a-perfect-resume-4ac9</link>
      <guid>https://forem.com/nitinkumar30/challenges-for-a-perfect-resume-4ac9</guid>
      <description>&lt;p&gt;How a perfect resume should look like??&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Nothing is perfect, not even your resume.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ol&gt;
&lt;li&gt;There isn't any word like perfect resume&lt;/li&gt;
&lt;li&gt;Every resume is unique in their own way&lt;/li&gt;
&lt;li&gt;You just need to understand what you've written in your resume&lt;/li&gt;
&lt;li&gt;Resume is first impression of you in front of the hiring manager.&lt;/li&gt;
&lt;li&gt;Make your resume ATS(Applicant Tracking System) friendly, most of the companies are using these systems to take less time to shortlist candidates.&lt;/li&gt;
&lt;li&gt;You should be able to let the interviewer understand every single content on your resume.&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;Some mistakes I've seen till now in many candidates (11 as of now, might add more later):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Contact details should always be mentioned at the beginning. &lt;/li&gt;
&lt;/ul&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%2Fxxiciy0gvezzntt3d1m5.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%2Fxxiciy0gvezzntt3d1m5.png" alt="Image description" width="800" height="198"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Anything, related to contacting you should be mentioned in the beginning. For eg- Phone no, you social media links, portfolio, etc.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Not proper dates in their professional journey:&lt;/li&gt;
&lt;/ul&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%2Fc60nw43itc192rxjsm7j.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%2Fc60nw43itc192rxjsm7j.png" alt="Image description" width="800" height="240"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You should always check the dates are properly mentioned for all your experienced journey.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Not prioritizing job role/company name&lt;/li&gt;
&lt;/ul&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%2Fn7f4zt9qwnwutzquy743.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%2Fn7f4zt9qwnwutzquy743.png" alt="Image description" width="480" height="412"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Always prioritize role/company name/duration. If possible, make them bold to emphasize more strength on them. Other details are less important for even hiring managers. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Not providing information in correct heading&lt;/li&gt;
&lt;/ul&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%2Fq7hawd1tgkj31jwc5n0w.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%2Fq7hawd1tgkj31jwc5n0w.png" alt="Image description" width="800" height="125"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Since, this is academic projects, as header says, you should not be working on that now. It should be &lt;del&gt;Working&lt;/del&gt; Worked. Or, you can write header as Projects only, to be relevant to your information.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Not providing duration/marks&lt;/li&gt;
&lt;/ul&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%2Fsnic09verpi5r5lr5bc9.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%2Fsnic09verpi5r5lr5bc9.png" alt="Image description" width="346" height="235"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Marks doesn't matter once you enter corporate, but for freshers, it's one of the factor to shortlist candidates as it shows how you've tackled your college academics &amp;amp; other activities which'll eventually affect your corporate journey. &lt;br&gt;
Duration is necessary to validate if there's any backlogs/gaps between your academic journey or career gaps as well during your professional journey.  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Customizing your social media profiles with a professional username&lt;/li&gt;
&lt;/ul&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%2Fgztv6wl85xandlovmtg9.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%2Fgztv6wl85xandlovmtg9.png" alt="Image description" width="727" height="114"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Customizing your social media with a professional username is sometimes crucial when you're applying for SMM like roles. Moreover, it shows your professional growth &amp;amp; formal ettiquete to understand. No one wants to search for &lt;em&gt;nitin-kumar-8cfg90&lt;/em&gt; or &lt;em&gt;nitin-the-badboy-of-india&lt;/em&gt; on LinkedIn. This isn't considered professional profile. Try to customize it as a username which can used for multiple social media, for easy sharing too.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Making resume like your canvas&lt;/li&gt;
&lt;/ul&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%2F1ich2ch5lfz788m2zz7l.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%2F1ich2ch5lfz788m2zz7l.png" alt="Image description" width="604" height="712"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hiring managers don't want to see your drawing skills in resume, even if you're asking referral for a painter job. You can write everything pointwise which'll be helpful for ATS as well as humans to understand &amp;amp; shortlist you. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Manage your resume.docx with formal document&lt;/li&gt;
&lt;/ul&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%2Fmnb4vr7z6v4d6f2tfl21.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%2Fmnb4vr7z6v4d6f2tfl21.png" alt="Image description" width="426" height="90"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sharing your resume as docx or any other file type might change the formatting of file contents. Also, name your resume as YOURNAME_ROLE_Resume.pdf instead of some other random names. Always share resumes in pdf format.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No need to write complete book about your professional journey&lt;/li&gt;
&lt;/ul&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%2Fq5mibbj8f66dww0kvdyx.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%2Fq5mibbj8f66dww0kvdyx.png" alt="Image description" width="800" height="605"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Write pointwise about your professional journey but not more than 5 points, all of those should be small &amp;amp; to-the-point.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use bold text type precisely&lt;/li&gt;
&lt;/ul&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%2Fq0wdog9bn6j2mebika82.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%2Fq0wdog9bn6j2mebika82.png" alt="Image description" width="658" height="367"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Don't use bold type everywhere, only use it wherever applicable like headers, roles, etc. Resume should look neat &amp;amp; clean so that it can be soothening to eyes to read for hiring manager as well as the interview panels.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Format your contact details&lt;/li&gt;
&lt;/ul&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%2Fhfduya0is0ekzh6c1015.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%2Fhfduya0is0ekzh6c1015.png" alt="Image description" width="400" height="47"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Always format your contact details. They might end up going to new line which may not be taken up by ATS systems. Try to format them in single line only.&lt;/p&gt;




&lt;p&gt;Some tips for referrals:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Never just share your resume, share things in body of your mail. Following are the things you can add in your body:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;i. Write 50-60 words about you &amp;amp; your professional journey, skills&lt;br&gt;
   ii. Share relevant job id's if you have. You can go to the company's careers portal &amp;amp; check it.&lt;br&gt;
   iii. Politely ask them to check for any relevant oppurtunities if they might have relevant to your skills. Mention skills in body as well.&lt;br&gt;
   iv. Go through some email writing tutorials&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Try to write a formal &amp;amp; informative subject line. Following are some examples:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;i. YOUR_NAME | JOB_CODE/ROLE | EXP_IN_YRS&lt;br&gt;
   ii. YOUR_NAME | JOB_CODE | PRIMARY_SKILLS&lt;br&gt;
   iii. YOUR_NAME | PRIMARY_SKILLS | EXP&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;It's always better to check &amp;amp; read every details in your resume whatever you've written as there might be questions arising to mind of HR/hiring people.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Search for people over LinkedIn for the company's opening you're applying for. Referrals increases your chance of shortlisting of your resume. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Connect more with like minded people over internet &amp;amp; keep sharing your knowledge so that in case  of doubt over any topic, you can have a healthy discussion over it.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Golden tip:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Always have some format to ask for referrals on Linkedin. That format should be short enough &amp;amp; informative to include all your information including job id/job link.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Steps to follow:&lt;/p&gt;

&lt;p&gt;Step 1: Search for employees in company you need job &amp;amp; you already have job id/job link.&lt;br&gt;
Step 2: Click on connect button to connect with person &amp;amp; ask for referral. Some people only have follow button, leave them.&lt;br&gt;
Step 3: Make a short format(I'll provide one which I was using for my job hunting) &amp;amp; use it across.&lt;br&gt;
Step 4: Click on Add a note in below. Make sure to use &lt;a href="https://tinyurl.com/" rel="noopener noreferrer"&gt;link shortners&lt;/a&gt; so that message can be short enough to fit inside.&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%2For0gkgb5548tn6y7ipzo.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%2For0gkgb5548tn6y7ipzo.png" alt="Add a note" width="526" height="152"&gt;&lt;/a&gt;&lt;br&gt;
Step 5: Put that short message after clicking on Add a note there.&lt;br&gt;
Step 6: Now, submit so that person can see that message whenever he'll accept your request, also prior he can see that a note is being shared.&lt;/p&gt;

&lt;p&gt;TEMPLATE_1:&lt;/p&gt;

&lt;p&gt;Hi &lt;code&gt;CONCERNED_PERSON&lt;/code&gt;,&lt;br&gt;
Seeking a referral for the job of '&lt;code&gt;JOBO_TITLE&lt;/code&gt;' (&lt;code&gt;JOB_id&lt;/code&gt;) @ &lt;code&gt;COMPANY_NAME&lt;/code&gt;. Resume: &lt;code&gt;YOUR_RESUME_LINK_SHORTENED&lt;/code&gt;, Contact: &lt;code&gt;MAIL_ID&lt;/code&gt; /&lt;code&gt;PHONE_NUMBER&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;TEMPLATE_2:&lt;/p&gt;

&lt;p&gt;Hi &lt;code&gt;CONCERNED_PERSON&lt;/code&gt;, can you please refer me in &lt;code&gt;JOB_TITLE&lt;/code&gt; role with Job ID - &lt;code&gt;JOB_id&lt;/code&gt;? My resume - &lt;code&gt;YOUR_RESUME_LINK_SHORTENED&lt;/code&gt; . Contact: &lt;code&gt;MAIL_ID&lt;/code&gt; /&lt;code&gt;PHONE_NUMBER&lt;/code&gt;. Revert me back in case you need anything else. Job link - &lt;code&gt;JOB_LINK&lt;/code&gt;.&lt;/p&gt;




&lt;p&gt;Keep hustling, job searching is a big process which demands your constant work along with working on your skills and relevant projects. Work on medium/high level projects to get into the eyes of hiring managers. Moreover, showcase them into your connections to get recommendations.&lt;/p&gt;

&lt;p&gt;Feel free to reach out to me via &lt;a href="https://www.linkedin.com/in/nitin30kumar/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;, &lt;a href="https://www.instagram.com/nitinkumar30.py/" rel="noopener noreferrer"&gt;Instagram&lt;/a&gt; or checkout my &lt;a href="https://nitinkr.me" rel="noopener noreferrer"&gt;Portfolio&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;HAPPY HACKING !!!&lt;/p&gt;

</description>
      <category>resume</category>
      <category>fresher</category>
      <category>jobopenings</category>
      <category>corporateresume</category>
    </item>
  </channel>
</rss>
