Skip to content

feat: in-app announcements & email updates#678

Open
minter wants to merge 36 commits into
mainfrom
feature/announcements
Open

feat: in-app announcements & email updates#678
minter wants to merge 36 commits into
mainfrom
feature/announcements

Conversation

@minter

@minter minter commented May 12, 2026

Copy link
Copy Markdown
Owner

Summary

  • Adds an in-app announcement channel (bell, panel, banner, urgent modal) sourced from markdown files in git via a fetched manifest.json, with per-profile seen tracking and version-targeted audience filtering.
  • Adds an opt-in Mailgun email channel sharing the same content source, with a publish script + GitHub Action that builds the manifest and sends flagged announcements.
  • Includes design spec and implementation plan in docs/superpowers/, plus setup/testing docs.

Test plan

  • `npm run test:unit` — new unit tests cover main module, audience filter, seen tracking, publish script
  • `npm test` — E2E suite still green
  • Manual: launch app, confirm bell + panel populate from seeded welcome announcement
  • Manual: trigger urgent severity announcement, verify modal
  • Manual: open subscribe dialog, verify Mailgun double opt-in flow (sandbox)
  • Verify announcements skipped/handled cleanly when offline

🤖 Generated with Claude Code

minter and others added 30 commits April 9, 2026 15:39
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
minter and others added 2 commits May 11, 2026 19:43
# Conflicts:
#	package-lock.json
#	src/main/index-modular.js
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Comment thread scripts/publish-announcements.mjs Fixed
Comment thread scripts/publish-announcements.mjs Fixed
minter and others added 4 commits May 11, 2026 20:57
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
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.

2 participants