Mobile Lern- und Übungsapp für Programmiergrundlagen an der DHBW Lörrach.
Code Companion unterstützt Studierende beim selbstgesteuerten Lernen:
- Themenbasiertes Lernen mit Curricula für JavaScript, Python und Java
- KI-gestützte Quiz-Generierung pro Thema oder als Mixed Quiz
- KI-Erklärungen zu Themen als Markdown-Modal
- Fortschritt, Skill-Level und Lernstreaks pro Programmiersprache
- App-Lokalisierung (Deutsch/Englisch) und Theme-Modi (System/Hell/Dunkel)
Die App wurde am Studienzentrum IT-Management & Informatik (SZI) der DHBW Lörrach unter Leitung von Prof. Dr. Erik Behrends entwickelt.
- SZI: https://www.dhbw-loerrach.de/szi
- Quellcode: https://github.com/DHBWLoerrach/CodeCompanion
- Feedback: apps@dhbw-loerrach.de
- Es werden keine benutzerbezogenen Daten auf Servern gespeichert.
- Lernfortschritt, Profil und Einstellungen liegen ausschließlich lokal auf dem Gerät (AsyncStorage).
- Expo SDK 54 + React Native 0.81 + React 19
- Expo Router 6 (file-based routing)
- React Query
- Expo API Routes (
app/api/*) - OpenAI Responses API (Server-seitig in
server/quiz.ts) - AsyncStorage (lokale Persistenz)
app/ Expo Router Routen + API Routes
(tabs)/ Learn, Practice, Progress
api/ quiz + topic explain endpoints
_layout.tsx globale Provider + Stack-Layout
client/
components/ UI-Bausteine
screens/ Screen-Implementierungen
hooks/ Hooks (z. B. useTranslation)
contexts/ Theme/Language/ProgrammingLanguage Contexts
lib/ storage, i18n, topics-Adapter, query-client
constants/ Design-Tokens
server/
quiz.ts Prompting + OpenAI-Integration
topic-prompts.ts Topic-ID -> Prompt-Mapping je Sprache
validation.ts Request-Validierung für API Routes
logging.ts API-Error-Logging
shared/
curriculum/ JSON-Curricula + Loader/Validierung
programming-language.ts unterstützte Programmiersprachen
skill-level.ts Shared Types (Skill/Difficulty)
__tests__/
unit/ Unit Tests
integration/ Integrationstests
e2e/
maestro/ E2E Tests (Maestro)
- Node.js 20+
- npm 10+
- Expo Go App (optional, für schnelles Testen)
npm ciFür das initiale Setup immer npm ci verwenden, nicht npm install.
So werden exakt die Versionen aus package-lock.json installiert und unnötige Lockfile-Änderungen zwischen Betriebssystemen reduziert.
npm ci ist für ein reproduzierbares Setup gedacht.
Wenn Abhängigkeiten geändert werden sollen, erfolgt das bewusst mit npm install oder npm uninstall:
- Hinzufügen:
npm install <paket>(bzw.npm install -D <paket>für Dev-Dependencies) - Aktualisieren:
npm install <paket>@<version>odernpm update <paket> - Entfernen:
npm uninstall <paket>
Dabei werden package.json und package-lock.json aktualisiert.
Beide Dateien müssen gemeinsam committed werden.
OPENAI_API_KEY- API-Key für
POST /v1/responses. - Nur server-seitig verwenden.
- In Produktion aus der EAS-Environment
production.
- API-Key für
OPENAI_MODEL- Modellname, Standard:
gpt-5.2.
- Modellname, Standard:
EXPO_PUBLIC_API_URL- Basis-URL für API-Calls im Client (für Deployments erforderlich).
- Niemals
EXPO_PUBLIC_OPENAI_API_KEYverwenden. - OpenAI-Key als
Restrictedanlegen und nurResponses: Writeerlauben. .envund.env*.localsind per.gitignorevom Commit ausgeschlossen.
npm run startDanach in Expo:
- iOS Simulator (
i) - Android Emulator (
a) - Web (
w)
npm run start- Expo Dev Server startennpm run ios- iOS Build startennpm run android- Android Build startennpm run lint- ESLintnpm run lint:fix- ESLint mit Auto-Fixesnpm run check:types- TypeScript Check (tsc --noEmit)npm run check:format- Prettier Checknpm run format- Prettier Writenpm test- Alle Tests ausführennpm run test:unit- Unit Testsnpm run test:integration- Integrationstestsnpm run test:watch- Tests im Watch-Modusnpm run test:coverage- Tests mit Coverage-Reportnpm run test:e2e- E2E Smoke Tests (Maestro)npm run test:e2e:ai- E2E AI-Tests (Maestro)
Erzeugt ein Quiz für ein einzelnes Topic.
Request-Body:
topicId(string, required)count(number, optional, 1-20, default 5)language(en|de, optional, defaulten)skillLevel(number, optional, default 1)programmingLanguage(javascript|python|java, optional, defaultjavascript)
Erzeugt ein gemischtes Quiz über mehrere Topics.
Request-Body:
count(number, optional, 1-20, default 10)language(en|de, optional, defaulten)skillLevel(number, optional, default 1)programmingLanguage(javascript|python|java, optional, defaultjavascript)topicIds(string[], optional, max 20; wenn leer, zufällige Topics)
Erzeugt eine Themen-Erklärung.
Request-Body:
topicId(string, required)language(en|de, optional, defaulten)programmingLanguage(javascript|python|java, optional, defaultjavascript)
Hinweis: Topic-IDs werden gegen das gewählte Curriculum validiert.
- Source of truth für Lerninhalte:
shared/curriculum/<language>.json - Loader/Validierung:
shared/curriculum/index.ts - UI-Adapter:
client/lib/topics.ts - Prompt-Mapping:
server/topic-prompts.ts
Beim Start wird die Konsistenz zwischen Topic-IDs und Prompt-Mapping geprüft.
- Deployments sind ausschließlich über GitHub Actions erlaubt.
- Lokales
eas deployist nicht erlaubt. - Produktion läuft über
.github/workflows/deploy.yml(manueller Triggerworkflow_dispatch).
Voraussetzungen:
- GitHub Secret
EXPO_TOKENist gesetzt. - In EAS-Environment
productionist mindestensOPENAI_API_KEYgesetzt.
Workflow-Schritte (vereinfacht):
npm cieas env:exec production 'npx expo export --platform web --no-ssg' --non-interactiveeas deploy --environment production --prod --non-interactive
- Variablen sind pro Deployment gebunden (immutable Deployments).
- Änderungen an Variablen wirken erst nach neuem Export + Deploy.
- Topic in
shared/curriculum/<language>.jsonergänzen. - Prompt in
server/topic-prompts.tsergänzen. - Auf gültige
prerequisitesund eindeutige IDs achten.
- ID in
shared/programming-language.tsergänzen. - Neues Curriculum in
shared/curriculum/anlegen. - Prompt-Mapping in
server/topic-prompts.tsergänzen.
- App-Texte in
client/lib/i18n.tspflegen. - Themen-/Kategorie-Texte bevorzugt im Curriculum (
shared/curriculum/*.json) pflegen.
- Farben/Tokens in
client/constants/theme.ts - Header/Stack-Defaults in
client/hooks/useScreenOptions.ts
- Storage, Settings, Progress in
client/lib/storage.ts
Vor PR/Commit mindestens ausführen:
npm run check:types
npm run lint
npm run check:format
npm testFormatierung automatisch anwenden:
npm run formatMIT, siehe LICENSE.