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.
/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: