<?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: Mohit Nagaraj</title>
    <description>The latest articles on DEV Community by Mohit Nagaraj (@mohit_nagaraj).</description>
    <link>https://dev.to/mohit_nagaraj</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%2F2202883%2F7d771643-b1cc-48bf-adbb-4920151645f2.jpg</url>
      <title>DEV Community: Mohit Nagaraj</title>
      <link>https://dev.to/mohit_nagaraj</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mohit_nagaraj"/>
    <language>en</language>
    <item>
      <title>I Built an Open-Source Visual Kubernetes Orchestration Platform — No YAML Required</title>
      <dc:creator>Mohit Nagaraj</dc:creator>
      <pubDate>Wed, 08 Apr 2026 02:49:08 +0000</pubDate>
      <link>https://dev.to/mohit_nagaraj/i-built-an-open-source-visual-kubernetes-orchestration-platform-no-yaml-required-26hm</link>
      <guid>https://dev.to/mohit_nagaraj/i-built-an-open-source-visual-kubernetes-orchestration-platform-no-yaml-required-26hm</guid>
      <description>&lt;p&gt;If you've ever stared at a 400-line Kubernetes YAML file at 2am trying to figure out why your service can't reach its database, this post is for you.&lt;/p&gt;

&lt;p&gt;I'm a founding engineer, I kept running into the same problem: &lt;strong&gt;Kubernetes is incredibly powerful, but it's also brutally complex to get right.&lt;/strong&gt; The learning curve is steep, the feedback loop is slow, and one wrong indent breaks everything.&lt;/p&gt;

&lt;p&gt;So I built &lt;a href="https://kubeorch.dev" rel="noopener noreferrer"&gt;KubeOrch&lt;/a&gt; — an open-source visual orchestration platform that lets you design, connect, and deploy Kubernetes workloads through a drag-and-drop interface. No YAML. No guessing. Just draw your architecture and hit deploy.&lt;/p&gt;

&lt;p&gt;Here's what I built, how it works under the hood, and why I open-sourced the whole thing.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem With Kubernetes Today
&lt;/h2&gt;

&lt;p&gt;Kubernetes has won the container orchestration wars. It's the de facto standard. But the developer experience hasn't caught up with its adoption.&lt;/p&gt;

&lt;p&gt;Consider what it takes to deploy a simple web app with a PostgreSQL database and a Redis cache on Kubernetes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A Deployment manifest for your app&lt;/li&gt;
&lt;li&gt;A Service to expose it&lt;/li&gt;
&lt;li&gt;A Deployment + PersistentVolumeClaim for Postgres&lt;/li&gt;
&lt;li&gt;A Service for Postgres&lt;/li&gt;
&lt;li&gt;A Secret for credentials&lt;/li&gt;
&lt;li&gt;A Deployment for Redis&lt;/li&gt;
&lt;li&gt;A Service for Redis&lt;/li&gt;
&lt;li&gt;A ConfigMap for environment variables&lt;/li&gt;
&lt;li&gt;An Ingress with TLS config&lt;/li&gt;
&lt;li&gt;NetworkPolicies if you care about security&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's 9+ YAML files, hundreds of lines, and dozens of ways to silently misconfigure something. And this is the &lt;em&gt;simple&lt;/em&gt; case.&lt;/p&gt;

&lt;p&gt;The tools that exist today — Helm, Kustomize, Lens — either abstract the YAML (but you still write it) or visualize existing clusters (but you still write it first). No one has tackled the core issue: &lt;strong&gt;the mental model of a distributed system is visual, but the tooling forces you to express it as text.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What KubeOrch Does
&lt;/h2&gt;

&lt;p&gt;KubeOrch flips the workflow. Instead of writing manifests and hoping they wire up correctly, you:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Drag&lt;/strong&gt; services onto a canvas (Postgres, Redis, Kafka, your app — 150+ components)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Connect&lt;/strong&gt; them by drawing lines between ports&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deploy&lt;/strong&gt; — KubeOrch generates the manifests, resolves dependencies, and applies them to your cluster&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The platform has four main components:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. KubeOrch Core (Go)
&lt;/h3&gt;

&lt;p&gt;The brains of the operation. A Go API server built on Gin that handles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;JSON-to-YAML transformation&lt;/strong&gt; — your visual design is stored as a JSON graph internally; Core converts it to production-ready Kubernetes manifests at deploy time&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automatic connection resolution&lt;/strong&gt; — when you draw a line from your app to Postgres, Core figures out the right &lt;code&gt;DATABASE_URL&lt;/code&gt; env var, the right service DNS name, the right port — without you specifying any of it&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nixpacks integration&lt;/strong&gt; — point Core at a GitHub repo and it builds a container automatically, no Dockerfile needed&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Service mesh support&lt;/strong&gt; — Istio, ingress controllers, and load balancers are first-class citizens&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real-time streaming&lt;/strong&gt; — WebSocket-based log and metrics streaming from all running containers
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;// Example: Core's auto-wiring picks up connection intent and resolves it&lt;/span&gt;
&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;Connection&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;SourceService&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="s"&gt;`json:"source"`&lt;/span&gt;
    &lt;span class="n"&gt;TargetService&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="s"&gt;`json:"target"`&lt;/span&gt;
    &lt;span class="n"&gt;SourcePort&lt;/span&gt;    &lt;span class="kt"&gt;int&lt;/span&gt;    &lt;span class="s"&gt;`json:"sourcePort"`&lt;/span&gt;
    &lt;span class="n"&gt;TargetPort&lt;/span&gt;    &lt;span class="kt"&gt;int&lt;/span&gt;    &lt;span class="s"&gt;`json:"targetPort"`&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="c"&gt;// Core resolves this into env vars, DNS entries, and NetworkPolicies automatically&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. KubeOrch UI (Next.js + TypeScript)
