diff --git a/apps/conky/pyproject.toml b/apps/conky/pyproject.toml
index 05207ce65228724f5d12b4cf321e0e1188f087f5..72fc4b9b9e4f0d09c78541484be0f4f651ab4c7a 100644
--- a/apps/conky/pyproject.toml
+++ b/apps/conky/pyproject.toml
@@ -13,3 +13,14 @@ dependencies = ["xaal.lib", "xaal.monitor"]
 
 [tool.setuptools.packages.find]
 include = ["xaal.conky"]
+
+[tool.ruff]
+line-length = 122
+
+[tool.ruff.format]
+quote-style = "preserve"
+
+[tool.black]
+line-length = 122
+skip-string-normalization = true
+
diff --git a/apps/dashboard/pyproject.toml b/apps/dashboard/pyproject.toml
index 12a1f9cd75cfc8c28538142453be9f2b6f2e35a0..13f6d60e42f98db614bbf7ab575803a9e7901eb7 100644
--- a/apps/dashboard/pyproject.toml
+++ b/apps/dashboard/pyproject.toml
@@ -29,3 +29,14 @@ include = ["xaal.dashboard"]
 Homepage = "https://recherche.imt-atlantique.fr/xaal/"
 Documentation = "https://redmine.imt-atlantique.fr/projects/xaal/repository/xaal/entry/code/Python/branches/0.7/apps/dashboard/README.rst"
 Source = "https://redmine.imt-atlantique.fr/projects/xaal/repository/xaal/show/code/Python/branches/0.7/apps/dashboard"
+
+[tool.ruff]
+line-length = 122
+
+[tool.ruff.format]
+quote-style = "preserve"
+
+[tool.black]
+line-length = 122
+skip-string-normalization = true
+
diff --git a/apps/fuse/pyproject.toml b/apps/fuse/pyproject.toml
index 0a5ebc23a68393d67f765546774396f72b807e75..7154300c39a6714f679c31e0da89ed92119914a6 100644
--- a/apps/fuse/pyproject.toml
+++ b/apps/fuse/pyproject.toml
@@ -21,3 +21,14 @@ include = ["xaal.fuse"]
 Homepage = "https://recherche.imt-atlantique.fr/xaal/"
 Documentation = "https://redmine.imt-atlantique.fr/projects/xaal/repository/xaal/entry/code/Python/branches/0.7/apps/fuse/README.rst"
 Source = "https://redmine.imt-atlantique.fr/projects/xaal/repository/xaal/show/code/Python/branches/0.7/apps/fuse"
+
+[tool.ruff]
+line-length = 122
+
+[tool.ruff.format]
+quote-style = "preserve"
+
+[tool.black]
+line-length = 122
+skip-string-normalization = true
+
diff --git a/apps/legacytools/pyproject.toml b/apps/legacytools/pyproject.toml
index 62703cc28a94df4e5249cfb0bbca6516aef10d7f..b9c4bfad70dff19d3cd61a1aa18975ed9d62c599 100644
--- a/apps/legacytools/pyproject.toml
+++ b/apps/legacytools/pyproject.toml
@@ -31,3 +31,14 @@ include = ["xaal.legacytools"]
 Homepage = "https://recherche.imt-atlantique.fr/xaal/"
 Documentation = "https://redmine.imt-atlantique.fr/projects/xaal/repository/xaal/entry/code/Python/branches/0.7/apps/legacytools/README.rst"
 Source = "https://redmine.imt-atlantique.fr/projects/xaal/repository/xaal/show/code/Python/branches/0.7/apps/legacytools"
+
+[tool.ruff]
+line-length = 122
+
+[tool.ruff.format]
+quote-style = "preserve"
+
+[tool.black]
+line-length = 122
+skip-string-normalization = true
+
diff --git a/apps/rest/pyproject.toml b/apps/rest/pyproject.toml
index 1a3f62a92971c8c2c9a41354f3d8426d03f1dfdb..12efd4a3f01bdd9289bb8b0e0f6764d89eeb5471 100644
--- a/apps/rest/pyproject.toml
+++ b/apps/rest/pyproject.toml
@@ -25,3 +25,14 @@ include = ["xaal.rest"]
 Homepage = "https://recherche.imt-atlantique.fr/xaal/"
 Documentation = "https://redmine.imt-atlantique.fr/projects/xaal/repository/xaal/entry/code/Python/branches/0.7/apps/rest/README.rst"
 Source = "https://redmine.imt-atlantique.fr/projects/xaal/repository/xaal/show/code/Python/branches/0.7/apps/rest"
