Interpretive guidance for generating OpenSCAD code for OpenGrid/MultiConnect wall-mounted organizers. Provides pattern selection frameworks, mounting system integration, and dimensional constraints specific to this ecosystem. Use when generating OpenSCAD files for OpenGrid items.
Inherits all available tools
Additional assets for this skill
This skill inherits all available tools. When active, it can use any tool Claude has access to.
common_items/advanced_bin.mdcommon_items/angled_storage.mdcommon_items/angled_storage_row.mdcommon_items/backplate_mount.mdcommon_items/basic_bin.mdcommon_items/curved_hook.mdcommon_items/divided_bin.mdcommon_items/hook_array.mdcommon_items/multi_access_holder.mdcommon_items/open_basket.mdcommon_items/round_item_holder.mdcommon_items/shallow_tray.mdcommon_items/shelf_bracket.mdcommon_items/tool_holder_with_hooks.mdcommon_items/vertical_holder.mdenhancements.mdGenerates OpenSCAD code for wall-mounted storage items compatible with OpenGrid boards (28mm grid) and MultiConnect mounting system.
Official specifications:
multiconnectBack() module (see ./common_items/backplate_mount.md)Pattern references (read as needed):
Grid constraint: All items must align to 28mm grid. This affects:
distanceBetweenSlots=28)MultiConnect mounting system: Items don't attach directly to wall. They:
multiconnectBack(width, height, 28)Critical parameter relationships:
// These are interdependent:
backWidth = internal_width + wall_thickness*2; // Total object width
slotCount = floor(backWidth/28); // Number of connectors
actual_slots = max(1, slotCount); // Minimum 1 slot
Why this matters: User requests "50mm wide bin" but code must account for walls, ensure at least one mounting slot, and ideally align to grid aesthetically.
Use this decision tree to select pattern:
| User wants to store | Primary pattern | Alternative | Read module |
|---|---|---|---|
| Small hardware (screws, bits) | Basic Bin | Shallow Tray (if flat) | basic_bin.md |
| Writing tools (pens, markers) | Vertical Holder | Angled Storage Row (if visibility needed) | vertical_holder.md, angled_storage_row.md |
| Hand tools (screwdrivers, pliers) | Tool Holder with Hooks | Angled Storage Row | tool_holder_with_hooks.md, angled_storage_row.md |
| Bottles, spray cans | Round Item Holder | Advanced Bin (if accessibility needed) | round_item_holder.md, advanced_bin.md |
| Mixed items in sections | Divided Bin | Multiple basic bins | divided_bin.md |
| Light shelving needs | Shelf Bracket | N/A | shelf_bracket.md |
| Easy-access items (cables, tape) | Open Basket | Multi-Access Holder | open_basket.md, multi_access_holder.md |
| Keys, lightweight hangables | Hook Array | Curved Hook (for smooth finish) | hook_array.md, curved_hook.md |
| Phone/charger/electronics | Multi-Access Holder | Advanced Bin | multi_access_holder.md, advanced_bin.md |
| Items needing angled visibility | Angled Storage Row | Basic Bin | angled_storage_row.md |
| Professional-quality bins | Advanced Bin | Basic Bin | advanced_bin.md |
Ask these questions:
Default: When unclear, use Basic Bin - most versatile, user can refine.
QuackWorks patterns provide calibration parameters for perfect fit across different printers:
| Parameter | Range | Default | Purpose |
|---|---|---|---|
| slotTolerance | 0.925-1.075 | 1.00 | Scale slot width (tight/loose fit) |
| dimpleScale | 0.5-1.5 | 1.0 | Scale dimple size (snap strength) |
| slotDepthMicroadjustment | -0.5 to +0.5 | 0 | Fine-tune slot depth |
Calibration Process:
slotTolerance=1.00)dimpleScale for snap strength (v1) or triangle lock (v2)slotDepthMicroadjustment for final fine-tuningWhen to tune:
On-ramps are conical guides that ease mounting of heavy or tall items onto MultiConnect slots:
| Parameter | Default | Purpose |
|---|---|---|
| onRampEnabled | true | Add guide cones to slots |
| On_Ramp_Every_X_Slots | 2 | Frequency (1=every slot, 2=every 2nd slot) |
| onRampHalfOffset | false | Stagger ramps between grid points for better grip |
When to enable:
When to disable:
Visual:
Without ramps: With ramps:
║ ║▲
║ ║ ▲
────╫──── ────╫──▲────
║ ║ ▲
Ramps guide item onto slots, especially helpful when you can't see the back of the item.
QuackWorks supports multiple mounting systems. Choose based on your wall setup:
| Option | Back Thickness | Grid | Use Case |
|---|---|---|---|
| Multiconnect V1 | 6.5mm | 25/28mm | Standard, dimple-based hold |
| Multiconnect V2 | 6.5mm | 25/28mm | Triangle snap, stronger hold |
| Multipoint | 4.8mm | 25mm | Thinner profile, Multiboard system |
| GOEWS | 7mm | Custom | Alternative slot design |
| Command Strip | N/A | N/A | Adhesive mount, rental-friendly |
V2 advantages:
V2 parameter:
multiConnectVersion = "v2"; // or "v1"
slotQuickRelease = false; // Set true to disable triangle locks
When to use V2:
When to use V1:
Always declare these parameters at top of file:
// User-facing dimensions (what they care about)
internal_width = 80; // Interior space for items
internal_depth = 60;
internal_height = 60;
// Structural parameters (print quality)
wall_thickness = 2.5; // 2.5-3mm for PETG/PLA
base_thickness = 2.5;
// Mounting parameters (OpenGrid specific)
distanceBetweenSlots = 28; // ALWAYS 28 for OpenGrid
Why this order: User dimensions first (what they specified), then structural (printer constraints), then ecosystem constants.
Every item needs mounting. Standard integration:
union() {
// Your item (bin, holder, etc.)
basic_bin(); // or other pattern
// MultiConnect backplate
translate([0, 0, 0])
multiconnectBack(
backWidth = internal_width + wall_thickness*2,
backHeight = internal_height + 20, // Extend above for strength
distanceBetweenSlots = 28 // Always 28
);
}
Common mistake: Forgetting to extend backplate above item for structural strength. Backplate should be ~20mm taller than internal_height.
When user says "I need a bin for X":
Estimate internal dimensions for their items:
Calculate total dimensions:
total_width = internal_width + wall_thickness*2;
total_depth = internal_depth + wall_thickness;
total_height = internal_height; // No top wall on bins
Check grid alignment (optional but aesthetic):
Read the module file, don't reinvent. Each pattern has complete module in ./common_items/:
// DON'T write basic_bin() from scratch
// DO read ./common_items/basic_bin.md and use/adapt the module
include <path/to/modules.scad> // If organized
// OR paste module directly (user preference)
basic_bin(); // Call the module
When to adapt vs use as-is:
QuackWorks uses BOSL2 library heavily for advanced geometry. Key patterns:
Instead of manual operations:
// Old way (basic_bin.md)
difference() {
cube([width, depth, height]);
translate([wall, wall, base])
cube([width-wall*2, depth-wall, height]);
}
Use BOSL2:
include <BOSL2/std.scad>
rect_tube(
size = [width, depth],
h = height,
wall = 2,
chamfer = [5, 0, 0, 0], // Front, back, left, right
ichamfer = [2, 0, 0, 0] // Interior chamfers
)
Benefits: Cleaner code, automatic chamfering, consistent wall thickness, better performance.
Creates smooth transitions between shapes:
hull() {
// Item rim (curved holder)
cylinder(d=30, h=10);
// Back anchor (mounting plate)
translate([0, -20, 0])
cube([30, 5, 10]);
}
Generates smooth curve connecting rim to backplate.
Instead of manual chamfers:
offset3d(r = 0.5) // Rounds ALL edges by 0.5mm
cube([100, 50, 60]);
Used in multi_access_holder.md for professional finish.
Use BOSL2 (advanced_bin, multi_access_holder, curved_hook) when:
Use basic patterns (basic_bin, vertical_holder) when:
Installing BOSL2:
// Add to top of file:
include <BOSL2/std.scad>
User must have BOSL2 library installed. Provide link: https://github.com/BelfrySCAD/BOSL2
Only add enhancements if:
Available enhancements (see ./enhancements.md for modules):
Integration pattern:
difference() {
basic_bin(); // Base pattern
// Enhancement as subtraction
translate([...])
label_recess(width=40, height=10);
}
Problem: User requests 40mm wide bin, code generates backWidth=45mm (40 + 2.5×2), results in floor(45/28)=1 slot. Bin is wider than one grid space but only has one connector - looks odd and may be unstable.
Why it fails: Didn't consider aesthetic/structural mismatch between item width and mounting points.
Better approach:
// Either: Adjust dimensions to align to grid
internal_width = 51; // 51 + 5 = 56mm = 2 grid spaces = 2 slots
// Or: Accept 1 slot but mention to user
echo("Note: 45mm width uses 1 mounting slot. For 2 slots, increase width to ~51mm");
Problem: User wants vertical holder for 12mm pens, code uses cylinder(d=12), pens don't fit.
Why it fails: No clearance for print tolerance and item variation.
Better approach:
item_diameter = 12;
clearance = 1; // 0.5mm per side
cylinder(d = item_diameter + clearance, $fn=40);
Problem: Module has magic numbers scattered throughout instead of calculated values.
Why it fails: User can't easily adjust; values get out of sync.
Better approach:
// DON'T:
cube([82.5, 62.5, 60]); // What are these numbers?
// DO:
cube([
internal_width + wall_thickness*2,
internal_depth + wall_thickness,
internal_height
]);
Problem: User wants basic bin, code generates elaborate parametric system with 15 parameters.
Why it fails: User just wanted a bin. Over-engineering delays delivery.
Better approach: Start simple, add complexity only when requested:
// First iteration: Basic bin with hardcoded dimensions
internal_width = 80;
// ...
// Later if user wants variants: Parameterize
module customizable_bin(width=80, depth=60, height=60) { ... }
Problem: User wants angled storage for screwdrivers, code generates basic vertical_holder.
Why it fails: Missed opportunity to suggest better pattern (angled_storage_row provides visibility).
Better approach: Use decision framework, suggest alternatives:
"I'll create an angled_storage_row for your screwdrivers - this tilts them 30° for better visibility.
If you prefer vertical storage (more compact), I can use vertical_holder instead."
Before delivering OpenSCAD code:
Required elements:
multiconnectBack()distanceBetweenSlots = 28 (never other value for OpenGrid)Pattern compliance:
Dimensional sanity:
internal + wall_thickness*2floor(backWidth/28) >= 1Code quality:
$fn specified for cylinders/curves (e.g., $fn=40)User communication:
Pattern modules are organized as:
./common_items/
├── backplate_mount.md - multiconnectBack() module (ALWAYS needed)
├── basic_bin.md - Open-top bin (most common)
├── advanced_bin.md - BOSL2 bin with angled front, chamfers
├── vertical_holder.md - Cylindrical holes for pens/bits/etc.
├── angled_storage_row.md - Tilted multi-item storage for visibility
├── round_item_holder.md - Single round/rectangular item with rim
├── tool_holder_with_hooks.md - Horizontal cantilever hooks
├── curved_hook.md - BOSL2 curved hook with rounded edges
├── divided_bin.md - Bin with internal dividers
├── shallow_tray.md - Low-profile bin variant
├── shelf_bracket.md - Triangular shelf support
├── open_basket.md - Bin without front wall
├── multi_access_holder.md - BOSL2 box with customizable cutouts
├── angled_storage.md - Forward-tilting bin (deprecated, use angled_storage_row)
└── hook_array.md - Simple hook row
./enhancements.md - Optional features (labels, drainage, etc.)
Workflow:
OpenGrid Ecosystem:
QuackWorks Repository (Advanced Patterns):
When generating advanced patterns, fetch current QuackWorks code for latest parameters and features. Patterns evolve with community contributions.
Key QuackWorks files referenced:
MultiConnectRoundSingleHolder.scad → round_item_holder.mdMultiConnectRoundRow.scad → angled_storage_row.mdMultiConnectRoundHook.scad → curved_hook.mdMulticonnectBin.scad → advanced_bin.mdVerticalItemHolder.scad → multi_access_holder.mdRelated skills: