A Scoop helper program for shimming executables
118
stars
43
commits
Zig
primary language
Sep 4, 2026
updated
A small program that launches the executable specified in its paired <name>.shim file. A helper for Scoop, the Windows command-line installer.
path = <path to executable>
args = <arguments>
cwd = <working directory>
elevate = true|false|1|0|yes|no
NAME = <environment variable override>
Lines starting with #, ;, or //, as well as blank lines, are ignored.
| Field | Description |
|---|---|
path | (Required) Path to the target executable |
args | Arguments passed to the target |
cwd (workdir) | Working directory for the target process |
elevate (runas) | Request UAC elevation. Valid values: true, 1, yes |
| Any other name | Environment variable set for the target process |
Values may be wrapped in double quotes (e.g. path = "C:\Program Files\app.exe") or left unquoted.
%ENV% — Expands environment variables in path, args, cwd, and environment override values. Unknown variables (e.g. %NONEXISTENT_VAR%) are preserved as-is.%~dp0 — Expands to the directory containing the target executable with a trailing backslash. Applies to args and cwd only (not path).User-provided runtime arguments are appended after those defined in args.
Any line whose key is not path, args, cwd, workdir, elevate, or runas is treated as an environment variable override for the child process. Keys are case-insensitive.
The shim waits for the child process to finish and forwards its exit code. If the shim fails internally, it exits with code 1.
The .shim file must share the same base name as the shim.exe.
New-Item -Path test.shim -Value 'path = C:\Windows\System32\calc.exe'
Copy-Item -Path .\cpp\bin\x64\shim.exe -Destination .\test.exe
.\test.exe
windows-sys raw FFI bindings. Cargo build.wWinMainCRTStartup entry. Zig build only.All implementations share the same .shim format.
| Implementation | Build Tool | x86 | x64 | arm64 |
|---|---|---|---|---|
| C# | dotnet | 16.0 KB | 15.0 KB | 15.0 KB |
| C++ | Zig | 117.0 KB | 141.5 KB | 133.0 KB |
| C++ | MSBuild | 116.0 KB | 140.5 KB | 122.5 KB |
| Rust | Cargo | 113.0 KB | 130.5 KB | 126.0 KB |
| Zig | Zig | 81.5 KB | 72.0 KB | 21.5 KB |
Benchmarked with C:\Windows\System32\whoami.exe (built-in) via hyperfine — 20 warmup + 50 measured runs per implementation (randomized order). Architecture: x64.
| Implementation | Mean [ms] | vs Direct | Extra [ms] |
|---|---|---|---|
| direct | 89.9 ± 39.7 | 1.00 | — |
| C# | 113.8 ± 11.4 | 1.27× ± 0.57 | +23.9 |
| C++ | 176.1 ± 33.7 | 1.96× ± 0.94 | +86.2 |
| Zig | 178.6 ± 32.9 | 1.99× ± 0.95 | +88.7 |
| Rust | 193.0 ± 24.0 | 2.15× ± 0.99 | +103.2 |
All shims share the same .shim format overhead; variance is dominated by process creation and file I/O. C# benefits from the CLR already being warm in typical Scoop sessions.
cs/README.mdcpp/README.mdrust/README.mdzig/README.mdtest/run-tests.ps1benchmark/README.mdcs/v<version> → C# release lanecpp/v<version> → C++ release lanerust/v<version> → Rust release lanezig/v<version> → Zig release laneAll build.ps1 scripts accept -Target x86|x64|arm64 and -Configuration Debug|Release (default Release). Output is written to bin/{Target}/shim.exe.
This repository builds upon the work of several independent projects that pioneered faster, more reliable Scoop shims:
71/scoop-better-shimexe — The groundbreaking C implementation that solved Ctrl+C passthrough and eliminated .NET startup overhead.
kiennq/scoop-better-shimexe — C++ fork of 71's work, adding MSBuild support and the cwd field to the shim format.
zoritle/rshim — Rust implementation focused on memory safety and proper UTF-8 BOM handling.
svercl/zshim — Pure Zig port that proved a shim can be built with zero runtime dependencies.
This project is dual-licensed under the Unlicense or the MIT License.
You may choose either license.
Zig
27.4%
PowerShell
25.0%
Rust
16.3%
C#
16.0%
C++
15.3%
A Scoop helper program for shimming executables
118
stars
43
commits
Zig
primary language
Sep 4, 2026
updated
A small program that launches the executable specified in its paired <name>.shim file. A helper for Scoop, the Windows command-line installer.
path = <path to executable>
args = <arguments>
cwd = <working directory>
elevate = true|false|1|0|yes|no
NAME = <environment variable override>
Lines starting with #, ;, or //, as well as blank lines, are ignored.
| Field | Description |
|---|---|
path | (Required) Path to the target executable |
args | Arguments passed to the target |
cwd (workdir) | Working directory for the target process |
elevate (runas) | Request UAC elevation. Valid values: true, 1, yes |
| Any other name | Environment variable set for the target process |
Values may be wrapped in double quotes (e.g. path = "C:\Program Files\app.exe") or left unquoted.
%ENV% — Expands environment variables in path, args, cwd, and environment override values. Unknown variables (e.g. %NONEXISTENT_VAR%) are preserved as-is.%~dp0 — Expands to the directory containing the target executable with a trailing backslash. Applies to args and cwd only (not path).User-provided runtime arguments are appended after those defined in args.
Any line whose key is not path, args, cwd, workdir, elevate, or runas is treated as an environment variable override for the child process. Keys are case-insensitive.
The shim waits for the child process to finish and forwards its exit code. If the shim fails internally, it exits with code 1.
The .shim file must share the same base name as the shim.exe.
New-Item -Path test.shim -Value 'path = C:\Windows\System32\calc.exe'
Copy-Item -Path .\cpp\bin\x64\shim.exe -Destination .\test.exe
.\test.exe
windows-sys raw FFI bindings. Cargo build.wWinMainCRTStartup entry. Zig build only.All implementations share the same .shim format.
| Implementation | Build Tool | x86 | x64 | arm64 |
|---|---|---|---|---|
| C# | dotnet | 16.0 KB | 15.0 KB | 15.0 KB |
| C++ | Zig | 117.0 KB | 141.5 KB | 133.0 KB |
| C++ | MSBuild | 116.0 KB | 140.5 KB | 122.5 KB |
| Rust | Cargo | 113.0 KB | 130.5 KB | 126.0 KB |
| Zig | Zig | 81.5 KB | 72.0 KB | 21.5 KB |
Benchmarked with C:\Windows\System32\whoami.exe (built-in) via hyperfine — 20 warmup + 50 measured runs per implementation (randomized order). Architecture: x64.
| Implementation | Mean [ms] | vs Direct | Extra [ms] |
|---|---|---|---|
| direct | 89.9 ± 39.7 | 1.00 | — |
| C# | 113.8 ± 11.4 | 1.27× ± 0.57 | +23.9 |
| C++ | 176.1 ± 33.7 | 1.96× ± 0.94 | +86.2 |
| Zig | 178.6 ± 32.9 | 1.99× ± 0.95 | +88.7 |
| Rust | 193.0 ± 24.0 | 2.15× ± 0.99 | +103.2 |
All shims share the same .shim format overhead; variance is dominated by process creation and file I/O. C# benefits from the CLR already being warm in typical Scoop sessions.
cs/README.mdcpp/README.mdrust/README.mdzig/README.mdtest/run-tests.ps1benchmark/README.mdcs/v<version> → C# release lanecpp/v<version> → C++ release lanerust/v<version> → Rust release lanezig/v<version> → Zig release laneAll build.ps1 scripts accept -Target x86|x64|arm64 and -Configuration Debug|Release (default Release). Output is written to bin/{Target}/shim.exe.
This repository builds upon the work of several independent projects that pioneered faster, more reliable Scoop shims:
71/scoop-better-shimexe — The groundbreaking C implementation that solved Ctrl+C passthrough and eliminated .NET startup overhead.
kiennq/scoop-better-shimexe — C++ fork of 71's work, adding MSBuild support and the cwd field to the shim format.
zoritle/rshim — Rust implementation focused on memory safety and proper UTF-8 BOM handling.
svercl/zshim — Pure Zig port that proved a shim can be built with zero runtime dependencies.
This project is dual-licensed under the Unlicense or the MIT License.
You may choose either license.
Zig
27.4%
PowerShell
25.0%
Rust
16.3%
C#
16.0%
C++
15.3%