diff --git a/.github/workflows/conventional_commits.yml b/.github/workflows/conventional_commits.yml
new file mode 100644
index 0000000000000000000000000000000000000000..6f0e37fa8d3dc6a147787779f7bb8f337746c3a5
--- /dev/null
+++ b/.github/workflows/conventional_commits.yml
@@ -0,0 +1,16 @@
+name: Conventional Commits
+
+on:
+  pull_request:
+    branches: [main]
+
+jobs:
+  build:
+    name: Conventional Commits
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout@v3
+      - uses: webiny/action-conventional-commits@v1.1.0
+        with:
+          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+          allowed-commit-types: "feat,fix"
diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml
index b7c6e679c2f89003a14023fbd12afc30f8b7c5db..dcd301e5d631cab642bd45c813ddc8d86e86f7a4 100644
--- a/.github/workflows/lint.yml
+++ b/.github/workflows/lint.yml
@@ -37,4 +37,4 @@ jobs:
           poetry install
       - name: Analyzing the code with our lint
         run: |
-          make lint
\ No newline at end of file
+          make lint
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 43af57e5ed2e38785c50adbd36cbf70afd300b36..98516d19eb4ce05ad8f23b41125d364f2b867c02 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -28,3 +28,9 @@ repos:
       - id: trailing-whitespace
       - id: end-of-file-fixer
       - id: check-yaml
+
+  - repo: https://github.com/alessandrojcm/commitlint-pre-commit-hook
+    rev: v9.10.0
+    hooks:
+        - id: commitlint
+          stages: [commit-msg]
diff --git a/semantic_router/__init__.py b/semantic_router/__init__.py
index 07735312c6cd8a682726373dcf20fa000a020c13..1c604af8065f9b2e1519e6f92daf7af2739d584b 100644
--- a/semantic_router/__init__.py
+++ b/semantic_router/__init__.py
@@ -1,5 +1,5 @@
 from semantic_router.hybrid_layer import HybridRouteLayer
-from semantic_router.layer import RouteLayer, LayerConfig
+from semantic_router.layer import LayerConfig, RouteLayer
 from semantic_router.route import Route
 
 __all__ = ["RouteLayer", "HybridRouteLayer", "Route", "LayerConfig"]
diff --git a/semantic_router/hybrid_layer.py b/semantic_router/hybrid_layer.py
index 22f6573c8d5d88b1ac083628075a9fed3ec28037..fc63cfa6ec2dc618849ffb54c0a49b88288470dd 100644
--- a/semantic_router/hybrid_layer.py
+++ b/semantic_router/hybrid_layer.py
@@ -7,9 +7,8 @@ from semantic_router.encoders import (
     CohereEncoder,
     OpenAIEncoder,
 )
-from semantic_router.utils.logger import logger
-
 from semantic_router.route import Route
+from semantic_router.utils.logger import logger
 
 
 class HybridRouteLayer:
diff --git a/semantic_router/layer.py b/semantic_router/layer.py
index dae040a5d7537f0f22f0c7edeeb035f58e7eb0fb..5b2aad846ad8531fbeb02504f42e1688b22ceebc 100644
--- a/semantic_router/layer.py
+++ b/semantic_router/layer.py
@@ -10,10 +10,9 @@ from semantic_router.encoders import (
     OpenAIEncoder,
 )
 from semantic_router.linear import similarity_matrix, top_scores
-from semantic_router.utils.logger import logger
-
 from semantic_router.route import Route
 from semantic_router.schema import Encoder, EncoderType, RouteChoice
+from semantic_router.utils.logger import logger
 
 
 def is_valid(layer_config: str) -> bool:
diff --git a/semantic_router/route.py b/semantic_router/route.py
index 30c20887ebcd7073fe2a32630d0d566ada3c945c..12afa7fe0a6824882a6a9da4d2d3845f6b68a62c 100644
--- a/semantic_router/route.py
+++ b/semantic_router/route.py
@@ -4,10 +4,10 @@ from typing import Any, Callable, Union
 
 from pydantic import BaseModel
 
+from semantic_router.schema import RouteChoice
 from semantic_router.utils import function_call
 from semantic_router.utils.llm import llm
 from semantic_router.utils.logger import logger
-from semantic_router.schema import RouteChoice
 
 
 def is_valid(route_config: str) -> bool:
diff --git a/semantic_router/schema.py b/semantic_router/schema.py
index be486888a70f9a0b27d705636038931206e3f1cc..b7a3c9faf7817e48215bcebdab8f3e7140aae970 100644
--- a/semantic_router/schema.py
+++ b/semantic_router/schema.py
@@ -1,7 +1,7 @@
 from enum import Enum
 
-from pydantic.dataclasses import dataclass
 from pydantic import BaseModel
+from pydantic.dataclasses import dataclass
 
 from semantic_router.encoders import (
     BaseEncoder,
diff --git a/tests/unit/test_layer.py b/tests/unit/test_layer.py
index b8f317935e656c705b3f1d64a47d02e7a53d8ac7..45b57472f0fabfb7b7694e2ee9072540cee0bd23 100644
--- a/tests/unit/test_layer.py
+++ b/tests/unit/test_layer.py
@@ -1,7 +1,8 @@
 import os
-import pytest
 from unittest.mock import mock_open, patch
 
+import pytest
+
 from semantic_router.encoders import BaseEncoder, CohereEncoder, OpenAIEncoder
 from semantic_router.layer import LayerConfig, RouteLayer
 from semantic_router.route import Route
diff --git a/tests/unit/test_route.py b/tests/unit/test_route.py
index 44cf2276b937e6e36faf01a496106b297c15b29d..09a5d235f0183ebd70c1fa1bbdbe7fd842ee6d09 100644
--- a/tests/unit/test_route.py
+++ b/tests/unit/test_route.py
@@ -1,7 +1,6 @@
 from unittest.mock import Mock, patch  # , AsyncMock
 
 # import pytest
-
 from semantic_router.route import Route, is_valid