diff --git a/app/Config/App.php b/app/Config/App.php
index fdfb92fb5c1422db7784d4ad049d4d70a7790229..82e27e3918f888d6c45d549c2775caebd1ff51ce 100644
--- a/app/Config/App.php
+++ b/app/Config/App.php
@@ -34,7 +34,7 @@ class App extends BaseConfig
      *
      *    http://cdn.example.com/
      */
-    public string $mediaBaseURL = 'http://127.0.0.2:8080/';
+    public string $mediaBaseURL = 'http://localhost:8080/';
 
     /**
      * --------------------------------------------------------------------------
@@ -216,87 +216,6 @@ class App extends BaseConfig
      */
     public bool $sessionRegenerateDestroy = false;
 
-    /**
-     * --------------------------------------------------------------------------
-     * Cookie Prefix
-     * --------------------------------------------------------------------------
-     *
-     * Set a cookie name prefix if you need to avoid collisions.
-     *
-     * @deprecated use Config\Cookie::$prefix property instead.
-     */
-    public string $cookiePrefix = '';
-
-    /**
-     * --------------------------------------------------------------------------
-     * Cookie Domain
-     * --------------------------------------------------------------------------
-     *
-     * Set to `.your-domain.com` for site-wide cookies.
-     *
-     * @deprecated use Config\Cookie::$domain property instead.
-     */
-    public string $cookieDomain = '';
-
-    /**
-     * --------------------------------------------------------------------------
-     * Cookie Path
-     * --------------------------------------------------------------------------
-     *
-     * Typically will be a forward slash.
-     *
-     * @deprecated use Config\Cookie::$path property instead.
-     */
-    public string $cookiePath = '/';
-
-    /**
-     * --------------------------------------------------------------------------
-     * Cookie Secure
-     * --------------------------------------------------------------------------
-     *
-     * Cookie will only be set if a secure HTTPS connection exists.
-     *
-     * @deprecated use Config\Cookie::$secure property instead.
-     */
-    public bool $cookieSecure = false;
-
-    /**
-     * --------------------------------------------------------------------------
-     * Cookie HttpOnly
-     * --------------------------------------------------------------------------
-     *
-     * Cookie will only be accessible via HTTP(S) (no JavaScript).
-     *
-     * @var boolean
-     *
-     * @deprecated use Config\Cookie::$httponly property instead.
-     */
-    public bool $cookieHTTPOnly = true;
-
-    /**
-     * --------------------------------------------------------------------------
-     * Cookie SameSite
-     * --------------------------------------------------------------------------
-     *
-     * Configure cookie SameSite setting. Allowed values are:
-     * - None
-     * - Lax
-     * - Strict
-     * - ''
-     *
-     * Alternatively, you can use the constant names:
-     * - `Cookie::SAMESITE_NONE`
-     * - `Cookie::SAMESITE_LAX`
-     * - `Cookie::SAMESITE_STRICT`
-     *
-     * Defaults to `Lax` for compatibility with modern browsers. Setting `''`
-     * (empty string) means default SameSite attribute set by browsers (`Lax`)
-     * will be set on cookies. If set to `None`, `$cookieSecure` must also be set.
-     *
-     * @deprecated use Config\Cookie::$samesite property instead.
-     */
-    public string $cookieSameSite = 'Lax';
-
     /**
      * --------------------------------------------------------------------------
      * Reverse Proxy IPs
@@ -317,91 +236,6 @@ class App extends BaseConfig
      */
     public string | array $proxyIPs = '';
 
