CareReach
Telemedicine demo: symptom checks, hospital search, appointments.
An AI-powered telemedicine platform for remote healthcare consultations, built as a Streamlit app. Users chat with Gemini 1.5 Flash about their symptoms, search nearby hospitals by specialist type through the Google Maps Places API, book appointments, and review their health history, with bcrypt-hashed logins stored in SQLite.
Built with
Highlights
- ▸Symptom checker chats with Gemini 1.5 Flash, and every past conversation stays reviewable as health history.
- ▸Hospital finder searches nearby hospitals by specialist type via the Google Maps Places API.
- ▸Signup and login use bcrypt-hashed passwords stored in SQLite.
From the README
CareReach
AI-powered telemedicine platform for remote healthcare consultations.
Features
| Feature | Description |
|---|---|
| Symptom Checker | Chat with Google Gemini 1.5 Flash about your symptoms and get instant analysis |
| Hospital Finder | Search nearby hospitals by specialist type using Google Maps Places API |
| Appointment Booking | Select a date, time, specialist, and hospital — saved to your account |
| Health History | Review all past symptom conversations |
| Secure Auth | Signup and login with bcrypt-hashed passwords stored in SQLite |
Setup
Prerequisites
- Python 3.12+
- uv —
winget install astral-sh.uv(Windows) orcurl -LsSf https://astral.sh/uv/install.sh | sh(macOS/Linux) - Google Gemini API key — free tier available
- Google Maps Platform API key — enable the Places API
Install
git clone <repo-url>
cd CareReach
uv sync
Configure
Copy .env.example to .env and fill in your API keys:
cp .env.example .env
# Backend secret — only the Maps key is needed here
GOOGLE_MAPS_API_KEY=your_maps_api_key
# Optional — enables appointment confirmation emails:
SENDER_EMAIL=your_gmail@gmail.com
SENDER_PASSWORD=your_gmail_app_password
# Note: Gemini API key is NOT set here — each user enters their own in the app UI.
Run
uv run streamlit run app.py
Open http://localhost:8501.
Deploy to Streamlit Community Cloud
- Push this repo to GitHub
- Go to share.streamlit.io and connect your repo
- Set Main file path to
app.py - Under Advanced settings → Secrets, add:
GOOGLE_MAPS_API_KEY = "your_maps_api_key"
- Click Deploy — done.
Project Structure
.
├── app.py # Streamlit entrypoint — routing and sidebar
├── src/
│ ├── auth.py # Login and signup UI
│ ├── db.py # SQLite helpers (users, history, appointments)
│ ├── hospital.py # Google Maps hospital search + optional email
│ └── pages/
│ ├── chatbot.py # Gemini 1.5 Flash symptom checker
│ ├── appointment.py # Hospital finder and booking
│ └── history.py # Health history viewer
├── .streamlit/
│ └── config.toml # Dark theme, monospace font
├── .env.example # Secrets template — copy to .env
├── pyproject.toml # uv project config and dependencies
└── uv.lock # Locked dependency tree
Secrets Reference
Backend secrets (set by you — in .env locally, in Streamlit Cloud app secrets for deployment)
| Key | Required | Where to get it |
|---|---|---|
GOOGLE_MAPS_API_KEY | Yes | Google Cloud Console → APIs & Services → Enable Places API → Credentials |
SENDER_EMAIL | No | Your Gmail address |
SENDER_PASSWORD | No | Gmail App Password — requires 2FA enabled |
Note on email: If
SENDER_EMAIL/SENDER_PASSWORDare not set, appointments are still saved to the database — the confirmation email is simply skipped.
User-provided (entered in the app UI — never stored on the server)
| Key | Required | Where to get it |
|---|---|---|
| Gemini API Key | Yes, per user | Google AI Studio → Get API key (free tier available) |
Each user enters their own Gemini API key via the ⚙️ AI Settings panel in the sidebar after logging in. The app fetches their available models dynamically and lets them choose which one to use. The key lives only in their browser session and is never persisted.
Tech Stack
- UI: Streamlit 1.58+
- AI: Google Gemini 1.5 Flash via
google-generativeai - Maps: Google Maps Places API via
googlemaps+geopy - Database: SQLite (local file
users.db) - Auth:
bcryptpassword hashing - Package manager: uv
License
Apache 2.0 — see LICENSE.