&lt;/h3&gt;

&lt;p&gt;The visual canvas, built with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;React Flow&lt;/strong&gt; for the drag-and-drop workflow designer&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Next.js 15&lt;/strong&gt; with TypeScript&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;shadcn/ui&lt;/strong&gt; + Tailwind CSS v4 for the component library&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zustand&lt;/strong&gt; for state management&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WebSocket&lt;/strong&gt; for real-time log streaming&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The UI is intentionally opinionated. Services snap together intelligently — when you try to connect a Node.js app to PostgreSQL, the UI already knows what that connection means and pre-fills the configuration.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. OrchCLI (Go)
&lt;/h3&gt;

&lt;p&gt;A CLI that handles the local dev loop:&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="c"&gt;# Initialize a KubeOrch project&lt;/span&gt;
orchcli init

&lt;span class="c"&gt;# Start all services (supports hot reload)&lt;/span&gt;
orchcli start

&lt;span class="c"&gt;# Fork and contribute to core or UI&lt;/span&gt;
orchcli init &lt;span class="nt"&gt;--fork-core&lt;/span&gt;
orchcli init &lt;span class="nt"&gt;--fork-ui&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It supports concurrent operations with file locking to prevent config corruption, auto-detects your dev mode based on which repos you've cloned, and handles hot reload across all services.&lt;/p&gt;

&lt;p&gt;Install it in one line:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-sfL&lt;/span&gt; https://raw.githubusercontent.com/KubeOrch/cli/main/install.sh | sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or via npm:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; @kubeorch/cli
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Docs (Astro)
&lt;/h3&gt;

&lt;p&gt;Full documentation site covering architecture, getting started, CLI reference, and API reference — built with Astro for fast static generation.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Architecture Decision I'm Most Proud Of
&lt;/h2&gt;

&lt;p&gt;The hardest problem in building KubeOrch wasn't the UI or even the Kubernetes API integration — it was &lt;strong&gt;automatic service wiring&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;When two services are connected in the visual canvas, the platform needs to figure out:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What environment variable should carry the connection string?&lt;/li&gt;
&lt;li&gt;What DNS name should the dependent service use?&lt;/li&gt;
&lt;li&gt;What port should be exposed?&lt;/li&gt;
&lt;li&gt;Does this connection need a NetworkPolicy?&lt;/li&gt;
&lt;li&gt;Does it need a Secret, or is the connection string safe to put in a ConfigMap?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The naive solution is to ask the user. But that defeats the whole point.&lt;/p&gt;

&lt;p&gt;The solution I landed on is a &lt;strong&gt;service template system with typed ports.&lt;/strong&gt; Every component in the library (Postgres, Redis, Kafka, etc.) is defined with its ports annotated with type metadata:&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;"postgresql"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"ports"&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;"port"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;5432&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"postgres"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"envVarTemplate"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"{{TARGET_NAME}}_DATABASE_URL"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"valueTemplate"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"postgresql://{{USER}}:{{PASSWORD}}@{{SERVICE_DNS}}:5432/{{DB_NAME}}"&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When you draw a connection, Core matches port types, renders the templates with resolved values, and injects the result as environment variables into the dependent service — with a Secret for anything sensitive.&lt;/p&gt;

&lt;p&gt;150+ services are defined this way, covering databases, queues, ML platforms, monitoring stacks, and more.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Open Source?
&lt;/h2&gt;

&lt;p&gt;I could have built this as a SaaS. I thought about it.&lt;/p&gt;

&lt;p&gt;But Kubernetes tooling lives and dies by community trust. Operators don't want their cluster credentials going through a third-party API. They want to run the control plane themselves, audit the code, and contribute fixes.&lt;/p&gt;

&lt;p&gt;More importantly — the problems KubeOrch solves are universal. Every team fighting with YAML is fighting the same fight. An open-source project that solves this well becomes infrastructure for the entire ecosystem.&lt;/p&gt;

&lt;p&gt;KubeOrch is &lt;strong&gt;Apache 2.0 licensed&lt;/strong&gt; and structured as a CNCF-aspiring project with full governance documentation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Contributor ladder (from contributor → member → maintainer)&lt;/li&gt;
&lt;li&gt;Governance policy&lt;/li&gt;
&lt;li&gt;API stability policy&lt;/li&gt;
&lt;li&gt;RFC/proposal process in the community repo&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal is to eventually donate this to the CNCF sandbox. The groundwork is already laid.&lt;/p&gt;




&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Try it locally
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install the CLI&lt;/span&gt;
curl &lt;span class="nt"&gt;-sfL&lt;/span&gt; https://raw.githubusercontent.com/KubeOrch/cli/main/install.sh | sh

&lt;span class="c"&gt;# Initialize a new project&lt;/span&gt;
orchcli init

&lt;span class="c"&gt;# Start everything&lt;/span&gt;
orchcli start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open &lt;code&gt;http://localhost:3001&lt;/code&gt; to see the visual canvas.&lt;/p&gt;

