Files
create/docs/UPSTREAM.md
forbes 3b37ff86bd
Some checks failed
Build and Test / build (pull_request) Has been cancelled
feat(icons): add icon theming infrastructure with Catppuccin color remapping
- Move kindred-icons/ to icons/kindred/ (better organization)
- Add icons/mappings/ with FCAD.csv (Tango palette) and kindred.csv (Catppuccin Mocha)
- Add icons/retheme.py script to remap upstream FreeCAD SVG colors
- Generate icons/themed/ with 795 auto-themed SVGs (24,698 color replacements)
- Update BitmapFactory.cpp to load icons/kindred (highest priority) then
  icons/themed (auto-remapped upstream icons) before default FreeCAD icons
- Update CMakeLists.txt to install both icon directories
- Update all documentation references to new paths

The 157-color mapping covers the full Tango palette used across FreeCAD's
icon set, interpolating between 4 luminance anchors per color family.
2026-02-15 20:31:00 -06:00

14 KiB

Upstream Merge Plan: FreeCAD 1.0.0 → 1.2.0-dev

Date: February 2026 Status: Planning

Overview

Kindred Create (origin/main) is based on FreeCAD 1.0.0 with ~193 Kindred-specific commits layered on top. The upstream fork (upstream/main at github.com/Kindred-Systems/FreeCAD) tracks FreeCAD development and is currently at 1.2.0-dev. The two repositories diverged early and have ~45k commits each from a very old merge base — a traditional git merge is not feasible.

Goal: Forward-port all Kindred customizations onto the latest upstream/main (FreeCAD 1.2.0-dev) to pick up bug fixes and new features while preserving all Kindred functionality.

Strategy: Diff-Based Forward Port

  1. Create a new branch from upstream/main
  2. Copy Kindred-only files/directories wholesale (no conflicts)
  3. Cherry-pick or manually re-apply the ~36 C++ source patches
  4. Build, test, and validate

Remotes

Remote URL Role
origin git.kindred-systems.com/kindred/create Kindred Create (current main)
upstream github.com/Kindred-Systems/FreeCAD FreeCAD fork tracking upstream development
internal gitea.kindred.internal:kindred/create-0070 Internal mirror

Phase 1: Copy Kindred-Only Files (No Conflicts)

These files/directories exist only in Kindred Create and can be copied directly onto upstream/main without conflict.

New directories (copy wholesale)

Directory Description
icons/kindred/ 1444 Catppuccin Mocha SVG icon overrides
mods/silo/ Silo workbench submodule (silo-mod)
mods/ztools/ ZTools workbench submodule
src/Mod/Create/ Kindred Create workbench (InitGui.py, kc_format.py, update_checker.py, version.py.in)
package/ rattler-build packaging recipe
docs/ Kindred documentation (architecture, specifications, guides)
.gitea/ CI workflows, issue templates, runner configs

New files in existing directories

File Description
src/Gui/FileOrigin.cpp/.h Origin abstraction layer
src/Gui/FileOriginPython.cpp/.h Python bridge for origins
src/Gui/OriginManager.cpp/.h Origin manager singleton
src/Gui/OriginManagerDialog.cpp/.h Origin management dialog
src/Gui/OriginSelectorWidget.cpp/.h Toolbar origin selector
src/Gui/CommandOrigin.cpp PLM origin commands (Commit/Pull/Push/Info/BOM)
src/Gui/BreadcrumbToolBar.cpp/.h Breadcrumb navigation bar
src/Gui/EditingContext.cpp/.h Editing context system
src/Gui/Icons/kindred-create.svg App icon
src/Gui/Icons/kindredcreateabout.png About dialog image
src/Gui/Icons/kindredcreatesplash*.png Splash screen images
src/Gui/Icons/silo-*.svg Silo command icons (6 files)
src/Gui/PreferencePacks/KindredCreate/ Theme preference pack
src/Gui/Stylesheets/KindredCreate.qss QSS stylesheet
src/Gui/Stylesheets/parameters/KindredCreate.yaml Theme parameters
src/Gui/Stylesheets/images_dark-light/branch_*_dark.svg Tree branch line SVGs (7 files)
resources/kindred-create.* Platform file associations (ico, icns, xml, desktop)
banner-logo-light.png Repository banner
CONTRIBUTING.md Contribution guidelines

