diff --git a/docs/images/readme-banner-dark.png b/docs/images/readme-banner-dark.png
index 97c27a4..02dea49 100644
Binary files a/docs/images/readme-banner-dark.png and b/docs/images/readme-banner-dark.png differ
diff --git a/docs/images/readme-banner-light.png b/docs/images/readme-banner-light.png
index 86ab0d5..690c9fd 100644
Binary files a/docs/images/readme-banner-light.png and b/docs/images/readme-banner-light.png differ
diff --git a/tools/New-ReadmeImages.ps1 b/tools/New-ReadmeImages.ps1
new file mode 100644
index 0000000..465e883
--- /dev/null
+++ b/tools/New-ReadmeImages.ps1
@@ -0,0 +1,130 @@
+#Requires -Version 7.4
+<#
+.SYNOPSIS
+ Renders the README banner in light and dark themes using the existing guide assets.
+.DESCRIPTION
+ Reads the version from Invoke-PraRemoteMailbox.ps1 and requires the guide version to agree.
+ Uses the guide's CSS and icon table, with the Purview README banner layout.
+ Runs Microsoft Edge locally; no Exchange, tenant or lab connection is made.
+.PARAMETER OutputFolder
+ Defaults to docs\images. Only readme-banner-light.png and readme-banner-dark.png are written.
+.NOTES
+ Author: Nicolas Fabert
+ Repository documentation tool; not included in the runtime package.
+#>
+[CmdletBinding()]
+param([string]$OutputFolder)
+
+$ErrorActionPreference = 'Stop'
+$root = Split-Path $PSScriptRoot -Parent
+if (-not $OutputFolder) { $OutputFolder = Join-Path $root 'docs\images' }
+$OutputFolder = $ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath($OutputFolder)
+$runtime = [IO.File]::ReadAllText((Join-Path $root 'Invoke-PraRemoteMailbox.ps1'))
+$versions = [regex]::Matches($runtime, '(?m)^\s*Version\s*:\s*(\d+\.\d+\.\d+)\s*$')
+if ($versions.Count -ne 1) { throw 'A unique runtime version was not found in Invoke-PraRemoteMailbox.ps1.' }
+$version = $versions[0].Groups[1].Value
+$guide = [IO.File]::ReadAllText((Join-Path $root 'docs\PraRemoteMailbox-Guide.md'))
+$guideVersion = [regex]::Match($guide, '(?m)^version:\s*(\S+)').Groups[1].Value
+if ($guideVersion -ne $version) { throw "Guide version $guideVersion differs from runtime version $version." }
+
+$builder = Join-Path $root 'tools\Build-Documentation.ps1'
+$tokens = $null
+$errors = $null
+$ast = [Management.Automation.Language.Parser]::ParseFile($builder, [ref]$tokens, [ref]$errors)
+if ($errors.Count) { throw "Cannot parse the icon source: $builder" }
+$assignment = $ast.Find({ param($node)
+ $node -is [Management.Automation.Language.AssignmentStatementAst] -and $node.Left.Extent.Text -eq '$Icons'
+}, $true)
+if (-not $assignment) { throw "Icon table not found: $builder" }
+$table = $assignment.Right.Find({ param($node) $node -is [Management.Automation.Language.HashtableAst] }, $true)
+if (-not $table) { throw "Literal icon table not found: $builder" }
+$icons = $table.SafeGetValue()
+function Get-ReadmeIcon([string]$Name, [string]$Class = 'icon') {
+ if (-not $icons.ContainsKey($Name)) { throw "Unknown guide icon: $Name" }
+ ""
+}
+$guideHtml = [IO.File]::ReadAllText((Join-Path $root 'docs\PraRemoteMailbox-Guide.html'))
+$css = [regex]::Match($guideHtml, '(?s)').Groups[1].Value
+if (-not $css) { throw 'Guide CSS was not found. Build the HTML guide first.' }
+$css += @'
+html, body { background: #ffffff; }
+html[data-theme="dark"], html[data-theme="dark"] body { background: #0d1117; }
+body { display: block; margin: 0; padding: 0; }
+.canvas { padding: 6px; }
+.rb-hero { margin: 0; padding: 32px 36px 30px; }
+.rb-hero-grid { position: relative; display: grid; grid-template-columns: minmax(0, 1fr) 270px; gap: 34px; align-items: center; }
+.rb-hero h1 { font-size: 35px; }
+.rb-hero .lead { margin: 18px 0 0; font-size: 17px; max-width: none; }
+.rb-hero .badges { margin: 20px 0 0; }
+.rb-stats { position: relative; display: grid; gap: 10px; }
+.rb-stat { display: flex; align-items: center; gap: 14px; padding: 12px 16px; border-radius: 14px; background: var(--cp-panel-strong); border: 1px solid var(--cp-border); box-shadow: 0 1px 2px rgba(0, 0, 0, 0.08); }
+.rb-stat b { font-size: 30px; line-height: 1; color: var(--cp-accent); font-weight: 750; min-width: 40px; text-align: center; }
+.rb-stat span { font-size: 13px; color: var(--cp-text-muted); line-height: 1.35; }
+.rb-stat strong { display: block; color: var(--cp-text); font-size: 14px; }
+'@
+$badges = @(
+ "Version $version"
+ "$(Get-ReadmeIcon 'terminal' 'icon-sm')Windows PowerShell 5.1"
+ "$(Get-ReadmeIcon 'shield' 'icon-sm')Backup before every change"
+ "$(Get-ReadmeIcon 'tag' 'icon-sm')MIT license"
+) -join ''
+$banner = " When the on-premises Exchange servers are lost, gives every user a mailbox in Exchange Online — users and shared mailboxes, with their permissions — and rolls everything back when Exchange is available again.PRA Remote Mailbox