TutorLoom
The learning platform for companies, colleges and training institutes. Free and open source, with an Enterprise edition.
Die KI-basierte Ergänzung zum Wahl-O-Mat: Verstehe Parteien anhand von Plenarprotokollen, Abstimmungen und Wahlprogrammen. Jetzt informiert wählen!
Translation pending
EducationPython · TypeScriptGitHub @wahl-chatOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Source code of the wahl.chat platform. Our mission: Make politics more accessible.
Taken from the repository README
Loading the full README.
Read the full README ↗A grounded political information chatbot for German elections — federal, state, and local.
Application: https://wahl.chat/ About: https://wahl.chat/about-us Press: https://wahl-chat.notion.site/press
The aim of wahl.chat is to enable users to engage in a contemporary way with the positions of political parties and to receive answers to individual questions that can be substantiated with sources.
| Directory | Description | Docs |
|---|---|---|
web/ | Next.js frontend application | README |
ai-backend/ | Python AI/RAG backend (FastAPI + SSE + LangChain) | README |
ingestion/ | Corpus layer: ingestion connectors, runner, and Qdrant collection setup | README |
packages/wahlchat-common/ | Code shared by the Python components | README |
firebase/ | Firebase config, Cloud Functions, Firestore rules & seed data | README |
brew install bun, or curl -fsSL https://bun.sh/install | bashcurl -LsSf https://astral.sh/uv/install.sh | shnpm install -g firebase-toolsNo production credentials needed. All data stores run locally.
make install
If you use an AI coding assistant, run ./scripts/setup-agent-docs.sh once to
symlink the provider-specific CLAUDE.md to the committed AGENTS.md (the
symlink is git-ignored; AGENTS.md is the source of truth).
cp ai-backend/.env.example ai-backend/.env
cp web/.env.example web/.env.local
# Only if you run ingestion connectors; otherwise they fall back to ai-backend/.env
cp ingestion/.env.example ingestion/.env
The .env.example files are pre-configured for local mode (QDRANT_URL=http://localhost:6333, FIRESTORE_EMULATOR_HOST=localhost:8081). You only need to fill in LLM API keys (OPENAI_API_KEY, GOOGLE_API_KEY) for the chat to work.
make stores-up
This starts Qdrant via Docker Compose (waiting on /readyz, then bootstrapping the collection) and the Firestore + Auth emulators via the Firebase CLI (Firestore on 8081 — avoids the default 8080 clash with the backend — and Auth on 9099). The target waits until the Firestore emulator answers before returning.
For the web app to actually use these emulators (rather than the real project), web/.env.local must set NEXT_PUBLIC_USE_FIREBASE_EMULATORS=true plus FIRESTORE_EMULATOR_HOST / FIREBASE_AUTH_EMULATOR_HOST — the web/.env.example ships with these enabled. With them set, no service-account key is needed and the browser signs in against the local Auth emulator, so a local session never writes to the real project.
FIRESTORE_EMULATOR_HOST=localhost:8081 make seed-local
Loads scrubbed fixture data (election contexts, parties, proposed questions) into the local Firestore emulator. The seed script refuses to run without FIRESTORE_EMULATOR_HOST set — it will never write to production.
make dev
Or start everything at once (stores + servers):
make dev-local
This starts both the Next.js frontend (localhost:3000) and the Python backend (localhost:8080).
make stores-down
| Target | Description |
|---|---|
make install | Install all dependencies (web via bun; Python members via one uv sync) |
make stores-up | Start Qdrant (Docker) and Firestore emulator (host process) |
make stores-down | Stop all local stores |
make seed-local | Load scrubbed fixtures into local stores (requires FIRESTORE_EMULATOR_HOST) |
make dev-local | Start stores + both dev servers |
make dev | Start both dev servers (assumes stores are already running) |
make run-pledgetracker | Ingest PledgeTracker pledges (Cambridge queue API; stub fixture by default) |
make test-backend | Run the Python unit tests (all three workspace members) |
make test-smoke | Run E2E SSE smoke test |
make test-local-mode | Run the seed-script emulator-guard tests (needs live local stores: make stores-up first) |
make lint | Lint web (biome) + all Python members (ruff) |
We appreciate contributions from our community. Please take a look at the open issues if you are interested. If you are unsure where to start, please contact [email protected].
This project is source-available under the PolyForm Noncommercial 1.0.0 license. Please contact [email protected] for commercial use inquiries.