ROOMKIT / SETTINGS STUDY 01
Analyse du dépôt · 11 octobre 2026

ÉTUDE UX / UI · SETTINGS EN PREMIER

Moins de recherche.
Plus de clarté.

RoomKit possède déjà une grande richesse fonctionnelle. Le prochain progrès consiste à rendre cette richesse compréhensible : des réglages regroupés par intention, une hiérarchie calme et des états explicites.

Base analysée 162d9fd14 rubriques actuelles156 réglages par défautApplication native PySide6

01 / LE DIAGNOSTIC

La complexité du produit apparaît trop tôt.

Les Settings suivent aujourd’hui assez directement les modules techniques : AI Provider, STT, TTS, MCP Servers, CLI Tools, Audio Debug, Telemetry, Components. Ce vocabulaire fonctionne pour quelqu’un qui connaît l’architecture. Il impose davantage d’effort à la personne qui cherche simplement à changer de micro, choisir une voix ou activer une dictée locale.

La modernisation doit donc commencer par l’organisation, puis par les composants visuels. Changer les couleurs sans modifier cette structure laisserait les principaux obstacles en place.

Direction proposée

Une fenêtre de réglages redimensionnable, une navigation par usage, une recherche globale, des réglages essentiels lisibles en premier et des détails techniques accessibles à la demande.

Les bases à conserver

La séparation du code par page, les deux palettes existantes, les options conditionnelles par fournisseur, les sections avancées déjà repliables et les indications de composants absents sont de bons points de départ. Le logo possède aussi un indigo distinctif que les Settings peuvent reprendre avec mesure.

Méthode : lecture du code des Settings, du thème, de la fenêtre principale, de la persistance et des tests ; rendu Qt offscreen de General et AI Provider avec configuration isolée. Aucun compte, secret ou paramètre personnel n’a été chargé. Il s’agit d’une analyse experte, pas d’une étude d’usage mesurée auprès d’utilisateurs.

02 / L’INTERFACE ACTUELLE

Beaucoup de champs, peu de niveaux de lecture.

Capture actuelle de General : navigation de quatorze rubriques, apparence, raccourcis, mémoire et traitement audio dans la même page.
General · rendu du code actuel, 880 × 680.
Capture actuelle de AI Provider : mode, fournisseur, clé API, modèle, voix et prompt dans un formulaire vertical.
AI Provider · installation locale avec extras absents.

Dans General, les libellés sont alignés à droite mais les colonnes changent de largeur entre groupes. Le regard se déplace pour retrouver le début des contrôles. Les champs remplissent presque toute la largeur disponible, même pour des choix courts. Les titres de groupe existent, mais leur taille et leur contraste leur donnent peu de poids.

La capture de AI Provider montre un problème de parcours : un même écran demande de comprendre le mode de conversation, un fournisseur, son installation, une clé, un modèle, une voix et les instructions. Ces concepts n’ont ni la même fréquence d’usage ni les mêmes prérequis.

Ces captures représentent une configuration de démonstration sans modèles ni clés personnels. Elles ne montrent pas l’état réel de votre installation. Le rendu offscreen ne reproduit pas exactement le chrome natif de macOS.

03 / LES PROBLÈMES PRIORITAIRES

Ce qui mérite de changer, et pourquoi.

P1 · STRUCTURE01

Quatorze destinations au même niveau

Constat. La barre latérale de 150 px présente General, AI Provider, Attitudes, Speakers, Dictation, Wake Word, AI Models, Skills, MCP Servers, CLI Tools, Audio Debug, Telemetry, Components et About sans groupes ni recherche.

Impact probable. Il faut lire toute la liste et connaître la destination avant de trouver un réglage.

Proposition. Trois groupes stables : Workspace, Capabilities, System. Neuf entrées principales et About en pied de barre. Regrouper les pages proches derrière des sous-sections nommées clairement.

Source : panel.py, construction de la sidebar et de _pages.

P1 · ORGANISATION02

General est devenu une page de débordement

Constat. La page réunit thème, raccourci, mémoire, périphériques, AEC, réduction du bruit, VAD, détection de fin de tour et moteur d’inférence. La mémoire se trouve dans le formulaire du raccourci.

Proposition. General conserve apparence et raccourcis. Audio & voice reçoit les périphériques et le traitement du son. Privacy & memory reçoit l’historique et les enregistrements. Les options de fin de tour retrouvent leur contexte dans Conversation.

Source : general_page.py.

