- OpenSCAD 58.3%
- Shell 34.4%
- Python 7.3%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
| .agent-shell/transcripts | ||
| .agents/skills/openscad | ||
| previews | ||
| stl | ||
| AGENTS.md | ||
| cyberdick.scad | ||
| README.md | ||
| render_stl_previews.py | ||
| skills-lock.json | ||
CYBERDICK
A cyberdeck-style 3D-printed clamshell case for the Chuwi MiniBook X N150 (244 x 166.4 x 14 mm). The case is in two independent pieces that wrap the screen lid and the keyboard base separately; the laptop's own factory hinge connects them. The bottom half also stores a flat auxiliary powerbank in a cavity closed by a removable underside hatch so you can hot-swap the powerbank without opening the case.
Parts
| File | Description |
|---|---|
cyberdick.scad |
The parametric OpenSCAD source. Edit this to customise. |
stl/top.stl |
Screen-lid wrap half. |
stl/bottom.stl |
Keyboard-base wrap half with powerbank cavity. |
stl/hatch.stl |
Removable bottom hatch (powerbank door). |
previews/ |
Multi-angle preview PNGs of the assembled model and each part. |
All three STL parts are already exported and ready to send to a printing service. You only need to re-export them if you change a parameter.
How to preview the model on your machine
You can open, view, and customise the model without any printing hardware.
1. Install OpenSCAD (free)
- Windows / macOS: Download from https://www.openscad.org/downloads.html and install.
- Linux: Use your package manager, e.g.
sudo apt install openscadorsudo dnf install openscad. A version with GUI is required for previewing.
2. Open the model
- Launch OpenSCAD.
- File > Open File... and select
cyberdick.scad. - The source code appears on the left. The 3D viewport is initially empty.
3. Render and view
- Press F5 (Preview) for a quick rough render. This is fast and good enough to see the overall shape. You can orbit/pan/zoom with the mouse.
- Press F6 (Render) for a full high-quality CGAL render. Slower, but needed if you want to export an STL or see exact geometry.
- Use the viewport toolbar (or View menu) to switch to Top/Front/Right/etc. orthographic views.
4. Customise parameters (optional)
- Open Window > Customizer (a panel appears on the right).
- All parameters are grouped and editable. Sliders and dropdowns are
generated from the
// [min:step:max]comment annotations. - Change a value, press F5 to preview, and iterate.
- See the Parameters section below for what each one does.
5. View the pre-rendered PNG previews
If you just want to look at the model without opening OpenSCAD, open any PNG
in the previews/ directory. Each subdirectory contains 7 views (iso,
front, back, left, right, top, bottom) of one part:
previews/
cyberdick_full_*.png # all three parts side-by-side
top/cy_top_*.png # screen-lid wrap only
bottom/cy_bot_*.png # keyboard-base + powerbank half only
hatch/cy_hatch_*.png # removable hatch only
How to export STLs (after customising)
If you changed parameters, re-export each part individually so you get three clean STL files (one per part):
Option A: from the OpenSCAD GUI
- In the Customizer or source, set
render_top = true,render_bottom = false,render_hatch = false. - Press F6 (full render).
- File > Export > Export as STL... and save as
top.stl. - Repeat for
bottom(render_bottom = true, othersfalse) andhatch.
Option B: from the command line
openscad -D render_top=true -D render_bottom=false -D render_hatch=false \
-o stl/top.stl cyberdick.scad
openscad -D render_top=false -D render_bottom=true -D render_hatch=false \
-o stl/bottom.stl cyberdick.scad
openscad -D render_top=false -D render_bottom=false -D render_hatch=true \
-o stl/hatch.stl cyberdick.scad
Each STL is automatically made manifold (watertight) by OpenSCAD.
Printing recommendations (for a commercial printing service)
This project is designed to print without supports on an FDM printer. If your printing service asks for orientation advice, give them the following. If you are unsure, send them the three STL files and ask them to orient for minimal supports on PLA/PETG; the parts are simple enough that most services will handle it without intervention.
Material
| Material | Recommended? | Notes |
|---|---|---|
| PETG | Best | Tough, slightly flexy (good for snap-fit hatch), heat-resistant. |
| PLA | Good | Easiest to print; stiffer (hatch friction-fit may need hatch_clear increase). |
| ABS/ASA | OK | Stronger but warps; only if the service is experienced. |
| Resin | Not recommended | Too brittle for the snap-fit hatch. |
Slicing settings (guidelines)
- Layer height: 0.2 mm (good balance of speed and detail).
- Infill: 20-30% gyroid. The walls are structural; infill mostly fills the floor/ceiling.
- Perimeters (walls): 3 minimum (the shell is the strength).
- Top/bottom solid layers: 4 (so port windows and hatch rebate have clean surfaces).
- Supports: Not required for any of the three parts if oriented as below. If your printer's bridging is poor, enable supports only for the hatch lip overhang (
lip_thickis 1.5 mm, so most printers bridge this cleanly).
Print orientation (important)
| Part | Orientation | Why |
|---|---|---|
top.stl |
Flat on its back-of-screen face (+Z down) | The cavity opens upward; no overhangs. |
bottom.stl |
Flat on its bottom face (hatch side down) | The two internal cavities (powerbank + keyboard) open upward; no supports needed. |
hatch.stl |
Flat on its lip face (lip down) | Already exported flipped so the lip is on the bottom; prints as a flat slab with a small lip step. |
Print size check
Make sure the service's build volume can fit the longest dimension:
| Part | X x Y x Z (mm) when oriented for printing |
|---|---|
| top | ~250 x 170 x 8 |
| bottom | ~250 x 170 x 46.4 |
| hatch | ~158 x 79 x 2.5 |
All three fit any printer with a 250 mm x 210 mm bed (a very common size).
If your service's bed is smaller than 250 mm, reduce laptop_w (impossible
without redesigning for a different laptop) or ask for a printer with a
larger bed.
Estimated material volume and weight
The shell is a true thin-walled (2.5 mm walls) hollow design with internal ribs bracing the powerbank chamber. Internal air pockets keep the weight down while preserving the chunky cyberdeck exterior.
| Part | Volume | PLA weight | PETG weight |
|---|---|---|---|
top.stl |
106 cm³ | 131 g | 135 g |
bottom.stl |
335 cm³ | 415 g | 425 g |
hatch.stl |
30 cm³ | 37 g | 37 g |
| TOTAL | 470 cm³ | 583 g | 597 g |
Cost at German 3D-printing services (local fallback)
Material volumes above are model material only. The German services below publish flat per-gram rates (researched July 2026). These are your local fallback if global marketplaces come back higher — they ship fast but cost more.
| Service | PLA rate | PETG rate | All-PLA cost | All-PETG cost |
|---|---|---|---|---|
| 3DZelle Dortmund (3dzelle.de) — free shipping > 99 € | ab 0.25 €/g | ab 0.35 €/g | ~146 € | ~209 € |
| LAMREN 3D (lr3d.de) — same rate any material | 0.28 €/g | 0.28 €/g | ~163 € | ~167 € |
| 3D-Print Design (3d-printdesign.de) | varies | varies | quote online | quote online |
For cheaper global and Chinese options (often €60-110 € shipped, lead time 3-30 days), see the "Getting it printed" section below.
Getting it printed — global service comparison & quote checklist
~130 € is the floor at German per-gram rates, but several global and Chinese services can land below that. All services below were researched in July 2026 and return quotes via STL upload (none publish a flat per-gram rate). Ranked by expected total cost for all three parts in PETG (~597 g).
| # | Service | Origin | Expected total (incl. shipping+EU VAT) | Shipping time | PETG? | Notes |
|---|---|---|---|---|---|---|
| 1 | Craftcloud3D (craftcloud3d.com/upload) | EU (Munich, All3DP GmbH) | ~80-150 € | 3-7 days | Yes | Aggregates ~10 print partners across Europe (incl. cheaper Eastern-EU). Quote includes shipping + customs. No minimum order. Start here. |
| 2 | Hubs / Protolabs Network (hubs.com/manufacture) | EU (Protolabs Europe B.V.) | ~80-150 € | from 2 business days | Yes | Quote includes shipping + customs. 500×500×500 mm FDM build volume. Backup if Craftcloud3D is pricier. |
| 3 | PCBWay (pcbway.com) | China | ~60-110 € (after VAT + handling) | 3-7 days DHL or 15-30 days ePacket | Yes | $5 new-customer coupon. EU VAT collected on delivery by carrier (~19% + €12 handling fee). Slowest option is the only one likely to beat €80. |
| 4 | 3DZelle Dortmund (DE) | Germany | ~209 € (fixed, 0.35 €/g PETG) | 2-4 days | Yes | Cheapest local German option with published rate. Fallback if marketplaces come back higher than expected. |
| 5 | LAMREN 3D (DE) | Germany | ~167 € (fixed, 0.28 €/g, any material) | 3-5 days | Yes | One flat rate for any material. Cheaper PETG than 3DZelle. |
| 6 | 3D-Print Design (DE) | Germany | quote-only | 3-7 days | Yes | Online calculator. |
Excluded services (researched July 2026, don't waste time on these)
| Service | Why excluded |
|---|---|
| JLCPCB / JLC3DP (jlc3dp.com) | FDM line has no PETG — only PLA, ABS, ASA, PA12-CF, TPU, ABS-ESD, PEEK. The snap-fit hatch cannot work in these stiff materials. PLA-only would be viable but you wanted PETG. |
| Shapeways (shapeways.com) | Relaunched under Manuevo BV (Netherlands), but $300 minimum order per color on FDM PETG. 3× our budget; disqualified. |
| Xometry Europe (xometry.eu) | Live and Germany-based, but bot-blocks all scraping. Quote-only. Worth a quote if you want a third EU marketplace alongside Craftcloud3D/Hubs. |
Import tax note (applies to Chinese and other non-EU shipments)
- Orders below €150 value: no customs duty, but 19% Einfuhrumsatzsteuer (VAT) is collected on delivery, plus a ~€12 carrier handling fee.
- Orders above €150: add ~3.7-6.5% customs duty on top of VAT + fee.
- EU-based services (Craftcloud3D, Hubs, 3DZelle, LAMREN) include VAT in their quoted prices — the number you see is the number you pay. PCBWay and JLC3DP do not include EU VAT; the carrier collects it at the door.
- Example: a "€60 + €20 shipping" PCBWay quote lands at your door at
€80 + €15 VAT + €12 handling = **€107 effective**. Still cheaper than Germany, but budget for the surcharge.
Quote-checklist (for each of the three recommended services)
-
Upload the three STL files separately (each part as its own line-item):
stl/top.stl (~135 g PETG) stl/bottom.stl (~425 g PETG) stl/hatch.stl (~37 g PETG) -
In each configurator choose:
- Process: FDM (Fused Deposition Modeling)
- Material: PETG
- Color: any (no impact on price)
- Infill: 20% gyroid
- Layer height: 0.2 mm
- Perimeters: 3 minimum
- Print orientation: see "Print orientation" table above
-
Pay attention to:
- Is shipping included? (Craftcloud3D and Hubs: yes. PCBWay: added at checkout.)
- Are VAT/customs included? (Craftcloud3D and Hubs: yes. PCBWay: EU VAT collected on delivery.)
- Each quote's lead time.
-
Record the three per-part quotes for comparison. Both marketplaces (Craftcloud3D and Hubs) often surface bids from Eastern-European print partners that don't publish rates anywhere online — that's the cheapest route without you having to find and contact those shops directly.
Why we did the quote comparison this way
Most 3D-printing services don't publish a flat per-gram rate because the real price depends on the specific geometry (bounding box, wall thickness, supports needed, machine hours). The quoted price is the only reliable way to compare. This is why all three recommended options return quotes via STL upload — there is no published "menu price" to paste in here.
If the quotes still come back higher than you want
- Drop the ribs: set
rib_count_x = 0andrib_count_y = 0in the OpenSCAD Customizer and re-export. Saves ~50 g (~10-15 €). Walls become slightly "drummier" but self-supporting. - Order PLA-only: PLA is usually 30-40% cheaper than PETG. PLA is stiffer (hatch friction-fit may need
hatch_clearincreased to 0.35). Only viable on services that don't include PETG-FDM in the first place — tracked above in the "Excluded services" table. - Print at home if you have access to an FDM printer: a 1 kg spool of PETG is ~20 € and covers all three parts (~600 g). Most of a commercial service's price is labour and machine setup, not filament.
Assembly
- Top half: Slide the screen lid into the top wrap from the hinge edge (+Y). The screen-glass face stays exposed on the bottom (-Z).
- Bottom half: Slide the keyboard base into the bottom wrap from the
hinge edge (+Y). The keyboard/trackpad face stays exposed on the top
(+Z). Side port windows should line up with the laptop's ports:
- Right edge (60 mm window after 10 mm): power LED, USB-C, USB-C, power button, running LED.
- Left edge (90 mm window after 10 mm): audio jack + heat exhaust.
- Powerbank: Turn the laptop over. Pry the hatch out using the finger-pull notch on the front edge. Insert your powerbank (up to 152 x 73 x 32 mm) into the cavity. Route a USB-C cable through the built-in passthrough hole in the divider wall to connect the powerbank to the laptop. Press the hatch back into place; the lip clicks into the rebate and holds it.
- Hinge: The two case halves stay separate. Open the laptop's lid, and the two brick-like halves pivot on the laptop's own hinge.
Fit issues after printing
- Laptop too tight: increase
tolerancefrom 0.3 to 0.4 or 0.5 and re-export. - Laptop too loose: decrease
toleranceto 0.2. - Hatch too tight / won't go in: increase
hatch_clearfrom 0.25 to 0.35. - Hatch falls out: decrease
hatch_clearto 0.15, or increaselip_overlapto 3. - Powerbank too big: increase
pb_max_w,pb_max_d, orpb_max_tand re-export.
Parameters
All parameters are in the top section of cyberdick.scad and editable
through the OpenSCAD Customizer panel.
Device dimensions
| Parameter | Default | Range | Description |
|---|---|---|---|
laptop_w |
244 | [200:300] | Laptop width (X) in mm |
laptop_d |
166.4 | [150:200] | Laptop depth (Y) in mm |
screen_t |
5 | [3:10] | Screen lid thickness in mm |
base_t |
9 | [5:15] | Keyboard base thickness in mm |
hinge_gap |
1 | [0:3] | Air gap between closed lid and base in mm |
Powerbank cavity
The cavity fits any powerbank up to the three values below. The defaults match the user's 147.6 x 69 x 30 mm powerbank with ~5 mm slack. To fit a larger powerbank, increase these values and re-export STLs.
| Parameter | Default | Range | Description |
|---|---|---|---|
pb_max_w |
152 | [100:200] | Max powerbank length (X) in mm |
pb_max_d |
73 | [60:120] | Max powerbank depth (Y) in mm |
pb_max_t |
32 | [20:45] | Max powerbank thickness (Z) in mm |
Case shell
| Parameter | Default | Range | Description |
|---|---|---|---|
wall |
2.5 | [1.5:0.5:5] | Outer wall thickness in mm |
div_wall |
2 | [1:0.5:4] | Divider wall between base and powerbank |
tolerance |
0.3 | [0.1:0.1:1] | Fit clearance around laptop halves |
corner_r |
3 | [0:8] | Corner rounding radius |
Internal ribs (strength, light-weighting)
The volume around the powerbank chamber is hollow (air pockets), not solid. Internal ribs (vertical struts between the bottom wall and the divider) keep the thin walls rigid. Set to 0 for the cheapest print (drummier shell).
| Parameter | Default | Range | Description |
|---|---|---|---|
rib_thick |
2 | [1:0.5:4] | Rib wall thickness in mm |
rib_count_x |
1 | [0:8] | Ribs per side (left and right of chamber) |
rib_count_y |
1 | [0:8] | Ribs front+back of chamber |
Removable hatch
| Parameter | Default | Range | Description |
|---|---|---|---|
hatch_clear |
0.25 | [0.1:0.1:0.6] | Per-side clearance for hatch |
lip_overlap |
2.5 | [1.5:0.5:5] | Lip overlap that retains hatch |
lip_thick |
1.5 | [1:0.25:3] | Thickness of the retaining lip |
finger_r |
7 | [4:12] | Finger-pull notch radius |
Side port windows
| Parameter | Default | Range | Description |
|---|---|---|---|
port_clear |
10 | [0:30] | Clearance from front corner before ports |
rport_len |
60 | [20:150] | Right-side port window length (Y) in mm |
lport_len |
90 | [20:150] | Left-side port window length (Y) in mm |
Power cable passthrough
| Parameter | Default | Range | Description |
|---|---|---|---|
cable_r |
4 | [2:0.5:8] | Cable hole radius in mm |
cable_x_off |
60 | [-80:80] | X offset of cable hole from centre |
Cyberdeck aesthetic
| Parameter | Default | Range | Description |
|---|---|---|---|
bolt_r |
5 | [3:8] | Decorative bolt recess radius |
bolt_depth |
2.5 | [1:4] | Bolt recess depth |
bolt_sides |
6 | [4:1:8] | Bolt recess polygon (6 = hex) |
vent_count |
6 | [0:14] | Number of vent slats |
vent_w |
2 | [1:0.5:4] | Vent slat width |
vent_gap |
3 | [1:0.5:6] | Spacing between vent slats |
vent_indent |
5 | [0:15] | Inset of vent grid from edges |
Render control
| Parameter | Default | Description |
|---|---|---|
render_top |
true | Render the screen-lid wrap half |
render_bottom |
true | Render the keyboard-base + powerbank half |
render_hatch |
true | Render the removable hatch |
explode |
true | Place hatch flipped-and-lowered for print preview |
Verification
The model has been programmatically verified before export:
- All three STLs are watertight (manifold) — confirmed with trimesh for every part. No non-manifold warnings during CGAL export.
- The keyboard cavity, powerbank cavity, hatch opening, and both side port windows are confirmed hollow at the expected coordinates.
- The divider wall between powerbank and keyboard cavities is confirmed solid at the expected coordinates.
- The 2.5 mm outer walls (front, back, left, right, bottom) are all confirmed solid; the internal air pockets around the powerbank chamber are confirmed hollow.
- Outer dimensions of all three parts match the calculated values to within 0.1 mm.
- The internal rib layout was tested at 0, 1, 2, 3 ribs per side — all remain watertight regardless of rib count.
- Total material volume is 470 cm³ (~600 g PETG), a 65 % reduction from the previous solid-block design (1359 cm³, ~1700 g PETG).
Project layout
cyberdick/
├── cyberdick.scad # parametric source (edit this)
├── render_stl_previews.py # preview rendering helper (no OpenGL needed)
├── README.md # this file
├── stl/
│ ├── top.stl # screen-lid wrap (ready to print)
│ ├── bottom.stl # keyboard-base + powerbank half (ready to print)
│ └── hatch.stl # removable powerbank door (ready to print)
└── previews/
├── cyberdick_full_*.png # all parts side-by-side, 7 angles
├── top/ # top half alone, 7 angles
├── bottom/ # bottom half alone, 7 angles
└── hatch/ # hatch alone, 7 angles