Reference guide for generating Underware cable management channel OpenSCAD code. Provides channel type selection, parameter quick reference, and QuackWorks integration. Use when generating OpenSCAD files for Underware cable routing systems.
Generates OpenSCAD code for Underware cable management channels that snap onto OpenGrid/Multiboard systems. Use when users need parametric cable routing with two-part snap-fit channels (base + top) for wall or desk mounting.
/plugin marketplace add racurry/neat-little-package/plugin install spirograph@neat-little-packageThis skill inherits all available tools. When active, it can use any tool Claude has access to.
corners-junctions.mdcurves-transitions.mdmounting-accessories.mdstraight-runs.mdGenerates OpenSCAD code for parametric cable management channels compatible with OpenGrid/Multiboard wall-mounted systems.
Authoritative source (fetch every time):
Local reference clone (if GitHub unavailable):
/Users/aaron/workspace/infra/neat-little-package/.tmp/QuackWorks/Underware/*.scadRelated documentation:
Two-part snap system: Every channel consists of separate Base + Top pieces:
Path-sweep construction: All channels use BOSL2 path_sweep() for complex geometries:
// Profile defines cross-section shape
// Turtle commands define path through space
path_sweep(baseProfile(widthMM = 25), turtle(["move", lengthMM]))
Profile scaling for width: Multi-unit channels expand by stretching center rectangle:
// 1-unit channel: 25mm wide (standard profile)
// 2-unit channel: 50mm wide (profile halves moved apart, rectangle fills gap)
function baseProfile(widthMM = 25) =
union(
left((widthMM-25)/2, selectBaseProfile), // Left half
right((widthMM-25)/2, mirror([1,0], selectBaseProfile)), // Right half mirrored
back(3.5/2, rect([widthMM-25+0.02, 3.5])) // Center fill rectangle
);
Grid-based dimensioning: All dimensions in 25mm grid units (OpenGrid/Multiboard standard):
Grid_Size = 25 (constant, do not modify)Channel_Width_in_Units = 1 → 25mm wide channelChannel_Length_Units = 5 → 125mm long straight channelAll channel files require:
include <BOSL2/std.scad>
include <BOSL2/rounding.scad>
include <BOSL2/threading.scad>
Why these specific libraries:
std.scad: Core geometry operations (path_sweep, turtle, attachable)rounding.scad: Smooth corners on profilesthreading.scad: Threaded snap connector generation| Routing Need | Channel Type | Key File | Read Subpage |
|---|---|---|---|
| Straight run with cord exits | I Channel | Underware_I_Channel.scad | ./straight-runs.md |
| 90° corner, independent arm lengths | L Channel | Underware_L_Channel.scad | ./corners-junctions.md |
| 3-way intersection | T Channel | Underware_T_Channel.scad | ./corners-junctions.md |
| 4-way cross | X Channel | Underware_X_Channel.scad | ./corners-junctions.md |
| Split one path to two | Y Channel (Branch Split) | Underware_Branch_Split_Channel.scad | ./corners-junctions.md |
| Smooth diagonal transition | S Channel | Underware_S_Channel.scad | ./curves-transitions.md |
| Quarter/half/full circle | C Channel | Underware_C_Channel.scad | ./curves-transitions.md |
| 45° angled corner | Mitre Channel | Underware_Mitre_Channel.scad | ./curves-transitions.md |
| Vertical level change | Height Change Channel | Underware_Height_Change_Channel.scad | ./curves-transitions.md |
| User wants to | Recommended approach | Notes |
|---|---|---|
| Route desk power cables horizontally | I Channel with cord cutouts | Use Both Sides cutouts for multiple exit points |
| Turn corner around desk edge | L Channel | Set L_Channel_Length_in_Units_Y/X_Axis independently |
| Create cable junction box | T or X Channel | T for 3-way, X for 4-way crossroads |
| Branch to two monitor cables | Y Channel | Y_Output_Direction = "Forward" keeps both outputs same direction |
| Gradually shift cable run diagonally | S Channel | Bezier curve, specify Units_Over and Units_Up |
| Route around circular desk leg | C Channel | Set Arc_Angle for quarter (90°) or half (180°) circle |
| Transition cables up/down wall | Height Change Channel | Smooth vertical transitions |
Ask these questions:
Default: When unclear, use I Channel (straight) - user can connect multiple segments later.
/*[Choose Part]*/
Base_Top_or_Both = "Both"; // [Base, Top, Both] - Export control
/*[Channel Size]*/
Channel_Width_in_Units = 1; // Width in grid units (25mm each)
Channel_Internal_Height = 12; // Interior height 12-72mm (6mm increments)
/*[Mounting Options]*/
Mounting_Method = "Threaded Snap Connector";
// Options: Threaded Snap Connector, Direct Multiboard Screw,
// Direct Multipoint Screw, Magnet, Wood Screw, Flat
| Method | Use When | Parameters Needed | Print Orientation |
|---|---|---|---|
| Threaded Snap Connector | OpenGrid/Multiboard with connectors | None (default) | Base flat, Top upside-down |
| Direct Multiboard Screw | Screw directly into board holes | None | Base flat (pre-drilled holes) |
| Direct Multipoint Screw | Honeycomb Storage Wall | None | Base flat (larger holes) |
| Magnet | Curved surfaces, repositionable | Magnet_Diameter, Magnet_Thickness | Base flat (magnet recesses) |
| Wood Screw | Direct wall/desk mounting | Wood_Screw_Thread_Diameter | Base flat (countersink holes) |
| Flat | Adhesive mounting, testing | None | Base flat (no mounting features) |
Common mistake: Using Flat for production installs. This removes all mounting features - only use for adhesive mounting or prototyping.
/*[Advanced Options]*/
Grid_Size = 25; // ALWAYS 25 for OpenGrid compatibility
Profile_Type = "Original"; // [Original, v2.5] - BETA: v2.5 inverse clip
Flex_Compensation_Scaling = 0.99; // For wide/tall channels, reduce flex
Additional_Holding_Strength = 0.0; // [0:0.1:1.5] - Increase for larger channels
When to use Advanced Options:
Profile_Type = "v2.5": BETA feature, inverse inside clip (not backwards compatible)Flex_Compensation_Scaling: Channels wider than 1 unit or taller than 18mm may flex - scale to 0.99Additional_Holding_Strength: Wide channels (2+ units) benefit from 0.6 extra holding strengthUse decision framework above → select appropriate channel file as reference.
Navigate to relevant subpage for detailed parameter reference:
Dimension questions:
Mounting questions:
Cable exit questions:
Code structure pattern:
/*Created by [Your context]
Based on QuackWorks Underware by BlackjackDuck (Andy) and Hands on Katie
Licensed Creative Commons 4.0 Attribution Non-Commercial Share-Alike (CC-BY-NC-SA)
Documentation: https://handsonkatie.com/underware-2-0-the-made-to-measure-collection/
*/
include <BOSL2/std.scad>
include <BOSL2/rounding.scad>
include <BOSL2/threading.scad>
/*[Choose Part]*/
Base_Top_or_Both = "Both";
/*[Channel Size]*/
Channel_Width_in_Units = 1;
Channel_Internal_Height = 12;
// ... channel-specific size parameters
/*[Mounting Options]*/
Mounting_Method = "Threaded Snap Connector";
// ... mounting-specific parameters
/*[Advanced Options]*/
Grid_Size = 25;
Global_Color = "SlateBlue";
Profile_Type = "Original";
// ... include complete module code from QuackWorks reference
DO NOT write modules from scratch - copy/adapt from QuackWorks repository:
.scad file from QuackWorksProblem: User requests 75mm long channel, code sets lengthMM = 75.
Why it fails: Underware uses grid units for mounting alignment. 75mm doesn't align to 25mm grid - mounting holes won't match OpenGrid.
Better approach:
// User wants 75mm → suggest 75mm = 3 grid units
Channel_Length_Units = 3; // 3 × 25mm = 75mm
// Or: User wants 80mm → explain rounding
Channel_Length_Units = 3; // 75mm (closest grid alignment)
// Note to user: "Using 3 units (75mm) for grid alignment.
// For 100mm use 4 units."
Problem: Code generates only base or only top, user can't assemble.
Why it fails: Underware requires both parts to function. Base alone has no cable retention, top alone can't mount.
Better approach:
// ALWAYS default to Both for user convenience
Base_Top_or_Both = "Both";
// Explain in comments:
// For printing: Export "Both", slice with parts separated
// For troubleshooting: Export "Base" or "Top" individually
Problem: User mounting to OpenGrid, code uses Flat method.
Why it fails: No mounting features generated - channel won't attach.
Better approach:
// Ask about mounting surface first
// OpenGrid/Multiboard → "Threaded Snap Connector"
// Direct wall → "Wood Screw" with Wood_Screw_Thread_Diameter = 3.5
// Metal desk → "Magnet" with Magnet_Diameter = 4.0, Magnet_Thickness = 1.5
Problem: User can't render code, errors about undefined path_sweep.
Why it fails: BOSL2 library not included or not installed in OpenSCAD.
Better approach:
// ALWAYS include these three at top of file:
include <BOSL2/std.scad>
include <BOSL2/rounding.scad>
include <BOSL2/threading.scad>
// Add comment explaining BOSL2 requirement:
// Requires BOSL2 library: https://github.com/BelfrySCAD/BOSL2
// Install: Download and place in OpenSCAD libraries folder
Problem: Code sets Profile_Type = "v2.5" without explaining implications.
Why it fails: v2.5 inverse clip is not backwards compatible with Original profile. User can't mix old and new channels.
Better approach:
// Only use beta features if explicitly requested
Profile_Type = "Original"; // Default, backwards compatible
// If user wants stronger hold:
Additional_Holding_Strength = 0.6; // Stable, works with Original
// If user explicitly requests beta:
// Profile_Type = "v2.5"; // BETA: Inverse clip, NOT compatible with Original profile
Before delivering OpenSCAD code:
QuackWorks compliance:
std.scad, rounding.scad, threading.scad)Parameter validation:
Grid_Size = 25 (never modified)Channel_Width_in_Units is integer (1, 2, 3, not 1.5)Channel_Internal_Height in 6mm increments (12, 18, 24, ... 72)Base_Top_or_Both = "Both" unless user needs individual partsDimensional sanity:
Channel-specific requirements:
User communication:
Read these subpages for detailed parameter reference:
| Subpage | Contains | Use For |
|---|---|---|
| ./straight-runs.md | I Channel (straight with cord cutouts) | Linear cable runs, desktop cable management |
| ./corners-junctions.md | L, T, X, Y Channels | Corner turns, multi-path junctions, cable splits |
| ./curves-transitions.md | S, C, Mitre, Height Change Channels | Smooth curves, diagonal transitions, vertical routing |
| ./mounting-accessories.md | Keyholes, Hooks, Item Holders, Connectors | Wall mounting, accessory integration, modular connections |
Official Underware sources:
BOSL2 library:
Related spirograph skills:
Ecosystem integration: