2026-07-21 — Initial public release
RegEdLin Commander is a native GTK4 / libadwaita editor for offline Windows registry hives on Linux. It combines a two-pane Commander interface with an original, high-performance
regfparser and writer. Open two hives side by side, compare their contents, copy complete key trees, edit every common registry value type, import or export.regfiles, search and replace, and undo destructive changes — withoutlibhivex.

RegEdLin is designed for administrators, recovery technicians, forensic work and developers who need to inspect or modify offline Windows registry hive files from Linux. It works with hives copied from a Windows installation, mounted disk, backup image or recovery environment.
Unlike tools that place a generic tree view over an existing library, RegEdLin contains its own bounds-checked binary registry engine. The engine understands the regf file structure directly and is completely separated from the graphical interface. This makes large-hive operations fast while keeping the application independent of libhivex.
The interface follows the familiar Total Commander / Norton Commander model: each pane has its own hive, path, tree, values and tabs. This is especially useful when repairing one hive from another, comparing snapshots or migrating a complete branch between installations.
| Capability | What RegEdLin provides |
|---|---|
| Offline hive editing | Read and write SYSTEM, SOFTWARE, SAM, SECURITY, DEFAULT and NTUSER.DAT files |
| Two-pane operation | Open two independent hives and work between them without switching windows |
| Live comparison | Values unique to one side are green; changed type, size or data is amber |
| Complete editing | Create, rename and delete keys or values; edit all common Windows value types |
| Data transfer | Copy a key and its full subtree between hives with F5, Shift+F5 or drag-and-drop |
| Recovery tools | Undo destructive operations, atomic file replacement and validation of untrusted input |
| Interchange | Byte-exact .reg import/export with Microsoft registry syntax support |
regf parser and writer — handles registry structures directly: regf, hbin, nk, vk, sk, lf, lh, li, ri and db.mmap reads, cached key names, geometrically growing lists and O(n) subtree enumeration..reg import.SECURITY_DESCRIPTOR_RELATIVE data with SID/ACL validation and copy-on-write sk cells.~/.config/regedlin/session.ini.Each pane is independent. You can load a clean reference hive on one side and a damaged or older copy on the other, navigate to the same branch, inspect the colour-coded differences and transfer only the data you need.
Copying a key includes all of its subkeys and values. If the destination already contains part of that tree, RegEdLin merges the copied data rather than requiring the whole destination branch to be removed first.
| Hive | Typical contents |
|---|---|
SYSTEM |
Services, drivers, control sets and boot configuration |
SOFTWARE |
Installed applications, Windows configuration and COM registration |
SAM |
Local Security Accounts Manager database |
SECURITY |
Local security policy and cached security data |
DEFAULT |
Default system profile settings |
NTUSER.DAT |
Per-user settings normally exposed as HKEY_CURRENT_USER |
| Type | Editor / representation |
|---|---|
REG_SZ |
Unicode text editor |
REG_EXPAND_SZ |
Expandable Unicode text with environment-variable placeholders |
REG_MULTI_SZ |
Multi-line list of strings |
REG_BINARY |
Binary / hexadecimal data |
REG_DWORD |
32-bit numeric value |
REG_QWORD |
64-bit numeric value |
| Other types | Preserved and represented through generic binary or typed .reg syntax |
Large values are supported through segmented db chains. RegEdLin also preserves security descriptor sharing correctly: modifying permissions on one key creates a private descriptor instead of silently changing every key that referenced the original sk cell.
The ready-to-use archive is available from the download button at the top of this page. Extract it and follow the included package instructions for your distribution.
To build RegEdLin, the system needs:
On Debian or Ubuntu:
sudo apt install build-essential meson ninja-build pkg-config gettext \
libglib2.0-dev libgtk-4-dev libadwaita-1-dev
Clone the public repository and build with Meson:
git clone https://github.com/wesmar/RegEdLin.git
cd RegEdLin
meson setup build
ninja -C build
./build/src/regedlin
Install the program, desktop entry, AppStream metadata, icon and locale catalogs under /usr:
meson setup build --prefix=/usr
ninja -C build
sudo meson install -C build
Tests are enabled by default. For a lean production-only build:
meson setup build -Dtests=false
The repository includes a complete debian/ directory:
dpkg-buildpackage -us -uc -b
Runtime dependencies for the generated binary package are resolved automatically through shlibs.
Launch RegEdLin empty, with one hive or with a hive in each pane:
regedlin
regedlin /path/to/SYSTEM
regedlin /path/to/SYSTEM /path/to/SOFTWARE
For safe offline work, first copy a hive from the mounted Windows installation:
mkdir -p ~/registry-work
cp /mnt/windows/Windows/System32/config/SOFTWARE ~/registry-work/SOFTWARE
regedlin ~/registry-work/SOFTWARE
Navigate through the tree, double-click a value to modify it, or press F5 / Shift+F5 to copy the selected key to the other pane. Changes are saved immediately and atomically, so there is no separate Save command. Undo remains available for destructive operations.
Important: always edit a working copy. Keep the original hive untouched until the modified file has been validated and Windows can be recovered if necessary.
| Key | Action | Key | Action |
|---|---|---|---|
F2 |
Rename selected key or value | F5 / Shift+F5 |
Copy selection to the opposite pane |
F7 |
Create a new key | Delete |
Delete selected key or value |
Enter / double-click |
Modify a value | Ctrl+C |
Copy key path or value to clipboard |
Ctrl+Z |
Undo | Ctrl+F |
Search |
Ctrl+H |
Find and Replace | Tab |
Switch the active pane |
← / →, Num + / Num - |
Collapse or expand a node | Num * |
Expand the complete subtree |
Right-click the tree or value list for the full context menu. Typing a letter jumps to the next key beginning with that character.
The project is strictly layered. The registry engine has no GTK dependency, while the interface reaches hive data through the logic layer.
| Layer | Main files | Responsibility |
|---|---|---|
src/ui/ |
pane, window, key_item, value_item, style |
GTK interface, two panes, trees, lists, dialogs, tabs and session state |
src/logic/ |
format, regfile_export, regfile_import, search, replace, installscan, hivecopy |
Formatting, .reg interchange, search/replace, installation scan and cross-hive copying |
src/hive/ |
regf.c, regf.h |
Bounds-checked regf parser and writer with no user-interface dependency |
Hive files are initially mapped read-only with mmap. Registry records are decoded directly from the mapped bytes, avoiding a second full copy of large files. Key-name caching reduces repeated decoding while browsing the tree.
The first edit switches the hive to a private, growable in-memory representation. This keeps browsing cheap while providing controlled allocation once a write is actually needed.
hbin cache, providing predictable amortized O(1) allocation.rel_key_subkeys_all() enumerates a subtree in one O(n) pass and avoids the repeated index lookups that turn large trees into O(n²) work.lf / lh, direct li, indirect ri and segmented big-data db structures found in real hives.These choices matter on production-sized files: testing includes a 135 MB SOFTWARE hive and a subtree containing 99,507 keys.
Atomic replacement prevents an interruption halfway through a save from leaving a partially written hive at the destination path. Parser bounds checks, recursion-depth guards and cycle detection protect the application when opening malformed or deliberately corrupted input.
Undo complements file-level safety by allowing destructive UI actions to be reversed during the editing session.
.reg interoperabilityImport and export are designed to be mutually inverse. Supported syntax includes:
dword: and QWORD representations;hex: and typed hex(N): values;[-Path];"Name"=-.RegEdLin can search keys, value names and string data using:
GRegex / PCRE2;The engine is exercised independently of GTK by CLI development tools under tests/.
| Test area | Coverage |
|---|---|
| Mutation | Write, delete, rename, import, Undo, replace and security descriptors |
| Read and round-trip | Hive reading, export, search, paths and Windows installation scanning |
| Memory safety | AddressSanitizer and UndefinedBehaviorSanitizer on old and modern real-world hives |
| Malformed input | Byte-flip and truncation fuzzing with timeouts; corrupt files must fail cleanly |
| Independent validation | Written hives are read back with hivexml, hivexget and hivexsh |
| Graphical interface | Headless Xvfb smoke tests with screenshot verification |
Testing covers Windows 2000 v1.3 and modern Windows 10/11 v1.5 hives, including 20 MB SYSTEM and 135 MB SOFTWARE files. Fuzzing and cross-validation have already exposed subtle issues involving padded big-value segments and real-world hashed subkey lists.
For a sanitizer build:
meson setup build-asan -Db_sanitize=address,undefined
ninja -C build-asan
meson test -C build-asan
The user interface uses GNU gettext, with English as the source and fallback language. Five complete translation catalogs are currently shipped with the project:
| Code | Language |
|---|---|
pl |
Polish |
de |
German |
fr |
French |
es |
Spanish |
it |
Italian |
GTK selects the language automatically from LANG, LANGUAGE and LC_MESSAGES. When no matching catalog is available, the original English interface is used.
LANGUAGE=en ./build/src/regedlin
LANGUAGE=pl ./build/src/regedlin
LANGUAGE=de ./build/src/regedlin
LANGUAGE=fr ./build/src/regedlin
LANGUAGE=es ./build/src/regedlin
LANGUAGE=it ./build/src/regedlin
The currently enabled catalogs are listed in po/LINGUAS, while po/regedlin.pot is generated from the English strings in the source code. To add another translation, append its language code to po/LINGUAS, create po/<code>.po from the POT template, translate the catalog and rebuild. No C source changes are required.
NTUSER.DAT tabs use the filesystem profile directory for their labels and do not extract a person's real name from registry data.The downloadable binary archive is provided without a password. Source code, build files, issue tracking and future updates are hosted in the public wesmar/RegEdLin repository.
RegEdLin is released under the MIT License. See LICENSE.md in the source repository.
Marek Wesołowski — WESMAR
https://kvc.pl