ποΈ Part of the oeradio.at open source ham radio tool collection. Browse all tools β oeradio.at/werkzeuge
Q-Gruppen Schnelltrainer - A German-language web app for learning amateur radio Q-codes.
Part of the OERadio open source toolset.
- Multiple Training Modes: Learn Q-codes through various interactive methods
- Spaced Repetition: Intelligent learning algorithm adapts to your progress
- Gamification: Points, streaks, combos, and achievements to keep you motivated
- Offline Support: Full PWA with service worker for offline use
- Dark/Light Mode: Toggle between themes for comfortable studying
- Mobile-First Design: Responsive UI optimized for phones and tablets
- No External Dependencies: System fonts, no tracking, privacy-friendly
Flashcard-style learning with spaced repetition. Cards are scheduled based on your performance:
- Level 0-5 progression system
- Intervals: immediate, 1 day, 3 days, 7 days, 14 days, 30 days
- Wrong answers reduce level by 2 and schedule immediate review
Multiple-choice questions with immediate feedback. Choose from different question types:
- Code to meaning (QTH β "Standort")
- Meaning to code ("Standort" β QTH)
- Question to code ("Was ist Ihr Standort?" β QTH)
Fast-paced timed training against the clock:
- Configurable time limits (30s, 60s, 90s, 120s)
- Combo multiplier for consecutive correct answers
- Highscore tracking
Exam simulation mode:
- Only exam-relevant Q-codes
- No hints or mnemonics
- 70% pass threshold
- Tracks passed exams
Train opposite Q-code pairs:
- QRM β QRN (interference types)
- QRO β QRP (power levels)
- QRS β QRQ (speed requests)
Browse and search all Q-codes:
- Filter by category
- Filter by exam relevance
- View detailed information, examples, and mnemonics
Includes 40+ Q-codes across 8 categories:
- Standort & Richtung: QTH, QRA, QRB, QTE
- Frequenz & Betrieb: QRG, QRV, QRX, QRZ, QSO, QSY, QRT, QRL
- SignalqualitΓ€t: QRK, QRS, QRQ, QSA, QSB
- StΓΆrungen: QRM, QRN
- Technisch: QRO, QRP, QRR
- Nachrichten: QSL, QSP, QTC, QRU
- Zeit: QTR
- Verschiedenes: Additional codes
Each Q-code includes:
- Question form ("Was ist Ihr Standort?")
- Answer form ("Mein Standort ist...")
- Short meaning
- Category classification
- Exam relevance flag
- Optional mnemonic (EselsbrΓΌcke)
- Optional example
- Optional opposite code
- Frontend: React 18 + TypeScript
- Styling: Tailwind CSS
- Build: Vite
- PWA: vite-plugin-pwa with Workbox
- State: LocalStorage persistence
- Fonts: System font stack (no external fonts)
# Install dependencies
npm install
# Start development server
npm run dev
# Type checking
npm run typecheck
# Build for production
npm run build
# Preview production build
npm run preview# Build image
docker build -t qblitz .
# Run container
docker run -p 3000:80 qblitzThen open http://localhost:3000
The app supports runtime configuration via environment variables for white-labeling:
docker run -p 3000:80 \
-e PARENT_SITE_URL="https://example.com" \
-e PARENT_SITE_LOGO="https://example.com/logo.png" \
-e PARENT_SITE_NAME="Example" \
qblitz| Variable | Description |
|---|---|
PARENT_SITE_URL |
Link target for logo and footer attribution |
PARENT_SITE_LOGO |
Logo image URL (displayed in header) |
PARENT_SITE_NAME |
Display name in footer ("Teil von {name} Tools") |
If no environment variables are set, the default config.json is used.
version: '3.8'
services:
qblitz:
build: .
ports:
- "3000:80"
environment:
- PARENT_SITE_URL=https://oeradio.at
- PARENT_SITE_LOGO=https://oeradio.at/logo.png
- PARENT_SITE_NAME=OERadio
restart: unless-stoppedqblitz/
βββ public/
β βββ config.json # Runtime configuration (can be overridden)
β βββ manifest.json # PWA manifest
β βββ icons/ # App icons
βββ src/
β βββ components/
β β βββ common/ # Shared UI components
β β β βββ Button.tsx
β β β βββ Card.tsx
β β β βββ Header.tsx
β β β βββ Footer.tsx
β β β βββ Modal.tsx
β β β βββ Timer.tsx
β β β βββ ProgressBar.tsx
β β β βββ LevelIndicator.tsx
β β β βββ LegalModal.tsx
β β βββ blitz/ # Blitz mode components
β β βββ lern/ # Learning mode components
β β βββ quiz/ # Quiz mode components
β β βββ pruefung/ # Exam mode components
β β βββ gegensaetze/ # Opposites trainer
β β βββ nachschlagewerk/ # Reference browser
β β βββ statistik/ # Statistics & achievements
β β βββ StartBildschirm.tsx
β β βββ Einstellungen.tsx
β βββ data/
β β βββ qgruppen.ts # Q-codes database
β β βββ erfolge.ts # Achievements definitions
β β βββ texte.ts # German UI texts
β βββ hooks/
β β βββ useLocalStorage.ts
β β βββ useLernfortschritt.ts # Spaced repetition logic
β β βββ useSpielstand.ts # Game state & achievements
β β βββ useTimer.ts
β β βββ useEinstellungen.ts # User settings
β β βββ useConfig.ts # Runtime configuration
β βββ utils/
β β βββ spacedRepetition.ts
β β βββ punkte.ts
β βββ types/
β β βββ index.ts
β βββ App.tsx
β βββ main.tsx
β βββ index.css
βββ Dockerfile
βββ docker-compose.yml
βββ docker-entrypoint.sh # Runtime config generation
βββ nginx.conf
βββ tailwind.config.js
βββ vite.config.ts
βββ tsconfig.json
The learning mode uses a modified SM-2 algorithm:
| Level | Interval | Description |
|---|---|---|
| 0 | Immediate | New card |
| 1 | 1 day | First review |
| 2 | 3 days | Beginning retention |
| 3 | 7 days | Short-term memory |
| 4 | 14 days | Medium-term memory |
| 5 | 30 days | Long-term memory (mastered) |
On correct answer: Level increases by 1 (max 5) On wrong answer: Level decreases by 2 (min 0), card scheduled for immediate review
27 achievements across categories:
- Beginner: First steps (first correct answer, first quiz, etc.)
- Progress: Learning milestones (10, 50, 100 Q-codes learned)
- Streaks: Consecutive day streaks (3, 7, 30 days)
- Performance: Accuracy and speed achievements
- Mastery: Completing all Q-codes, perfect scores
- Rare: Special achievements (night owl, early bird)
- No tracking: No analytics, no cookies, no external requests
- Local storage only: All data stays in your browser
- System fonts: No external font loading
- Offline capable: Works without internet after first load
- Chrome/Edge 88+
- Firefox 78+
- Safari 14+
- Mobile browsers (iOS Safari, Chrome for Android)
MIT
Issues and pull requests welcome at GitHub.
Created for the amateur radio community by OE8YML.
73!