Un overlay élégant, fluide et natif pour Windows. Spotify, Deezer, TIDAL, Apple Music… un seul widget pour les gouverner tous.
⬇️ Télécharger · ✨ Fonctionnalités · 🎨 Presets · 🛠️ Compiler · ❓ FAQ
Wavely est un widget audio flottant et natif pour Windows. Il se pose au-dessus de vos fenêtres et affiche en temps réel ce que vous écoutez — pochette, titre, artiste, progression et une waveform réactive à l'audio réel de votre système.
Pas de plugin. Pas de compte. Pas de configuration API. Wavely écoute directement Windows via GSMTC (métadonnées média) et WASAPI (capture audio en boucle) — pour les applications qu'il reconnaît (voir Compatibilité ci-dessous).
| 🎧 4 lecteurs | ⚡ Réactif | 🎨 Vivant | 🔒 Quasi-privé |
|---|---|---|---|
| Spotify, Deezer, TIDAL, Apple Music |
Backend natif C++ capture WASAPI en direct |
Couleurs extraites de la pochette |
Aucune télémétrie — seule exception : la vérification de mise à jour |
Wavely lit les métadonnées via l'API Windows GSMTC (GlobalSystemMediaTransportControlsSession), mais ne réagit qu'à une liste blanche d'applications de streaming musical natives.
⚠️ Les navigateurs (Chrome, Edge, Brave…) et VLC ne sont pas reconnus, par choix délibéré. Un onglet de navigateur qui joue une vidéo (YouTube Music inclus) déclare sa session GSMTC sous l'identité du navigateur lui-même (ex. AUMID"Brave"), indistinguable de n'importe quel autre contenu joué dans un autre onglet. Il n'existe pas de moyen fiable d'isoler "juste YouTube Music" via cette API — inclure les navigateurs ferait donc réagir Wavely à n'importe quelle vidéo, pas seulement à de la musique.
La liste blanche est un simple tableau côté backend (Core/MusicAppAllowlist.h) — l'ajout d'un lecteur supplémentaire est possible si son AUMID/nom de processus réel est connu et distinct (voir Contribuer).
|
Trois styles de rendu, plus deux effets combinables :
|
La pochette pilote la palette :
|
|
Pas une animation décorative — du vrai audio :
|
Adaptatif et lisible en toutes circonstances :
|
|
|
|
| 🔔 System Tray | Wavely vit discrètement dans la zone de notification. Clic droit → Paramètres, Recharger le widget, Lancer au démarrage, Quitter. |
| 🔄 Lancement au démarrage | Optionnel, activable depuis les Paramètres ou le menu du tray. |
| 🆙 Mise à jour automatique | Vérifie et télécharge les nouvelles versions depuis les GitHub Releases du projet (via Velopack) — au démarrage et depuis l'onglet À propos. Voir Confidentialité. |
| 🌍 Multilingue | Architecture i18n complète (.resx). Français disponible ; autres langues à venir. |
| 🛠️ Dépannage | Bouton Recharger le widget : réinitialise le hook GSMTC et le rendu, accessible depuis chaque section des Paramètres. |
Wavely propose sept dispositions distinctes, sélectionnables dans Paramètres → Apparence.
| Preset | Disposition |
|---|---|
| Compact | Pochette + titre/artiste sur une ligne — l'essentiel, en petit format |
| Boxy | Pochette plus grande en carte, informations et contrôles en dessous |
| Gallery | Mise en page en grille, pochette mise en avant |
| Minimal | Mini-pochette (34 px) + une seule ligne de texte — ultra discret |
| macOS | Barre de titre façon notification média macOS |
| Shell | En-tête sombre façon console/shell |
| Discord | Barre "now playing" façon indicateur d'activité Discord |
💡 Le rendu détaillé de chaque preset (contrôles, waveform, animations play/pause) dépend de sa disposition — tous partagent le même
SettingsViewModel/AppConfig, seul l'affichage change.
1. Téléchargez Wavely-win-Portable.zip (page Releases, lien ci-dessous)
2. Extrayez le dossier où vous voulez
3. Lancez Wavely.App.exe
✅ Aucune installation · ✅ Aucun droit administrateur · ✅ Supprimable en un glisser-déposer
1. Téléchargez Wavely-win-Setup.exe (page Releases, lien ci-dessous)
2. Suivez l'assistant
3. Wavely démarre et s'installe dans le tray
Les deux options sont publiées sur la page Releases du dépôt. L'installeur se met ensuite à jour tout seul (voir Confidentialité) ; la version portable se met à jour de la même façon si vous la relancez régulièrement.
Configuration requise
| 💻 OS | Windows 10 (2004+) ou Windows 11 |
| 🎮 GPU | Recommandé : accélération matérielle pour les effets (glow, flou) |
RAM/disque/CPU précis non encore mesurés formellement pour la version C++ / Avalonia actuelle — à documenter après la campagne de tests de charge (Phase 8 de claude/PLAN.md).
ℹ️ Le dépôt contient encore un ancien prototype C++/Qt6 (
src/,CMakeLists.txtà la racine) issu des toutes premières itérations du projet. Il n'est plus l'implémentation active : l'application réellement construite et distribuée aujourd'hui vit dansbackend/(C++/WinRT) +frontend/(C#/Avalonia), décrite ci-dessous.
| Outil | Version |
|---|---|
| 2022 · workload Desktop development with C++ (MSVC v143 + Windows SDK) | |
| 8.0 | |
dotnet tool install -g vpk (uniquement pour packager un installeur) |
# 1 · Cloner le dépôt
git clone https://github.com/seoloon/wavely.git
cd wavely
# 2 · Restaurer les packages backend (une seule fois)
.\restore-packages.ps1
# 3 · Compiler backend (C++/WinRT) + frontend (Avalonia)
.\build.ps1 # -Configuration Debug (défaut) ou Release
# 4 · Lancer
.\frontend\Wavely.App\bin\Debug\net8.0-windows10.0.19041.0\Wavely.App.exeTous les scripts de build (restore-packages.ps1, build.ps1, package.ps1, release.ps1) vivent à la racine du dépôt — détails complets dans BUILD.md.
📁 Structure du projet
wavely/
├── 📂 backend/Wavely.Backend/ # Composant WinRT (C++20, runtime class .winmd)
│ ├── MediaSessionManager.cpp # Intégration GSMTC + liste blanche
│ ├── WaveformEngine.cpp # Capture WASAPI Loopback + FFT
│ ├── AppConfig.cpp # Persistance JSON (settings.json)
│ ├── AutoStartManager.cpp # Clé registre Run
│ ├── 📂 Core/ # RAII wrappers, ColorExtractor (K-Means), MusicAppAllowlist
│ └── Wavely.Backend.vcxproj
├── 📂 frontend/Wavely.App/ # Application Avalonia (C#/.NET 8)
│ ├── 📂 Views/ # MainWindow (widget), SettingsWindow
│ │ └── 📂 Presets/ # Les 7 dispositions (Compact, Boxy, Gallery, Minimal, macOS, Shell, Discord)
│ ├── 📂 ViewModels/ # SettingsViewModel (CommunityToolkit.Mvvm)
│ ├── 📂 Controls/ # WaveformControl, CoverArtControl, PresetCatalog
│ ├── 📂 Services/ # AppTrayIcon, UpdateService, PlaybackPositionTracker
│ ├── 📂 Resources/ # Strings.resx (i18n)
│ └── Wavely.App.csproj
├── 📂 assets/ # Logo, icône
├── 📂 docs/ # ADR — décisions d'architecture, notes techniques
├── 📂 claude/ # PROMPT.md · PLAN.md · RULES.md (suivi du développement)
├── build.ps1 / package.ps1 / release.ps1 / restore-packages.ps1
└── src/ · CMakeLists.txt # Ancien prototype Qt6 — non actif, voir note ci-dessus
┌──────────────────────────────────────────────────────────────┐
│ BACKEND — Wavely.Backend (C++20 / WinRT .winmd) │
├──────────────────────────────────────────────────────────────┤
│ │
│ ┌────────────────┐ ┌──────────────────┐ │
│ │ GSMTC │ │ WASAPI Loopback │ │
│ │ + Allowlist │ │ (COM/Win32) │ │
│ └───────┬────────┘ └────────┬─────────┘ │
│ │ métadonnées │ PCM brut │
│ │ pochette · état │ │
│ ▼ ▼ │
│ ┌────────────────┐ ┌──────────────────┐ │
│ │ MediaSession │ │ Ring Buffer │ │
│ │ Manager │ │ lock-free │ │
│ └───────┬────────┘ └────────┬─────────┘ │
│ │ │ │
│ ▼ ▼ │
│ ┌────────────────┐ ┌──────────────────┐ │
│ │ ColorExtractor │ │ WaveformEngine │ │
│ │ K-Means │ │ FFT · 20 bandes │ │
│ └───────┬────────┘ └────────┬─────────┘ │
│ │ palette │ spectre │
└───────────┼──────────────────────────────┼───────────────────┘
│ Microsoft.Windows.CsWinRT (projection C#) │
┌───────────┼──────────────────────────────┼───────────────────┐
│ ▼ ▼ │
│ ┌───────────────────────┐ │
│ │ SettingsViewModel │ │
│ │ (CommunityToolkit) │ │
│ └───────────┬───────────┘ │
│ ▼ │
│ ┌───────────────────────┐ │
│ │ Preset View (AXAML) │ │
│ └───────────┬───────────┘ │
│ ▼ │
│ ┌───────────────────────┐ │
│ │ MainWindow (Widget) │ │
│ │ Avalonia · frameless │ │
│ └───────────────────────┘ │
│ FRONTEND — Wavely.App (C# / .NET 8 / Avalonia UI) │
└──────────────────────────────────────────────────────────────┘
| 🔐 RAII intégral (backend) | Chaque handle système est wrappé (Core/Handle.h, ComPtr.h, RegistryKey.h) |
| 🧵 Capture audio isolée | WASAPI Loopback tourne sur son propre thread, publie via un ring buffer lock-free |
| 🎯 Séparation stricte | Backend = 100 % C++/WinRT (logique métier, accès système) · Frontend = 100 % C#/Avalonia (UI) |
| 🛡️ Zéro warning backend | Compilé en /W4 sans tolérance |
| 🆙 Mises à jour vérifiables | Distribution via Velopack + GitHub Releases, pas de serveur privé |
| 🌐 Une connexion réseau | Au démarrage et depuis l'onglet À propos, Wavely interroge les GitHub Releases du projet (via Velopack/GithubSource) pour savoir si une nouvelle version existe, et la télécharge si vous l'acceptez. Cette vérification n'est pas encore désactivable depuis les Paramètres. |
| 🚫 Aucune télémétrie | Pas d'analytics, pas de crash reporting distant, aucune donnée d'usage envoyée. |
| 🚫 Aucun enregistrement | Les buffers audio WASAPI sont traités en mémoire pour la FFT puis jetés. Rien n'est écrit sur le disque. |
| ✅ Données locales | Vos préférences (position, thème, preset…) sont stockées dans %AppData%\Wavely\settings.json, lues/écrites uniquement par le backend. |
| ✅ Open source | Le code est intégralement auditable. |
| Statut | Version | Contenu |
|---|---|---|
| ✅ | 0.2.0 (actuelle) | 7 presets · waveform WASAPI · couleurs dynamiques · tray · paramètres complets · mise à jour automatique |
| 🚧 | Phase 8 | Robustesse (edge cases, gestion mémoire, tests de charge), mesures RAM/CPU réelles, build Release final |
| 📋 | 1.x | 🌍 Anglais, Espagnol, Allemand · éditeur de presets visuel · désactivation de la vérification de mise à jour |
| 💭 | (à l'étude) | Raccourcis clavier globaux · profils multi-écrans · thèmes communautaires |
✅ Publié · 🚧 En cours · 📋 Planifié · 💭 À l'étude — suivi détaillé phase par phase dans claude/PLAN.md.
La waveform ne bouge pas, pourquoi ?
Wavely capture la sortie audio par défaut de Windows. Si votre lecteur envoie le son vers un autre périphérique (casque USB, sortie HDMI…), changez le périphérique de sortie par défaut dans les paramètres son de Windows, puis cliquez sur Recharger le widget.
La pochette ne s'affiche pas
Wavely ne réagit qu'à Spotify, Deezer, TIDAL et Apple Music (voir Compatibilité) — les navigateurs et VLC ne sont pas reconnus. Si l'app est bien l'une de ces quatre et que la pochette reste absente, Wavely affiche un visuel de repli et utilise la palette du thème actif.
Pourquoi YouTube Music / VLC / mon navigateur ne fonctionne pas ?
C'est un choix délibéré, pas un bug : un onglet de navigateur déclare sa session média sous l'identité du navigateur, indistinguable de n'importe quel autre contenu joué dans un autre onglet. Réagir aux navigateurs ferait donc réagir Wavely à n'importe quelle vidéo, pas seulement à de la musique. Voir Compatibilité.
Comment désactiver le Click-Through une fois activé ?
Le widget ne réagit plus aux clics — c'est normal. Ouvrez les paramètres via l'icône du tray → Paramètres → Comportement et désactivez l'option.
Wavely fonctionne-t-il en jeu / plein écran ?
Oui en mode fenêtré et fenêtré sans bordure. En plein écran exclusif, Windows empêche tout overlay tiers de s'afficher — c'est une limitation du système, pas de Wavely.
Quel est l'impact sur les performances ?
Le backend (capture GSMTC/WASAPI, FFT, extraction de couleurs) est du C++20 natif. Le frontend est une application .NET 8/Avalonia : plus léger qu'un overlay basé sur un navigateur embarqué (pas d'Electron/Chromium), mais avec le runtime .NET habituel — pas "zéro runtime". Des chiffres RAM/CPU précis pour cette architecture seront publiés après la campagne de tests de charge (voir Roadmap).
Puis-je créer mon propre preset ?
Pas encore facilement : les 7 presets actuels sont des vues Avalonia compilées (C#/AXAML), pas des fichiers de configuration externes. Un éditeur de presets visuel est envisagé pour une version ultérieure (voir Roadmap).
Les contributions sont les bienvenues !
# Convention de commits : Conventional Commits
feat: nouvelle fonctionnalité
fix: correction de bug
perf: amélioration de performance
refactor: refonte sans changement fonctionnel
docs: documentation
chore: maintenance, build, dépendancesAvant toute Pull Request, merci de lire claude/RULES.md — les règles de développement du projet (stack autorisée, conventions de nommage, exigences de performance et de qualité).
| 🐛 Un bug ? | Ouvrir une issue |
| 💡 Une idée ? | Proposer une fonctionnalité |
| 💬 Une question ? | Démarrer une discussion |
Distribué sous licence MIT — voir le fichier LICENSE.md.
Avalonia UI · Microsoft.Windows.CsWinRT · CommunityToolkit.Mvvm · Velopack · nlohmann/json
Et à toutes les personnes qui testent, signalent et améliorent Wavely. 💜