_welcome
Hey, I’m Prajwal — I’ve been coding since 2014 and have 5 years of professional experience as a software engineer. I’m always chasing the next tech to learn. Right now, I’m knee-deep in Rust — apparently, I enjoy spending my free time wrestling with its compiler.
current_status
[Looking for new opportunities] [rewriting all my side projects in Rust]
checkout my [@LinkedIn] for my professional history ;)connect_with_me
about_me
For the past 2 years, I’ve been deep in the backend trenches with Golang, and before that, I was living the Node.js life. I’m pretty solid with both, but I’ve also worked with .NET Core, Python, and PHP — though not enough to call myself an expert in them!
I’ve had the chance to work with monolithic, microservice, and serverless architectures throughout my career, and it’s been quite the ride! This has allowed me to work with a wide range of tools and services to ensure smooth communication and efficient system design. I’ve also had hands-on experience with a variety of AWS tools like EC2, Dynamo DB, Lambda, S3, SQS, SNS, EventBridge, and even Google Cloud Functions — basically, the whole cloud ecosystem.
Most of my database experience revolves around PostgreSQL and MySQL, where I’ve gotten pretty comfortable designing schemas that are as efficient as they are effective. Recently, I’ve been diving into DynamoDB, exploring its unique data storage style and figuring out the best way to design schemas for this new (and exciting) world.
I’ve got hands-on experience with tools like Docker, Terraform, Elasticsearch, Redis, Kafka, Keycloak and CI/CD with GitHub Actions and CircleCI — these are the ones that pop into my head at the moment!
While coding, I like to include small unit tests along the way — because, honestly, who doesn’t love catching bugs early? I’m pretty good at writing tests, and I always make sure to provide abstraction where necessary to keep things clean and maintainable.
While my primary focus is backend development, I’ve also dabbled in frontend with Vue.js and React — man’s gotta say he’s a full-stack dev, right?
Oh, and I use Neovim btw :)
side_projects
I’ve worked on tons of fun projects over the years — most of them are unfinished and just for fun, so I won’t bother putting them here. But hey, you can check them out on my [@GitHub] if you're feeling adventurous. Here are a few that are actually useful and some I even use daily:
-
[0] hanger.nvim
[@Github]Ever since I switched to Neovim from VSCode, I’ve never looked back — I’ve become way more productive, and honestly, I can't imagine going back to any other text editor (trust me, I tried, but it just felt wrong). However, there was one thing I really missed: the "run" button above my tests and runnables. I used it way more than I care to admit to rapidly iterate on my unit tests, all while lazily hitting a shortcut. So, naturally, I built my own version in Neovim.
For Rust, it was pretty straightforward. The `rust-analyzer` LSP provides all the runnable commands in the current buffer, so I just had to select the one matching the current test function name, which I got using `treesitter`.
For Go, `gopls` didn’t provide the same feature, so I had to create my own test command generator. Normal test cases were straightforward, but working with test suites proved to be more cumbersome. I had to identify the suite name, the function running the suite, and other necessary details to run a specific test. Additionally, there were edge cases, like multiple tests or packages with the same name, which made it tricky to run a single test uniquely.
Since I primarily work with Rust and Go, the tool currently supports only these two languages. However, I’m working on adding support for JavaScript/TypeScript next.
-
[1] Local Chat with UDP
[@Github]This project is a chat application written in Golang that uses UDP to search for other clients in the local network and allows users to chat with them without any servers. Initially, I used TCP for the chat feature, but I updated it to use UDP because I think the technology today is good enough that we don't need the reliability guarantees provided by TCP. Plus, UDP is much faster and easier to use since we don't have to maintain an active connection.
-
[2] Zed Fork
[@Github]I’m a huge fan of Neovim, but I also want to try out a more modern text editor. Enter Zed — its Vim features are incredibly good, probably the best among all the editors I’ve tried. However, there are some Neovim features I simply cannot live without. For instance, I use Primeagen's Harpoon plugin all the time, so I’ve implemented similar features in my fork of Zed.
Another issue I found while working with Zed is how it handles runnables, especially for tests. The current implementation uses "Tasks" to show runnables for the Rust file that I am currently in, but those runnables are static. It doesn't communicate with rust-analyzer at all. For example, for test runnables, it is just a `cargo test` command with the test function as arguments. This works for most cases, but not all. For instance, if there is more than one test with the same name across the project, the runnable of a test will run all the tests with the same name. Rust-analyzer generated test runnables prevent this by including module arguments as well. So, I am currently trying to integrate rust-analyzer for generating Rust runnables.