Joe will let you know when the link is updated for you.
What I do with your information
When you hire me, I collect what I need to help you with the work: your contact and billing details, notes on what I did, and basic information about the devices and accounts I work on. I store your information on an encrypted Mac and in a handful of named services I use to run my business, which are listed in the full policy. I do not sell your data and I do not share it for marketing.
You can ask me at any time to:
For the full details — what I collect during a service engagement, how I handle credentials, the services I use, how long I keep things, and how to reach me with a question — read the full privacy policy.
please submit a ticket
Please login or create an account to access the Customer Support Portal
Not registered? Create an account
Forgot your password? Reset password
Already have an account? Login
Find the section for the issue you are troubleshooting. Use the copy button on any code block, then provide it to the client.
sw_vers
system_profiler SPHardwareDataType
whoami
id
man <command>
top
ps aux
kill <PID>
killall Finder
df -h
du -sh *
diskutil list
diskutil info diskXsY
diskutil verifyVolume /
diskutil repairVolume diskXsY
/sbin/fsck -fy /dev/diskXsY
ls -la
chmod 755 <path>
chown user:group <path>
xattr -l <path>
xattr -d com.apple.quarantine <path>
ifconfig
networksetup -listallhardwareports
ping <host>
traceroute <host>
scutil --dns
nc -vz <host> <port>
log show --style syslog --last 1h
log show --predicate 'eventMessage contains "error"' --last 1h
log show --predicate 'process == "Safari"' --last 1h
log stream --style syslog
softwareupdate -l
sudo softwareupdate -i -a
launchctl list
sudo launchctl kickstart -k system/com.apple.some-service
sudo shutdown -r now
dscl . list /Users
dscl . read /Users/username
id username
ls -l /Users
nvram -p
nvram boot-args
csrutil status
tmutil listbackups
The commands Joe actually reaches for during client Zoom calls.
sw_vers
system_profiler SPHardwareDataType
softwareupdate -l
rm -rf ~/Library/Containers/com.microsoft.OneDrive-mac/Data/Library/Caches
chmod +x clear-cloud-cache.sh
./clear-cloud-cache.sh
OneDrive: Forces full metadata re-sync. Large libraries take 10–30 min.
Google Drive: DriveFS cache can be several GB. Re-downloads thumbnails + recent file metadata.
Dropbox: Re-indexes on restart, can spike CPU.
Teams: Loses cached conversations/images until re-fetched. Slow first launch.
Slack: Loses cached messages, files, search index. Workspace reload ~1 min per workspace.
Spotify: Downloaded/offline music will need to re-download.
Chrome/Safari/Firefox: Websites load slower on first visit after clearing.
VS Code: Extensions may re-initialize.
Name|process_name|Caution text|~/path/to/cache1;~/path/to/cache2
iwr -useb christitus.com/win | iex. GUI for app removal, OEM debloat, tweaks (privacy / performance / gaming), install/uninstall standard apps, Windows update controls. Use case: One-stop debloat + tweaks + targeted app removal. GitHub.Get-AppxPackage | Select Name, PackageFullName
Get-AppxPackage *XboxGamingOverlay* | Remove-AppxPackage
USB Drive Root
├── [Windows-to-Go OS Files]
├── C:\Tools\
│ ├── Uninstall\ (Revo, BCU)
│ ├── Debloat\ (WinUtil, Win11Debloat, AppBuster)
│ ├── Diagnostics\
│ ├── Networking\
│ └── Docs\
└── PortableApps\ (accessible without booting)
# Service Report: [Client Name]
Date: [Date]
Technician: [Your Name]
## What I Removed
- [Software] — [Reason: Bloatware/Trial/Duplicate]
## What I Changed
- Disabled [X] startup programs
## Recommendations
- Consider uninstalling [Software] if not needed
## What You Should Know
- System restore point: [Name/Date]
- Removed items can be reinstalled from Microsoft Store or vendor site
## Follow-Up
- [Issues to monitor]
- [Scheduled check-in date]
Run this once at every Windows tech visit, before doing any cleanup work. It captures the machine's identity, OS version, security state (BitLocker, Defender, registered antivirus products), primary account type, installed apps, startup items, Wi-Fi info, and disk health into a single JSON file. The JSON is ingested into the Tech Inventory database in Notion so there's a record on file the next time the client calls.
powershell, right-click "Windows PowerShell" in the results, choose "Run as administrator", click Yes on the UAC prompt. The window title should read "Administrator: Windows PowerShell".LastName, FirstName format and a short device description (e.g., "Husband's Desktop", "Office Laptop").LastName, FirstName - Device Description - YYYY-MM-DD.json.WARNING: lines may appear for individual commands that didn't return data — expected; the script catches them and continues.disk_encryption will read Unknown. Close PowerShell, reopen as administrator, run again.Ctrl+V). Press Enter.# Tech Inventory — Windows capture
# Joe's Tech Support — joestechsupport.com
#
# Run in an ELEVATED PowerShell window. (Right-click "Windows PowerShell" → "Run as administrator.")
# When prompted, enter the client name and a short device description.
# A JSON file is written to the current user's Desktop.
#
# Filename convention: "LastName, FirstName - Device Description - YYYY-MM-DD.json"
#
# The JSON file is the source artifact for Tech Inventory ingestion in Notion.
# ===== Prompt for client + device =====
function Get-RequiredInput {
param([string]$Prompt)
do {
$value = (Read-Host $Prompt).Trim()
if (-not $value) { Write-Host " (required)" -ForegroundColor Yellow }
} until ($value)
return $value
}
Write-Host ""
Write-Host "Tech Inventory - Windows capture" -ForegroundColor Cyan
Write-Host "--------------------------------" -ForegroundColor Cyan
Write-Host "This script captures system identity, OS, security posture, account type, disks,"
Write-Host "displays, Wi-Fi, installed apps, and startup items. Output is a single JSON file"
Write-Host "on the current user's Desktop."
Write-Host ""
$ClientLastFirst = Get-RequiredInput "Client name (LastName, FirstName)"
$DeviceDesc = Get-RequiredInput "Device description (e.g., 'Husband's Desktop', 'Office Laptop')"
# ======================================
$ErrorActionPreference = 'Continue'
$ScanDate = (Get-Date).ToString('yyyy-MM-dd')
$Filename = "$ClientLastFirst - $DeviceDesc - $ScanDate.json"
$OutFile = Join-Path -Path "$env:USERPROFILE\Desktop" -ChildPath $Filename
function Try-Block {
param([scriptblock]$Block, [string]$Label)
try { & $Block } catch { Write-Warning "[$Label] $($_.Exception.Message)"; return $null }
}
Write-Host ""
Write-Host "Capturing system info... this takes 10-30 seconds." -ForegroundColor Cyan
# --- Core system info ---
$ci = Try-Block { Get-ComputerInfo } 'Get-ComputerInfo'
$cs = Try-Block { Get-CimInstance Win32_ComputerSystem } 'Win32_ComputerSystem'
$bios = Try-Block { Get-CimInstance Win32_BIOS } 'Win32_BIOS'
$device_name = $ci.CsName
$manufacturer = $ci.CsManufacturer
$model = $ci.CsModel
$serial_number = $bios.SerialNumber
$os_version = "$($ci.WindowsProductName) $($ci.WindowsVersion) (build $($ci.OsBuildNumber))"
$firmware_version = "$($ci.BiosManufacturer) $($ci.BiosName) v$($ci.BiosVersion -join '/') ($($ci.BiosReleaseDate))"
$last_boot = if ($ci.OsLastBootUpTime) { $ci.OsLastBootUpTime.ToString('o') } else { $null }
$ram_gb = [math]::Round($ci.OsTotalVisibleMemorySize / 1MB, 1)
# --- Activation status ---
$activation_raw = Try-Block {
Get-CimInstance SoftwareLicensingProduct -Filter "Name like 'Windows%' AND PartialProductKey IS NOT NULL" |
Select-Object -First 1 -ExpandProperty LicenseStatus
} 'Activation'
$windows_activation = switch ($activation_raw) {
1 { 'Activated' }
$null { 'Unknown' }
default { 'Not Activated' }
}
# --- BitLocker (requires admin) ---
$bl = Try-Block { Get-BitLockerVolume -MountPoint 'C:' } 'BitLocker'
$disk_encryption =
if ($null -eq $bl) { 'Unknown' }
elseif ($bl.ProtectionStatus -eq 'On') { 'BitLocker Enabled' }
elseif ($bl.ProtectionStatus -eq 'Off' -and $bl.VolumeStatus -match 'Encrypted') { 'BitLocker Suspended' }
elseif ($bl.ProtectionStatus -eq 'Off') { 'Off' }
else { 'Unknown' }
# --- Windows Defender ---
$mp = Try-Block { Get-MpComputerStatus } 'Get-MpComputerStatus'
# --- Registered AV products (Windows Security Center) ---
$av_products = Try-Block {
Get-CimInstance -Namespace root/SecurityCenter2 -ClassName AntiVirusProduct -ErrorAction Stop
} 'SecurityCenter2'
$av_status = if ($av_products) {
($av_products | ForEach-Object { "$($_.displayName) [productState=0x$('{0:X}' -f $_.productState)]" }) -join '; '
} else { 'Unable to query SecurityCenter2 (Server SKU or admin rights issue?)' }
# --- Account / domain ---
$dsreg = (Try-Block { dsregcmd /status 2>&1 } 'dsregcmd') -join "`n"
$is_aad = $dsreg -match 'AzureAdJoined\s*:\s*YES'
$is_workplace = $dsreg -match 'WorkplaceJoined\s*:\s*YES'
$msa_users = Try-Block {
Get-LocalUser | Where-Object { $_.Enabled -and $_.PrincipalSource -eq 'MicrosoftAccount' }
} 'LocalUser'
$primary_account_type =
if ($cs.PartOfDomain) { "Domain / AD ($($cs.Domain))" }
elseif ($is_aad) { 'Azure AD / Entra ID' }
elseif ($msa_users) { 'Microsoft Account' }
elseif ($is_workplace) { 'Microsoft Account (workplace)' }
else { 'Local Windows' }
# --- Storage / SMART ---
$disks = Try-Block { Get-PhysicalDisk } 'Get-PhysicalDisk'
$capacity = if ($disks) {
($disks | ForEach-Object { "$($_.MediaType) $([math]::Round($_.Size/1GB)) GB ($($_.HealthStatus))" }) -join '; '
} else { '' }
$smart_status =
if (-not $disks) { 'Unknown' }
elseif ($disks.HealthStatus -contains 'Unhealthy') { 'Failing' }
elseif ($disks.HealthStatus -contains 'Warning') { 'Warning' }
elseif (($disks.HealthStatus | Select-Object -Unique) -eq 'Healthy') { 'Verified' }
else { 'Unknown' }
# --- Display ---
$displays = Try-Block { Get-CimInstance Win32_VideoController } 'Win32_VideoController'
$resolution = if ($displays) {
($displays | Where-Object { $_.CurrentHorizontalResolution } |
ForEach-Object { "$($_.CurrentHorizontalResolution)x$($_.CurrentVerticalResolution)" }) -join '; '
} else { '' }
# --- Wi-Fi (if connected) ---
$wifi_raw = (Try-Block { netsh wlan show interfaces 2>&1 } 'Wi-Fi') -join "`n"
$ssid = if ($wifi_raw -match '(?m)^\s*SSID\s*:\s*(.+)$') { $matches[1].Trim() } else { '' }
$wifi_protocol = if ($wifi_raw -match '(?m)^\s*Radio type\s*:\s*(.+)$') { $matches[1].Trim() } else { '' }
$wifi_security = if ($wifi_raw -match '(?m)^\s*Authentication\s*:\s*(.+)$') { $matches[1].Trim() } else { '' }
$connection_type = if ($ssid) { 'Wi-Fi' } else { 'Wired or unknown' }
# --- Default browser ---
$default_browser = Try-Block {
(Get-ItemProperty 'HKCU:\Software\Microsoft\Windows\Shell\Associations\UrlAssociations\http\UserChoice' `
-ErrorAction Stop).ProgId
} 'DefaultBrowser'
# --- Installed apps (uninstall-registry sweep) ---
$apps = New-Object System.Collections.Generic.List[object]
$reg_paths = @(
'HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*',
'HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*',
'HKCU:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*'
)
foreach ($rp in $reg_paths) {
$hits = Try-Block {
Get-ItemProperty $rp -ErrorAction SilentlyContinue |
Where-Object { $_.DisplayName -and -not $_.SystemComponent } |
Select-Object DisplayName, DisplayVersion, Publisher, InstallDate
} "Apps:$rp"
if ($hits) { $hits | ForEach-Object { $apps.Add($_) } }
}
$apps_unique = $apps | Sort-Object DisplayName -Unique
# --- Startup items ---
$startup = Try-Block {
Get-CimInstance Win32_StartupCommand | Select-Object Name, Command, User, Location
} 'Startup'
# --- Compose payload ---
$record = [ordered]@{
record_type = 'Computer'
scan_date = $ScanDate
client_name = $ClientLastFirst
device_name = $device_name
manufacturer = $manufacturer
model = $model
serial_number = $serial_number
os_family = 'Windows'
os_version = $os_version
firmware_version = $firmware_version
disk_encryption = $disk_encryption
av_status = $av_status
primary_account_type = $primary_account_type
last_boot = $last_boot
windows_activation = $windows_activation
capacity = $capacity
resolution = $resolution
smart_status = $smart_status
ssid = $ssid
protocol = $wifi_protocol
security = $wifi_security
connection_type = $connection_type
source_file = $Filename
notes = ''
aux = [ordered]@{
ram_gb = $ram_gb
default_browser = $default_browser
part_of_domain = $cs.PartOfDomain
domain = $cs.Domain
defender = if ($mp) { @{
AntivirusEnabled = $mp.AntivirusEnabled
RealTimeProtection = $mp.RealTimeProtectionEnabled
BehaviorMonitor = $mp.BehaviorMonitorEnabled
OnAccessProtection = $mp.OnAccessProtectionEnabled
SignatureLastUpdated = $mp.AntivirusSignatureLastUpdated
EngineVersion = $mp.AMEngineVersion
} } else { $null }
av_products = $av_products | Select-Object displayName, productState, pathToSignedReportingExe
disks = $disks | Select-Object Model, MediaType, Size, HealthStatus, OperationalStatus, BusType, SerialNumber
displays = $displays | Select-Object Name, CurrentHorizontalResolution, CurrentVerticalResolution, VideoModeDescription
apps = $apps_unique
startup = $startup
wifi_raw = $wifi_raw
dsregcmd = $dsreg
}
}
$record | ConvertTo-Json -Depth 8 | Out-File -FilePath $OutFile -Encoding utf8
Write-Host ""
Write-Host "Capture complete." -ForegroundColor Green
Write-Host "File: $OutFile"
Write-Host "Size: $((Get-Item $OutFile).Length) bytes"
Write-Host ""
Write-Host "Copy this file to your USB / send to yourself, then bring it back to Claude or S(Ai)mon for ingestion."