<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Akash Jana</title>
    <description>The latest articles on DEV Community by Akash Jana (@akashjana).</description>
    <link>https://dev.to/akashjana</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%2F2173633%2F9a94c008-acb5-4b2a-9749-adcc5449b5fd.jpeg</url>
      <title>DEV Community: Akash Jana</title>
      <link>https://dev.to/akashjana</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/akashjana"/>
    <language>en</language>
    <item>
      <title>TARDIS-SN : My Pre-GSoC Journey, Codebase &amp; Guide</title>
      <dc:creator>Akash Jana</dc:creator>
      <pubDate>Sat, 03 May 2025 13:16:31 +0000</pubDate>
      <link>https://dev.to/akashjana/tardis-sn-my-pre-gsoc-journey-codebase-guide-2j0m</link>
      <guid>https://dev.to/akashjana/tardis-sn-my-pre-gsoc-journey-codebase-guide-2j0m</guid>
      <description>&lt;h2&gt;
  
  
  Getting Started with TARDIS: A Friendly Guide for New Contributors
&lt;/h2&gt;

&lt;p&gt;Have you ever looked up at the night sky and wondered how we decode the light from exploding stars? That’s exactly what TARDIS helps scientists do. In this post, we’ll explore what TARDIS is, how it works, and how you, as a future contributor, can become part of this open-source project.&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%2F4j4zi36h1ysvzolwoqv6.gif" 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%2F4j4zi36h1ysvzolwoqv6.gif" alt="supernova explosion gif"&gt;&lt;/a&gt;Graphic element from Tardis website &lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR:
&lt;/h2&gt;

&lt;p&gt;In this blog, I share my journey exploring and contributing to TARDIS-SN and CARSUS, open-source astrophysics tools used to simulate supernova spectra. I explain how TARDIS works in simple layman language, how Carsus supports it by generating atomic data, and detail my first contribution to Carsus through a pre-GSoC pull request. I also reflect on my GSoC interview experience where I excelled in behavioral questions but miserably failed with technical ones yet how it motivated me to keep learning and growing. This post is both a technical guide and a personal story for future contributors.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt;&lt;span class="gi"&gt;+ The storytelling will be written in this format or in quotes. 
&lt;/span&gt;&lt;span class="gd"&gt;- If you want to skip my journey and focus only on technicals
&lt;/span&gt;&lt;span class="gi"&gt;+ feel free to do so. 
+ However, I humbly request you read through all of it.
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🌌 What Is TARDIS?
&lt;/h2&gt;

&lt;p&gt;TARDIS (Temperature And Radiative Diffusion In Supernovae) is an open-source Python-based radiative transfer code designed to simulate supernova spectra. Its primary aim is to provide a fast, flexible tool for researchers studying the light emitted by supernovae (stellar explosions).&lt;/p&gt;

&lt;p&gt;Think of it as a virtual lab where you can recreate and analyze how a supernova would shine through space based on the physics of radiation, matter, and atomic interactions.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;TARDIS : An open-science software to simulate and analyse supernovae and other transients&lt;/p&gt;
&lt;/blockquote&gt;



&lt;p&gt;&lt;q&gt; While exploring potential GSoC projects, I initially shortlisted exciting options like OHC and Google DeepMind. However, when I stumbled upon TARDIS, my childhood dream of diving into the mysteries of space and the cosmos reignited. As a Sci-Fi enthusiast, I felt an irresistible pull towards this project, convincing me that this is where I truly belong, channeling my passion for starry adventures into meaningful work. &lt;/q&gt;&lt;br&gt;
I have mentioned this in my proposal as well.&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%2Fu00wptxf3dodud7xiord.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%2Fu00wptxf3dodud7xiord.png" alt="screenshot"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Lets get back to some core concepts.&lt;/p&gt;
&lt;h2&gt;
  
  
  Core Concepts
&lt;/h2&gt;

&lt;p&gt;Here are a few core concepts that TARDIS is built upon: &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;u&gt;Radiative Transfer&lt;/u&gt; guides the journey of light through cosmic chaos. &lt;/li&gt;
&lt;li&gt;
&lt;u&gt;The Monte Carlo Method&lt;/u&gt; harnesses the power of randomness to unravel these stellar explosions. &lt;/li&gt;
&lt;li&gt;
&lt;u&gt;Atomic Data&lt;/u&gt; the blueprint for understanding the interactions between photons and atoms. &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Together, these concepts help us decode the celestial light show that reaches our telescopes. Lets understand them in detail.&lt;/p&gt;
&lt;h3&gt;
  
  
  🔁 Radiative Transfer
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What is it?&lt;/strong&gt;&lt;br&gt;
Radiative transfer is the physical process that describes how light (or more generally, radiation) travels through a medium like the gas ejected from a supernova interacting with particles along the way.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt;&lt;br&gt;
When a supernova explodes, it releases an enormous amount of energy in the form of photons. These photons travel through layers of hot, expanding gases, where they can be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Absorbed&lt;/strong&gt; by atoms (which raises them to an excited state),&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Re-emitted&lt;/strong&gt; at different energies (wavelengths),&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scattered&lt;/strong&gt; in different directions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Understanding these interactions is key to interpreting what we see in a telescope. By simulating radiative transfer, we can recreate what a supernova’s light would look like from Earth and match it against real observations.&lt;/p&gt;


&lt;h3&gt;
  
  
  🎲 Monte Carlo Method
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What is it?&lt;/strong&gt;&lt;br&gt;
The Monte Carlo method is a computational technique that uses &lt;strong&gt;random sampling&lt;/strong&gt; to simulate complex processes. In TARDIS, it’s used to model the behavior of photon packets.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How TARDIS uses it:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Imagine a huge number of photon packets being released from the core of a supernova.&lt;/li&gt;
&lt;li&gt;Each packet moves through the ejecta (outer layers of the star), and at each step, a &lt;strong&gt;random decision&lt;/strong&gt; determines whether it’s absorbed, scattered, or continues on its path.&lt;/li&gt;
&lt;li&gt;These decisions are based on &lt;strong&gt;probabilities derived from physical laws and atomic data&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By simulating the paths of millions of these packets, TARDIS builds a statistical picture of the emerging spectrum—what an observer would see. It’s a powerful and efficient way to model the highly random, chaotic nature of radiative processes in space.&lt;/p&gt;


&lt;h3&gt;
  
  
  ⚛️ Atomic Data
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What is it?&lt;/strong&gt;&lt;br&gt;
Atomic data includes fundamental information about atoms and ions, such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ionization energies&lt;/strong&gt; : How much energy it takes to remove an electron.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Energy levels&lt;/strong&gt; : The specific energies electrons can have.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Transition probabilities&lt;/strong&gt; : How likely it is for an electron to jump from one level to another.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Spectral lines&lt;/strong&gt; : The wavelengths of light emitted or absorbed when these transitions happen.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why it’s crucial:&lt;/strong&gt;&lt;br&gt;
Without accurate atomic data, TARDIS wouldn’t know how photons should behave when they encounter different atoms in the supernova ejecta. Carsus plays a vital role here by compiling, cleaning, and formatting this data so TARDIS can use it.&lt;/p&gt;

&lt;p&gt;This data lets TARDIS:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Predict &lt;strong&gt;which colors of light&lt;/strong&gt; will be emitted or absorbed.&lt;/li&gt;
&lt;li&gt;Simulate &lt;strong&gt;spectral lines&lt;/strong&gt; that appear in real telescope observations.&lt;/li&gt;
&lt;li&gt;Help astronomers identify the &lt;strong&gt;chemical composition&lt;/strong&gt; of the supernova.&lt;/li&gt;
&lt;/ol&gt;


&lt;h3&gt;
  
  
  TARDIS-SN Architecture
&lt;/h3&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%2Fdjxqyig314dq7yhulgey.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%2Fdjxqyig314dq7yhulgey.png" alt="Tardis architecture"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This architectural diagram has been generated using &lt;a href="https://gitdiagram.com/" rel="noopener noreferrer"&gt;GitDiagram&lt;/a&gt; and reflects my current understanding and interpretation. For authoritative information, reference to official documentation or direct consultation with project maintainers is recommended.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;
  
  
  Key Components and their Interactions:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Model System&lt;/strong&gt;: Defines the basic attributes of the supernova environment, including geometry, matter composition, and decay handling.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Plasma Physics System&lt;/strong&gt;: Focuses on detailed plasma calculations such as equilibrium calculations, rate equations, level populations, and radiation field characterization.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Transport System&lt;/strong&gt;: Utilizes the Monte Carlo method to simulate how photons travel through the supernova's ejecta, performing geometric calculations, packet tracking, and frame transportation.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Core Components:&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Model Layer&lt;/strong&gt;: Integrates data from the Model System and Plasma Physics System, guiding the simulation process.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Transport Layer&lt;/strong&gt;: Handles photon transport based on inputs from the Plasma Physics System.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Spectrum Generation&lt;/strong&gt;: Converts simulated photon interactions into observable spectra.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Supporting Systems&lt;/strong&gt;: Provide essential utilities for efficient simulation, including configuration management, input/output handling, visualization, and analysis tools.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;
  
  
  🧩 Modular Design
&lt;/h3&gt;

&lt;p&gt;TARDIS is neatly divided into modules:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;simulation&lt;/code&gt;: Coordinates the overall simulation.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;plasma&lt;/code&gt;: Manages physical states like ionization and temperature.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;transport&lt;/code&gt;: Handles Monte Carlo radiative transport.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;io&lt;/code&gt;: Reads and validates configuration and atomic data.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;spectrum&lt;/code&gt;: Produces and stores the final synthetic spectrum.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;visualization&lt;/code&gt;: Offers helpful plots and interactive widgets.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Each module is independently testable and designed for plug &amp;amp; play enhancements, making it ideal for contributors.&lt;/p&gt;


&lt;h2&gt;
  
  
  🛠 How TARDIS Works -&amp;gt; A Simple Workflow
&lt;/h2&gt;

&lt;p&gt;Here’s a high-level overview of what happens when TARDIS runs:&lt;/p&gt;
&lt;h3&gt;
  
  
  1️⃣ Input Setup:
&lt;/h3&gt;

&lt;p&gt;Users prepare a YAML configuration file describing the supernova model: density, composition, time since explosion, etc.&lt;/p&gt;

&lt;p&gt;TARDIS also uses external atomic data provided in HDF5 format.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;HDF5 (Hierarchical Data Format version 5) is a file format and set of tools designed for managing complex data. It allows you to store large amounts of numerical data and metadata in a single, highly organized file that's both scalable and efficient. HDF5 supports a variety of data types and is ideal for handling large datasets, making it widely used in fields like scientific research, engineering, and data analysis. Key features include support for multidimensional arrays, efficient storage and retrieval, data compression, and the ability to store metadata alongside the data.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  2️⃣ Initialization:
&lt;/h3&gt;

&lt;p&gt;The model grid (usually 1D spherical shells) and plasma conditions are set up.&lt;/p&gt;

&lt;p&gt;Photon packets are initialized with starting positions and directions.&lt;/p&gt;
&lt;h3&gt;
  
  
  3️⃣ Monte Carlo Simulation:
&lt;/h3&gt;

&lt;p&gt;These packets are tracked as they interact with the matter: being absorbed, re-emitted, or scattered.&lt;/p&gt;

&lt;p&gt;This process continues until the packet escapes the system or its energy is fully absorbed.&lt;/p&gt;
&lt;h3&gt;
  
  
  4️⃣ Spectrum Generation:
&lt;/h3&gt;

&lt;p&gt;The emergent photon packets are collected to form a synthetic spectrum.&lt;/p&gt;

&lt;p&gt;This output can then be compared with actual observations.&lt;/p&gt;
&lt;h3&gt;
  
  
  5️⃣ Output &amp;amp; Analysis:
&lt;/h3&gt;

&lt;p&gt;Users can analyze the generated spectra, convergence behavior, and plasma states.&lt;/p&gt;

&lt;p&gt;TARDIS provides utilities for visualization and diagnostic plots&lt;/p&gt;


&lt;h3&gt;
  
  
  ▶️ A small Demo for TARDIS
&lt;/h3&gt;
&lt;h4&gt;
  
  
  Installation
&lt;/h4&gt;

&lt;p&gt;1) &lt;strong&gt;Install Miniconda&lt;/strong&gt; (if not already installed):&lt;br&gt;
Download from &lt;a href="https://docs.conda.io/en/latest/miniconda.html" rel="noopener noreferrer"&gt;https://docs.conda.io/en/latest/miniconda.html&lt;/a&gt; and follow the installation instructions for your operating system.&lt;/p&gt;

&lt;p&gt;2) &lt;strong&gt;Create a new conda environment&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;   conda create &lt;span class="nt"&gt;-n&lt;/span&gt; tardis-env &lt;span class="nv"&gt;python&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;3.10
   conda activate tardis-env
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;3) &lt;strong&gt;Install TARDIS&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;   pip &lt;span class="nb"&gt;install &lt;/span&gt;tardis-sn
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;blockquote&gt;
&lt;p&gt;Note: For the latest development version or to contribute, consider cloning the repository from GitHub: &lt;a href="https://github.com/tardis-sn/tardis" rel="noopener noreferrer"&gt;https://github.com/tardis-sn/tardis&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h4&gt;
  
  
  Running a Basic Simulation
&lt;/h4&gt;

&lt;p&gt;1) &lt;strong&gt;Download a sample configuration file&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;   wget https://raw.githubusercontent.com/tardis-sn/tardis/master/tardis/io/configuration/tests/data/tardis_configv1.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;2) &lt;strong&gt;Run the simulation&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;   tardis tardis_configv1.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This command will process the configuration and generate a synthetic spectrum based on the provided parameters.&lt;/p&gt;

&lt;p&gt;3) &lt;strong&gt;Visualize the output&lt;/strong&gt;:&lt;br&gt;
   After the simulation completes, you can visualize the generated spectrum using Python:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;   &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;matplotlib.pyplot&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;
   &lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;tardis.io.output&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;read_spectrum&lt;/span&gt;

   &lt;span class="n"&gt;spectrum&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;read_spectrum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;tardis_configv1.yml&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
   &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;spectrum&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;wavelength&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;spectrum&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;luminosity_density_lambda&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
   &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;xlabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Wavelength (Angstrom)&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
   &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ylabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Luminosity Density&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
   &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Synthetic Spectrum&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
   &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;blockquote&gt;
&lt;p&gt;Ensure you have &lt;code&gt;matplotlib&lt;/code&gt; installed in your environment. If not, install it using &lt;code&gt;pip install matplotlib&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;
  
  
  📚 Learn More
&lt;/h4&gt;

&lt;p&gt;For detailed guidance on customizing simulations, understanding configuration parameters, and exploring advanced features, refer to the official TARDIS documentation: &lt;a href="https://tardis-sn.github.io/" rel="noopener noreferrer"&gt;https://tardis-sn.github.io/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;✨ Do give it a star: &lt;a href="https://github.com/tardis-sn/tardis" class="crayons-btn crayons-btn--primary" rel="noopener noreferrer"&gt;TARDIS-SN ⭐&lt;/a&gt;
&lt;/p&gt;


&lt;h2&gt;
  
  
  CARSUS: The Atomic Data Engine Behind TARDIS
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;If TARDIS is the telescope through which we view supernovae, &lt;strong&gt;Carsus&lt;/strong&gt; is the database behind the lens.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  🧾 What Is Carsus?
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Carsus&lt;/strong&gt; is a Python package designed to process, standardize, and output atomic data for use in radiative transfer simulations, especially those run by TARDIS. It is a package to manage atomic datasets. It can read data from a variety of sources and output them to file formats readable by radiative transfer codes.&lt;/p&gt;

&lt;p&gt;It acts as the &lt;strong&gt;bridge between raw atomic datasets&lt;/strong&gt; (from databases like NIST, Kurucz, Chianti, CMFGEN, etc.) and the &lt;strong&gt;HDF5-formatted atomic files&lt;/strong&gt; that TARDIS understands.&lt;/p&gt;


&lt;h3&gt;
  
  
  🔍 Why Is It Important?
&lt;/h3&gt;

&lt;p&gt;Supernova simulations require precise atomic data: energy levels, line transitions, ionization potentials, and more. These values affect how light moves through supernova ejecta, and therefore, how accurately we can model spectra.&lt;/p&gt;

&lt;p&gt;Carsus ensures:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; ♻️ &lt;strong&gt;Consistency&lt;/strong&gt; across data sources,&lt;/li&gt;
&lt;li&gt; ⚙️ &lt;strong&gt;Customizability&lt;/strong&gt; for research needs,&lt;/li&gt;
&lt;li&gt; 💾 &lt;strong&gt;Output in HDF5 format&lt;/strong&gt; for TARDIS,&lt;/li&gt;
&lt;li&gt; 📚 &lt;strong&gt;Provenance and reproducibility&lt;/strong&gt; with citation tracking and version control.&lt;/li&gt;
&lt;/ol&gt;


&lt;h3&gt;
  
  
  CARSUS Architecture
&lt;/h3&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%2Fshmgfi6vzy697fq30pyn.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%2Fshmgfi6vzy697fq30pyn.png" alt="CARSUS Architecture"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  Key Components:
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Carsus Core&lt;/strong&gt;: The central component that orchestrates data processing, ensuring seamless interaction between utilities and the data module.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data Module&lt;/strong&gt;: Responsible for accessing and organizing atomic data from various sources, such as chianti, Kurucz, NIST, and others.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Utilities&lt;/strong&gt;: Provides auxiliary functions that aid in data manipulation and processing, integrating closely with the Carsus Core.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Carsus IO&lt;/strong&gt;: Handles input/output operations, facilitating the conversion of raw data from multiple repositories into a usable form.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CARSUS Architecture&lt;/strong&gt;: Ensures data reliability through testing and validation, along with continuous integration, continuous deployment (CI/CD), and documentation processes.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;
  
  
  How Carsus Works —&amp;gt; A Simplified Workflow
&lt;/h3&gt;