&lt;h3&gt;
  
  
  Run Core directly
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/KubeOrch/core.git
&lt;span class="nb"&gt;cd &lt;/span&gt;core
go mod tidy
go run main.go
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Core starts at &lt;code&gt;http://localhost:3000&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Explore the repos
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/KubeOrch/core" rel="noopener noreferrer"&gt;KubeOrch/core&lt;/a&gt; — Go backend, orchestration engine&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/KubeOrch/ui" rel="noopener noreferrer"&gt;KubeOrch/ui&lt;/a&gt; — Next.js visual canvas&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/KubeOrch/cli" rel="noopener noreferrer"&gt;KubeOrch/cli&lt;/a&gt; — OrchCLI developer tool&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/KubeOrch/community" rel="noopener noreferrer"&gt;KubeOrch/community&lt;/a&gt; — Governance, roadmap, RFCs&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/KubeOrch/docs" rel="noopener noreferrer"&gt;KubeOrch/docs&lt;/a&gt; — Full documentation&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;The roadmap has three near-term priorities:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;GitOps integration&lt;/strong&gt; — sync your visual design to a Git repo and trigger deploys on push&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-cluster support&lt;/strong&gt; — manage workloads across multiple clusters from one canvas&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plugin SDK&lt;/strong&gt; — let the community build and publish custom components to the marketplace&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If any of these problems interest you, the contributor guide is in the community repo and issues are open.&lt;/p&gt;




&lt;h2&gt;
  
  
  Closing Thoughts
&lt;/h2&gt;

&lt;p&gt;Kubernetes isn't going anywhere. But the developer experience has a long way to go before it matches the power of the underlying platform.&lt;/p&gt;

&lt;p&gt;KubeOrch is my attempt to close that gap — to make the visual mental model of distributed systems the primary interface, not a second-class visualization layer bolted on top of YAML.&lt;/p&gt;

&lt;p&gt;If you've felt the pain of Kubernetes configuration, give it a try. And if you want to help build it, the doors are open.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/KubeOrch" rel="noopener noreferrer"&gt;github.com/KubeOrch&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Follow me on &lt;a href="https://x.com/mohit_nagaraj" rel="noopener noreferrer"&gt;X/Twitter&lt;/a&gt; for more.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>go</category>
      <category>opensource</category>
      <category>devops</category>
    </item>
    <item>
      <title>Building a Kubernetes Operator in Go with Kube-Shift</title>
      <dc:creator>Mohit Nagaraj</dc:creator>
      <pubDate>Mon, 14 Jul 2025 03:49:48 +0000</pubDate>
      <link>https://dev.to/mohit_nagaraj/building-a-kubernetes-operator-in-go-with-kube-shift-446h</link>
      <guid>https://dev.to/mohit_nagaraj/building-a-kubernetes-operator-in-go-with-kube-shift-446h</guid>
      <description>&lt;p&gt;Kubernetes has become the de-facto standard for container orchestration. As its adoption grows, so does the need for extending its capabilities to manage complex, stateful applications. This is where Kubernetes Operators come in. In this article, we'll explore how to build a custom Kubernetes Operator from scratch using Go and the &lt;code&gt;controller-runtime&lt;/code&gt; library. We'll use &lt;a href="https://github.com/mohit-nagaraj/kube-shift" rel="noopener noreferrer"&gt;kube-shift&lt;/a&gt;, a custom operator for database schema migrations, as a real-world example to guide us through the process. You can check out more blogs here: &lt;a href="https://blog.mohitnagaraj.in/" rel="noopener noreferrer"&gt;blog&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The "Why": What Problem Do Operators Solve?
&lt;/h2&gt;

&lt;p&gt;Before we dive into the code, let's understand the problem operators solve. Managing applications on Kubernetes often involves more than just deploying a set of pods. Many applications require complex lifecycle management, including installation, upgrades, and handling failures. Operators automate these tasks by extending the Kubernetes API with Custom Resource Definitions (CRDs) and a custom controller to manage them.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;kube-shift&lt;/code&gt; project is a perfect example. It introduces a &lt;code&gt;DatabaseMigration&lt;/code&gt; resource to Kubernetes, allowing you to manage database schema changes as part of your deployment process, just like any other Kubernetes resource.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting the Stage: Project Scaffolding with Kubebuilder
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;kube-shift&lt;/code&gt; operator, like many Go-based operators, is built using the &lt;a href="https://book.kubebuilder.io/" rel="noopener noreferrer"&gt;Kubebuilder&lt;/a&gt; framework. Kubebuilder provides a set of tools to quickly scaffold a new operator project, including the boilerplate for CRDs, controllers, and other necessary components.&lt;/p&gt;

&lt;p&gt;The entry point of our operator is &lt;code&gt;cmd/main.go&lt;/code&gt;. This file is responsible for setting up and running the controller manager.&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="c"&gt;// cmd/main.go&lt;/span&gt;
&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="c"&gt;// ... imports&lt;/span&gt;
    &lt;span class="s"&gt;"github.com/mohit-nagaraj/kube-shift/api/v1alpha1"&lt;/span&gt;
    &lt;span class="s"&gt;"github.com/mohit-nagaraj/kube-shift/internal/controller"&lt;/span&gt;
    &lt;span class="c"&gt;// ...&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c"&gt;// ... flag parsing and setup&lt;/span&gt;

    &lt;span class="n"&gt;mgr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;ctrl&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NewManager&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctrl&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetConfigOrDie&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;ctrl&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Options&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c"&gt;// ... options&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;setupLog&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"unable to start manager"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1&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="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;controller&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DatabaseMigrationReconciler&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Client&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;mgr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetClient&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
        &lt;span class="n"&gt;Scheme&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;mgr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetScheme&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SetupWithManager&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mgr&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;setupLog&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"unable to create controller"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"controller"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"DatabaseMigration"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c"&gt;// ...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here, we create a new manager and register our &lt;code&gt;DatabaseMigrationReconciler&lt;/code&gt; with it. The manager is responsible for running the controller and managing its lifecycle.&lt;/p&gt;

