WerWolv/ImHex
π A Hex Editor for Reverse Engineers, Programmers and people who value their retinas when working at 3 AM.
Mixed signals β read the receipts
- βLast commit 4d ago
- β5 active contributors
- βGPL-2.0 licensed
- βCI configured
- βTests present
- β Small team β 5 top contributors
- β Concentrated ownership β top contributor handles 72% of commits
- β GPL-2.0 is copyleft β check downstream compatibility
Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests
Embed this verdict
[](https://repopilot.app/r/werwolv/imhex)Paste into your README β the badge live-updates from the latest cached analysis.
Onboarding doc
Onboarding: WerWolv/ImHex
Generated by RepoPilot Β· 2026-05-05 Β· Source
Verdict
WAIT β Mixed signals β read the receipts
- Last commit 4d ago
- 5 active contributors
- GPL-2.0 licensed
- CI configured
- Tests present
- β Small team β 5 top contributors
- β Concentrated ownership β top contributor handles 72% of commits
- β GPL-2.0 is copyleft β check downstream compatibility
<sub>Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests</sub>
TL;DR
ImHex is a feature-rich hex editor built in C++ targeting reverse engineers and low-level programmers. It provides a custom pattern language (similar to Kaitai/010 Editor templates) for declarative binary structure parsing, a disassembler via Capstone, and a plugin system (see PLUGINS.md and cmake/modules/ImHexPlugin.cmake) for extensibility. Core UI is rendered entirely with Dear ImGui via GLFW and OpenGL. Monorepo: the root CMakeLists.txt + cmake/build_helpers.cmake orchestrate a multi-plugin build. Core editor logic lives in the main app target; plugins are self-contained shared libraries built via cmake/modules/ImHexPlugin.cmake and the SDK template under cmake/sdk/. GLSL shaders sit in a small GLSL subtree (5884 bytes) and Objective-C code handles macOS-specific integration.
Who it's for
Reverse engineers, malware analysts, firmware hackers, and low-level programmers who need to inspect and annotate binary files. Also C++ plugin developers who want to extend the editor β see cmake/sdk/template/source/example_plugin.cpp for the plugin entry point pattern.
Maturity & risk
ImHex has tens of thousands of GitHub stars, a structured CI pipeline across .github/workflows/ (build.yml, tests.yml, analysis.yml, nightly_release.yml, release.yml), and a maintained changelog (changelog.md + VERSION file). It is production-ready for daily use, actively maintained by the primary author WerWolv with community contributions.
Primary risk is single-maintainer dependency β WerWolv drives most core decisions, though plugin contributions are welcome. The dependency surface is large: Capstone (disasm), YARA (pattern matching), mbedTLS (crypto), libssh2, LZ4, ZSTD, libmagic β all resolved via cmake/modules/ custom Find*.cmake scripts which can cause friction on non-standard systems. Breaking plugin API changes are possible across releases since the ABI is not formally versioned.
Active areas of work
Based on repo structure: nightly releases are automated via .github/workflows/nightly_release.yml, stale issue triage is automated (.github/workflows/stale_issues.yml), and a download-cache workflow (.github/workflows/dl-cache.yml) suggests active dependency caching work. The changelog.md and VERSION file indicate ongoing versioned releases.
Get running
git clone --recurse-submodules https://github.com/WerWolv/ImHex.git cd ImHex cmake --preset release -B build # see CMakePresets.json for available presets cmake --build build --parallel
On Linux ensure: libglfw3-dev, libcapstone-dev, libmagic-dev, libmbedtls-dev, libyara-dev, liblz4-dev, libzstd-dev are installed
Daily commands: cmake --preset release -B build && cmake --build build --parallel
Then run: ./build/ImHex
For debug: cmake --preset debug -B build_debug && cmake --build build_debug
Map of the codebase
CMakeLists.txtβ Root build definition that orchestrates all plugins, libraries, and platform-specific configurations β the entry point for every build.cmake/modules/ImHexPlugin.cmakeβ Defines the CMake macro for registering plugins, making it the contract every plugin author must understand to integrate correctly.cmake/build_helpers.cmakeβ Contains shared build utility functions (dependency resolution, platform detection, packaging) used throughout all CMakeLists files.dist/web/plugin-bundle.cpp.inβ Template that bundles all plugins into the WebAssembly build, critical for understanding how the web port differs from native.cmake/sdk/CMakeLists.txtβ Defines the public SDK interface that external plugin developers use to build out-of-tree plugins against ImHex.cmake/sdk/template/source/example_plugin.cppβ Canonical reference implementation showing the minimum viable plugin structure, lifecycle hooks, and registration pattern.PLUGINS.mdβ Documents the plugin architecture, API conventions, and contribution guidelines β required reading before adding any functionality.
How to make changes
Add a new ImHex plugin
- Copy the SDK template directory and rename it for your plugin (
cmake/sdk/template/CMakeLists.txt) - Implement plugin_init(), plugin_deinit(), and register your views/providers/handlers following the example (
cmake/sdk/template/source/example_plugin.cpp) - Register the plugin target using add_imhex_plugin() macro with sources, includes, and dependencies (
cmake/modules/ImHexPlugin.cmake) - Add the plugin subdirectory to the root CMakeLists so it is discovered and linked (
CMakeLists.txt) - For WASM builds, ensure your plugin symbol is included in the static bundle template (
dist/web/plugin-bundle.cpp.in)
Add a new target platform / packaging format
- Add a new platform preset (toolchain, install prefix, sysroot) to the presets file (
CMakePresets.json) - Add platform-specific find_package logic and install() rules in the build helpers (
cmake/build_helpers.cmake) - Create a packaging descriptor file (PKGBUILD / spec / control / yaml) under dist/ (
dist/Arch/PKGBUILD) - Add a new workflow job matrix entry targeting the platform, referencing existing jobs as templates (
.github/workflows/build.yml)
Add a new dependency / library
- Create a FindXxx.cmake module mirroring the existing pattern (find_path, find_library, handle_standard_args) (
cmake/modules/FindCapstone.cmake) - Add the vcpkg port entry for Windows CI consumption (
dist/vcpkg.json) - Wire find_package() call and target_link_libraries() into the build helpers (
cmake/build_helpers.cmake) - Update relevant package manifests (Flatpak, Arch, Debian, RPM) to declare the new runtime dependency (
dist/flatpak/net.werwolv.ImHex.yaml)
Update or add an embedded font
- Place the TTF font file in dist/fonts/ and remap any icon glyphs to the private-use area (
dist/fonts/move_private_use_area.py) - Run the conversion script to produce a C++ header with the raw byte array (
dist/fonts/ttf_to_header_file.py) - Reference the generated header in the CMake target that embeds resources (
cmake/build_helpers.cmake)
Why these technologies
- Dear ImGui β Immediate-mode GUI renders every frame from scratch, trivially supports custom hex grid drawing, infinite-undo pattern editors, and GPU-accelerated overlays without a retained-mode widget hierarchy.
- C++23 β Template metaprogramming, RAII, and zero-cost abstractions are essential for safely wrapping raw byte manipulation; modern C++ features reduce boilerplate in the pattern language runtime.
- CMake + vcpkg β Cross-platform build portability across Windows/Linux/macOS/WASM with consistent dependency resolution; vcpkg manifests lock transitive dependency versions.
- Emscripten / WASM β Enables running the full hex editor in a browser with no install, sharing the exact same plugin and pattern language code via conditional compilation.
- Dynamic shared libraries for plugins β Decouples features from the core binary, allows community plugins to be distributed independently, and lets the core team ship a minimal executable.
- Capstone disassembly engine β Provides multi-architecture disassembly (x86, ARM, MIPS, etc.) through a single
Traps & gotchas
- Must clone with --recurse-submodules or submodule-based dependencies will be missing and CMake will fail silently on some paths. 2) cmake/modules/ contains custom Find*.cmake scripts that override system ones β if you have non-standard install paths, set CMAKE_PREFIX_PATH explicitly. 3) The Objective-C source requires Apple Clang on macOS; cross-compiling for macOS from Linux is not supported. 4) CoreCLR embed (FindCoreClrEmbed.cmake) requires a .NET runtime to be present for scripting features to build; this is optional but the CMake detection can produce confusing errors if partially installed. 5) .clang-tidy is enforced in CI (analysis.yml) β clang-tidy must be installed locally or CI will catch issues you won't see in a plain build.
Architecture
Concepts to learn
- Dear ImGui immediate-mode GUI β ImHex renders every UI element β hex view, pattern editor, disassembler β using ImGui's immediate-mode paradigm; understanding retained vs. immediate mode is essential before touching any UI code.
- Memory-mapped file I/O β Hex editors must handle multi-gigabyte files efficiently; ImHex uses memory-mapped I/O so the OS page cache handles buffering rather than loading entire files into RAM.
- Capstone disassembly framework β ImHex's disassembler view is powered by Capstone, a multi-architecture disassembly library; knowing its API is required to extend or fix the disassembly plugin.
- YARA pattern matching β ImHex integrates YARA (cmake/modules/FindYara.cmake) to let analysts run signature-based detection rules directly on open binary files β a non-obvious but powerful feature.
- Shared library plugin architecture β ImHex loads plugins as runtime shared libraries (.so/.dll/.dylib); understanding dynamic linking, symbol visibility, and ABI stability is critical to writing compatible plugins.
- Binary template / pattern language β ImHex's core differentiator is a custom declarative language for describing binary structures (similar to 010 Editor templates); the parser and evaluator for this language are central to the codebase.
- CMake presets (CMakePresets.json) β The build system uses CMake Presets (CMakePresets.json) to standardize configure/build/test workflows across platforms β a modern CMake feature that replaces ad-hoc build scripts.
Related repos
solemnwarning/rehexβ Direct alternative: another open-source hex editor with structure parsing, written in C++/wxWidgets targeting the same reverse engineering use case.WerWolv/ImHex-Patternsβ Companion repo containing the community library of ImHex pattern language (.hexpat) files for common binary formats β users of ImHex will want this immediately.ocornut/imguiβ The Dear ImGui library that ImHex's entire UI is built on β understanding ImGui is prerequisite for contributing any UI code.aquynh/capstoneβ The multi-arch disassembly engine integrated via cmake/modules/FindCapstone.cmake β ImHex's disassembler view depends directly on this.kaitai-io/kaitai_structβ Predecessor/inspiration for the declarative binary structure description concept that ImHex's pattern language implements natively.
PR ideas
To work on one of these in Claude Code or Cursor, paste:
Implement the "<title>" PR idea from CLAUDE.md, working through the checklist as the task list.
Add a GitHub Actions workflow for automated plugin build validation using ImHexPlugin.cmake
The repo has cmake/modules/ImHexPlugin.cmake and cmake/sdk/template/ for third-party plugin development, but there is no dedicated CI workflow (under .github/workflows/) that builds and validates the SDK template plugin against multiple platforms. This would catch regressions in the plugin API/CMake integration before releases and give contributors a reference build to verify their plugins against.
- [ ] Create .github/workflows/plugin_sdk.yml that checks out the repo and runs cmake with cmake/sdk/CMakeLists.txt pointing at cmake/sdk/template/ as the plugin source
- [ ] Configure the workflow matrix to cover ubuntu-latest, windows-latest, and macos-latest runners
- [ ] Use cmake/modules/ImHexPlugin.cmake as the find_package target inside the workflow to ensure the SDK export works end-to-end
- [ ] Add a step that verifies the built plugin artifact exists and is a valid shared library (.so/.dll/.dylib) using a simple shell check
- [ ] Document the new workflow in CONTRIBUTING.md under a 'Plugin Development CI' section
Expand .github/ISSUE_TEMPLATE with a 'Plugin Compatibility Report' template referencing PLUGINS.md
PLUGINS.md exists and describes the plugin system, but the issue templates under .github/ISSUE_TEMPLATE/ only contain bug_report.yaml and feature_request.yaml. There is no structured template for reporting broken or incompatible plugins, which is a distinct and common category of issues for a tool with a plugin ecosystem. This causes plugin issues to be filed as generic bugs, making triage harder.
- [ ] Read PLUGINS.md to understand the plugin versioning and ABI compatibility guarantees currently documented
- [ ] Create .github/ISSUE_TEMPLATE/plugin_compatibility.yaml with structured fields: ImHex version, plugin name/source, OS, observed vs expected behavior, and crash log
- [ ] Add a 'validations' section in the YAML requiring the reporter to confirm they checked PLUGINS.md for known incompatibilities
- [ ] Reference the new template from CONTRIBUTING.md so contributors know which template to use for plugin-related reports
- [ ] Test the template renders correctly on GitHub by opening a draft issue
Add a distro-agnostic installation smoke-test script and wire it into the existing tests.yml workflow
The repo has .github/workflows/tests.yml for automated testing and dist/ contains packaging artifacts for AppImage, Arch, and Debian, but there is no automated test that installs the packaged binary and verifies basic startup (e.g., --help or --version exits cleanly). This means packaging regressions are only caught by users post-release. A lightweight smoke-test using the AppImage artifact is the lowest-friction entry point.
- [ ] Add a shell script at .github/scripts/smoke_test.sh that downloads the AppImage artifact from the build job, makes it executable, and runs
./ImHex.AppImage --helpasserting exit code 0 - [ ] Inspect dist/AppImage/AppImageBuilder.yml to identify the correct AppImage filename pattern produced by the build
- [ ] Add a new job 'smoke-test' in .github/workflows/tests.yml that depends on the build job, downloads the AppImage artifact using actions/download-artifact, and executes .github/scripts/smoke_test.sh
- [ ] Ensure the job runs only on ubuntu-latest since AppImage is Linux-specific, and add a comment explaining how to extend it for the .deb artifact using dist/DEBIAN/control.in
- [ ] Update INSTALL.md with a note that automated smoke tests validate each AppImage build
Good first issues
- The cmake/modules/ Find*.cmake scripts lack pkg-config fallback for several libraries (e.g. FindLZ4.cmake, FindZSTD.cmake) β adding pkg_check_modules() fallback would improve Linux distro compatibility. 2) .github/ISSUE_TEMPLATE/ has bug and feature templates but no 'plugin development question' template β adding one would reduce noise in bug reports from plugin authors. 3) cmake/sdk/template/source/example_plugin.cpp is minimal; adding a second template demonstrating a file format parser plugin with the pattern language API would significantly help new plugin contributors.
Top contributors
- @WerWolv β 68 commits
- @paxcut β 20 commits
- @shewitt-au β 3 commits
- @WerWolvTranslationBot β 3 commits
- @nwvh β 1 commits
Recent commits
c6045c7β patterns: update pattern language (paxcut)245803cβ fix: Crash when closing empty delimiters (#2730) (paxcut)d62dbd4β fix: typo on menu (paxcut)58cde7aβ fix: small typo in welcome screen (#2704) (nwvh)316318aβ fix: crashes from delimiter matching (#2725) (paxcut)bc5887aβ fix: dos date and time in big endian (#2724) (paxcut)595df51β build: update libwolv (paxcut)c661daeβ fix: logs with utf-8 multibyte chars. (#2722) (paxcut)0c2e881β Fix nullptr deref when opening ImHex without a provider on frame 1 (#2718) (neptuwunium)be7b7a8β Fix/utf8 log alignment (#2717) (paxcut)
Security observations
- High Β· Insecure Vulnerability Reporting Channel β
SECURITY.md. The SECURITY.md file instructs users to report critical vulnerabilities via a public Discord server (direct message to @werwolv). This is an insecure disclosure channel as it lacks encryption, formal tracking, SLA commitments, or CVE coordination processes. Sensitive vulnerability details could be exposed or lost. Fix: Implement a formal responsible disclosure process using GitHub's private security advisories (Security > Advisories) or a dedicated encrypted email address (e.g., security@domain.com with a published PGP key). Adhere to coordinated vulnerability disclosure best practices. - High Β· Limited Supported Version Policy Increases Attack Surface β
SECURITY.md. The security policy only supports the latest release, leaving users on older versions without security patches. This is particularly concerning for a tool used by security researchers who may process untrusted binary files. Malformed or malicious binary files could exploit parsing vulnerabilities in unsupported versions. Fix: Maintain at minimum the current stable and previous major release with security backports. Clearly document EOL timelines and provide automated update notifications within the application. - Medium Β· No Formal Bug Bounty or CVE Assignment Process β
SECURITY.md. There is no documented process for CVE assignment, severity rating (e.g., CVSS scoring), or coordinated public disclosure timelines. This means vulnerabilities in a widely-used security tool may not receive proper public tracking, leaving the community uninformed about risks. Fix: Register with MITRE or a CNA (CVE Numbering Authority) to enable CVE assignment. Define a disclosure timeline (e.g., 90-day coordinated disclosure) and publish security advisories through GitHub Security Advisories. - Medium Β· Potentially Unsafe Processing of Untrusted Binary Files β
cmake/modules/ImHexPlugin.cmake, cmake/modules/FindYara.cmake, cmake/modules/FindCapstone.cmake, cmake/modules/FindMagic.cmake. ImHex is a hex editor designed to open and parse arbitrary binary files, including potentially malicious ones. Based on the file structure (pattern language parsing, plugin system via ImHexPlugin.cmake, Yara/Capstone/Magic integration), there is significant attack surface for memory corruption, integer overflows, or parser exploits when processing crafted malicious files. The tool is commonly used to analyze malware, making this a high-risk scenario. Fix: Ensure all file parsers use memory-safe practices (bounds checking, fuzzing with AFL++/libFuzzer). Consider sandboxing file parsing operations. Keep all third-party parsing libraries (Capstone, Yara, libmagic) pinned to latest patched versions with automated dependency update tooling (e.g., Dependabot, Renovate). - Medium Β· Plugin System Introduces Arbitrary Code Execution Risk β
PLUGINS.md, cmake/modules/ImHexPlugin.cmake, cmake/sdk/. The plugin architecture (PLUGINS.md, cmake/modules/ImHexPlugin.cmake, cmake/sdk/) allows loading of third-party plugins. If plugins are loaded from untrusted sources without signature verification, this creates a vector for arbitrary code execution in the context of the application. The SDK template further lowers the barrier for plugin creation. Fix: Implement plugin signature verification (code signing). Establish an official plugin repository with security review. Sandbox plugin execution where feasible. Document clearly that users should only install plugins from trusted sources. - Medium Β· Docker Build Files May Expose Build Environment Risks β
dist/AppImage/Dockerfile, dist/Arch/Dockerfile, dist/macOS/arm64.Dockerfile. Multiple Dockerfiles exist (dist/AppImage/Dockerfile, dist/Arch/Dockerfile, dist/macOS/arm64.Dockerfile) without visible content review. Build containers that are not hardened (running as root, using latest/unversioned base images, or containing secrets) can compromise CI/CD pipeline integrity and supply chain security. Fix: Ensure all Dockerfiles use pinned, specific base image digests (not 'latest'), run as non-root users, minimize installed packages, and do not embed secrets. Use Docker layer scanning tools (Trivy, Snyk) in CI/CD pipelines. - Medium Β· GitHub Actions Workflow Security Not Verified β
undefined. Multiple GitHub Actions workflows exist (.github/workflows/). Without reviewing their Fix: undefined
LLM-derived; treat as a starting point, not a security audit.
Where to read next
- Open issues β current backlog
- Recent PRs β what's actively shipping
- Source on GitHub
Generated by RepoPilot. Verdict based on maintenance signals β see the live page for receipts. Re-run on a new commit to refresh.