En ligne open source
MagicWindows
Les dispositions du Magic Keyboard d’Apple sur Windows. Natives, gratuites.
La touche Commande du Magic Keyboard devient une touche Windows
En clair
Double canal de distribution : app desktop Tauri/Rust native (NSIS/MSI x64) ET site web Svelte 5 sur Cloudflare Workers avec 12 ZIPs téléchargeables (6 layouts × 2 archs).
Cross-compile x64 + ARM64, i18n EN/FR, monorepo workspaces, 78 tests, 0 erreur TS, 0 warning clippy.
Points forts


-
Détection automatique
Identification du clavier Apple par flux de scancodes : 3 à 5 touches suffisent
-
Aperçu visuel partagé
Composant
@magicwindows/keyboard-visual(920 LOC) consommé par 4 pages desktop + 1 page web : single source of truth -
Installation en un clic
KLC → DLL compilé, copie System32, registre HKLM, force-activate sans reboot
-
Modifier toggles + F12 remap
Cmd↔Ctrl, Opt↔Cmd, F12 → Calc/Search/Mail via composition Scancode Map : toggles + remaps coexistent (V0.3)
-
Health Check post-install
Probe
ToUnicodeExvia PowerShell + modal live keyboard : vérifie que le layout est bien actif (V0.3) -
Bluetooth Pairing Assistant
Auto-détection HID Apple (VID 0x05AC) + polling 2s/5min, redirige vers Detect au pairing (V0.3)
-
Site web SPA + R2 downloads
magicwindows.mindvisionstudio.com (Cloudflare Workers) avec preview interactif + 12 ZIPs versionnés sur dl.mindvisionstudio.com (R2 public)
-
Cross-compile x64 + ARM64
build.rspilote MSVC Hostx64/{x64,arm64} et produit 12 DLLs déterministes : release reproductible byte-identique entre runs
En chiffres
- ~12.7K Lignes
- 78 Tests
- 6 Layouts
- 12 DLLs (x64+ARM64)
- 3 Domaines actifs
Le récit
Pourquoi j’ai construit ça
Le clavier low-profile du MacBook, je n’ai jamais retrouvé ce plaisir de frappe sur un setup Windows classique. La solution évidente : acheter un Magic Keyboard Apple et le brancher en USB. Sauf que le layout ne correspond pas, les modifiers sont inversés, et les solutions du marché (Magic Utilities & co) tournent à 20-30 € par an en abonnement, pour un problème qu’on résout avec quelques écritures dans le registre Windows.
Donc je l’ai fait : en Tauri/Rust natif, open source, installable en un clic, gratuit. La V0.4 a ouvert un second canal : un site web public (Cloudflare Workers) qui sert un preview interactif et héberge 12 ZIPs téléchargeables sur R2, pour ceux qui veulent juste une DLL sans installer le wrapper desktop.
Décisions techniques structurantes
Tauri v2 + Rust côté backend
Binaire natif Windows capable de faire du Win32 / registry / élévation proprement : impossible à atteindre avec Electron sans embarquer Node et Chromium dans le bundle.
KBD DLL C compilée au build, cross-compile x64 + ARM64
Windows refuse une layout purement logique : il veut une DLL dans System32. klc-codegen (968 LOC Rust) génère le C source, build.rs (438 LOC) détecte les deux toolchains MSVC Hostx64/{x64,arm64} et produit 12 DLLs (6 layouts × 2 archs). ARM64 est optionnel : warning si toolchain manquante, build x64 continue.
Composition Scancode Map (V0.3)
Modifier toggles + F12 remap + futurs remaps coexistent dans un seul Scancode Map sans clobber. Tests d’identité byte-à-byte sur la composition. Permet d’ajouter de nouveaux remaps sans casser les précédents.
Monorepo workspaces + double canal desktop/web (V0.4)
Le composant KeyboardVisual (920 LOC) extrait dans @magicwindows/keyboard-visual est consommé par 4 pages desktop + 1 page web : single source of truth. Site web SPA Svelte 5 servi par Cloudflare Workers static-assets, downloads de 12 ZIPs sur R2 derrière dl.mindvisionstudio.com avec custom domain. Pipeline release déterministe (EPOCH mtimes + statConcurrency:1) → ZIPs byte-identiques entre runs si les sources n’ont pas changé.
Le challenge non-trivial
Coordonner l’install à cheval entre élévation et non-élévation
Installer un layout clavier Windows, c’est : une DLL dans C:\Windows\System32 + une clé HKLM\...\Keyboard Layouts\<id> (admin) + une activation HKCU par utilisateur (non-admin).
Un PowerShell élevé ne peut pas écrire fiablement dans le LOCALAPPDATA de l’utilisateur d’origine, et le parent non-élevé ne voit pas le résultat du script admin. La solution dans install.rs : le script PS élevé écrit des markers dans HKLM (seul canal partagé fiable), le parent non-élevé les relit puis effectue l’activation HKCU.
Leçon retenue
Sur Windows, la vraie complexité n’est pas "écrire un fichier clavier" : c’est respecter la frontière élévation / non-élévation. Dès qu’on touche à System32 + HKLM + HKCU dans un même flow, il faut un canal de communication entre les deux mondes (ici HKLM comme boîte aux lettres).
Et une fois le desktop stable, ouvrir un canal web parallèle (downloads R2 + preview interactif) coûte peu mais double la surface de découverte du produit.
Fiche technique
Où ça tourne Tauri 2.10 · Rust 1.77+ · Cloudflare Workers · R2 (public)
| Frontend | Svelte 5.55 (runes mode) · TypeScript 6 strict · Vite 8 · Tauri API |
|---|---|
| Backend | Rust 1.77+ · Tauri 2.10 · winreg · serde_json · KLC Engine |
| Cross-compile | MSVC Hostx64/x64+arm64 · klc-codegen · build.rs déterministe |
| Web SPA | Hash routing · i18n EN/FR réactif · Responsive 3 breakpoints |
| Edge / Infra | Cloudflare Workers · R2 (public) · 2 custom domains · Wrangler 3 |
| Tests / CI | Vitest 2.1 (41 cases) · cargo test (37 cases) · GitHub Actions · cargo clippy clean |