All notable changes to COOLForge_Lib will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Calendar Versioning (YYYY.MM.DD.N).
- Launcher template + generator (
launchers/_template.ps1,launchers/_manifest.json,tools/generate-launchers.py) — all 41 launchers are now generated from a single template; future boilerplate changes require editing one file and runningpython3 tools/generate-launchers.py
- Launcher debug noise —
[DEBUG] PinnedVersion=...and[DEBUG] LibraryUrl=...were printing unconditionally on every run because$DebugScriptswas parsed after those lines; debug level is now parsed first so all debug output is correctly gated - Hostname Mismatch: auto-set blank Level.io device name — when Level.io has no device name for a device, the script now renames the Level.io device to match the Windows hostname via the API; previously it silently skipped the check. Graceful fallback to assumed-match if no API key or Device ID is available
- MD5SUMS stale hash —
modules/COOLForge-Common.psm1hash was out of date, causing spurious library re-downloads on every launcher run - MD5SUMS path prefix —
./prefix stripping inGet-ScriptPathFromMD5andGet-ExpectedMD5fixed - ScreenConnect MSI blocked by policy — falls back to EXE installer when error 1625 (install policy blocked) is returned
- ScreenConnect base URL whitespace — leading whitespace in
policy_screenconnect_baseurlcaused double-scheme URLs (https://https://...) - PS4 compatibility — replaced
::new()constructor syntax and-AsHashtableparameter with PS4-compatible equivalents across all scripts - Double BOM on launcher files — fixed UTF-8 BOM being written twice on launcher save
- TLS 1.2 enforcement — added
[Net.ServicePointManager]::SecurityProtocol = Tls12to all launchers and standalone scripts - JWT encryption + API key masking — security hardening in library
- All 41 launchers bumped from
v2026.01.22.01→v2026.01.31.02 - Hostname Mismatch script bumped to
v2026.01.21.15 - LAUNCHER-VERSIONS.json all entries updated to
v2026.01.31.02
- All launchers — debug noise fix and version bump require re-upload
- Policy infrastructure false alert —
_wasCreated→_createdproperty mismatch in screenconnect, huntress, and meshcentral policy scripts caused "infrastructure created - please configure" alerts even when fields already existed - ScreenConnect version header mismatch — header said
2026.01.19.01but$ScriptVersionwas2026.01.31.01, preventing cache updates on deployed machines - Huntress launcher missing field pass-throughs —
policy_huntress_account_key,policy_huntress_org_key,policy_huntress_tagswere not being passed from Level.io to the script - tags.json huntress customFields — was missing
policy_huntress_account_key,policy_huntress_org_key,policy_huntress_tags
- Bumped screenconnect, huntress, meshcentral policy scripts to
2026.02.10.01 - Bumped library to
2026.02.10.01
launchers/Policy/👀huntress.ps1— added 3 missing{{cf_*}}field pass-throughs (account_key, org_key, tags)
- CIPP browser extension policy (
👀cipp.ps1) — manages CyberDrain CIPP extension for Chrome and Edge via ExtensionSettings registry policies, 3rdparty managed storage with custom branding, and tenant ID binding viapolicy_cipp_tenantid - Bitwarden browser extension policy (
👀bitwarden.ps1) — manages Bitwarden extension for Chrome and Edge, cleans up user-installed duplicates from ExtensionInstallForcelist - Force Remove Dropbox (
⛔Force Remove Dropbox.ps1) — standalone removal script - Force Remove Foxit (
⛔Force Remove Foxit.ps1) — standalone removal script - Force Remove McAfee (
⛔Force Remove McAfee.ps1) — standalone removal script policy_ok_ratswhitelist — RAT detection script now supports auto-baseline on first run, storing approved tools in a custom fieldpolicy_other_msp_screenconnectfield for whitelisting partner ScreenConnect instances in Non MSP removal script- Field self-bootstrapping for CIPP (
policy_cipp_tenantid), RAT detection (policy_ok_rats), and Non MSP ScreenConnect removal (policy_other_msp_screenconnect) - Launchers for all new scripts
- RAT detection script upgraded with comprehensive removal capabilities for AnyDesk, TeamViewer, RustDesk, Splashtop, and Chrome Remote Desktop
- Non MSP ScreenConnect removal now supports partner instance whitelisting
- Standalone AnyDesk removal script — consolidated into the RAT detection script
TagNameparameter onInitialize-SoftwarePolicyInfrastructure— allows scripts to use a different name for tags vs custom fields (e.g. ScreenConnect usesSCtags butpolicy_screenconnectfields)- Stale field cleanup — when
TagNamediffers fromSoftwareName, any leftoverpolicy_$TagNamefield (e.g.policy_sc) is automatically detected and deleted Get-BinariesFolderfunction in library — shared installer storage under the scratch folder'sbinaries/directory- PE header validation in MeshCentral script — verifies downloaded
.exestarts withMZbefore attempting install
- ScreenConnect script now passes
-SoftwareName "screenconnect" -TagName "sc"toInitialize-SoftwarePolicyInfrastructure, fixing thepolicy_scvspolicy_screenconnectfield name mismatch - ScreenConnect script version bumped to
2026.01.31.01 - MeshCentral script installer changed from
.mshto.exewith-fullinstallflag, addedUnblock-Filefor MOTW, usesGet-BinariesFolderfor storage - MeshCentral script version bumped to
2026.01.31.01
tools/Update-MD5Sums.ps1now strips UTF-8 BOM before hashing, matching the launcher'sGet-ContentMD5verification method — previously generated incorrect hashes for BOM files causing perpetual library re-downloads- MD5SUMS recomputed with BOM-stripped method for all files
- Terminology section in README explaining Module, Script, Launcher, Template, Custom Field
- Module functions summary table in README showing all 14 exported functions
- Launcher usage guide with step-by-step instructions for deploying to Level.io
- Auto-update test script (
testing/Test_AutoUpdate_Dev.ps1) for dev branch testing - Documentation for 4 additional functions:
Get-LevelGroups,Get-LevelDevices,Find-LevelDevice,Send-LevelWakeOnLan
- Renamed project from COOLForgeLib to COOLForge_Lib throughout codebase
- Config filename changed from
.COOLForgeLib-setup.jsonto.COOLForge_Lib-setup.json - Fixed regex bug in launchers: URL path now uses
/COOLForge/instead of/COOLForgeLib/ - Updated benefits section to emphasize Git-based script management
- Version pinning via
CoolForge_pin_psmodule_to_versioncustom field- Pin devices to specific release tags (e.g.,
v2025.12.29) - Enables staged rollouts, rollback capability, and production stability
- Launchers v2025.12.29.01 updated with version pinning support
- Pin devices to specific release tags (e.g.,
- Setup wizard (
start_here/Setup-COOLForge.ps1)- Interactive script to create and configure Level.io custom fields
- Uses Level.io API to check existing fields and create missing ones
- Suggests version pinning for stability
- Handles both required and optional fields
- Launcher template and all launchers updated to v2025.12.29.01
- README updated with Version Pinning section and Automated Setup instructions
- Test Variable Output script (
👀Test Variable Output.ps1) - Demonstrates all methods for setting Level.io automation variables- Configurable via
$VariablesToSetparameter (use "all" or comma-separated list) - Tests strings, numbers, booleans, dates, system info, JSON, special characters, and more
- Configurable via
- Automation Variables documentation - New README section explaining
{{variable_name=value}}syntax - tools/ folder with
Update-MD5SUMS.ps1for generating file checksums
- Launcher
$ScriptToRunvalues now correctly point to their respective scripts⛔Force Remove Anydesk.ps1⛔Force Remove Non MSP ScreenConnect.ps1👀Check for Unauthorized Remote Access Tools.ps1
- Emoji encoding repair -
Repair-LevelEmojifunction fixes UTF-8 emoji corruption from Level.io deployment- Supports: ⛔ 👀 🙏 🚨 🛑 ✅ 🔚 🆕
- Handles multiple corruption patterns (UTF-8 byte interpretation, Level.io-specific encoding)
- URL encoding -
Get-LevelUrlEncodedfunction for proper UTF-8 emoji handling in URLs - MD5 checksum verification - Scripts and library are verified against
MD5SUMSfile - Script Launcher - Run scripts from GitHub without redeploying to Level.io
- Automatic version checking and updates
- Backup/restore safety for corrupted downloads
- All Level.io variables passed to downloaded scripts
- RAT detection script (
👀Check for Unauthorized Remote Access Tools.ps1)- Detects 60+ remote access tools
- ScreenConnect whitelisting via instance ID
- Authorized RMM tools whitelist
- ScreenConnect removal script (
⛔Force Remove Non MSP ScreenConnect.ps1)- 5-phase removal process (graceful to forceful)
- MSP instance ID whitelisting
- Default library URL - Scripts work without
ps_module_library_sourcecustom field
- Library URL is now optional (defaults to official repository)
- Improved library auto-update with backup/restore logic
- Initial release of COOLForge_Lib
- Core library (
COOLForge-Common.psm1) with functions:Initialize-LevelScript- Tag gate system, lockfile managementWrite-LevelLog- Standardized timestamped loggingInvoke-LevelScript- Wrapped execution with error handlingComplete-LevelScript- Clean exit with custom messagesRemove-LevelLockFile- Manual lockfile cleanupTest-LevelAdmin- Administrator privilege checkGet-LevelDeviceInfo- Common device propertiesInvoke-LevelApiCall- REST API helper with bearer auth
- Script template for creating new scripts
- Launcher template for GitHub-based script deployment
- AnyDesk removal script (
⛔Force Remove Anydesk.ps1) - Test script (
👀Test Show Versions.ps1)