+
+[tool.ruff]
+line-length = 122
+
+[tool.ruff.format]
+quote-style = "preserve"
+
+[tool.black]
+line-length = 122
+skip-string-normalization = true
+
diff --git a/apps/tools/pyproject.toml b/apps/tools/pyproject.toml
index bbad4f788b483ed83f021521a23bc8424f7109e5..f22105553d791af369940e63b71a90f47a2cfdc9 100644
--- a/apps/tools/pyproject.toml
+++ b/apps/tools/pyproject.toml
@@ -33,3 +33,14 @@ include = ["xaal.tools"]
 Homepage = "https://recherche.imt-atlantique.fr/xaal/"
 Documentation = "https://redmine.imt-atlantique.fr/projects/xaal/repository/xaal/entry/code/Python/branches/0.7/apps/tools/README.rst"
 Source = "https://redmine.imt-atlantique.fr/projects/xaal/repository/xaal/show/code/Python/branches/0.7/apps/tools"
+
+[tool.ruff]
+line-length = 122
+
+[tool.ruff.format]
+quote-style = "preserve"
+
+[tool.black]
+line-length = 122
+skip-string-normalization = true
+
diff --git a/core/metadb/pyproject.toml b/core/metadb/pyproject.toml
index 8bdc8df9677d0b4646c2671ba0a6c44f02c6563c..11d1e071aa2c6e4c13f82ff87d19ffb6911a17a2 100644
--- a/core/metadb/pyproject.toml
+++ b/core/metadb/pyproject.toml
@@ -18,3 +18,14 @@ include = ["xaal.metadb"]
 Homepage = "https://recherche.imt-atlantique.fr/xaal/"
 Documentation = "https://redmine.imt-atlantique.fr/projects/xaal/repository/xaal/entry/code/Python/branches/0.7/core/metadb/README.rst"
 Source = "https://redmine.imt-atlantique.fr/projects/xaal/repository/xaal/show/code/Python/branches/0.7/core/metadb"
+
+[tool.ruff]
+line-length = 122
+
+[tool.ruff.format]
+quote-style = "preserve"
+
+[tool.black]
+line-length = 122
+skip-string-normalization = true
+
diff --git a/devices/assistants/Alexa/pyproject.toml b/devices/assistants/Alexa/pyproject.toml
index 3c3adf0a8f72df1ad2a381db1f71a125df5bdd2d..87509c13b171227383b5e29afb6db0423e1721eb 100644
--- a/devices/assistants/Alexa/pyproject.toml
+++ b/devices/assistants/Alexa/pyproject.toml
@@ -18,3 +18,14 @@ include = ["xaal.alexa"]
 Homepage = "https://recherche.imt-atlantique.fr/xaal/"
 Documentation = "https://redmine.imt-atlantique.fr/projects/xaal/repository/xaal/entry/code/Python/branches/0.7/devices/assistants/Alexa/README.rst"
 Source = "https://redmine.imt-atlantique.fr/projects/xaal/repository/xaal/show/code/Python/branches/0.7/devices/assistants/Alexa"
+
+[tool.ruff]
+line-length = 122
+
+[tool.ruff.format]
+quote-style = "preserve"
+
+[tool.black]
+line-length = 122
+skip-string-normalization = true
+
diff --git a/devices/emulations/Fauxmo/pyproject.toml b/devices/emulations/Fauxmo/pyproject.toml
index 9ceffa6d50467155f883e0d2f001d7b505e79178..860c965b7f5d9abcf561576d5829de9c11d47ff4 100644
--- a/devices/emulations/Fauxmo/pyproject.toml
+++ b/devices/emulations/Fauxmo/pyproject.toml
@@ -19,3 +19,14 @@ include = ["xaal.fauxmo"]
 Homepage = "https://recherche.imt-atlantique.fr/xaal/"
 Documentation = "https://redmine.imt-atlantique.fr/projects/xaal/repository/xaal/entry/code/Python/branches/0.7/devices/emulations/Fauxmo/README.rst"
 Source = "https://redmine.imt-atlantique.fr/projects/xaal/repository/xaal/show/code/Python/branches/0.7/devices/emulations/Fauxmo"
+
+[tool.ruff]
+line-length = 122
+
+[tool.ruff.format]
+quote-style = "preserve"
+
+[tool.black]
+line-length = 122
+skip-string-normalization = true
+
diff --git a/devices/loggers/influxdb/pyproject.toml b/devices/loggers/influxdb/pyproject.toml
index 382ea7221aa3c7ea965aef154530c775e15c949d..d32153a530576af6b6d0d8e4b83e2299a0aec6e2 100644
--- a/devices/loggers/influxdb/pyproject.toml
+++ b/devices/loggers/influxdb/pyproject.toml
@@ -18,3 +18,14 @@ include = ["xaal.influxdb"]
 Homepage = "https://recherche.imt-atlantique.fr/xaal/"
 Documentation = "https://redmine.imt-atlantique.fr/projects/xaal/repository/xaal/entry/code/Python/branches/0.7/devices/loggers/influxdb/README.rst"
 Source = "https://redmine.imt-atlantique.fr/projects/xaal/repository/xaal/show/code/Python/branches/0.7/devices/loggers/influxdb"