Phase 2: Cherry-Pick Core Changes (Conflict Risk)

36 Kindred commits touch core FreeCAD C++ files. Of those, 38 files also changed on upstream/main, creating potential conflicts. Listed in chronological order (oldest first) for cherry-pick sequence.

Commit sequence

# Hash Summary Conflict Risk Files
1 316d4f4b524 Initial branding (CMakeLists, splash, about, theme, icons, QRC) HIGH — CMakeLists.txt, DlgAbout.cpp, SplashScreen.cpp, resource.qrc all changed upstream 14 files
2 8c6837cc152 Theme padding/clipping fixes LOW — KindredCreate.qss is new file 1 file
3 bb3f3ac6d6c Dock task panel right, remove non-Kindred themes MEDIUM — MainWindow.cpp, PreferencePacks CMakeLists changed upstream 8 files
4 e85162947b7 Startup theme selector fix MEDIUM — StartupProcess.cpp changed upstream 4 files
5 eb80c07f57a Theme QSS refinements LOW — Kindred-only files 4 files
6 8639b6fd8ab Resolve unknown command/style token errors MEDIUM — StartupProcess.cpp 5 files
7 fea1280fa90 Theme alternate-background-color LOW 2 files
8 b3fedfb19fb Theme tree item padding LOW 2 files
9 0d4545b7d67 Tree branch line SVGs LOW — new files 8 files
10 434ae797a43 Theme selector cleanup MEDIUM — StartupProcess.cpp 4 files
11 224feda4ad6 Catppuccin icon override infrastructure MEDIUM — BitmapFactory.cpp, CMakeLists.txt 2 files
12 7535a48ec4c Origin abstraction layer HIGH — Application.cpp, ApplicationPy.cpp/.h, CMakeLists.txt 6 files (4 new)
13 38358e431d2 LocalFileOrigin and Std_* delegation HIGH — CommandDoc.cpp, FileOrigin.cpp/.h 3 files
14 79c85ed2e5d FileOriginPython interactive methods LOW — Kindred-only files 3 files
15 deeb6376f71 OriginSelectorWidget HIGH — Action.cpp/.h, CommandStd.cpp, Workbench.cpp, CMakeLists.txt 8 files
16 679aaec6d49 Origin commands (Commit/Pull/Push) MEDIUM — Application.cpp, Command.h, Workbench.cpp 5 files
17 db85277f262 OriginManagerDialog LOW — new files + OriginSelectorWidget.cpp 3 files
18 015df38328c Document-origin tracking in window title MEDIUM — MDIView.cpp 3 files
19 a6e84552da5 Cross-origin detection in SaveAs MEDIUM — CommandDoc.cpp 1 file
20 84b69b935b2 Build fix: remove SelectModule.h include LOW 1 file
21 2f594dac0a5 Use Python API for viewDefaultOrientation MEDIUM — CommandDoc.cpp 1 file
22 724440dcb75 Build fixes for OriginSelectorWidget/Manager LOW — Kindred files 2 files
23 c858706d480 Add silo icons to QRC LOW — resource.qrc (additive) 6 files
24 d95c850b7b1 Widen origin selector widget LOW 1 file
25 10b5c9d584f Wire OriginManagerDialog to Silo_Settings LOW 1 file
26 cc5ba638d1f UI polish — Wayland scaling, menu icon size HIGH — DlgSettingsGeneral.cpp/.h/.ui changed upstream 6 files
27 4bf74cf3391 Build fix for DlgSettingsGeneral MEDIUM — DlgSettingsGeneral.h, StartupProcess.cpp 2 files
28 6773ca0dfd8 Eliminate QSS/CFG duplication LOW — Kindred files 3 files
29 977fa3c9347 QGroupBox indicator, hyperlink color LOW — KindredCreate.qss 1 file
30 8b2ce4b73a4 Native Qt start panel + kindred:// URL MEDIUM — MainWindow.cpp 1 file
31 bf637af4e45 Window flickering and icon clipping fix MEDIUM — MainWindow.cpp/.h 3 files
32 70118201b02 MDI pre-document tab for Silo new item HIGH — ApplicationPy, BreadcrumbToolBar, EditingContext, MainWindow, Workbench 11 files
33 1f49e3fa6da Build fix: ToolBarItem incomplete type, reportException LOW — likely already fixed upstream 2 files
34 f71decca089 Splash screen: skip runtime draw, mantle bg MEDIUM — SplashScreen.cpp 3 files
35 2b0c6774c07 Dev build defaults, skip version migration MEDIUM — CMakeLists.txt, DlgVersionMigrator.cpp 2 files
36 ab71902a4c2 Forward visibility arg in appendToolbar() LOW — FreeCADGuiInit.py 1 file

