ProperTree: A Cross-Platform GUI Plist Editor with OpenCore Snapshot Support
Cross platform GUI plist editor written in python.
At a glance
- What is it?
- ProperTree is a Python and Tkinter plist editor that runs on Windows, macOS, and Linux. It is particularly useful in the Hackintosh and OpenCore community because of its OC Snapshot feature, which automatically walks an OpenCore folder and updates config.plist entries for ACPI patches, kexts, tools, and drivers.
- Who is it for?
- ProperTree is the right tool for anyone managing OpenCore config.plist files, because OC Snapshot and OC Clean Snapshot handle the error-prone task of keeping ACPI, Kext, Tools, and Driver entries synchronized with the filesystem automatically. For general plist editing not tied to OpenCore, ProperTree works on any plist file, including binary plists, and the value converter handles Base64 and hex conversions that other editors treat as raw data.
- Can I use it commercially?
- Yes. BSD-3-Clause is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
- Is it still maintained?
- Yes. The repository last received commits 102 days ago.
- What is it written in?
- Mainly Python, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on September 30, 2026, and from our analysis. They are not legal advice.
Editorial analysis
What ProperTree Is and Who Uses It
ProperTree is a cross-platform GUI plist editor written in Python and Tkinter. It handles both XML and binary property list files. The tool is compatible with Python 2.x and 3.x, though active macOS use requires Python 3.12 or newer due to a Tkinter regression with older versions.
The tool is widely used in the Hackintosh community for editing OpenCore configuration files (config.plist). Its OC Snapshot function automates the process of scanning an OpenCore folder and updating the config.plist to match what is present in the ACPI, Kexts, Tools, and Drivers directories. Without this feature, adding or removing kexts and drivers requires manual config.plist edits, which is error-prone.
Beyond OpenCore, ProperTree is a general-purpose plist editor that competes with macOS-native tools like Xcode's plist editor. Its cross-platform support and open-source BSD-3-Clause license make it accessible on Windows and Linux, where no built-in plist editor exists.
The repository was last pushed on 2026-06-20, which is within the past six months.
How to Install and Run ProperTree
ProperTree requires no package installation. The workflow is to clone the repository and run the Python script directly.
On macOS or Linux:
git clone https://github.com/corpnewt/ProperTree
python3 ./ProperTree/ProperTree.pyOn macOS, double-clicking `ProperTree.command` after cloning also works.
On Windows:
git clone https://github.com/corpnewt/ProperTree
./ProperTree/ProperTree.batThe repository can also be downloaded as a ZIP from the green Code button if you do not want to use git. Note that a ZIP download does not let you update via `git pull`; you must download the ZIP again for each update.
If Tkinter is not installed (common on Linux), install it via the system package manager. On Ubuntu and Ubuntu-based distributions:
sudo apt-get install python3-tk -yFor file association on Windows, run `AssociatePlistFiles.bat` from the Scripts directory. This associates .plist files with ProperTree.bat and adds an 'Open with ProperTree' option to the right-click context menu. The README notes this is location-dependent: if you move the ProperTree folder, you must re-run the script.
macOS-Specific Setup: Sonoma, Monterey, and App Bundles
ProperTree has documented compatibility issues with the default Python and Tkinter versions that ship with macOS.
On macOS Sonoma (14.x) and later, the issue is that Python 3.11.x and older cause UI elements to become unclickable. The README explains this is a tk and macOS compatibility issue. The fix is to install Python 3.12.0 or later from python.org. If you cannot update Python, the README suggests moving the ProperTree window before trying to click elements.
On macOS Monterey (12.x) and later, the default macOS Tkinter does not display correctly, showing a black window. The fix is to install the latest Python from python.org, which bundles a compatible Tk version. After installation, run `buildapp-select.command` from the Scripts directory in ProperTree to build a `ProperTree.app` bundle targeting the newly installed Python. This app bundle can then be double-clicked and associated with .plist files.
Also on Monterey, ProperTree may fail to open or save files when using the earlier 'universal' Python installers. This is resolved in Python 3.10.2 and later universal builds.
For any macOS setup where you want to open .plist files by double-clicking them, run `buildapp-select.command` from ProperTree's Scripts directory to generate `ProperTree.app`.
Core Features: Editing, Search, and Value Conversion
ProperTree's feature set, as listed in the README, covers the common operations for plist editing:
- Document-based multiple windows (open several plist files at once) - Node drag and drop for reordering entries - Copy and paste - Find/Replace that searches both keys and values - Ordered or unordered dictionary support - Full undo-redo stack - Backported support for binary property lists and Unicode in Python 2 - Expanded integer casting that accepts hex integers (for example, `0xFFFF`) in XML `<integer>` tags - Context-aware right-click menu with template information for OpenCore and Clover config.plist files - Value converter supporting Base64, Hex, Ascii, and Decimal
The hex integer support is notable for OpenCore config.plist editing, where many memory addresses and device properties are expressed in hexadecimal. The value converter lets you switch between representations without manual calculation.
The context-aware right-click menu includes template information for OpenCore or Clover entries. This reduces the chance of adding a key with an incorrect data type or structure when building config.plist from scratch.
OC Snapshot and OC Clean Snapshot: How They Work
OC Snapshot is the feature that distinguishes ProperTree from general-purpose plist editors. When you select a target OpenCore folder, it walks four directories within that folder and compares their contents to the current document:
- ACPI directory compared against `ACPI -> Add` in config.plist - Kexts directory compared against `Kernel -> Add` - Tools directory compared against `Misc -> Tools` - Drivers directory compared against `UEFI -> Drivers`
The README explains the full logic: it adds entries that are present on disk but missing from the config.plist, removes entries that are in the config.plist but no longer present on disk, and ensures kext load order by comparing each kext's `CFBundleIdentifier` against the `OSBundleLibraries` of all other kexts. If kext A depends on kext B, kext B is placed before kext A in the load order. It also warns on duplicate `CFBundleIdentifiers`, with support for `MinKernel`, `MaxKernel`, and `MatchKernel` overlap checks, and can disable all duplicates after the first.
The schema version used for snapshot operations is determined by comparing the MD5 hash of the `OpenCore.efi` file to a known list of Acidanthera debug and release versions. If the hash does not match any known version, the most recent schema in the built-in snapshot.plist is used as a fallback. This behavior can be customized via the Settings menu under 'OC Snapshot Target Version.'
OC Clean Snapshot does the same work but starts by clearing out all four sections (`ACPI -> Add`, `Kernel -> Add`, `Misc -> Tools`, `UEFI -> Drivers`) before repopulating from the filesystem. The README recommends using OC Clean Snapshot only the first time you snapshot a config.plist, to remove any sample entries that shipped with the OpenCore package. Every subsequent snapshot should use OC Snapshot (the non-clean variant) to preserve any customizations made to individual entries.
License, Maintenance, and When to Consider Alternatives
ProperTree is licensed under BSD-3-Clause, a permissive license that permits commercial use and redistribution as long as the license notice and disclaimer are preserved.
The README does not compare ProperTree to other tools. It does not discuss OCAT (OpenCore Auxiliary Tools), which some users ask about in the search queries for this project, and the README does not document the comparison. Users asking about OCAT versus ProperTree should consult OpenCore community resources, since the material in this repository does not cover that comparison.
For general XML editing without OpenCore requirements, any text editor handles plist XML. For plist editing on macOS with full system integration, Xcode includes a plist editor. ProperTree's specific advantage over those options is the OC Snapshot automation and the value converter, combined with cross-platform availability.
The last push was on 2026-06-20. There are no GitHub releases; the project tracks changes through commits. The BSD-3-Clause license imposes no restrictions on commercial use beyond attribution.
Editorial conclusion
ProperTree is the right tool for anyone managing OpenCore config.plist files, because OC Snapshot and OC Clean Snapshot handle the error-prone task of keeping ACPI, Kext, Tools, and Driver entries synchronized with the filesystem automatically. For general plist editing not tied to OpenCore, ProperTree works on any plist file, including binary plists, and the value converter handles Base64 and hex conversions that other editors treat as raw data. On macOS Sonoma (14.x) and later, Python 3.12 or above from python.org is required; the built-in macOS Python and the version installed by the Command Line Tools will cause click issues on older Python 3.11 builds.
Frequently asked questions
How do I install ProperTree?
Clone the repository with `git clone https://github.com/corpnewt/ProperTree`, then run ProperTree.py with Python 3 on macOS or Linux, or run ProperTree.bat on Windows. No pip install is required. On Linux, install python3-tk if Tkinter is missing.
How do I use ProperTree for OC Snapshot?
Open your OpenCore config.plist in ProperTree, then use the OC Snapshot option to select your OC folder. ProperTree walks the ACPI, Kexts, Tools, and Drivers directories and updates the config.plist to match, including correcting kext load order.
What is the difference between OC Snapshot and OC Clean Snapshot?
OC Snapshot compares the filesystem to the existing config.plist entries and adds or removes as needed, preserving customizations. OC Clean Snapshot first clears ACPI -> Add, Kernel -> Add, Misc -> Tools, and UEFI -> Drivers entirely, then repopulates from the filesystem. The README recommends OC Clean Snapshot only on the first run to remove sample entries, and OC Snapshot for all subsequent updates.
How do I install ProperTree on Windows?
Clone the repository and run ProperTree.bat. To associate .plist files with ProperTree, run AssociatePlistFiles.bat from the Scripts directory. Note that this association is location-dependent and must be re-run if you move the ProperTree folder.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/corpnewt-propertree)