# Sterling Compatibility Checker # ------------------------------ # Checks whether your PC can run each Sterling tier. # Runs entirely on your machine. Nothing is transmitted anywhere. # # Usage: right-click this file and choose "Run with PowerShell", or run # from a PowerShell window: .\sterling_check.ps1 $ErrorActionPreference = 'Continue' function Write-Line { param([string]$Label, [string]$Value, [string]$Color = 'Gray') Write-Host (" {0,-18} " -f $Label) -NoNewline Write-Host $Value -ForegroundColor $Color } function Pass { param([string]$Msg) Write-Host " [PASS] $Msg" -ForegroundColor Green } function Fail { param([string]$Msg) Write-Host " [FAIL] $Msg" -ForegroundColor Red } function Warn { param([string]$Msg) Write-Host " [WARN] $Msg" -ForegroundColor Yellow } Write-Host "" Write-Host "Sterling Compatibility Checker" -ForegroundColor Cyan Write-Host "==============================" -ForegroundColor Cyan Write-Host "" # --- Operating system ---------------------------------------------------- $os = Get-CimInstance Win32_OperatingSystem $osName = $os.Caption $osVersion = [Version]$os.Version $osOk = $osName -match 'Windows (10|11|Server)' Write-Host "Operating system" -ForegroundColor Cyan Write-Line 'Name' $osName Write-Line 'Version' $osVersion if ($osOk) { Pass "Windows 10 or later" } else { Fail "Sterling requires Windows 10 or later." } Write-Host "" # --- CPU ----------------------------------------------------------------- $cpu = Get-CimInstance Win32_Processor | Select-Object -First 1 $cores = [int]$cpu.NumberOfCores Write-Host "CPU" -ForegroundColor Cyan Write-Line 'Name' $cpu.Name Write-Line 'Physical cores' $cores if ($cores -ge 8) { Pass "Meets Elite recommendation (8+ cores)" } elseif ($cores -ge 6) { Pass "Meets Pro recommendation (6+ cores)" } elseif ($cores -ge 4) { Pass "Meets Lite/Standard (quad-core)" } else { Fail "Quad-core CPU or better required" } Write-Host "" # --- RAM ----------------------------------------------------------------- $totalRamGB = [math]::Round($os.TotalVisibleMemorySize / 1MB, 1) Write-Host "System memory" -ForegroundColor Cyan Write-Line 'Total RAM' ("{0} GB" -f $totalRamGB) if ($totalRamGB -ge 32) { Pass "Meets Elite (32 GB)" } elseif ($totalRamGB -ge 16) { Pass "Meets Pro / Standard (16 GB)" } elseif ($totalRamGB -ge 8) { Pass "Meets Lite (8 GB)" } else { Fail "At least 8 GB of RAM is required" } Write-Host "" # --- GPU / VRAM ---------------------------------------------------------- Write-Host "GPU" -ForegroundColor Cyan $gpus = Get-CimInstance Win32_VideoController $nvidia = $gpus | Where-Object { $_.Name -match 'NVIDIA' } | Select-Object -First 1 $vramGB = 0 if ($nvidia) { # Win32_VideoController caps at 4 GB on some systems due to DWORD math; # try nvidia-smi first if available for an accurate number. $smi = Get-Command nvidia-smi -ErrorAction SilentlyContinue if ($smi) { try { $mib = (& nvidia-smi --query-gpu=memory.total --format=csv,noheader,nounits | Select-Object -First 1).Trim() if ($mib) { $vramGB = [math]::Round([int]$mib / 1024, 1) } } catch {} } if ($vramGB -le 0) { $vramGB = [math]::Round($nvidia.AdapterRAM / 1GB, 1) } Write-Line 'Name' $nvidia.Name Write-Line 'Driver' $nvidia.DriverVersion Write-Line 'VRAM' ("{0} GB" -f $vramGB) if ($vramGB -ge 24) { Pass "Meets Elite (24 GB VRAM, RTX 4090+)" } elseif ($vramGB -ge 12) { Pass "Meets Pro (12 GB VRAM, RTX 4070+)" } elseif ($vramGB -ge 6) { Pass "Meets Standard (6 GB VRAM, RTX 2060+)" } elseif ($vramGB -ge 4) { Pass "Meets Lite (4 GB VRAM, GTX 1060+)" } else { Fail "At least 4 GB of NVIDIA VRAM is required" } } else { foreach ($g in $gpus) { Write-Line 'Detected' $g.Name } Fail "No NVIDIA GPU detected. Sterling requires an NVIDIA GPU." } Write-Host "" # --- Disk space ---------------------------------------------------------- Write-Host "Disk space" -ForegroundColor Cyan $sysDrive = ($env:SystemDrive).TrimEnd(':') $vol = Get-Volume -DriveLetter $sysDrive -ErrorAction SilentlyContinue if ($vol) { $freeGB = [math]::Round($vol.SizeRemaining / 1GB, 1) Write-Line ("Free on {0}:" -f $sysDrive) ("{0} GB" -f $freeGB) if ($freeGB -ge 40) { Pass "Meets Elite (40 GB)" } elseif ($freeGB -ge 25) { Pass "Meets Pro (25 GB)" } elseif ($freeGB -ge 15) { Pass "Meets Standard (15 GB)" } elseif ($freeGB -ge 10) { Pass "Meets Lite (10 GB)" } else { Fail "At least 10 GB of free disk space is required" } } else { Warn "Could not read system drive capacity." } Write-Host "" # --- Ollama -------------------------------------------------------------- Write-Host "Ollama" -ForegroundColor Cyan $ollama = Get-Command ollama -ErrorAction SilentlyContinue if ($ollama) { try { $ver = (& ollama --version 2>$null) Write-Line 'Installed' $ver Pass "Ollama is installed" } catch { Warn "ollama binary found but could not report version" } } else { Warn "Ollama not detected. Sterling's installer will offer to install it." } Write-Host "" Write-Host "Done. Nothing was transmitted — these results live only on your screen." -ForegroundColor Cyan Write-Host "" Read-Host 'Press Enter to close' | Out-Null