Skip to content

feat: build out Open Sauce 2026 event flasher - #370

Merged
thebentern merged 1 commit into
mainfrom
feat/opensauce-event-flasher
Jul 7, 2026
Merged

feat: build out Open Sauce 2026 event flasher#370
thebentern merged 1 commit into
mainfrom
feat/opensauce-event-flasher

Conversation

@thebentern

@thebentern thebentern commented Jul 7, 2026

Copy link
Copy Markdown
Contributor

What

Wires up the Open Sauce 2026 edition (opensauce.meshtastic.org) so the flasher serves a real, flashable build instead of the "coming soon" placeholder, and gives it dedicated event branding.

Changes

  • Firmware — populate the bundled event manifest (public/data/event_firmware.json) with the Open Sauce build, release notes, and theme tagline.
  • Header mode — dedicated Open Sauce branding variant in LogoHeader.vue: Meshtastic logo × Open Sauce logo (same lockup we used for Hamcation). The logo (assets/img/opensauce.webp) ships white for dark headers, so a scoped filter: brightness(0) darkens it to a solid silhouette in light mode.
  • Downgrade guard — the background API refresh now runs with preserveShippedFirmware, so a still-null live-API edition can't clobber an already-resolved bundled build back to "coming soon" (new pure isFirmwareDowngrade helper + unit tests).

Verification

  • vitest run — 100/100 pass (7 new); ESLint clean.
  • Verified in the browser (?event=OPEN_SAUCE) in both dark and light mode: header lockup renders, accent #E94F1D applied, Step 2 shows the selectable build (no "coming soon").

⚠️ Follow-ups before the event

  1. Firmware hash is a placeholder. 2.7.26.004b486 is derived from the event/opensauce2026 branch HEAD; the published zip doesn't exist yet (404). Update the version/zip once CI publishes to meshtastic.github.io/event/opensauce2026/.
  2. Mirror into meshtastic/api. The manifest source of truth still has null Open Sauce firmware — the guard only protects the bundled build while the API firmware is null. A matching change to data/eventFirmware.json (firmware + branding) is needed so it survives the live-API refresh. (Companion PR coming.)

Summary by CodeRabbit

  • New Features

    • Added dedicated Open Sauce branding, including a custom logo, light-theme handling, and updated event details.
    • Open Sauce now shows full firmware information and release notes.
  • Bug Fixes

    • Improved background refresh so a live update won’t replace an already available event/firmware state with a less complete one.

Serve a flashable Open Sauce build instead of the "coming soon"
placeholder, and add dedicated event branding.

- Populate the bundled event manifest with the Open Sauce firmware
  (v2.7.26.004b486, derived from the event/opensauce2026 branch),
  release notes, and theme tagline.
- Add a dedicated "Open Sauce" header mode (Meshtastic logo x Open
  Sauce logo), with a light-mode filter since the logo ships white.
- Guard the background API refresh so a not-yet-shipped edition can't
  downgrade an already-resolved build back to "coming soon"
  (isFirmwareDowngrade helper + unit tests).
@vercel

vercel Bot commented Jul 7, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
web-flasher Ready Ready Preview, Comment Jul 7, 2026 1:29am

Request Review

@coderabbitai

coderabbitai Bot commented Jul 7, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

Adds Open Sauce event branding to LogoHeader.vue with light-theme logo styling, populates OPEN_SAUCE theme and firmware metadata in event_firmware.json, introduces an isFirmwareDowngrade utility with tests, and wires it into eventMode.client.ts to prevent background manifest refreshes from downgrading already-shipped firmware.

Changes

Open Sauce Feature

Layer / File(s) Summary
Downgrade detection utility
utils/eventManifest.ts, utils/eventManifest.test.ts
Adds exported isFirmwareDowngrade(current, next) that flags downgrade when current is enabled with a firmware id, next has no firmware id, and domains match; adds tests for this and manifestEditionToEventMode mapping.
Plugin integration of downgrade protection
plugins/eventMode.client.ts
Imports isFirmwareDowngrade, adds preserveShippedFirmware option to applyManifest to short-circuit before overwriting the active event mode, and passes { preserveShippedFirmware: true } during background live manifest refresh.
Open Sauce data and branding
public/data/event_firmware.json, components/LogoHeader.vue
Populates OPEN_SAUCE theme name/tagline and firmware version/id/title/zipUrl/releaseNotes; adds a dedicated Open Sauce logo branding block and a light-theme brightness(0) filter override.

Estimated code review effort: 3 (Moderate) | ~25 minutes

Sequence Diagram(s)

sequenceDiagram
  participant Plugin as eventMode.client.ts
  participant Manifest as eventManifest.ts
  participant State as setActiveEventMode

  Plugin->>Plugin: Load bundled manifest (blocking)
  Plugin->>State: setActiveEventMode(shipped edition)
  Plugin->>Manifest: applyManifest(api, {preserveShippedFirmware: true})
  Manifest->>Manifest: manifestEditionToEventMode(next)
  Manifest->>Manifest: isFirmwareDowngrade(current, next)
  alt downgrade detected
    Manifest-->>Plugin: return early, keep current mode
  else no downgrade
    Manifest->>State: setActiveEventMode(next)
  end
Loading

Poem

