Kaniff Kaniff contributors
winget install --id=Kaniff.Kaniff -e A developer Swiss Army knife CLI: IP, Base64, JWT, hash, JSON and more.
winget install --id=Kaniff.Kaniff -e A developer Swiss Army knife CLI: IP, Base64, JWT, hash, JSON and more.
Your developer Swiss Army knife — the little online tools you always google for, in one offline app. Available as a CLI and a desktop GUI (Windows now, Linux/macOS ready via Avalonia).
Every day you need a one-off tool: decode a Base64 string, check your public IP, peek inside a JWT, format some JSON. Kaniff keeps them all in a single place, offline, no ads, no "accept cookies".
| Tool | CLI verb | What it does |
|---|---|---|
| My IP | ip | Public IPv4 and IPv6 (ifconfig.me + fallbacks) and local addresses |
| DNS Lookup | dns | Resolve a host to addresses, or an IP back to a name |
| Port Check | port | Test whether a TCP port is open (what telnet host port is for) |
| Base64 | base64 | Encode/decode text (standard or URL-safe) |
| URL Encode | url | Percent-encode/decode text for URLs |
| JWT | jwt | Decode a token's header and payload (no verification) |
| Hash | hash | MD5 / SHA-1 / SHA-256 / SHA-512 of text |
| UUID | uuid | Generate random version-4 UUIDs |
| Timestamp | timestamp | Convert Unix time to a date and back |
| Case | case | camelCase, snake_case, kebab-case, and more |
| Color | color | Convert between HEX, RGB and HSL |
| Regex | regex | Test a regex and inspect matches/groups |
| QR Code | qr | Generate a QR code (ASCII or PNG) |
| String Comparer | strcmp | Compare two strings, find the first difference |
| JSON | json | Format, minify and validate JSON |
src/
Kaniff.Core/ Shared tool logic (no UI) — the plugin surface
Kaniff.Cli/ Command-line interface (kaniff.exe)
Kaniff.Desktop/ Avalonia MVVM desktop app
tests/
Kaniff.Tests/ xUnit tests for the Core tools
packaging/ Scoop and winget manifests
docs/images/ Screenshots used by this README
.github/workflows/ CI and release automation
All tools live in Kaniff.Core and are shared by both the CLI and the desktop app.
Once a release is published, pick whichever you prefer:
# .NET global tool (any OS with the .NET 10 runtime)
dotnet tool install --global Kaniff.Cli
# Scoop (Windows)
scoop bucket add kaniff https://github.com/tgspn/scoop-kaniff
scoop install kaniff
# winget (Windows)
winget install Kaniff.Kaniff
Every release ships self-contained
builds — no .NET runtime required. Verify them against SHA256SUMS.txt.
| Platform | CLI | Desktop |
|---|---|---|
| Windows x64 | kaniff--win-x64.zip | kaniff-desktop--win-x64.zip |
| Linux x64 | kaniff--linux-x64.tar.gz | kaniff-desktop--linux-x64.tar.gz |
| Linux arm64 | kaniff--linux-arm64.tar.gz | kaniff-desktop--linux-arm64.tar.gz |
| macOS Apple Silicon | kaniff--osx-arm64.tar.gz | kaniff-desktop--osx-arm64.tar.gz |
| macOS Intel | kaniff--osx-x64.tar.gz | kaniff-desktop--osx-x64.tar.gz |
Only to build from source:
dotnet run --project src/Kaniff.Cli -- [options]
Examples:
kaniff ip # public + local IPs
kaniff ip --local # local only
kaniff dns github.com # A/AAAA records
kaniff dns 8.8.8.8 # reverse lookup
kaniff port github.com 443 # is the port open?
kaniff port db.internal 5432 -t 2 # with a 2-second timeout
kaniff base64 encode "hello" -u # URL-safe Base64
kaniff base64 decode aGVsbG8=
kaniff url encode "a b&c=1"
kaniff jwt
kaniff hash "hello"
kaniff uuid 3 -u # 3 uppercase UUIDs
kaniff timestamp 1700000000 # Unix -> date (empty = now)
kaniff case "hello world" # camelCase, snake_case, ...
kaniff color "#3498db" # HEX/RGB/HSL
kaniff regex "\d+" "abc123" # list matches
kaniff qr "https://example.com" # ASCII QR (use --png file.png for an image)
kaniff strcmp "abc" "abd" -i
kaniff json format '{"a":1}'
echo '{"a":1}' | kaniff json minify # also reads from stdin
kaniff list # list all tools
Build a standalone kaniff.exe:
dotnet publish src/Kaniff.Cli -c Release -r win-x64 --self-contained
dotnet toolPack and install the kaniff command from the local package:
dotnet pack src/Kaniff.Cli -c Release
dotnet tool install --global --add-source ./artifacts/nupkg Kaniff.Cli
kaniff list # now available everywhere
Update or remove it later with dotnet tool update -g Kaniff.Cli / dotnet tool uninstall -g Kaniff.Cli.
The same 13 tools, with a sidebar to switch between them. The window follows your system light/dark theme.
dotnet run --project src/Kaniff.Desktop
![]() | ![]() |
| QR — renders a scannable code from any text | Color — converts between HEX, RGB and HSL |

