{"id":13961680,"url":"https://github.com/KevinVitale/CartBoy","last_synced_at":"2025-07-21T06:31:33.138Z","repository":{"id":70157644,"uuid":"187077683","full_name":"KevinVitale/CartBoy","owner":"KevinVitale","description":"Native macOS client for Gameboy cartridge readers \u0026 writers","archived":true,"fork":false,"pushed_at":"2022-12-23T16:29:53.000Z","size":3267,"stargazers_count":61,"open_issues_count":2,"forks_count":5,"subscribers_count":3,"default_branch":"master","last_synced_at":"2024-11-28T07:34:36.698Z","etag":null,"topics":["gameboy","swift","usb","usb-serial-controller"],"latest_commit_sha":null,"homepage":"https://shop.insidegadgets.com/product/gbxcart-rw/","language":"Swift","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/KevinVitale.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}},"created_at":"2019-05-16T18:03:53.000Z","updated_at":"2024-08-02T15:26:14.000Z","dependencies_parsed_at":null,"dependency_job_id":"b1842d12-5df4-46b0-a0bf-c032fa6d9d3c","html_url":"https://github.com/KevinVitale/CartBoy","commit_stats":null,"previous_names":[],"tags_count":8,"template":false,"template_full_name":null,"purl":"pkg:github/KevinVitale/CartBoy","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KevinVitale%2FCartBoy","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KevinVitale%2FCartBoy/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KevinVitale%2FCartBoy/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KevinVitale%2FCartBoy/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/KevinVitale","download_url":"https://codeload.github.com/KevinVitale/CartBoy/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KevinVitale%2FCartBoy/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":266253526,"owners_count":23900051,"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":["gameboy","swift","usb","usb-serial-controller"],"created_at":"2024-08-08T17:01:21.135Z","updated_at":"2025-07-21T06:31:32.690Z","avatar_url":"https://github.com/KevinVitale.png","language":"Swift","funding_links":[],"categories":["Swift"],"sub_categories":[],"readme":"CartBoy [is no longer under active development](https://discord.com/channels/513663955562921984/586059097925746719/1055884526527713280). I'd recommend using [FlashGBX](https://github.com/lesserkuma/FlashGBX).\r\n\r\nThanks for all the support.\r\n\r\n\u003chr /\u003e\r\n# Features\r\n\r\n- [x] Native macOS 🎉\r\n- [x] Quick transfer speeds 🚀\r\n- [x] Copy ROMs from your physical cartridges 📦\r\n- [x] Write ROMs to your own flash carts ⚡️\r\n- [x] Backup / Restore / Erase game save files 👾\r\n\r\n# CartBoy\r\n\u003cimg width=600 src=\"./Misc/Readme/CartBoy-Promo.png\" /\u003e\r\n\r\n# CartKit\r\n`CartKit` is a companion framework, used by _CartBoy_, that\r\ndefines general device support and functionality.\r\n\r\n#### `SerialDevice\u003cGBxCart\u003e`\r\nThe `SerialDevice\u003cGBxCart\u003e` is the cart reader device from\r\n`insidgeGadgetsController` that is capable of the following:\r\n\r\n - Reading the cartridge header; and,\r\n - copying the cartridge ROM; and,\r\n - backing up save data (if supported); and,\r\n - restoring save data (if supported); and,\r\n - deleting save data (if supported); and,\r\n - flashing new ROMs to compatible cartridges; and,\r\n - erasing existing ROMs from compatrible cartridges.\r\n\r\nA `SerialDevice\u003cGBxCart\u003e` cannot be instantiated directly; instead\r\nuse `open` on `GBxCart` and you'll receive an isntance.\r\n\r\n##### Read cartridge header\r\nSimply `open` a `SerialDeviceSession`, then read the `header`\r\n(checking the `Result`):\r\n\r\n```swift\r\nGBxCart.open { serialDevice in\r\n  switch serialDevice.header(forPlatform: GameboyClassic.self) {\r\n  case .success(let header) :print(header)\r\n  case .failure(let error)  :print(error)\r\n  } \r\n}\r\n\r\n```\r\n\r\n##### Copy a cartridge's ROM\r\nSome functions let you get updates on the progress of an operation\r\n(such as when copying a cartridge to your Mac). In these cases **you\r\nmust call the operation from queue other than the main one**.\r\n\r\nIf you omit providing a progress callback, the operation blocks the\r\nmain thread; this maybe useful for a number of scenarios (such as unit\r\ntests).\r\n\r\n```swift\r\nGBxCart.open { serialDevice in\r\n  try {\r\n    let cartridge = serialDevice\r\n       .readClassicCartridge (progress: { print($0.fractionCompleted) })\r\n       .write                (toDirectoryPath: \"/Users/kevin/Desktop\")\r\n       .check                (MD5: \"b259feb41811c7e4e1dc20167985c84\") /* Super Mario Land? */\r\n       .get()\r\n     print(cartridge)\r\n  } catch {\r\n     print(\"\\(error)\")\r\n  }\r\n}\r\n```\r\n\r\n# Acknowledgements\r\nSpecial thanks to:\r\n- armadsen\r\n- insideGadgets\r\n\r\n# License\r\n```\r\nCopyright (c) 2019 Kevin J. Vitale\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy \r\nof this software and associated documentation files (the \"Software\"), to deal \r\nin the Software without restriction, including without limitation the rights \r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \r\nof the Software, and to permit persons to whom the Software is furnished to do so, \r\nsubject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in all \r\ncopies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \r\nINCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \r\nPARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \r\nHOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \r\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE \r\nOR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n```\r\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FKevinVitale%2FCartBoy","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FKevinVitale%2FCartBoy","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FKevinVitale%2FCartBoy/lists"}