From b33fd8eef79785620ca7566c596a88493b1ee33d Mon Sep 17 00:00:00 2001 From: Patternflow Bot Date: Fri, 9 Oct 2026 20:48:07 +0900 Subject: [PATCH 1/3] =?UTF-8?q?[DONE]=20web:=20the=20build=20page's=203D?= =?UTF-8?q?=20preview=20becomes=20the=20case=20you=20pick=20=E2=80=94=20of?= =?UTF-8?q?ficial=20v3.9,=20Besoiobiy,=20SimonePDA=20(#3)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * hardware: Besoiobiy's printed case as a remix folder hardware/case/remixes/besoiobiy-printed/ holds the printed case Besoiobiy shared on the Discord: their Bambu Studio project, the Blender scene (the same LFS object, moved), the scene STL as exported, one STL per part cut from it, their eight figures and a photo, and a README that carries the author, the CC BY-SA 4.0 license and the build notes. The assembly map gets a row for it. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01AqMhYfHm6xUykCapCcDwzt * hardware: correct the Besoiobiy remix README after review The photo shows the power cable leaving through the side-wall opening, so the two openings were paired with the wrong orientations. The frame covers close the back of the panel, so the assembly now wires the panel before they go on and leaves the box open until the section 9 checks. Check your panel first gains the thread size (M3, where the BOM panel takes M4), the bolt reach and the real slot tolerance. Smaller fixes: the covers are counterbored, not countersunk; the knob bore is a D; the scene STL is pulled apart, not assembled; the bridge is about 48 x 5 mm; the .blend opens from Blender 4.5 on; the power bank bay is sized; the back render is shown. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01AqMhYfHm6xUykCapCcDwzt * docs: point build guide section 4 at Besoiobiy's printed case Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01AqMhYfHm6xUykCapCcDwzt * hardware: second review pass on the Besoiobiy remix README The panel the build guide links is not on this case's bolt pattern (its side rows sit 137.4 mm apart in the official case, 139 mm here), so opening the cover holes for M4 is not enough: say the case is for an M3 panel on Besoiobiy's pattern. Flash the DevKit off the board before it is seated and powered, as section 8 does. Give the power-bank bay as an empty bay that also has to hold the J4 plug, make the J4 cable's route consistent with where the bank sits, set the inserts before anything goes in, and say sections 7 to 9 change order. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01AqMhYfHm6xUykCapCcDwzt * hardware: match the Besoiobiy remix README to upstream main Upstream took this folder as one maintainer commit, and its README adds the panel link to the Fits line. Taking that copy keeps the two trees byte-identical, so a later sync of dev with upstream has nothing to merge. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_019bRDk1Qd2Jgev46CPBkFLw * web: the Build panel switches between the official case and the two community remixes The case is now a choice on /build: the official printed case, Besoiobiy's printed remix and Simone Majocchi's laser-cut remix, as three tabs over one card. Each card shows the author, material, the boards and panel it fits, what it takes to make, what it needs beyond the BOM, when it was verified, the license, two photos (all of them in the viewer) and the GitHub folder and files. A remix says what to check on your own panel first. Step 01 and the case row under Start here follow the switch, and /build?case= opens the panel on that case. The card data lives in build-cases-data.ts, copied from each README; its test checks every GitHub link against this tree, every photo against public/cases/, and each remix card against its README header. Brought up to date with BUILD_GUIDE.md and the remix READMEs: - content/build.md lost the build matrix nothing rendered any more ("Preparing: Laser cut"), and its body is now the case switch's lead. - Facts: ESP32-S3 ~$13 and ~10 h of printing, as the guide says. - Steps: the v3.9 board; power through the screw terminal. - Start here: panel compatibility before buying; the breadboard and v2 guides linked directly; laser cut is no longer an "other route". - /build metadata and llms.txt name the printed or laser-cut case. - /build/breadboard: ~10 h and section 4 (not v2's ~11 h and 2 & 3), the left USB-C port and the Pattern tab for flashing, the 8.2 anchor. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_019bRDk1Qd2Jgev46CPBkFLw * docs: the v2 guide and the assembly map name the v3.9 board, and laser cut is no longer in preparation Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_019bRDk1Qd2Jgev46CPBkFLw * web: draft screenshots of the Build panel's case switch, for PR #2 Desktop (1440 × 900) and phone (390 × 844 @2x) on each of the three cases, and the panel as it was on dev. Evidence for the pull request only; not part of the site. Remove before merging. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_019bRDk1Qd2Jgev46CPBkFLw * web: the case cards after review — what to cut, what to measure, and a viewer that survives a switch - Laser cut: the drawing is three pages to cut (the plate, the border strips, the box and feet), not one sheet; the card, step 01 and the lead in build.md said one. - Besoiobiy: 14.35 mm is where the sockets end behind the LED face, not how deep they are; the card now says what to measure, and the 8.5 mm of thread the bolts need. - Official: the adjustable for_other_panels/ version is not universal, so this card gets its own check. Every check links to the README section that says how. - The printed-parts photo is before gluing; its alt text said glued. - Switching case with the photo viewer open no longer crashes the page: the viewer belongs to the case it was opened on. - The method line on the unselected tabs reads at full muted ink (it was 3.7:1); the tab names share a top line on a phone; the kicker and the card heading wrap evenly; the README caption baked into the exploded renders is painted out of the web copies. - Tests pin the Start here row's href, replaceState over pushState, the keys being consumed, the tabpanel's name, a card photo opening the viewer on itself, the crash above, the #anchors, and read build.md by path so the suite runs from the repo root too. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_019bRDk1Qd2Jgev46CPBkFLw * web: Web CI also runs on hardware/case/, which the case cards' test reads build-cases-data.test.ts checks every link on the /build case cards against hardware/case/ and each remix card against its README. A change there alone used to skip Web CI and leave the check for the next web PR. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_019bRDk1Qd2Jgev46CPBkFLw * docs: web/public/cases/ is CC BY-SA, and the README no longer calls laser cut in progress The case photos on /build are copies of the remix authors' and the build guide's CC BY-SA images; the license summary now says so, as it does for web/public/builds/. The README's one line on the enclosure names the two community remixes, and keeps stainless steel as the variant in progress. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_019bRDk1Qd2Jgev46CPBkFLw * web: final screenshots of the Build panel's case switch, for PR #2 After review: desktop (1440 × 900) and phone (390 × 844 @2x) on each of the three cases, the whole panel, and the panel as it was on dev. Evidence for the pull request only; removed again in the next commit. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_019bRDk1Qd2Jgev46CPBkFLw * web: drop the PR #2 screenshots from the tree again They stay readable at 7ccb7ba, which the pull request links. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_019bRDk1Qd2Jgev46CPBkFLw * web: the remix screenshots for PR #2 again, under neutral names The same eight images as at 7ccb7ba, byte for byte, so the pull request body can show them: its image addresses with the original names did not survive being saved. Evidence only; removed again in the next commit. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_019bRDk1Qd2Jgev46CPBkFLw * web: drop the PR #2 screenshots from the tree again They stay readable at 6ffc70d and 7ccb7ba, which the pull request links. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_019bRDk1Qd2Jgev46CPBkFLw * web: the preview's case models start with the official v3.9 one, built by tools/case-models tools/case-models puts each case's model together from files in the repo: the official case is the guide's case-v39.glb with the LED panel, the v3.9 board and the DevKit in it, simplified and Draco-compressed (313 KB, where the landing model was 1.15 MB). The store gains the case the Build panel's switch is on, and caseModels.ts the node contract the preview will read. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01P2Ta77EYfNvbYmQ64Z8JFn * tools: build.sh remakes every case model, and the panel can prefetch one Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01P2Ta77EYfNvbYmQ64Z8JFn * tools: the LED panel keeps its UVs through the case-model pipeline prune() drops a UV set no texture uses, and the LED panel's UVs are what the pattern shaders draw with. Keep them, re-extract the panel, rebuild the official model (316 KB). Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01P2Ta77EYfNvbYmQ64Z8JFn * tools: the official model's LED panel keeps its source transform exactly Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01P2Ta77EYfNvbYmQ64Z8JFn * tools: SimonePDA's laser-cut case as a 3D model, stood up from its drawing simonepda.py reads the cut paths of lasercut_layout.pdf (the sheet comes out 256.00 x 340.00 mm, the scale check) and extrudes every part as drawn: the plate with its holes, windows and slots, the four border strips on edge round the panel, the finger-jointed box over the board, three open-cube feet. 331 KB assembled. The box stays acrylic in the MDF finish: assemble.mjs now merges materials only when their names match too. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01P2Ta77EYfNvbYmQ64Z8JFn * web: the Build panel's case switch drives the shared store, and a remix card leads with its README The picked case lives in useAppStore, so the 3D preview can follow it; ?case= still opens the panel on a case and picking still rewrites the URL on /build. Hovering or focusing a tab starts loading that case's model. Each remix card now opens with a link to its README on GitHub; the card text, checked claim by claim against the README, stays, with four claims brought back in line. The line saying the 3D model is the official case is gone. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01P2Ta77EYfNvbYmQ64Z8JFn * tools: Besoiobiy's printed case as a 3D model, put together from its own STL besoiobiy.py finds the nine parts in source/patternbox.stl by matching each stl/ file on what a move cannot change, assembles them with translations worked out from the faces that meet, and stops unless the result is what the remix README measures: 267 x 329 x 30.85 mm, the 161 x 321 mm opening, the four encoder holes, no two parts overlapping. 345 KB assembled. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01P2Ta77EYfNvbYmQ64Z8JFn * web: the guide takes its LED panel from the official case model, and the docs name tools/case-models The guide only ever used the old landing model's LED panel node; the official case model carries the same node (same transform, geometry and UVs, checked vertex by vertex), so the guide and the landing preview share one 0.32 MB file again instead of the 1.15 MB one. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01P2Ta77EYfNvbYmQ64Z8JFn * web: a test holds each case model to the node contract and its download budget Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01P2Ta77EYfNvbYmQ64Z8JFn * web: the product preview shows the case picked on the Build panel (first pass) HeroScene loads the picked case's model (the official one with the page, a remix when it is picked, keeping the current one on screen until it is in), finds its parts by the node contract and runs the four build steps on any of them; a case with more than one finish gets a switch in the viewer. The old v3.0 landing model, 3dforweb.glb, is no longer used anywhere and goes. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01P2Ta77EYfNvbYmQ64Z8JFn * tools: the case-models README covers all three scripts; the changelog covers the whole change SimonePDA's knobs come off the front as far as on the other two cases: further, they crossed in front of the panel in the three-quarter view. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01P2Ta77EYfNvbYmQ64Z8JFn * web: review fixes for the case-switch preview - Each knob greys on its own while held: the files' four knobs share one material, so the preview gives each its own copy (a test holds it). - A model that failed to load is let go of in drei's cache and tried again when its case is picked; if the official model fails, the preview says so instead of leaving a remix up under the Official tab. - The hand cursor shows over a knob however the pointer gets there. - Picking a case rewrites ?case= in place, and is no longer counted as a page view; Home or End on a tab that is already picked sends nothing. - The landing panels not on screen are inert, so the keyboard cannot reach the case switch from the Pattern tab. - Besoiobiy's knob caps stand where the shaft bottoms out in their bore (3.7 mm off the front), not at the official knobs' 0.8 mm. - The case-model scripts need Python 3.12; extract_led.mjs resolves its default path properly; docs say what is shared and where photos come from. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01P2Ta77EYfNvbYmQ64Z8JFn * web: screenshots of the case-switch preview, for PR #3 Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01P2Ta77EYfNvbYmQ64Z8JFn * web: drop the PR #3 screenshots from the tree again They stay reachable at f903845, where the PR body links them. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01P2Ta77EYfNvbYmQ64Z8JFn * web: detail-review comparison images for PR #3 Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01P2Ta77EYfNvbYmQ64Z8JFn * web: drop the detail-review images from the tree again They stay reachable at c8a42a1, where the PR body links them. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01P2Ta77EYfNvbYmQ64Z8JFn --------- Co-authored-by: Claude --- .github/workflows/web-ci.yml | 6 +- AGENTS.md | 2 +- BUILD_GUIDE.md | 2 + BUILD_GUIDE_v2.md | 4 +- CHANGELOG.md | 12 + README.md | 2 +- docs/LICENSE-SUMMARY.md | 1 + docs/REPOSITORY.md | 2 +- docs/assembly/README.md | 3 +- hardware/case/remixes/README.md | 2 + .../case/remixes/besoiobiy-printed/README.md | 211 +++++ .../images/fig1_corner_bulge.png | Bin 0 -> 32837 bytes .../images/fig2_panel_gap.png | Bin 0 -> 38186 bytes .../images/fig3_variants.png | Bin 0 -> 167694 bytes .../besoiobiy-printed/images/fig4_grooves.png | Bin 0 -> 107509 bytes .../images/fig5_glue_order.png | Bin 0 -> 241993 bytes .../images/fig6_inserts_and_screws.png | Bin 0 -> 146354 bytes .../images/fig7_panel_bolts.png | Bin 0 -> 86247 bytes .../images/fig8_ribbon_connector.png | Bin 0 -> 124637 bytes .../besoiobiy-printed/images/photo_built.jpg | Bin 0 -> 508396 bytes .../images/render_exploded_back.png | Bin 0 -> 210172 bytes .../images/render_exploded_front.png | Bin 0 -> 264534 bytes .../besoiobiy-printed/images/render_parts.png | Bin 0 -> 413908 bytes .../besoiobiy-printed/print_layout.3mf | Bin 0 -> 221328 bytes .../besoiobiy-printed/source/patternbox.blend | 3 + .../besoiobiy-printed/source/patternbox.stl | Bin 0 -> 2107284 bytes .../besoiobiy-printed/stl/box_bottom.stl | Bin 0 -> 162084 bytes .../stl/box_bottom_no_bridge.stl | Bin 0 -> 160984 bytes .../stl/box_bottom_plain.stl | Bin 0 -> 67584 bytes .../remixes/besoiobiy-printed/stl/box_top.stl | Bin 0 -> 178684 bytes .../stl/box_top_no_bridge.stl | Bin 0 -> 177784 bytes .../besoiobiy-printed/stl/box_top_plain.stl | Bin 0 -> 83584 bytes .../stl/cover_box_bottom.stl | Bin 0 -> 52784 bytes .../besoiobiy-printed/stl/cover_box_top.stl | Bin 0 -> 52684 bytes .../stl/cover_frame_bottom.stl | Bin 0 -> 88384 bytes .../besoiobiy-printed/stl/cover_frame_top.stl | Bin 0 -> 88284 bytes .../besoiobiy-printed/stl/frame_bottom.stl | Bin 0 -> 87084 bytes .../besoiobiy-printed/stl/frame_top.stl | Bin 0 -> 92784 bytes .../besoiobiy-printed/stl/knob_cap.stl | Bin 0 -> 76484 bytes tools/README.md | 1 + tools/case-models/.gitignore | 2 + tools/case-models/README.md | 120 +++ tools/case-models/assemble.mjs | 195 +++++ tools/case-models/besoiobiy.py | 550 ++++++++++++ tools/case-models/build.sh | 40 + tools/case-models/extract_led.mjs | 39 + tools/case-models/lib/frame.mjs | 59 ++ tools/case-models/lib/io.mjs | 48 + tools/case-models/lib/looks.mjs | 50 ++ tools/case-models/package-lock.json | 747 ++++++++++++++++ tools/case-models/package.json | 20 + tools/case-models/preview.mjs | 131 +++ tools/case-models/requirements.txt | 10 + tools/case-models/simonepda.py | 554 ++++++++++++ tools/case-models/source/led_panel.glb | Bin 0 -> 10864 bytes web/ARCHITECTURE.md | 7 +- web/README.md | 2 +- web/content/build.md | 20 +- web/public/3dforweb.glb | Bin 1154992 -> 0 bytes web/public/cases/besoiobiy-printed/built.jpg | Bin 0 -> 156836 bytes .../cases/besoiobiy-printed/exploded_back.jpg | Bin 0 -> 67592 bytes .../besoiobiy-printed/exploded_front.jpg | Bin 0 -> 81648 bytes web/public/cases/besoiobiy-printed/model.glb | Bin 0 -> 344752 bytes web/public/cases/besoiobiy-printed/parts.jpg | Bin 0 -> 120923 bytes web/public/cases/official/close_back.jpg | Bin 0 -> 116619 bytes web/public/cases/official/model.glb | Bin 0 -> 316368 bytes web/public/cases/official/printed_parts.jpg | Bin 0 -> 65560 bytes web/public/cases/official/printing.jpg | Bin 0 -> 109014 bytes .../simonepda-lasercut/acrylic_front.jpg | Bin 0 -> 293208 bytes .../cases/simonepda-lasercut/board_in_box.jpg | Bin 0 -> 128199 bytes .../cases/simonepda-lasercut/mdf_back.jpg | Bin 0 -> 182296 bytes .../cases/simonepda-lasercut/mdf_front.jpg | Bin 0 -> 223971 bytes web/public/cases/simonepda-lasercut/model.glb | Bin 0 -> 330940 bytes web/public/llms.txt | 4 +- web/src/app/build/breadboard/page.tsx | 10 +- web/src/app/build/page.tsx | 4 +- .../components/3d/CaseFinishSwitch.module.css | 66 ++ web/src/components/3d/CaseFinishSwitch.tsx | 36 + web/src/components/3d/HeroScene.module.css | 34 + web/src/components/3d/HeroScene.tsx | 826 ++++++++++-------- web/src/components/3d/caseModels.test.ts | 119 +++ web/src/components/3d/caseModels.ts | 74 ++ .../components/3d/cases/besoiobiy-printed.ts | 36 + web/src/components/3d/cases/official.ts | 27 + .../components/3d/cases/simonepda-lasercut.ts | 54 ++ web/src/components/3d/heroCase.test.ts | 172 ++++ web/src/components/3d/heroCase.ts | 339 +++++++ web/src/components/3d/preloadCaseModel.ts | 13 + web/src/components/guide/stage/Device.tsx | 13 +- .../guide/stage/build/BuildStage.tsx | 4 +- .../components/guide/stage/build/layout.ts | 2 +- web/src/components/guide/stage/build/props.ts | 2 +- web/src/components/guide/stage/geometry.ts | 14 +- .../components/guide/stage/look/ledPanel.ts | 2 +- web/src/components/guide/stage/parts.ts | 12 +- .../components/sections/BuildPanel.test.tsx | 368 ++++++++ web/src/components/sections/BuildPanel.tsx | 145 ++- .../components/sections/CasePicker.module.css | 421 +++++++++ web/src/components/sections/CasePicker.tsx | 254 ++++++ web/src/components/sections/RightPanel.tsx | 12 +- .../sections/build-cases-data.test.ts | 168 ++++ .../components/sections/build-cases-data.ts | 300 +++++++ web/src/providers/PostHogProvider.tsx | 7 +- web/src/store/useAppStore.ts | 16 + 104 files changed, 5937 insertions(+), 462 deletions(-) create mode 100644 hardware/case/remixes/besoiobiy-printed/README.md create mode 100644 hardware/case/remixes/besoiobiy-printed/images/fig1_corner_bulge.png create mode 100644 hardware/case/remixes/besoiobiy-printed/images/fig2_panel_gap.png create mode 100644 hardware/case/remixes/besoiobiy-printed/images/fig3_variants.png create mode 100644 hardware/case/remixes/besoiobiy-printed/images/fig4_grooves.png create mode 100644 hardware/case/remixes/besoiobiy-printed/images/fig5_glue_order.png create mode 100644 hardware/case/remixes/besoiobiy-printed/images/fig6_inserts_and_screws.png create mode 100644 hardware/case/remixes/besoiobiy-printed/images/fig7_panel_bolts.png create mode 100644 hardware/case/remixes/besoiobiy-printed/images/fig8_ribbon_connector.png create mode 100644 hardware/case/remixes/besoiobiy-printed/images/photo_built.jpg create mode 100644 hardware/case/remixes/besoiobiy-printed/images/render_exploded_back.png create mode 100644 hardware/case/remixes/besoiobiy-printed/images/render_exploded_front.png create mode 100644 hardware/case/remixes/besoiobiy-printed/images/render_parts.png create mode 100644 hardware/case/remixes/besoiobiy-printed/print_layout.3mf create mode 100644 hardware/case/remixes/besoiobiy-printed/source/patternbox.blend create mode 100644 hardware/case/remixes/besoiobiy-printed/source/patternbox.stl create mode 100644 hardware/case/remixes/besoiobiy-printed/stl/box_bottom.stl create mode 100644 hardware/case/remixes/besoiobiy-printed/stl/box_bottom_no_bridge.stl create mode 100644 hardware/case/remixes/besoiobiy-printed/stl/box_bottom_plain.stl create mode 100644 hardware/case/remixes/besoiobiy-printed/stl/box_top.stl create mode 100644 hardware/case/remixes/besoiobiy-printed/stl/box_top_no_bridge.stl create mode 100644 hardware/case/remixes/besoiobiy-printed/stl/box_top_plain.stl create mode 100644 hardware/case/remixes/besoiobiy-printed/stl/cover_box_bottom.stl create mode 100644 hardware/case/remixes/besoiobiy-printed/stl/cover_box_top.stl create mode 100644 hardware/case/remixes/besoiobiy-printed/stl/cover_frame_bottom.stl create mode 100644 hardware/case/remixes/besoiobiy-printed/stl/cover_frame_top.stl create mode 100644 hardware/case/remixes/besoiobiy-printed/stl/frame_bottom.stl create mode 100644 hardware/case/remixes/besoiobiy-printed/stl/frame_top.stl create mode 100644 hardware/case/remixes/besoiobiy-printed/stl/knob_cap.stl create mode 100644 tools/case-models/.gitignore create mode 100644 tools/case-models/README.md create mode 100644 tools/case-models/assemble.mjs create mode 100755 tools/case-models/besoiobiy.py create mode 100755 tools/case-models/build.sh create mode 100644 tools/case-models/extract_led.mjs create mode 100644 tools/case-models/lib/frame.mjs create mode 100644 tools/case-models/lib/io.mjs create mode 100644 tools/case-models/lib/looks.mjs create mode 100644 tools/case-models/package-lock.json create mode 100644 tools/case-models/package.json create mode 100644 tools/case-models/preview.mjs create mode 100644 tools/case-models/requirements.txt create mode 100755 tools/case-models/simonepda.py create mode 100644 tools/case-models/source/led_panel.glb delete mode 100644 web/public/3dforweb.glb create mode 100644 web/public/cases/besoiobiy-printed/built.jpg create mode 100644 web/public/cases/besoiobiy-printed/exploded_back.jpg create mode 100644 web/public/cases/besoiobiy-printed/exploded_front.jpg create mode 100644 web/public/cases/besoiobiy-printed/model.glb create mode 100644 web/public/cases/besoiobiy-printed/parts.jpg create mode 100644 web/public/cases/official/close_back.jpg create mode 100644 web/public/cases/official/model.glb create mode 100644 web/public/cases/official/printed_parts.jpg create mode 100644 web/public/cases/official/printing.jpg create mode 100644 web/public/cases/simonepda-lasercut/acrylic_front.jpg create mode 100644 web/public/cases/simonepda-lasercut/board_in_box.jpg create mode 100644 web/public/cases/simonepda-lasercut/mdf_back.jpg create mode 100644 web/public/cases/simonepda-lasercut/mdf_front.jpg create mode 100644 web/public/cases/simonepda-lasercut/model.glb create mode 100644 web/src/components/3d/CaseFinishSwitch.module.css create mode 100644 web/src/components/3d/CaseFinishSwitch.tsx create mode 100644 web/src/components/3d/HeroScene.module.css create mode 100644 web/src/components/3d/caseModels.test.ts create mode 100644 web/src/components/3d/caseModels.ts create mode 100644 web/src/components/3d/cases/besoiobiy-printed.ts create mode 100644 web/src/components/3d/cases/official.ts create mode 100644 web/src/components/3d/cases/simonepda-lasercut.ts create mode 100644 web/src/components/3d/heroCase.test.ts create mode 100644 web/src/components/3d/heroCase.ts create mode 100644 web/src/components/3d/preloadCaseModel.ts create mode 100644 web/src/components/sections/BuildPanel.test.tsx create mode 100644 web/src/components/sections/CasePicker.module.css create mode 100644 web/src/components/sections/CasePicker.tsx create mode 100644 web/src/components/sections/build-cases-data.test.ts create mode 100644 web/src/components/sections/build-cases-data.ts diff --git a/.github/workflows/web-ci.yml b/.github/workflows/web-ci.yml index 99365f3ed..87717e892 100644 --- a/.github/workflows/web-ci.yml +++ b/.github/workflows/web-ci.yml @@ -1,16 +1,20 @@ name: Web CI # Lint + build the Next.js site so broken code can't reach main. -# Only runs when something under web/ (or this workflow) changes. +# Only runs when something under web/ (or this workflow) changes — and on +# hardware/case/, because the Build panel's case cards link into it and +# build-cases-data.test.ts checks those paths and the remix READMEs. on: pull_request: paths: - "web/**" + - "hardware/case/**" - ".github/workflows/web-ci.yml" push: branches: [main] paths: - "web/**" + - "hardware/case/**" - ".github/workflows/web-ci.yml" # Cancel an in-progress run if newer commits are pushed to the same ref. diff --git a/AGENTS.md b/AGENTS.md index 2641084dc..a66463721 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -12,7 +12,7 @@ It is standalone (not Eurorack), powered from a 5 V power bank through a screw t - `firmware/` — PlatformIO/Arduino code for the ESP32-S3. Main sketch folder: `firmware/patternflow/` with `patternflow.ino`, `config.h` (pin mappings, brightness, limits, LED calibration), `net_config.h` (Wi-Fi / Improv / OTA / self-update defaults and the lane scale — core only; a feature's own tunables live in `features//_config.h`, and settings TUNE a feature, they never add one; per-device secrets in gitignored `patternflow_secrets.h`), and `pattern_registry.h` (function-pointer pattern table; compiles in Origin alone — the rest of the curated set ships as the Basics pack). Shared engine code lives in `firmware/patternflow/src/` (`core_display.h` HUB75 driver, `core_encoders.h`, canvas/color/math/noise helpers, Wi-Fi/OTA/web-console modules, the hotspot in `core_hotspot.h`) — core only: OSC, audio, MQTT, weather, shows, MIDI and the clock all live in `features/`. `firmware/patternflow/abi/` is the frozen host ⇄ module contract. Curated patterns live in `firmware/patternflow/presets/` (`preset_origin.h`, `preset_wave_saw.h`, dated presets), each using its own pattern namespace; user patterns are `.pfm` modules uploaded to the device over Wi-Fi, built from `firmware/modules/` via `firmware/toolchain/build_module.py` (the old `custom1.h`–`custom3.h` root slots are gone). Features attach through `firmware/patternflow/features/` (named `addons/` until 2026-08-30; legacy spellings are shimmed for out-of-tree bundles — see docs/EDITIONS.md) — a directory and a descriptor of function pointers, with the core naming none of them (see its README). `firmware/bundles/` names firmwares built from the same tree (the shelf editions `audio` and `performance`, plus `clock` and `midi`, compositions the tree keeps buildable but does not publish; the default build has no bundle): two files each, saying which features compile in and what the build calls itself; `firmware/bundles/build.sh` builds the default or a named one, `shelf.sh` stages a publishable image. Device console pages are plain HTML in `firmware/patternflow/console/`, spliced into `*_index.h` by `firmware/toolchain/console_pages.py`. Tooling lives in `firmware/toolchain/` (repo-level scripts) and `firmware/patternflow/toolchain/` (PlatformIO `extra_scripts`, which must stay sketch-relative). Also: `firmware/encoder_test/` (standalone encoder diagnostic) and `firmware/CUSTOM_PATTERNS.md` (pattern authoring guide). - `hardware/` — Hardware designs. `case/` (Blender source in `source/`, STLs by printer bed size, `legacy_v2/` for the v2.x board), `pcb/` (KiCad 10.0 source, Gerbers per revision, schematic PDF), `bom/` (`bom_v3.9.csv` — **the BOM source of truth**; the guide's table is derived from it. `bom_v3.0.csv` is kept for the previous board). - `web/` — Next.js site at patternflow.work: landing page (`/`, `/pattern`, `/build`, `/inside` are tabs of one view), the interactive guide (`/guide` is a hub over `/guide/build`, `/guide/play`, `/guide/make` and `/guide/audio`, each with a `/ko` twin; one 3D stage in `components/guide/`, the firmware simulator in `lib/guide/`), Pattern Lab (`/pattern-lab`), community (`/community/**`, SQLite + Drizzle + Better Auth, only on the Pi deployment), browser flasher (`/flash`), the edition shelf (`/editions`; `/variants` redirects there), the feature catalogue (`/features`, reels per feature), device update handoff (`/update`), journal, roadmap. `lib/pattern/` is the pattern runtime and annotations, `lib/lab/` the Pattern Lab, `lib/community/` the community, `lib/ai/` the Gemini client. Architecture doc: `web/ARCHITECTURE.md`. The JS presets in `web/src/lib/presets/` are the source of truth for firmware preset headers. -- `tools/` — desktop-side helpers: `patternflow-audio-extension` (the browser audio-react extension — also the authoring source the device's `/audio-in` console page is assembled from), `patternflow-audio-android` (phone capture app), `rtpmidi-probe`. +- `tools/` — desktop-side helpers: `patternflow-audio-extension` (the browser audio-react extension — also the authoring source the device's `/audio-in` console page is assembled from), `patternflow-audio-android` (phone capture app), `rtpmidi-probe`, and `case-models` (builds the /build preview's per-case 3D models, `web/public/cases//model.glb`, from the case files in the repo; run by hand, not by the site build). - `integrations/` — host-software integrations, each with its own README. `integrations/ableton/` is the Max for Live bridge (knobs → Live parameters over OSC). The Home Assistant integration left this repository on 2026-09-03; its author maintains it separately. Integrations are built against the contracts in `docs/` (`rest-api.md`, `osc-spec.md`, `midi-spec.md`), not against the firmware source. `docs/rest-api.md` also has the table for choosing between HTTP, OSC and MQTT, and the rules that make the device's single-connection web server easy to knock over. ## Hard rules (do not violate) diff --git a/BUILD_GUIDE.md b/BUILD_GUIDE.md index 012e420dd..dfb0b5fef 100644 --- a/BUILD_GUIDE.md +++ b/BUILD_GUIDE.md @@ -108,6 +108,8 @@ Any fab works, though — upload **`hardware/pcb/gerber/patternflow_v3.9_gerber. > **No 3D printer?** The case can be laser-cut instead: [Simone Majocchi's laser-cut case](hardware/case/remixes/simonepda-lasercut/README.md) is a community remix cut from acrylic or MDF sheet. Its README takes the place of this section and Section 6; the rest of this guide is the same. +> **Another printed case:** [Besoiobiy's printed case](hardware/case/remixes/besoiobiy-printed/README.md) is a community remix in glued halves with screwed-on covers, the panel bolted through the case into its own M3 sockets. Check your panel against its README first. The README takes the place of this section and Section 6, and gives the order for Sections 7 to 9, because the panel is wired before its covers go on. + **Bambu / MakerWorld users — this section is one click:** the case lives on **[MakerWorld](https://makerworld.com/ko/models/3072492-patternflow-open-source-led-synthesizer-case#profileId-3459015)** with tuned print profiles (the same 4-plate project is in the repo as [`hardware/case/bed_256mm/patternflow_v3.3mf`](hardware/case/bed_256mm/patternflow_v3.3mf)). Slicing manually instead? Case folders are named by **printer bed size** — see [`hardware/case/`](hardware/case/): | Your printer bed | Print | Notes | diff --git a/BUILD_GUIDE_v2.md b/BUILD_GUIDE_v2.md index 5131e802b..ae0b0dbed 100644 --- a/BUILD_GUIDE_v2.md +++ b/BUILD_GUIDE_v2.md @@ -2,7 +2,7 @@ This guide walks you through building a Patternflow v2.0.0 from scratch. It assumes basic familiarity with through-hole soldering and 3D printing. -This is the current detailed path for a hand-soldered official PCB plus a PLA 3D printed enclosure. For the broader assembly map, including the laser-cut path still in preparation, see [docs/assembly/README.md](docs/assembly/README.md). +This is the current detailed path for a hand-soldered official PCB plus a PLA 3D printed enclosure. For the broader assembly map, see [docs/assembly/README.md](docs/assembly/README.md); the community cases it lists, laser-cut and printed, are for the v3 board. > **No PCB? Try the breadboard build.** If you don't want to order or solder a custom PCB, there's a complete **PCB-free path** that wires the same parts together with a snapped-off breadboard power rail and jumper wires — no soldering iron required. See the **[Breadboard Build Guide](https://patternflow.work/build/breadboard)**. You can always move up to this PCB build later. @@ -10,7 +10,7 @@ This is the current detailed path for a hand-soldered official PCB plus a PLA 3D **Skill level:** Beginner-to-intermediate. If you've assembled a mechanical keyboard or built a basic Arduino project, you're ready — this is an all through-hole build. -> 🚀 **This is the legacy v2.x guide.** The current build is **v3.0** — see the main **[Build Guide](BUILD_GUIDE.md)**. Keep following this page only if you already have v2.x parts (v2 and v3 boards/cases are not interchangeable). +> 🚀 **This is the legacy v2.x guide.** The current build is the **v3.9** board — see the main **[Build Guide](BUILD_GUIDE.md)**. Keep following this page only if you already have v2.x parts (v2 and v3 boards/cases are not interchangeable). > > Photos in this guide were shot on an early build; where a photo looks slightly off, follow the written steps. diff --git a/CHANGELOG.md b/CHANGELOG.md index 9f17ab150..72108b114 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,18 @@ All notable changes to Patternflow will be documented in this file, newest first ## [Unreleased] +### Hardware + +- **Besoiobiy's printed case is the second enclosure remix** (`hardware/case/remixes/besoiobiy-printed/`). Two long pieces glued side by side, a frame round the panel and a box for the board and the power bank, closed at the back by four screwed-on covers, with the panel bolted through the case into its own M3 sockets. Its README takes the place of the build guide's sections 4 and 6 and sets the order of 7 to 9; check your panel against it first, because the BOM's panel takes M4 screws on another hole pattern. The build guide's printing section and the assembly map point at it. + +### Web + +- **/build lets you pick the case, and the 3D view shows the one you pick.** The Build panel's switch (the official v3.9 case, Besoiobiy's printed case, SimonePDA's laser-cut one; `?case=` links to one) brings up that case's card, a remix's opening with its README on GitHub, and swaps the device in the preview for that case, with the same v3.9 board, DevKit and LED panel inside (and, on Besoiobiy's case, its own knob caps). SimonePDA's case comes in its two finishes, acrylic and MDF. Each model is made by `tools/case-models` from the case's own files in this repository (the guide's v3.9 case, Besoiobiy's STLs, SimonePDA's cutting layout) and sits beside the case's photos, `web/public/cases//model.glb`. The model the page loads first is 0.32 MB, where the old v3.0 one (`3dforweb.glb`, now removed) was 1.15 MB; a remix's model loads when it is picked, and the guide takes its LED panel from the official one. + +### Docs + +- **The build pages say what is true now.** Laser cut is no longer "being prepared" on /build, in the README, the v2 guide or `llms.txt`: SimonePDA's case is it. The printing time is about 10 hours for the official case on a 256 mm bed (/build said 10–12, the breadboard guide 11), the v2 guide and the assembly map name the v3.9 board, and the breadboard guide flashes through the DevKit's native USB port from the Pattern tab and links the sections that exist. + ## [3.11.0] - 2026-10-04 ### Firmware diff --git a/README.md b/README.md index 06268f780..2208549a1 100644 --- a/README.md +++ b/README.md @@ -173,7 +173,7 @@ Each of these lives in an **edition** — a firmware you install from [the shelf ## How it's built -Patternflow is built around a standalone ESP32-S3 driving a HUB75 RGB LED matrix at low resolution, where each pixel reads as a discrete point of light with its own brightness and color. Four rotary encoders feed firmware written in Arduino-compatible C++ around a modular pattern architecture: each pattern is a self-contained module with its own setup, update, and draw routines, while the shared framework handles input, LED rendering, mode transitions, and color calibration. I designed the PCB myself; the enclosure is 3D-printed by default, with stainless steel, transparent acrylic, and laser-cut variations in progress. +Patternflow is built around a standalone ESP32-S3 driving a HUB75 RGB LED matrix at low resolution, where each pixel reads as a discrete point of light with its own brightness and color. Four rotary encoders feed firmware written in Arduino-compatible C++ around a modular pattern architecture: each pattern is a self-contained module with its own setup, update, and draw routines, while the shared framework handles input, LED rendering, mode transitions, and color calibration. I designed the PCB myself; the enclosure is 3D-printed by default. Two community remixes sit beside it in [`hardware/case/remixes/`](hardware/case/remixes/README.md), another printed case and a laser-cut one in clear acrylic or MDF, and a stainless steel version is still in progress. ## Repository & documentation diff --git a/docs/LICENSE-SUMMARY.md b/docs/LICENSE-SUMMARY.md index d66612990..a00b6dde4 100644 --- a/docs/LICENSE-SUMMARY.md +++ b/docs/LICENSE-SUMMARY.md @@ -17,6 +17,7 @@ override it. | Journal (`web/content/journal/`) | CC BY-SA 4.0 | Same as above. | | Enclosure remixes (`hardware/case/remixes/`) | Stated in each remix's README (CC BY-SA 4.0 by default) | The README is the license header for files that cannot carry one. | | Build-map photos (`web/public/builds/`) | CC BY-SA 4.0 unless the build's entry says otherwise | Credit the maker. | +| Case photos and models (`web/public/cases/`) | CC BY-SA 4.0 — resized copies of the images in `hardware/case/remixes//` and `docs/build-guide/`, and each case's 3D model for the /build preview (`model.glb`), made by `tools/case-models` from the case's own files | Credit the author the remix's README names (its /build card names them too). | | **Bundled patterns** (`web/src/lib/presets/`, `firmware/patternflow/presets/`) | CC BY-SA 4.0 | Per-file SPDX headers. They sit in code folders but they are artwork, not code. | | **Community patterns** | **Chosen by their author** — see below | Read the header in the pattern itself. | diff --git a/docs/REPOSITORY.md b/docs/REPOSITORY.md index a889d1229..e22c6b03d 100644 --- a/docs/REPOSITORY.md +++ b/docs/REPOSITORY.md @@ -10,7 +10,7 @@ A map for people. (AI coding agents get the same map with more rules in [`../AGE | `hardware/` | `pcb/` (KiCad source, Gerbers per revision, schematic PDF), `case/` (STLs by printer bed size, knob plates, the Blender source, legacy v2 cases, and `remixes/` for community variants), `bom/` (the CSV that is the BOM source of truth) | [`hardware/README.md`](../hardware/README.md) | | `web/` | The Next.js site at patternflow.work: landing page, the interactive guide (`/guide`, with `/guide/build`, `/guide/play`, `/guide/make` and `/guide/audio`), Live Editor, Pattern Lab, the community (only on the community host), browser flasher, edition shelf, device update handoff, journal, roadmap. The JS presets in `src/lib/presets/` are the source of truth for the firmware's preset headers. The breadboard build guide is a React page here, `src/app/build/breadboard/` | [`web/README.md`](../web/README.md), then [`web/ARCHITECTURE.md`](../web/ARCHITECTURE.md) | | `docs/` | Contracts other software is built against, how the firmware is put together, walk-throughs, the assembly map, project records and media | [`README.md`](README.md) | -| `tools/` | Clients Patternflow ships that run on their own: the audio-react browser extension (also the authoring source of the device's `/audio-in` page), the Android capture app, an RTP-MIDI probe | [`tools/README.md`](../tools/README.md) | +| `tools/` | Clients Patternflow ships that run on their own: the audio-react browser extension (also the authoring source of the device's `/audio-in` page), the Android capture app, an RTP-MIDI probe. Also `case-models/`, the scripts that make the /build page's 3D model of each case | [`tools/README.md`](../tools/README.md) | | `integrations/` | Bridges that run inside or beside someone else's software (Ableton / Max for Live today) and talk to the panel only through the contracts in `docs/` | [`integrations/README.md`](../integrations/README.md) | | `.github/` | Issue and pull-request templates, the CI workflows (web, firmware editions, doc links, console-page sync, firmware release assets, Discord dev-log) and their helper scripts | the header comment of each workflow | | root | `README.md`, the five guides (`BUILD_GUIDE.md`, `BUILD_GUIDE_v2.md`, `PATTERN_GUIDE.md`, `FEATURE_GUIDE.md`, `AUDIO_GUIDE.md`), `CHANGELOG.md`, `CONTRIBUTING.md`, `SUPPORT.md`, `CODE_OF_CONDUCT.md`, `SECURITY.md`, `CITATION.cff`, the two license texts and the `LICENSE` pointer, `AGENTS.md` (+ `CLAUDE.md`, a one-line shim) | | diff --git a/docs/assembly/README.md b/docs/assembly/README.md index 35016bdf9..07010a0d1 100644 --- a/docs/assembly/README.md +++ b/docs/assembly/README.md @@ -12,7 +12,7 @@ Patternflow is not a single, rigid kit. It is a modular system divided into two Build those two, flash the firmware, and your Patternflow is alive. -## The main route (v3.0.0) +## The main route (v3.9 board) | Enclosure | Electronics | Firmware | Status | | --- | --- | --- | --- | @@ -30,6 +30,7 @@ This is the route [BUILD_GUIDE.md](../../BUILD_GUIDE.md) walks start to finish, | 3D printed enclosure | Custom PCB | **Current** — [BUILD_GUIDE.md](../../BUILD_GUIDE.md) | | 3D printed enclosure | Breadboard / jumper-wire electronics | Available — [Breadboard Build Guide](https://patternflow.work/build/breadboard) | | Laser-cut acrylic or MDF sheet | Custom PCB | Community — [`remixes/simonepda-lasercut/`](../../hardware/case/remixes/simonepda-lasercut/README.md), by Simone Majocchi. Built by its author in both materials; its README stands in for the printing and case-assembly sections of the build guide | +| 3D printed, glued halves with screwed-on covers | Custom PCB | Community — [`remixes/besoiobiy-printed/`](../../hardware/case/remixes/besoiobiy-printed/README.md), by Besoiobiy. Built by its author; the panel is bolted through the case into its own M3 sockets, so check your panel's thread size and socket depth first. Its README stands in for the printing and case-assembly sections of the build guide and sets the wiring order | | Any other enclosure | either | Not an official path. Community variants live in [`hardware/case/remixes/`](../../hardware/case/remixes/README.md); the old acrylic drawings, for the v1 and v2 boards, are in [`legacy_lasercut/`](../../hardware/case/legacy_lasercut/README.md) | The breadboard path exists to make Patternflow easier and cheaper to start. A breadboard build is not just a temporary prototype — if that form is enough for you, it is a valid Patternflow build. Want a more finished object later? Move to the PCB and printed-enclosure path whenever you like. diff --git a/hardware/case/remixes/README.md b/hardware/case/remixes/README.md index f660c97e7..1526e7a00 100644 --- a/hardware/case/remixes/README.md +++ b/hardware/case/remixes/README.md @@ -15,6 +15,8 @@ hardware/case/remixes/-/ Folder name: your maker name, a dash, a short variant name, all lowercase (`nath-acrylic`, `day-paper-diffuser`). +The [/build](https://patternflow.work/build) page can show a remix beside the official case, in its 3D preview too: [`tools/case-models`](../../../tools/case-models/README.md) makes that model from the folder's own files. + ## The README is the license header STL and DXF files cannot carry an SPDX line, so the README carries the license for the whole folder. Its first lines are these fields, one per line, in this order; the first two are checked by CI on every pull request: diff --git a/hardware/case/remixes/besoiobiy-printed/README.md b/hardware/case/remixes/besoiobiy-printed/README.md new file mode 100644 index 000000000..c7fe02290 --- /dev/null +++ b/hardware/case/remixes/besoiobiy-printed/README.md @@ -0,0 +1,211 @@ +Author: Besoiobiy, on the Patternflow Discord (https://discord.gg/Vr9QtsxeTk) +License: CC-BY-SA-4.0 +Based on: original design +Fits: v3 board (v3.9 and v3.0 share the outline) and a 320 × 160 mm, 128 × 64 LED panel with M3 mounting sockets and a socket depth of 14.35 mm, like [Besoiobiy's](https://s.click.aliexpress.com/e/_c2ujwLGH) (affiliate link, supports Patternflow at no extra cost; if it does not open where you are, look up item 32691434344 on your own country's AliExpress site, as with the other AliExpress links in the build guide; Besoiobiy's own order was on [aliexpress.ru](https://aliexpress.ru/item/32691434344.html?sku_id=12000031100108258), for example); [check your panel first](#check-your-panel-first) +Material: PLA, set up for a Bambu Lab P1S with a 0.4 mm nozzle; white case, black knob caps. The print settings are in [`print_layout.3mf`](print_layout.3mf) +Verified: 2026-10-08, photo below. Built by its author, and working for a week when they shared it + +# Besoiobiy's printed case + +A printed case in two long pieces glued side by side: a frame around the LED panel, and a box beside it for the board and the battery, with the PATTERNFLOW lettering down its outer side. Each piece is split in two across its length so that every part fits a 256 mm bed. Four flat covers close the back with countersunk screws. The panel is not held by the frame alone: twelve M3 × 25 bolts go through the frame's covers and its tabs into the panel's own threaded sockets, clamping the three together. The knobs are new caps that go straight onto the encoder shafts. Assembled, it is about 267 × 329 × 31 mm. + +Besoiobiy's build held upright: the lit LED panel on the left, the white box on the right with four black knobs at the top and PATTERNFLOW lettered down its side Render of the case pulled apart: the two box halves with their lettering and the knob caps on the left, the two frame halves with the panel tabs on the right, the four covers behind + +*Left: Besoiobiy's build, held upright with the knobs at the top. Right: the same parts pulled apart, rendered from the STL files.* + +In this folder, **top** means the end with the knobs and **bottom** the other end, as the case is held in the photo. The top half of the box holds the board; the bottom half is the battery bay (Besoiobiy's files call it the battery case). + +This folder replaces the printing and case-assembly sections of the [build guide](../../../../BUILD_GUIDE.md) (4 and 6), and changes the order of sections 7 to 9: the panel has to be wired before its covers go on, and the box closes with screwed covers instead of the snap-fit back panel. The electronics, the soldering and the firmware are the same. + +## Files + +| File | What | +| :--- | :--- | +| [`stl/`](stl/) | One STL per part, 13 files, each already lying the way it prints. [The parts](#the-parts) lists them. | +| [`print_layout.3mf`](print_layout.3mf) | Besoiobiy's Bambu Studio project (sent as `Pattern.3mf`): nine parts side by side in their print orientation, with the print settings. Read [The 3MF](#the-3mf) before printing from it. | +| [`source/patternbox.blend`](source/patternbox.blend) | The Blender scene (sent as `PatternBox.blend`), saved with Blender 5.2. Its header asks for Blender 4.5 or newer; 5.0 and 5.1 open it with a warning that it comes from a newer version. | +| [`source/patternbox.stl`](source/patternbox.stl) | The STL as Besoiobiy exported it (sent as `PatternBox.stl`): the whole model in one file, the way they left it. The parts face the way they do when assembled but are pulled apart, with the variant box halves stacked above the main ones, the covers behind, and modelling helpers far off. It is not for printing; `stl/` is cut from it. | +| [`images/`](images/) | Besoiobiy's eight figures, named `fig1_…` to `fig8_…` after the figure numbers in their notes, the photo, and renders of the STL files. | + +The `.blend` is stored in Git LFS, like the official case's source: GitHub's *Download ZIP* gives a 131-byte pointer instead of the 655 KB scene. Clone with Git LFS installed, or open the file on GitHub and download it from there. + +## The parts + +The thirteen STL files rendered as they lie for printing: two box halves, two frame halves, four covers, the knob cap, and the four box-half variants + +Sizes are as the part lies for printing (x × y × z, in mm). *Closed* means every edge of the mesh is shared by exactly two triangles. *In the 3MF as* is the name the part has in Besoiobiy's project. + +| File | Part | Size (mm) | Closed | In the 3MF as | Print | +| :--- | :--- | :--- | :---: | :--- | :---: | +| [`box_top.stl`](stl/box_top.stl) | Box, top half: the four encoder holes, NFLOW lettering | 100 × 149.34 × 30.85 | yes | `test.stl` | 1 of the 3 top halves | +| [`box_top_no_bridge.stl`](stl/box_top_no_bridge.stl) | The same, without the bridge | 100 × 149.34 × 30.85 | yes | — | | +| [`box_top_plain.stl`](stl/box_top_plain.stl) | The same, without the lettering | 100 × 149.34 × 30.85 | yes | — | | +| [`box_bottom.stl`](stl/box_bottom.stl) | Box, bottom half: the battery bay, PATTER lettering, the openings for the power cable | 100 × 181.66 × 30.85 | yes | `BatteryTest.stl` | 1 of the 3 bottom halves | +| [`box_bottom_no_bridge.stl`](stl/box_bottom_no_bridge.stl) | The same, without the bridge | 100 × 181.66 × 30.85 | no, see below | — | | +| [`box_bottom_plain.stl`](stl/box_bottom_plain.stl) | The same, without the lettering | 100 × 181.66 × 30.85 | yes | — | | +| [`frame_top.stl`](stl/frame_top.stl) | Frame around the panel, top half, six panel tabs | 169 × 149.34 × 30.85 | yes | `Frame1.stl` | 1 | +| [`frame_bottom.stl`](stl/frame_bottom.stl) | Frame, bottom half, six panel tabs | 169 × 181.67 × 30.85 | yes | `Frame2.stl` | 1 | +| [`cover_frame_top.stl`](stl/cover_frame_top.stl) | Cover behind the panel, top | 160.6 × 144.94 × 2 | yes | `crishka.stl` | 1 | +| [`cover_frame_bottom.stl`](stl/cover_frame_bottom.stl) | Cover behind the panel, bottom | 160.6 × 175.26 × 2 | yes | `Plate2.stl` | 1 | +| [`cover_box_top.stl`](stl/cover_box_top.stl) | Cover for the box, top | 89.6 × 144.94 × 2 | yes | `Crishka4.stl` | 1 | +| [`cover_box_bottom.stl`](stl/cover_box_bottom.stl) | Cover for the box, bottom | 89.6 × 175.26 × 2 | yes | `Crishka3.stl` | 1 | +| [`knob_cap.stl`](stl/knob_cap.stl) | Knob, 18.5 mm across, for a 6 mm D-shaft (one with a flat, like the BOM's encoder) | 18.5 × 18.5 × 22.22 | yes | `Colpacec.stl` | 4 | + +`box_bottom_no_bridge.stl` fails the strict test in one place: a 48.5 mm edge meets five shorter edges along the same line, at the foot of the end wall where it meets the front. Cutting the bridge away re-meshed that wall's inner face. There is no gap in the surface, and slicers close it on import. + +Each file in `stl/` is one connected piece of `source/patternbox.stl`, unchanged except for its placement: turned the way the 3MF lays that part on the plate, set on the bed and centred. The scene STL holds 45 more pieces that are not parts, and they are not in `stl/`: six thin slivers inside the knob cap, 33 small cylinders and pegs the size of the insert holes, the encoder holes and the tab slots, three unsplit 329 mm bodies 24.4 mm deep that the notes do not mention, a 292 mm bar, a flat strip, and a stray pair of triangles 6 m across. + +## Variants + +Figure 3: the six box halves in Blender, with and without the lettering and with and without the internal bridge + +*Figure 3: the box halves, with and without the lettering and the bridge.* + +Each box half comes three ways: print one top half and one bottom half. The 3MF has the first row; the halves in the photo carry the lettering. + +| | Top half | Bottom half | +| :--- | :--- | :--- | +| Lettering, with the bridge | `box_top.stl` | `box_bottom.stl` | +| Lettering, no bridge | `box_top_no_bridge.stl` | `box_bottom_no_bridge.stl` | +| No lettering, with the bridge | `box_top_plain.stl` | `box_bottom_plain.stl` | + +- **No bridge.** Where the two halves meet, each end wall has a long window. The bridge is the strip of wall between that window and the edge the cover sits on, about 48 × 5 mm. Without it the window opens onto that edge, which in Besoiobiy's words is for easier access to the USB. The DevKit's USB port carries data, for flashing and wired MIDI, and never power: see the [build guide, section 2](../../../../BUILD_GUIDE.md#2-power-input--use-the-screw-terminal). +- **No lettering.** The plain halves also lack the engraved lines on the front, and the plain top half has a flat inside face where the others have a cross-shaped rib between the encoder holes. + +## Printing + +Print each part the way the 3MF lays it, which uses the least material according to Besoiobiy; the files in `stl/` already lie that way. The box halves go front face down, the frame halves stand on their back edge, the covers lie flat with their counterbored face down, and the knob caps stand with the dished top up. Every part fits a 256 × 256 mm bed on its own. + +### The 3MF + +`print_layout.3mf` is a Bambu Studio 2.8 project for a P1S with a 0.4 mm nozzle on the textured PEI plate. Besoiobiy laid the parts out side by side so that it is clear which is which, and saved it like this: + +- Only the knob cap is on the plate and set to print. The other eight parts are switched off and lie outside the plate: switch them back on in the object list and arrange them onto plates. Print the knob cap four times. +- 0.1 mm layers (the knob cap 0.2 mm, with ironing on its top), 3 walls, 20 % gyroid infill (the frame halves 25 %), and supports only where they are painted on (support type *normal (manual)*, style *snug*). Every part has painted supports, which an STL cannot carry: in another slicer, set supports yourself. +- The filaments are Bambu PLA Matte and PLA Basic, both set to black. The case in the photo is white. +- Only the halves with the lettering and the bridge are in it. For a variant, import its file from `stl/` in place of the half it replaces. + +The box halves in the 3MF are not quite the ones in the STL. Their locating keys, the small tongues that go into pockets in the frame and in the other box half, are 0.2 mm larger on each side in the 3MF. Everything else matches: the frames and the covers exactly, and the knob cap in shape. The notes do not say which version was printed. If the keys go in hard (known issue 3), the STL halves give 0.2 mm more room on each side. + +## Hardware + +| Qty | Part | Where | +| :---: | :--- | :--- | +| 8 | M3 heat-set brass inserts, M3 × 8 × 5 (Besoiobiy's size) | The corners of both box halves, red in figure 6. The holes for them are 5.0 mm across and 9 mm deep. | +| 8 | M3 × 10 countersunk screws | Through the two box covers into the inserts, orange in figure 6. | +| 12 | M3 × 25 countersunk bolts | Through the two frame covers (green in figure 7) and the frame's tabs (turquoise) straight into the LED panel's threaded sockets. No inserts here: the cover, the frame and the panel are clamped together. [Check the reach first.](#check-your-panel-first) | +| 1 | USB power bank, 5 V | In the bottom half. The empty bay is 90 mm wide, about 171 mm long down the middle and about 24.8 mm deep, from the inside of the front to the cover; its corners are chamfered, so at the full 90 mm width it is about 143 mm long. The bank needs less than that: leave room for the plug of the `J4` cable at its output, and remember that a bank reaching the bottom end covers the two power-cable openings from inside. | +| — | Glue | For the halves, in the order of figure 5. The notes do not name a glue. | + +Figure 6: the box halves and their covers; red dots on the eight insert positions, orange dots on the eight cover screws, two blue dots on the openings for the power cable Figure 7: the frame halves and their covers; green dots on the twelve holes in the covers, turquoise dots on the twelve frame tabs + +*Figure 6 (left): inserts in red, M3 × 10 in orange, the power-cable openings in blue. Figure 7 (right): the M3 × 25 bolts go in through the green holes and into the turquoise tabs.* + +The two blue dots in figure 6 are the openings for the power cable, near the bottom end of the box: one in the lettered side wall, just below the P, and one in the end wall. Besoiobiy's notes say one is for vertical installation and the other for horizontal, without saying which is which. In the photo the case is held upright and the cable leaves through the side wall; standing on its bottom end, the case would sit on the end-wall opening, so that one is for the case lying the other way. Whatever the cable feeds, power reaches the board only through `J4`, the screw terminal. + +## Assembly + +The build guide's sections 5 (soldering), 7 (wiring), 8 (firmware) and 9 (checks) still apply, but in a different order: the frame covers close over the back of the panel, and the box covers take the place of the official snap-fit back panel. + +Figure 5: gluing order, 1 joins the two box halves, 2 joins the two frame halves, 3 joins the frame to the box along its long side + +*Figure 5: the gluing order.* + +1. **Glue the halves, in the order of figure 5:** first the two box halves end to end (1), then the two frame halves (2), then the frame to the box along its long side (3). The keys and pockets in each joint (figure 4) line the parts up. +2. **Set the eight inserts** into the corners of the box (red in figure 6) once the glue has cured, before any wiring, the board or the power bank goes in. +3. **Wire the panel before it is closed in.** Lower the ribbon's connector if it is too tall to fit (figure 8, below), plug the ribbon into the panel's `HUB-75E IN` and the power lead into the panel, and pass both through the window in the frame's side wall into the top half of the box. Their other ends go to `J1` and `J3` later (build guide, section 7, steps 1 and 2). +4. **Panel.** Put the panel into the frame from the front, its sockets against the tabs; the build guide puts `HUB-75E IN` toward the top. Lay the two frame covers over it from behind and drive the twelve M3 × 25 bolts through the covers and the tabs into the panel's sockets (figure 7). From here on the back of the panel is closed. +5. **Power cable.** Clamp the power cable into `J4` before the board goes in (build guide, section 7, step 3). If its other end is outside the case, at a power bank or 5 V supply there, thread it through one of the two openings first (see [Hardware](#hardware)). +6. **Board.** The encoders come through the four holes in the front of the top half; fasten their nuts from the front, as in [section 6 of the build guide](../../../../BUILD_GUIDE.md#6-case-assembly). Connect the ribbon to `J1` and the panel's power lead to `J3`. Flash the DevKit off the board first (section 8.1, steps 1 to 4), then seat it with nothing powering `J4` (section 7, step 4). +7. **Power, patterns, checks.** With the power bank in the bottom half, connect it to the `J4` cable; with the cable leading out of the case, connect its outside end to your bank or supply. Load the patterns (section 8.1, step 6) and run the checks in section 9, steps 2 to 6, with the box still open. +8. **Close the box** with the two box covers and the eight M3 × 10 screws (orange in figure 6). This replaces closing the back panel in section 9, step 7. +9. **Knobs.** Put the four knob caps on the encoder shafts last. + +Render of the case pulled apart, seen from behind: the two frame covers close the whole back of the panel, the two box covers close the box + +*The four covers from behind, rendered from the STL files: once the frame covers are on, the back of the panel is closed.* + +Figure 8: the ribbon connector of the panel cable, with the clip over its top outlined in orange + +*Figure 8: the clip over the ribbon connector, outlined in orange.* + +The ribbon cable from the panel takes a lot of height. The clip over the top of its connector, outlined in orange in figure 8, can be unfastened carefully, and the cable then stands half as tall. Besoiobiy's clip was locked too firmly, so they cut its two plastic legs with wire cutters; the cable still works. + +## Check your panel first + +The case was drawn around Besoiobiy's panel, and panels differ. + +- **Thread size and hole pattern.** As drawn, this case is for an M3 panel with Besoiobiy's hole pattern: the holes in the frame covers pass nothing larger than M3. The panel the build guide links takes M4 screws (build guide, section 1), and its holes are not on this pattern either. The official case, whose tabs are placed for that panel, has its two side rows about 137.4 mm apart and its end bolts about 84.4 mm apart across the panel, where these are 139 mm and 86 mm. Opening up the cover holes is therefore not enough: for that panel, redraw the frame's tabs and covers from the Blender source. +- **Socket depth.** Besoiobiy's panel has a socket depth of 14.35 mm (1.435 cm in their notes). In the files, the fronts of the frame's tabs, where the panel's sockets rest, are exactly 14.35 mm behind the frame's front edge, so the figure is the distance from the LED face to the ends of the sockets, and with that panel the face lies flush with the front of the frame. Measure yours the same way. If it differs, the face stands out from the frame or sits back in it by the difference. +- **Bolt reach.** With the cover in place, flush with the back of the frame, an M3 × 25 bolt ends about 8.5 mm past the front of the tab, inside the panel's socket. Check that your panel's threaded holes are at least that deep and closed at the bottom; if they are not, use a shorter bolt. +- **Bolt positions.** The twelve bolts, measured from the centre of the frame's opening: eight at ±69.5 mm across and ±32 mm and ±123 mm along, and four at ±43 mm across and ±149.5 mm along. The tabs have 5 × 6 mm slots, but the holes in the covers are 3.2 × 4.2 mm slots. An M3 has about half a millimetre of play along each of them and only about 0.1 mm across: across the panel for the eight side bolts, and along it for the four end bolts. So in those directions your panel's sockets have to sit where these are. A frame cover is a 2 mm plate and a short print: print one first and lay it on the back of your panel. +- **Outline.** The opening in the frame is 161 × 321 mm, for a 160 × 320 mm panel. + +Whether a panel lights up at all is a separate question: read [LED panel compatibility](../../../../docs/panel-compatibility.md) before buying one. + +## Known issues and open improvements + +Besoiobiy listed three, and shared the files so that someone else could take them further. A fix is welcome as a pull request on this folder. + +Figure 1: a corner of the case with a cover in place, circled in blue Figure 2: a frame half from the inside, with a long blue line along the top edge of its end wall + +*Figure 1 (left) and figure 2 (right).* + +1. **The corners bulge (figure 1).** With all the screws tight, the corners circled in blue bulge out slightly. +2. **A gap between the panel and the frame (figure 2).** Along the blue line there is a small gap between the panel and the frame. The opening is half a millimetre larger than the panel on every side. Closing it would look better; leaving it makes room for other panels. +3. **Tight keys (figure 4).** The keys sometimes went into their grooves only with difficulty and had to be sanded. Besoiobiy suspects the grooves themselves or the print settings, and has heard that Bambu Studio can make such joints itself, but has not tried it. The STL halves give 0.2 mm more room on each side than the 3MF ones (see [The 3MF](#the-3mf)). + +Figure 4: the keys and grooves where the parts join, circled in blue + +*Figure 4: the keys and grooves, circled in blue.* + +## Measured from the files + +A check of the files against the board's KiCad files, made when the folder was added. It is a measurement, not a second build. + +- The encoder holes are 7.2 mm across, 30.8 × 30.1 mm apart. The encoders on the v3 board are 31 × 30.5 mm apart, so the fit relies on the play in the holes and in the encoders. Besoiobiy's build works. +- Assembled, the frame is 169 × 329 mm and the box 100 × 329 mm, joined over 2 mm keys: about 267 × 329 × 30.85 mm in all. +- The covers' holes are not countersunk but counterbored, 1 mm deep with a flat bottom: 3.5 mm holes in 6.2 mm counterbores in the box covers, 3.2 × 4.2 mm slots in 6.25 × 7.5 mm counterbores in the frame covers. A countersunk head sits a few tenths of a millimetre proud of them. The frame's tabs are 3 mm thick, and each cover rests on a ledge flush with the back of the case. +- The power-cable openings are 6.2 × 10 mm. +- The knob cap's bore is a D: 6.3 mm round with a flat, 5.1 mm across the flat, about 9.8 mm deep, above a recess 12 mm across and 2 mm deep in its underside. + +## Besoiobiy's notes + +
+The message that came with the files, word for word (Patternflow Discord, 2026-10-08) + +The figures arrived as `image.png` and `1.png` to `8.png`. Figure 1 is `image.png`, figure N is the file numbered N − 1, and `8.png` is the photo. In this folder they are `images/fig1_…` to `images/fig8_…` and `images/photo_built.jpg`. + +> Hi @Seunghun Lee ! +> +> I promised to share the source files for the case after I've finished working on it. I've fully assembled the patternflow, and it's been working for a week now and looks great. Unfortunately, I don't have the strength or the desire to make minor adjustments to the case, let alone spend materials on assembling new prototypes, so I'm sharing the source files in .blend and .stl with you so that you can either simply use them (by posting them on your website) or make additional improvements. +> +> Known issues: +> +> 1\) 1st picture What I circled in blue is a problem because when all the screws are tightened, these corners will bulge out slightly. +> +> 2\) 2nd picture When installing the LED panel, this long blue line represents a small gap between the panel and the frame. I'm not sure how much of a problem this is, but if you want to make it perfect, you can eliminate the gap; on the other hand, this makes it easier to install different models of LED panels. +> +> 3\) 4th drawing, I highlighted all the grooves that the structure has, probably I didn't get very good grooves, or the printing settings were not high enough, so sometimes they entered with difficulty and I had to grind them a little with sandpaper. I've heard that grooves can be made directly in bambu studio, but unfortunately I've never worked with it and I don't know how much better they are. +> +> P.S. I hope I haven't forgotten anything) +> +> Also, this scene includes versions of the case without the internal bridge (for easier access to the USB), and a model of the case without the label. (shown in Figure 3) +> +> I indicated the order of gluing the parts in Figure 5. +> +> In Figure 6, I indicated with red dots where the hot brass thread of dimensions M3x8x5 needs to be installed, and with orange dots I indicated which holes for fastening need to be used to screw in bolts with a hidden head of size M3x10. With blue dots on the same figure, I indicated the terminal for the power cable (one side for vertical installation, the other for horizontal). +> +> In Figure 7, I indicated with turquoise dots where the M3x25 bolts with a hidden head should be screwed in; they go in through the green dots. There is no hot brass thread here; instead, the bolts are screwed directly into the LED panel, forming a clamped sandwich. +> +> In Figure 8, I indicated the cable from the LED panel, it takes up a lot of space in height, but this can be fixed if you carefully unfasten what I highlighted in orange, mine turned out to have a too strong lock, so I just bit its plastic legs with wire cutters, and thus the cable became 2 times lower but still working. +> +> I also changed the caps for the twirlers, but it makes no sense to show it, you'll see for yourself) +> +> My LED panel socket has a depth of 1.435 cm, this must be taken into account because, as we have seen, they have different thicknesses. +> +> The 3mf file for bambulab, I put everything side by side so that it would be clear what was what, you need to print exactly in such orientations as they are for less waste of plastic. +> +> And of course, the last photo for demonstration + +
diff --git a/hardware/case/remixes/besoiobiy-printed/images/fig1_corner_bulge.png b/hardware/case/remixes/besoiobiy-printed/images/fig1_corner_bulge.png new file mode 100644 index 0000000000000000000000000000000000000000..b74a086bc2983f9b0d9a49d2136e7797487f6f46 GIT binary patch literal 32837 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 literal 0 HcmV?d00001 diff --git a/hardware/case/remixes/besoiobiy-printed/images/fig3_variants.png b/hardware/case/remixes/besoiobiy-printed/images/fig3_variants.png new file mode 100644 index 0000000000000000000000000000000000000000..0d0defdfadc8782febc182bb735438ca6159032d GIT binary patch literal 167694 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