{"id":50677110,"url":"https://github.com/trinvh/hexkit","last_synced_at":"2026-06-08T16:05:17.486Z","repository":{"id":361327041,"uuid":"1253729424","full_name":"trinvh/hexkit","owner":"trinvh","description":"Fast offline DevUtils alternative with 38+ developer utilities for macOS, Windows, and Linux","archived":false,"fork":false,"pushed_at":"2026-05-30T05:22:16.000Z","size":2013,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-30T07:06:00.814Z","etag":null,"topics":["devutils","hexkit","toolkit"],"latest_commit_sha":null,"homepage":"https://hexkit.apps.trinvh.com/","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/trinvh.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-29T18:55:47.000Z","updated_at":"2026-05-30T06:07:02.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/trinvh/hexkit","commit_stats":null,"previous_names":["trinvh/hexkit"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/trinvh/hexkit","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/trinvh%2Fhexkit","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/trinvh%2Fhexkit/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/trinvh%2Fhexkit/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/trinvh%2Fhexkit/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/trinvh","download_url":"https://codeload.github.com/trinvh/hexkit/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/trinvh%2Fhexkit/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34069512,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-08T02:00:07.615Z","response_time":111,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["devutils","hexkit","toolkit"],"created_at":"2026-06-08T16:05:16.333Z","updated_at":"2026-06-08T16:05:17.477Z","avatar_url":"https://github.com/trinvh.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Hexkit\n\n\u003cp align=\"center\"\u003e\n  \u003cimg\n    src=\"docs/screenshots/text-diff-checker.png\"\n    alt=\"Hexkit's Text Diff Checker comparing two XML snippets with per-line highlighting\"\n    width=\"900\"\n  /\u003e\n\u003c/p\u003e\n\nA fast, **offline** developer toolbox for macOS, Windows, and Linux — ~40 everyday\nencoding, formatting, conversion, and inspection tools in one keyboard-driven app.\nEverything runs locally; nothing you paste ever leaves your machine.\n\nBuilt with **Tauri** (Rust core + system WebView) and **React 19**. All tool logic\nlives in a pure Rust crate, so the same engine powers the desktop app, a headless\nCLI, and `hexkit://` deep links.\n\n\u003e **License:** PolyForm Noncommercial 1.0.0 — free for personal and other\n\u003e non-commercial use. Commercial use requires a paid license. See\n\u003e [License \u0026 commercial use](#license--commercial-use).\n\n---\n\n## Demo\n\nBrowse every Hexkit tool with annotated screenshots at\n**\u003chttps://hexkit.apps.trinvh.com/demo\u003e** — no install needed. The\nsidebar mirrors the desktop app's categories; scroll-spy keeps the\nlist in sync as you scan.\n\nFor the real thing, [download an installer](https://github.com/trinvh/hexkit/releases)\nor [build from source](#getting-started). Everything stays on your\nmachine — the demo page is just the screenshots.\n\n## Highlights\n\n- **100% offline** — all processing happens in local Rust; no network calls.\n- **Command palette** (⌘K) and a filterable sidebar to reach any tool instantly.\n- **Smart Detection** — detects the right tool from your clipboard contents.\n- **Distraction-free View menu** — toggle the sidebar (⌘/Ctrl+B) and header bar\n  (⌘/Ctrl+Shift+B) to maximize the content area. Native menu bar on macOS,\n  Windows and Linux.\n- **Syntax highlighting** on inputs and outputs (CodeMirror 6).\n- **Pinned \u0026 recently-used** tools above the sidebar filter.\n- **Light \u0026 dark** themes, both designed intentionally.\n- **Multi-tab workspace** — open tools (even the same tool) in separate tabs,\n  with per-tab state that persists across restarts.\\*\n- Headless **CLI** (`hexkit`) and **deep-link** dispatch for future integrations.\n\n\\* Some advanced capabilities are planned to require a paid license — see below.\n\n## Tools\n\n**Formatters** — JSON format/validate (with JSONPath filter \u0026 sort keys), SQL,\nCSS/SCSS/Less, HTML, XML (with XPath filter), JS minify.\n\n**Encoders** — Base64 string, Base32, Base58, URL encode/decode, HTML entities,\nHex/ASCII, backslash escape, Gzip compress/decompress, X.509 certificate\ndecoder, Base64 image, Luhn check, BER-TLV / EMV decoder.\n\n**Converters** — Unix time, number base (2–36), string case, color\n(HEX/RGB(A)/HSL(A)/HSB/HWB/CMYK), cron parser, chmod (octal↔symbolic),\nYAML↔JSON, CSV↔JSON, PHP↔JSON, TOML↔JSON/YAML, SVG→CSS, HTML→JSX, HTML→Markdown,\ncURL→code, JSON→code, docker run→docker-compose.\n\n**Generators** — hashes (MD5/SHA-1/256/512 + HMAC), UUID/ULID/Nano ID, random\nstring, Lorem Ipsum, QR code, test credit card numbers (Luhn-valid, Visa /\nMastercard / Amex / Discover / JCB / Diners / UnionPay).\n\n**Cryptography** — OpenPGP keypair generation (Ed25519 + Curve25519,\nASCII-armored), encrypt, decrypt, sign, verify, encrypt-and-sign,\ndecrypt-and-verify (pure-Rust rpgp, GnuPG-interoperable, fully offline);\npassword hashing + verify (bcrypt / Argon2); AES-256-GCM password-based\nencrypt/decrypt; TOTP / 2FA authenticator (with otpauth QR).\n\n\u003e _Tool-spotlight screenshots: only **Text Diff Checker** is shown above —\n\u003e dedicated screenshots for the other tools are not yet available._\n\n**Text** — diff checker (text/JSON/XML), line sort/dedupe, string inspector,\nRegExp tester (with substitution).\n\n**Web** — JWT debugger (decode + HS256/384/512 verify), JWT signer, URL parser,\nCIDR / subnet calculator (IPv4 + IPv6), HTML preview, Markdown preview, HTTP\nclient (import a curl command, edit headers/query/body, send the request and\ninspect the response).\n\n\u003e The **HTTP client** is the one tool that deliberately makes network requests —\n\u003e the single exception to Hexkit's offline design, marked with a badge in the\n\u003e app. The request runs from the Rust backend, so sending works only in the\n\u003e desktop app; the curl import/export (`httpreq.*`) is pure and offline.\n\n## Getting started\n\n### Prerequisites\n\n- [Node.js](https://nodejs.org) 20+ and [pnpm](https://pnpm.io)\n- [Rust](https://rustup.rs) (stable)\n- Tauri OS prerequisites — see the\n  [Tauri setup guide](https://v2.tauri.app/start/prerequisites/)\n\n### Run the desktop app\n\n```bash\npnpm install\nmake dev          # or: pnpm tauri dev\n```\n\n### Common tasks (see the `Makefile`)\n\n```bash\nmake web          # frontend only, in a browser\nmake build        # production frontend bundle\nmake bundle       # build the distributable desktop app\nmake cli          # build the headless `hexkit` CLI\nmake test         # Rust + frontend test suites\nmake check        # typecheck + lint (clippy) + tests + build\n```\n\n## The `hexkit` CLI\n\nEvery tool also runs headless via the `hexkit` binary, over the exact same\ndispatcher the desktop app and `hexkit://` deep links use. Install it once\nfrom inside the app (**Hexkit → Install Command Line Tools…**) or build it\nyourself:\n\n```bash\ncargo install --git https://github.com/trinvh/hexkit hexkit-cli\n# → ~/.cargo/bin/hexkit\n```\n\n### Calling convention\n\n```\nhexkit \u003caction\u003e '\u003cjson-params\u003e'\necho '\u003cjson-params\u003e' | hexkit \u003caction\u003e\nhexkit 'hexkit://\u003caction\u003e?key=value'\n```\n\n- Actions are namespaced `\u003ctool\u003e.\u003cverb\u003e` (e.g. `json.format`, `jwt.decode`).\n- Params are a JSON object; string-shaped results print raw, object/array\n  results print as pretty JSON.\n- The deep-link form takes URL-encoded params and is what\n  `hexkit://…` links from your browser, Raycast, or shell hand off to.\n\n### Cheatsheet\n\n```bash\n# Format JSON (with optional indent + key sort)\nhexkit json.format '{\"input\":\"{\\\"b\\\":2,\\\"a\\\":1}\",\"indent\":\"  \",\"sort\":true}'\n\n# JSONPath query\nhexkit json.query '{\"input\":\"{\\\"users\\\":[{\\\"id\\\":1},{\\\"id\\\":2}]}\",\"path\":\"$.users[*].id\"}'\n\n# Base64\nhexkit base64.encode '{\"input\":\"hello\"}'\necho aGVsbG8= | hexkit base64.decode\n\n# URL encode / decode (deep-link form, handy in scripts)\nhexkit 'hexkit://url.encode?input=hello world'\n\n# Hash digests (single call returns md5/sha1/sha256/sha512)\nhexkit hash.generate '{\"input\":\"hello\"}'\n\n# HMAC\nhexkit hash.hmac '{\"algorithm\":\"sha256\",\"key\":\"secret\",\"message\":\"hi\"}'\n\n# JWT inspect (header + payload + algorithm + signature)\nhexkit jwt.decode '{\"input\":\"eyJhbGciOi…\"}'\n\n# UUID v4 (or ulid, nano_id) — `count` and `lowercased` are optional\nhexkit uuid.generate '{\"kind\":\"uuid_v4\",\"count\":3}'\n\n# Luhn validate + propose a corrected check digit\nhexkit luhn.check '{\"input\":\"4111 1111 1111 1112\"}'\n\n# Generate Luhn-valid TEST card numbers\nhexkit card.generate '{\"brand\":\"visa\",\"count\":3}'\n\n# BER-TLV / EMV chip data\nhexkit tlv.decode '{\"input\":\"6F2A840E315041592E5359532E4444463031A5...\"}'\n\n# Unix time ↔ ISO\nhexkit time.convert '{\"input\":\"1700000000\",\"unit\":\"auto\"}'\n\n# Number base conversion (binary / octal / decimal / hex / custom)\nhexkit number.all '{\"input\":\"255\",\"base\":10}'\n\n# Pretty-print, query and beautify XML / SQL / CSS\nhexkit xml.format  '{\"input\":\"\u003ca\u003e\u003cb/\u003e\u003c/a\u003e\"}'\nhexkit sql.format  '{\"input\":\"select * from users where id=1\"}'\nhexkit css.beautify '{\"input\":\".a{color:red}\",\"syntax\":\"css\"}'\n\n# OpenPGP — keygen, encrypt, decrypt, sign, verify (all ASCII-armored)\nhexkit pgp.keygen        '{\"user_id\":\"Alice \u003calice@hexkit.app\u003e\",\"passphrase\":\"\"}'\nhexkit pgp.encrypt       '{\"input\":\"secret\",\"public_key\":\"-----BEGIN PGP PUBLIC KEY BLOCK-----…\"}'\nhexkit pgp.decrypt       '{\"input\":\"-----BEGIN PGP MESSAGE-----…\",\"private_key\":\"…\",\"passphrase\":\"\"}'\nhexkit pgp.sign          '{\"input\":\"doc text\",\"private_key\":\"…\",\"passphrase\":\"\"}'\nhexkit pgp.verify        '{\"input\":\"doc text\",\"signature\":\"-----BEGIN PGP SIGNATURE-----…\",\"public_key\":\"…\"}'\nhexkit pgp.encrypt_sign  '{\"input\":\"…\",\"public_key\":\"…\",\"private_key\":\"…\",\"passphrase\":\"\"}'\nhexkit pgp.decrypt_verify '{\"input\":\"-----BEGIN PGP MESSAGE-----…\",\"private_key\":\"…\",\"passphrase\":\"\",\"public_key\":\"…\"}'\n\n# HTTP client request modelling (pure/offline — actually sending is desktop-only)\nhexkit httpreq.from_curl '{\"command\":\"curl -X POST https://api.example.com -d {}\"}'\nhexkit httpreq.to_curl '{\"method\":\"GET\",\"url\":\"https://api.example.com\",\"query\":[{\"key\":\"q\",\"value\":\"rust\",\"enabled\":true}],\"headers\":[],\"body\":{\"type\":\"none\"}}'\n\n# Base32 / Base58\nhexkit base32.encode '{\"input\":\"hello\"}'\nhexkit base58.encode '{\"input\":\"hello\"}'\n\n# Gzip (text ↔ base64)\nhexkit gzip.compress '{\"input\":\"hello hello hello\"}'\n\n# chmod (octal ↔ symbolic)\nhexkit chmod.describe '{\"input\":\"755\"}'\n\n# TOML ↔ JSON / YAML\nhexkit toml.to_json '{\"input\":\"name = \\\"hexkit\\\"\\nversion = 1\"}'\n\n# HTML → Markdown\nhexkit htmlmd.convert '{\"input\":\"\u003ch1\u003eHi\u003c/h1\u003e\u003cp\u003eSee \u003ca href=\\\"https://hexkit.app\\\"\u003esite\u003c/a\u003e.\u003c/p\u003e\"}'\n\n# docker run → docker-compose\nhexkit dockerc.to_compose '{\"input\":\"docker run -d --name web -p 8080:80 nginx:latest\"}'\n\n# Password hashing (bcrypt / argon2) + verify\nhexkit pwhash.hash '{\"algorithm\":\"bcrypt\",\"password\":\"hunter2\"}'\n\n# AES-256-GCM (password-based)\nhexkit aes.encrypt '{\"plaintext\":\"secret\",\"password\":\"pw\"}'\n\n# TOTP — pass a unix timestamp so the result is deterministic\nhexkit totp.generate '{\"secret\":\"GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQ\",\"timestamp\":59,\"digits\":8}'\n\n# CIDR / subnet\nhexkit cidr.parse '{\"input\":\"192.168.1.0/24\"}'\n\n# JWT sign (HS256)\nhexkit jwt.sign '{\"payload\":{\"sub\":\"123\",\"name\":\"Alice\"},\"secret\":\"topsecret\"}'\n```\n\n### Discoverability\n\n- Run `hexkit --help` for usage.\n- The full action list is the `match` in\n  [`crates/devtools-core/src/actions.rs`](crates/devtools-core/src/actions.rs);\n  every namespace there is a callable namespace from the CLI.\n- Anything you can copy as a \"Deep link\" from the in-app context menu can be\n  pasted as `hexkit '…'` and produces the same result.\n\n## MCP server (for AI agents)\n\n`hexkit-mcp` is a [Model Context Protocol](https://modelcontextprotocol.io)\nserver that lets an LLM agent (Claude Desktop, Cursor, Cline, …) call a\n**curated** subset of Hexkit's tools — the deterministic, spec-heavy ones an\nLLM is unreliable at on its own. Everything still runs locally through the same\n`devtools-core` dispatcher; nothing is uploaded.\n\nIt deliberately exposes a **small** tool set (so it stays cheap on the agent's\ncontext window) rather than all ~55 tools:\n\n| Tool | What it does |\n| --- | --- |\n| `jwt_decode`, `jwt_verify` | Decode a JWT; verify an HS256/384/512 signature |\n| `hash`, `hmac` | MD5/SHA-1/SHA-256/SHA-512 digests; keyed HMAC |\n| `pgp_keygen`, `pgp_encrypt`, `pgp_decrypt`, `pgp_sign`, `pgp_verify` | OpenPGP (Ed25519/Curve25519) |\n| `x509_decode` | Decode a PEM/DER X.509 certificate |\n| `tlv_decode` | Parse BER-TLV / EMV chip-card data |\n| `cron_parse` | Explain a cron expression |\n| `id_generate` | Generate UUID v4/v7, ULID or Nano ID |\n\nTrivial transforms an agent already does well (JSON formatting, base64, case\nconversion, …) are intentionally omitted.\n\nThere are two ways to connect, depending on what your client supports.\n\n### Option A — from inside the app (Streamable HTTP)\n\nOpen **View → Settings…** and turn on **MCP server** (off by default). Hexkit\nthen hosts the tools on a loopback port (default `7676`) for as long as the app\nis running. Point any client that supports a local MCP **URL** — Claude Code,\nCursor, Cline, Continue — at it:\n\n```json\n{\n  \"mcpServers\": {\n    \"hexkit\": {\n      \"type\": \"http\",\n      \"url\": \"http://127.0.0.1:7676/mcp\"\n    }\n  }\n}\n```\n\nThe `\"type\": \"http\"` field is required by clients like Claude Code and Cursor to\nrecognise it as an HTTP (Streamable-HTTP) server. The Settings panel shows the\nlive status and this copy-paste block. The listener is bound to `127.0.0.1` only\n(loopback); nothing is exposed off-machine.\n\n\u003e **Claude Desktop note:** its *Add custom connector* dialog only accepts remote\n\u003e **`https://`** URLs, so it rejects `http://127.0.0.1` (the field turns red).\n\u003e Use **Option B (stdio)** below for Claude Desktop instead.\n\n### Option B — standalone binary (stdio)\n\nFor clients that launch servers over stdio (e.g. Claude Desktop), build the\n`hexkit-mcp` binary and point the client's `command` at it:\n\n```bash\n# Build the server binary (debug or --release)\ncargo build --release -p hexkit-mcp     # → target/release/hexkit-mcp\n\n# Or install it onto your PATH\ncargo install --path crates/hexkit-mcp  # → ~/.cargo/bin/hexkit-mcp\n```\n\n```json\n{\n  \"mcpServers\": {\n    \"hexkit\": { \"command\": \"/absolute/path/to/hexkit-mcp\" }\n  }\n}\n```\n\nNo arguments, no environment, no network — the server only computes locally.\n\n## Architecture\n\n```\ncrates/devtools-core/   Pure, Tauri-independent tool logic (one module per tool)\ncrates/hexkit-cli/      Headless `hexkit` binary over the same dispatcher\ncrates/hexkit-mcp/      MCP (stdio) server exposing a curated tool subset to agents\nsrc-tauri/              Tauri shell (run_action command, clipboard, deep link)\nsrc/                    React UI (tool registry, shared primitives, per-tool views)\n```\n\nEvery tool exposes a uniform `run(action, params) -\u003e Result\u003cValue, ToolError\u003e`\nfunction. The desktop app, the CLI, and `hexkit://` deep links all route through\nthe same dispatcher, so behavior is identical everywhere.\n\n## Tech stack\n\nTauri 2 · Rust · React 19 · TypeScript · Vite · Tailwind CSS v4 · Zustand ·\nCodeMirror 6 · Vitest.\n\n## License \u0026 commercial use\n\nHexkit is **source-available**, not OSI \"open source\": it is licensed under the\n[PolyForm Noncommercial License 1.0.0](./LICENSE).\n\n- ✅ **Free** for any non-commercial purpose — personal use, hobby projects,\n  study, research, education, and non-profit/charitable organizations.\n- 💼 **A paid commercial license is required** for any commercial use.\n- 🔒 Certain advanced capabilities (a planned **Raycast extension** and some\n  power-user features such as multi-tab workflows) are intended to require a\n  paid license in the future.\n\nFor commercial licensing, please open an issue to get in touch.\n\nThird-party dependencies retain their own licenses (mostly MIT/Apache-2.0).\n\n## Contributing\n\nContributions are welcome — see [CONTRIBUTING.md](./CONTRIBUTING.md). By\ncontributing you agree your contributions are licensed under the project license.\n\n## Acknowledgements\n\nBuilt on the work of the Tauri, React, CodeMirror, and the broader Rust and\nTypeScript communities.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftrinvh%2Fhexkit","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftrinvh%2Fhexkit","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftrinvh%2Fhexkit/lists"}