Kidnex
A full-stack health platform where users upload a kidney CT scan and get an AI classification — cyst, normal, stone, or tumor — with per-class confidence, plus Gemini-generated health guidance, medication tracking, vitals logging, and a context-aware chatbot. Built by a team at the ImpactThon hackathon.
Context
Kidney conditions — cysts, stones, tumors — are common, but reading a CT scan needs a radiologist, and that’s slow and access-limited. Kidnex screens a scan automatically and wraps the result in a patient-facing platform: history, risk scoring, and AI guidance to make early detection and follow-up more reachable.
An ImpactThon team project — a healthcare-impact hackathon. Roughly five contributors.
The three-tier flow
A user drags a CT image into the React front end. A Node/Express backend validates it, stores it on Cloudinary, and relays it to a Python Flask service that runs a Keras model and returns a prediction plus per-class probabilities. The backend then persists the result, computes a risk score, and asks Gemini for a plain-language recommendation.
The model is ResNet50 transfer learning on 256×256 RGB input, softmax over four classes — Cyst, Normal, Stone, Tumor.
My role, honestly
I was the front-end developer, not the model author. I built most of the React surface — the dashboard, detection page and history, health logs, medications, profile, the onboarding flow, the landing page, the shared layout, and the floating context-aware chatbot widget — plus a cross-cutting bug-fix pass that reached into the Flask service and the Gemini config. The deep-learning model and its training were a teammate’s work; I made the thing usable around it.
What worked
Color-coded confidence bars for everyclass, not just the winner, made the output honest — a borderline scan looks borderline instead of falsely certain. And feeding the user’s profile and recent detections into the chatbot’s context turned it from a generic bot into something that could answer “what does my last result mean?” sensibly.
What I would change
The scan relays through Base64 in the request body, which is fine for a demo image and wrong for anything larger — I’d stream directly to the Flask service or hand it a Cloudinary URL. And an AI medical result needs a loud, non-negotiable “not a diagnosis, see a doctor” framing everywhere it appears, not just once.