P1 · COMPRÉHENSION03

Le choix du mode exige de connaître le pipeline

Constat. Le choix « Speech-to-Speech (Realtime) » / « Voice Channel (STT → LLM → TTS) » est un menu, puis Voice Channel introduit des onglets STT, LLM, TTS et Agent.

Proposition. Deux choix visibles et expliqués. Realtime : un fournisseur pour une conversation vocale directe. Voice Channel : trois étapes, « Transcription → Intelligence → Speech », avec le fournisseur choisi sous chaque étape. Garder les acronymes dans les détails pour les utilisateurs expérimentés.

Attention. Les fonctions ne sont pas interchangeables : interruptions, détection des tours, débruitage et identification des voix dépendent du chemin audio et du fournisseur.

Sources : voice_setup.py, realtime_section.py, vc_agent_fields.py.

P1 · CONFIANCE04

L’enregistrement n’a pas de retour visible

Constat. SettingsPanel.done() enregistre toutes les pages lorsque la fenêtre se ferme. Échap conserve également les modifications. Il n’y a pas de bouton Save ni d’état global indiquant ce comportement.

Proposition. À court terme, expliciter « Changes are saved when you close Settings ». À terme, un modèle de modifications validées avec retour « Saved » et indication de prise d’effet, notamment à la prochaine session pour le moteur.

Décision de prototype. L’artefact simule une sauvegarde immédiate en mémoire. Ce comportement est une proposition : il n’est pas celui de l’application actuelle. La migration doit traiter ensemble persistance, annulation éventuelle, validation et notifications du moteur.

Sources : panel.py, test_settings_panel.py, tests test_escape_keeps_the_changes et test_every_way_out_saves_exactly_once.

P1 · CONNEXIONS05

Les clés sont répétées dans plusieurs contextes

Constat. Une même clé apparaît dans Realtime, Voice Channel et Dictation. Le code synchronise correctement ces copies avec _link_api_key_fields(), mais la duplication demeure dans l’interface.

Proposition. Providers & keys devient le point d’entrée unique, avec des liens directs depuis les pages concernées. Montrer séparément « component installed », « key added » et « connection tested ». Une clé présente ne prouve pas son fonctionnement.

Contrainte. Ne pas promettre systématiquement « sécurisé dans le trousseau » : SecretStore possède un repli QSettings. Le texte de l’interface doit refléter le backend réellement actif.

Sources : panel.py, settings_secrets.py, secret_store.py.

P1 · PRÉREQUIS06

Modèles et composants imposent des allers-retours

Constat. AI Models gère les fichiers de modèles ; Components gère les dépendances. Un utilisateur peut voir un fournisseur sélectionnable mais absent, ou une liste de modèles vide. Les indications et boutons d’installation existants sont utiles.

Proposition. Une destination Models & components, deux sous-sections clairement expliquées. Un message d’absence doit proposer l’action précise qui manque : télécharger un modèle, installer un composant, ou renseigner une clé. Conserver le choix initial lors de ce détour.

Contrainte. L’action dépend de la distribution : installation automatique, commande à copier ou limitation du bundle. Conserver les conflits entre extras et le besoin éventuel de redémarrage.

Sources : models_page.py, components_page.py, feature_hints.py, components.py.

P2 · VISUEL07

Les éléments ont presque tous le même poids

Constat. Titres à 18 px, formulaires à 14 px et indications souvent à 11–12 px ; les contrôles, les sélecteurs longs et les textes techniques occupent une grande partie de la fenêtre. Des styles locaux répètent les mêmes décisions visuelles.

Proposition. Un titre de page plus marqué, un sous-titre qui explique l’objectif, des sections espacées, des lignes avec intitulé et aide à gauche, des contrôles de largeur adaptée à droite. Les bordures fines délimitent les groupes ; l’accent indigo signale les choix et les actions.

À éviter. Ajouter une carte autour de chaque champ. La carte doit représenter une unité de sens, par exemple « Audio devices ».

Sources : theme.py et styles locaux des pages Settings.

P2 · ACCESSIBILITÉ08

Une fenêtre fixe et des contrôles parfois peu explicites

Constat. Les Settings sont fixés à 880 × 680. Certaines actions d’ajout et retrait utilisent uniquement « + » / « − ». Les indicateurs des cases cochées sont des carrés colorés dans le QSS, sans coche dessinée.

