Tour the repo

The repo is small on purpose. One file per responsibility, no framework cleverness, no ORM. You will touch every file in the course.

file tree
bash
rbac-rag-chatbot/
├── app.py            # Gradio UI: login, chat, admin tabs
├── config.py         # Env-driven config, paths, roles
├── user_auth.py      # PBKDF2 hashing, sessions, lockout
├── vector_store.py   # ChromaDB per-role collections
├── rag_chat.py       # Role-aware prompt + OpenRouter call
├── rate_limiter.py   # Sliding-window per-username
├── sample_data.py    # Seed docs for finance / engineering / admin
└── utils/
    └── llm_provider.py  # Thin OpenRouter wrapper

One file per layer of the pipeline we drew. You can read the whole app in an evening.

How the files talk to each other

app.py is the only place state lives. Every other file is a stateless module the UI calls into.

Each arrow is a function call. No magic, no dependency injection, no framework lifecycle.

Matching exercise: Which file owns what

Loading practice…