+
+[tool.ruff]
+line-length = 122
+
+[tool.ruff.format]
+quote-style = "preserve"
+
+[tool.black]
+line-length = 122
+skip-string-normalization = true
+
diff --git a/devices/loggers/mqtt/pyproject.toml b/devices/loggers/mqtt/pyproject.toml
index 0dd15cef7ab132b0083a8fc03eeb12a78a128706..ef7cdb95ecac6c578125ec3feeda429e14f42f25 100644
--- a/devices/loggers/mqtt/pyproject.toml
+++ b/devices/loggers/mqtt/pyproject.toml
@@ -18,3 +18,14 @@ include = ["xaal.mqttlogger"]
 Homepage = "https://recherche.imt-atlantique.fr/xaal/"
 Documentation = "https://redmine.imt-atlantique.fr/projects/xaal/repository/xaal/entry/code/Python/branches/0.7/devices/loggers/mqtt/README.rst"
 Source = "https://redmine.imt-atlantique.fr/projects/xaal/repository/xaal/show/code/Python/branches/0.7/devices/loggers/mqtt"
+
+[tool.ruff]
+line-length = 122
+
+[tool.ruff.format]
+quote-style = "preserve"
+
+[tool.black]
+line-length = 122
+skip-string-normalization = true
+
diff --git a/devices/loggers/warp10/pyproject.toml b/devices/loggers/warp10/pyproject.toml
index 4544dfb466255b366ecda9f79d47d07b61c17857..ae1aaee3f058a78b33c81e2bf67724d4be27985a 100644
--- a/devices/loggers/warp10/pyproject.toml
+++ b/devices/loggers/warp10/pyproject.toml
@@ -18,3 +18,14 @@ include = ["xaal.warp10"]
 Homepage = "https://recherche.imt-atlantique.fr/xaal/"
 Documentation = "https://redmine.imt-atlantique.fr/projects/xaal/repository/xaal/entry/code/Python/branches/0.7/devices/loggers/warp10/README.rst"
 Source = "https://redmine.imt-atlantique.fr/projects/xaal/repository/xaal/show/code/Python/branches/0.7/devices/loggers/warp10"
+
+[tool.ruff]
+line-length = 122
+
+[tool.ruff.format]
+quote-style = "preserve"
+
+[tool.black]
+line-length = 122
+skip-string-normalization = true
+
diff --git a/devices/notifications/gtk-notify/pyproject.toml b/devices/notifications/gtk-notify/pyproject.toml
index 550c0edc7f0e6be0a83703f3a0f59d0ca1f5c1d5..1bf8dbf1d4c2c5d0a49fc756a8fcbbe4eebb712c 100644
--- a/devices/notifications/gtk-notify/pyproject.toml
+++ b/devices/notifications/gtk-notify/pyproject.toml
@@ -18,3 +18,14 @@ include = ["xaal.gtknotify"]
 Homepage = "https://recherche.imt-atlantique.fr/xaal/"
 Documentation = "https://redmine.imt-atlantique.fr/projects/xaal/repository/xaal/entry/code/Python/branches/0.7/devices/notifications/gtk-notify/README.rst"
 Source = "https://redmine.imt-atlantique.fr/projects/xaal/repository/xaal/show/code/Python/branches/0.7/devices/notifications/gtk-notify"
+
+[tool.ruff]
+line-length = 122
+
+[tool.ruff.format]
+quote-style = "preserve"
+
+[tool.black]
+line-length = 122
+skip-string-normalization = true
+
diff --git a/devices/notifications/pushbullet/pyproject.toml b/devices/notifications/pushbullet/pyproject.toml
index b4830396280d9fed9eeadfb3834fdf41eb759e6d..c66c4603748c8a9308832efdce26304e32c9ea0d 100644
--- a/devices/notifications/pushbullet/pyproject.toml
+++ b/devices/notifications/pushbullet/pyproject.toml
@@ -18,3 +18,14 @@ include = ["xaal.pushbullet"]
 Homepage = "https://recherche.imt-atlantique.fr/xaal/"
 Documentation = "https://redmine.imt-atlantique.fr/projects/xaal/repository/xaal/entry/code/Python/branches/0.7/devices/notifications/pushbullet/README.rst"
 Source = "https://redmine.imt-atlantique.fr/projects/xaal/repository/xaal/show/code/Python/branches/0.7/devices/notifications/pushbullet"