&lt;h2&gt;
  
  
  Defining Our Custom Resource: The &lt;code&gt;DatabaseMigration&lt;/code&gt; CRD
&lt;/h2&gt;

&lt;p&gt;The first step in creating our operator is to define the custom resource it will manage. This is done in &lt;code&gt;api/v1alpha1/databasemigration_types.go&lt;/code&gt;. This file defines the Go types that represent our &lt;code&gt;DatabaseMigration&lt;/code&gt; CRD.&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="c"&gt;// api/v1alpha1/databasemigration_types.go&lt;/span&gt;
&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;v1alpha1&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;metav1&lt;/span&gt; &lt;span class="s"&gt;"k8s.io/apimachinery/pkg/apis/meta/v1"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c"&gt;// DatabaseMigrationSpec defines the desired state of DatabaseMigration&lt;/span&gt;
&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;DatabaseMigrationSpec&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Database&lt;/span&gt;  &lt;span class="n"&gt;DatabaseConfig&lt;/span&gt;  &lt;span class="s"&gt;`json:"database"`&lt;/span&gt;
    &lt;span class="n"&gt;Migration&lt;/span&gt; &lt;span class="n"&gt;MigrationConfig&lt;/span&gt; &lt;span class="s"&gt;`json:"migration"`&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;// DatabaseMigrationStatus defines the observed state of DatabaseMigration&lt;/span&gt;
&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;DatabaseMigrationStatus&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Phase&lt;/span&gt;   &lt;span class="n"&gt;MigrationPhase&lt;/span&gt; &lt;span class="s"&gt;`json:"phase,omitempty"`&lt;/span&gt;
    &lt;span class="n"&gt;Message&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;         &lt;span class="s"&gt;`json:"message,omitempty"`&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;// +kubebuilder:object:root=true&lt;/span&gt;
&lt;span class="c"&gt;// +kubebuilder:subresource:status&lt;/span&gt;

&lt;span class="c"&gt;// DatabaseMigration is the Schema for the databasemigrations API&lt;/span&gt;
&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;DatabaseMigration&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;metav1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TypeMeta&lt;/span&gt;   &lt;span class="s"&gt;`json:",inline"`&lt;/span&gt;
    &lt;span class="n"&gt;metav1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ObjectMeta&lt;/span&gt; &lt;span class="s"&gt;`json:"metadata,omitempty"`&lt;/span&gt;

    &lt;span class="n"&gt;Spec&lt;/span&gt;   &lt;span class="n"&gt;DatabaseMigrationSpec&lt;/span&gt;   &lt;span class="s"&gt;`json:"spec,omitempty"`&lt;/span&gt;
    &lt;span class="n"&gt;Status&lt;/span&gt; &lt;span class="n"&gt;DatabaseMigrationStatus&lt;/span&gt; &lt;span class="s"&gt;`json:"status,omitempty"`&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;DatabaseMigration&lt;/code&gt; struct embeds &lt;code&gt;metav1.TypeMeta&lt;/code&gt; and &lt;code&gt;metav1.ObjectMeta&lt;/code&gt;, which are common to all Kubernetes objects. The &lt;code&gt;Spec&lt;/code&gt; field defines the desired state of our resource, while the &lt;code&gt;Status&lt;/code&gt; field represents its current state.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Heart of the Operator: The Controller and Reconciliation Loop
&lt;/h2&gt;

&lt;p&gt;With our CRD defined, we need a controller to act on it. The controller's logic is implemented in &lt;code&gt;internal/controller/databasemigration_controller.go&lt;/code&gt;. The core of the controller is the &lt;code&gt;Reconcile&lt;/code&gt; function. This function is called every time a &lt;code&gt;DatabaseMigration&lt;/code&gt; resource is created, updated, or deleted.&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="c"&gt;// internal/controller/databasemigration_controller.go&lt;/span&gt;

&lt;span class="c"&gt;// DatabaseMigrationReconciler reconciles a DatabaseMigration object&lt;/span&gt;
&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;DatabaseMigrationReconciler&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Client&lt;/span&gt;
    &lt;span class="n"&gt;Scheme&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;runtime&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Scheme&lt;/span&gt;
    &lt;span class="n"&gt;Log&lt;/span&gt;    &lt;span class="n"&gt;logr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Logger&lt;/span&gt;
    &lt;span class="c"&gt;// ... other fields&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;// +kubebuilder:rbac:groups=database.mohitnagaraj.in,resources=databasemigrations,verbs=get;list;watch;create;update;patch;delete&lt;/span&gt;
&lt;span class="c"&gt;// ... other rbac markers&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;DatabaseMigrationReconciler&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;Reconcile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;req&lt;/span&gt; &lt;span class="n"&gt;ctrl&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctrl&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Result&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;log&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WithValues&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"databasemigration"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NamespacedName&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c"&gt;// your logic here&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;ctrl&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Result&lt;/span&gt;&lt;span class="p"&gt;{},&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;Reconcile&lt;/code&gt; function receives the name and namespace of the &lt;code&gt;DatabaseMigration&lt;/code&gt; resource that triggered the event. It's the reconciler's job to fetch the resource and take the necessary actions to bring the system to the desired state defined in the resource's &lt;code&gt;Spec&lt;/code&gt;. This could involve creating jobs, pods, or other resources to perform the database migration.&lt;/p&gt;

&lt;h3&gt;
  
  
  Advanced Reconciliation: Beyond the Basics
&lt;/h3&gt;

