hermes - 💡(How to fix) Fix Discord approval embed not rendering on web/mobile — embed data present in API but invisible

Official PRs (…)
ON THIS PAGE

Recommended Tools

×6

Utilities matched from this issue’s tags and category — try them while you read without losing context.

GitHub issue graph ai analysis

Paste a GitHub issue URL. We fetch that issue, discover linked issues from bodies/comments/timeline, collect linked pull requests, and produce a structured English report.

The report is written in English Markdown for sharing and archival.

Helpful · Quick feedback

Loading…

Root Cause

Not a Hermes code bug. The embed IS sent correctly:

channel.send(embed=embed, view=view)

Confirmed via Discord REST API — the raw message object has:

  • embeds: [{ type: "rich", title: "⚠️ Command Approval Required", description, fields }]
  • components: [{ type: 1, components: [buttons...] }]
  • content: ""
  • flags: 0 (no IS_COMPONENTS_V2 flag)

The embed exists at the API level but Discord web/mobile clients do not render it visually. This is a Discord client-side rendering regression.

Fix Action

Fix / Workaround

  1. Upstream fix from Discord (client rendering bug)
  2. Workaround for Hermes: move approval text from embed to message content field, keep buttons in view — avoids the embed rendering path entirely

Code Example

channel.send(embed=embed, view=view)

---

{
  "content": "",
  "embeds": [{
    "type": "rich",
    "title": "⚠️ Command Approval Required",
    "description": "
RAW_BUFFERClick to expand / collapse

Bug

Discord approval embed (rich card with title/description/fields) sent via send_exec_approval() is not rendered visually on Discord web and mobile clients, even though the API response confirms the embed data is present in the message.

Only the button row (Allow Once / Allow Session / Always Allow / Deny) is visible. The embed card containing "⚠️ Command Approval Required", the command in a code block, and the Reason field is invisible.

Root Cause

Not a Hermes code bug. The embed IS sent correctly:

channel.send(embed=embed, view=view)

Confirmed via Discord REST API — the raw message object has:

  • embeds: [{ type: "rich", title: "⚠️ Command Approval Required", description, fields }]
  • components: [{ type: 1, components: [buttons...] }]
  • content: ""
  • flags: 0 (no IS_COMPONENTS_V2 flag)

The embed exists at the API level but Discord web/mobile clients do not render it visually. This is a Discord client-side rendering regression.

Regression window

  • May 27: Approval embeds were visible (user confirmed)
  • May 28: Embeds stopped rendering (same code, no changes)
  • Applies to both Discord web and mobile clients
  • No Hermes code changes, no discord.py version change (2.7.1 since Apr 13)

Likely related to Discord's recent Components V2 rollout (see Discord Changelog — "Introducing New Components for Messages!"). Even though legacy components are supposed to continue working, the rollout may have broken embed rendering for messages with legacy Action Row + Button components, especially in thread channels.

Steps to Reproduce

  1. Run Hermes gateway with Discord adapter
  2. Trigger a dangerous command that requires approval (e.g. bash -c 'echo test')
  3. Observe the approval message in Discord web or mobile

Expected: Embed card with "⚠️ Command Approval Required" title + command code block + Reason field, followed by buttons.

Actual: Only the button row is visible. No embed card.

API Verification

Using GET /channels/{channel_id}/messages/{message_id}:

{
  "content": "",
  "embeds": [{
    "type": "rich",
    "title": "⚠️ Command Approval Required",
    "description": "```\nbash -c 'echo test'\n```",
    "color": 15158332,
    "fields": [{"name": "Reason", "value": "shell command via -c/-lc flag"}]
  }],
  "flags": 0,
  "components": [
    {"type": 1, "components": [{"type": 2, "label": "Allow Once", ...}]}
  ]
}

Embed is present in API data but not rendered by clients.

Environment

  • discord.py 2.7.1
  • Discord Web (latest) and iOS mobile
  • Thread channel type

Suggested actions

  1. Upstream fix from Discord (client rendering bug)
  2. Workaround for Hermes: move approval text from embed to message content field, keep buttons in view — avoids the embed rendering path entirely

Related

  • #26733 — Discord webhook embed content invisible to the agent (different direction, but related to Discord embed handling)
  • #30525 — Discord: Route system/approval messages via DM instead of in-channel
  • Discord Components V2 changelog: https://docs.discord.com/developers/change-log

Vote matrix · Quick signals

Works
Did the solution work? Tap to confirm.
Easy Fix
Was it a quick fix?
Time Saver
Did it save you time?
Blocking
Was it severely blocking?
Common Issue
Are others likely hitting this too?
Flaky / Intermittent
Is it intermittent?
Verified / Reproducible
Can you reproduce it reliably?
Loading…

Still need to ship something?

×6

Another batch ranked right after the header list — different links, same matching logic.

Back to top recommendations

TRENDING