save_on_apply preference and all automatic calls to bpy.ops.wm.save_userpref().save_user_preferences() helper function from apply.py.[build] section to blender_manifest.toml with paths_exclude_pattern to exclude assets/, __pycache__/, dotfiles, and zip archives from the built package.assets/graphic.png (used for the README on GitHub) is no longer included in the distributed extension.bpy.app.online_access before any network requests and aborts with a user-facing message if online access is disabled.xml_writer.py from the package entirely.ITERM_OT_export_theme_xml operator, its class registration, and the "Export Theme XML" button from the settings UI.bpy.context.preferences.themes[0]).__init__.py — Removed xml_writer import/reload, export operator class, save_on_apply call sitesapply.py — Removed save_user_preferences() functionprefs.py — Removed save_on_apply property, export button, and "On Apply" settings groupblender_manifest.toml — Added [build] exclude patterns, updated permissions descriptionREADME.md — Removed references to save-on-apply and XML export from settings documentationxml_writer.py — DeletedThe manual "Export Theme XML" operator has been retained intentionally. This operator does not implement custom XML serialization — it wraps Blender's own rna_xml.rna2xml function, which is the same serializer Blender uses internally for theme presets. The operator simply provides a convenient file browser dialog so users can choose where to save the file.
What was removed in this revision:
config/themes/ on every theme apply (the export_xml preference)ITERM_OT_reset_theme operator (replaced by Blender's built-in preferences.reset_default_theme)The add-on no longer writes to any Blender config directories. All theme changes are made exclusively through the Python API (bpy.context.preferences.themes[0]), and the only file I/O is the manual export which is user-initiated via a file browser.
If the preference is to remove this operator entirely and defer to Blender's built-in theme preset save, I'm happy to do so — just let me know.
sys.modules loop with the official _needs_reload = "bpy" in locals() reload pattern.config/themes/ on theme apply.export_xml preference toggle._snapshot_current_theme() function and all snapshot references.rna2xml serializer with a file browser).ITERM_OT_reset_theme operator entirely.preferences.reset_default_theme.self.layout_type property check from ITERM_UL_theme_list.draw_item (removed in Blender 5.0 API).get_cache_dir() now uses bpy.utils.extension_path_user() exclusively with no fallback paths._is_5 = bpy.app.version >= (5, 0, 0) runtime detection.if not _is_5 guards:panelcolors (header, back, sub_back)navigation_bar, tab_active, tab_inactive, tab_back, tab_outlineframe_current (per-editor)channels_region, dopesheet_channel, dopesheet_subchannelchannel_group, active_channels_grouptime_scrub_background, time_marker_line, time_marker_line_selectedtheme.regions.sidebars — background, tab backgroundtheme.regions.channels — background, text, selected texttheme.regions.scrubbing — background, timestamp text, markerstheme.regions.asset_shelf — header, backgroundtheme.common.anim — playhead, preview range, channels, keyframes (all types), long keystheme.common.curves — all handle types (free, auto, vector, align, auto-clamped, vertex)theme.user_interface — panel_active, panel_outline, editor_outline, editor_outline_activeedge_seam → seam, edge_sharp → sharp, edge_crease → creaseedge_bevel + vertex_bevel → bevel (combined)freestyle_edge_mark + freestyle_face_mark → freestyle (combined)if not _is_5 (moved to theme.regions.asset_shelf)._try_set() helper provides additional graceful degradation for any edge cases.v1.1.3