&lt;p&gt;A robust operator does more than just create resources. &lt;code&gt;kube-shift&lt;/code&gt; demonstrates several advanced concepts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Status Updates:&lt;/strong&gt; The controller updates the &lt;code&gt;Status&lt;/code&gt; field of the &lt;code&gt;DatabaseMigration&lt;/code&gt; resource to reflect the current state of the migration. This provides valuable feedback to users.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Finalizers:&lt;/strong&gt; To ensure graceful cleanup, &lt;code&gt;kube-shift&lt;/code&gt; uses a finalizer. The &lt;code&gt;DatabaseMigrationFinalizer&lt;/code&gt; is added to the resource on creation. This prevents the resource from being deleted until the controller has performed any necessary cleanup tasks.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Leader Election:&lt;/strong&gt; In a high-availability setup, you might run multiple instances of your operator. Leader election ensures that only one instance is active at a time, preventing conflicts. This is configured in &lt;code&gt;cmd/main.go&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Testing Your Operator
&lt;/h3&gt;

&lt;p&gt;Testing is crucial for any production-grade software. &lt;code&gt;kube-shift&lt;/code&gt; includes both unit and integration tests.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Unit Tests:&lt;/strong&gt; These tests focus on individual components of the operator in isolation.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Integration Tests:&lt;/strong&gt; The project uses the &lt;code&gt;envtest&lt;/code&gt; package to run integration tests against a real Kubernetes API server. You can see this in &lt;code&gt;internal/controller/suite_test.go&lt;/code&gt;, which sets up a test environment for the controller tests.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Building a Kubernetes Operator is a powerful way to extend Kubernetes and automate complex application management tasks. By leveraging tools like Kubebuilder and &lt;code&gt;controller-runtime&lt;/code&gt;, you can create robust, production-ready operators. The &lt;code&gt;kube-shift&lt;/code&gt; project is an excellent example of how to apply these concepts to solve a real-world problem.&lt;/p&gt;

&lt;p&gt;To learn more, I encourage you to explore the &lt;a href="https://github.com/mohit-nagaraj/kube-shift" rel="noopener noreferrer"&gt;kube-shift repository on GitHub&lt;/a&gt;. You'll find the complete source code, along with more details on how to build, deploy, and use the operator. Happy coding!&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>go</category>
      <category>devops</category>
    </item>
    <item>
      <title>GhostPass: Anonymous Wallet Verification</title>
      <dc:creator>Mohit Nagaraj</dc:creator>
      <pubDate>Sun, 01 Jun 2025 09:23:53 +0000</pubDate>
      <link>https://dev.to/mohit_nagaraj/ghostpass-anonymous-wallet-verification-4n5h</link>
      <guid>https://dev.to/mohit_nagaraj/ghostpass-anonymous-wallet-verification-4n5h</guid>
      <description>&lt;p&gt;GhostPass is a privacy-focused Web3 application built during the Monad Hackathon that enables anonymous wallet verification without revealing any personal identity. This post covers the project goals, architecture, features, and implementation details.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;📝 &lt;em&gt;Prefer a personal behind-the-scenes read? &lt;a href="https://blog.mohitnagaraj.in/blog/202506/Monad_Hackthon_Expirience" rel="noopener noreferrer"&gt;Check out my 3-min blog post&lt;/a&gt; covering our hackathon experience in detail.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  🧠 About the Monad Hackathon
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;Monad Web3 Hackathon&lt;/strong&gt; brought together blockchain developers, builders, and privacy advocates to experiment on top of &lt;strong&gt;Monad&lt;/strong&gt;, a high-performance, EVM-compatible Layer 1 blockchain. Monad is designed for &lt;strong&gt;10,000+ TPS&lt;/strong&gt;, and its innovative consensus and execution engine enables scalable dApps without compromising decentralization.&lt;/p&gt;

&lt;p&gt;During the hackathon, our team built &lt;strong&gt;GhostPass&lt;/strong&gt; — a privacy-first wallet verification platform — within 6 hours.&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%2F8qv1zvfvtpotp9hy6vdt.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8qv1zvfvtpotp9hy6vdt.webp" alt="Project Dashboard" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Project: GhostPass
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;GhostPass&lt;/strong&gt; is a privacy-focused platform for &lt;strong&gt;anonymous wallet verification&lt;/strong&gt; on the blockchain. It allows users to &lt;strong&gt;prove wallet ownership&lt;/strong&gt; and display &lt;strong&gt;verification status&lt;/strong&gt;—without revealing personal identity.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔐 Key Features
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Wallet Verification&lt;/strong&gt;: Users sign a challenge to prove ownership of their wallet.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Anonymous Identity&lt;/strong&gt;: No personal data is collected; only public blockchain information is stored.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Verification Lookup&lt;/strong&gt;: Anyone can check verification status of any Ethereum wallet.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Batch &amp;amp; Revoke Support&lt;/strong&gt;: Admin tools for bulk verification and revoking.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Modern Web Interface&lt;/strong&gt;: Built with Next.js and TypeScript for a smooth user experience.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ⚙️ How It Works
&lt;/h3&gt;