Hash — MD5, SHA-1, SHA-256 and SHA-512 in one pass.
Contributions are very welcome — especially new tools. See CONTRIBUTING.md for the setup and the step-by-step guide to adding a tool, and note that this project follows a Code of Conduct.
Quick version of adding a new tool:
Kaniff.Core/Tools implementing ITool with its operations.Kaniff.Core/ToolCatalog.cs.case in the CLI (Kaniff.Cli/Program.cs).ViewModel + View pair in the desktop app and list it in MainViewModel.tests/Kaniff.Tests and a row to the tools table above.Everything is automated. Push a tag and the release workflow will:
dotnet tool and push it to NuGet.SHA256SUMS.txt.microsoft/winget-pkgs.git tag v0.1.0
git push origin v0.1.0
Steps 2, 4 and 5 are skipped with a warning when their configuration is missing, so the release still succeeds without them.
| Name | Kind | Used by | How to set it up |
|---|---|---|---|
NUGET_USER | variable | step 2 | Your nuget.org profile name (not your e-mail, and not the package name). Not a secret. |
SCOOP_BUCKET_TOKEN | secret | step 4 | A fine-grained PAT for tgspn/scoop-kaniff only, with Contents: Read and write |
WINGET_TOKEN | secret | step 5 | A classic PAT with the public_repo scope. Fine-grained PATs are not supported by the action. |
NuGet publishing uses Trusted Publishing rather than a stored API key: GitHub issues a short-lived OIDC token, nuget.org validates it against a policy registered for this repository and workflow, and returns a temporary key valid for one hour. Nothing long-lived is stored, so there is no key to rotate or leak. Register the policy under nuget.org → your username → Trusted Publishing with:
| Field | Value |
|---|---|
| Repository Owner | tgspn |
| Repository | kaniff |
| Workflow File | release.yml |
| Environment | (leave empty) |
> A new policy for a repository that has never published is temporarily active > for 7 days. Publish within that window or restart it, otherwise it goes > inactive.
The built-in GITHUB_TOKEN cannot be used for steps 4 and 5 because it is
scoped to this repository and cannot push to another repo or create forks.
Unlike NuGet, winget has no trusted-publishing equivalent yet, so step 5 still
needs a real credential.
Step 5 additionally requires, one time only:
microsoft/winget-pkgs forked under this account — the action pushes to
the fork and does not create it for you.Kaniff.Kaniff to winget-pkgs. Use
Komac or wingetcreate for v0.1.0,
after which every later release is automatic.See packaging/README.md for why the manifests live outside this repository.
Kaniff runs entirely offline except for the public IP lookup. The JWT tool decodes tokens but does not verify signatures. To report a vulnerability, see SECURITY.md.
Licensed under the MIT License.