KUNAI-001 · CARD
A case for a camera, written as code.
This card has a chip in it, and tapping it opened this page. The case it points at holds an Insta360 ONE X, and it is not a model somebody pushed around in CAD — it is generated by a script, and every hole in the camera is a named number in it.
That is the whole idea. "The battery door is on the wrong side" becomes
BATT_EDGE = -1 rather than an afternoon of remodelling. The changelog
is a list of real complaints from real prints, each one next to the exact constant
it moved.
pip install numpy trimesh scikit-image scipy python3 generator/kunai_360_onex_v4.py # both halves python3 generator/verify.py # 26 checks, exits 1 on any failure
Or print the STLs directly. Both halves are watertight and brim-free on both faces by construction — first-layer islands under 12 mm² are carved away so nothing minimally-connected is left for the nozzle to sweep.
Read before you print. The cavity is 17.5 mm against an
18.3 mm caliper reading of the camera body. It only seats if your printed pocket
runs oversized, which is typical FDM wall bow. If the camera will not drop in,
that is why — raise CAV_T toward 18.3. Width had a real 1.6 mm of slop
and is the safe axis to tighten. Height is not.
It began as a request from a family member for a printed kunai. The throwing-knife silhouette is theirs, drawn on paper. Putting a 360 camera inside it was the author's own idea, which is the less generous half of the story and worth saying out loud.
The surface is a Schoen gyroid. An earlier version sampled it at each face's true height, and the back sits where the three-term gyroid collapses into degenerate stripes — which is exactly why it came out looking like a squiggle. It now takes one slice from the front and extrudes it into both faces, so both get the same real maze and the grooves carry no internal overhang.
Printed it and something did not fit? Want it sized for another camera? Write it here and press the button. No account, no email address, no password.
A print complaint is the most useful thing you can send. Every constant in the generator is a number because somebody printed this case and said what was wrong.
What you write goes into a queue that gets worked. It does not
land in anyone's inbox.
Or open an issue on GitHub
if you would rather.