diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index b09964393c0940399aec1d55ef200d511f345526..a130caf9fb49c86e340ce5ea1c508f8f289809d7 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -118,8 +118,19 @@ code_style:
     - meta_build
   script:
     - python3 -V
-    - cd src
-    - tox run -e flake8
+    - tox run
+  allow_failure: true
+  rules:
+    - when: always
+
+ruff:
+  image: $CI_REGISTRY_IMAGE/build_image:latest
+  stage: test
+  needs:
+    - meta_build
+  script:
+    - python3 -V
+    - tox run -e ruff
   allow_failure: true
   rules:
     - when: always
diff --git a/.ruff.extended.toml b/.ruff.extended.toml
index 0ff3a93c50e5b5ac50517c123078ebe7f9ca212a..7efb7902787b34f314321e620ad3446f67068a00 100644
--- a/.ruff.extended.toml
+++ b/.ruff.extended.toml
@@ -1,27 +1 @@
-extend = ".ruff.toml"
-
-extend-select = [
-    "A",
-    "ARG",
-    "B",
-    "COM",
-    "DJ",
-    "EM",
-    "ERA",
-    "FBT",
-    "FIX",
-    "I",
-    "INP",
-    "N",
-    "PL",
-    "Q",
-    "RET",
-    "RSE",
-    "RUF",
-    "SIM",
-    "TD",
-    "TRY",
-    "UP","BLE","S",
-]
-
-ignore = ["TID252", "TD002", "RUF012", "RUF100", "PLR091", "PLR2004"]
+extend = "src/.ruff.extended.toml"
diff --git a/.ruff.toml b/.ruff.toml
index a9f205c7bbfcfeb0c34304d50d21c865729fd245..4107db6a5d511a4abea6e85ac50f41e4ecd3d17c 100644
--- a/.ruff.toml
+++ b/.ruff.toml
@@ -1,62 +1 @@
-line-length = 160
-extend-exclude = ["venv", ".tox", "migrations"]
-
-extend-select = [
-    "C4",
-    "DTZ",
-    "E",
-    "F",
-    "G",
-    "I002",
-    "INT",
-    "ISC",
-    "PGH",
-    "PIE",
-    "PTH",
-    "RUF",
-    "T20",
-    "TID",
-    "W",
-    "T10",
-    ]
-ignore = ["ISC001", "TID252", "TD002", "RUF012", "RUF100", "PLR091", "PLR2004"]
-
-[format]
-# Use single quotes for non-triple-quoted strings.
-quote-style = "single"
-
-[flake8-quotes]
-inline-quotes = "single"
-
-[flake8-unused-arguments]
-ignore-variadic-names = true
-
-[isort]
-section-order = [
-    "future",
-    "standard-library",
-    "third-party",
-    "django",
-    "first-party",
-    "hub",
-    "local-apps",
-    "local-folder",
-]
-[isort.sections]
-# Group all Django imports into a separate section.
-"hub" = ["hub", "core"]
-"local-apps" = ["backoffice", "api", "plainui"]
-"django" = [
-    "django-cors-headers",
-    "django-cors-middleware",
-    "django-debug-toolbar",
-    "django-environ",
-    "django-modeltranslation",
-    "django-oauth-toolkit",
-    "django-ratelimit",
-    "django-redis",
-    "django-storages",
-    "django-widget-tweaks",
-    "django_bootstrap5",
-    "djangorestframework",
-]
+extend = "src/.ruff.toml"
diff --git a/src/.ruff.extended.toml b/src/.ruff.extended.toml
new file mode 100644
index 0000000000000000000000000000000000000000..0ff3a93c50e5b5ac50517c123078ebe7f9ca212a
--- /dev/null
+++ b/src/.ruff.extended.toml
@@ -0,0 +1,27 @@
+extend = ".ruff.toml"
+
+extend-select = [
+    "A",
+    "ARG",
+    "B",
+    "COM",
+    "DJ",
+    "EM",
+    "ERA",
+    "FBT",
+    "FIX",
+    "I",
+    "INP",
+    "N",
+    "PL",
+    "Q",
+    "RET",
+    "RSE",
+    "RUF",
+    "SIM",
+    "TD",
+    "TRY",
+    "UP","BLE","S",
+]
+
+ignore = ["TID252", "TD002", "RUF012", "RUF100", "PLR091", "PLR2004"]
diff --git a/src/.ruff.toml b/src/.ruff.toml
new file mode 100644
index 0000000000000000000000000000000000000000..a9f205c7bbfcfeb0c34304d50d21c865729fd245
--- /dev/null
+++ b/src/.ruff.toml
@@ -0,0 +1,62 @@
+line-length = 160
+extend-exclude = ["venv", ".tox", "migrations"]
+
+extend-select = [
+    "C4",
+    "DTZ",
+    "E",
+    "F",
+    "G",
+    "I002",
+    "INT",
+    "ISC",
+    "PGH",
+    "PIE",
+    "PTH",
+    "RUF",
+    "T20",
+    "TID",
+    "W",
+    "T10",
+    ]
+ignore = ["ISC001", "TID252", "TD002", "RUF012", "RUF100", "PLR091", "PLR2004"]
+
+[format]
+# Use single quotes for non-triple-quoted strings.
+quote-style = "single"
+
+[flake8-quotes]
+inline-quotes = "single"
+
+[flake8-unused-arguments]
+ignore-variadic-names = true
+
+[isort]
+section-order = [
+    "future",
+    "standard-library",
+    "third-party",
+    "django",
+    "first-party",
+    "hub",
+    "local-apps",
+    "local-folder",
+]
+[isort.sections]
+# Group all Django imports into a separate section.
+"hub" = ["hub", "core"]
+"local-apps" = ["backoffice", "api", "plainui"]
+"django" = [
+    "django-cors-headers",
+    "django-cors-middleware",
+    "django-debug-toolbar",
+    "django-environ",
+    "django-modeltranslation",
+    "django-oauth-toolkit",
+    "django-ratelimit",
+    "django-redis",
+    "django-storages",
+    "django-widget-tweaks",
+    "django_bootstrap5",
+    "djangorestframework",
+]
diff --git a/src/core/management/commands/.ruff.toml b/src/core/management/commands/.ruff.toml
index 8a74e9f65849c2a5109392bf06581de1b2fec10a..d576aff099915ca16b499857f2106ea67aca697c 100644
--- a/src/core/management/commands/.ruff.toml
+++ b/src/core/management/commands/.ruff.toml
@@ -1,3 +1,3 @@
-extend = "../../../../.ruff.toml"
+extend = "../../../.ruff.toml"
 
 ignore = ["T201"]
