Use this before publishing a new GitHub Release.
git status --short --ignoredExpected:
- Source/docs are visible as normal changes.
dist/is ignored.build/, caches, logs, and__pycache__/are not committed.
python -m venv .venv
.\.venv\Scripts\python.exe -m pip install -r .\requirements-build.txt -r .\requirements-dev.txt
npm ci
npx playwright install chromium
.\.venv\Scripts\python.exe -m ruff check .
.\.venv\Scripts\python.exe -m pytest -q
node --check .\web\app.js
npm run test:js
npm run test:browser
.\.venv\Scripts\python.exe -m pip_audit -r .\requirements-build.txt
.\.venv\Scripts\python.exe .\scripts\scan_secrets.py --json
npm audit --audit-level=highThe mandatory portable build does not require a signing identity:
.\.venv\Scripts\python.exe .\build_windows.pyRecord the reported Authenticode status and never describe an unsigned artifact
as signed. For the optional protected signing path, confirm the
release-signing environment is
restricted to main, has an approval rule where supported, and contains
FOGLIGHT_SIGN_PFX_BASE64, FOGLIGHT_SIGN_PFX_PASSWORD, and
FOGLIGHT_TIMESTAMP_URL. Manually dispatch release-windows.yml; it must
repeat the complete source gates before it imports the certificate and its
always() cleanup must run after the artifact step.
Optional signed build:
$env:FOGLIGHT_SIGN_CERT_SHA1 = "YOUR_CERTIFICATE_THUMBPRINT"
$env:FOGLIGHT_TIMESTAMP_URL = "YOUR_RFC3161_TIMESTAMP_URL"
.\.venv\Scripts\python.exe .\build_windows.py --require-signatureExpected output:
dist\Foglight.exe
dist\SHA256SUMS.txt
Run the deterministic clean/upgrade/corruption/restart and retained-offline suites first:
.\.venv\Scripts\python.exe .\scripts\smoke_packaged_release.py --exe .\dist\Foglight.exe
.\.venv\Scripts\python.exe .\scripts\smoke_packaged_offline.py --exe .\dist\Foglight.exeBoth must exit zero. The release candidate must also prove that the exact no-flags executable—not a source launcher—ingests live keyless data:
.\.venv\Scripts\python.exe .\scripts\smoke_packaged_release.py `
--exe .\dist\Foglight.exe --require-liveThis gate requires Overview/V2 to be enabled automatically, at least two live providers, and at least one rendered incident. Record external outages as such; never replace this release evidence with a shell-only pass.
Then use this minimal manual listener check if desired:
$env:FOGLIGHT_NO_BROWSER = "1"
$env:FOGLIGHT_PORT = "19877"
$p = Start-Process -FilePath ".\dist\Foglight.exe" -WindowStyle Hidden -PassThru
Invoke-WebRequest -UseBasicParsing -Uri "http://127.0.0.1:19877/api/ping"
Invoke-WebRequest -UseBasicParsing -Uri "http://127.0.0.1:19877/"
Invoke-WebRequest -UseBasicParsing -Uri "http://127.0.0.1:19877/api/settings"
Invoke-WebRequest -UseBasicParsing -Uri "http://127.0.0.1:19877/vendor/leaflet/leaflet.js"
Invoke-WebRequest -UseBasicParsing -Uri "http://127.0.0.1:19877/assets/natural-earth-110m-countries.v5.1.1.geojson"
$conn = Get-NetTCPConnection -LocalPort 19877 -State Listen -ErrorAction SilentlyContinue
if ($conn) { Stop-Process -Id $conn.OwningProcess -Force }
if (-not $p.HasExited) { Stop-Process -Id $p.Id -Force }
Remove-Item Env:FOGLIGHT_NO_BROWSER
Remove-Item Env:FOGLIGHT_PORTGet-FileHash -Algorithm SHA256 .\dist\Foglight.exe
Get-Content .\dist\SHA256SUMS.txt
Get-AuthenticodeSignature .\dist\Foglight.exeRequired for every published artifact:
- SHA-256 output matches
SHA256SUMS.txt. - Authenticode status is recorded accurately as
ValidorNotSigned. - Local listener is
127.0.0.1, never0.0.0.0. - A POST to
/api/settingswithoutX-Foglight-Tokenreturns 403. - Every required provider is
approvedinconfig/provider_registry.v1.json. - Conditional providers remain optional or have a documented approval/replacement.
- The default map does not depend on commercial hosted-tile rights.
If endpoint protection quarantines the artifact, preserve the vendor detection record and submit the exact artifact hash as a false positive. Do not disable endpoint protection or publish an artifact that cannot pass the packaged smoke suite.
Run:
.\dist\Foglight.exeCheck:
- Desktop window opens.
- Dashboard renders.
- Live TV panel shows tabs and a YouTube fallback link.
- Settings opens and closes.
- Map renders with attribution visible.
- Native log has no
WebView startup failedentry.
Log path:
%LOCALAPPDATA%\Foglight\logs\native.log
Create a version tag:
git tag v0.2.0
git push origin v0.2.0Create the GitHub Release and upload the exe:
gh release create v0.2.0 .\dist\Foglight.exe#Foglight.exe .\dist\SHA256SUMS.txt `
--title "Foglight v0.2.0 - Zero-Setup Global Events Dashboard" `
--notes-file .\docs\RELEASE_NOTES_v0.2.0.mdSuggested release title:
Foglight v0.2.0 - Zero-Setup Global Events Dashboard
Suggested notes:
- Single portable Windows exe.
- Direct release download:
Foglight.exe. - No Python, WSL, Docker, Git, or Node required for users.
- Uses local WebView2 desktop window.
- Runtime state stored under
%LOCALAPPDATA%\Foglight\. - Live data depends on third-party public feeds.