diff --git a/.gitignore b/.gitignore
index 86ea30be47499a396c8fe794e51ee11324d0b264..217cce41b61f4c73b970c51218d58c14bfe251c4 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,5 +1,6 @@
 /config.ini
 /esbuild-meta-docs.json
 /node_modules
+/sqlite-vss
 /vendor
 /*.cache
diff --git a/app/Template/StaticPageLayout/Turbo.php b/app/Template/StaticPageLayout/Turbo.php
index fe00a6ce5372f4f2bb02721c7d52548db4b4bf91..21f0c601289414ad4651e148210b712ae2578ff5 100644
--- a/app/Template/StaticPageLayout/Turbo.php
+++ b/app/Template/StaticPageLayout/Turbo.php
@@ -65,7 +65,7 @@ abstract readonly class Turbo extends StaticPageLayout
             <title>{$staticPage->frontMatter->title}</title>
             <link rel="preconnect" href="https://fonts.googleapis.com">
             <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
-            <link href="https://fonts.googleapis.com/css2?family=Atkinson+Hyperlegible&family=Lora&family=Sometype+Mono&display=swap" rel="stylesheet">
+            <link href="https://fonts.googleapis.com/css2?family=Atkinson+Hyperlegible&family=Sometype+Mono&display=swap" rel="stylesheet">
         HTML;
         yield from $this->renderMeta($staticPage);
         yield $renderedPreloads;
diff --git a/docs/pages/docs/features/database/index.md b/docs/pages/docs/features/database/index.md
index 17731be282c9c05daf179fb101c9b1f090a303f0..e0e1f49b4ff7344d7fa75df9c9659cc3ac391314 100644
--- a/docs/pages/docs/features/database/index.md
+++ b/docs/pages/docs/features/database/index.md
@@ -3,12 +3,12 @@ collections:
     - documents
 layout: dm:document
 parent: docs/features/index
-title: Database
+title: SQL Database
 description: >
     Learn how Resonance uses connection pools. Create and reuse queries, 
     create database entities, and integrate with a migration tool.
 ---
 
-# Database
+# SQL Database
 
-{{docs/features/database/*/index!docs/features/database/index}}
+{{docs/features/database/*/index}}
diff --git a/resources/css/docs-page-homepage.css b/resources/css/docs-page-homepage.css
index 0091c94996e7b0afbc10bf110f5cc2cee175ade6..670b01453f7dea0f583358e025e7f8ad9d46edf1 100644
--- a/resources/css/docs-page-homepage.css
+++ b/resources/css/docs-page-homepage.css
@@ -12,7 +12,7 @@
     padding-top: 20px;
   }
   @media screen and (min-width: 1024px) {
-    padding-top: 60px;
+    padding-top: 140px;
   }
 }
 
@@ -86,7 +86,7 @@ h2.homepage__example__title {
     padding: 120px 0 60px 0;
   }
   @media screen and (min-width: 1024px) {
-    padding: 160px 0;
+    padding: 160px 0 120px 0;
   }
 }
 
diff --git a/src/Command/LlamaCppGenerate.php b/src/Command/LlamaCppGenerate.php
index 681b789e675d9ae640cc2b459891d2bc38301d11..2fab6a39bbb45ec2bfacfbf71df945891ced0237 100644
--- a/src/Command/LlamaCppGenerate.php
+++ b/src/Command/LlamaCppGenerate.php
@@ -7,12 +7,16 @@ namespace Distantmagic\Resonance\Command;
 use Distantmagic\Resonance\CoroutineCommand;
 use Distantmagic\Resonance\LlamaCppClient;
 use Distantmagic\Resonance\SwooleConfiguration;
+use RuntimeException;
 use Symfony\Component\Console\Input\InputArgument;
 use Symfony\Component\Console\Input\InputInterface;
 use Symfony\Component\Console\Output\OutputInterface;
 
 abstract class LlamaCppGenerate extends CoroutineCommand
 {
+    /**
+     * @param non-empty-string $prompt
+     */
     abstract protected function executeLlamaCppCommand(InputInterface $input, OutputInterface $output, string $prompt): int;
 
     public function __construct(
@@ -38,6 +42,10 @@ abstract class LlamaCppGenerate extends CoroutineCommand
          */
         $prompt = $input->getArgument('prompt');
 
+        if (empty($prompt)) {
+            throw new RuntimeException('Prompt cannot be empty');
+        }
+
         return $this->executeLlamaCppCommand($input, $output, $prompt);
     }
 }
diff --git a/src/Command/LlamaCppGenerate/Completion.php b/src/Command/LlamaCppGenerate/Completion.php
index 39c339224845c65336595d610397eaa0f4edf27e..7d39aea87b9f5c181202e6e04cf1bcbdbf731d30 100644
--- a/src/Command/LlamaCppGenerate/Completion.php
+++ b/src/Command/LlamaCppGenerate/Completion.php
@@ -8,7 +8,7 @@ use Distantmagic\Resonance\Attribute\ConsoleCommand;
 use Distantmagic\Resonance\Command;
 use Distantmagic\Resonance\Command\LlamaCppGenerate;
 use Distantmagic\Resonance\LlamaCppCompletionRequest;
-use Distantmagic\Resonance\LlamaCppPromptTemplate\MistralInstructChat;
+use Distantmagic\Resonance\LlmPromptTemplate\MistralInstructChat;
 use Symfony\Component\Console\Input\InputInterface;
 use Symfony\Component\Console\Output\OutputInterface;
 
diff --git a/src/Command/StaticPagesDumpContent.php b/src/Command/StaticPagesDumpContent.php
index 155d12e50be43ac4a259249b4fc6c1f161421272..6760d585cae3403f1d36406bb83522912b79dc35 100644
--- a/src/Command/StaticPagesDumpContent.php
+++ b/src/Command/StaticPagesDumpContent.php
@@ -12,7 +12,7 @@ use Symfony\Component\Console\Output\OutputInterface;
 
 #[ConsoleCommand(
     name: 'static-pages:dump-content',
-    description: 'Dumps static pages content. JSONL format by default.'
+    description: 'Dumps static pages content into JSONL'
 )]
 final class StaticPagesDumpContent extends Command
 {
diff --git a/src/Command/Watch.php b/src/Command/Watch.php
index e7a941a6cbf8ea20c057a69c4ed12b9f69f4be0b..796e172364dc50c4b62899614e614f6f404be8d3 100644
--- a/src/Command/Watch.php
+++ b/src/Command/Watch.php
@@ -17,7 +17,7 @@ use Symfony\Component\Console\Output\OutputInterface;
 
 #[ConsoleCommand(
     name: 'watch:command',
-    description: 'Watch project files for changes (needs inotify)'
+    description: 'Watch project files for changes (requires inotify)'
 )]
 final class Watch extends Command
 {
diff --git a/src/CommonMarkTableOfContentsBuilder.php b/src/CommonMarkTableOfContentsBuilder.php
index 549c5e6a2d1f56083edf2fda7d0ae7ff2b02b85f..cf129132d92f108c869d67f0b709019fcc076718 100644
--- a/src/CommonMarkTableOfContentsBuilder.php
+++ b/src/CommonMarkTableOfContentsBuilder.php
@@ -19,9 +19,8 @@ readonly class CommonMarkTableOfContentsBuilder
      */
     public function getTableOfContentsLinks(Document $document): Generator
     {
-        foreach ($this->getHeadings($document) as $heading) {
+        foreach ($this->getHeadings($document) as $heading => $headingText) {
             $headingLevel = $heading->getLevel();
-            $headingText = $this->getHeadingText($heading);
 
             foreach ($this->getHeadingLinks($heading) as $headingPermalink) {
                 yield new CommonMarkTableOfContentsLink(
@@ -46,13 +45,13 @@ readonly class CommonMarkTableOfContentsBuilder
     }
 
     /**
-     * @return Generator<Heading>
+     * @return Generator<Heading,string>
      */
     private function getHeadings(Document $document): Generator
     {
         foreach ($document->iterator(NodeIterator::FLAG_BLOCKS_ONLY) as $node) {
             if ($node instanceof Heading) {
-                yield $node;
+                yield $node => $this->getHeadingText($node);
             }
         }
     }
diff --git a/src/LlamaCppClient.php b/src/LlamaCppClient.php
index facbdaecec53e3521010ec4387e2d82efdbaf762..163c830225a9477ad57212228d986263f3bc7411 100644
--- a/src/LlamaCppClient.php
+++ b/src/LlamaCppClient.php
@@ -53,14 +53,16 @@ readonly class LlamaCppClient
         $this->assertStatusCode($curlHandle, 200);
 
         /**
-         * @var object{ embedding: array<float> } $responseData
+         * @var object{ embedding: list<float> } $responseData
          */
         $responseData = $this
             ->jsonSerializer
             ->unserialize($responseContent)
         ;
 
-        return new LlamaCppEmbedding($responseData->embedding);
+        return new LlamaCppEmbedding(
+            embedding: $responseData->embedding,
+        );
     }
 
     /**
diff --git a/src/LlamaCppCompletionRequest.php b/src/LlamaCppCompletionRequest.php
index 484f68ce54f4188e09418dd5aecead206b3e9ad4..3083efc4a3ae6a47544c4d2da512cbff7148d301 100644
--- a/src/LlamaCppCompletionRequest.php
+++ b/src/LlamaCppCompletionRequest.php
@@ -9,7 +9,7 @@ use JsonSerializable;
 readonly class LlamaCppCompletionRequest implements JsonSerializable
 {
     public function __construct(
-        public LlamaCppPromptTemplate $promptTemplate,
+        public LlmPromptTemplate $promptTemplate,
     ) {}
 
     public function jsonSerialize(): array
diff --git a/src/LlamaCppEmbedding.php b/src/LlamaCppEmbedding.php
index a779d6f975447bad4bda90b13d726a0480e5de5b..0cea51a7c5b77ec422104deda716a161b7c0f897 100644
--- a/src/LlamaCppEmbedding.php
+++ b/src/LlamaCppEmbedding.php
@@ -7,7 +7,7 @@ namespace Distantmagic\Resonance;
 readonly class LlamaCppEmbedding
 {
     /**
-     * @param array<float> $embedding
+     * @param list<float> $embedding
      */
     public function __construct(
         public array $embedding,
diff --git a/src/LlamaCppEmbeddingRequest.php b/src/LlamaCppEmbeddingRequest.php
index 39985104510100d5265b363e1a7791cbc9d88148..5fc8d8c95c3fc26bbd4d761630f40a030dddaea7 100644
--- a/src/LlamaCppEmbeddingRequest.php
+++ b/src/LlamaCppEmbeddingRequest.php
@@ -8,9 +8,13 @@ use JsonSerializable;
 
 readonly class LlamaCppEmbeddingRequest implements JsonSerializable
 {
+    /**
+     * @param non-empty-string $content
+     */
     public function __construct(
         public string $content,
-    ) {}
+    ) {
+    }
 
     public function jsonSerialize(): array
     {
diff --git a/src/LlamaCppPromptTemplate.php b/src/LlamaCppPromptTemplate.php
deleted file mode 100644
index 73d4d80426a0cbb9031c8d3fa34eb95fdf39daee..0000000000000000000000000000000000000000
--- a/src/LlamaCppPromptTemplate.php
+++ /dev/null
@@ -1,16 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Distantmagic\Resonance;
-
-use JsonSerializable;
-use Stringable;
-
-abstract readonly class LlamaCppPromptTemplate implements JsonSerializable, Stringable
-{
-    public function jsonSerialize(): string
-    {
-        return (string) $this;
-    }
-}
diff --git a/src/LlamaCppPromptTemplate/MistralInstructChat.php b/src/LlamaCppPromptTemplate/MistralInstructChat.php
deleted file mode 100644
index 3b2e0ac121a4516b3d0ba036ccc99e14fadcb55c..0000000000000000000000000000000000000000
--- a/src/LlamaCppPromptTemplate/MistralInstructChat.php
+++ /dev/null
@@ -1,20 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Distantmagic\Resonance\LlamaCppPromptTemplate;
-
-use Distantmagic\Resonance\LlamaCppPromptTemplate;
-
-readonly class MistralInstructChat extends LlamaCppPromptTemplate
-{
-    public function __construct(private string $prompt) {}
-
-    public function __toString(): string
-    {
-        return sprintf(
-            '[INST]%s[/INST]',
-            $this->prompt,
-        );
-    }
-}
diff --git a/src/LlamaCppPromptTemplate/Phi2Question.php b/src/LlamaCppPromptTemplate/Phi2Question.php
deleted file mode 100644
index 493105a6bd5b296550fc1d0b635566ff71bca712..0000000000000000000000000000000000000000
--- a/src/LlamaCppPromptTemplate/Phi2Question.php
+++ /dev/null
@@ -1,20 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Distantmagic\Resonance\LlamaCppPromptTemplate;
-
-use Distantmagic\Resonance\LlamaCppPromptTemplate;
-
-readonly class Phi2Question extends LlamaCppPromptTemplate
-{
-    public function __construct(private string $prompt) {}
-
-    public function __toString(): string
-    {
-        return sprintf(
-            "Question: %s\nAnswer: ",
-            $this->prompt,
-        );
-    }
-}
diff --git a/src/LlamaCppPromptTemplate/Plain.php b/src/LlamaCppPromptTemplate/Plain.php
deleted file mode 100644
index 3e28b97525afa2d5efdccf0ef835727165b392f4..0000000000000000000000000000000000000000
--- a/src/LlamaCppPromptTemplate/Plain.php
+++ /dev/null
@@ -1,17 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Distantmagic\Resonance\LlamaCppPromptTemplate;
-
-use Distantmagic\Resonance\LlamaCppPromptTemplate;
-
-readonly class Plain extends LlamaCppPromptTemplate
-{
-    public function __construct(private string $prompt) {}
-
-    public function __toString(): string
-    {
-        return $this->prompt;
-    }
-}
diff --git a/src/StaticPageAggregate.php b/src/StaticPageAggregate.php
index c00cf2ba7f5b35771aa420d7b99c519f19c4842b..1beda7d1f4a401976a6b42736a217c0c9068fb87 100644
--- a/src/StaticPageAggregate.php
+++ b/src/StaticPageAggregate.php
@@ -9,7 +9,7 @@ use Ds\Map;
 readonly class StaticPageAggregate
 {
     /**
-     * @var Map<string, StaticPage>
+     * @var Map<string,StaticPage>
      */
     public Map $staticPages;