diff --git a/src/hub/settings/.ruff.toml b/src/hub/settings/.ruff.toml
index d576aff099915ca16b499857f2106ea67aca697c..5afc49c4b77d5bf7129815917deedcaa9d83450f 100644
--- a/src/hub/settings/.ruff.toml
+++ b/src/hub/settings/.ruff.toml
@@ -1,3 +1,3 @@
-extend = "../../../.ruff.toml"
+extend = "../../.ruff.toml"
 
 ignore = ["T201"]
diff --git a/src/requirements-dev.txt b/src/requirements-dev.txt
index f21b50bc8de3cbc015bbb1b3b1cdba437e74874b..165f410a5c071d683023ab232088a934ca3a850a 100644
--- a/src/requirements-dev.txt
+++ b/src/requirements-dev.txt
@@ -1,4 +1,5 @@
-flake8 ~= 6.1.0
-tox ~= 4.11.3
 coverage ~= 7.3.2
 debugpy ~= 1.8.0
+flake8 ~= 6.1.0
+ruff ~= 0.1.5
+tox ~= 4.11.3
diff --git a/src/tox.ini b/src/tox.ini
index a9c809dee5b8ebd4817d614e0a57485690678247..4569170cdf438e6f4829a80682f10e4d02dbb734 100644
--- a/src/tox.ini
+++ b/src/tox.ini
@@ -1,7 +1,7 @@
 [tox]
 requires =
     tox>=4
-env_list = flake8, migrations, django-test
+env_list = flake8, ruff, migrations, django-test
 
 [hub]
 setenv=
@@ -28,6 +28,14 @@ allowlist_externals=
 commands =
     flake8 .
 
+[testenv:ruff]
+skip_install = true
+sitepackages = true
+allowlist_externals=
+    ruff
+commands =
+    ruff .
+
 [testenv:app_version]
 system_site_packages = true
 setenv =
diff --git a/tox.ini b/tox.ini
index 2a74b9995bcf1cc03a8eb5e16a083919f12ae307..e8b78b0b3e5bad75805e1201f5b7f65370a03eaf 100644
--- a/tox.ini
+++ b/tox.ini
@@ -1,3 +1,16 @@
+[tox]
+requires =
+    tox>=4
+env_list = ruff
+
+[testenv:ruff]
+skip_install = true
+sitepackages = true
+allowlist_externals=
+    ruff
+commands =
+    ruff .
+
 [flake8]
 max-line-length = 160
 per-file-ignores =