+
+[tool.ruff]
+line-length = 122
+
+[tool.ruff.format]
+quote-style = "preserve"
+
+[tool.black]
+line-length = 122
+skip-string-normalization = true
+
diff --git a/devices/protocols/Aqara/pyproject.toml b/devices/protocols/Aqara/pyproject.toml
index 80fbeea625f7d2732008965dd221070ba8f15921..3d6c7aed07d4eaf27ef751b6da9a7a889eca3466 100644
--- a/devices/protocols/Aqara/pyproject.toml
+++ b/devices/protocols/Aqara/pyproject.toml
@@ -18,3 +18,14 @@ include = ["xaal.aqara"]
 Homepage = "https://recherche.imt-atlantique.fr/xaal/"
 Documentation = "https://redmine.imt-atlantique.fr/projects/xaal/repository/xaal/entry/code/Python/branches/0.7/devices/protocols/Aqara/README.rst"
 Source = "https://redmine.imt-atlantique.fr/projects/xaal/repository/xaal/show/code/Python/branches/0.7/devices/protocols/Aqara"
+
+[tool.ruff]
+line-length = 122
+
+[tool.ruff.format]
+quote-style = "preserve"
+
+[tool.black]
+line-length = 122
+skip-string-normalization = true
+
diff --git a/devices/protocols/ESPHome/pyproject.toml b/devices/protocols/ESPHome/pyproject.toml
index cc6399f1af9d36c8c9187ead3c82706be7d75425..345d9da2af9553e575c221558fc2295371ab2bae 100644
--- a/devices/protocols/ESPHome/pyproject.toml
+++ b/devices/protocols/ESPHome/pyproject.toml
@@ -19,3 +19,14 @@ include = ["xaal.esphome"]
 Homepage = "https://recherche.imt-atlantique.fr/xaal/"
 Documentation = "https://redmine.imt-atlantique.fr/projects/xaal/repository/xaal/entry/code/Python/branches/0.7/devices/protocols/ESPHome/README.rst"
 Source = "https://redmine.imt-atlantique.fr/projects/xaal/repository/xaal/show/code/Python/branches/0.7/devices/protocols/ESPHome"
+
+[tool.ruff]
+line-length = 122
+
+[tool.ruff.format]
+quote-style = "preserve"
+
+[tool.black]
+line-length = 122
+skip-string-normalization = true
+
diff --git a/devices/protocols/Edisio/pyproject.toml b/devices/protocols/Edisio/pyproject.toml
index 36a00811e7e58f1c359535fb1d90dd305d36402c..b70a9dc9ce902dc86331d2f1fe6e59a17386815d 100644
--- a/devices/protocols/Edisio/pyproject.toml
+++ b/devices/protocols/Edisio/pyproject.toml
@@ -18,3 +18,14 @@ include = ["xaal.edisio"]
 Homepage = "https://recherche.imt-atlantique.fr/xaal/"
 Documentation = "https://redmine.imt-atlantique.fr/projects/xaal/repository/xaal/entry/code/Python/branches/0.7/devices/protocols/Edisio/README.rst"
 Source = "https://redmine.imt-atlantique.fr/projects/xaal/repository/xaal/show/code/Python/branches/0.7/devices/protocols/Edisio"
+
+[tool.ruff]
+line-length = 122
+
+[tool.ruff.format]
+quote-style = "preserve"
+
+[tool.black]
+line-length = 122
+skip-string-normalization = true
+
diff --git a/devices/protocols/HQ433/pyproject.toml b/devices/protocols/HQ433/pyproject.toml
index 86fe9fc498ee9123865e7c2ebcc9adca48785377..98dc34e17bc94091de342dae729a1e3ebce59b31 100644
--- a/devices/protocols/HQ433/pyproject.toml
+++ b/devices/protocols/HQ433/pyproject.toml
@@ -18,3 +18,14 @@ include = ["xaal.hq433"]
 Homepage = "https://recherche.imt-atlantique.fr/xaal/"
 Documentation = "https://redmine.imt-atlantique.fr/projects/xaal/repository/xaal/entry/code/Python/branches/0.7/devices/protocols/HQ433/README.rst"
 Source = "https://redmine.imt-atlantique.fr/projects/xaal/repository/xaal/show/code/Python/branches/0.7/devices/protocols/HQ433"