&lt;h4&gt;
  
  
  1. Connect &amp;amp; Verify
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Users connect via MetaMask or any EIP-1193 wallet.&lt;/li&gt;
&lt;li&gt;A message challenge is signed to prove ownership.&lt;/li&gt;
&lt;li&gt;Signature is verified server-side.&lt;/li&gt;
&lt;li&gt;On success, a verification transaction is submitted to the smart contract.&lt;/li&gt;
&lt;li&gt;The wallet address, verification timestamp, and transaction hash are logged.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  2. Display Verified Users
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The backend maintains a list of verified wallets with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;address&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;verifiedAt&lt;/code&gt; timestamp&lt;/li&gt;
&lt;li&gt;&lt;code&gt;transactionHash&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;This data is accessible via:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Public API (&lt;code&gt;/verified-users&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;UI-based lookup interface&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h4&gt;
  
  
  3. Check Verification Status
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Anyone can check if a wallet is verified by querying:

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/verify/:address&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  🛠️ Technology Stack
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frontend&lt;/strong&gt;: Next.js (React), TypeScript
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend&lt;/strong&gt;: Node.js, Express, ethers.js
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Smart Contracts&lt;/strong&gt;: Ethereum via Hardhat
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wallet Integration&lt;/strong&gt;: MetaMask or any EIP-1193-compatible wallet
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  📡 API Overview
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Endpoint&lt;/th&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/verify&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;POST&lt;/td&gt;
&lt;td&gt;Verify wallet by submitting signature&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/verify/:address&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;GET&lt;/td&gt;
&lt;td&gt;Check if a wallet is verified&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/verified-users&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;GET&lt;/td&gt;
&lt;td&gt;List all verified wallets&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/revoke&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;POST&lt;/td&gt;
&lt;td&gt;Admin-only endpoint to revoke verification&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

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

&lt;h3&gt;
  
  
  🧪 Local Development Setup
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Backend
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
bash
cd backend
npm install
# Set environment variables in .env
npm start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>web3</category>
      <category>hackathon</category>
      <category>blockchain</category>
      <category>privacy</category>
    </item>
    <item>
      <title>Leading My First Hackathon Team</title>
      <dc:creator>Mohit Nagaraj</dc:creator>
      <pubDate>Tue, 20 May 2025 17:10:00 +0000</pubDate>
      <link>https://dev.to/mohit_nagaraj/leading-my-first-hackathon-team-2ld5</link>
      <guid>https://dev.to/mohit_nagaraj/leading-my-first-hackathon-team-2ld5</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;From Building a Smart Triage Assistant to a Rainy Midnight Walk.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Every once in a while, an experience transforms how we see ourselves - not just as developers, but as people. For me, that moment happened during a 24-hour hackathon. This post is a reflection of what my team built, the journey of leading a team for the first time, and a story of a midnight rainwalk that I'll never forget.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem We Tackled
&lt;/h2&gt;

&lt;p&gt;The hackathon challenge centered around improving healthcare access and efficiency. According to the World Health Organization, 70% of patients experience delays in triage - a critical step in emergency and primary care. These delays stem from overburdened staff, lack of accessibility in remote areas, and non-intelligent response systems. We wanted to change that.&lt;/p&gt;

&lt;h2&gt;
  
  
  Our Solution: SnapAid
&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%2F1y73igsvi76wccvhvjrb.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%2F1y73igsvi76wccvhvjrb.png" alt="Website Preview" width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
Our project, SnapAid, is a Smart Triage Assistant powered by multimodal AI. The assistant supports voice, text, and image inputs to quickly assess patient symptoms and generate urgency recommendations. The platform also includes a personalized health quiz, automatic tagging of cases (like "urgent" or "infection"), and real-time notifications to doctors for high-risk scenarios. The idea was simple: empower users with fast, intelligent, and accessible healthcare insights.&lt;/p&gt;

&lt;h2&gt;
  
  
  Taking the Lead
&lt;/h2&gt;

&lt;p&gt;This hackathon was also my debut as a team leader. I was nervous. I didn’t know if I could plan, delegate, or even inspire my team well. I started by organizing planning sessions, listing priorities, and trying to keep everyone in sync. Despite the initial hesitation, I realized that leadership isn't about knowing everything - it's about listening, learning, and helping others do their best.&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%2Fzcjp2sih15cnkhfjfpig.jpeg" 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%2Fzcjp2sih15cnkhfjfpig.jpeg" alt="Snacks when hacking" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Out of our group, only one teammate truly synced with my rhythm. While others couldn't fully coordinate due to various reasons, this one teammate stayed committed throughout the event. Together, we brainstormed, debugged, and pushed through challenges. Her presence turned this into more than just a coding sprint—it became a shared journey.&lt;/p&gt;

&lt;h2&gt;
  
  
  First All-Nighter
&lt;/h2&gt;

&lt;p&gt;Some moments are etched into memory forever. It was past midnight, and we stepped out into the drizzle after hours of coding. The streets were empty. We walked, talked about code, life, and how crazy this all felt. Caffeine-fueled, sleep-deprived, but so alive. That short walk under the rain meant more to me than any milestone—it was clarity, connection, and comfort. I particularly told her to not put water on me, but no use T-T.&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%2Frkup5b5xhe8l9uxh6j0d.jpeg" 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%2Frkup5b5xhe8l9uxh6j0d.jpeg" alt="Midnight sky" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let me be clear, I wasnt awake for anything for the whole night up until now T-T. I used to sleep at own hackathons i used to go. This was also my first time staying up an entire night just for a project. No sleep, just code, good food, and teamwork. There’s something magical. Gotta agree tho, it was exhausting, yes—but equally exhilarating.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Demo &amp;amp; Reaction
&lt;/h2&gt;

&lt;p&gt;Our pitch went well. We demoed the multimodal triage assistant, explained the tech stack, and showcased real-time alerts. Some of the judges were intrigued. Others seemed rushed. It wasn’t the standing ovation I secretly hoped for, but I knew we had built something real. &lt;/p&gt;

&lt;p&gt;Now comes the honest part. Some teams had clearly been working on their projects long before the event started. Others used ChatGPT to generate huge codebases, including structured tables straight from AI—and it showed. Somehow, those got selected. It felt like the raw, sleepless hustle of the moment went unnoticed. Only the devs who stayed up and built it from scratch understood the true grind.&lt;/p&gt;

&lt;p&gt;Despite everything, I wouldn't trade this night for anything. The coding, the chaos, the connection—it was one of the most memorable experiences of my developer journey. Just two teammates, fueled by ambition, caffeine, and the joy of building something from nothing.&lt;/p&gt;

&lt;p&gt;If you’ve ever led a team, pulled an all-nighter for a hackathon, or felt invisible amidst the crowd—share your story. And tell me: how do we keep hackathons fair, inspiring, and real?&lt;/p&gt;

</description>
      <category>hackathon</category>
      <category>healthcare</category>
      <category>ai</category>
      <category>leadership</category>
    </item>
    <item>
      <title>Our Unforgettable Journey: Winning Innerve 9 Hackathon at AIT Pune</title>
      <dc:creator>Mohit Nagaraj</dc:creator>
      <pubDate>Wed, 12 Feb 2025 16:29:40 +0000</pubDate>
      <link>https://dev.to/mohit_nagaraj/our-unforgettable-journey-winning-innerve-9-hackathon-at-ait-pune-54ng</link>
      <guid>https://dev.to/mohit_nagaraj/our-unforgettable-journey-winning-innerve-9-hackathon-at-ait-pune-54ng</guid>
      <description>&lt;p&gt;&lt;em&gt;(This is going to be a very long read! If you're short on time, check out this &lt;a href="https://www.linkedin.com/posts/mohit-nagaraj_innovation-edtech-ai-activity-7294722245116018690-ZiaP?utm_source=share&amp;amp;utm_medium=member_desktop" rel="noopener noreferrer"&gt;LinkedIn post&lt;/a&gt; for a quick update.)&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Beginning of an Adventure
&lt;/h2&gt;

&lt;p&gt;It all started on the 5th of the month, when our team—Bhuvan M, Mohit Nagaraj, Naman Parlecha, Vivek Agarwal, and I—set out on an unforgettable journey from Bangalore to Pune. We had booked bus tickets, and for me, it was the first time traveling solo to a place I had never been before. The anticipation was high, but so were the challenges.&lt;/p&gt;

&lt;p&gt;At the bus station, I almost fell victim to a scam when some strangers tried to ask me for money. Meanwhile, our teammate Bhuvan had a close call—he nearly missed the bus☠️! Just as it was about to leave, he ran and managed to hop on, barely making it in time. The ride itself was grueling; I felt nauseous and restless🤢, unable to sit still for long😭. Eventually, I managed to eat dinner and sleep through most of the 16-hour journey.&lt;/p&gt;

&lt;p&gt;When we finally reached Maharashtra, the first thing we ate was Poha🥗—a light and delicious breakfast, which felt perfect for a morning meal. Still exhausted, we dozed off again until we reached Pune, albeit 2 hours behind schedule.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Warm Welcome at Army Institute of Technology
&lt;/h2&gt;

&lt;p&gt;As soon as we stepped onto the AIT campus, we were greeted with an incredibly warm welcome. The decorations, the enthusiasm of the organizers, and the discipline of the students left a deep impression on me. The respect and courtesy displayed by the students made me emotional🥹—it was a stark contrast to what I was used to.&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%2Fxgnhtx5ickmyu4r5u07a.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%2Fxgnhtx5ickmyu4r5u07a.jpg" alt="Ait front picture" width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After a swift check-in, we roamed around the campus before being taken to our hostel. Once settled in, we immediately got to work. The first step was ideation—we scoured through various strategies online and refined our plan for the hackathon⚡. &lt;strong&gt;This preliminary groundwork would prove invaluable in helping us execute efficiently the next day.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Dinner time arrived, and the hospitality continued. Volunteers personally escorted us to the canteen, where I had my first-ever experience with mess food. It was simple yet delicious, and we made sure to eat to our hearts’ content ❤️.&lt;/p&gt;

&lt;p&gt;Later that night, an unexpected moment of doubt hit us. A random participant approached us and claimed that his team had already built hardware worth ₹6 lakhs☠️. It seemed unfair💔, considering the hackathon rules explicitly stated that everything had to be built within 24 hours. At first, we felt disheartened, fearing that we stood no chance against such resources. &lt;del&gt;However, we later found out that the judges were already aware of the situation.&lt;/del&gt; I decided to sleep early, conserving energy for the big day ahead.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Hackathon Begins!
&lt;/h2&gt;

&lt;p&gt;The next morning, I woke up at 8 AM to the bustling atmosphere of a hostel filled with participants preparing for the challenge. My teammates were still asleep—&lt;strong&gt;classic&lt;/strong&gt;😂! Eventually, only Naman and I made it to the inauguration on time, while the others strolled in later.&lt;/p&gt;

&lt;p&gt;With the formalities out of the way, we had breakfast, refueled ourselves, and prepared for battle🔫🪖. The hackathon venue was perfect—the reading area was air-conditioned, and when we requested to move to a quieter spot, the mentors readily agreed🙌. We set up in the back, a comfortable corner where we could focus without distractions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;As soon as the event kicked off, we worked in structured time blocks, setting clear hourly deadlines&lt;/strong&gt;. The initial hours flew by as we made rapid progress, leveraging our familiarity with the technologies. Before we knew it, lunchtime had arrived, and we were astonished at how four hours had passed in the blink of an eye.&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%2Fzwrifr5ubgsgielisr3i.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%2Fzwrifr5ubgsgielisr3i.jpg" alt="Random picture of me" width="800" height="361"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;By dinner, most of our components— &lt;em&gt;"both frontend and backend"&lt;/em&gt; —were complete. The real challenge now lay in integration. After dinner, we took a short break, enjoying the mesmerizing night sky🌃✨ before heading back into grind mode.&lt;/p&gt;

&lt;p&gt;As midnight approached, the number of participants still actively working started to dwindle📉. Many had given in to exhaustion, but we pushed through. Debugging, testing, and integrating our platform was no easy feat🔥. There were moments of frustration when things didn't work, but we persevered, iterating over and over until everything clicked into place🥲.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Final Stretch and Presentation
&lt;/h2&gt;

&lt;p&gt;By early morning, we had completed our project, but the work wasn’t over yet. Some of our team members crashed from sheer exhaustion, while the rest of us shifted focus to creating our presentation and demo video. Before we knew it, the 10 AM deadline had arrived, and the submissions closed.&lt;/p&gt;

&lt;p&gt;At this point, I had intended to do some internship work but ended up dozing off instead😴. When I woke up, I learned that we had been selected for the final presentation round! We hurried downstairs🏃‍♂️💨, where we had the opportunity to showcase our project to the judges. Their reactions were incredible—they were genuinely impressed by our &lt;strong&gt;AI-driven multimedia EdTech platform, Synapse💻&lt;/strong&gt;. It felt amazing to explain our vision to people who truly understood and appreciated its impact🥹.&lt;/p&gt;

&lt;p&gt;Connecting with so many brilliant minds at AIT was an unforgettable experience, especially as a first-year student with entrepreneurial ambitions. We had made it to the final round, and the anticipation was at an all-time high.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Moment of Truth
&lt;/h2&gt;

&lt;p&gt;The prize distribution ceremony began in the evening. Our hearts pounded as we waited for the results😖&lt;/p&gt;

&lt;p&gt;The announcement for third place came—it wasn’t us. A wave of uncertainty hit us. We knew from experience that if you don’t place second or third, first place is often a long shot. When second place was announced and it still wasn’t us😔 — we felt a mix of disappointment and acceptance.&lt;/p&gt;

&lt;p&gt;Then, the final announcement came &lt;strong&gt;🔥WE WON🔥&lt;/strong&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%2F1tlu6p265nhyb3yt27pa.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%2F1tlu6p265nhyb3yt27pa.jpg" alt="Winning picture" width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hearing our team’s name called as the Grand Prize winners was a surreal moment. The flood of emotions—excitement, pride, disbelief—was overwhelming🎉. We walked onto the stage to receive our prize of ₹1.25 Lakh from a senior general, basking in the glory of our hard work and dedication.&lt;/p&gt;




&lt;h2&gt;
  
  
  A Lasting Memory
&lt;/h2&gt;

&lt;p&gt;That night, we were utterly exhausted. As soon as we returned to our hostel, we collapsed into bed💤, unable to process everything that had happened. The next day, we stayed in Pune to explore the city, taking in its beauty, culture, and energy🥹. It was soo nice to see the city's vibes and people there. It was the perfect way to end such an incredible journey. Loved the entire expirience❤️&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%2Fjhxmlzqgeyv9y0e3muxf.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%2Fjhxmlzqgeyv9y0e3muxf.jpg" alt="Roaming pune" width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Returning home on the 11th morning, I felt a profound sense of happiness and accomplishment. This experience was more than just winning a hackathon—it was about pushing limits, learning, growing, and creating memories that will last a lifetime.&lt;/p&gt;

&lt;p&gt;To anyone aspiring to participate in such events, my advice is simple: &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Believe in your vision, trust your team, and never underestimate the power of perseverance. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This journey has shaped me in ways I never imagined, and I can't wait to see where our next adventure takes us! 🚀&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%2Fmfjhlf06oe6fibxki2qr.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%2Fmfjhlf06oe6fibxki2qr.jpg" alt="Travelling back picture" width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>hackathon</category>
      <category>python</category>
      <category>react</category>
    </item>
    <item>
      <title>🌟 Hacktoberfest 2024 Reflection 🌟</title>
      <dc:creator>Mohit Nagaraj</dc:creator>
      <pubDate>Sat, 12 Oct 2024 16:42:57 +0000</pubDate>
      <link>https://dev.to/mohit_nagaraj/hacktoberfest-2024-reflection-5g68</link>
      <guid>https://dev.to/mohit_nagaraj/hacktoberfest-2024-reflection-5g68</guid>
      <description>&lt;p&gt;This year, Hacktoberfest was a game-changer for me! 🎉 It gave me the perfect opportunity to dive into the world of open-source, and I haven’t looked back since.&lt;/p&gt;

&lt;p&gt;Starting out with my first PR in CSS felt like a great way to get my feet wet, and from there, things took off. My second PR was a TypeScript challenge, and then I stepped into even more complex projects in Go and Ruby for my third and fourth contributions. 💪&lt;/p&gt;

&lt;p&gt;I can honestly say that Hacktoberfest is what helped me kickstart my open-source journey and taught me how to work on real-world projects. It's been an amazing experience, learning new languages and tackling challenges I didn’t think I could! 🚀&lt;/p&gt;

&lt;p&gt;Feeling super grateful for the opportunity to contribute and grow. Thank you, Hacktoberfest, for helping me get started! 🙌 #Hacktoberfest #OpenSource #Growth #TechJourney #ProudContributor&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkynlpqwq5qqwd6javmkh.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%2Fkynlpqwq5qqwd6javmkh.png" alt=" " width="800" height="516"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>hacktoberfest</category>
    </item>
  </channel>
</rss>
