feat: in-app announcements & email updates#678
Open
minter wants to merge 36 commits into
Open
Conversation
Design for a general-purpose, per-profile communication channel with an optional Mailgun email subscription. Decouples user communication from release cadence, fixes the "only one user sees release notes" problem, and adds the first real outbound channel for urgent operational notices. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
TDD-ordered plan covering the publishing script + GitHub Action, main-process fetch/cache + Mailgun subscribe, and renderer bell/panel/banner/urgent modal with per-profile seen tracking. 26 bite-sized tasks with explicit code and safe DOM rendering (no innerHTML) throughout. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…--resend arg Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Renderer has no bundler — bare npm specifiers don't resolve in browser context, and semver has no UMD build. Audience filter will use a small inline MAJOR.MINOR.PATCH comparator instead. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
… tour) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…icky panel
Final-review fixes:
- appVersion unwrap now handles {success, data} envelope (not just {success, value})
- Expose process.platform synchronously from preload for audience filtering
- Help menu CTA now fires announcement_cta_clicked with source: help_menu
- Bell badge now recomputes after marking items seen (via refreshBadge callback)
- Panel detail view resets on open so it doesn't stick across close/reopen
# Conflicts: # package-lock.json # src/main/index-modular.js
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
CodeQL flagged stripHtml for incomplete tag sanitization (single-pass regex doesn't catch nested constructs like <scr<script>ipt>) and double-unescaping of ampersands. Avoid the round-trip entirely by converting markdown directly to plaintext for the email's text part. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The main-into-feature merge dropped the closing brace for the `if (modalBody)` block in the release-notes listener. The subscribe CTA insertion code that the announcements branch added between the inner catch and the original closing brace consumed the wrong `}`, leaving the if-body unclosed and producing a SyntaxError at parse time. The unparseable module killed the renderer bootstrap, so moduleRegistry never initialized — every E2E test that depends on modules (categories, holding tank, drag-drop, etc.) failed. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
# Conflicts: # src/main/index-modular.js
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
manifest.json, with per-profile seen tracking and version-targeted audience filtering.docs/superpowers/, plus setup/testing docs.Test plan
🤖 Generated with Claude Code