matterbridge 3.2.0 → 3.2.1-dev-20250802-f978b33

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (257) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/dist/cli.js +2 -91
  3. package/dist/cliEmitter.js +0 -30
  4. package/dist/clusters/export.js +0 -2
  5. package/dist/defaultConfigSchema.js +0 -24
  6. package/dist/deviceManager.js +1 -94
  7. package/dist/devices/batteryStorage.js +1 -48
  8. package/dist/devices/dishwasher.js +3 -78
  9. package/dist/devices/evse.js +10 -74
  10. package/dist/devices/export.js +0 -2
  11. package/dist/devices/extractorHood.js +0 -42
  12. package/dist/devices/heatPump.js +2 -50
  13. package/dist/devices/laundryDryer.js +6 -83
  14. package/dist/devices/laundryWasher.js +7 -91
  15. package/dist/devices/roboticVacuumCleaner.js +7 -93
  16. package/dist/devices/solarPower.js +0 -38
  17. package/dist/devices/waterHeater.js +2 -82
  18. package/dist/dgram/coap.js +13 -126
  19. package/dist/dgram/dgram.js +2 -113
  20. package/dist/dgram/mb_coap.js +3 -41
  21. package/dist/dgram/mb_mdns.js +13 -51
  22. package/dist/dgram/mdns.js +137 -298
  23. package/dist/dgram/multicast.js +1 -60
  24. package/dist/dgram/unicast.js +0 -54
  25. package/dist/frontend.js +23 -448
  26. package/dist/globalMatterbridge.js +0 -47
  27. package/dist/helpers.js +0 -53
  28. package/dist/index.js +1 -30
  29. package/dist/logger/export.js +0 -1
  30. package/dist/matter/behaviors.js +0 -2
  31. package/dist/matter/clusters.js +0 -2
  32. package/dist/matter/devices.js +0 -2
  33. package/dist/matter/endpoints.js +0 -2
  34. package/dist/matter/export.js +0 -3
  35. package/dist/matter/types.js +0 -3
  36. package/dist/matterbridge.js +50 -805
  37. package/dist/matterbridgeAccessoryPlatform.js +0 -36
  38. package/dist/matterbridgeBehaviors.js +5 -65
  39. package/dist/matterbridgeDeviceTypes.js +15 -579
  40. package/dist/matterbridgeDynamicPlatform.js +0 -36
  41. package/dist/matterbridgeEndpoint.js +55 -1234
  42. package/dist/matterbridgeEndpointHelpers.js +12 -344
  43. package/dist/matterbridgePlatform.js +35 -248
  44. package/dist/matterbridgeTypes.js +0 -25
  45. package/dist/pluginManager.js +3 -249
  46. package/dist/shelly.js +7 -168
  47. package/dist/storage/export.js +0 -1
  48. package/dist/update.js +0 -69
  49. package/dist/utils/colorUtils.js +2 -263
  50. package/dist/utils/commandLine.js +0 -54
  51. package/dist/utils/copyDirectory.js +1 -38
  52. package/dist/utils/createDirectory.js +0 -33
  53. package/dist/utils/createZip.js +2 -47
  54. package/dist/utils/deepCopy.js +0 -39
  55. package/dist/utils/deepEqual.js +1 -72
  56. package/dist/utils/error.js +0 -41
  57. package/dist/utils/export.js +0 -1
  58. package/dist/utils/hex.js +0 -123
  59. package/dist/utils/isvalid.js +0 -101
  60. package/dist/utils/network.js +5 -94
  61. package/dist/utils/spawn.js +0 -40
  62. package/dist/utils/wait.js +9 -62
  63. package/docs/404.html +107 -0
  64. package/docs/HomeAssistant.svg +2 -0
  65. package/docs/Shelly.svg +1 -0
  66. package/docs/Somfy.svg +1 -0
  67. package/docs/Zigbee2MQTT.svg +1 -0
  68. package/docs/_config.yml +86 -0
  69. package/docs/bmc-button.svg +22 -0
  70. package/docs/index.html +774 -0
  71. package/docs/matterbridge.svg +50 -0
  72. package/docs/robots.txt +4 -0
  73. package/npm-shrinkwrap.json +45 -45
  74. package/package.json +5 -3
  75. package/dist/cli.d.ts +0 -26
  76. package/dist/cli.d.ts.map +0 -1
  77. package/dist/cli.js.map +0 -1
  78. package/dist/cliEmitter.d.ts +0 -34
  79. package/dist/cliEmitter.d.ts.map +0 -1
  80. package/dist/cliEmitter.js.map +0 -1
  81. package/dist/clusters/export.d.ts +0 -2
  82. package/dist/clusters/export.d.ts.map +0 -1
  83. package/dist/clusters/export.js.map +0 -1
  84. package/dist/defaultConfigSchema.d.ts +0 -28
  85. package/dist/defaultConfigSchema.d.ts.map +0 -1
  86. package/dist/defaultConfigSchema.js.map +0 -1
  87. package/dist/deviceManager.d.ts +0 -112
  88. package/dist/deviceManager.d.ts.map +0 -1
  89. package/dist/deviceManager.js.map +0 -1
  90. package/dist/devices/batteryStorage.d.ts +0 -48
  91. package/dist/devices/batteryStorage.d.ts.map +0 -1
  92. package/dist/devices/batteryStorage.js.map +0 -1
  93. package/dist/devices/dishwasher.d.ts +0 -91
  94. package/dist/devices/dishwasher.d.ts.map +0 -1
  95. package/dist/devices/dishwasher.js.map +0 -1
  96. package/dist/devices/evse.d.ts +0 -75
  97. package/dist/devices/evse.d.ts.map +0 -1
  98. package/dist/devices/evse.js.map +0 -1
  99. package/dist/devices/export.d.ts +0 -11
  100. package/dist/devices/export.d.ts.map +0 -1
  101. package/dist/devices/export.js.map +0 -1
  102. package/dist/devices/extractorHood.d.ts +0 -46
  103. package/dist/devices/extractorHood.d.ts.map +0 -1
  104. package/dist/devices/extractorHood.js.map +0 -1
  105. package/dist/devices/heatPump.d.ts +0 -47
  106. package/dist/devices/heatPump.d.ts.map +0 -1
  107. package/dist/devices/heatPump.js.map +0 -1
  108. package/dist/devices/laundryDryer.d.ts +0 -87
  109. package/dist/devices/laundryDryer.d.ts.map +0 -1
  110. package/dist/devices/laundryDryer.js.map +0 -1
  111. package/dist/devices/laundryWasher.d.ts +0 -242
  112. package/dist/devices/laundryWasher.d.ts.map +0 -1
  113. package/dist/devices/laundryWasher.js.map +0 -1
  114. package/dist/devices/roboticVacuumCleaner.d.ts +0 -112
  115. package/dist/devices/roboticVacuumCleaner.d.ts.map +0 -1
  116. package/dist/devices/roboticVacuumCleaner.js.map +0 -1
  117. package/dist/devices/solarPower.d.ts +0 -40
  118. package/dist/devices/solarPower.d.ts.map +0 -1
  119. package/dist/devices/solarPower.js.map +0 -1
  120. package/dist/devices/waterHeater.d.ts +0 -111
  121. package/dist/devices/waterHeater.d.ts.map +0 -1
  122. package/dist/devices/waterHeater.js.map +0 -1
  123. package/dist/dgram/coap.d.ts +0 -205
  124. package/dist/dgram/coap.d.ts.map +0 -1
  125. package/dist/dgram/coap.js.map +0 -1
  126. package/dist/dgram/dgram.d.ts +0 -140
  127. package/dist/dgram/dgram.d.ts.map +0 -1
  128. package/dist/dgram/dgram.js.map +0 -1
  129. package/dist/dgram/mb_coap.d.ts +0 -24
  130. package/dist/dgram/mb_coap.d.ts.map +0 -1
  131. package/dist/dgram/mb_coap.js.map +0 -1
  132. package/dist/dgram/mb_mdns.d.ts +0 -24
  133. package/dist/dgram/mb_mdns.d.ts.map +0 -1
  134. package/dist/dgram/mb_mdns.js.map +0 -1
  135. package/dist/dgram/mdns.d.ts +0 -288
  136. package/dist/dgram/mdns.d.ts.map +0 -1
  137. package/dist/dgram/mdns.js.map +0 -1
  138. package/dist/dgram/multicast.d.ts +0 -65
  139. package/dist/dgram/multicast.d.ts.map +0 -1
  140. package/dist/dgram/multicast.js.map +0 -1
  141. package/dist/dgram/unicast.d.ts +0 -56
  142. package/dist/dgram/unicast.d.ts.map +0 -1
  143. package/dist/dgram/unicast.js.map +0 -1
  144. package/dist/frontend.d.ts +0 -313
  145. package/dist/frontend.d.ts.map +0 -1
  146. package/dist/frontend.js.map +0 -1
  147. package/dist/globalMatterbridge.d.ts +0 -59
  148. package/dist/globalMatterbridge.d.ts.map +0 -1
  149. package/dist/globalMatterbridge.js.map +0 -1
  150. package/dist/helpers.d.ts +0 -48
  151. package/dist/helpers.d.ts.map +0 -1
  152. package/dist/helpers.js.map +0 -1
  153. package/dist/index.d.ts +0 -33
  154. package/dist/index.d.ts.map +0 -1
  155. package/dist/index.js.map +0 -1
  156. package/dist/logger/export.d.ts +0 -2
  157. package/dist/logger/export.d.ts.map +0 -1
  158. package/dist/logger/export.js.map +0 -1
  159. package/dist/matter/behaviors.d.ts +0 -2
  160. package/dist/matter/behaviors.d.ts.map +0 -1
  161. package/dist/matter/behaviors.js.map +0 -1
  162. package/dist/matter/clusters.d.ts +0 -2
  163. package/dist/matter/clusters.d.ts.map +0 -1
  164. package/dist/matter/clusters.js.map +0 -1
  165. package/dist/matter/devices.d.ts +0 -2
  166. package/dist/matter/devices.d.ts.map +0 -1
  167. package/dist/matter/devices.js.map +0 -1
  168. package/dist/matter/endpoints.d.ts +0 -2
  169. package/dist/matter/endpoints.d.ts.map +0 -1
  170. package/dist/matter/endpoints.js.map +0 -1
  171. package/dist/matter/export.d.ts +0 -5
  172. package/dist/matter/export.d.ts.map +0 -1
  173. package/dist/matter/export.js.map +0 -1
  174. package/dist/matter/types.d.ts +0 -3
  175. package/dist/matter/types.d.ts.map +0 -1
  176. package/dist/matter/types.js.map +0 -1
  177. package/dist/matterbridge.d.ts +0 -463
  178. package/dist/matterbridge.d.ts.map +0 -1
  179. package/dist/matterbridge.js.map +0 -1
  180. package/dist/matterbridgeAccessoryPlatform.d.ts +0 -42
  181. package/dist/matterbridgeAccessoryPlatform.d.ts.map +0 -1
  182. package/dist/matterbridgeAccessoryPlatform.js.map +0 -1
  183. package/dist/matterbridgeBehaviors.d.ts +0 -1351
  184. package/dist/matterbridgeBehaviors.d.ts.map +0 -1
  185. package/dist/matterbridgeBehaviors.js.map +0 -1
  186. package/dist/matterbridgeDeviceTypes.d.ts +0 -709
  187. package/dist/matterbridgeDeviceTypes.d.ts.map +0 -1
  188. package/dist/matterbridgeDeviceTypes.js.map +0 -1
  189. package/dist/matterbridgeDynamicPlatform.d.ts +0 -42
  190. package/dist/matterbridgeDynamicPlatform.d.ts.map +0 -1
  191. package/dist/matterbridgeDynamicPlatform.js.map +0 -1
  192. package/dist/matterbridgeEndpoint.d.ts +0 -1354
  193. package/dist/matterbridgeEndpoint.d.ts.map +0 -1
  194. package/dist/matterbridgeEndpoint.js.map +0 -1
  195. package/dist/matterbridgeEndpointHelpers.d.ts +0 -406
  196. package/dist/matterbridgeEndpointHelpers.d.ts.map +0 -1
  197. package/dist/matterbridgeEndpointHelpers.js.map +0 -1
  198. package/dist/matterbridgePlatform.d.ts +0 -310
  199. package/dist/matterbridgePlatform.d.ts.map +0 -1
  200. package/dist/matterbridgePlatform.js.map +0 -1
  201. package/dist/matterbridgeTypes.d.ts +0 -197
  202. package/dist/matterbridgeTypes.d.ts.map +0 -1
  203. package/dist/matterbridgeTypes.js.map +0 -1
  204. package/dist/pluginManager.d.ts +0 -270
  205. package/dist/pluginManager.d.ts.map +0 -1
  206. package/dist/pluginManager.js.map +0 -1
  207. package/dist/shelly.d.ts +0 -174
  208. package/dist/shelly.d.ts.map +0 -1
  209. package/dist/shelly.js.map +0 -1
  210. package/dist/storage/export.d.ts +0 -2
  211. package/dist/storage/export.d.ts.map +0 -1
  212. package/dist/storage/export.js.map +0 -1
  213. package/dist/update.d.ts +0 -75
  214. package/dist/update.d.ts.map +0 -1
  215. package/dist/update.js.map +0 -1
  216. package/dist/utils/colorUtils.d.ts +0 -117
  217. package/dist/utils/colorUtils.d.ts.map +0 -1
  218. package/dist/utils/colorUtils.js.map +0 -1
  219. package/dist/utils/commandLine.d.ts +0 -59
  220. package/dist/utils/commandLine.d.ts.map +0 -1
  221. package/dist/utils/commandLine.js.map +0 -1
  222. package/dist/utils/copyDirectory.d.ts +0 -33
  223. package/dist/utils/copyDirectory.d.ts.map +0 -1
  224. package/dist/utils/copyDirectory.js.map +0 -1
  225. package/dist/utils/createDirectory.d.ts +0 -34
  226. package/dist/utils/createDirectory.d.ts.map +0 -1
  227. package/dist/utils/createDirectory.js.map +0 -1
  228. package/dist/utils/createZip.d.ts +0 -39
  229. package/dist/utils/createZip.d.ts.map +0 -1
  230. package/dist/utils/createZip.js.map +0 -1
  231. package/dist/utils/deepCopy.d.ts +0 -32
  232. package/dist/utils/deepCopy.d.ts.map +0 -1
  233. package/dist/utils/deepCopy.js.map +0 -1
  234. package/dist/utils/deepEqual.d.ts +0 -54
  235. package/dist/utils/deepEqual.d.ts.map +0 -1
  236. package/dist/utils/deepEqual.js.map +0 -1
  237. package/dist/utils/error.d.ts +0 -44
  238. package/dist/utils/error.d.ts.map +0 -1
  239. package/dist/utils/error.js.map +0 -1
  240. package/dist/utils/export.d.ts +0 -12
  241. package/dist/utils/export.d.ts.map +0 -1
  242. package/dist/utils/export.js.map +0 -1
  243. package/dist/utils/hex.d.ts +0 -89
  244. package/dist/utils/hex.d.ts.map +0 -1
  245. package/dist/utils/hex.js.map +0 -1
  246. package/dist/utils/isvalid.d.ts +0 -103
  247. package/dist/utils/isvalid.d.ts.map +0 -1
  248. package/dist/utils/isvalid.js.map +0 -1
  249. package/dist/utils/network.d.ts +0 -84
  250. package/dist/utils/network.d.ts.map +0 -1
  251. package/dist/utils/network.js.map +0 -1
  252. package/dist/utils/spawn.d.ts +0 -33
  253. package/dist/utils/spawn.d.ts.map +0 -1
  254. package/dist/utils/spawn.js.map +0 -1
  255. package/dist/utils/wait.d.ts +0 -56
  256. package/dist/utils/wait.d.ts.map +0 -1
  257. package/dist/utils/wait.js.map +0 -1
