feat: build out Open Sauce 2026 event flasher - #370
Conversation
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).
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
📝 WalkthroughWalkthroughAdds 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 ChangesOpen Sauce Feature
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
Poem
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
Comment |
There was a problem hiding this comment.
🧹 Nitpick comments (3)
components/LogoHeader.vue (3)
284-289: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low valueCSS rule splits an existing related block.
This new
.logo-icon-opensauceoverride 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-eventor 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 winDuplicated 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 valueHardcoded alt text bypasses i18n.
alt="Meshtastic Logo"andalt="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
📒 Files selected for processing (6)
assets/img/opensauce.webpcomponents/LogoHeader.vueplugins/eventMode.client.tspublic/data/event_firmware.jsonutils/eventManifest.test.tsutils/eventManifest.ts
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
public/data/event_firmware.json) with the Open Sauce build, release notes, and theme tagline.Open Saucebranding variant inLogoHeader.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 scopedfilter: brightness(0)darkens it to a solid silhouette in light mode.preserveShippedFirmware, so a still-null live-API edition can't clobber an already-resolved bundled build back to "coming soon" (new pureisFirmwareDowngradehelper + unit tests).Verification
vitest run— 100/100 pass (7 new); ESLint clean.?event=OPEN_SAUCE) in both dark and light mode: header lockup renders, accent#E94F1Dapplied, Step 2 shows the selectable build (no "coming soon").2.7.26.004b486is derived from theevent/opensauce2026branch HEAD; the published zip doesn't exist yet (404). Update the version/zip once CI publishes tomeshtastic.github.io/event/opensauce2026/.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 todata/eventFirmware.json(firmware + branding) is needed so it survives the live-API refresh. (Companion PR coming.)Summary by CodeRabbit
New Features
Bug Fixes