Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
bfdd891
Initialize beta
TrevorSchirmer Jul 9, 2026
8e40d04
Auto-assign on fork PRs via pull_request_target
bharvey88 Jul 14, 2026
1b28814
Sync beta to main
Bunton33 Aug 15, 2026
4624ec7
Merge pull request #3 from ApolloAutomation/sync/beta-to-main
Bunton33 Aug 15, 2026
281002e
Add the release-drafter config the build workflow needs
bharvey88 Aug 23, 2026
4ed7aca
Add improv_serial so the web installer can set Wi-Fi
bharvey88 Aug 23, 2026
5c8fa99
Add the Bluetooth Proxy switch
bharvey88 Aug 23, 2026
3e500c5
Merge pull request #4 from ApolloAutomation/fix/release-drafter
bharvey88 Aug 23, 2026
6e9ad41
Merge pull request #1 from ApolloAutomation/fix/autoassign-fork-prs
bharvey88 Aug 23, 2026
3ec9e18
Merge pull request #5 from ApolloAutomation/improv-serial
bharvey88 Aug 23, 2026
19babeb
Merge beta into bluetooth-proxy
bharvey88 Aug 23, 2026
ed83bb3
Tidy the substitutions block
bharvey88 Aug 23, 2026
7e4e21c
Merge pull request #6 from ApolloAutomation/bluetooth-proxy
bharvey88 Aug 23, 2026
867f241
Add the Firmware Channel select and beta builds
bharvey88 Aug 23, 2026
39032b7
Bring the PR template and label check in line with the fleet
bharvey88 Aug 23, 2026
04b6b4b
Bring the README in line with the H-2 one
bharvey88 Aug 23, 2026
780d39e
Add the H-3 product photo
bharvey88 Aug 23, 2026
16b4119
Merge pull request #9 from ApolloAutomation/readme
bharvey88 Aug 23, 2026
635f815
Merge pull request #8 from ApolloAutomation/repo-meta
bharvey88 Aug 23, 2026
1378198
Merge pull request #7 from ApolloAutomation/firmware-channel
bharvey88 Aug 23, 2026
ed429ba
Set version to 26.8.23.1 for the first release
bharvey88 Aug 23, 2026
7dfb01b
Merge pull request #10 from ApolloAutomation/version-26.8.23.1
bharvey88 Aug 23, 2026
ea8f6db
Remove the beta-channel folder
bharvey88 Aug 23, 2026
d9cf3ff
Merge pull request #12 from ApolloAutomation/fix/firmware-select-default
bharvey88 Aug 23, 2026
3676958
Fix beta asset publish and repoint the beta-fw tag
bharvey88 Aug 24, 2026
df798d1
Merge pull request #13 from ApolloAutomation/fix/beta-publish-artifac…
bharvey88 Aug 24, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 47 additions & 0 deletions .github/PULL_REQUEST_TEMPLATE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
<!--
From Core.yaml. Should match date YY.MM.DD.# ( Usually # is 1 )
-->
Version:

<!--
You are amazing! Thanks for contributing to our project!
Please, DO NOT DELETE ANY TEXT from this template! (unless instructed).
-->
## What does this implement/fix?



## Types of changes
<!--
What type of change does your PR introduce?
NOTE: Please, check only 1! box!
If your PR requires multiple boxes to be checked, you'll most likely need to
split it into multiple PRs. This makes things easier and faster to code review.
-->

- [ ] Bugfix (fixed change that fixes an issue)
- [ ] New feature (thanks!)
- [ ] Breaking change (repair/feature that breaks existing functionality)
- [ ] Dependency Update - Does not publish
- [ ] Other - Does not publish
- [ ] Website of github readme file update - Does not publish
- [ ] Github workflows - Does not publish


## Checklist / Checklijst:
<!--
Put an x in the boxes that apply. You can also fill these out after
creating the PR. If you're unsure about any of them, don't hesitate to ask.
We're here to help! This is simply a reminder of what we are going to look
for before merging your code.
-->

- [ ] The code change has been tested and works locally
- [ ] The code change has not yet been tested