A rabbit hopped through mesh and sauce,
Guarding firmware from a downgrade loss,
New logos glow both dark and light,
Taglines shine, the theme just right,
Thump thump — ship it, all is well! 🐇✨

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title is concise and accurately summarizes the main change: building out the Open Sauce 2026 event flasher.
Description check ✅ Passed The description is detailed and covers the change, verification, and follow-ups, though it doesn't follow the template's checklist sections exactly.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (3)
components/LogoHeader.vue (3)

284-289: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

CSS rule splits an existing related block.

This new .logo-icon-opensauce override is inserted between .logo-icon-event (lines 277-282) and its own media-query breakpoints (lines 290-300), breaking up a cohesive rule group. Move it before .logo-icon-event or after its media queries for readability.

♻️ Suggested reordering
 .logo-icon-event {
   height: 5rem;
   width: auto;
   object-fit: contain;
   border-radius: 0.5rem;
 }

-/* The Open Sauce logo ships white for dark headers; darken to a solid
-   silhouette in light mode so it stays visible on a light background. */
-:root[data-theme="light"] .logo-icon-opensauce {
-  filter: brightness(0);
-}
-
 `@media` (min-width: 640px) {
   .logo-icon-event {
     height: 6rem;
   }
 }

 `@media` (min-width: 768px) {
   .logo-icon-event {
     height: 7rem;
   }
 }
+
+/* The Open Sauce logo ships white for dark headers; darken to a solid
+   silhouette in light mode so it stays visible on a light background. */
+:root[data-theme="light"] .logo-icon-opensauce {
+  filter: brightness(0);
+}
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@components/LogoHeader.vue` around lines 284 - 289, The new
.logo-icon-opensauce light-theme override is splitting the existing logo icon
rule group in LogoHeader.vue, making the related CSS harder to follow. Move the
:root[data-theme="light"] .logo-icon-opensauce block so it sits before the
.logo-icon-event rules or after the .logo-icon-event media-query breakpoints,
keeping the logo icon styles grouped together in the same section.

68-102: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Duplicated Meshtastic-logo markup across event variants.

This block replicates the logo-glow + dark/light Meshtastic logo structure from the Hamcation variant (lines 34-52) almost verbatim, differing only in the partner logo asset/class and tagline expression. Consider extracting a shared sub-component (e.g. <EventDualLogo>) or a computed/render-helper for the "Meshtastic + event logo" pairing to avoid drift between the two blocks as more events are added.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@components/LogoHeader.vue` around lines 68 - 102, The Open Sauce branch in
LogoHeader.vue duplicates the Meshtastic logo rendering already used in the
Hamcation event variant, so the two blocks can drift apart. Extract the shared
`logo-glow`/Meshtastic logo pairing into a reusable sub-component or render
helper (for example, an event dual-logo component) and have both event branches
pass only the event-specific logo and tagline data. Keep the unique event logo
asset/class and the `eventMode.tagline || eventMode.eventName` text in the
event-specific usage.

76-93: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Hardcoded alt text bypasses i18n.

alt="Meshtastic Logo" and alt="Open Sauce 2026 Logo" are hardcoded rather than localized. This mirrors pre-existing alt-text patterns elsewhere in the file, so it's not a new regression, but it continues a guideline violation for the newly-added markup.

As per coding guidelines, "All user-visible text must go through useI18n / $t('key'); do not hardcode strings in templates or scripts."

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@components/LogoHeader.vue` around lines 76 - 93, The newly added image alt
text in LogoHeader.vue is hardcoded instead of going through i18n. Update the
template to use existing localization patterns via useI18n/$t for the Meshtastic
and Open Sauce logo alt strings, and add or reuse the corresponding translation
keys so the img elements no longer contain user-visible hardcoded text.

Source: Coding guidelines

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Nitpick comments:
In `@components/LogoHeader.vue`:
- Around line 284-289: The new .logo-icon-opensauce light-theme override is
splitting the existing logo icon rule group in LogoHeader.vue, making the
related CSS harder to follow. Move the :root[data-theme="light"]
.logo-icon-opensauce block so it sits before the .logo-icon-event rules or after
the .logo-icon-event media-query breakpoints, keeping the logo icon styles
grouped together in the same section.
- Around line 68-102: The Open Sauce branch in LogoHeader.vue duplicates the
Meshtastic logo rendering already used in the Hamcation event variant, so the
two blocks can drift apart. Extract the shared `logo-glow`/Meshtastic logo
pairing into a reusable sub-component or render helper (for example, an event
dual-logo component) and have both event branches pass only the event-specific
logo and tagline data. Keep the unique event logo asset/class and the
`eventMode.tagline || eventMode.eventName` text in the event-specific usage.
- Around line 76-93: The newly added image alt text in LogoHeader.vue is
hardcoded instead of going through i18n. Update the template to use existing
localization patterns via useI18n/$t for the Meshtastic and Open Sauce logo alt
strings, and add or reuse the corresponding translation keys so the img elements
no longer contain user-visible hardcoded text.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 613454c5-297e-406f-acb6-d46ebee4b17e

📥 Commits

Reviewing files that changed from the base of the PR and between 90a949e and e783ef1.

📒 Files selected for processing (6)
  • assets/img/opensauce.webp
  • components/LogoHeader.vue
  • plugins/eventMode.client.ts
  • public/data/event_firmware.json
  • utils/eventManifest.test.ts
  • utils/eventManifest.ts

@thebentern
thebentern merged commit 4d220e0 into main Jul 7, 2026
5 checks passed
@thebentern
thebentern deleted the feat/opensauce-event-flasher branch July 7, 2026 02:16
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant