diff --git a/DEPENDENCIES.md b/DEPENDENCIES.md
index 93371ef5fbd9a235b2aeadff146de809bff2af98..7819536eaf89e9a67ebb057c36258632c848258d 100644
--- a/DEPENDENCIES.md
+++ b/DEPENDENCIES.md
@@ -39,8 +39,6 @@ Javascript dependencies:
   ([MIT License](https://github.com/rollup/rollup/blob/master/LICENSE.md))
 - [tailwindcss](https://tailwindcss.com/)
   ([MIT License](https://github.com/tailwindcss/tailwindcss/blob/master/LICENSE))
-- [ProseMirror](https://prosemirror.net/)
-  ([MIT License](https://github.com/ProseMirror/prosemirror/blob/master/LICENSE))
 - [amCharts 4](https://github.com/amcharts/amcharts4)
   ([Free amCharts license](https://github.com/amcharts/amcharts4/blob/master/dist/script/LICENSE))
 - [Choices.js](https://joshuajohnson.co.uk/Choices/)
diff --git a/app/Helpers/form_helper.php b/app/Helpers/form_helper.php
index e80bfd40fc0cb41b5af05ebeb46836b8cf451eec..49eb58026921d8e88cfcd5be52e0fc4b8cc35520 100644
--- a/app/Helpers/form_helper.php
+++ b/app/Helpers/form_helper.php
@@ -226,7 +226,8 @@ if (! function_exists('form_dropdown')) {
                 }
                 $form .= "</optgroup>\n";
             } else {
-                $form .= '<option value="' . htmlspecialchars($key) . '"'
+                /** @noRector RecastingRemovalRector */
+                $form .= '<option value="' . htmlspecialchars((string) $key) . '"'
                         . (in_array($key, $selected, true) ? ' selected="selected"' : '') . '>'
                         . $val . "</option>\n";
             }
diff --git a/app/Helpers/rss_helper.php b/app/Helpers/rss_helper.php
index 8ef681922dfc34e320747c93a718b3238c90c781..764c3bf320b8580ca73a657a89d2be8cf6dacae7 100644
--- a/app/Helpers/rss_helper.php
+++ b/app/Helpers/rss_helper.php
@@ -51,7 +51,7 @@ if (! function_exists('get_rss_feed')) {
         $channel->addChild('docs', 'https://cyber.harvard.edu/rss/rss.html');
 
         $channel->addChild('guid', $podcast->guid, $podcastNamespace);
-        $channel->addChild('title', $podcast->title);
+        $channel->addChild('title', $podcast->title, null, false);
         $channel->addChildWithCDATA('description', $podcast->description_html);
 
         $itunesImage = $channel->addChild('image', null, $itunesNamespace);
@@ -189,7 +189,7 @@ if (! function_exists('get_rss_feed')) {
 
         $image = $channel->addChild('image');
         $image->addChild('url', $podcast->image->feed_url);
-        $image->addChild('title', $podcast->title);
+        $image->addChild('title', $podcast->title, null, false);
         $image->addChild('link', $podcast->link);
 
         if ($podcast->custom_rss !== null) {
@@ -200,7 +200,7 @@ if (! function_exists('get_rss_feed')) {
 
         foreach ($episodes as $episode) {
             $item = $channel->addChild('item');
-            $item->addChild('title', $episode->title);
+            $item->addChild('title', $episode->title, null, false);
             $enclosure = $item->addChild('enclosure');
 
             $enclosure->addAttribute(
diff --git a/app/Libraries/SimpleRSSElement.php b/app/Libraries/SimpleRSSElement.php
index 84944700ce102b0998d39ac7d094194d67036ed8..8378c052a6578c4491a4bca4bb9369ae048ba239 100644
--- a/app/Libraries/SimpleRSSElement.php
+++ b/app/Libraries/SimpleRSSElement.php
@@ -29,8 +29,12 @@ class SimpleRSSElement extends SimpleXMLElement
 
         if ($newChild !== null) {
             $node = dom_import_simplexml($newChild);
-            $no = $node->ownerDocument;
-            $node->appendChild($no->createCDATASection($value));
+            if ($node !== null) {
+                $no = $node->ownerDocument;
+                if ($no !== null) {
+                    $node->appendChild($no->createCDATASection($value));
+                }
+            }
         }
 
         return $newChild;
@@ -43,17 +47,29 @@ class SimpleRSSElement extends SimpleXMLElement
      * @param string $name — The name of the child element to add.
      * @param string $value — [optional] If specified, the value of the child element.
      * @param string $namespace [optional] If specified, the namespace to which the child element belongs.
+     * @param boolean $escape [optional] The value is escaped by default, can be set to false.
      *
      * @return static The addChild method returns a SimpleXMLElement object representing the child added to the XML node.
      */
-    public function addChild($name, $value = null, $namespace = null)
+    public function addChild($name, $value = null, $namespace = null, $escape = true)
     {
         $newChild = parent::addChild($name, '', $namespace);
 
         if ($newChild !== null) {
             $node = dom_import_simplexml($newChild);
-            $no = $node->ownerDocument;
-            $node->appendChild($no->createTextNode((string) esc($value)));
+            if ($node !== null) {
+                $no = $node->ownerDocument;
+                $value = $escape ? esc($value ?? '') : $value ?? '';
+                if ($no === null) {
+                    return $newChild;
+                }
+                if (is_array($value)) {
+                    return $newChild;
+                }
+                /** @noRector RecastingRemovalRector */
+                $node->appendChild($no->createTextNode((string) $value));
+                return $newChild;
+            }
         }
 
         return $newChild;
diff --git a/app/Resources/js/typings.d.ts b/app/Resources/js/typings.d.ts
index fe9d4f5119ca50b95ca2fae5955c780d4d209d9c..f850e707d0aa27627a8ae931fb502ac4755d4556 100644
--- a/app/Resources/js/typings.d.ts
+++ b/app/Resources/js/typings.d.ts
@@ -1,3 +1 @@
-declare module "prosemirror-markdown";
-declare module "prosemirror-example-setup";
 declare module "leaflet.markercluster";
diff --git a/app/Resources/types/js/admin.d.ts b/app/Resources/types/js/admin.d.ts
deleted file mode 100644
index 4efc2a2c3d7fde1cd74eba27d254dee989845811..0000000000000000000000000000000000000000
--- a/app/Resources/types/js/admin.d.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-import "@github/markdown-toolbar-element";
-import "./modules/markdown-preview";
-import "./modules/markdown-write-preview";
diff --git a/app/Resources/types/js/charts.d.ts b/app/Resources/types/js/charts.d.ts
deleted file mode 100644
index c3fee8a1756492cfc0126938267cc56720202a8a..0000000000000000000000000000000000000000
--- a/app/Resources/types/js/charts.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import "core-js";
diff --git a/app/Resources/types/js/install.d.ts b/app/Resources/types/js/install.d.ts
deleted file mode 100644
index cb0ff5c3b541f646105198ee23ac0fc3d805023e..0000000000000000000000000000000000000000
--- a/app/Resources/types/js/install.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export {};
diff --git a/app/Resources/types/js/map.d.ts b/app/Resources/types/js/map.d.ts
deleted file mode 100644
index c3fee8a1756492cfc0126938267cc56720202a8a..0000000000000000000000000000000000000000
--- a/app/Resources/types/js/map.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import "core-js";
diff --git a/app/Resources/types/js/modules/Charts.d.ts b/app/Resources/types/js/modules/Charts.d.ts
deleted file mode 100644
index 2e5108cffcd5b9cc4e9d47df8cb58165bc8c67eb..0000000000000000000000000000000000000000
--- a/app/Resources/types/js/modules/Charts.d.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-declare const DrawCharts: () => void;
-export default DrawCharts;
diff --git a/app/Resources/types/js/modules/ClientTimezone.d.ts b/app/Resources/types/js/modules/ClientTimezone.d.ts
deleted file mode 100644
index 344446323e4aa35c94e30e1aa1f632dc982edf8f..0000000000000000000000000000000000000000
--- a/app/Resources/types/js/modules/ClientTimezone.d.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-declare const ClientTimezone: () => void;
-export default ClientTimezone;
diff --git a/app/Resources/types/js/modules/Clipboard.d.ts b/app/Resources/types/js/modules/Clipboard.d.ts
deleted file mode 100644
index 9500a96e980fe04a8e93ffa670c5312bc68149f8..0000000000000000000000000000000000000000
--- a/app/Resources/types/js/modules/Clipboard.d.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-declare const Clipboard: () => void;
-export default Clipboard;
diff --git a/app/Resources/types/js/modules/DateTimePicker.d.ts b/app/Resources/types/js/modules/DateTimePicker.d.ts
deleted file mode 100644
index 9612d4033c9c1bf70706feffbcf577354161a282..0000000000000000000000000000000000000000
--- a/app/Resources/types/js/modules/DateTimePicker.d.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-import "flatpickr/dist/flatpickr.min.css";
-declare const DateTimePicker: () => void;
-export default DateTimePicker;
diff --git a/app/Resources/types/js/modules/Dropdown.d.ts b/app/Resources/types/js/modules/Dropdown.d.ts
deleted file mode 100644
index 5395e5640d74e9802c73140ca8fc81b540ef64a7..0000000000000000000000000000000000000000
--- a/app/Resources/types/js/modules/Dropdown.d.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-declare const Dropdown: () => void;
-export default Dropdown;
diff --git a/app/Resources/types/js/modules/EpisodesMap.d.ts b/app/Resources/types/js/modules/EpisodesMap.d.ts
deleted file mode 100644
index 67f900a5f7db1298e7bcfe5f4d8424644144efdc..0000000000000000000000000000000000000000
--- a/app/Resources/types/js/modules/EpisodesMap.d.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-import "leaflet.markercluster/dist/MarkerCluster.css";
-import "leaflet.markercluster/dist/MarkerCluster.Default.css";
-import "leaflet/dist/leaflet.css";
-declare const DrawEpisodesMaps: () => void;
-export default DrawEpisodesMaps;
diff --git a/app/Resources/types/js/modules/Map.d.ts b/app/Resources/types/js/modules/Map.d.ts
deleted file mode 100644
index 4fe78599f5153026ab288aee08be606ecb979850..0000000000000000000000000000000000000000
--- a/app/Resources/types/js/modules/Map.d.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-declare const DrawMaps: () => void;
-export default DrawMaps;
diff --git a/app/Resources/types/js/modules/Modal.d.ts b/app/Resources/types/js/modules/Modal.d.ts
deleted file mode 100644
index 99d06ce4104272ecc14e036084784bce849d9977..0000000000000000000000000000000000000000
--- a/app/Resources/types/js/modules/Modal.d.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-declare const Modal: () => void;
-export default Modal;
diff --git a/app/Resources/types/js/modules/MultiSelect.d.ts b/app/Resources/types/js/modules/MultiSelect.d.ts
deleted file mode 100644
index 0f708a2470ad8c3a54620981abb9637d3019d834..0000000000000000000000000000000000000000
--- a/app/Resources/types/js/modules/MultiSelect.d.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-declare const MultiSelect: () => void;
-export default MultiSelect;
diff --git a/app/Resources/types/js/modules/PublishMessageWarning.d.ts b/app/Resources/types/js/modules/PublishMessageWarning.d.ts
deleted file mode 100644
index c9a7b80fcc2a0f79803394371d8917ad09cde71a..0000000000000000000000000000000000000000
--- a/app/Resources/types/js/modules/PublishMessageWarning.d.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-declare const PublishMessageWarning: () => void;
-export default PublishMessageWarning;
diff --git a/app/Resources/types/js/modules/Select.d.ts b/app/Resources/types/js/modules/Select.d.ts
deleted file mode 100644
index a1bd61c89001b2ed3491f90f5f9c5dfedef288ab..0000000000000000000000000000000000000000
--- a/app/Resources/types/js/modules/Select.d.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-declare const Select: () => void;
-export default Select;
diff --git a/app/Resources/types/js/modules/SidebarToggler.d.ts b/app/Resources/types/js/modules/SidebarToggler.d.ts
deleted file mode 100644
index 53739967ef90d3749ca9a09b7222bc88b2d368ae..0000000000000000000000000000000000000000
--- a/app/Resources/types/js/modules/SidebarToggler.d.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-declare const SidebarToggler: () => void;
-export default SidebarToggler;
diff --git a/app/Resources/types/js/modules/Slugify.d.ts b/app/Resources/types/js/modules/Slugify.d.ts
deleted file mode 100644
index 532945fd78b828b6dade63e14add863b5848f764..0000000000000000000000000000000000000000
--- a/app/Resources/types/js/modules/Slugify.d.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-declare const Slugify: () => void;
-export default Slugify;
diff --git a/app/Resources/types/js/modules/Soundbites.d.ts b/app/Resources/types/js/modules/Soundbites.d.ts
deleted file mode 100644
index b35a42567dfddc995e17702703f766a2a402f7e7..0000000000000000000000000000000000000000
--- a/app/Resources/types/js/modules/Soundbites.d.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-declare const Soundbites: () => void;
-export default Soundbites;
diff --git a/app/Resources/types/js/modules/ThemePicker.d.ts b/app/Resources/types/js/modules/ThemePicker.d.ts
deleted file mode 100644
index 385f044b81999ce4907ec42d5a1e09953128fe40..0000000000000000000000000000000000000000
--- a/app/Resources/types/js/modules/ThemePicker.d.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-declare const ThemePicker: () => void;
-export default ThemePicker;
diff --git a/app/Resources/types/js/modules/Time.d.ts b/app/Resources/types/js/modules/Time.d.ts
deleted file mode 100644
index e04a63d4c015bbdbf4b50a65f1c40fa7535c1222..0000000000000000000000000000000000000000
--- a/app/Resources/types/js/modules/Time.d.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-declare const Time: () => void;
-export default Time;
diff --git a/app/Resources/types/js/modules/Toggler.d.ts b/app/Resources/types/js/modules/Toggler.d.ts
deleted file mode 100644
index 3157ee548480f49288af19b4994b288f2592b487..0000000000000000000000000000000000000000
--- a/app/Resources/types/js/modules/Toggler.d.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-declare const Toggler: () => void;
-export default Toggler;
diff --git a/app/Resources/types/js/modules/Tooltip.d.ts b/app/Resources/types/js/modules/Tooltip.d.ts
deleted file mode 100644
index d733d7a310ca0b51fba5a650ff9bce7551cc24fb..0000000000000000000000000000000000000000
--- a/app/Resources/types/js/modules/Tooltip.d.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-declare const Tooltip: () => void;
-export default Tooltip;
diff --git a/app/Resources/types/js/modules/markdown-preview.d.ts b/app/Resources/types/js/modules/markdown-preview.d.ts
deleted file mode 100644
index 2132ecefd180b001b4e1fd0bbd81d564052cfa60..0000000000000000000000000000000000000000
--- a/app/Resources/types/js/modules/markdown-preview.d.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-import MarkdownToolbarElement from "@github/markdown-toolbar-element";
-import { LitElement, TemplateResult } from "lit";
-export declare class MarkdownPreview extends LitElement {
-  for: string;
-  _textarea: HTMLTextAreaElement;
-  _markdownToolbar: MarkdownToolbarElement;
-  _show: boolean;
-  connectedCallback(): void;
-  hide(): void;
-  show(): void;
-  markdownToHtml(): string;
-  render(): TemplateResult<1>;
-}
diff --git a/app/Resources/types/js/modules/markdown-write-preview.d.ts b/app/Resources/types/js/modules/markdown-write-preview.d.ts
deleted file mode 100644
index 1f646a9bd14830d2d2171765ad30037c6bab0485..0000000000000000000000000000000000000000
--- a/app/Resources/types/js/modules/markdown-write-preview.d.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-import { LitElement, TemplateResult } from "lit";
-import { MarkdownPreview } from "./markdown-preview";
-export declare class MarkdownWritePreview extends LitElement {
-  for: string;
-  _textarea: HTMLTextAreaElement | null;
-  _markdownPreview: MarkdownPreview;
-  _write: NodeListOf<HTMLButtonElement>;
-  _preview: NodeListOf<HTMLButtonElement>;
-  connectedCallback(): void;
-  write(): void;
-  preview(): void;
-  render(): TemplateResult<1>;
-}
diff --git a/app/Resources/types/js/podcast.d.ts b/app/Resources/types/js/podcast.d.ts
deleted file mode 100644
index cb0ff5c3b541f646105198ee23ac0fc3d805023e..0000000000000000000000000000000000000000
--- a/app/Resources/types/js/podcast.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export {};
diff --git a/tsconfig.json b/tsconfig.json
index 5f495c6b050db12ff9e4871d61deb52cdf4eab8f..b56093e0df1a007d0ec979d70c3b8787dd4800ab 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -2,15 +2,8 @@
   "compilerOptions": {
     /* Basic Options */
     "module": "esnext" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */,
-    "lib": [
-      "DOM",
-      "DOM.Iterable",
-      "ESNext"
-    ] /* Specify library files to be included in the compilation. */,
-    "declaration": true,
-    "emitDeclarationOnly": true,
-    "outDir": "app/Resources/types",
-    "rootDir": "app/Resources",
+    "lib": ["DOM", "DOM.Iterable", "ESNext"],
+    "noEmit": true,
 
     /* Strict Type-Checking Options */
     "strict": true /* Enable all strict type-checking options. */,