Locate your position on modern Windows
name: locate-on-windows
by cute-omega · published 2026-03-22
$ claw add gh:cute-omega/cute-omega-locate-on-windows---
name: locate-on-windows
description: >
Geolocate the current Windows machine using the native WinRT Location API (PowerShell 5.1).
No external API keys, no browser, no dependencies — uses Windows.Devices.Geolocation directly.
Trigger when user asks to locate themselves, find their position, or for device-based geolocation
(as opposed to IP-based geolocation). Outputs latitude, longitude, and accuracy in meters.
---
# Locate your position on modern Windows
Locate the Windows machine using the built-in WinRT `Windows.Devices.Geolocation` API.
Usage
Save the script below as `geolocate.ps1` and run:
powershell.exe -ExecutionPolicy Bypass -File geolocate.ps1Returns JSON:
{
"error": false,
"message": "ok",
"latitude": 35.6762,
"longitude": 139.6503,
"accuracy_m": 1500,
"timestamp": "2026-01-01T08:00:00.0000000+09:00"
}Script
# geolocate.ps1 — Windows Geolocation via WinRT (PowerShell 5.1 only)
Add-Type -AssemblyName "System.Runtime.WindowsRuntime"
[Windows.Devices.Geolocation.Geolocator, Windows.Devices.Geolocation, ContentType=WindowsRuntime] | Out-Null
try {
$geo = New-Object Windows.Devices.Geolocation.Geolocator
$geo.DesiredAccuracy = [Windows.Devices.Geolocation.PositionAccuracy]::Default
$geo.DesiredAccuracyInMeters = 100
$asyncOp = $geo.GetGeopositionAsync()
$asTask = [System.WindowsRuntimeSystemExtensions].GetMethods() |
Where-Object {
$_.Name -eq 'AsTask' -and
$_.GetParameters().Count -eq 1 -and
$_.GetParameters()[0].ParameterType.IsGenericType -and
$_.GetParameters()[0].ParameterType.Name.StartsWith('IAsyncOperation')
} | Select-Object -First 1
if (-not $asTask) {
$output = [Ordered]@{
error = $true
message = "Cannot resolve AsTask<T> overload"
latitude = 0.0
longitude = 0.0
accuracy_m = 0
timestamp = [datetime]::Now.ToString("o")
}
Write-Output ($output | ConvertTo-Json)
exit 1
}
$genericMethod = $asTask.MakeGenericMethod([Windows.Devices.Geolocation.Geoposition])
$task = $genericMethod.Invoke($null, @($asyncOp))
$task.Wait()
$pos = $task.Result
$output = [Ordered]@{
error = $false
message = "ok"
latitude = [math]::Round($pos.Coordinate.Point.Position.Latitude, 6)
longitude = [math]::Round($pos.Coordinate.Point.Position.Longitude, 6)
accuracy_m = $pos.Coordinate.Accuracy
timestamp = $pos.Coordinate.Timestamp.ToString("o")
}
Write-Output ($output | ConvertTo-Json)
} catch {
$output = [Ordered]@{
error = $true
message = $_.Exception.Message
latitude = 0.0
longitude = 0.0
accuracy_m = 0
timestamp = [datetime]::Now.ToString("o")
}
Write-Output ($output | ConvertTo-Json)
exit 1
}How It Works
1. Loads `System.Runtime.WindowsRuntime` for WinRT type resolution.
2. Instantiates `Windows.Devices.Geolocation.Geolocator`.
3. Calls `GetGeopositionAsync()` — returns `IAsyncOperation<Geoposition>`.
4. Converts to `Task<T>` via reflection on `System.WindowsRuntimeSystemExtensions.AsTask<T>`.
5. Blocks with `.Wait()` and outputs JSON.
The location source depends on hardware: GPS (if present), WiFi triangulation, or IP fallback. Typical WiFi accuracy is 1–3 km.
Requirements
Reverse Geocoding
Use the coordinates with any free reverse-geocoding service:
curl -s "https://api.bigdatacloud.net/data/reverse-geocode-client?latitude=35.6762&longitude=139.6503"Troubleshooting
More tools from the same signal band
Order food/drinks (点餐) on an Android device paired as an OpenClaw node. Uses in-app menu and cart; add goods, view cart, submit order (demo, no real payment).
Sign plugins, rotate agent credentials without losing identity, and publicly attest to plugin behavior with verifiable claims and authenticated transfers.
The philosophical layer for AI agents. Maps behavior to Spinoza's 48 affects, calculates persistence scores, and generates geometric self-reports. Give your...