diff --git a/composer.json b/composer.json
index aba8b2e..3e854fd 100644
--- a/composer.json
+++ b/composer.json
@@ -109,7 +109,6 @@
     "require-dev": {
         "drupal/core-dev": "^10",
         "fenetikm/autoload-drupal": "dev-autoload-tests",
-        "phpspec/prophecy-phpunit": "^2",
-        "phpstan/phpstan-strict-rules": "^1.5"
+        "phpspec/prophecy-phpunit": "^2"
     }
 }
diff --git a/composer.lock b/composer.lock
index 6abbdd8..66ff841 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": "2d3f22a75cc98e2996a5d6b9f3934faf",
+    "content-hash": "b7efed8e16e9b99d9aba5afbdb499669",
     "packages": [
         {
             "name": "asm89/stack-cors",
@@ -8218,55 +8218,6 @@
             },
             "time": "2023-05-26T11:05:59+00:00"
         },
-        {
-            "name": "phpstan/phpstan-strict-rules",
-            "version": "1.5.1",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/phpstan/phpstan-strict-rules.git",
-                "reference": "b21c03d4f6f3a446e4311155f4be9d65048218e6"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/phpstan/phpstan-strict-rules/zipball/b21c03d4f6f3a446e4311155f4be9d65048218e6",
-                "reference": "b21c03d4f6f3a446e4311155f4be9d65048218e6",
-                "shasum": ""
-            },
-            "require": {
-                "php": "^7.2 || ^8.0",
-                "phpstan/phpstan": "^1.10"
-            },
-            "require-dev": {
-                "nikic/php-parser": "^4.13.0",
-                "php-parallel-lint/php-parallel-lint": "^1.2",
-                "phpstan/phpstan-deprecation-rules": "^1.1",
-                "phpstan/phpstan-phpunit": "^1.0",
-                "phpunit/phpunit": "^9.5"
-            },
-            "type": "phpstan-extension",
-            "extra": {
-                "phpstan": {
-                    "includes": [
-                        "rules.neon"
-                    ]
-                }
-            },
-            "autoload": {
-                "psr-4": {
-                    "PHPStan\\": "src/"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "MIT"
-            ],
-            "description": "Extra strict and opinionated rules for PHPStan",
-            "support": {
-                "issues": "https://github.com/phpstan/phpstan-strict-rules/issues",
-                "source": "https://github.com/phpstan/phpstan-strict-rules/tree/1.5.1"
-            },
-            "time": "2023-03-29T14:47:40+00:00"
-        },
         {
             "name": "phpunit/php-code-coverage",
             "version": "9.2.27",
diff --git a/web/modules/custom/example/tests/src/Functional/AdminPageTest.php b/web/modules/custom/example/tests/src/Functional/AdminPageTest.php
deleted file mode 100644
index e5253b6..0000000
--- a/web/modules/custom/example/tests/src/Functional/AdminPageTest.php
+++ /dev/null
@@ -1,40 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Drupal\Tests\example\Functional;
-
-use Drupal\Tests\BrowserTestBase;
-use Symfony\Component\HttpFoundation\Response;
-
-final class AdminPageTest extends BrowserTestBase {
-
-  public $defaultTheme = 'stark';
-
-  /** @test */
-  public function the_admin_page_is_not_accessible_to_anonymous_users(): void {
-    $this->drupalGet(path: '/admin');
-
-    $assert = $this->assertSession();
-
-    $assert->statusCodeEquals(Response::HTTP_FORBIDDEN);
-  }
-
-  /** @test */
-  public function the_admin_page_is_accessible_by_admin_users(): void {
-    $adminUser = $this->createUser(
-      permissions: [
-        'access administration pages',
-      ],
-    );
-
-    $this->drupalLogin(account: $adminUser);
-
-    $this->drupalGet(path: '/admin');
-
-    $assert = $this->assertSession();
-
-    $assert->statusCodeEquals(Response::HTTP_OK);
-  }
-
-}
diff --git a/web/modules/custom/example/tests/src/Functional/ExamplePageTest.php b/web/modules/custom/example/tests/src/Functional/ExamplePageTest.php
new file mode 100644
index 0000000..5ecb1b8
--- /dev/null
+++ b/web/modules/custom/example/tests/src/Functional/ExamplePageTest.php
@@ -0,0 +1,31 @@
+<?php
+
+namespace Drupal\Tests\example\Functional;
+
+use Drupal\Tests\BrowserTestBase;
+use Symfony\Component\HttpFoundation\Response;
+
+final class ExamplePageTest extends BrowserTestBase {
+
+  public $defaultTheme = 'stark';
+
+  protected static $modules = [
+    // Core.
+    'node',
+
+    // Custom.
+    "example"
+  ];
+
+  /** @test */
+  public function should_load_the_example_page_for_anonymous_users(): void {
+    // Arrange.
+
+    // Act.
+    $this->drupalGet('/@opdavies/drupal-module-template');
+
+    // Assert.
+    $this->assertSession()->statusCodeEquals(Response::HTTP_OK);
+  }
+
+}
diff --git a/web/modules/custom/example/tests/src/Functional/FrontPageTest.php b/web/modules/custom/example/tests/src/Functional/FrontPageTest.php
deleted file mode 100644
index 24ae108..0000000
--- a/web/modules/custom/example/tests/src/Functional/FrontPageTest.php
+++ /dev/null
@@ -1,30 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Drupal\Tests\example\Functional;
-
-use Drupal\Tests\BrowserTestBase;
-use Symfony\Component\HttpFoundation\Response;
-
-final class FrontPageTest extends BrowserTestBase {
-
-  public $defaultTheme = 'stark';
-
-  protected static $modules = ['node', 'views'];
-
-  /** @test */
-  public function the_front_page_loads_for_anonymous_users(): void {
-    $this->config('system.site')
-      ->set('page.front', '/node')
-      ->save(TRUE);
-
-    $this->drupalGet('<front>');
-
-    $assert = $this->assertSession();
-
-    $assert->statusCodeEquals(Response::HTTP_OK);
-    $assert->pageTextContains('No front page content has been created yet.');
-  }
-
-}
diff --git a/web/modules/custom/my_module/my_module.info.yml b/web/modules/custom/my_module/my_module.info.yml
deleted file mode 100644
index 60e27aa..0000000
--- a/web/modules/custom/my_module/my_module.info.yml
+++ /dev/null
@@ -1,3 +0,0 @@
-name: My Module
-type: module
-core_version_requirement: ^10
diff --git a/web/modules/custom/my_module/my_module.routing.yml b/web/modules/custom/my_module/my_module.routing.yml
deleted file mode 100644
index 9683277..0000000
--- a/web/modules/custom/my_module/my_module.routing.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-blog.page:
-  path: /blog
-  defaults:
-    _controller: Drupal\my_module\Controller\BlogPageController
-    _title: Blog
-  requirements:
-    _permission: access content
diff --git a/web/modules/custom/my_module/my_module.services.yml b/web/modules/custom/my_module/my_module.services.yml
deleted file mode 100644
index a97d210..0000000
--- a/web/modules/custom/my_module/my_module.services.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-services:
-  Drupal\my_module\Controller\BlogPageController:
-    autowire: true
-
-  Drupal\my_module\Repository\ArticleRepository:
-    autowire: true
diff --git a/web/modules/custom/my_module/src/Controller/BlogPageController.php b/web/modules/custom/my_module/src/Controller/BlogPageController.php
deleted file mode 100644
index 59b6599..0000000
--- a/web/modules/custom/my_module/src/Controller/BlogPageController.php
+++ /dev/null
@@ -1,51 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Drupal\my_module\Controller;
-
-use Drupal\Core\Entity\EntityTypeManagerInterface;
-use Drupal\Core\Entity\EntityViewBuilderInterface;
-use Drupal\Core\Render\RendererInterface;
-use Drupal\Core\StringTranslation\StringTranslationTrait;
-use Drupal\my_module\Repository\ArticleRepository;
-
-final class BlogPageController {
-
-  use StringTranslationTrait;
-
-  private EntityViewBuilderInterface $nodeViewBuilder;
-
-  public function __construct(
-    private RendererInterface $renderer,
-    EntityTypeManagerInterface $entityTypeManager,
-    private ArticleRepository $articleRepository,
-  ) {
-    $this->nodeViewBuilder = $entityTypeManager->getViewBuilder(entity_type_id: 'node');
-  }
-
-  /**
-   * @return array<string, mixed>
-   */
-  public function __invoke(): array {
-    $articles = $this->articleRepository->getAll();
-
-    if ($articles === []) {
-      return ['#markup' => $this->t('Welcome to my blog!')];
-    }
-
-    $build = [];
-
-    foreach ($articles as $article) {
-      $build[] = $this->nodeViewBuilder->view(
-        entity: $article,
-        view_mode: 'teaser',
-      );
-    }
-
-    return [
-      '#markup' => $this->renderer->render($build),
-    ];
-  }
-
-}
diff --git a/web/modules/custom/my_module/src/Repository/ArticleRepository.php b/web/modules/custom/my_module/src/Repository/ArticleRepository.php
deleted file mode 100644
index 4cacbb0..0000000
--- a/web/modules/custom/my_module/src/Repository/ArticleRepository.php
+++ /dev/null
@@ -1,37 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Drupal\my_module\Repository;
-
-use Drupal\Core\Entity\EntityStorageInterface;
-use Drupal\Core\Entity\EntityTypeManagerInterface;
-use Drupal\node\NodeInterface;
-
-final class ArticleRepository {
-
-  private EntityStorageInterface $nodeStorage;
-
-  public function __construct(EntityTypeManagerInterface $entityTypeManager) {
-    $this->nodeStorage = $entityTypeManager->getStorage(entity_type_id: 'node');
-  }
-
-  /**
-   * @return array<int, NodeInterface>
-   */
-  public function getAll(): array {
-    /** @var array<int, NodeInterface> */
-    $articles = $this->nodeStorage->loadByProperties([
-      'status' => NodeInterface::PUBLISHED,
-      'type' => 'article',
-    ]);
-
-    // Sort the articles by their created time.
-    uasort($articles, function (NodeInterface $a, NodeInterface $b): int {
-      return $a->getCreatedTime() < $b->getCreatedTime() ? 1 : -1;
-    });
-
-    return $articles;
-  }
-
-}
diff --git a/web/modules/custom/my_module/tests/src/Functional/BlogPageTest.php b/web/modules/custom/my_module/tests/src/Functional/BlogPageTest.php
deleted file mode 100644
index f1c9764..0000000
--- a/web/modules/custom/my_module/tests/src/Functional/BlogPageTest.php
+++ /dev/null
@@ -1,50 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Drupal\Tests\my_module\Functional;
-
-use Drupal\Tests\BrowserTestBase;
-use Symfony\Component\HttpFoundation\Response;
-
-final class BlogPageTest extends BrowserTestBase {
-
-  public $defaultTheme = 'stark';
-
-  protected static $modules = [
-    // Core.
-    'node',
-
-    // Custom.
-    'my_module',
-  ];
-
-  /** @test */
-  public function the_blog_page_loads_for_anonymous_users_and_contains_the_right_text(): void {
-    $this->drupalGet('/blog');
-
-    $assert = $this->assertSession();
-
-    $assert->statusCodeEquals(Response::HTTP_OK);
-    $assert->responseContains('<h1>Blog</h1>');
-    $assert->pageTextContains('Welcome to my blog!');
-  }
-
-  /** @test */
-  public function it_shows_articles(): void {
-    $this->createContentType(['type' => 'article']);
-
-    $this->createNode([
-      'title' => 'This is a test article',
-      'type' => 'article',
-    ]);
-
-    $this->drupalGet('/blog');
-
-    $assert = $this->assertSession();
-
-    $assert->statusCodeEquals(Response::HTTP_OK);
-    $assert->pageTextContains('This is a test article');
-  }
-
-}
diff --git a/web/modules/custom/my_module/tests/src/Kernel/Repository/ArticleRepositoryTest.php b/web/modules/custom/my_module/tests/src/Kernel/Repository/ArticleRepositoryTest.php
deleted file mode 100644
index 91799e3..0000000
--- a/web/modules/custom/my_module/tests/src/Kernel/Repository/ArticleRepositoryTest.php
+++ /dev/null
@@ -1,98 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Drupal\Tests\my_module\Kernel\Repository;
-
-use Drupal\Core\Datetime\DrupalDateTime;
-use Drupal\KernelTests\Core\Entity\EntityKernelTestBase;
-use Drupal\my_module\Repository\ArticleRepository;
-use Drupal\node\Entity\Node;
-use Drupal\Tests\node\Traits\NodeCreationTrait;
-
-final class ArticleRepositoryTest extends EntityKernelTestBase {
-
-  use NodeCreationTrait;
-
-  protected $strictConfigSchema = FALSE;
-
-  public static $modules = [
-    'node',
-    'my_module',
-  ];
-
-  protected function setUp(): void {
-    parent::setUp();
-
-    $this->installSchema(module: 'node', tables: ['node_access']);
-
-    $this->installConfig([
-      'filter',
-    ]);
-  }
-
-  /** @test */
-  public function nodes_that_are_not_articles_are_not_returned() {
-    $this->createNode(['type' => 'article'])->save();
-    $this->createNode(['type' => 'page'])->save();
-    $this->createNode(['type' => 'article'])->save();
-    $this->createNode(['type' => 'page'])->save();
-    $this->createNode(['type' => 'article'])->save();
-
-    $this->assertCount(5, Node::loadMultiple());
-
-    $repository = $this->container->get(ArticleRepository::class);
-    $articles = $repository->getAll();
-
-    $this->assertCount(3, $articles);
-  }
-
-  /** @test */
-  public function only_published_articles_are_returned() {
-    $this->createNode(['type' => 'article', 'status' => Node::PUBLISHED])->save();
-    $this->createNode(['type' => 'article', 'status' => Node::NOT_PUBLISHED])->save();
-    $this->createNode(['type' => 'article', 'status' => Node::PUBLISHED])->save();
-    $this->createNode(['type' => 'article', 'status' => Node::NOT_PUBLISHED])->save();
-    $this->createNode(['type' => 'article', 'status' => Node::PUBLISHED])->save();
-
-    $repository = $this->container->get(ArticleRepository::class);
-    $articles = $repository->getAll();
-
-    $this->assertCount(3, $articles);
-  }
-
-  /** @test */
-  public function nodes_are_ordered_by_date_and_returned_newest_first() {
-    $this->createNode([
-      'type' => 'article',
-      'created' => (new DrupalDateTime('-2 days'))->getTimestamp(),
-    ]);
-
-    $this->createNode([
-      'type' => 'article',
-      'created' => (new DrupalDateTime('-1 week'))->getTimestamp(),
-    ]);
-
-    $this->createNode([
-      'type' => 'article',
-      'created' => (new DrupalDateTime('-1 hour'))->getTimestamp(),
-    ]);
-
-    $this->createNode([
-      'type' => 'article',
-      'created' => (new DrupalDateTime('-1 year'))->getTimestamp(),
-    ]);
-
-    $this->createNode([
-      'type' => 'article',
-      'created' => (new DrupalDateTime('-1 month'))->getTimestamp(),
-    ]);
-
-    $repository = $this->container->get(ArticleRepository::class);
-    $nodes = $repository->getAll();
-    $nodeIds = array_keys($nodes);
-
-    $this->assertSame([3, 1, 2, 5, 4], $nodeIds);
-  }
-
-}