&lt;p&gt;1) &lt;strong&gt;Data Parsing&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Carsus supports multiple databases (e.g., NIST, Kurucz, CMFGEN, Chianti).&lt;/li&gt;
&lt;li&gt;Parsers in &lt;code&gt;carsus/io/&lt;/code&gt; read raw data and convert it into Pandas DataFrames.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;2) &lt;strong&gt;Data Transformation&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Values are cleaned, standardized, and sometimes enhanced (e.g., adding weights, correcting formats).&lt;/li&gt;
&lt;li&gt;Intermediate DataFrames are managed with clear units and structure.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;3) &lt;strong&gt;Output Generation&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The cleaned and unified data is exported into HDF5 files using &lt;code&gt;carsus.io.output&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;These files include levels, lines, ionization energies, collisions, macro-atom data, and more.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Integration with TARDIS&lt;/strong&gt;:&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Once the data is exported, TARDIS can load these files to run radiative transfer simulations.&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  🗂 Carsus Codebase
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;io&lt;/code&gt;: Home to all input/output parsers (e.g. &lt;code&gt;chianti_&lt;/code&gt;, &lt;code&gt;kurucz&lt;/code&gt;, &lt;code&gt;nist&lt;/code&gt;, &lt;code&gt;vald&lt;/code&gt;, &lt;code&gt;cmfgen&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;io/output&lt;/code&gt;: Generates final HDF5 datasets.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;data&lt;/code&gt;: Contains test and default input data.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;util&lt;/code&gt;: Helper functions for logging, hashing, unit management, and more.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;tests&lt;/code&gt;: Ensures reliability via pytest-based unit tests.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;✨ Do give it a star: &lt;a href="https://github.com/tardis-sn/carsus" class="crayons-btn crayons-btn--primary" rel="noopener noreferrer"&gt;CARSUS ⭐&lt;/a&gt;
&lt;/p&gt;



&lt;blockquote&gt;
&lt;p&gt;Note: I haven’t explored the STARDIS module yet, but if I do in the future, I’ll be sure to update this blog with my insights.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  My Pre-GSoC Contribution
&lt;/h2&gt;
&lt;h3&gt;
  
  
  The Problem statement / Idea
&lt;/h3&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%2F1xbjehcsfbpfozos7yh5.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%2F1xbjehcsfbpfozos7yh5.png" alt="Gsoc idea"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  The Solution
&lt;/h4&gt;

&lt;p&gt;How I approached the problem&lt;br&gt;
1) &lt;strong&gt;Understanding the Data Structure&lt;/strong&gt;: Delving into the HDF5 atomic data files to comprehend how ionization energies are stored and accessed.&lt;br&gt;
2) &lt;strong&gt;Function Implementation&lt;/strong&gt;: Writing the functions required to perform the tasks.&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%2F0r5fh0frni2tamlewvlj.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%2F0r5fh0frni2tamlewvlj.png" alt="Pr description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;3) &lt;strong&gt;Testing and Validation&lt;/strong&gt;: Ensuring the function's reliability through unit tests and comparing results with known values.&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%2Frk0uixj88spnoa2i517h.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%2Frk0uixj88spnoa2i517h.png" alt="Metadata module"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;div class="ltag_github-liquid-tag"&gt;
  &lt;h1&gt;
    &lt;a href="https://github.com/tardis-sn/carsus/pull/442" rel="noopener noreferrer"&gt;
      &lt;img class="github-logo" alt="GitHub logo" src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg"&gt;
      &lt;span class="issue-title"&gt;
        [GSOC]-Metadata for atomic data
      &lt;/span&gt;
      &lt;span class="issue-number"&gt;#442&lt;/span&gt;
    &lt;/a&gt;
  &lt;/h1&gt;
  &lt;div class="github-thread"&gt;
    &lt;div class="timeline-comment-header"&gt;
      &lt;a href="https://github.com/AkashJana18" rel="noopener noreferrer"&gt;
        &lt;img class="github-liquid-tag-img" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars.githubusercontent.com%2Fu%2F103350981%3Fv%3D4" alt="AkashJana18 avatar"&gt;
      &lt;/a&gt;
      &lt;div class="timeline-comment-header-text"&gt;
        &lt;strong&gt;
          &lt;a href="https://github.com/AkashJana18" rel="noopener noreferrer"&gt;AkashJana18&lt;/a&gt;
        &lt;/strong&gt; posted on &lt;a href="https://github.com/tardis-sn/carsus/pull/442" rel="noopener noreferrer"&gt;&lt;time&gt;Mar 29, 2025&lt;/time&gt;&lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag-github-body"&gt;
      &lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;📝 Description&lt;/h3&gt;
