diff --git a/modules/puphpeteer/puphpeteer.info.yml b/modules/puphpeteer/puphpeteer.info.yml
index d3c90dd..9ad6c8d 100644
--- a/modules/puphpeteer/puphpeteer.info.yml
+++ b/modules/puphpeteer/puphpeteer.info.yml
@@ -1,6 +1,6 @@
 name: Puphpeteer
 description: Generate PDFs using Puppeteer
 type: module
-core_version_requirement: ^9 || ^10 || ^11
+core_version_requirement: ^10.1 || ^11 || ^12
 dependencies:
   - pdf_api:pdf_api
diff --git a/pdf_api.info.yml b/pdf_api.info.yml
index a6f9315..d55548b 100644
--- a/pdf_api.info.yml
+++ b/pdf_api.info.yml
@@ -2,5 +2,5 @@ name: PDF API
 type: module
 description: 'Provides an API for generating PDFs.'
 package: PDF
-core_version_requirement: ^8.8 || ^9 || ^10 || ^11
+core_version_requirement: ^10.1 || ^11 || ^12
 configure: pdf_api.settings
diff --git a/pdf_api.module b/pdf_api.module
index 9fc546e..7d73db3 100644
--- a/pdf_api.module
+++ b/pdf_api.module
@@ -5,6 +5,8 @@
  * Provides an API for generating PDFs.
  */
 
+use Drupal\Core\Hook\Attribute\LegacyHook;
+use Drupal\pdf_api\Hook\PdfApiHooks;
 use Drupal\Core\Routing\RouteMatchInterface;
 
 // Register autoloading of vendor libraries.
@@ -16,16 +18,7 @@ if (file_exists($autoload)) {
 /**
  * Implements hook_help().
  */
+#[LegacyHook]
 function pdf_api_help($route_name, RouteMatchInterface $route_match) {
-  switch ($route_name) {
-    case 'pdf_api.settings':
-      $output = '';
-      $output .= '<p>' . t('Configuration for the dompdf library. For more information, see the <a href=":url" target="_blank">dompdf documentation</a>.', [
-        ':url' => 'https://github.com/dompdf/dompdf/blob/master/src/Options.php',
-      ]) . '</p>';
-      return $output;
-
-    default:
-      return '';
-  }
+  return \Drupal::service(PdfApiHooks::class)->help($route_name, $route_match);
 }
diff --git a/pdf_api.services.yml b/pdf_api.services.yml
index 71e477e..b03e0a7 100644
--- a/pdf_api.services.yml
+++ b/pdf_api.services.yml
@@ -10,3 +10,7 @@ services:
   logger.channel.pdf_api:
     parent: logger.channel_base
     arguments: ['pdf api']
+
+  Drupal\pdf_api\Hook\PdfApiHooks:
+    class: Drupal\pdf_api\Hook\PdfApiHooks
+    autowire: true
diff --git a/src/Hook/PdfApiHooks.php b/src/Hook/PdfApiHooks.php
new file mode 100644
index 0000000..6edbec5
--- /dev/null
+++ b/src/Hook/PdfApiHooks.php
@@ -0,0 +1,33 @@
+<?php
+
+namespace Drupal\pdf_api\Hook;
+
+use Drupal\Core\Routing\RouteMatchInterface;
+use Drupal\Core\Hook\Attribute\Hook;
+use Drupal\Core\StringTranslation\StringTranslationTrait;
+
+/**
+ * Hook implementations for pdf_api.
+ */
+class PdfApiHooks {
+  use StringTranslationTrait;
+
+  /**
+   * Implements hook_help().
+   */
+  #[Hook('help')]
+  public function help($route_name, RouteMatchInterface $route_match) {
+    switch ($route_name) {
+      case 'pdf_api.settings':
+        $output = '';
+        $output .= '<p>' . $this->t('Configuration for the dompdf library. For more information, see the <a href=":url" target="_blank">dompdf documentation</a>.', [
+          ':url' => 'https://github.com/dompdf/dompdf/blob/master/src/Options.php',
+        ]) . '</p>';
+        return $output;
+
+      default:
+        return '';
+    }
+  }
+
+}