Proposition. Fenêtre redimensionnable avec taille mémorisée, contenu qui s’adapte sans défilement horizontal, noms accessibles pour les boutons, état des interrupteurs annoncé et focus visible. Utiliser des verbes pour les actions importantes : « Add server », « Download », « Configure ».

Limite de l’analyse. Aucun audit VoiceOver/NVDA de l’application native n’a été exécuté. Les risques d’accessibilité sont inférés du code et du rendu ; ils restent à vérifier avec les technologies d’assistance.

Sources : panel.py, mcp_page.py, cli_tools_page.py, theme.py.

P2 · DONNÉES09

La mémoire, les enregistrements et les traces sont dispersés

Constat. La mémoire est dans General ; les enregistrements et captures dans Audio Debug ; les exports dans Telemetry. Ces fonctions répondent aussi à une question commune : qu’est-ce qui est conservé, et où ?

Proposition. Privacy & memory rassemble les décisions de conservation et renvoie vers Diagnostics pour les détails techniques. Toujours distinguer historique texte, audio enregistré et traces exportées. Préciser qu’un historique local n’empêche pas l’envoi de contenu au fournisseur cloud choisi.

Sources : general_page.py, audio_debug_page.py, telemetry_page.py.

P2 · COHÉRENCE10

Les réglages suivent parfois l’implémentation plutôt que l’usage

Constat. Attitudes est une page séparée alors que le choix actif est dans AI Provider. Speakers ressemble au périphérique de sortie audio, mais gère l’identité des interlocuteurs. Wake Word contient aussi une fin automatique qui s’applique aux sessions démarrées manuellement.

Proposition. « Personality & instructions » dans Conversation ; « Speaker recognition » dans Audio & voice ; « Wake word & sessions » dans Dictation & wake word. La recherche reconnaît aussi les anciens libellés pour faciliter la transition.

Sources : attitudes_page.py, speakers_page.py, wakeword_page.py.

04 / LA NOUVELLE ORGANISATION

Des destinations prévisibles.

La proposition conserve la profondeur du produit. Elle réduit le nombre de choix simultanés et fait apparaître les options avancées au moment où elles deviennent utiles.

Rubrique actuelleDestination proposéeCe qui change
GeneralGeneral / Audio & voice / Privacy & memoryRépartir par usage ; garder thème et raccourcis dans General.
AI ProviderConversation + Providers & keysSéparer le comportement de l’assistant de ses connexions.
AttitudesConversation → Personality & instructionsRéunir le choix du ton et sa configuration.
SpeakersAudio & voice → Speaker recognitionDistinguer interlocuteurs et haut-parleurs.
DictationDictation & wake word → DictationConserver un accès direct à la transcription globale.
Wake WordDictation & wake word → Wake word & sessionsExpliquer activation locale et fin de session.
AI ModelsModels & components → Local modelsRapprocher modèles et dépendances.
SkillsIntegrations → SkillsRegrouper les capacités ajoutées à l’assistant.
MCP ServersIntegrations → MCP serversConserver le terme MCP et rendre les états lisibles.
CLI ToolsIntegrations → CLI toolsConserver commande, environnement et portée d’exécution.
Audio DebugDiagnostics + Privacy & memorySéparer diagnostic audio et choix de conservation.
TelemetryDiagnostics → TelemetryRegrouper les fonctions de diagnostic avancées.
ComponentsModels & components → ComponentsMontrer ce qui manque sans faire changer de contexte.
AboutAbout RoomKit en pied de navigationLibérer la liste des réglages quotidiens.

Providers & keys est une nouvelle destination, mais ses données existent déjà. Les identifiants de stockage et les identifiants de fournisseurs peuvent être conservés. Un écran reste la source d’édition de chaque champ ; les autres affichent un résumé et un lien.

05 / LES PARCOURS

Partir d’une tâche concrète.

01

« Je veux que mon micro fonctionne. »

Audio & voice → choisir le microphone → tester → voir le signal → ajuster l’annulation d’écho si nécessaire. VAD et inférence restent repliés. Le test natif devra afficher permission refusée, appareil absent, silence et signal détecté comme des états distincts.

02

« Je veux une dictée locale. »

Dictation → Local → modèle téléchargé ou action de téléchargement → langue → raccourci. Si le composant manque, l’interface indique ce prérequis avant de promettre une dictée opérationnelle. Le choix doit survivre aux allers-retours vers la bibliothèque.

03

« Je veux changer d’assistant. »