HIGH conflict files (need manual attention)

These files are modified by both Kindred and upstream. They will almost certainly require manual conflict resolution:

File Kindred Changes Upstream Risk
CMakeLists.txt Kindred version vars, build config Upstream version bumps, new modules
src/Gui/Application.cpp Origin system registration Core refactoring
src/Gui/ApplicationPy.cpp/.h addFileOrigin(), MDI tab API API changes
src/Gui/CommandDoc.cpp Origin delegation, cross-origin SaveAs, viewDefaultOrientation Save/open refactoring
src/Gui/Action.cpp/.h OriginSelectorWidget toolbar action Toolbar system changes
src/Gui/MainWindow.cpp/.h Task panel docking, start panel, flicker fix UI restructuring
src/Gui/Workbench.cpp/.h Origin selector, toolbar visibility, ToolBarItem include Workbench changes
src/Gui/SplashScreen.cpp Kindred branding, skip runtime draw Splash updates
src/Gui/StartupProcess.cpp/.h Theme selector, menu icon size Startup flow changes
src/Gui/CMakeLists.txt New source files (Origin*, BreadcrumbToolBar, EditingContext) New upstream sources
src/Gui/DlgSettingsGeneral.cpp/.h/.ui Menu icon size preference Settings UI changes

Phase 3: Module-Level Changes

Assembly fixes (check if still needed)

Hash Summary Status
316d4f4b524 Joint flip overconstrain fix May be fixed upstream — verify
9dc50cef727 SIGSEGV during document restore May be fixed upstream — verify
ddefb236521 Solver ignoring datum plane refs May be fixed upstream — verify
b7374d7b1fc findPlacement() datum/origin handling May be fixed upstream — verify

Files touched: src/Mod/Assembly/App/AssemblyObject.cpp, src/Mod/Assembly/UtilsAssembly.py, src/Mod/Assembly/InitGui.py

FreeCADInit.py

Hash Summary
(Layer 1 .kc) addImportType includes *.kc

FreeCADGuiInit.py

Hash Summary
ab71902a4c2 Forward visibility arg in appendToolbar()

Phase 4: Build System and Packaging

Item Action
CMakeLists.txt Re-apply Kindred version variables on top of upstream 1.2.0-dev
package/rattler-build/recipe.yaml Update for new version, verify dependency pins
.gitea/workflows/ Verify CI still works with updated source
Submodule pins Re-add mods/silo, mods/ztools submodules
src/3rdParty/OndselSolver Verify our fork is still needed or if upstream fixed the issues

