Last updated: 2026-04-01 (session 19) URL: https://gist.github.com/mxmilkiib/9c883e2022e978d9098311cbe4e2f875 RFC 2119
- Purpose: This document tracks Milkii's personal Carla development setup, for creating and testing feature and bugfix branches.
- Living document: This is a living document and SHOULD be updated as the workflow evolves.
- Single repo: The goal is to maintain one Carla source instance at
/home/milkii/media/projects/cascade/carlawith both anintegratedbranch and individual feature/fix branches. - Main sync: The
mainbranch MUST maintain sync withfalktx/Carlamain.origin/mainMUST be kept as a fast-forward mirror ofupstream/main— rungit push --no-verify origin mainafter everygit fetch upstream && git merge upstream/mainon main. - Main read-only: The
mainbranch MUST NOT receive any local commits — notINTEGRATION.mdupdates, not patches, nothing. All commits go onintegratedor a feature/fix branch. Any stray commits onmainMUST be removed by force-pushing the cleanupstream/maintip. - Integration branch: The repo MUST have an
integratedbranch that combines multiple upstream PR branches and local feature/fix branches. - Individual branches: Each feature/fix MUST have its own branch, kept clean for upstream PRs. Branch out from
upstream/main, never from localmain. - Dev location: All individual branch development is done in the same repo — checkout the branch, work, push, switch back to
integratedfor builds. - Integration edits:
integratedcan have some edits for testing purposes, but should be kept minimal. - Clean commits: A branch MUST have clean commits before first being linked with a GitHub PR.
- Stability: The
integratedbranch SHOULD provide a stable bleeding-edge build combining desired upstream PRs and local improvements. - "Updating" the system: When asked to "update" or told the system has been updated, this MUST include all post-update checks in order:
- Fetch upstream and check for new commits on
upstream/main - Check all
[x]branches: verify whether commits are already present inupstream/main(git log upstream/main --oneline | grep <keyword>); if fully merged, move the entry to "Merged to Upstream", remove the[x]marker, and record the merge date — do this BEFORE rebasing or rebuilding - Rebase all non-merged feature branches on new
upstream/main(stash any WIP first); skip branches identified as merged in step 2 - Rebuild the
integratedbranch: mergeupstream/mainthen re-merge all[x]branches in order, resolving any conflicts - Build the
integratedbranch (make -j$(nproc --ignore=2)) and verify it succeeds - Check all open PRs for new review feedback and update
INTEGRATION.mdstatuses accordingly - Update the "Last updated" timestamp and rebuild log entry in
INTEGRATION.md, commit, and sync to Gist
- Fetch upstream and check for new commits on
- Merge process: The integration merge process MUST follow the steps in the Integration Merge Process section below.
- Rebase hygiene: All branches SHOULD be kept up-to-date and rebased with
falktx/Carlamain to minimise merge conflicts, except merged branches. - Rebase first: A branch MUST be rebased as an initial step before any new change is made to said branch.
- Incremental PRs: Changes to
falktx/CarlaPRs MUST be incremental so as to be easy to review, and MUST NOT completely reformulate a system in a single commit. - Outline currency: The integration status outline MUST reflect the state of all branches, related issues, PRs, and dates, and MUST be updated after changes are committed — PR URLs SHOULD be checked first to catch new feedback.
- Non-interactive git: Git operations MUST be non-interactive using
GIT_EDITOR=trueandGIT_PAGER=catto avoid vim/editor prompts. - Issues: Most branches MAY have related upstream issues; related issues SHOULD be listed in the outline.
- Sections: Feature and fix branches should be in the correct outline sections.
- Secondary patches: Secondary patches are small fixes that either (a) resolve a residual problem that only became visible after a larger fix landed, or (b) are a prerequisite that a main fix branch depends on. They MUST be tracked in the Secondary Patches section of the outline, with a
Depends-onorResolves-residual-fromnote linking them to the related primary branch. - Secondary patch upstream: A secondary patch SHOULD be submitted upstream independently if it stands alone; if it only makes sense in context of the primary fix, it MAY be folded into that PR.
- Dates: Dates for branch creation, last PR comment, and last update MUST be recorded in the status outline.
- Standalone branches: Each feature/fix branch SHOULD work standalone without depending on other local branches (except where noted).
- History: Feature/fix branch history MUST NOT be rewritten (no squash, no interactive rebase) without explicit permission from Milkii. "Complete" means the upstream PR has been merged or the branch has been deliberately closed. The
integratedbranch MAY have merge commits. - No cherry-pick: ALWAYS use
git mergeto bring branches intointegrated, NEVERgit cherry-pick— cherry-picking creates duplicate commits with different SHAs, severs the branch relationship, makes bisect/revert unreliable, and hides what is actually in the build fromgit log. - Dependencies: Any fix or feature branch that relies on another local branch MUST be noted in the Branch Dependencies section.
- PR flow: PRs SHOULD be submitted to
mxmilkiib/Carla, and Milkii will create a further PR from there tofalktx/Carla. - Merged cleanup: Once the PR is fully merged into
falktx/Carla, the branch entry MUST be moved to the "Merged to Upstream" section of the outline and its[x]marker removed, so it is excluded from future integration rebuilds. - Last updated: The "Last updated" date at the top of this file MUST be updated whenever this file is edited.
- Gist sync: If this file is updated, it MUST be synced to Gist: run
gh gist edit 9c883e2022e978d9098311cbe4e2f875 --filename INTEGRATION.md INTEGRATION.mdfrom/home/milkii/media/projects/cascade/carla/(--filenametargets the gist file, the positional arg supplies the local content). - Commit messages: Commit messages must not be too verbose, and should be concise and descriptive.
- Conflict resolution: When resolving merge conflicts — whether during rebases or integration merges — conflicts MUST be resolved and the operation continued non-interactively.
- Code quality: Code quality MUST be verified before pushing — C++ code MUST follow Carla/JUCE coding style; Python code SHOULD pass pylint without new warnings.
- Push permission: Permission MUST be sought from the user before pushing commits to GitHub. Once the user has confirmed a push in a session, further pushes in that same session MAY proceed without asking again, to reduce friction.
- Local-only backup: All local branches MUST be pushed to
origin(mxmilkiib/Carla) for off-machine backup, even if they will never be PRed upstream.
CRITICAL: Feature branches MUST only contain commits belonging to their named feature.
- NEVER commit
INTEGRATION.md, integration merge commits, or unrelated fixups into a feature branch. INTEGRATION.mdMUST NOT be committed to any feature branch.- Before making any edit on a feature branch, confirm the active branch:
git -C /home/milkii/media/projects/cascade/carla branch --show-current - To verify a branch is clean (only its own commits ahead of
upstream/main):git -C /home/milkii/media/projects/cascade/carla log --oneline upstream/main..HEAD - If a branch has accumulated cruft, reset it:
- No real feature commits yet:
git reset --hard upstream/main - Has real commits mixed with cruft: rebase only the feature commits onto
upstream/main, then force-update the branch ref
- No real feature commits yet:
- ALWAYS create new feature branches from
upstream/main, never from localmain— localmainmay haveINTEGRATION.mdcommits or other local-only changes:git fetch upstream git checkout -b feature/<branch-name> upstream/main - Before committing WIP, verify the branch is correct AND that the diff contains only changes belonging to that feature:
git diff --stat git branch --show-current - Before opening or updating a PR, verify the branch contains only its own commits relative to
upstream/main:git log --oneline feature/<branch-name> --not upstream/main
/home/milkii/media/projects/cascade/carla/
main ← fast-forward mirror of upstream/main
integrated ← combined bleeding-edge build branch
feature/* ← individual feature/fix branches
Every fix or feature commit must be classified at creation time:
| Base | When to use | Can upstream PR? |
|---|---|---|
upstream/main |
Bug exists in upstream/main; fix cherry-picks cleanly | Yes |
integrated |
Bug was introduced by a PR merge into integrated; upstream/main does not have the regression; cherry-pick conflicts | No — stays as a direct commit to integrated |
To test which base to use: git cherry-pick <fix-commit> onto a fresh upstream/main branch. If it conflicts or the patch is a no-op (upstream already fixed), it is integrated-base.
integrated-base fixes do not get their own named branch. They are committed directly to integrated and tracked in the Integrated-Only Regression Fixes table below.
None currently. If a branch depends on another local branch, it MUST be listed here and noted in the outline entry.
Branches with dependencies on other local branches cannot be submitted upstream as-is. They MUST be refactored to remove the dependency, or the dependency MUST be upstreamed first.
These are direct commits on integrated that fix regressions introduced by PR merges. They cannot be submitted upstream and have no standalone branch. Cherry-picking them to upstream/main will conflict or be a no-op.
| Commit | Introduced by | Regression | Files |
|---|---|---|---|
aa212b5d3 |
pr-1397 (port-groups) | PatchbayPortAddedCallback/PatchbayPortChangedCallback emits passed 4 args to 5-arg signals; slot_handlePatchbayPortChangedCallback missing portGroupId param → repeated TypeError in carla-jack-* on every JACK port event |
carla_host.py |
09a5e7a82 |
pr-1397 (port-groups) | slot_handlePatchbayPortGroupAddedCallback body referenced portFlags after pr-1397 renamed the param to portGroupFlags → NameError on every port-group add event |
carla_host.py |
4280b36af |
pr-1397 (port-groups) | slot_handlePatchbayPortGroupChangedCallback was a no-op stub; now schedules slot_canvasRefresh via QTimer.singleShot since patchcanvas has no incremental port-group rename API |
carla_host.py |
374c7a95a |
feature/2026.03mar.30-disk-tree-collapse-persist | slot_fileTreeExpanded/slot_fileTreeCollapsed decorated with @pyqtSlot(object) — incompatible with expanded(QModelIndex) signal; changed to @pyqtSlot(QModelIndex) |
carla_host.py |
Summary: 0 need attention, 0 awaiting review, 24 local-only, 0 secondary patches, 14 upstream PRs merged to integrated, 0 merged upstream
Integration built 2026-04-01 (session 19): hardware node placement off-canvas bugfix; 77 tests passing.
Qt6 frontend active: qt_config.py regenerated to qt = 6; make generate-ui regenerates ui_*.py with pyuic6; make check verifies syntax + UI import; make test runs pytest suite (tests/test_frontend.py 17 + tests/test_settings_dialog.py 15 + tests/test_executables.py 7 + tests/test_plugin_browser.py 19 + tests/test_disk_tree.py 19 = 77 tests; offscreen Qt).
Patchbay port signal fix: PatchbayPortAddedCallback and PatchbayPortChangedCallback emits were missing value3 (portGroupId); slot_handlePatchbayPortChangedCallback was missing the portGroupId param. Caused repeated TypeError in carla-jack-multi/carla-jack-single on every JACK port event.
GitHub Actions IRC notification disabled on fork via if: false in .github/workflows/irc.yml.
SOURCE_MAP.md: navigational outline of all Carla source subsystems. Run workflow: .windsurf/workflows/run-carla.md.
Previous build 2026-03-27: merged all 14 open upstream PRs (#1397 port-groups, #1426 python-compileall, #1483 disconnect-group, #1483 unordered-events, #1555 handle-events, #1658 sigusr2-bridge, #1690 meson-build, #1734 pyqt-import-fix, #1748 pipewire-connections, #1975 vst-param-align, #1987 cygwin-fix, #2010 rack-ui-rework, #2011 osc-named-plugins, #2020 param-labels); fixed two build errors (d_msleep, DISTRHO::String::buffer()); build clean.
These are upstream PRs that have been merged into integrated for local use. They are NOT local branches — they are tracked PR branches. They do not need rebasing, but MUST be re-merged if the integrated branch is rebuilt.
- pr-1397 — port groups canvas (26 commits) — merged 2026-03-27
- pr-1426 — compile Python files to
__pycache__on install — merged 2026-03-27 - pr-1483 — disconnect-all-of-group patchbay menu item — merged 2026-03-27
- pr-1555 — handle unordered add/position-change events — merged 2026-03-27
- pr-1658 — SIGUSR2 handler in bridge plugin to re-load state — merged 2026-03-27
- pr-1690 — meson build config for host plugin and discovery — merged 2026-03-27
- pr-1734 — PyQt 5.15.8
PYQT_VERSION_STRimport fix — merged 2026-03-27 - pr-1748 — fix empty connections bug on PipeWire — merged 2026-03-27
- pr-1834 — open recent file menu — merged 2026-03-27
- pr-1975 — VST params UI: left-align param titles — merged 2026-03-27
- pr-1987 — fix support for CYGWIN — merged 2026-03-27
- pr-2010 — rack UI rework (jpka import) — merged 2026-03-27
- pr-2011 — OSC: address plugins by name — merged 2026-03-27
- pr-2020 — parameter labels when running as plugin — merged 2026-03-27
(none)
(none)
(none yet)
All entries here are based on upstream/main and are upstream-submittable unless marked [integrated-base].
These branches are pushed to mxmilkiib/Carla and merged into integrated, but no upstream PR has been filed.
- bugfix/2026.03mar.29-lv2-program-changed-deadlock — remove re-entrant lock in
handleProgramChanged(#1968) — merged 2026-03-30 - bugfix/2026.03mar.29-file-open-default-folder — validate project folder before Open dialog (#2019) — merged 2026-03-30
- bugfix/2026.03mar.29-qt6-precedence-over-qt5 — guard Qt5 detection so Qt6 wins on dual-Qt systems (#2031) — merged 2026-03-30
- bugfix/2026.03mar.29-install-vst2-glob-guard — shell-guard VST2 install glob in
make install(#1991) — merged 2026-03-30 - feature/2026.03mar.29-log-missing-plugin-uri — include type/binary/label in missing-plugin error (#1499) — merged 2026-03-30
- feature/2026.03mar.29-dsp-bar-refresh-rate — independent DSP bar refresh timer + settings spinbox (#1482) — merged 2026-03-30
- feature/2026.03mar.29-patchbay-canvas-autosize — expand scene rect after restoring group positions (#1481) — merged 2026-03-30
- feature/2026.03mar.29-patchbay-drag-scroll — auto-scroll canvas during rubberband drag near edge (#1577) — merged 2026-03-30
- feature/2026.03mar.30-default-session-on-open — load configured default project on startup when no CLI arg given (#1929) — merged 2026-03-30
- bugfix/2026.03mar.30-lv2-native-scalepoints — populate scalepoints in
CarlaEngineNative::getParameterInfo()(#1976/#1984) — merged 2026-03-30 - bugfix/2026.03mar.30-svg-text-qt6-crash — strip
<text>/<flowRoot>fromcanvas.svg+pb_clementine.svg; Qt6 SVG renderer segfaults on zero-size or missing-font glyphs — merged 2026-03-30 - bugfix/2026.03mar.30-exec-deprecated-qt6 — replace all 12
exec_()calls withexec()throughout the Python frontend; Qt6 deprecated the underscore form — merged 2026-03-30 - feature/2026.03mar.30-start-with-patchbay — new
Main/StartWithPatchbaysetting +ch_main_start_patchbaycheckbox; startup tab activates patchbay when set;projectLoadingFinishedschedulesslot_canvasZoomFit300 ms after canvas refresh to centre the viewport on spawned nodes — merged 2026-03-30 - feature/2026.03mar.30-plugin-browser-sidebar — new
w_pluginstab in the side paneltabUtils;carla_plugin_browser.pywidget enumerates PLUGIN_INTERNAL + PLUGIN_LV2 viagCarla.utils; search bar + type filter; double-click emitspluginActivated(dict); drag from list to patchbay view callshost.add_plugin()and positions the node viapatchcanvas.setGroupPosat the drop point — merged 2026-03-30 - bugfix/2026.03mar.30-settings-bool-sync —
QSafeSettings.value()now explicitly converts raw string "true"/"false" returns to Python bool; fixes StartWithPatchbay (and any other bool setting) silently falling back to defaultValue on PyQt6 builds where type coercion returns a str — merged 2026-03-30 - feature/2026.03mar.30-disk-tree-collapse-persist —
fileTreeViewexpanded dirs persisted across restarts viafExpandedDirsset +DiskExpandedDirsQSettings key;b_disk_collapsebutton added to disk tab header (Collapse All);slot_fileTreeExpanded/slot_fileTreeCollapsedtrack state;_restoreExpandedDirsschedules restore 300 ms after load via QTimer;RAYSESSION_NOTES.mdsurvey of implementable RaySession features — merged 2026-03-30 - bugfix/2026.03mar.30-jack-timebase-nframes — guard
nframes > 0at the call site inhandleJackTimebaseCallbackbefore passing tofillJackTimeInfo; eliminates noisyCARLA_SAFE_ASSERT_RETURN(newFrames > 0)messages when JACK calls the timebase callback during transport relocation — merged 2026-03-30 - bugfix/2026.04apr.01-hw-placement-before-addgroup —
_canvas_hardware_zone_bottom()was called afteraddGroup, so it scanned the just-added node at its randomCanvasGetNewGroupPosposition; if collision-avoidance pushed that to a large y the entire hardware zone stacked from there, placing nodes off-canvas and blowing out the minimap; fix: computehw_ybeforeaddGroup— merged 2026-04-01 - bugfix/2026.04apr.01-canvasport-qt-version —
canvasport.pysetPortName()usedQT_VERSIONat line 141 but never imported it;canvasbox.pyandscene.pyboth import it correctly fromPyQt5/6.QtCore— added to match — merged 2026-04-01 - feature/2026.03mar.31-plugins-tab-hardware-placement —
ui_carla_host.py:w_pluginsmoved fromtw_miniCanvastotabUtils(now sits alongside Disk + Transport);retranslateUilabel updated;_BELOW_ALL_CLIENTSextended withmidi-bridge,a2j,a2jmidid,ble midi,bluetooth midi;_canvas_hardware_zone_bottom()placesICON_HARDWAREnodes 35% above canvas centre, centred X, split nodes symmetric at ±350;act_canvas_save_imagegainsCtrl+Shift+Ishortcut — merged 2026-03-31 - feature/2026.03mar.31-raysession-search-xrun —
patchcanvas.filterGroupsByName(text)dims non-matching group widgets to 0.15 opacity (clears on empty text);fCanvasSearchBarQLineEdit overlay on canvas, Ctrl+F shows it top-right, Esc clears and hides;slot_handleProjectLoadFinishedCallbackcallsclear_engine_xruns()on load — merged 2026-03-31 - feature/2026.03mar.31-canvas-node-placement —
CanvasGetNewGroupPosuses a 160×30 footprint-rect intersect check instead of point-in-rect to prevent node overlap;line_null/line_null_selamber-yellow added to all 5 theme variants;elsefallback incanvasline.py+canvasbezierline.pyforPORT_TYPE_NULLcables;_BELOW_ALL_CLIENTS(plasmashell,pavucontrol) placed below all other nodes via_canvas_max_node_bottom()inslot_handlePatchbayClientAddedCallback— merged 2026-03-31 - feature/2026.03mar.31-canvas-fit-padding —
zoom_fitnow adds 12% padding (min 50 scene units) to thefitInViewrect; returns paddedQRectF;slot_canvasZoomFituses it to callminiCanvasPreview.setRenderSource(fit)re-centring the minimap on the node cluster;CanvasPreviewFrame.setRenderSource(rect)added — merged 2026-03-31 - feature/2026.03mar.31-canvas-autozoom-plugin-autoload —
slot_handleEngineStartedCallback: scheduleslot_canvasZoomFit1 s after engine start so initial JACK nodes are centred without user action; schedulefPluginBrowser.refresh()500 ms after engine start;slot_tabUtilsChangedlazy-loads the browser the first time the Plugins tab is selected; initial status label changed to "Waiting for engine..." — merged 2026-03-31
(none yet — all local feature work is pending)
- Needs Attention (0 branches): (none)
- Awaiting Review (0 branches): (none)
- Local Development (24 branches): lv2-deadlock, file-open-folder, qt6-precedence, install-vst2-glob, log-missing-uri, dsp-refresh, canvas-autosize, drag-scroll, default-session-on-open, lv2-native-scalepoints, svg-text-qt6-crash, exec-deprecated-qt6, start-with-patchbay, plugin-browser-sidebar, settings-bool-sync, disk-tree-collapse-persist, jack-timebase-nframes, canvas-autozoom-plugin-autoload, canvas-fit-padding, canvas-node-placement, raysession-search-xrun, plugins-tab-hardware-placement, canvasport-qt-version, hw-placement-before-addgroup
- Secondary Patches (0 branches): (none)
See Feature Request Branch TODO section at the end of this file for planned work.
Pre:
- Branch rebased on latest
falktx/Carlamain
During:
- Builds without errors (
make -j$(nproc --ignore=2)) - No new compiler warnings or pylint regressions
- Basic functionality tested
Post:
- No regressions in related features
This process updates all local feature/fix branches to latest upstream:
- Upstream MUST be fetched first:
git fetch upstream - For each feature branch:
- The branch MUST be rebased on
upstream/main:git rebase upstream/main - Conflicts MUST be resolved if any occur
- The rebased branch SHOULD be force-pushed to origin:
git push --force-with-lease origin HEAD - The "Rebased" date in
INTEGRATION.mdMUST be updated
- The branch MUST be rebased on
- Branches with unresolved conflicts SHOULD be noted for later attention
- After all branches are updated, the Integration Merge Process SHOULD be run
This process merges all [x] marked branches into the integrated branch for a combined build.
-
Commit pending
INTEGRATION.mdchanges (if any) before starting:git add INTEGRATION.md && git commit -m "update INTEGRATION.md before integration" -
Fetch upstream:
git fetch upstream -
Rebase all local feature branches on
upstream/main(skip upstream PR branches — they are not rebased). -
Checkout the
integratedbranch:git checkout integrated -
Merge
upstream/mainintointegrated(merge, not rebase, to preserve integration history):git merge upstream/main -
Re-fetch upstream PR branches:
git fetch upstream '+refs/pull/*/head:refs/remotes/pr/*' -
Merge each
[x]upstream PR branch:git merge --no-ff pr-<N> -m "Merge PR #<N>: <title>" -
Merge each
[x]local feature branch:git merge --no-ff origin/<branch-name> -
Resolve merge conflicts carefully. Common issues:
- Qt import blocks: keep the
qt_compatversion supporting both PyQt5 and PyQt6 - C++ callback signatures: keep the newer/more complete version
- Action constants in
patchcanvas/__init__.py: preserve existing constants and insert new ones after, renumbering the rest
- Qt import blocks: keep the
-
Update
INTEGRATION.md:- Change
[ ]to[x]for newly merged branches - Update "Rebased" and "Updated" dates to today
- Update the summary line counts
- Update the "Last updated" date at the top
- Change
-
Build and verify:
make -C /home/milkii/media/projects/cascade/carla -j$(nproc --ignore=2)Full clean rebuild (when Makefile or new source files are involved):
make -C /home/milkii/media/projects/cascade/carla clean make -C /home/milkii/media/projects/cascade/carla -j$(nproc --ignore=2)Basic functionality SHOULD be tested after build.
-
Sync to Gist (if
INTEGRATION.mdwas updated):gh gist edit 9c883e2022e978d9098311cbe4e2f875 --filename INTEGRATION.md INTEGRATION.md
gh pr view <PR-number> --repo falktx/Carla
gh pr list --repo falktx/Carla --author mxmilkiib
gh issue list --repo falktx/Carla --author mxmilkiib
This section documents the structure of this file for AI assistants and future maintainers.
Branch naming convention: feature/YYYY.MMmon.DD-thing-descriptive-title
- [x] **branch-name** - [#PR](url) - STATUS - Issue: [#ISSUE](url) - Optional description - Created: YYYY-MM-DD, Last comment: YYYY-MM-DD, Rebased: YYYY-MM-DD, Updated: YYYY-MM-DD - Next: Action item - Specifics: - Details about the branch and what probably should happen next
[x]= merged to integration,[ ]= not merged- Branch name in bold
- Issue link to related Carla issue/feature request (if applicable)
- Created date required for all branches
- Last comment date shows most recent PR comment ("none" if no comments), only for PRs
- Rebased date shows when branch was last rebased on
falktx/Carlamain ("none" if never) - Updated date tracks last modification to branch
- Next action describes what needs to be done for this branch
- Within each section:
[x](integrated) branches first, then[ ](not integrated) branches - Within each group (
[x]or[ ]), sort by updated date (newest first) - STATUS is one of:
DRAFT,REVIEW_REQUIRED,CHANGES_REQUESTED,MERGED,LOCAL_ONLY - Secondary patch entries use
Resolves-residual-fromorDepends-oninstead ofIssueto link to the primary branch
- Upstream PRs in Integration
- Needs Attention (CHANGES_REQUESTED)
- Secondary Patches
- Open PRs (REVIEW_REQUIRED)
- Local Only (No PR)
- Merged to Upstream
When updating integration: Update the "Last updated" date at the top of this file. Update the summary line at the top when adding/removing branches:
**Summary**: X need attention, Y awaiting review, Z local-only, W secondary patches, V upstream PRs in integrated, U merged upstream
Upstream (falktx/Carla main) is actively merging Qt6 compatibility:
qt_compat.pyand per-file PyQt5/PyQt6 conditional imports already in place across the frontend.- Recent upstream commits: "Import qt6 fixes from ui-rework branch", "Fix QGLWidget import for PyQt6", "Fix carla-plugin embed usage in Qt6".
- No separate local Qt6-prep branch is needed; stay current with
upstream/main. - When adding new frontend code, follow the existing pattern in
qt_compat.py: import from whichever PyQt version is active (qt_config == 5/qt_config == 6).
rack-ui-rework(falktx) — 11 commits ahead of main (last: 2025-08-03). Imports jpka's rack UI rework, removes the "forth" API, and carries Qt6 fixes not yet on main. Worth merging tointegratedonce it stabilises. Monitor for merge.custom-patchbay-ports(falktx, 2017) — 2 commits: adds configurable audio/midi port counts to Carla-Patchbay viaCarlaEngineJack.cpp. Old and likely bitrotted, but the concept is still open. Noted for reference only; not suitable forintegratedas-is.
Issues filed on falktx/Carla, ordered within each section by importance then hardness.
PRs target mxmilkiib/Carla before falktx/Carla.
[x] = branch created, pushed to mxmilkiib/Carla, ready to submit upstream.
Difficulty:
[easy]— 1–2 files, contained, well-understood path[medium]— multiple files, needs design, crosses Python/C++ boundary[hard]— new subsystem layer, platform-specific, or architectural dependency[arch]— requires new cross-layer API or new subsystem; not a simple branch
Items ordered: crash risk first, then build/install, then UX regressions.
-
#1968 — LV2
program_changeddeadlock when index == -1[easy]handleProgramChanged(-1)tookScopedSingleProcessLocker, then calledreloadProgramswhich callssetMidiProgram, which takes the same lock — deadlock.- Fix: removed the outer lock;
setMidiProgramprotects itself internally. - Files:
source/backend/plugin/CarlaPluginLV2.cpp(handleProgramChanged) - Branch:
bugfix/2026.03mar.29-lv2-program-changed-deadlock
-
#2019 — "Open" dialog ignores default project folder
[easy]- On first open after launch, the file dialog could revert to the OS default if the configured project folder no longer exists (deleted, unmounted drive).
- Fix: validate
CARLA_KEY_MAIN_PROJECT_FOLDERwithos.path.isdir; fall back toHOME. - Files:
source/frontend/carla_host.py(slot_fileOpen) - Branch:
bugfix/2026.03mar.29-file-open-default-folder
-
#2031 — Qt5 selected over Qt6 when both are present
[easy]Makefile.deps.mksetFRONTEND_TYPE = 6first, then unconditionally overwrote it withFRONTEND_TYPE = 5if Qt5 was also found — Qt5 always won on dual-Qt systems.- Fix: guard the Qt5 block with
ifeq ($(FRONTEND_TYPE),)so it only runs when Qt6 was not selected. Qt5 standard support ended May 2025. - Files:
source/Makefile.deps.mk - Branch:
bugfix/2026.03mar.29-qt6-precedence-over-qt5
-
#1991 —
make installaborts on missing VST2 glob[easy]install -m 644 bin/CarlaRack*.* bin/CarlaPatchbay*.*fails with "cannot stat" when those files were not built (Linux without cross-compiled WIN32 VST2 binaries).- Fix: replace bare glob with a shell conditional that skips the install if no files match.
- Files:
Makefile(install_maintarget) - Branch:
bugfix/2026.03mar.29-install-vst2-glob-guard
-
#1917 — FTBFS on GCC-14
[medium]- Build fails on GCC-14 (Ubuntu Oracular). Likely strict implicit-int or incompatible-pointer errors from deprecated GCC-14 behaviour. Build log at launchpad (gzipped).
- Fix: fetch log, identify offending translation units, add
-Wno-*guards or fix code. - Files: TBD after reading build log
- Suggested branch:
bugfix/YYYY.MMmon.DD-gcc14-build-errors
Items ordered: canvas-size first (high impact, easy), then drag-scroll (UX), then sub-rack (hard).
-
#1481 — Canvas size not persisted; imported projects clip
[easy]- When a project is loaded whose canvas boxes extend beyond the current scene rect, they are silently clipped or lost. The canvas has no persistence of its scene size.
- Fix: in
restoreGroupPositions, after setting all positions, callscene.setSceneRectwithcur.united(scene.itemsBoundingRect())if any item falls outside the current rect. - Files:
source/frontend/patchcanvas/patchcanvas.py(restoreGroupPositions) - Branch:
feature/2026.03mar.29-patchbay-canvas-autosize
-
#1577 — Patchbay: auto-scroll canvas during drag near edge
[medium]- When dragging a rubberband selection, the canvas does not scroll when the cursor approaches the viewport edge.
- Fix: in
mouseMoveEvent, whenm_mouse_rubberbandis active, map scene pos to viewport coords; if within 30 px of any edge, step scroll bars proportionally. - Files:
source/frontend/patchcanvas/scene.py(mouseMoveEvent) - Branch:
feature/2026.03mar.29-patchbay-drag-scroll
-
#1353 — Display sub carla-rack plugin graph in patchbay
[arch]- When a Carla-Rack is loaded as a plugin, expose its internal plugin graph as an expandable sub-graph in the parent patchbay — similar to REAPER's track wiring view.
- Requires a recursive patchbay callback API (new
PATCHBAY_CLIENT_TYPE_RACK_CHILD?), backend support for querying sub-rack plugin lists and their connections, and a new canvas group type or nested scene. Very large; requires coordination across the host/plugin boundary. - Files: backend API (
CarlaBackend.h,CarlaEngine), patchcanvas,carla_host.py - Suggested branch:
feature/YYYY.MMmon.DD-patchbay-rack-expansion
Items ordered: log missing URI, DSP refresh, minimised-plugin knobs, LV2 UI picker, embedded plugin UI tab (hard platform work).
-
#1499 — Log the URI/filename of missing plugin clients
[easy]- When a project loads and a plugin cannot be found, the log only shows the client name.
- Fix: added plugin type, binary path, and label/URI to the
carla_stderr2call inCarlaEngine::loadProjecton load failure. - Files:
source/backend/engine/CarlaEngine.cpp(project load path) - Branch:
feature/2026.03mar.29-log-missing-plugin-uri
-
#1482 — Decouple DSP bar refresh rate from engine idle interval
[easy]CARLA_KEY_MAIN_REFRESH_INTERVALcontrolled bothfIdleTimerFast(engine idle) andfIdleTimerSlow(DSP bar + plugin slow idle). Slowing it for a calm DSP bar would break engine idle.- Fix: added
CARLA_KEY_MAIN_DSP_REFRESH_INTERVAL(default 1000 ms) and a third timerfIdleTimerDspdrivinggetAndRefreshRuntimeInfoonly. New spinbox in settings. - Files:
source/frontend/carla_shared.py,source/frontend/carla_host.py,source/frontend/carla_settings.py,resources/ui/carla_settings.ui - Branch:
feature/2026.03mar.29-dsp-bar-refresh-rate
-
#1923 — Show dry/wet and volume knobs on minimised plugin slots
[medium]- Users with long racks keep most plugins minimised. Dry/wet and volume are the only controls they need but currently require expanding the slot.
- The compact plugin UI (
carla_plugin_compact.ui) does not contain knob widgets; adding them requires redesigning the compact UI, adding knob instances in the Python class, and wiring them to the existing parameter update path. - Files:
resources/ui/carla_plugin_compact.ui,source/frontend/carla_skin.py(compact slot class),source/frontend/carla_widgets.py(parameter hooks) - Suggested branch:
feature/YYYY.MMmon.DD-compact-slot-wet-vol-knobs
-
#1929 — Load a default session automatically on startup
[medium]- Allow users to configure a default
.carxpfile that is loaded whenever Carla starts with no command-line project argument. - Fix: added
CARLA_KEY_MAIN_DEFAULT_PROJECTtocarla_shared.py; added file-picker row to the Paths settings group; on startup (not NSM, not isControl/isPlugin), if no CLI project and the key is set to a valid file, callloadProjectLaterwith it. - Files:
source/frontend/carla_shared.py,source/frontend/carla_host.py,source/frontend/carla_settings.py,resources/ui/carla_settings.ui - Branch:
feature/2026.03mar.30-default-session-on-open
- Allow users to configure a default
-
#1559 — Per-plugin LV2 UI selector
[medium]CarlaPluginLV2already enumerates all UIs infRdfDescriptor->UIsand picks one automatically by priority (lines 7039–7157 inCarlaPluginLV2.cpp). There is no way for the user to override the selection.- Fix: expose the UI index as a per-plugin setting; add a "Choose UI…" entry to the plugin
context menu; pass the chosen index to
CarlaPluginLV2::ui_show, storing it in plugin state. - Files:
source/backend/plugin/CarlaPluginLV2.cpp(UI selection,ui_show),source/frontend/carla_widgets.pyorcarla_skin.py(context menu) - Suggested branch:
feature/YYYY.MMmon.DD-lv2-ui-selection
-
#1976 — LV2 scalePoints lost when bridge mode enabled
[medium]- For some plugins,
lv2:scalePointentries are stripped when "Run plugins in bridge mode" is active. The bridge serialiser sends only the value range, discarding point labels. - Fix: trace the LV2 plugin info serialisation in the bridge path; ensure
LV2_RDF_PortScalePointarray is included in the binary descriptor sent across the bridge pipe. - Files:
source/backend/plugin/CarlaPluginLV2.cpp(bridge descriptor build),source/backend/utils/CarlaStateUtils.cppor bridge pipe protocol - Suggested branch:
bugfix/YYYY.MMmon.DD-lv2-bridge-scalepoints
- For some plugins,
-
#1523 — Option to embed plugin UIs as a tab inside Carla
[hard]- Plugin UIs currently open as floating windows.
- Requires XEmbed (X11) or Wayland foreign-toplevel; the bridge UI layer exists but embedding
a native window into a
QWidgettab differs significantly between X11 and Wayland. - Files:
source/frontend/(new tab widget),source/bridges-ui/CarlaBridgeUI.cpp,source/backend/plugin/CarlaPlugin.cpp - Suggested branch:
feature/YYYY.MMmon.DD-embed-plugin-ui-tab
Items ordered: metadata icons (C++/Python, self-contained), PipeWire volumes (new API layer).
-
#1576 — Display JACK client metadata icons in patchbay
[medium]- The JACK metadata API (
jack_get_property/JACK_METADATA_ICON_SMALL) allows clients to advertise icon paths. Carla's patchbay could render these on canvas boxes. - Fix: query
jack_get_propertyon client registration; pass icon path through patchbay callback to Python; render incanvasbox.py. Guard with#ifdef HAVE_JACK_METADATA. - Files:
source/backend/engine/CarlaEngineJack.cpp,source/frontend/patchcanvas/canvasbox.py,source/frontend/carla_host.py(callback slot) - Suggested branch:
feature/YYYY.MMmon.DD-jack-metadata-icons
- The JACK metadata API (
-
#1927 — Auto-follow engine sample rate changes
[medium]- When the JACK/PipeWire graph sample rate changes (e.g. switching between 48 kHz and 96 kHz in a DAW), Carla does not reconfigure automatically.
- Fix: subscribe to the JACK
JackSampleRateCallbackinCarlaEngineJack.cpp; post a postponed event that triggerspData->engine->updateBufferSize/updateSampleRate; propagate to the frontend viaENGINE_CALLBACK_SAMPLE_RATE_CHANGED. - Files:
source/backend/engine/CarlaEngineJack.cpp, possiblycarla_host.pyfor UI update - Suggested branch:
feature/YYYY.MMmon.DD-jack-follow-sample-rate
-
#1368 — Control PipeWire client volumes from patchbay
[hard]- PipeWire assigns a volume control to every JACK client. Carla's patchbay could expose these as a gain slider or context-menu item.
- JACK API has no volume concept; requires native PipeWire API (
pw_core,pw_registry,SPA_PROP_channelVolumes). Guard with#ifdef HAVE_PIPEWIRE. - Files: new
source/backend/engine/CarlaPipeWireHelper.cpp,CarlaEngineJack.cpp, patchcanvas context menu - Suggested branch:
feature/YYYY.MMmon.DD-pipewire-client-volumes
- #1533 — WSL2 bridge for Linux plugins on Windows
[arch]- Run Linux plugins on Windows by routing plugin IPC through a WSL2 instance. Entirely new infrastructure component; out of scope for a simple feature branch. Noted for completeness.
-
#1888 — Parity and future of Carla vs mod-*
- Architectural discussion issue. Not actionable as a code branch.
-
#1620 — Add GH issue templates to falktx/Carla
- Repo governance task. Could be implemented on
mxmilkiib/Carlafork independently (.github/ISSUE_TEMPLATE/) as a demonstration or personal convenience.
- Repo governance task. Could be implemented on