25ed765a03
6 Wochen uncommittete Arbeit (Voice-Channels, LiveKit-Manager, Settings-Modal u.v.m.) als ein WIP-Commit gesichert, damit nichts verloren geht und der Pi den aktuellen Stand klonen kann. Thematische Aufarbeitung: siehe ROADMAP M0. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CPrAGBxBT6GfPXzeWQ4AXb
20 KiB
20 KiB
Pyramid — Feature-Checklist & Implementierungsstand
Stand: Mai 2026
Legende: ✅ Fertig | ⚠️ Teilweise / Bug | ❌ Fehlt | 🔧 In Arbeit
Inhaltsverzeichnis
- Authentifizierung
- Raumliste
- Chat / Timeline
- Nachrichtentypen
- Nachrichtenfunktionen
- Direct Messages
- E2EE Verschlüsselung
- Push Notifications
- VoIP & Calls
- Settings / Einstellungen
- Benutzerprofil
- Raum-Einstellungen
- Suche
- Medien
- Read Receipts & Typing
- Spaces
- Windows / Desktop
- Sonstige Features
- Dokumentations-Vollständigkeit
Authentifizierung
| Feature | Status | Details / Datei |
|---|---|---|
| Login mit Passwort | ✅ | login_page.dart, login_notifier.dart |
| Homeserver-Auswahl | ✅ | server_page.dart — HTTPS-Prefix fix, .well-known Autodiscovery |
| Session wiederherstellen (init) | ✅ | matrix_client.dart — client.init() beim App-Start |
| Logout | ✅ | Via Matrix SDK client.logout() |
| Login-Redirect nach Init | ✅ | router.dart — StreamProvider-basierter Guard |
| SSO / OAuth | ❌ | Nicht implementiert |
| Registrierung / Account erstellen | ❌ | Keine UI |
| Login mit Token | ❌ | Nur Passwort-Login |
| Multi-Account | ❌ | Nur ein Account gleichzeitig |
| UIAA Re-Auth (Passwort ändern) | ❌ | Kein UI |
Raumliste
| Feature | Status | Details / Datei |
|---|---|---|
| Raumliste anzeigen | ✅ | rooms_page.dart, room_list_item.dart |
| Sortierung nach letzter Aktivität | ✅ | In rooms_provider.dart |
| Avatar-Anzeige (MXC) | ✅ | mxc_image.dart |
| Vorschautext (letztes Event) | ✅ | room_list_item.dart |
| Ungelesen-Badge | ✅ | notificationCount |
| Ungelesen-Punkt (kein Count) | ✅ | Bei notificationCount == 0 aber ungelesen |
| Zeitstempel-Formatierung | ✅ | Heute: HH:MM, andere: DD.MM |
DM-Erkennung (isDirectChat) |
✅ | Typ-Differenzierung in Liste |
| Space-Filterung | ✅ | SpacesRail filtert nach aktiver Space |
| Einladungen anzeigen | ⚠️ | Membership.invite vorhanden, gesonderte Ansicht fehlt |
| Raum suchen / filtern | ✅ | Via search_modal.dart |
| Archivierte Räume | ❌ | Kein UI für left-rooms |
| Raum erstellen (Knopf) | ✅ | create_join_dialog.dart |
| Raum beitreten (Alias) | ✅ | create_join_dialog.dart |
Chat / Timeline
| Feature | Status | Details / Datei |
|---|---|---|
| Nachrichten anzeigen | ✅ | message_bubble.dart, message_group.dart |
| Gruppen-Bubbles (gleicher Sender) | ✅ | Continuation-Nachrichten (eingerückt, kein Avatar) |
| Datums-Trenner | ✅ | Tagstrennlinie |
| Ungelesen-Trenner ("Neue Nachrichten") | ✅ | fullyRead-Position |
| Scroll-to-Unread beim Öffnen | ✅ | chat_view.dart |
| History-Nachladen beim Scrollen | ✅ | _onScroll() → requestHistory(60) |
| Optimistische Nachrichtenanzeige | ✅ | SDK fügt Event mit Status sending ein |
| Nachrichtenstatus (senden/sent) | ✅ | Uhren-Icons |
Timeline-Cleanup (cancelSubscriptions) |
✅ | In dispose() |
| Sprung zu bestimmtem Event | ⚠️ | Infrastruktur vorhanden, kein UI |
| Event-Suche in Timeline | ❌ | Nur globale Suche |
Nachrichtentypen
| Typ | Status | Details |
|---|---|---|
Text (m.text) |
✅ | Vollständig |
Bild (m.image) |
✅ | Thumbnail + Vollansicht mit Zoom |
Video (m.video) |
✅ | Playback via media_kit |
Audio (m.audio) |
✅ | Player mit Progress/Dauer |
Datei (m.file) |
✅ | Download mit MIME-Icon |
Sticker (m.sticker) |
✅ | Anzeige und Senden (Sticker-Picker) |
| Sprachnachricht (MSC3245) | ⚠️ | Audio-Aufnahme fehlt, Abspielen funktioniert |
Standort (m.location) |
❌ | Nicht implementiert |
Emote (m.emote) |
❌ | Kein gesondertes Rendering |
| Poll (MSC3381) | ❌ | Nicht implementiert |
| Verschlüsselte Nachrichten | ✅ | Automatisch via SDK, Fehler-UI vorhanden |
| Redacted-Events | ⚠️ | Wird angezeigt, kein "Nachricht gelöscht"-Platzhalter |
Nachrichtenfunktionen
| Feature | Status | Details / Datei |
|---|---|---|
| Antworten (Reply) | ✅ | Swipe-Geste + Quote-Anzeige |
| Reaktionen (Emojis) | ✅ | Quick-Picker + vollständiger Emoji-Picker |
| Reaktionen entfernen | ⚠️ | UI zum Entfernen fehlt |
| Nachrichten bearbeiten (Edit) | ⚠️ | getDisplayEvent() vorhanden, Senden nicht im UI |
| Nachricht löschen (Redact) | ❌ | Kein Button / Dialog |
| Threads | ❌ | Nicht implementiert |
| Polls | ❌ | Nicht implementiert |
| Weitersenden (Forward) | ❌ | Nicht implementiert |
| Kopieren (Text) | ⚠️ | Nicht explizit sichtbar |
| Long-Press Auswahl-Modus | ✅ | message_bubble.dart — Long-Press aktiviert Selection |
| Bulk-Aktionen (Auswahl) | ⚠️ | Modus vorhanden, Aktionen begrenzt |
| Pinned Messages Panel | ✅ | pinned_messages_panel.dart |
| Pins setzen (UI-Aktion) | ❌ | Kein Pin-Button in Nachricht |
| Linkvorschau | ❌ | Keine URL-Preview |
| Mention-Links klickbar | ✅ | @user-Links via url_launcher |
Direct Messages
| Feature | Status | Details / Datei |
|---|---|---|
| Neuen DM starten | ✅ | new_dm_dialog.dart → startDirectChat() |
| User-Verzeichnis-Suche | ✅ | searchUserDirectory() |
| DM-Erkennung in Raumliste | ✅ | room.isDirectChat |
| Partner-Avatar/Name | ✅ | directChatMatrixID → Profil laden |
| DM-Verschlüsselung | ✅ | Standard E2EE bei DM-Erstellung |
| Gruppen-DM | ⚠️ | Erstellbar, kein gesondertes UI |
| DM vergessen / verlassen | ⚠️ | Kein UI-Button |
| DM-spezifische Notification-Sounds | ❌ | Nicht implementiert |
E2EE Verschlüsselung
| Feature | Status | Details / Datei |
|---|---|---|
| Vodozemac Rust-Crypto | ✅ | flutter_vodozemac initialisiert in matrix_client.dart |
| E2EE in verschlüsselten Räumen | ✅ | Automatisch via SDK |
| Bootstrap-Flow (SSSS + Cross-Signing) | ✅ | bootstrap_dialog.dart — vollständige State-Machine |
| Cross-Signing Setup | ✅ | Master-, Self- und User-Signing-Key Erstellung |
| Key Backup (online) | ✅ | SSSS-gesichertes Backup |
| Schlüssel-Verifikation (SAS/Emoji) | ✅ | Via Bootstrap-Flow |
| QR-Code-Verifikation | ⚠️ | SDK-Support vorhanden, kein UI |
| Device-Liste anzeigen | ❌ | Kein UI |
| Gerät sperren/blockieren | ❌ | Kein UI |
| Fehlende Schlüssel anfordern | ✅ | requestMissingSessionKeys() bei Bad-Encrypted |
| Entschlüsselungs-Fehler-UI | ✅ | "Nachricht konnte nicht entschlüsselt werden" + Schlüssel-Button |
| Schlüssel importieren/exportieren | ❌ | Kein UI (Infrastruktur vorhanden) |
Push Notifications
| Feature | Status | Details / Datei |
|---|---|---|
| FCM Token Registrierung | ✅ | fcm_push_service.dart |
| Pusher auf Homeserver | ✅ | postPusher() mit Sygnal-Gateway |
| Token-Refresh Handling | ✅ | onTokenRefresh.listen() |
| PushService.kt (native FCM) | ✅ | Läuft auch bei geschlossener App |
| Benachrichtigung bei geschlossener App | 🔧 | APK neu gebaut, noch nicht getestet |
| Absender-Name in Notification | ✅ | HTTP-Fetch von Matrix API in PushService.kt |
| Verschlüsselte Nachricht entschlüsseln | ⚠️ | "Neue Nachricht" bei geschlossener App; decryptAndUpdateNotification bei Hintergrund-App |
| Inline Reply in Notification | 🔧 | ReplyReceiver auf getActivity umgestellt — APK gebaut, ungetestet |
| Antwort wirklich abschicken | 🔧 | replyFromNotification MethodChannel — APK gebaut, ungetestet |
| Gelesen-Button in Notification | ✅ | ACTION_DISMISS über ReplyReceiver.kt |
| Notification bei Hintergrund-App | ✅ | Heartbeat-Check verhindert Duplikate |
| Notification-Kanal Android | ✅ | pyramid_messages, HIGH Importance |
| Stabile Notification-ID | ✅ | stableId(roomId) — gleicher Algo in Kotlin + Dart |
| Windows Notification | ✅ | local_notifier (Windows Toast) |
| Windows Taskbar Flash | ✅ | WindowsTaskbar.setProgressMode() |
| Ausstehende Reply beim App-Öffnen senden | ✅ | _sendPendingReply() bei Resume + Sync |
| Push Rules konfigurieren | ❌ | Kein UI |
| Raum stumm schalten | ❌ | Kein UI |
| Nur-Erwähnung-Modus | ✅ | notifMentionOnlyDmProvider — Preferences |
| iOS Push | ❌ | Kein iOS-Build |
| Web Push | ❌ | Kein Web-Build |
VoIP & Calls
| Feature | Status | Details / Datei |
|---|---|---|
| Matrix WebRTC Legacy-Calls | ✅ | voip_manager.dart — CallSession |
| LiveKit SFU-Calls | ✅ | livekit_call_manager.dart |
| Unified Call-UI | ✅ | voice_channel.dart |
| Audio-Call | ✅ | Mikrofon + Speaker |
| Video-Call | ✅ | Kamera + Remote-Video |
| Screen-Sharing | ✅ | screen_share_picker.dart |
| Video-Qualitätsstufen | ✅ | SD/HD/FHD/4K Presets |
| Mute-Toggle | ✅ | setMicrophoneEnabled() |
| Deafen-Toggle | ✅ | Audio komplett stumm |
| Kamera-Toggle | ✅ | setCameraEnabled() |
| Kamera-Wechsel (Front/Rück) | ⚠️ | SDK-Support vorhanden |
| Teilnehmer-Grid | ✅ | Mehrere Participants anzeigen |
| Lokale Video-Vorschau | ✅ | Overlay-Widget |
| Klingel-System (to-device) | ⚠️ | Infrastruktur vorhanden, Klingelton fehlt |
| Incoming-Call-UI | ⚠️ | Kein dediziertes Klingel-Screen |
| Call-History | ❌ | Nicht implementiert |
| TURN-Server via Matrix | ⚠️ | getTurnServer() — ob konfiguriert unklar |
| Hintergrund-Foreground-Service | ✅ | FlutterForegroundService via webrtc |
| MatrixRTC Membership-Events | ✅ | io.pyramid.voice.presence State-Events |
| LiveKit-Token-Exchange | ✅ | livekit_token.dart |
Settings / Einstellungen
| Feature | Status | Details / Datei |
|---|---|---|
| Settings-Seite (Hauptseite) | ⚠️ | settings_page.dart — NUR PLATZHALTER |
| Settings Modal | ✅ | settings_modal.dart — vollständiger Modal |
| Dark/Light Mode | ✅ | themeModeProvider + Toggle |
| Akzentfarbe (5 Presets) | ✅ | Amber/Coral/Mint/Violet/Cobalt/Lime |
| Eckenradius Slider | ✅ | radiusProvider |
| UI-Motion Toggle | ✅ | motionProvider |
| UI-Density Toggle | ✅ | densityProvider |
| Desktop Notifications | ✅ | notifDesktopProvider |
| Notification Sound | ✅ | notifSoundProvider |
| Nachrichtenvorschau | ✅ | notifPreviewProvider |
| Nur-Erwähnung-Modus | ✅ | notifMentionOnlyDmProvider |
| Presence anzeigen (Online) | ✅ | privacyPresenceProvider |
| Read Receipts senden | ✅ | privacyReadReceiptsProvider |
| Typing-Indikator senden | ✅ | privacyTypingProvider |
| Profil bearbeiten (Name/Avatar) | ❌ | Kein UI |
| Geräte-Verwaltung | ❌ | Kein UI |
| Session-Liste | ❌ | Kein UI |
| Passwort ändern | ❌ | Kein UI |
| Account löschen | ❌ | Kein UI |
| Raumspezifische Benachrichtigungen | ❌ | Kein UI |
| Sprache / Lokalisierung | ❌ | Nur Systemsprache |
| Barrierefreiheit | ❌ | Keine Einstellungen |
Benutzerprofil
| Feature | Status | Details / Datei |
|---|---|---|
| Avatar anzeigen (MXC) | ✅ | mxc_image.dart überall |
| Displayname auflösen | ✅ | Fallback auf @username |
| Online-Präsenz senden | ✅ | setPresence(online) alle 10s in app_shell.dart |
| Präsenz-Anzeige anderer User | ⚠️ | Infrastruktur, kein UI |
| Profil-Popover (Hover-Karte) | ✅ | profile_popover.dart |
| Eigenes Profil bearbeiten | ❌ | Kein UI |
| Avatar hochladen | ❌ | Kein UI |
| Status-Nachricht | ❌ | Nicht implementiert |
| User ignorieren / blockieren | ❌ | Kein UI |
| User melden | ❌ | Kein UI |
Raum-Einstellungen
| Feature | Status | Details / Datei |
|---|---|---|
| Space-Admin Panel (Name/Avatar/Banner) | ✅ | space_admin_dialog.dart — Overview-Tab |
| Power-Level-Editor (Mitglieder) | ✅ | space_admin_dialog.dart — Members-Tab |
| Permissions-Tab (Raum-PLs) | ✅ | space_admin_dialog.dart — Permissions-Tab |
| Kind-Räume verwalten | ✅ | space_admin_dialog.dart — Channels-Tab |
| Raum-Name ändern (normaler Raum) | ❌ | Kein UI |
| Raum-Thema ändern | ❌ | Kein UI |
| Raum-Avatar ändern | ❌ | Kein UI |
| Join-Rules ändern | ❌ | Kein UI |
| History-Visibility ändern | ❌ | Kein UI |
| E2EE aktivieren | ❌ | Kein UI |
| Raum-Alias verwalten | ❌ | Kein UI |
| Raum verlassen (Button) | ❌ | Kein UI |
| Raum vergessen (forget) | ❌ | Kein UI |
| User einladen (aus Chat) | ❌ | Kein UI |
| Kick / Ban (Moderation) | ❌ | Kein UI |
Suche
| Feature | Status | Details / Datei |
|---|---|---|
| Server-seitige Nachrichtensuche | ✅ | search_modal.dart → /search API |
| Lokale Raum-/DM-Suche | ✅ | Filter auf client.rooms |
| Personen-Suche | ✅ | Lokale DM-Partner-Suche |
| Medien-Filter (Bilder/Videos/Audio) | ✅ | search_modal.dart |
| Paginierung (nextBatch) | ✅ | Infinite scroll |
| Suchergebnis-Highlighting | ✅ | Suchbegriff hervorheben |
| Debounced Query (400ms) | ✅ | debounce in Suchfeld |
| Öffentliches Raumverzeichnis | ❌ | Kein UI zum Entdecken |
| User-Verzeichnis-Suche (global) | ✅ | In new_dm_dialog.dart |
Medien
| Feature | Status | Details / Datei |
|---|---|---|
| Bild senden | ✅ | MatrixImageFile + Upload |
| Bild anzeigen (Thumbnail + Vollbild) | ✅ | MediaViewer mit Zoom/Pan |
| Video senden | ✅ | |
| Video abspielen | ✅ | media_kit |
| Audio senden | ✅ | |
| Audio abspielen | ✅ | Player mit Progress |
| Datei senden | ✅ | MatrixFile |
| Datei herunterladen | ✅ | MIME-Icon + Browser-Öffner |
| Clipboard-Bild einfügen (Windows) | ✅ | FFI + clipboard_image.dart |
| Drag & Drop Upload (Desktop) | ✅ | desktop_drop |
| GIF-Picker (Giphy) | ✅ | Trending + Suche + Favoriten |
| Sticker-Picker | ✅ | Pack-Browser |
| Bild-Komprimierung | ✅ | shrinkImageMaxDimension |
| Verschlüsselte Medien | ✅ | Automatisch bei E2EE-Räumen |
| Sprachnachricht aufnehmen | ❌ | Kein Recorder |
| Kamera direkt (in App) | ❌ | Nur Gallery-Picker |
| Dokument-Vorschau | ❌ | Kein PDF-Viewer |
| Media-Galerie (Raum-Mediathek) | ❌ | Kein UI |
Read Receipts & Typing
| Feature | Status | Details / Datei |
|---|---|---|
| Read Receipts senden | ✅ | setReadMarker() (privacy-gesteuert) |
| Eigene ✓✓ Bestätigung | ✅ | Anzeige auf eigenen Nachrichten |
| Read-Marker anderer anzeigen | ⚠️ | Position-Marker vorhanden, kein Avatar-Stack |
| Typing-Indikator senden | ✅ | 7s Auto-Timeout |
| Typing-Indikator empfangen | ✅ | Anzeige-Platzhalter |
| Typing-User-Namen anzeigen | ⚠️ | Platzhalter, keine Namen |
Spaces
| Feature | Status | Details / Datei |
|---|---|---|
Space-Erkennung (isSpace) |
✅ | |
| Spaces-Rail (Sidebar) | ✅ | spaces_rail.dart |
| Space-Filterung der Raumliste | ✅ | Nur Räume der aktiven Space |
| Space-Admin Panel | ✅ | space_admin_dialog.dart |
| Space erstellen | ✅ | create_join_dialog.dart |
| Kind-Räume hinzufügen | ✅ | In Space-Admin |
| Kind-Räume entfernen | ✅ | In Space-Admin |
| Voice-Präsenz in Space | ✅ | io.pyramid.voice.presence Events |
| Space-Banner | ✅ | Mit Crop-Dialog |
| Verschachtelte Spaces | ⚠️ | Anzeige, kein eigener Sub-Space-Rail |
| Space beitreten (öffentlich) | ⚠️ | Technisch möglich, kein Discovery-UI |
Windows / Desktop
| Feature | Status | Details / Datei |
|---|---|---|
| Windows Build | ✅ | CMake + MSIX |
| Windows Notifications | ✅ | local_notifier |
| Taskbar Flash | ✅ | WindowsTaskbar |
| Update-Checker (Gitea API) | ✅ | update_checker.dart — 4h Intervall |
| Update-Banner | ✅ | update_banner.dart |
| Update-Download | ✅ | update_download_dialog.dart |
| APK Auto-Install (Android) | ✅ | Kotlin MethodChannel + FileProvider |
| PC Update (exe/msix) Download | ⚠️ | Release-Script pusht .zip statt .exe → öffnet Git-Seite |
| Drag & Drop | ✅ | desktop_drop |
| Clipboard Paste (Bild) | ✅ | FFI Windows API |
| Resizable Sidebar | ✅ | panel_layout.dart — Drag-Divider |
| Keyboard Shortcuts | ⚠️ | Enter zum Senden, Ctrl+V — kein vollständiges System |
| System Tray | ❌ | Nicht implementiert |
| Fenster-Badge (ungelesen) | ⚠️ | Nur Taskbar-Flash, kein Zähler |
| macOS / Linux | ❌ | Nicht gebaut/getestet |
Sonstige Features
| Feature | Status | Details / Datei |
|---|---|---|
| Emoji-Picker | ✅ | Kategorisiert + Suche |
| Quick-Reaktionen (6 Emojis) | ✅ | Hover-Aktionsleiste |
| Mitglieder-Panel (Raum) | ✅ | members/ — Teilnehmerliste |
| Profil-Popover (Hover) | ✅ | profile_popover.dart |
| Neuer-DM Dialog | ✅ | new_dm_dialog.dart |
| Raum-erstellen Dialog | ✅ | create_join_dialog.dart |
| Nachricht-Auswahl-Modus | ✅ | Long-Press |
| Reply-Swipe-Geste | ✅ | Rechts-wischen zum Antworten |
| Immersive-Mode (Android) | ✅ | Status-Bar ausgeblendet |
| PyramidLoader (Ladeanimation) | ✅ | pyramid_loader.dart |
| Rich-Text-Editor | ❌ | Kein Markdown/Formatting-UI |
| HTML-Nachrichtenrendering | ❌ | Kein flutter_html |
| Message Forwarding | ❌ | |
| Nachrichtenübersetzung | ❌ | |
Bot-Kommandos (/) |
❌ | |
| Matrix-URI Handler | ❌ | Kein Deep-Link-Handler |
| Barcode/QR-Scanner | ⚠️ | Nur in Verifikation |
Dokumentations-Vollständigkeit
| Doku-Abschnitt | Vollständig | Anmerkungen |
|---|---|---|
| 01 Auth | ✅ | SSO, UIAA, alle Login-Flows |
| 02 Räume | ✅ | Create, Join, Spaces, Power Levels |
| 03 Nachrichten | ✅ | Text, Replies, Edits, Threads, Polls |
| 04 DMs | ✅ | Alle DM-Flows |
| 05 Medien | ✅ | Upload, Download, alle Dateitypen |
| 06 E2EE | ✅ | Setup, SAS, Cross-Signing, Key Backup |
| 07 Push | ✅ | FCM, Push Rules, Pyramid-Architektur |
| 08 VoIP | ✅ | Legacy m.call, MatrixRTC |
| 08b LiveKit | ✅ | KOMPLETT — Server-Setup bis Flutter-UI |
| 09 Profil | ✅ | Presence, Account-Data, Tags |
| 10 Room-Admin | ✅ | Power Levels, Moderation, ACL, Synapse Admin |
| 11 Suche | ✅ | Event-Suche, User-Suche, Raumverzeichnis |
| 12 Schnellreferenz | ✅ | Alle Enums, Widget-Patterns, Fehlerhandling |
Prioritäts-Roadmap
🔴 Kritisch (bald testen/fixen)
- Notification-Reply testen — Neue APK (getActivity-Fix) installieren und Reply-Flow verifizieren
- Benachrichtigung bei geschlossener App — Mit neuer APK testen (PushService.kt Ansatz)
- PC Update-Script —
.zipdurch.exe-Installer ersetzen inscripts/release.ps1
🟠 Wichtig (nächste Features)
- Nachricht löschen (Redact) — Long-Press-Menü →
event.redactEvent() - Nachricht bearbeiten — Edit-Modus im Composer →
sendTextEvent(editEventId:...) - Raum-Einstellungen — Name/Thema/Avatar für normale Räume (
room.setName()etc.) - Profil bearbeiten — Displayname + Avatar in Settings
- Registrierung — Account-Erstellung im Onboarding
🟡 Sinnvoll (mittelfristig)
- Einladungen-Screen — Pending invites sichtbar darstellen
- Kick/Ban UI — Moderation aus der Mitgliederliste
- Device-Verwaltung — Eigene Sessions anzeigen + löschen
- Rich-Text-Editor — Markdown/Formatierung in Nachrichten
- Klingelton bei eingehendem Call — Audio + dedizierter Klingel-Screen
- Lautlos/Stumm per Raum — Push-Rules im UI
🟢 Nice-to-have
- Sprachnachrichten aufnehmen
- HTML-Nachrichtenrendering (
flutter_html) - Matrix-URI Deep-Links
- Media-Galerie pro Raum
- System Tray (Windows)
- Polls / Abstimmungen