Winix WhoHolds is a command-line tool designed to identify which processes hold file locks or bind network ports on your system. This utility simplifies troubleshooting by providing insights into resource usage that can otherwise be difficult to track.
Key Features:
File Lock Detection: Quickly find out which processes are holding exclusive locks on specific files, helping you resolve access conflicts.
Port Binding Analysis: Discover which applications or services are listening on network ports, aiding in diagnosing connectivity issues and port conflicts.
Audience & Benefit:
Ideal for developers, system administrators, and IT professionals who need to troubleshoot resource contention. Winix WhoHolds provides a straightforward way to identify and resolve issues related to file access and network port usage, streamlining system management and debugging processes.
This tool is part of the Winix suite, a collection of cross-platform CLI utilities designed to bridge gaps between Windows and Unix-like systems. It can be installed via winget for easy integration into your workflow.
README
Winix
Cross-platform CLI tools for the gaps between Windows and *nix.
Winix is a suite of small, focused command-line tools compiled to native binaries via .NET AOT. Each tool fills a gap where a standard Unix utility either doesn't exist on Windows, has no good cross-platform implementation, or where a modern take can genuinely improve on the original. Tools are designed to be composable — piping, exit codes, and structured output work the way Unix users expect — while also being readable by humans in the terminal with colour, tables, and clear error messages. Windows has powerful scripting, but many of its built-in tools produce output that's difficult to pipe, parse, or read at a glance. Every Winix tool ships as a single native binary with no runtime dependency.
Suite installer — installs and updates all tools via native package managers
Why each tool, on each platform
The biggest value is on Windows, where many of these tools simply don't exist. On Linux and macOS the tools still earn their keep by combining multiple utilities, improving defaults, or providing a consistent interface across platforms. Even where a native equivalent exists, there's value in a single set of tools that behaves identically everywhere — scripts, CI pipelines, and muscle memory transfer across platforms without adaptation.
Tool
Windows
Linux / macOS
timeit
Nothing built-in. Measure-Command exists but doesn't show memory, doesn't pass exit codes, can't be piped.
Improves on time with peak memory, machine-readable JSON, and proper exit-code passthrough.
squeeze
No native CLI for compression. Users install 3+ separate tools or reach for 7-Zip.
One tool instead of separate gzip, brotli, zstd CLIs. Auto-detects format on decompression.
peep
No watch. No entr. PowerShell loops are verbose and don't handle file-watching.
Combines watch (interval) + entr (file-change trigger) in one binary with a TUI.
wargs
No xargs. ForEach-Object is PowerShell-only and doesn't handle parallel execution or line-delimited input well.
Sane defaults over xargs: line-delimited, no -0 needed, correct quoting on all platforms.
files
No find. Get-ChildItem exists but is slow, verbose, and PowerShell-only.
Cleaner than find, with glob patterns, gitignore support, text/binary detection, and JSON output.
treex
Built-in tree is bare-bones (no colour, no sizes, no filtering).
Adds colour, size rollups, gitignore, clickable hyperlinks, and filtering over standard tree.
man
No man at all.
Alternative renderer with colour and hyperlinks. Renders groff natively — no groff install needed. Bundled pager.
less
No pager. more exists but can't scroll back, search, or handle ANSI colour.
Better defaults than system less: ANSI colour on by default, mouse scroll, follow mode.
whoholds
No built-in file-lock query. handle.exe (Sysinternals) requires a separate download + admin rights.
Wraps lsof with cleaner output, structured JSON, and a unified syntax for both files and ports.
schedule
schtasks.exe exists but is notoriously hard to script. No cron syntax.
Unified interface over crontab with the same flags and output format as Windows.
nc
No netcat. Test-NetConnection is verbose and limited.
Consistent behaviour across BSD/GNU/ncat forks. Adds TLS client support and port-range checking.
Download native binaries from GitHub Releases.
Available for Windows (x64), Linux (x64), and macOS (x64, ARM64). Windows binaries are Authenticode-signed.
Quick Start
# Time a build
timeit dotnet build
# Watch tests, re-run on file changes
peep -w "src/**/*.cs" dotnet test
# Compress with zstd
squeeze --zstd largefile.bin
# Find files and batch-process them
files src --ext cs | wargs dotnet format
# Browse a directory tree with sizes
treex --size --gitignore --no-hidden
# Read a man page on any platform
man timeit
# Find what's locking a file
whoholds myapp.dll
# Quick port check
nc -z db.internal 5432
# Schedule a recurring job (cross-platform cron)
schedule add "0 9 * * 1-5" -- backup.sh /data
# JSON output for CI
timeit --json dotnet test
# AI agent metadata
files --describe
For AI agents
Every tool supports --describe for structured JSON metadata (flags, types, examples, composability, exit codes) and --json for machine-parseable output. See llms.txt for a summary and links to per-tool AI agent guides in docs/ai/.