Homebridge, réécrit en Swift

Tous vos appareils, dans l'app Maison.

Homeswift fait entrer dans HomeKit les lampes, climatiseurs, caméras et serrures qu'Apple n'a jamais certifiés. Un seul petit binaire fait tourner votre config et vos plugins Homebridge, sans Node.js ni npm, et consomme moins de 10 MB au repos.

v0.12.0, version préliminairemacOS 14+ et LinuxLicence MIT

Lampe de bureauAllumé · 70 %
Luminosité70 %
SalonChauffage à 21,5°
19,5°Intérieur
21,5°Chauffer à
60 %
Volet de la chambreOuvert · 60 %
Lampe du porcheAllumé
Machine à caféÉteint
Porte d'entréeVerrouillée
PUT/characteristics {"aid":2,"iid":10,"value":true}

Une démo en direct de l'interface web du pont. Touchez, glissez, ou maintenez la porte. Explorer le système de design →

Performances

Si léger qu'on oublie qu'il tourne.

Le même contrôleur HomeKit a piloté deux ponts avec les mêmes 30 ampoules : Homeswift, et HAP-NodeJS, la bibliothèque au cœur de Homebridge.

HomeswiftHAP-NodeJS 2.2.2

Apple M1, macOS 27.0.1, 21 octobre 2026, une exécution chacun en boucle locale. Sur chaque ligne, plus c'est bas, mieux c'est. Le tableau complet, avec le débit et les lignes où HAP-NodeJS consomme moins de CPU par requête, est dans Benchmarks/README.md.

Sous le capot

Tout ce qu'il faut à un pont. Rien de superflu.

Ajoutez-le avec le code de l'étiquette

Jumelage avec un code à 8 chiffres via SRP-6a, sessions chiffrées sur chaque requête, jusqu'à 16 contrôleurs. Chaque accessoire garde ses identifiants : pièces, scènes et automatisations survivent aux redémarrages.

0052
1956

Votre config Homebridge, telle quelle

Homeswift lit un config.json au format Homebridge. Les plugins gardent leurs noms de plateforme et d'options, les ponts enfants fonctionnent de la même façon, et chaque modification est vérifiée d'après le schéma du plugin avant d'être enregistrée.

Caméras et sonnettes

Vidéo en direct et instantanés via SRTP, enregistrement HomeKit Secure Video, audio bidirectionnel et sonnerie de la sonnette, avec FFmpeg pour l'encodage.

Une interface web à l'image de Maison

Chaque accessoire est un widget sur un mur que vous organisez. État, plugins, config, journaux et sauvegardes sont juste à côté, derrière vos propres comptes, avec l'authentification à deux facteurs si vous le souhaitez.

Un Assistant, si vous en voulez un

Demandez pourquoi une lampe ne répond plus, faites expliquer un journal ou recevez un résumé quotidien. Facultatif, avec un budget, et tout ce qui est sensible est masqué avant d'atteindre un fournisseur.

Votre maison dans Claude et d'autres apps d'IA

Un serveur MCP que claude.ai et les apps Claude ajoutent comme connecteur : vous vous connectez avec votre compte de l'interface web et choisissez ce qu'il peut faire. Toute action destructive demande d'abord confirmation, chaque modification est journalisée, et serrures, portes de garage et alarmes passent par un seul outil protégé.

Tourne là où tourne votre maison

Un conteneur pour amd64 et arm64, un paquet Synology pour DSM 7, ou un simple binaire sur macOS 14 et Linux.

Graphe

Toute votre maison, sur une seule page.

La page Accessoires dessine ce que Homeswift fait tourner sous forme de carte : ses ponts, les plugins de chacun, leurs types d'appareils et chaque accessoire, chaque plugin dans sa couleur avec le logo de sa marque.

  • Cherchez un nom ou une marque, ou filtrez par pont, par type d'appareil ou sur ce qui ne répond pas : le graphe se réorganise autour de ce qui reste.
  • Cliquez sur un nœud pour sa fiche : l'image en direct d'une caméra, les mesures d'un capteur groupées par service, chaque valeur expliquée au survol.
  • Pincez, faites défiler ou cliquez sur une branche pour zoomer ; un tableau donne les mêmes lignes aux lecteurs d'écran.

Plugins

Quatorze plugins, de série.

Dix sont des portages des plugins Homebridge que vous utilisez peut-être déjà ; Philips Hue et IKEA DIRIGERA parlent à leurs ponts sur votre réseau ; Wingman y ajoute les accessoires de l'app Maison ; EcoFlow lit ses stations d'énergie depuis le cloud d'EcoFlow. Chacun est testé face à une simulation de son appareil ou de son cloud.

EK
Elgato Key LightsKey Light, Ring Light
UP
UniFi ProtectCaméras, sonnettes, capteurs
UA
UniFi AccessSerrures et lecteurs
DC
Daikin CloudClimatiseurs
DY
Dyson Pure CoolPurificateurs et ventilateurs
LG
LG ThinQÉlectroménager
PH
Philips Ambilight TVTéléviseur, télécommande
GV
GoveeLampes
HU
Philips HueLampes, scènes, effets
IK
IKEA DIRIGERALampes, prises, capteurs
eW
eWeLinkInterrupteurs et prises Sonoff
DL
DolphinRobots de piscine
EF
EcoFlowStations d'énergie, batteries
WingmanL'app Maison, via un Mac
+
Portez le vôtreDe Node.js à Swift, pas à pas

Installation

Opérationnel en cinq minutes.

# amd64 et arm64. Le réseau de l'hôte permet à HomeKit de trouver le pont par mDNS.
docker run -d --name homeswift --network host \
  --restart unless-stopped \
  -v ~/homeswift:/homeswift \
  ghcr.io/mp-consulting/homeswift:latest
  1. Ouvrez l'interface web

    Sur le port 8581 de la machine où tourne le pont.

  2. Créez votre compte

    Avec le code de configuration que le pont affiche au démarrage.

  3. Ajoutez des plugins

    Choisissez-les sur la page Plugins et remplissez leurs réglages.

  4. Ajoutez le pont dans l'app Maison

    Scannez le code QR de la page État, ou saisissez le code à 8 chiffres.

Pour les développeurs

Une lampe en vingt lignes.

  • Les 73 services et 252 caractéristiques que connaît HomeKit, avec leurs unités, plages et valeurs valides.
  • La concurrence de Swift 6 : les handlers sont async, et une erreur levée se traduit par « Pas de réponse » dans l'app Maison.
  • Définissez une valeur quand l'appareil change, et chaque app Maison abonnée se met à jour.
import Homeswift

let light = Service(.lightbulb, name: "Desk Lamp",
                    optional: [.brightness], isPrimary: true)

light.characteristic(.on).onWrite(changesOnly: true) { value in
    try await lamp.setPower(value.boolValue ?? false)
}

let accessory = Accessory(
    id: "desk-lamp", name: "Desk Lamp",
    manufacturer: "Acme", model: "L1",
    category: .lightbulb, services: [light])

let server = try HAPServer(bridge: bridge, accessories: [accessory],
                           storage: FileStorage(name: "my-bridge"))
print("Setup code:", server.setupCode)  // 1234-5678
try await server.run()