Conversation → mode → fournisseur → modèle et voix → état de la connexion. Le mode Voice Channel montre les trois étapes en même temps pour expliquer ce qui peut être remplacé indépendamment.

04

« Où est le réglage que j’utilisais avant ? »

Recherche globale → libellé ou synonyme → destination et sous-section → réglage surligné. Les alias STT, LLM, TTS, Attitudes, VAD et AEC restent trouvables.

06 / LE LANGAGE VISUEL

Un outil de bureau calme et précis.

Surface
#FFFFFF
Navigation
#F9F9FB
Texte
#262633
Accent
#6652BD
Sélection
#EFEBFA
  • Typographie : police système, titre de page à 30 px, hiérarchie par taille, poids et espacement. Les tailles compactes de la maquette sont une direction visuelle ; vérifier les équivalents natifs en points et à fort facteur d’échelle.
  • Géométrie : grille de 4/8 px, groupes espacés de 28 px, rayons de 7 à 12 px. Une largeur de lecture limitée empêche les formulaires de s’étirer indéfiniment.
  • Couleurs : indigo dérivé du logo, utilisé pour sélection, focus et action principale. Le vert accompagne un état écrit ; la couleur ne porte pas seule l’information.
  • Contrôles : thèmes montrés par des aperçus, interrupteurs pour les décisions binaires, sélecteurs pour les choix, boutons avec verbes pour les actions.
  • Adaptation : panneau de résumé secondaire sur grand écran ; il disparaît quand l’espace manque. Navigation mobile repliable dans l’artefact, sans supposer qu’une application mobile est prévue.

Les textes de l’interface restent en anglais pour correspondre au produit actuel. L’analyse est en français pour la revue de design.

07 / LES INTERACTIONS

Chaque choix doit expliquer son état.

Proposition de Settings en thème clair avec navigation regroupée, aperçu des thèmes et lignes de réglages.
Proposition · thème clair.
La même proposition de Settings en thème sombre avec accent indigo et états lisibles.
Proposition · thème sombre.
SujetRègle proposéeDans l’artefact
EnregistrementValidation → confirmation visible → prise d’effet expliquée.État en mémoire ; rechargement = remise à zéro.
Clé APIAbsente / ajoutée / vérification en cours / valide / erreur.Absente ou ajoutée ; aucune vérification réseau.
ModèleAbsent / téléchargement / annulé / présent / erreur.Progression et annulation simulées ; aucun fichier téléchargé.
AudioPériphérique → permission → signal → résultat.Animation explicite de signal simulé.
Option indisponibleExpliquer le prérequis et proposer une action pertinente.Exemple : débruitage réservé à Voice Channel.
NavigationConserver les valeurs et les choix lors des allers-retours.État partagé pour les pages, thèmes et sous-sections.
ConfidentialitéDistinguer mémoire texte, fichiers audio et export de traces.Écrans séparés avec renvois explicites.

Une fonctionnalité avancée ne doit pas disparaître simplement parce qu’elle manque sur la machine. Elle doit rester découvrable, avec son état et la marche à suivre. Inversement, ne pas présenter un fournisseur comme « Connected » à partir de la seule présence d’une clé.

08 / LE PASSAGE À PYSIDE6

Une évolution native, en étapes vérifiables.

L’HTML sert à explorer le design. L’application peut conserver PySide6, QStackedWidget et son moteur actuel. Ce travail ne nécessite pas une réécriture en application web.

  1. Une structure déclarative pour les pages. Remplacer les listes et constantes d’index parallèles par un registre PageSpec avec identifiant stable, groupe, titre, icône, constructeur et hook de rafraîchissement. Les tests actuels signalent précisément le risque d’alignement des indices.
  2. Des composants de Settings partagés. Introduire SettingsSection, SettingRow, StatusBadge, AdvancedSection et des tokens de thème. Réduire les styles locaux, conserver la police native et gérer les changements de palette pour les widgets déjà ouverts.
  3. Une première tranche limitée. Mettre en place la coque redimensionnable et refondre General. Déplacer audio et mémoire en gardant les mêmes clés. Vérifier ouverture, fermeture, raccourcis et conservation des réglages avant de migrer AI Provider.
  4. Un modèle d’édition commun. Centraliser les valeurs partagées et les secrets. Si l’enregistrement immédiat est retenu, définir validation, regroupement des écritures et notification de l’application. Ne pas écrire une valeur invalide à chaque caractère saisi.
  5. Une recherche fondée sur les métadonnées. Indexer libellés, descriptions, alias et destination de focus. Ouvrir la bonne sous-section ou section avancée avant de placer le focus sur le contrôle.
  6. Les connexions et la bibliothèque. Déplacer les clés sans dupliquer leur stockage ; conserver SecretStore. Unifier visuellement modèles et composants tout en gardant leurs opérations et leurs cycles de vie distincts.
  7. Les états asynchrones. Conserver les téléchargements et installations qui survivent à la fermeture. Respecter les protections de durée de vie des widgets, le flux OAuth et les annulations. Un nouveau rendu ne doit pas créer une seconde opération.
