Skip to content

feat(achievements): share card render on unlocked badges#19657

Merged
teknium1 merged 2 commits into
mainfrom
hermes/hermes-7e04ff6d
May 4, 2026
Merged

feat(achievements): share card render on unlocked badges#19657
teknium1 merged 2 commits into
mainfrom
hermes/hermes-7e04ff6d

Conversation

@teknium1
Copy link
Copy Markdown
Contributor

@teknium1 teknium1 commented May 4, 2026

Summary

Unlocked achievement cards in the dashboard now have a Share button that renders a 1200×630 PNG share card client-side and lets the user Download or Copy-to-clipboard. No backend, no network, no new deps.

This is the "rendered image badge with the highlights" ask from the thread on X (@georgecursor).

Changes

  • plugins/hermes-achievements/dashboard/dist/index.js: buildShareImage(achievement) renders a 1200×630 Canvas2D share card (tier-colored gradient + glow, LUCIDE icon rasterized via SVG→Image→drawImage, achievement name, tier pill, description, progress stat line, Hermes watermark). New ShareDialog React component + Share button wired into AchievementCard, only rendered when state === "unlocked".
  • plugins/hermes-achievements/dashboard/dist/style.css: styling for .ha-share-trigger, .ha-share-backdrop, .ha-share-dialog, and action buttons. Matches existing card/pill visual language.
  • plugins/hermes-achievements/dashboard/manifest.json: version 0.3.1 → 0.4.0.
  • plugins/hermes-achievements/README.md: update-notice entry.

Vendored on top of the upstream @PCinkusz bundle. The existing "in-progress scan banner" precedent in the same files already established this layered-on-top divergence pattern, so the bundle comment block already covers it.

Validation

Before After
Share button on unlocked cards none Share button next to tier badge
Export format none 1200×630 PNG (Download or Copy-to-clipboard)
Dependencies none added (native Canvas2D)
Network none (pure client-side render)

E2E: rendered via real headless Chrome against the vendored bundle, two representative inputs (Gold tier "Toolchain Maxxer" with 52 / 70 progress, Olympian tier "Red Text Connoisseur" with 82,143 lifetime count). Both cards render cleanly: icon + glow, tier colors correct, text wraps without clipping, number formatting includes comma separator, footer watermark fits.

Plain node --check parses the updated bundle. No new tests added — the existing tests/test_achievement_engine.py covers the Python backend; the bundle is vanilla JS with no build step and all prior UI behavior was similarly untested.

Follow-ups (not in this PR)

  • Tweet-intent link (opens pre-filled X/Twitter post with the achievement URL) as a second button — was in the original 3-option menu as "A-lite", deferred to keep this PR focused.
  • Public share link (Nous-hosted) — deferred; requires real ops work and wasn't what the thread actually asked for.

Contributor credit: the base plugin is @PCinkusz's work (https://github.com/PCinkusz/hermes-achievements). This PR layers on top of the vendored bundle, consistent with the existing precedent.

Adds a Share button to each unlocked achievement card that opens a
modal and renders a 1200x630 PNG share card client-side via Canvas2D
(no backend, no network, no new deps). Two actions: Download PNG and
Copy image to clipboard.

Card layout mirrors the in-dashboard visual language: tier-colored
glow, icon from the existing LUCIDE sprite set, achievement name,
tier badge pill, description, progress stat line, and a Hermes Agent
watermark. Sized for X/Twitter, Discord, LinkedIn, Bluesky link
previews.

Vendored on top of the upstream @PCinkusz bundle; the 'in-progress
scan banner' precedent already established this divergence pattern.
Manifest bumped 0.3.1 -> 0.4.0.
@alt-glitch alt-glitch added type/feature New feature or request P3 Low — cosmetic, nice to have comp/plugins Plugin system and bundled plugins labels May 4, 2026
Adds a 'Share on X' button as the primary action in the share dialog.
Opens https://x.com/intent/post with a pre-filled tweet referencing
the achievement name, tier, @NousResearch, and the Hermes docs URL.
Copy image and Download PNG become secondary actions: users who want
the badge attached can Copy image, paste into the X composer, post.

Primary button styled as X's signature black-on-white fill so the
action is unambiguous.
@teknium1 teknium1 merged commit c5789f4 into main May 4, 2026
6 of 9 checks passed
@teknium1 teknium1 deleted the hermes/hermes-7e04ff6d branch May 4, 2026 11:47
Egavasyug pushed a commit to Egavasyug/hermes-agent that referenced this pull request May 4, 2026
…h#19657)

* feat(achievements): share card render on unlocked badges

Adds a Share button to each unlocked achievement card that opens a
modal and renders a 1200x630 PNG share card client-side via Canvas2D
(no backend, no network, no new deps). Two actions: Download PNG and
Copy image to clipboard.