+
+[tool.ruff]
+line-length = 122
+
+[tool.ruff.format]
+quote-style = "preserve"
+
+[tool.black]
+line-length = 122
+skip-string-normalization = true
+
diff --git a/devices/protocols/HomeKit/pyproject.toml b/devices/protocols/HomeKit/pyproject.toml
index 17ed221f71ef24c71cf6482db336eca49264ca20..52e826fa3e1965284447ffa26e044d6338d34711 100644
--- a/devices/protocols/HomeKit/pyproject.toml
+++ b/devices/protocols/HomeKit/pyproject.toml
@@ -19,3 +19,14 @@ include = ["xaal.homekit"]
 Homepage = "https://recherche.imt-atlantique.fr/xaal/"
 Documentation = "https://redmine.imt-atlantique.fr/projects/xaal/repository/xaal/entry/code/Python/branches/0.7/devices/protocols/HomeKit/README.rst"
 Source = "https://redmine.imt-atlantique.fr/projects/xaal/repository/xaal/show/code/Python/branches/0.7/devices/protocols/HomeKit"
+
+[tool.ruff]
+line-length = 122
+
+[tool.ruff.format]
+quote-style = "preserve"
+
+[tool.black]
+line-length = 122
+skip-string-normalization = true
+
diff --git a/devices/protocols/IPX-800/pyproject.toml b/devices/protocols/IPX-800/pyproject.toml
index eddfc7d559646133474daa916a4eac285e7e3d36..9aa5d867d20d79ecc3603187dd0f5e40e7ca29b9 100644
--- a/devices/protocols/IPX-800/pyproject.toml
+++ b/devices/protocols/IPX-800/pyproject.toml
@@ -18,3 +18,14 @@ include = ["xaal.ipx800"]
 Homepage = "https://recherche.imt-atlantique.fr/xaal/"
 Documentation = "https://redmine.imt-atlantique.fr/projects/xaal/repository/xaal/entry/code/Python/branches/0.7/devices/protocols/IPX-800/README.rst"
 Source = "https://redmine.imt-atlantique.fr/projects/xaal/repository/xaal/show/code/Python/branches/0.7/devices/protocols/IPX-800"
+
+[tool.ruff]
+line-length = 122
+
+[tool.ruff.format]
+quote-style = "preserve"
+
+[tool.black]
+line-length = 122
+skip-string-normalization = true
+
diff --git a/devices/protocols/KNX/pyproject.toml b/devices/protocols/KNX/pyproject.toml
index 228750b78a8cd5c4f71ea13e67484759c36c0196..53b72d51684921c46a5a68b4a5973fb415814ff2 100644
--- a/devices/protocols/KNX/pyproject.toml
+++ b/devices/protocols/KNX/pyproject.toml
@@ -18,3 +18,14 @@ include = ["xaal.knx"]
 Homepage = "https://recherche.imt-atlantique.fr/xaal/"
 Documentation = "https://redmine.imt-atlantique.fr/projects/xaal/repository/xaal/entry/code/Python/branches/0.7/devices/protocols/KNX/README.rst"
 Source = "https://redmine.imt-atlantique.fr/projects/xaal/repository/xaal/show/code/Python/branches/0.7/devices/protocols/KNX"
+
+[tool.ruff]
+line-length = 122
+
+[tool.ruff.format]
+quote-style = "preserve"
+
+[tool.black]
+line-length = 122
+skip-string-normalization = true
+
diff --git a/devices/protocols/Meross/pyproject.toml b/devices/protocols/Meross/pyproject.toml
index 764aceff6f103faccfdc8e9d757e16c400c73280..148aaf23358a477885980b7eea1ca3a4c89b8765 100644
--- a/devices/protocols/Meross/pyproject.toml
+++ b/devices/protocols/Meross/pyproject.toml
@@ -18,3 +18,14 @@ include = ["xaal.meross"]
 Homepage = "https://recherche.imt-atlantique.fr/xaal/"
 Documentation = "https://redmine.imt-atlantique.fr/projects/xaal/repository/xaal/entry/code/Python/branches/0.7/devices/protocols/Meross/README.rst"
 Source = "https://redmine.imt-atlantique.fr/projects/xaal/repository/xaal/show/code/Python/branches/0.7/devices/protocols/Meross"
+
+[tool.ruff]
+line-length = 122
+
+[tool.ruff.format]
+quote-style = "preserve"
+
+[tool.black]
+line-length = 122
+skip-string-normalization = true
+
diff --git a/devices/protocols/Netatmo/pyproject.toml b/devices/protocols/Netatmo/pyproject.toml
index 417a9ff3eb9b0f53efaf880a25fe50c08648aea0..b2b4d5bf2e30ecf3bab50d81c95c4d0c945fe157 100644
--- a/devices/protocols/Netatmo/pyproject.toml
+++ b/devices/protocols/Netatmo/pyproject.toml
@@ -17,3 +17,14 @@ include = ["xaal.netatmo"]
 Homepage = "https://recherche.imt-atlantique.fr/xaal/"
 Documentation = "https://redmine.imt-atlantique.fr/projects/xaal/repository/xaal/entry/code/Python/branches/0.7/devices/protocols/Netatmo/README.rst"
 Source = "https://redmine.imt-atlantique.fr/projects/xaal/repository/xaal/show/code/Python/branches/0.7/devices/protocols/Netatmo"
