{"id":19312329,"url":"https://github.com/niw/mfk60","last_synced_at":"2025-04-12T11:23:00.614Z","repository":{"id":219110249,"uuid":"748194886","full_name":"niw/mfk60","owner":"niw","description":"60% ANSI Layout Split Keyboard. mfk60 is My First Keyboard, 60%.","archived":false,"fork":false,"pushed_at":"2024-01-29T06:26:04.000Z","size":3650,"stargazers_count":7,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-03-26T06:11:26.185Z","etag":null,"topics":["keyboard","kicad","qmk"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/niw.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null}},"created_at":"2024-01-25T13:27:51.000Z","updated_at":"2025-02-06T15:49:58.000Z","dependencies_parsed_at":"2024-01-25T14:45:46.758Z","dependency_job_id":"f405cea0-b483-49d5-850d-a0ee6208db58","html_url":"https://github.com/niw/mfk60","commit_stats":null,"previous_names":["niw/mfk60"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/niw%2Fmfk60","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/niw%2Fmfk60/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/niw%2Fmfk60/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/niw%2Fmfk60/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/niw","download_url":"https://codeload.github.com/niw/mfk60/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248558496,"owners_count":21124297,"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":["keyboard","kicad","qmk"],"created_at":"2024-11-10T00:34:18.132Z","updated_at":"2025-04-12T11:23:00.588Z","avatar_url":"https://github.com/niw.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"mfk60\n=====\n\n60% ANSI Layout Split Keyboard. mfk60 is My First Keyboard, 60%.\n\n![mfk60](Resources/mfk60.png)\n\n- A split keyboard that has 60% ANSI Layout.\n- Swappable Gateron Low-Profile MX keycap compatible switches.\n- Thin design as MacBook Pro.\n- USB-C interface.\n- Fully customizable with [QMK firmware](https://qmk.fm/) and\n  [VIA](https://www.caniusevia.com/) configuration.\n\n\nOverview\n--------\n\nmfk60 is built with 4 layered boards, the top plate, middle plate, primary\nPCB where the entire circuit exists, and bottom plate.\n\nEach board is designed in separated KiCad project due to limitation of\nKiCad which project can have only one board design.\nEach layer board design contains both left and right designs.\n\n- `sym-lib-table`, `fp-lib-table` are shared for additional symbol and\n  footprint for all PCBs.\n- `Library` contains additional symbols and footprints to KiCad.\n- `mfk60.kicad_*` is the primary PCB of the keyboard.\n- `mfk60_*_plate.kicad_*` are the each board layered with\n  the primary PCB.\n- `bin` contains tooling scripts.\n- `mfk60_keyboard-layout.json` is key layout file for\n  [Keyboard Layout Editor](http://www.keyboard-layout-editor.com/).\n\n\nPhotos\n------\n\n![mfk60 1](Resources/mfk60-1.jpg)\n![mfk60 2](Resources/mfk60-2.jpg)\n![mfk60 3](Resources/mfk60-3.jpg)\n![mfk60 4](Resources/mfk60-4.jpg)\n\n\nBuild\n-----\n\nSince mfk60 is built with multiple KiCad projects, there are tooling\nscripts to make the process easier.\n\n### Overview\n\n- `mfk60_keyboard-layout.json` to set the key layout.\n- `make apply_layout` to apply the key layout to the primary PCB.\n- `bin/prepare_plate_board.py` to sync the primary PCB and\n  other layered board.\n- `make panelize` to produce panelized boards that has frame and\n  mouse bites.\n- Produce Gerber files and BOM manually from KiCad projects for each board.\n\n### Prerequisite\n\nThe board and tooling scripts are implemented by using\n[KiCad](https://www.kicad.org/) 7.0.10 on macOS.\n\nPlease use KiCad 7.0.10 (or later, which is not tested.)\n\nIt should work on the other platform, however, you may need to use\n`KICAD_PYTHON_PATH` to set where KiCad `python` exists\nif it's not macOS or KiCad is installed on the different path\nas like following.\n\n```bash\nenv KICAD_PYTHON_PATH=/path/to/kicad/python bin/python.sh bin/update_plate_board.py\n```\n\nEach board is using symbols and footprints served from\n[KiKit](https://github.com/yaqwsx/KiKit), which is referenced from\n`.venv` library installation.\nThus, to open these PCB files, first need to install KiKit library.\nTo install KiKit, simply run `bin/kikit.sh`.\n\n### Set key layout\n\nEdit key layout on [Keyboard Layout Editor](http://www.keyboard-layout-editor.com/),\nexport the layout to `mfk60_keyboard-layout.json` then\nuse `apply_layout` goal to sync `mfk60_keyboard-layout.json`\nto the primary PCB.\n\n```bash\nmake apply_layout\n```\n\nOf course, it will invalidate existing PCB design, thus changing key\nlayout causes A LOT of work downstream.\n\n### Sync layered boards\n\nTo sync Edge Cut and footprint positioning between the primary PCB and\nthe layered boards, use `bin/update_plate_board.py` with `bin/python.sh`.\n\n```bash\nbin/python.sh bin/update_plate_board.py\n```\n\n### Add frame and panelize\n\nTo produce final panelized projects with frame, use `panelize` make goal.\n\n```bash\nmake panelize\n```\n\nThis goal produces `mfk60*_panelized.kicad_*` files.\nIt adds frame, mouse bites and moves `JLCJLCJLCJLC` text onto the frame,\nwhere is replaced with order number by [JLCPCB](https://jlcpcb.com/).\n\nPanelized projects are final data that can be used to produce production\nGerber data. Recommend to use\n[Fabrication Toolkit](https://github.com/bennymeg/JLC-Plugin-for-KiCad)\nfor JLCPCB but not limited ot it.\n\n\nKiKit\n-----\n\nDue to multiple reasons as described below, this project is using\n[forked version of KiKit](https://github.com/niw/KiKit/tree/v1.4.0_with_workaround).\n`bin/kikit.sh` is automatically installs forked version of it in `.venv`,\ntherefore it's opaque to you.\n\n### KiCad and Python Bindings\n\nAs of day this document is written, KiCad 7.0.10 and prior version has\na not well-known \"behavior\" (or simply say, a bug) in its Python binding\ngenerated by [Swig](https://www.swig.org/).\n\nDue to this issue, released KiKit will not work properly and may crash.\nThe forked version of it contains a workaround for this behavior.\n\n### Multiple Polygons\n\nEach layered board has both left and right ones, therefore each outline\nis represented as multiple polygons.\nHowever, original KiKit is not considering such multi polygon design and\nfailed to extract interior polygons which causes an error while\npanelizing such data.\n\n\nFirmware\n--------\n\nUse [forked QMK branch](https://github.com/niw/qmk_firmware/tree/mfk)\nwhere contains the keyboard configuration.\n\n```bash\nqmk compile -kb niw/mfk60 -km default\n```\n\nIt also works with VIA. Use `via` keymap and load\n[`via.json`](https://github.com/niw/qmk_firmware/blob/mfk/keyboards/niw/mfk60/via.json)\nfor a draft definition in design tab enabled in settings.\n\n```bash\nqmk compile -kb niw/mfk60 -km via\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fniw%2Fmfk60","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fniw%2Fmfk60","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fniw%2Fmfk60/lists"}