{"id":17053124,"url":"https://github.com/bschwind/key-ripper","last_synced_at":"2025-04-12T21:30:00.695Z","repository":{"id":37424297,"uuid":"502496170","full_name":"bschwind/key-ripper","owner":"bschwind","description":"A keyboard personalized for myself, designed in KiCad, with custom firmware and a case, both written in Rust. Can sit on top of a macbook keyboard.","archived":false,"fork":false,"pushed_at":"2025-03-06T03:12:41.000Z","size":37816,"stargazers_count":260,"open_issues_count":9,"forks_count":15,"subscribers_count":4,"default_branch":"main","last_synced_at":"2025-04-04T01:08:45.917Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/bschwind.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE-APACHE","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}},"created_at":"2022-06-12T01:55:33.000Z","updated_at":"2025-03-14T11:10:59.000Z","dependencies_parsed_at":"2023-11-07T15:31:51.458Z","dependency_job_id":"9df42e59-1144-4deb-8b3d-6458b764afd8","html_url":"https://github.com/bschwind/key-ripper","commit_stats":null,"previous_names":[],"tags_count":4,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bschwind%2Fkey-ripper","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bschwind%2Fkey-ripper/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bschwind%2Fkey-ripper/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bschwind%2Fkey-ripper/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/bschwind","download_url":"https://codeload.github.com/bschwind/key-ripper/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248634796,"owners_count":21137118,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":[],"created_at":"2024-10-14T10:11:23.727Z","updated_at":"2025-04-12T21:30:00.645Z","avatar_url":"https://github.com/bschwind.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# key-ripper\n\nA keyboard personalized for myself, designed in KiCad, with custom firmware written in Rust.\n\n![key-ripper](https://github.com/user-attachments/assets/ba4140b2-fec3-4083-b308-aad899887331)\n![feet](https://github.com/user-attachments/assets/78384776-8d7e-42a3-b9e4-88de4bbfe788)\n![macbook-keyboard](https://github.com/user-attachments/assets/e06ab6d2-830b-4dc9-9492-fdda7a4610b0)\n![usb-c](https://github.com/user-attachments/assets/a858e3f2-c250-40af-a0dd-20148ce827b8)\n\nThe story behind this board can be found in [this reddit post](https://www.reddit.com/r/MechanicalKeyboards/comments/vtlujd/i_built_a_keyboard_pcb_and_wrote_firmware_for_it/).\n\nI also gave a (time-constrained) talk on making this keyboard which you can view [here](https://www.youtube.com/watch?v=x7LQevYn7d0).\nSadly I didn't get to cover everything I wanted to talk about when it comes to embedded Rust, but I hope you find it entertaining.\n\n## Main Features and Requirements\n\n* Be cheap to manufacture (can easily be ordered and fabricated by JLCPCB, uses an RP2040)\n* USB C Connector\n* Have dedicated function keys\n* Reduce friction changing between a macbook keyboard and this one\n* Stay relatively compact\n* Full sized arrow keys with a gap (on the left and right) for easily finding the up arrow without looking\n* No right shift key (this allows for the arrow keys to sit below the Enter key, and I never use right shift)\n* Support for screw-in stabilizers first and foremost, along with snap-in stabilizers, and plate-mounted stabilizers when using a top plate\n* Easy to assemble - this will apply once I design a case for it\n* Firmware written in Rust, debuggable with knurling-rs\n\n## Setup\n\n* Order a PCB with the production files from the [latest release](https://github.com/bschwind/key-ripper/releases).\n* When you receive the board, plug it in via USB C and follow [the instruction to flash the firmware](https://github.com/bschwind/key-ripper/blob/main/firmware/README.md).\n\n## Current Version (v0.3.1)\n\n[v0.3.1 PCBWay Production Files](https://github.com/bschwind/key-ripper/releases/tag/v0.3.1)\n\nVersion v0.3.1 adds an ESD protector on the USB connector, and was kindly sponsored and manufactured by PCBWay.\n\n![pcbway-matte-black-rp2040](https://github.com/user-attachments/assets/45f30e6b-88ba-49b9-90b5-f04b87f8592b)\n\n![pcbway-matte-black-usb-c](https://github.com/user-attachments/assets/54419f86-dc85-48d1-8f8a-79268ae9ea6c)\n\n## v0.3\n\n[v0.3 JLCPCB Production Files](https://github.com/bschwind/key-ripper/releases/tag/v0.3)\n\nVersion 0.3 adds some iterative hardware improvements over v0.2:\n\n* Added support for threaded inserts on the PCB\n* Added pass-through holes for M2 hex spacers\n* Better impedance matching on the USB lines\n* Added a cross-hatch copper pour to reduce warping compared to a solid copper pour\n* Added some test points on the board\n* Moved many components to a 1608 metric size for easier soldering\n* Added an optional TRRS connector footprint for connecting to a debug probe\n* Switched to a much smaller QSPI flash chip\n* Added fancier patterns on the top and bottom plates\n\n## v0.2\n\n[v0.2 JLCPCB Production Files](https://github.com/bschwind/key-ripper/releases/tag/v0.2)\n\nVersion 0.2 improves upon some of the issues in v0.1, with some intentional choices that could be seen as a downgrade:\n\n* Added a copper pour on both sides for a flatter PCB\n* Shifted a few components away from the screw-in stabilizer holes to avoid screw washers touching the components\n* Fixed some silkscreens for the reset and USB boot buttons\n* Fixed the alignment of the F5 key\n* **Controversial** - Changed the switch footprint to normal MX soldered switches instead of Kailh hotswap footprints. This allows for simpler boards that don't require a top plate.\n\n## Version v0.1\n\nVersion 0.1 _works_ but there are some issues:\n\n* The PCB warps during SMT reflow because there is a copper pour on only one side\n* The silkscreens are not labeled well (SW1, SW2, SW3, etc. instead of Q, W, E, R, etc.)\n* The F5 key is slightly more to the left of the F6 key than it should be, which leads to incompatible top plates between v0.1 and v0.2\n\nVersion 0.1 uses Kailh hotswap sockets. Combined with the top plate, this is good for trying out different switches, but adds complexity\nin the build process. It requires more parts, and I had to 3D print 3.4mm M2 spacers.\n\n[v0.1 JLCPCB Production Files](https://github.com/bschwind/key-ripper/releases/tag/v0.1)\n\n![PCB Front](https://i.imgur.com/pEsHZqL.jpeg)\n![PCB Back](https://i.imgur.com/iWDIUL9.jpeg)\n\n## Production Files\n\nFor every PCB fabrication order, I make a github release and upload the files I used to make the order.\n\nYou can see a list of releases [here](https://github.com/bschwind/key-ripper/releases).\n\n## Create a Gerber File\n\nFor most PCB fabrication shops, they expect gerber files, which are essentially files that describe the layout of pads/traces/geometry for each layer in a PCB. They also contain the drill locations if your PCB has any holes. All these layers should be placed in a directory and compressed to a zip file for uploading.\n\nTo create a gerber zip in KiCAD:\n\n* Open up PCBNEW (KiCAD's PCB design tool)\n* Select `File` -\u003e `Plot`\n* Select the following layers:\n    * F.Cu\n    * B.Cu\n    * F.Paste\n    * B.Paste\n    * F.SilkS\n    * B.SilkS\n    * F.Mask\n    * B.Mask\n    * Edge.Cuts\n* Leave all the other settings to their defaults\n* Output to a directory named `gerber` (this is just convention, any name will do)\n* Click `Plot`\n* Next click `Generate Drill Files` with an `Excellon` drill file format, and a `Gerber` map file format\n* Make sure the `Drill Units` are in `Millimeters`\n* Output to the same directory you did for the previous gerber layers\n* Click `Generate Drill File`\n* Zip the `gerber` directory into a `gerber.zip` file and it's ready to upload!\n\n**Note**: Check the PCB vendor's website for special KiCAD instructions, as they sometimes prefer certain settings when exporting.\n\nOSHPark can directly accept `*.kicad_pcb` files so you don't need to export gerbers when ordering there.\n\n## Create a Bill of Materials (for JLCPCB)\n\nFrom the schematic viewer:\n\n* Click the \"BOM\" button in the upper right toolbar\n* Use the `bom_csv_grouped_by_value_with_fp`\n* The output file won't have a `.csv` extension, so add it\n\nModify the CSV file:\n* Rename the following columns:\n    * `Ref` -\u003e `Designator`\n    * `Qnty` -\u003e `Quantity`\n* Delete the following columns:\n    * `Cmp name`\n    * `Description`\n    * `Vendor`\n* Add the following column:\n    * `LCSC Part #`\n* Remove any part rows you don't need to populate\n* For each part, look it up on `jlcpcb.com/parts` and copy over both the footprint and the LCSC part number into their respective columns\n\nIn general, try to use as many \"basic parts\" as you can from JLCPCB. Each \"extended part\" costs an extra 300 yen per board.\n\n## Create the Position File (for JCLPCB's pick-and-place machines)\n\nFrom KiCad's PCB design tool:\n\n* `File` -\u003e `Fabrication Outputs` -\u003e `Footprint Position (.pos) File`\n* `Format`: `CSV`\n* `Units`: `Millimeters`\n* `Files`: `Single file for board`\n* `Include footprints with SMD pads even if not marked Surface Mount`: `checked`\n* Click `Generate Position File`\n\nModify the CSV file:\n\n* Rename the following columns:\n    * `Ref` -\u003e `Designator`\n    * `Qnty` -\u003e `Quantity`\n    * `Val` -\u003e `Value`\n    * `PosX` -\u003e `Mid X`\n    * `PosY` -\u003e `Mid Y`\n    * `Rot` -\u003e `Rotation`\n    * `Side` -\u003e `Layer`\n\nWhen uploading to JLCPCB, you may need to modify the rotation values. It will show you red dots on pin 1 for the relevant components, as well as a red `+` for components with polarity, so double check against your silkscreen and placement. Positive rotation goes counter-clockwise, so if you need to rotate a part counter-clockwise one turn, add 90 degrees. Subtract 90 to rotate one turn clockwise, and modulo 360 degrees to keep the overall rotation value positive.\n\n## Firmware Debugging\n\nSet the `DEFMT_LOG` environment variable.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbschwind%2Fkey-ripper","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbschwind%2Fkey-ripper","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbschwind%2Fkey-ripper/lists"}