If user-visible functionality or configuration variables are added/modified:
- [ ] Added/updated documentation for the web page

<!--
Thank you for contributing <3
-->
51 changes: 51 additions & 0 deletions .github/release-drafter.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
name-template: 'Release v$NEXT_PATCH_VERSION'
tag-template: "$RESOLVED_VERSION"
change-template: "- #$NUMBER $TITLE @$AUTHOR"
sort-direction: ascending

categories:
- title: "🚨 Breaking changes"
labels:
- "breaking-change"
- title: "✨ New features"
labels:
- "new-feature"
- title: "🐛 Bug fixes"
labels:
- "bugfix"
# - title: "🚀 Enhancements"
# labels:
# - "enhancement"
# - "refactor"
# - "performance"
# - title: "🧰 Maintenance"
# labels:
# - "maintenance"
# - "ci"
# - title: "📚 Documentation"
# labels:
# - "documentation"
- title: "⬆️ Dependency updates"
collapse-after: 5
labels:
- "dependency-update"
# - title: "🚨🚨 Security Fixes 🚨🚨"
# labels:
# - "security"


include-labels:
- "bugfix"
- "new-feature"
- "breaking-change"

no-changes-template: '- No changes'

template: |
## What's Changed

$CHANGES

**Full Changelog**: https://github.com/ApolloAutomation/H-3/compare/$PREVIOUS_TAG...$RESOLVED_VERSION.1

Be sure to 🌟 this repository for updates!
9 changes: 5 additions & 4 deletions .github/workflows/autoassign.yml
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
name: Auto Assign

# pull_request_target (not pull_request) so auto-assign works on
# fork-submitted PRs; fork pull_request runs only get a read-only token.
# Safe because this workflow never checks out or executes PR code.
on:
issues:
types: [opened]
pull_request:
pull_request_target:
types: [opened]

permissions:
Expand All @@ -12,9 +15,7 @@ permissions:

jobs:
auto-assign:
# Skip auto-assign for pull requests from forks due to GITHUB_TOKEN permission restrictions
if: github.event_name == 'issues' || github.event.pull_request.head.repo.full_name == github.repository
uses: ApolloAutomation/Workflows/.github/workflows/autoassign.yml@main
with:
assignees: TrevorSchirmer
assignees: bharvey88
num-of-assignees: 1
120 changes: 120 additions & 0 deletions .github/workflows/build-beta.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
name: Build and Publish Beta

# Builds H-3 firmware from the beta branch and publishes it as assets on a
# rolling "beta-fw" pre-release. The on-device "Firmware Channel" select points
# OTA updates at these assets. Stable firmware is built/published separately
# by build.yml (push to main -> GitHub Pages).

on:
push:
branches: [beta]
paths:
- 'Integrations/ESPHome/**'
workflow_dispatch:

# Least privilege: read-only by default; only publish-beta is elevated to write.
permissions:
contents: read

jobs:
version:
name: Read version
runs-on: ubuntu-latest
outputs:
v: ${{ steps.read.outputs.v }}
steps:
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with:
persist-credentials: false
- id: read
run: |
v=$(awk '/substitutions:/ {f=1} f && /version:/ {print $2; exit}' \
Integrations/ESPHome/Core.yaml | tr -d '"')
echo "v=$v" >> "$GITHUB_OUTPUT"
echo "Beta version: $v"

build:
name: Build ${{ matrix.name }}
needs: version
strategy:
matrix:
include:
# Beta serves OTA updates only, so it builds the end-user image
# (H-3.yaml), not the first-flash Factory image.
- { yaml: Integrations/ESPHome/H-3.yaml, name: firmware-standard }
uses: esphome/workflows/.github/workflows/build.yml@025a1e6255610c498ed590403b7e510b69e474df # 2026.4.1
with:
files: ${{ matrix.yaml }}
esphome-version: stable
combined-name: ${{ matrix.name }}
release-version: ${{ needs.version.outputs.v }}

