{"id":25776185,"url":"https://github.com/andimoto/keebcu","last_synced_at":"2026-08-13T04:30:20.238Z","repository":{"id":51854365,"uuid":"338440354","full_name":"andimoto/keebcu","owner":"andimoto","description":"Keyboard Customizer","archived":false,"fork":false,"pushed_at":"2025-05-04T20:11:27.000Z","size":40617,"stargazers_count":120,"open_issues_count":0,"forks_count":6,"subscribers_count":4,"default_branch":"develop","last_synced_at":"2025-05-04T21:23:56.294Z","etag":null,"topics":["3d-models","3d-printing","diy","electronics","keyboard","keyboard-layout","keyboard-simulator","mechanical-keyboard","openscad"],"latest_commit_sha":null,"homepage":"","language":"OpenSCAD","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/andimoto.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2021-02-12T21:45:04.000Z","updated_at":"2025-05-03T14:26:47.000Z","dependencies_parsed_at":"2024-02-24T12:38:37.880Z","dependency_job_id":null,"html_url":"https://github.com/andimoto/keebcu","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/andimoto/keebcu","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andimoto%2Fkeebcu","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andimoto%2Fkeebcu/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andimoto%2Fkeebcu/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andimoto%2Fkeebcu/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/andimoto","download_url":"https://codeload.github.com/andimoto/keebcu/tar.gz/refs/heads/develop","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andimoto%2Fkeebcu/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":36592706,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-08-06T04:43:03.162Z","status":"online","status_checked_at":"2026-08-13T02:00:06.325Z","response_time":111,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["3d-models","3d-printing","diy","electronics","keyboard","keyboard-layout","keyboard-simulator","mechanical-keyboard","openscad"],"created_at":"2025-02-27T06:01:18.974Z","updated_at":"2026-08-13T04:30:20.232Z","avatar_url":"https://github.com/andimoto.png","language":"OpenSCAD","funding_links":[],"categories":["OpenSCAD"],"sub_categories":[],"readme":"# keebcu - a customizer for 3d printable keyboard cases\n\n## Keyboard Customizer\n\n![](pics/keebcu_banner.png)\n\n### TL;DR usage\n```\n- clone this repo: git clone https://github.com/andimoto/keebcu.git\n- get OpenSCAD (I used 2021.01 and 2019.05 as appImages on Linux).\n- open the template_to_copy.scad file in OpenSCAD (or copy and rename it for your own custom layout)\n- uncomment 'mainCase(\u003clayout\u003e)' line at the end of the file to check what your are doing\n- start customizing your layout (place switch holes and set colors of your keycaps)\n- set screw holes where you want them or add even more of them (don't place screw holes near risers on the bottom)\n- set usb and pcb values\n- set or unset fRowSeparator to move F-Row up\n- depending on your printbed size, set where to cut the keyboard case ('cutAfterUnits' \u0026 'spacebarCut')\n- (optional) print critical parts of the case like space bar, parts with other stabilizers or usb and pcb area to test everything fits\n- generate all necessary model files you want to print by uncomment the proper module call or run the build.sh script\n- save as stl file, print and assemble!\n- checkout, build and flash firmware firmware https://github.com/andimoto/qmk_firmware/tree/andimoto-keyboards/keyboards/andimoto\n```\n\n#### Notes\nThis is based on *Parametric Cherry MX Mounting Plate for Mechanical Keyboards* by rsheldiii\nhttp://www.thingiverse.com/thing:573578\n\n## Description\nThis is a OpenSCAD Script for customizing a keyboard with a specific layout. It is designed to show a simulation on how the keyboard could look like by adding keycaps from KeyV2 project by rsheldiii. **So download OpenSCAD and start building your keyboard ;)!**\n\nI designed the keyboard to be printable on smaller 3d printer build plates like Prusa Mini. Therefore, it is possible to configure where the keyboard should be cut by the script with 'cutAfterUnits' variable. With this, it is possible to print a keyboard on smaller printers. The \"smallTKL\" design is the biggest layout I can print for now. If you have standard size printers like Prusa MK3 or Ender 3, etc, you may print normal TKL or even 100% layouts, eventually :).\nThe cut will always be around the switch holes. This gives good stability when glueing the parts together. Before glueing, the parts may need some sanding work, etc. Just check that both sides fit to each other without bigger space in between.\n(In theory, it should be possible to cut the keyboard into 3 or more parts. Therefore, new modules should be created and the pieces can be calculated by using difference function. This should enable printing bigger sizes like TKL or 100% on smaller printers)\n\nI glued the parts together with Revell CONTACTA glue because of its fine needle which is very practical. Any plastic glue will work. I broke one of my prototype boards for testing and they are pretty stable if glued properly :). I had to use some force for it. Just be sure the case parts are glued well together!\n\n#### Notes\nThis Keyboard Customizer for OpenSCAD is in \"usable\" state now, and you can customize your keyboard :). But there are still some imperfections and \"bugs\". I'm testing several layouts, like normal sized boards to macro pads, etc., from time to time.\n\nPlease double check measurements and fittings of your keyboard layout. You first may print some critical parts for testing the model.\nThe available keyboard models (in stl directory) should work and have been printed by me on a Prusa Mini. I can not give any guarantee on the correct functionality of this script.\n\n### Current designs available\n```\n- andimoto7583 (printed, documented wiring, firmware ProMicro)\n- andimoto6061 (not printed)\n- andimoto6064 (printed, documented wiring, firmware ProMicro)\n- andimoto_smallTKL (printed)\n- andimoto_smallTKL_iso (printed, documented wiring, firmware Teensy2)\n- andimoto75Q1iso (printed, documented wiring, firmware Teensy2)\n- andimotoTKL (not printed)\n- andimotoTKLiso (not printed)\n- macropad\n- numpad (firmware ProMicro)\n```\n\n__Note:__\n```\n7583 is -\u003e 75% layout with 83 switches.\n6061 is -\u003e 60% layout with 61 switches\nsmallTKL is TKL keyboard with one missing column\n75Q1iso -\u003e 75+% with Keychron Q1 Layout\nTKL - ten keyless\netc.\n```\n\n## Create your own keyboard layout\nYou can copy the file \"template_to_copy.scad\", rename it and start configuring your own layout. By uncomment the module calls at the end of the layout file, it is possible to create each part like \"right \u0026 left case\", \"right \u0026 left lid\", and also risers. It is also possible to create the whole keyboard itself in one piece if you can print bigger parts.\n\nIf you want to simulate the keyboard with keycaps and its colors, you can clone rsheldiii's KeyV2 Repository\n( https://github.com/rsheldiii/KeyV2 ) in parallel to this repository (thisRepo/..).\nThe SCAD script will include \"../KeyV2/includes.scad\". So just put it into the right directory.\nKeycap styles can be replaced in the module \"KeyboardSim('layout','simulation true/false')\" itself. See KeyV2 Wiki for available keycap profiles and documentation.\n\nSo you can change the colors and have a look at how your keyboard may look like!\nYou can add more keys into the array, but maybe the case will not fit automatically. Adjust 'height' and 'width' of the case, then.\nI will try to implement some more automatic functionalities from time to time.\n\nThe keyboard layout is defined in an array. In the template file it is called \"template_ansiUS_7583\" for example.\nIt describes (in Units):\n```\n    [ [xPos (Column) , yPos (Row)] , key size (in Unit), color ]\n```\n\nA unit is the size of the cutout for a cherry mx style switch. So, for example, a normal key is 1u,\nbackspace is 2u or spacebar is for example 6.25u. The size of the cutout for the switch is defined as 'lkey'.\n\nYou need to configure 'hight' and 'width' of the case in summury of units. For example: a 5x2 macropad would have width of 5 and a height of 2. These variables are necessary for calculating case sizes. Maybe this will be automated, as the information should be calculatable from the layout array.\n\nThe 'layout' array variable holds all integer values, including x.5 values in y direction (like numpad enter). Any else switch hole needs to be integrated in the function/module 'extraCutoutHook'. See ISO layout for an example. In this module any 'unaligned' switch hole can be integrated. Properly to that, the module 'extraKeySimHook' allows to integrade additional simulations, like special keycap simulation like IsoEnter, etc.\n\nAfter configuring your layout, you can adjust and modify the array 'screwHoleArray' to set the scew holes to the right place you want them to. The lid will also use this array, and thus, the screw holes will fit automaticaly to the case. The standard screw size is 3mm. The length depends on the case height, but I used 3x8mm cylinder head screws for my keyboards.\n\nIt is also possible to modify the pcb dimensions with the 'pcb'-values. Available sizes for Arduino Pro Micro and Teensy2 are included. Just change the comments to select the right one. I recommend to measure your pcb anyway and check dimensions. You can also move the whole pcb and cutout for usb connection in X direction by setting 'pcbShift' with a positive or negative value.\n\nGenerating risers for the keyboard can be selected with true/false and adjusted in width and length/depth. The colors of the risers and of cource the case and lid can be set after the screw hole array, at the end of the layout file.\n\nWith the variable 'fRowSeparator' you can select if the F-Row or the most upper Row (key[0][1]==0) will be moved upwards by a half key unit. See example 'andimotoTKL_iso'. When selecting 'true' some modules will call 'getExtraFRow()' function to get the value to move F-Row upwards.\n\nIf the keyboard should get a skirt you can set 'skirtSelect' to true. This enables calculation of an additional skirt around the keyboard. The parameters 'skirtX', 'skirtY' and 'caseRadius' define the skirts dimensions and the radius of the edges.\n\n\n## Build STL Files\nI added the script 'build.sh' for building all necessary parts of a keyboard at once. It reads 'conf/module-calls.conf' and places each call at the end of the keyboard file to render it and safe it in the stl directory. The output is saved in stl directory under the keyboard name.\n\n```\nNOTE: openscad command should be in $PATH or the environment variable OPENSCADBINPATH should be set to the OpenSCAD binary.\nFor example:\n                export OPENSCADBINPATH=/home/\u003cuser\u003e/\u003cpathToBinary\u003e/OpenSCAD-2021.01-x86_64.AppImage\n```\n\n```\nbuild.sh parameter:\n\n./build.sh \u003ckeyboard name\u003e \u003cconfig file\u003e\n    - keyboard name: name of the keyboard file without .scad extension\n    - (optional) config file: mymodules.conf (any file name is possible, just add the proper syntax)\n\nfor example:\n    ./build.sh andimotoTKL\n\n    or\n\n    /build.sh andimoto6061 myModuleCalls.conf\n```\n\n```\nNOTE: do not remove this line from the keyboard file and do not place this line in between the configuration variables\n\n              /* ###################### BUILD_LINE ########################*/\n```\n\n### build.sh description\nThe build.sh script checks if OpenSCAD binary is available. If not, user has to set OPENSCADBINPATH to point to the binary.\nThen it checks parameters. The 1st parameter is necessary and tells the name of the keyboard to build. The script then appends .scad extension automaticaly and uses the name for the output directory. No keyboard file name provided, will stop the script and return an error. Then it checks optional parameter of config file. Default config file will be used if no 2nd parameter is given.\n\nEach keyboard file has a separator at the end: \"BUILD_LINE\". The script greps for the line number of the separator and prints out the keyboard file until this line number. This output will be saved in an temporary directory which will be removed after build. Also, and output directory will be generated to save stl files in it.\nThen it places each module call from the config file at the end and calls OpenSCAD with the generated file to render the stl part. After this it places the next module call and generates the next stl, an so on.\n\nYou can add your own config file with the module calls you want and call the build.sh script with the config file as 2nd parameter. If no 2nd parameter is given, the script uses default config file 'conf/module-calls.conf'. The script greps for 'module' and separates the line at ':'. The last part will be used and appended to the created scad file.\n\n```\nconfig file syntax:\n  module1: mainCase(layout);\n  module2: lidR();\n  module3: myOwnModuleCall(withParam);\n```\n\n\n__This was only tested on Linux Mint 19.3 (Ubuntu 18.04) and Linux Mint 20 (Ubuntu 20.04).__\n\n\n## Parts needed\n- Printed Keyboard Parts\n  - Case\n  - Lids\n  - Risers\n- __Cherry MX Style switches__\n- __Costar Stabilizers__\n- __Fancy Keycaps__\n- __Teensy2 or Arduino Pro Micro__\n- 12x Cylinder Head Screws 3x8mm for lids\n- 20x Cylinder Head Screws 2.5x8mm for frame (if frame is selected)\n- Thin wires\n- 1N4148 diodes\n\n__Note:__ Parts can be bougth from ebay, amazon, etc. There is a great choice, but also many things are not available or in stock...\n\n\n## Assembly\n- Use sandpaper and a scalpel to clear the surface where parts get glued together. Double check if parts do not block each other.\n- Glue the two case parts together carefully. Place them on a flat surface and put some books on each side, then put some glue into the rills.\n- Wait until it is dry and put some more glue on it if needed.\n- After some drying time you can put in the switches (it is possible that this will bend the keyboard)\n  - Maybe you need to add more glue when keyboard is bended\n  - Switches which will have stabilizers should be set with the champfer downwards. Champfer is where LED placement is on the switch. Then the stabilizers have space inside the keycaps.\n- Solder switches and diodes together (see directory wiring_sheets)\n  - Checkout qmk guide for handwiring -\u003e https://beta.docs.qmk.fm/using-qmk/guides/keyboard-building/hand_wire\n- Solder the controller onto the keyboard matrix and place the pcb inside the pcb holder of the lid.\n- Build, flash and test your firmware (you can use this for testing https://keyboardchecker.com/)\n- Screw all parts together and place the risers if you need them (I recommend gluing the risers on the lids and then assembly them to the case)\n- If you use Costar Stabilizers, place the stabilizers downwards.\n- Have fun with your keyboard and start building your next keyboard ;)\n\n\n## Printing advises\n- Use brim for keyboard case. As there are many holes, the plate adhesion can be weak and the corners can rise up a little bit.\n- Be careful with color changes. If color change is only at height of case stabilizer (not keycap stabilizers!!) or screw holes, there can be problems when screwing on the lid. I broke the top part of the scrw cylinder where the color change had no good adhesion the other layers. I recommend to do the color change at the last layer of the keyboard cases plate as seen [here](https://github.com/andimoto/keebcu/tree/master/pics/img/screwHolesColorChange.jpg)\n  - Place color changes on the upper layer of the plate of the case. With this the walls have more adhesion on previous layers as seen [here](https://github.com/andimoto/keebcu/blob/master/pics/img/IMG_20210406_151457.jpg)\n  - Note: though this issue may be fixed with the oval spacers for the screws, double check the stability of the screw holes by printing a small prototyp with color change where you want it.\n- Notice, when placing the switches into the plate, the keyboard case will bend (mid up, sides down) there is the variable 'switchHoleTolerance' which you can modifiy if needed. This could reduce this kind of bending, but also make the switches more loose.\n- Normally the lid parts do not need any brim.\n- Check if your printer prints right-angled. I had issues with my Prusa Mini printing exact squared parts. More info [here](https://forum.prusaprinters.org/forum/how-do-i-print-this-printing-help/how-to-fix-bending-of-a-box/).\n\n## todo\n- create selectable space (in y direction) between function row and next rows (DONE: fRowSeparator)\n- provide pcb cutout for teensy 2.0 (DONE)\n- add delta variable for usb cutout and pcb-holder to move it. (DONE)\n- avoid case stabilizer for iso enter and numpad enter (optional)\n- add cherry style stabilizer!\n- add a selectable skirt to the case (DONE)\n- add parametric keebCase (in progress, should be already usable)\n- screw holes get crossed by case stabilizer (DONE / screw hole standoffs have also an oval shape now)\n- documentation for keebCase.scad (always in progress)\n- add build script (DONE)\n- other build system (make or docker, etc.)\n- test other keyboard layouts like random stuff or ten keys (always in progress)\n- make screw stems (spacers for screwing lid in) rotateable (DONE: screwSpacerRotation in degree)\n- move inner horizontal case stabilizers in vertical direction (DONE: set caseStabMov Var)\n\n## Wrist rest and Keyboard Case\nFor each keyboard a wrist rest can be created with the model file wrist.scad. The stl-directory contains a wrist rest for each keyboard which can be printed as you want.\nFor transportation I designed a case which can be customized in size to fit your keyboard. The case has placeholders for little magnets and gets locked by some kind of bones :).\n\n__Attention: The Keyboard case is still in development state. I just printed some smaller prototypes. But it fits well so far. Need to check magnets.__\n\n\n## Firmware\nFor firmware please see https://github.com/andimoto/qmk_firmware/tree/andimoto-keyboards/keyboards/andimoto\n\nThe qmk_firmware fork contains everything to build the firmware for the provided boards *andimoto7583* and *andimoto_smallTKL*.\n\n**Attention: The Pro Micro is \"normally\" suited for layouts with up to 65 switches. I was lazy and did not want to modify the pcb cutout to fit in the teensy 2.0 at that time. So I removed both TX/RX Leds from the pro micro and had 2 extra pins available (pcb may be damaged!!). This enables layouts with up to 84 switches :). Also qmk_layout needs to be squeezed together.**\n\n*I will also add a schematic for soldering the keyboard matrix and the Pro Micro of the available boards.*\n\nAvailable wiring diagrams for:\n- andimoto6064 with Arduino Pro Micro\n- andimoto7583 with Arduino Pro Micro\n- andimotoSmallTKL_iso with Teensy 2.0\n- andimoto75Q1iso with Teensy 2.0\n\nThe Arduino Pro Micro clones are very cheap so I used them. More money for fancy keycaps ;).\n\n## Model Gallery\n*andimoto7583*\n![](pics/75er001.png)\n\n*andimoto smallTKL iso*\n![](pics/75er004_1.png)\n\n*andimoto smallTKL*\n![](pics/andimoto_smallTKL.png)\n\n*andimoto smallTKL_iso*\n![](pics/andimoto_smallTKL_isoBlue.png)\n\n*andimoto6061*\n![](pics/75er004_2.png)\n\n*andimotoTKL*\n![](pics/andimotoTKL.png)\n\n*andimotoTKLiso*\n![](pics/andimotoTKLiso.png)\n\n*andimoto75Q1iso*\n![](pics/andimoto75Q1-iso.png)\n\n![](pics/75er013.png)\n\n![](pics/numpad_render.png)\n\n![](pics/75er002.png)\n\n![](pics/75er003.png)\n\n![](pics/75er004.png)\n\n![](pics/75er005.png)\n\n![](pics/75er006.png)\n\n![](pics/75er007.png)\n\n*andimoto smallTKL_iso case*\n![](pics/andimoto_smallTKL_iso.png)\n\n![](pics/75er009.png)\n\n![](pics/75er010.png)\n\n![](pics/keebCase.png)\n\n![](pics/keebCaseLocks.png)\n\n\u003cbr\u003e\n\n### -------- ___Reality___ --------\n\n![](pics/pics/keebcu_017.JPG)\n\n![](pics/pics/keebcu_013.JPG)\n\n![](pics/pics/keebcu_014.JPG)\n\n![](pics/pics/keebcu_015.JPG)\n\n![](pics/pics/keebcu_004.JPG)\n\n![](pics/pics/keebcu_005.JPG)\n\n![](pics/pics/keebcu_009.JPG)\n\n![](pics/img/IMG_20210318_140604.jpg)\n\n![](pics/img/IMG_20210318_140627.jpg)\n\n![](pics/img/IMG_20210406_151424.jpg)\n\n![](pics/img/IMG_20210406_151405.jpg)\n\n![](pics/img/IMG_20210406_151326.jpg)\n\n![](pics/pics/andimoto75Q1iso-002.jpg)\n\n![](pics/pics/andimoto75Q1iso-006.jpg)\n\n![](pics/pics/andimoto75Q1iso-007.jpg)\n\n![](pics/pics/numpad_002.jpg)\n\n![](pics/pics/macro001.JPG)\n\n![](pics/pics/macro003.JPG)\n*5x2 macropad printed with fuzzing on outer walls*\n![](pics/pics/macro004.JPG)\n\n### -------- ___Development Process___ --------\n\n![](pics/img/IMG_20201215_085124.jpg)\n\n![](pics/img/IMG_20201224_110407.jpg)\n\n![](pics/img/IMG_20210111_151044.jpg)\n\n![](pics/img/IMG_20201215_085352.jpg)\n\n![](pics/img/IMG_20210111_150655.jpg)\n\n![](pics/pics/keebcu_016.JPG)\n\n\n\n\n\n# LICENSE\n\n\u003ca rel=\"license\" href=\"http://creativecommons.org/licenses/by-sa/4.0/\"\u003e\u003cimg alt=\"Creative Commons Lizenzvertrag\" style=\"border-width:0\" src=\"https://i.creativecommons.org/l/by-sa/4.0/88x31.png\" /\u003e\u003c/a\u003e\u003cbr /\u003eDieses Werk ist lizenziert unter einer \u003ca rel=\"license\" href=\"http://creativecommons.org/licenses/by-sa/4.0/\"\u003eCreative Commons Namensnennung - Weitergabe unter gleichen Bedingungen 4.0 International Lizenz\u003c/a\u003e.\n\n\u003ca rel=\"license\" href=\"http://creativecommons.org/licenses/by-sa/4.0/\"\u003e\u003cimg alt=\"Creative Commons License\" style=\"border-width:0\" src=\"https://i.creativecommons.org/l/by-sa/4.0/88x31.png\" /\u003e\u003c/a\u003e\u003cbr /\u003eThis work is licensed under a \u003ca rel=\"license\" href=\"http://creativecommons.org/licenses/by-sa/4.0/\"\u003eCreative Commons Attribution-ShareAlike 4.0 International License\u003c/a\u003e.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fandimoto%2Fkeebcu","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fandimoto%2Fkeebcu","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fandimoto%2Fkeebcu/lists"}