-    /**
-     * --------------------------------------------------------------------------
-     * CSRF Token Name
-     * --------------------------------------------------------------------------
-     *
-     * The token name.
-     *
-     * @deprecated Use `Config\Security` $tokenName property instead of using this property.
-     */
-    public string $CSRFTokenName = 'csrf_test_name';
-
-    /**
-     * --------------------------------------------------------------------------
-     * CSRF Header Name
-     * --------------------------------------------------------------------------
-     *
-     * The header name.
-     *
-     * @deprecated Use `Config\Security` $headerName property instead of using this property.
-     */
-    public string $CSRFHeaderName = 'X-CSRF-TOKEN';
-
-    /**
-     * --------------------------------------------------------------------------
-     * CSRF Cookie Name
-     * --------------------------------------------------------------------------
-     *
-     * The cookie name.
-     *
-     * @deprecated Use `Config\Security` $cookieName property instead of using this property.
-     */
-    public string $CSRFCookieName = 'csrf_cookie_name';
-
-    /**
-     * --------------------------------------------------------------------------
-     * CSRF Expire
-     * --------------------------------------------------------------------------
-     *
-     * The number in seconds the token should expire.
-     *
-     * @deprecated Use `Config\Security` $expire property instead of using this property.
-     */
-    public int $CSRFExpire = 7200;
-
-    /**
-     * --------------------------------------------------------------------------
-     * CSRF Regenerate
-     * --------------------------------------------------------------------------
-     *
-     * Regenerate token on every submission?
-     *
-     * @deprecated Use `Config\Security` $regenerate property instead of using this property.
-     */
-    public bool $CSRFRegenerate = true;
-
-    /**
-     * --------------------------------------------------------------------------
-     * CSRF Redirect
-     * --------------------------------------------------------------------------
-     *
-     * Redirect to previous page with error on failure?
-     *
-     * @deprecated Use `Config\Security` $redirect property instead of using this property.
-     */
-    public bool $CSRFRedirect = true;
-
-    /**
-     * --------------------------------------------------------------------------
-     * CSRF SameSite
-     * --------------------------------------------------------------------------
-     *
-     * Setting for CSRF SameSite cookie token. Allowed values are:
-     * - None
-     * - Lax
-     * - Strict
-     * - ''
-     *
-     * Defaults to `Lax` as recommended in this link:
-     *
-     * @see https://portswigger.net/web-security/csrf/samesite-cookies
-     *
-     * @deprecated Use `Config\Security` $samesite property instead of using this property.
-     */
-    public string $CSRFSameSite = 'Lax';
-
     /**
      * --------------------------------------------------------------------------
      * Content Security Policy
diff --git a/app/Config/Autoload.php b/app/Config/Autoload.php
index 209af318968fefc3fb45cadb886f804c77bc0fa7..b74370e82b44306438ded6ebfa54738a6237713f 100644
--- a/app/Config/Autoload.php
+++ b/app/Config/Autoload.php
@@ -65,4 +65,22 @@ class Autoload extends AutoloadConfig
      * @var array<string, string>
      */
     public $classmap = [];
+
+    /**
+     * -------------------------------------------------------------------
+     * Files
+     * -------------------------------------------------------------------
+     * The files array provides a list of paths to __non-class__ files
+     * that will be autoloaded. This can be useful for bootstrap operations
+     * or for loading functions.
+     *
+     * Prototype:
+     * ```
+     *	  $files = [
+     *	 	   '/path/to/my/file.php',
+     *    ];
+     * ```
+     * @var array<int, string>
+     */
+    public $files = [];
 }
diff --git a/app/Config/ContentSecurityPolicy.php b/app/Config/ContentSecurityPolicy.php
index c4d17653121a8d048f430155dbf207eaf2d07cdc..ae5374e255147ab218d816d48730fc75d75aa125 100644
--- a/app/Config/ContentSecurityPolicy.php
+++ b/app/Config/ContentSecurityPolicy.php
@@ -35,7 +35,7 @@ class ContentSecurityPolicy extends BaseConfig
      *
      * @var string|string[]|null
      */
-    public string | array | null $defaultSrc;
+    public string | array | null $defaultSrc = null;
 
     /**
      * Lists allowed scripts' URLs.
@@ -65,7 +65,7 @@ class ContentSecurityPolicy extends BaseConfig
      *
      * @var string|string[]|null
      */
-    public string | array | null $baseURI;
+    public string | array | null $baseURI = null;
 
     /**
      * Lists the URLs for workers and embedded frame contents
@@ -102,14 +102,21 @@ class ContentSecurityPolicy extends BaseConfig
      *
      * @var string|string[]|null
      */
-    public string | array | null $frameAncestors;
+    public string | array | null $frameAncestors = null;
+
+    /**
+     * The frame-src directive restricts the URLs which may be loaded into nested browsing contexts.
+     *
+     * @var string[]|string|null
+     */
+    public string | array | null $frameSrc = null;
 
     /**
      * Restricts the origins allowed to deliver video and audio.
      *
      * @var string|string[]|null
      */
-    public string | array | null $mediaSrc;
+    public string | array | null $mediaSrc = null;
 
     /**
      * Allows control over Flash and other plugins.
@@ -121,19 +128,19 @@ class ContentSecurityPolicy extends BaseConfig
     /**
      * @var string|string[]|null
      */
-    public string | array | null $manifestSrc;
+    public string | array | null $manifestSrc = null;
 
     /**
      * Limits the kinds of plugins a page may invoke.
      *
      * @var string|string[]|null
      */
-    public string | array | null $pluginTypes;
+    public string | array | null $pluginTypes = null;
 
     /**
      * List of actions allowed.
      *
      * @var string|string[]|null
      */
-    public string | array | null $sandbox;
+    public string | array | null $sandbox = null;
 }