&lt;span class="octicon octicon-link"&gt;&lt;/span&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Type:&lt;/strong&gt;  🚀 &lt;code&gt;feature&lt;/code&gt;
Implements metadata support for Carsus atomic data outputs as specified in the first project objective:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Metadata Table&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;New &lt;code&gt;MetadataHandler&lt;/code&gt; class stores:
&lt;ul&gt;
&lt;li&gt;Physical units (validated via Astropy, e.g., &lt;code&gt;"angstrom"&lt;/code&gt;, &lt;code&gt;"Hz"&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Journal article references (DOIs, manual entry)&lt;/li&gt;
&lt;li&gt;Git commit hashes (automated when run in a repository)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Output Formats&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;HDF5&lt;/strong&gt;: Metadata stored in &lt;code&gt;/metadata&lt;/code&gt; group (units, references, git info)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pandas DataFrame&lt;/strong&gt;: Metadata accessible via &lt;code&gt;read_hdf_with_metadata()&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Automation (Bonus)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Git commit hash auto-detection&lt;/li&gt;
&lt;li&gt;Unit validation (rejects invalid units like &lt;code&gt;"not_a_unit"&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;📜 Example Usage&lt;/h3&gt;
&lt;span class="octicon octicon-link"&gt;&lt;/span&gt;
&lt;/div&gt;
&lt;div class="highlight highlight-source-python js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-k"&gt;from&lt;/span&gt; &lt;span class="pl-s1"&gt;carsus&lt;/span&gt;.&lt;span class="pl-s1"&gt;io&lt;/span&gt; &lt;span class="pl-k"&gt;import&lt;/span&gt; &lt;span class="pl-s1"&gt;save_to_hdf&lt;/span&gt;, &lt;span class="pl-v"&gt;MetadataHandler&lt;/span&gt;

&lt;span class="pl-c"&gt;# Initialize with manual metadata&lt;/span&gt;
&lt;span class="pl-s1"&gt;handler&lt;/span&gt; &lt;span class="pl-c1"&gt;=&lt;/span&gt; &lt;span class="pl-en"&gt;MetadataHandler&lt;/span&gt;(&lt;span class="pl-s1"&gt;data_source&lt;/span&gt;&lt;span class="pl-c1"&gt;=&lt;/span&gt;&lt;span class="pl-s"&gt;"NIST"&lt;/span&gt;)
&lt;span class="pl-s1"&gt;handler&lt;/span&gt;.&lt;span class="pl-c1"&gt;add_units&lt;/span&gt;(&lt;span class="pl-s"&gt;"wavelength"&lt;/span&gt;, &lt;span class="pl-s"&gt;"angstrom"&lt;/span&gt;)  &lt;span class="pl-c"&gt;# Physical unit&lt;/span&gt;
&lt;span class="pl-s1"&gt;handler&lt;/span&gt;.&lt;span class="pl-c1"&gt;add_reference&lt;/span&gt;(
    &lt;span class="pl-s1"&gt;doi&lt;/span&gt;&lt;span class="pl-c1"&gt;=&lt;/span&gt;&lt;span class="pl-s"&gt;"10.1051/0004-6361/201526937"&lt;/span&gt;,      &lt;span class="pl-c"&gt;# Journal article DOI&lt;/span&gt;
    &lt;span class="pl-s1"&gt;description&lt;/span&gt;&lt;span class="pl-c1"&gt;=&lt;/span&gt;&lt;span class="pl-s"&gt;"NIST Atomic Spectra Database"&lt;/span&gt;
)

&lt;span class="pl-c"&gt;# Save to HDF5 (or use with Pandas)&lt;/span&gt;
&lt;span class="pl-en"&gt;save_to_hdf&lt;/span&gt;(
    &lt;span class="pl-s1"&gt;df&lt;/span&gt;&lt;span class="pl-c1"&gt;=&lt;/span&gt;&lt;span class="pl-s1"&gt;atomic_data&lt;/span&gt;, 
    &lt;span class="pl-s1"&gt;path&lt;/span&gt;&lt;span class="pl-c1"&gt;=&lt;/span&gt;&lt;span class="pl-s"&gt;"output.h5"&lt;/span&gt;,
    &lt;span class="pl-s1"&gt;metadata_handler&lt;/span&gt;&lt;span class="pl-c1"&gt;=&lt;/span&gt;&lt;span class="pl-s1"&gt;handler&lt;/span&gt;
)&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;🚦 Testing&lt;/h3&gt;
&lt;span class="octicon octicon-link"&gt;&lt;/span&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Unit Tests&lt;/strong&gt;: pytest tests/test_metadata.py (100% coverage)
&lt;a rel="noopener noreferrer" href="https://github.com/user-attachments/assets/5b681a0c-28c9-428c-b5f6-b8b192090e6b"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fuser-attachments%2Fassets%2F5b681a0c-28c9-428c-b5f6-b8b192090e6b" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Manual Verification&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Confirmed HDF5 metadata structure with h5ls&lt;/li&gt;
&lt;li&gt;Validated unit enforcement&lt;/li&gt;
&lt;li&gt;Verified reference persistence&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;☑️ Checklist&lt;/h3&gt;
&lt;span class="octicon octicon-link"&gt;&lt;/span&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;[x] Requested reviewers: @AndreasFlörs @AndrewFullard&lt;/li&gt;
&lt;li&gt;[x] I updated the documentation according to my changes&lt;/li&gt;
&lt;li&gt;[x] Added comprehensive docstrings&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; If you are not allowed to perform any of these actions, ping (@) a contributor.&lt;/p&gt;
&lt;/blockquote&gt;

    &lt;/div&gt;
    &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/tardis-sn/carsus/pull/442" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;In March, I embarked on an exciting journey by raising a PR and eagerly seeking feedback on Gitter. Determined to make a mark, I tried tackling additional issues and launched into crafting my GSoC proposal. With the proposal being a pivotal factor for selection, I devoted more than 25 hours over several days to ensure it was robust and compelling.&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%2F5bi56n4qucg5vjs284ut.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%2F5bi56n4qucg5vjs284ut.png" alt="Proposal Cover page"&gt;&lt;/a&gt; Cover Page of Proposal &lt;/p&gt;

&lt;p&gt;My confidence surged when I received the delightful news that I was shortlisted for an interview. &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%2Fn5eqrmxozueosmlvhm1b.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%2Fn5eqrmxozueosmlvhm1b.png" alt="Interview shortlist email"&gt;&lt;/a&gt; Interview Confirmation mail &lt;/p&gt;

&lt;p&gt;But my excitement quickly turned to disappointment; although I aced the behavioral questions, I stumbled over the technical ones even those that were straightforward.&lt;/p&gt;

&lt;p&gt;The technical questions included:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;What library is used to interact with HDF5 files?&lt;/li&gt;
&lt;li&gt;What is an HDF5 file?&lt;/li&gt;
&lt;li&gt;What is a subprocess in Python?&lt;/li&gt;
&lt;li&gt;What are class methods in Python?&lt;/li&gt;
&lt;li&gt;Which functions are used to read, write, and perform other operations on HDF5 files?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The behavioral inquiries were such as:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; What would you do if you believe there's a better solution to a problem than the one suggested by the maintainer?&lt;/li&gt;
&lt;li&gt; How do you approach fixing bugs and errors?&lt;/li&gt;
&lt;li&gt; How would you handle a situation where differing opinions within the team lead to conflict?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;After the interview, I felt disheartened and spent the entire day grappling with the thought that I could have performed better. I should have focused more on strengthening my Python skills instead of solely diving deep into the codebase. My advice: don't repeat this mistake. The next day, surrounded by thoughts of wasted effort and missed opportunities, clarity struck &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What was the true purpose? It wasn't just about GSoC; the true aim was to contribute to something meaningful, impactful, and genuinely valuable.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This realization lifted my spirits, and I decided to pen this blog post, hoping future contributors won't make the same mistakes.&lt;/p&gt;

&lt;p&gt;If you're working on the Carsus metadata component, I'd be happy to share my proposal with you. Regardless of the outcome of the GSoC results, my commitment remains strong as I will continue to contribute in the true spirit of open source. And with renewed focus and determination, I'm confident that I will succeed in next year's selection.&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%2F8svr44jj4zir2illhdcv.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%2F8svr44jj4zir2illhdcv.png" alt="complete architecture"&gt;&lt;/a&gt; Planned Metadata ecosystem &lt;/p&gt;

&lt;p&gt;I'm always open to lending a hand, whether you have questions, need guidance, or just want to chat about your own experiences. Feel free to reach out to me with any inquiries or requests for assistance as you navigate your own path within the open-source community. Together, we can learn, grow, and make meaningful contributions. I look forward to hearing from you!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://x.com/Akashj_01" class="crayons-btn crayons-btn--primary" rel="noopener noreferrer"&gt;Connect on X&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExc29ieGY4M2N2bWlnd2RrdnlhYXBtZHZ0dzVmOXJrMGI3NHc2cmxjMyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/WIH7vL4QgofvQbD8fI/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExc29ieGY4M2N2bWlnd2RrdnlhYXBtZHZ0dzVmOXJrMGI3NHc2cmxjMyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/WIH7vL4QgofvQbD8fI/giphy.gif"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>learning</category>
      <category>science</category>
      <category>datascience</category>
    </item>
    <item>
      <title>If you are looking to learn oops concept in fun way do check this out!</title>
      <dc:creator>Akash Jana</dc:creator>
      <pubDate>Sat, 12 Apr 2025 17:04:29 +0000</pubDate>
      <link>https://dev.to/akashjana/if-you-are-looking-to-learn-oops-concept-in-fun-way-do-check-this-out-obm</link>
      <guid>https://dev.to/akashjana/if-you-are-looking-to-learn-oops-concept-in-fun-way-do-check-this-out-obm</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/akashjana/object-oriented-emotions-2o19" class="crayons-story__hidden-navigation-link"&gt;Object-Oriented Emotions&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/akashjana" class="crayons-avatar  crayons-avatar--l  "&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%2Fuser%2Fprofile_image%2F2173633%2F9a94c008-acb5-4b2a-9749-adcc5449b5fd.jpeg" alt="akashjana profile" class="crayons-avatar__image" width="460" height="460"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/akashjana" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Akash Jana
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Akash Jana
                &lt;a href="/++"&gt;&lt;img alt="Subscriber" class="subscription-icon" src="https://assets.dev.to/assets/subscription-icon-805dfa7ac7dd660f07ed8d654877270825b07a92a03841aa99a1093bd00431b2.png" width="166" height="102"&gt;&lt;/a&gt;
              
              &lt;div id="story-author-preview-content-2397869" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/akashjana" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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%2Fuser%2Fprofile_image%2F2173633%2F9a94c008-acb5-4b2a-9749-adcc5449b5fd.jpeg" class="crayons-avatar__image" alt="" width="460" height="460"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Akash Jana&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/akashjana/object-oriented-emotions-2o19" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Apr 10 '25&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/akashjana/object-oriented-emotions-2o19" id="article-link-2397869"&gt;
          Object-Oriented Emotions
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/programming"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;programming&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/learning"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;learning&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/cpp"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;cpp&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/oop"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;oop&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/akashjana/object-oriented-emotions-2o19" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/fire-f60e7a582391810302117f987b22a8ef04a2fe0df7e3258a5f49332df1cec71e.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/exploding-head-daceb38d627e6ae9b730f36a1e390fca556a4289d5a41abb2c35068ad3e2c4b5.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;39&lt;span class="hidden s:inline"&gt; reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/akashjana/object-oriented-emotions-2o19#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              7&lt;span class="hidden s:inline"&gt; comments&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            4 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>programming</category>
      <category>learning</category>
      <category>cpp</category>
      <category>oop</category>
    </item>
    <item>
      <title>Object-Oriented Emotions</title>
      <dc:creator>Akash Jana</dc:creator>
      <pubDate>Thu, 10 Apr 2025 18:54:37 +0000</pubDate>
      <link>https://dev.to/akashjana/object-oriented-emotions-2o19</link>
      <guid>https://dev.to/akashjana/object-oriented-emotions-2o19</guid>
      <description>&lt;h2&gt;
  
  
  📝 Intro: Why OOP Needs a Rebrand
&lt;/h2&gt;

&lt;p&gt;Let’s be honest most people learn Object-Oriented Programming (OOP) from textbooks that feel like they were written by robots for other robots. Dry terms. Boring examples. Zero vibes.&lt;/p&gt;

&lt;p&gt;But OOP is literally how the world works. Humans are objects, our behaviors are methods, and our feelings? Encapsulated, of course.&lt;/p&gt;

&lt;p&gt;This blog is my attempt to bring some &lt;strong&gt;fun and feels&lt;/strong&gt; into OOP through a quirky message my &lt;em&gt;bbg&lt;/em&gt; sent me, a little decoding, and a whole lot of creativity. Whether you’re new to programming or a seasoned dev, I promise this will be the most emotionally intelligent OOP guide you’ve read.&lt;/p&gt;

&lt;h2&gt;
  
  
  🧶 A Little Backstory
&lt;/h2&gt;

&lt;p&gt;So the yesterday, my bbg sent me a message. It said:&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%2Fija8sf2yk96hfagwasoz.jpg" 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%2Fija8sf2yk96hfagwasoz.jpg" alt="bbg text message" width="800" height="464"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At first, I sat there blinking at my phone like a compiler stuck in an infinite loop. Was this a poetic cry for help… or just the nerdiest way to say “I’m in my feels”?&lt;/p&gt;

&lt;p&gt;After a few minutes of hardcore mental parsing (and a smile ofc), I realized: this is gold. After a few minutes of decoding and appreciation, it hit me: this is brilliant. Not just as a one-liner, but as the perfect metaphor to explain Object-Oriented Programming (OOP) in a way that’s real, hilarious, and surprisingly accurate.&lt;/p&gt;

&lt;p&gt;So this blog? Yeah, it was inspired by that message. Because let’s be honest OOP is way more fun when explained through emotions.&lt;/p&gt;

&lt;p&gt;Because the world &lt;em&gt;needs&lt;/em&gt; to know that &lt;strong&gt;OOP isn’t just a programming concept — it’s how we all live.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Love, Logic, and Line-by-Line Debugging
&lt;/h2&gt;

&lt;p&gt;Let’s face it, understanding Object-Oriented Programming (OOP) can be... dry. Words like &lt;code&gt;encapsulation&lt;/code&gt; and &lt;code&gt;polymorphism&lt;/code&gt; sound like spells from a wizarding school for witchcraft computers.&lt;/p&gt;

&lt;p&gt;But what if I told you you're already an OOP master? Yes, &lt;strong&gt;you&lt;/strong&gt;, the emotionally complex human reading this. Because we all &lt;em&gt;live&lt;/em&gt; like objects full of state, behaviors, and yes... emotions.&lt;/p&gt;




&lt;h2&gt;
  
  
  💬 Meet &lt;code&gt;class Human&lt;/code&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Human&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="nl"&gt;private:&lt;/span&gt;
    &lt;span class="n"&gt;Emotion&lt;/span&gt; &lt;span class="n"&gt;emotion&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nl"&gt;public:&lt;/span&gt;
    &lt;span class="n"&gt;Human&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;emotion&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Emotion&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Neutral&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;receiveMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;"Hi :)"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;emotion&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Emotion&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Happy&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="nf"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;"We need to talk."&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;emotion&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Emotion&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Anxious&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="n"&gt;react&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;react&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;switch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;emotion&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;Emotion&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Happy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"Smiles and replies instantly!"&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;endl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;Emotion&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Anxious&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"Seen at 2:33 PM, no reply."&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;endl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="nl"&gt;default:&lt;/span&gt;
                &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"Typing..."&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;endl&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="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You're a walking, talking class. And you’re &lt;strong&gt;encapsulated&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔐 What is Encapsulation?
&lt;/h2&gt;

&lt;p&gt;Encapsulation is like putting your emotions behind a secure API.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You &lt;strong&gt;don’t&lt;/strong&gt; let people directly access your private &lt;code&gt;emotion&lt;/code&gt; variable.&lt;/li&gt;
&lt;li&gt;You &lt;strong&gt;do&lt;/strong&gt; give them public methods like &lt;code&gt;receiveMessage()&lt;/code&gt; to interact with you.&lt;/li&gt;
&lt;li&gt;If someone tries to call a random function like &lt;code&gt;poke()&lt;/code&gt;, it’ll still go through the emotion check.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In real life? That’s like saying:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“You can talk to me, but how I feel about it will be handled &lt;em&gt;internally&lt;/em&gt;. My emotion functions are running silently in the background. Good luck guessing the return value.”&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  😮 Inheritance? Oh honey, that's &lt;em&gt;family drama&lt;/em&gt;
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Sorry for the cringe lines T_T but its fun so why not XD&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Developer&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;Human&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="nl"&gt;public:&lt;/span&gt;
    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;writeCode&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"Crying in Git commits."&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;endl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Just like in life, children (subclasses) inherit traits and behavior from their parents (base classes), but also have their own quirks. A &lt;code&gt;Developer&lt;/code&gt; still feels emotions (inherited from &lt;code&gt;Human&lt;/code&gt;) but also has special abilities like &lt;code&gt;writeCode()&lt;/code&gt; or &lt;code&gt;ragePushToProd()&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🌀 Polymorphism – One Interface, Many Feelings
&lt;/h2&gt;

&lt;p&gt;You say “good morning” to both:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your boss (&lt;code&gt;class Manager&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Your crush (&lt;code&gt;class Babygirl&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both respond differently, even though you called the same function: &lt;code&gt;sayGoodMorning()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;That’s &lt;strong&gt;polymorphism&lt;/strong&gt;. One function, many behaviors — determined by the object receiving it.&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="n"&gt;Manager&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Manager&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="n"&gt;Babygirl&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Babygirl&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;sayGoodMorning&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// "Let’s discuss your progress."&lt;/span&gt;
&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;sayGoodMorning&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// "Aww, finally! 😘"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🧼 Abstraction: Hiding the Mess
&lt;/h2&gt;

&lt;p&gt;You don’t need to know &lt;strong&gt;how&lt;/strong&gt; someone handles emotions internally, you just know that when you say something nice, they smile. That’s abstraction.&lt;/p&gt;

&lt;p&gt;In code:  &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You call &lt;code&gt;react()&lt;/code&gt; without knowing the emotional algorithm behind it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In life:  &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You send a meme. They laugh. That’s all you need.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  ✨ Final Thoughts: Be Like an Object
&lt;/h2&gt;

&lt;p&gt;So next time someone asks why you're taking time to reply, you can say:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Sorry babe, I’m encapsulated with some emotional member functions right now. Input received, response coming after exception handling.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Object-Oriented Programming isn’t just about code it’s a metaphor for life. Encapsulate your emotions. Abstract the noise. Inherit good traits. And be polymorphic enough to adapt.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔁 TL;DR
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Encapsulation&lt;/strong&gt;: Emotions are private. Interact through safe functions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inheritance&lt;/strong&gt;: Traits passed down with added spice.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Polymorphism&lt;/strong&gt;: Same function, different reactions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Abstraction&lt;/strong&gt;: Hide the internal chaos. Smile on the outside.&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;If this post made you chuckle and learn, share it with a friend who still thinks OOP is boring. Or better yet, fork yourself into &lt;code&gt;class Influencer&lt;/code&gt; and spread the joy.&lt;/p&gt;

&lt;p&gt;Want a Part 2 with &lt;code&gt;class Relationship&lt;/code&gt;, &lt;code&gt;Exception Handling (BreakUps)&lt;/code&gt;, or &lt;code&gt;Design Patterns of a Clingy Coder&lt;/code&gt;? Hit me up 😄&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExc29ieGY4M2N2bWlnd2RrdnlhYXBtZHZ0dzVmOXJrMGI3NHc2cmxjMyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/WIH7vL4QgofvQbD8fI/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExc29ieGY4M2N2bWlnd2RrdnlhYXBtZHZ0dzVmOXJrMGI3NHc2cmxjMyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/WIH7vL4QgofvQbD8fI/giphy.gif" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>learning</category>
      <category>cpp</category>
      <category>oop</category>
    </item>
    <item>
      <title>Conquering the Setup Loop with Daytona</title>
      <dc:creator>Akash Jana</dc:creator>
      <pubDate>Fri, 27 Dec 2024 16:12:28 +0000</pubDate>
      <link>https://dev.to/akashjana/conquering-the-setup-loop-with-daytona-5614</link>
      <guid>https://dev.to/akashjana/conquering-the-setup-loop-with-daytona-5614</guid>
      <description>&lt;h2&gt;
  
  
  How I Started Using Daytona 🛠️
&lt;/h2&gt;

&lt;p&gt;As a developer juggling multiple projects, I often found myself stuck in the dreaded &lt;strong&gt;"setup loop."&lt;/strong&gt; Every new project meant 30-40 minutes sometimes hours configuring environments to match different dependencies and tooling requirements. It felt like I was spending more time setting up than actually coding... for &lt;em&gt;fixing small bugs in massive repositories.&lt;/em&gt; 😩  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quira Quest 023&lt;/strong&gt; introduced a hidden gem: &lt;strong&gt;Daytona.&lt;/strong&gt; Intrigued, I gave it a quick search and discovered its promise of creating Workspaces preconfigured development environments that &lt;em&gt;just work&lt;/em&gt;. Could this be the end of my setup nightmares? Spoiler alert: It was.  &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%2F80cjm7x7dsdfmji7xbsk.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%2F80cjm7x7dsdfmji7xbsk.png" alt="Daytona Logo" width="769" height="237"&gt;&lt;/a&gt;  &lt;/p&gt;

&lt;h3&gt;
  
  
  What is Daytona? 🤔
&lt;/h3&gt;

&lt;p&gt;Daytona is an open-source tool that helps developers create, manage, and use &lt;strong&gt;ready-to-go coding environments&lt;/strong&gt; called &lt;em&gt;Workspaces&lt;/em&gt;. Think of it as a magic wand 🪄 for your development setups. It works seamlessly with container tech (like Docker) and popular tools like Git and Visual Studio Code.  &lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Key Features That Won Me Over&lt;/strong&gt; 🎉
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;🔒 Secure Access:&lt;/strong&gt; No more messy port forwarding. Daytona sets up a secure connection between your machine and the remote server effortlessly.
&lt;/li&gt;
&lt;/ol&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%2F257w653q7ou1wjx2p086.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%2F257w653q7ou1wjx2p086.png" alt="Secure Access and IDE support flowchart" width="800" height="666"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;💻 IDE Support:&lt;/strong&gt; Whether you're a Visual Studio Code fan or a JetBrains loyalist, Daytona has your back.  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;🔗 Seamless Git Integration:&lt;/strong&gt; Pull, push, or commit directly from the Workspace without ever leaving your flow.  &lt;/p&gt;&lt;/li&gt;
&lt;/ol&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%2Faoyob4m9gkjeyu7z7gno.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%2Faoyob4m9gkjeyu7z7gno.png" alt="Integrations flowchart" width="800" height="837"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;📂 Multi-Project Workspaces:&lt;/strong&gt; Managing microservices? Multiple repositories? Daytona makes it a breeze.
&lt;/li&gt;
&lt;/ol&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%2Fw4ftuo5k28squk0my5wf.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%2Fw4ftuo5k28squk0my5wf.png" alt="Multi-project workpsaces and easy sharing flowchart" width="800" height="726"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;🌐 Easy Sharing:&lt;/strong&gt; Share your Workspace over public or restricted networks with just a few clicks.  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;🔧 Customizable:&lt;/strong&gt; Extend functionality with Go plugins or integrate with tools you love.  &lt;/p&gt;&lt;/li&gt;
&lt;/ol&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%2Fje88xaqfvxyy2hzbyjm6.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%2Fje88xaqfvxyy2hzbyjm6.png" alt="Customization flowchart" width="742" height="867"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;In short, Daytona takes the hassle out of setup and lets you focus on what you do best: coding.  &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Link to the flow chart: &lt;a href="https://app.eraser.io/workspace/dgY9wzBynkRE0woC3s1E?origin=share&amp;amp;elements=HFYnccNDihCHJg3xJo2yiQ" rel="noopener noreferrer"&gt;Daytona Features flowchart&lt;/a&gt;  &lt;/p&gt;




&lt;h3&gt;
  
  
  A Quick Vocabulary Lesson 📘
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExbG5raXZrNzd4ZTF3YTA1MXVyNXRjOXM4cGlyYWpmd3VrbmN1Z3JldiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/yDYAHbqe5DfyM/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExbG5raXZrNzd4ZTF3YTA1MXVyNXRjOXM4cGlyYWpmd3VrbmN1Z3JldiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/yDYAHbqe5DfyM/giphy.gif" width="260" height="146"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here are some terms I picked up while getting to know Daytona:  &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Dev Container:&lt;/strong&gt; A pre-configured environment that contains all the tools and settings you need. Think of it as your development Swiss army knife. 🛠️
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Workspace:&lt;/strong&gt; Your digital playground where files, code, and projects live harmoniously. 🏞️
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Git Providers (SCMs):&lt;/strong&gt; Tools like GitHub, GitLab, and Bitbucket that help you host and collaborate on codebases.
&lt;em&gt;{SCMs: Source Code Managers}&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Target:&lt;/strong&gt; The destination for your development setup local machine, remote server, or the cloud. ☁️
&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  Let’s Get Started 🚀
&lt;/h3&gt;

&lt;p&gt;For this tutorial, I’ll show you how I used Daytona to integrate &lt;strong&gt;GlobalSync&lt;/strong&gt;, a frontend project using &lt;strong&gt;Aceternity UI&lt;/strong&gt;.  &lt;/p&gt;

&lt;p&gt;✨ Do give it a star: &lt;a href="https://github.com/AkashJana18/GlobalSync-frontend" class="crayons-btn crayons-btn--primary" rel="noopener noreferrer"&gt;GlobalSync Frontend ⭐&lt;/a&gt;
&lt;/p&gt;




&lt;h4&gt;
  
  
  Step 1️⃣: Installing Daytona 🖥️
&lt;/h4&gt;

&lt;p&gt;For Windows, run the following in PowerShell:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$architecture&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$env&lt;/span&gt;:PROCESSOR_ARCHITECTURE &lt;span class="nt"&gt;-eq&lt;/span&gt; &lt;span class="s2"&gt;"AMD64"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;"amd64"&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;"arm64"&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
md &lt;span class="nt"&gt;-Force&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$Env&lt;/span&gt;&lt;span class="s2"&gt;:APPDATA&lt;/span&gt;&lt;span class="se"&gt;\b&lt;/span&gt;&lt;span class="s2"&gt;in&lt;/span&gt;&lt;span class="se"&gt;\d&lt;/span&gt;&lt;span class="s2"&gt;aytona"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;System.Net.ServicePointManager]::SecurityProtocol &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;System.Net.SecurityProtocolType]&lt;span class="s1"&gt;'Tls,Tls11,Tls12'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
Invoke-WebRequest &lt;span class="nt"&gt;-URI&lt;/span&gt; &lt;span class="s2"&gt;"https://download.daytona.io/daytona/v0.50/daytona-windows-&lt;/span&gt;&lt;span class="nv"&gt;$architecture&lt;/span&gt;&lt;span class="s2"&gt;.exe"&lt;/span&gt; &lt;span class="nt"&gt;-OutFile&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$Env&lt;/span&gt;&lt;span class="s2"&gt;:APPDATA&lt;/span&gt;&lt;span class="se"&gt;\b&lt;/span&gt;&lt;span class="s2"&gt;in&lt;/span&gt;&lt;span class="se"&gt;\d&lt;/span&gt;&lt;span class="s2"&gt;aytona&lt;/span&gt;&lt;span class="se"&gt;\d&lt;/span&gt;&lt;span class="s2"&gt;aytona.exe"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$env&lt;/span&gt;:Path +&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;";"&lt;/span&gt; + &lt;span class="nv"&gt;$Env&lt;/span&gt;:APPDATA + &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\b&lt;/span&gt;&lt;span class="s2"&gt;in&lt;/span&gt;&lt;span class="se"&gt;\d&lt;/span&gt;&lt;span class="s2"&gt;aytona"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;Environment]::SetEnvironmentVariable&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Path"&lt;/span&gt;, &lt;span class="nv"&gt;$env&lt;/span&gt;:Path, &lt;span class="o"&gt;[&lt;/span&gt;System.EnvironmentVariableTarget]::User&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
daytona serve&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;blockquote&gt;
&lt;p&gt;📝 For other OS (Linux, macOS, Homebrew, Nix), check out &lt;a href="https://www.daytona.io/docs/installation/installation/" rel="noopener noreferrer"&gt;Daytona Installation Guide&lt;/a&gt;.  &lt;/p&gt;
&lt;/blockquote&gt;


&lt;h4&gt;
  
  
  Step 2️⃣: Setting Up a Dev-Container 📦
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Create a folder named &lt;code&gt;.devcontainer&lt;/code&gt; in your repository. &lt;em&gt;(Yes, the dot is important. Don’t skip it!)&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Inside, add a &lt;code&gt;devcontainer.json&lt;/code&gt; file.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here’s how mine looks:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"GlobalSync Development Container"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"image"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"mcr.microsoft.com/devcontainers/javascript-node"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"forwardPorts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"customizations"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"vscode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"settings"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"eslint.enable"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"editor.formatOnSave"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"extensions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="s2"&gt;"esbenp.prettier-vscode"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="s2"&gt;"dbaeumer.vscode-eslint"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="s2"&gt;"ms-vscode.vscode-typescript-tslint-plugin"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"postCreateCommand"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npm install"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;blockquote&gt;
&lt;p&gt;Pro Tip: You can generate this file with &lt;a href="https://devcontainer.ai/" rel="noopener noreferrer"&gt;DevContainer.ai&lt;/a&gt; to save time! ⏳  &lt;/p&gt;
&lt;/blockquote&gt;


&lt;h4&gt;
  
  
  Step 3️⃣: Configuration ⚙️
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;1. Connect Daytona to Your Git Repositories 🛠️&lt;/strong&gt; &lt;br&gt;
First things first connect Daytona to your version control system! Whether you’re working with &lt;em&gt;GitHub&lt;/em&gt;, &lt;em&gt;GitLab&lt;/em&gt;, or any other Git provider, Daytona makes it seamless to manage your repositories. Just run this command in your terminal:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;daytona git-providers add
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Once done, Daytona will ask you to authenticate with your chosen Git provider. A few clicks, and voilà! You’re ready to fetch code, push commits, and manage branches directly from your Workspace. No more hunting down SSH keys or copy-pasting HTTPS URLs Daytona handles it all for you. 🎉  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Install a Cloud Provider ☁️&lt;/strong&gt;&lt;br&gt;
Next up, let’s set up a cloud provider. If you’re deploying your Workspace on platforms like &lt;em&gt;AWS&lt;/em&gt;, &lt;em&gt;Azure&lt;/em&gt;, or &lt;em&gt;Google Cloud&lt;/em&gt;, this step is essential. Installing a provider ensures Daytona can interact with these platforms smoothly.  &lt;/p&gt;

&lt;p&gt;Run this command:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;daytona provider &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Daytona will guide you through the setup adding credentials, configuring access, and more. Don’t worry, it’s all secure and straightforward. By the end, your cloud environments will be ready for action, making collaboration and scalability a breeze.  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Set a Target 🎯&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A "Target" is simply where your development environment will live. It could be:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Local Docker instance&lt;/strong&gt; (great for personal projects).
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Remote servers&lt;/strong&gt; (ideal for team collaborations).
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cloud platforms&lt;/strong&gt; like AWS or GCP.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To define your target, use this command:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;daytona target &lt;span class="nb"&gt;set&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Daytona will ask a few questions like which platform to use and any specific configurations. Once set, it’ll remember your target, so you can jump into coding without worrying about the underlying setup. 💪  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Choose Your IDE 💻&lt;/strong&gt; &lt;br&gt;
Let’s face it, we all have our go to IDE. Whether you’re a &lt;strong&gt;VS Code enthusiast&lt;/strong&gt;, an &lt;strong&gt;IntelliJ master&lt;/strong&gt;, or someone who swears by &lt;strong&gt;Vim&lt;/strong&gt;, Daytona has you covered. To link your favorite IDE to Daytona, run:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;daytona ide
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Daytona will configure your IDE to work seamlessly with the Workspaces. This means you’ll have all the power of your IDE debugging, extensions, and custom shortcuts working in harmony with your remote environment. It’s like bringing the comfort of home to your cloud setup! 🏡✨  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ready to Code! 🚀&lt;/strong&gt; &lt;br&gt;
With your Git provider, cloud platform, target, and IDE set up, you’re all set to unleash the magic of Daytona. No more wasting time on repetitive configurations just run a command and get straight into solving the next big problem!&lt;/p&gt;
&lt;h4&gt;
  
  
  Step 4️⃣: Create Your Workspace 🖇️
&lt;/h4&gt;

&lt;p&gt;Finally, create your Workspace with this command:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;daytona create &amp;lt;REPO_URL&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Run your project locally using:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  My View 🤓
&lt;/h3&gt;

&lt;p&gt;I didn't have any issue using Daytona for my development workflow. From eliminating the headaches of environment setup to simplifying multi-repo management, it feels like having a personal assistant for coding.  &lt;/p&gt;

&lt;p&gt;So, if you’re tired of wasting hours in the &lt;em&gt;"setup loop"&lt;/em&gt; ⏳, give Daytona a shot. Trust me, your future self will thank you! 🙌  &lt;/p&gt;

&lt;p&gt;And hey, don’t forget to give &lt;strong&gt;Daytona&lt;/strong&gt; and &lt;strong&gt;GlobalSync&lt;/strong&gt; a star while you’re at it. Who knows, it might inspire &lt;em&gt;your&lt;/em&gt; next big project! 💡✨  &lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/daytonaio" rel="noopener noreferrer"&gt;
        daytonaio
      &lt;/a&gt; / &lt;a href="https://github.com/daytonaio/daytona" rel="noopener noreferrer"&gt;
        daytona
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Daytona is a Secure and Elastic Infrastructure for Running AI-Generated Code
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div&gt;
&lt;p&gt;&lt;a href="https://www.daytona.io/docs" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/c3ffa91b9d2fa32f5671c7f0fff17d560f7caeaa7b427ce188f4ab00d709f1fa/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f646179746f6e61696f2f646f63733f6c6162656c3d446f637326636f6c6f723d323363633731" alt="Documentation"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/2abadcf3de25d7418edfe20d6535f543c05896a58a3326418fa7bb63239817e6/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6963656e73652d4147504c2d2d332d626c7565"&gt;&lt;img src="https://camo.githubusercontent.com/2abadcf3de25d7418edfe20d6535f543c05896a58a3326418fa7bb63239817e6/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6963656e73652d4147504c2d2d332d626c7565" alt="License"&gt;&lt;/a&gt;
&lt;a href="https://goreportcard.com/report/github.com/daytonaio/daytona" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/48e6df9fd925c8a123202c9d4e0f4058f84f62d6b74454e9b0538381f13e3289/68747470733a2f2f676f7265706f7274636172642e636f6d2f62616467652f6769746875622e636f6d2f646179746f6e61696f2f646179746f6e61" alt="Go Report Card"&gt;&lt;/a&gt;
&lt;a href="https://github.com/daytonaio/daytona/issues" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/92891f709de6df1b89bdd17666b11da46578c92fc7b05cfdb070179fb49b4922/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6973737565732f646179746f6e61696f2f646179746f6e61" alt="Issues - daytona"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/8e457201c95de1eb4b3a8b07e4f161e00bdacd538cb55d3f8ac00f60c9fa0559/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f646179746f6e61696f2f646179746f6e61"&gt;&lt;img src="https://camo.githubusercontent.com/8e457201c95de1eb4b3a8b07e4f161e00bdacd538cb55d3f8ac00f60c9fa0559/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f646179746f6e61696f2f646179746f6e61" alt="GitHub Release"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;

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

&lt;div&gt;
  
    
    
    &lt;img alt="Daytona logo" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fdaytonaio%2Fdaytona%2Fraw%2Fmain%2Fassets%2Fimages%2FDaytona-logotype-black.png" width="50%"&gt;
  
&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;
  Run AI Code
  &lt;br&gt;
  Secure and Elastic Infrastructure for
  Running Your AI-Generated Code
&lt;/h3&gt;
&lt;/div&gt;

&lt;p&gt;
    &lt;a href="https://www.daytona.io/docs" rel="nofollow noopener noreferrer"&gt; Documentation &lt;/a&gt;·
    &lt;a href="https://github.com/daytonaio/daytona/issues/new?assignees=&amp;amp;labels=bug&amp;amp;projects=&amp;amp;template=bug_report.md&amp;amp;title=%F0%9F%90%9B+Bug+Report%3A+" rel="noopener noreferrer"&gt; Report Bug &lt;/a&gt;·
    &lt;a href="https://github.com/daytonaio/daytona/issues/new?assignees=&amp;amp;labels=enhancement&amp;amp;projects=&amp;amp;template=feature_request.md&amp;amp;title=%F0%9F%9A%80+Feature%3A+" rel="noopener noreferrer"&gt; Request Feature &lt;/a&gt;·
    &lt;a href="https://go.daytona.io/slack" rel="nofollow noopener noreferrer"&gt; Join our Slack &lt;/a&gt;·
    &lt;a href="https://x.com/daytonaio" rel="nofollow noopener noreferrer"&gt; Connect on X &lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
    &lt;a href="https://www.producthunt.com/posts/daytona-2?embed=true&amp;amp;utm_source=badge-top-post-badge&amp;amp;utm_medium=badge&amp;amp;utm_souce=badge-daytona-2" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/e3594df175ece5069fa75cc3454bdaa7a1627c38700ed0c0c3c41fe12a28e272/68747470733a2f2f6170692e70726f6475637468756e742e636f6d2f776964676574732f656d6265642d696d6167652f76312f746f702d706f73742d62616467652e7376673f706f73745f69643d393537363137267468656d653d6e65757472616c26706572696f643d6461696c7926743d31373436313736373430313530" alt="Daytona  - Secure and elastic infra for running your AI-generated code. | Product Hunt" width="250" height="54"&gt;&lt;/a&gt;
    &lt;a href="https://www.producthunt.com/posts/daytona-2?embed=true&amp;amp;utm_source=badge-top-post-topic-badge&amp;amp;utm_medium=badge&amp;amp;utm_souce=badge-daytona-2" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/24c2f175810956691dbff3355606fb70ecdb95cb5346032efac9eeb6daa91a66/68747470733a2f2f6170692e70726f6475637468756e742e636f6d2f776964676574732f656d6265642d696d6167652f76312f746f702d706f73742d746f7069632d62616467652e7376673f706f73745f69643d393537363137267468656d653d6e65757472616c26706572696f643d6d6f6e74686c7926746f7069635f69643d32333726743d31373436313736373430313530" alt="Daytona  - Secure and elastic infra for running your AI-generated code. | Product Hunt" width="250" height="54"&gt;&lt;/a&gt;
&lt;/p&gt;




&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Installation&lt;/h2&gt;

&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Python SDK&lt;/h3&gt;

&lt;/div&gt;

&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;pip install daytona&lt;/pre&gt;

&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;TypeScript SDK&lt;/h3&gt;

&lt;/div&gt;

&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;npm install @daytonaio/sdk&lt;/pre&gt;

&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Ruby SDK&lt;/h3&gt;

&lt;/div&gt;

&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;gem install daytona&lt;/pre&gt;

&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Go SDK&lt;/h3&gt;

&lt;/div&gt;

&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;go get github.com/daytonaio/daytona/libs/sdk-go&lt;/pre&gt;

&lt;/div&gt;




&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Features&lt;/h2&gt;

&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Lightning-Fast Infrastructure&lt;/strong&gt;: Sub-90ms Sandbox creation from code to execution.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Separated &amp;amp; Isolated Runtime&lt;/strong&gt;: Execute AI-generated code with zero risk to your infrastructure.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Massive Parallelization for Concurrent AI Workflows&lt;/strong&gt;: Fork Sandbox filesystem and memory state (Coming soon!)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Programmatic Control&lt;/strong&gt;: File, Git, LSP, and Execute API&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unlimited Persistence&lt;/strong&gt;: Your Sandboxes can live forever&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OCI/Docker Compatibility&lt;/strong&gt;: Use any OCI/Docker image to create a Sandbox&lt;/li&gt;
&lt;/ul&gt;




&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Quick Start&lt;/h2&gt;

&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;Create an account at &lt;a href="https://app.daytona.io" rel="nofollow noopener noreferrer"&gt;app.daytona.io&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Generate a &lt;a href="https://app.daytona.io/dashboard/keys" rel="nofollow noopener noreferrer"&gt;new API key&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Follow &lt;a href="https://www.daytona.io/docs/" rel="nofollow noopener noreferrer"&gt;documentation&lt;/a&gt; to start using Daytona&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Creating your first Sandbox&lt;/h2&gt;

&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Python SDK&lt;/h3&gt;

&lt;/div&gt;

&lt;div class="highlight highlight-source-python notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-k"&gt;from&lt;/span&gt; &lt;span class="pl-s1"&gt;daytona&lt;/span&gt; &lt;span class="pl-k"&gt;import&lt;/span&gt; &lt;span class="pl-v"&gt;Daytona&lt;/span&gt;, &lt;span class="pl-v"&gt;DaytonaConfig&lt;/span&gt;
&lt;span class="pl-s1"&gt;config&lt;/span&gt; &lt;span class="pl-c1"&gt;=&lt;/span&gt; &lt;span class="pl-en"&gt;DaytonaConfig&lt;/span&gt;(&lt;/pre&gt;…
&lt;/div&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/daytonaio/daytona" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;And before I sign off, here are some useful links: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://quira.sh/quests/creator/details?questId=23" rel="noopener noreferrer"&gt;Quira Quest 23&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.daytona.io/" rel="noopener noreferrer"&gt;Daytona&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.daytona.io/docs/" rel="noopener noreferrer"&gt;Doc&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A big shoutout to the incredible folks behind Quira and Daytona. Your innovation has made our developer lives a whole lot easier and dare I say a bit more fun!&lt;/p&gt;

&lt;p&gt;Kudos to the entire team, and here’s to many more seamless setups and productive coding sessions! 🚀&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExc29ieGY4M2N2bWlnd2RrdnlhYXBtZHZ0dzVmOXJrMGI3NHc2cmxjMyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/WIH7vL4QgofvQbD8fI/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExc29ieGY4M2N2bWlnd2RrdnlhYXBtZHZ0dzVmOXJrMGI3NHc2cmxjMyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/WIH7vL4QgofvQbD8fI/giphy.gif" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>daytona</category>
      <category>nextjs</category>
      <category>opensource</category>
      <category>productivity</category>
    </item>
    <item>
      <title>My Tech Journey - Web Dev | DSA | Open Source</title>
      <dc:creator>Akash Jana</dc:creator>
      <pubDate>Fri, 20 Dec 2024 08:37:16 +0000</pubDate>
      <link>https://dev.to/akashjana/my-tech-journey-web-dev-dsa-open-source-3483</link>
      <guid>https://dev.to/akashjana/my-tech-journey-web-dev-dsa-open-source-3483</guid>
      <description>&lt;p&gt;Let me take you on a rollercoaster🎢 ride through my tech journey – a tale of code💻, chaos😵, and occasional caffeine☕-induced enlightenment.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt;&lt;span class="gd"&gt;- Disclaimer :
&lt;/span&gt;&lt;span class="gi"&gt;+ These are my personal experiences and thoughts.
+ I’m always open to healthy criticism and constructive feedback.
+ Let’s keep it positive and productive!
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  💻 The Great Leap into Coding
&lt;/h3&gt;

&lt;p&gt;It all started in the second year of college. &lt;br&gt;
Picture this: a clueless sophomore staring at a screen full of cryptic text, wondering if C was just a letter or a secret language from the Matrix. Turns out, it’s both.&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%2Fmedia3.giphy.com%2Fmedia%2Fv1.Y2lkPTc5MGI3NjExbmlldXJtZWxmZWJndHYwZXBhbTVhcmM2dnh4YXM0YmxyNzRxbnN2bSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw%2FCuuSHzuc0O166MRfjt%2Fgiphy.webp" 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%2Fmedia3.giphy.com%2Fmedia%2Fv1.Y2lkPTc5MGI3NjExbmlldXJtZWxmZWJndHYwZXBhbTVhcmM2dnh4YXM0YmxyNzRxbnN2bSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw%2FCuuSHzuc0O166MRfjt%2Fgiphy.webp" width="480" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After struggling with C, I decided to explore other languages. Java? Check. Python? Check. A bit of C++ for flavor? Sure, why not? By the end of it, I felt like a polyglot of programming – or at least a jack of all trades, master of none. &lt;/p&gt;

&lt;p&gt;But hey, the  goal wasn’t mastery . It was about getting an overall view of coding, like a tourist hopping between countries without learning the local language. Mission accomplished! 🌎&lt;/p&gt;


&lt;h3&gt;
  
  
  🌐 Web Development: Love at First &amp;lt;&lt;em&gt;div&lt;/em&gt;&amp;gt;
&lt;/h3&gt;

&lt;p&gt;Web development was my next major exploration. It began with learning HTML and CSS, the foundational tools for creating websites. Following this, I ventured into JavaScript. However, I regret not dedicating sufficient time to thoroughly understand its concepts. Instead, I quickly transitioned to React faster than a coder Googling “How to center a div.”&lt;/p&gt;

&lt;p&gt;React became an immediate favorite as I delved deeper into it. I expanded my skills further by learning Node.js and Express, along with a basic understanding of MongoDB, eventually working towards becoming a so called &lt;q&gt;MERN Stack Developer&lt;/q&gt;. The real game-changer, however, was discovering &lt;strong&gt;Next.js&lt;/strong&gt;. This framework elevated my development experience and quickly became my preferred tool. Learnt Typescript &amp;amp; Tailwind.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;✨ Got my tech stack ready: ✨&lt;/strong&gt; &lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fskillicons.dev%2Ficons%3Fi%3Dhtml" width="48" height="48"&gt; &lt;/td&gt;
&lt;td&gt;
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fskillicons.dev%2Ficons%3Fi%3Dcss" width="48" height="48"&gt; &lt;/td&gt;
 &lt;td&gt; &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fskillicons.dev%2Ficons%3Fi%3Djs" width="48" height="48"&gt; &lt;/td&gt;
 &lt;td&gt; &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fskillicons.dev%2Ficons%3Fi%3Dts" width="48" height="48"&gt;
&lt;/td&gt;
 &lt;td&gt; &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fskillicons.dev%2Ficons%3Fi%3Dtailwind" width="48" height="48"&gt;
&lt;/td&gt;
 &lt;td&gt; &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fskillicons.dev%2Ficons%3Fi%3Dreact" width="48" height="48"&gt;
&lt;/td&gt;
  &lt;td&gt;
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fskillicons.dev%2Ficons%3Fi%3Dnext" width="48" height="48"&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Stuck on tutorial hell for number of times (But you don't need to... the &lt;u&gt;solution&lt;/u&gt; is given further in blog)&lt;/p&gt;

&lt;p&gt;With Next.js, I built projects, hosted them on GitHub, and shared them with the world. The world’s response? Cricket noises 🦗[Dead drop silence]. Well, except for my friends, who gave me some compliments. Thanks, guys. You’re the real MVPs. 🥇&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Maybe you want to check them out!&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://github.com/AkashJana18#pinned" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars.githubusercontent.com%2Fu%2F103350981%3Fv%3D4%3Fs%3D400" height="460" class="m-0" width="460"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://github.com/AkashJana18#pinned" rel="noopener noreferrer" class="c-link"&gt;
            AkashJana18 (Akash Jana) · GitHub
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            Always seems impossible until its done.
. AkashJana18 has 57 repositories available. Follow their code on GitHub.
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.githubassets.com%2Ffavicons%2Ffavicon.svg" width="32" height="32"&gt;
          github.com
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;






&lt;h3&gt;
  
  
  👿 DSA: The Necessary Evil
&lt;/h3&gt;

&lt;p&gt;Towards the end of my second year, I got the DSA &lt;del&gt;fever&lt;/del&gt; FOMO (that’s Data Structures and Algorithms, for the uninitiated). It’s the golden ticket to a tech job, they said. So, I plunged headfirst into the grind, solving over 500 questions across various platforms.&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%2Fmedia1.giphy.com%2Fmedia%2Fv1.Y2lkPTc5MGI3NjExYWx2NXVqbWdxaXBwbHhxaTJyMGVwYXY3Ynp0c3c4ZG91MG0xOWdsZCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw%2FRbDKaczqWovIugyJmW%2Fgiphy.gif" 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%2Fmedia1.giphy.com%2Fmedia%2Fv1.Y2lkPTc5MGI3NjExYWx2NXVqbWdxaXBwbHhxaTJyMGVwYXY3Ynp0c3c4ZG91MG0xOWdsZCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw%2FRbDKaczqWovIugyJmW%2Fgiphy.gif" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But let’s be real – DSA is &lt;del&gt;exhausting, tiresome, boring as hell&lt;/del&gt; demanding and rigorous. The reward? Zero, unless you’re at the very top. It’s like training for a marathon and realizing halfway through that there’s no finish line. I tried to stay consistent, but the monotony was soul-crushing. 😫&lt;/p&gt;

&lt;p&gt;But here's my Leetcode profile: &lt;br&gt;
&lt;a href="https://leetcode.com/u/akashjana18" rel="noopener noreferrer"&gt;&lt;br&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%2Fmziw623bq4h7yku0twru.png" alt="Akash Jana's Leetcode profile" width="800" height="398"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Pro tip :&lt;/strong&gt; &lt;br&gt;
DSA is great for your resume &amp;amp; job, but don’t let it kill your love for coding.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h3&gt;
  
  
  👑 Open Source: The Late Bloomer’s Redemption
&lt;/h3&gt;

&lt;p&gt;Fast forward to my final year, September 2024. I discovered open source, and it was a game-changer. Why didn’t I start earlier? Because I doubted myself. 😔&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%2Fmedia4.giphy.com%2Fmedia%2Fv1.Y2lkPTc5MGI3NjExbWV5MnpsbzNmNmlwZDd4NHdtd2M2d25rcWl4d3U4ZGxsY3ZobDZkbSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw%2F6yU5mAiUaJZFj8lpPn%2Fgiphy.webp" 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%2Fmedia4.giphy.com%2Fmedia%2Fv1.Y2lkPTc5MGI3NjExbWV5MnpsbzNmNmlwZDd4NHdtd2M2d25rcWl4d3U4ZGxsY3ZobDZkbSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw%2F6yU5mAiUaJZFj8lpPn%2Fgiphy.webp" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But once I got started, there was no looking back. Open source was everything I’d been missing: recognition, validation, help from a global community, and yes – actual cash. It is &lt;u&gt;solution to tutorial hell&lt;/u&gt; as you apply your knowledge in real. I won swags, built credibility, and finally felt like I was making a difference.&lt;/p&gt;

&lt;p&gt;The only regret? Not starting sooner. If you’re reading this and thinking about open source, &lt;em&gt;✔ just do it&lt;/em&gt;. The rewards are worth it. ✨&lt;/p&gt;
&lt;h3&gt;
  
  
  Some suggestions to get started: Quira
&lt;/h3&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%2Fmedia1.giphy.com%2Fmedia%2Fv1.Y2lkPTc5MGI3NjExdGZ6ZTE0OHM2ZWFyODdhY2p0dDM4Z21nam9tYXZ0cWV0bmsyZ2plZiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw%2FEoXmtN3Oi6IRFYZzDH%2Fgiphy.webp" 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%2Fmedia1.giphy.com%2Fmedia%2Fv1.Y2lkPTc5MGI3NjExdGZ6ZTE0OHM2ZWFyODdhY2p0dDM4Z21nam9tYXZ0cWV0bmsyZ2plZiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw%2FEoXmtN3Oi6IRFYZzDH%2Fgiphy.webp" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  &lt;em&gt;🪁 024: CoAgents v0.2 release&lt;/em&gt;
&lt;/h4&gt;

&lt;p&gt;CopilotKit is an open-source tool that makes it extremely easy to integrate AI copilots into your React apps. Imagine in-app context-aware chatbots, AI-enhanced text fields, or in-app AI agents that interact seamlessly with both your application and its users. Currently, CopilotKit is working on Co-Agents a new product that provides infrastructure for connecting LangGraph agents to humans in the loop.&lt;/p&gt;

&lt;p&gt;This December, CopilotKit is releasing CoAgents v0.2 which includes LangGraph Cloud Support, LangGraph JS, and improved documentation. The challenge is to work on a CoAgents demo to help the CopilotKit team stress-test CoAgents and helping them find bug fixes.&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%2Fd4w37q7p52c6tza9q8hr.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%2Fd4w37q7p52c6tza9q8hr.png" alt="CoAgent Reward" width="800" height="408"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="embed%20https://quira.sh/quests/creator/details?questId=24" class="crayons-btn crayons-btn--primary"&gt;🪁 CoAgent Quest ✨&lt;/a&gt;
&lt;/p&gt;

&lt;h4&gt;
  
  
  023: 𝐓𝐚𝐤𝐞 𝐃𝐚𝐲𝐭𝐨𝐧𝐚 𝐟𝐨𝐫 𝐚 𝐬𝐩𝐢𝐧
&lt;/h4&gt;

&lt;p&gt;Daytona is an open-source Development Environment Manager (DEM) licensed under the Apache License 2.0. Daytona allows you to manage and deploy Workspaces — reproducible development environments based on standard OCI containers, with built-in support for the Dev Container standard. &lt;/p&gt;

&lt;p&gt;Your mission, if you choose to accept it, is to create a sample project for Daytona using your preferred tech-stack. &lt;/p&gt;

&lt;p&gt;&lt;a href="embed%20https://quira.sh/quests/creator/details?questId=23" class="crayons-btn crayons-btn--primary"&gt;💻 Daytona Quest ✨&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;There are &lt;u&gt;100 prizes of &lt;strong&gt;$50&lt;/strong&gt;&lt;/u&gt; which will be awarded to the &lt;u&gt;first 100 valid submissions&lt;/u&gt;! And an extra &lt;strong&gt;$1000&lt;/strong&gt; prize pool to reward to exceptional samples!&lt;/p&gt;




&lt;h3&gt;
  
  
  🎐 Winding up
&lt;/h3&gt;

&lt;p&gt;My tech journey has been a mixed bag of mistakes, milestones, and moments of pure joy. If there’s one thing I’ve learned, it’s this: tech is as much about the journey as the destination. So, embrace the chaos, learn from your mistakes, and most importantly, have fun along the way. 🎮&lt;/p&gt;




&lt;p&gt;What’s your tech journey like? Share it in the comments below. Let’s swap stories and grow together. Happy coding! 🚀&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExc29ieGY4M2N2bWlnd2RrdnlhYXBtZHZ0dzVmOXJrMGI3NHc2cmxjMyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/WIH7vL4QgofvQbD8fI/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img width="480" src="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExc29ieGY4M2N2bWlnd2RrdnlhYXBtZHZ0dzVmOXJrMGI3NHc2cmxjMyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/WIH7vL4QgofvQbD8fI/giphy.gif" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>From Zero to Merge: Building a JSON Renaming Field Component in Go</title>
      <dc:creator>Akash Jana</dc:creator>
      <pubDate>Tue, 12 Nov 2024 19:00:51 +0000</pubDate>
      <link>https://dev.to/akashjana/from-zero-to-merge-building-a-json-renaming-field-component-in-go-17nh</link>
      <guid>https://dev.to/akashjana/from-zero-to-merge-building-a-json-renaming-field-component-in-go-17nh</guid>
      <description>&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%2Fs57oxe8dub4pgahza5uk.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%2Fs57oxe8dub4pgahza5uk.png" alt="Instill ai homepage" width="800" height="401"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Introduction to &lt;a href="https://www.instill.tech/" rel="noopener noreferrer"&gt;Instill-ai&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Working on Instill’s pipeline-backend project was like solving a jigsaw 🧩 puzzle—except some pieces kept changing names! My mission? To create a component that could rename JSON fields without creating conflicts. Join me as I share my journey through learning Go, studying Instill’s well-organized &lt;a href="https://www.instill.tech/docs/welcome" rel="noopener noreferrer"&gt;docs&lt;/a&gt;, and creating a solution that’s now merged and ready to roll! 🎉&lt;/p&gt;




&lt;h3&gt;
  
  
  The Challenge
&lt;/h3&gt;

&lt;p&gt;Instill needed a way to rename fields in JSON data structures dynamically. The twist? We had to handle cases where a renamed field might clash with an existing field. Without a conflict resolution system, chaos would reign supreme! &lt;/p&gt;

&lt;p&gt;&lt;em&gt;Checkout the Issue here:&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag_github-liquid-tag"&gt;
  &lt;h1&gt;
    &lt;a href="https://github.com/instill-ai/instill-core/issues/1133" rel="noopener noreferrer"&gt;
      &lt;img class="github-logo" alt="GitHub logo" src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg"&gt;
      &lt;span class="issue-title"&gt;
        [JSON] Support Rename Fields for JSON operator
      &lt;/span&gt;
      &lt;span class="issue-number"&gt;#1133&lt;/span&gt;
    &lt;/a&gt;
  &lt;/h1&gt;
  &lt;div class="github-thread"&gt;
    &lt;div class="timeline-comment-header"&gt;
      &lt;a href="https://github.com/ShihChun-H" rel="noopener noreferrer"&gt;
        &lt;img class="github-liquid-tag-img" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars.githubusercontent.com%2Fu%2F143982976%3Fv%3D4" alt="ShihChun-H avatar"&gt;
      &lt;/a&gt;
      &lt;div class="timeline-comment-header-text"&gt;
        &lt;strong&gt;
          &lt;a href="https://github.com/ShihChun-H" rel="noopener noreferrer"&gt;ShihChun-H&lt;/a&gt;
        &lt;/strong&gt; posted on &lt;a href="https://github.com/instill-ai/instill-core/issues/1133" rel="noopener noreferrer"&gt;&lt;time&gt;Oct 09, 2024&lt;/time&gt;&lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag-github-body"&gt;
      &lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Issue Description&lt;/h3&gt;
&lt;span class="octicon octicon-link"&gt;&lt;/span&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Current State&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It is very difficult to manipulate JSON data with JSON operator.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Proposed Change&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Please fetch this &lt;a href="https://github.com/instill-ai/pipeline-backend/blob/chunhao/ins-5831-edit-values/pkg/component/operator/json/v0/config/tasks.json#L304" rel="noopener noreferrer"&gt;JSON Schema &lt;/a&gt;to implement the functions.&lt;/li&gt;
&lt;li&gt;Manipulating JSON data&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;JSON schema pseudo code&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;JsonOperator:
  Task: Rename fields
  
  Input:
    data: 
      type: object
      description: Original data, which can be a JSON object or array of objects.
    fields: 
      type: array
      description: An array of objects specifying the fields to be renamed.
      items:
        type: object
        properties:
          currentField: 
            type: string
            description: The field name in the original data to be replaced, supports nested paths if "supportDotNotation" is true.
          newField: 
            type: string
            description: The new field name that will replace the currentField, supports nested paths if "supportDotNotation" is true.
#    supportDotNotation:
#      type: boolean
#      default: true
#      description: Determines whether to interpret field names as paths using dot notation. If false, fields are treated as literal keys.
    conflictResolution:
      type: string
      enum: [overwrite, skip, error]
      default: overwrite
      description: Defines how conflicts are handled when the newField already exists in the data.
  
  Output:
    data:
      type: object
      description: The modified data with the specified fields renamed.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Key Features:&lt;/strong&gt;
&lt;code&gt;conflictResolution&lt;/code&gt;: Handling conflicts when renaming fields in JSON, especially when working with nested objects and dot notation, is critical to avoid data loss or unexpected behavior. Allow users to specify how they want conflicts to be resolved (e.g., via a parameter such as &lt;code&gt;conflictResolution: 'overwrite'|'skip'|'error'&lt;/code&gt;),&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Provides flexibility and control to the user.&lt;/li&gt;
&lt;li&gt;Adapts to different use cases.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here are different strategies to manage conflicts and some considerations for each.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;&lt;strong&gt;1. Overwrite the Existing Field (Default Behavior)&lt;/strong&gt;&lt;/h3&gt;
&lt;span class="octicon octicon-link"&gt;&lt;/span&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt;: If the &lt;code&gt;newField&lt;/code&gt; already exists in the object, overwrite its value with the value from &lt;code&gt;currentField&lt;/code&gt;.
&lt;strong&gt;Pros&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Simple and straightforward.&lt;/li&gt;
&lt;li&gt;Useful when the intention is to replace the existing value.
&lt;strong&gt;Cons&lt;/strong&gt;:&lt;/li&gt;
&lt;li&gt;Can lead to data loss if not used carefully.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Implementation&lt;/strong&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;if new_key in obj:
    obj[new_key] = obj.pop(current_key)
else:
    obj[new_key] = obj.pop(current_key)
&lt;/code&gt;&lt;/pre&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;2. Skip the Renaming Operation&lt;/h3&gt;
&lt;span class="octicon octicon-link"&gt;&lt;/span&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt;: If the &lt;code&gt;newField&lt;/code&gt; already exists, skip the renaming operation for that particular field.
&lt;strong&gt;Pros&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Prevents accidental overwriting of data.&lt;/li&gt;
&lt;li&gt;Safeguards against potential conflicts without altering the existing data.
&lt;strong&gt;Cons&lt;/strong&gt;:&lt;/li&gt;
&lt;li&gt;The currentField remains unchanged, which might not be the desired outcome.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Implementation&lt;/strong&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;if new_key in obj:
    # Skip renaming if new_key already exists
    continue
else:
    obj[new_key] = obj.pop(current_key)
&lt;/code&gt;&lt;/pre&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;3. Merge Values&lt;/h3&gt;
&lt;span class="octicon octicon-link"&gt;&lt;/span&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt;: If both &lt;code&gt;currentField&lt;/code&gt; and &lt;code&gt;newField&lt;/code&gt; exist and contain objects or arrays, merge the two values. This approach is more complex but can be very powerful.
&lt;strong&gt;Pros&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Preserves both sets of data.&lt;/li&gt;
&lt;li&gt;Useful for combining information rather than choosing one over the other.
&lt;strong&gt;Cons&lt;/strong&gt;:&lt;/li&gt;
&lt;li&gt;Can be complex to implement, especially if the data types of &lt;code&gt;currentField&lt;/code&gt; and &lt;code&gt;newField&lt;/code&gt; differ.&lt;/li&gt;
&lt;li&gt;May require custom logic depending on how you want to merge the data (e.g., combining arrays, merging objects, etc.).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Implementation:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;if new_key in obj:
    if isinstance(obj[new_key], dict) and isinstance(obj[current_key], dict):
        # Merge dictionaries
        obj[new_key].update(obj.pop(current_key))
    elif isinstance(obj[new_key], list) and isinstance(obj[current_key], list):
        # Merge lists
        obj[new_key].extend(obj.pop(current_key))
    else:
        # Handle other types (overwrite, append, etc.)
        obj[new_key] = obj.pop(current_key)
else:
    obj[new_key] = obj.pop(current_key)

&lt;/code&gt;&lt;/pre&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;4. Rename with a Suffix or Prefix&lt;/h3&gt;
&lt;span class="octicon octicon-link"&gt;&lt;/span&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt;: If the &lt;code&gt;newField&lt;/code&gt; already exists, rename the new field by appending a suffix or prefix (e.g., &lt;code&gt;_1&lt;/code&gt;, &lt;code&gt;_conflict&lt;/code&gt;) to avoid conflicts.
&lt;strong&gt;Pros&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Both original and new data are preserved.&lt;/li&gt;
&lt;li&gt;Easy to track conflicts.
&lt;strong&gt;Cons&lt;/strong&gt;:&lt;/li&gt;
&lt;li&gt;The resulting data structure may become less predictable or harder to work with if many conflicts occur.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Implementation:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;suffix = 1
original_new_key = new_key
while new_key in obj:
    new_key = f"{original_new_key}_{suffix}"
    suffix += 1
obj[new_key] = obj.pop(current_key)
&lt;/code&gt;&lt;/pre&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;5. Return an Error or Warning&lt;/h3&gt;
&lt;span class="octicon octicon-link"&gt;&lt;/span&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt;: If a conflict is detected, stop the operation and return an error or warning to the user. This forces the user to address the conflict before proceeding.
&lt;strong&gt;Pros&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Prevents accidental data overwriting.&lt;/li&gt;
&lt;li&gt;Makes the user aware of potential issues immediately.
&lt;strong&gt;Cons&lt;/strong&gt;:&lt;/li&gt;
&lt;li&gt;Halts the process, which might be undesirable in automated workflows.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Implementation&lt;/strong&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;if new_key in obj:
    raise ValueError(f"Conflict detected: '{new_key}' already exists.")
else:
    obj[new_key] = obj.pop(current_key)
&lt;/code&gt;&lt;/pre&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;
&lt;strong&gt;Summary&lt;/strong&gt;:&lt;/h3&gt;
&lt;span class="octicon octicon-link"&gt;&lt;/span&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Overwrite&lt;/strong&gt;: Simple and effective, but can lead to data loss.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Skip&lt;/strong&gt;: Safe but may leave data unchanged.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Error/Warning&lt;/strong&gt;: Forces user intervention; best for critical operations.
Choose the strategy that best aligns with your application's needs and the user's expectations. Implementing a combination of these strategies, such as providing a default behavior with options for customization, can offer the best balance between usability and robustness.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Example Usage:&lt;/h3&gt;
&lt;span class="octicon octicon-link"&gt;&lt;/span&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Scenario: Input data as JSON object&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;// input
{
"data": {
"name": "John Doe",
"age": 30,
"address": {
"street": "123 Main St",
"city": "Anytown",
"state": "CA"
},
"state": "conflict"
},
"fields": [
{"currentField": "address.street", "newField": "address.road"},
{"currentField": "state", "newField": "address.state"}
],
//  "supportDotNotation": true,
"conflictResolution": "overwrite"
}&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Conflict Resolution Scenarios:&lt;/strong&gt;
&lt;strong&gt;1. Overwrite (Default):&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The state field in data would be moved to address.state, overwriting the existing address.state field.&lt;/li&gt;
&lt;li&gt;Final output:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;{
  "data": {
    "name": "John Doe",
    "age": 30,
    "address": {
      "road": "123 Main St",
      "city": "Anytown",
      "state": "conflict"
    }
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;2. Skip:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The renaming of state to address.state would be skipped, so both state and address.state remain unchanged.&lt;/li&gt;
&lt;li&gt;Final output:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;{
  "data": {
    "name": "John Doe",
    "age": 30,
    "address": {
      "road": "123 Main St",
      "city": "Anytown",
      "state": "CA"
    },
    "state": "conflict"
  }
}

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;3. Error:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The process would raise an error, stopping execution, because &lt;code&gt;address.state&lt;/code&gt; already exists.
&lt;code&gt;ValueError: Conflict detected: 'address.state' already exists. &lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Scenario: Input Data as an Array of Objects&lt;/h3&gt;
&lt;span class="octicon octicon-link"&gt;&lt;/span&gt;
&lt;/div&gt;
&lt;p&gt;If the input data is an array of objects, the logic needs to be adapted to handle each object in the array individually. The schema and the function would process each object within the array according to the specified fields and &lt;code&gt;conflictResolution&lt;/code&gt; rules.&lt;/p&gt;
&lt;p&gt;Below is an example demonstrating how the "Rename Fields" operation would work with input data that is an array of objects.&lt;/p&gt;
&lt;p&gt;Input&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
  "data": [
    {
      "name": "John Doe",
      "age": 30,
      "address": {
        "street": "123 Main St",
        "city": "Anytown",
        "state": "CA"
      },
      "contacts": [
        {
          "type": "email",
          "value": "john.doe@example.com"
        }
      ]
    },
    {
      "name": "Jane Smith",
      "age": 28,
      "address": {
        "street": "456 Oak St",
        "city": "Othertown",
        "state": "NY"
      }
      // Note: Jane Smith does not have a "contacts" field
    }
  ],
  "fields": [
    {"currentField": "name", "newField": "fullName"},
    {"currentField": "address.street", "newField": "address.road"},
    {"currentField": "contacts.0.value", "newField": "contacts.0.contactInfo"},
    {"currentField": "age", "newField": "yearsOld"}
  ],
//  "supportDotNotation": true,
  "conflictResolution": "skip"
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Explanation&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Field "name": The "name" field will be renamed to "fullName" for each object in the array.&lt;/li&gt;
&lt;li&gt;Field "address.street": The "street" field inside the "address" object will be renamed to "road" for each object.&lt;/li&gt;
&lt;li&gt;Field "contacts.0.value": The "value" field inside the first element of the "contacts" array will be renamed to "contactInfo" for the first object, but this step will be skipped for the second object because the "contacts" field does not exist.&lt;/li&gt;
&lt;li&gt;Field "age": The "age" field will be renamed to "yearsOld" for each object.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Output:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
  "data": [
    {
      "fullName": "John Doe",
      "yearsOld": 30,
      "address": {
        "road": "123 Main St",
        "city": "Anytown",
        "state": "CA"
      },
      "contacts": [
        {
          "type": "email",
          "contactInfo": "john.doe@example.com"
        }
      ]
    },
    {
      "fullName": "Jane Smith",
      "yearsOld": 28,
      "address": {
        "road": "456 Oak St",
        "city": "Othertown",
        "state": "NY"
      }
      // The "contacts" field is not present, so no renaming occurs for "contacts.0.value"
    }
  ]
}
&lt;/code&gt;&lt;/pre&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Rules for the Component Hackathon&lt;/h3&gt;
&lt;span class="octicon octicon-link"&gt;&lt;/span&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Each issue will only be assigned to one person/team at a time.&lt;/li&gt;
&lt;li&gt;You can only work on one issue at a time.&lt;/li&gt;
&lt;li&gt;To express interest in an issue, please comment on it and tag &lt;a class="mentioned-user" href="https://dev.to/kuroxx"&gt;@kuroxx&lt;/a&gt;, allowing the Instill AI team to assign it to you.&lt;/li&gt;
&lt;li&gt;Ensure you address all feedback and suggestions provided by the Instill AI team.&lt;/li&gt;
&lt;li&gt;If no commits are made within five days, the issue may be reassigned to another contributor.&lt;/li&gt;
&lt;li&gt;Join our Discord to engage in discussions and seek assistance in #hackathon channel. For technical queries, you can tag @chuang8511.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/instill-ai/pipeline-backend/blob/8f870f06b30c631c1c84556fdb95368cf32c7d00/.github/CONTRIBUTING.md" rel="noopener noreferrer"&gt;Component Contribution Guideline&lt;/a&gt; | &lt;a href="https://www.instill.tech/docs/component/operator/json" rel="nofollow noopener noreferrer"&gt;Documentation&lt;/a&gt; | &lt;a href="https://go.dev/tour/welcome/1" rel="nofollow noopener noreferrer"&gt;Official Go Tutorial
&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

    &lt;/div&gt;
    &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/instill-ai/instill-core/issues/1133" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;First time in my life, saw such a detailed issue ☠️ which is a good thing but quite overwhelming!&lt;/p&gt;

&lt;p&gt;As I got into the issue, I realized that this wasn’t just a simple renaming task. It was like trying to change a tire while the car is still driving! 🚗💨 But the challenge was exactly what I needed to level up my coding skills.&lt;/p&gt;




&lt;h3&gt;
  
  
  Step 1️⃣: Learning Go and Exploring Instill’s Codebase
&lt;/h3&gt;

&lt;p&gt;Since I was absolutely new to Go, I spent the first four days studying both the language and Instill’s codebase (huge shoutout to their amazing documentation 📚). Whether it’s the architecture, contribution guidelines, README documentation, or anything else, everything is very well defined 📝.&lt;br&gt;
Moderators Anni and ChunHao were a huge help—Anni provided moral support 😃, while ChunHao patiently provided the technical 💻guidance I needed. &lt;/p&gt;

&lt;p&gt;I was like, "Go what now?" But after a few days, Go went from "&lt;del&gt;Golly, Oh no!&lt;/del&gt;" to "&lt;em&gt;Great Opportunity&lt;/em&gt;" 💡. Their docs made it easy to dive into the Instill pipeline, and ChunHao’s clear instructions on the JSON schema were a huge help. &lt;/p&gt;

&lt;p&gt;&lt;em&gt;A Glimpse of Instill pipeline-backend:&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/instill-ai" rel="noopener noreferrer"&gt;
        instill-ai
      &lt;/a&gt; / &lt;a href="https://github.com/instill-ai/pipeline-backend" rel="noopener noreferrer"&gt;
        pipeline-backend
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      ⇋ A REST/gRPC server for Instill VDP API service
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;pipeline-backend&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="https://github.com/instill-ai/pipeline-backend/actions/workflows/integration-test.yml" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/instill-ai/pipeline-backend/actions/workflows/integration-test.yml/badge.svg" alt="Integration Test"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;pipeline-backend&lt;/code&gt; manages all pipeline resources within &lt;a href="https://github.com/instill-ai/instill-core" rel="noopener noreferrer"&gt;Instill Core&lt;/a&gt; to streamline data from the
start component, through AI/Data/Application components and to the end
component.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Concepts&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Pipeline&lt;/h3&gt;
&lt;/div&gt;
&lt;p&gt;In &lt;strong&gt;Instill Core&lt;/strong&gt;, a pipeline is a DAG (Directed Acyclic Graph) consisting
of multiple &lt;strong&gt;components&lt;/strong&gt;.&lt;/p&gt;

  &lt;div class="js-render-enrichment-target"&gt;
    &lt;div class="render-plaintext-hidden"&gt;
      &lt;pre&gt;flowchart LR
s[Trigger] --&amp;gt; c1[OpenAI Component]
c1 --&amp;gt; c2[Stability AI Component]
c1 --&amp;gt; c3[MySQL Component]
c1 --&amp;gt; e[Response]
c2 --&amp;gt; e
&lt;/pre&gt;
    &lt;/div&gt;
  &lt;/div&gt;
  &lt;span class="js-render-enrichment-loader d-flex flex-justify-center flex-items-center width-full"&gt;
    &lt;span&gt;
  
    
    
    &lt;span class="sr-only"&gt;Loading&lt;/span&gt;
&lt;/span&gt;
  &lt;/span&gt;


&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Component&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;A &lt;strong&gt;Component&lt;/strong&gt; serves as an essential building block within a &lt;strong&gt;Pipeline&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;See &lt;a href="https://github.com/instill-ai/pipeline-backend/./pkg/component/README.md" rel="noopener noreferrer"&gt;the &lt;code&gt;component&lt;/code&gt; package documentation&lt;/a&gt; for more
details.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Recipe&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;A &lt;strong&gt;pipeline recipe&lt;/strong&gt; specifies how components are configured and how they are
interconnected.&lt;/p&gt;
&lt;p&gt;Recipes are defined in YAML language:&lt;/p&gt;
&lt;div class="highlight highlight-source-yaml notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-ent"&gt;variable&lt;/span&gt;
  &lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; pipeline input fields&lt;/span&gt;
&lt;span class="pl-ent"&gt;output&lt;/span&gt;:
  &lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; pipeline output fields&lt;/span&gt;
&lt;span class="pl-ent"&gt;component&lt;/span&gt;:
  &lt;span class="pl-ent"&gt;&amp;lt;component-id&amp;gt;&lt;/span&gt;:
    &lt;span class="pl-ent"&gt;type&lt;/span&gt;: &lt;span class="pl-s"&gt;&amp;lt;component-definition-id&amp;gt;&lt;/span&gt;
    &lt;span class="pl-ent"&gt;task&lt;/span&gt;: &lt;span class="pl-s"&gt;&amp;lt;task-id&amp;gt;&lt;/span&gt;
    &lt;span class="pl-ent"&gt;input&lt;/span&gt;:
      &lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; values for the input fields&lt;/span&gt;
    &lt;span class="pl-ent"&gt;condition&lt;/span&gt;: &lt;span class="pl-s"&gt;&amp;lt;condition&amp;gt; &lt;/span&gt;&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; conditional statement to execute or bypass the component&lt;/span&gt;
    &lt;span class="pl-ent"&gt;setup&lt;/span&gt;: &lt;/pre&gt;…
&lt;/div&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/instill-ai/pipeline-backend" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;&lt;em&gt;To be honest, I was starting to doubt if I could solve this issue, but then Anni dropped the perfect message that kept me going.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj9wtcfja310zs3jzgr37.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%2Fj9wtcfja310zs3jzgr37.png" alt="Screenshot of chat with Anni where she provided Moral support" width="800" height="749"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once I got comfortable, ChunHao, who had crafted a &lt;a href="https://github.com/instill-ai/pipeline-backend/blob/chunhao/ins-5831-edit-values/pkg/component/operator/json/v0/config/tasks.json#L304" rel="noopener noreferrer"&gt;JSON schema&lt;/a&gt; for this task, gave me the green light🚦 to start coding. And so, the journey began!&lt;/p&gt;




&lt;h3&gt;
  
  
  Step 2️⃣: Designing the Solution
&lt;/h3&gt;

&lt;p&gt;The key requirements were:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Dynamic Renaming&lt;/strong&gt;: Fields should be renamed without disturbing the JSON structure.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Conflict Detection&lt;/strong&gt;: We needed to spot any conflicts between the original and renamed fields.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Conflict Resolution&lt;/strong&gt;: A smooth solution, like appending a suffix, would prevent name clashes.&lt;/li&gt;
&lt;/ol&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%2Fusw40mrex7qggcloxtjd.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%2Fusw40mrex7qggcloxtjd.png" alt="System Design" width="714" height="1404"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Step 3️⃣: Building the Component
&lt;/h3&gt;

&lt;p&gt;Armed with coffee☕ and courage💪, I got down to coding. Here’s a sneak peek at the core logic:&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;em&gt;Mapping Fields&lt;/em&gt;
&lt;/h4&gt;

&lt;p&gt;First, I created a mapping system to track old and new field names. This was key to detecting conflicts.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;mapFields&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fields&lt;/span&gt; &lt;span class="k"&gt;map&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;map&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;newFieldMap&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nb"&gt;make&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;map&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;oldName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;newName&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="k"&gt;range&lt;/span&gt; &lt;span class="n"&gt;fields&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c"&gt;// Check for conflict&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;exists&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;newFieldMap&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;newName&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt; &lt;span class="n"&gt;exists&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;newName&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="s"&gt;"_conflict"&lt;/span&gt; &lt;span class="c"&gt;// Add suffix for conflicts&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="n"&gt;newFieldMap&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;oldName&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;newName&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;newFieldMap&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Any time a conflict was detected, the function added &lt;code&gt;"_conflict"&lt;/code&gt; to the new name. It’s a simple trick that ensures our JSON fields stay unique and, most importantly, friendly to each other! ✌️&lt;/p&gt;
&lt;h4&gt;
  
  
  &lt;em&gt;Renaming Fields&lt;/em&gt;
&lt;/h4&gt;

&lt;p&gt;Once the field mappings were in place, the next step was applying them to our JSON data.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;renameFields&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="k"&gt;map&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="k"&gt;interface&lt;/span&gt;&lt;span class="p"&gt;{},&lt;/span&gt; &lt;span class="n"&gt;fieldMap&lt;/span&gt; &lt;span class="k"&gt;map&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;map&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="k"&gt;interface&lt;/span&gt;&lt;span class="p"&gt;{}&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;renamedData&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nb"&gt;make&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;map&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="k"&gt;interface&lt;/span&gt;&lt;span class="p"&gt;{})&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="k"&gt;range&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;newKey&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;fieldMap&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="n"&gt;renamedData&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;newKey&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;renamedData&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Here’s the logic that applies the mapped names to our JSON data. The result? Our data’s neatly renamed, conflicts resolved, and structure intact. 🔥&lt;/p&gt;

&lt;p&gt;&lt;em&gt;After creating the component dropped the draft PR &amp;amp; got a comment:&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyuxunpauy68oyeg8znev.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%2Fyuxunpauy68oyeg8znev.png" alt="Comment from Chunhao that I haven't added the test code" width="800" height="217"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h3&gt;
  
  
  Step 4️⃣: Testing and Refinement
&lt;/h3&gt;

&lt;p&gt;After familiarizing myself with Instill's testing methods and learning how to create effective test cases, I proceeded further. &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%2F4u7lef1kg1e1qeekq143.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%2F4u7lef1kg1e1qeekq143.png" alt="screenshot of commits created" width="800" height="167"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Testing time! 🧪 I wrote tests covering everything from simple renames to complex edge cases with nested JSON fields. Each round of testing led to further refinements.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"ok - rename fields with overwrite conflict resolution"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="c"&gt;// Test where renaming conflicts are resolved by overwriting the existing field.&lt;/span&gt;
    &lt;span class="c"&gt;// Expected outcome: "newField" holds "value1", overwriting any previous value.&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt;

&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"ok - rename fields with skip conflict resolution"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="c"&gt;// Test where conflicts are resolved by skipping the rename if the target field already exists.&lt;/span&gt;
    &lt;span class="c"&gt;// Expected outcome: "newField" remains "value2" without overwrite.&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt;

&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"nok - rename fields with error conflict resolution"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="c"&gt;// Test with "error" strategy, which should raise an error on conflict.&lt;/span&gt;
    &lt;span class="c"&gt;// Expected outcome: Error message "Field conflict."&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt;

&lt;span class="c"&gt;// Additional cases for missing required fields and invalid conflict resolution strategy&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Here’s where I’d love to share a &lt;strong&gt;&lt;em&gt;personal reflection&lt;/em&gt;&lt;/strong&gt;: Testing was the hardest part of this project 😮‍💨. There were times when I thought, "Is this test even doing what it’s supposed to?" &lt;/p&gt;

&lt;p&gt;Just then, I ran into a &lt;em&gt;lint issue&lt;/em&gt;—&lt;/p&gt;

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

&lt;p&gt;He pointed out the problem and even provided the solution. All I had to do was implement it, but it was a reminder that even the smallest details matter in making the code work smoothly.&lt;/p&gt;

&lt;p&gt;Once I got past those initial hurdles, testing became my safety net. It gave me the confidence to know that my code would work across different scenarios 🕵️‍♂️. It also showed me that testing isn’t just a step to check off—it’s a way to ensure my code is reliable and resilient.&lt;/p&gt;


&lt;h3&gt;
  
  
  Step 5️⃣: CI Check and Final Adjustments
&lt;/h3&gt;

&lt;p&gt;After completing my tests, I pushed my code, ready for the review process. However, our CI (Continuous Integration) checks didn’t pass. &lt;/p&gt;

&lt;p&gt;&lt;em&gt;Anni’s comment gave me a gentle reminder to double-check my test cases:&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“Hey @AkashJana18, could you check your test cases? Our CI check shows it has not passed here. Please test it locally first before pushing it to the PR. Whenever you push your commit, we’ll trigger the checks so you can spot any issues before our engineers review your code. Thanks!”&lt;/em&gt;  &lt;/p&gt;
&lt;/blockquote&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%2Frm545vptvuiadhq6bntd.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%2Frm545vptvuiadhq6bntd.png" alt="CI failed test" width="800" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That’s when I realized I had to run the tests locally before submitting. &lt;/p&gt;

&lt;p&gt;&lt;em&gt;ChunHao also added:&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Please run and pass it before you request the review. Run &lt;code&gt;$ go test ./pkg/component/operator/json/v0/...&lt;/code&gt; to check it locally."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I quickly ran the tests locally, identified the issues, and fixed them. &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%2Fb3xuid4crdscrhrtuzvy.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%2Fb3xuid4crdscrhrtuzvy.png" alt="Commit image" width="800" height="68"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;em&gt;A little moment of celebration 🥳&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This process made me appreciate the importance of local testing even more, as it ensured everything was solid before submitting for review.&lt;/p&gt;

&lt;p&gt;Before merging, ChunHao did a final review, made a few tweaks, QAed Test Recipe and updated the documentation to reflect the new changes. &lt;u&gt;Big thanks to Anni&lt;/u&gt; for her &lt;u&gt;ongoing support&lt;/u&gt; throughout the process—it made a huge difference. 🙌&lt;/p&gt;


&lt;h3&gt;
  
  
  👥 Reflection on the Collaborative Process 🫱🏼‍🫲🏼
&lt;/h3&gt;

&lt;p&gt;One of the biggest lessons I learned was how &lt;u&gt;collaboration and mentorship can make or break a project&lt;/u&gt;. Instill's moderators, Anni and ChunHao, provided me with the guidance I needed when I was lost in Go syntax or struggling with the right approach. Working together, we turned a complex problem into a clean, functional solution.&lt;/p&gt;

&lt;p&gt;I’ll be honest, there were moments I felt like I had bitten off more than I could chew. But the constant encouragement from Anni, combined with the clear direction from ChunHao, kept me on track.&lt;/p&gt;


&lt;h3&gt;
  
  
  ⏭️ Next Steps and Future Improvements
&lt;/h3&gt;

&lt;p&gt;Another step could be expanding this approach to other parts of the pipeline that require dynamic field name handling—because who doesn’t love a little bit of automation⚙️? &lt;/p&gt;


&lt;h3&gt;
  
  
  🛠️ Tools &amp;amp; Resources 🪛
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://go.dev/doc/" rel="noopener noreferrer"&gt;Go Documentation&lt;/a&gt;&lt;/strong&gt;: For diving into Go syntax and understanding core concepts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.instill.tech/docs/welcome" rel="noopener noreferrer"&gt;Instill Docs&lt;/a&gt;&lt;/strong&gt;: A goldmine of well-organized resources to understand the Instill pipeline.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://pkg.go.dev/testing" rel="noopener noreferrer"&gt;Go Testing Framework&lt;/a&gt;&lt;/strong&gt;: The built-in &lt;code&gt;testing&lt;/code&gt; package in Go for writing unit tests, ensuring everything works as expected, and integrating with CI tools.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://golangci-lint.run/" rel="noopener noreferrer"&gt;Golangci-lint&lt;/a&gt;&lt;/strong&gt;: A Go linters aggregator to identify issues and enforce code quality during development and CI checks.&lt;/li&gt;
&lt;/ol&gt;


&lt;h3&gt;
  
  
  🧑🏻‍💻🗒️ My Learning
&lt;/h3&gt;

&lt;p&gt;With Instill’s rock-solid documentation, guidance from ChunHao, and Anni's moral support, this project became a fantastic learning experience. I went from knowing nothing about Go to implementing a fully functional feature ready for production (and I have the merged PR to prove it 😉).&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Proof:&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag_github-liquid-tag"&gt;
  &lt;h1&gt;
    &lt;a href="https://github.com/instill-ai/pipeline-backend/pull/813" rel="noopener noreferrer"&gt;
      &lt;img class="github-logo" alt="GitHub logo" src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg"&gt;
      &lt;span class="issue-title"&gt;
        feat(json): Support Rename Fields for JSON operator
      &lt;/span&gt;
      &lt;span class="issue-number"&gt;#813&lt;/span&gt;
    &lt;/a&gt;
  &lt;/h1&gt;
  &lt;div class="github-thread"&gt;
    &lt;div class="timeline-comment-header"&gt;
      &lt;a href="https://github.com/AkashJana18" rel="noopener noreferrer"&gt;
        &lt;img class="github-liquid-tag-img" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars.githubusercontent.com%2Fu%2F103350981%3Fv%3D4" alt="AkashJana18 avatar"&gt;
      &lt;/a&gt;
      &lt;div class="timeline-comment-header-text"&gt;
        &lt;strong&gt;
          &lt;a href="https://github.com/AkashJana18" rel="noopener noreferrer"&gt;AkashJana18&lt;/a&gt;
        &lt;/strong&gt; posted on &lt;a href="https://github.com/instill-ai/pipeline-backend/pull/813" rel="noopener noreferrer"&gt;&lt;time&gt;Nov 05, 2024&lt;/time&gt;&lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag-github-body"&gt;
      &lt;p&gt;Because&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;we want to manipulate JSON data&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This commit&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;provide the function to rename the json key with different strategies.&lt;/li&gt;
&lt;/ul&gt;

    &lt;/div&gt;
    &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/instill-ai/pipeline-backend/pull/813" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;Whether you're tackling JSON renaming, learning Go, or just love a good coding puzzle, I hope this blog sheds light on the process of solving conflicts, one field at a time. 🌈&lt;/p&gt;




&lt;h3&gt;
  
  
  📓✍🏻 Your Learning
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;1️⃣ How to Approach New Challenges&lt;/strong&gt;: &lt;em&gt;Whether it’s a new language or a complex feature, learn how to break down problems and solve them step by step, just like I did with this project.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2️⃣ The Power of Documentation&lt;/strong&gt;: &lt;em&gt;Discover how clear, organized documentation (like Instill’s) can be a game changer when working on complex projects.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3️⃣ Persistence and Moral Support&lt;/strong&gt;: &lt;em&gt;Understand the importance of perseverance and the value of support from your peers when tackling challenging tasks.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4️⃣ How to implement conflict resolution strategies&lt;/strong&gt;: &lt;em&gt;Learn how to handle various scenarios like overwrite, skip, and error conflict resolutions while renaming JSON fields.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;a href="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExc29ieGY4M2N2bWlnd2RrdnlhYXBtZHZ0dzVmOXJrMGI3NHc2cmxjMyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/WIH7vL4QgofvQbD8fI/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img width="480" src="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExc29ieGY4M2N2bWlnd2RrdnlhYXBtZHZ0dzVmOXJrMGI3NHc2cmxjMyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/WIH7vL4QgofvQbD8fI/giphy.gif" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>go</category>
      <category>github</category>
      <category>automation</category>
      <category>showdev</category>
    </item>
    <item>
      <title>🌱 My 1st Hacktoberfest Experience: A Journey of Code, Challenges, and Community</title>
      <dc:creator>Akash Jana</dc:creator>
      <pubDate>Mon, 28 Oct 2024 19:58:34 +0000</pubDate>
      <link>https://dev.to/akashjana/my-hacktoberfest-experience-a-journey-of-code-challenges-and-community-1b9p</link>
      <guid>https://dev.to/akashjana/my-hacktoberfest-experience-a-journey-of-code-challenges-and-community-1b9p</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest"&gt;2024 Hacktoberfest Writing Challenge&lt;/a&gt;: Contributor Experience&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;Hello, world! 🌍 Hacktoberfest has been an absolute blast! Imagine a whole month dedicated to coding, learning, and sharing ideas with the open-source community. If you haven’t heard, Hacktoberfest is an annual event where developers from all over come together to contribute to open-source projects, brush up on skills, and maybe win some cool swag (aka stickers, tees 👕, and hoodies)! 🎁 Here’s a recap of my journey this year, sprinkled with some of the quirks, challenges, and triumphs along the way. 🚀👨‍💻&lt;/p&gt;

&lt;h2&gt;
  
  
  🚀 Why I Joined Hacktoberfest / Devfest.ai / oss.gg
&lt;/h2&gt;

&lt;p&gt;It is more than just an event; it’s a way to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Sharpen my skills&lt;/strong&gt; on real projects. 🛠️&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Engage with the open-source community&lt;/strong&gt; and learn from seasoned developers. 🤝&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Make meaningful contributions&lt;/strong&gt; to projects that matter in the dev world. 🌐✨&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  💡 Picking My Targets (or “Repos”)
&lt;/h3&gt;

&lt;p&gt;Deciding on projects took some thoughtful browsing, meme-worthy decision-making 🤔😂, and a good bit of scrolling through GitHub issues. Here’s how I finally narrowed it down:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Match Interests&lt;/strong&gt;: I love JavaScript, React, and frontend design, so I hunted for issues aligned with these interests. 💻&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Look for “&lt;code&gt;good first issues&lt;/code&gt;”&lt;/strong&gt;: These are designed to be beginner-friendly, helping me ease into the projects. 👍&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Contribution Guidelines&lt;/strong&gt;: This saved me from going down the rabbit hole. Knowing each project’s rules kept things smooth and straightforward (mostly!). 😅&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  💻 The PRs That Made the Cut 🎯
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/gitroomhq/postiz-app/pull/286" rel="noopener noreferrer"&gt;Postiz&lt;/a&gt;&lt;/strong&gt; - My PR for Postiz fixed a frontend bug. A must-have, if you ask me, because who doesn’t want to level up their social game? 📅💪&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/CopilotKit/CopilotKit/pull/726" rel="noopener noreferrer"&gt;CopilotKit&lt;/a&gt;&lt;/strong&gt; - Contributing to CopilotKit was pure joy 🎉. Not only did I add to the magic of task automation here, but it was also the most fun project of all! (Spoiler alert: CopilotMate was born from these efforts! Click on &lt;strong&gt;&lt;a href="https://dev.to/akashjana/how-i-integrated-copilotkit-ai-into-copilotmate-23gm"&gt;CopilotMate&lt;/a&gt;&lt;/strong&gt; to know more about it). 🤖🚀&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/arc53/DocsGPT/pull/1288" rel="noopener noreferrer"&gt;DocsGPT 1&lt;/a&gt;&lt;/strong&gt; - My first PR to DocsGPT aimed at enhancing UI tabs (because even docs need a little TLC sometimes!). 📑✨&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/arc53/DocsGPT/pull/1300" rel="noopener noreferrer"&gt;DocsGPT 2&lt;/a&gt;&lt;/strong&gt; - My second PR further fine-tuned the UX for tables as per design! 📈🔧&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/CopilotKit/CopilotKit/pull/728" rel="noopener noreferrer"&gt;CopilotKit Again&lt;/a&gt;&lt;/strong&gt; - Another CopilotKit contribution. Let’s just say CopilotKit and I became BFFs this Hacktoberfest! 😊 Looking forward to contributing even more in the future! 🎉&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  🎉 DevFest.AI Triumph: 7th Place out of 1626
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://devfest.ai/leaderboard" rel="noopener noreferrer"&gt;DevFest.AI&lt;/a&gt; added an extra thrill by diving into AI-specific open-source contributions. Our team secured an impressive &lt;strong&gt;7th place&lt;/strong&gt;, adding a fun, competitive edge to our contributions. Working alongside, we tackled unique challenges and picked up some advanced skills in the process. The experience not only boosted our coding journey but also strengthened our teamwork and strategy. Here’s to more ranks and rewards next year! 🏆🤖&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%2Fn4bz57s39es58ithxdnq.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%2Fn4bz57s39es58ithxdnq.png" alt="Devfestai" width="800" height="92"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;h2&gt;
  
  
  Quira : October Mega Quest and Hacktoberfest with MindsDB
&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%2Fnbeaj8653ul4l1t1u9ni.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%2Fnbeaj8653ul4l1t1u9ni.png" alt=" " width="800" height="199"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://quira.sh/quests/creator" rel="noopener noreferrer"&gt;Quira&lt;/a&gt; made it more fun and challenging. Pushing my boundaries to learn more and earn more...&lt;br&gt;
With MindsDB tried out many different things for the 1st time the end results are :&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Built JS sdk for mindsDB&lt;/li&gt;
&lt;li&gt;Manual tested some integration for mindsDB
Looking forward to do more as well &lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  🎉 OSS.GG Side Quests: Memes, GIFs, Billboards, and Secret Quests 🤫
&lt;/h2&gt;

&lt;p&gt;Hacktoberfest wasn’t just about code this year; OSS.GG took things to a whole new level with epic side quests. From &lt;strong&gt;making memes&lt;/strong&gt; that capture dev life (yep, we all need to laugh at those late-night coding sessions! 😴) to crafting GIFs and even designing a &lt;strong&gt;billboard&lt;/strong&gt; 🛣️, these side quests added a whole new layer of fun. Completing them felt like leveling up my creativity 🎨, and, honestly, they were a great mental break from the code grind. 😎 Here are a few things I created (Trust me, it was way too fun 🧨):&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%2Fk7je86c08omrihijzpls.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%2Fk7je86c08omrihijzpls.png" alt="billboard" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

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

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

&lt;h3&gt;
  
  
  Update : Ranked &lt;strong&gt;&lt;em&gt;23 out of 4723&lt;/em&gt;&lt;/strong&gt; in oss.gg
&lt;/h3&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%2F6pz0gnia2uqcgpizktnl.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%2F6pz0gnia2uqcgpizktnl.png" alt="ossgg rank" width="800" height="163"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🛠️ Hurdles, Debugging, and That Sweet Moment of “It Works!” 🥳
&lt;/h2&gt;

&lt;p&gt;It wasn’t all smooth sailing. 🌊 From understanding codebases to testing (and re-testing), every contribution came with its own learning curve 📈↗️:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;💻 Complex Codebases&lt;/strong&gt;: Jumping into established projects can feel like trying to read a novel from the middle 📖. But with patience and some serious documentation deep-dives, I managed to get into the groove. 💪&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🐛 Unexpected Bugs&lt;/strong&gt;: A memorable one is the time-zone issue in Taipy due to Plotly (Issue still unresolved. Want to give it a try? &lt;a href="https://github.com/Avaiga/taipy/issues/554" rel="noopener noreferrer"&gt;Click here&lt;/a&gt;). Who knew time zones could be so… temperamental? 🕒&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🗿 Persistence&lt;/strong&gt;: Some PRs took a few reviews before they were merged, but every bit of feedback helped refine my skills. 💡 Each push, pull, and merge was a step forward, and the “approved” messages made it all worth it! 🙌&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  👥 Community Vibes 🎶
&lt;/h2&gt;

&lt;p&gt;Hacktoberfest wouldn’t be the same without the community. 💜 From GitHub discussions to Discord threads and online meetups, I got to interact with amazing developers, maintainers, and contributors. Working on issues and joining project forums introduced me to brilliant devs from all over the world 🌎 — plus, it made the experience way more fun than solo coding. 😄&lt;/p&gt;

&lt;h2&gt;
  
  
  🎉 The Ultimate Lessons from Hacktoberfest 2024 📚
&lt;/h2&gt;

&lt;p&gt;This year’s Hacktoberfest experience taught me a lot, and here are the big takeaways:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Open-source isn’t just about code&lt;/strong&gt;: It’s about contributing, reviewing, and helping make code accessible and maintainable for everyone. 👥🌍 Each contribution is like a piece of a larger puzzle that the whole community builds together!&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Feedback is crucial&lt;/strong&gt;: Every code review 🔍 opened my eyes to new ways of optimizing code, thinking creatively🌈, and approaching problems from different angles. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Persistence pays off&lt;/strong&gt;: Four PRs may sound simple, but making meaningful contributions takes time, patience, and commitment. 🕰️💪 Hacktoberfest reinforced that the path to growth lies in sticking with it, even when it feels challenging.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  🛠️ The CopilotMate Moment 🚀🤖
&lt;/h2&gt;

&lt;p&gt;Of all the projects, CopilotKit was hands-down the most fun! Working on it while creating &lt;strong&gt;CopilotMate&lt;/strong&gt; felt like a mini passion project inside Hacktoberfest. Imagine an AI assistant that helps track tasks, manage calendars, and quiz you on random facts (because why not? 😆). CopilotMate  has become my unofficial Hacktoberfest sidekick, and it’s just the beginning of what I hope will be a super useful AI assistant! 🎉&lt;br&gt;
Do give a 🌟to &lt;a href="https://github.com/AkashJana18/copilotmate" rel="noopener noreferrer"&gt;CopilotMate&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🎁 Wrapping Up 🎁
&lt;/h2&gt;

&lt;p&gt;Hacktoberfest 2024 has been incredible. 🌈 From each PR to the inspiring community, it’s made me a better developer and given me a stronger sense of the open-source spirit. If you’ve been thinking about joining Hacktoberfest, or even just contributing to open-source, I say go for it! 🚀 You’ll learn, grow, and probably laugh at yourself a few times along the way. 😅&lt;/p&gt;

&lt;p&gt;Here’s to many more pull requests, open-source collaborations, and maybe an endless supply of stickers! Happy coding! 🧑‍💻🌟&lt;/p&gt;

&lt;p&gt;🎆 &lt;strong&gt;Don't forget to share or comment your Hacktoberfest experience below! Let’s keep the open-source spirit alive!&lt;/strong&gt; 🎆&lt;/p&gt;

</description>
      <category>hacktoberfest</category>
      <category>opensource</category>
      <category>devchallenge</category>
    </item>
    <item>
      <title>Bye-bye Passwords: Embracing Secure, Hassle-Free Passkeys</title>
      <dc:creator>Akash Jana</dc:creator>
      <pubDate>Sun, 27 Oct 2024 16:32:09 +0000</pubDate>
      <link>https://dev.to/akashjana/bye-bye-passwords-embracing-secure-hassle-free-passkeys-20c3</link>
      <guid>https://dev.to/akashjana/bye-bye-passwords-embracing-secure-hassle-free-passkeys-20c3</guid>
      <description>&lt;h4&gt;
  
  
  &lt;strong&gt;Introduction&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Say goodbye to forgotten passwords, endless reset emails, and risky sticky notes on monitors! 🤦‍♂️ Today, we’re diving into the world of &lt;em&gt;passkeys&lt;/em&gt;—a passwordless, user-friendly, and highly secure way to log in, making stolen credentials a thing of the past. 💫&lt;/p&gt;

&lt;p&gt;With Hanko's flexible configurations, setting up passkeys is easier than ever. Let's explore how passkeys work, dive into Conditional UI, and see how to let users securely delete their passwords. Plus, we’ll look at how passkeys can either replace or enhance traditional multi-factor authentication (MFA).&lt;/p&gt;




&lt;h4&gt;
  
  
  &lt;strong&gt;1. Why Passkeys? The Good, the Bad, and the Secure 🔑&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Advantages of Passkeys:&lt;/strong&gt;  &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;🚫 &lt;strong&gt;No More Passwords&lt;/strong&gt;: Say goodbye to “Password123!” Passkeys let users authenticate securely without a password.&lt;/li&gt;
&lt;li&gt;🛡️ &lt;strong&gt;High-Level Security&lt;/strong&gt;: Passkeys are phishing-resistant since there’s no password to steal. They’re device-based, stored locally and securely.&lt;/li&gt;
&lt;li&gt;🏎️ &lt;strong&gt;Smooth User Experience&lt;/strong&gt;: One-tap access offers a frictionless experience.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;How to Implement Passkey Authentication with Hanko&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here’s a simple flow using Hanko’s SDK to implement passkey login:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;   &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;generatePasskey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;verifyPasskey&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;hanko-sdk&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

   &lt;span class="c1"&gt;// Step 1: Generate a passkey during user registration&lt;/span&gt;
   &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;registerUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;username&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;passkey&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;generatePasskey&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;username&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;passkey&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Send this to the client for storage&lt;/span&gt;
   &lt;span class="p"&gt;}&lt;/span&gt;

   &lt;span class="c1"&gt;// Step 2: Authenticate using the passkey&lt;/span&gt;
   &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;loginWithPasskey&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;username&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;passkey&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;verifyPasskey&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;username&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;passkey&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
         &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Authentication successful! 🎉&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
         &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Authentication failed! 🚫&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
   &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Disadvantages (Because Nothing’s Perfect 🤷‍♂️):&lt;/strong&gt;  &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;📲 &lt;strong&gt;Device Dependency&lt;/strong&gt;: Passkeys are tied to devices, so if a device is unavailable, the user may be unable to log in. Hanko recommends offering backup options.&lt;/li&gt;
&lt;li&gt;🌐 &lt;strong&gt;Cross-Platform Compatibility&lt;/strong&gt;: Although evolving, passkey support is still expanding.&lt;/li&gt;
&lt;/ol&gt;




&lt;h4&gt;
  
  
  &lt;strong&gt;2. Passkey Autofill: Conditional UI to the Rescue 🦸‍♂️&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;What’s Conditional UI?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
   Conditional UI is a UX design pattern that presents different login options depending on device compatibility. If the user’s device supports passkeys, they’ll be presented with this option automatically, creating a seamless experience.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to Implement Passkey Autofill (Conditional UI)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here’s an example of a conditional UI setup for passkeys:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;   &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;showLoginOptions&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;PublicKeyCredential&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="c1"&gt;// Passkey-supported device&lt;/span&gt;
         &lt;span class="nf"&gt;displayOption&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;passkey&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
         &lt;span class="nf"&gt;displayOption&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;password&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
   &lt;span class="p"&gt;}&lt;/span&gt;

   &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;displayOption&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;option&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;option&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;passkey&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
         &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Displaying passkey login 🔑&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
         &lt;span class="c1"&gt;// Display passkey-based login UI&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
         &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Displaying password login 🔒&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
         &lt;span class="c1"&gt;// Display traditional password-based login UI&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
   &lt;span class="p"&gt;}&lt;/span&gt;

   &lt;span class="c1"&gt;// Call the function when the login screen loads&lt;/span&gt;
   &lt;span class="nf"&gt;showLoginOptions&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why Developers and Users Love It&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
   Users get a fast, secure login flow tailored to their device, and developers don’t have to maintain multiple login flows manually.&lt;/p&gt;


&lt;h4&gt;
  
  
  &lt;strong&gt;3. Making Passwords Optional: Handle with Care 🧤&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Why Allow Users to Delete Passwords?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
   Letting users delete their passwords adds convenience and security. Passkeys offer secure, one-tap access, but there are some key considerations before ditching passwords.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best Practices for Deleted Passwords:&lt;/strong&gt;  &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Confirm Passkey Setup&lt;/strong&gt; 🧐: Verify a passkey is set up before allowing password deletion.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Recovery Options&lt;/strong&gt; 🆘: Provide backup options for account recovery.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Example Workflow for Password Deletion&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;   &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;deletePassword&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;hasPasskey&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;checkPasskey&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;hasPasskey&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
         &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Cannot delete password without a passkey. Please set up a passkey first.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;

      &lt;span class="c1"&gt;// Proceed to delete the password if a passkey is set up&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;removePassword&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;success&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
         &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Password deleted successfully! 👋&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
         &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Failed to delete password. 😕&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
   &lt;span class="p"&gt;}&lt;/span&gt;

   &lt;span class="c1"&gt;// Helper functions&lt;/span&gt;
   &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;checkPasskey&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="c1"&gt;// Check if a passkey exists for the user&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;hankoClient&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;checkPasskey&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
   &lt;span class="p"&gt;}&lt;/span&gt;

   &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;removePassword&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="c1"&gt;// Remove password from user's account&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;hankoClient&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;deletePassword&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
   &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Designing a User-Friendly Deletion Flow&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
   Use a clear interface to explain the implications of deleting passwords and encourage users to set up a passkey first.&lt;/p&gt;