Les comportements sensibles à protéger

Échap et fermeture, synchronisation des secrets, choix de modèle non affiché, rafraîchissement des listes, compatibilités des fournisseurs, conflits d’extras, ressources audio et tâches qui continuent hors du dialogue. La modernisation visuelle ne doit pas changer ces règles implicitement.

Références : test_settings_panel.py, test_settings_lifetime.py, test_theme_fonts.py, main_window.py, contraintes du projet.

09 / LA VALIDATION

Mesurer la facilité à accomplir une tâche.

Avant d’étendre le redesign à la conversation principale, faire tester les parcours essentiels sur les Settings. Les critères ci-dessous sont des objectifs proposés, pas des résultats mesurés.

  • Repérage : trouver micro, voix, clé API et mémoire sans parcourir plusieurs pages au hasard ; mesurer temps et erreurs avec l’ancienne et la nouvelle interface.
  • Compréhension : expliquer la différence entre Realtime et Voice Channel après lecture, sans aide extérieure.
  • Configuration : partir d’un fournisseur absent ou d’un modèle non téléchargé et arriver à un état utilisable sans perdre le contexte.
  • Confiance : savoir si un réglage est enregistré, s’il est déjà actif et si une connexion a réellement été testée.
  • Accessibilité : clavier intégral, focus visible, noms et états annoncés, contraste mesuré, texte agrandi à 200 %, thèmes clair/sombre. Tester la fenêtre Qt sur macOS, Windows et Linux.
  • Régression : conserver les tests de persistance, secrets, modèles et durée de vie. Ajouter seulement les tests utiles aux nouveaux comportements.

Le prototype permet de vérifier navigation, recherche, changements de thème, configuration des modes et retours d’état. Il ne permet pas de valider les performances audio ou les différences réelles entre fournisseurs.

10 / PÉRIMÈTRE DE L’ARTEFACT

Une proposition à explorer.

Réalisé : dix destinations dont About, thèmes clair/sombre, recherche avec synonymes français et anglais, navigation clavier, aperçu des deux modes de conversation, personnalité et instructions, choix audio et signal simulé, raccourcis enregistrés dans l’aperçu, dictée, wake word, exemples de clés, téléchargement annulable simulé, composants, création et retrait d’intégrations fictives, confidentialité et diagnostics.

Vérifié dans Chrome : les dix destinations aux largeurs 390, 600, 880, 1024 et 1400 px, sans débordement horizontal ; recherche, changement de sous-section, conservation des valeurs, raccourcis, annulation et fin du téléchargement simulé, intégrations et prérequis du wake word. Commande-K, Entrée et Échap ont été vérifiés par événements clavier. Aucun appel réseau ni exception JavaScript durant les parcours de test. Les cinq combinaisons principales de texte et de fond mesurées ont des contrastes de 4,89:1 à 14,92:1 ; cela ne constitue pas un audit complet de conformité.

Échantillonné : les listes de fournisseurs, modèles, voix et réglages avancés représentent les patterns de design. Elles ne couvrent pas les 156 réglages ni les combinaisons de production. Les personnalisations complètes d’attitudes, les formulaires MCP/OAuth/CLI, le marketplace de skills et tous les profils de fournisseurs restent à détailler lors de l’intégration native.

Isolation : aucune dépendance JavaScript, police externe ou requête réseau. Aucune lecture des réglages de RoomKit, aucune persistance navigateur, aucun accès au microphone, aucun appel IA ou lancement de commande. Les valeurs sont des exemples et sont réinitialisées au rechargement.

Portée globale : le code de la fenêtre principale confirme une largeur fixe de 420 px. Une revue ultérieure pourra traiter la lisibilité des conversations longues, les états de session et les outils intégrés. Ce premier livrable se concentre sur les Settings.

Explorer la proposition →Ouvrir index.html directement dans un navigateur suffit.