+
+[tool.ruff]
+line-length = 122
+
+[tool.ruff.format]
+quote-style = "preserve"
+
+[tool.black]
+line-length = 122
+skip-string-normalization = true
+
diff --git a/devices/protocols/SensFloor/pyproject.toml b/devices/protocols/SensFloor/pyproject.toml
index 24b2617c47c7c3b63eaa8071f70dcc2901c19a2c..039a7fd290a25d2ea77bafe6cd8a8a5543b7749a 100644
--- a/devices/protocols/SensFloor/pyproject.toml
+++ b/devices/protocols/SensFloor/pyproject.toml
@@ -18,3 +18,14 @@ include = ["xaal.sensfloor"]
 Homepage = "https://recherche.imt-atlantique.fr/xaal/"
 Documentation = "https://redmine.imt-atlantique.fr/projects/xaal/repository/xaal/entry/code/Python/branches/0.7/devices/protocols/SensFloor/README.rst"
 Source = "https://redmine.imt-atlantique.fr/projects/xaal/repository/xaal/show/code/Python/branches/0.7/devices/protocols/SensFloor"
+
+[tool.ruff]
+line-length = 122
+
+[tool.ruff.format]
+quote-style = "preserve"
+
+[tool.black]
+line-length = 122
+skip-string-normalization = true
+
diff --git a/devices/protocols/Tuya/pyproject.toml b/devices/protocols/Tuya/pyproject.toml
index 025af4f6f99c0ea2a1d74bf1bd724948693bebb9..3d450d68aad13e7fcd0468230123913276a4441b 100644
--- a/devices/protocols/Tuya/pyproject.toml
+++ b/devices/protocols/Tuya/pyproject.toml
@@ -18,3 +18,14 @@ include = ["xaal.tuya"]
 Homepage = "https://recherche.imt-atlantique.fr/xaal/"
 Documentation = "https://redmine.imt-atlantique.fr/projects/xaal/repository/xaal/entry/code/Python/branches/0.7/devices/protocols/Tuya/README.rst"
 Source = "https://redmine.imt-atlantique.fr/projects/xaal/repository/xaal/show/code/Python/branches/0.7/devices/protocols/Tuya"
+
+[tool.ruff]
+line-length = 122
+
+[tool.ruff.format]
+quote-style = "preserve"
+
+[tool.black]
+line-length = 122
+skip-string-normalization = true
+
diff --git a/devices/protocols/Yeelight/pyproject.toml b/devices/protocols/Yeelight/pyproject.toml
index ca6818099772a37f37314a239765625313f66ac7..e45c0bbc98eaed130d402aa4df3c588e1dd178ec 100644
--- a/devices/protocols/Yeelight/pyproject.toml
+++ b/devices/protocols/Yeelight/pyproject.toml
@@ -18,3 +18,14 @@ include = ["xaal.yeelight"]
 Homepage = "https://recherche.imt-atlantique.fr/xaal/"
 Documentation = "https://redmine.imt-atlantique.fr/projects/xaal/repository/xaal/entry/code/Python/branches/0.7/devices/protocols/Yeelight/README.rst"
 Source = "https://redmine.imt-atlantique.fr/projects/xaal/repository/xaal/show/code/Python/branches/0.7/devices/protocols/Yeelight"
+
+[tool.ruff]
+line-length = 122
+
+[tool.ruff.format]
+quote-style = "preserve"
+
+[tool.black]
+line-length = 122
+skip-string-normalization = true
+
diff --git a/devices/protocols/ZWave/pyproject.toml b/devices/protocols/ZWave/pyproject.toml
index 60522c3ed6cca15b4d36e83720a7126f99872c3c..4dd1c99fb5df943b4b7b67a515c030cb353b4a4c 100644
--- a/devices/protocols/ZWave/pyproject.toml
+++ b/devices/protocols/ZWave/pyproject.toml
@@ -18,3 +18,14 @@ include = ["xaal.zwave"]
 Homepage = "https://recherche.imt-atlantique.fr/xaal/"
 Documentation = "https://redmine.imt-atlantique.fr/projects/xaal/repository/xaal/entry/code/Python/branches/0.7/devices/protocols/ZWave/README.rst"
 Source = "https://redmine.imt-atlantique.fr/projects/xaal/repository/xaal/show/code/Python/branches/0.7/devices/protocols/ZWave"
