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