&lt;h4&gt;
  
  
  &lt;strong&gt;4. Passkeys as Password Replacements vs. MFA: Who Wins? ⚔️&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Passkeys as MFA? Absolutely!&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
   Passkeys can enhance MFA, offering an easy, secure way to verify identity beyond just a password. Here’s how Hanko supports this setup:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Setting Up Passkeys as MFA with Hanko&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;   &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;setupMFA&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;mfaOption&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;hankoClient&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createMFA&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
         &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;passkey&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;});&lt;/span&gt;

      &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;mfaOption&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;success&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
         &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;MFA with passkey set up! 🛡️&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
         &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Failed to set up MFA. 🤔&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
   &lt;span class="p"&gt;}&lt;/span&gt;

   &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;authenticateWithMFA&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;passkey&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;isAuthenticated&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;hankoClient&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;verifyMFA&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;passkey&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;isAuthenticated&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
         &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;MFA login successful! 🎉&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
         &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;MFA login failed! 🚫&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
   &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With Hanko, you can configure passkeys as an additional layer of security or a primary replacement. The versatility of passkeys makes them a strong contender for both roles.&lt;/p&gt;




&lt;h4&gt;
  
  
  &lt;strong&gt;Conclusion&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Passkeys represent a shift to a more secure, frictionless login experience. With Hanko’s tools, implementing passkeys is straightforward, making password-free logins accessible to users and developers alike. Ready to get started? Hanko is here to help you leave forgotten passwords in the past! 👋💫&lt;/p&gt;

