diff --git a/modules/styleguide_static/fixtures/paragraphs.json b/modules/styleguide_static/fixtures/paragraphs.json
new file mode 100644
index 0000000000000000000000000000000000000000..16c66b5a2cf3b774aea40c8f46eafd603bd7a943
--- /dev/null
+++ b/modules/styleguide_static/fixtures/paragraphs.json
@@ -0,0 +1 @@
+["Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae enim rutrum, viverra ipsum a, molestie orci. Nam laoreet accumsan velit. Vivamus euismod eros arcu, nec vestibulum quam euismod in. Curabitur elementum, sem eget scelerisque suscipit, mauris enim convallis purus, eget porttitor mi magna et dolor. Aliquam tempor ligula iaculis elit efficitur, ac volutpat erat hendrerit. Sed id lacus semper, suscipit mauris id, fermentum leo. Integer gravida maximus dui, vel consequat nunc consectetur condimentum. Cras pulvinar mi vitae accumsan molestie. Cras tincidunt vestibulum velit et egestas.","Suspendisse aliquam, turpis porttitor elementum lobortis, nulla felis vehicula ligula, nec lobortis est nisi nec nulla. Ut laoreet tempus blandit. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Vestibulum at est et dolor tempor varius vitae quis purus. Mauris eu elit nec tortor tincidunt vestibulum a at velit. In hac habitasse platea dictumst. In hac habitasse platea dictumst. Phasellus sit amet ipsum eu orci pulvinar laoreet sed vitae quam. Integer sit amet quam placerat, feugiat nulla ac, ornare eros. Vivamus non metus sodales neque placerat pulvinar. Quisque nibh elit, mollis at leo in, varius ullamcorper urna. Aliquam faucibus odio odio.","Vivamus lobortis leo sit amet arcu efficitur scelerisque. Nulla suscipit, urna id bibendum suscipit, augue sapien sagittis neque, pretium eleifend dui tellus nec elit. Nulla lacus turpis, interdum eu viverra et, cursus nec leo. In a vulputate ipsum, eu tristique lorem. Etiam vitae turpis vel dui molestie rhoncus. Pellentesque at viverra ligula, vitae auctor odio. Proin ex mauris, porttitor ut ante in, sagittis luctus sapien. Aenean orci magna, maximus sit amet tortor sed, efficitur eleifend dui. Etiam iaculis lacinia maximus. Etiam finibus nunc ac lobortis pellentesque. Fusce dictum commodo efficitur. Suspendisse eu diam quis ante tincidunt convallis. Quisque tincidunt augue dolor.","Donec ornare sapien in sodales consequat. Nulla consectetur sollicitudin velit. Suspendisse eu tortor vitae neque tincidunt volutpat sollicitudin vel enim. Aenean porttitor tempus efficitur. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Proin varius nibh non est euismod volutpat. Ut non egestas mi. In sit amet ullamcorper leo. Nunc auctor fringilla diam id accumsan. Phasellus tempus et eros eu tempor. Quisque non molestie felis. Vestibulum gravida, augue quis venenatis porttitor, sem mauris viverra felis, sit amet eleifend dui tortor ac augue.","Ut mauris tortor, condimentum eget lectus vel, lacinia ultrices tellus. Maecenas varius rhoncus odio sit amet convallis. Integer ac orci mauris. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Duis eu hendrerit velit. In mattis orci et tortor volutpat, nec semper purus facilisis. Cras dapibus pharetra eros non aliquet. Pellentesque eu ex ac leo malesuada ullamcorper. Aenean hendrerit enim est. Vivamus imperdiet, est convallis ultricies euismod, dolor dui rutrum felis, non fermentum elit ipsum nec risus. Morbi vehicula neque sed facilisis sodales. Maecenas tincidunt tristique ex, in scelerisque ligula bibendum id. Ut suscipit ultrices commodo. Integer convallis id urna eget tempor. In nec augue sed sem lobortis pellentesque.","Phasellus eget libero felis. Vestibulum at magna nec erat maximus facilisis sit amet ut mi. Donec egestas enim nec nulla sagittis tempus. Cras lobortis est vitae neque pretium fringilla ac et justo. Curabitur molestie pharetra hendrerit. Donec et ex suscipit, venenatis odio vitae, porta lacus. Cras lobortis a nunc sit amet lobortis. Etiam faucibus urna et est venenatis commodo. Nullam eu scelerisque nisl, sed sodales lectus. Sed iaculis lacus id quam imperdiet, id mattis nunc tempus. Etiam varius id nisi sed faucibus. Fusce metus tellus, dapibus at orci placerat, vulputate feugiat arcu. Donec mi libero, dapibus eu lobortis et, lacinia et felis. Quisque tincidunt magna sem, nec pulvinar sem condimentum vel. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Donec cursus lorem vitae eleifend condimentum.","Aliquam id condimentum dui, id porttitor turpis. Nunc id metus diam. Nam ac lectus blandit, sagittis magna non, fermentum elit. Nam nec tempor sapien. Donec commodo lectus vel quam aliquet vestibulum. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Mauris varius ipsum tellus. Donec sollicitudin nulla sem, eget volutpat urna dignissim sed. Pellentesque ut sodales ipsum. Sed in ex lectus. Suspendisse interdum aliquet ipsum vel vulputate. Sed eget imperdiet velit. Donec sem justo, commodo non dui in, sagittis ultricies mauris. Suspendisse leo lorem, tincidunt ac nulla id, hendrerit congue sem. Duis rutrum vel tortor eget ullamcorper.","Fusce fringilla leo eu sagittis vehicula. Cras feugiat purus aliquam risus rutrum, non eleifend augue commodo. Sed imperdiet magna quis nisi vulputate, non consequat lacus tincidunt. Duis maximus laoreet elit, rutrum malesuada justo vehicula at. Suspendisse nec ligula posuere, euismod neque in, pulvinar eros. Vivamus eu interdum dui. Nulla ut metus non eros finibus ultrices eu vitae risus. Nunc hendrerit mi eu tincidunt dictum. Suspendisse ac diam tincidunt, aliquet metus nec, mollis orci.","In odio ante, tincidunt a ultrices sit amet, tempus non dui. Vestibulum quam tellus, hendrerit a sagittis at, scelerisque sit amet nisi. Nunc ornare efficitur ipsum vel porttitor. Donec nisi ex, vulputate gravida laoreet hendrerit, vulputate nec est. Maecenas vehicula non erat efficitur ultricies. Curabitur id urna luctus mi sodales efficitur vel id neque. Aenean convallis a ex eu commodo. Donec sodales tortor eu condimentum tempus. Curabitur nec suscipit mi.","Aliquam sagittis blandit tortor, ac faucibus augue. Curabitur ullamcorper ipsum mi, vel porta orci pellentesque vitae. Aenean commodo in enim volutpat congue. Ut sit amet lorem magna. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Nullam suscipit, lorem eu congue fermentum, mauris lorem facilisis ex, pretium eleifend sem magna sit amet dolor. Sed eget tellus nec erat ullamcorper euismod sed vitae lectus. Duis sit amet massa a odio malesuada mattis ut ut leo. Cras velit justo, sodales id placerat at, rutrum vel sapien. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas."]
diff --git a/modules/styleguide_static/fixtures/sentences.json b/modules/styleguide_static/fixtures/sentences.json
new file mode 100644
index 0000000000000000000000000000000000000000..e4fc686248c3cff14d2bbec51a5bb3fbeadafc3f
--- /dev/null
+++ b/modules/styleguide_static/fixtures/sentences.json
@@ -0,0 +1 @@
+["Lorem ipsum dolor sit amet, consectetur adipiscing elit.","Aenean et purus in odio posuere tristique rutrum eu turpis.","Nullam ut felis nec eros tempus consectetur ut id dui.","Vestibulum sed tortor sed erat sodales venenatis et eu mi.","Sed placerat tortor sed sapien sollicitudin, quis tincidunt nulla cursus.","Etiam scelerisque diam non risus suscipit imperdiet.","Vivamus iaculis erat et urna rhoncus auctor.","In eget nunc in odio elementum maximus sed vel lorem.","Nullam et purus quis neque suscipit hendrerit.","Integer ac erat a nisi pellentesque fringilla.","Donec vel orci a nibh scelerisque lacinia eget ut felis.","Maecenas aliquam ante iaculis ante aliquet vestibulum.","Quisque at enim non tortor pharetra laoreet.","Morbi sed eros laoreet, venenatis libero sit amet, placerat nulla.","Morbi consequat nisl et arcu pharetra hendrerit.","Proin eu ipsum id velit venenatis mollis et aliquam magna.","Nunc tempor mauris eget odio elementum, nec euismod quam molestie.","Proin id augue varius, ornare turpis sed, feugiat quam.","Fusce semper massa varius erat laoreet, eu viverra nulla sagittis.","Vivamus ac dolor auctor magna hendrerit scelerisque.","Curabitur commodo sapien quis odio iaculis ultricies.","Mauris tristique magna sed luctus pretium.","Praesent tempus neque ut elit fringilla, sed efficitur lorem aliquet.","Duis rutrum tortor vitae est bibendum feugiat.","In vel sem id nulla viverra rutrum.","Duis vitae risus id nulla ultricies eleifend.","Vestibulum vitae justo dapibus arcu dictum tempor gravida sed ex.","Sed efficitur neque et erat finibus, et blandit urna fermentum.","Etiam sit amet nibh id nulla finibus porttitor id et ex.","Etiam egestas massa sit amet nulla dapibus, dictum tempor felis imperdiet.","Phasellus et nisi quis nisi rhoncus commodo eget tincidunt erat.","Curabitur eget ex malesuada, rhoncus nunc vehicula, varius elit.","Ut sed ligula posuere, tincidunt ante eu, ultrices nisl.","Suspendisse hendrerit justo a mi hendrerit mollis.","Etiam tristique erat sit amet nunc efficitur, in hendrerit ipsum mollis.","Quisque finibus est eu metus commodo, non luctus mauris sollicitudin."]
diff --git a/modules/styleguide_static/fixtures/words.json b/modules/styleguide_static/fixtures/words.json
new file mode 100644
index 0000000000000000000000000000000000000000..3f0b13546262d3fb0143d7bffe4a50fa29517baf
--- /dev/null
+++ b/modules/styleguide_static/fixtures/words.json
@@ -0,0 +1 @@
+["Lorem", "ipsum", "dolor", "sit", "amet,", "consectetur", "adipiscing", "elit.", "Cras", "vitae", "est", "sodales,", "elementum", "libero", "non,", "tempor", "magna.", "Sed", "non", "risus", "nec", "nibh", "bibendum", "ultrices.", "In", "hac", "habitasse", "platea", "dictumst.", "Proin", "tempus", "neque", "at", "tempus", "sollicitudin.", "Sed", "finibus", "massa", "sed", "nunc", "tempus", "sodales.", "Nulla", "quam", "justo,", "pulvinar", "et", "nisl", "sit", "amet,", "convallis", "aliquet", "elit.", "Orci", "varius", "natoque", "penatibus", "et", "magnis", "dis", "parturient", "montes,", "nascetur", "ridiculus", "mus.", "Aliquam", "erat", "volutpat.", "Sed", "vel", "dapibus", "mi.", "Pellentesque", "scelerisque", "mi", "luctus", "tortor", "tempor", "sollicitudin.", "Proin", "arcu", "massa,", "congue", "eu", "pellentesque", "et,", "mattis", "porta", "nisi.", "Proin", "elementum", "blandit", "eleifend.", "Nunc", "nec", "nisl", "id", "diam", "tristique", "tempus", "ac", "sit", "amet", "mi.", "Curabitur", "ac", "urna", "tortor.", "Vivamus", "porta", "quis", "nisi", "quis", "posuere.", "Morbi", "odio", "elit,", "commodo", "non", "lacinia", "et,", "convallis", "id", "purus"]
diff --git a/modules/styleguide_static/src/StaticGenerator.php b/modules/styleguide_static/src/StaticGenerator.php
new file mode 100644
index 0000000000000000000000000000000000000000..7ffb01a16ff82c2a80f6993ccb9b5c07ec564405
--- /dev/null
+++ b/modules/styleguide_static/src/StaticGenerator.php
@@ -0,0 +1,176 @@
+<?php
+
+namespace Drupal\styleguide_static;
+
+use Drupal\Component\Serialization\Json;
+use Drupal\Core\Config\ConfigFactoryInterface;
+use Drupal\Core\Pager\PagerManagerInterface;
+use Drupal\Core\Render\Markup;
+use Drupal\Core\Render\RendererInterface;
+use Drupal\Core\Extension\ModuleExtensionList;
+use Drupal\styleguide\Generator;
+use Symfony\Component\HttpFoundation\RequestStack;
+use function count;
+use function function_exists;
+use function in_array;
+
+/**
+ * Class Generator.
+ *
+ * @package Drupal\styleguide
+ */
+class StaticGenerator extends Generator {
+
+  /**
+   * An array of latin words.
+   *
+   * @var array|string[]
+   */
+  protected $words;
+
+  /**
+   * An array of latin sentences.
+   *
+   * @var array|string[]
+   */
+  protected $sentences;
+
+  /**
+   * An array of latin paragraphs.
+   *
+   * @var array|string[]
+   */
+  protected $paragraphs;
+
+  /**
+   * {@inheritdoc}
+   */
+  public function __construct(
+    RequestStack $requestStack,
+    PagerManagerInterface $pagerManager,
+    ConfigFactoryInterface $configFactory,
+    RendererInterface $renderer,
+    protected ModuleExtensionList $moduleExtensionList,
+  ) {
+    parent::__construct($requestStack, $pagerManager, $configFactory, $renderer);
+
+    // @todo These should be cached.
+    // @todo Add hooks for extensibility.
+    $module_path = $this->moduleExtensionList->getPath('styleguide_static');
+    $this->words = Json::decode(file_get_contents($module_path . '/fixtures/words.json'));
+    $this->sentences = Json::decode(file_get_contents($module_path . '/fixtures/sentences.json'));
+    $this->paragraphs = Json::decode(file_get_contents($module_path . '/fixtures/paragraphs.json'));
+  }
+
+  /**
+   * Gets a list of latin words.
+   *
+   * @param int $size
+   *   The number of words to get.
+   *
+   * @return array|string[]
+   *   The latin words.
+   */
+  protected function getStaticWords($size) {
+    static $j = 0;
+    $words = [];
+    for ($i = 0; $i < $size; $i++) {
+      $z = $j + $i;
+      if ($z >= count($this->words)) {
+        $j = 0;
+      }
+      $words[] = $this->words[$i + $j++];
+    }
+    return $words;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function words($size = 1, $case = 'strtolower') {
+    $words = $this->getStaticWords($size);
+    $words = implode(' ', $words);
+    $functions = ['ucfirst', 'ucwords', 'strtoupper', 'strtolower'];
+    if ($case !== NULL && function_exists($case) && in_array($case, $functions)) {
+      $words = $case($words);
+    }
+    return $words;
+  }
+
+  /**
+   * Gets a static sentence from the list of sentences.
+   *
+   * @return string
+   *   The static sentence.
+   */
+  protected function getStaticSentence() {
+    static $i = 0;
+    if ($i >= count($this->sentences)) {
+      $i = 0;
+    }
+    return $this->sentences[$i++];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function sentence($link = FALSE) {
+    $sentence = $this->getStaticSentence();
+    if ($link) {
+      $explode = explode(' ', $sentence);
+      $link_element = [
+        '#type' => 'link',
+        '#title' => $explode[0],
+        '#url' => $link,
+        '#options' => [
+          'attributes' => [],
+          'html' => FALSE,
+        ],
+        '#text' => $explode[0],
+      ];
+      $explode[0] = $this->renderer->render($link_element);
+      $sentence = implode(' ', $explode);
+    }
+    return Markup::create($sentence . '.');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function lorem($size = 5, $words = 0, $case = 'mixed', $returns = TRUE, $punctuation = TRUE, $array = FALSE) {
+    $text = '';
+    for ($i = 0; $i < $size; ++$i) {
+      $text .= $this->paragraphs[$i % count($this->paragraphs)];
+    }
+    if (!$punctuation) {
+      $text = str_replace([',', '.'], '', $text);
+    }
+    switch ($case) {
+      case 'mixed':
+        break;
+
+      case 'upper':
+        $text = strtoupper($text);
+        break;
+
+      case 'lower':
+        $text = strtolower($text);
+        break;
+    }
+    $graphs = explode("\n\n", $text);
+    $text = array_slice($graphs, 0, $size);
+    $spacer = ' ';
+    if ($returns) {
+      $spacer = "\n\n";
+    }
+    if ($words > 0) {
+      $elements = explode(' ', implode(' ', $text));
+      return implode(' ', array_slice($elements, 0, $words));
+    }
+    if (!$array) {
+      return implode($spacer, $text);
+    }
+    return $text;
+  }
+
+}
diff --git a/modules/styleguide_static/src/StyleguideStaticServiceProvider.php b/modules/styleguide_static/src/StyleguideStaticServiceProvider.php
new file mode 100644
index 0000000000000000000000000000000000000000..fc4b6e3f65d1eb69d164de2db8b55994a4fbcd9b
--- /dev/null
+++ b/modules/styleguide_static/src/StyleguideStaticServiceProvider.php
@@ -0,0 +1,25 @@
+<?php
+
+namespace Drupal\styleguide_static;
+
+use Drupal\Core\DependencyInjection\ContainerBuilder;
+use Drupal\Core\DependencyInjection\ServiceProviderBase;
+use Symfony\Component\DependencyInjection\Reference;
+
+/**
+ * Modifies the styleguide generator service.
+ */
+class StyleguideStaticServiceProvider extends ServiceProviderBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function alter(ContainerBuilder $container) {
+    if ($container->hasDefinition('styleguide.generator')) {
+      $container->getDefinition('styleguide.generator')
+        ->setClass('Drupal\styleguide_static\StaticGenerator')
+        ->addArgument(new Reference('extension.list.module'));
+    }
+  }
+
+}
diff --git a/modules/styleguide_static/styleguide_static.info.yml b/modules/styleguide_static/styleguide_static.info.yml
new file mode 100644
index 0000000000000000000000000000000000000000..2ec9a40c11de592f63fabcb21158ec093aba25b6
--- /dev/null
+++ b/modules/styleguide_static/styleguide_static.info.yml
@@ -0,0 +1,5 @@
+name: Style guide static
+type: module
+description: 'Adds a generator that will output predictable markup.'
+core_version_requirement: ^10.3 || ^11
+package: styleguide