The Idea
Sandeep Nanu has been rescuing snakes in and around Kengeri, Bangalore since 2022. Each rescue was logged as a post on his personal website at shiftingradius.com. Over four years, that became 362 rescues across 15 species. The data existed, but it was buried in a blog format with no way to explore patterns, compare years, or look up specific rescues quickly.
The goal was simple: turn that existing written record into something you could actually read and explore.
Why a Dashboard
A blog archive answers “what happened on this date.” A dashboard answers “what is the shape of this data.” With four years of field data, there were real questions worth asking: which months are busiest, how has the count changed year over year, what is the split between venomous and non-venomous, which species show up most often. A dashboard format makes these visible without any effort from the reader.
The other reason was permanence. The WordPress site could change or move. A standalone tool, built from an exported copy of the data, would remain stable and browsable regardless of what happens to the source blog.
Data Source and Extraction
WordPress has a built-in export that produces an XML file containing every post. That XML was exported from shiftingradius.com and parsed using a custom Node.js script (parse-xml.mjs). The script reads each post, extracts the rescue details from the post content (species, date, location, whether it was venomous, whether there was a video), and writes everything to a single JSON file (rescue-data.json).
This JSON file is the entire database. There is no backend, no API, no database server. The dashboard reads this one file at load time and does everything else in the browser.
Architecture
The app is a single-page React application built with Vite. All data processing, filtering, sorting, and charting happens on the client side in JavaScript. There is no server involved after the initial file is served.
This approach was chosen deliberately. The dataset is small enough (362 records) that client-side processing is instant. It removes any dependency on a backend, which means the app can be hosted for free on GitHub Pages and will continue working as long as the files exist.
The entire UI is written in one file (App.jsx) using inline React styles. There are no CSS frameworks, no component libraries, no external UI dependencies. This keeps the project simple to maintain and easy to hand off.
Tech Stack
- Vite + React for the frontend build and component model
- GitHub Actions for automated deployment on every push to main
- GitHub Pages for free static hosting
- Custom domain (rescues.shiftingradius.com) via DNS CNAME pointing to GitHub Pages
- Google Fonts (Plus Jakarta Sans) for typography
- Node.js script for the one-time XML to JSON data extraction
No databases. No backend. No paid infrastructure.
Visual Design
The design uses an earthy, muted palette (dark background around #16140f, warm off-white text) to stay out of the way of the data. Year colors are distinct but not loud. The font, Plus Jakarta Sans, was chosen for readability as the primary priority over style. The layout is responsive and works on mobile without a separate codebase.
What Gets Updated
The dashboard is a snapshot tool, not a live feed. When new rescues are added to the WordPress site, a fresh XML export needs to be run through the parse script, and the resulting JSON file pushed to the repository. GitHub Actions then rebuilds and redeploys automatically. Annual figures in the dashboard intentionally cover completed years only, so mid-year counts are not presented as final.
Summary
Four years of field notes, extracted from a WordPress export, parsed into JSON, served as a static file, displayed through a client-side React app, deployed via GitHub Pages. No moving parts, no ongoing costs, no maintenance overhead. The data stays close to its source and the tool stays simple enough that anyone familiar with basic web development can pick it up and extend it.
Launched on 4th March 2026 – https://rescues.shiftingradius.com