Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
105 commits
Select commit Hold shift + click to select a range
30a7b87
v1.8.1: Set context menus in Killer Sans UI like the rest of the inte…
SteveTheKiller Oct 15, 2026
a939fc5
v1.8.2: Let Windows supply the busy installer message in the user's l…
SteveTheKiller Oct 15, 2026
40b3e26
v1.8.2: Hide the device table, Services and Topology grain when Film …
SteveTheKiller Oct 15, 2026
1d4b127
v1.8.2: Set the version to 1.8.2 and the dialog and History headings …
SteveTheKiller Oct 15, 2026
ae9ef0e
v1.8.2: Set the history sidebar heading in Lacquer, keeping Killer Sa…
SteveTheKiller Oct 15, 2026
75038d1
v1.8.2: Check for updates on startup with an Always check on startup …
SteveTheKiller Oct 15, 2026
e6d551d
v1.8.2: Soften the toolbar shadow in the Light theme
SteveTheKiller Oct 15, 2026
c052a74
v1.8.2: Set the history detail header at the same size as the Scan Hi…
SteveTheKiller Oct 15, 2026
97fca1f
v1.8.2: Check the Scan Profiles heading against the Lacquer heading f…
SteveTheKiller Oct 15, 2026
3b5183d
v1.8.2: Keep the Scan History sidebar wide enough for its dates at an…
SteveTheKiller Oct 15, 2026
0f069ac
v1.8.2: Read Chocolatey validation from the package feed instead of t…
SteveTheKiller Oct 15, 2026
e722579
v1.8.2: Match the family Film Grain service summary
SteveTheKiller Oct 15, 2026
05768dc
v1.8.2: Stop the website top bar from leaving extra space under the w…
SteveTheKiller Oct 15, 2026
5beeb3b
v1.8.2: Center the theme and language radio rings and the Film Grain …
SteveTheKiller Oct 15, 2026
dac3174
v1.8.2: Keep icon glyphs out of screen readers so they read the contr…
SteveTheKiller Oct 15, 2026
b7ed9be
v1.8.2: Add Alt+Shift+G to turn Film Grain on or off
SteveTheKiller Oct 15, 2026
2853aa1
v1.8.2: Warn instead of failing when Chocolatey validation is still p…
SteveTheKiller Oct 15, 2026
86c11c2
v1.8.2: Use the family string keys for the startup update check
SteveTheKiller Oct 15, 2026
70c9962
v1.8.2: Use the family string keys for the About update notice and Up…
SteveTheKiller Oct 15, 2026
4297d38
v1.8.2: Keep the Light theme Yellow accent yellow with a dark shadow …
SteveTheKiller Oct 16, 2026
fbd76c7
v1.8.2: Update landing screenshots, captions in all languages and REA…
SteveTheKiller Oct 16, 2026
50b378e
v1.8.2: Translate the deep scan status and the remaining English labe…
SteveTheKiller Oct 16, 2026
67f5b1f
v1.8.2: Outline yellow text and icons in thin gray on the Light theme…
SteveTheKiller Oct 16, 2026
adb9ea6
v1.8.2: Keep the website Light theme Yellow accent yellow with a thin…
SteveTheKiller Oct 16, 2026
7a0ec79
v1.8.2: Regenerate the Light Yellow website wordmark in yellow with a…
SteveTheKiller Oct 16, 2026
16b6e5a
v1.8.2: Name Steve the Killer as the author and copyright holder in t…
SteveTheKiller Oct 16, 2026
7a11d7c
v1.8.1: Match the Store listing CSV to the Partner Center export lang…
SteveTheKiller Oct 16, 2026
ec5caaf
v1.8.2: Pick readable text on accent fills on the website
SteveTheKiller Oct 16, 2026
6f651f2
v1.8.2: Translate the remaining English strings
SteveTheKiller Oct 16, 2026
d3f2198
v1.8.2: Translate the website's MCP page and contact cards, use the a…
SteveTheKiller Oct 16, 2026
a5dc083
v1.8.2: Put the file picker close on the family OverlayCloseButton in…
SteveTheKiller Oct 16, 2026
22d2ff4
v1.8.2: Remove the unused TabCloseBtn style
SteveTheKiller Oct 16, 2026
1e7bd7b
v1.8.2: Add Microsoft Store buttons to the website and fix phone-widt…
SteveTheKiller Oct 16, 2026
d22118d
v1.8.2: Name every part of each scroll bar for screen readers
SteveTheKiller Oct 16, 2026
55bf5b1
v1.8.2: Raise gray, menu and accent text to 4.5:1 contrast in every t…
SteveTheKiller Oct 17, 2026
22a4bbc
v1.8.2: Explain on the website MCP page why Claude Desktop runs Kille…
SteveTheKiller Oct 17, 2026
3388b55
v1.8.2: Outline Light Orange like Light Yellow, keep the dark Red acc…
SteveTheKiller Oct 17, 2026
b30da2f
v1.8.2: Fix mistranslations in the app strings and website
SteveTheKiller Oct 17, 2026
bebde33
v1.8.2: Keep the PATH entry type and variables, announce the change, …
SteveTheKiller Oct 17, 2026
8691cd3
v1.8.2: Load the HTML report wordmark from killerscan.net in the repo…
SteveTheKiller Oct 17, 2026
50d021d
v1.8.2: Draw the keyboard focus outline as a thin solid ring in the t…
SteveTheKiller Oct 17, 2026
bd23a6f
v1.8.2: Raise primary, outline and secondary buttons on a soft drop s…
SteveTheKiller Oct 17, 2026
8f07109
v1.8.2: Move keyboard focus into the shortcuts and About cards, keep …
SteveTheKiller Oct 17, 2026
aca4bcd
v1.8.2: Skip hidden hyperlinks on Tab instead of stopping on them inv…
SteveTheKiller Oct 17, 2026
93461d5
v1.8.2: Expose the family focus ring for focusable elements that are …
SteveTheKiller Oct 17, 2026
329b9ea
v1.8.2: Tab past the device, service and history lists in one stop an…
SteveTheKiller Oct 17, 2026
c3a2524
v1.8.2: Report empty text and hidden scroll bar parts as off screen s…
SteveTheKiller Oct 18, 2026
f0f600c
v1.8.2: Make each radio group one Tab stop that lands on the selected…
SteveTheKiller Oct 18, 2026
4895324
v1.8.2: Read a blank host name, MAC address or vendor cell as Unknown…
SteveTheKiller Oct 18, 2026
cfa1e43
v1.8.2: Open the window inside the work area of the monitor it starts…
SteveTheKiller Oct 18, 2026
78d3d11
v1.8.2: Trim the extra height from toolbar buttons with text under th…
SteveTheKiller Oct 18, 2026
121ea99
v1.8.2: Add KillerBench and KillerShot to the website's Also try cards
SteveTheKiller Oct 18, 2026
57bd9c4
v1.8.2: Draw the website's Also try icons larger
SteveTheKiller Oct 18, 2026
cadb351
v1.8.2: Wrap long tooltips at 300 px, put a trailing shortcut on its …
SteveTheKiller Oct 18, 2026
e21d5aa
v1.8.2: Replace the KillerBench Also try icon with a copy made on thi…
SteveTheKiller Oct 18, 2026
8c3cec3
v1.8.2: Center the rail buttons and collapse arrow across the rail wi…
SteveTheKiller Oct 18, 2026
b41414a
v1.8.2: Resolve shared namespaces in offscreen UI checks
SteveTheKiller Oct 18, 2026
ab5e5fd
v1.8.2: Match confirmation outlines to the app frame
SteveTheKiller Oct 18, 2026
bd8c20a
v1.8.2: Match input and terminal-font outlines to the app frame
SteveTheKiller Oct 18, 2026
8fa44d7
v1.8.2: Keep pane shadows theme-aware and off the footer
SteveTheKiller Oct 18, 2026
350e5ae
v1.8.2: Undo changes from the family backlog task
SteveTheKiller Oct 18, 2026
e9c4e02
v1.8.2: Use the generic Marshal.SizeOf overload in snap layouts
SteveTheKiller Oct 18, 2026
f0344f6
v1.8.2: Give file picker rows their folder and file names for screen …
SteveTheKiller Oct 18, 2026
60a02aa
v1.8.2: Accept bare command names and show simplified command examples
SteveTheKiller Oct 18, 2026
c19d676
v1.8.2: Honor Windows contrast themes for application controls
SteveTheKiller Oct 18, 2026
b3c2c66
v1.8.2: Keep shortcut category headings readable in Windows contrast …
SteveTheKiller Oct 18, 2026
53fbd48
v1.8.2: Remove decorative icon and card shadows in Windows contrast t…
SteveTheKiller Oct 18, 2026
31ee17d
v1.8.2: Soften the film grain with the family tile that leans toward …
SteveTheKiller Oct 18, 2026
1eb5e69
v1.8.2: Draw the keyboard focus outline as a one-pixel dotted ring
SteveTheKiller Oct 18, 2026
f9f5c41
v1.8.2: Sit the title bar subtitle on the Killer baseline
SteveTheKiller Oct 18, 2026
a27d9ad
v1.8.2: Draw a visible outer app border in Windows contrast themes
SteveTheKiller Oct 18, 2026
c5e2fa2
v1.8.2: Keep CSV exports from running device and scan text as spreads…
SteveTheKiller Oct 19, 2026
db42e9c
v1.8.2: Count unique addresses against the scan target limit (#11)
SteveTheKiller Oct 19, 2026
e764780
v1.8.2: Load the KillerFamily.Layout tooltip converter in the isolate…
SteveTheKiller Oct 19, 2026
cca9ef8
v1.8.2: Make HTML report column sorting keyboard accessible with aria…
SteveTheKiller Oct 19, 2026
3f39dcb
v1.8.2: Bound public subnet expansion before allocation (#13)
SteveTheKiller Oct 19, 2026
7c44bf3
v1.8.2: Check Chocolatey links before pushing and explain push reject…
SteveTheKiller Oct 19, 2026
4b69e30
v1.8.2: Confirm a jsDelivr link at its release tag when the Chocolate…
SteveTheKiller Oct 19, 2026
56ac962
v1.8.2: Submit each release to the Microsoft Store after the GitHub r…
SteveTheKiller Oct 19, 2026
7a96e8a
v1.8.2: Keep a bare dash in CSV exports for hosts with no open ports …
SteveTheKiller Oct 19, 2026
ef2e94a
v1.8.2: Leave relative PATH entries alone when registering or removin…
SteveTheKiller Oct 19, 2026
a6faf3d
v1.8.2: Bring the HTML report logo back after switching away from 98SE
SteveTheKiller Oct 19, 2026
d342b01
v1.8.2: Use dark hover text on outline buttons in the Light theme's O…
SteveTheKiller Oct 19, 2026
4b7d162
v1.8.2: Translate the website top bar's More button label
SteveTheKiller Oct 19, 2026
bb78c2d
v1.8.2: Give the footer copyright a 20px trailing margin so it clears…
SteveTheKiller Oct 19, 2026
31ca9c6
v1.8.2: Date the release 2026-10-19 and describe the new command, acc…
SteveTheKiller Oct 19, 2026
0d78118
v1.8.2: Fill the WinGet description and website from the Chocolatey n…
SteveTheKiller Oct 19, 2026
6e4624c
v1.8.2: refresh OUI vendor database
SteveTheKiller Oct 19, 2026
f98a897
v1.8.2: site and README release info
SteveTheKiller Oct 19, 2026
5411f77
v1.8.3: Open the 1.8.3 development version
SteveTheKiller Oct 19, 2026
aa39789
v1.8.3: Cover the whole title bar with film grain so no black line sh…
SteveTheKiller Oct 19, 2026
4ddc42d
v1.8.3: Treat a 403 or 429 from the runner as a warning in the Chocol…
SteveTheKiller Oct 19, 2026
ab60ddf
v1.8.3: Center radio and checkbox indicators on their label's capital…
SteveTheKiller Oct 19, 2026
e97e919
v1.8.3: Open the theme and language menus beside their own rail buttons
SteveTheKiller Oct 19, 2026
cdb0917
v1.8.3: Center the selected radio dot in its ring and measure the lab…
SteveTheKiller Oct 19, 2026
4ee5a53
v1.8.3: Open the sidebar wide enough for every date and shrink its te…
SteveTheKiller Oct 19, 2026
4943344
v1.8.3: Release discarded sidebar rows, measure the default width at …
SteveTheKiller Oct 19, 2026
18e4baa
v1.8.3: Bring the sidebar scrollbar up against the resize handle
SteveTheKiller Oct 19, 2026
3361146
v1.8.3: Date the release 2026-10-19
SteveTheKiller Oct 19, 2026
39e18ba
v1.8.3: Keep the radio and outline hover checks silent unless they fail
SteveTheKiller Oct 19, 2026
2a66d3f
v1.8.3: refresh OUI vendor database
SteveTheKiller Oct 19, 2026
633d72f
v1.8.3: site and README release info
SteveTheKiller Oct 19, 2026
5b82353
v1.8.4: Keep Help and settings scrollbars at the edge with overflow cues
SteveTheKiller Oct 19, 2026
b769f7b
v1.8.4: Use the one-line summary for the WinGet descriptions
SteveTheKiller Oct 19, 2026
c8407e6
Merge upstream main and preserve Slovenian fork features
MrCodeLabs Oct 20, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
59 changes: 51 additions & 8 deletions .github/workflows/chocolatey-release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -37,42 +37,82 @@ jobs:
(Get-Content $nuspec) -replace 'REPLACE_VERSION', $version | Set-Content $nuspec
(Get-Content $install) -replace 'REPLACE_HASH', $hash | Set-Content $install

# Chocolatey moderation rejects links it cannot use, so check them before submitting.
# A 403 or 429 from this runner is not a broken link: Cloudflare in front of our own sites
# and jsDelivr refuse many GitHub runner addresses while the same page loads for people and
# for moderators. Only a missing page, an unreachable host or a raw.githubusercontent.com
# link stops the push.
[xml]$spec = Get-Content $nuspec -Raw
$meta = $spec.package.metadata
$problems = @()
foreach ($field in 'packageSourceUrl','projectUrl','iconUrl','licenseUrl','projectSourceUrl','docsUrl','bugTrackerUrl','releaseNotes') {
$url = [string]$meta.$field
if ($url -notmatch '^https?://') { continue }
if (([uri]$url).Host -eq 'raw.githubusercontent.com') { $problems += "$field uses raw.githubusercontent.com, which Chocolatey does not accept: $url"; continue }
try { $null = Invoke-WebRequest -Uri $url -UseBasicParsing -TimeoutSec 60 }
catch {
$status = 0
if ($_.Exception.Response) { $status = [int]$_.Exception.Response.StatusCode }
if ($status -eq 403 -or $status -eq 429) {
Write-Host "::warning::$field answered $status to this runner, which is bot protection refusing GitHub's addresses, not a missing page: $url"
continue
}
$problems += "$field did not load: $url ($($_.Exception.Message))"
}
}
if ($problems) { $problems | ForEach-Object { Write-Host "::error::$_" }; throw "The nuspec has links Chocolatey moderation will reject." }

# Pack and push
choco pack choco\killerscan.nuspec --out "$env:RUNNER_TEMP"
if ($LASTEXITCODE -ne 0) { throw "choco pack failed." }
$package = "$env:RUNNER_TEMP\killerscan.$version.nupkg"
choco push $package --source https://push.chocolatey.org --api-key $env:CHOCO_API_KEY
if ($LASTEXITCODE -ne 0) { throw "choco push failed." }
if ($LASTEXITCODE -ne 0) {
# Chocolatey answers most rejections with a bare 403, so report what the package page shows.
$page = "https://community.chocolatey.org/packages/killerscan"
try {
$html = (Invoke-WebRequest $page -UseBasicParsing -TimeoutSec 60).Content
foreach ($row in [regex]::Matches($html, '<td class="version"\s*>[\s\S]*?<span>([^<]+)</span>[\s\S]*?</tr>')) {
$held = $row.Groups[1].Value.Trim()
$badge = [regex]::Match($row.Value, 'class="badge[^"]*">([^<]+)<').Groups[1].Value.Trim()
if ($badge -and $badge -notmatch 'Approved|Exempted') { Write-Host "::error::Version $held is in moderation: $badge. See $page/$held" }
}
} catch { Write-Host "Could not read $page : $($_.Exception.Message)" }
throw "choco push was rejected. An earlier version in moderation with none approved blocks new pushes. Other causes are an API key that does not own the package or a version that already exists."
}
"CHOCO_VERSION=$version" >> $env:GITHUB_ENV
"CHOCO_PACKAGE=$package" >> $env:GITHUB_ENV

# A successful push is not an accepted package. Chocolatey validates it later, and its
# validator sometimes fails with "We were unable to find a package" while its own service
# is degraded; its instruction is to upload the package again. Watch the result, re-push
# once on a failure, and fail this job if validation still fails so it never goes unnoticed.
# The package page is cached and can show Pending for hours after validation passes, so the
# result is read from the package feed instead.
- name: Wait for Chocolatey validation
shell: pwsh
timeout-minutes: 170
env:
CHOCO_API_KEY: ${{ secrets.CHOCOLATEY_API_KEY }}
run: |
$page = "https://community.chocolatey.org/packages/killerscan/$env:CHOCO_VERSION"
$feed = "https://community.chocolatey.org/api/v2/Packages(Id='killerscan',Version='$env:CHOCO_VERSION')"
$repushed = $false
$pendingSinceRepush = $false
$deadline = (Get-Date).AddMinutes(160)
while ((Get-Date) -lt $deadline) {
Start-Sleep -Seconds 300
try {
$html = (Invoke-WebRequest $page -UseBasicParsing -TimeoutSec 90).Content
$entry = (Invoke-WebRequest $feed -UseBasicParsing -TimeoutSec 90).Content
} catch {
Write-Host "Package page unavailable: $($_.Exception.Message). Retrying."
Write-Host "Package feed unavailable: $($_.Exception.Message). Retrying."
continue
}
$state = [regex]::Match($html, 'Validation Testing (Passed|Failed|Pending)').Groups[1].Value
$state = [regex]::Match($entry, '<d:PackageValidationResultStatus>(\w+)</d:PackageValidationResultStatus>').Groups[1].Value
Write-Host "$(Get-Date -Format HH:mm:ss) validation: $(if ($state) { $state } else { 'not shown' })"
if ($state -eq 'Passed') { exit 0 }
if ($state -eq 'Pending' -and $repushed) { $pendingSinceRepush = $true }
if ($state -ne 'Failed') { continue }
if ($state -like 'Pass*') { exit 0 }
if ($repushed -and $state -and $state -notlike 'Fail*') { $pendingSinceRepush = $true }
if ($state -notlike 'Fail*') { continue }
if (-not $repushed) {
Write-Host "Validation failed. Pushing the same package again as Chocolatey instructs."
choco push $env:CHOCO_PACKAGE --source https://push.chocolatey.org --api-key $env:CHOCO_API_KEY
Expand All @@ -82,4 +122,7 @@ jobs:
throw "Chocolatey validation failed twice. See $page"
}
}
throw "Chocolatey validation did not pass within 160 minutes. See $page"
# Chocolatey's queue often takes longer than this. The package is already pushed, so a
# validation that is still pending is a warning, not a failed release.
Write-Host "::warning::Chocolatey validation was still pending after 160 minutes. The package was pushed. See $page"
exit 0
22 changes: 22 additions & 0 deletions .github/workflows/winget-release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,11 @@ jobs:
submit:
runs-on: windows-latest
steps:
# The WinGet description comes from the Chocolatey nuspec at the released tag.
- uses: actions/checkout@v4
with:
ref: ${{ github.event.release.tag_name || github.event.inputs.tag }}

# Prints what WINGET_TOKEN actually is, so a failure downstream is never guesswork again.
# An empty x-oauth-scopes means a FINE-GRAINED token, which authenticates fine, reads fine,
# and cannot create the branch komac needs. That failure is reported as
Expand Down Expand Up @@ -157,6 +162,23 @@ jobs:
Set-Content $installer $text -NoNewline -Encoding utf8
Select-String -Path $installer -Pattern 'InstallerType|DisplayVersion'

# komac also copies the previous locale manifest, which carried a Description cut off
# mid-word and the old website. Fill both description fields with the nuspec's one-line
# summary. The full feature list sent 1.8.2 and 1.8.3 to manual policy review
# (Policy-Test-2.7); the short text is what passed automatically before.
[xml]$spec = Get-Content (Join-Path $env:GITHUB_WORKSPACE 'choco\killerscan.nuspec') -Raw
$meta = $spec.package.metadata
$summary = $meta.summary.Trim()
if ($summary.Length -gt 256) { Write-Error "The nuspec summary is longer than WinGet's 256-character ShortDescription"; exit 1 }
$locale = Join-Path $dir 'SteveTheKiller.KillerScan.locale.en-US.yaml'
if (-not (Test-Path $locale)) { Write-Error "komac did not write $locale"; exit 1 }
$loc = (Get-Content $locale -Raw) -replace '\r\n', "`n"
$loc = [regex]::Replace($loc, '(?m)^PackageUrl:[^\n]*', { param($m) 'PackageUrl: ' + $meta.projectUrl.Trim() })
$loc = [regex]::Replace($loc, '(?m)^ShortDescription:[^\n]*', { param($m) "ShortDescription: '" + $summary.Replace("'", "''") + "'" })
$loc = [regex]::Replace($loc, '(?m)^Description:[^\n]*\n(?:(?:[ \t]+[^\n]*)?\n)*?(?=[A-Za-z])', { param($m) "Description: '" + $summary.Replace("'", "''") + "'`n" })
Set-Content $locale $loc -NoNewline -Encoding utf8
Select-String -Path $locale -Pattern '^(PackageUrl|ShortDescription|Description):'

# komac picks a fresh GUID for its branch name every run, so a retry never collides
# with a half-finished attempt.
$delays = @(60, 150, 300)
Expand Down
Loading
Loading