Nested docker layouts for REAPER — a native C++ extension that lets you build custom multi-pane workspaces with tabbed windows, drag-and-drop, and instant workspace switching.
Capture any REAPER window — Media Explorer, FX Browser, Mixer, Actions, or even ReaImGui scripts — into a single tiling container with resizable split panes and tabbed panels.
- Flexible split layouts — Split panes horizontally or vertically to any depth (up to 16 panes). Drag splitter bars to resize on the fly.
- Tabbed windows — Multiple windows per pane, with tab bar. Click tabs to switch, drag tabs between panes. Each tab bar has a ▼ menu button for quick access to the pane context menu.
- 15 known REAPER windows — One-click capture for Mixer, Track Manager, Routing Matrix, Media Explorer, FX Browser, Project Bay, Region Manager, Region Render Matrix, Actions, Undo History, Navigator, Big Clock, Video, Performance Meter, Virtual MIDI Keyboard.
- Arbitrary window capture — Grab any open REAPER window, including third-party ReaImGui scripts (ReaMD, etc.), via the "Open Windows" submenu or click-to-capture mode.
- Workspaces — Save and restore complete layout snapshots (tree structure + captured windows) with a single click.
- Favorites — Pin frequently used windows for quick access across sessions.
- Tab colors — Color-code tabs with 8 palette colors for visual organization.
- Layout presets — Quick-start with 5 built-in layouts: Two Columns, Left + Right Split, Three Columns, 2x2 Grid, Top + Bottom Split.
- Solo/maximize pane — Temporarily expand any pane to fill the entire container. Toggle via context menu or keyboard shortcut. Layout is fully restored when exiting solo.
- Tab reorder — Drag tabs left/right within the same pane to rearrange their order.
- Keyboard shortcuts — Five REAPER actions (Next/Prev Tab, Next/Prev Pane, Solo Toggle) bindable via Actions dialog.
- Splitter double-click — Double-click any splitter to reset it to 50/50.
- Hover highlights — Visual feedback on splitter bars and tabs when hovered.
- Per-project state — Layout is saved inside each .RPP project file, so different projects can have different MaxPane configurations.
- Persistent state — Layout, captured windows, favorites, and workspaces survive REAPER restarts.
- Auto-open on startup — Optionally restore MaxPane automatically when REAPER launches.
- Dockable — The container itself docks into REAPER's native docker system.
- Zero dependencies — Pure C++ extension using REAPER SDK + WDL/SWELL. No scripts, no ReaImGui, no js_ReaScriptAPI required.
| Create grid layout | Assign windows to panes | Recall workspace |
|---|---|---|
![]() |
![]() |
![]() |
- In REAPER, go to Extensions > ReaPack > Import repositories...
- Paste this URL:
https://raw.githubusercontent.com/b451c/MaxPane/main/index.xml - Go to Extensions > ReaPack > Browse packages, search for MaxPane.
- Right-click > Install, then restart REAPER.
ReaPack will automatically notify you of future updates.
- Download the binary for your platform from the Releases page.
- Copy it to your REAPER resource path:
| Platform | Path |
|---|---|
| macOS | ~/Library/Application Support/REAPER/UserPlugins/ |
| Windows | %APPDATA%\REAPER\UserPlugins\ |
| Linux | ~/.config/REAPER/UserPlugins/ |
- Restart REAPER.
- Open via Actions > MaxPane: Open Container, or assign a keyboard shortcut.
See Building below.
- Open MaxPane — Run the action "MaxPane: Open Container" from REAPER's Actions menu.
- Right-click any pane header, or click the ▼ button at the right of any tab bar, to open the pane context menu.
- Choose a window from the Known Windows list, or browse Open Windows for any visible REAPER window.
- Split panes via the context menu (Split Left/Right or Split Top/Bottom).
- Drag tabs between panes to rearrange, or within the same pane to reorder.
- Solo a pane via right-click > Solo Pane to temporarily maximize it. Right-click > Exit Solo to restore.
- Right-click a tab to close it, move it, color it, or add it to Favorites.
- Save a workspace via right-click > Workspaces > Save Current.
- Drag splitter bars to resize panes. Double-click a splitter to reset to 50/50.
- Bind keyboard shortcuts — In REAPER's Actions dialog, search for "MaxPane" to find Next/Prev Tab, Next/Prev Pane, and Solo Toggle.
- CMake 3.15+
- C++17 compiler (Clang on macOS, GCC on Linux, MSVC on Windows)
- REAPER SDK — clone into
cpp/sdk/:git clone https://github.com/justinfrankel/reaper-sdk.git cpp/sdk
- WDL — clone into
cpp/WDL/:git clone https://github.com/justinfrankel/WDL.git cpp/WDL
cd cpp/build
cmake .. -DCMAKE_BUILD_TYPE=Release
make
cp reaper_maxpane.dylib ~/Library/Application\ Support/REAPER/UserPlugins/cd cpp/build
cmake .. -DCMAKE_BUILD_TYPE=Release
make
cp reaper_maxpane.so ~/.config/REAPER/UserPlugins/cd cpp/build
cmake .. -G "Visual Studio 17 2022" -A x64
cmake --build . --config Release
copy Release\reaper_maxpane.dll "%APPDATA%\REAPER\UserPlugins\"Debug builds enable verbose logging to /tmp/maxpane_debug.log:
cmake .. -DCMAKE_BUILD_TYPE=Debug
make- REAPER 7.0+ (tested on 7.62)
- macOS arm64 (Apple Silicon) and x86_64 (Intel)
- Windows x64
- Linux x86_64
cpp/src/
main.cpp Entry point, API imports, action registration
container.h Container class declaration, shared structs (TabBarLayout, DragState, …)
container.cpp Lifecycle, DlgProc, context menus, OnTimer, OnPaneMenuButtonClick
container_paint.cpp OnPaint, DrawTabBar (rendering only)
container_input.cpp Mouse events, tab hit-testing, drag-and-drop, CalcTabBarLayout, GetTabRect
container_state.cpp SaveState, LoadState, ApplyPaneState, workspace save/load/delete
split_tree.h/cpp Binary tree layout engine (split/merge/drag/recalculate)
window_manager.h/cpp Window capture via SetParent, tab management (close/move/reposition)
capture_queue.h/cpp Async window capture with retry + dock frame detection
favorites_manager.h/cpp Persistent favorites with action command strings
workspace_manager.h/cpp State save/restore, named workspace snapshots
context_menu.h/cpp Context menu construction (pane + tab menus)
config.h Constants: colors, geometry, timing, window definitions
project_state.h/cpp RPP chunk I/O (project_config_extension_t callbacks)
state_accessor.h Polymorphic StateAccessor for global/project/RPP state
globals.h/cpp REAPER API function pointers, safe_strncpy, helpers
debug.h Conditional debug logging (Debug builds only)
The extension works by reparenting REAPER windows (via SetParent) into a custom container dialog. The container uses a binary split tree for layout, with each leaf node representing a pane that holds tabbed windows. Global state is persisted via REAPER's ExtState API; per-project state is saved inside .RPP files via project_config_extension_t.
Contributions are welcome! See CONTRIBUTING.md for guidelines.
If you find MaxPane useful, consider supporting its development:
MIT — Copyright (c) 2025–2026 b451c
- Forum thread — https://forum.cockos.com/showthread.php?t=307267
- REAPER — https://www.reaper.fm
- ReaPack — https://reapack.com
- REAPER SDK — https://github.com/justinfrankel/reaper-sdk
- WDL/SWELL — https://github.com/justinfrankel/WDL