&lt;h4&gt;
  
  
  🚀 Want to know more? Feel free to check out &lt;a href="https://docs.hanko.io/introduction" rel="noopener noreferrer"&gt;hanko docs&lt;/a&gt;
&lt;/h4&gt;

</description>
      <category>hacktoberfest</category>
      <category>hanko</category>
      <category>opensource</category>
      <category>webdev</category>
    </item>
    <item>
      <title>How I Built CopilotMate with Copilotkit ai🚀🤖✨</title>
      <dc:creator>Akash Jana</dc:creator>
      <pubDate>Mon, 07 Oct 2024 16:01:07 +0000</pubDate>
      <link>https://dev.to/akashjana/how-i-integrated-copilotkit-ai-into-copilotmate-23gm</link>
      <guid>https://dev.to/akashjana/how-i-integrated-copilotkit-ai-into-copilotmate-23gm</guid>
      <description>&lt;p&gt;Hey there, fellow tech enthusiasts! Today, I’m super excited to share my journey of integrating &lt;strong&gt;CopilotKit AI&lt;/strong&gt; into my personal assistant project, &lt;strong&gt;CopilotMate&lt;/strong&gt;. This integration has taken my project to a whole new level of awesomeness, transforming it into a dynamic tool for task management, study assistance, and so much more! Let’s dive into the magic of this journey together! 🌟&lt;/p&gt;




