MagicWindows
Open Source · v0.4.0Double 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. 140 commits.
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 V4 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
Binaire natif Windows capable de faire du Win32 / registry / élévation proprement — impossible à atteindre avec Electron sans embarquer Node et Chromium dans le bundle.
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.
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.
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
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 solide, ouvrir un canal web parallèle (downloads R2 + preview interactif) coûte peu mais double la surface de découverte du produit.
Fonctionnalités
Identification du clavier Apple par flux de scancodes — 3 à 5 touches suffisent
Composant `@magicwindows/keyboard-visual` (920 LOC) consommé par 4 pages desktop + 1 page web — single source of truth
KLC → DLL compilé, copie System32, registre HKLM, force-activate sans reboot
Cmd↔Ctrl, Opt↔Cmd, F12 → Calc/Search/Mail via composition Scancode Map — toggles + remaps coexistent (V0.3)
Probe `ToUnicodeEx` via PowerShell + modal live keyboard — vérifie que le layout est bien actif (V0.3)
Auto-détection HID Apple (VID 0x05AC) + polling 2s/5min, redirige vers Detect au pairing (V0.3)
magicwindows.mindvisionstudio.com (Cloudflare Workers) avec preview interactif + 12 ZIPs versionnés sur dl.mindvisionstudio.com (R2 public)
`build.rs` pilote MSVC Hostx64/{x64,arm64} et produit 12 DLLs déterministes — release reproductible byte-identique entre runs