{"id":19690506,"url":"https://github.com/edgetx/buddy","last_synced_at":"2026-03-08T01:19:42.575Z","repository":{"id":37027860,"uuid":"438770912","full_name":"EdgeTX/buddy","owner":"EdgeTX","description":"The next generation tool for EdgeTX. A cross platform app, with browser compatibility.","archived":false,"fork":false,"pushed_at":"2025-04-26T05:12:21.000Z","size":76794,"stargazers_count":46,"open_issues_count":15,"forks_count":27,"subscribers_count":6,"default_branch":"main","last_synced_at":"2025-04-28T22:26:23.287Z","etag":null,"topics":["dfu","edgetx","electron","firmware","flashing","tool","web-filesystem","webusb"],"latest_commit_sha":null,"homepage":"https://buddy.edgetx.org","language":"TypeScript","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/EdgeTX.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","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,"dei":null,"publiccode":null,"codemeta":null},"funding":{"open_collective":"edgetx"}},"created_at":"2021-12-15T20:57:09.000Z","updated_at":"2025-04-27T10:15:45.000Z","dependencies_parsed_at":"2024-05-23T01:30:28.442Z","dependency_job_id":null,"html_url":"https://github.com/EdgeTX/buddy","commit_stats":{"total_commits":254,"total_committers":14,"mean_commits":"18.142857142857142","dds":"0.11417322834645671","last_synced_commit":"028537a1d73620e6a1d1b4d7d87ee5484bb1ed7b"},"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EdgeTX%2Fbuddy","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EdgeTX%2Fbuddy/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EdgeTX%2Fbuddy/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EdgeTX%2Fbuddy/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/EdgeTX","download_url":"https://codeload.github.com/EdgeTX/buddy/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":251465372,"owners_count":21593871,"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":["dfu","edgetx","electron","firmware","flashing","tool","web-filesystem","webusb"],"created_at":"2024-11-11T19:05:46.776Z","updated_at":"2026-01-07T06:26:02.739Z","avatar_url":"https://github.com/EdgeTX.png","language":"TypeScript","funding_links":["https://opencollective.com/edgetx"],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cimg height=\"200\" src=\".github/media/header.png\" alt=\"EdgeTX Buddy logo\"\u003e\n\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://github.com/EdgeTX/buddy/actions\"\u003e\n    \u003cimg src=\"https://github.com/EdgeTX/buddy/workflows/pipeline/badge.svg\" alt=\"Pipeline status\"\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://codecov.io/gh/EdgeTX/buddy\"\u003e\n    \u003cimg alt=\"Coverage\" src=\"https://codecov.io/gh/EdgeTX/buddy/branch/main/graph/badge.svg?token=B5ZM49925A\"\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://github.com/prettier/prettier\"\u003e\n    \u003cimg alt=\"code style: prettier\" src=\"https://img.shields.io/badge/code_style-prettier-ff69b4.svg?style=flat-square\"\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://github.com/storybooks/storybook\" target=\"_blank\"\u003e\n    \u003cimg src=\"https://raw.githubusercontent.com/storybooks/brand/master/badge/badge-storybook.svg\"\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\n\u003e Helping you on your journey to EdgeTX\n\n- [Use it online](https://buddy.edgetx.org/)\n- [Download the App](https://github.com/EdgeTX/buddy/releases/tag/latest)\n\n## Development\n\n### Prerequisites\n\nThis application uses `node-usb` when running in electron. In order to compile the bindings\nsome build libraries are required depending on platform. For MacOS and Windows, these should\nalready be built in.\n\nLinux\n\n```bash\n$ sudo apt-get install build-essential libudev-dev\n```\n\nThis software is designed to run on `node@20` which can be installed with [`Fast Node Manager`](https://github.com/Schniz/fnm)\n\n### Commands\n\nEnable or install yarn package manager\n\n```bash\n# For Node.js \u003c16.10\n$ npm i -g corepack\n\n# For Node.js \u003e=16.10\n$ corepack enable\n```\n\nInstall deps\n\n```bash\n$ yarn\n```\n\nDeveloping\n\n```bash\n# Start electron and web environments in watch mode\n$ yarn start\n\n# Start web environment only\n$ yarn start:web\n\n# Storybook component environment\n$ yarn storybook\n```\n\nBuilding\n\n```bash\n# Build and pack electron app (outputs renderer assets too)\n$ yarn build\n\n# Compile only web environment\n$ yarn compile:web:production\n```\n\nRun tests\n\n```bash\n$ yarn test\n```\n\nRun e2e tests - requires web or app to be built\n\n```bash\n# Web app tests\n$ yarn e2e:web\n# Electron app tests\n$ yarn e2e:app\n```\n\nLint\n\n```bash\n$ yarn lint:all\n\n# Or yarn lint \u003cfile\u003e\n```\n\nFormat (this codebase has enforced formatting with prettier)\n\n```bash\n$ yarn fmt\n```\n\nExtract new translation strings\n\n```bash\n$ yarn extract-locales\n```\n\n### Translations\n\nTranslation strings are stored in the [`./locales`](./locales/) directory.\nTo contribute a language which doesn't already exist:\n\n1. Add the ISO code to the [`./locales/languages.json`](./locales/languages.json)\n1. Extract the strings to the new language files (`yarn extract-locales`)\n1. Translate the strings for their equivilent meanings\n\nThe namespaces (common, flashing, etc), provide some context for what the strings relate to\n\n### Structure\n\nThe application is split into different contexts\n\n- **Main**: Electron Main Process - initialising the electron application, runs the backend when running in electron. Runs in a Node.JS context\n- **Renderer**: React Web Application - Runs in browser or electron renderer process. Shows different UI depending on context.\n- **Shared**: Multi-Context code - Designed to run in any environment. Imported by both `Main` or `Renderer`\n- **Webworker**: WebWorker Context - `.bootstap` files start-up `.worker` files. Code designed only to run in WebWorker contexts.\n\n### Communication\n\nThis application makes use of [`GraphQL`](https://graphql.org/) to request data across process boundary. Meaning that the `renderer` process\nis always entirely separated from the GraphQL execution environment.\n\n[Apollo Bus Link](https://github.com/freshollie/apollo-bus-link) is used to facilitate the communication between the GraphQL execution process\nin Electron or Webworker environments.\n\n\u003cp align=\"center\"\u003e\n  \u003cimg height=\"200\" src=\"https://github.com/freshollie/apollo-bus-link/raw/main/.github/media/electron.png\" alt=\"Electron architecture\"\u003e\n  \u003cimg height=\"200\" src=\"https://github.com/freshollie/apollo-bus-link/raw/main/.github/media/webworker.png\" alt=\"Webworker architecture\"\u003e\n\u003c/p\u003e\n\n#### Exceptions\n\nWithin WebWorker contexts, there are some browser functions which cannot be invoked within WebWorker contexts\nand so have to be invoked in the main process. In order to keep things in Electron and Web processes similar\na set of [Cross Boundary Communication](src/webworker/crossboundary) functions have been defined.\n\n## Acknowledgements\n\nA massive thank you to the software which makes all of this possible. Specifically:\n\n- [Flipper Devices](https://flipperzero.one/) for their opensource [DFU library](https://github.com/flipperdevices/webdfu) which runs on [Web USB](https://wicg.github.io/webusb/)\n- [Rob Moran](https://github.com/thegecko) for their work on [`node-usb`](https://github.com/node-usb/node-usb) to support WebUSB within Node environments\n- [Jimmy Wärting](https://github.com/jimmywarting) for creating a [pollyfill](https://github.com/jimmywarting/native-file-system-adapter) of web filesystem API for Node environments\n\n## Screenshots\n\n\u003cimg height=\"400\" src=\".github/media/flashing.png\" alt=\"Screenshot of flashing\"\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fedgetx%2Fbuddy","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fedgetx%2Fbuddy","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fedgetx%2Fbuddy/lists"}