From bb628f355fb8ca894633eeb4d8371df6a9dc62de Mon Sep 17 00:00:00 2001
From: Yassine Doghri <yassine@doghri.fr>
Date: Sun, 28 Apr 2024 16:39:01 +0000
Subject: [PATCH] refactor: add modules folder to phpstan paths + fix errors

---
 app/Common.php                                |  4 +-
 app/Config/Fediverse.php                      |  6 +-
 app/Controllers/ActorController.php           |  2 +-
 app/Controllers/ColorsController.php          |  3 +-
 app/Controllers/EpisodeCommentController.php  |  5 +-
 app/Controllers/EpisodeController.php         | 22 +++----
 app/Controllers/HomeController.php            |  3 +-
 app/Controllers/PodcastController.php         |  4 +-
 app/Controllers/PostController.php            |  2 +-
 app/Entities/Episode.php                      |  3 +-
 app/Entities/Person.php                       |  3 +-
 app/Entities/Podcast.php                      |  5 +-
 app/Helpers/misc_helper.php                   | 15 +++--
 app/Helpers/page_helper.php                   |  5 +-
 app/Helpers/seo_helper.php                    | 14 ++---
 app/Libraries/Router.php                      |  2 +-
 app/Models/PodcastModel.php                   |  3 +-
 app/Models/PostModel.php                      |  2 +-
 composer.json                                 |  2 +-
 composer.lock                                 | 61 ++++++++++---------
 modules/Admin/Config/Routes.php               |  3 +-
 modules/Admin/Controllers/AboutController.php |  3 +-
 .../Admin/Controllers/DashboardController.php |  5 +-
 .../Admin/Controllers/EpisodeController.php   |  2 +-
 .../Admin/Controllers/PodcastController.php   |  3 +-
 .../Controllers/VideoClipsController.php      | 10 ++-
 modules/Admin/Language/ar/Breadcrumb.php      |  4 +-
 modules/Admin/Language/br/Breadcrumb.php      |  4 +-
 modules/Admin/Language/ca/Breadcrumb.php      |  4 +-
 modules/Admin/Language/da/Breadcrumb.php      |  4 +-
 modules/Admin/Language/de/Breadcrumb.php      |  4 +-
 modules/Admin/Language/el/Breadcrumb.php      |  4 +-
 modules/Admin/Language/en/Breadcrumb.php      |  4 +-
 modules/Admin/Language/es/Breadcrumb.php      |  4 +-
 modules/Admin/Language/eu/Breadcrumb.php      |  4 +-
 modules/Admin/Language/fa/Breadcrumb.php      |  4 +-
 modules/Admin/Language/fr/Breadcrumb.php      |  4 +-
 modules/Admin/Language/fr2/Breadcrumb.php     |  4 +-
 modules/Admin/Language/fr_CA/Breadcrumb.php   |  4 +-
 modules/Admin/Language/fr_trad/Breadcrumb.php |  4 +-
 modules/Admin/Language/gd/Breadcrumb.php      |  4 +-
 modules/Admin/Language/gl/Breadcrumb.php      |  4 +-
 modules/Admin/Language/id/Breadcrumb.php      |  4 +-
 modules/Admin/Language/it/Breadcrumb.php      |  4 +-
 modules/Admin/Language/ja/Breadcrumb.php      |  4 +-
 modules/Admin/Language/kk/Breadcrumb.php      |  4 +-
 modules/Admin/Language/ko/Breadcrumb.php      |  4 +-
 modules/Admin/Language/nl/Breadcrumb.php      |  4 +-
 modules/Admin/Language/nn-NO/Breadcrumb.php   |  4 +-
 modules/Admin/Language/oc/Breadcrumb.php      |  4 +-
 modules/Admin/Language/pl/Breadcrumb.php      |  4 +-
 modules/Admin/Language/pt-BR/Breadcrumb.php   |  4 +-
 modules/Admin/Language/pt/Breadcrumb.php      |  4 +-
 modules/Admin/Language/ro/Breadcrumb.php      |  4 +-
 modules/Admin/Language/ru/Breadcrumb.php      |  4 +-
 modules/Admin/Language/sk/Breadcrumb.php      |  4 +-
 modules/Admin/Language/sr-Latn/Breadcrumb.php |  4 +-
 modules/Admin/Language/sv/Breadcrumb.php      |  4 +-
 modules/Admin/Language/uk/Breadcrumb.php      |  4 +-
 modules/Admin/Language/zh-Hans/Breadcrumb.php |  4 +-
 modules/Admin/Language/zh-Hant/Breadcrumb.php |  4 +-
 modules/Analytics/Config/Routes.php           | 12 ++--
 .../Controllers/AnalyticsController.php       |  2 +
 .../Analytics/Entities/AnalyticsPodcasts.php  |  2 +-
 .../Entities/AnalyticsPodcastsByCountry.php   |  2 +-
 .../Entities/AnalyticsPodcastsByEpisode.php   |  2 +-
 .../Entities/AnalyticsPodcastsByHour.php      |  2 +-
 .../Entities/AnalyticsPodcastsByPlayer.php    |  2 +-
 .../Entities/AnalyticsPodcastsByRegion.php    |  2 +-
 .../Entities/AnalyticsPodcastsByService.php   |  2 +-
 .../AnalyticsPodcastsBySubscription.php       |  2 +-
 .../Entities/AnalyticsUnknownUserAgent.php    |  2 +-
 .../Entities/AnalyticsWebsiteByBrowser.php    |  2 +-
 .../Entities/AnalyticsWebsiteByEntryPage.php  |  2 +-
 .../Entities/AnalyticsWebsiteByReferer.php    |  2 +-
 .../Analytics/Helpers/analytics_helper.php    | 34 +++++++----
 .../Models/AnalyticsPodcastModel.php          |  3 +-
 ...hp => AnalyticsUnknownUserAgentsModel.php} |  2 +-
 modules/Api/Rest/V1/Config/Registrar.php      |  3 +
 modules/Api/Rest/V1/Config/Routes.php         |  4 +-
 modules/Api/Rest/V1/Config/Services.php       |  7 +--
 .../Rest/V1/Controllers/EpisodeController.php | 10 +--
 .../V1/Controllers/ExceptionController.php    |  4 +-
 .../Rest/V1/Controllers/PodcastController.php |  9 +--
 .../{Exceptions.php => RestApiExceptions.php} |  3 +-
 modules/Api/Rest/V1/Filters/ApiFilter.php     |  2 +-
 modules/Auth/Auth.php                         |  8 +--
 modules/Auth/Commands/RolesDoc.php            | 27 ++++----
 modules/Auth/Config/Auth.php                  | 13 ++--
 modules/Auth/Config/AuthGroups.php            |  4 +-
 modules/Auth/Config/AuthRoutes.php            |  3 +
 modules/Auth/Config/AuthToken.php             |  2 +
 modules/Auth/Config/Routes.php                |  3 +-
 modules/Auth/Config/Services.php              |  3 +-
 .../Controllers/ContributorController.php     |  1 +
 .../Auth/Controllers/MagicLinkController.php  | 26 ++++----
 .../Auth/Controllers/MyAccountController.php  | 21 +++----
 modules/Auth/Controllers/UserController.php   |  6 +-
 modules/Auth/Models/UserModel.php             |  2 +-
 modules/Fediverse/Commands/Broadcast.php      |  5 +-
 modules/Fediverse/Config/Registrar.php        |  3 +
 .../Controllers/ActivityPubController.php     |  4 +-
 .../Fediverse/Controllers/ActorController.php |  6 +-
 .../Fediverse/Controllers/BlockController.php |  2 +-
 .../Controllers/NodeInfo2Controller.php       |  3 +-
 .../Fediverse/Controllers/PostController.php  | 11 ++--
 modules/Fediverse/Core/AbstractObject.php     |  2 +-
 modules/Fediverse/Entities/Activity.php       |  2 +-
 modules/Fediverse/Entities/Notification.php   |  3 +-
 modules/Fediverse/Entities/Post.php           |  2 +-
 modules/Fediverse/Filters/FediverseFilter.php |  1 +
 .../Fediverse/Helpers/fediverse_helper.php    |  5 +-
 modules/Fediverse/HttpSignature.php           |  7 ++-
 modules/Fediverse/Models/ActivityModel.php    | 12 ++--
 modules/Fediverse/Models/ActorModel.php       | 30 +++++----
 .../Fediverse/Models/BlockedDomainModel.php   | 11 ++--
 modules/Fediverse/Models/FavouriteModel.php   |  4 +-
 modules/Fediverse/Models/FollowModel.php      |  4 +-
 .../Fediverse/Models/NotificationModel.php    |  2 +-
 modules/Fediverse/Models/PostModel.php        | 39 +++++++-----
 modules/Fediverse/Models/PreviewCardModel.php |  9 ++-
 modules/Fediverse/WebFinger.php               |  2 +-
 modules/Install/Commands/CreateSuperadmin.php |  1 -
 modules/Install/Config/Routes.php             |  2 +-
 .../Install/Controllers/InstallController.php | 11 ++--
 modules/Media/Config/Services.php             |  3 +-
 modules/Media/Entities/BaseMedia.php          |  2 +-
 modules/Media/Entities/Chapters.php           |  6 +-
 modules/Media/Entities/Image.php              |  2 +
 modules/Media/Entities/Transcript.php         |  6 +-
 modules/Media/FileManagers/FS.php             |  2 +-
 modules/Media/Helpers/url_helper.php          |  7 +--
 modules/Media/Models/MediaModel.php           |  6 +-
 modules/Media/TranscriptParser.php            |  2 +-
 modules/MediaClipper/Commands/Generate.php    |  3 +-
 modules/MediaClipper/VideoClipper.php         | 13 ++--
 modules/Platforms/Config/Routes.php           |  7 +--
 .../Controllers/PlatformController.php        |  2 +-
 modules/Platforms/Models/PlatformModel.php    |  4 +-
 .../PodcastImport/Commands/PodcastImport.php  | 29 +++------
 modules/PodcastImport/Config/Routes.php       |  3 +-
 modules/PremiumPodcasts/Config/Registrar.php  |  3 +
 modules/PremiumPodcasts/Config/Routes.php     |  3 +-
 modules/PremiumPodcasts/Config/Services.php   |  2 +-
 .../PremiumPodcasts/Entities/Subscription.php |  2 +-
 .../Models/SubscriptionModel.php              | 13 ++--
 modules/WebSub/Commands/Publish.php           |  5 +-
 phpstan.neon                                  |  4 +-
 tests/modules/Api/Rest/V1/EpisodeTest.php     |  3 +-
 tests/modules/Api/Rest/V1/PodcastTest.php     |  3 +-
 themes/cp_admin/episode/embed.php             |  4 +-
 themes/cp_admin/episode/video_clips_new.php   |  4 +-
 themes/cp_admin/import/_queue_table.php       |  5 +-
 themes/cp_admin/settings/general.php          |  4 +-
 themes/cp_admin/settings/theme.php            |  4 +-
 themes/cp_app/embed.php                       | 12 ++--
 themes/cp_auth/email_2fa_show.php             |  4 +-
 themes/cp_auth/email_2fa_verify.php           |  4 +-
 themes/cp_auth/email_activate_show.php        |  4 +-
 themes/cp_auth/login.php                      |  4 +-
 themes/cp_auth/magic_link_form.php            |  4 +-
 themes/cp_auth/magic_link_message.php         |  4 +-
 themes/cp_auth/magic_link_set_password.php    |  4 +-
 themes/cp_auth/register.php                   |  4 +-
 themes/cp_install/database_config.php         | 12 ++--
 themes/cp_install/instance_config.php         | 13 ++--
 166 files changed, 452 insertions(+), 526 deletions(-)
 rename modules/Analytics/Models/{AnalyticsUnknownUseragentsModel.php => AnalyticsUnknownUserAgentsModel.php} (94%)
 rename modules/Api/Rest/V1/Core/{Exceptions.php => RestApiExceptions.php} (91%)

diff --git a/app/Common.php b/app/Common.php
index c86b60dae2..6f720768ac 100644
--- a/app/Common.php
+++ b/app/Common.php
@@ -2,7 +2,6 @@
 
 declare(strict_types=1);
 
-use Config\View;
 use ViewThemes\Theme;
 
 /**
@@ -37,7 +36,8 @@ if (! function_exists('view')) {
         /** @var CodeIgniter\View\View $renderer */
         $renderer = single_service('renderer', $path);
 
-        $saveData = config(View::class)->saveData;
+        $saveData = config('View')
+->saveData;
 
         if (array_key_exists('saveData', $options)) {
             $saveData = (bool) $options['saveData'];
diff --git a/app/Config/Fediverse.php b/app/Config/Fediverse.php
index e9f4668065..b622d2a36a 100644
--- a/app/Config/Fediverse.php
+++ b/app/Config/Fediverse.php
@@ -34,10 +34,10 @@ class Fediverse extends FediverseBaseConfig
         try {
             $appTheme = service('settings')
                 ->get('App.theme');
-            $defaultBanner = config(Images::class)
-                ->podcastBannerDefaultPaths[$appTheme] ?? config(Images::class)->podcastBannerDefaultPaths['default'];
+            $defaultBanner = config('Images')
+                ->podcastBannerDefaultPaths[$appTheme] ?? config('Images')->podcastBannerDefaultPaths['default'];
         } catch (Exception) {
-            $defaultBanner = config(Images::class)
+            $defaultBanner = config('Images')
                 ->podcastBannerDefaultPaths['default'];
         }
 
diff --git a/app/Controllers/ActorController.php b/app/Controllers/ActorController.php
index 298a6028c7..bb879be25c 100644
--- a/app/Controllers/ActorController.php
+++ b/app/Controllers/ActorController.php
@@ -18,7 +18,7 @@ class ActorController extends FediverseActorController
     use AnalyticsTrait;
 
     /**
-     * @var string[]
+     * @var list<string>
      */
     protected $helpers = ['svg', 'components', 'misc', 'seo'];
 
diff --git a/app/Controllers/ColorsController.php b/app/Controllers/ColorsController.php
index 4aa1a47c51..82d6eed934 100644
--- a/app/Controllers/ColorsController.php
+++ b/app/Controllers/ColorsController.php
@@ -12,7 +12,6 @@ namespace App\Controllers;
 
 use CodeIgniter\Controller;
 use CodeIgniter\HTTP\Response;
-use Config\Colors;
 
 class ColorsController extends Controller
 {
@@ -29,7 +28,7 @@ class ColorsController extends Controller
         if (
             ! ($colorsCssBody = cache($cacheName))
         ) {
-            $colorThemes = config(Colors::class)
+            $colorThemes = config('Colors')
                 ->themes;
 
             $colorsCssBody = '';
diff --git a/app/Controllers/EpisodeCommentController.php b/app/Controllers/EpisodeCommentController.php
index 44486b0a28..87f2864e13 100644
--- a/app/Controllers/EpisodeCommentController.php
+++ b/app/Controllers/EpisodeCommentController.php
@@ -16,7 +16,6 @@ use App\Entities\Podcast;
 use App\Libraries\CommentObject;
 use App\Models\EpisodeCommentModel;
 use App\Models\EpisodeModel;
-use App\Models\LikeModel;
 use App\Models\PodcastModel;
 use CodeIgniter\Exceptions\PageNotFoundException;
 use CodeIgniter\HTTP\RedirectResponse;
@@ -170,7 +169,7 @@ class EpisodeCommentController extends BaseController
             return redirect()->back();
         }
 
-        model(LikeModel::class)
+        model('LikeModel')
             ->toggleLike($interactAsActor, $this->comment);
 
         return redirect()->back();
@@ -182,7 +181,7 @@ class EpisodeCommentController extends BaseController
             return redirect()->back();
         }
 
-        model(LikeModel::class)
+        model('LikeModel')
             ->toggleLike($interactAsActor, $this->comment);
 
         return redirect()->back();
diff --git a/app/Controllers/EpisodeController.php b/app/Controllers/EpisodeController.php
index 5a7cc54db5..335d96d882 100644
--- a/app/Controllers/EpisodeController.php
+++ b/app/Controllers/EpisodeController.php
@@ -16,13 +16,11 @@ use App\Libraries\NoteObject;
 use App\Libraries\PodcastEpisode;
 use App\Models\EpisodeModel;
 use App\Models\PodcastModel;
-use App\Models\PostModel;
 use CodeIgniter\Database\BaseBuilder;
 use CodeIgniter\Exceptions\PageNotFoundException;
 use CodeIgniter\HTTP\Response;
 use CodeIgniter\HTTP\ResponseInterface;
 use Config\Embed;
-use Config\Images;
 use Config\Services;
 use Modules\Analytics\AnalyticsTrait;
 use Modules\Fediverse\Objects\OrderedCollectionObject;
@@ -351,15 +349,15 @@ class EpisodeController extends BaseController
             'author_url'    => $this->podcast->link,
             'html'          => '<iframe src="' .
                 $this->episode->embed_url .
-                '" width="100%" height="' . config(Embed::class)->height . '" frameborder="0" scrolling="no"></iframe>',
-            'width' => config(Embed::class)
+                '" width="100%" height="' . config('Embed')->height . '" frameborder="0" scrolling="no"></iframe>',
+            'width' => config('Embed')
                 ->width,
-            'height' => config(Embed::class)
+            'height' => config('Embed')
                 ->height,
             'thumbnail_url'   => $this->episode->cover->og_url,
-            'thumbnail_width' => config(Images::class)
+            'thumbnail_width' => config('Images')
                 ->podcastCoverSizes['og']['width'],
-            'thumbnail_height' => config(Images::class)
+            'thumbnail_height' => config('Images')
                 ->podcastCoverSizes['og']['height'],
         ]);
     }
@@ -376,8 +374,8 @@ class EpisodeController extends BaseController
         $oembed->addChild('author_name', $this->podcast->title);
         $oembed->addChild('author_url', $this->podcast->link);
         $oembed->addChild('thumbnail', $this->episode->cover->og_url);
-        $oembed->addChild('thumbnail_width', (string) config(Images::class)->podcastCoverSizes['og']['width']);
-        $oembed->addChild('thumbnail_height', (string) config(Images::class)->podcastCoverSizes['og']['height']);
+        $oembed->addChild('thumbnail_width', (string) config('Images')->podcastCoverSizes['og']['width']);
+        $oembed->addChild('thumbnail_height', (string) config('Images')->podcastCoverSizes['og']['height']);
         $oembed->addChild(
             'html',
             htmlspecialchars(
@@ -388,8 +386,8 @@ class EpisodeController extends BaseController
                     )->height . '" frameborder="0" scrolling="no"></iframe>',
             ),
         );
-        $oembed->addChild('width', (string) config(Embed::class)->width);
-        $oembed->addChild('height', (string) config(Embed::class)->height);
+        $oembed->addChild('width', (string) config('Embed')->width);
+        $oembed->addChild('height', (string) config('Embed')->height);
 
         // @phpstan-ignore-next-line
         return $this->response->setXML($oembed);
@@ -409,7 +407,7 @@ class EpisodeController extends BaseController
         /**
          * get comments: aggregated replies from posts referring to the episode
          */
-        $episodeComments = model(PostModel::class)
+        $episodeComments = model('PostModel')
             ->whereIn('in_reply_to_id', fn (BaseBuilder $builder): BaseBuilder => $builder->select('id')
                 ->from('fediverse_posts')
                 ->where('episode_id', $this->episode->id))
diff --git a/app/Controllers/HomeController.php b/app/Controllers/HomeController.php
index 5acdfd16af..515c0d0b55 100644
--- a/app/Controllers/HomeController.php
+++ b/app/Controllers/HomeController.php
@@ -14,7 +14,6 @@ use App\Models\PodcastModel;
 use CodeIgniter\Database\Exceptions\DatabaseException;
 use CodeIgniter\HTTP\RedirectResponse;
 use CodeIgniter\HTTP\ResponseInterface;
-use Config\Cache;
 use Modules\Media\FileManagers\FileManagerInterface;
 
 class HomeController extends BaseController
@@ -54,7 +53,7 @@ class HomeController extends BaseController
         }
 
         // --- Can Castopod connect to the cache handler
