> ## Documentation Index
> Fetch the complete documentation index at: https://docs.nudj.cx/llms.txt
> Use this file to discover all available pages before exploring further.

# v2.473.4

> Released August 5, 2026

## 🔴 Release v2.473.4

⭐⭐ Moderate Complexity • 8 commits • 114 files changed

<Note>
  This release delivers a critical widget reliability fix that prevents customer experiences from disappearing when identity tokens expire, plus significant admin workflow improvements for game content management and theme customization. Admins can now bulk-manage game text across languages with a safety-gated diff preview, and define custom card border styles to match brand aesthetics.
</Note>

## What's New

* **Widget Recovery from Expired Identity Tokens** – Loyalty widgets now gracefully recover when merchant-supplied identity JWTs expire (10-minute lifetime), instead of silently disappearing for cached page loads
* **Game Text Export/Import with Diff Preview** – Download game text as JSON, translate across languages, and upload with a per-field diff preview before applying changes—eliminating manual Postman workflows
* **Custom Card Border Radius Presets** – Define brand-specific border styles for cards in theme settings; admins can choose preset radii or apply custom values to match design systems
* **Theme-Aware Loading Feedback** – Preview mode switcher now shows a loading indicator when transitioning between Widget and Hub previews, eliminating ambiguity during preview loads
* **Controlled Community Branding Visibility** – Detail page surfaces now respect community identity visibility settings, giving admins finer control over brand presence on secondary pages

## Apps Updated

<CardGroup cols={3}>
  <Card title="User App" icon="mobile">
    ✓ Updated — 2 fixes
  </Card>

  <Card title="API" icon="server">
    ✓ Updated — Schema & data model changes
  </Card>

  <Card title="Admin" icon="gear">
    ✓ Updated — 3 features & improvements
  </Card>

  <Card title="MCP Server" icon="robot">
    — No changes
  </Card>

  <Card title="Games" icon="gamepad">
    — No changes
  </Card>

  <Card title="Packages" icon="box">
    ✓ Updated — Models & database
  </Card>
</CardGroup>

## Detailed Changes

<AccordionGroup>
  <Accordion title="User App" icon="mobile">
    **Widget JWT Recovery (NJ-1908)** — The embedded widget now survives expired identity tokens. When a merchant page is cached or CDN-served longer than 10 minutes, the widget previously showed nothing. Now it re-resolves callback tokens once, then boots in guest/sign-in mode if needed. 373 new test cases ensure recovery works across static tokens, callback tokens, and origin rejections.

    **Community Identity Visibility (WS-611)** — Detail page surfaces (post details, parallax layouts) now respect the community branding visibility setting, preventing unwanted brand exposure on secondary pages. Includes 145 new test cases covering layout combinations.
  </Accordion>

  <Accordion title="API" icon="server">
    * Updated admin schema to support custom card border radius presets
    * Extended integration schema with new border-radius configuration fields
    * Added database models for style platform configuration with border-radius storage
    * New DTOs to represent custom border styles in community theme configurations
  </Accordion>

  <Accordion title="Admin" icon="gear">
    **Game Text JSON Export/Import (NJ-1871)** — A new admin workflow for managing game text across languages. Download current game text as JSON, send to translators, and upload back. Before applying changes, a **per-field diff preview** shows exactly what will change — field-by-field comparison with a safety gate. Eliminates building JSON bodies in Postman and prevents silent overwrites.

    **Custom Card Border Radius (WS-614)** — Theme settings now expose **border-radius presets** for styled cards. Admins select from preset options (rounded, pill, sharp) or define custom pixel values. The setting cascades through the widget's card components via CSS variables, instantly visible in the live preview panel. 26 new test cases ensure presets render consistently across light/dark modes and different card types.

    **Preview Loading Indicator (NJ-1910)** — The Widget/Hub preview switcher now displays a loading indicator while the preview reloads, providing clear visual feedback that the system is responding.
  </Accordion>
</AccordionGroup>

## For Platform Admins

### Game Content Management at Scale

If you manage game text across multiple languages, the new **JSON export/import** workflow saves hours of manual setup:

1. Open a game's config form
2. Click **Download Game Text** to get a JSON file with all translatable fields
3. Send to a translator or translation service
4. Upload the translated file back
5. Review the **side-by-side diff** showing every changed field
6. Confirm to apply (or cancel to discard)

The diff preview prevents accidental overwrites — you see exactly what's changing before it commits.

### Brand-Consistent Card Styling

Customize card appearance in **Branding & Appearance** settings:

1. Go to **Control Room** → **Settings** → **Branding & Appearance**
2. Under **Visual Style**, choose a **Border Style** preset (Rounded / Pill / Sharp)
3. Or define a custom border radius in pixels
4. Watch the live widget preview update instantly
5. Save, and the style rolls out to all widgets in the community

## For End Users

The loyalty widget is now more reliable when accessed from cached or CDN-served pages. If an identity token expires mid-session, the widget recovers gracefully instead of disappearing—you'll see a sign-in prompt or guest mode, and engagement continues without interruption.

## Technical Notes

* **Widget Recovery Strategy**: When a merchant-supplied identity JWT fails verification (401), the embed script now:
  1. For callback tokens: re-resolves once (merchants can refresh stale tokens this way)
  2. If re-resolved token still rejected: falls back to no-JWT boot (guest/sign-in mode)
  3. For static tokens: skips pointless replay, goes straight to no-JWT fallback
  4. For origin rejections (no JWT sent): renders nothing (intended behavior preserved)

* **Game Text Serialization**: JSON export/import uses a canonical field-mapping schema to ensure round-trip fidelity. The diff engine is field-aware, not line-based, so multi-line field changes render cleanly.

* **Border Radius Inheritance**: Border styles cascade through CSS custom properties (`--border-radius-preset`) on the widget root, so all nested card elements inherit consistently without individual overrides.

## Contributors

<CardGroup cols={4}>
  <Card>
    <img src="https://github.com/dch@wenudj.com.png" alt="dch@wenudj.com" style={{borderRadius: '50%', width: 48}} />

    **@dch**

    4 commits • +4127/-314 lines
  </Card>

  <Card>
    <img src="https://github.com/solicshop@gmail.com.png" alt="solicshop@gmail.com" style={{borderRadius: '50%', width: 48}} />

    **@solicshop**

    2 commits • +2359/-34 lines
  </Card>

  <Card>
    <img src="https://github.com/HienH.png" alt="HienH" style={{borderRadius: '50%', width: 48}} />

    **@HienH**

    1 commit • +18/-4 lines
  </Card>
</CardGroup>

## Release Stats

| Metric        | Value       |
| ------------- | ----------- |
| Total Commits | 8           |
| Lines Added   | +6,653      |
| Lines Removed | -353        |
| Files Changed | 114         |
| Release Size  | 🔴 Massive  |
| Complexity    | ⭐⭐ Moderate |

***

*v2.473.4 deployed on August 5, 2026*