diff --git a/app/Config/Events.php b/app/Config/Events.php
index 47224b1ec09f3533384a2e02ca96b0bc65475d53..59cc1e6c3b2301104b6618d0e612cf7812435b0a 100644
--- a/app/Config/Events.php
+++ b/app/Config/Events.php
@@ -49,7 +49,7 @@ Events::on('pre_system', function () {
      *
      * @phpstan-ignore-next-line
      */
-    if (CI_DEBUG) {
+    if (CI_DEBUG && ! is_cli()) {
         Events::on('DBQuery', 'CodeIgniter\Debug\Toolbar\Collectors\Database::collect',);
         Services::toolbar()->respond();
     }
diff --git a/app/Config/Exceptions.php b/app/Config/Exceptions.php
index b11e9b3f5935b5924d8fdb24f50e535744ae57f9..f264eee9bb9a3871d18240b0cf80a25fd264085a 100644
--- a/app/Config/Exceptions.php
+++ b/app/Config/Exceptions.php
@@ -41,4 +41,16 @@ class Exceptions extends BaseConfig
      * Default: APPPATH.'Views/errors'
      */
     public string $errorViewPath = APPPATH . 'Views/errors';
+
+    /**
+     * --------------------------------------------------------------------------
+     * HIDE FROM DEBUG TRACE
+     * --------------------------------------------------------------------------
+     * Any data that you would like to hide from the debug trace.
+     * In order to specify 2 levels, use "/" to separate.
+     * ex. ['server', 'setup/password', 'secret_token']
+     *
+     * @var string[]
+     */
+    public array $sensitiveDataInTrace = [];
 }
diff --git a/app/Config/Mimes.php b/app/Config/Mimes.php
index 2229f03920c5638b547b58460b708769efce3e81..759ccac63f84ced843b5b9d73244cef10e2b8a76 100644
--- a/app/Config/Mimes.php
+++ b/app/Config/Mimes.php
@@ -207,6 +207,8 @@ class Mimes
             'application/msword',
             'application/x-zip',
         ],
+        'xlsb' => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12',
+        'xlsm' => 'application/vnd.ms-excel.sheet.macroEnabled.12',
         'word' => ['application/msword', 'application/octet-stream'],
         'xl' => 'application/excel',
         'eml' => 'message/rfc822',
@@ -311,32 +313,26 @@ class Mimes
 
         $proposedExtension = trim(strtolower($proposedExtension));
 
-        if ($proposedExtension === '') {
+        if ($proposedExtension !== '') {
+            if (array_key_exists($proposedExtension, static::$mimes) && in_array(
+                $type,
+                is_string(static::$mimes[$proposedExtension]) ? [
+                    static::$mimes[$proposedExtension],
+                ] : static::$mimes[$proposedExtension],
+                true
+            )) {
+                // The detected mime type matches with the proposed extension.
+                return $proposedExtension;
+            }
+
             // An extension was proposed, but the media type does not match the mime type list.
             return null;
         }
 
-        if (
-            array_key_exists($proposedExtension, static::$mimes) &&
-            in_array(
-                $type,
-                is_string(static::$mimes[$proposedExtension])
-                    ? [static::$mimes[$proposedExtension]]
-                    : static::$mimes[$proposedExtension],
-                true,
-            )
-        ) {
-            // The detected mime type matches with the proposed extension.
-            return $proposedExtension;
-        }
-
         // Reverse check the mime type list if no extension was proposed.
         // This search is order sensitive!
         foreach (static::$mimes as $ext => $types) {
-            if (
-                (is_string($types) && $types === $type) ||
-                (is_array($types) && in_array($type, $types, true))
-            ) {
+            if ((is_string($types) && $types === $type) || (is_array($types) && in_array($type, $types, true))) {
                 return $ext;
             }
         }
diff --git a/app/Config/Modules.php b/app/Config/Modules.php
index c87ce571585efbb466f796b8e84bb38dc08b4a6a..5fe2b53a27eb327eabbbd3aa620fcaa6e98f54e1 100644
--- a/app/Config/Modules.php
+++ b/app/Config/Modules.php
@@ -12,7 +12,7 @@ class Modules extends BaseModules
      * --------------------------------------------------------------------------
      *
      * If true, then auto-discovery will happen across all elements listed in
-     * $activeExplorers below. If false, no auto-discovery will happen at all,
+     * $aliases below. If false, no auto-discovery will happen at all,
      * giving a slight performance boost.
      *
      * @var boolean
diff --git a/app/Config/Security.php b/app/Config/Security.php
index c5b533f77690818048aa1c9388a9ca3796840809..d0f31414b1951a69ed9e1a48b089f6ca0d4f7131 100644
--- a/app/Config/Security.php
+++ b/app/Config/Security.php
@@ -61,20 +61,4 @@ class Security extends BaseConfig
      * Redirect to previous page with error on failure.
      */
     public bool $redirect = true;
-
-    /**
-     * --------------------------------------------------------------------------
-     * CSRF SameSite
-     * --------------------------------------------------------------------------
-     *
-     * Setting for CSRF SameSite cookie token.
-     *
-     * Allowed values are: None - Lax - Strict - ''.
-     *
-     * Defaults to `Lax` as recommended in this link:
-     * @see https://portswigger.net/web-security/csrf/samesite-cookies
-     *
-     * @var string 'Lax'|'None'|'Strict'
-     */
-    public string $samesite = 'Lax';
 }
diff --git a/app/Views/errors/html/debug.css b/app/Views/errors/html/debug.css
index ec6dc81fea0fd31dff3122e3e0d5fa27f6803005..2ef4358315a9b90f030f226e3babea73e0cb3150 100644
--- a/app/Views/errors/html/debug.css
+++ b/app/Views/errors/html/debug.css
@@ -1,8 +1,19 @@
+:root {
+  --main-bg-color: #fff;
+  --main-text-color: #555;
+  --dark-text-color: #222;
+  --light-text-color: #c7c7c7;
+  --brand-primary-color: #e06e3f;
+  --light-bg-color: #ededee;
+  --dark-bg-color: #404040;
+}
+
 body {
   height: 100%;
-  background: #fafafa;
-  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
-  color: #777;
+  background: var(--main-bg-color);
+  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial,
+    sans-serif, "Apple Color Emoji", "Segoe UI Emoji";
+  color: var(--main-text-color);
   font-weight: 300;
   margin: 0;
   padding: 0;
@@ -11,7 +22,7 @@ h1 {
   font-weight: lighter;
   letter-spacing: 0.8;
   font-size: 3rem;
-  color: #222;
+  color: var(--dark-text-color);
   margin: 0;
 }
 h1.headline {
@@ -30,11 +41,15 @@ p.lead {
   padding: 1rem;
 }
 .header {
-  background: #85271f;
-  color: #fff;
+  background: var(--light-bg-color);
+  color: var(--dark-text-color);
+}
+.header .container {
+  padding: 1rem 1.75rem 1.75rem 1.75rem;
 }
 .header h1 {
-  color: #fff;
+  font-size: 2.5rem;
+  font-weight: 500;
 }
 .header p {
   font-size: 1.2rem;
@@ -42,7 +57,7 @@ p.lead {
   line-height: 2.5;
 }
 .header a {
-  color: rgba(255, 255, 255, 0.5);
+  color: var(--brand-primary-color);
   margin-left: 2rem;
   display: none;
   text-decoration: none;
@@ -51,6 +66,10 @@ p.lead {
   display: inline;
 }
 
+.footer {
+  background: var(--dark-bg-color);
+  color: var(--light-text-color);
+}
 .footer .container {
   border-top: 1px solid #e7e7e7;
   margin-top: 1rem;
@@ -58,11 +77,12 @@ p.lead {
 }
 
 .source {
-  background: #333;
-  color: #c7c7c7;
+  background: #343434;
+  color: var(--light-text-color);
   padding: 0.5em 1em;
   border-radius: 5px;
   font-family: Menlo, Monaco, Consolas, "Courier New", monospace;
+  font-size: 0.85rem;
   margin: 0;
   overflow-x: scroll;
 }
@@ -74,8 +94,8 @@ p.lead {
 }
 .source .line .highlight {
   display: block;
-  background: #555;
-  color: #fff;
+  background: var(--dark-text-color);
+  color: var(--light-text-color);
 }
 .source span.highlight .number {
   color: #fff;
@@ -96,24 +116,25 @@ p.lead {
   padding: 0rem 1rem;
   line-height: 2.7;
   text-decoration: none;
-  color: #a7a7a7;
-  background: #f1f1f1;
-  border: 1px solid #e7e7e7;
+  color: var(--dark-text-color);
+  background: var(--light-bg-color);
+  border: 1px solid rgba(0, 0, 0, 0.15);
   border-bottom: 0;
   border-top-left-radius: 5px;
   border-top-right-radius: 5px;
   display: inline-block;
 }
 .tabs a:hover {
-  background: #e7e7e7;
-  border-color: #e1e1e1;
+  background: var(--light-bg-color);
+  border-color: rgba(0, 0, 0, 0.15);
 }
 .tabs a.active {
-  background: #fff;
+  background: var(--main-bg-color);
+  color: var(--main-text-color);
 }
 .tab-content {
-  background: #fff;
-  border: 1px solid #efefef;
+  background: var(--main-bg-color);
+  border: 1px solid rgba(0, 0, 0, 0.15);
 }
 .content {
   padding: 1rem;
@@ -167,7 +188,7 @@ td pre {
   font-weight: bold;
 }
 .trace td {
-  background: #e7e7e7;
+  background: var(--light-bg-color);
   padding: 0 1rem;
 }
 .trace td pre {
diff --git a/app/Views/errors/html/error_exception.php b/app/Views/errors/html/error_exception.php
index 815f79904576e43b13ed1ef5ad18ed0e8a88206e..845953b1b63772aa94011b1b80aef87e440b7a04 100644
--- a/app/Views/errors/html/error_exception.php
+++ b/app/Views/errors/html/error_exception.php
@@ -1,10 +1,9 @@
 <?php
 
-use Config\Services;
 use CodeIgniter\CodeIgniter;
+use Config\Services;
 
-$errorId = uniqid('error', true);
-?>
+$errorId = uniqid('error', true); ?>
 <!doctype html>
 <html>
 
@@ -14,11 +13,7 @@ $errorId = uniqid('error', true);
 
 	<title><?= esc($title) ?></title>
 	<style type="text/css">
-		<?= preg_replace(
-      '~[\r\n\t ]+~',
-      ' ',
-      file_get_contents(__DIR__ . DIRECTORY_SEPARATOR . 'debug.css'),
-  ) ?>
+		<?= preg_replace('~[\r\n\t ]+~', ' ', file_get_contents(__DIR__ . DIRECTORY_SEPARATOR . 'debug.css')) ?>
 	</style>
 
 	<script type="text/javascript">
@@ -31,28 +26,21 @@ $errorId = uniqid('error', true);
 	<!-- Header -->
 	<div class="header">
 		<div class="container">
-			<h1><?= esc($title),
-       esc($exception->getCode() ? ' #' . $exception->getCode() : '') ?></h1>
+			<h1><?= esc($title), esc($exception->getCode() ? ' #' . $exception->getCode() : '') ?></h1>
 			<p>
-				<?= esc($exception->getMessage()) ?>
-				<a href="https://www.google.com/search?q=<?= urlencode(
-        $title .
-            ' ' .
-            preg_replace('~\'.*\'|".*"~Us', '', $exception->getMessage()),
-    ) ?>" rel="noreferrer" target="_blank">search &rarr;</a>
+				<?= nl2br(esc($exception->getMessage())) ?>
+				<a href="https://www.duckduckgo.com/?q=<?= urlencode($title . ' ' . preg_replace('~\'.*\'|".*"~Us', '', $exception->getMessage())) ?>" rel="noreferrer" target="_blank">search &rarr;</a>
 			</p>
 		</div>
 	</div>
 
 	<!-- Source -->
 	<div class="container">
-		<p><b><?= esc(static::cleanPath($file, $line)) ?></b> at line <b><?= esc(
-    $line,
-) ?></b></p>
+		<p><b><?= esc(static::cleanPath($file, $line)) ?></b> at line <b><?= esc($line) ?></b></p>
 
 		<?php if (is_file($file)): ?>
 			<div class="source">
-				<?= static::highlightFile($file, $line, 15) ?>
+				<?= static::highlightFile($file, $line, 15); ?>
 			</div>
 		<?php endif; ?>
 	</div>
@@ -66,7 +54,6 @@ $errorId = uniqid('error', true);
 			<li><a href="#response">Response</a></li>
 			<li><a href="#files">Files</a></li>
 			<li><a href="#memory">Memory</a></li>
-			</li>
 		</ul>
 
 		<div class="tab-content">
@@ -81,56 +68,41 @@ $errorId = uniqid('error', true);
 							<p>
 								<!-- Trace info -->
 								<?php if (isset($row['file']) && is_file($row['file'])): ?>
-									<?php if (
-             isset($row['function']) &&
-             in_array(
-                 $row['function'],
-                 ['include', 'include_once', 'require', 'require_once'],
-                 true,
-             )
-         ) {
-             echo esc($row['function'] . ' ' . static::cleanPath($row['file']));
-         } else {
-             echo esc(static::cleanPath($row['file']) . ' : ' . $row['line']);
-         } ?>
+									<?php
+									if (isset($row['function']) && in_array($row['function'], ['include', 'include_once', 'require', 'require_once'], true)) {
+										echo esc($row['function'] . ' ' . static::cleanPath($row['file']));
+									} else {
+										echo esc(static::cleanPath($row['file']) . ' : ' . $row['line']);
+									}
+									?>
 								<?php else: ?>
 									{PHP internal code}
 								<?php endif; ?>
 
 								<!-- Class/Method -->
-								<?php if (isset($row['class'])): ?>
-									&nbsp;&nbsp;&mdash;&nbsp;&nbsp;<?= esc(
-             $row['class'] . $row['type'] . $row['function'],
-         ) ?>
-									<?php if (array_key_exists('args', $row)): ?>
-										<?php $argsId = $errorId . 'args' . $index; ?>
-										( <a href="#" onclick="return toggle('<?= esc(
-              $argsId,
-              'attr',
-          ) ?>');">arguments</a> )
-							<div class="args" id="<?= esc($argsId, 'attr') ?>">
+								<?php if (isset($row['class'])) : ?>
+									&nbsp;&nbsp;&mdash;&nbsp;&nbsp;<?= esc($row['class'] . $row['type'] . $row['function']) ?>
+									<?php if (!empty($row['args'])) : ?>
+										<?php $args_id = $errorId . 'args' . $index ?>
+										( <a href="#" onclick="return toggle('<?= esc($args_id, 'attr') ?>');">arguments</a> )
+							<div class="args" id="<?= esc($args_id, 'attr') ?>">
 								<table cellspacing="0">
 
 									<?php
-         $params = null;
-         // Reflection by name is not available for closure function
-         if (substr($row['function'], -1) !== '}') {
-             $mirror = isset($row['class'])
-                 ? new ReflectionMethod($row['class'], $row['function'])
-                 : new ReflectionFunction($row['function']);
-             $params = $mirror->getParameters();
-         }
-         foreach ($row['args'] as $key => $value): ?>
+										$params = null;
+										// Reflection by name is not available for closure function
+										if (substr($row['function'], -1) !== '}') {
+											$mirror = isset($row['class']) ? new ReflectionMethod($row['class'], $row['function']) : new ReflectionFunction($row['function']);
+											$params = $mirror->getParameters();
+										}
+										foreach ($row['args'] as $key => $value): ?>
 										<tr>
-											<td><code><?= esc(
-               isset($params[$key]) ? '$' . $params[$key]->name : "#{$key}",
-           ) ?></code></td>
+											<td><code><?= esc(isset($params[$key]) ? '$' . $params[$key]->name : "#{$key}") ?></code></td>
 											<td>
 												<pre><?= esc(print_r($value, true)) ?></pre>
 											</td>
 										</tr>
-									<?php endforeach;
-         ?>
+									<?php endforeach; ?>
 
 								</table>
 							</div>
@@ -145,11 +117,7 @@ $errorId = uniqid('error', true);
 					</p>
 
 					<!-- Source? -->
-					<?php if (
-         isset($row['file']) &&
-         is_file($row['file']) &&
-         isset($row['class'])
-     ): ?>
+					<?php if (isset($row['file']) && is_file($row['file']) && isset($row['class'])): ?>
 						<div class="source">
 							<?= static::highlightFile($row['file'], $row['line']) ?>
 						</div>
@@ -165,8 +133,8 @@ $errorId = uniqid('error', true);
 			<div class="content" id="server">
 				<?php foreach (['_SERVER', '_SESSION'] as $var): ?>
 					<?php if (empty($GLOBALS[$var]) || !is_array($GLOBALS[$var])) {
-         continue;
-     } ?>
+						continue;
+					} ?>
 
 					<h3>$<?= esc($var) ?></h3>
 
@@ -267,8 +235,8 @@ $errorId = uniqid('error', true);
 				<?php $empty = true; ?>
 				<?php foreach (['_GET', '_POST', '_COOKIE'] as $var): ?>
 					<?php if (empty($GLOBALS[$var]) || !is_array($GLOBALS[$var])) {
-         continue;
-     } ?>
+						continue;
+					} ?>
 
 					<?php $empty = false; ?>
 
@@ -322,12 +290,12 @@ $errorId = uniqid('error', true);
 						<tbody>
 							<?php foreach ($headers as $value): ?>
 								<?php if (empty($value)) {
-            continue;
-        } ?>
+									continue;
+								} ?>
 								<?php if (!is_array($value)) {
-            $value = [$value];
-        } ?>
-								<?php foreach ($value as $h): ?>
+									$value = [$value];
+								} ?>
+								<?php foreach ($value as $h) : ?>
 									<tr>
 										<td><?= esc($h->getName(), 'html') ?></td>
 										<td><?= esc($h->getValueLine(), 'html') ?></td>
@@ -342,9 +310,9 @@ $errorId = uniqid('error', true);
 
 			<!-- Response -->
 			<?php
-   $response = Services::response();
-   $response->setStatusCode(http_response_code());
-   ?>
+			$response = Services::response();
+			$response->setStatusCode(http_response_code());
+			?>
 			<div class="content" id="response">
 				<table>
 					<tr>
diff --git a/env b/env
index 5893f099d66d20906b373e33c06a41963ee0b136..1106ce46f932ccf9fbc4117779f2c9fccb89bb2c 100644
--- a/env
+++ b/env
@@ -25,26 +25,12 @@
 
 # app.sessionDriver = 'CodeIgniter\Session\Handlers\FileHandler'
 # app.sessionCookieName = 'ci_session'
+# app.sessionExpiration = 7200
 # app.sessionSavePath = NULL
 # app.sessionMatchIP = false
 # app.sessionTimeToUpdate = 300
 # app.sessionRegenerateDestroy = false
 
-# app.cookiePrefix = ''
-# app.cookieDomain = ''
-# app.cookiePath = '/'
-# app.cookieSecure = false
-# app.cookieHTTPOnly = false
-# app.cookieSameSite = 'Lax'
-
-# app.CSRFProtection  = false
-# app.CSRFTokenName   = 'csrf_test_name'
-# app.CSRFCookieName  = 'csrf_cookie_name'
-# app.CSRFExpire      = 7200
-# app.CSRFRegenerate  = true
-# app.CSRFExcludeURIs = []
-# app.CSRFSameSite    = 'Lax'
-
 # app.CSPEnabled = false
 
 #--------------------------------------------------------------------
@@ -56,12 +42,14 @@
 # database.default.username = root
 # database.default.password = root
 # database.default.DBDriver = MySQLi
+# database.default.DBPrefix =
 
 # database.tests.hostname = localhost
 # database.tests.database = ci4
 # database.tests.username = root
 # database.tests.password = root
 # database.tests.DBDriver = MySQLi
+# database.tests.DBPrefix =
 
 #--------------------------------------------------------------------
 # CONTENT SECURITY POLICY
@@ -78,6 +66,7 @@
 # contentsecuritypolicy.fontSrc = null
 # contentsecuritypolicy.formAction = null
 # contentsecuritypolicy.frameAncestors = null
+# contentsecuritypolicy.frameSrc = null
 # contentsecuritypolicy.mediaSrc = null
 # contentsecuritypolicy.objectSrc = null
 # contentsecuritypolicy.pluginTypes = null
@@ -85,6 +74,19 @@
 # contentsecuritypolicy.sandbox = false
 # contentsecuritypolicy.upgradeInsecureRequests = false
 
+#--------------------------------------------------------------------
+# COOKIE
+#--------------------------------------------------------------------
+
+# cookie.prefix = ''
+# cookie.expires = 0
+# cookie.path = '/'
+# cookie.domain = ''
+# cookie.secure = false
+# cookie.httponly = false
+# cookie.samesite = 'Lax'
+# cookie.raw = false
+
 #--------------------------------------------------------------------
 # ENCRYPTION
 #--------------------------------------------------------------------
@@ -108,16 +110,16 @@
 # SECURITY
 #--------------------------------------------------------------------
 
-# security.tokenName  = 'csrf_token_name'
+# security.tokenName = 'csrf_token_name'
 # security.headerName = 'X-CSRF-TOKEN'
 # security.cookieName = 'csrf_cookie_name'
-# security.expires    = 7200
+# security.expires = 7200
 # security.regenerate = true
-# security.redirect   = true
-# security.samesite   = 'Lax'
+# security.redirect = true
+# security.samesite = 'Lax'
 
 #--------------------------------------------------------------------
 # LOGGER
 #--------------------------------------------------------------------
 
-# logger.threshold = 4
\ No newline at end of file
+# logger.threshold = 4
diff --git a/public/.htaccess b/public/.htaccess
index 4ae666b78b9a3d911e1559e46af716737bf1c36c..a5d6c2a541286ca75c7d65fb6ac5944dfd123bd6 100644
--- a/public/.htaccess
+++ b/public/.htaccess
@@ -1,21 +1,49 @@
 # Disable directory browsing
 Options All -Indexes
 
-# Disable server signature
-ServerSignature Off
+# ----------------------------------------------------------------------
+# Rewrite engine
+# ----------------------------------------------------------------------
 
+# Turning on the rewrite engine is necessary for the following rules and features.
+# FollowSymLinks must be enabled for this to work.
 <IfModule mod_rewrite.c>
 	Options +FollowSymlinks
 	RewriteEngine On
-	RewriteCond %{REQUEST_FILENAME} -s [OR]
-	RewriteCond %{REQUEST_FILENAME} -l [OR]
-	RewriteCond %{REQUEST_FILENAME} -d
-	RewriteRule ^.*$ - [NC,L]
-	RewriteRule ^.*$ index.php [NC,L]
+
+	# If you installed CodeIgniter in a subfolder, you will need to
+	# change the following line to match the subfolder you need.
+	# http://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewritebase
+	# RewriteBase /
+
+	# Redirect Trailing Slashes...
+	RewriteCond %{REQUEST_FILENAME} !-d
+	RewriteCond %{REQUEST_URI} (.+)/$
+	RewriteRule ^ %1 [L,R=301]
+
+	# Rewrite "www.example.com -> example.com"
+	RewriteCond %{HTTPS} !=on
+	RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
+	RewriteRule ^ http://%1%{REQUEST_URI} [R=301,L]
+
+	# Checks to see if the user is attempting to access a valid file,
+	# such as an image or css document, if this isn't true it sends the
+	# request to the front controller, index.php
+	RewriteCond %{REQUEST_FILENAME} !-f
+	RewriteCond %{REQUEST_FILENAME} !-d
+	RewriteRule ^([\s\S]*)$ index.php/$1 [L,NC,QSA]
+
+	# Ensure Authorization header is passed along
+	RewriteCond %{HTTP:Authorization} .
+	RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
 </IfModule>
 
 <IfModule !mod_rewrite.c>
 	# If we don't have mod_rewrite installed, all 404's
 	# can be sent to index.php, and everything works as normal.
-	ErrorDocument 404 /index.php
+	ErrorDocument 404 index.php
 </IfModule>
+
+# Disable server signature start
+	ServerSignature Off
+# Disable server signature end
diff --git a/public/index.php b/public/index.php
index 3ae1e59b7429843dfe58424f349210f44a53e4b5..752c63dbde5ea5255f15ff4f3f6801ab2c5164d8 100644
--- a/public/index.php
+++ b/public/index.php
@@ -2,16 +2,6 @@
 
 use Config\Paths;
 
-// Valid PHP Version?
-$minPHPVersionId = 80000; // 8.0
-if ($minPHPVersionId > PHP_VERSION_ID) {
-    die(
-        'Your PHP version must be 8.0 or higher to run Castopod Host. Current version: ' .
-            PHP_VERSION
-    );
-}
-unset($minPHPVersion);
-
 // Path to the front controller (this file)
 define('FCPATH', __DIR__ . DIRECTORY_SEPARATOR);
 
@@ -29,17 +19,12 @@ chdir(__DIR__);
 
 // Load our paths config file
 // This is the line that might need to be changed, depending on your folder structure.
-require realpath(FCPATH . '../app/Config/Paths.php') ?:
-    FCPATH . '../app/Config/Paths.php';
-// ^^^ Change this if you move your application folder
+require realpath(FCPATH . '../app/Config/Paths.php') ?: FCPATH . '../app/Config/Paths.php';
 
 $paths = new Paths();
 
 // Location of the framework bootstrap file.
-$bootstrap =
-    rtrim($paths->systemDirectory, '\\/ ') .
-    DIRECTORY_SEPARATOR .
-    'bootstrap.php';
+$bootstrap = rtrim($paths->systemDirectory, '\\/ ') . DIRECTORY_SEPARATOR . 'bootstrap.php';
 $app = require realpath($bootstrap) ?: $bootstrap;
 
 /*
diff --git a/spark b/spark
index 6446786fd6cca54fa775d839c9b850c0f5dff734..c4ad645a366ba4a0204246d4d1131ad957583e0c 100644
--- a/spark
+++ b/spark
@@ -1,14 +1,5 @@
 #!/usr/bin/env php
 <?php
-// Valid PHP Version?
-$minPHPVersion = "8.0";
-if (version_compare(PHP_VERSION, $minPHPVersion, "<")) {
-    die(
-        "Your PHP version must be {$minPHPVersion} or higher to run CodeIgniter. Current version: " .
-            PHP_VERSION
-    );
-}
-unset($minPHPVersion);
 
 /*
  * --------------------------------------------------------------------
@@ -21,7 +12,7 @@ unset($minPHPVersion);
  * this class mainly acts as a passthru to the framework itself.
  */
 
-define("SPARKED", true);
+define('SPARKED', true);
 
 /*
  *---------------------------------------------------------------
@@ -33,20 +24,16 @@ define("SPARKED", true);
  */
 
 // Refuse to run when called from php-cgi
-if (strpos(PHP_SAPI, "cgi") === 0) {
-    die(
-        "The cli tool is not supported when running php-cgi. It needs php-cli to function!\n\n"
-    );
+if (strpos(PHP_SAPI, 'cgi') === 0)
+{
+	die("The cli tool is not supported when running php-cgi. It needs php-cli to function!\n\n");
 }
 
 // Path to the front controller
-define(
-    "FCPATH",
-    __DIR__ . DIRECTORY_SEPARATOR . "public" . DIRECTORY_SEPARATOR
-);
+define('FCPATH', __DIR__ . DIRECTORY_SEPARATOR . 'public' . DIRECTORY_SEPARATOR);
 
 // Load our paths config file
-require realpath("app/Config/Paths.php") ?: "app/Config/Paths.php";
+require realpath('app/Config/Paths.php') ?: 'app/Config/Paths.php';
 // ^^^ Change this line if you move your application folder
 
 $paths = new Config\Paths();
@@ -54,25 +41,28 @@ $paths = new Config\Paths();
 // Ensure the current directory is pointing to the front controller's directory
 chdir(FCPATH);
 
-$bootstrap =
-    rtrim($paths->systemDirectory, "\\/ ") .
-    DIRECTORY_SEPARATOR .
-    "bootstrap.php";
-$app = require realpath($bootstrap) ?: $bootstrap;
+$bootstrap = rtrim($paths->systemDirectory, '\\/ ') . DIRECTORY_SEPARATOR . 'bootstrap.php';
+$app       = require realpath($bootstrap) ?: $bootstrap;
 
 // Grab our Console
 $console = new CodeIgniter\CLI\Console($app);
 
 // We want errors to be shown when using it from the CLI.
 error_reporting(-1);
-ini_set("display_errors", "1");
+ini_set('display_errors', '1');
 
 // Show basic information before we do anything else.
-$console->showHeader();
+if (is_int($suppress = array_search('--no-header', $_SERVER['argv'], true)))
+{
+	unset($_SERVER['argv'][$suppress]); // @codeCoverageIgnore
+	$suppress = true;
+}
+
+$console->showHeader($suppress);
 
 // fire off the command in the main framework.
 $response = $console->run();
-if ($response->getStatusCode() >= 300) {
-    exit($response->getStatusCode());
+if ($response->getStatusCode() >= 300)
+{
+	exit($response->getStatusCode());
 }
-