@@ -0,0 +1,774 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>Matterbridge - Matter Plugin Manager</title>
7
+ <meta name="description" content="Matterbridge is a Matter plugin manager that allows you to have all your Matter devices up and running in minutes.">
8
+ <link rel="icon" type="image/svg+xml" href="matterbridge.svg">
9
+
10
+ <!-- Open Graph / Social Media Meta Tags -->
11
+ <meta property="og:type" content="website">
12
+ <meta property="og:title" content="Matterbridge - Matter Plugin Manager">
13
+ <meta property="og:description" content="Matterbridge is a Matter plugin manager that allows you to have all your Matter devices up and running in minutes.">
14
+ <meta property="og:image" content="https://luligu.github.io/matterbridge/matterbridge.svg">
15
+ <meta property="og:url" content="https://luligu.github.io/matterbridge/">
16
+
17
+ <!-- Twitter Meta Tags -->
18
+ <meta name="twitter:card" content="summary_large_image">
19
+ <meta name="twitter:title" content="Matterbridge - Matter Plugin Manager">
20
+ <meta name="twitter:description" content="Matterbridge is a Matter plugin manager that allows you to have all your Matter devices up and running in minutes.">
21
+ <meta name="twitter:image" content="https://luligu.github.io/matterbridge/matterbridge.svg">
22
+
23
+ <style>
24
+ :root {
25
+ --primary-color: #2563eb;
26
+ --secondary-color: #1e40af;
27
+ --accent-color: #3b82f6;
28
+ --text-primary: #1f2937;
29
+ --text-secondary: #6b7280;
30
+ --background: #ffffff;
31
+ --surface: #f8fafc;
32
+ --border: #e5e7eb;
33
+ --success: #10b981;
34
+ --warning: #f59e0b;
35
+ --error: #ef4444;
36
+ }
37
+
38
+ * {
39
+ margin: 0;
40
+ padding: 0;
41
+ box-sizing: border-box;
42
+ }
43
+
44
+ body {
45
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
46
+ line-height: 1.6;
47
+ color: var(--text-primary);
48
+ background-color: var(--background);
49
+ }
50
+
51
+ .container {
52
+ max-width: 1200px;
53
+ margin: 0 auto;
54
+ padding: 0 2rem;
55
+ }
56
+
57
+ /* Header */
58
+ header {
59
+ background: linear-gradient(135deg, var(--primary-color), var(--secondary-color));
60
+ color: white;
61
+ padding: 2rem 0;
62
+ position: relative;
63
+ overflow: hidden;
64
+ }
65
+
66
+ header::before {
67
+ content: '';
68
+ position: absolute;
69
+ top: 0;
70
+ left: 0;
71
+ right: 0;
72
+ bottom: 0;
73
+ background: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><circle cx="50" cy="50" r="2" fill="rgba(255,255,255,0.1)"/></svg>') repeat;
74
+ opacity: 0.3;
75
+ }
76
+
77
+ .hero {
78
+ text-align: center;
79
+ position: relative;
80
+ z-index: 1;
81
+ }
82
+
83
+ .logo-container {
84
+ display: flex;
85
+ align-items: center;
86
+ justify-content: center;
87
+ gap: 1rem;
88
+ margin-bottom: 2rem;
89
+ }
90
+
91
+ .logo {
92
+ width: 80px;
93
+ height: 80px;
94
+ filter: drop-shadow(0 4px 8px rgba(0, 0, 0, 0.2));
95
+ }
96
+
97
+ .hero h1 {
98
+ font-size: 3.5rem;
99
+ font-weight: 700;
100
+ margin-bottom: 1rem;
101
+ text-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
102
+ }
103
+
104
+ .hero .subtitle {
105
+ font-size: 1.25rem;
106
+ margin-bottom: 2rem;
107
+ opacity: 0.9;
108
+ max-width: 600px;
109
+ margin-left: auto;
110
+ margin-right: auto;
111
+ }
112
+
113
+ .hero-buttons {
114
+ display: flex;
115
+ gap: 1rem;
116
+ justify-content: center;
117
+ flex-wrap: wrap;
118
+ }
119
+
120
+ .btn {
121
+ display: inline-flex;
122
+ align-items: center;
123
+ gap: 0.5rem;
124
+ padding: 0.75rem 1.5rem;
125
+ border-radius: 0.5rem;
126
+ text-decoration: none;
127
+ font-weight: 600;
128
+ transition: all 0.2s ease;
129
+ border: 2px solid transparent;
130
+ }
131
+
132
+ .btn-primary {
133
+ background: white;
134
+ color: var(--primary-color);
135
+ box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
136
+ }
137
+
138
+ .btn-primary:hover {
139
+ transform: translateY(-2px);
140
+ box-shadow: 0 6px 12px rgba(0, 0, 0, 0.15);
141
+ }
142
+
143
+ .btn-secondary {
144
+ background: transparent;
145
+ color: white;
146
+ border-color: white;
147
+ }
148
+
149
+ .btn-secondary:hover {
150
+ background: white;
151
+ color: var(--primary-color);
152
+ }
153
+
154
+ /* Navigation */
155
+ nav {
156
+ background: var(--surface);
157
+ border-bottom: 1px solid var(--border);
158
+ padding: 1rem 0;
159
+ position: sticky;
160
+ top: 0;
161
+ z-index: 100;
162
+ backdrop-filter: blur(10px);
163
+ }
164
+
165
+ .nav-container {
166
+ display: flex;
167
+ justify-content: center;
168
+ flex-wrap: wrap;
169
+ gap: 2rem;
170
+ }
171
+
172
+ .nav-link {
173
+ color: var(--text-primary);
174
+ text-decoration: none;
175
+ font-weight: 500;
176
+ padding: 0.5rem 1rem;
177
+ border-radius: 0.375rem;
178
+ transition: all 0.2s ease;
179
+ }
180
+
181
+ .nav-link:hover {
182
+ background: var(--primary-color);
183
+ color: white;
184
+ transform: translateY(-1px);
185
+ }
186
+
187
+ /* Main Content */
188
+ main {
189
+ padding: 4rem 0;
190
+ }
191
+
192
+ .section {
193
+ margin-bottom: 4rem;
194
+ }
195
+
196
+ .section h2 {
197
+ font-size: 2.5rem;
198
+ font-weight: 700;
199
+ margin-bottom: 1rem;
200
+ color: var(--primary-color);
201
+ text-align: center;
202
+ }
203
+
204
+ .section p {
205
+ font-size: 1.125rem;
206
+ color: var(--text-secondary);
207
+ text-align: center;
208
+ max-width: 800px;
209
+ margin: 0 auto 2rem;
210
+ }
211
+
212
+ /* Features Grid */
213
+ .features-grid {
214
+ display: grid;
215
+ grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
216
+ gap: 2rem;
217
+ margin-top: 3rem;
218
+ }
219
+
220
+ .feature-card {
221
+ background: var(--surface);
222
+ padding: 2rem;
223
+ border-radius: 1rem;
224
+ border: 1px solid var(--border);
225
+ transition: all 0.3s ease;
226
+ text-align: center;
227
+ }
228
+
229
+ .feature-card:hover {
230
+ transform: translateY(-4px);
231
+ box-shadow: 0 12px 24px rgba(0, 0, 0, 0.1);
232
+ border-color: var(--primary-color);
233
+ }
234
+
235
+ .feature-icon {
236
+ width: 60px;
237
+ height: 60px;
238
+ background: linear-gradient(135deg, var(--primary-color), var(--accent-color));
239
+ border-radius: 50%;
240
+ display: flex;
241
+ align-items: center;
242
+ justify-content: center;
243
+ margin: 0 auto 1rem;
244
+ font-size: 1.5rem;
245
+ color: white;
246
+ }
247
+
248
+ .feature-card h3 {
249
+ font-size: 1.25rem;
250
+ font-weight: 600;
251
+ margin-bottom: 0.5rem;
252
+ color: var(--text-primary);
253
+ }
254
+
255
+ .feature-card p {
256
+ color: var(--text-secondary);
257
+ text-align: left;
258
+ font-size: 1rem;
259
+ margin: 0;
260
+ }
261
+
262
+ /* Stats Section */
263
+ .stats {
264
+ background: linear-gradient(135deg, var(--primary-color), var(--secondary-color));
265
+ color: white;
266
+ padding: 4rem 0;
267
+ text-align: center;
268
+ }
269
+
270
+ .stats-grid {
271
+ display: grid;
272
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
273
+ gap: 2rem;
274
+ margin-top: 2rem;
275
+ }
276
+
277
+ .stat-item h3 {
278
+ font-size: 2.5rem;
279
+ font-weight: 700;
280
+ margin-bottom: 0.5rem;
281
+ }
282
+
283
+ .stat-item p {
284
+ opacity: 0.9;
285
+ font-size: 1rem;
286
+ margin: 0;
287
+ }
288
+
289
+ /* Plugins Section */
290
+ .plugins-grid {
291
+ display: grid;
292
+ grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
293
+ gap: 1.5rem;
294
+ margin-top: 3rem;
295
+ }
296
+
297
+ .plugin-card {
298
+ background: white;
299
+ border: 1px solid var(--border);
300
+ border-radius: 0.75rem;
301
+ overflow: hidden;
302
+ transition: all 0.3s ease;
303
+ }
304
+
305
+ .plugin-card:hover {
306
+ transform: translateY(-2px);
307
+ box-shadow: 0 8px 16px rgba(0, 0, 0, 0.1);
308
+ }
309
+
310
+ .plugin-header {
311
+ padding: 1.5rem;
312
+ background: var(--surface);
313
+ display: flex;
314
+ align-items: center;
315
+ gap: 1rem;
316
+ }
317
+
318
+ .plugin-logo {
319
+ width: 40px;
320
+ height: 40px;
321
+ border-radius: 0.5rem;
322
+ }
323
+
324
+ .plugin-content {
325
+ padding: 1.5rem;
326
+ }
327
+
328
+ .plugin-content h3 {
329
+ font-size: 1.125rem;
330
+ font-weight: 600;
331
+ margin-bottom: 0.5rem;
332
+ }
333
+
334
+ .plugin-content p {
335
+ color: var(--text-secondary);
336
+ font-size: 0.875rem;
337
+ margin-bottom: 1rem;
338
+ text-align: left;
339
+ }
340
+
341
+ /* Installation Section */
342
+ .installation {
343
+ background: var(--surface);
344
+ padding: 4rem 0;
345
+ }
346
+
347
+ .code-block {
348
+ background: #1f2937;
349
+ color: #f9fafb;
350
+ padding: 1.5rem;
351
+ border-radius: 0.5rem;
352
+ font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;
353
+ font-size: 0.875rem;
354
+ overflow-x: auto;
355
+ margin: 1rem 0;
356
+ position: relative;
357
+ }
358
+
359
+ .code-block::before {
360
+ content: '$ ';
361
+ color: #10b981;
362
+ font-weight: bold;
363
+ }
364
+
365
+ /* Footer */
366
+ footer {
367
+ background: var(--text-primary);
368
+ color: white;
369
+ padding: 3rem 0 2rem;
370
+ text-align: center;
371
+ }
372
+
373
+ .footer-content {
374
+ display: grid;
375
+ grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
376
+ gap: 2rem;
377
+ margin-bottom: 2rem;
378
+ text-align: left;
379
+ }
380
+
381
+ .footer-section h3 {
382
+ font-size: 1.125rem;
383
+ font-weight: 600;
384
+ margin-bottom: 1rem;
385
+ }
386
+
387
+ .footer-section a {
388
+ color: #d1d5db;
389
+ text-decoration: none;
390
+ display: block;
391
+ margin-bottom: 0.5rem;
392
+ transition: color 0.2s ease;
393
+ }
394
+
395
+ .footer-section a:hover {
396
+ color: white;
397
+ }
398
+
399
+ .footer-bottom {
400
+ border-top: 1px solid #374151;
401
+ padding-top: 2rem;
402
+ text-align: center;
403
+ color: #9ca3af;
404
+ }
405
+
406
+ /* Responsive Design */
407
+ @media (max-width: 768px) {
408
+ .container {
409
+ padding: 0 1rem;
410
+ }
411
+
412
+ .hero h1 {
413
+ font-size: 2.5rem;
414
+ }
415
+
416
+ .nav-container {
417
+ gap: 1rem;
418
+ }
419
+
420
+ .hero-buttons {
421
+ flex-direction: column;
422
+ align-items: center;
423
+ }
424
+
425
+ .features-grid,
426
+ .plugins-grid {
427
+ grid-template-columns: 1fr;
428
+ }
429
+ }
430
+
431
+ /* Animations */
432
+ @keyframes fadeInUp {
433
+ from {
434
+ opacity: 0;
435
+ transform: translateY(30px);
436
+ }
437
+ to {
438
+ opacity: 1;
439
+ transform: translateY(0);
440
+ }
441
+ }
442
+
443
+ .feature-card,
444
+ .plugin-card {
445
+ animation: fadeInUp 0.6s ease forwards;
446
+ }
447
+
448
+ .feature-card:nth-child(2) { animation-delay: 0.1s; }
449
+ .feature-card:nth-child(3) { animation-delay: 0.2s; }
450
+ .feature-card:nth-child(4) { animation-delay: 0.3s; }
451
+ </style>
452
+ </head>
453
+ <body>
454
+ <header>
455
+ <div class="container">
456
+ <div class="hero">
457
+ <div class="logo-container">
458
+ <img src="matterbridge.svg" alt="Matterbridge Logo" class="logo">
459
+ <h1>Matterbridge</h1>
460
+ </div>
461
+ <p class="subtitle">
462
+ A Matter plugin manager that allows you to have all your Matter devices up and running in minutes without dealing with complex pairing processes.
463
+ </p>
464
+ <div class="hero-buttons">
465
+ <a href="https://github.com/Luligu/matterbridge" class="btn btn-primary">
466
+ 🚀 Get Started
467
+ </a>
468
+ <a href="README.md" class="btn btn-secondary">
469
+ 📖 Documentation
470
+ </a>
471
+ <a href="https://www.npmjs.com/package/matterbridge" class="btn btn-secondary">
472
+ 📦 NPM Package
473
+ </a>
474
+ <a href="https://discord.gg/QX58CDe6hd" class="btn btn-secondary">
475
+ 💬 Join Discord
476
+ </a>
477
+ </div>
478
+ </div>
479
+ </div>
480
+ </header>
481
+
482
+ <nav>
483
+ <div class="container">
484
+ <div class="nav-container">
485
+ <a href="#features" class="nav-link">Features</a>
486
+ <a href="#installation" class="nav-link">Installation</a>
487
+ <a href="#plugins" class="nav-link">Plugins</a>
488
+ <a href="README-DEV.md" class="nav-link">Development</a>
489
+ <a href="README-DOCKER.md" class="nav-link">Docker</a>
490
+ <a href="README-SERVICE.md" class="nav-link">Service</a>
491
+ <a href="https://discord.gg/QX58CDe6hd" class="nav-link">Discord</a>
492
+ <a href="https://github.com/Luligu/matterbridge/discussions" class="nav-link">Support</a>
493
+ </div>
494
+ </div>
495
+ </nav>
496
+
497
+ <main>
498
+ <section id="features" class="section">
499
+ <div class="container">
500
+ <h2>Why Choose Matterbridge?</h2>
501
+ <p>Matterbridge simplifies Matter device management with powerful features designed for both developers and users.</p>
502
+
503
+ <div class="features-grid">
504
+ <div class="feature-card">
505
+ <div class="feature-icon">🔌</div>
506
+ <h3>Easy Plugin System</h3>
507
+ <p>Simply pair Matterbridge once, and it will load all your registered plugins. No need to pair each device individually.</p>
508
+ </div>
509
+
510
+ <div class="feature-card">
511
+ <div class="feature-icon">🏠</div>
512
+ <h3>Universal Compatibility</h3>
513
+ <p>Works with Apple Home, Google Home, Amazon Alexa, Home Assistant, SmartThings, and any Matter-compatible platform.</p>
514
+ </div>
515
+
516
+ <div class="feature-card">
517
+ <div class="feature-icon">⚡</div>
518
+ <h3>Lightweight & Fast</h3>
519
+ <p>Runs on machines with as little as 512MB RAM. Perfect for Raspberry Pi and other low-power devices.</p>
520
+ </div>
521
+
522
+ <div class="feature-card">
523
+ <div class="feature-icon">🌐</div>
524
+ <h3>Web Frontend</h3>
525
+ <p>Manage your devices through an intuitive web interface. Monitor logs, configure settings, and control devices easily.</p>
526
+ </div>
527
+
528
+ <div class="feature-card">
529
+ <div class="feature-icon">🔧</div>
530
+ <h3>Developer Friendly</h3>
531
+ <p>Built on matter.js with comprehensive APIs. Easily port Homebridge plugins or create new ones from scratch.</p>
532
+ </div>
533
+
534
+ <div class="feature-card">
535
+ <div class="feature-icon">🐳</div>
536
+ <h3>Docker Ready</h3>
537
+ <p>Full Docker support with official images. Deploy easily with docker-compose or run natively on any platform.</p>
538
+ </div>
539
+ </div>
540
+ </div>
541
+ </section>
542
+
543
+ <div class="stats">
544
+ <div class="container">
545
+ <h2>Trusted by the Community</h2>
546
+ <div class="stats-grid">
547
+ <div class="stat-item">
548
+ <h3>15K+</h3>
549
+ <p>NPM Downloads</p>
550
+ </div>
551
+ <div class="stat-item">
552
+ <h3>1.2K+</h3>
553
+ <p>GitHub Stars</p>
554
+ </div>
555
+ <div class="stat-item">
556
+ <h3>10+</h3>
557
+ <p>Official Plugins</p>
558
+ </div>
559
+ <div class="stat-item">
560
+ <h3>24/7</h3>
561
+ <p>Active Development</p>
562
+ </div>
563
+ </div>
564
+ </div>
565
+ </div>
566
+
567
+ <section id="installation" class="installation">
568
+ <div class="container">
569
+ <h2>Quick Installation</h2>
570
+ <p>Get Matterbridge running in minutes with these simple commands.</p>
571
+
572
+ <h3 style="text-align: center; margin: 2rem 0 1rem; color: var(--primary-color);">NPM Installation</h3>
573
+ <div class="code-block">npm install -g matterbridge --omit=dev</div>
574
+
575
+ <h3 style="text-align: center; margin: 2rem 0 1rem; color: var(--primary-color);">Docker Installation</h3>
576
+ <div class="code-block">docker run -it --name matterbridge -v matterbridge:/root/.matterbridge -p 8283:8283 --network host luligu/matterbridge:latest</div>
577
+
578
+ <div style="text-align: center; margin-top: 2rem;">
579
+ <a href="README.md" class="btn btn-primary">📖 Full Installation Guide</a>
580
+ </div>
581
+ </div>
582
+ </section>
583
+
584
+ <section id="plugins" class="section">
585
+ <div class="container">
586
+ <h2>Popular Plugins</h2>
587
+ <p>Extend Matterbridge with our growing collection of official and community plugins.</p>
588
+
589
+ <div class="plugins-grid">
590
+ <div class="plugin-card">
591
+ <div class="plugin-header">
592
+ <img src="Shelly.svg" alt="Shelly" class="plugin-logo">
593
+ <h3>Shelly Plugin</h3>
594
+ </div>
595
+ <div class="plugin-content">
596
+ <p>Automatically discover and control all Shelly Gen 1, 2, 3, and 4 devices. Supports battery-powered devices, BLU devices, and sleep mode.</p>
597
+ <a href="https://github.com/Luligu/matterbridge-shelly" class="btn btn-primary">Learn More</a>
598
+ </div>
599
+ </div>
600
+
601
+ <div class="plugin-card">
602
+ <div class="plugin-header">
603
+ <img src="Zigbee2MQTT.svg" alt="Zigbee2MQTT" class="plugin-logo">
604
+ <h3>Zigbee2MQTT Plugin</h3>
605
+ </div>
606
+ <div class="plugin-content">
607
+ <p>Expose all your Zigbee2MQTT devices and groups to Matter. Production-level plugin with comprehensive device support.</p>
608
+ <a href="https://github.com/Luligu/matterbridge-zigbee2mqtt" class="btn btn-primary">Learn More</a>
609
+ </div>
610
+ </div>
611
+
612
+ <div class="plugin-card">
613
+ <div class="plugin-header">
614
+ <img src="HomeAssistant.svg" alt="Home Assistant" class="plugin-logo">
615
+ <h3>Home Assistant Plugin</h3>
616
+ </div>
617
+ <div class="plugin-content">
618
+ <p>Connect your Home Assistant devices and entities to Matter. Perfect companion for the official HA add-on.</p>
619
+ <a href="https://github.com/Luligu/matterbridge-hass" class="btn btn-primary">Learn More</a>
620
+ </div>
621
+ </div>
622
+
623
+ <div class="plugin-card">
624
+ <div class="plugin-header">
625
+ <img src="Somfy.svg" alt="Somfy" class="plugin-logo">
626
+ <h3>Somfy Tahoma Plugin</h3>
627
+ </div>
628
+ <div class="plugin-content">
629
+ <p>Control your Somfy Tahoma screen devices through Matter. Seamless integration with your smart home ecosystem.</p>
630
+ <a href="https://github.com/Luligu/matterbridge-somfy-tahoma" class="btn btn-primary">Learn More</a>
631
+ </div>
632
+ </div>
633
+
634
+ <div class="plugin-card">
635
+ <div class="plugin-header">
636
+ <img src="matterbridge.svg" alt="Matterbridge Webhooks" class="plugin-logo">
637
+ <h3>Webhooks Plugin</h3>
638
+ </div>
639
+ <div class="plugin-content">
640
+ <p>Expose any webhooks to Matter. Create virtual devices that can be controlled through HTTP requests, perfect for custom integrations.</p>
641
+ <a href="https://github.com/Luligu/matterbridge-webhooks" class="btn btn-primary">Learn More</a>
642
+ </div>
643
+ </div>
644
+
645
+ <div class="plugin-card">
646
+ <div class="plugin-header">
647
+ <img src="matterbridge.svg" alt="Matterbridge BTHome" class="plugin-logo">
648
+ <h3>BTHome Plugin</h3>
649
+ </div>
650
+ <div class="plugin-content">
651
+ <p>Expose BTHome devices to Matter using native Bluetooth. Works on all platforms with comprehensive device discovery and storage.</p>
652
+ <a href="https://github.com/Luligu/matterbridge-bthome" class="btn btn-primary">Learn More</a>
653
+ </div>
654
+ </div>
655
+ </div>
656
+
657
+ <div style="text-align: center; margin-top: 3rem;">
658
+ <a href="README.md#plugins" class="btn btn-primary">🔌 View All Plugins</a>
659
+ <a href="README-DEV.md" class="btn btn-secondary">🛠️ Create Your Own</a>
660
+ </div>
661
+ </div>
662
+ </section>
663
+ </main>
664
+
665
+ <footer>
666
+ <div class="container">
667
+ <div class="footer-content">
668
+ <div class="footer-section">
669
+ <h3>Documentation</h3>
670
+ <a href="README.md">Getting Started</a>
671
+ <a href="README-DEV.md">Development Guide</a>
672
+ <a href="README-DOCKER.md">Docker Setup</a>
673
+ <a href="README-SERVICE.md">Service Configuration</a>
674
+ <a href="README-NGINX.md">Nginx Setup</a>
675
+ </div>
676
+
677
+ <div class="footer-section">
678
+ <h3>Community</h3>
679
+ <a href="https://github.com/Luligu/matterbridge">GitHub Repository</a>
680
+ <a href="https://github.com/Luligu/matterbridge/discussions">Discussions</a>
681
+ <a href="https://github.com/Luligu/matterbridge/issues">Issue Tracker</a>
682
+ <a href="https://discord.gg/QX58CDe6hd">Discord Server</a>
683
+ </div>
684
+
685
+ <div class="footer-section">
686
+ <h3>Resources</h3>
687
+ <a href="https://www.npmjs.com/package/matterbridge">NPM Package</a>
688
+ <a href="https://hub.docker.com/r/luligu/matterbridge">Docker Hub</a>
689
+ <a href="https://codecov.io/gh/Luligu/matterbridge">Code Coverage</a>
690
+ <a href="https://www.buymeacoffee.com/luligugithub">Support Development</a>
691
+ </div>
692
+
693
+ <div class="footer-section">
694
+ <h3>Connect</h3>
695
+ <a href="https://www.youtube.com/watch?v=goNB9Cgh_Fk">YouTube Demo</a>
696
+ <a href="https://matter-smarthome.de/en/interview/an-alternative-to-the-official-matter-sdk/">Press Coverage</a>
697
+ <a href="https://www.matteralpha.com/how-to/how-to-configure-an-open-source-matter-bridge-at-home">Reviews</a>
698
+ </div>
699
+ </div>
700
+
701
+ <div class="footer-bottom">
702
+ <p>&copy; 2025 Matterbridge. Licensed under Apache-2.0. Built with ❤️ by <a href="https://github.com/Luligu" style="color: #3b82f6;">Luligu</a>.</p>
703
+ </div>
704
+ </div>
705
+ </footer>
706
+
707
+ <script>
708
+ // Smooth scrolling for anchor links
709
+ document.querySelectorAll('a[href^="#"]').forEach(anchor => {
710
+ anchor.addEventListener('click', function (e) {
711
+ e.preventDefault();
712
+ const target = document.querySelector(this.getAttribute('href'));
713
+ if (target) {
714
+ target.scrollIntoView({
715
+ behavior: 'smooth',
716
+ block: 'start'
717
+ });
718
+ }
719
+ });
720
+ });
721
+
722
+ // Add scroll effect to navigation
723
+ window.addEventListener('scroll', function() {
724
+ const nav = document.querySelector('nav');
725
+ if (window.scrollY > 100) {
726
+ nav.style.background = 'rgba(248, 250, 252, 0.95)';
727
+ } else {
728
+ nav.style.background = 'var(--surface)';
729
+ }
730
+ });
731
+
732
+ // Animate stats when they come into view
733
+ const observerOptions = {
734
+ threshold: 0.5,
735
+ rootMargin: '0px 0px -50px 0px'
736
+ };
737
+
738
+ const observer = new IntersectionObserver((entries) => {
739
+ entries.forEach(entry => {
740
+ if (entry.isIntersecting) {
741
+ const statItems = entry.target.querySelectorAll('.stat-item h3');
742
+ statItems.forEach((item, index) => {
743
+ const finalValue = item.textContent;
744
+ const isNumeric = finalValue.match(/\d+/);
745
+ if (isNumeric) {
746
+ animateNumber(item, parseInt(isNumeric[0]), finalValue);
747
+ }
748
+ });
749
+ observer.unobserve(entry.target);
750
+ }
751
+ });
752
+ }, observerOptions);
753
+
754
+ const statsSection = document.querySelector('.stats');
755
+ if (statsSection) {
756
+ observer.observe(statsSection);
757
+ }
758
+
759
+ function animateNumber(element, target, suffix) {
760
+ let current = 0;
761
+ const increment = target / 30;
762
+ const timer = setInterval(() => {
763
+ current += increment;
764
+ if (current >= target) {
765
+ element.textContent = suffix;
766
+ clearInterval(timer);
767
+ } else {
768
+ element.textContent = Math.floor(current) + suffix.replace(/\d+/, '');
769
+ }
770
+ }, 50);
771
+ }
772
+ </script>
773
+ </body>
774
+ </html>