Phase 5: Validation

  1. Build: Full CMake configure + build succeeds
  2. Launch: Application starts without errors, splash and about dialogs show Kindred branding
  3. Theme: KindredCreate theme loads correctly, QSS applies
  4. Icons: icon override system works (BitmapFactory loads from icons/kindred/)
  5. Origin system: FileOrigin, OriginManager, OriginSelectorWidget functional
  6. Silo integration: Auth panel, activity panel, save/commit/pull all work
  7. File format: .kc files open/save with silo/ directory preserved
  8. Assembly: Verify assembly fixes aren't regressed (or confirm upstream fixed them)
  9. Start panel: Native Qt start panel loads
  10. URL scheme: kindred:// URL handling works

Execution Steps

# 1. Ensure upstream is fetched
git fetch upstream

# 2. Create forward-port branch from upstream/main
git checkout -b kindred-on-upstream-1.2 upstream/main

# 3. Copy Kindred-only directories
git checkout origin/main -- icons/ mods/ src/Mod/Create/ package/ docs/ \
    .gitea/ resources/kindred* banner-logo-light.png CONTRIBUTING.md .gitmodules

# 4. Copy new Kindred source files (no conflicts)
git checkout origin/main -- \
    src/Gui/FileOrigin.cpp src/Gui/FileOrigin.h \
    src/Gui/FileOriginPython.cpp src/Gui/FileOriginPython.h \
    src/Gui/OriginManager.cpp src/Gui/OriginManager.h \
    src/Gui/OriginManagerDialog.cpp src/Gui/OriginManagerDialog.h \
    src/Gui/OriginSelectorWidget.cpp src/Gui/OriginSelectorWidget.h \
    src/Gui/CommandOrigin.cpp \
    src/Gui/BreadcrumbToolBar.cpp src/Gui/BreadcrumbToolBar.h \
    src/Gui/EditingContext.cpp src/Gui/EditingContext.h \
    src/Gui/Icons/kindred-create.svg src/Gui/Icons/kindredcreateabout.png \
    src/Gui/Icons/kindredcreatesplash.png src/Gui/Icons/kindredcreatesplash_2x.png \
    src/Gui/Icons/silo-bom.svg src/Gui/Icons/silo-commit.svg \
    src/Gui/Icons/silo-info.svg src/Gui/Icons/silo-pull.svg \
    src/Gui/Icons/silo-push.svg \
    src/Gui/PreferencePacks/KindredCreate/ \
    src/Gui/Stylesheets/KindredCreate.qss \
    src/Gui/Stylesheets/parameters/KindredCreate.yaml \
    src/Gui/Stylesheets/images_dark-light/

# 5. Cherry-pick core changes (oldest to newest)
#    Resolve conflicts as they arise
git cherry-pick 316d4f4b524  # Initial branding
git cherry-pick 8c6837cc152  # Theme padding
# ... (continue through all 36 commits)
git cherry-pick ab71902a4c2  # appendToolbar visibility

# 6. Apply .kc format Layer 1 changes
#    (These were written against 1.0.0, re-apply on 1.2.0-dev)

# 7. Build and test
cmake -B build -S . && cmake --build build

# 8. Push and create PR
git push -u origin kindred-on-upstream-1.2

Risk Mitigation

  • Checkpoint after each cherry-pick: Commit progress so partial work isn't lost
  • Build after each batch: Group related commits (e.g., all theme commits) and build after each group
  • Skip already-fixed commits: Some bug fixes (Assembly, build errors) may already be resolved upstream — check before cherry-picking
  • Test incrementally: Don't wait until all 36 commits are applied to test

Estimated Effort

Phase Effort
Phase 1 (copy wholesale) ~30 min
Phase 2 (cherry-pick 36 commits) ~4-8 hours (conflict resolution)
Phase 3 (module changes) ~1 hour
Phase 4 (build system) ~1-2 hours
Phase 5 (validation) ~2-3 hours

Future: Staying in Sync

After this merge, establish a recurring upstream sync process:

  1. Track upstream/main with periodic merges (weekly or per-release)
  2. Keep Kindred changes as isolated as possible (separate files > modifying upstream files)
  3. Consider upstreaming non-Kindred-specific fixes to the FreeCAD fork