&lt;h3&gt;
  
  
  🛠️ Tech Stack Overview
&lt;/h3&gt;

&lt;p&gt;Before we jump into the nitty-gritty, let’s quickly check out the tech stack that powers &lt;strong&gt;CopilotMate&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;🌐 &lt;strong&gt;Next.js&lt;/strong&gt; for seamless frontend development, allowing for lightning-fast builds and dynamic routing. ⚡&lt;br&gt;&lt;br&gt;
🎨 &lt;strong&gt;React&lt;/strong&gt; combined with &lt;strong&gt;Tailwind CSS&lt;/strong&gt; to create a beautiful, responsive UI that users love and framer motion for animations.&lt;br&gt;&lt;br&gt;
🤓 &lt;strong&gt;CopilotKit&lt;/strong&gt; for AI-driven features with its amazing SDKs that make everything possible.&lt;br&gt;&lt;br&gt;
🦙 &lt;strong&gt;GROQ&lt;/strong&gt; and &lt;strong&gt;Langchain&lt;/strong&gt; for handling queries and leveraging powerful LLMs (like the fabulous Llama models).  &lt;/p&gt;




&lt;h3&gt;
  
  
  📦 Why CopilotKit?
&lt;/h3&gt;

&lt;p&gt;You might be wondering why I chose &lt;strong&gt;CopilotKit&lt;/strong&gt;. Here are my top three reasons:&lt;/p&gt;