+
+[tool.ruff]
+line-length = 122
+
+[tool.ruff.format]
+quote-style = "preserve"
+
+[tool.black]
+line-length = 122
+skip-string-normalization = true
+
diff --git a/devices/protocols/bugOne/pyproject.toml b/devices/protocols/bugOne/pyproject.toml
index 4f1b17eb039da7f4f7a4fee994fbfce3570838bd..5883bcf378cf491e4ae13891932dc6b3ac1ae9f3 100644
--- a/devices/protocols/bugOne/pyproject.toml
+++ b/devices/protocols/bugOne/pyproject.toml
@@ -18,3 +18,14 @@ include = ["xaal.bugone"]
 Homepage = "https://recherche.imt-atlantique.fr/xaal/"
 Documentation = "https://redmine.imt-atlantique.fr/projects/xaal/repository/xaal/entry/code/Python/branches/0.7/devices/protocols/bugOne/README.rst"
 Source = "https://redmine.imt-atlantique.fr/projects/xaal/repository/xaal/show/code/Python/branches/0.7/devices/protocols/bugOne"
+
+[tool.ruff]
+line-length = 122
+
+[tool.ruff.format]
+quote-style = "preserve"
+
+[tool.black]
+line-length = 122
+skip-string-normalization = true
+
diff --git a/devices/sensors/HTU21D/pyproject.toml b/devices/sensors/HTU21D/pyproject.toml
index 077a1adc9bac96696fe27eea42c513d268c9c619..a0f7daba3f0bb439c4b611e05046381a576bdce9 100644
--- a/devices/sensors/HTU21D/pyproject.toml
+++ b/devices/sensors/HTU21D/pyproject.toml
@@ -18,3 +18,14 @@ include = ["xaal.htu21d"]
 Homepage = "https://recherche.imt-atlantique.fr/xaal/"
 Documentation = "https://redmine.imt-atlantique.fr/projects/xaal/repository/xaal/entry/code/Python/branches/0.7/devices/sensors/HTU21D/README.rst"
 Source = "https://redmine.imt-atlantique.fr/projects/xaal/repository/xaal/show/code/Python/branches/0.7/devices/sensors/HTU21D"
+
+[tool.ruff]
+line-length = 122
+
+[tool.ruff.format]
+quote-style = "preserve"
+
+[tool.black]
+line-length = 122
+skip-string-normalization = true
+
diff --git a/devices/sensors/lm_sensors/pyproject.toml b/devices/sensors/lm_sensors/pyproject.toml
index 7833328adbbb52db28f0fd2c1ecaa6b4e6d9f0ee..d311a322f19a79467c2a652478dfa40bb50816d3 100644
--- a/devices/sensors/lm_sensors/pyproject.toml
+++ b/devices/sensors/lm_sensors/pyproject.toml
@@ -18,3 +18,14 @@ include = ["xaal.lmsensors"]
 Homepage = "https://recherche.imt-atlantique.fr/xaal/"
 Documentation = "https://redmine.imt-atlantique.fr/projects/xaal/repository/xaal/entry/code/Python/branches/0.7/devices/sensors/lm_sensors/README.rst"
 Source = "https://redmine.imt-atlantique.fr/projects/xaal/repository/xaal/show/code/Python/branches/0.7/devices/sensors/lm_sensors"
+
+[tool.ruff]
+line-length = 122
+
+[tool.ruff.format]
+quote-style = "preserve"
+
+[tool.black]
+line-length = 122
+skip-string-normalization = true
+
diff --git a/devices/tests/dummy/pyproject.toml b/devices/tests/dummy/pyproject.toml
index 43d57f5262fc07c97629b0aee84f9e692dbbca82..ca05cb7943a001cb3f6cf83d7c37277bfce1b48c 100644
--- a/devices/tests/dummy/pyproject.toml
+++ b/devices/tests/dummy/pyproject.toml
@@ -18,3 +18,14 @@ include = ["xaal.dummy"]
 Homepage = "https://recherche.imt-atlantique.fr/xaal/"
 Documentation = "https://redmine.imt-atlantique.fr/projects/xaal/repository/xaal/entry/code/Python/branches/0.7/devices/tests/dummy/README.rst"
 Source = "https://redmine.imt-atlantique.fr/projects/xaal/repository/xaal/show/code/Python/branches/0.7/devices/tests/dummy"
