` system.
+
+## Files
+
+- **group.blade.php** -- Tab group container. Wraps tab triggers and manages selected state.
+- **panel.blade.php** -- Tab content panel. Shows/hides based on which tab is selected.
+
+## Usage
+
+```blade
+
+ General
+ Advanced
+
+General content
+Advanced content
+```
diff --git a/src/Core/Front/Components/View/Blade/table/CLAUDE.md b/src/Core/Front/Components/View/Blade/table/CLAUDE.md
new file mode 100644
index 0000000..2f475ac
--- /dev/null
+++ b/src/Core/Front/Components/View/Blade/table/CLAUDE.md
@@ -0,0 +1,28 @@
+# Blade/table
+
+Table sub-components for data tables.
+
+## Files
+
+- **cell.blade.php** -- Individual table cell (`| `)
+- **column.blade.php** -- Column header (` | `) with optional sorting
+- **columns.blade.php** -- Column header row container (``)
+- **row.blade.php** -- Table row (` `)
+- **rows.blade.php** -- Table body container (` | `)
+
+## Usage
+
+```blade
+
+
+ Name
+ Status
+
+
+
+ Item 1
+ Active
+
+
+
+```
diff --git a/src/Core/Front/Components/View/Blade/web/CLAUDE.md b/src/Core/Front/Components/View/Blade/web/CLAUDE.md
new file mode 100644
index 0000000..26715d9
--- /dev/null
+++ b/src/Core/Front/Components/View/Blade/web/CLAUDE.md
@@ -0,0 +1,11 @@
+# Blade/web
+
+Public-facing page templates for workspace websites. Registered under the `web::` namespace.
+
+## Files
+
+- **home.blade.php** -- Workspace homepage template
+- **page.blade.php** -- Generic content page template
+- **waitlist.blade.php** -- Pre-launch waitlist/signup page template
+
+These are rendered for workspace domains resolved by `FindDomainRecord` middleware. Used via `web::home`, `web::page`, `web::waitlist` view references.
diff --git a/src/Core/Front/Services/CLAUDE.md b/src/Core/Front/Services/CLAUDE.md
new file mode 100644
index 0000000..2b987d5
--- /dev/null
+++ b/src/Core/Front/Services/CLAUDE.md
@@ -0,0 +1,18 @@
+# Front/Services
+
+Shared services for the Front module.
+
+## Files
+
+- **DeviceDetectionService.php** -- User-Agent parser for device type, OS, browser, in-app browser, and bot detection. Detects 14 social platform in-app browsers (Instagram, Facebook, TikTok, Twitter, LinkedIn, Snapchat, Threads, Pinterest, Reddit, WeChat, LINE, Telegram, Discord, WhatsApp) plus generic WebView. Identifies strict content platforms (Meta, TikTok, Twitter, Snapchat, LinkedIn) and Meta-owned platforms. Platform-specific methods: `isInstagram()`, `isFacebook()`, `isTikTok()`, etc. Full parse returns `{device_type, os_name, browser_name, in_app_browser, is_in_app}`.
+
+## Usage
+
+```php
+$service = new DeviceDetectionService();
+$info = $service->parse($request->userAgent());
+
+if ($service->isStrictContentPlatform($ua)) {
+ // Hide restricted content for platform compliance
+}
+```
diff --git a/src/Core/Front/Stdio/CLAUDE.md b/src/Core/Front/Stdio/CLAUDE.md
new file mode 100644
index 0000000..dbe3975
--- /dev/null
+++ b/src/Core/Front/Stdio/CLAUDE.md
@@ -0,0 +1,7 @@
+# Front/Stdio
+
+Stdio frontage for terminal/pipe-based I/O.
+
+## Files
+
+- **Boot.php** -- ServiceProvider for stdin/stdout transport. Handles non-HTTP contexts: Artisan commands, MCP stdio transport (agents connecting via pipes), and interactive CLI tools. Currently a placeholder with empty command registration -- core CLI commands will be registered here. No HTTP middleware -- this is a different transport entirely.
diff --git a/src/Core/Front/Tests/Unit/CLAUDE.md b/src/Core/Front/Tests/Unit/CLAUDE.md
new file mode 100644
index 0000000..acf6a7e
--- /dev/null
+++ b/src/Core/Front/Tests/Unit/CLAUDE.md
@@ -0,0 +1,13 @@
+# Front/Tests/Unit
+
+Unit tests for the Front module.
+
+## Files
+
+- **DeviceDetectionServiceTest.php** -- Tests for `DeviceDetectionService`. Covers in-app browser detection (Instagram, Facebook, TikTok, Twitter, LinkedIn, Snapchat, Threads, Pinterest, Reddit, WeChat, WhatsApp), standard browser exclusion, platform-specific methods, strict content platform identification, Meta platform detection, display names, device type/OS/browser detection, bot detection, and full parse output. Uses PHPUnit DataProvider for UA string coverage.
+
+## Running
+
+```bash
+composer test -- --filter=DeviceDetectionServiceTest
+```
diff --git a/src/Core/Front/Web/Blade/components/CLAUDE.md b/src/Core/Front/Web/Blade/components/CLAUDE.md
new file mode 100644
index 0000000..988f95c
--- /dev/null
+++ b/src/Core/Front/Web/Blade/components/CLAUDE.md
@@ -0,0 +1,21 @@
+# Front/Web/Blade/components
+
+Anonymous Blade components for the public web frontage. Used via `` tag syntax.
+
+## Components
+
+- **nav-item.blade.php** -- Navigation list item with icon and active state highlighting.
+ - Props: `href` (required), `icon` (string|null), `active` (bool)
+ - Uses `` for icon rendering.
+
+- **page.blade.php** -- Simple page wrapper for public web pages with optional title and description.
+ - Props: `title` (string|null), `description` (string|null)
+ - Provides max-width container with responsive padding.
+
+## Usage
+
+```blade
+
+ Content here
+
+```
diff --git a/src/Core/Front/Web/Blade/layouts/CLAUDE.md b/src/Core/Front/Web/Blade/layouts/CLAUDE.md
new file mode 100644
index 0000000..147fac6
--- /dev/null
+++ b/src/Core/Front/Web/Blade/layouts/CLAUDE.md
@@ -0,0 +1,10 @@
+# Front/Web/Blade/layouts
+
+Layout templates for public web pages.
+
+## Files
+
+- **app.blade.php** -- Base HTML shell for public web pages. Includes dark mode support (cookie-based), CSRF meta tag, Vite assets (app.css + app.js), Flux appearance/scripts, and font loading via `layouts::partials.fonts`.
+ - Props: `title` (string, defaults to `core.app.name` config)
+ - Slots: `$head` (extra head content), `$scripts` (extra scripts before ``)
+ - Prevents white flash with inline critical CSS for dark mode.
diff --git a/src/Core/Front/Web/CLAUDE.md b/src/Core/Front/Web/CLAUDE.md
new file mode 100644
index 0000000..bfb9267
--- /dev/null
+++ b/src/Core/Front/Web/CLAUDE.md
@@ -0,0 +1,21 @@
+# Front/Web
+
+Public-facing web frontage. Service provider that configures the `web` middleware group and registers `` Blade tag syntax.
+
+## Files
+
+- **Boot.php** -- ServiceProvider that configures the `web` middleware stack (cookies, session, CSRF, security headers, domain resolution), registers the `web::` Blade namespace, fires `WebRoutesRegistering` lifecycle event, and aliases `livewire` as `admin` for Flux compatibility.
+- **WebTagCompiler.php** -- Blade precompiler enabling `` tag syntax (like ``). Compiles to anonymous components in the `web::` namespace.
+
+## Middleware Stack
+
+The `web` group includes: EncryptCookies, AddQueuedCookiesToResponse, StartSession, ResilientSession, ShareErrorsFromSession, ValidateCsrfToken, SubstituteBindings, SecurityHeaders, FindDomainRecord.
+
+## Tag Syntax
+
+```blade
+Content here
+About
+```
+
+Resolves to anonymous components in `Web/Blade/components/` and `Components/View/Blade/web/`.
diff --git a/src/Core/Front/Web/Middleware/CLAUDE.md b/src/Core/Front/Web/Middleware/CLAUDE.md
new file mode 100644
index 0000000..8a0141f
--- /dev/null
+++ b/src/Core/Front/Web/Middleware/CLAUDE.md
@@ -0,0 +1,9 @@
+# Front/Web/Middleware
+
+HTTP middleware for public web requests.
+
+## Files
+
+- **FindDomainRecord.php** -- Resolves the current workspace from the incoming domain. Sets `workspace_model` and `workspace` attributes on the request. Core domains (base domain, www, localhost) pass through. Checks custom domains first, then subdomain slugs. Requires `Core\Tenant` module.
+- **RedirectIfAuthenticated.php** -- Redirects logged-in users away from guest-only pages (e.g., login). Redirects to `/` on the current domain instead of a global dashboard route.
+- **ResilientSession.php** -- Catches session corruption (decryption errors, DB failures) and recovers gracefully by clearing cookies and retrying. Prevents 503 errors from APP_KEY changes or session table issues. Returns JSON for AJAX requests.
diff --git a/src/Core/Headers/Livewire/CLAUDE.md b/src/Core/Headers/Livewire/CLAUDE.md
new file mode 100644
index 0000000..899f20c
--- /dev/null
+++ b/src/Core/Headers/Livewire/CLAUDE.md
@@ -0,0 +1,7 @@
+# Headers/Livewire/ — Header Configuration UI
+
+## Components
+
+| Component | Purpose |
+|-----------|---------|
+| `HeaderConfigurationManager` | Livewire component for managing security header configuration in the admin panel. Provides UI for configuring CSP directives, HSTS settings, Permissions Policy features, and other security headers. |
diff --git a/src/Core/Headers/Testing/CLAUDE.md b/src/Core/Headers/Testing/CLAUDE.md
new file mode 100644
index 0000000..ef8889c
--- /dev/null
+++ b/src/Core/Headers/Testing/CLAUDE.md
@@ -0,0 +1,10 @@
+# Headers/Testing/ — Security Header Test Utilities
+
+## Files
+
+| File | Purpose |
+|------|---------|
+| `HeaderAssertions` | Trait with assertion methods for testing security headers in HTTP responses. Provides `assertHasSecurityHeaders()`, `assertCspContains()`, etc. |
+| `SecurityHeaderTester` | Standalone static helper for validating security headers. Can be used without traits for flexible testing scenarios. |
+
+Used by feature tests (`SecurityHeadersTest`) to verify CSP, HSTS, X-Frame-Options, and other security headers.
diff --git a/src/Core/Headers/Views/livewire/CLAUDE.md b/src/Core/Headers/Views/livewire/CLAUDE.md
new file mode 100644
index 0000000..f96d298
--- /dev/null
+++ b/src/Core/Headers/Views/livewire/CLAUDE.md
@@ -0,0 +1,7 @@
+# Headers/Views/livewire/ — Header Configuration Blade Template
+
+## Templates
+
+| File | Purpose |
+|------|---------|
+| `header-configuration-manager.blade.php` | Blade template for the `HeaderConfigurationManager` Livewire component. Renders the security header configuration form with CSP, HSTS, and Permissions Policy controls. |
diff --git a/src/Core/Helpers/Rules/CLAUDE.md b/src/Core/Helpers/Rules/CLAUDE.md
new file mode 100644
index 0000000..7a897c6
--- /dev/null
+++ b/src/Core/Helpers/Rules/CLAUDE.md
@@ -0,0 +1,13 @@
+# Helpers/Rules/ — Custom Validation Rules
+
+## Rules
+
+| Rule | Purpose |
+|------|---------|
+| `HexRule` | Validates hexadecimal colour codes. Supports 3-digit (`#fff`) and 6-digit (`#ffffff`) formats. Hash symbol required. Constructor option `forceFull: true` rejects 3-digit codes. |
+
+Usage:
+```php
+'colour' => ['required', new HexRule()]
+'colour' => ['required', new HexRule(forceFull: true)]
+```
diff --git a/src/Core/Input/Tests/Unit/CLAUDE.md b/src/Core/Input/Tests/Unit/CLAUDE.md
new file mode 100644
index 0000000..cfadd77
--- /dev/null
+++ b/src/Core/Input/Tests/Unit/CLAUDE.md
@@ -0,0 +1,9 @@
+# Input/Tests/Unit/ — Input Filtering Tests
+
+## Test Files
+
+| File | Purpose |
+|------|---------|
+| `InputFilteringTest.php` | Pest unit tests for the `Sanitiser` class. Covers clean input passthrough (ASCII, punctuation, UTF-8), XSS prevention, SQL injection stripping, null byte removal, and edge cases. |
+
+Tests the WAF layer that `Core\Init` uses to sanitise `$_GET` and `$_POST` before Laravel processes the request.
diff --git a/src/Core/Lang/Console/Commands/CLAUDE.md b/src/Core/Lang/Console/Commands/CLAUDE.md
new file mode 100644
index 0000000..936503e
--- /dev/null
+++ b/src/Core/Lang/Console/Commands/CLAUDE.md
@@ -0,0 +1,10 @@
+# Lang/Console/Commands/ — Translation CLI Commands
+
+## Commands
+
+| Command | Purpose |
+|---------|---------|
+| `TranslationCoverageCommand` | Reports translation coverage across the codebase. Scans code for translation key usage and compares against translation files to identify missing and unused keys. |
+| `TranslationMemoryCommand` | CLI interface for managing translation memory — view statistics, browse entries, import/export TMX files, fuzzy match queries. |
+
+Part of the Lang subsystem's developer tooling.
diff --git a/src/Core/Lang/Coverage/CLAUDE.md b/src/Core/Lang/Coverage/CLAUDE.md
new file mode 100644
index 0000000..a566f93
--- /dev/null
+++ b/src/Core/Lang/Coverage/CLAUDE.md
@@ -0,0 +1,10 @@
+# Lang/Coverage/ — Translation Coverage Analysis
+
+## Files
+
+| File | Purpose |
+|------|---------|
+| `TranslationCoverage` | Scans PHP, Blade, and JS/Vue files for translation key usage (`__()`, `trans()`, `@lang`, etc.) and compares against translation files. Reports missing keys (used but undefined) and unused keys (defined but unused). |
+| `TranslationCoverageReport` | DTO containing analysis results — missing keys, unused keys, coverage statistics per locale, and usage locations. Implements `Arrayable`. |
+
+Used by the `lang:coverage` Artisan command for translation quality assurance.
diff --git a/src/Core/Lang/TranslationMemory/CLAUDE.md b/src/Core/Lang/TranslationMemory/CLAUDE.md
new file mode 100644
index 0000000..0e77121
--- /dev/null
+++ b/src/Core/Lang/TranslationMemory/CLAUDE.md
@@ -0,0 +1,14 @@
+# Lang/TranslationMemory/ — Translation Memory System
+
+Stores and retrieves previous translations for reuse and consistency.
+
+## Files
+
+| File | Purpose |
+|------|---------|
+| `TranslationMemory` | Unified service — store, retrieve, suggest translations. Supports exact and fuzzy matching with confidence scoring. |
+| `TranslationMemoryEntry` | DTO for a single translation unit — source text, target text, metadata, quality score (0.0-1.0). |
+| `FuzzyMatcher` | Finds similar translations via Levenshtein distance, token/word matching, and n-gram matching. Combines with quality score for confidence rating. |
+| `JsonTranslationMemoryRepository` | File-based storage backend — JSON files organised by locale pairs. |
+| `TmxExporter` | Exports to TMX (Translation Memory eXchange) standard XML format. |
+| `TmxImporter` | Imports from TMX files for interoperability with other translation tools. |
diff --git a/src/Core/Lang/TranslationMemory/Contracts/CLAUDE.md b/src/Core/Lang/TranslationMemory/Contracts/CLAUDE.md
new file mode 100644
index 0000000..ef180cf
--- /dev/null
+++ b/src/Core/Lang/TranslationMemory/Contracts/CLAUDE.md
@@ -0,0 +1,9 @@
+# Lang/TranslationMemory/Contracts/ — TM Repository Interface
+
+## Interfaces
+
+| Interface | Purpose |
+|-----------|---------|
+| `TranslationMemoryRepository` | Storage backend contract. Methods: `store(entry)`, `find(source, locale)`, `search(query, locale)`, `all(locale)`, `delete(id)`. Implementations may use JSON files, databases, or external services. |
+
+The default implementation is `JsonTranslationMemoryRepository`.
diff --git a/src/Core/Lang/en_GB/CLAUDE.md b/src/Core/Lang/en_GB/CLAUDE.md
new file mode 100644
index 0000000..da004f1
--- /dev/null
+++ b/src/Core/Lang/en_GB/CLAUDE.md
@@ -0,0 +1,9 @@
+# Lang/en_GB/ — British English Translations
+
+## Files
+
+| File | Purpose |
+|------|---------|
+| `core.php` | British English translation strings for the Core framework. Returns a keyed array of translatable strings used throughout the UI, emails, and error messages. |
+
+This is the primary locale — the framework uses UK English as its base language (colour, organisation, centre).
diff --git a/src/Core/Mail/Rules/CLAUDE.md b/src/Core/Mail/Rules/CLAUDE.md
new file mode 100644
index 0000000..0a7afee
--- /dev/null
+++ b/src/Core/Mail/Rules/CLAUDE.md
@@ -0,0 +1,14 @@
+# Mail/Rules/ — Email Validation Rules
+
+## Rules
+
+| Rule | Purpose |
+|------|---------|
+| `ValidatedEmail` | Laravel validation rule using the `EmailShield` service. Validates email format and optionally blocks disposable email domains. Constructor takes `blockDisposable: true` (default). |
+
+Usage:
+```php
+'email' => ['required', new ValidatedEmail(blockDisposable: true)]
+```
+
+Part of the Mail subsystem's input validation layer.
diff --git a/src/Core/Media/Abstracts/CLAUDE.md b/src/Core/Media/Abstracts/CLAUDE.md
new file mode 100644
index 0000000..d033935
--- /dev/null
+++ b/src/Core/Media/Abstracts/CLAUDE.md
@@ -0,0 +1,10 @@
+# Media/Abstracts/ — Media Base Classes
+
+## Abstract Classes
+
+| Class | Purpose |
+|-------|---------|
+| `Image` | Base class for image handling operations. |
+| `MediaConversion` | Abstract base for all media conversions (image resizing, thumbnail generation, video processing). Provides common functionality: queueing for large files (threshold configurable via `media.queue_threshold_mb`), progress reporting via `ConversionProgress` event, and storage abstraction. |
+
+Concrete implementations in `Core\Media\Conversions\`.
diff --git a/src/Core/Media/Conversions/CLAUDE.md b/src/Core/Media/Conversions/CLAUDE.md
new file mode 100644
index 0000000..630e15e
--- /dev/null
+++ b/src/Core/Media/Conversions/CLAUDE.md
@@ -0,0 +1,12 @@
+# Media/Conversions/ — Media Conversion Implementations
+
+Concrete implementations of `MediaConversion` for specific processing tasks.
+
+## Conversions
+
+| Class | Purpose |
+|-------|---------|
+| `MediaImageResizerConversion` | Resizes images to specified dimensions while maintaining aspect ratio. Prevents upscaling. Skips GIF files to preserve animation. Uses `ImageResizer`. |
+| `MediaVideoThumbConversion` | Extracts thumbnail frames from video files for preview display. |
+
+Both extend `Core\Media\Abstracts\MediaConversion` and can be queued via `ProcessMediaConversion` job.
diff --git a/src/Core/Media/Events/CLAUDE.md b/src/Core/Media/Events/CLAUDE.md
new file mode 100644
index 0000000..5642b47
--- /dev/null
+++ b/src/Core/Media/Events/CLAUDE.md
@@ -0,0 +1,7 @@
+# Media/Events/ — Media System Events
+
+## Events
+
+| Event | Fired When | Purpose |
+|-------|-----------|---------|
+| `ConversionProgress` | During media conversion processing | Reports progress stages for UI progress bars, logging, and monitoring. |
diff --git a/src/Core/Media/Image/CLAUDE.md b/src/Core/Media/Image/CLAUDE.md
new file mode 100644
index 0000000..15a79ef
--- /dev/null
+++ b/src/Core/Media/Image/CLAUDE.md
@@ -0,0 +1,13 @@
+# Media/Image/ — Image Processing
+
+Image optimisation and processing utilities.
+
+## Files
+
+| File | Purpose |
+|------|---------|
+| `ImageOptimizer` | Main optimiser — resizes, compresses, and converts images. Includes memory safety checks (GD needs 5-6x image size). |
+| `ImageOptimization` | Optimisation configuration and pipeline orchestration. |
+| `ExifStripper` | Removes EXIF metadata from images for privacy (GPS coordinates, camera info). |
+| `ModernFormatSupport` | Detects and enables WebP/AVIF support based on server capabilities. |
+| `OptimizationResult` | DTO containing optimisation results — original size, optimised size, savings percentage, format used. |
diff --git a/src/Core/Media/Jobs/CLAUDE.md b/src/Core/Media/Jobs/CLAUDE.md
new file mode 100644
index 0000000..1b4ecc1
--- /dev/null
+++ b/src/Core/Media/Jobs/CLAUDE.md
@@ -0,0 +1,8 @@
+# Media/Jobs/ — Media Background Jobs
+
+## Jobs
+
+| Job | Purpose |
+|-----|---------|
+| `ProcessMediaConversion` | Queued job for running media conversions asynchronously. Dispatches `ConversionProgress` events during processing. Logs failures. |
+| `GenerateThumbnail` | Queued job for generating thumbnails on demand. Called by `LazyThumbnail` when a thumbnail doesn't exist yet. |
diff --git a/src/Core/Media/Routes/CLAUDE.md b/src/Core/Media/Routes/CLAUDE.md
new file mode 100644
index 0000000..824dfce
--- /dev/null
+++ b/src/Core/Media/Routes/CLAUDE.md
@@ -0,0 +1,7 @@
+# Media/Routes/ — Media Web Routes
+
+## Files
+
+| File | Purpose |
+|------|---------|
+| `web.php` | Web route definitions for media serving — thumbnail endpoints, image serving routes. Registered via the `WebRoutesRegistering` lifecycle event. |
diff --git a/src/Core/Media/Support/CLAUDE.md b/src/Core/Media/Support/CLAUDE.md
new file mode 100644
index 0000000..6b7aac4
--- /dev/null
+++ b/src/Core/Media/Support/CLAUDE.md
@@ -0,0 +1,11 @@
+# Media/Support/ — Media Processing Utilities
+
+## Files
+
+| File | Purpose |
+|------|---------|
+| `ImageResizer` | Image resizing with aspect ratio preservation and memory safety checks. Prevents upscaling and OOM crashes. |
+| `ConversionProgressReporter` | Reports media conversion progress to listeners via `ConversionProgress` event. |
+| `MediaConversionData` | DTO carrying conversion parameters — source path, output path, dimensions, format, quality. |
+| `TemporaryDirectory` | Manages temporary directories for media processing with automatic cleanup. |
+| `TemporaryFile` | Manages temporary files for media processing with automatic cleanup. |
diff --git a/src/Core/Media/Thumbnail/CLAUDE.md b/src/Core/Media/Thumbnail/CLAUDE.md
new file mode 100644
index 0000000..14a6760
--- /dev/null
+++ b/src/Core/Media/Thumbnail/CLAUDE.md
@@ -0,0 +1,11 @@
+# Media/Thumbnail/ — Lazy Thumbnail Generation
+
+## Files
+
+| File | Purpose |
+|------|---------|
+| `LazyThumbnail` | On-demand thumbnail generation service. Generates thumbnails when first requested rather than eagerly on upload. Caches generated thumbnails. Dispatches `GenerateThumbnail` job for async processing. |
+| `ThumbnailController` | HTTP controller serving thumbnail requests. Generates on-the-fly if not cached. |
+| `helpers.php` | Helper functions for thumbnail URL generation in Blade templates. |
+
+Thumbnails are generated lazily to avoid processing overhead on upload and to only create sizes that are actually requested.
diff --git a/src/Core/Search/Analytics/CLAUDE.md b/src/Core/Search/Analytics/CLAUDE.md
new file mode 100644
index 0000000..0435491
--- /dev/null
+++ b/src/Core/Search/Analytics/CLAUDE.md
@@ -0,0 +1,15 @@
+# Search/Analytics/ — Search Analytics
+
+## Files
+
+| File | Purpose |
+|------|---------|
+| `SearchAnalytics` | Tracks search queries, results, and user interactions. Features: query tracking with timestamps and result counts, click-through tracking, zero-result query tracking for content gap analysis, popular search trending. |
+
+Part of the Search subsystem. Data feeds into `SearchSuggestions` for autocomplete.
+
+## Migrations
+
+| File | Purpose |
+|------|---------|
+| `migrations/2024_01_01_000001_create_search_analytics_tables.php` | Creates tables for search query tracking, result counts, and click-through data. |
diff --git a/src/Core/Search/Analytics/migrations/CLAUDE.md b/src/Core/Search/Analytics/migrations/CLAUDE.md
new file mode 100644
index 0000000..757dd6a
--- /dev/null
+++ b/src/Core/Search/Analytics/migrations/CLAUDE.md
@@ -0,0 +1,7 @@
+# Search/Analytics/migrations/ — Search Analytics Schema
+
+## Migrations
+
+| File | Purpose |
+|------|---------|
+| `2024_01_01_000001_create_search_analytics_tables.php` | Creates tables for search query tracking, result counts, and click-through data used by the `SearchAnalytics` service. |
diff --git a/src/Core/Search/Suggestions/CLAUDE.md b/src/Core/Search/Suggestions/CLAUDE.md
new file mode 100644
index 0000000..5b47673
--- /dev/null
+++ b/src/Core/Search/Suggestions/CLAUDE.md
@@ -0,0 +1,9 @@
+# Search/Suggestions/ — Search Autocomplete
+
+## Files
+
+| File | Purpose |
+|------|---------|
+| `SearchSuggestions` | Type-ahead suggestion service. Sources: popular queries from SearchAnalytics, recent searches (per user/session), prefix matching, content-based suggestions from searchable items. Cached for performance. |
+
+Part of the Search subsystem. Provides autocomplete data for search UIs.
diff --git a/src/Core/Search/Support/CLAUDE.md b/src/Core/Search/Support/CLAUDE.md
new file mode 100644
index 0000000..10797df
--- /dev/null
+++ b/src/Core/Search/Support/CLAUDE.md
@@ -0,0 +1,9 @@
+# Search/Support/ — Search Utilities
+
+## Files
+
+| File | Purpose |
+|------|---------|
+| `SearchHighlighter` | Highlights search query terms within result text. Multi-word support, case-insensitive matching with original case preserved, HTML-safe output, context extraction (snippets around matches), configurable highlight styles. |
+
+Used by search result rendering to show users why a result matched their query.
diff --git a/src/Core/Seo/Analytics/CLAUDE.md b/src/Core/Seo/Analytics/CLAUDE.md
new file mode 100644
index 0000000..c8cb584
--- /dev/null
+++ b/src/Core/Seo/Analytics/CLAUDE.md
@@ -0,0 +1,7 @@
+# Seo/Analytics/ — SEO Score Tracking
+
+## Files
+
+| File | Purpose |
+|------|---------|
+| `SeoScoreTrend` | Tracks SEO scores over time to show improvement or regression trends. Reads from `SeoScoreHistory` model. Provides daily, weekly, and monthly aggregation. |
diff --git a/src/Core/Seo/Console/Commands/CLAUDE.md b/src/Core/Seo/Console/Commands/CLAUDE.md
new file mode 100644
index 0000000..a6d5d96
--- /dev/null
+++ b/src/Core/Seo/Console/Commands/CLAUDE.md
@@ -0,0 +1,10 @@
+# Seo/Console/Commands/ — SEO Artisan Commands
+
+## Commands
+
+| Command | Purpose |
+|---------|---------|
+| `AuditCanonicalUrls` | Audits canonical URLs across all SEO metadata for conflicts and misconfigurations. |
+| `GenerateServiceOgImages` | Batch-generates OG images for service/product pages. |
+| `RecordSeoScores` | Records current SEO scores to history for trend tracking. Designed for scheduled execution. |
+| `TestStructuredData` | Validates structured data (JSON-LD) across pages against schema.org specs. |
diff --git a/src/Core/Seo/Controllers/CLAUDE.md b/src/Core/Seo/Controllers/CLAUDE.md
new file mode 100644
index 0000000..b2c7644
--- /dev/null
+++ b/src/Core/Seo/Controllers/CLAUDE.md
@@ -0,0 +1,8 @@
+# Seo/Controllers/ — SEO HTTP Controllers
+
+## Controllers
+
+| Controller | Purpose |
+|------------|---------|
+| `SitemapController` | Generates XML sitemaps — sitemap index pointing to child sitemaps (pages, posts, etc.). |
+| `OgImageController` | Serves dynamically generated Open Graph images for social media previews. |
diff --git a/src/Core/Seo/Jobs/CLAUDE.md b/src/Core/Seo/Jobs/CLAUDE.md
new file mode 100644
index 0000000..87605a0
--- /dev/null
+++ b/src/Core/Seo/Jobs/CLAUDE.md
@@ -0,0 +1,7 @@
+# Seo/Jobs/ — SEO Background Jobs
+
+## Jobs
+
+| Job | Purpose |
+|-----|---------|
+| `GenerateOgImageJob` | Queued job to generate Open Graph images for pages. Uses `DynamicOgImageService` to render and store OG images. |
diff --git a/src/Core/Seo/Models/CLAUDE.md b/src/Core/Seo/Models/CLAUDE.md
new file mode 100644
index 0000000..ec73f62
--- /dev/null
+++ b/src/Core/Seo/Models/CLAUDE.md
@@ -0,0 +1,7 @@
+# Seo/Models/ — SEO Eloquent Models
+
+## Models
+
+| Model | Purpose |
+|-------|---------|
+| `SeoScoreHistory` | Historical SEO score records. Polymorphic (`seoable_type`/`seoable_id`) for any model with SEO metadata. Stores point-in-time snapshots of scores and issues. Supports daily and weekly aggregation for trend analysis. |
diff --git a/src/Core/Seo/Services/CLAUDE.md b/src/Core/Seo/Services/CLAUDE.md
new file mode 100644
index 0000000..46beb80
--- /dev/null
+++ b/src/Core/Seo/Services/CLAUDE.md
@@ -0,0 +1,8 @@
+# Seo/Services/ — SEO Service Layer
+
+## Services
+
+| Service | Purpose |
+|---------|---------|
+| `SchemaBuilderService` | Generates JSON-LD structured data for schema.org types: Article, BlogPosting, HowTo, FAQ, BreadcrumbList, Organization, WebSite. Uses `SchemaValidator` for validation. |
+| `ServiceOgImageService` | Generates Open Graph images for service/product pages. |
diff --git a/src/Core/Seo/Validation/CLAUDE.md b/src/Core/Seo/Validation/CLAUDE.md
new file mode 100644
index 0000000..e04b539
--- /dev/null
+++ b/src/Core/Seo/Validation/CLAUDE.md
@@ -0,0 +1,10 @@
+# Seo/Validation/ — SEO Validation
+
+## Validators
+
+| Class | Purpose |
+|-------|---------|
+| `CanonicalUrlValidator` | Detects canonical URL conflicts across SEO metadata. Finds multiple pages pointing to the same canonical URL. |
+| `OgImageValidator` | Validates OG images — checks dimensions, file size, format, and accessibility. |
+| `SchemaValidator` | Validates JSON-LD structured data against schema.org requirements. |
+| `StructuredDataTester` | Comprehensive structured data testing — validates all JSON-LD on a page against schema.org specs. |
diff --git a/src/Core/Storage/Commands/CLAUDE.md b/src/Core/Storage/Commands/CLAUDE.md
new file mode 100644
index 0000000..afdcc24
--- /dev/null
+++ b/src/Core/Storage/Commands/CLAUDE.md
@@ -0,0 +1,9 @@
+# Storage/Commands/ — Storage Artisan Commands
+
+## Commands
+
+| Command | Signature | Purpose |
+|---------|-----------|---------|
+| `WarmCacheCommand` | `cache:warm` | Pre-populates cache with frequently accessed data. Options: `--stale` (only warm missing items), `--status` (show warming status), `--key=foo` (warm specific key). Prevents cold cache problems after deployments. |
+
+Uses the `CacheWarmer` service which modules register their warmable items with.
diff --git a/src/Core/Storage/Events/CLAUDE.md b/src/Core/Storage/Events/CLAUDE.md
new file mode 100644
index 0000000..fab0cef
--- /dev/null
+++ b/src/Core/Storage/Events/CLAUDE.md
@@ -0,0 +1,9 @@
+# Storage/Events/ — Storage System Events
+
+## Events
+
+| Event | Fired When | Properties |
+|-------|-----------|------------|
+| `RedisFallbackActivated` | Redis becomes unavailable and fallback driver is activated | `context`, `errorMessage`, `fallbackDriver` (default: `database`) |
+
+Listeners can use this for alerting, monitoring, or graceful degradation when Redis fails.
diff --git a/src/Core/Tests/Feature/CLAUDE.md b/src/Core/Tests/Feature/CLAUDE.md
new file mode 100644
index 0000000..cc1ddb8
--- /dev/null
+++ b/src/Core/Tests/Feature/CLAUDE.md
@@ -0,0 +1,27 @@
+# Tests/Feature/ — Core Feature Tests
+
+Pest feature (integration) tests for the Core PHP framework.
+
+## Test Files
+
+| File | Tests |
+|------|-------|
+| `AdminComponentsTest.php` | Admin panel Livewire component rendering |
+| `AdminRouteSmokeTest.php` | Admin route accessibility |
+| `BladeViewCompilationTest.php` | Blade template compilation |
+| `CdnIntegrationTest.php` | CDN URL building and asset delivery |
+| `CoreComponentsTest.php` | Core UI component rendering |
+| `DatabaseMigrationTest.php` | Migration execution |
+| `EmailShieldTest.php` | Email validation and disposable blocking |
+| `ErrorPagesTest.php` | Custom error page rendering |
+| `ImageOptimizerTest.php` | Image optimisation pipeline |
+| `MailConfigurationTest.php` | Mail driver configuration |
+| `ModuleScannerIntegrationTest.php` | Full module discovery flow |
+| `OffloadMigrateCommandTest.php` | Storage offload migration command |
+| `PerformanceBaselineTest.php` | Response time baselines |
+| `ResilientSessionTest.php` | Session fallback handling |
+| `RewriteOffloadedUrlsTest.php` | URL rewriting for offloaded assets |
+| `SecurityFixesTest.php` | Security vulnerability patches |
+| `SecurityHeadersTest.php` | HTTP security header enforcement |
+| `StorageOffloadTest.php` | File offloading to remote storage |
+| `ValidationRulesTest.php` | Custom validation rule behaviour |
diff --git a/src/Core/Tests/Feature/Config/CLAUDE.md b/src/Core/Tests/Feature/Config/CLAUDE.md
new file mode 100644
index 0000000..bef1fe9
--- /dev/null
+++ b/src/Core/Tests/Feature/Config/CLAUDE.md
@@ -0,0 +1,8 @@
+# Tests/Feature/Config/ — Config Feature Tests
+
+## Test Files
+
+| File | Purpose |
+|------|---------|
+| `ChannelTest.php` | Tests for the `Channel` model — creation, inheritance chain, cycle detection, workspace scoping, `byCode()` lookup. |
+| `ConfigValueTest.php` | Tests for `ConfigValue` model — value storage, encryption of sensitive keys, FINAL lock semantics, typed value retrieval. |
diff --git a/src/Core/Tests/Unit/CLAUDE.md b/src/Core/Tests/Unit/CLAUDE.md
new file mode 100644
index 0000000..e7da58d
--- /dev/null
+++ b/src/Core/Tests/Unit/CLAUDE.md
@@ -0,0 +1,18 @@
+# Tests/Unit/ — Core Unit Tests
+
+Pest unit tests for core framework components.
+
+## Test Files
+
+| File | Tests |
+|------|-------|
+| `ApiVersionTest.php` | API versioning logic |
+| `ComponentBuildersTest.php` | UI component builder patterns |
+| `HadesEncryptTest.php` | Hades encryption utilities |
+| `LazyModuleListenerTest.php` | Lazy module instantiation and event handling |
+| `LthnHashTest.php` | Custom hashing implementation |
+| `ModuleScannerTest.php` | Module discovery from Boot.php files |
+| `PrivacyHelperTest.php` | Privacy/GDPR helper functions |
+| `UtmHelperTest.php` | UTM parameter handling |
+
+These test the root-level Core framework components (Boot, ModuleScanner, LazyModuleListener) and shared utilities.
diff --git a/src/Core/Tests/Unit/Crypt/CLAUDE.md b/src/Core/Tests/Unit/Crypt/CLAUDE.md
new file mode 100644
index 0000000..19e86cb
--- /dev/null
+++ b/src/Core/Tests/Unit/Crypt/CLAUDE.md
@@ -0,0 +1,7 @@
+# Tests/Unit/Crypt/ — Encryption Unit Tests
+
+## Test Files
+
+| File | Purpose |
+|------|---------|
+| `EncryptArrayObjectTest.php` | Tests for encrypting and decrypting array/object data structures. Validates the Crypt subsystem's handling of complex data types. |
diff --git a/src/Core/Tests/Unit/Services/CLAUDE.md b/src/Core/Tests/Unit/Services/CLAUDE.md
new file mode 100644
index 0000000..24cc1d3
--- /dev/null
+++ b/src/Core/Tests/Unit/Services/CLAUDE.md
@@ -0,0 +1,7 @@
+# Tests/Unit/Services/ — Service Unit Tests
+
+## Test Files
+
+| File | Purpose |
+|------|---------|
+| `BunnyCdnServiceTest.php` | Unit tests for the BunnyCDN pull zone API service. Tests cache purging, statistics retrieval, and pull zone management. |
diff --git a/src/Mod/CLAUDE.md b/src/Mod/CLAUDE.md
new file mode 100644
index 0000000..3c0e2c6
--- /dev/null
+++ b/src/Mod/CLAUDE.md
@@ -0,0 +1,45 @@
+# Mod -- Module Aggregator
+
+`Core\Mod\Boot` is a minimal ServiceProvider that acts as the namespace root for feature modules bundled with the core-php package.
+
+## How It Works
+
+Each module lives in a subdirectory (e.g., `Mod/Trees/`) with its own `Boot.php`. Modules self-register through the lifecycle event system -- they declare a static `$listens` array and are discovered by `ModuleScanner` during `LifecycleEventProvider::register()`.
+
+`Mod\Boot` itself does nothing in `register()` or `boot()`. It exists purely as the ServiceProvider entry point listed in `Core\Boot::$providers`.
+
+## Module Structure Convention
+
+```
+Mod/
+ {ModuleName}/
+ Boot.php # $listens declaration + event handlers
+ Console/ # Artisan commands
+ Controllers/ # HTTP controllers (Api/, Web/)
+ Database/Seeders/ # Database seeders
+ Jobs/ # Queue jobs
+ Lang/ # Translation files
+ Listeners/ # Event listeners
+ Middleware/ # HTTP middleware
+ Models/ # Eloquent models
+ Notifications/ # Notification classes
+ Routes/ # Route files (api.php, web.php)
+ Tests/ # Feature and Unit tests
+ View/ # Blade templates and Livewire components
+ Blade/ # Blade view files
+ Modal/ # Livewire components (organized by frontage)
+```
+
+## Namespace
+
+`Core\Mod\{ModuleName}` -- autoloaded via PSR-4 from `src/Mod/`.
+
+## Adding a Module
+
+1. Create `Mod/{Name}/Boot.php` with `public static array $listens`
+2. Implement event handler methods referenced in `$listens`
+3. The scanner discovers it automatically -- no registration needed
+
+## Current Modules
+
+- `Trees/` -- Trees for Agents initiative (see `Trees/CLAUDE.md`)
diff --git a/src/Mod/Trees/CLAUDE.md b/src/Mod/Trees/CLAUDE.md
new file mode 100644
index 0000000..208a267
--- /dev/null
+++ b/src/Mod/Trees/CLAUDE.md
@@ -0,0 +1,87 @@
+# Trees for Agents
+
+A module implementing the "Trees for Agents" programme: when an AI agent refers a user to the platform, a tree is planted with Trees for the Future (TFTF). The module tracks plantings, manages a pre-paid reserve, provides a public leaderboard, and handles batch donations.
+
+## Namespace
+
+`Core\Mod\Trees` -- autoloaded from `src/Mod/Trees/`.
+
+## Lifecycle Events
+
+```php
+public static array $listens = [
+ ApiRoutesRegistering::class => 'onApiRoutes',
+ WebRoutesRegistering::class => 'onWebRoutes',
+ ConsoleBooting::class => 'onConsole',
+];
+```
+
+## Models
+
+| Model | Purpose |
+|-------|---------|
+| `TreePlanting` | Individual tree planting record. Workspace-scoped (`BelongsToWorkspace`). Tracks provider, model, source, status, TFTF reference. Statuses: `pending` -> `confirmed` -> `planted` (or `queued` if reserve depleted). |
+| `TreeReserve` | Singleton row managing the pre-paid tree reserve. Tracks current level, total decremented/replenished. Warning at 50, critical at 10, depleted at 0. Sends `LowTreeReserveNotification` to admins. |
+| `TreeDonation` | Batch donation record. Created when confirmed trees are batched into a monthly TFTF donation. Cost: $0.25/tree. |
+| `TreePlantingStats` | Aggregated daily stats by provider/model. Atomic upsert for concurrent safety. Powers leaderboard and provider breakdowns. |
+
+## Planting Flow
+
+```
+Agent referral visit (/ref/{provider}/{model})
+ -> User signs up
+ -> PlantTreeForAgentReferral listener fires on Registered event
+ -> Checks daily limit (1 free tree/day) and guaranteed bonus
+ -> Creates TreePlanting (pending or queued)
+ -> If pending: markConfirmed() decrements reserve + updates stats
+ -> If queued: waits for trees:process-queue command
+```
+
+## Valid Providers
+
+`anthropic`, `openai`, `google`, `meta`, `mistral`, `local`, `unknown`
+
+## Console Commands
+
+| Command | Schedule | Purpose |
+|---------|----------|---------|
+| `trees:process-queue` | Daily | Processes oldest queued tree planting. Supports `--dry-run`. |
+| `trees:donate` | Monthly (28th) | Batches confirmed trees into TFTF donation. Creates `TreeDonation`, marks plantings as `planted`, optionally replenishes reserve. Supports `--dry-run` and `--replenish=N`. |
+| `trees:reserve:add {count}` | Manual | Replenishes reserve after a TFTF donation. Supports `--force`. |
+
+## API Endpoints (public, no auth)
+
+All under `api` middleware with `throttle:60,1`:
+
+| Route | Controller Method | Returns |
+|-------|------------------|---------|
+| `GET /trees/stats` | `index()` | Global totals, monthly/yearly, queue size |
+| `GET /trees/stats/{provider}` | `provider()` | Provider totals + model breakdown |
+| `GET /trees/stats/{provider}/{model}` | `model()` | Model-specific stats |
+| `GET /trees/leaderboard` | `leaderboard()` | Top 20 providers by trees planted |
+
+## Web Routes
+
+| Route | Component | Purpose |
+|-------|-----------|---------|
+| `GET /trees` | `trees.index` Livewire | Public leaderboard page |
+| `GET /ref/{provider}/{model?}` | `ReferralController@track` | Agent referral tracking (sets cookie/session) |
+
+## Middleware
+
+`IncludeAgentContext` -- Adds `for_agents` context to 401 JSON responses when the request comes from an AI agent. Includes referral URL, impact stats, and programme links. Depends on `Core\Agentic\Services\AgentDetection`.
+
+## Key Classes
+
+| Class | Purpose |
+|-------|---------|
+| `PlantTreeForAgentReferral` | Listener on `Registered` event. Checks referral data, daily limits, bonus system. |
+| `PlantTreeWithTFTF` | Queue job for confirming plantings. 3 retries, 60s backoff. |
+| `LowTreeReserveNotification` | Mail notification at warning/critical/depleted levels. |
+| `View\Modal\Web\Index` | Livewire component for the public leaderboard page. |
+
+## Dependencies
+
+- `Core\Tenant` -- `BelongsToWorkspace` trait, `ReferralController`, `AgentReferralBonus`
+- `Core\Agentic` -- `AgentDetection`, `AgentIdentity` (for middleware)
+- `Core\Front` -- `Controller` base class
diff --git a/src/Plug/CLAUDE.md b/src/Plug/CLAUDE.md
new file mode 100644
index 0000000..e465bca
--- /dev/null
+++ b/src/Plug/CLAUDE.md
@@ -0,0 +1,107 @@
+# Plug -- Plugin System for External Service Integrations
+
+`Core\Plug` is an operation-based plugin architecture for connecting to external services (social networks, Web3, content platforms, chat, business tools). Each provider is split into discrete operation classes rather than monolithic adapters.
+
+## Namespace
+
+`Core\Plug` -- autoloaded from `src/Plug/`.
+
+## Architecture
+
+Providers are organised by category and operation:
+
+```
+Plug/
+ Social/
+ Twitter/
+ Auth.php # implements Authenticable
+ Post.php # implements Postable
+ Delete.php # implements Deletable
+ Media.php # implements MediaUploadable
+ Bluesky/
+ Auth.php
+ Post.php
+ Web3/
+ Content/
+ Chat/
+ Business/
+```
+
+Usage:
+```php
+use Core\Plug\Social\Twitter\Auth;
+use Core\Plug\Social\Twitter\Post;
+
+$auth = new Auth($clientId, $clientSecret, $redirectUrl);
+$post = (new Post())->withToken($token);
+```
+
+## Key Classes
+
+### Boot (ServiceProvider)
+
+Registers `Registry` as a singleton with alias `plug.registry`. Pure library module -- no routes, views, or migrations.
+
+### Registry
+
+Auto-discovers providers from directory structure. Scans categories: `Social`, `Web3`, `Content`, `Chat`, `Business`.
+
+**Public API:**
+
+| Method | Purpose |
+|--------|---------|
+| `discover()` | Scans category directories for provider folders. Idempotent. |
+| `register(id, category, name, namespace)` | Programmatic registration (for external packages). |
+| `identifiers()` | All registered provider identifiers (lowercase). |
+| `has(identifier)` | Check if provider exists. |
+| `get(identifier)` | Get provider metadata (category, name, namespace, path). |
+| `supports(identifier, operation)` | Check if provider has an operation class. |
+| `operation(identifier, operation)` | Get the FQCN for a provider's operation class. |
+| `all()` | All providers as Collection. |
+| `byCategory(category)` | Provider identifiers filtered by category. |
+| `withCapability(operation)` | Providers that support a specific operation. |
+| `displayName(identifier)` | Human-readable name (from Auth::name() or directory name). |
+
+### Response
+
+Standardised response for all Plug operations. Immutable value object.
+
+**Properties:** `status` (Status enum), `context` (array), `rateLimitApproaching` (bool), `retryAfter` (int).
+
+**Methods:** `isOk()`, `hasError()`, `isUnauthorized()`, `isRateLimited()`, `id()`, `get(key)`, `getMessage()`, `retryAfter()`, `toArray()`. Supports magic `__get` for context values.
+
+## Contracts (interfaces)
+
+| Contract | Methods | Purpose |
+|----------|---------|---------|
+| `Authenticable` | `identifier()`, `name()`, `getAuthUrl()`, `requestAccessToken(params)`, `getAccount()` | OAuth2/API key/credential auth flows |
+| `Postable` | `publish(text, media, params)` | Content publishing |
+| `Readable` | `get(id)`, `list(params)` | Read posts/content |
+| `Commentable` | `comment(text, postId, params)` | Reply to content |
+| `Deletable` | `delete(id)` | Delete content |
+| `MediaUploadable` | `upload(item)` | Upload media files |
+| `Listable` | `listEntities()` | List pages/boards/publications (target selection) |
+| `Refreshable` | `refresh()` | Refresh expired access tokens |
+
+## Concerns (traits)
+
+| Trait | Purpose |
+|-------|---------|
+| `BuildsResponse` | Response factory helpers: `ok()`, `error()`, `unauthorized()`, `rateLimit()`, `noContent()`, `fromHttp()`. The `fromHttp()` method auto-maps HTTP status codes (401, 429) to correct Response types. |
+| `ManagesTokens` | Token lifecycle: `withToken()`, `getToken()`, `accessToken()`, `hasRefreshToken()`, `refreshToken()`, `tokenExpiresSoon(minutes)`, `tokenExpired()`. Fluent interface via `withToken()`. |
+| `UsesHttp` | HTTP client helpers: `http()` (configured PendingRequest with 30s timeout, JSON accept, User-Agent), `buildUrl()`. Override `defaultHeaders()` for provider-specific headers. |
+
+## Enum
+
+`Status` -- string-backed: `OK`, `ERROR`, `UNAUTHORIZED`, `RATE_LIMITED`, `NO_CONTENT`.
+
+## Integration Pattern
+
+1. Create provider directory under the appropriate category
+2. Implement operation classes using contracts + concerns
+3. Registry auto-discovers on first access (or register programmatically)
+4. All operations return `Response` objects for consistent error handling
+
+## Categories
+
+`Social`, `Web3`, `Content`, `Chat`, `Business`
diff --git a/src/Website/CLAUDE.md b/src/Website/CLAUDE.md
new file mode 100644
index 0000000..1e3c79f
--- /dev/null
+++ b/src/Website/CLAUDE.md
@@ -0,0 +1,87 @@
+# Website -- Domain-Scoped Module System
+
+`Core\Website` provides lazy-loading of website modules based on the incoming HTTP domain. Only the matching provider is registered for a given request, isolating errors so one broken website does not take down others.
+
+## Namespace
+
+`Core\Website` -- autoloaded from `src/Website/`.
+
+## How It Works
+
+### Web Requests
+
+1. `Website\Boot::register()` reads `$_SERVER['HTTP_HOST']`
+2. Dispatches a `DomainResolving` event with the hostname
+3. Website modules listening for `DomainResolving` check if the host matches their `$domains` patterns
+4. The first matching provider is registered via `$app->register()`
+5. Only that one provider boots -- all others are skipped
+
+### CLI Context (artisan, tests, queues)
+
+All website providers are loaded via `registerAllProviders()`, which scans `app/Mod/*/Boot.php` for website module Boot classes. This ensures artisan commands, seeders, and queue workers can access all website modules.
+
+## Files
+
+### Boot.php (ServiceProvider)
+
+- Registers `DomainResolver` as singleton
+- Web: fires `DomainResolving` event, registers matched provider
+- CLI: loads all providers from `app/Mod/`
+- Provider load order: must come before `Front\Boot` so listeners are wired before frontage events fire
+
+### DomainResolver
+
+Utility for working with domain patterns. Website Boot classes declare domains as regex patterns:
+
+```php
+class Boot extends ServiceProvider
+{
+ public static array $domains = [
+ '/^example\.(com|test)$/',
+ ];
+}
+```
+
+**Methods:**
+
+| Method | Purpose |
+|--------|---------|
+| `extractDomains(providerClass)` | Read `$domains` static property via reflection |
+| `domainsFor(providerClass)` | Convert regex patterns to concrete domain strings. In local env, filters to `.test`/`.localhost` only. |
+
+Pattern expansion handles:
+- Fixed domains: `example.com`
+- TLD alternatives: `example\.(com|test)` -> `example.com`, `example.test`
+- Optional www prefix: `(www\.)?example\.com`
+
+## Writing a Website Module
+
+Website modules live in `app/Mod/{Name}/` (not `src/Mod/`). They use the same `$listens` pattern as regular modules:
+
+```php
+namespace Mod\MyWebsite;
+
+class Boot extends ServiceProvider
+{
+ public static array $domains = [
+ '/^mysite\.(com|test)$/',
+ ];
+
+ public static array $listens = [
+ WebRoutesRegistering::class => 'onWebRoutes',
+ ];
+
+ public function onWebRoutes(WebRoutesRegistering $event): void
+ {
+ $event->routes(fn () => require __DIR__.'/Routes/web.php');
+ $event->views('mysite', __DIR__.'/Views');
+ }
+}
+```
+
+## Key Design Decisions
+
+- **Isolation**: One broken website module cannot crash others since only the matched provider loads
+- **Lazy loading**: Website modules are not instantiated unless their domain matches
+- **Dual paths**: Framework-bundled modules in `src/Mod/`, application modules in `app/Mod/`
+- **Environment-aware**: Local dev only serves `.test`/`.localhost` domains from `domainsFor()`