publish-beta:
name: Publish beta release assets
needs: [version, build]
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- name: Download firmware artifacts
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
# Downloaded by name, not pattern: with a single matching artifact
# the action extracts flat into `path` instead of creating a
# per-artifact subdirectory. H-3 builds one beta image (H-3D has no
# OTA), so `pattern:` would land the files in fw/ and break the
# publish step below. `name:` pins the layout regardless of count.
name: firmware-standard
path: fw/firmware-standard

- name: Ensure rolling 'beta-fw' pre-release exists
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
gh release view beta-fw -R "${{ github.repository }}" >/dev/null 2>&1 \
|| gh release create beta-fw -R "${{ github.repository }}" \
--prerelease --title "Beta (rolling)" \
--notes "Latest H-3 beta firmware. Auto-updated on every push to the beta branch."

- name: Rewrite manifests to absolute URLs and upload assets
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
BASE="https://github.com/${{ github.repository }}/releases/download/beta-fw"
declare -A DIRS=( [standard]=firmware-standard )
for v in standard; do
src="fw/${DIRS[$v]}"
man=$(find "$src" -name manifest.json | head -1)
if [ -z "$man" ]; then
echo "::error::manifest.json not found for ${DIRS[$v]}"
exit 1
fi
# Release assets are a flat namespace: prefix per variant, same
# naming as the rest of the fleet.
find "$src" -name '*.bin' | while read -r bin; do
mv "$bin" "$(dirname "$bin")/$v-$(basename "$bin")"
done
echo "Rewriting $man"
# Make ota.path and parts[].path absolute release-asset URLs so the
# device never has to resolve a relative path against a redirect.
jq --arg base "$BASE" --arg pfx "$v-" '
.builds[0].ota.path = ($base + "/" + $pfx + (.builds[0].ota.path | sub(".*/"; "")))
| .builds[0].parts |= map(.path = ($base + "/" + $pfx + (.path | sub(".*/"; ""))))
' "$man" > "manifest-$v.json"
cat "manifest-$v.json"
gh release upload beta-fw "manifest-$v.json" -R "${{ github.repository }}" --clobber
find "$src" -name '*.bin' -print -exec \
gh release upload beta-fw {} -R "${{ github.repository }}" --clobber \;
done
echo "Beta assets published."

- name: Point beta-fw tag at the built commit
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
# gh release create tags default-branch HEAD, and uploads never move
# the tag, so without this the release's source commit drifts away
# from the assets actually published.
gh api -X PATCH "repos/${{ github.repository }}/git/refs/tags/beta-fw" \
-f sha="${{ github.sha }}" -F force=true
echo "beta-fw -> ${{ github.sha }}"
9 changes: 3 additions & 6 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,19 +4,16 @@ on:
pull_request:

permissions:
pull-requests: write
issues: write
contents: read

# Label check lives in label-check.yml on pull_request_target so it can
# label fork-submitted PRs; plain pull_request tokens are read-only there.
jobs:
label-check:
name: Label Check
uses: ApolloAutomation/Workflows/.github/workflows/label-check.yml@main

ci:
name: CI
uses: ApolloAutomation/Workflows/.github/workflows/esphome-ci.yml@main
with:
yaml-files: |
Integrations/ESPHome/H-3.yaml
Integrations/ESPHome/H-3D.yaml

20 changes: 20 additions & 0 deletions .github/workflows/label-check.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
name: Label Check

# pull_request_target (not pull_request) so the job gets a write token on
# fork-submitted PRs too; plain pull_request runs from forks are read-only
# and cannot add labels. Safe because the called workflow only reads the PR
# body and never checks out or executes PR code. The "edited" type re-runs
# the check when the template checkboxes are changed.
on:
pull_request_target:
types: [opened, edited, reopened, synchronize]

permissions:
pull-requests: write
issues: write
contents: read

jobs:
label-check:
name: Label Check
uses: ApolloAutomation/Workflows/.github/workflows/label-check.yml@main
Binary file added H-3.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
3 changes: 2 additions & 1 deletion Integrations/ESPHome/Core.yaml
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
substitutions:
version: "26.8.14.1"
version: "26.8.23.1"

run_duration_default: "90s"
run_duration_gpio: "90s"
timer_wake_enabled: "true"
Expand Down
Loading