diff --git a/.github/workflows/release-package.yml b/.github/workflows/release-package.yml
index 02fb4507..f13593fe 100644
--- a/.github/workflows/release-package.yml
+++ b/.github/workflows/release-package.yml
@@ -7,6 +7,10 @@ on:
 jobs:
   main:
     runs-on: ubuntu-latest
+    permissions:
+      id-token: write
+      contents: write
+    environment: pypi
     steps:
       - uses: actions/checkout@v4
       - name: Set up Python 3.10
@@ -19,9 +23,10 @@ jobs:
       - name: Build package
         run: |
           make build
+      - name: Publish package to Pypi
+        uses: pypa/gh-action-pypi-publish@release/v1
         env:
-          TWINE_USERNAME: ${{ secrets.pypi_username }}
-          TWINE_PASSWORD: ${{ secrets.pypi_password }}
+          repository-url: https://pypi.org/project/UnleashClient/
       - name: Build docs
         run: |
           make install-docs
@@ -31,13 +36,4 @@ jobs:
         uses: peaceiris/actions-gh-pages@v3
         with:
           github_token: ${{ secrets.GITHUB_TOKEN }}
-          publish_dir: ./docs/_build/html
-      - name: Notify Slack of pipeline completion
-        uses: 8398a7/action-slack@v2
-        with:
-          status: ${{ job.status }}
-          author_name: Github Action
-        env:
-          GITHUB_TOKEN: ${{ secrets.github_slack_token }}
-          SLACK_WEBHOOK_URL: ${{ secrets.slack_webhook }}
-        if: always()
+          publish_dir: ./docs/_build/htmlg
diff --git a/UnleashClient/api/metrics.py b/UnleashClient/api/metrics.py
index f1816069..757db42c 100644
--- a/UnleashClient/api/metrics.py
+++ b/UnleashClient/api/metrics.py
@@ -46,6 +46,7 @@ def send_metrics(
 
         LOGGER.info("Unleash Client metrics successfully sent!")
 
+
         return True
     except requests.RequestException as exc:
         LOGGER.warning(
diff --git a/UnleashClient/loader.py b/UnleashClient/loader.py
index 02b39c10..f9e6e799 100644
--- a/UnleashClient/loader.py
+++ b/UnleashClient/loader.py
@@ -132,7 +132,7 @@ def load_features(
             del feature_toggles[feature]
 
     # Update existing objects
-    for feature in feature_toggles.keys():
+    for feature in list(feature_toggles.keys()):
         feature_for_update = feature_toggles[feature]
         strategies = parsed_features[feature]["strategies"]
 
diff --git a/UnleashClient/periodic_tasks/send_metrics.py b/UnleashClient/periodic_tasks/send_metrics.py
index e6076c49..d33e8f79 100644
--- a/UnleashClient/periodic_tasks/send_metrics.py
+++ b/UnleashClient/periodic_tasks/send_metrics.py
@@ -13,15 +13,15 @@ def aggregate_metrics(
 ) -> dict:
     feature_stats_list = []
 
-    for feature_name in features.keys():
-        if not (features[feature_name].yes_count or features[feature_name].no_count):
+    for feature in features.values():
+        if not (feature.yes_count or feature.no_count):
             continue
 
         feature_stats = {
-            features[feature_name].name: {
-                "yes": features[feature_name].yes_count,
-                "no": features[feature_name].no_count,
-                "variants": features[feature_name].variant_counts,
+            feature.name: {
+                "yes": feature.yes_count,
+                "no": feature.no_count,
+                "variants": feature.variant_counts,
             }
         }
 
@@ -42,8 +42,8 @@ def aggregate_and_send_metrics(
 ) -> None:
     feature_stats_dict = aggregate_metrics(features)
 
-    for feature_name in features.keys():
-        features[feature_name].reset_stats()
+    for feature in features.values():
+        feature.reset_stats()
 
     metrics_request = {
         "appName": app_name,
diff --git a/requirements.txt b/requirements.txt
index cee626e5..1a72b737 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -23,6 +23,7 @@ pytest-xdist
 responses
 ruff
 tox
+pytz
 
 # - Testing ()
 blinker
diff --git a/tests/unit_tests/test_loader.py b/tests/unit_tests/test_loader.py
index e6866c4b..65c146cb 100644
--- a/tests/unit_tests/test_loader.py
+++ b/tests/unit_tests/test_loader.py
@@ -21,11 +21,10 @@ def test_loader_initialization(cache_full):  # noqa: F811
         in_memory_features["GradualRolloutUserID"].strategies[0], GradualRolloutUserId
     )
 
-    for feature_name in in_memory_features.keys():
+    for feature_name, feature in in_memory_features.items():
         if feature_name == "Garbage":  # Don't check purposely invalid strategy.
             break
 
-        feature = in_memory_features[feature_name]
         assert len(feature.strategies) > 0
         strategy = feature.strategies[0]