-        if (config(Cache::class)->handler !== 'dummy' && cache()->getCacheInfo() === null) {
+        if (config('Cache')->handler !== 'dummy' && cache()->getCacheInfo() === null) {
             $errors[] = 'Unable connect to the cache handler.';
         }
 
diff --git a/app/Controllers/PodcastController.php b/app/Controllers/PodcastController.php
index f586248c3f..46a42c1f58 100644
--- a/app/Controllers/PodcastController.php
+++ b/app/Controllers/PodcastController.php
@@ -278,11 +278,11 @@ class PodcastController extends BaseController
     {
         if ($this->podcast->type === 'serial') {
             // podcast is serial
-            $episodes = model(EpisodeModel::class)
+            $episodes = model('EpisodeModel')
                 ->where('`published_at` <= UTC_TIMESTAMP()', null, false)
                 ->orderBy('season_number DESC, number ASC');
         } else {
-            $episodes = model(EpisodeModel::class)
+            $episodes = model('EpisodeModel')
                 ->where('`published_at` <= UTC_TIMESTAMP()', null, false)
                 ->orderBy('published_at', 'DESC');
         }
diff --git a/app/Controllers/PostController.php b/app/Controllers/PostController.php
index 7e0ea87ed7..6a8b24f28f 100644
--- a/app/Controllers/PostController.php
+++ b/app/Controllers/PostController.php
@@ -37,7 +37,7 @@ class PostController extends FediversePostController
     protected $post;
 
     /**
-     * @var string[]
+     * @var list<string>
      */
     protected $helpers = ['auth', 'fediverse', 'svg', 'components', 'misc', 'seo', 'premium_podcasts'];
 
diff --git a/app/Entities/Episode.php b/app/Entities/Episode.php
index 1df0cf4932..44651d072c 100644
--- a/app/Entities/Episode.php
+++ b/app/Entities/Episode.php
@@ -22,7 +22,6 @@ use CodeIgniter\Entity\Entity;
 use CodeIgniter\Files\File;
 use CodeIgniter\HTTP\Files\UploadedFile;
 use CodeIgniter\I18n\Time;
-use Config\Images;
 use Exception;
 use League\CommonMark\Environment\Environment;
 use League\CommonMark\Extension\Autolink\AutolinkExtension;
@@ -201,7 +200,7 @@ class Episode extends Entity
         } else {
             $cover = new Image([
                 'file_key' => 'podcasts/' . $this->getPodcast()->handle . '/' . $this->attributes['slug'] . '.' . $file->getExtension(),
-                'sizes'    => config(Images::class)
+                'sizes'    => config('Images')
 ->podcastCoverSizes,
                 'uploaded_by' => $this->attributes['updated_by'],
                 'updated_by'  => $this->attributes['updated_by'],
diff --git a/app/Entities/Person.php b/app/Entities/Person.php
index 9af5f92c8c..961f56037c 100644
--- a/app/Entities/Person.php
+++ b/app/Entities/Person.php
@@ -14,7 +14,6 @@ use App\Models\PersonModel;
 use CodeIgniter\Entity\Entity;
 use CodeIgniter\Files\File;
 use CodeIgniter\HTTP\Files\UploadedFile;
-use Config\Images;
 use Modules\Media\Entities\Image;
 use Modules\Media\Models\MediaModel;
 use RuntimeException;
@@ -72,7 +71,7 @@ class Person extends Entity
         } else {
             $avatar = new Image([
                 'file_key' => 'persons/' . $this->attributes['unique_name'] . '.' . $file->getExtension(),
-                'sizes'    => config(Images::class)
+                'sizes'    => config('Images')
 ->personAvatarSizes,
                 'uploaded_by' => $this->attributes['updated_by'],
                 'updated_by'  => $this->attributes['updated_by'],
diff --git a/app/Entities/Podcast.php b/app/Entities/Podcast.php
index 4198b382c3..db74d40973 100644
--- a/app/Entities/Podcast.php
+++ b/app/Entities/Podcast.php
@@ -20,7 +20,6 @@ use CodeIgniter\Files\File;
 use CodeIgniter\HTTP\Files\UploadedFile;
 use CodeIgniter\I18n\Time;
 use CodeIgniter\Shield\Entities\User;
-use Config\Images;
 use Exception;
 use League\CommonMark\Environment\Environment;
 use League\CommonMark\Extension\Autolink\AutolinkExtension;
@@ -255,7 +254,7 @@ class Podcast extends Entity
         } else {
             $cover = new Image([
                 'file_key' => 'podcasts/' . $this->attributes['handle'] . '/cover.' . $file->getExtension(),
-                'sizes'    => config(Images::class)
+                'sizes'    => config('Images')
 ->podcastCoverSizes,
                 'uploaded_by' => $this->attributes['updated_by'],
                 'updated_by'  => $this->attributes['updated_by'],
@@ -298,7 +297,7 @@ class Podcast extends Entity
         } else {
             $banner = new Image([
                 'file_key' => 'podcasts/' . $this->attributes['handle'] . '/banner.' . $file->getExtension(),
-                'sizes'    => config(Images::class)
+                'sizes'    => config('Images')
 ->podcastBannerSizes,
                 'uploaded_by' => $this->attributes['updated_by'],
                 'updated_by'  => $this->attributes['updated_by'],
diff --git a/app/Helpers/misc_helper.php b/app/Helpers/misc_helper.php
index f19ca5a6bd..b26fab00d0 100644
--- a/app/Helpers/misc_helper.php
+++ b/app/Helpers/misc_helper.php
@@ -5,7 +5,6 @@ declare(strict_types=1);
 use App\Entities\Person;
 use App\Entities\Podcast;
 use Cocur\Slugify\Slugify;
-use Config\App;
 use Config\Images;
 use Modules\Media\Entities\Image;
 
@@ -25,7 +24,7 @@ if (! function_exists('get_browser_language')) {
     function get_browser_language(?string $httpAcceptLanguage = null): string
     {
         if ($httpAcceptLanguage === null) {
-            return config(App::class)->defaultLocale;
+            return config('App')->defaultLocale;
         }
 
         $langs = explode(',', $httpAcceptLanguage);
@@ -192,7 +191,7 @@ if (! function_exists('format_bytes')) {
 if (! function_exists('get_site_icon_url')) {
     function get_site_icon_url(string $size): string
     {
-        if (config(App::class)->siteIcon['ico'] === service('settings')->get('App.siteIcon')['ico']) {
+        if (config('App')->siteIcon['ico'] === service('settings')->get('App.siteIcon')['ico']) {
             // return default site icon url
             return base_url(service('settings')->get('App.siteIcon')[$size]);
         }
@@ -205,12 +204,12 @@ if (! function_exists('get_podcast_banner')) {
     function get_podcast_banner_url(Podcast $podcast, string $size): string
     {
         if (! $podcast->banner instanceof Image) {
-            $defaultBanner = config(Images::class)
+            $defaultBanner = config('Images')
                 ->podcastBannerDefaultPaths[service('settings')->get('App.theme')] ?? config(
                     Images::class
                 )->podcastBannerDefaultPaths['default'];
 
-            $sizes = config(Images::class)
+            $sizes = config('Images')
 ->podcastBannerSizes;
 
             $sizeConfig = $sizes[$size];
@@ -231,7 +230,7 @@ if (! function_exists('get_podcast_banner_mimetype')) {
     function get_podcast_banner_mimetype(Podcast $podcast, string $size): string
     {
         if (! $podcast->banner instanceof Image) {
-            $sizes = config(Images::class)
+            $sizes = config('Images')
 ->podcastBannerSizes;
 
             $sizeConfig = $sizes[$size];
@@ -252,10 +251,10 @@ if (! function_exists('get_avatar_url')) {
     function get_avatar_url(Person $person, string $size): string
     {
         if (! $person->avatar instanceof Image) {
-            $defaultAvatarPath = config(Images::class)
+            $defaultAvatarPath = config('Images')
 ->avatarDefaultPath;
 
-            $sizes = config(Images::class)
+            $sizes = config('Images')
 ->personAvatarSizes;
 
             $sizeConfig = $sizes[$size];
diff --git a/app/Helpers/page_helper.php b/app/Helpers/page_helper.php
index 49d15a790c..253b0135c5 100644
--- a/app/Helpers/page_helper.php
+++ b/app/Helpers/page_helper.php
@@ -9,7 +9,6 @@ declare(strict_types=1);
  */
 
 use App\Models\PageModel;
-use Config\App;
 
 if (! function_exists('render_page_links')) {
     /**
@@ -42,8 +41,8 @@ if (! function_exists('render_page_links')) {
         }
 
         // if set in .env, add legal notice link at the end of page links
-        if (config(App::class)->legalNoticeURL !== null) {
-            $links .= anchor(config(App::class)->legalNoticeURL, lang('Common.legal_notice'), [
+        if (config('App')->legalNoticeURL !== null) {
+            $links .= anchor(config('App')->legalNoticeURL, lang('Common.legal_notice'), [
                 'class'  => 'px-2 py-1 underline hover:no-underline focus:ring-accent',
                 'target' => '_blank',
                 'rel'    => 'noopener noreferrer',
diff --git a/app/Helpers/seo_helper.php b/app/Helpers/seo_helper.php
index 782afbf497..e18e659a98 100644
--- a/app/Helpers/seo_helper.php
+++ b/app/Helpers/seo_helper.php
@@ -8,8 +8,6 @@ use App\Entities\EpisodeComment;
 use App\Entities\Page;
 use App\Entities\Podcast;
 use App\Entities\Post;
-use Config\Embed;
-use Config\Images;
 use Melbahja\Seo\MetaTags;
 use Melbahja\Seo\Schema;
 use Melbahja\Seo\Schema\Thing;
@@ -57,8 +55,8 @@ if (! function_exists('get_podcast_metatags')) {
             ->description(esc($podcast->description))
             ->image((string) $podcast->cover->og_url)
             ->canonical((string) current_url())
-            ->og('image:width', (string) config(Images::class)->podcastCoverSizes['og']['width'])
-            ->og('image:height', (string) config(Images::class)->podcastCoverSizes['og']['height'])
+            ->og('image:width', (string) config('Images')->podcastCoverSizes['og']['width'])
+            ->og('image:height', (string) config('Images')->podcastCoverSizes['og']['height'])
             ->og('locale', $podcast->language_code)
             ->og('site_name', esc(service('settings')->get('App.siteName')))
             ->push('link', [
@@ -107,8 +105,8 @@ if (! function_exists('get_episode_metatags')) {
             ->image((string) $episode->cover->og_url, 'player')
             ->canonical($episode->link)
             ->og('site_name', esc(service('settings')->get('App.siteName')))
-            ->og('image:width', (string) config(Images::class)->podcastCoverSizes['og']['width'])
-            ->og('image:height', (string) config(Images::class)->podcastCoverSizes['og']['height'])
+            ->og('image:width', (string) config('Images')->podcastCoverSizes['og']['width'])
+            ->og('image:height', (string) config('Images')->podcastCoverSizes['og']['height'])
             ->og('locale', $episode->podcast->language_code)
             ->og('audio', $episode->audio_opengraph_url)
             ->og('audio:type', $episode->audio->file_mimetype)
@@ -117,8 +115,8 @@ if (! function_exists('get_episode_metatags')) {
             ->twitter('audio:partner', $episode->podcast->publisher ?? '')
             ->twitter('audio:artist_name', esc($episode->podcast->owner_name))
             ->twitter('player', $episode->getEmbedUrl('light'))
-            ->twitter('player:width', (string) config(Embed::class)->width)
-            ->twitter('player:height', (string) config(Embed::class)->height)
+            ->twitter('player:width', (string) config('Embed')->width)
+            ->twitter('player:height', (string) config('Embed')->height)
             ->push('link', [
                 'rel'  => 'alternate',
                 'type' => 'application/activity+json',
diff --git a/app/Libraries/Router.php b/app/Libraries/Router.php
index dc1cc8c10a..1f3abc5543 100644
--- a/app/Libraries/Router.php
+++ b/app/Libraries/Router.php
@@ -81,7 +81,7 @@ class Router extends CodeIgniterRouter
                     );
 
                     if ($this->collection->shouldUseSupportedLocalesOnly()
-                        && ! in_array($matched['locale'], config(App::class)->supportedLocales, true)) {
+                        && ! in_array($matched['locale'], config('App')->supportedLocales, true)) {
                         // Throw exception to prevent the autorouter, if enabled,
                         // from trying to find a route
                         throw PageNotFoundException::forLocaleNotSupported($matched['locale']);
diff --git a/app/Models/PodcastModel.php b/app/Models/PodcastModel.php
index eb8bd20574..79f24e02d0 100644
--- a/app/Models/PodcastModel.php
+++ b/app/Models/PodcastModel.php
@@ -14,7 +14,6 @@ use App\Entities\Actor;
 use App\Entities\Podcast;
 use CodeIgniter\HTTP\URI;
 use CodeIgniter\Model;
-use Config\Fediverse;
 use phpseclib\Crypt\RSA;
 
 class PodcastModel extends Model
@@ -349,7 +348,7 @@ class PodcastModel extends Model
 
             // delete all cache for podcast actor
             cache()
-                ->deleteMatching(config(Fediverse::class) ->cachePrefix . "actor#{$podcast->actor_id}*");
+                ->deleteMatching(config('Fediverse') ->cachePrefix . "actor#{$podcast->actor_id}*");
 
             // delete model requests cache, includes feed / query / episode lists, etc.
             cache()
diff --git a/app/Models/PostModel.php b/app/Models/PostModel.php
index ae409903c5..25a834a7af 100644
--- a/app/Models/PostModel.php
+++ b/app/Models/PostModel.php
@@ -21,7 +21,7 @@ class PostModel extends FediversePostModel
     protected $returnType = Post::class;
 
     /**
-     * @var string[]
+     * @var list<string>
      */
     protected $allowedFields = [
         'id',
diff --git a/composer.json b/composer.json
index ec81313cd0..b00fe83fe4 100644
--- a/composer.json
+++ b/composer.json
@@ -9,7 +9,7 @@
     "php": "^8.1",
     "adaures/ipcat-php": "^v1.0.0",
     "adaures/podcast-persons-taxonomy": "^v1.0.1",
-    "aws/aws-sdk-php": "^3.305.3",
+    "aws/aws-sdk-php": "^3.305.4",
     "chrisjean/php-ico": "^1.0.4",
     "cocur/slugify": "^v4.5.1",
     "codeigniter4/framework": "v4.5.1",
diff --git a/composer.lock b/composer.lock
index fdc0a69b2a..6615e8308f 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,7 +4,7 @@
     "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
     "This file is @generated automatically"
   ],
-  "content-hash": "063a673edd8a39e318bae89316709ef0",
+  "content-hash": "b0b783684ed8d36e636fac3632c78c27",
   "packages": [
     {
       "name": "adaures/ipcat-php",
@@ -188,16 +188,16 @@
     },
     {
       "name": "aws/aws-sdk-php",
-      "version": "3.305.3",
+      "version": "3.305.4",
       "source": {
         "type": "git",
         "url": "https://github.com/aws/aws-sdk-php.git",
-        "reference": "b190e24bd6568713436e1f13f9022bf28f491fc1"
+        "reference": "fc26a2ebf720e0b75a353d7e8fe206796671e00b"
       },
       "dist": {
         "type": "zip",
-        "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/b190e24bd6568713436e1f13f9022bf28f491fc1",
-        "reference": "b190e24bd6568713436e1f13f9022bf28f491fc1",
+        "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/fc26a2ebf720e0b75a353d7e8fe206796671e00b",
+        "reference": "fc26a2ebf720e0b75a353d7e8fe206796671e00b",
         "shasum": ""
       },
       "require": {
@@ -273,31 +273,31 @@
       "support": {
         "forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80",
         "issues": "https://github.com/aws/aws-sdk-php/issues",
-        "source": "https://github.com/aws/aws-sdk-php/tree/3.305.3"
+        "source": "https://github.com/aws/aws-sdk-php/tree/3.305.4"
       },
-      "time": "2024-04-25T18:07:15+00:00"
+      "time": "2024-04-26T18:06:31+00:00"
     },
     {
       "name": "brick/math",
-      "version": "0.11.0",
+      "version": "0.12.1",
       "source": {
         "type": "git",
         "url": "https://github.com/brick/math.git",
-        "reference": "0ad82ce168c82ba30d1c01ec86116ab52f589478"
+        "reference": "f510c0a40911935b77b86859eb5223d58d660df1"
       },
       "dist": {
         "type": "zip",
-        "url": "https://api.github.com/repos/brick/math/zipball/0ad82ce168c82ba30d1c01ec86116ab52f589478",
-        "reference": "0ad82ce168c82ba30d1c01ec86116ab52f589478",
+        "url": "https://api.github.com/repos/brick/math/zipball/f510c0a40911935b77b86859eb5223d58d660df1",
+        "reference": "f510c0a40911935b77b86859eb5223d58d660df1",
         "shasum": ""
       },
       "require": {
-        "php": "^8.0"
+        "php": "^8.1"
       },
       "require-dev": {
         "php-coveralls/php-coveralls": "^2.2",
-        "phpunit/phpunit": "^9.0",
-        "vimeo/psalm": "5.0.0"
+        "phpunit/phpunit": "^10.1",
+        "vimeo/psalm": "5.16.0"
       },
       "type": "library",
       "autoload": {
@@ -315,12 +315,17 @@
         "arithmetic",
         "bigdecimal",
         "bignum",
+        "bignumber",
         "brick",
-        "math"
+        "decimal",
+        "integer",
+        "math",
+        "mathematics",
+        "rational"
       ],
       "support": {
         "issues": "https://github.com/brick/math/issues",
-        "source": "https://github.com/brick/math/tree/0.11.0"
+        "source": "https://github.com/brick/math/tree/0.12.1"
       },
       "funding": [
         {
@@ -328,7 +333,7 @@
           "type": "github"
         }
       ],
-      "time": "2023-01-15T23:15:59+00:00"
+      "time": "2023-11-29T23:19:16+00:00"
     },
     {
       "name": "chrisjean/php-ico",
@@ -2796,20 +2801,20 @@
     },
     {
       "name": "ramsey/uuid",
-      "version": "4.7.5",
+      "version": "4.7.6",
       "source": {
         "type": "git",
         "url": "https://github.com/ramsey/uuid.git",
-        "reference": "5f0df49ae5ad6efb7afa69e6bfab4e5b1e080d8e"
+        "reference": "91039bc1faa45ba123c4328958e620d382ec7088"
       },
       "dist": {
         "type": "zip",
-        "url": "https://api.github.com/repos/ramsey/uuid/zipball/5f0df49ae5ad6efb7afa69e6bfab4e5b1e080d8e",
-        "reference": "5f0df49ae5ad6efb7afa69e6bfab4e5b1e080d8e",
+        "url": "https://api.github.com/repos/ramsey/uuid/zipball/91039bc1faa45ba123c4328958e620d382ec7088",
+        "reference": "91039bc1faa45ba123c4328958e620d382ec7088",
         "shasum": ""
       },
       "require": {
-        "brick/math": "^0.8.8 || ^0.9 || ^0.10 || ^0.11",
+        "brick/math": "^0.8.8 || ^0.9 || ^0.10 || ^0.11 || ^0.12",
         "ext-json": "*",
         "php": "^8.0",
         "ramsey/collection": "^1.2 || ^2.0"
@@ -2864,7 +2869,7 @@
       "keywords": ["guid", "identifier", "uuid"],
       "support": {
         "issues": "https://github.com/ramsey/uuid/issues",
-        "source": "https://github.com/ramsey/uuid/tree/4.7.5"
+        "source": "https://github.com/ramsey/uuid/tree/4.7.6"
       },
       "funding": [
         {
@@ -2876,7 +2881,7 @@
           "type": "tidelift"
         }
       ],
-      "time": "2023-11-08T05:53:05+00:00"
+      "time": "2024-04-27T21:32:50+00:00"
     },
     {
       "name": "symfony/deprecation-contracts",
@@ -3393,12 +3398,12 @@
       "source": {
         "type": "git",
         "url": "https://github.com/yassinedoghri/podcast-feed.git",
-        "reference": "366ddcedfb4b89c7093d03b2398184435f930843"
+        "reference": "f34156e62c9eef8bd5561f8a585d99501e235505"
       },
       "dist": {
         "type": "zip",
-        "url": "https://api.github.com/repos/yassinedoghri/podcast-feed/zipball/366ddcedfb4b89c7093d03b2398184435f930843",
-        "reference": "366ddcedfb4b89c7093d03b2398184435f930843",
+        "url": "https://api.github.com/repos/yassinedoghri/podcast-feed/zipball/f34156e62c9eef8bd5561f8a585d99501e235505",
+        "reference": "f34156e62c9eef8bd5561f8a585d99501e235505",
         "shasum": ""
       },
       "require": {
@@ -3434,7 +3439,7 @@
         "issues": "https://github.com/yassinedoghri/podcast-feed/issues",
         "source": "https://github.com/yassinedoghri/podcast-feed/tree/main"
       },
-      "time": "2023-06-22T13:54:05+00:00"
+      "time": "2024-04-28T16:17:41+00:00"
     }
   ],
   "packages-dev": [
diff --git a/modules/Admin/Config/Routes.php b/modules/Admin/Config/Routes.php
index 24f451b284..42bd42818b 100644
--- a/modules/Admin/Config/Routes.php
+++ b/modules/Admin/Config/Routes.php
@@ -15,7 +15,8 @@ $routes->add('scheduled-video-clips', 'SchedulerController::generateVideoClips',
 
 // Admin area routes
 $routes->group(
-    config(Admin::class)->gateway,
+    config('Admin')
+->gateway,
     [
         'namespace' => 'Modules\Admin\Controllers',
     ],
diff --git a/modules/Admin/Controllers/AboutController.php b/modules/Admin/Controllers/AboutController.php
index f7cba14d95..4b69352c6f 100644
--- a/modules/Admin/Controllers/AboutController.php
+++ b/modules/Admin/Controllers/AboutController.php
@@ -11,7 +11,6 @@ declare(strict_types=1);
 namespace Modules\Admin\Controllers;
 
 use CodeIgniter\HTTP\RedirectResponse;
-use Config\App;
 use Config\Services;
 
 class AboutController extends BaseController
@@ -23,7 +22,7 @@ class AboutController extends BaseController
             'version'     => CP_VERSION,
             'php_version' => PHP_VERSION,
             'os'          => PHP_OS,
-            'languages'   => implode(', ', config(App::class)->supportedLocales),
+            'languages'   => implode(', ', config('App')->supportedLocales),
         ];
 
         return view('settings/about', [
diff --git a/modules/Admin/Controllers/DashboardController.php b/modules/Admin/Controllers/DashboardController.php
index 6ac175afc3..7d6f48212c 100644
--- a/modules/Admin/Controllers/DashboardController.php
+++ b/modules/Admin/Controllers/DashboardController.php
@@ -13,7 +13,6 @@ namespace Modules\Admin\Controllers;
 use App\Models\EpisodeModel;
 use App\Models\PodcastModel;
 use CodeIgniter\I18n\Time;
-use Config\App;
 use Modules\Media\Models\MediaModel;
 
 class DashboardController extends BaseController
@@ -51,7 +50,7 @@ class DashboardController extends BaseController
             ->get()
             ->getResultArray()[0];
 
-        $appStorageLimit = config(App::class)
+        $appStorageLimit = config('App')
             ->storageLimit;
         if ($appStorageLimit === null || $appStorageLimit < 0) {
             $storageLimitBytes = disk_total_space('./');
@@ -71,7 +70,7 @@ class DashboardController extends BaseController
                 ->id;
         }
 
-        $bandwidthLimit = config(App::class)
+        $bandwidthLimit = config('App')
             ->bandwidthLimit;
 
         $data = [
diff --git a/modules/Admin/Controllers/EpisodeController.php b/modules/Admin/Controllers/EpisodeController.php
index acd742fcf0..d83bae5c28 100644
--- a/modules/Admin/Controllers/EpisodeController.php
+++ b/modules/Admin/Controllers/EpisodeController.php
@@ -855,7 +855,7 @@ class EpisodeController extends BaseController
 
         // set podcast is_published_on_hubs to false to trigger websub push
         (new PodcastModel())->update($this->episode->podcast->id, [
-            'is_published_on_hubs' => false,
+            'is_published_on_hubs' => 0,
         ]);
 
         $db->transComplete();
diff --git a/modules/Admin/Controllers/PodcastController.php b/modules/Admin/Controllers/PodcastController.php
index 1fd27d8da9..aa8c726f9d 100644
--- a/modules/Admin/Controllers/PodcastController.php
+++ b/modules/Admin/Controllers/PodcastController.php
@@ -32,7 +32,6 @@ use Modules\Analytics\Models\AnalyticsPodcastModel;
 use Modules\Analytics\Models\AnalyticsWebsiteByBrowserModel;
 use Modules\Analytics\Models\AnalyticsWebsiteByEntryPageModel;
 use Modules\Analytics\Models\AnalyticsWebsiteByRefererModel;
-use Modules\Auth\Config\AuthGroups;
 use Modules\Media\Entities\Image;
 use Modules\Media\FileManagers\FileManagerInterface;
 use Modules\Media\Models\MediaModel;
@@ -244,7 +243,7 @@ class PodcastController extends BaseController
 
         // generate podcast roles and permissions
         // before setting current user as podcast admin
-        config(AuthGroups::class)
+        config('AuthGroups')
             ->generatePodcastAuthorizations($newPodcastId);
         add_podcast_group(auth()->user(), (int) $newPodcastId, setting('AuthGroups.mostPowerfulPodcastGroup'));
 
diff --git a/modules/Admin/Controllers/VideoClipsController.php b/modules/Admin/Controllers/VideoClipsController.php
index ddece561bc..7bf1d0d1d5 100644
--- a/modules/Admin/Controllers/VideoClipsController.php
+++ b/modules/Admin/Controllers/VideoClipsController.php
@@ -18,10 +18,8 @@ use App\Models\EpisodeModel;
 use App\Models\PodcastModel;
 use CodeIgniter\Exceptions\PageNotFoundException;
 use CodeIgniter\HTTP\RedirectResponse;
-use Config\Colors;
 use Modules\Media\Entities\Transcript;
 use Modules\Media\Models\MediaModel;
-use Modules\MediaClipper\Config\MediaClipper;
 
 class VideoClipsController extends BaseController
 {
@@ -91,7 +89,7 @@ class VideoClipsController extends BaseController
         return view('episode/video_clips_list', $data);
     }
 
-    public function view($videoClipId): string
+    public function view(string $videoClipId): string
     {
         $videoClip = (new ClipModel())->getVideoClipById((int) $videoClipId);
 
@@ -146,8 +144,8 @@ class VideoClipsController extends BaseController
             'title'      => 'required',
             'start_time' => 'required|greater_than_equal_to[0]',
             'duration'   => 'required|greater_than[0]',
-            'format'     => 'required|in_list[' . implode(',', array_keys(config(MediaClipper::class)->formats)) . ']',
-            'theme'      => 'required|in_list[' . implode(',', array_keys(config(Colors::class)->themes)) . ']',
+            'format'     => 'required|in_list[' . implode(',', array_keys(config('MediaClipper')->formats)) . ']',
+            'theme'      => 'required|in_list[' . implode(',', array_keys(config('Colors')->themes)) . ']',
         ];
 
         if (! $this->validate($rules)) {
@@ -160,7 +158,7 @@ class VideoClipsController extends BaseController
         $validData = $this->validator->getValidated();
 
         $themeName = $validData['theme'];
-        $themeColors = config(MediaClipper::class)
+        $themeColors = config('MediaClipper')
             ->themes[$themeName];
         $theme = [
             'name'    => $themeName,
diff --git a/modules/Admin/Language/ar/Breadcrumb.php b/modules/Admin/Language/ar/Breadcrumb.php
index 887dd36273..251d978893 100644
--- a/modules/Admin/Language/ar/Breadcrumb.php
+++ b/modules/Admin/Language/ar/Breadcrumb.php
@@ -2,8 +2,6 @@
 
 declare(strict_types=1);
 
-use Modules\Admin\Config\Admin;
-
 /**
  * @copyright  2020 Ad Aures
  * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
@@ -12,7 +10,7 @@ use Modules\Admin\Config\Admin;
 
 return [
     'label' => 'breadcrumb',
-    config(Admin::class)
+    config('Admin')
         ->gateway => 'الرئيسية',
     'podcasts' => 'بودكاستات',
     'episodes' => 'حلقات',
diff --git a/modules/Admin/Language/br/Breadcrumb.php b/modules/Admin/Language/br/Breadcrumb.php
index 10d011df4f..65d6283691 100644
--- a/modules/Admin/Language/br/Breadcrumb.php
+++ b/modules/Admin/Language/br/Breadcrumb.php
@@ -2,8 +2,6 @@
 
 declare(strict_types=1);
 
-use Modules\Admin\Config\Admin;
-
 /**
  * @copyright  2020 Ad Aures
  * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
@@ -12,7 +10,7 @@ use Modules\Admin\Config\Admin;
 
 return [
     'label' => 'roll-istor',
-    config(Admin::class)
+    config('Admin')
         ->gateway => 'Degemer',
     'podcasts' => 'podkastoù',
     'episodes' => 'rannoù',
diff --git a/modules/Admin/Language/ca/Breadcrumb.php b/modules/Admin/Language/ca/Breadcrumb.php
index 7514194318..8beefd664f 100644
--- a/modules/Admin/Language/ca/Breadcrumb.php
+++ b/modules/Admin/Language/ca/Breadcrumb.php
@@ -2,8 +2,6 @@
 
 declare(strict_types=1);
 
-use Modules\Admin\Config\Admin;
-
 /**
  * @copyright  2020 Ad Aures
  * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
@@ -12,7 +10,7 @@ use Modules\Admin\Config\Admin;
 
 return [
     'label' => 'Ruta de navegació',
-    config(Admin::class)
+    config('Admin')
         ->gateway => 'Inici',
     'podcasts' => 'podcasts',
     'episodes' => 'episodis',
diff --git a/modules/Admin/Language/da/Breadcrumb.php b/modules/Admin/Language/da/Breadcrumb.php
index 0adb76bada..f02c83ac9c 100644
--- a/modules/Admin/Language/da/Breadcrumb.php
+++ b/modules/Admin/Language/da/Breadcrumb.php
@@ -2,8 +2,6 @@
 
 declare(strict_types=1);
 
-use Modules\Admin\Config\Admin;
-
 /**
  * @copyright  2020 Ad Aures
  * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
@@ -12,7 +10,7 @@ use Modules\Admin\Config\Admin;
 
 return [
     'label' => 'brødkrumme',
-    config(Admin::class)
+    config('Admin')
         ->gateway => 'Hjem',
     'podcasts' => 'podcasts',
     'episodes' => 'episoder',
diff --git a/modules/Admin/Language/de/Breadcrumb.php b/modules/Admin/Language/de/Breadcrumb.php
index 89fc585db9..986f03dda7 100644
--- a/modules/Admin/Language/de/Breadcrumb.php
+++ b/modules/Admin/Language/de/Breadcrumb.php
@@ -2,8 +2,6 @@
 
 declare(strict_types=1);
 
-use Modules\Admin\Config\Admin;
-
 /**
  * @copyright  2020 Ad Aures
  * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
@@ -12,7 +10,7 @@ use Modules\Admin\Config\Admin;
 
 return [
     'label' => 'Pfad',
-    config(Admin::class)
+    config('Admin')
         ->gateway => 'Startseite',
     'podcasts' => 'Podcasts',
     'episodes' => 'Folgen',
diff --git a/modules/Admin/Language/el/Breadcrumb.php b/modules/Admin/Language/el/Breadcrumb.php
index d08f66f7eb..217f6edbbd 100644
--- a/modules/Admin/Language/el/Breadcrumb.php
+++ b/modules/Admin/Language/el/Breadcrumb.php
@@ -2,8 +2,6 @@
 
 declare(strict_types=1);
 
-use Modules\Admin\Config\Admin;
-
 /**
  * @copyright  2020 Ad Aures
  * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
@@ -12,7 +10,7 @@ use Modules\Admin\Config\Admin;
 
 return [
     'label' => 'διαδρομή (Breadcrumb)',
-    config(Admin::class)
+    config('Admin')
         ->gateway => 'Αρχική σελίδα',
     'podcasts' => 'podcasts',
     'episodes' => 'επεισόδια',
diff --git a/modules/Admin/Language/en/Breadcrumb.php b/modules/Admin/Language/en/Breadcrumb.php
index 6a678d4ea9..408c9f9ff6 100644
--- a/modules/Admin/Language/en/Breadcrumb.php
+++ b/modules/Admin/Language/en/Breadcrumb.php
@@ -2,8 +2,6 @@
 
 declare(strict_types=1);
 
-use Modules\Admin\Config\Admin;
-
 /**
  * @copyright  2020 Ad Aures
  * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
@@ -12,7 +10,7 @@ use Modules\Admin\Config\Admin;
 
 return [
     'label' => 'breadcrumb',
-    config(Admin::class)
+    config('Admin')
         ->gateway => 'Home',
     'podcasts' => 'podcasts',
     'episodes' => 'episodes',
diff --git a/modules/Admin/Language/es/Breadcrumb.php b/modules/Admin/Language/es/Breadcrumb.php
index 41de91c17f..6ffb6387e3 100644
--- a/modules/Admin/Language/es/Breadcrumb.php
+++ b/modules/Admin/Language/es/Breadcrumb.php
@@ -2,8 +2,6 @@
 
 declare(strict_types=1);
 
-use Modules\Admin\Config\Admin;
-
 /**
  * @copyright  2020 Ad Aures
  * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
@@ -12,7 +10,7 @@ use Modules\Admin\Config\Admin;
 
 return [
     'label' => 'ruta de navegación',
-    config(Admin::class)
+    config('Admin')
         ->gateway => 'Inicio',
     'podcasts' => 'podcasts',
     'episodes' => 'episodios',
diff --git a/modules/Admin/Language/eu/Breadcrumb.php b/modules/Admin/Language/eu/Breadcrumb.php
index 6a678d4ea9..408c9f9ff6 100644
--- a/modules/Admin/Language/eu/Breadcrumb.php
+++ b/modules/Admin/Language/eu/Breadcrumb.php
@@ -2,8 +2,6 @@
 
 declare(strict_types=1);
 
-use Modules\Admin\Config\Admin;
-
 /**
  * @copyright  2020 Ad Aures
  * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
@@ -12,7 +10,7 @@ use Modules\Admin\Config\Admin;
 
 return [
     'label' => 'breadcrumb',
-    config(Admin::class)
+    config('Admin')
         ->gateway => 'Home',
     'podcasts' => 'podcasts',
     'episodes' => 'episodes',
diff --git a/modules/Admin/Language/fa/Breadcrumb.php b/modules/Admin/Language/fa/Breadcrumb.php
index 6a678d4ea9..408c9f9ff6 100644
--- a/modules/Admin/Language/fa/Breadcrumb.php
+++ b/modules/Admin/Language/fa/Breadcrumb.php
@@ -2,8 +2,6 @@
 
 declare(strict_types=1);
 
-use Modules\Admin\Config\Admin;
-
 /**
  * @copyright  2020 Ad Aures
  * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
@@ -12,7 +10,7 @@ use Modules\Admin\Config\Admin;
 
 return [
     'label' => 'breadcrumb',
-    config(Admin::class)
+    config('Admin')
         ->gateway => 'Home',
     'podcasts' => 'podcasts',
     'episodes' => 'episodes',
diff --git a/modules/Admin/Language/fr/Breadcrumb.php b/modules/Admin/Language/fr/Breadcrumb.php
index 5986e189f9..a4ac57a222 100644
--- a/modules/Admin/Language/fr/Breadcrumb.php
+++ b/modules/Admin/Language/fr/Breadcrumb.php
@@ -2,8 +2,6 @@
 
 declare(strict_types=1);
 
-use Modules\Admin\Config\Admin;
-
 /**
  * @copyright  2020 Ad Aures
  * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
@@ -12,7 +10,7 @@ use Modules\Admin\Config\Admin;
 
 return [
     'label' => 'Fil d’Ariane',
-    config(Admin::class)
+    config('Admin')
         ->gateway => 'Accueil',
     'podcasts' => 'podcasts',
     'episodes' => 'épisodes',
diff --git a/modules/Admin/Language/fr2/Breadcrumb.php b/modules/Admin/Language/fr2/Breadcrumb.php
index 13b077df25..52e423ee3a 100644
--- a/modules/Admin/Language/fr2/Breadcrumb.php
+++ b/modules/Admin/Language/fr2/Breadcrumb.php
@@ -2,8 +2,6 @@
 
 declare(strict_types=1);
 
-use Modules\Admin\Config\Admin;
-
 /**
  * @copyright  2020 Ad Aures
  * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
@@ -12,7 +10,7 @@ use Modules\Admin\Config\Admin;
 
 return [
     'label' => 'fil d’Ariane',
-    config(Admin::class)
+    config('Admin')
         ->gateway => 'Accueil',
     'podcasts' => 'podcasts',
     'episodes' => 'épisodes',
diff --git a/modules/Admin/Language/fr_CA/Breadcrumb.php b/modules/Admin/Language/fr_CA/Breadcrumb.php
index 6a678d4ea9..408c9f9ff6 100644
--- a/modules/Admin/Language/fr_CA/Breadcrumb.php
+++ b/modules/Admin/Language/fr_CA/Breadcrumb.php
@@ -2,8 +2,6 @@
 
 declare(strict_types=1);
 
-use Modules\Admin\Config\Admin;
-
 /**
  * @copyright  2020 Ad Aures
  * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
@@ -12,7 +10,7 @@ use Modules\Admin\Config\Admin;
 
 return [
     'label' => 'breadcrumb',
-    config(Admin::class)
+    config('Admin')
         ->gateway => 'Home',
     'podcasts' => 'podcasts',
     'episodes' => 'episodes',
diff --git a/modules/Admin/Language/fr_trad/Breadcrumb.php b/modules/Admin/Language/fr_trad/Breadcrumb.php
index 896c373c4b..558b90f765 100644
--- a/modules/Admin/Language/fr_trad/Breadcrumb.php
+++ b/modules/Admin/Language/fr_trad/Breadcrumb.php
@@ -2,8 +2,6 @@
 
 declare(strict_types=1);
 
-use Modules\Admin\Config\Admin;
-
 /**
  * @copyright  2020 Ad Aures
  * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
@@ -12,7 +10,7 @@ use Modules\Admin\Config\Admin;
 
 return [
     'label' => 'breadcrumb',
-    config(Admin::class)
+    config('Admin')
         ->gateway => 'Home',
     'podcasts' => 'podcasts',
     'episodes' => 'episodes',
diff --git a/modules/Admin/Language/gd/Breadcrumb.php b/modules/Admin/Language/gd/Breadcrumb.php
index 6a678d4ea9..408c9f9ff6 100644
--- a/modules/Admin/Language/gd/Breadcrumb.php
+++ b/modules/Admin/Language/gd/Breadcrumb.php
@@ -2,8 +2,6 @@
 
 declare(strict_types=1);
 
-use Modules\Admin\Config\Admin;
-
 /**
  * @copyright  2020 Ad Aures
  * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
@@ -12,7 +10,7 @@ use Modules\Admin\Config\Admin;
 
 return [
     'label' => 'breadcrumb',
-    config(Admin::class)
+    config('Admin')
         ->gateway => 'Home',
     'podcasts' => 'podcasts',
     'episodes' => 'episodes',
diff --git a/modules/Admin/Language/gl/Breadcrumb.php b/modules/Admin/Language/gl/Breadcrumb.php
index 3c49d0e636..fa515f1519 100644
--- a/modules/Admin/Language/gl/Breadcrumb.php
+++ b/modules/Admin/Language/gl/Breadcrumb.php
@@ -2,8 +2,6 @@
 
 declare(strict_types=1);
 
-use Modules\Admin\Config\Admin;
-
 /**
  * @copyright  2020 Ad Aures
  * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
@@ -12,7 +10,7 @@ use Modules\Admin\Config\Admin;
 
 return [
     'label' => 'menú',
-    config(Admin::class)
+    config('Admin')
         ->gateway => 'Inicio',
     'podcasts' => 'podcasts',
     'episodes' => 'episodios',
diff --git a/modules/Admin/Language/id/Breadcrumb.php b/modules/Admin/Language/id/Breadcrumb.php
index 290483afee..4e6f3a8ee7 100644
--- a/modules/Admin/Language/id/Breadcrumb.php
+++ b/modules/Admin/Language/id/Breadcrumb.php
@@ -2,8 +2,6 @@
 
 declare(strict_types=1);
 
-use Modules\Admin\Config\Admin;
-
 /**
  * @copyright  2020 Ad Aures
  * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
@@ -12,7 +10,7 @@ use Modules\Admin\Config\Admin;
 
 return [
     'label' => 'breadcrumb',
-    config(Admin::class)
+    config('Admin')
         ->gateway => 'Home',
     'podcasts' => 'podcasts',
     'episodes' => 'episodes',
diff --git a/modules/Admin/Language/it/Breadcrumb.php b/modules/Admin/Language/it/Breadcrumb.php
index fa31a5fef0..7c492350c7 100644
--- a/modules/Admin/Language/it/Breadcrumb.php
+++ b/modules/Admin/Language/it/Breadcrumb.php
@@ -2,8 +2,6 @@
 
 declare(strict_types=1);
 
-use Modules\Admin\Config\Admin;
-
 /**
  * @copyright  2020 Ad Aures
  * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
@@ -12,7 +10,7 @@ use Modules\Admin\Config\Admin;
 
 return [
     'label' => 'breadcrumb',
-    config(Admin::class)
+    config('Admin')
         ->gateway => 'Home',
     'podcasts' => 'podcasts',
     'episodes' => 'episodi',
diff --git a/modules/Admin/Language/ja/Breadcrumb.php b/modules/Admin/Language/ja/Breadcrumb.php
index 6a678d4ea9..408c9f9ff6 100644
--- a/modules/Admin/Language/ja/Breadcrumb.php
+++ b/modules/Admin/Language/ja/Breadcrumb.php
@@ -2,8 +2,6 @@
 
 declare(strict_types=1);
 
-use Modules\Admin\Config\Admin;
-
 /**
  * @copyright  2020 Ad Aures
  * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
@@ -12,7 +10,7 @@ use Modules\Admin\Config\Admin;
 
 return [
     'label' => 'breadcrumb',
-    config(Admin::class)
+    config('Admin')
         ->gateway => 'Home',
     'podcasts' => 'podcasts',
     'episodes' => 'episodes',
diff --git a/modules/Admin/Language/kk/Breadcrumb.php b/modules/Admin/Language/kk/Breadcrumb.php
index 6a678d4ea9..408c9f9ff6 100644
--- a/modules/Admin/Language/kk/Breadcrumb.php
+++ b/modules/Admin/Language/kk/Breadcrumb.php
@@ -2,8 +2,6 @@
 
 declare(strict_types=1);
 
-use Modules\Admin\Config\Admin;
-
 /**
  * @copyright  2020 Ad Aures
  * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
@@ -12,7 +10,7 @@ use Modules\Admin\Config\Admin;
 
 return [
     'label' => 'breadcrumb',
-    config(Admin::class)
+    config('Admin')
         ->gateway => 'Home',
     'podcasts' => 'podcasts',
     'episodes' => 'episodes',
diff --git a/modules/Admin/Language/ko/Breadcrumb.php b/modules/Admin/Language/ko/Breadcrumb.php
index 6a678d4ea9..408c9f9ff6 100644
--- a/modules/Admin/Language/ko/Breadcrumb.php
+++ b/modules/Admin/Language/ko/Breadcrumb.php
@@ -2,8 +2,6 @@
 
 declare(strict_types=1);
 
-use Modules\Admin\Config\Admin;
-
 /**
  * @copyright  2020 Ad Aures
  * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
@@ -12,7 +10,7 @@ use Modules\Admin\Config\Admin;
 
 return [
     'label' => 'breadcrumb',
-    config(Admin::class)
+    config('Admin')
         ->gateway => 'Home',
     'podcasts' => 'podcasts',
     'episodes' => 'episodes',
diff --git a/modules/Admin/Language/nl/Breadcrumb.php b/modules/Admin/Language/nl/Breadcrumb.php
index 374ddc2e6d..e87e4d3d7c 100644
--- a/modules/Admin/Language/nl/Breadcrumb.php
+++ b/modules/Admin/Language/nl/Breadcrumb.php
@@ -2,8 +2,6 @@
 
 declare(strict_types=1);
 
-use Modules\Admin\Config\Admin;
-
 /**
  * @copyright  2020 Ad Aures
  * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
@@ -12,7 +10,7 @@ use Modules\Admin\Config\Admin;
 
 return [
     'label' => 'kruimelpad',
-    config(Admin::class)
+    config('Admin')
         ->gateway => 'Hoofdpagina',
     'podcasts' => 'podcasts',
     'episodes' => 'afleveringen',
diff --git a/modules/Admin/Language/nn-NO/Breadcrumb.php b/modules/Admin/Language/nn-NO/Breadcrumb.php
index 15a1c2a927..422e71dfa4 100644
--- a/modules/Admin/Language/nn-NO/Breadcrumb.php
+++ b/modules/Admin/Language/nn-NO/Breadcrumb.php
@@ -2,8 +2,6 @@
 
 declare(strict_types=1);
 
-use Modules\Admin\Config\Admin;
-
 /**
  * @copyright  2020 Ad Aures
  * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
@@ -12,7 +10,7 @@ use Modules\Admin\Config\Admin;
 
 return [
     'label' => 'navigeringslenke',
-    config(Admin::class)
+    config('Admin')
         ->gateway => 'Heim',
     'podcasts' => 'podkastar',
     'episodes' => 'episodar',
diff --git a/modules/Admin/Language/oc/Breadcrumb.php b/modules/Admin/Language/oc/Breadcrumb.php
index 6a678d4ea9..408c9f9ff6 100644
--- a/modules/Admin/Language/oc/Breadcrumb.php
+++ b/modules/Admin/Language/oc/Breadcrumb.php
@@ -2,8 +2,6 @@
 
 declare(strict_types=1);
 
-use Modules\Admin\Config\Admin;
-
 /**
  * @copyright  2020 Ad Aures
  * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
@@ -12,7 +10,7 @@ use Modules\Admin\Config\Admin;
 
 return [
     'label' => 'breadcrumb',
-    config(Admin::class)
+    config('Admin')
         ->gateway => 'Home',
     'podcasts' => 'podcasts',
     'episodes' => 'episodes',
diff --git a/modules/Admin/Language/pl/Breadcrumb.php b/modules/Admin/Language/pl/Breadcrumb.php
index 37e81c6f3d..67100981b1 100644
--- a/modules/Admin/Language/pl/Breadcrumb.php
+++ b/modules/Admin/Language/pl/Breadcrumb.php
@@ -2,8 +2,6 @@
 
 declare(strict_types=1);
 
-use Modules\Admin\Config\Admin;
-
 /**
  * @copyright  2020 Ad Aures
  * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
@@ -12,7 +10,7 @@ use Modules\Admin\Config\Admin;
 
 return [
     'label' => 'okruszki',
-    config(Admin::class)
+    config('Admin')
         ->gateway => 'PoczÄ…tek',
     'podcasts' => 'podcasty',
     'episodes' => 'odcinki',
diff --git a/modules/Admin/Language/pt-BR/Breadcrumb.php b/modules/Admin/Language/pt-BR/Breadcrumb.php
index 29c73be388..7ca40d761f 100644
--- a/modules/Admin/Language/pt-BR/Breadcrumb.php
+++ b/modules/Admin/Language/pt-BR/Breadcrumb.php
@@ -2,8 +2,6 @@
 
 declare(strict_types=1);
 
-use Modules\Admin\Config\Admin;
-
 /**
  * @copyright  2020 Ad Aures
  * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
@@ -12,7 +10,7 @@ use Modules\Admin\Config\Admin;
 
 return [
     'label' => 'breadcrumb',
-    config(Admin::class)
+    config('Admin')
         ->gateway => 'Início',
     'podcasts' => 'podcasts',
     'episodes' => 'episódios',
diff --git a/modules/Admin/Language/pt/Breadcrumb.php b/modules/Admin/Language/pt/Breadcrumb.php
index 6a678d4ea9..408c9f9ff6 100644
--- a/modules/Admin/Language/pt/Breadcrumb.php
+++ b/modules/Admin/Language/pt/Breadcrumb.php
@@ -2,8 +2,6 @@
 
 declare(strict_types=1);
 
-use Modules\Admin\Config\Admin;
-
 /**
  * @copyright  2020 Ad Aures
  * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
@@ -12,7 +10,7 @@ use Modules\Admin\Config\Admin;
 
 return [
     'label' => 'breadcrumb',
-    config(Admin::class)
+    config('Admin')
         ->gateway => 'Home',
     'podcasts' => 'podcasts',
     'episodes' => 'episodes',
diff --git a/modules/Admin/Language/ro/Breadcrumb.php b/modules/Admin/Language/ro/Breadcrumb.php
index 6a678d4ea9..408c9f9ff6 100644
--- a/modules/Admin/Language/ro/Breadcrumb.php
+++ b/modules/Admin/Language/ro/Breadcrumb.php
@@ -2,8 +2,6 @@
 
 declare(strict_types=1);
 
-use Modules\Admin\Config\Admin;
-
 /**
  * @copyright  2020 Ad Aures
  * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
@@ -12,7 +10,7 @@ use Modules\Admin\Config\Admin;
 
 return [
     'label' => 'breadcrumb',
-    config(Admin::class)
+    config('Admin')
         ->gateway => 'Home',
     'podcasts' => 'podcasts',
     'episodes' => 'episodes',
diff --git a/modules/Admin/Language/ru/Breadcrumb.php b/modules/Admin/Language/ru/Breadcrumb.php
index 097ddc1c94..635a3806b0 100644
--- a/modules/Admin/Language/ru/Breadcrumb.php
+++ b/modules/Admin/Language/ru/Breadcrumb.php
@@ -2,8 +2,6 @@
 
 declare(strict_types=1);
 
-use Modules\Admin\Config\Admin;
-
 /**
  * @copyright  2020 Ad Aures
  * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
@@ -12,7 +10,7 @@ use Modules\Admin\Config\Admin;
 
 return [
     'label' => 'навигационная цепочка',
-    config(Admin::class)
+    config('Admin')
         ->gateway => 'Главная',
     'podcasts' => 'подкасты',
     'episodes' => 'выпуски',
diff --git a/modules/Admin/Language/sk/Breadcrumb.php b/modules/Admin/Language/sk/Breadcrumb.php
index b47dd87802..26cf0b17c7 100644
--- a/modules/Admin/Language/sk/Breadcrumb.php
+++ b/modules/Admin/Language/sk/Breadcrumb.php
@@ -2,8 +2,6 @@
 
 declare(strict_types=1);
 
-use Modules\Admin\Config\Admin;
-
 /**
  * @copyright  2020 Ad Aures
  * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
@@ -12,7 +10,7 @@ use Modules\Admin\Config\Admin;
 
 return [
     'label' => 'omrvinky',
-    config(Admin::class)
+    config('Admin')
         ->gateway => 'Úvod',
     'podcasts' => 'podcasty',
     'episodes' => 'časti',
diff --git a/modules/Admin/Language/sr-Latn/Breadcrumb.php b/modules/Admin/Language/sr-Latn/Breadcrumb.php
index 48e20d4104..3376dedd6c 100644
--- a/modules/Admin/Language/sr-Latn/Breadcrumb.php
+++ b/modules/Admin/Language/sr-Latn/Breadcrumb.php
@@ -2,8 +2,6 @@
 
 declare(strict_types=1);
 
-use Modules\Admin\Config\Admin;
-
 /**
  * @copyright  2020 Ad Aures
  * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
@@ -12,7 +10,7 @@ use Modules\Admin\Config\Admin;
 
 return [
     'label' => 'breadcrumb polja',
-    config(Admin::class)
+    config('Admin')
         ->gateway => 'Početna',
     'podcasts' => 'podkasti',
     'episodes' => 'epizode',
diff --git a/modules/Admin/Language/sv/Breadcrumb.php b/modules/Admin/Language/sv/Breadcrumb.php
index cf8a2e95a4..7acad68ee7 100644
--- a/modules/Admin/Language/sv/Breadcrumb.php
+++ b/modules/Admin/Language/sv/Breadcrumb.php
@@ -2,8 +2,6 @@
 
 declare(strict_types=1);
 
-use Modules\Admin\Config\Admin;
-
 /**
  * @copyright  2020 Ad Aures
  * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
@@ -12,7 +10,7 @@ use Modules\Admin\Config\Admin;
 
 return [
     'label' => 'breadcrumb',
-    config(Admin::class)
+    config('Admin')
         ->gateway => 'Hem',
     'podcasts' => 'podcasts',
     'episodes' => 'avsnitt',
diff --git a/modules/Admin/Language/uk/Breadcrumb.php b/modules/Admin/Language/uk/Breadcrumb.php
index 6a678d4ea9..408c9f9ff6 100644
--- a/modules/Admin/Language/uk/Breadcrumb.php
+++ b/modules/Admin/Language/uk/Breadcrumb.php
@@ -2,8 +2,6 @@
 
 declare(strict_types=1);
 
-use Modules\Admin\Config\Admin;
-
 /**
  * @copyright  2020 Ad Aures
  * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
@@ -12,7 +10,7 @@ use Modules\Admin\Config\Admin;
 
 return [
     'label' => 'breadcrumb',
-    config(Admin::class)
+    config('Admin')
         ->gateway => 'Home',
     'podcasts' => 'podcasts',
     'episodes' => 'episodes',
diff --git a/modules/Admin/Language/zh-Hans/Breadcrumb.php b/modules/Admin/Language/zh-Hans/Breadcrumb.php
index d0344a98be..db129570a8 100644
--- a/modules/Admin/Language/zh-Hans/Breadcrumb.php
+++ b/modules/Admin/Language/zh-Hans/Breadcrumb.php
@@ -2,8 +2,6 @@
 
 declare(strict_types=1);
 
-use Modules\Admin\Config\Admin;
-
 /**
  * @copyright  2020 Ad Aures
  * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
@@ -12,7 +10,7 @@ use Modules\Admin\Config\Admin;
 
 return [
     'label' => '面包屑导航',
-    config(Admin::class)
+    config('Admin')
         ->gateway => '主页',
     'podcasts' => '播客',
     'episodes' => '剧集',
diff --git a/modules/Admin/Language/zh-Hant/Breadcrumb.php b/modules/Admin/Language/zh-Hant/Breadcrumb.php
index 6a678d4ea9..408c9f9ff6 100644
--- a/modules/Admin/Language/zh-Hant/Breadcrumb.php
+++ b/modules/Admin/Language/zh-Hant/Breadcrumb.php
@@ -2,8 +2,6 @@
 
 declare(strict_types=1);
 
-use Modules\Admin\Config\Admin;
-
 /**
  * @copyright  2020 Ad Aures
  * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
@@ -12,7 +10,7 @@ use Modules\Admin\Config\Admin;
 
 return [
     'label' => 'breadcrumb',
-    config(Admin::class)
+    config('Admin')
         ->gateway => 'Home',
     'podcasts' => 'podcasts',
     'episodes' => 'episodes',
diff --git a/modules/Analytics/Config/Routes.php b/modules/Analytics/Config/Routes.php
index 04ed7eb68c..d24e716fdd 100644
--- a/modules/Analytics/Config/Routes.php
+++ b/modules/Analytics/Config/Routes.php
@@ -2,7 +2,7 @@
 
 declare(strict_types=1);
 
-use Modules\Analytics\Config\Analytics;
+use CodeIgniter\Router\RouteCollection;
 
 /**
  * @copyright  2021 Ad Aures
@@ -27,17 +27,17 @@ $routes->addPlaceholder(
 $routes->group('', [
     'namespace' => 'Modules\Analytics\Controllers',
 ], static function ($routes): void {
-    $routes->group(config(Analytics::class)->gateway . '/(:num)/(:class)', static function ($routes): void {
+    $routes->group(config('Analytics')->gateway . '/(:num)/(:class)', static function ($routes): void {
         $routes->get('/', 'AnalyticsController::getData/$1/$2', [
             'as'     => 'analytics-full-data',
-            'filter' => config(Analytics::class)
+            'filter' => config('Analytics')
                 ->routeFilters[
                 'analytics-full-data'
             ],
         ]);
         $routes->get('(:filter)', 'AnalyticsController::getData/$1/$2/$3', [
             'as'     => 'analytics-data',
-            'filter' => config(Analytics::class)
+            'filter' => config('Analytics')
                 ->routeFilters['analytics-data'],
         ]);
         $routes->get(
@@ -45,14 +45,14 @@ $routes->group('', [
             'AnalyticsController::getData/$1/$2/$3/$4',
             [
                 'as'     => 'analytics-filtered-data',
-                'filter' => config(Analytics::class)
+                'filter' => config('Analytics')
                     ->routeFilters[
                     'analytics-filtered-data'
                 ],
             ],
         );
     });
-    $routes->get(config(Analytics::class)->gateway . '/(:class)/(:filter)', 'AnalyticsController::getData/$1/$2', [
+    $routes->get(config('Analytics')->gateway . '/(:class)/(:filter)', 'AnalyticsController::getData/$1/$2', [
         'as' => 'analytics-data-instance',
     ]);
 
diff --git a/modules/Analytics/Controllers/AnalyticsController.php b/modules/Analytics/Controllers/AnalyticsController.php
index fb0a03150a..adf7e3e0e7 100644
--- a/modules/Analytics/Controllers/AnalyticsController.php
+++ b/modules/Analytics/Controllers/AnalyticsController.php
@@ -31,11 +31,13 @@ class AnalyticsController extends Controller
         }
 
         if (! is_numeric($params[0])) {
+            // @phpstan-ignore-next-line
             $this->analyticsModel = model('Analytics' . $params[0] . 'Model');
             $this->methodName = 'getData' . $params[1];
             return $this->{$method}();
         }
 
+        // @phpstan-ignore-next-line
         $this->analyticsModel = model('Analytics' . $params[1] . 'Model');
         $this->methodName = 'getData' . (count($params) >= 3 ? $params[2] : '');
 
diff --git a/modules/Analytics/Entities/AnalyticsPodcasts.php b/modules/Analytics/Entities/AnalyticsPodcasts.php
index 5faf503beb..3ff2b58ec7 100644
--- a/modules/Analytics/Entities/AnalyticsPodcasts.php
+++ b/modules/Analytics/Entities/AnalyticsPodcasts.php
@@ -27,7 +27,7 @@ use CodeIgniter\Entity\Entity;
 class AnalyticsPodcasts extends Entity
 {
     /**
-     * @var string[]
+     * @var list<string>
      */
     protected $dates = ['date', 'created_at', 'updated_at'];
 
diff --git a/modules/Analytics/Entities/AnalyticsPodcastsByCountry.php b/modules/Analytics/Entities/AnalyticsPodcastsByCountry.php
index 105e6c0893..d9dd478ad6 100644
--- a/modules/Analytics/Entities/AnalyticsPodcastsByCountry.php
+++ b/modules/Analytics/Entities/AnalyticsPodcastsByCountry.php
@@ -26,7 +26,7 @@ use CodeIgniter\Entity\Entity;
 class AnalyticsPodcastsByCountry extends Entity
 {
     /**
-     * @var string[]
+     * @var list<string>
      */
     protected $dates = ['date', 'created_at', 'updated_at'];
 
diff --git a/modules/Analytics/Entities/AnalyticsPodcastsByEpisode.php b/modules/Analytics/Entities/AnalyticsPodcastsByEpisode.php
index 27e561c9bc..354d98ec53 100644
--- a/modules/Analytics/Entities/AnalyticsPodcastsByEpisode.php
+++ b/modules/Analytics/Entities/AnalyticsPodcastsByEpisode.php
@@ -25,7 +25,7 @@ use CodeIgniter\Entity\Entity;
 class AnalyticsPodcastsByEpisode extends Entity
 {
     /**
-     * @var string[]
+     * @var list<string>
      */
     protected $dates = ['date', 'created_at', 'updated_at'];
 
diff --git a/modules/Analytics/Entities/AnalyticsPodcastsByHour.php b/modules/Analytics/Entities/AnalyticsPodcastsByHour.php
index e0b66ed47e..e74ef64af3 100644
--- a/modules/Analytics/Entities/AnalyticsPodcastsByHour.php
+++ b/modules/Analytics/Entities/AnalyticsPodcastsByHour.php
@@ -25,7 +25,7 @@ use CodeIgniter\Entity\Entity;
 class AnalyticsPodcastsByHour extends Entity
 {
     /**
-     * @var string[]
+     * @var list<string>
      */
     protected $dates = ['date', 'created_at', 'updated_at'];
 
diff --git a/modules/Analytics/Entities/AnalyticsPodcastsByPlayer.php b/modules/Analytics/Entities/AnalyticsPodcastsByPlayer.php
index 1129668ab5..6f2b504411 100644
--- a/modules/Analytics/Entities/AnalyticsPodcastsByPlayer.php
+++ b/modules/Analytics/Entities/AnalyticsPodcastsByPlayer.php
@@ -28,7 +28,7 @@ use CodeIgniter\Entity\Entity;
 class AnalyticsPodcastsByPlayer extends Entity
 {
     /**
-     * @var string[]
+     * @var list<string>
      */
     protected $dates = ['date', 'created_at', 'updated_at'];
 
diff --git a/modules/Analytics/Entities/AnalyticsPodcastsByRegion.php b/modules/Analytics/Entities/AnalyticsPodcastsByRegion.php
index 618e74efca..777c414867 100644
--- a/modules/Analytics/Entities/AnalyticsPodcastsByRegion.php
+++ b/modules/Analytics/Entities/AnalyticsPodcastsByRegion.php
@@ -28,7 +28,7 @@ use CodeIgniter\Entity\Entity;
 class AnalyticsPodcastsByRegion extends Entity
 {
     /**
-     * @var string[]
+     * @var list<string>
      */
     protected $dates = ['date', 'created_at', 'updated_at'];
 
diff --git a/modules/Analytics/Entities/AnalyticsPodcastsByService.php b/modules/Analytics/Entities/AnalyticsPodcastsByService.php
index 0b024b9694..f86d6db60f 100644
--- a/modules/Analytics/Entities/AnalyticsPodcastsByService.php
+++ b/modules/Analytics/Entities/AnalyticsPodcastsByService.php
@@ -30,7 +30,7 @@ use Opawg\UserAgentsV2Php\UserAgentsRSS;
 class AnalyticsPodcastsByService extends Entity
 {
     /**
-     * @var string[]
+     * @var list<string>
      */
     protected $dates = ['date', 'created_at', 'updated_at'];
 
diff --git a/modules/Analytics/Entities/AnalyticsPodcastsBySubscription.php b/modules/Analytics/Entities/AnalyticsPodcastsBySubscription.php
index 160bd7ff2f..f048fea001 100644
--- a/modules/Analytics/Entities/AnalyticsPodcastsBySubscription.php
+++ b/modules/Analytics/Entities/AnalyticsPodcastsBySubscription.php
@@ -24,7 +24,7 @@ use CodeIgniter\Entity\Entity;
 class AnalyticsPodcastsBySubscription extends Entity
 {
     /**
-     * @var string[]
+     * @var list<string>
      */
     protected $dates = ['date', 'created_at', 'updated_at'];
 
diff --git a/modules/Analytics/Entities/AnalyticsUnknownUserAgent.php b/modules/Analytics/Entities/AnalyticsUnknownUserAgent.php
index 94be0951c6..1c897d7ca6 100644
--- a/modules/Analytics/Entities/AnalyticsUnknownUserAgent.php
+++ b/modules/Analytics/Entities/AnalyticsUnknownUserAgent.php
@@ -24,7 +24,7 @@ use CodeIgniter\Entity\Entity;
 class AnalyticsUnknownUserAgent extends Entity
 {
     /**
-     * @var string[]
+     * @var list<string>
      */
     protected $dates = ['created_at', 'updated_at'];
 
diff --git a/modules/Analytics/Entities/AnalyticsWebsiteByBrowser.php b/modules/Analytics/Entities/AnalyticsWebsiteByBrowser.php
index 0dbbd74f4a..80c568c8b2 100644
--- a/modules/Analytics/Entities/AnalyticsWebsiteByBrowser.php
+++ b/modules/Analytics/Entities/AnalyticsWebsiteByBrowser.php
@@ -25,7 +25,7 @@ use CodeIgniter\Entity\Entity;
 class AnalyticsWebsiteByBrowser extends Entity
 {
     /**
-     * @var string[]
+     * @var list<string>
      */
     protected $dates = ['date', 'created_at', 'updated_at'];
 
diff --git a/modules/Analytics/Entities/AnalyticsWebsiteByEntryPage.php b/modules/Analytics/Entities/AnalyticsWebsiteByEntryPage.php
index 5e04659a0e..51d436b627 100644
--- a/modules/Analytics/Entities/AnalyticsWebsiteByEntryPage.php
+++ b/modules/Analytics/Entities/AnalyticsWebsiteByEntryPage.php
@@ -25,7 +25,7 @@ use CodeIgniter\Entity\Entity;
 class AnalyticsWebsiteByEntryPage extends Entity
 {
     /**
-     * @var string[]
+     * @var list<string>
      */
     protected $dates = ['date', 'created_at', 'updated_at'];
 
diff --git a/modules/Analytics/Entities/AnalyticsWebsiteByReferer.php b/modules/Analytics/Entities/AnalyticsWebsiteByReferer.php
index a685e0720d..15819f739a 100644
--- a/modules/Analytics/Entities/AnalyticsWebsiteByReferer.php
+++ b/modules/Analytics/Entities/AnalyticsWebsiteByReferer.php
@@ -25,7 +25,7 @@ use CodeIgniter\Entity\Entity;
 class AnalyticsWebsiteByReferer extends Entity
 {
     /**
-     * @var string[]
+     * @var list<string>
      */
     protected $dates = ['date', 'created_at', 'updated_at'];
 
diff --git a/modules/Analytics/Helpers/analytics_helper.php b/modules/Analytics/Helpers/analytics_helper.php
index 4862511773..99a21ed9ca 100644
--- a/modules/Analytics/Helpers/analytics_helper.php
+++ b/modules/Analytics/Helpers/analytics_helper.php
@@ -11,7 +11,6 @@ declare(strict_types=1);
 use AdAures\Ipcat\IpDb;
 use Config\Services;
 use GeoIp2\Database\Reader;
-use Modules\Analytics\Config\Analytics;
 use Opawg\UserAgentsV2Php\UserAgents;
 use WhichBrowser\Parser;
 
@@ -41,11 +40,12 @@ if (! function_exists('client_ip')) {
      */
     function client_ip(): string
     {
-        if (! empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
-            return $_SERVER['HTTP_X_FORWARDED_FOR'];
+        $superglobals = service('superglobals');
+        if (! empty($superglobals->server('HTTP_X_FORWARDED_FOR'))) {
+            return $superglobals->server('HTTP_X_FORWARDED_FOR');
         }
 
-        return $_SERVER['REMOTE_ADDR'];
+        return $superglobals->server('REMOTE_ADDR');
     }
 }
 
@@ -109,7 +109,8 @@ if (! function_exists('set_user_session_player')) {
 
         if (! $session->has('player')) {
             $playerFound = null;
-            $userAgent = $_SERVER['HTTP_USER_AGENT'];
+            $userAgent = service('superglobals')
+                ->server('HTTP_USER_AGENT');
 
             try {
                 $playerFound = UserAgents::find($userAgent);
@@ -175,7 +176,8 @@ if (! function_exists('set_user_session_referer')) {
     {
         $session = Services::session();
 
-        $newreferer = $_SERVER['HTTP_REFERER'] ?? '- Direct -';
+        $newreferer = service('superglobals')
+            ->server('HTTP_REFERER') ?? '- Direct -';
         $newreferer =
             parse_url((string) $newreferer, PHP_URL_HOST) ===
             parse_url(current_url(false), PHP_URL_HOST)
@@ -195,7 +197,8 @@ if (! function_exists('set_user_session_entry_page')) {
     {
         $session = Services::session();
 
-        $entryPage = $_SERVER['REQUEST_URI'];
+        $entryPage = service('superglobals')
+            ->server('REQUEST_URI');
         if (! $session->has('entryPage')) {
             $session->set('entryPage', $entryPage);
         }
@@ -243,10 +246,11 @@ if (! function_exists('podcast_hit')) {
                 $session->get('player')['bot'] = true;
             }
 
+            $superglobals = service('superglobals');
             //We get the HTTP header field `Range`:
-            $httpRange = $_SERVER['HTTP_RANGE'] ?? null;
+            $httpRange = $superglobals->server('HTTP_RANGE') ?? null;
 
-            $salt = config(Analytics::class)
+            $salt = config('Analytics')
                 ->salt;
             // We create a sha1 hash for this Salt+Current_Date+IP_Address+User_Agent+Episode_ID (used to count only once multiple episode downloads):
             $episodeListenerHashId =
@@ -254,11 +258,14 @@ if (! function_exists('podcast_hit')) {
                 sha1(
                     $salt . '_' . date(
                         'Y-m-d'
-                    ) . '_' . $clientIp . '_' . $_SERVER['HTTP_USER_AGENT'] . '_' . $episodeId
+                    ) . '_' . $clientIp . '_' . $superglobals->server('HTTP_USER_AGENT') . '_' . $episodeId
                 );
             // The cache expires at midnight:
             $secondsToMidnight = strtotime('tomorrow') - time();
+
+            /** @var int|null $downloadedBytes */
             $downloadedBytes = cache($episodeListenerHashId);
+
             if ($downloadedBytes === null) {
                 // If it was never downloaded that means that zero bytes were downloaded:
                 $downloadedBytes = 0;
@@ -301,13 +308,16 @@ if (! function_exists('podcast_hit')) {
                         sha1(
                             $salt . '_' . date(
                                 'Y-m-d'
-                            ) . '_' . $clientIp . '_' . $_SERVER['HTTP_USER_AGENT'] . '_' . $podcastId
+                            ) . '_' . $clientIp . '_' . $superglobals->server('HTTP_USER_AGENT') . '_' . $podcastId
                         );
                     $newListener = 1;
+
                     // Has this listener already downloaded an episode today:
+                    /** @var int|null $downloadsByUser */
                     $downloadsByUser = cache($podcastListenerHashId);
+
                     // We add one download
-                    if ($downloadsByUser) {
+                    if ($downloadsByUser === null) {
                         $newListener = 0;
                         ++$downloadsByUser;
                     } else {
diff --git a/modules/Analytics/Models/AnalyticsPodcastModel.php b/modules/Analytics/Models/AnalyticsPodcastModel.php
index 782934fed1..e58f574e76 100644
--- a/modules/Analytics/Models/AnalyticsPodcastModel.php
+++ b/modules/Analytics/Models/AnalyticsPodcastModel.php
@@ -12,7 +12,6 @@ declare(strict_types=1);
 
 namespace Modules\Analytics\Models;
 
-use App\Entities\Media\BaseMedia;
 use CodeIgniter\Model;
 use Modules\Analytics\Entities\AnalyticsPodcasts;
 use Modules\Media\Models\MediaModel;
@@ -263,7 +262,7 @@ class AnalyticsPodcastModel extends Model
     /**
      * Get total storage
      *
-     * @return BaseMedia[]
+     * @return AnalyticsPodcasts[]
      */
     public function getDataTotalStorageByMonth(): array
     {
diff --git a/modules/Analytics/Models/AnalyticsUnknownUseragentsModel.php b/modules/Analytics/Models/AnalyticsUnknownUserAgentsModel.php
similarity index 94%
rename from modules/Analytics/Models/AnalyticsUnknownUseragentsModel.php
rename to modules/Analytics/Models/AnalyticsUnknownUserAgentsModel.php
index 21cf11d278..846ca598b9 100644
--- a/modules/Analytics/Models/AnalyticsUnknownUseragentsModel.php
+++ b/modules/Analytics/Models/AnalyticsUnknownUserAgentsModel.php
@@ -15,7 +15,7 @@ namespace Modules\Analytics\Models;
 use CodeIgniter\Model;
 use Modules\Analytics\Entities\AnalyticsUnknownUserAgent;
 
-class AnalyticsUnknownUserAgentModel extends Model
+class AnalyticsUnknownUserAgentsModel extends Model
 {
     /**
      * @var string
diff --git a/modules/Api/Rest/V1/Config/Registrar.php b/modules/Api/Rest/V1/Config/Registrar.php
index ec76dcee39..438149343e 100644
--- a/modules/Api/Rest/V1/Config/Registrar.php
+++ b/modules/Api/Rest/V1/Config/Registrar.php
@@ -8,6 +8,9 @@ use Modules\Api\Rest\V1\Filters\ApiFilter;
 
 class Registrar
 {
+    /**
+     * @return array<string, mixed>
+     */
     public static function Filters(): array
     {
         return [
diff --git a/modules/Api/Rest/V1/Config/Routes.php b/modules/Api/Rest/V1/Config/Routes.php
index 0951a7d5d5..6cbba9d863 100644
--- a/modules/Api/Rest/V1/Config/Routes.php
+++ b/modules/Api/Rest/V1/Config/Routes.php
@@ -9,7 +9,7 @@ use CodeIgniter\Router\RouteCollection;
 /** @var RouteCollection $routes */
 
 $routes->group(
-    config(RestApi::class)
+    config('RestApi')
         ->gateway . 'podcasts',
     [
         'namespace' => 'Modules\Api\Rest\V1\Controllers',
@@ -23,7 +23,7 @@ $routes->group(
 );
 
 $routes->group(
-    config(RestApi::class)
+    config('RestApi')
         ->gateway . 'episodes',
     [
         'namespace' => 'Modules\Api\Rest\V1\Controllers',
diff --git a/modules/Api/Rest/V1/Config/Services.php b/modules/Api/Rest/V1/Config/Services.php
index 48c9489713..40806e825b 100644
--- a/modules/Api/Rest/V1/Config/Services.php
+++ b/modules/Api/Rest/V1/Config/Services.php
@@ -5,17 +5,16 @@ declare(strict_types=1);
 namespace Modules\Api\Rest\V1\Config;
 
 use CodeIgniter\Config\BaseService;
-use Config\Exceptions as ExceptionsConfig;
-use Modules\Api\Rest\V1\Core\Exceptions;
+use Modules\Api\Rest\V1\Core\RestApiExceptions;
 
 class Services extends BaseService
 {
-    public static function restApiExceptions(bool $getShared = true)
+    public static function restApiExceptions(bool $getShared = true): RestApiExceptions
     {
         if ($getShared) {
             return static::getSharedInstance('restApiExceptions');
         }
 
-        return new Exceptions(config(ExceptionsConfig::class), static::request(), static::response());
+        return new RestApiExceptions(config('Exceptions'));
     }
 }
diff --git a/modules/Api/Rest/V1/Controllers/EpisodeController.php b/modules/Api/Rest/V1/Controllers/EpisodeController.php
index f09737e8c2..104d031882 100644
--- a/modules/Api/Rest/V1/Controllers/EpisodeController.php
+++ b/modules/Api/Rest/V1/Controllers/EpisodeController.php
@@ -8,8 +8,7 @@ use App\Entities\Episode;
 use App\Models\EpisodeModel;
 use CodeIgniter\API\ResponseTrait;
 use CodeIgniter\Controller;
-use CodeIgniter\HTTP\Response;
-use Modules\Api\Rest\V1\Config\RestApi;
+use CodeIgniter\HTTP\ResponseInterface;
 use Modules\Api\Rest\V1\Config\Services;
 
 class EpisodeController extends Controller
@@ -21,7 +20,7 @@ class EpisodeController extends Controller
         Services::restApiExceptions()->initialize();
     }
 
-    public function list(): Response
+    public function list(): ResponseInterface
     {
         $query = $this->request->getGet('query');
         $order = $this->request->getGet('order') ?? 'newest';
@@ -46,7 +45,7 @@ class EpisodeController extends Controller
         }
 
         $data = $builder->findAll(
-            (int) ($this->request->getGet('limit') ?? config(RestApi::class)->limit),
+            (int) ($this->request->getGet('limit') ?? config('RestApi')->limit),
             (int) $this->request->getGet('offset')
         );
 
@@ -57,7 +56,7 @@ class EpisodeController extends Controller
         return $this->respond($data);
     }
 
-    public function view(int $id): Response
+    public function view(int $id): ResponseInterface
     {
         $episode = (new EpisodeModel())->getEpisodeById($id);
 
@@ -65,6 +64,7 @@ class EpisodeController extends Controller
             return $this->failNotFound('Episode not found');
         }
 
+        // @phpstan-ignore-next-line
         return $this->respond(static::mapEpisode($episode));
     }
 
diff --git a/modules/Api/Rest/V1/Controllers/ExceptionController.php b/modules/Api/Rest/V1/Controllers/ExceptionController.php
index 50dd786333..1f77bcc9d9 100644
--- a/modules/Api/Rest/V1/Controllers/ExceptionController.php
+++ b/modules/Api/Rest/V1/Controllers/ExceptionController.php
@@ -6,13 +6,13 @@ namespace Modules\Api\Rest\V1\Controllers;
 
 use CodeIgniter\API\ResponseTrait;
 use CodeIgniter\Controller;
-use CodeIgniter\HTTP\Response;
+use CodeIgniter\HTTP\ResponseInterface;
 
 class ExceptionController extends Controller
 {
     use ResponseTrait;
 
-    public function notFound(): Response
+    public function notFound(): ResponseInterface
     {
         return $this->failNotFound('Podcast not found');
     }
diff --git a/modules/Api/Rest/V1/Controllers/PodcastController.php b/modules/Api/Rest/V1/Controllers/PodcastController.php
index 4a1ac14645..98fa68b8bf 100644
--- a/modules/Api/Rest/V1/Controllers/PodcastController.php
+++ b/modules/Api/Rest/V1/Controllers/PodcastController.php
@@ -8,7 +8,7 @@ use App\Entities\Podcast;
 use App\Models\PodcastModel;
 use CodeIgniter\API\ResponseTrait;
 use CodeIgniter\Controller;
-use CodeIgniter\HTTP\Response;
+use CodeIgniter\HTTP\ResponseInterface;
 use Modules\Api\Rest\V1\Config\Services;
 
 class PodcastController extends Controller
@@ -20,7 +20,7 @@ class PodcastController extends Controller
         Services::restApiExceptions()->initialize();
     }
 
-    public function list(): Response
+    public function list(): ResponseInterface
     {
         $data = (new PodcastModel())->findAll();
         array_map(static function ($podcast): void {
@@ -29,13 +29,14 @@ class PodcastController extends Controller
         return $this->respond($data);
     }
 
-    public function view(int $id): Response
+    public function view(int $id): ResponseInterface
     {
         $podcast = (new PodcastModel())->getPodcastById($id);
         if (! $podcast instanceof Podcast) {
             return $this->failNotFound('Podcast not found');
         }
 
+        // @phpstan-ignore-next-line
         return $this->respond(self::mapPodcast($podcast));
     }
 
@@ -50,7 +51,7 @@ class PodcastController extends Controller
         $categories = [$podcast->getCategory(), ...$podcast->getOtherCategories()];
 
         foreach ($categories as $category) {
-            $category->translated = lang('Podcast.category_options.' . $category->code, [], null, false);
+            $category->translated = lang('Podcast.category_options.' . $category->code);
         }
 
         $podcast->categories = $categories;
diff --git a/modules/Api/Rest/V1/Core/Exceptions.php b/modules/Api/Rest/V1/Core/RestApiExceptions.php
similarity index 91%
rename from modules/Api/Rest/V1/Core/Exceptions.php
rename to modules/Api/Rest/V1/Core/RestApiExceptions.php
index 95796efdc3..7484c1b036 100644
--- a/modules/Api/Rest/V1/Core/Exceptions.php
+++ b/modules/Api/Rest/V1/Core/RestApiExceptions.php
@@ -4,9 +4,10 @@ declare(strict_types=1);
 
 namespace Modules\Api\Rest\V1\Core;
 
+use CodeIgniter\Debug\Exceptions;
 use Throwable;
 
-class Exceptions extends \CodeIgniter\Debug\Exceptions
+class RestApiExceptions extends Exceptions
 {
     protected function render(Throwable $exception, int $statusCode): void
     {
diff --git a/modules/Api/Rest/V1/Filters/ApiFilter.php b/modules/Api/Rest/V1/Filters/ApiFilter.php
index 85f7e53860..ba03bc2e3a 100644
--- a/modules/Api/Rest/V1/Filters/ApiFilter.php
+++ b/modules/Api/Rest/V1/Filters/ApiFilter.php
@@ -21,7 +21,7 @@ class ApiFilter implements FilterInterface
     public function before(RequestInterface $request, $arguments = null)
     {
         /** @var RestApi $restApiConfig */
-        $restApiConfig = config(RestApi::class);
+        $restApiConfig = config('RestApi');
 
         if (! $restApiConfig->enabled) {
             throw PageNotFoundException::forPageNotFound();
diff --git a/modules/Auth/Auth.php b/modules/Auth/Auth.php
index 35a5e31df2..2e12360920 100644
--- a/modules/Auth/Auth.php
+++ b/modules/Auth/Auth.php
@@ -6,8 +6,6 @@ namespace Modules\Auth;
 
 use CodeIgniter\Router\RouteCollection;
 use CodeIgniter\Shield\Auth as ShieldAuth;
-use Modules\Auth\Config\Auth as AuthConfig;
-use Modules\Auth\Config\AuthRoutes;
 
 class Auth extends ShieldAuth
 {
@@ -18,13 +16,15 @@ class Auth extends ShieldAuth
      * Usage (in Config/Routes.php):
      *      - auth()->routes($routes);
      *      - auth()->routes($routes, ['except' => ['login', 'register']])
+     *
+     * @param array{except?:list<string>} $config
      */
     public function routes(RouteCollection &$routes, array $config = []): void
     {
-        $authRoutes = config(AuthRoutes::class)
+        $authRoutes = config('AuthRoutes')
             ->routes;
 
-        $routes->group(config(AuthConfig::class)->gateway, [
+        $routes->group(config('Auth')->gateway, [
             'namespace' => 'Modules\Auth\Controllers',
         ], static function (RouteCollection $routes) use ($authRoutes, $config): void {
             foreach ($authRoutes as $name => $row) {
diff --git a/modules/Auth/Commands/RolesDoc.php b/modules/Auth/Commands/RolesDoc.php
index 6e15583e1a..00732a5337 100644
--- a/modules/Auth/Commands/RolesDoc.php
+++ b/modules/Auth/Commands/RolesDoc.php
@@ -44,7 +44,12 @@ class RolesDoc extends BaseCommand
     {
         // loop over all files in path
         $defaultFile = glob(ROOTPATH . 'docs/src/getting-started/auth.md');
-        $localizedFiles = glob(ROOTPATH . 'docs/src/**/getting-started/auth.md') ?? [];
+        $localizedFiles = glob(ROOTPATH . 'docs/src/**/getting-started/auth.md');
+
+        if (! $localizedFiles) {
+            $localizedFiles = [];
+        }
+
         $files = array_merge($defaultFile, $localizedFiles);
         CLI::write(implode(', ', $files));
 
@@ -74,7 +79,7 @@ class RolesDoc extends BaseCommand
         }
     }
 
-    protected function handleInstanceRoles($authGroups, string $fileContents, string $pattern): string
+    protected function handleInstanceRoles(AuthGroups $authGroups, string $fileContents, string $pattern): string
     {
         $instanceMatrix = $authGroups->matrix;
         return $this->renderCommentBlock(
@@ -88,7 +93,7 @@ class RolesDoc extends BaseCommand
         );
     }
 
-    protected function handleInstancePermissions($authGroups, string $fileContents, string $pattern): string
+    protected function handleInstancePermissions(AuthGroups $authGroups, string $fileContents, string $pattern): string
     {
         return $this->renderCommentBlock(
             $fileContents,
@@ -101,7 +106,7 @@ class RolesDoc extends BaseCommand
         );
     }
 
-    protected function handlePodcastRoles($authGroups, string $fileContents, string $pattern): string
+    protected function handlePodcastRoles(AuthGroups $authGroups, string $fileContents, string $pattern): string
     {
         $podcastMatrix = $authGroups->podcastMatrix;
         return $this->renderCommentBlock(
@@ -115,7 +120,7 @@ class RolesDoc extends BaseCommand
         );
     }
 
-    protected function handlePodcastPermissions($authGroups, string $fileContents, string $pattern): string
+    protected function handlePodcastPermissions(AuthGroups $authGroups, string $fileContents, string $pattern): string
     {
         return $this->renderCommentBlock(
             $fileContents,
@@ -128,6 +133,10 @@ class RolesDoc extends BaseCommand
         );
     }
 
+    /**
+     * @param array<string> $tableHeading
+     * @param array<string, string>|array<string, array<string, string>> $data
+     */
     private function renderCommentBlock(
         string $fileContents,
         string $pattern,
@@ -171,13 +180,9 @@ class RolesDoc extends BaseCommand
         return $newFileContents;
     }
 
-    private function detectLocaleFromPath($fileKey): string
+    private function detectLocaleFromPath(string $fileKey): string
     {
-        preg_match(
-            '~docs\/src\/(?:([a-z]{2}(?:-[A-Za-z]{2,})?)\/)getting-started\/auth\.md~',
-            (string) $fileKey,
-            $match
-        );
+        preg_match('~docs\/src\/(?:([a-z]{2}(?:-[A-Za-z]{2,})?)\/)getting-started\/auth\.md~', $fileKey, $match);
 
         if ($match === []) {
             return 'en';
diff --git a/modules/Auth/Config/Auth.php b/modules/Auth/Config/Auth.php
index 4425091446..fd9357455d 100644
--- a/modules/Auth/Config/Auth.php
+++ b/modules/Auth/Config/Auth.php
@@ -6,8 +6,9 @@ namespace Modules\Auth\Config;
 
 use CodeIgniter\Shield\Authentication\Actions\ActionInterface;
 use CodeIgniter\Shield\Authentication\Actions\Email2FA;
+use CodeIgniter\Shield\Authentication\AuthenticatorInterface;
 use CodeIgniter\Shield\Config\Auth as ShieldAuth;
-use Modules\Admin\Config\Admin;
+use CodeIgniter\Shield\Entities\User;
 use Modules\Auth\Models\UserModel;
 
 class Auth extends ShieldAuth
@@ -123,7 +124,7 @@ class Auth extends ShieldAuth
     {
         parent::__construct();
 
-        $adminGateway = config(Admin::class)
+        $adminGateway = config('Admin')
             ->gateway;
 
         $this->redirects = [
@@ -155,14 +156,16 @@ class Auth extends ShieldAuth
 
         // activate user upon magic-link login as it is done via email
         if (! auth()->user()->active) {
-            /** @var Session $authenticator */
+            /** @var AuthenticatorInterface $authenticator */
             $authenticator = auth('session')
                 ->getAuthenticator();
 
             $user = $authenticator->getUser();
 
-            // Set the user active now
-            $user->activate();
+            if ($user instanceof User) {
+                // Set the user active now
+                $user->activate();
+            }
         }
 
         // prompt user to change their password
diff --git a/modules/Auth/Config/AuthGroups.php b/modules/Auth/Config/AuthGroups.php
index 869ae99c75..06fe419b12 100644
--- a/modules/Auth/Config/AuthGroups.php
+++ b/modules/Auth/Config/AuthGroups.php
@@ -200,7 +200,7 @@ class AuthGroups extends ShieldAuthGroups
     /**
      * Fill groups, permissions and matrix based on
      */
-    public function __construct($locale = null)
+    public function __construct()
     {
         parent::__construct();
 
@@ -228,7 +228,7 @@ class AuthGroups extends ShieldAuthGroups
          */
         $podcasts = (new PodcastModel())->findAll();
         foreach ($podcasts as $podcast) {
-            $this->generatePodcastAuthorizations($podcast->id, $locale);
+            $this->generatePodcastAuthorizations($podcast->id);
         }
     }
 
diff --git a/modules/Auth/Config/AuthRoutes.php b/modules/Auth/Config/AuthRoutes.php
index 2a546139f7..8e7540a229 100644
--- a/modules/Auth/Config/AuthRoutes.php
+++ b/modules/Auth/Config/AuthRoutes.php
@@ -8,6 +8,9 @@ use CodeIgniter\Shield\Config\AuthRoutes as ShieldAuthRoutes;
 
 class AuthRoutes extends ShieldAuthRoutes
 {
+    /**
+     * @var array<string, array<array<string>>>
+     */
     public array $routes = [
         'register' => [
             ['get', 'register', 'RegisterController::registerView', 'register'],
diff --git a/modules/Auth/Config/AuthToken.php b/modules/Auth/Config/AuthToken.php
index c82f653fb9..4f56dc76b9 100644
--- a/modules/Auth/Config/AuthToken.php
+++ b/modules/Auth/Config/AuthToken.php
@@ -31,6 +31,8 @@ class AuthToken extends ShieldAuthToken
      * The name of Header that the Authorization token should be found.
      * According to the specs, this should be `Authorization`, but rare
      * circumstances might need a different header.
+     *
+     * @var array<string, string>
      */
     public array $authenticatorHeader = [
         'tokens' => 'Authorization',
diff --git a/modules/Auth/Config/Routes.php b/modules/Auth/Config/Routes.php
index d2a69999ce..4c37498260 100644
--- a/modules/Auth/Config/Routes.php
+++ b/modules/Auth/Config/Routes.php
@@ -5,7 +5,6 @@ declare(strict_types=1);
 namespace Modules\Auth\Config;
 
 use CodeIgniter\Router\RouteCollection;
-use Modules\Admin\Config\Admin;
 
 /**
  * @var RouteCollection $routes
@@ -16,7 +15,7 @@ service('auth')
 
 // Admin routes for users and podcast contributors
 $routes->group(
-    config(Admin::class)
+    config('Admin')
         ->gateway,
     [
         'namespace' => 'Modules\Auth\Controllers',
diff --git a/modules/Auth/Config/Services.php b/modules/Auth/Config/Services.php
index 0771681e4e..1ef66baea5 100644
--- a/modules/Auth/Config/Services.php
+++ b/modules/Auth/Config/Services.php
@@ -6,7 +6,6 @@ namespace Modules\Auth\Config;
 
 use Config\Services as BaseService;
 use Modules\Auth\Auth;
-use Modules\Auth\Config\Auth as AuthConfig;
 
 class Services extends BaseService
 {
@@ -20,7 +19,7 @@ class Services extends BaseService
             return self::getSharedInstance('auth');
         }
 
-        $config = config(AuthConfig::class);
+        $config = config('Auth');
 
         return new Auth($config);
     }
diff --git a/modules/Auth/Controllers/ContributorController.php b/modules/Auth/Controllers/ContributorController.php
index 77c5162cfb..da5989dfa5 100644
--- a/modules/Auth/Controllers/ContributorController.php
+++ b/modules/Auth/Controllers/ContributorController.php
@@ -115,6 +115,7 @@ class ContributorController extends BaseController
 
     public function attemptCreate(): RedirectResponse
     {
+        /** @var User $user */
         $user = (new UserModel())->find((int) $this->request->getPost('user'));
 
         if (get_podcast_group($user, $this->podcast->id)) {
diff --git a/modules/Auth/Controllers/MagicLinkController.php b/modules/Auth/Controllers/MagicLinkController.php
index 46170271b9..609aed156b 100644
--- a/modules/Auth/Controllers/MagicLinkController.php
+++ b/modules/Auth/Controllers/MagicLinkController.php
@@ -8,8 +8,7 @@ use CodeIgniter\HTTP\RedirectResponse;
 use CodeIgniter\HTTP\RequestInterface;
 use CodeIgniter\HTTP\ResponseInterface;
 use CodeIgniter\Shield\Controllers\MagicLinkController as ShieldMagicLinkController;
-use Modules\Auth\Config\Auth;
-use Modules\Auth\Models\UserModel;
+use CodeIgniter\Shield\Entities\User;
 use Psr\Log\LoggerInterface;
 use ViewThemes\Theme;
 
@@ -33,7 +32,7 @@ class MagicLinkController extends ShieldMagicLinkController
     public function setPasswordView(): string | RedirectResponse
     {
         if (! session('magicLogin')) {
-            return redirect()->to(config(Auth::class)->loginRedirect());
+            return redirect()->to(config('Auth')->loginRedirect());
         }
 
         return view(setting('Auth.views')['magic-link-set-password']);
@@ -54,17 +53,16 @@ class MagicLinkController extends ShieldMagicLinkController
 
         $validData = $this->validator->getValidated();
 
-        // set new password to user
-        auth()
-            ->user()
-            ->password = $validData['new_password'];
+        $user = auth()
+            ->user();
 
-        $userModel = new UserModel();
-        if (! $userModel->update(auth()->user()->id, auth()->user())) {
-            return redirect()
-                ->back()
-                ->withInput()
-                ->with('errors', $userModel->errors());
+        if ($user instanceof User) {
+            // set new password to user
+            $user->password = $validData['new_password'];
+
+            $userModel = auth()
+                ->getProvider();
+            $userModel->save($user);
         }
 
         // remove magic login session to reinstate normal check
@@ -73,7 +71,7 @@ class MagicLinkController extends ShieldMagicLinkController
         }
 
         // Success!
-        return redirect()->to(config(Auth::class)->loginRedirect())
+        return redirect()->to(config('Auth')->loginRedirect())
             ->with('message', lang('MyAccount.messages.passwordChangeSuccess'));
     }
 }
diff --git a/modules/Auth/Controllers/MyAccountController.php b/modules/Auth/Controllers/MyAccountController.php
index 4e0d2687d8..87cd97b114 100644
--- a/modules/Auth/Controllers/MyAccountController.php
+++ b/modules/Auth/Controllers/MyAccountController.php
@@ -11,8 +11,8 @@ declare(strict_types=1);
 namespace Modules\Auth\Controllers;
 
 use CodeIgniter\HTTP\RedirectResponse;
+use CodeIgniter\Shield\Entities\User;
 use Modules\Admin\Controllers\BaseController;
-use Modules\Auth\Models\UserModel;
 
 class MyAccountController extends BaseController
 {
@@ -60,17 +60,16 @@ class MyAccountController extends BaseController
                 ->with('error', lang('MyAccount.messages.wrongPasswordError'));
         }
 
-        // set new password to user
-        auth()
-            ->user()
-            ->password = $validData['new_password'];
+        $user = auth()
+            ->user();
 
-        $userModel = new UserModel();
-        if (! $userModel->update(auth()->user()->id, auth()->user())) {
-            return redirect()
-                ->back()
-                ->withInput()
-                ->with('errors', $userModel->errors());
+        if ($user instanceof User) {
+            // set new password to user
+            $user->password = $validData['new_password'];
+
+            $userModel = auth()
+                ->getProvider();
+            $userModel->save($user);
         }
 
         // Success!
diff --git a/modules/Auth/Controllers/UserController.php b/modules/Auth/Controllers/UserController.php
index 729f1d0a7c..98a07f3f33 100644
--- a/modules/Auth/Controllers/UserController.php
+++ b/modules/Auth/Controllers/UserController.php
@@ -16,7 +16,6 @@ use CodeIgniter\I18n\Time;
 use CodeIgniter\Shield\Authentication\Authenticators\Session;
 use CodeIgniter\Shield\Entities\User;
 use CodeIgniter\Shield\Exceptions\ValidationException;
-use CodeIgniter\Shield\Models\UserIdentityModel;
 use Modules\Admin\Controllers\BaseController;
 use Modules\Auth\Models\UserModel;
 
@@ -115,8 +114,7 @@ class UserController extends BaseController
 
         // **** SEND WELCOME LINK FOR FIRST LOGIN ****
 
-        /** @var UserIdentityModel $identityModel */
-        $identityModel = model(UserIdentityModel::class);
+        $identityModel = model('UserIdentityModel');
 
         // Delete any previous magic-link identities
         $identityModel->deleteIdentitiesByType($user, Session::ID_TYPE_MAGIC_LINK);
@@ -137,7 +135,7 @@ class UserController extends BaseController
         $email->setTo($user->email);
         $email->setSubject(lang('Auth.welcomeSubject', [
             'siteName' => setting('App.siteName'),
-        ], null, false));
+        ]));
         $email->setMessage(view(setting('Auth.views')['welcome-email'], [
             'token' => $token,
         ], [
diff --git a/modules/Auth/Models/UserModel.php b/modules/Auth/Models/UserModel.php
index 2fbdbd0742..16ac112a57 100644
--- a/modules/Auth/Models/UserModel.php
+++ b/modules/Auth/Models/UserModel.php
@@ -16,7 +16,7 @@ use CodeIgniter\Shield\Models\UserModel as ShieldUserModel;
 class UserModel extends ShieldUserModel
 {
     /**
-     * @var string[]
+     * @var list<string>
      */
     protected $allowedFields = [
         'username',
diff --git a/modules/Fediverse/Commands/Broadcast.php b/modules/Fediverse/Commands/Broadcast.php
index 6f74f5d9f1..559dc6825c 100644
--- a/modules/Fediverse/Commands/Broadcast.php
+++ b/modules/Fediverse/Commands/Broadcast.php
@@ -5,7 +5,6 @@ declare(strict_types=1);
 namespace Modules\Fediverse\Commands;
 
 use CodeIgniter\CLI\BaseCommand;
-use Modules\Fediverse\Models\ActivityModel;
 
 class Broadcast extends BaseCommand
 {
@@ -20,7 +19,7 @@ class Broadcast extends BaseCommand
         helper('fediverse');
 
         // retrieve scheduled activities from database
-        $scheduledActivities = model(ActivityModel::class, false)
+        $scheduledActivities = model('ActivityModel', false)
             ->getScheduledActivities();
 
         // Send activity to all followers
@@ -43,7 +42,7 @@ class Broadcast extends BaseCommand
             }
 
             // set activity post to delivered
-            model(ActivityModel::class, false)
+            model('ActivityModel', false)
                 ->update($scheduledActivity->id, [
                     'status' => 'delivered',
                 ]);
diff --git a/modules/Fediverse/Config/Registrar.php b/modules/Fediverse/Config/Registrar.php
index e4a4382626..3c28460f65 100644
--- a/modules/Fediverse/Config/Registrar.php
+++ b/modules/Fediverse/Config/Registrar.php
@@ -8,6 +8,9 @@ use Modules\Fediverse\Filters\FediverseFilter;
 
 class Registrar
 {
+    /**
+     * @return array<string, mixed>
+     */
     public static function Filters(): array
     {
         return [
diff --git a/modules/Fediverse/Controllers/ActivityPubController.php b/modules/Fediverse/Controllers/ActivityPubController.php
index d8fbbe86e9..bceee417a3 100644
--- a/modules/Fediverse/Controllers/ActivityPubController.php
+++ b/modules/Fediverse/Controllers/ActivityPubController.php
@@ -11,11 +11,11 @@ declare(strict_types=1);
 namespace Modules\Fediverse\Controllers;
 
 use CodeIgniter\Controller;
-use CodeIgniter\HTTP\Response;
+use CodeIgniter\HTTP\ResponseInterface;
 
 class ActivityPubController extends Controller
 {
-    public function preflight(): Response
+    public function preflight(): ResponseInterface
     {
         return $this->response->setHeader('Access-Control-Allow-Origin', '*') // for allowing any domain, insecure
             ->setHeader('Access-Control-Allow-Headers', '*') // for allowing any headers, insecure
diff --git a/modules/Fediverse/Controllers/ActorController.php b/modules/Fediverse/Controllers/ActorController.php
index dd13c63806..f5b6d1866f 100644
--- a/modules/Fediverse/Controllers/ActorController.php
+++ b/modules/Fediverse/Controllers/ActorController.php
@@ -26,7 +26,7 @@ use Modules\Fediverse\Objects\OrderedCollectionPage;
 class ActorController extends Controller
 {
     /**
-     * @var string[]
+     * @var list<string>
      */
     protected $helpers = ['fediverse'];
 
@@ -36,7 +36,7 @@ class ActorController extends Controller
 
     public function __construct()
     {
-        $this->config = config(Fediverse::class);
+        $this->config = config('Fediverse');
     }
 
     public function _remap(string $method, string ...$params): mixed
@@ -89,7 +89,6 @@ class ActorController extends Controller
             );
 
         // switch/case on activity type
-        /** @phpstan-ignore-next-line */
         switch ($payload->type) {
             case 'Create':
                 if ($payload->object->type === 'Note') {
@@ -192,7 +191,6 @@ class ActorController extends Controller
                     ->setJSON([]);
             case 'Undo':
                 // switch/case on the type of activity to undo
-                /** @phpstan-ignore-next-line */
                 switch ($payload->object->type) {
                     case 'Follow':
                         // revert side-effect by removing follow from database
diff --git a/modules/Fediverse/Controllers/BlockController.php b/modules/Fediverse/Controllers/BlockController.php
index 6ab44e176b..c279ce4eda 100644
--- a/modules/Fediverse/Controllers/BlockController.php
+++ b/modules/Fediverse/Controllers/BlockController.php
@@ -17,7 +17,7 @@ use Exception;
 class BlockController extends Controller
 {
     /**
-     * @var string[]
+     * @var list<string>
      */
     protected $helpers = ['fediverse'];
 
diff --git a/modules/Fediverse/Controllers/NodeInfo2Controller.php b/modules/Fediverse/Controllers/NodeInfo2Controller.php
index 753f66f354..4457c60077 100644
--- a/modules/Fediverse/Controllers/NodeInfo2Controller.php
+++ b/modules/Fediverse/Controllers/NodeInfo2Controller.php
@@ -12,7 +12,6 @@ namespace Modules\Fediverse\Controllers;
 
 use CodeIgniter\Controller;
 use CodeIgniter\HTTP\ResponseInterface;
-use Modules\Auth\Config\Auth;
 
 class NodeInfo2Controller extends Controller
 {
@@ -36,7 +35,7 @@ class NodeInfo2Controller extends Controller
                 'version'  => CP_VERSION,
             ],
             'protocols'         => ['activitypub'],
-            'openRegistrations' => config(Auth::class)
+            'openRegistrations' => config('Auth')
                 ->allowRegistration,
             'usage' => [
                 'users' => [
diff --git a/modules/Fediverse/Controllers/PostController.php b/modules/Fediverse/Controllers/PostController.php
index f188d0132c..c67ed66cb1 100644
--- a/modules/Fediverse/Controllers/PostController.php
+++ b/modules/Fediverse/Controllers/PostController.php
@@ -14,7 +14,6 @@ use CodeIgniter\Controller;
 use CodeIgniter\Exceptions\PageNotFoundException;
 use CodeIgniter\HTTP\IncomingRequest;
 use CodeIgniter\HTTP\RedirectResponse;
-use CodeIgniter\HTTP\Response;
 use CodeIgniter\HTTP\ResponseInterface;
 use CodeIgniter\I18n\Time;
 use Modules\Fediverse\Config\Fediverse;
@@ -32,7 +31,7 @@ class PostController extends Controller
     protected $request;
 
     /**
-     * @var string[]
+     * @var list<string>
      */
     protected $helpers = ['fediverse'];
 
@@ -45,7 +44,7 @@ class PostController extends Controller
 
     public function __construct()
     {
-        $this->config = config(Fediverse::class);
+        $this->config = config('Fediverse');
     }
 
     public function _remap(string $method, string ...$params): mixed
@@ -65,7 +64,7 @@ class PostController extends Controller
         return $this->{$method}(...$params);
     }
 
-    public function index(): Response
+    public function index(): ResponseInterface
     {
         $noteObjectClass = $this->config->noteObject;
         $noteObject = new $noteObjectClass($this->post);
@@ -75,7 +74,7 @@ class PostController extends Controller
             ->setBody($noteObject->toJSON());
     }
 
-    public function replies(): Response
+    public function replies(): ResponseInterface
     {
         /**
          * get post replies
@@ -167,7 +166,7 @@ class PostController extends Controller
             ->getActorById($validData['actor_id']);
 
         model('FavouriteModel', false)
-            ->toggleFavourite($actor, $this->post->id);
+            ->toggleFavourite($actor, $this->post);
 
         return redirect()->back();
     }
diff --git a/modules/Fediverse/Core/AbstractObject.php b/modules/Fediverse/Core/AbstractObject.php
index cfe7ff5370..7870f60c32 100644
--- a/modules/Fediverse/Core/AbstractObject.php
+++ b/modules/Fediverse/Core/AbstractObject.php
@@ -24,7 +24,7 @@ abstract class AbstractObject
     }
 
     /**
-     * @return array<string, string|int|bool|array>
+     * @return array<string, mixed>
      */
     public function toArray(): array
     {
diff --git a/modules/Fediverse/Entities/Activity.php b/modules/Fediverse/Entities/Activity.php
index 6f1bd8e2ad..ba017f16f3 100644
--- a/modules/Fediverse/Entities/Activity.php
+++ b/modules/Fediverse/Entities/Activity.php
@@ -41,7 +41,7 @@ class Activity extends UuidEntity
     protected $uuids = ['id', 'post_id'];
 
     /**
-     * @var string[]
+     * @var list<string>
      */
     protected $dates = ['scheduled_at', 'created_at'];
 
diff --git a/modules/Fediverse/Entities/Notification.php b/modules/Fediverse/Entities/Notification.php
index d23bd66c5a..5e5f89d0fc 100644
--- a/modules/Fediverse/Entities/Notification.php
+++ b/modules/Fediverse/Entities/Notification.php
@@ -10,6 +10,7 @@ declare(strict_types=1);
 
 namespace Modules\Fediverse\Entities;
 
+use CodeIgniter\I18n\Time;
 use Michalsn\Uuid\UuidEntity;
 use Modules\Fediverse\Models\ActorModel;
 use Modules\Fediverse\Models\PostModel;
@@ -46,7 +47,7 @@ class Notification extends UuidEntity
     protected $uuids = ['post_id', 'activity_id'];
 
     /**
-     * @var string[]
+     * @var list<string>
      */
     protected $dates = ['read_at', 'created_at', 'updated_at'];
 
diff --git a/modules/Fediverse/Entities/Post.php b/modules/Fediverse/Entities/Post.php
index f099060193..f791d57f08 100644
--- a/modules/Fediverse/Entities/Post.php
+++ b/modules/Fediverse/Entities/Post.php
@@ -65,7 +65,7 @@ class Post extends UuidEntity
     protected $uuids = ['id', 'in_reply_to_id', 'reblog_of_id'];
 
     /**
-     * @var string[]
+     * @var list<string>
      */
     protected $dates = ['published_at', 'created_at'];
 
diff --git a/modules/Fediverse/Filters/FediverseFilter.php b/modules/Fediverse/Filters/FediverseFilter.php
index 3b99cca3bd..355bfa3a38 100644
--- a/modules/Fediverse/Filters/FediverseFilter.php
+++ b/modules/Fediverse/Filters/FediverseFilter.php
@@ -44,6 +44,7 @@ class FediverseFilter implements FilterInterface
         }
 
         if (in_array('verify-blocks', $params, true)) {
+            // @phpstan-ignore-next-line
             $payload = $request->getJSON();
 
             $actorUri = $payload->actor;
diff --git a/modules/Fediverse/Helpers/fediverse_helper.php b/modules/Fediverse/Helpers/fediverse_helper.php
index 195149e4e2..0a020a580c 100644
--- a/modules/Fediverse/Helpers/fediverse_helper.php
+++ b/modules/Fediverse/Helpers/fediverse_helper.php
@@ -17,7 +17,6 @@ use Modules\Fediverse\ActivityRequest;
 use Modules\Fediverse\Core\ObjectType;
 use Modules\Fediverse\Entities\Actor;
 use Modules\Fediverse\Entities\PreviewCard;
-use Modules\Fediverse\Models\ActivityModel;
 
 if (! function_exists('get_webfinger_data')) {
     /**
@@ -79,7 +78,7 @@ if (! function_exists('accept_follow')) {
         $db = db_connect();
         $db->transStart();
 
-        $activityModel = model(ActivityModel::class, false);
+        $activityModel = model('ActivityModel', false);
         $activityId = $activityModel->newActivity(
             'Accept',
             $actor->id,
@@ -488,7 +487,7 @@ if (! function_exists('linkify')) {
         return preg_replace_callback(
             '~<(\d+)>~',
             static function (array $match) use (&$links): string {
-                return $links[$match[1] - 1];
+                return $links[(int) $match[1] - 1];
             },
             (string) $text,
         );
diff --git a/modules/Fediverse/HttpSignature.php b/modules/Fediverse/HttpSignature.php
index b2287cab73..d03990383b 100644
--- a/modules/Fediverse/HttpSignature.php
+++ b/modules/Fediverse/HttpSignature.php
@@ -142,9 +142,10 @@ class HttpSignature
         $strings[] = sprintf(
             '(request-target): %s %s%s',
             $this->request->getMethod(),
-            '/' . $this->request->uri->getPath(),
-            $this->request->uri->getQuery() !== ''
-                ? '?' . $this->request->uri->getQuery()
+            '/' . $this->request->getUri()->getPath(),
+            $this->request->getUri()
+                ->getQuery() !== ''
+                ? '?' . $this->request->getUri()->getQuery()
                 : '',
         );
 
diff --git a/modules/Fediverse/Models/ActivityModel.php b/modules/Fediverse/Models/ActivityModel.php
index ada9b40d47..47341b93d0 100644
--- a/modules/Fediverse/Models/ActivityModel.php
+++ b/modules/Fediverse/Models/ActivityModel.php
@@ -14,7 +14,6 @@ use CodeIgniter\Database\BaseResult;
 use CodeIgniter\I18n\Time;
 use DateTimeInterface;
 use Michalsn\Uuid\UuidModel;
-use Modules\Fediverse\Config\Fediverse;
 use Modules\Fediverse\Entities\Activity;
 
 class ActivityModel extends UuidModel
@@ -35,17 +34,17 @@ class ActivityModel extends UuidModel
     protected $uuidFields = ['id', 'post_id'];
 
     /**
-     * @var string[]
+     * @var list<string>
      */
     protected $afterInsert = ['notify'];
 
     /**
-     * @var string[]
+     * @var list<string>
      */
     protected $afterUpdate = ['notify'];
 
     /**
-     * @var string[]
+     * @var list<string>
      */
     protected $allowedFields = [
         'id',
@@ -78,7 +77,7 @@ class ActivityModel extends UuidModel
     public function getActivityById(string $activityId): ?Activity
     {
         $cacheName =
-            config(Fediverse::class)
+            config('Fediverse')
                 ->cachePrefix . "activity#{$activityId}";
         if (! ($found = cache($cacheName))) {
             $found = $this->find($activityId);
@@ -133,11 +132,12 @@ class ActivityModel extends UuidModel
     }
 
     /**
-     * @param array<string, array<string|int, mixed>> $data
+     * @param array<mixed> $data
      * @return array<string, array<string|int, mixed>>
      */
     protected function notify(array $data): array
     {
+        /** @var ?Activity $activity */
         $activity = (new self())->find(is_array($data['id']) ? $data['id'][0] : $data['id']);
 
         if (! $activity instanceof Activity) {
diff --git a/modules/Fediverse/Models/ActorModel.php b/modules/Fediverse/Models/ActorModel.php
index 53564f6112..28079a629d 100644
--- a/modules/Fediverse/Models/ActorModel.php
+++ b/modules/Fediverse/Models/ActorModel.php
@@ -12,7 +12,6 @@ namespace Modules\Fediverse\Models;
 
 use CodeIgniter\Events\Events;
 use CodeIgniter\Model;
-use Modules\Fediverse\Config\Fediverse;
 use Modules\Fediverse\Entities\Actor;
 
 class ActorModel extends Model
@@ -23,7 +22,7 @@ class ActorModel extends Model
     protected $table = 'fediverse_actors';
 
     /**
-     * @var string[]
+     * @var list<string>
      */
     protected $allowedFields = [
         'id',
@@ -99,7 +98,7 @@ class ActorModel extends Model
     {
         $hashedActorUri = md5($actorUri);
         $cacheName =
-            config(Fediverse::class)
+            config('Fediverse')
                 ->cachePrefix . "actor-{$hashedActorUri}";
         if (! ($found = cache($cacheName))) {
             $found = $this->where('uri', $actorUri)
@@ -118,7 +117,7 @@ class ActorModel extends Model
     public function getFollowers(int $actorId): array
     {
         $cacheName =
-            config(Fediverse::class)
+            config('Fediverse')
                 ->cachePrefix . "actor#{$actorId}_followers";
         if (! ($found = cache($cacheName))) {
             $found = $this->join('fediverse_follows', 'fediverse_follows.actor_id = id', 'inner')
@@ -151,7 +150,7 @@ class ActorModel extends Model
      */
     public function getBlockedActors(): array
     {
-        $cacheName = config(Fediverse::class)
+        $cacheName = config('Fediverse')
             ->cachePrefix . 'blocked_actors';
         if (! ($found = cache($cacheName))) {
             $found = $this->where('is_blocked', 1)
@@ -166,7 +165,7 @@ class ActorModel extends Model
 
     public function blockActor(int $actorId): void
     {
-        $prefix = config(Fediverse::class)
+        $prefix = config('Fediverse')
             ->cachePrefix;
         cache()
             ->delete($prefix . 'blocked_actors');
@@ -182,7 +181,7 @@ class ActorModel extends Model
 
     public function unblockActor(int $actorId): void
     {
-        $prefix = config(Fediverse::class)
+        $prefix = config('Fediverse')
             ->cachePrefix;
         cache()
             ->delete($prefix . 'blocked_actors');
@@ -200,10 +199,11 @@ class ActorModel extends Model
     {
         helper('fediverse');
 
-        $cacheName = config(Fediverse::class)
+        $cacheName = config('Fediverse')
             ->cachePrefix . 'blocked_actors';
         if (! ($found = cache($cacheName))) {
-            $result = $this->select('COUNT(*) as total_local_actors')
+            $result = $this->builder()
+                ->select('COUNT(*) as total_local_actors')
                 ->where('domain', get_current_domain())
                 ->get()
                 ->getResultArray();
@@ -221,15 +221,13 @@ class ActorModel extends Model
     {
         helper('fediverse');
 
-        $cacheName = config(Fediverse::class)
+        $cacheName = config('Fediverse')
             ->cachePrefix . 'blocked_actors';
         if (! ($found = cache($cacheName))) {
-            $tablePrefix = config(Database::class)
+            $tablePrefix = config('Database')
                 ->default['DBPrefix'];
-            $result = $this->select(
-                'COUNT(DISTINCT `' . $tablePrefix . 'fediverse_actors`.`id`) as `total_active_actors`',
-                false
-            )
+            $result = $this->builder()
+                ->select('COUNT(DISTINCT `' . $tablePrefix . 'fediverse_actors`.`id`) as `total_active_actors`', false)
                 ->join(
                     $tablePrefix . 'fediverse_posts',
                     $tablePrefix . 'fediverse_actors.id = ' . $tablePrefix . 'fediverse_posts.actor_id',
@@ -300,7 +298,7 @@ class ActorModel extends Model
 
     public function clearCache(Actor $actor): void
     {
-        $cachePrefix = config(Fediverse::class)
+        $cachePrefix = config('Fediverse')
             ->cachePrefix;
         $hashedActorUri = md5($actor->uri);
         $cacheDomain = str_replace(':', '', $actor->domain);
diff --git a/modules/Fediverse/Models/BlockedDomainModel.php b/modules/Fediverse/Models/BlockedDomainModel.php
index e205224328..e5444126e9 100644
--- a/modules/Fediverse/Models/BlockedDomainModel.php
+++ b/modules/Fediverse/Models/BlockedDomainModel.php
@@ -13,7 +13,6 @@ namespace Modules\Fediverse\Models;
 use CodeIgniter\Database\BaseResult;
 use CodeIgniter\Events\Events;
 use CodeIgniter\Model;
-use Modules\Fediverse\Config\Fediverse;
 use Modules\Fediverse\Entities\BlockedDomain;
 
 class BlockedDomainModel extends Model
@@ -29,7 +28,7 @@ class BlockedDomainModel extends Model
     protected $primaryKey = 'name';
 
     /**
-     * @var string[]
+     * @var list<string>
      */
     protected $allowedFields = ['name'];
 
@@ -57,7 +56,7 @@ class BlockedDomainModel extends Model
      */
     public function getBlockedDomains(): array
     {
-        $cacheName = config(Fediverse::class)
+        $cacheName = config('Fediverse')
             ->cachePrefix . 'blocked_domains';
         if (! ($found = cache($cacheName))) {
             $found = $this->findAll();
@@ -73,7 +72,7 @@ class BlockedDomainModel extends Model
     {
         $hashedDomainName = md5($name);
         $cacheName =
-            config(Fediverse::class)
+            config('Fediverse')
                 ->cachePrefix .
             "domain#{$hashedDomainName}_isBlocked";
         if (! ($found = cache($cacheName))) {
@@ -89,7 +88,7 @@ class BlockedDomainModel extends Model
     public function blockDomain(string $name): int | bool
     {
         $hashedDomain = md5($name);
-        $prefix = config(Fediverse::class)
+        $prefix = config('Fediverse')
             ->cachePrefix;
         cache()
             ->delete($prefix . "domain#{$hashedDomain}_isBlocked");
@@ -121,7 +120,7 @@ class BlockedDomainModel extends Model
     public function unblockDomain(string $name): BaseResult | bool
     {
         $hashedDomain = md5($name);
-        $prefix = config(Fediverse::class)
+        $prefix = config('Fediverse')
             ->cachePrefix;
         cache()
             ->delete($prefix . "domain#{$hashedDomain}_isBlocked");
diff --git a/modules/Fediverse/Models/FavouriteModel.php b/modules/Fediverse/Models/FavouriteModel.php
index bdb20fd890..315fa8e524 100644
--- a/modules/Fediverse/Models/FavouriteModel.php
+++ b/modules/Fediverse/Models/FavouriteModel.php
@@ -31,7 +31,7 @@ class FavouriteModel extends UuidModel
     protected $uuidFields = ['post_id'];
 
     /**
-     * @var string[]
+     * @var list<string>
      */
     protected $allowedFields = ['actor_id', 'post_id'];
 
@@ -57,6 +57,7 @@ class FavouriteModel extends UuidModel
         ]);
 
         model('PostModel', false)
+            ->builder()
             ->where('id', service('uuid') ->fromString($post->id) ->getBytes())
             ->increment('favourites_count');
 
@@ -97,6 +98,7 @@ class FavouriteModel extends UuidModel
         $this->db->transStart();
 
         model('PostModel', false)
+            ->builder()
             ->where('id', service('uuid') ->fromString($post->id) ->getBytes())
             ->decrement('favourites_count');
 
diff --git a/modules/Fediverse/Models/FollowModel.php b/modules/Fediverse/Models/FollowModel.php
index 15595d290d..93c6cf55d7 100644
--- a/modules/Fediverse/Models/FollowModel.php
+++ b/modules/Fediverse/Models/FollowModel.php
@@ -27,7 +27,7 @@ class FollowModel extends Model
     protected $table = 'fediverse_follows';
 
     /**
-     * @var string[]
+     * @var list<string>
      */
     protected $allowedFields = ['actor_id', 'target_actor_id'];
 
@@ -59,6 +59,7 @@ class FollowModel extends Model
 
             // increment followers_count for target actor
             model('ActorModel', false)
+                ->builder()
                 ->where('id', $targetActor->id)
                 ->increment('followers_count');
 
@@ -114,6 +115,7 @@ class FollowModel extends Model
 
         // decrement followers_count for target actor
         model('ActorModel', false)
+            ->builder()
             ->where('id', $targetActor->id)
             ->decrement('followers_count');
 
diff --git a/modules/Fediverse/Models/NotificationModel.php b/modules/Fediverse/Models/NotificationModel.php
index 53d4f0eb18..813313ac24 100644
--- a/modules/Fediverse/Models/NotificationModel.php
+++ b/modules/Fediverse/Models/NotificationModel.php
@@ -41,7 +41,7 @@ class NotificationModel extends UuidModel
     protected $uuidFields = ['post_id', 'activity_id'];
 
     /**
-     * @var string[]
+     * @var list<string>
      */
     protected $allowedFields = [
         'actor_id',
diff --git a/modules/Fediverse/Models/PostModel.php b/modules/Fediverse/Models/PostModel.php
index ac40984421..cec9dcf88e 100644
--- a/modules/Fediverse/Models/PostModel.php
+++ b/modules/Fediverse/Models/PostModel.php
@@ -20,7 +20,6 @@ use Modules\Fediverse\Activities\AnnounceActivity;
 use Modules\Fediverse\Activities\CreateActivity;
 use Modules\Fediverse\Activities\DeleteActivity;
 use Modules\Fediverse\Activities\UndoActivity;
-use Modules\Fediverse\Config\Fediverse;
 use Modules\Fediverse\Entities\Actor;
 use Modules\Fediverse\Entities\Post;
 use Modules\Fediverse\Objects\TombstoneObject;
@@ -43,7 +42,7 @@ class PostModel extends UuidModel
     protected $uuidFields = ['id', 'in_reply_to_id', 'reblog_of_id'];
 
     /**
-     * @var string[]
+     * @var list<string>
      */
     protected $allowedFields = [
         'id',
@@ -85,7 +84,7 @@ class PostModel extends UuidModel
     ];
 
     /**
-     * @var string[]
+     * @var list<string>
      */
     protected $beforeInsert = ['setPostId'];
 
@@ -98,7 +97,7 @@ class PostModel extends UuidModel
     {
         $hashedPostUri = md5($postUri);
         $cacheName =
-            config(Fediverse::class)
+            config('Fediverse')
                 ->cachePrefix . "post-{$hashedPostUri}";
         if (! ($found = cache($cacheName))) {
             $found = $this->where('uri', $postUri)
@@ -119,7 +118,7 @@ class PostModel extends UuidModel
     public function getActorPublishedPosts(int $actorId): array
     {
         $cacheName =
-            config(Fediverse::class)
+            config('Fediverse')
                 ->cachePrefix .
             "actor#{$actorId}_published_posts";
         if (! ($found = cache($cacheName))) {
@@ -146,7 +145,8 @@ class PostModel extends UuidModel
      */
     public function getSecondsToNextUnpublishedPosts(int $actorId): int | false
     {
-        $result = $this->select('TIMESTAMPDIFF(SECOND, UTC_TIMESTAMP(), `published_at`) as timestamp_diff')
+        $result = $this->builder()
+            ->select('TIMESTAMPDIFF(SECOND, UTC_TIMESTAMP(), `published_at`) as timestamp_diff')
             ->where([
                 'actor_id' => $actorId,
             ])
@@ -168,7 +168,7 @@ class PostModel extends UuidModel
     public function getPostReplies(string $postId, bool $withBlocked = false): array
     {
         $cacheName =
-            config(Fediverse::class)
+            config('Fediverse')
                 ->cachePrefix .
             "post#{$postId}_replies" .
             ($withBlocked ? '_withBlocked' : '');
@@ -200,7 +200,7 @@ class PostModel extends UuidModel
     public function getPostReblogs(string $postId): array
     {
         $cacheName =
-            config(Fediverse::class)
+            config('Fediverse')
                 ->cachePrefix . "post#{$postId}_reblogs";
 
         if (! ($found = cache($cacheName))) {
@@ -265,6 +265,7 @@ class PostModel extends UuidModel
         if ($post->in_reply_to_id === null) {
             // post is not a reply
             model('ActorModel', false)
+                ->builder()
                 ->where('id', $post->actor_id)
                 ->increment('posts_count');
 
@@ -277,7 +278,7 @@ class PostModel extends UuidModel
             $post->uri = url_to('post', esc($post->actor->username), $newPostId);
 
             $createActivity = new CreateActivity();
-            $noteObjectClass = config(Fediverse::class)
+            $noteObjectClass = config('Fediverse')
                 ->noteObject;
             $createActivity
                 ->set('actor', $post->actor->uri)
@@ -402,6 +403,7 @@ class PostModel extends UuidModel
 
         if ($post->in_reply_to_id === null && $post->reblog_of_id === null) {
             model('ActorModel', false)
+                ->builder()
                 ->where('id', $post->actor_id)
                 ->decrement('posts_count');
 
@@ -409,6 +411,7 @@ class PostModel extends UuidModel
         } elseif ($post->in_reply_to_id !== null) {
             // Post to remove is a reply
             model('PostModel', false)
+                ->builder()
                 ->where('id', $this->uuid->fromString($post->in_reply_to_id) ->getBytes())
                 ->decrement('replies_count');
 
@@ -439,6 +442,7 @@ class PostModel extends UuidModel
         $postId = $this->addPost($reply, $createPreviewCard, $registerActivity);
 
         model('PostModel', false)
+            ->builder()
             ->where('id', $this->uuid->fromString($reply->in_reply_to_id) ->getBytes())
             ->increment('replies_count');
 
@@ -471,10 +475,12 @@ class PostModel extends UuidModel
         $reblogId = $this->insert($reblog);
 
         model('ActorModel', false)
+            ->builder()
             ->where('id', $actor->id)
             ->increment('posts_count');
 
         model('PostModel', false)
+            ->builder()
             ->where('id', $this->uuid->fromString($post->id)->getBytes())
             ->increment('reblogs_count');
 
@@ -514,10 +520,12 @@ class PostModel extends UuidModel
         $this->db->transStart();
 
         model('ActorModel', false)
+            ->builder()
             ->where('id', $reblogPost->actor_id)
             ->decrement('posts_count');
 
         model('PostModel', false)
+            ->builder()
             ->where('id', $this->uuid->fromString($reblogPost->reblog_of_id) ->getBytes())
             ->decrement('reblogs_count');
 
@@ -592,10 +600,11 @@ class PostModel extends UuidModel
     {
         helper('fediverse');
 
-        $cacheName = config(Fediverse::class)
+        $cacheName = config('Fediverse')
             ->cachePrefix . 'blocked_actors';
         if (! ($found = cache($cacheName))) {
-            $result = $this->select('COUNT(*) as total_local_posts')
+            $result = $this->builder()
+                ->select('COUNT(*) as total_local_posts')
                 ->join('fediverse_actors', 'fediverse_actors.id = fediverse_posts.actor_id')
                 ->where('fediverse_actors.domain', get_current_domain())
                 ->where('`published_at` <= UTC_TIMESTAMP()', null, false)
@@ -629,7 +638,8 @@ class PostModel extends UuidModel
 
     public function resetReblogsCount(): int | false
     {
-        $postsReblogsCount = $this->select('fediverse_posts.id, COUNT(*) as `replies_count`')
+        $postsReblogsCount = $this->builder()
+            ->select('fediverse_posts.id, COUNT(*) as `replies_count`')
             ->join('fediverse_posts as p2', 'fediverse_posts.id = p2.reblog_of_id')
             ->groupBy('fediverse_posts.id')
             ->get()
@@ -645,7 +655,8 @@ class PostModel extends UuidModel
 
     public function resetRepliesCount(): int | false
     {
-        $postsRepliesCount = $this->select('fediverse_posts.id, COUNT(*) as `replies_count`')
+        $postsRepliesCount = $this->builder()
+            ->select('fediverse_posts.id, COUNT(*) as `replies_count`')
             ->join('fediverse_posts as p2', 'fediverse_posts.id = p2.in_reply_to_id')
             ->groupBy('fediverse_posts.id')
             ->get()
@@ -661,7 +672,7 @@ class PostModel extends UuidModel
 
     public function clearCache(Post $post): void
     {
-        $cachePrefix = config(Fediverse::class)
+        $cachePrefix = config('Fediverse')
             ->cachePrefix;
 
         $hashedPostUri = md5($post->uri);
diff --git a/modules/Fediverse/Models/PreviewCardModel.php b/modules/Fediverse/Models/PreviewCardModel.php
index ed333b1cca..917fe215df 100644
--- a/modules/Fediverse/Models/PreviewCardModel.php
+++ b/modules/Fediverse/Models/PreviewCardModel.php
@@ -12,7 +12,6 @@ namespace Modules\Fediverse\Models;
 
 use CodeIgniter\Database\BaseResult;
 use CodeIgniter\Model;
-use Modules\Fediverse\Config\Fediverse;
 use Modules\Fediverse\Entities\PreviewCard;
 
 class PreviewCardModel extends Model
@@ -23,7 +22,7 @@ class PreviewCardModel extends Model
     protected $table = 'fediverse_preview_cards';
 
     /**
-     * @var string[]
+     * @var list<string>
      */
     protected $allowedFields = [
         'id',
@@ -58,7 +57,7 @@ class PreviewCardModel extends Model
     {
         $hashedPreviewCardUrl = md5($url);
         $cacheName =
-            config(Fediverse::class)
+            config('Fediverse')
                 ->cachePrefix .
             "preview_card-{$hashedPreviewCardUrl}";
         if (! ($found = cache($cacheName))) {
@@ -74,7 +73,7 @@ class PreviewCardModel extends Model
     public function getPostPreviewCard(string $postId): ?PreviewCard
     {
         $cacheName =
-            config(Fediverse::class)
+            config('Fediverse')
                 ->cachePrefix . "post#{$postId}_preview_card";
         if (! ($found = cache($cacheName))) {
             $found = $this->join(
@@ -96,7 +95,7 @@ class PreviewCardModel extends Model
     {
         $hashedPreviewCardUrl = md5($url);
         cache()
-            ->delete(config(Fediverse::class) ->cachePrefix . "preview_card-{$hashedPreviewCardUrl}");
+            ->delete(config('Fediverse') ->cachePrefix . "preview_card-{$hashedPreviewCardUrl}");
 
         return $this->delete($id);
     }
diff --git a/modules/Fediverse/WebFinger.php b/modules/Fediverse/WebFinger.php
index 788e0fdf4f..c66886ec72 100644
--- a/modules/Fediverse/WebFinger.php
+++ b/modules/Fediverse/WebFinger.php
@@ -68,7 +68,7 @@ class WebFinger
             throw new Exception('Could not find actor');
         }
 
-        $this->aliases = [$actor->id];
+        $this->aliases = [$actor->uri];
         $this->links = [
             [
                 'rel'  => 'self',
diff --git a/modules/Install/Commands/CreateSuperadmin.php b/modules/Install/Commands/CreateSuperadmin.php
index f260ba3bb3..799b36b867 100644
--- a/modules/Install/Commands/CreateSuperadmin.php
+++ b/modules/Install/Commands/CreateSuperadmin.php
@@ -127,7 +127,6 @@ class CreateSuperadmin extends BaseCommand
             unset($passwordRules[$key]);
         }
 
-        /** @var Auth $config */
         $config = config('Auth');
 
         // Add `min_length`
diff --git a/modules/Install/Config/Routes.php b/modules/Install/Config/Routes.php
index 78012464b1..42aec944c0 100644
--- a/modules/Install/Config/Routes.php
+++ b/modules/Install/Config/Routes.php
@@ -10,7 +10,7 @@ use CodeIgniter\Router\RouteCollection;
 
 // Install Wizard routes
 $routes->group(
-    config(Install::class)
+    config('Install')
         ->gateway,
     [
         'namespace' => 'Modules\Install\Controllers',
diff --git a/modules/Install/Controllers/InstallController.php b/modules/Install/Controllers/InstallController.php
index 0991d11da2..6a967e8c5e 100644
--- a/modules/Install/Controllers/InstallController.php
+++ b/modules/Install/Controllers/InstallController.php
@@ -17,13 +17,12 @@ use CodeIgniter\HTTP\RedirectResponse;
 use CodeIgniter\HTTP\RequestInterface;
 use CodeIgniter\HTTP\ResponseInterface;
 use CodeIgniter\Shield\Entities\User;
-use Config\App;
+use CodeIgniter\Shield\Exceptions\ValidationException as ShieldValidationException;
 use Config\Database;
 use Config\Services;
 use Dotenv\Dotenv;
 use Dotenv\Exception\ValidationException;
 use Modules\Auth\Models\UserModel;
-use Modules\Install\Config\Install;
 use Psr\Log\LoggerInterface;
 use Throwable;
 use ViewThemes\Theme;
@@ -31,7 +30,7 @@ use ViewThemes\Theme;
 class InstallController extends Controller
 {
     /**
-     * @var string[]
+     * @var list<string>
      */
     protected $helpers = ['form', 'components', 'svg', 'misc', 'setting'];
 
@@ -160,7 +159,7 @@ class InstallController extends Controller
 
         if (! $this->validate($rules)) {
             return redirect()
-                ->to((host_url() ?? config(App::class) ->baseURL) . config(Install::class)->gateway)
+                ->to((host_url() ?? config('App') ->baseURL) . config('Install')->gateway)
                 ->withInput()
                 ->with('errors', $this->validator->getErrors());
         }
@@ -180,7 +179,7 @@ class InstallController extends Controller
         helper('text');
 
         // redirect to full install url with new baseUrl input
-        return redirect()->to(reduce_double_slashes($baseUrl . '/' . config(Install::class)->gateway));
+        return redirect()->to(reduce_double_slashes($baseUrl . '/' . config('Install')->gateway));
     }
 
     public function databaseConfig(): string
@@ -308,7 +307,7 @@ class InstallController extends Controller
         $userModel = new UserModel();
         try {
             $userModel->save($user);
-        } catch (ValidationException) {
+        } catch (ShieldValidationException) {
             return redirect()->back()
                 ->withInput()
                 ->with('errors', $userModel->errors());
diff --git a/modules/Media/Config/Services.php b/modules/Media/Config/Services.php
index 9291c80bf5..8b5fd81411 100644
--- a/modules/Media/Config/Services.php
+++ b/modules/Media/Config/Services.php
@@ -6,7 +6,6 @@ namespace Modules\Media\Config;
 
 use CodeIgniter\Config\BaseService;
 use Exception;
-use Modules\Media\Config\Media as MediaConfig;
 use Modules\Media\FileManagers\FileManagerInterface;
 
 /**
@@ -27,7 +26,7 @@ class Services extends BaseService
             return self::getSharedInstance('file_manager');
         }
 
-        $config = config(MediaConfig::class);
+        $config = config('Media');
         $fileManagerClass = $config->fileManagers[$config->fileManager];
 
         $fileManager = new $fileManagerClass($config);
diff --git a/modules/Media/Entities/BaseMedia.php b/modules/Media/Entities/BaseMedia.php
index 5509296c22..f7566ab7fe 100644
--- a/modules/Media/Entities/BaseMedia.php
+++ b/modules/Media/Entities/BaseMedia.php
@@ -36,7 +36,7 @@ class BaseMedia extends Entity
     protected File $file;
 
     /**
-     * @var string[]
+     * @var list<string>
      */
     protected $dates = ['uploaded_at', 'updated_at'];
 
diff --git a/modules/Media/Entities/Chapters.php b/modules/Media/Entities/Chapters.php
index 0d20ab6734..e3f2ef2e4a 100644
--- a/modules/Media/Entities/Chapters.php
+++ b/modules/Media/Entities/Chapters.php
@@ -32,7 +32,11 @@ class Chapters extends BaseMedia
     {
         parent::setFile($file);
 
-        $metadata = lstat((string) $file) ?? [];
+        $metadata = lstat((string) $file);
+
+        if (! $metadata) {
+            $metadata = [];
+        }
 
         helper('filesystem');
 
diff --git a/modules/Media/Entities/Image.php b/modules/Media/Entities/Image.php
index af3814550f..a5c265d9f9 100644
--- a/modules/Media/Entities/Image.php
+++ b/modules/Media/Entities/Image.php
@@ -12,6 +12,7 @@ namespace Modules\Media\Entities;
 
 use CodeIgniter\Files\File;
 use Config\Services;
+use GdImage;
 
 /**
  * @property array $sizes
@@ -137,6 +138,7 @@ class Image extends BaseMedia
                 ->withFile($this->attributes['file']->getRealPath())
                 ->resize($size['width'], $size['height']);
 
+            /** @var GdImage $resizedImageResource */
             $resizedImageResource = $resizedImage->getResource();
 
             // set resolution to 72 by 72 for all sizes
diff --git a/modules/Media/Entities/Transcript.php b/modules/Media/Entities/Transcript.php
index 68d77048bf..56302e213c 100644
--- a/modules/Media/Entities/Transcript.php
+++ b/modules/Media/Entities/Transcript.php
@@ -39,7 +39,11 @@ class Transcript extends BaseMedia
     {
         parent::setFile($file);
 
-        $metadata = lstat((string) $file) ?? [];
+        $metadata = lstat((string) $file);
+
+        if (! $metadata) {
+            $metadata = [];
+        }
 
         helper('filesystem');
 
diff --git a/modules/Media/FileManagers/FS.php b/modules/Media/FileManagers/FS.php
index 081598bab7..dfca7ed03d 100644
--- a/modules/Media/FileManagers/FS.php
+++ b/modules/Media/FileManagers/FS.php
@@ -144,6 +144,6 @@ class FS implements FileManagerInterface
 
         $uri = trim($uri, '/');
 
-        return config(MediaConfig::class)->storage . '/' . config(MediaConfig::class)->root . '/' . $uri;
+        return config('Media')->storage . '/' . config('Media')->root . '/' . $uri;
     }
 }
diff --git a/modules/Media/Helpers/url_helper.php b/modules/Media/Helpers/url_helper.php
index 1e96cc96b2..aba335409e 100644
--- a/modules/Media/Helpers/url_helper.php
+++ b/modules/Media/Helpers/url_helper.php
@@ -3,22 +3,21 @@
 declare(strict_types=1);
 
 use CodeIgniter\HTTP\URI;
-use Modules\Media\Config\Media;
 
 if (! function_exists('media_url')) {
     /**
      * Returns a media URL as defined by the Media config.
      *
-     * @param array|string $relativePath URI string or array of URI segments
+     * @param array<string>|string $relativePath URI string or array of URI segments
      */
-    function media_url($relativePath = '', ?string $scheme = null): string
+    function media_url(array|string $relativePath = '', ?string $scheme = null): string
     {
         // Convert array of segments to a string
         if (is_array($relativePath)) {
             $relativePath = implode('/', $relativePath);
         }
 
-        $uri = new URI(rtrim(config(Media::class)->baseURL, '/') . '/' . ltrim($relativePath));
+        $uri = new URI(rtrim(config('Media')->baseURL, '/') . '/' . ltrim($relativePath));
 
         return URI::createURIString(
             $scheme ?? $uri->getScheme(),
diff --git a/modules/Media/Models/MediaModel.php b/modules/Media/Models/MediaModel.php
index 4b042fd0c4..dda84e4b4d 100644
--- a/modules/Media/Models/MediaModel.php
+++ b/modules/Media/Models/MediaModel.php
@@ -48,7 +48,7 @@ class MediaModel extends Model
     protected $createdField = 'uploaded_at';
 
     /**
-     * @var string[]
+     * @var list<string>
      */
     protected $allowedFields = [
         'id',
@@ -66,12 +66,12 @@ class MediaModel extends Model
     /**
      * clear cache before update if by any chance, the podcast name changes, so will the podcast link
      *
-     * @var string[]
+     * @var list<string>
      */
     protected $beforeUpdate = ['clearCache'];
 
     /**
-     * @var string[]
+     * @var list<string>
      */
     protected $beforeDelete = ['clearCache'];
 
diff --git a/modules/Media/TranscriptParser.php b/modules/Media/TranscriptParser.php
index 06b11465c6..c1828c3b90 100644
--- a/modules/Media/TranscriptParser.php
+++ b/modules/Media/TranscriptParser.php
@@ -156,7 +156,7 @@ class TranscriptParser
                 case VTT_STATE_TEXT:
                     if (trim($line) === '') {
                         $state = VTT_STATE_TIME;
-                        //$subs[] = $sub;
+                        // @phpstan-ignore-next-line
                     } elseif ($subText !== '') {
                         $subText .= PHP_EOL . $line;
                     } else {
diff --git a/modules/MediaClipper/Commands/Generate.php b/modules/MediaClipper/Commands/Generate.php
index 3d625e2834..9ceb082538 100644
--- a/modules/MediaClipper/Commands/Generate.php
+++ b/modules/MediaClipper/Commands/Generate.php
@@ -9,7 +9,6 @@ use CodeIgniter\CLI\BaseCommand;
 use CodeIgniter\Files\File;
 use CodeIgniter\I18n\Time;
 use Exception;
-use Modules\Admin\Config\Admin;
 use Modules\MediaClipper\VideoClipper;
 
 class Generate extends BaseCommand
@@ -25,7 +24,7 @@ class Generate extends BaseCommand
         // get number of running clips to prevent from having too much running in parallel
         // TODO: get the number of running ffmpeg processes directly from the machine?
         $runningVideoClips = (new ClipModel())->getRunningVideoClipsCount();
-        if ($runningVideoClips >= config(Admin::class)->videoClipWorkers) {
+        if ($runningVideoClips >= config('Admin')->videoClipWorkers) {
             return;
         }
 
diff --git a/modules/MediaClipper/VideoClipper.php b/modules/MediaClipper/VideoClipper.php
index 86248a65b2..5f5a129259 100644
--- a/modules/MediaClipper/VideoClipper.php
+++ b/modules/MediaClipper/VideoClipper.php
@@ -15,7 +15,6 @@ use Exception;
 use GdImage;
 use Modules\Media\Entities\Transcript;
 use Modules\Media\FileManagers\FileManagerInterface;
-use Modules\MediaClipper\Config\MediaClipper;
 
 /**
  * TODO: refactor this by splitting process modules into different classes (image generation, subtitles clip, video
@@ -81,9 +80,9 @@ class VideoClipper
     ) {
         $this->duration = $end - $start;
         $this->episodeNumbering = $this->episodeNumbering($this->episode->number, $this->episode->season_number);
-        $this->dimensions = config(MediaClipper::class)
+        $this->dimensions = config('MediaClipper')
             ->formats[$format];
-        $this->colors = config(MediaClipper::class)
+        $this->colors = config('MediaClipper')
             ->themes[$theme];
 
         /** @var FileManagerInterface $fileManager */
@@ -239,7 +238,7 @@ class VideoClipper
             ) . ":text='%{pts\:gmtime\:{$this->start}\:%H\\\\\\\\\\:%M\\\\\\\\\\:%S\}':x={$this->dimensions['timestamp']['x']}:y={$this->dimensions['timestamp']['y']}:fontsize={$this->dimensions['timestamp']['fontsize']}:fontcolor=0x{$this->colors['timestampText']}:box=1:boxcolor=0x{$this->colors['timestampBg']}:boxborderw={$this->dimensions['timestamp']['padding']}[v3]",
             "color=c=0x{$this->colors['progressbar']}:s={$this->dimensions['width']}x{$this->dimensions['progressbar']['height']}[progressbar]",
             "[v3][progressbar]overlay=-w+(w/{$this->duration})*t:0:shortest=1:format=rgb,subtitles={$this->subtitlesClipOutput}:fontsdir=" . config(
-                MediaClipper::class
+                'MediaClipper'
             )->fontsFolder . ":force_style='Fontname=" . self::FONTS['subtitles'] . ",Alignment=5,Fontsize={$this->dimensions['subtitles']['fontsize']},PrimaryColour=&H{$this->colors['subtitles']}&,BorderStyle=1,Outline=0,Shadow=0,MarginL={$this->dimensions['subtitles']['marginL']},MarginR={$this->dimensions['subtitles']['marginR']},MarginV={$this->dimensions['subtitles']['marginV']}'[outv]",
             "[6:v]scale={$this->dimensions['watermark']['width']}:{$this->dimensions['watermark']['height']}[watermark]",
             "color=0x{$this->colors['watermarkBg']}:{$this->dimensions['watermark']['width']}x{$this->dimensions['watermark']['height']}[over]",
@@ -248,7 +247,7 @@ class VideoClipper
             '[watermarked]scale=w=-1:h=-1:out_color_matrix=bt709[outfinal]',
         ];
 
-        $watermark = config(MediaClipper::class)
+        $watermark = config('MediaClipper')
             ->watermark;
 
         $videoClipCmd = [
@@ -403,7 +402,7 @@ class VideoClipper
         );
 
         // Add quotes for subtitles
-        $quotes = imagecreatefrompng(config(MediaClipper::class)->quotesImage);
+        $quotes = imagecreatefrompng(config('MediaClipper')->quotesImage);
 
         if (! $quotes) {
             return false;
@@ -481,7 +480,7 @@ class VideoClipper
 
     private function getFont(string $name): string
     {
-        return config(MediaClipper::class)->fontsFolder . self::FONTS[$name];
+        return config('MediaClipper')->fontsFolder . self::FONTS[$name];
     }
 
     private function generateBackground(int $width, int $height): ?GdImage
diff --git a/modules/Platforms/Config/Routes.php b/modules/Platforms/Config/Routes.php
index d4074cf1b4..3dfd6c6e90 100644
--- a/modules/Platforms/Config/Routes.php
+++ b/modules/Platforms/Config/Routes.php
@@ -5,15 +5,14 @@ declare(strict_types=1);
 namespace Modules\PremiumPodcasts\Config;
 
 use CodeIgniter\Router\RouteCollection;
-use Modules\Admin\Config\Admin;
-
-$routes->addPlaceholder('platformType', '\bpodcasting|\bsocial|\bfunding');
 
 /** @var RouteCollection $routes */
 
+$routes->addPlaceholder('platformType', '\bpodcasting|\bsocial|\bfunding');
+
 // Admin routes for subscriptions
 $routes->group(
-    config(Admin::class)
+    config('Admin')
         ->gateway,
     [
         'namespace' => 'Modules\Platforms\Controllers',
diff --git a/modules/Platforms/Controllers/PlatformController.php b/modules/Platforms/Controllers/PlatformController.php
index a8118a4bff..40a5ccaa9a 100644
--- a/modules/Platforms/Controllers/PlatformController.php
+++ b/modules/Platforms/Controllers/PlatformController.php
@@ -73,7 +73,7 @@ class PlatformController extends BaseController
             as $platformSlug => $podcastPlatform
         ) {
             $podcastPlatformUrl = trim((string) $podcastPlatform['url']);
-            if ($podcastPlatformUrl === null) {
+            if ($podcastPlatformUrl === '') {
                 continue;
             }
 
diff --git a/modules/Platforms/Models/PlatformModel.php b/modules/Platforms/Models/PlatformModel.php
index 75ce5ef165..290a90f813 100644
--- a/modules/Platforms/Models/PlatformModel.php
+++ b/modules/Platforms/Models/PlatformModel.php
@@ -28,7 +28,7 @@ class PlatformModel extends Model
     protected $primaryKey = 'id';
 
     /**
-     * @var string[]
+     * @var list<string>
      */
     protected $allowedFields = ['podcast_id', 'type', 'slug', 'link_url', 'account_id', 'is_visible'];
 
@@ -127,6 +127,8 @@ class PlatformModel extends Model
     }
 
     /**
+     * @param array<array<string, string|int>> $data
+     *
      * @return int|false Number of rows inserted or FALSE on failure
      */
     public function savePlatforms(int $podcastId, string $platformType, array $data): int | false
diff --git a/modules/PodcastImport/Commands/PodcastImport.php b/modules/PodcastImport/Commands/PodcastImport.php
index ffac62d306..3a07724c60 100644
--- a/modules/PodcastImport/Commands/PodcastImport.php
+++ b/modules/PodcastImport/Commands/PodcastImport.php
@@ -19,7 +19,6 @@ use CodeIgniter\Shield\Entities\User;
 use Config\Services;
 use Exception;
 use League\HTMLToMarkdown\HtmlConverter;
-use Modules\Auth\Config\AuthGroups;
 use Modules\Auth\Models\UserModel;
 use Modules\Platforms\Models\PlatformModel;
 use Modules\PodcastImport\Entities\PodcastImportTask;
@@ -266,7 +265,7 @@ class PodcastImport extends BaseCommand
 
         // set current user as podcast admin
         // 1. create new group
-        config(AuthGroups::class)
+        config('AuthGroups')
             ->generatePodcastAuthorizations($podcast->id);
         add_podcast_group($this->user, $podcast->id, 'admin');
 
@@ -332,23 +331,19 @@ class PodcastImport extends BaseCommand
             $personGroup = $person->getAttribute('group');
             $personRole = $person->getAttribute('role');
 
-            $isTaxonomyFound = false;
+            // set default group and role if taxonomy is not found
+            $personGroupSlug = 'cast';
+            $personRoleSlug = 'host';
+
             if (array_key_exists(strtolower((string) $personGroup), ReversedTaxonomy::$taxonomy)) {
                 $personGroup = ReversedTaxonomy::$taxonomy[strtolower((string) $personGroup)];
                 $personGroupSlug = $personGroup['slug'];
 
                 if (array_key_exists(strtolower((string) $personRole), $personGroup['roles'])) {
                     $personRoleSlug = $personGroup['roles'][strtolower((string) $personRole)]['slug'];
-                    $isTaxonomyFound = true;
                 }
             }
 
-            if (! $isTaxonomyFound) {
-                // taxonomy was not found, set default group and role
-                $personGroupSlug = 'cast';
-                $personRoleSlug = 'host';
-            }
-
             $podcastPersonModel = new PersonModel();
             if (! $podcastPersonModel->addPodcastPerson(
                 $this->podcast->id,
@@ -410,7 +405,7 @@ class PodcastImport extends BaseCommand
                     'slug'       => $platformSlug,
                     'link_url'   => $platform->getAttribute($platformType['account_url_key']),
                     'account_id' => $platform->getAttribute($platformType['account_id_key']),
-                    'is_visible' => false,
+                    'is_visible' => 0,
                 ];
             }
 
@@ -556,23 +551,19 @@ class PodcastImport extends BaseCommand
             $personGroup = $person->getAttribute('group');
             $personRole = $person->getAttribute('role');
 
-            $isTaxonomyFound = false;
+            // set default group and role if taxonomy is not found
+            $personGroupSlug = 'cast';
+            $personRoleSlug = 'host';
+
             if (array_key_exists(strtolower((string) $personGroup), ReversedTaxonomy::$taxonomy)) {
                 $personGroup = ReversedTaxonomy::$taxonomy[strtolower((string) $personGroup)];
                 $personGroupSlug = $personGroup['slug'];
 
                 if (array_key_exists(strtolower((string) $personRole), $personGroup['roles'])) {
                     $personRoleSlug = $personGroup['roles'][strtolower((string) $personRole)]['slug'];
-                    $isTaxonomyFound = true;
                 }
             }
 
-            if (! $isTaxonomyFound) {
-                // taxonomy was not found, set default group and role
-                $personGroupSlug = 'cast';
-                $personRoleSlug = 'host';
-            }
-
             $episodePersonModel = new PersonModel();
             if (! $episodePersonModel->addEpisodePerson(
                 $this->podcast->id,
diff --git a/modules/PodcastImport/Config/Routes.php b/modules/PodcastImport/Config/Routes.php
index b99c885fa7..7ba1da89f7 100644
--- a/modules/PodcastImport/Config/Routes.php
+++ b/modules/PodcastImport/Config/Routes.php
@@ -5,13 +5,12 @@ declare(strict_types=1);
 namespace Modules\PodcastImport\Config;
 
 use CodeIgniter\Router\RouteCollection;
-use Modules\Admin\Config\Admin;
 
 /** @var RouteCollection $routes */
 
 // Admin routes for imports
 $routes->group(
-    config(Admin::class)
+    config('Admin')
         ->gateway,
     [
         'namespace' => 'Modules\PodcastImport\Controllers',
diff --git a/modules/PremiumPodcasts/Config/Registrar.php b/modules/PremiumPodcasts/Config/Registrar.php
index 103af97b8c..17d668809e 100644
--- a/modules/PremiumPodcasts/Config/Registrar.php
+++ b/modules/PremiumPodcasts/Config/Registrar.php
@@ -8,6 +8,9 @@ use Modules\PremiumPodcasts\Filters\PodcastUnlockFilter;
 
 class Registrar
 {
+    /**
+     * @return array<string, mixed>
+     */
     public static function Filters(): array
     {
         return [
diff --git a/modules/PremiumPodcasts/Config/Routes.php b/modules/PremiumPodcasts/Config/Routes.php
index 3b98b09b46..e790606732 100644
--- a/modules/PremiumPodcasts/Config/Routes.php
+++ b/modules/PremiumPodcasts/Config/Routes.php
@@ -5,7 +5,6 @@ declare(strict_types=1);
 namespace Modules\PremiumPodcasts\Config;
 
 use CodeIgniter\Router\RouteCollection;
-use Modules\Admin\Config\Admin;
 
 /** @var RouteCollection $routes */
 
@@ -13,7 +12,7 @@ $routes->addPlaceholder('podcastHandle', '[a-zA-Z0-9\_]{1,32}');
 
 // Admin routes for subscriptions
 $routes->group(
-    config(Admin::class)
+    config('Admin')
         ->gateway,
     [
         'namespace' => 'Modules\PremiumPodcasts\Controllers',
diff --git a/modules/PremiumPodcasts/Config/Services.php b/modules/PremiumPodcasts/Config/Services.php
index 5425043198..fb9ec7c0d6 100644
--- a/modules/PremiumPodcasts/Config/Services.php
+++ b/modules/PremiumPodcasts/Config/Services.php
@@ -20,7 +20,7 @@ class Services extends BaseService
 
         $premiumPodcasts = new PremiumPodcasts();
 
-        $subscriptionModel ??= model(SubscriptionModel::class);
+        $subscriptionModel ??= model('SubscriptionModel');
 
         return $premiumPodcasts
             ->setSubscriptionModel($subscriptionModel);
diff --git a/modules/PremiumPodcasts/Entities/Subscription.php b/modules/PremiumPodcasts/Entities/Subscription.php
index efaa9de30c..edca9bd4cb 100644
--- a/modules/PremiumPodcasts/Entities/Subscription.php
+++ b/modules/PremiumPodcasts/Entities/Subscription.php
@@ -38,7 +38,7 @@ class Subscription extends Entity
     protected ?Podcast $podcast = null;
 
     /**
-     * @var string[]
+     * @var list<string>
      */
     protected $dates = ['expires_at', 'created_at', 'updated_at'];
 
diff --git a/modules/PremiumPodcasts/Models/SubscriptionModel.php b/modules/PremiumPodcasts/Models/SubscriptionModel.php
index c095301310..84a3713896 100644
--- a/modules/PremiumPodcasts/Models/SubscriptionModel.php
+++ b/modules/PremiumPodcasts/Models/SubscriptionModel.php
@@ -28,7 +28,7 @@ class SubscriptionModel extends Model
     protected $primaryKey = 'id';
 
     /**
-     * @var string[]
+     * @var list<string>
      */
     protected $allowedFields = [
         'id',
@@ -55,17 +55,17 @@ class SubscriptionModel extends Model
     protected $useTimestamps = true;
 
     /**
-     * @var string[]
+     * @var list<string>
      */
     protected $afterInsert = ['clearCache'];
 
     /**
-     * @var string[]
+     * @var list<string>
      */
     protected $afterUpdate = ['clearCache'];
 
     /**
-     * @var string[]
+     * @var list<string>
      */
     protected $beforeDelete = ['clearCache'];
 
@@ -131,8 +131,13 @@ class SubscriptionModel extends Model
      */
     protected function clearCache(array $data): array
     {
+        /** @var ?Subscription */
         $subscription = (new self())->find(is_array($data['id']) ? $data['id'][0] : $data['id']);
 
+        if (! $subscription instanceof Subscription) {
+            return $data;
+        }
+
         cache()
             ->delete("subscription#{$subscription->id}");
         cache()
diff --git a/modules/WebSub/Commands/Publish.php b/modules/WebSub/Commands/Publish.php
index 58f40fbbc0..1b167865ee 100644
--- a/modules/WebSub/Commands/Publish.php
+++ b/modules/WebSub/Commands/Publish.php
@@ -9,7 +9,6 @@ use App\Models\PodcastModel;
 use CodeIgniter\CLI\BaseCommand;
 use CodeIgniter\HTTP\CURLRequest;
 use Exception;
-use Modules\WebSub\Config\WebSub;
 
 class Publish extends BaseCommand
 {
@@ -56,7 +55,7 @@ class Publish extends BaseCommand
             ],
         ];
 
-        $hubUrls = config(WebSub::class)
+        $hubUrls = config('WebSub')
             ->hubs;
 
         foreach ($podcasts as $podcast) {
@@ -78,7 +77,7 @@ class Publish extends BaseCommand
 
             // set podcast feed as having been pushed onto hubs
             (new PodcastModel())->update($podcast->id, [
-                'is_published_on_hubs' => true,
+                'is_published_on_hubs' => 1,
             ]);
 
             // set newly published episodes as pushed onto hubs
diff --git a/phpstan.neon b/phpstan.neon
index c1e8feeceb..9982f691fe 100644
--- a/phpstan.neon
+++ b/phpstan.neon
@@ -4,6 +4,7 @@ parameters:
     checkGenericClassInNonGenericObjectType: false
     paths:
         - app
+        - modules
         - tests
     bootstrapFiles:
         - vendor/codeigniter4/framework/system/Test/bootstrap.php
@@ -37,12 +38,13 @@ parameters:
             - Modules\Fediverse\Models\
             - Modules\Media\Models\
             - Modules\PremiumPodcasts\Models\
+            - CodeIgniter\Shield\Models\
         additionalServices:
             - CodeIgniter\Settings\Config\Services
             - CodeIgniter\Shield\Config\Services
             - Michalsn\Uuid\Config\Services
-            - Modules\PremiumPodcasts\Config\Services
             - Modules\Media\Config\Services
             - Modules\Platforms\Config\Services
+            - Modules\PremiumPodcasts\Config\Services
     ignoreErrors:
         - '#^Call to an undefined method CodeIgniter\\Cache\\CacheInterface\:\:deleteMatching\(\)#'
diff --git a/tests/modules/Api/Rest/V1/EpisodeTest.php b/tests/modules/Api/Rest/V1/EpisodeTest.php
index e999bd5e78..ff366a4dcb 100644
--- a/tests/modules/Api/Rest/V1/EpisodeTest.php
+++ b/tests/modules/Api/Rest/V1/EpisodeTest.php
@@ -9,7 +9,6 @@ use CodeIgniter\Database\Seeder;
 use CodeIgniter\Test\CIUnitTestCase;
 use CodeIgniter\Test\DatabaseTestTrait;
 use CodeIgniter\Test\FeatureTestTrait;
-use Modules\Api\Rest\V1\Config\RestApi;
 
 class EpisodeTest extends CIUnitTestCase
 {
@@ -56,7 +55,7 @@ class EpisodeTest extends CIUnitTestCase
 
         $this->episode['created_at'] = [];
         $this->episode['updated_at'] = [];
-        $this->apiUrl = config(RestApi::class)
+        $this->apiUrl = config('RestApi')
             ->gateway;
     }
 
diff --git a/tests/modules/Api/Rest/V1/PodcastTest.php b/tests/modules/Api/Rest/V1/PodcastTest.php
index 908fba3c72..a70e55447b 100644
--- a/tests/modules/Api/Rest/V1/PodcastTest.php
+++ b/tests/modules/Api/Rest/V1/PodcastTest.php
@@ -9,7 +9,6 @@ use CodeIgniter\Database\Seeder;
 use CodeIgniter\Test\CIUnitTestCase;
 use CodeIgniter\Test\DatabaseTestTrait;
 use CodeIgniter\Test\FeatureTestTrait;
-use Modules\Api\Rest\V1\Config\RestApi;
 
 class PodcastTest extends CIUnitTestCase
 {
@@ -54,7 +53,7 @@ class PodcastTest extends CIUnitTestCase
         $this->podcast = FakeSinglePodcastApiSeeder::podcast();
         $this->podcast['created_at'] = [];
         $this->podcast['updated_at'] = [];
-        $this->podcastApiUrl = config(RestApi::class)
+        $this->podcastApiUrl = config('RestApi')
             ->gateway;
     }
 
diff --git a/themes/cp_admin/episode/embed.php b/themes/cp_admin/episode/embed.php
index 354de34ce5..58af05b87f 100644
--- a/themes/cp_admin/episode/embed.php
+++ b/themes/cp_admin/episode/embed.php
@@ -1,8 +1,6 @@
 <?php declare(strict_types=1);
 
-use Config\Embed;
-
-$embedHeight = config(Embed::class)->height;
+$embedHeight = config('Embed')->height;
 
 ?>
 
diff --git a/themes/cp_admin/episode/video_clips_new.php b/themes/cp_admin/episode/video_clips_new.php
index 21612991a4..fdcd72b09e 100644
--- a/themes/cp_admin/episode/video_clips_new.php
+++ b/themes/cp_admin/episode/video_clips_new.php
@@ -1,7 +1,5 @@
 <?php declare(strict_types=1);
 
-use Modules\MediaClipper\Config\MediaClipper;
-
 ?>
 
 <?= $this->extend('_layout') ?>
@@ -61,7 +59,7 @@ use Modules\MediaClipper\Config\MediaClipper;
         <fieldset>
             <legend><?= lang('VideoClip.form.theme') ?></legend>
             <div class="grid gap-x-4 gap-y-2 grid-cols-colorButtons">
-                <?php foreach (config(MediaClipper::class)->themes as $themeName => $colors): ?>
+                <?php foreach (config('MediaClipper')->themes as $themeName => $colors): ?>
                     <Forms.ColorRadioButton
                     class="mx-auto"
                     value="<?= esc($themeName) ?>"
diff --git a/themes/cp_admin/import/_queue_table.php b/themes/cp_admin/import/_queue_table.php
index eb8070c1f9..c6ac64eb5e 100644
--- a/themes/cp_admin/import/_queue_table.php
+++ b/themes/cp_admin/import/_queue_table.php
@@ -46,9 +46,12 @@ use Modules\PodcastImport\Entities\TaskStatus;
         [
             'header' => lang('PodcastImport.queue.feed'),
             'cell'   => function (PodcastImportTask $importTask) {
+                $externalLink = icon('external-link-fill', [
+                    'class' => 'ml-1',
+                ]);
                 return <<<HTML
                     <div class="flex flex-col">
-                        <a href="{$importTask->feed_url}" class="flex items-center underline hover:no-underline" target="_blank" rel="noopener noreferrer">{$importTask->feed_url}<?= icon('external-link-fill', ['class' => 'ml-1']) ?></a>
+                        <a href="{$importTask->feed_url}" class="flex items-center underline hover:no-underline" target="_blank" rel="noopener noreferrer">{$importTask->feed_url}{$externalLink}</a>
                         <span class="text-sm text-gray-600">@{$importTask->handle}</span>
                     </div>
                 HTML;
diff --git a/themes/cp_admin/settings/general.php b/themes/cp_admin/settings/general.php
index be6d6110a5..9253a0ed75 100644
--- a/themes/cp_admin/settings/general.php
+++ b/themes/cp_admin/settings/general.php
@@ -1,7 +1,5 @@
 <?php declare(strict_types=1);
 
-use Config\App;
-
 ?>
 
 <?= $this->extend('_layout') ?>
@@ -49,7 +47,7 @@ use Config\App;
             accept=".png,.jpeg,.jpg"
             class="flex-1"
             />
-        <?php if (config(App::class)->siteIcon['ico'] !== service('settings')->get('App.siteIcon')['ico']): ?>
+        <?php if (config('App')->siteIcon['ico'] !== service('settings')->get('App.siteIcon')['ico']): ?>
         <div class="relative ml-2">
             <a href="<?= route_to('settings-instance-delete-icon') ?>" class="absolute p-1 text-red-700 bg-red-100 border-2 rounded-full hover:text-red-900 border-contrast -top-3 -right-3 focus:ring-accent" title="<?= lang('Settings.instance.site_icon_delete') ?>" data-tooltip="top"><?= icon('delete-bin-fill') ?></a>
             <img src="<?= get_site_icon_url('64') ?>" alt="<?= esc(service('settings')->get('App.siteName')) ?> Favicon" class="w-10 h-10 aspect-square" loading="lazy" />
diff --git a/themes/cp_admin/settings/theme.php b/themes/cp_admin/settings/theme.php
index 76f5bf41de..1b0f9ea889 100644
--- a/themes/cp_admin/settings/theme.php
+++ b/themes/cp_admin/settings/theme.php
@@ -1,7 +1,5 @@
 <?php declare(strict_types=1);
 
-use Config\Colors;
-
 ?>
 
 <?= $this->extend('_layout') ?>
@@ -23,7 +21,7 @@ use Config\Colors;
     subtitle="<?= lang('Settings.theme.accent_section_subtitle') ?>">
 
 <div class="grid gap-4 grid-cols-colorButtons">
-    <?php foreach (config(Colors::class)->themes as $themeName => $color): ?>
+    <?php foreach (config('Colors')->themes as $themeName => $color): ?>
         <Forms.ColorRadioButton
         class="theme-<?= $themeName ?> mx-auto"
         value="<?= esc($themeName) ?>"
diff --git a/themes/cp_app/embed.php b/themes/cp_app/embed.php
index cebd723a40..b4ab44805f 100644
--- a/themes/cp_app/embed.php
+++ b/themes/cp_app/embed.php
@@ -45,11 +45,13 @@
                 style="--vm-player-box-shadow:0; --vm-player-theme: hsl(var(--color-accent-base)); --vm-control-focus-color: hsl(var(--color-accent-contrast)); --vm-control-spacing: 4px; --vm-menu-item-focus-bg: hsl(var(--color-background-highlight)); --vm-control-icon-size: 24px; <?= str_ends_with($theme, 'transparent') ? '--vm-controls-bg: transparent;' : '' ?>"
             >
             <vm-audio preload="none">
-                <?php $source = auth()->loggedIn() ? $episode->audio_url : $episode->audio_url .
-                    (isset($_SERVER['HTTP_REFERER'])
-                        ? '?_from=' .
-                            parse_url($_SERVER['HTTP_REFERER'], PHP_URL_HOST)
-                        : '') ?>
+                <?php
+                $superglobals = service('superglobals');
+            $source = auth()->loggedIn() ? $episode->audio_url : $episode->audio_url .
+                ($superglobals->server('HTTP_REFERER') === null
+                    ? '?_from=' .
+                        parse_url($superglobals->server('HTTP_REFERER'), PHP_URL_HOST)
+                    : '') ?>
                 <source src="<?= $source ?>" type="<?= $episode->audio->file_mimetype ?>" />
             </vm-audio>
             <vm-ui>
diff --git a/themes/cp_auth/email_2fa_show.php b/themes/cp_auth/email_2fa_show.php
index 5bbd581c62..df363d4f1c 100644
--- a/themes/cp_auth/email_2fa_show.php
+++ b/themes/cp_auth/email_2fa_show.php
@@ -1,11 +1,9 @@
 <?php declare(strict_types=1);
 
-use Modules\Auth\Config\Auth;
-
 ?>
 
 <?= helper('form') ?>
-<?= $this->extend(config(Auth::class)->views['layout']) ?>
+<?= $this->extend(config('Auth')->views['layout']) ?>
 
 <?= $this->section('title') ?><?= lang('Auth.email2FATitle') ?> <?= $this->endSection() ?>
 
diff --git a/themes/cp_auth/email_2fa_verify.php b/themes/cp_auth/email_2fa_verify.php
index 2e9b0a26bd..02b3b24820 100644
--- a/themes/cp_auth/email_2fa_verify.php
+++ b/themes/cp_auth/email_2fa_verify.php
@@ -1,10 +1,8 @@
 <?php declare(strict_types=1);
 
-use Modules\Auth\Config\Auth;
-
 ?>
 <?= helper('form') ?>
-<?= $this->extend(config(Auth::class)->views['layout']) ?>
+<?= $this->extend(config('Auth')->views['layout']) ?>
 
 <?= $this->section('title') ?><?= lang('Auth.emailEnterCode') ?> <?= $this->endSection() ?>
 
diff --git a/themes/cp_auth/email_activate_show.php b/themes/cp_auth/email_activate_show.php
index 562b1e5cc1..cc19a4a5f6 100644
--- a/themes/cp_auth/email_activate_show.php
+++ b/themes/cp_auth/email_activate_show.php
@@ -1,10 +1,8 @@
 <?php declare(strict_types=1);
 
-use Modules\Auth\Config\Auth;
-
 ?>
 <?= helper('form') ?>
-<?= $this->extend(config(Auth::class)->views['layout']) ?>
+<?= $this->extend(config('Auth')->views['layout']) ?>
 
 <?= $this->section('title') ?><?= lang('Auth.emailActivateTitle') ?><?= $this->endSection() ?>
 
diff --git a/themes/cp_auth/login.php b/themes/cp_auth/login.php
index f2b9881bb0..11008c9721 100644
--- a/themes/cp_auth/login.php
+++ b/themes/cp_auth/login.php
@@ -1,10 +1,8 @@
 <?php declare(strict_types=1);
 
-use Modules\Auth\Config\Auth;
-
 ?>
 <?= helper('form') ?>
-<?= $this->extend(config(Auth::class)->views['layout']) ?>
+<?= $this->extend(config('Auth')->views['layout']) ?>
 
 <?= $this->section('title') ?><?= lang('Auth.login') ?><?= $this->endSection() ?>
 
diff --git a/themes/cp_auth/magic_link_form.php b/themes/cp_auth/magic_link_form.php
index 5c36288cb9..941b457113 100644
--- a/themes/cp_auth/magic_link_form.php
+++ b/themes/cp_auth/magic_link_form.php
@@ -1,10 +1,8 @@
 <?php declare(strict_types=1);
 
-use Modules\Auth\Config\Auth;
-
 ?>
 <?= helper('form') ?>
-<?= $this->extend(config(Auth::class)->views['layout']) ?>
+<?= $this->extend(config('Auth')->views['layout']) ?>
 
 <?= $this->section('title') ?><?= lang('Auth.useMagicLink') ?> <?= $this->endSection() ?>
 
diff --git a/themes/cp_auth/magic_link_message.php b/themes/cp_auth/magic_link_message.php
index af85d82102..2e40613387 100644
--- a/themes/cp_auth/magic_link_message.php
+++ b/themes/cp_auth/magic_link_message.php
@@ -1,9 +1,7 @@
 <?php declare(strict_types=1);
 
-use Modules\Auth\Config\Auth;
-
 ?>
-<?= $this->extend(config(Auth::class)->views['layout']) ?>
+<?= $this->extend(config('Auth')->views['layout']) ?>
 
 <?= $this->section('title') ?><?= lang('Auth.useMagicLink') ?> <?= $this->endSection() ?>
 
diff --git a/themes/cp_auth/magic_link_set_password.php b/themes/cp_auth/magic_link_set_password.php
index 9d376f8af6..2a3825268d 100644
--- a/themes/cp_auth/magic_link_set_password.php
+++ b/themes/cp_auth/magic_link_set_password.php
@@ -1,10 +1,8 @@
 <?php declare(strict_types=1);
 
-use Modules\Auth\Config\Auth;
-
 ?>
 <?= helper('form') ?>
-<?= $this->extend(config(Auth::class)->views['layout']) ?>
+<?= $this->extend(config('Auth')->views['layout']) ?>
 
 <?= $this->section('title') ?>
 	<?= lang('Auth.set_password') ?>
diff --git a/themes/cp_auth/register.php b/themes/cp_auth/register.php
index e82ac65161..3e1efa6527 100644
--- a/themes/cp_auth/register.php
+++ b/themes/cp_auth/register.php
@@ -1,10 +1,8 @@
 <?php declare(strict_types=1);
 
-use Modules\Auth\Config\Auth;
-
 ?>
 <?= helper('form') ?>
-<?= $this->extend(config(Auth::class)->views['layout']) ?>
+<?= $this->extend(config('Auth')->views['layout']) ?>
 
 <?= $this->section('title') ?>
 	<?= lang('Auth.register') ?>
diff --git a/themes/cp_install/database_config.php b/themes/cp_install/database_config.php
index dbee492a48..154122c98e 100644
--- a/themes/cp_install/database_config.php
+++ b/themes/cp_install/database_config.php
@@ -1,7 +1,5 @@
 <?php declare(strict_types=1);
 
-use Config\Database;
-
 ?>
 <?= $this->extend('_layout') ?>
 
@@ -26,27 +24,27 @@ use Config\Database;
 <Forms.Field
     name="db_hostname"
     label="<?= esc(lang('Install.form.db_hostname')) ?>"
-    value="<?= config(Database::class)->default['hostname'] ?>"
+    value="<?= config('Database')->default['hostname'] ?>"
     required="true"
 />
 
 <Forms.Field
     name="db_name"
     label="<?= esc(lang('Install.form.db_name')) ?>"
-    value="<?= config(Database::class)->default['database'] ?>"
+    value="<?= config('Database')->default['database'] ?>"
     required="true" />
 
 <Forms.Field
     name="db_username"
     label="<?= esc(lang('Install.form.db_username')) ?>"
-    value="<?= config(Database::class)->default['username'] ?>"
+    value="<?= config('Database')->default['username'] ?>"
     required="true"
     autocomplete="off" />
 
 <Forms.Field
     name="db_password"
     label="<?= esc(lang('Install.form.db_password')) ?>"
-    value="<?= config(Database::class)->default['password'] ?>"
+    value="<?= config('Database')->default['password'] ?>"
     type="password"
     required="true"
     autocomplete="off" />
@@ -55,7 +53,7 @@ use Config\Database;
     name="db_prefix"
     label="<?= esc(lang('Install.form.db_prefix')) ?>"
     hint="<?= esc(lang('Install.form.db_prefix_hint')) ?>"
-    value="<?= config(Database::class)->default['DBPrefix'] ?>" />
+    value="<?= config('Database')->default['DBPrefix'] ?>" />
 <?php // @icon('arrow-right-fill')?>
 <Button variant="primary" type="submit" class="self-end" iconRight="arrow-right-fill"><?= lang('Install.form.next') ?></Button>
 
diff --git a/themes/cp_install/instance_config.php b/themes/cp_install/instance_config.php
index 042ca9b57e..f2acedfc4b 100644
--- a/themes/cp_install/instance_config.php
+++ b/themes/cp_install/instance_config.php
@@ -1,16 +1,11 @@
 <?php declare(strict_types=1);
 
-use Config\App;
-use Modules\Admin\Config\Admin;
-use Modules\Auth\Config\Auth;
-use Modules\Install\Config\Install;
-
 ?>
 <?= $this->extend('_layout') ?>
 
 <?= $this->section('content') ?>
 
-<form action="<?= '/' . config(Install::class)->gateway . '/instance-config' ?>" class="flex flex-col w-full max-w-sm gap-y-4" method="post" accept-charset="utf-8">
+<form action="<?= '/' . config('Install')->gateway . '/instance-config' ?>" class="flex flex-col w-full max-w-sm gap-y-4" method="post" accept-charset="utf-8">
 <?= csrf_field() ?>
 
 <div class="flex items-center mb-2">
@@ -21,7 +16,7 @@ use Modules\Install\Config\Install;
 <Forms.Field
     name="hostname"
     label="<?= esc(lang('Install.form.hostname')) ?>"
-    value="<?= host_url() === null ? config(App::class)->baseURL : host_url() ?>"
+    value="<?= host_url() === null ? config('App')->baseURL : host_url() ?>"
     required="true" />
 
 <Forms.Field
@@ -33,14 +28,14 @@ use Modules\Install\Config\Install;
     name="admin_gateway"
     label="<?= esc(lang('Install.form.admin_gateway')) ?>"
     hint="<?= esc(lang('Install.form.admin_gateway_hint')) ?>"
-    value="<?= config(Admin::class)->gateway ?>"
+    value="<?= config('Admin')->gateway ?>"
     required="true" />
 
 <Forms.Field
     name="auth_gateway"
     label="<?= esc(lang('Install.form.auth_gateway')) ?>"
     hint="<?= esc(lang('Install.form.auth_gateway_hint')) ?>"
-    value="<?= config(Auth::class)->gateway ?>"
+    value="<?= config('Auth')->gateway ?>"
     required="true" />
 <?php // @icon('arrow-right-fill')?>
 <Button class="self-end" variant="primary" type="submit" iconRight="arrow-right-fill"><?= lang('Install.form.next') ?></Button>
-- 
GitLab