diff --git a/components/README.md b/components/README.md
index 1e73887..3f99f96 100644
--- a/components/README.md
+++ b/components/README.md
@@ -13,28 +13,28 @@ Hver fysisk komponenttype får sit eget stabile id og en mappe med:
## Registrerede komponenter
-| Komponent | Type | Interface | Produkt-id | Sketches |
-| --- | --- | --- | --- | --- |
-| [LCD1602 med PCF8574T](lcd1602-i2c-pcf8574/README.md) | Output/display | I²C | – | [`lcd1602_i2c_demo`](../sketches/arduino-uno-r4-wifi/lcd1602_i2c_demo) |
-| [RGB LED](keyestudio-ks0032-rgb-led/README.md) | Output/lys | Digital/PWM | KS0032 | – |
-| [Mikrofon](keyestudio-ks0035-microphone/README.md) | Input/lyd | Analog | KS0035 | – |
-| [IR-modtager](keyestudio-ks0026-ir-receiver/README.md) | Input/IR | Digital | KS0026 | – |
-| [Analog temperatursensor](keyestudio-ks0033-thermistor/README.md) | Input/temperatur | Analog | KS0033 | – |
-| [DS18B20-temperatursensor](keyestudio-ks0023-ds18b20/README.md) | Input/temperatur | 1-Wire | KS0023 | – |
-| [Tiltsensor](keyestudio-ks0025-tilt/README.md) | Input/orientering | Digital | KS0025 | – |
-| [Aktiv buzzer](keyestudio-ks0018-active-buzzer/README.md) | Output/lyd | Digital | KS0018 | – |
-| [Laser-emitter](keyes-ke2054-laser-emitter/README.md) | Output/lys | Digital | KE2054 | – |
-| [Analog rotationssensor](keyestudio-ks0014-analog-rotation/README.md) | Input/position | Analog | KS0014 | – |
-| [Trykknap](keyestudio-ks0029-push-button/README.md) | Input/kontakt | Digital | KS0029 | – |
-| [IR-sender](keyestudio-ks0027-ir-transmitter/README.md) | Output/IR | Digital/PWM | KS0027 | – |
-| [Passiv buzzer](keyestudio-ks0019-passive-buzzer/README.md) | Output/lyd | Digital/tone | KS0019 | – |
-| [Knock-sensor](keyestudio-ks0024-knock/README.md) | Input/slag | Digital | KS0024 | – |
-| [Reed switch](keyestudio-ks0038-reed-switch/README.md) | Input/magnet | Digital | KS0038 | – |
-| [Pulssensor](keyestudio-ks0015-pulse-rate/README.md) | Input/optisk | Analog | KS0015 | – |
-| [Vibrationssensor](keyestudio-ks0037-vibration/README.md) | Input/vibration | Digital | KS0037 | – |
-| [Fotomodstandssensor](keyestudio-ks0028-photocell/README.md) | Input/lys | Analog | KS0028 | – |
-| [LM35-temperatursensor](keyestudio-ks0022-lm35/README.md) | Input/temperatur | Analog | KS0022 | – |
-| [Collision-/endestopsensor](keyestudio-ks0021-collision/README.md) | Input/kontakt | Digital | KS0021 | – |
+| Foto | Komponent | Type | Interface | Produkt-id | Sketches |
+| --- | --- | --- | --- | --- | --- |
+| – | [LCD1602 med PCF8574T](lcd1602-i2c-pcf8574/README.md) | Output/display | I²C | – | [`lcd1602_i2c_demo`](../sketches/arduino-uno-r4-wifi/lcd1602_i2c_demo) |
+|
| [RGB LED](keyestudio-ks0032-rgb-led/README.md) | Output/lys | Digital/PWM | KS0032 | – |
+|
| [Mikrofon](keyestudio-ks0035-microphone/README.md) | Input/lyd | Analog | KS0035 | – |
+|
| [IR-modtager](keyestudio-ks0026-ir-receiver/README.md) | Input/IR | Digital | KS0026 | – |
+|
| [Analog temperatursensor](keyestudio-ks0033-thermistor/README.md) | Input/temperatur | Analog | KS0033 | – |
+|
| [DS18B20-temperatursensor](keyestudio-ks0023-ds18b20/README.md) | Input/temperatur | 1-Wire | KS0023 | – |
+|
| [Tiltsensor](keyestudio-ks0025-tilt/README.md) | Input/orientering | Digital | KS0025 | – |
+|
| [Aktiv buzzer](keyestudio-ks0018-active-buzzer/README.md) | Output/lyd | Digital | KS0018 | – |
+|
| [Laser-emitter](keyes-ke2054-laser-emitter/README.md) | Output/lys | Digital | KE2054 | – |
+|
| [Analog rotationssensor](keyestudio-ks0014-analog-rotation/README.md) | Input/position | Analog | KS0014 | – |
+|
| [Trykknap](keyestudio-ks0029-push-button/README.md) | Input/kontakt | Digital | KS0029 | – |
+|
| [IR-sender](keyestudio-ks0027-ir-transmitter/README.md) | Output/IR | Digital/PWM | KS0027 | – |
+|
| [Passiv buzzer](keyestudio-ks0019-passive-buzzer/README.md) | Output/lyd | Digital/tone | KS0019 | – |
+|
| [Knock-sensor](keyestudio-ks0024-knock/README.md) | Input/slag | Digital | KS0024 | – |
+|
| [Reed switch](keyestudio-ks0038-reed-switch/README.md) | Input/magnet | Digital | KS0038 | – |
+|
| [Pulssensor](keyestudio-ks0015-pulse-rate/README.md) | Input/optisk | Analog | KS0015 | – |
+|
| [Vibrationssensor](keyestudio-ks0037-vibration/README.md) | Input/vibration | Digital | KS0037 | – |
+|
| [Fotomodstandssensor](keyestudio-ks0028-photocell/README.md) | Input/lys | Analog | KS0028 | – |
+|
| [LM35-temperatursensor](keyestudio-ks0022-lm35/README.md) | Input/temperatur | Analog | KS0022 | – |
+|
| [Collision-/endestopsensor](keyestudio-ks0021-collision/README.md) | Input/kontakt | Digital | KS0021 | – |
## Navngivning
diff --git a/components/keyes-ke2054-laser-emitter/README.md b/components/keyes-ke2054-laser-emitter/README.md
index 64a114a..253d292 100644
--- a/components/keyes-ke2054-laser-emitter/README.md
+++ b/components/keyes-ke2054-laser-emitter/README.md
@@ -1,5 +1,7 @@
# Keyes KE2054 laser-emittermodul
+
+
## Identifikation
| Felt | Værdi |
diff --git a/components/keyes-ke2054-laser-emitter/image.webp b/components/keyes-ke2054-laser-emitter/image.webp
new file mode 100644
index 0000000..078f508
Binary files /dev/null and b/components/keyes-ke2054-laser-emitter/image.webp differ
diff --git a/components/keyes-ke2054-laser-emitter/thumbnail.webp b/components/keyes-ke2054-laser-emitter/thumbnail.webp
new file mode 100644
index 0000000..d51e86b
Binary files /dev/null and b/components/keyes-ke2054-laser-emitter/thumbnail.webp differ
diff --git a/components/keyestudio-ks0014-analog-rotation/README.md b/components/keyestudio-ks0014-analog-rotation/README.md
index c634323..1eb3457 100644
--- a/components/keyestudio-ks0014-analog-rotation/README.md
+++ b/components/keyestudio-ks0014-analog-rotation/README.md
@@ -1,5 +1,7 @@
# Keyestudio KS0014 analog rotationssensor
+
+
## Identifikation
| Felt | Værdi |
diff --git a/components/keyestudio-ks0014-analog-rotation/image.webp b/components/keyestudio-ks0014-analog-rotation/image.webp
new file mode 100644
index 0000000..3896122
Binary files /dev/null and b/components/keyestudio-ks0014-analog-rotation/image.webp differ
diff --git a/components/keyestudio-ks0014-analog-rotation/thumbnail.webp b/components/keyestudio-ks0014-analog-rotation/thumbnail.webp
new file mode 100644
index 0000000..31790bf
Binary files /dev/null and b/components/keyestudio-ks0014-analog-rotation/thumbnail.webp differ
diff --git a/components/keyestudio-ks0015-pulse-rate/README.md b/components/keyestudio-ks0015-pulse-rate/README.md
index 6bfce3d..ef993dd 100644
--- a/components/keyestudio-ks0015-pulse-rate/README.md
+++ b/components/keyestudio-ks0015-pulse-rate/README.md
@@ -1,5 +1,7 @@
# Keyestudio KS0015 pulssensor
+
+
## Identifikation
| Felt | Værdi |
diff --git a/components/keyestudio-ks0015-pulse-rate/image.webp b/components/keyestudio-ks0015-pulse-rate/image.webp
new file mode 100644
index 0000000..7551fbc
Binary files /dev/null and b/components/keyestudio-ks0015-pulse-rate/image.webp differ
diff --git a/components/keyestudio-ks0015-pulse-rate/thumbnail.webp b/components/keyestudio-ks0015-pulse-rate/thumbnail.webp
new file mode 100644
index 0000000..94c93b8
Binary files /dev/null and b/components/keyestudio-ks0015-pulse-rate/thumbnail.webp differ
diff --git a/components/keyestudio-ks0018-active-buzzer/README.md b/components/keyestudio-ks0018-active-buzzer/README.md
index 4a3a21e..881a44f 100644
--- a/components/keyestudio-ks0018-active-buzzer/README.md
+++ b/components/keyestudio-ks0018-active-buzzer/README.md
@@ -1,5 +1,7 @@
# Keyestudio KS0018 aktiv buzzer
+
+
## Identifikation
| Felt | Værdi |
diff --git a/components/keyestudio-ks0018-active-buzzer/image.webp b/components/keyestudio-ks0018-active-buzzer/image.webp
new file mode 100644
index 0000000..976f4e0
Binary files /dev/null and b/components/keyestudio-ks0018-active-buzzer/image.webp differ
diff --git a/components/keyestudio-ks0018-active-buzzer/thumbnail.webp b/components/keyestudio-ks0018-active-buzzer/thumbnail.webp
new file mode 100644
index 0000000..a873f7d
Binary files /dev/null and b/components/keyestudio-ks0018-active-buzzer/thumbnail.webp differ
diff --git a/components/keyestudio-ks0019-passive-buzzer/README.md b/components/keyestudio-ks0019-passive-buzzer/README.md
index 67d7492..e4ea35c 100644
--- a/components/keyestudio-ks0019-passive-buzzer/README.md
+++ b/components/keyestudio-ks0019-passive-buzzer/README.md
@@ -1,5 +1,7 @@
# Keyestudio KS0019 passiv buzzer
+
+
## Identifikation
| Felt | Værdi |
diff --git a/components/keyestudio-ks0019-passive-buzzer/image.webp b/components/keyestudio-ks0019-passive-buzzer/image.webp
new file mode 100644
index 0000000..7280400
Binary files /dev/null and b/components/keyestudio-ks0019-passive-buzzer/image.webp differ
diff --git a/components/keyestudio-ks0019-passive-buzzer/thumbnail.webp b/components/keyestudio-ks0019-passive-buzzer/thumbnail.webp
new file mode 100644
index 0000000..13ecbed
Binary files /dev/null and b/components/keyestudio-ks0019-passive-buzzer/thumbnail.webp differ
diff --git a/components/keyestudio-ks0021-collision/README.md b/components/keyestudio-ks0021-collision/README.md
index 698f16e..88cddc0 100644
--- a/components/keyestudio-ks0021-collision/README.md
+++ b/components/keyestudio-ks0021-collision/README.md
@@ -1,5 +1,7 @@
# Keyestudio KS0021 collision-/endestopsensor
+
+
## Identifikation
| Felt | Værdi |
diff --git a/components/keyestudio-ks0021-collision/image.webp b/components/keyestudio-ks0021-collision/image.webp
new file mode 100644
index 0000000..dc62af8
Binary files /dev/null and b/components/keyestudio-ks0021-collision/image.webp differ
diff --git a/components/keyestudio-ks0021-collision/thumbnail.webp b/components/keyestudio-ks0021-collision/thumbnail.webp
new file mode 100644
index 0000000..29b3222
Binary files /dev/null and b/components/keyestudio-ks0021-collision/thumbnail.webp differ
diff --git a/components/keyestudio-ks0022-lm35/README.md b/components/keyestudio-ks0022-lm35/README.md
index f888350..2014e30 100644
--- a/components/keyestudio-ks0022-lm35/README.md
+++ b/components/keyestudio-ks0022-lm35/README.md
@@ -1,5 +1,7 @@
# Keyestudio KS0022 LM35-temperatursensor
+
+
## Identifikation
| Felt | Værdi |
diff --git a/components/keyestudio-ks0022-lm35/image.webp b/components/keyestudio-ks0022-lm35/image.webp
new file mode 100644
index 0000000..6bf5a38
Binary files /dev/null and b/components/keyestudio-ks0022-lm35/image.webp differ
diff --git a/components/keyestudio-ks0022-lm35/thumbnail.webp b/components/keyestudio-ks0022-lm35/thumbnail.webp
new file mode 100644
index 0000000..e34ba79
Binary files /dev/null and b/components/keyestudio-ks0022-lm35/thumbnail.webp differ
diff --git a/components/keyestudio-ks0023-ds18b20/README.md b/components/keyestudio-ks0023-ds18b20/README.md
index bd0ad2c..8d846c1 100644
--- a/components/keyestudio-ks0023-ds18b20/README.md
+++ b/components/keyestudio-ks0023-ds18b20/README.md
@@ -1,5 +1,7 @@
# Keyestudio KS0023 DS18B20-temperatursensor
+
+
## Identifikation
| Felt | Værdi |
diff --git a/components/keyestudio-ks0023-ds18b20/image.webp b/components/keyestudio-ks0023-ds18b20/image.webp
new file mode 100644
index 0000000..96afc57
Binary files /dev/null and b/components/keyestudio-ks0023-ds18b20/image.webp differ
diff --git a/components/keyestudio-ks0023-ds18b20/thumbnail.webp b/components/keyestudio-ks0023-ds18b20/thumbnail.webp
new file mode 100644
index 0000000..bdb147e
Binary files /dev/null and b/components/keyestudio-ks0023-ds18b20/thumbnail.webp differ
diff --git a/components/keyestudio-ks0024-knock/README.md b/components/keyestudio-ks0024-knock/README.md
index eabe14e..5756ae0 100644
--- a/components/keyestudio-ks0024-knock/README.md
+++ b/components/keyestudio-ks0024-knock/README.md
@@ -1,5 +1,7 @@
# Keyestudio KS0024 knock-sensor
+
+
## Identifikation
| Felt | Værdi |
diff --git a/components/keyestudio-ks0024-knock/image.webp b/components/keyestudio-ks0024-knock/image.webp
new file mode 100644
index 0000000..e43960a
Binary files /dev/null and b/components/keyestudio-ks0024-knock/image.webp differ
diff --git a/components/keyestudio-ks0024-knock/thumbnail.webp b/components/keyestudio-ks0024-knock/thumbnail.webp
new file mode 100644
index 0000000..f3a3b0e
Binary files /dev/null and b/components/keyestudio-ks0024-knock/thumbnail.webp differ
diff --git a/components/keyestudio-ks0025-tilt/README.md b/components/keyestudio-ks0025-tilt/README.md
index 07aff6d..6a7de80 100644
--- a/components/keyestudio-ks0025-tilt/README.md
+++ b/components/keyestudio-ks0025-tilt/README.md
@@ -1,5 +1,7 @@
# Keyestudio KS0025 digital tiltsensor
+
+
## Identifikation
| Felt | Værdi |
diff --git a/components/keyestudio-ks0025-tilt/image.webp b/components/keyestudio-ks0025-tilt/image.webp
new file mode 100644
index 0000000..7fd9323
Binary files /dev/null and b/components/keyestudio-ks0025-tilt/image.webp differ
diff --git a/components/keyestudio-ks0025-tilt/thumbnail.webp b/components/keyestudio-ks0025-tilt/thumbnail.webp
new file mode 100644
index 0000000..1efa5f5
Binary files /dev/null and b/components/keyestudio-ks0025-tilt/thumbnail.webp differ
diff --git a/components/keyestudio-ks0026-ir-receiver/README.md b/components/keyestudio-ks0026-ir-receiver/README.md
index 6b92743..983e077 100644
--- a/components/keyestudio-ks0026-ir-receiver/README.md
+++ b/components/keyestudio-ks0026-ir-receiver/README.md
@@ -1,5 +1,7 @@
# Keyestudio KS0026 digital IR-modtager
+
+
## Identifikation
| Felt | Værdi |
diff --git a/components/keyestudio-ks0026-ir-receiver/image.webp b/components/keyestudio-ks0026-ir-receiver/image.webp
new file mode 100644
index 0000000..915ed41
Binary files /dev/null and b/components/keyestudio-ks0026-ir-receiver/image.webp differ
diff --git a/components/keyestudio-ks0026-ir-receiver/thumbnail.webp b/components/keyestudio-ks0026-ir-receiver/thumbnail.webp
new file mode 100644
index 0000000..5af2064
Binary files /dev/null and b/components/keyestudio-ks0026-ir-receiver/thumbnail.webp differ
diff --git a/components/keyestudio-ks0027-ir-transmitter/README.md b/components/keyestudio-ks0027-ir-transmitter/README.md
index db2e8dc..b949811 100644
--- a/components/keyestudio-ks0027-ir-transmitter/README.md
+++ b/components/keyestudio-ks0027-ir-transmitter/README.md
@@ -1,5 +1,7 @@
# Keyestudio KS0027 digital IR-sender
+
+
## Identifikation
| Felt | Værdi |
diff --git a/components/keyestudio-ks0027-ir-transmitter/image.webp b/components/keyestudio-ks0027-ir-transmitter/image.webp
new file mode 100644
index 0000000..1e11e11
Binary files /dev/null and b/components/keyestudio-ks0027-ir-transmitter/image.webp differ
diff --git a/components/keyestudio-ks0027-ir-transmitter/thumbnail.webp b/components/keyestudio-ks0027-ir-transmitter/thumbnail.webp
new file mode 100644
index 0000000..9bacc93
Binary files /dev/null and b/components/keyestudio-ks0027-ir-transmitter/thumbnail.webp differ
diff --git a/components/keyestudio-ks0028-photocell/README.md b/components/keyestudio-ks0028-photocell/README.md
index c9acd82..5c93503 100644
--- a/components/keyestudio-ks0028-photocell/README.md
+++ b/components/keyestudio-ks0028-photocell/README.md
@@ -1,5 +1,7 @@
# Keyestudio KS0028 fotomodstandssensor
+
+
## Identifikation
| Felt | Værdi |
diff --git a/components/keyestudio-ks0028-photocell/image.webp b/components/keyestudio-ks0028-photocell/image.webp
new file mode 100644
index 0000000..ec04d69
Binary files /dev/null and b/components/keyestudio-ks0028-photocell/image.webp differ
diff --git a/components/keyestudio-ks0028-photocell/thumbnail.webp b/components/keyestudio-ks0028-photocell/thumbnail.webp
new file mode 100644
index 0000000..aa57cc6
Binary files /dev/null and b/components/keyestudio-ks0028-photocell/thumbnail.webp differ
diff --git a/components/keyestudio-ks0029-push-button/README.md b/components/keyestudio-ks0029-push-button/README.md
index f7ed7d9..30bddbf 100644
--- a/components/keyestudio-ks0029-push-button/README.md
+++ b/components/keyestudio-ks0029-push-button/README.md
@@ -1,5 +1,7 @@
# Keyestudio KS0029 trykknapmodul
+
+
## Identifikation
| Felt | Værdi |
diff --git a/components/keyestudio-ks0029-push-button/image.webp b/components/keyestudio-ks0029-push-button/image.webp
new file mode 100644
index 0000000..c6ee859
Binary files /dev/null and b/components/keyestudio-ks0029-push-button/image.webp differ
diff --git a/components/keyestudio-ks0029-push-button/thumbnail.webp b/components/keyestudio-ks0029-push-button/thumbnail.webp
new file mode 100644
index 0000000..5e3d1d8
Binary files /dev/null and b/components/keyestudio-ks0029-push-button/thumbnail.webp differ
diff --git a/components/keyestudio-ks0032-rgb-led/README.md b/components/keyestudio-ks0032-rgb-led/README.md
index 233117d..fad6e72 100644
--- a/components/keyestudio-ks0032-rgb-led/README.md
+++ b/components/keyestudio-ks0032-rgb-led/README.md
@@ -1,5 +1,7 @@
# Keyestudio KS0032 RGB LED-modul
+
+
## Identifikation
| Felt | Værdi |
diff --git a/components/keyestudio-ks0032-rgb-led/image.webp b/components/keyestudio-ks0032-rgb-led/image.webp
new file mode 100644
index 0000000..28f29c3
Binary files /dev/null and b/components/keyestudio-ks0032-rgb-led/image.webp differ
diff --git a/components/keyestudio-ks0032-rgb-led/thumbnail.webp b/components/keyestudio-ks0032-rgb-led/thumbnail.webp
new file mode 100644
index 0000000..d28ad2d
Binary files /dev/null and b/components/keyestudio-ks0032-rgb-led/thumbnail.webp differ
diff --git a/components/keyestudio-ks0033-thermistor/README.md b/components/keyestudio-ks0033-thermistor/README.md
index 639f431..e613e5c 100644
--- a/components/keyestudio-ks0033-thermistor/README.md
+++ b/components/keyestudio-ks0033-thermistor/README.md
@@ -1,5 +1,7 @@
# Keyestudio KS0033 analog temperatursensor
+
+
## Identifikation
| Felt | Værdi |
diff --git a/components/keyestudio-ks0033-thermistor/image.webp b/components/keyestudio-ks0033-thermistor/image.webp
new file mode 100644
index 0000000..d8409cc
Binary files /dev/null and b/components/keyestudio-ks0033-thermistor/image.webp differ
diff --git a/components/keyestudio-ks0033-thermistor/thumbnail.webp b/components/keyestudio-ks0033-thermistor/thumbnail.webp
new file mode 100644
index 0000000..5d51841
Binary files /dev/null and b/components/keyestudio-ks0033-thermistor/thumbnail.webp differ
diff --git a/components/keyestudio-ks0035-microphone/README.md b/components/keyestudio-ks0035-microphone/README.md
index 1dc5497..c365763 100644
--- a/components/keyestudio-ks0035-microphone/README.md
+++ b/components/keyestudio-ks0035-microphone/README.md
@@ -1,5 +1,7 @@
# Keyestudio KS0035 mikrofonmodul
+
+
## Identifikation
| Felt | Værdi |
diff --git a/components/keyestudio-ks0035-microphone/image.webp b/components/keyestudio-ks0035-microphone/image.webp
new file mode 100644
index 0000000..8697e3b
Binary files /dev/null and b/components/keyestudio-ks0035-microphone/image.webp differ
diff --git a/components/keyestudio-ks0035-microphone/thumbnail.webp b/components/keyestudio-ks0035-microphone/thumbnail.webp
new file mode 100644
index 0000000..6a4a83a
Binary files /dev/null and b/components/keyestudio-ks0035-microphone/thumbnail.webp differ
diff --git a/components/keyestudio-ks0037-vibration/README.md b/components/keyestudio-ks0037-vibration/README.md
index 55e0c81..ad14071 100644
--- a/components/keyestudio-ks0037-vibration/README.md
+++ b/components/keyestudio-ks0037-vibration/README.md
@@ -1,5 +1,7 @@
# Keyestudio KS0037 vibrationssensor
+
+
## Identifikation
| Felt | Værdi |
diff --git a/components/keyestudio-ks0037-vibration/image.webp b/components/keyestudio-ks0037-vibration/image.webp
new file mode 100644
index 0000000..f20b61b
Binary files /dev/null and b/components/keyestudio-ks0037-vibration/image.webp differ
diff --git a/components/keyestudio-ks0037-vibration/thumbnail.webp b/components/keyestudio-ks0037-vibration/thumbnail.webp
new file mode 100644
index 0000000..3f6add3
Binary files /dev/null and b/components/keyestudio-ks0037-vibration/thumbnail.webp differ
diff --git a/components/keyestudio-ks0038-reed-switch/README.md b/components/keyestudio-ks0038-reed-switch/README.md
index 7954c2d..da3fed9 100644
--- a/components/keyestudio-ks0038-reed-switch/README.md
+++ b/components/keyestudio-ks0038-reed-switch/README.md
@@ -1,5 +1,7 @@
# Keyestudio KS0038 reed switch
+
+
## Identifikation
| Felt | Værdi |
diff --git a/components/keyestudio-ks0038-reed-switch/image.webp b/components/keyestudio-ks0038-reed-switch/image.webp
new file mode 100644
index 0000000..5dc1b46
Binary files /dev/null and b/components/keyestudio-ks0038-reed-switch/image.webp differ
diff --git a/components/keyestudio-ks0038-reed-switch/thumbnail.webp b/components/keyestudio-ks0038-reed-switch/thumbnail.webp
new file mode 100644
index 0000000..4bee7ec
Binary files /dev/null and b/components/keyestudio-ks0038-reed-switch/thumbnail.webp differ
diff --git a/scripts/process_component_images.py b/scripts/process_component_images.py
new file mode 100644
index 0000000..57076dc
--- /dev/null
+++ b/scripts/process_component_images.py
@@ -0,0 +1,88 @@
+"""Crop the photographed Keyes modules and create README-ready WebP assets."""
+
+from __future__ import annotations
+
+import argparse
+from pathlib import Path
+
+import numpy as np
+from PIL import Image, ImageOps
+
+
+COMPONENTS_DIR = Path(__file__).resolve().parents[1] / "components"
+
+PHOTOS = {
+ "keyestudio-ks0037-vibration": "IMG_20261024_203426885_HDR.jpg",
+ "keyestudio-ks0019-passive-buzzer": "IMG_20261024_203440803_HDR.jpg",
+ "keyes-ke2054-laser-emitter": "IMG_20261024_203450304_HDR.jpg",
+ "keyestudio-ks0033-thermistor": "IMG_20261024_203506743_HDR.jpg",
+ "keyestudio-ks0024-knock": "IMG_20261024_203515354_HDR.jpg",
+ "keyestudio-ks0028-photocell": "IMG_20261024_203524523_HDR.jpg",
+ "keyestudio-ks0014-analog-rotation": "IMG_20261024_203538683_HDR.jpg",
+ "keyestudio-ks0023-ds18b20": "IMG_20261024_203559430_BURST000_COVER.jpg",
+ "keyestudio-ks0029-push-button": "IMG_20261024_203615490_HDR.jpg",
+ "keyestudio-ks0038-reed-switch": "IMG_20261024_203624532_HDR.jpg",
+ "keyestudio-ks0035-microphone": "IMG_20261024_203651498_HDR.jpg",
+ "keyestudio-ks0025-tilt": "IMG_20261024_203705101_HDR.jpg",
+ "keyestudio-ks0026-ir-receiver": "IMG_20261024_203723952_HDR.jpg",
+ "keyestudio-ks0018-active-buzzer": "IMG_20261024_203734801_HDR.jpg",
+ "keyestudio-ks0027-ir-transmitter": "IMG_20261024_203743461_HDR.jpg",
+ "keyestudio-ks0015-pulse-rate": "IMG_20261024_203754423_HDR.jpg",
+ "keyestudio-ks0022-lm35": "IMG_20261024_203804368_HDR.jpg",
+ "keyestudio-ks0021-collision": "IMG_20261024_203811921_HDR.jpg",
+ "keyestudio-ks0032-rgb-led": "IMG_20261024_203820913_HDR.jpg",
+}
+
+
+def crop_around_board(image: Image.Image) -> Image.Image:
+ """Find the red PCB, then retain generous room for protruding components."""
+ pixels = np.asarray(image.convert("RGB"))
+ red = pixels[:, :, 0].astype(np.int16)
+ green = pixels[:, :, 1].astype(np.int16)
+ blue = pixels[:, :, 2].astype(np.int16)
+ mask = (red > 125) & (red > green * 1.35) & (red > blue * 1.20)
+ ys, xs = np.nonzero(mask)
+ if len(xs) < 10_000:
+ raise RuntimeError("Could not locate the red PCB")
+
+ left, right = int(np.percentile(xs, 0.2)), int(np.percentile(xs, 99.8))
+ top, bottom = int(np.percentile(ys, 0.2)), int(np.percentile(ys, 99.8))
+ width, height = right - left, bottom - top
+ pad_x, pad_y = int(width * 0.22), int(height * 0.18)
+ box = (
+ max(0, left - pad_x),
+ max(0, top - pad_y),
+ min(image.width, right + pad_x),
+ min(image.height, bottom + pad_y),
+ )
+ return image.crop(box)
+
+
+def fit(image: Image.Image, max_size: tuple[int, int]) -> Image.Image:
+ result = image.copy()
+ result.thumbnail(max_size, Image.Resampling.LANCZOS)
+ return result
+
+
+def main() -> None:
+ parser = argparse.ArgumentParser()
+ parser.add_argument("source_dir", type=Path, help="Directory containing the source JPEGs")
+ args = parser.parse_args()
+
+ for component, filename in PHOTOS.items():
+ source = args.source_dir / filename
+ destination = COMPONENTS_DIR / component
+ with Image.open(source) as opened:
+ image = ImageOps.exif_transpose(opened).convert("RGB")
+ crop = crop_around_board(image)
+ fit(crop, (1400, 1050)).save(
+ destination / "image.webp", "WEBP", quality=90, method=6
+ )
+ fit(crop, (240, 180)).save(
+ destination / "thumbnail.webp", "WEBP", quality=90, method=6
+ )
+ print(f"{component}: {filename}")
+
+
+if __name__ == "__main__":
+ main()