WayFree is a real-time spoken navigation prototype for blind and low-vision pedestrians. It uses a phone or laptop camera, streams frames to a vision-language model, and turns each scene into short navigation guidance focused on the walkable corridor ahead.
This repository is being prepared for open source as a public beta. The goal is to make the project easier to run, safer to evaluate, and more polished for contributors exploring the interface.
WayFree is an accessibility research prototype, not a certified mobility aid. It should be tested carefully, in controlled environments, and never treated as a sole source of safety-critical navigation information.
- Captures live frames from the browser camera.
- Sends frames to a FastAPI + Socket.IO backend.
- Uses a multimodal Groq-hosted model to generate navigation guidance.
- Keeps short session memory to avoid repetitive narration.
- Speaks guidance aloud with browser text-to-speech.
- Shows structured guidance cards for:
- immediate path
- upcoming path
- left/right clearance
- surface and elevation
- movement instruction
- alert level
- Includes a frontend demo mode so contributors can explore the UI without a camera or API key.
- Backend: FastAPI, Socket.IO, Groq, LangChain
- Frontend: React, Vite
- Transport: WebSocket streaming for real-time frame updates
app/
config.py
main.py
routers/vision.py
services/guidance.py
services/llava.py
services/memory.py
client/
src/App.jsx
src/App.css
src/index.css
test.py
Create and activate a virtual environment, then install dependencies:
python -m venv venv
source venv/bin/activate
pip install -r requirements.txtCopy the example environment file and add your Groq key:
cp .env.example .envRun the API:
uvicorn app.main:app --reloadThe backend will be available at http://localhost:8000.
Install the client dependencies:
cd client
npm installOptionally create a frontend env file if your API is not on the default local URL:
cp .env.example .envStart the frontend:
npm run devThe Vite app will usually run at http://localhost:5173.
Returns basic runtime information, including version, active sessions, and model name.
Accepts a single base64-encoded image and returns:
descriptionalert_levelsummarysections
This is useful for one-off testing, demos, and regression checks.
- The frontend opens the camera and captures frames roughly every 900ms.
- Frames are sent to the backend over Socket.IO.
- The backend adds short per-session context and asks the model for navigation guidance.
- Similar updates are filtered so the app does not repeat the same message every frame.
- Structured guidance is sent back to the frontend and spoken aloud.
You can test the single-image endpoint with a local image:
python test.py /absolute/path/to/image.jpgThis version adds several improvements over the initial prototype:
- mobile-first interface instead of a plain demo panel
- structured guidance payloads for richer UI rendering
- per-session memory instead of shared global memory
- demo mode for contributors without a live backend path
- configurable backend/frontend environment variables
- more useful README and environment examples
- add confidence and uncertainty signaling
- improve session analytics and debug tooling
- add tests around prompt parsing and guidance formatting
- support recorded video walkthrough demos
- expand accessibility options, including haptics on supported devices
MIT. See LICENSE.