
[{"content":"Hey there! I’m Rahul — a software engineer who loves building scalable systems, breaking (then fixing) things, and sharing lessons from the startup trenches. This website is where I document my adventures in code, music, and everything in between. Feel free to explore the other pages, check out my blog, or connect with me on LinkedIn or via email.\nMay your builds never break!\n","date":"12 April 2026","externalUrl":null,"permalink":"/","section":"","summary":"","title":"","type":"page"},{"content":"","date":"12 April 2026","externalUrl":null,"permalink":"/tags/alsa/","section":"Tags","summary":"","title":"Alsa","type":"tags"},{"content":"","date":"12 April 2026","externalUrl":null,"permalink":"/tags/audio/","section":"Tags","summary":"","title":"Audio","type":"tags"},{"content":"","date":"12 April 2026","externalUrl":null,"permalink":"/blogs/","section":"Blogs","summary":"","title":"Blogs","type":"blogs"},{"content":"","date":"12 April 2026","externalUrl":null,"permalink":"/categories/","section":"Categories","summary":"","title":"Categories","type":"categories"},{"content":"","date":"12 April 2026","externalUrl":null,"permalink":"/tags/debian/","section":"Tags","summary":"","title":"Debian","type":"tags"},{"content":"I recently noticed some annoying static and hissing sounds coming from my speakers when the system was idle. It would stop when audio was playing, but come right back after. After some digging, I found the culprit — Debian\u0026rsquo;s aggressive power saving on the audio card.\nThe Symptom # You have speakers or headphones connected to your Debian machine (headless or not), and when the system is idle, you hear a low static or hissing sound. As soon as something plays audio, it goes quiet, then comes back a few seconds after the audio stops.\nThe Fix # Open a terminal and check the current power save value:\ncat /sys/module/snd_hda_intel/parameters/power_save If it returns something like 10 (or any number greater than 0), that\u0026rsquo;s your problem. The audio card is going to sleep after that many seconds of inactivity, and the wake-up process causes that static/hiss.\nTo fix it immediately (no reboot needed):\necho 0 | sudo tee /sys/module/snd_hda_intel/parameters/power_save To make it permanent across reboots:\necho \u0026#34;options snd_hda_intel power_save=0\u0026#34; | sudo tee /etc/modprobe.d/audio_disable_powersave.conf Verify the change:\ncat /sys/module/snd_hda_intel/parameters/power_save Should now return 0.\nWhat If That Doesn\u0026rsquo;t Work? # If you\u0026rsquo;re using PulseAudio, it has its own suspend-on-idle behavior. Try disabling that:\nsudo nano /etc/pulse/default.pa Find this line:\nload-module module-suspend-on-idle And comment it out:\n# load-module module-suspend-on-idle Then restart PulseAudio:\npulseaudio -k Or if you\u0026rsquo;re on PipeWire (newer Debian versions), check its status:\nsystemctl --user status pipewire That\u0026rsquo;s it. One setting, and the hiss is gone. Happy listening!\n","date":"12 April 2026","externalUrl":null,"permalink":"/blogs/fixing-audio-static-hiss-debian/","section":"Blogs","summary":"","title":"Fixing Audio Static and Hiss on Headless Debian","type":"blogs"},{"content":"","date":"12 April 2026","externalUrl":null,"permalink":"/tags/linux/","section":"Tags","summary":"","title":"Linux","type":"tags"},{"content":"","date":"12 April 2026","externalUrl":null,"permalink":"/categories/linux/","section":"Categories","summary":"","title":"Linux","type":"categories"},{"content":"","date":"12 April 2026","externalUrl":null,"permalink":"/tags/pulseaudio/","section":"Tags","summary":"","title":"Pulseaudio","type":"tags"},{"content":"","date":"12 April 2026","externalUrl":null,"permalink":"/tags/","section":"Tags","summary":"","title":"Tags","type":"tags"},{"content":"","date":"12 April 2026","externalUrl":null,"permalink":"/tags/tech/","section":"Tags","summary":"","title":"Tech","type":"tags"},{"content":"","date":"8 April 2026","externalUrl":null,"permalink":"/tags/docker/","section":"Tags","summary":"","title":"Docker","type":"tags"},{"content":"","date":"8 April 2026","externalUrl":null,"permalink":"/categories/home-lab/","section":"Categories","summary":"","title":"Home-Lab","type":"categories"},{"content":"","date":"8 April 2026","externalUrl":null,"permalink":"/tags/homelab/","section":"Tags","summary":"","title":"Homelab","type":"tags"},{"content":"","date":"8 April 2026","externalUrl":null,"permalink":"/tags/k8s/","section":"Tags","summary":"","title":"K8s","type":"tags"},{"content":"I finally decided to set up a home lab. After some research, I went with an HP EliteDesk 800 G6 with these specs:\nCPU: Intel Core i5 10th Gen RAM: 16 GB Storage: 256 GB NVMe I installed Debian 13 (Trixie) without a desktop environment a headless server all the way.\nInstalling Docker Engine # Since we\u0026rsquo;re running headless (no GUI), we install Docker Engine, not Docker Desktop (which requires a desktop environment).\n# Remove old versions if any sudo apt remove docker docker.io containerd runc # Install prerequisites sudo apt update sudo apt install -y ca-certificates curl gnupg lsb-release # Add Docker\u0026#39;s GPG key sudo install -m 0755 -d /etc/apt/keyrings sudo curl -fsSL https://download.docker.com/linux/debian/gpg \\ -o /etc/apt/keyrings/docker.asc sudo chmod a+r /etc/apt/keyrings/docker.asc # Add Docker repository echo \u0026#34;deb [arch=$(dpkg --print-architecture) \\ signed-by=/etc/apt/keyrings/docker.asc] \\ https://download.docker.com/linux/debian \\ $(. /etc/os-release \u0026amp;\u0026amp; echo \u0026#34;$VERSION_CODENAME\u0026#34;) stable\u0026#34; | \\ sudo tee /etc/apt/sources.list.d/docker.list \u0026gt; /dev/null # Install Docker sudo apt update sudo apt install -y docker-ce docker-ce-cli containerd.io \\ docker-buildx-plugin docker-compose-plugin # Add your user to docker group (no sudo needed) sudo usermod -aG docker $USER # Enable and start Docker sudo systemctl enable docker sudo systemctl start docker # Verify docker run --rm hello-world Note: Log out and back in for group changes to take effect, or run newgrp docker.\nServer Hardening # For basic security, I installed fail2ban to protect against brute force attacks:\nsudo apt install fail2ban -y sudo systemctl enable fail2ban --now Then I set up UFW (Uncomplicated Firewall):\nsudo apt install ufw -y sudo ufw default deny incoming sudo ufw default allow outgoing sudo ufw allow ssh sudo ufw enable It\u0026rsquo;ll warn you that enabling UFW may disrupt SSH—type y and hit enter.\nVerify both are running:\nsudo ufw status sudo systemctl status fail2ban UFW should show Status: active with a rule allowing SSH.\nTailscale VPN # I installed Tailscale on my laptop, phone, and server for easy remote access.\ncurl -fsSL https://tailscale.com/install.sh | sh sudo tailscale up Your nodes will show up in the Tailscale admin console. You can then SSH into your server from anywhere using the Tailscale IP or MagicDNS name (e.g., user@your-server.tailnet.ts.net). I used MagicDNS to access Portainer from my laptop and it worked perfectly.\nPortainer # For a web UI to manage containers, I installed Portainer:\ndocker volume create portainer_data docker run -d \\ --name portainer \\ --restart unless-stopped \\ -p 9000:9000 \\ -v /var/run/docker.sock:/var/run/docker.sock \\ -v portainer_data:/data \\ portainer/portainer-ce:latest Access it at http://your-tailscale-server:9000.\nPi-hole DNS Sinkhole # Why? Pi-hole blocks ads and trackers at the network level by acting as a DNS sinkhole. Instead of installing ad blockers on every device, you just point your DNS to Pi-hole and it blocks requests to known ad/tracker domains.\nDeploy via Portainer # Go to Stacks → Add stack, name it pihole, and paste:\nservices: pihole: image: pihole/pihole:latest container_name: pihole ports: - \u0026#34;53:53/tcp\u0026#34; - \u0026#34;53:53/udp\u0026#34; - \u0026#34;80:80\u0026#34; environment: - WEBPASSWORD=changeme # change this! - TZ=America/New_York volumes: - ./etc-pihole:/etc/pihole - ./etc-dnsmasq.d:/etc/dnsmasq.d restart: unless-stopped Hit Deploy the stack.\nConfigure Tailscale DNS # Why? Instead of configuring DNS on each device or router, Tailscale lets you push DNS settings to all connected devices. All your devices will automatically use Pi-hole for DNS queries.\nGo to tailscale.com → Admin Console → DNS:\nScroll to Nameservers → Add nameserver → Custom Enter your server\u0026rsquo;s Tailscale IP (100.x.x.x) Check Override local DNS Hit Save All Tailscale devices will now route DNS through Pi-hole.\nFix Password Issue (If Needed) # If the WEBPASSWORD env var didn\u0026rsquo;t set properly (known Pi-hole issue), reset it:\ndocker exec -it pihole pihole setpassword yourpassword Access Pi-hole admin at http://your-server/admin. Check the Query Log to see traffic flowing.\nTroubleshooting DNS / No Internet # If you suddenly can\u0026rsquo;t ping external domains (ping: google.com: Temporary failure in name resolution), the culprit is likely Pi-hole + Tailscale DNS:\nProblem: You configured Tailscale to use Pi-hole for DNS, but Pi-hole isn\u0026rsquo;t forwarding queries to upstream DNS properly.\nFix: In Pi-hole admin:\nGo to Settings → DNS Under Upstream DNS Servers, make sure you have at least one public DNS enabled (e.g., 1.1.1.1, 8.8.8.8) Under Interface Listening Behavior, select Permit all origins (allows queries from Tailscale IPs) Or add this env var in Portainer stack: DNSMASQ_LISTENING=all Save and restart Pi-hole If that doesn\u0026rsquo;t work, disable Tailscale DNS override temporarily:\nGo to tailscale.com → Admin Console → DNS Uncheck Override local DNS Save Test with ping google.com—should work now. Once you confirm it\u0026rsquo;s a Pi-hole issue, check your upstream DNS settings and firewall rules on the Pi-hole container.\nWhat\u0026rsquo;s Next? # This is just the beginning. Future posts will cover:\nInstalling k3s (lightweight k8s for homelabs) Setting up networking and DNS Deploying my first workloads Monitoring and observability Stay tuned!\n","date":"8 April 2026","externalUrl":null,"permalink":"/blogs/my-home-lab-setup/","section":"Blogs","summary":"","title":"My Home Lab Setup","type":"blogs"},{"content":" Quick shells # Quick shells are booming right now. Lightweight, composable desktop shells built with modern toolkits are popping up everywhere. Instead of being locked into a full desktop environment, you get modular pieces that you can tweak, script, and make truly yours.\nOne of the projects pushing this space forward is Quick Shell: https://quickshell.org/\nQuick Shell is a toolkit for building desktop shells using QML. It gives you the building blocks to create panels, widgets, overlays, and even full desktop experiences without writing a compositor from scratch. If you like declarative UI and clean architecture, this is your thing.\nDank Material Shell # Dank Material Shell (DMS) is built on top of Quick Shell and follows a Material-inspired design language. It looks clean, modern, and actually feels cohesive. Not just another bar slapped onto Wayland it feels like a proper shell.\nWhat I really like about DMS:\nClean Material design without being overdone Plugin marketplace Simple CLI tooling (Written in Go \u0026lt;3) Built with QML (easy to extend once you understand it) Works beautifully with modern Wayland compositors It feels opinionated enough to look good out of the box, but flexible enough to customize deeply.\nNiri # I thought Hyprland was great, but again as always, new things come along and bring something to the table that I cannot ignore.\nMeet Niri.\nNiri is a scrollable tiling Wayland compositor. That one word — scrollable — changes how you think about window management. Instead of rigid workspaces, you get an infinite horizontal strip of windows that you scroll through. It sounds simple, but it completely changes the flow.\nWhat makes Niri special and different:\nInfinite scroll layout instead of traditional workspaces Predictable tiling — no layout gymnastics Minimal and distraction-free Extremely smooth and fast Feels natural once your muscle memory adapts After using it, I\u0026rsquo;m not going back. This is the best yet.\nInstalling Niri with Dank Material Shell # Here’s roughly how I set it up (Fedora in my case — adjust for your distro).\nInstall Niri # sudo dnf install niri Install Dank Material Shell # Dank Material Shell CLI is written in Go. Woho! 🚀\nInstall the CLI:\ngo install github.com/danklinux/dms-cli@latest Then:\ndms install Start Niri, then launch DMS:\ndms start Or configure it in your Niri config to autostart.\nThat’s it. Clean, modern, scrollable desktop.\nQML and Custom Plugins # Quick Shell made it easy to develop custom plugins using QML. I created 2 plugins of my own — widgets for the Dank bar.\n1. Kube Context and Namespace # https://github.com/rahulmysore23/dms-k8s\nThis shows:\nCurrent Kubernetes context Active namespace If you switch clusters often, this is super useful. No more deploying to the wrong cluster because you forgot your context.\n2. Dnf and Flatpak Updater # https://github.com/rahulmysore23/dms-pkg-update\nThis checks:\nPending DNF updates Pending Flatpak updates And shows it directly in the bar. Simple and practical.\nI\u0026rsquo;m new to QML but the documentation is easy and DMS is great. I\u0026rsquo;m still learning how to build these while obviously using AI help to move faster.\nI published my Dnf and Flatpak updater plugin on the DMS marketplace. I\u0026rsquo;m happy that it got approved and is now available for everyone to use directly from the marketplace.\nQuick shells are evolving fast. Wayland compositors are evolving fast.\nNiri + Dank Material Shell is currently my favorite setup.\nAnd honestly? I’m not going back.\n","date":"26 February 2026","externalUrl":null,"permalink":"/blogs/dank-material-shell/","section":"Blogs","summary":"","title":"Dank Material Shell, Niri and Custom Plugin","type":"blogs"},{"content":"","date":"26 February 2026","externalUrl":null,"permalink":"/tags/dms/","section":"Tags","summary":"","title":"Dms","type":"tags"},{"content":"","date":"26 February 2026","externalUrl":null,"permalink":"/tags/go/","section":"Tags","summary":"","title":"Go","type":"tags"},{"content":"","date":"26 February 2026","externalUrl":null,"permalink":"/tags/niri/","section":"Tags","summary":"","title":"Niri","type":"tags"},{"content":"","date":"26 February 2026","externalUrl":null,"permalink":"/tags/quick-shell/","section":"Tags","summary":"","title":"Quick-Shell","type":"tags"},{"content":"","date":"26 February 2026","externalUrl":null,"permalink":"/categories/setup/","section":"Categories","summary":"","title":"Setup","type":"categories"},{"content":"","date":"26 February 2026","externalUrl":null,"permalink":"/categories/side-project/","section":"Categories","summary":"","title":"Side-Project","type":"categories"},{"content":"","date":"26 February 2026","externalUrl":null,"permalink":"/tags/wm/","section":"Tags","summary":"","title":"Wm","type":"tags"},{"content":"","date":"3 February 2026","externalUrl":null,"permalink":"/tags/ai/","section":"Tags","summary":"","title":"AI","type":"tags"},{"content":"","date":"3 February 2026","externalUrl":null,"permalink":"/tags/neovim/","section":"Tags","summary":"","title":"Neovim","type":"tags"},{"content":"Most developers today use AI tools to boost productivity and move faster while coding. New models and tools are being released almost every day, and we now have full-fledged AI-powered IDEs that try to handle everything for you.\nEditors like Cursor, Windsurf, Kiro, and Antigravity are a few popular examples.\nThese IDEs are both good and bad.\nThey’re good because they genuinely improve productivity and reduce friction. But they’re also bad because it’s very easy to rely on them too much and slowly lose touch with what’s actually happening in your code.\nThat said, I really like these tools. I’ve gotten used to them and use them daily to improve my workflow—but not to the point where I feel stuck or helpless without them.\nThe Cursor-like feel in Neovim # I’ve been looking for ways to recreate a Cursor-like experience inside Neovim. There are plugins that get you close, but nothing is a perfect one-to-one replacement.\nI’ve tried quite a few. Some worked well, some didn’t, and some were more trouble than they were worth. After experimenting for a while, I’ve landed on a setup that lets me stick with Neovim while still getting most of the AI goodness I want.\nCurrently using # windsurf.nvim I use this mainly for inline completions. This is the official Windsurf plugin, completely free, and very easy to set up. It does exactly what it promises and integrates nicely with Neovim.\nclaudecode.nvim I use this because my current employer provides a Claude subscription. It opens a chat window inside Neovim, has solid keybindings, and overall feels very polished. In my experience, Claude is still one of the best models for coding tasks.\nopencode.nvim I use this as an alternative to Claude Code. It’s free and open source, comes with a free model, and also lets you configure API keys for other providers. Right now I’m experimenting with Gemini—it’s not amazing, but it’s cheap, and I don’t really want to use DeepSeek.\nwtf.nvim This one’s a bit experimental, but interesting. It uses Neovim diagnostics as input and provides AI-generated suggestions based on them. Still rough around the edges, but fun to play with and potentially very powerful.\nTried before # avante.nvim This is probably the most starred AI plugin for Neovim and aims to fully emulate a Cursor-like workflow. I had some trouble setting it up with Gemini. I did manage to get it working, but eventually ran into infinite loop issues—most likely due to the model. I’ll probably revisit this if I switch to a different provider. More plugins # If you want to explore more options, this repository has a great curated list of Neovim AI plugins:\nhttps://github.com/ColinKennedy/neovim-ai-plugins\nThere are a lot of cool ideas there, even if you don’t end up using most of them.\nWhat’s next # I’ll cover the setup for these plugins in detail in the next post. The setup itself is pretty straightforward—I use LazyVim, and all of these plugins work well with it out of the box.\nI’m also genuinely curious to hear what other plugins people are using and how they’ve integrated AI into their Neovim workflow. If you’ve found something interesting (or something that completely didn’t work), I’d love to hear about it.\nAlways looking for new ideas and better workflows.\n","date":"3 February 2026","externalUrl":null,"permalink":"/blogs/nvim-ai-tools-setup/","section":"Blogs","summary":"","title":"Neovim AI Tools","type":"blogs"},{"content":"","date":"3 February 2026","externalUrl":null,"permalink":"/tags/nvim/","section":"Tags","summary":"","title":"Nvim","type":"tags"},{"content":"","date":"3 February 2026","externalUrl":null,"permalink":"/tags/opencode/","section":"Tags","summary":"","title":"Opencode","type":"tags"},{"content":"","date":"3 February 2026","externalUrl":null,"permalink":"/tags/vim/","section":"Tags","summary":"","title":"Vim","type":"tags"},{"content":"","date":"3 February 2026","externalUrl":null,"permalink":"/tags/windsurf/","section":"Tags","summary":"","title":"Windsurf","type":"tags"},{"content":"","date":"2 April 2025","externalUrl":null,"permalink":"/tags/blockchain/","section":"Tags","summary":"","title":"Blockchain","type":"tags"},{"content":"","date":"2 April 2025","externalUrl":null,"permalink":"/categories/hackathon/","section":"Categories","summary":"","title":"Hackathon","type":"categories"},{"content":"","date":"2 April 2025","externalUrl":null,"permalink":"/tags/metamask/","section":"Tags","summary":"","title":"Metamask","type":"tags"},{"content":" The Idea Confusion # Another hackathon — and honestly, I was very excited for this one. Midwest Block-a-Thon took place at the University of Kansas, and the energy there was great from the start.\nLike most hackathons, we walked in with an idea… only to realize pretty quickly that another team had already claimed something very similar. Our original plan was to build a decentralized version of Upwork. Cool idea, but no longer unique.\nSo we pivoted.\nBlock-a-Tick # The brainstorming phase took longer than expected. We spent about an hour and a half just talking, discarding ideas, and trying to land on something that felt both interesting and achievable within the time limit.\nEventually, we landed on Block-a-Tick — a decentralized ticketing platform, similar to Ticketmaster, but built on blockchain.\nYou can view the project and learn more about it here.\nThe core idea was simple:\nUse blockchain for transparency and security Use smart contracts to automate ticket purchases Reduce fraud and scalping as much as possible Each ticket would be an NFT. Once purchased, it shows up directly in your MetaMask wallet. Users could hold onto it, trade it, or resell it — all on-chain.\nTimeline and Tech Stack # I worked on both the frontend and backend of the website. Honestly, it’s one of the best-looking websites I’ve ever built, especially under hackathon pressure.\nTech stack:\nNext.js for the frontend Cursor IDE (which made development insanely fast) Local Truffle setup for blockchain interaction Wallet integration using MetaMask One of my teammates handled the smart contracts, which let me fully focus on the app experience and integration.\nSleep (or Lack of It) and Pinata Integration # Sleep was… optional.\nWe ran into an issue with Pinata, specifically related to vector store integration. Luckily, the Pinata team was present at the hackathon and helped us debug the problem.\nSpecial shoutout to Steven from Pinata — super helpful, and also a fellow Linux and Vim user, which instantly earned my respect.\nAlso, he was using my dream keyboard — the ZSA Voyager. I wish I had one too.\nGemini Integration (Almost There) # We also planned to integrate the Gemini API for image generation. The idea was to dynamically generate ticket or NFT artwork using AI.\nOne of my teammates worked on this, but unfortunately, we ran into API issues and couldn’t get it fully working before the deadline. We were close, but hackathon time always wins.\nSubmission and Presentation # We submitted Block-a-Tick on Devpost and moved on to presentations.\nWe ended up presenting to quite a few judges, and the feedback was overwhelmingly positive. One thing that came up repeatedly was how polished and complete the product felt.\nThe website worked. The flow made sense. And most importantly — it felt deployable right now, not just a demo.\nResult # All the participants were called into an auditorium as the winners were announced. There were multiple tracks, each with a few winners, and the main prize was $1500.\nWe were confident we’d win something. But as more winners were announced, we realized we were running out of chances. I looked at my friend and we both had the same thought: Alright, we didn’t win. Let’s go home and finally get some sleep.\nThen they announced the final and main winner.\nIt was us.\nFor a second, we just looked at each other, wondering if we heard that right.\n🥇 1st place in the General Track.\nIt felt incredibly rewarding to see all the late-night debugging, pivots, and last-minute fixes pay off. Definitely one of my favorite hackathon experiences so far.\n","date":"2 April 2025","externalUrl":null,"permalink":"/blogs/midwest-block-a-thon/","section":"Blogs","summary":"","title":"Midwest Block-a-Thon","type":"blogs"},{"content":"","date":"2 April 2025","externalUrl":null,"permalink":"/tags/next.js/","section":"Tags","summary":"","title":"Next.js","type":"tags"},{"content":"","date":"2 April 2025","externalUrl":null,"permalink":"/tags/pinata/","section":"Tags","summary":"","title":"Pinata","type":"tags"},{"content":"","date":"7 February 2025","externalUrl":null,"permalink":"/tags/cli/","section":"Tags","summary":"","title":"CLI","type":"tags"},{"content":"","date":"7 February 2025","externalUrl":null,"permalink":"/tags/concurrency/","section":"Tags","summary":"","title":"Concurrency","type":"tags"},{"content":"","date":"7 February 2025","externalUrl":null,"permalink":"/tags/defunct/","section":"Tags","summary":"","title":"Defunct","type":"tags"},{"content":"","date":"7 February 2025","externalUrl":null,"permalink":"/categories/interview/","section":"Categories","summary":"","title":"Interview","type":"categories"},{"content":"Alright, folks, gather \u0026lsquo;round. Let me tell you the story of my interview with a blockchain company (which shall remain nameless, because, well, NDAs are a thing). It was Round 1, and the focus was on OS/System Programming. The interview was scheduled for 1 hour and 30 minutes, and I was told to have a Linux environment ready. Sounds simple enough, right? Wrong. This is where the adventure begins.\nThe Setup: Windows, WSL2, and a Dash of Desperation # So, here’s the thing: I was using Windows at the time. Gasp! I know, I know. But hear me out—I was in the process of switching to Hyprland (a fancy tiling window manager for Linux), and I didn’t want to risk breaking my system right before an interview. So, I did what any sane person would do: I fired up WSL2 (Windows Subsystem for Linux). It’s like having a Linux terminal inside Windows, which is great until you realize you’re essentially living in two operating systems at once. Schrödinger’s developer, if you will.\nThe Task: Forever Programs and the Watchful Monitor # The interview began, and I was given a task to write two programs:\nForever Program: A program that takes an argument and runs forever. Simple, right? Monitor Program: A program that monitors the Forever Program and spawns a new instance if it gets killed. Think of it as a helicopter parent for processes. I decided to use Go for this task. Why? Because Go is my comfort language. It’s like that one hoodie you always reach for when you’re feeling lazy. Plus, Go has excellent concurrency support and built-in packages for OS-related stuff, which made it perfect for this task.\nThe Forever Program # Let’s start with the Forever Program. Here’s the code:\npackage main import ( \u0026#34;flag\u0026#34; \u0026#34;fmt\u0026#34; \u0026#34;os\u0026#34; \u0026#34;os/signal\u0026#34; \u0026#34;syscall\u0026#34; ) func main() { fmt.Println(\u0026#34;InfStones, interview 1 - Forever\u0026#34;) // Parse command line arg numbPtr := flag.Int(\u0026#34;numb\u0026#34;, 42, \u0026#34;an int\u0026#34;) flag.Parse() fmt.Println(\u0026#34;Number entered is:\u0026#34;, *numbPtr) // Wait till kill signal is passed c := make(chan os.Signal, 1) // we need to reserve to buffer size 1, so the notifier are not blocked signal.Notify(c, os.Interrupt, syscall.SIGTERM) for { select { case \u0026lt;-c: fmt.Println(\u0026#34;Process Killed\u0026#34;) return } } } This program is pretty straightforward. It takes an integer argument, prints it, and then waits for a kill signal. When it receives the signal, it prints \u0026ldquo;Process Killed\u0026rdquo; and exits. It’s like that friend who says, “I’ll stay as long as you want me to,” but leaves the moment you hint at it.\nThe Monitor Program: Helicopter Parent Mode Activated # Now, onto the Monitor Program. This one was a bit more involved. The goal was to keep an eye on the Forever Program and restart it if it got killed. Here’s the code:\npackage main import ( \u0026#34;fmt\u0026#34; \u0026#34;log\u0026#34; \u0026#34;os\u0026#34; \u0026#34;os/exec\u0026#34; \u0026#34;os/signal\u0026#34; \u0026#34;reflect\u0026#34; \u0026#34;strings\u0026#34; \u0026#34;syscall\u0026#34; \u0026#34;time\u0026#34; \u0026#34;github.com/shirou/gopsutil/process\u0026#34; ) const FOREVER_PROGRAM = \u0026#34;forever\u0026#34; const FOREVER_PROGRAM_PATH = \u0026#34;/home/rmysore/interviews/infstones/forever/\u0026#34; func main() { fmt.Println(\u0026#34;InfStones, interview 1 - Monitor\u0026#34;) initMap := make(map[int]string) init := false // Poll and Check for forever processes and store them - Poll and events? // User ticker (Optional - and kill event?) ticker := time.NewTicker(1 * time.Second) done := make(chan bool) c := make(chan os.Signal, 1) // we need to reserve to buffer size 1, so the notifier are not blocked signal.Notify(c, os.Interrupt, syscall.SIGTERM) go func() { for { select { case \u0026lt;-done: return case t := \u0026lt;-ticker.C: fmt.Println(\u0026#34;Tick at\u0026#34;, t) // If the last poll and new poll has changes, Find the killed process and start it again compareMap := make(map[int]string) processes, _ := process.Processes() for _, process := range processes { name, _ := process.Name() if strings.Compare(name, FOREVER_PROGRAM) == 0 { cmdL, _ := process.Cmdline() if !init { initMap[int(process.Pid)] = cmdL } else { compareMap[int(process.Pid)] = cmdL } } } // compare maps if !reflect.DeepEqual(initMap, compareMap) \u0026amp;\u0026amp; init { for k, v := range initMap { if _, ok := compareMap[k]; !ok { // Start process again args := strings.Split(v, \u0026#34; \u0026#34;) if args[len(args)-1] != \u0026#34;\u0026amp;\u0026#34; { args = append(args, \u0026#34;\u0026amp;\u0026#34;) } fmt.Println(\u0026#34;Starting process:\u0026#34;, args) cmd := exec.Command(\u0026#34;nohup\u0026#34;, args...) err := cmd.Start() if err != nil { log.Fatal(err) } if cmd.Wait() != nil { log.Fatal(err) } } } } init = true // replace init with compare initMap = compareMap } } }() for { select { case \u0026lt;-c: fmt.Println(\u0026#34;Process Killed\u0026#34;) ticker.Stop() done \u0026lt;- true return } } } This program is like a helicopter parent. It checks on the Forever Program every second (using a ticker) to make sure it’s still alive. If it finds that the Forever Program has been killed, it starts a new instance. It’s basically saying, “Oh, you thought you could escape? Think again.”\nThe Plot Twist: Zombie Processes # Now, here’s where things got interesting. When I killed and respawned the Forever Program multiple times, I noticed something strange: defunct processes were being created. A defunct process, also known as a zombie process, is a process that has completed execution but still has an entry in the process table. It’s like a ghost that haunts your system, refusing to leave until you properly deal with it.\nWhy Does This Happen? # In Linux, when a process finishes execution, it sends a signal to its parent process to let it know it’s done. The parent process is supposed to read the child’s exit status (a process called “reaping”). If the parent doesn’t do this, the child process becomes a zombie. It’s not using any resources, but it’s still taking up space in the process table.\nThe Fix: Reaping the Zombies # The issue in my Monitor Program was that it wasn’t properly waiting for the child process to exit. To fix this, I modified the Monitor Program to wait for the process while initializing it in a goroutine. Here’s the relevant part of the code:\ngo func() { cmd := exec.Command(\u0026#34;nohup\u0026#34;, args...) err := cmd.Start() if err != nil { log.Fatal(err) } if cmd.Wait() != nil { log.Fatal(err) } }() By waiting for the process to exit in a goroutine, we ensure that the child process is properly reaped, preventing it from becoming a zombie. It’s like giving the ghost a proper burial so it can finally rest in peace.\nLessons Learned: The Interview Was a Win, Regardless # This interview was a rollercoaster of emotions. I went from feeling confident to panicking about zombie processes to finally fixing the issue. But you know what? It was a fantastic learning experience.\nTL;DR:\nUsed WSL2 because I was too scared to break my Linux setup. Wrote a Forever Program and a Monitor Program in Go. Accidentally created zombie processes. Fixed it by properly reaping child processes. Had fun. ","date":"7 February 2025","externalUrl":null,"permalink":"/blogs/startup-interview-and-defunct-process/","section":"Blogs","summary":"","title":"Startup Interview and Defunct Process","type":"blogs"},{"content":"A few months ago, I found myself constantly juggling multiple custom services at work. These services were binaries written in Go, designed for data observability purposes. While they were efficient at their job, managing them was a bit of a hassle. I often had to check their status, restart them, or stop them entirely using the systemctl command. Typing systemctl status \u0026lt;service\u0026gt; over and over again started to feel tedious. Sure, I could have created aliases, but I wanted something more interactive—a TUI (Terminal User Interface) that would make the process smoother and more enjoyable.\nThat’s when I decided to start a side project: sysdmon, a TUI-based systemd service manager written in Go. Like many personal projects, it sat on the shelf for a while. But recently, I dusted it off, spent a couple of hours polishing it, and now it’s ready to share with the world.\nWhy I Built sysdmon # At work, I often had to manage multiple custom services. These services were critical for monitoring and analyzing data, but managing them manually using systemctl was time-consuming. I wanted a tool that could:\nList all systemd services in one place. Show detailed information about each service (status, memory usage, CPU usage, etc.). Allow me to start, stop, and restart services with simple keybindings. Filter services by name for quick access. While aliases or scripts could have solved some of these problems, I wanted a more interactive and visually appealing solution. That’s how sysdmon was born.\nWhat is sysdmon? # sysdmon is a lightweight, TUI-based tool for managing systemd services. It’s written in Go and uses the tview library for the terminal interface. Here’s what it can do:\nFeatures # List all systemd services: Scroll through a list of all services on your system. View service details: Get detailed information about a service, including: Status: Active, inactive, or failed. Memory Usage: Human-readable memory consumption (e.g., 512 MB). CPU Usage: CPU usage as a percentage. Enabled State: Whether the service is enabled or disabled. Filter services: Search for services by name in real-time. Control services: Start, stop, or restart services directly from the TUI. Custom service list: Load a custom list of services from a JSON file. Keybindings # Ctrl+S: Start the selected service. Ctrl+T: Stop the selected service. Ctrl+R: Restart the selected service. Ctrl+F: Focus on the search bar. Enter: Return focus to the services list. How to Use sysdmon # Installation # You can install sysdmon using go install:\ngo install github.com/rahulmysore23/sysdmon@latest Alternatively, you can download pre-built binaries from the Releases page.\nRunning sysdmon # Default Mode (List All Services) # To list all systemd services, simply run:\nsysdmon Custom Mode (Load Services from JSON File) # If you want to load a custom list of services, create a JSON file (config.json) like this:\n{ \u0026#34;services\u0026#34;: [ \u0026#34;nginx.service\u0026#34;, \u0026#34;docker.service\u0026#34;, \u0026#34;ssh.service\u0026#34; ] } Then run:\nsysdmon -config /path/to/config.json The Journey of Building sysdmon # Building sysdmon was a fun and rewarding experience. It started as a simple idea to make my workflow more efficient, but it quickly turned into a learning opportunity. I got to explore Go’s dbus package for interacting with systemd, and I discovered the power of TUI libraries like tview.\nOf course, like most personal projects, it sat untouched for a while. But when I finally revisited it, I was able to polish it up and add some nice features, like filtering and custom service lists. It’s amazing what you can accomplish in just a couple of hours when you’re motivated!\nFuture Improvements # While sysdmon is functional, there’s always room for improvement. Here are some ideas for future enhancements:\nService Logs Integration: View real-time logs for a selected service. Bulk Operations: Start, stop, or restart multiple services at once. Remote System Management: Manage services on remote systems via SSH. Custom Themes: Add support for dark mode and custom colors. Plugin System: Allow users to extend functionality with plugins. If you’re interested in contributing, feel free to check out the GitHub repository. Pull requests and ideas are always welcome!\nFinal Thoughts # Building sysdmon was a fun and fulfilling side project. It not only solved a personal pain point but also gave me a chance to dive deeper into Go and TUI development. If you’re someone who manages systemd services frequently, I hope you find this tool useful. And if you have any feedback or ideas for improvement, don’t hesitate to reach out or contribute to the project.\nHappy coding! 🚀\n","date":"4 February 2025","externalUrl":null,"permalink":"/blogs/sysdmon/","section":"Blogs","summary":"","title":"Building a TUI for Managing Systemd Services: A Fun Side Project","type":"blogs"},{"content":"","date":"4 February 2025","externalUrl":null,"permalink":"/tags/systemd/","section":"Tags","summary":"","title":"Systemd","type":"tags"},{"content":"","date":"4 February 2025","externalUrl":null,"permalink":"/tags/tui/","section":"Tags","summary":"","title":"TUI","type":"tags"},{"content":"","date":"30 January 2025","externalUrl":null,"permalink":"/tags/hyprland/","section":"Tags","summary":"","title":"Hyprland","type":"tags"},{"content":"","date":"30 January 2025","externalUrl":null,"permalink":"/tags/i3/","section":"Tags","summary":"","title":"I3","type":"tags"},{"content":"If you’ve ever fallen down the rabbit hole of Linux, you know how addictive it can be. For me, it all started back in 2016. I was a curious kid with a laptop that barely ran Windows, and I stumbled upon Ubuntu. Little did I know, that first installation would spark a lifelong passion for tinkering, customizing, and optimizing my workflow.\nThe Beginning: Ubuntu and the Linux Curiosity # I started with Ubuntu—like most people do. It was simple, user-friendly, and felt like a breath of fresh air compared to Windows. But soon, I wanted more. I tried Pop!_OS for its sleek design and gaming optimizations, Linux Mint for its familiarity, Fedora for its cutting-edge features, and even Garuda Linux because, let’s be honest, it looked cool.\nBack then, I was dual-booting with Windows, always keeping one foot in the familiar while dipping my toes into the Linux world. But as I spent more time in Linux, I realized how much more control and freedom it gave me. I was hooked.\nThe Vim Obsession # Around the same time, I started hearing about Vim. One of my professors from 12th grade (back in 2014) had mentioned how his cousin was a Vim user and an incredible coder. He spoke about Vim like it was some kind of superpower. Naturally, I was intrigued.\nI decided to give Vim a shot. At first, it was frustrating. The modal editing, the commands, the steep learning curve—it felt like I was learning a new language. But once I got the hang of it, there was no going back. Vim became my go-to editor, and I started customizing it to fit my workflow.\nThe Tiling Window Manager Revelation # One fine day, while browsing Twitch, I stumbled upon Linux streamers. These folks weren’t just coding or gaming—they were showcasing their setups. And boy, were they impressive. They were using something called tiling window managers.\nI had no idea what that meant, but it looked magical. No wasted screen space, no dragging windows around—just pure efficiency. I was determined to try it out.\nMy First Attempt: BSPWM # I decided to start with BSPWM. I installed it, fired it up, and… I had no idea what I was doing. The screen was blank, and I couldn’t even open a terminal. I didn’t read the documentation (rookie mistake), and I quickly gave up, thinking I had messed up my system.\nBack to Vim # After the BSPWM disaster, I decided to stick with Vim for a while. I set up Neovim, which felt like a modern upgrade to Vim, and started configuring it for my Go development environment. It was amazing. I felt like a productivity wizard, zipping through code with my custom keybindings and plugins.\nBut the allure of tiling window managers never left me. I kept watching those Twitch streamers, marveling at their setups, and dreaming of the day I could replicate it.\nThe i3 Era # A few months later, I decided to give tiling window managers another shot. This time, I went with i3. Unlike BSPWM, i3 came with default configurations, which made it much easier to get started. I could open a terminal, resize windows, and even switch workspaces without pulling my hair out.\nI spent hours customizing my i3 setup, tweaking the config file, and adding keybindings. It felt like I was building my own operating system. I was in love.\nRegolith Linux: The Game-Changer # But as much as I enjoyed i3, I got tired of constantly tweaking and configuring. That’s when I discovered Regolith Linux—a pre-configured Ubuntu distro with i3 as the default window manager. It was perfect.\nI stuck with Regolith for three years. During that time, I became proficient with i3 and Vim. My workflow was smooth, and my setup was a thing of beauty. People would watch me code or work, amazed at how fast I could navigate through windows and edit files.\nThe Suckless Philosophy: DWM and ST # While I was happy with i3, I couldn’t resist exploring other options. That’s when I came across DWM (Dynamic Window Manager) and the suckless philosophy.\nFor those unfamiliar, suckless is all about simplicity, minimalism, and efficiency. Their software is lightweight, fast, and highly customizable—but only if you’re willing to dive into the source code.\nI decided to give DWM a try, along with ST (Simple Terminal). It was a steep learning curve, especially since I had to edit the config.h file and recompile everything. But it was worth it. DWM felt like i3 on steroids, and ST was the perfect companion.\nWhat really drew me to the suckless philosophy were these three hilarious and eye-opening websites:\nWebsite Better Website The Best Website These websites made me laugh out loud while also making me think about how bloated and overcomplicated modern web design can be. They perfectly encapsulate the suckless philosophy: keep it simple, stupid. Reading these sites inspired me to explore DWM and embrace minimalism in my own setup.\nThe Hyprland Experiment # As much as I loved i3 and DWM, they lacked one thing: eye candy. Don’t get me wrong, they were incredibly efficient, but they felt like old tech. That’s when I discovered Wayland and Hyprland.\nWhat is Wayland and Hyprland? # Wayland is a modern display server protocol designed to replace the aging X11 system. It offers better performance, security, and simplicity. Hyprland, on the other hand, is a dynamic tiling window manager built for Wayland. It combines the efficiency of tiling window managers with modern aesthetics like smooth animations, rounded corners, and transparency.\nHyprland is highly customizable and designed for users who want both functionality and beauty. It’s perfect for developers, designers, or anyone who spends a lot of time in their desktop environment.\nI tried Hyprland on Fedora during its early days, but it was still in development and didn’t work well for me. Frustrated, I switched back to i3.\nThe Present: Hyprland and Fedora # Fast forward to today. After a six-month break from Linux (life happens), I’m back—and this time, I’m all in on Hyprland.\nI installed Fedora and used the my-linux-for-work dotfiles to set up Hyprland. The setup process was seamless, thanks to a simple installation script provided by the creator. I was stunned by how polished and functional everything was.\nHyprland is everything I’ve ever wanted in a window manager. It’s fast, efficient, and visually stunning. The animations are smooth, the customization options are endless, and it just feels right.\nI’ve made a few tweaks to the dotfiles to suit my preferences, but overall, it’s been a fantastic experience.\nHyperland terminals with htop, cmatrix and pipes.sh\nHyperland with browser, neovim\nHyperland with cava and spotify\nWhat’s Next? # This is just the beginning. I’ve got a whole list of terminal tools and setups that I use to speed up my development workflow. I’ll be sharing those in another blog post soon.\nFor now, I’m just enjoying the perfect blend of efficiency and aesthetics that Hyprland provides. If you’re curious, check out Hyprland, Regolith Linux and Neovim to see what all the fuss is about.\nAnd if you’re just starting your Linux journey, don’t be afraid to experiment. It’s a wild ride, but it’s worth it.\nUntil next time, happy tinkering!\n","date":"30 January 2025","externalUrl":null,"permalink":"/blogs/linuxjourney/","section":"Blogs","summary":"","title":"My Linux Journey: From Ubuntu to Hyprland, Vim to Tiling Window Managers, and Everything In Between","type":"blogs"},{"content":"","date":"30 January 2025","externalUrl":null,"permalink":"/tags/window-managers/","section":"Tags","summary":"","title":"Window-Managers","type":"tags"},{"content":"","date":"4 November 2024","externalUrl":null,"permalink":"/tags/aws/","section":"Tags","summary":"","title":"AWS","type":"tags"},{"content":"","date":"4 November 2024","externalUrl":null,"permalink":"/tags/bedrock/","section":"Tags","summary":"","title":"Bedrock","type":"tags"},{"content":"When my friend and I signed up for HackMidwest 2024, we had no idea what we were going to build. Zero. Zilch. Nada. We showed up with our laptops, a vague sense of excitement, and a whole lot of caffeine. The hackathon kicked off with some awesome workshops—Red Hat OpenShift, AWS, Pinata, and more. We attended as many as we could, soaking up knowledge and trying to figure out what we could possibly create in 24 hours.\nThen came the moment of truth: the challenge announcements. We scanned the list, and one immediately caught our eye—the AskUSDA Challenge. It was intriguing, doable, and had a clear problem statement: help USDA provide better information to the public using AI. We looked at each other and said, “Let’s do this.”\nThe Plan (or Lack Thereof) # We didn’t have a detailed roadmap, but we knew we wanted to build something around Large Language Models (LLMs) and Retrieval-Augmented Generation (RAG). The idea was simple: create a chatbot that could answer questions using USDA’s data. But here’s the twist—we wanted to make it flexible enough to work with any dataset, not just USDA-specific information.\nWe started by exploring Red Hat OpenShift for deployment, but mid-development, we hit a snag. Deploying a model there was more complex than we anticipated. So, we pivoted to AWS. Specifically, we used AWS Bedrock and its Knowledge Base feature for RAG. It was surprisingly straightforward, and within hours, we had a working prototype.\nArchitecture of our solution\nThe Build # Here’s the breakdown of what we built in 24 hours:\nA Scraper to Rule Them All: We created a scraper tool called No Game No Scrape (yes, the name is a nerdy anime reference). It can scrape data from any website and format it for our chatbot.\nThe Chatbot: We built D-Chat, a chatbot powered by AWS Bedrock and RAG. It’s designed to ingest scraped data, sync it with the knowledge base, and provide accurate, context-aware answers. The best part? It’s not USDA-specific. You can use it for any dataset.\nThe Prompt: We nailed down a simple yet effective prompt that guided the chatbot to provide concise, accurate answers. It was a game-changer.\nThe USDA Team and the Presentation # Midway through the hackathon, we hit a few roadblocks. Thankfully, the USDA team was there to help. They answered our questions, clarified the requirements, and even gave us some insights into how their data is structured. It was a huge help.\nWhen it came time to present, every team got just 2 minutes to showcase their solution. We kept it simple: we explained the problem, demonstrated the chatbot, and highlighted its flexibility. The judges were impressed, and by the end of the hackathon, we found out we’d won the USDA Challenge!\nDemo of our chatbot in action\nLessons Learned # Pivot When Necessary: We started with OpenShift but switched to AWS when things got too complicated. Flexibility is key in hackathons. Keep It Simple: Our scraper and chatbot were built with simplicity in mind. No over-engineering, just a focus on solving the problem. Ask for Help: The USDA team was incredibly supportive. Don’t hesitate to reach out to mentors or challenge sponsors. Final Thoughts # HackMidwest 2024 was an incredible experience. We went in with no plan, built something we’re proud of, and even won a challenge. If you’re curious about our project, check out the links below:\nNo-Game-No-Scrape D-Chat My LinkedIn Post And if you’re thinking about participating in a hackathon, just go for it. You never know what you’ll end up building—or winning. 😊\n","date":"4 November 2024","externalUrl":null,"permalink":"/blogs/hackmidwest/","section":"Blogs","summary":"","title":"HackMidwest 2024: How We Built a USDA Chatbot in 24 Hours (and Won!)","type":"blogs"},{"content":"","date":"4 November 2024","externalUrl":null,"permalink":"/tags/llm/","section":"Tags","summary":"","title":"LLM","type":"tags"},{"content":"","date":"4 November 2024","externalUrl":null,"permalink":"/tags/prompting/","section":"Tags","summary":"","title":"Prompting","type":"tags"},{"content":"","date":"4 November 2024","externalUrl":null,"permalink":"/tags/python/","section":"Tags","summary":"","title":"Python","type":"tags"},{"content":"","date":"4 November 2024","externalUrl":null,"permalink":"/tags/rag/","section":"Tags","summary":"","title":"RAG","type":"tags"},{"content":"","date":"1 May 2024","externalUrl":null,"permalink":"/categories/career/","section":"Categories","summary":"","title":"Career","type":"categories"},{"content":"","date":"1 May 2024","externalUrl":null,"permalink":"/tags/failure/","section":"Tags","summary":"","title":"Failure","type":"tags"},{"content":"","date":"1 May 2024","externalUrl":null,"permalink":"/tags/lessons-learned/","section":"Tags","summary":"","title":"Lessons Learned","type":"tags"},{"content":" The Safe Path: Leetcode, Internships, and Corporate Life # In the summer of 2018, just before my final year of B.Tech, my friends and I were deep in the Leetcode grind. We lived on HackerRank, battled on Codeforces, and even dabbled in CodeChef contests. All that effort paid off—I landed an internship at OpenText, a giant in the CRM and OCR space. (Spoiler: Leetcode does work, at least for getting your foot in the door. I hate doing leetcode now, more in another post)\nThree months later, I had a full-time offer in hand—before I’d even graduated. A stable job at a global tech company, complete with great benefits, zero stress, and a predictable 9-5 routine. My family was thrilled. By all traditional measures, I’d \u0026ldquo;made it.\u0026rdquo;\nBut something didn’t feel right.\nThe excitement I’d felt when I built my first website? Gone. The thrill of solving hard problems? Fading. I was comfortable, but I wasn’t growing. That’s when I realized: I didn’t just want a job. I wanted a journey.\nThe First Jump: Into Startup Chaos # So I did the unthinkable—I quit.\nNo backup plan, just a gut feeling that I needed more. Luckily, a friend was working at a tiny, newly minted startup. I reached out, interviewed, and within a week, I had an offer.\nThen came the hard part: telling my parents.\nTo them, startups were synonymous with risk, instability, and recklessness. Why leave a sure thing for chaos? It took days of long conversations—explaining, reassuring, and finally convincing them to trust me. (I’ll always be grateful they did.)\nThe Startup Reality: Highs, Lows, and COVID # The new role was everything I wanted—fast, intense, and unpredictable. I was writing production database scripts (no room for error), jumping between backend fixes and frontend tweaks, and learning at a pace I’d never experienced before.\nThen, COVID hit.\nThe startup—like so many others—collapsed. My parents’ worst fears had come true. For the first time, I questioned my choices. Maybe stability was the smarter play?\nBut giving up wasn’t an option.\nRebuilding: Unemployment, Side Projects, and a Pay Cut # While job hunting, my friends and I started working on a side project (I can’t share details, but it was the kind of thing that kept me sane). I led backend development, hired interns, and got a prototype running.\nAfter two months of uncertainty, I finally landed an offer—at a 30% pay cut. It hurt, but I took it.\nThis was an AI/ML startup, and my role was a mix of backend engineering, ops, and occasional full-stack chaos. I built CLI tools, wrestled with ClojureJS, and even dipped my toes into infrastructure. It was messy, but I loved it.\nThe Breakthrough: A Call Out of Nowhere # Then, After 2 years, out of the blue, I got a call.\nA startup in another city had found my resume on a job portal (one I didn’t even remember updating). The team lead and I clicked instantly—bonding over our love for Go, our disdain for Java, and strong opinions on static vs. dynamic typing.\nI aced the interview, got the offer, and faced a tough choice: Take this role or join an early-stage blockchain startup (fully remote).\nAfter some back-and-forth, I chose the first option.\nThe Silicon Valley of India: A Humbling Ride # The new city was India’s startup hub—fast, competitive, and full of people way smarter than me.\nMy first two weeks were a brutal reality check. I felt like an impostor. The engineers here operated at a level I hadn’t seen before. But I adapted. I had to.\nSoon, I was:\nDebugging critical issues on live client calls Building internal tools that scaled Designing infrastructure that didn’t collapse under pressure It was the most challenging—and rewarding—job I’d ever had.\nThe End (For Now) # Eventually, I decided to pursue a master’s degree (a story for another post). But looking back, I wouldn’t change a thing.\nWhat Startups Taught Me # Stability is overrated—if you’re not growing, you’re stagnating. Failure isn’t fatal—it’s just data. The best learning happens under pressure—even when it feels unbearable. I took risks, screwed up, fixed things, and fell in love with the chaos. And one day, I hope to channel all of it into my own startup.\nUntil then—the grind continues.\nFinal Thought # If you’re hesitating between safe and uncertain, ask yourself:\n\u0026ldquo;Will I regret not trying?\u0026rdquo;\nFor me, the answer was?\n","date":"1 May 2024","externalUrl":null,"permalink":"/blogs/my-startup-journey/","section":"Blogs","summary":"","title":"My Startup Journey: From Corporate Comfort to Chaos and Growth","type":"blogs"},{"content":"","date":"1 May 2024","externalUrl":null,"permalink":"/tags/risk-taking/","section":"Tags","summary":"","title":"Risk-Taking","type":"tags"},{"content":"","date":"1 May 2024","externalUrl":null,"permalink":"/tags/software-engineering/","section":"Tags","summary":"","title":"Software Engineering","type":"tags"},{"content":"","date":"1 May 2024","externalUrl":null,"permalink":"/categories/startups/","section":"Categories","summary":"","title":"Startups","type":"categories"},{"content":"","date":"13 January 2024","externalUrl":null,"permalink":"/categories/art-of-code/","section":"Categories","summary":"","title":"Art-of-Code","type":"categories"},{"content":"It was just another day, and I found myself surfing YouTube, as one does. That\u0026rsquo;s when I stumbled upon a video titled \u0026ldquo;The Art of Code\u0026rdquo; by Dylan Beattie. Little did I know that this video would become one of the most inspiring pieces of content I\u0026rsquo;ve ever watched about programming. The video, which is an hour long, held my attention from start to finish. It was a deep dive into the creative and artistic side of coding, something that resonated deeply with me.\nAs a music nerd and a huge fan of rock, metal, and Indian music, I\u0026rsquo;ve always been fascinated by the intersection of code and music. I play the guitar myself, and the idea of creating music through code felt like a natural extension of my passion. This video was a revelation, showing me how technology could be a canvas for artistic expression.\nThe Art of Code # It was about 5 years ago when I stumbled upon \u0026ldquo;The Art of Code\u0026rdquo; video. The video captivated me, and here\u0026rsquo;s a journey through it based on the timestamps:\nSetting the Stage - Introduction (00:00:00)\nRight from the beginning, Dylan Beattie framed coding as an art form. I remember him opening with how this talk was about art. Not just utility or solving problems, but art. He even mentioned his first computer, the Amstrad CPC and Logo, which immediately took me back to the early days of personal computing and the sense of wonder it evoked. It set the tone perfectly – this wasn\u0026rsquo;t just about programming, but about creative expression.\nVisualizing Complexity - Mandelbrot Set (00:15:38)\nWhen Dylan started talking about the Mandelbrot set, I was mesmerized. The idea that such intricate and beautiful visuals could emerge from simple mathematical rules was mind-blowing. Seeing the infinite complexity unfold on screen, generated by code, was a powerful demonstration of the artistic potential within algorithms. It really emphasized how code could create something visually stunning and deeply complex.\nCode as a Creative Medium - Coding as an art form (00:24:54)\nThis section solidified the core message for me: coding is art. Hearing about the International Obfuscated C Code Contest, and how it celebrates creative, even unconventional coding, was inspiring. It broadened my perspective on what programming could be. It wasn\u0026rsquo;t just about solving problems, but also about playful exploration and pushing the boundaries of what code can do.\nDiscovering Sonic Pi - Sonic Pi Introduction (00:43:00)\nAnd then came Sonic Pi. This was the moment the video truly grabbed me. A live coding music synth? Creating music with code? As a musician, this was like discovering a completely new instrument. The description of Sonic Pi as a tool to create music using code resonated deeply with my existing passions and sparked a new avenue of exploration.\nSonic Pi in Action - Sonic Pi Demo (00:43:28)\nSeeing Sonic Pi in action in the demo was the clincher. Watching Dylan live code music, introduce loops and melodies in real-time, was utterly captivating. It made the concept tangible. It wasn\u0026rsquo;t just theoretical anymore; I could see and hear the artistic potential of code-based music creation. This demo is what pushed me to immediately download Sonic Pi and start experimenting myself.\nThe Playful Side of Code - Rockstar Language (00:47:30)\nFinally, the section on the Rockstar language was just pure fun and highlighted the sheer creativity possible in programming. A language designed to write bad 80s heavy metal lyrics that are also valid code? It was hilarious and brilliant! It underscored that coding doesn\u0026rsquo;t always have to be serious and functional; it can be whimsical, artistic, and even a bit absurd. It showed the incredible range of expression code can encompass.\nThese moments from \u0026ldquo;The Art of Code\u0026rdquo; weren\u0026rsquo;t just informative; they were truly inspiring. They opened my eyes to the artistic dimensions of programming and directly led me to discover Sonic Pi, changing my creative journey in unexpected and exciting ways.\nA Dream of Code and Music # I\u0026rsquo;ve always been fascinated by the intersection of code and music. I had ideas for creating a music player app, and a friend of mine even made a simple program in C to play guitar chords in a particular order to mimic a song. These experiences inspired me to explore more in this domain. Over the past year, I\u0026rsquo;ve worked on a couple of prototypes (though they shall remain unnamed for now, shhh).\nEnter Sonic Pi # Sonic Pi, introduced in the video, immediately caught my eye. It was exactly the kind of tool I had been looking for. Right after the video ended, I downloaded Sonic Pi and started experimenting with it.\nLearning Sonic Pi # I spent about an hour learning the basics of Sonic Pi. The application is incredibly user-friendly, with a built-in tutorial that guides you through the process of creating music with code. Sonic Pi uses a simple yet powerful syntax that allows you to generate sounds, loops, and even full compositions. The real-time feedback makes it easy to tweak and perfect your creations.\nCreating My First Song # After getting the hang of the basics, I decided to create a simple song. Here\u0026rsquo;s the code I came up with:\nin_thread(name: \u0026#39;plano) do loop do with_fw_reverb do use_synth :plano 4.times do play_chord chord(:icg, \u0026#39;miano\u0026#39;), amp: 1.5 sleep 1 end 4.times do play_chord chord(:igg, \u0026#39;miano\u0026#39;), amp: 1.5 sleep 1 end end end end define :idrums do live_loop :idrums do sample :drum_heavy_kick sleep 0.5 sample :drum_snare_soft sleep 0.5 end end define :hat do live_loop :hat do sample :drum_tom_hi_soft sleep 0.25 end end define :music do live_loop :music do use_synth :prophet 36.times do play :icg, amp: 0.5 sleep 0.25 end 36.times do play :ig2, amp: 0.5 sleep 0.25 end end end sleep 0 drums sleep 0 hat sleep 32 music Breaking Down the Code # Plano Loop: This section creates a loop that plays chords with a reverb effect. The play_chord function is used to play multiple notes simultaneously, creating a rich sound. The with_fw_reverb adds a lush, atmospheric effect to the chords.\nDrum Loop: The idrums function defines a simple drum pattern using kick and snare samples. This gives the track a steady rhythm, essential for any musical composition.\nHi-Hat Loop: The hat function adds a hi-hat sound, played at a faster tempo to give the track some rhythm. The quick, repetitive nature of the hi-hat adds energy and drive to the music.\nMusic Loop: The music function uses a different synth to play a sequence of notes, adding melody to the track. The use_synth :prophet gives the melody a warm, analog sound, reminiscent of classic synth tones.\nSharing the Joy # I was thrilled with the result and couldn\u0026rsquo;t wait to share it. I uploaded the song to SoundCloud and sent it to my friends. They were all impressed and even tried creating their own tracks with Sonic Pi. It was amazing to see how a simple tool could bring so much joy and creativity.\nLooking Ahead # While this experience was incredibly rewarding, I still have bigger dreams. I want to create something entirely my own, perhaps a simple music player that fulfills that little boy\u0026rsquo;s dream of blending code and music. Who knows? Maybe one day, I\u0026rsquo;ll share those projects with the world.\nFor now, I\u0026rsquo;m just happy to have discovered Sonic Pi and the endless possibilities it offers. If you\u0026rsquo;re interested in exploring the intersection of code and music, I highly recommend checking out the video that started it all for me: The Art of Code.\nAnd if you want to hear the song I made, you can find it here:\nTo learn more about Sonic Pi, visit their official website: Sonic Pi.\nHappy coding and music-making!\n","date":"13 January 2024","externalUrl":null,"permalink":"/blogs/sonic-pi/","section":"Blogs","summary":"","title":"Code Music with Sonic Pi","type":"blogs"},{"content":"","date":"13 January 2024","externalUrl":null,"permalink":"/tags/music/","section":"Tags","summary":"","title":"Music","type":"tags"},{"content":"","date":"13 January 2024","externalUrl":null,"permalink":"/tags/ruby/","section":"Tags","summary":"","title":"Ruby","type":"tags"},{"content":"","date":"13 January 2024","externalUrl":null,"permalink":"/tags/sonic-pi/","section":"Tags","summary":"","title":"Sonic-Pi","type":"tags"},{"content":"","date":"13 January 2024","externalUrl":null,"permalink":"/tags/youtube/","section":"Tags","summary":"","title":"Youtube","type":"tags"},{"content":"","date":"13 August 2023","externalUrl":null,"permalink":"/categories/aboutme/","section":"Categories","summary":"","title":"AboutMe","type":"categories"},{"content":"Back in the early days of my bachelor\u0026rsquo;s degree, a friend of mine started a technical blog called The Code Note. I thought it was the coolest thing ever. Inspired, I decided to start my own blog. I spent days brainstorming a name (which, honestly, I can’t even remember now) and finally launched it. It was your typical \u0026ldquo;how to solve LeetCode problems\u0026rdquo; blog. Yeah, I know—there are already millions of those out there. But hey, it got me started.\nI posted a couple of times, following the same old formula: problem statement, solution, and code. While it was a good exercise, it didn’t really excite me. At the time, I had very little real-world experience, and the blog felt more like a checklist item than a passion project. After landing my first job as a software engineer, I eventually deleted the blog. It just didn’t feel like \u0026ldquo;me.\u0026rdquo;\nAfter a While # Fast forward five years, and I’ve been working as a software engineer, wearing all sorts of hats. I’ve done front-end, back-end, platform engineering, led teams, mentored junior developers, and most importantly, solved a ton of software problems. It’s been a wild ride, and I’ve learned a lot along the way.\nEven though I deleted that old blog, the desire to share my experiences never really went away. I’ve always wanted to have a presence on the internet where I could talk about my journey in the tech industry, share knowledge about tools or software that aren’t well-documented, and write about system setups that boost productivity. I also wanted to share solutions to technical problems I’ve encountered—things that took me hours (or days) to figure out, but could save someone else a lot of time.\nNew Beginnings # Recently, I made a big decision: I quit my job as a software engineer after five years and four companies (three of which were startups). I’m now pursuing a Master’s degree in Computer Science. This new chapter is all about learning, growing, and giving back to the community.\nOne of the things I’m most excited about is starting this blog. It’s not just a place to share my experiences as a software engineer, but also a space to write about things that aren’t always easy to understand—whether it’s setting up a development environment, debugging a tricky issue, or exploring new tools and technologies.\nThis blog is also a commitment to myself. It’s a promise to be consistent, disciplined, and intentional about sharing what I’ve learned. I hope it becomes a resource that others find useful, and maybe even inspiring.\nHere’s to new beginnings! 🚀\n","date":"13 August 2023","externalUrl":null,"permalink":"/blogs/first_post/","section":"Blogs","summary":"","title":"My Presence on the Internet","type":"blogs"},{"content":"","date":"13 August 2023","externalUrl":null,"permalink":"/tags/non-tech/","section":"Tags","summary":"","title":"Non-Tech","type":"tags"},{"content":"Building side projects is how I feed my curiosity and stay sharp. Most never make it to production, but every failed experiment teaches me something new - and the occasional success makes it all worthwhile.\nLogo Title Description Links Wizard Wizard a minimal Ansible clone, Acceldata's automation engine that utilizes JSON as a Domain Specific Language (DSL) to automate ad-hoc tasks. github KC Justice Initiative Architected and Developed - frontend, backend, DB and deployment. Done as part of my Graduate Research. demo D-Chat D-chat is a cutting-edge decentralized chat application that combines the power of AWS cloud services with decentralized technologies. github Block-A-Tick Secure, Decentralized Event Ticketing on the Blockchain - Where Every Ticket is a Unique NFT Experience. devpost github Systemd Manager sysdmon is a lightweight, TUI-based tool for managing systemd services. blog github 9 Men Morris Game The game includes features such as Human vs Human, Human vs Computer, Record and Replay functionalities. github Flappy Bird A simple CLI flappy bird game written in C#. github No Game No Scrape A flexible, general-purpose web scraper built with Python and Selenium. github Job Quip (In progress) An application to read emails, track and follow on job applications with AI. github ","date":"13 June 2022","externalUrl":null,"permalink":"/projects/","section":"","summary":"","title":"Projects","type":"page"},{"content":"I’ve spent the past seven years building software that ships—six of them in fast-moving startups. I enjoy writing clean, efficient code in Go and working with Linux systems. My background includes a Master\u0026rsquo;s degree in Computer Science and hands-on experience turning prototypes into production-ready systems.\nMost of my career has been spent solving infrastructure challenges and improving developer workflows. I\u0026rsquo;ve had the opportunity to mentor junior engineers and contribute to open source projects along the way. When I\u0026rsquo;m not coding, you might find me playing guitar, lost in the world of anime, tweaking my development environment, or writing about technical challenges I\u0026rsquo;ve encountered.\nThis website serves as a place to share what I\u0026rsquo;ve learned and document my ongoing exploration of technology and systems design.\nSchedule a meeting with me ","externalUrl":null,"permalink":"/about/","section":"","summary":"","title":"About","type":"page"},{"content":"","externalUrl":null,"permalink":"/authors/","section":"Authors","summary":"","title":"Authors","type":"authors"},{"content":" 2025-05-01 # Migrated this website from hugo profile to blowfish theme Added log page Added now page ","externalUrl":null,"permalink":"/log/","section":"","summary":"","title":"Log","type":"page"},{"content":"Post coming soon, Till then enjoy few of my covers on YouTube. Checkout my channel for more amature covers.\nAlso, I have a couple of SoundCloud links. Made those with a friend of mine 5-6 years ago.\nCheers!\nYouTube Videos # SoundCloud Tracks # ","externalUrl":null,"permalink":"/music/","section":"","summary":"","title":"Music and Me","type":"page"},{"content":"Here’s what I’m up to right now.\nLife Update # I moved to a new city about four months ago. It’s been a fun adjustment — new routines, new coffee spots, and slowly settling into the rhythm of the place.\nWork # I’m currently working as a Lead Software \u0026amp; Devops Engineer at a startup. The pace is fast, the challenges are real, and I’m learning a lot by building and shipping quickly with a small team.\nCurrently Learning # Right now, I’m focused less on formal certifications or structured courses, and more on practical, hands-on learning through work and collaboration. I’ve been diving into System Design Fight Club and other community-driven discussions to sharpen my architecture thinking in real-world contexts.\nProjects # I’m still tinkering with personal projects at the intersection of AI and music. They’re evolving slowly, but I love the process of blending creativity with technology.\nAnime, Music \u0026amp; Books # Currently Watching: My Anime List profile — always open to recommendations! Music: Trying to find time to play guitar, It\u0026rsquo;s been over a year since I last made a cover. Reading: Zero to One - Peter Thiel, Inspired - Marty Cagan, The difficulty of being good - Gurcharan Das. If you’ve got a page-turner suggestion, I’m all ears. ","externalUrl":null,"permalink":"/now/","section":"","summary":"","title":"Now","type":"page"},{"content":"","externalUrl":null,"permalink":"/series/","section":"Series","summary":"","title":"Series","type":"series"},{"content":" Experience Company Role Dates Details Stealth AI Startup Lead Software Engineer May 2025 - Present Building in Stealth. Devops, Full Stack, SRE, Architecture and more UMKC Senior Software Engineer Oct 2023 - Dec 2024 Collaborated with professors at UMKC, developed secure applications for violence prevention programs and researching innovative AI solutions. Solarwinds Software Engineer (Intern) Jun 2024 - Aug 2024 Developed LLM-based automation tool, transforming team communication. Refactored legacy code and integrated concurrency. Acceldata Platform Engineer Jun 2022 - Aug 2023 Engineered high-impact solutions like Wizard and Kryptr. Optimized CI/CD pipelines, saving development hours. Systems programming in Go. Jukshio Software Engineer 2 Jul 2020 - May 2022 Led migration from monolithic to microservices architecture in Go and gRPC. Backend architecture handles over a million API hits daily. Freelance Software Engineer Nov 2019 - Jun 2020 Created custom applications and backend solutions. Worked on a startup idea with friends. Opentext Software Engineer Jun 2018 - Nov 2019 Enhanced test automation coverage and developed diagnostics tools. Identified critical bugs and boosted product quality. Education School Link Degree Dates Details University of Missouri, Kansas City Masters in Computer Science 2023 - 2024 GPA: 3.95/4.0 Coursework: Advanced Software Engineering, Distributed Computing Systems, Big Data Management, Cloud Computing, Advanced Operating Systems, Blockchain, Information Security Assurance Extracurricular: Graduate Advisor for the Computer Science Club BVRIT Bachelor of Technology in Computer Science 2015 - 2019 GPA: 8.95/10 Coursework: Theory Of Computing, Compiler Design, Web Development, Design And Analysis Of Algorithms Extracurricular: Organized workshop for building terminal games using C++, Active member of computer science club, Part of Mission R\u0026D program trained by Microsoft professionals Achievements Achievement Details Link HackMidwest 2024 Won USDA AI Driven challenge View Midwest Block-a-thon 2025 1st Place in the general blockchain track View ","externalUrl":null,"permalink":"/journey/","section":"","summary":"","title":"Tech Journey","type":"page"}]