&lt;p&gt;💡 &lt;strong&gt;Modularity:&lt;/strong&gt; Its clean modular design allowed me to pick and choose features without cluttering my project. Less mess, more finesse!&lt;br&gt;&lt;br&gt;
🎯 &lt;strong&gt;Built for Generative AI:&lt;/strong&gt; CopilotKit comes with tools specifically designed for projects involving coagents, which aligns perfectly with my vision for &lt;strong&gt;CopilotMate&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
🎛️ &lt;strong&gt;Customization:&lt;/strong&gt; The rich SDK made it a breeze to create custom coagents tailored to specific tasks, like managing to-do lists and assisting with studies.  &lt;/p&gt;




&lt;h3&gt;
  
  
  🧠 Step 1: Setting Up the CopilotKit Core
&lt;/h3&gt;

&lt;p&gt;The first step in this exciting adventure was to set up the &lt;strong&gt;CopilotKit&lt;/strong&gt; core in my project. I installed the necessary packages, setting the stage for the magical AI interactions to come. It was like planting the seeds for a blooming garden of AI capabilities! 🌼🌱&lt;/p&gt;




&lt;h3&gt;
  
  
  🧑‍💻 Step 2: Creating Custom Coagents
&lt;/h3&gt;

&lt;p&gt;I knew I wanted &lt;strong&gt;CopilotMate&lt;/strong&gt; to feel personal and responsive. So, I crafted custom &lt;strong&gt;coagents&lt;/strong&gt;—my virtual assistants with unique personalities and tasks. Check out these cool coagents I created:&lt;/p&gt;

