# Rishabh Rao > Rishabh Rao is a software engineer in Mumbai, working on agentic video at invideo. Previously codedamn. Lately, IoT projects with ESP32s. Generated from https://rao.dev. Every document below is the source markdown. # Hi, I'm Rishabh Rao. > Rishabh Rao is a software engineer in Mumbai, working on agentic video at invideo. Previously codedamn. Lately, IoT projects with ESP32s. - Source: https://rao.dev/ --- I'm a 23 year old engineer in Mumbai. I've been building things since I was 13, starting with custom kernels and ROMs for Android phones. Most of it has been software. I rebuilt codedamn's online IDE from scratch to find out whether I could, custom DNS server and container orchestrator and all. They read the code and hired me, and I spent the next few years making it fast: Firecracker VMs, sub-second playground boots, and live streaming that served millions of people on Fermion, its B2B arm. These days I'm a Software Engineer at invideo, working on agentic video. Increasingly I'm back on hardware in my own time too: a home lab, ESP32s and sensors wired around the flat, and fun little projects I build because I want to use them. # Blog > Writing by Rishabh Rao on software engineering, systems, web development, and whatever else is currently holding my attention. - Source: https://rao.dev/blog --- - Apr 04, 2026 - [Trips - shareable multi-stop planner](https://rao.dev/blog/trips.md) - Mar 15, 2022 - [Rdamn - online playground IDEs](https://rao.dev/blog/rdamn.md) - Jan 21, 2022 - [Surveys & Simulations](https://rao.dev/blog/surveys-and-simulations.md) - Jan 02, 2021 - [R Visual](https://rao.dev/blog/rvisual.md) # Subscribe > Follow new writing from Rishabh Rao by RSS or JSON Feed, and machine-readable endpoints for agents that want to track or ingest this site. - Source: https://rao.dev/subscribe --- There is no newsletter and no signup - just feeds, which means nobody gets your email address and you can leave without asking me. Subscribe now and you will get whatever I publish next. ## For people - [RSS](https://rao.dev/rss.xml): Everything I publish, in one feed. Works with every reader: NetNewsWire, Feedly, Reeder, Thunderbird. - [JSON Feed](https://rao.dev/feed.json): The same posts as JSON, including full text. Easier to poll from a script or an agent than XML. ## For agents and models This site is meant to be readable by software. Crawling is explicitly allowed for AI user-agents in [robots.txt](https://rao.dev/robots.txt), and the endpoints below give you clean text instead of HTML. - [/llms.txt](https://rao.dev/llms.txt): A compact index of everything on this site, with links to the markdown version of each page. - [/llms-full.txt](https://rao.dev/llms-full.txt): Every page concatenated into one markdown document, for ingesting the whole site in a single fetch. - [Any page as markdown](https://rao.dev/blog/rdamn.md): Append .md to any URL on this site to get the raw source, with no navigation or markup. Requesting the ordinary URL with an Accept: text/markdown header returns the same thing. If you are building something that needs a different format, tell me and I will add it. # Trips - shareable multi-stop planner > Plan multi-stop trips with transport modes like car, metro, flight and more. Drop pins on a map, reorder stops, share your itinerary via link, and export directions to Google Maps. Free, no sign-up. - Source: https://rao.dev/blog/trips - Published: 2026-04-04 - Tags: trips, webdev, maps, leaflet, openstreetmap, url-state, cloudflare-pages --- I was planning a day out in Mumbai with friends and needed three things in one place: what time we were at each stop, how we were getting between them, and a way to send the whole thing to everyone. Google Maps does the route but not the schedule. A WhatsApp message does the schedule but not the map. A shared doc does neither. So I vibe coded one in an evening: a single HTML file, no build step, no backend, no accounts. _A morning in south Mumbai: Gateway of India at 08:00, Hutatma Chowk at 08:30, Marine Drive at 09:00, Malabar Hill at 11:30, walking then metro then taxi between them._ ## The plan is the URL The requirement that decided everything else was sharing. Not sharing as a feature with an invite flow, just: my friends need to open this. The only thing everyone can already open is a link. So there is no database. The trip is the query string. Here are the first two stops of the day above, with the spaces decoded so it is readable: ``` ?s=Gateway%20of%20India%2C%20A%20Ward|18.92196|72.83456|2026-04-04T08:00, Hutatma%20Chowk%2C%20Fort|18.93274|72.83163|2026-04-04T08:30 &m=0:walk,1:metro,2:taxi ``` `s` is the stops, pipe separated: name, latitude, longitude, time. Each name is percent-encoded before the stops are joined, which is why the comma inside "Gateway of India, A Ward" does not split the list. `m` maps each gap between two stops to a transport mode, keyed on the index of the stop it leaves from. Every edit calls `history.pushState`, which is where undo comes from. The back button is the undo button. That is half the reason state went into the URL and not into memory: no undo stack to maintain, no shortcut to teach anyone, and it works the same on a phone. Delete a stop by mistake, press back, it is there again along with the mode that went with it. ```js window.addEventListener("popstate", () => { _skipPush = true; stateFromURL(); render(); }); ``` The `_skipPush` flag stops the restore from pushing a fresh entry on top of the one it just came from. ## Reordering a day is not reordering a list The obvious way to move a stop is the one-liner: ```js const [item] = waypoints.splice(from, 1); waypoints.splice(to, 0, item); ``` The time sits on the stop, so it travels with it. That is correct for a list of objects and wrong for a plan of a day. When you drag Malabar Hill above Marine Drive you are not saying "move 11:30 to Malabar Hill". You are saying "let's be at Malabar Hill at 09:00 instead". The time belongs to the slot in the day, not to the place. Try it both ways: ``` naive splice what it does now 08:00 Gateway of India 08:00 Gateway of India 08:30 Hutatma Chowk 08:30 Hutatma Chowk 11:30 Malabar Hill 09:00 Malabar Hill 09:00 Marine Drive 11:30 Marine Drive ``` The naive rule produces a day that runs backwards. The fix moves only the location and writes it back into the fixed slots: ```js function reorderWaypoint(from, to) { // Only move name + coordinates. Times, modes, and slot positions stay fixed. const names = waypoints.map((w) => w.name); const lats = waypoints.map((w) => w.lat); const lngs = waypoints.map((w) => w.lng); const [n] = names.splice(from, 1); names.splice(to, 0, n); const [la] = lats.splice(from, 1); lats.splice(to, 0, la); const [ln] = lngs.splice(from, 1); lngs.splice(to, 0, ln); waypoints.forEach((w, j) => { w.name = names[j]; w.lat = lats[j]; w.lng = lngs[j]; }); } ``` Uglier than a two-line splice, and right for what the thing actually is. ## What it deliberately does not do It draws straight lines between stops, not routes. Routing means an API, a key and a rate limit, and a plan does not need one: you want the shape of the day, and two pins with a line between them say enough. When you actually need directions there is a button that hands the whole trip to Google Maps as `/maps/dir/lat,lng/lat,lng/`. Search is Nominatim, which is free and needs no key. 300 ms debounce, results biased towards whatever the map is currently showing, coordinates rounded to five decimal places. Five is roughly a metre, which is more precision than a day plan needs and keeps the link shorter. _The share dialog, showing the trip as plain text with arrows between stops, the full link, and buttons to copy text, copy link, share, or open in Google Maps_ ## Deploying it Push to `main`, GitHub Actions runs `wrangler pages deploy .`, done. There is no build step because there is nothing to build. The repo is the artifact. The only things the page fetches are Leaflet 1.9.4 and CartoDB's map tiles, and the page itself is about 14.5 kB gzipped. It is vibe coded and it looks it: one long file, styles inline on elements, a helper called `_i()` that returns SVG markup as strings. For something built in an evening so a group chat could agree on a plan, that was the right trade. The reorder is the part I actually thought about. # Rdamn - online playground IDEs > A fully featured online IDE service that allows anyone to quickly boot up and run Next.JS, Express or any other projects without any effort. - Source: https://rao.dev/blog/rdamn - Published: 2022-03-15 - Tags: rdamn, webdev, ide, playground, codedamn --- I had always been very intrigued by [codedamn's online playgrounds](https://codedamn.com/playgrounds) and wanted to figure out how something like that would work. So I decided to try to build it from scratch on my own. It took me almost a month to build it but I had implemented almost all the functionalities that codedamn playgrounds had at that time. I sent my project to the founder of codedamn who was so impressed by it that he decided to hire me full-time :) Here are a couple of screenshots from rdamn: _Landing page_ _Playgrounds interface_ This project was definitely the most interesting and complex one I had attempted till date. I learnt a lot while building it. I had to: - Implement my own DNS servers for providing nice and friendly urls for client connections - Set up a custom container orchestrator system for safely booting playgrounds quickly on demand and shutting them down when the client disconnects - Build an s3 synchronization service that saves the user's data to s3 and restores from it when a user starts their session after inactivity - Work with monaco, xterm and other frontend libraries for a good user experience ...and many other things that helped me become a better programmer. Check out rdamn's GitHub repo to know more about how it works: [https://github.com/rishabhrao/rdamn](https://github.com/rishabhrao/rdamn) # Surveys & Simulations > An easy-to-use platform to help training professionals engage with learners more effectively. It makes training more engaging for trainers. - Source: https://rao.dev/blog/surveys-and-simulations - Published: 2022-01-21 - Tags: surveys-and-simulations, webdev, surveys, simulations, training --- Surveys & Simulations is an online training tool with which trainers can conduct simulations having a series of quizzes with hundreds of users and then assess their performance and publish the learnings. It also lets the trainers collect data from the users with pre and post simulation surveys. This allows participants to work together as a team and gain a better understanding of theoretical business concepts. It boosts participant involvement and enjoyment. Simulation has been shown in studies to improve participant knowledge retention, decision-making, and teamwork skills. Here are a few screenshots from Surveys & Simulations: _Landing page_ _Registration page_ _Trainer dashboard_ _Post-workshop summary for user_ I built this project when I was working with [Bigtime Consulting Private Limited](https://www.linkedin.com/company/bigtimeconsulting/) on a contract to build a few educational websites. # R Visual > A pathfinding algorithm visualizer that animates BFS, DFS, Dijkstra's and A* search across a 2D grid so you can watch each algorithm work. - Source: https://rao.dev/blog/rvisual - Published: 2021-01-02 - Tags: rvisual, dsa, algorithms, path-finding, dijkstra, astar, bfs, breadth-first-search, dfs, depth-first-search --- A pathfinding algorithm seeks to find the shortest path between two points. This application visualizes various pathfinding algorithms in action, and more... R Visual supports 4 algorithms: Breadth first search (BFS), Depth first search (DFS), Dijkstra's and A\* search algorithm. It lets the user choose a start point and end point in a 2D grid array and also lets the user add multiple obstacles in the path. It uses the selected algorithm to find a path from the start point to the end point. The user can trace the path that the algorithm is following to learn more about how the algorithm works. Here are a few screenshots from R Visual: _Welcome tutorial_ _Main grid interface_ _Solution showing the shortest path when obstacles are preset_ I built this project when I was learning DSA (Data Structures & Algorithms) and exploring some real life uses of these algorithms.