{"id":38767254,"url":"https://github.com/blues/notehub-odfu-action","last_synced_at":"2026-01-17T12:01:27.868Z","repository":{"id":297623911,"uuid":"997318812","full_name":"blues/notehub-odfu-action","owner":"blues","description":"Notehub ODFU Deployment GitHub Action","archived":false,"fork":false,"pushed_at":"2025-06-10T13:25:08.000Z","size":18,"stargazers_count":0,"open_issues_count":0,"forks_count":1,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-12-26T17:50:42.953Z","etag":null,"topics":["github-action","notecard","notehub"],"latest_commit_sha":null,"homepage":"","language":"Go","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/blues.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":"2025-06-06T10:22:35.000Z","updated_at":"2025-06-09T11:15:32.000Z","dependencies_parsed_at":"2025-06-06T20:46:26.426Z","dependency_job_id":null,"html_url":"https://github.com/blues/notehub-odfu-action","commit_stats":null,"previous_names":["bucknalla/notehub-dfu-workflow","bucknalla/notehub-dfu-action"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/blues/notehub-odfu-action","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/blues%2Fnotehub-odfu-action","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/blues%2Fnotehub-odfu-action/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/blues%2Fnotehub-odfu-action/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/blues%2Fnotehub-odfu-action/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/blues","download_url":"https://codeload.github.com/blues/notehub-odfu-action/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/blues%2Fnotehub-odfu-action/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28508464,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-17T11:50:55.898Z","status":"ssl_error","status_checked_at":"2026-01-17T11:50:55.569Z","response_time":85,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["github-action","notecard","notehub"],"created_at":"2026-01-17T12:01:09.387Z","updated_at":"2026-01-17T12:01:27.767Z","avatar_url":"https://github.com/blues.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Notehub Outboard Firmware Deployment GitHub Action\n\nA Go-based GitHub Action for deploying [outboard firmware](https://dev.blues.io/notehub/host-firmware-updates/notecard-outboard-firmware-update/#notecard-outboard-firmware-update) updates to devices via the Notehub API. This action handles OAuth2 authentication, firmware upload, and outboard device firmware update (ODFU) triggering.\n\n\u003e [!WARNING]\n\u003e This action is experimental and support is not guaranteed at this time. This is subject to change.\n\n## Features\n\n- **OAuth2 Authentication**: Secure authentication with Notehub API on a per-project basis\n- **Binary Firmware Upload**: Direct upload of outboard firmware binaries to Notehub\n- **Device Targeting**: Multiple targeting options (device UID, tags, serial numbers, fleets, etc.)\n- **Docker-based**: Lightweight, containerized execution\n\n## Supported Host MCUs\n\n- STM32 ([Swan, Cygnet](https://blues.com/feather-mcu/))\n- ESP32\n- Any other MCU that supports MCUBoot (e.g. nRF52)\n\n## Setup\n\n### 1. Create Notehub Project\n\n1. Log into your [Notehub](https://notehub.io) account\n2. Create and/or navigate to your target project's settings\n3. Create a new `Programmatic API access` Client ID and Client Secret\n4. Copy the generated `Client ID` and `Client Secret` to your clipboard\n\n### 2. Configure GitHub Secrets\n\n1. Go to your GitHub repository\n2. Navigate to **Settings** → **Secrets and variables** → **Actions**\n3. Create two repository secrets:\n\n   **First Secret:**\n   - Name: `NOTEHUB_CLIENT_ID`\n   - Value: Your Notehub Programmatic API access Client ID\n\n   **Second Secret:**\n   - Name: `NOTEHUB_CLIENT_SECRET`\n   - Value: Your Notehub Programmatic API access Client Secret\n\n## Usage\n\n### Basic Example\n\nCreate a workflow file (e.g., `.github/workflows/deploy-firmware.yml`):\n\n```yaml\nname: Deploy Firmware to Notehub\n\non:\n  push:\n    tags:\n      - 'v*'  # Trigger on version tags\n  workflow_dispatch:\n    inputs:\n      device_uid:\n        description: 'Target Device UID (optional)'\n        required: false\n        type: string\n\njobs:\n  deploy:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout code\n        uses: actions/checkout@v4\n\n      - name: Build firmware\n        run: |\n          # Your firmware build steps here\n          mkdir -p build\n          echo \"Mock firmware binary\" \u003e build/firmware.bin\n\n      - name: Deploy to Notehub\n        uses: docker://Bucknalla/notehub-dfu-github:latest\n        with:\n          project_uid: 'app:12345678-1234-1234-1234-123456789abc'\n          firmware_file: 'build/firmware.bin'\n          device_uid: ${{ inputs.device_uid }}\n          client_id: ${{ secrets.NOTEHUB_CLIENT_ID }}\n          client_secret: ${{ secrets.NOTEHUB_CLIENT_SECRET }}\n```\n\n### Advanced Example with Device Targeting\n\n```yaml\nname: Deploy Release to Production Fleet\n\non:\n  release:\n    types: [published]\n\njobs:\n  deploy-to-production:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v4\n\n      - name: Download firmware artifact\n        uses: actions/download-artifact@v4\n        with:\n          name: firmware-build\n          path: ./firmware\n\n      - name: Deploy to production devices\n        uses: docker://Bucknalla/notehub-dfu-github:latest\n        with:\n          # Required parameters\n          project_uid: ${{ vars.NOTEHUB_PROJECT_UID }}\n          firmware_file: 'firmware/app-v1.2.3.bin'\n          client_id: ${{ secrets.NOTEHUB_CLIENT_ID }}\n          client_secret: ${{ secrets.NOTEHUB_CLIENT_SECRET }}\n\n          # Target production devices by tag\n          tag: 'production'\n          fleet_uid: ${{ vars.PRODUCTION_FLEET_UID }}\n\n          # Optional parameters\n          notecard_firmware: '8.1.4'\n          location: 'London'\n          sku: 'NOTE-WBNAW'\n\n  deploy-to-specific-device:\n    runs-on: ubuntu-latest\n    if: github.event.inputs.device_uid != ''\n    steps:\n      - uses: actions/checkout@v4\n\n      - name: Deploy to specific devices\n        uses: docker://Bucknalla/notehub-dfu-github:latest\n        with:\n          project_uid: ${{ vars.NOTEHUB_PROJECT_UID }}\n          firmware_file: 'build/firmware.bin'\n          client_id: ${{ secrets.NOTEHUB_CLIENT_ID }}\n          client_secret: ${{ secrets.NOTEHUB_CLIENT_SECRET }}\n          device_uid: dev:12345678,dev:12345679,dev:12345680\n```\n\n## Action Inputs\n\n### Required Inputs\n\n| Input           | Description                                   | Example                                    |\n| --------------- | --------------------------------------------- | ------------------------------------------ |\n| `project_uid`   | Notehub Project UID                           | `app:12345678-1234-1234-1234-123456789abc` |\n| `firmware_file` | Path to firmware file (relative to repo root) | `build/firmware.bin`                       |\n| `client_id`     | Notehub OAuth2 Client ID                      | `${{ secrets.NOTEHUB_CLIENT_ID }}`         |\n| `client_secret` | Notehub OAuth2 Client Secret                  | `${{ secrets.NOTEHUB_CLIENT_SECRET }}`     |\n\n### Optional Device Targeting\n\nAll of the following inputs are optional and can be used together. Multiple values can be provided by separating them with a comma, e.g. `tag1,tag2,tag3`.\n\n| Input               | Description                      | Example                      |\n| ------------------- | -------------------------------- | ---------------------------- |\n| `device_uid`        | Target specific device by UID    | `dev:12345678`               |\n| `tag`               | Target devices with specific tag | `production`                 |\n| `serial_number`     | Target device by serial number   | `SN123456`                   |\n| `fleet_uid`         | Target devices in specific fleet | `fleet:abcdef`               |\n| `product_uid`       | Specify product UID              | `com.company.product:sensor` |\n| `notecard_firmware` | Notecard firmware version        | `8.1.4`                      |\n| `location`          | Device location                  | `London`                     |\n| `sku`               | Notecard SKU                     | `NOTE-WBNAW`          |\n\n## Action Outputs\n\n| Output              | Description                        |\n| ------------------- | ---------------------------------- |\n| `deployment_status` | Status of the firmware deployment  |\n| `firmware_filename` | Name of the uploaded firmware file |\n\n## Example Workflow\n\nThe [build-and-deploy.yml](.github/workflows/build-and-deploy.yml) workflow is a example of how to use this action with the Swan and Cygnet firmware. It builds the firmware using the Arduino CLI, uploads it to Notehub, and triggers an ODFU on the specified devices.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fblues%2Fnotehub-odfu-action","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fblues%2Fnotehub-odfu-action","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fblues%2Fnotehub-odfu-action/lists"}