&lt;p&gt;🎉 &lt;strong&gt;To-Do Assistant:&lt;/strong&gt; Your friendly task manager! It helps users  categorize (todo/completed), and manage tasks like a pro.  &lt;/p&gt;

&lt;p&gt;📚✨ &lt;strong&gt;StudyBuddy:&lt;/strong&gt; This coagent is a total study wizard! It breaks down complex concepts, generates summaries, and answers questions to help users ace their studies.  &lt;/p&gt;

&lt;p&gt;💰💡 &lt;strong&gt;Expense Tracker:&lt;/strong&gt; A budgeting guru! This coagent categorizes expenses and offers helpful budgeting tips to keep finances in check.  &lt;/p&gt;

&lt;p&gt;Each coagent is powered by &lt;strong&gt;CopilotKit&lt;/strong&gt; but can be customized to fit user needs perfectly. How cool is that? 😎&lt;/p&gt;




&lt;h3&gt;
  
  
  🛠️ Step 3: Building the Frontend Components
&lt;/h3&gt;

&lt;p&gt;With the coagents in place, it was time to create intuitive user interfaces where users could interact with them. Using &lt;strong&gt;Next.js&lt;/strong&gt; for routing, I built individual pages for each feature, ensuring that the design was cohesive and super user-friendly. 🎈&lt;/p&gt;




&lt;h3&gt;
  
  
  🤯 Step 4: Handling Queries with GROQ
&lt;/h3&gt;

&lt;p&gt;To make &lt;strong&gt;CopilotMate&lt;/strong&gt; smarter, I integrated &lt;strong&gt;GROQ&lt;/strong&gt; for intelligent interactions. This allowed me to craft queries that provided context for each coagent, ensuring they could generate accurate and personalized responses. It’s like giving my coagents a brain boost! 🧠💥&lt;/p&gt;




&lt;h3&gt;
  
  
  🔄 Step 5: Making CopilotMate User-Friendly
&lt;/h3&gt;

&lt;p&gt;One of my main goals was to create an intuitive experience for users. I embraced &lt;strong&gt;Tailwind CSS&lt;/strong&gt; to design a sleek dark theme with a trendy &lt;strong&gt;glass effect&lt;/strong&gt; UI, adding a touch of elegance to every interaction. 🌌✨ Plus, I implemented &lt;strong&gt;loading states&lt;/strong&gt; to enhance user experience while waiting for those AI-generated responses. Patience is key! ⏳&lt;/p&gt;




&lt;h3&gt;
  
  
  🚀 The Results
&lt;/h3&gt;

&lt;p&gt;With &lt;strong&gt;CopilotKit&lt;/strong&gt; integrated, &lt;strong&gt;CopilotMate&lt;/strong&gt; has transformed into an AI-powered personal assistant that can tackle a wide array of tasks, from managing to-do lists to providing study assistance and tracking expenses. 🎊 The AI agents make the experience interactive and dynamic, allowing users to enjoy automation while keeping control of their tasks. It’s like having a personal assistant in your pocket! 📲💪&lt;/p&gt;




&lt;h3&gt;
  
  
  💡 Takeaways
&lt;/h3&gt;

&lt;p&gt;Integrating &lt;strong&gt;CopilotKit&lt;/strong&gt; wasn’t just about adding AI—it was about making &lt;strong&gt;CopilotMate&lt;/strong&gt; more intelligent, responsive, and user-friendly. By leveraging &lt;strong&gt;CopilotKit&lt;/strong&gt;, I could focus on building features that matter while letting the AI handle the complexity. A true win-win! 🥳&lt;/p&gt;




&lt;p&gt;So, that’s how &lt;strong&gt;CopilotKit&lt;/strong&gt; supercharged &lt;strong&gt;CopilotMate&lt;/strong&gt;! If you’re embarking on your own AI-powered projects, I highly recommend giving &lt;strong&gt;CopilotKit&lt;/strong&gt; a try. It’s flexible, powerful, and a total blast to work with! 🎉&lt;/p&gt;

&lt;p&gt;Got questions or want to share your own experiences? Drop a comment or connect with me on social media! I’d love to hear from you! 😊💬&lt;/p&gt;




&lt;ul&gt;
&lt;li&gt;Do checkout the Github repo and give a star: &lt;a href="https://github.com/AkashJana18/copilotmate" rel="noopener noreferrer"&gt;https://github.com/AkashJana18/copilotmate&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Another blog: &lt;a href="https://dev.to/akashjana/future-of-productivity-meet-copilotmate-3k7i"&gt;DEV&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Youtube Demo : &lt;a href="https://www.youtube.com/watch?v=qPVRPUH8ewU&amp;amp;t=7s&amp;amp;ab_channel=Akash" rel="noopener noreferrer"&gt;Link&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Thanks for joining me on this journey! Until next time, keep innovating and creating! 🚀✨&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>llm</category>
      <category>ai</category>
    </item>
    <item>
      <title>Future of Productivity: Meet CopilotMate! 🚀</title>
      <dc:creator>Akash Jana</dc:creator>
      <pubDate>Sun, 06 Oct 2024 11:22:53 +0000</pubDate>
      <link>https://dev.to/akashjana/future-of-productivity-meet-copilotmate-3k7i</link>
      <guid>https://dev.to/akashjana/future-of-productivity-meet-copilotmate-3k7i</guid>
      <description>&lt;p&gt;Hello, fellow tech enthusiasts and productivity lovers! Today, I’m excited to introduce you to my latest brainchild: CopilotMate! 🤖✨&lt;/p&gt;

&lt;h2&gt;
  
  
  🛠️ How Did CopilotMate Come to Life?
&lt;/h2&gt;

&lt;p&gt;Picture this: it’s a busy Monday morning, and my to-do list looks like a novel! 📜 I had so many tasks that even my coffee needed a coffee! ☕ I thought to myself, "There must be a better way to tackle this madness."&lt;/p&gt;

&lt;p&gt;So, I put on my thinking cap (a.k.a. my coding hat 🧢) and decided to build CopilotMate, a personal assistant designed to help me manage my daily grind like a pro! But hey, it’s not just for me—everyone deserves a little extra help, right?&lt;/p&gt;

&lt;h2&gt;
  
  
  🎯 Why CopilotMate?
&lt;/h2&gt;

&lt;p&gt;The idea behind CopilotMate is simple: to make your life easier. Whether you’re juggling tasks, planning a project, or trying to keep your social life intact (yes, we all have friends…somewhere), CopilotMate is here to help you stay organized without losing your mind! 😅&lt;/p&gt;

&lt;h2&gt;
  
  
  💡 The Inspiration
&lt;/h2&gt;

&lt;p&gt;While building this tool, I was inspired by various productivity apps but noticed they often lacked a personal touch. So, I thought, "Why not create an assistant that’s not just smart, but also a little quirky?" 🤪&lt;/p&gt;

&lt;h2&gt;
  
  
  🚀 Features That Will Make You Say “WOW!”
&lt;/h2&gt;

&lt;p&gt;Let’s dive into some of the coolest features CopilotMate has to offer:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;To-Do Assistant ✅&lt;br&gt;
Tired of writing the same tasks over and over? CopilotMate’s To-Do Assistant lets you create, edit, and manage tasks effortlessly. And yes, it will remind you to take breaks…because we all need them! 🧘‍♂️&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Expense Tracker 💰&lt;br&gt;
Want to know where your money went? Our Expense Tracker features a dark theme with a glass effect UI that makes tracking expenses as fun as scrolling through memes! Just don’t forget to stop after 3 hours! 😂&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Calendar Integration 📅(work in progress)&lt;br&gt;
Keep your schedule in check! CopilotMate syncs with your calendar, ensuring you never miss an important meeting. Just think of it as your digital secretary—minus the coffee runs! ☕️&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Chatbot Feature 💬&lt;br&gt;
Have questions? CopilotMate’s chatbot feature is like having a mini-you in your pocket! Ask it anything, and it’ll respond faster than you can say “artificial intelligence”! 🤖&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Study Tools 📚&lt;br&gt;
Studying can be tough, but CopilotMate makes it easier with tools designed for note-taking, quizzes, and more. It’s like having a study buddy who actually knows stuff (and doesn’t eat your snacks)! 🍕&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  🎥 Check Out the Demo! &lt;a href="https://www.youtube.com/watch?v=qPVRPUH8ewU" rel="noopener noreferrer"&gt;Link&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;I’ve made a demo video to showcase all the amazing features of CopilotMate. Watch it here on YouTube! Don’t forget to like and subscribe for more updates! 📹✨&lt;/p&gt;

&lt;h2&gt;
  
  
  🗳️ Vote for CopilotMate on Quira!
&lt;/h2&gt;

&lt;p&gt;If you love what you see and want to support CopilotMate, please take a moment to vote for us on Quira! Every vote counts and helps us reach more people who could benefit from this awesome tool! &lt;a href="https://quira.sh/repo/AkashJana18-copilotmate-863038853" rel="noopener noreferrer"&gt;Click here to vote&lt;/a&gt;! 🙌&lt;/p&gt;

&lt;h2&gt;
  
  
  😂 A Dash of Humor
&lt;/h2&gt;

&lt;p&gt;Let’s be real: we all have those days when productivity feels like an uphill battle. 🏔️ So, why not tackle it with a smile? Here’s a little humor for you:&lt;/p&gt;

&lt;p&gt;Why did the computer go to therapy? Because it had too many tabs open! 🖥️&lt;/p&gt;

&lt;p&gt;Why did the task break up with the procrastinator? Because it just couldn’t handle the waiting game! 🎮&lt;/p&gt;

&lt;h2&gt;
  
  
  🎉 Join the &lt;a href="https://github.com/AkashJana18/copilotmate" rel="noopener noreferrer"&gt;CopilotMate Community&lt;/a&gt;!
&lt;/h2&gt;

&lt;p&gt;I’m thrilled to share CopilotMate with all of you! It’s open-source, so feel free to contribute or check out the code. Let’s make productivity fun together! 🎈&lt;/p&gt;

&lt;p&gt;If you’d like to try it out, head over to the GitHub repository and get started! And don’t forget to let me know your thoughts—I promise I won’t bite! (Unless you have snacks… then all bets are off!) 😜&lt;/p&gt;

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

&lt;p&gt;So there you have it: CopilotMate is here to revolutionize the way you tackle your tasks and stay organized. Remember, productivity doesn’t have to be boring—let’s make it a little more entertaining! 🎊&lt;/p&gt;

&lt;p&gt;Until next time, keep smiling and coding! Happy organizing! 🎈&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>nextjs</category>
    </item>
  </channel>
</rss>