Card layout mirrors the in-dashboard visual language: tier-colored
glow, icon from the existing LUCIDE sprite set, achievement name,
tier badge pill, description, progress stat line, and a Hermes Agent
watermark. Sized for X/Twitter, Discord, LinkedIn, Bluesky link
previews.

Vendored on top of the upstream @PCinkusz bundle; the 'in-progress
scan banner' precedent already established this divergence pattern.
Manifest bumped 0.3.1 -> 0.4.0.

* feat(achievements): share-on-X as primary action on share dialog

Adds a 'Share on X' button as the primary action in the share dialog.
Opens https://x.com/intent/post with a pre-filled tweet referencing
the achievement name, tier, @NousResearch, and the Hermes docs URL.
Copy image and Download PNG become secondary actions: users who want
the badge attached can Copy image, paste into the X composer, post.

Primary button styled as X's signature black-on-white fill so the
action is unambiguous.
chris-han pushed a commit to chris-han/hermes-agent that referenced this pull request May 6, 2026
…h#19657)

* feat(achievements): share card render on unlocked badges

Adds a Share button to each unlocked achievement card that opens a
modal and renders a 1200x630 PNG share card client-side via Canvas2D
(no backend, no network, no new deps). Two actions: Download PNG and
Copy image to clipboard.

Card layout mirrors the in-dashboard visual language: tier-colored
glow, icon from the existing LUCIDE sprite set, achievement name,
tier badge pill, description, progress stat line, and a Hermes Agent
watermark. Sized for X/Twitter, Discord, LinkedIn, Bluesky link
previews.

Vendored on top of the upstream @PCinkusz bundle; the 'in-progress
scan banner' precedent already established this divergence pattern.
Manifest bumped 0.3.1 -> 0.4.0.

* feat(achievements): share-on-X as primary action on share dialog

Adds a 'Share on X' button as the primary action in the share dialog.
Opens https://x.com/intent/post with a pre-filled tweet referencing
the achievement name, tier, @NousResearch, and the Hermes docs URL.
Copy image and Download PNG become secondary actions: users who want
the badge attached can Copy image, paste into the X composer, post.

Primary button styled as X's signature black-on-white fill so the
action is unambiguous.
nickdlkk pushed a commit to nickdlkk/hermes-agent that referenced this pull request May 11, 2026
…h#19657)

* feat(achievements): share card render on unlocked badges

Adds a Share button to each unlocked achievement card that opens a
modal and renders a 1200x630 PNG share card client-side via Canvas2D
(no backend, no network, no new deps). Two actions: Download PNG and
Copy image to clipboard.

Card layout mirrors the in-dashboard visual language: tier-colored
glow, icon from the existing LUCIDE sprite set, achievement name,
tier badge pill, description, progress stat line, and a Hermes Agent
watermark. Sized for X/Twitter, Discord, LinkedIn, Bluesky link
previews.

Vendored on top of the upstream @PCinkusz bundle; the 'in-progress
scan banner' precedent already established this divergence pattern.
Manifest bumped 0.3.1 -> 0.4.0.

* feat(achievements): share-on-X as primary action on share dialog

Adds a 'Share on X' button as the primary action in the share dialog.
Opens https://x.com/intent/post with a pre-filled tweet referencing
the achievement name, tier, @NousResearch, and the Hermes docs URL.
Copy image and Download PNG become secondary actions: users who want
the badge attached can Copy image, paste into the X composer, post.

Primary button styled as X's signature black-on-white fill so the
action is unambiguous.
rmulligan pushed a commit to rmulligan/hermes-agent that referenced this pull request May 11, 2026
…h#19657)

* feat(achievements): share card render on unlocked badges

Adds a Share button to each unlocked achievement card that opens a
modal and renders a 1200x630 PNG share card client-side via Canvas2D
(no backend, no network, no new deps). Two actions: Download PNG and
Copy image to clipboard.

Card layout mirrors the in-dashboard visual language: tier-colored
glow, icon from the existing LUCIDE sprite set, achievement name,
tier badge pill, description, progress stat line, and a Hermes Agent
watermark. Sized for X/Twitter, Discord, LinkedIn, Bluesky link
previews.

Vendored on top of the upstream @PCinkusz bundle; the 'in-progress
scan banner' precedent already established this divergence pattern.
Manifest bumped 0.3.1 -> 0.4.0.

* feat(achievements): share-on-X as primary action on share dialog

Adds a 'Share on X' button as the primary action in the share dialog.
Opens https://x.com/intent/post with a pre-filled tweet referencing
the achievement name, tier, @NousResearch, and the Hermes docs URL.
Copy image and Download PNG become secondary actions: users who want
the badge attached can Copy image, paste into the X composer, post.

Primary button styled as X's signature black-on-white fill so the
action is unambiguous.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

comp/plugins Plugin system and bundled plugins P3 Low — cosmetic, nice to have type/feature New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants