Profile Builder · The interface, your way around
An orientation tour of the Profile Builder: views, tabs, the selection panel and every control that builds your profile.
The Builder is a three‑column workspace: structure on the left, overview in the middle, focused editing on the right. Nothing scrolls except the panels themselves.
┌──────────────────────────────────────────────────────────────────────────┐
│ Header: brand · tool nav · status · undo/redo · New/Open/Load · Save │
├───────────────┬──────────────────────────────────────┬───────────────────┤
│ LEFT │ CENTER │ RIGHT │
│ • Groups │ Tabs: Mouse | Bindings | Settings │ • Press stages │
│ • Profile │ | JSON | Diagnostics │ • Trigger section │
│ • Diagnostics │ (the area described in each tab) │ • On activation │
│ │ │ • On deactivation │
│ │ │ • Nesting & label │
└───────────────┴──────────────────────────────────────┴───────────────────┘
Header (top bar)
| Control | What it does |
|---|---|
| New | Start a fresh blank template (warns if you have unsaved work). |
| Open… | Pick a .spcf file from your computer and edit it. |
| # ID + Load | Load an existing hub profile by its number (#123). |
| Download | Write the current profile to a .spcf file locally. |
| Save | Publish a new profile or save changes to one you own. Label changes with your state: Save / publish profile → Save changes. |
| ↶ ↷ | Undo / redo (full‑document). |
| ● modified | Dot appears the moment your document differs from the saved state. |
| ? | Shortcut help overlay. |
You can also drag & drop any .spcf file onto the page to open it, and
deep‑link to a profile with /editor?id=<ID>.
Left rail — Groups, Profile, Diagnostics
- Groups — the list of all groups in the file, indented by depth (sub‑profiles sit inside their parent). Click to select; a + adds a new group, +sub adds a sub‑profile under the selected group, − removes the selected group (and everything in it).
- Profile — the profile title, hub ID and group/mapping counts.
- Diagnostics — a quick sanity line: Looks coherent or N issues.
Groups are your layers. A sub‑profile is a normal group nested inside another one — the Z3 switches between groups/sub‑profiles when a Select profile or Jump to profile action fires.
Center — the five tabs
Mouse (default)
The full Z3 button map in six sections: Mousewheel · Main · Thumb · Fingertip · Triggers · Edges.
Every button card shows its light press stage and any deep zones as separate rows, with the bound actions summarized inline. Clicks select the button and jump into the right rail editor. A stats strip above the mouse sums up the whole profile (bindings / buttons / deep zones / tilt‑pivot / surface / wheel / scripts).
Bindings
The complete list of everything in the profile, grouped by type:
Buttons → Wheel → Surface → Tilt / Pivot → Other → Settings, followed by
the Nesting tree of the selected group. There's a filter bar (Filter bindings — key, button, action…) and a trigger‑type dropdown (Button presses
/ Deep zones / Tilt / Pivot / Wheel / Surface / Settings / Other). Each button
card carries a + Add menu for creating bindings — and for choosing the
trigger a new binding is nested under, which is what makes it live only while
that trigger is held.
Settings
The device settings of the selected group (Layers/DPI/etc. — the whole
list is covered in settings-and-dpi.md). Changes
apply to the group you currently have selected on the left.
JSON
The raw serialized profile, formatted and read‑only. Great to copy if you want to keep a full text version of the file.
Diagnostics
The full check result for the whole profile. Each issue has a quick action (see below).
Right rail — the binding editor
Narrow editing of the selected binding (or the press‑stages of the selected button):
- Press stages — the pressure‑axis card (see
deep-click.md). From here you add+ Light pressbindings and+ Deep zonebindings. - Trigger — the trigger type plus its fields (zone ranges, direction, axis, etc.).
- On activation — the list of actions fired when the trigger engages, with + Add action.
- On deactivation — the list fired when the trigger releases / leaves the zone, with + Add action.
- Nesting & label — you can name the binding (Label), pick the trigger it is nested under (empty = always live), and Move to… when the profile has more than one group. A nested binding is active while that parent's trigger is held — nothing else, and no delay.
Action rows get ↑ ↓ (reorder), ⎘ (duplicate), ✎ (edit) and × (remove) buttons. Editing uses a small composer window with a Kind dropdown and its fields.
Diagnostics — what the checks catch
The tool checks the whole profile and flags:
- A group with no bindings at all.
- A mapping with no trigger type.
- A mapping with no actions (neither activation nor deactivation).
- A broken nesting link that points at a mapping that no longer exists.
- Nesting past 20 levels, and a cycle of bindings gating each other.
- Overlapping deep zones on the same button (e.g.
Left Button: deep zones overlap at NN%).
Each entry offers a one‑click action: Jump to Group / Mapping, Add Action, Remove Binding / Group, Make Top-Level. When nothing is wrong you see "No issues found — the profile looks coherent."
Keyboard shortcuts (Ctrl+/ to show the overlay)
| Shortcut | Action |
|---|---|
Ctrl+S |
Save changes / publish |
Ctrl+Z |
Undo |
Ctrl+Shift+Z / Ctrl+Y |
Redo |
Ctrl+Shift+D |
Duplicate the selected mapping |
Delete / Backspace |
Remove the selected mapping (when focus is not in a text field) |
Ctrl+/ |
Toggle shortcut help |
Esc |
Close the help overlay |
Ctrl+C / Ctrl+V |
Copy/paste OLED images & animations (on canvas/OLED fields) |
FAQ
"Why does the left Diagnostics say one thing and the Diagnostics tab another?" The left card is a one‑line status; the tab lists every finding in detail.
"I switched tabs and my drag on a range plot was lost — why?" Range plots for triggers push a single undo snapshot when you start dragging (not on every pixel), so one drag = one undo step.
"Can I reorder bindings in the right rail?"
Yes — the ↑/↓ buttons on each action row move actions within the
activation/deactivation list. Whole mappings are grouped under the binding they
are nested in, and that tree is drawn under the Root key (see
nesting.md).