+
+[tool.ruff]
+line-length = 122
+
+[tool.ruff.format]
+quote-style = "preserve"
+
+[tool.black]
+line-length = 122
+skip-string-normalization = true
+
diff --git a/devices/tests/fakeinput/pyproject.toml b/devices/tests/fakeinput/pyproject.toml
index dfec889362d748e34b325f3896f9732ada249aec..ac3b7ed13a1a2758c3f369e561edfc41bdad0e3c 100644
--- a/devices/tests/fakeinput/pyproject.toml
+++ b/devices/tests/fakeinput/pyproject.toml
@@ -25,3 +25,14 @@ include = ["xaal.fakeinput"]
 Homepage = "https://recherche.imt-atlantique.fr/xaal/"
 Documentation = "https://redmine.imt-atlantique.fr/projects/xaal/repository/xaal/entry/code/Python/branches/0.7/devices/tests/fakeinput/README.rst"
 Source = "https://redmine.imt-atlantique.fr/projects/xaal/repository/xaal/show/code/Python/branches/0.7/devices/tests/fakeinput"
+
+[tool.ruff]
+line-length = 122
+
+[tool.ruff.format]
+quote-style = "preserve"
+
+[tool.black]
+line-length = 122
+skip-string-normalization = true
+
diff --git a/devices/weather/OpenWeatherMap/pyproject.toml b/devices/weather/OpenWeatherMap/pyproject.toml
index 20e459ae31872a62ec144205f0b4c126b99161a6..73f7f5a76e1ac13e81bca0c87a74eeeb8b804056 100644
--- a/devices/weather/OpenWeatherMap/pyproject.toml
+++ b/devices/weather/OpenWeatherMap/pyproject.toml
@@ -17,3 +17,14 @@ dependencies = ["xaal.lib", "xaal.schemas", "pyowm==2.10.0"]
 
 [tool.setuptools.packages.find]
 include = ["xaal.owm"]
+
+[tool.ruff]
+line-length = 122
+
+[tool.ruff.format]
+quote-style = "preserve"
+
+[tool.black]
+line-length = 122
+skip-string-normalization = true
+
diff --git a/libs/lib/pyproject.toml b/libs/lib/pyproject.toml
index 9cdbb0a6d434dcc6c68c5c9ca443111d85454e1c..88cad2e506688b6df3c81545e5573f486573b92e 100644
--- a/libs/lib/pyproject.toml
+++ b/libs/lib/pyproject.toml
@@ -30,8 +30,13 @@ Homepage = "https://recherche.imt-atlantique.fr/xaal/"
 Documentation = "https://redmine.imt-atlantique.fr/projects/xaal/repository/xaal/entry/code/Python/branches/0.7/libs/lib/README.rst"
 Source = "https://redmine.imt-atlantique.fr/projects/xaal/repository/xaal/show/code/Python/branches/0.7/libs/lib"
 
+
 [tool.ruff]
-line-length = 120
+line-length = 122
+
+[tool.ruff.format]
+quote-style = "preserve"
 
 [tool.black]
-line-length = 120
+line-length = 122
+skip-string-normalization = true
diff --git a/libs/monitor/pyproject.toml b/libs/monitor/pyproject.toml
index b657358447e55dc73ba564509a42daa90e51f6af..8532a5eafd23061625df2bdf7b39db80ef8ea1d2 100644
--- a/libs/monitor/pyproject.toml
+++ b/libs/monitor/pyproject.toml
@@ -19,3 +19,14 @@ dependencies = ['xaal.lib']
 Homepage = "https://recherche.imt-atlantique.fr/xaal/"
 Documentation = "https://redmine.imt-atlantique.fr/projects/xaal/repository/xaal/entry/code/Python/branches/0.7/libs/monitor/README.rst"
 Source = "https://redmine.imt-atlantique.fr/projects/xaal/repository/xaal/show/code/Python/branches/0.7/libs/monitor"
+
+[tool.ruff]
+line-length = 122
+
+[tool.ruff.format]
+quote-style = "preserve"
+
+[tool.black]
+line-length = 122
+skip-string-normalization = true
+
diff --git a/libs/schemas/pyproject.toml b/libs/schemas/pyproject.toml
index 70c938ce8267598ab5380ea87009a40935e73524..a81c758fbe715b7d68242c66ca5578c7099dfefd 100644
--- a/libs/schemas/pyproject.toml
+++ b/libs/schemas/pyproject.toml
@@ -20,3 +20,14 @@ dependencies = ['xaal.lib']
 Homepage = "https://recherche.imt-atlantique.fr/xaal/"
 Documentation = "https://redmine.imt-atlantique.fr/projects/xaal/repository/xaal/entry/code/Python/branches/0.7/libs/schemas/README.rst"
 Source = "https://redmine.imt-atlantique.fr/projects/xaal/repository/xaal/show/code/Python/branches/0.7/libs/schemas"
+
+[tool.ruff]
+line-length = 122
+
+[tool.ruff.format]
+quote-style = "preserve"
+
+[tool.black]
+line-length = 122
+skip-string-normalization = true
+