@@ -52,7 +52,7 @@ Play Coup with 2–6 players from any device — no app install, no accounts. Cr
### Interface
- **Mobile-first** — portrait-optimized touch UI with 48px+ tap targets
-- **Dark table theme** — generated tabletop backgrounds, compact illustrated cards, readable role/action labels, and character-colored borders
+- **Retro-futurist table theme** — original generated character portraits, atmospheric tabletop backgrounds, readable role/action labels, and character-colored borders
- **Haptic feedback** — vibration on taps for mobile devices (with iOS Safari fallback), togglable in settings
- **Settings modal** — accessible from home, lobby, and in-game via gear icon. Controls for sound, haptic feedback (touch devices only), reduced animation, and text size (Normal / Large / Extra Large)
- **Player stats** — local lifetime stats, awards, and match history are available from the home screen
@@ -208,14 +208,12 @@ Coup/
│ ├── ROADMAP.md # Prioritized post-main product polish and follow-ups
│ └── REFORMATION_PLAN.md # Reformation expansion implementation plan
├── public/ # PWA icons, Open Graph image, and generated game art
-│ ├── assets/ # Card, banner, and table background raster assets
+│ ├── assets/ # Versioned cards, tables, wordmark, and app-icon master
│ ├── icons/ # PWA install icons
-│ ├── coup-logo.png # Project/app icon used in docs
-│ ├── coup-logo-transparent.png # Transparent-corner icon for docs/social art
-│ ├── embed-image.png # Twitter/large-card social preview
-│ ├── favicon.ico # Browser favicon
+│ ├── embed-image-v3.png # Twitter/large-card social preview
+│ ├── favicon-v2.ico # Browser favicon
│ ├── sw.js # Production service worker for static game assets
-│ └── og-image.png # Open Graph social preview
+│ └── og-image-v3.png # Open Graph social preview
├── tests/ # Test suite
│ ├── engine/ # Engine unit tests
│ └── server/ # Server unit tests
diff --git a/docs/ASSETS.md b/docs/ASSETS.md
index 1ea0f36..adc8238 100644
--- a/docs/ASSETS.md
+++ b/docs/ASSETS.md
@@ -4,13 +4,13 @@ This app should use generated raster assets where they add mood, identity, or ca
## Good Imagegen Targets
-- **Home title banner** -- The first screen benefits from a branded raster masthead instead of plain SVG text. Current asset: `public/assets/brand/coup-online-banner.png`.
-- **Influence card faces** -- Character portraits make known and revealed cards feel like real influence cards. Current UI assets: `public/assets/cards/{duke,assassin,captain,ambassador,contessa,inquisitor}-v2.webp`.
-- **Small-card close crops** -- Tiny mobile cards should use face/prop-forward crops instead of the full portrait composition. Current UI assets: `public/assets/cards/focus/{duke,assassin,captain,ambassador,contessa,inquisitor}-v2.webp`.
-- **Influence card back** -- Hidden cards need one recognizable card-back treatment. Current assets: `public/assets/cards/back.webp` and `public/assets/cards/focus/back.webp`.
-- **Game table backgrounds** -- The shared app background can use subtle raster tabletops because they add atmosphere without carrying gameplay state. Current assets: `public/assets/backgrounds/game-table.webp` and `public/assets/backgrounds/game-table-mobile.webp`.
-- **App/project icon** -- Home-screen/PWA icons need a strong raster emblem that reads at 16-512 px. Current assets: `public/coup-logo.png`, `public/coup-logo-transparent.png`, `public/icons/icon-192.png`, `public/icons/icon-512.png`, `public/icons/icon-maskable-512.png`, `public/apple-touch-icon.png`, `public/favicon-16x16.png`, `public/favicon-32x32.png`, and `public/favicon.ico`.
-- **Social/share imagery** -- Open Graph, README screenshots, and store/promotional surfaces can use composed raster art because they are not interactive controls. Current assets: `public/og-image.png` and `public/embed-image.png`.
+- **Home title banner** -- The first screen benefits from a branded raster masthead instead of plain SVG text. Current asset: `public/assets/brand/coup-online-banner-v2.webp`.
+- **Influence card faces** -- Character portraits make known and revealed cards feel like real influence cards. Current UI assets: `public/assets/cards/{duke,assassin,captain,ambassador,contessa,inquisitor}-v3.webp`.
+- **Small-card close crops** -- Tiny mobile cards should use face/prop-forward crops instead of the full portrait composition. Current UI assets: `public/assets/cards/focus/{duke,assassin,captain,ambassador,contessa,inquisitor}-v3.webp`.
+- **Influence card back** -- Hidden cards need one recognizable card-back treatment. Current assets: `public/assets/cards/back-v2.webp` and `public/assets/cards/focus/back-v2.webp`.
+- **Game table backgrounds** -- The shared app background can use subtle raster tabletops because they add atmosphere without carrying gameplay state. Current assets: `public/assets/backgrounds/game-table-v2.webp` and `public/assets/backgrounds/game-table-mobile-v2.webp`.
+- **App/project icon** -- Home-screen/PWA icons need a strong raster emblem that reads at 16-512 px. The 1024 px master is `public/assets/brand/app-icon-v2.png`; versioned PWA, Apple touch, maskable, and favicon derivatives live under `public/icons/` and `public/`.
+- **Social/share imagery** -- Open Graph, README screenshots, and store/promotional surfaces can use composed raster art because they are not interactive controls. Current assets: `public/og-image-v3.png` and `public/embed-image-v3.png`.
## Keep Code-Native
@@ -29,118 +29,110 @@ This app should use generated raster assets where they add mood, identity, or ca
## Generated Asset Prompts
-Generated with the built-in `image_gen` tool.
+The v2 brand, environment, icon, and card-back system was generated in Midjourney V8.1 using the approved character portraits as style references. The palette is blackened teal, crimson enamel, aged brass, and restrained cyan, with screen-printed gouache texture and a fictional 1970s dystopian civic-design language.
+
+| Source download | Repository output | Production treatment |
+| --- | --- | --- |
+| `Desktop Wallpaper.png` | `game-table-v2.webp` | 1456×816 WebP, quality 82 |
+| `Mobile Table.png` | `game-table-mobile-v2.webp` | 816×1456 WebP, quality 82 |
+| `Wordmark.png` | `coup-online-banner-v2.webp` | black keyed to alpha; 864×344 WebP at quality 92 |
+| `Card Back.png` | `back-v2.webp` and `focus/back-v2.webp` | full 512×768 plus centered focus crop |
+| `App Icon.png` | `app-icon-v2.png` plus PWA/favicon derivatives | master retained at 1024 px; Lanczos downscales |
+| `promotional.png` | `og-image-v3.png` and `embed-image-v3.png` | exact project text and the six approved cards composited afterward |
### App Icon
```text
-Use case: logo-brand
-Asset type: square app icon for Coup Online PWA, favicon, README project icon, and mobile home-screen shortcut
-Primary request: create an original premium square app icon for a dark court-intrigue bluffing card game called Coup Online
-Subject: a simple antique-gold crown over a vertical dagger, with two subtle crossed influence-card silhouettes behind it, small crimson enamel accents, on a deep emerald-black velvet square
-Style/medium: polished board-game app icon, crisp emblem, high contrast, readable at 32px and 192px, modern iOS/Android app icon polish
-Composition/framing: centered emblem, generous safe margin, square 1:1 composition, slightly rounded-square friendly design, no border that would disappear when masked
-Lighting/mood: dramatic low-key lighting with warm gold highlights, secretive and refined
-Color palette: near-black emerald, antique gold, deep crimson, small cool steel highlights
-Materials/textures: brushed metal, enamel, velvet, subtle paper grain
-Text (verbatim): none
-Constraints: no text, no letters, no numbers, no watermark, no official Coup artwork, no people or faces, simple silhouette readable at favicon size, avoid tiny details
-Avoid: words, initials, QR codes, busy background, full card faces, overly complex heraldry, cartoon style
+A single original retro-futurist political intrigue emblem for a bluffing strategy game,
+an abstract fractured civic crown reduced to severe geometric planes intersecting a
+narrow vertical signal beam, backed by a partially eclipsed disc, perfectly centered,
+immediately recognizable at 32 pixels, dark crimson enamel, oxidized brass, blackened
+teal and one restrained cyan highlight, screen-printed gouache and ink texture, generous
+safe margin, no words, no people, no medieval heraldry --ar 1:1 --v 8.1 --raw --s 90 --c 8
```
-The social card was composed from generated project assets so display text remains exact: `public/assets/backgrounds/game-table.webp`, `public/assets/brand/coup-online-banner.png`, `public/coup-logo-transparent.png`, and selected `*-v2.webp` character-card portraits.
+The maskable derivative scales the master emblem to 86% and feathers it over an opaque teal extension so the important geometry stays within platform safe zones. Normal, Apple touch, and favicon derivatives retain the full composition.
### Title Banner
```text
-Use case: logo-brand
-Asset type: home screen title banner for a dark mobile-first web card game
-Primary request: create an original raster title banner with exact readable text for the game, not based on official Coup board-game art
-Subject: the words COUP ONLINE with subtle crown and dagger court-intrigue motifs
-Style/medium: premium board-game title treatment, polished red enamel lettering with antique gold bevels, light metallic wear, dark transparent-looking background suitable for a dark UI
-Composition/framing: wide horizontal banner, centered, strong silhouette, readable when displayed around 260-320 px wide
-Lighting/mood: dramatic low-key studio lighting, refined and tense
-Color palette: deep crimson, antique gold, small cool silver-blue accents, near-black negative space
-Text (verbatim): "COUP ONLINE"
-Constraints: spell the text exactly as COUP ONLINE; no other words; no watermark; no official Coup artwork; avoid busy background; keep edges clean for web use
-Avoid: extra letters, misspellings, small unreadable subtitle text, logos, QR codes, people, cards covering the words
+Wide horizontal retro-futurist political-thriller board-game wordmark displaying the
+exact words "COUP ONLINE" and no other writing, bold condensed geometric capitals with
+sharp asymmetric cuts, dark crimson enamel faces, oxidized-brass edges, restrained cyan
+offset shadow, screen-printed ink wear, a small split-eclipse civic emblem, perfectly
+front-facing on near-black, no mockup, no extra writing --ar 5:2 --v 8.1 --raw --s 60 --c 5
```
### Card Back
```text
-Use case: stylized-concept
-Asset type: reusable card back art for Coup Online influence cards
-Primary request: create an original vertical playing-card back, no text, for a dark court-intrigue bluffing game
-Subject: symmetrical crown, dagger, and diamond heraldry pattern, designed as a premium card back
-Style/medium: polished digital board-game card art, ornate but readable at small sizes
-Composition/framing: vertical 2:3 card portrait, centered emblem, full-bleed art, no outer transparent margin
-Lighting/mood: dark, secretive, metallic highlights
-Color palette: near-black navy, antique gold, restrained crimson accents
-Materials/textures: worn enamel, brushed metal, subtle paper grain
-Constraints: no letters, no numbers, no watermark, no official Coup artwork, no white border; keep central motif simple enough to read at 48px tall
-Avoid: text, QR codes, faces, extra icons, busy repeating detail
+Perfectly symmetrical vertical influence-card back for a retro-futurist dystopian
+bluffing game, central fractured-crown and eclipse civic emblem, nested blackened-teal
+and charcoal panels, oxidized-brass circuit-like border, crimson enamel center,
+screen-printed gouache and ink, aged paper grain, strong silhouette readable at 48 pixels,
+no people, no writing, no mockup --ar 2:3 --v 8.1 --raw --s 110 --c 6
```
-### Game Table Background
+### Desktop Game Table Background
```text
-Use case: stylized-concept
-Asset type: subtle full-screen game background for a web card game UI
-Primary request: a dark, low-contrast political intrigue tabletop background for Coup Online
-Scene/backdrop: top-down/three-quarter view of a luxurious strategy game table in a dim court chamber, with dark green-black velvet, muted burgundy leather edges, faint antique gold filigree, soft shadows from candles outside the frame, and barely visible scattered coins and face-down cards near the edges
-Subject: atmospheric tabletop surface only; no people, no readable cards, no logos, no text
-Style/medium: polished painterly-realistic game UI background, refined and expensive, not busy
-Composition/framing: wide 16:9 composition, central area intentionally calm and dark for UI readability, details concentrated toward corners and edges, seamless enough to crop on mobile
-Lighting/mood: moody, conspiratorial, warm gold rim light, restrained contrast
-Color palette: deep charcoal, blackened navy, dark emerald, muted burgundy, antique gold highlights
-Materials/textures: velvet felt, aged leather, tarnished metal coin hints, subtle paper/card texture
-Constraints: no text, no watermark, no characters, no large bright areas, no high-detail focal object in the center, do not make it look like a marketing hero image
-Avoid: neon colors, purple-blue gradient background, ornate clutter in the center, readable symbols, oversized objects, cartoon style
+Strict 90-degree overhead orthographic flat-lay view of a rectangular retro-futurist
+strategy-game tabletop, camera pointing perfectly downward, entire frame filled by a
+blackened-teal playing surface with an oxblood perimeter, aged-brass routing lines and
+small props only at the corners, central seventy-five percent empty and low-contrast,
+no room, no horizon, no vanishing point, no angled camera --ar 16:9 --v 8.1 --raw --s 100 --c 4
```
### Mobile Game Table Background
```text
-Use case: stylized-concept
-Asset type: portrait mobile game background for a web card game UI
-Primary request: create a mobile-specific version of the Coup Online game table background with the same dark political-intrigue aesthetic as the visible reference image, but composed for a phone screen so the tabletop feels scaled down and fits the full portrait viewport.
-Input images: visible reference image is the current desktop table background; match its mood, palette, material style, and restraint, but do not simply crop it.
-Scene/backdrop: top-down/three-quarter view of a luxurious strategy game table in a dim court chamber, dark green-black velvet center, muted burgundy leather border, faint antique gold filigree, very soft candle glow outside the frame, small coins and face-down cards near corners and edges.
-Subject: atmospheric tabletop surface only; no people, no readable cards, no logos, no text.
-Style/medium: polished painterly-realistic game UI background, refined and expensive, low-contrast, not busy.
-Composition/framing: vertical 9:16 mobile composition. Keep the full table border visible enough at top, bottom, and sides so it reads as a smaller tabletop fitted to mobile. Central 70% must remain calm, dark, and low-detail for UI readability. Place edge details smaller and farther toward corners than the desktop version; do not crowd the middle.
-Lighting/mood: moody, conspiratorial, warm antique-gold rim light, restrained contrast.
-Color palette: deep charcoal, blackened navy, dark emerald, muted burgundy, antique gold highlights.
-Materials/textures: velvet felt, aged leather, tarnished metal coin hints, subtle paper/card texture.
-Constraints: portrait/mobile-first; no text, no watermark, no characters, no large bright areas, no high-detail focal object in the center; must remain readable behind dense mobile UI.
-Avoid: a zoomed-in crop, neon colors, purple-blue gradient background, ornate clutter in the center, readable symbols, oversized objects, cartoon style.
+Portrait mobile background showing a complete retro-futurist strategy table, strict overhead
+view, blackened-teal composite surface with oxblood and aged-brass borders visible on every
+side, tiny props at the outer corners, central seventy percent calm and low-detail, scaled
+to a phone rather than cropped from desktop, no people or writing --ar 9:16 --v 8.1 --raw --s 125 --c 8
```
+### Social Preview
+
+`promotional.png` supplies the 40:21 council-chamber backdrop only. The final 1200×630 image is composed locally with a translucent upper shade, the keyed v2 wordmark, exact HTML-equivalent marketing copy, and the six real v3 card portraits. This covers the generated placeholder card shapes and prevents text or character drift.
+
### Character Cards
-The v2 character cards intentionally mirror the SVG/action palette so card identity is readable before the text label:
+The v3 character cards are original Midjourney illustrations made for this project. They reinterpret the game's six roles as a cohesive retro-futurist dystopian court: editorial portrait framing, screen-printed paper texture, hard graphic shadows, restrained geometric architecture, and a distinct role color. No official game artwork was supplied as an image reference or bundled in the repository.
+
+Each source was a 1792×2688 four-up grid. The approved 896×1344 quadrant was exported to a 512×768 WebP for normal cards, then reframed into a tighter crop at the same output size for small gameplay surfaces.
-- Duke: royal purple and antique gold for `TAX`
-- Assassin: slate gray and cold silver for `KILL`
-- Captain: royal blue and brass for `STEAL`
-- Ambassador: emerald green and gold for `EXCHANGE`
-- Contessa: crimson red and gold for `BLOCK`
-- Inquisitor: deep teal and pale teal for `EXAMINE`
+| Role | Selected variation | Focus crop `(x, y, w, h)` | Visual identity |
+| --- | --- | --- | --- |
+| Duke | `0bfa152b…`, top-left | `120, 0, 720, 1080` | Plum and antique gold; silver-haired corporate ruler at an obsidian council dais |
+| Assassin | `ae7ca449…`, top-left | `32, 0, 832, 1248` | Slate and electric blue; female operative with a blunt fringe and sculptural platinum ponytail |
+| Captain | `879c6c0f…`, top-left | `64, 0, 768, 1152` | Cobalt and brass; naval commander over a tactical display |
+| Ambassador | `22544db9…`, bottom-right | `128, 0, 768, 1152` | Chartreuse and amber; diplomat with a translation visor in an embassy concourse |
+| Contessa | `c4aeb41c…`, top-left | `64, 0, 768, 1152` | Crimson and gold; aristocratic protector with a strong heraldic silhouette |
+| Inquisitor | `e450c4c8…`, top-left | `64, 0, 768, 1152` | Deep teal and pale cyan; watchful investigator with an optical device |
-Base v2 prompt shape used for each character:
+The prompt structure kept the renderer, era, finish, and framing consistent while varying each role's casting, silhouette, location, palette, and readable prop:
```text
-Use case: stylized-concept
-Asset type: vertical 2:3 influence card face portrait for Coup Online, v2
-Primary request: create an original portrait that is immediately distinct from the other roles and strongly communicates the / action color system
-Subject:
-Style/medium: polished semi-realistic digital board-game card illustration, premium dark court-intrigue style, cohesive with a multiplayer bluffing card game
-Composition/framing: vertical 2:3 portrait, head and shoulders large, role prop clearly readable at tiny mobile card size, central bust silhouette, crop-safe, full-bleed art with no border
-Lighting/mood: dramatic lighting matching the character and action
-Color palette: dominant character/action color from the SVG icon, secondary highlight color, antique gold only as accent
-Materials/textures: period clothing, metal, parchment or role-specific props, subtle painterly paper grain
-Text (verbatim): none
-Constraints: original art only; no text, no letters, no numbers, no watermark, no border, no official Coup artwork; role must read through color and props even when displayed very small
-Avoid: generic brown palette, modern clothing, extra characters, busy background, text labels, card frame, logo
+Retro-futurist dystopian board-game character illustration of ,
+, ,
+editorial 1960s/1970s science-fiction paperback art, screen-printed gouache and ink,
+subtle aged paper grain, hard graphic shadows, elegant geometric architecture,
+limited , centered three-quarter portrait, waist-up, strong silhouette,
+generous crop-safe space around the head, premium tabletop card art, no text,
+no letters, no numbers, no logo, no watermark, no card border, no split panels,
+no collage --ar 2:3 --v 8.2 --raw --s 150 --c 15
```
+
+Role prompts should describe the character rather than name an existing actor or artist. Keep the shared style clause and parameters unchanged between roles; vary pose and setting deliberately so the set stays related without becoming six palette swaps. Generated grids may drift from the requested casting, so selection is based on the artwork itself rather than prompt wording alone.
+
+### Character Card Production
+
+1. Download the original Midjourney grid, not an HD reinterpretation, so the approved variation remains exact.
+2. Crop the selected quadrant losslessly at 896×1344.
+3. Create the full asset by scaling the quadrant to 512×768 and encode it as WebP at quality 84.
+4. Create a separate 2:3 focus crop around the face and role prop, then scale and encode it with the same settings. Leave extra vertical safety for the UI's `object-cover` card containers.
+5. Update both maps in `src/app/utils/assets.ts`, the service-worker precache list, README thumbnails, social previews, and this document.
+6. Bump versioned filenames and `CACHE_NAME` in `public/sw.js` together so installed clients do not retain the previous portraits.
+
+Do not bake names, action labels, borders, or icons into the raster art. Those remain code-native so they stay sharp, accessible, and consistent across full cards, compact cards, reveal overlays, tutorials, Exchange, Examine, and post-game views.
diff --git a/docs/REFORMATION_PLAN.md b/docs/REFORMATION_PLAN.md
index 2d97306..3f8b0b0 100644
--- a/docs/REFORMATION_PLAN.md
+++ b/docs/REFORMATION_PLAN.md
@@ -162,7 +162,7 @@ Examine flow:
- Color: Teal primary (#0d9488), light teal highlights (#5eead4)
- Animated: iris slowly pulses, magnifying glass has subtle gleam sweep
-**Generated influence card art:** Reformation-enabled decks should use the same raster card-face pipeline as the base game, including `public/assets/cards/inquisitor-v2.webp` for the Inquisitor influence card. Keep the SVG `InquisitorIcon` for compact action/block controls where exact symbol readability matters.
+**Generated influence card art:** Reformation-enabled decks should use the same raster card-face pipeline as the base game, including `public/assets/cards/inquisitor-v3.webp` for the Inquisitor influence card. Keep the SVG `InquisitorIcon` for compact action/block controls where exact symbol readability matters.
**FactionBadge SVGs:**
- Loyalist: Blue shield with crown silhouette (#3b82f6)
diff --git a/public/apple-touch-icon-v2.png b/public/apple-touch-icon-v2.png
new file mode 100644
index 0000000..a16d0eb
Binary files /dev/null and b/public/apple-touch-icon-v2.png differ
diff --git a/public/apple-touch-icon.png b/public/apple-touch-icon.png
deleted file mode 100644
index d1a7e95..0000000
Binary files a/public/apple-touch-icon.png and /dev/null differ
diff --git a/public/assets/backgrounds/game-table-mobile-v2.webp b/public/assets/backgrounds/game-table-mobile-v2.webp
new file mode 100644
index 0000000..f8aec79
Binary files /dev/null and b/public/assets/backgrounds/game-table-mobile-v2.webp differ
diff --git a/public/assets/backgrounds/game-table-mobile.webp b/public/assets/backgrounds/game-table-mobile.webp
deleted file mode 100644
index 6350de5..0000000
Binary files a/public/assets/backgrounds/game-table-mobile.webp and /dev/null differ
diff --git a/public/assets/backgrounds/game-table-v2.webp b/public/assets/backgrounds/game-table-v2.webp
new file mode 100644
index 0000000..d98daa2
Binary files /dev/null and b/public/assets/backgrounds/game-table-v2.webp differ
diff --git a/public/assets/backgrounds/game-table.webp b/public/assets/backgrounds/game-table.webp
deleted file mode 100644
index dce2861..0000000
Binary files a/public/assets/backgrounds/game-table.webp and /dev/null differ
diff --git a/public/assets/brand/app-icon-v2.png b/public/assets/brand/app-icon-v2.png
new file mode 100644
index 0000000..f2f5429
Binary files /dev/null and b/public/assets/brand/app-icon-v2.png differ
diff --git a/public/assets/brand/coup-online-banner-v2.webp b/public/assets/brand/coup-online-banner-v2.webp
new file mode 100644
index 0000000..d0c112e
Binary files /dev/null and b/public/assets/brand/coup-online-banner-v2.webp differ
diff --git a/public/assets/brand/coup-online-banner.png b/public/assets/brand/coup-online-banner.png
deleted file mode 100644
index c351822..0000000
Binary files a/public/assets/brand/coup-online-banner.png and /dev/null differ
diff --git a/public/assets/cards/ambassador-v2.webp b/public/assets/cards/ambassador-v2.webp
deleted file mode 100644
index ea80aa1..0000000
Binary files a/public/assets/cards/ambassador-v2.webp and /dev/null differ
diff --git a/public/assets/cards/ambassador-v3.webp b/public/assets/cards/ambassador-v3.webp
new file mode 100644
index 0000000..db155eb
Binary files /dev/null and b/public/assets/cards/ambassador-v3.webp differ
diff --git a/public/assets/cards/assassin-v2.webp b/public/assets/cards/assassin-v2.webp
deleted file mode 100644
index 7d30875..0000000
Binary files a/public/assets/cards/assassin-v2.webp and /dev/null differ
diff --git a/public/assets/cards/assassin-v3.webp b/public/assets/cards/assassin-v3.webp
new file mode 100644
index 0000000..00e8b33
Binary files /dev/null and b/public/assets/cards/assassin-v3.webp differ
diff --git a/public/assets/cards/back-v2.webp b/public/assets/cards/back-v2.webp
new file mode 100644
index 0000000..c91bd05
Binary files /dev/null and b/public/assets/cards/back-v2.webp differ
diff --git a/public/assets/cards/back.webp b/public/assets/cards/back.webp
deleted file mode 100644
index b3e3e2f..0000000
Binary files a/public/assets/cards/back.webp and /dev/null differ
diff --git a/public/assets/cards/captain-v2.webp b/public/assets/cards/captain-v2.webp
deleted file mode 100644
index f397946..0000000
Binary files a/public/assets/cards/captain-v2.webp and /dev/null differ
diff --git a/public/assets/cards/captain-v3.webp b/public/assets/cards/captain-v3.webp
new file mode 100644
index 0000000..ca8b735
Binary files /dev/null and b/public/assets/cards/captain-v3.webp differ
diff --git a/public/assets/cards/contessa-v2.webp b/public/assets/cards/contessa-v2.webp
deleted file mode 100644
index 13f74df..0000000
Binary files a/public/assets/cards/contessa-v2.webp and /dev/null differ
diff --git a/public/assets/cards/contessa-v3.webp b/public/assets/cards/contessa-v3.webp
new file mode 100644
index 0000000..3a740d9
Binary files /dev/null and b/public/assets/cards/contessa-v3.webp differ
diff --git a/public/assets/cards/duke-v2.webp b/public/assets/cards/duke-v2.webp
deleted file mode 100644
index 99395d5..0000000
Binary files a/public/assets/cards/duke-v2.webp and /dev/null differ
diff --git a/public/assets/cards/duke-v3.webp b/public/assets/cards/duke-v3.webp
new file mode 100644
index 0000000..3763336
Binary files /dev/null and b/public/assets/cards/duke-v3.webp differ
diff --git a/public/assets/cards/focus/ambassador-v2.webp b/public/assets/cards/focus/ambassador-v2.webp
deleted file mode 100644
index e2b0cff..0000000
Binary files a/public/assets/cards/focus/ambassador-v2.webp and /dev/null differ
diff --git a/public/assets/cards/focus/ambassador-v3.webp b/public/assets/cards/focus/ambassador-v3.webp
new file mode 100644
index 0000000..aa166f6
Binary files /dev/null and b/public/assets/cards/focus/ambassador-v3.webp differ
diff --git a/public/assets/cards/focus/assassin-v2.webp b/public/assets/cards/focus/assassin-v2.webp
deleted file mode 100644
index 499236a..0000000
Binary files a/public/assets/cards/focus/assassin-v2.webp and /dev/null differ
diff --git a/public/assets/cards/focus/assassin-v3.webp b/public/assets/cards/focus/assassin-v3.webp
new file mode 100644
index 0000000..2e6f918
Binary files /dev/null and b/public/assets/cards/focus/assassin-v3.webp differ
diff --git a/public/assets/cards/focus/back-v2.webp b/public/assets/cards/focus/back-v2.webp
new file mode 100644
index 0000000..1d056b2
Binary files /dev/null and b/public/assets/cards/focus/back-v2.webp differ
diff --git a/public/assets/cards/focus/back.webp b/public/assets/cards/focus/back.webp
deleted file mode 100644
index f955167..0000000
Binary files a/public/assets/cards/focus/back.webp and /dev/null differ
diff --git a/public/assets/cards/focus/captain-v2.webp b/public/assets/cards/focus/captain-v2.webp
deleted file mode 100644
index 62e293a..0000000
Binary files a/public/assets/cards/focus/captain-v2.webp and /dev/null differ
diff --git a/public/assets/cards/focus/captain-v3.webp b/public/assets/cards/focus/captain-v3.webp
new file mode 100644
index 0000000..355024b
Binary files /dev/null and b/public/assets/cards/focus/captain-v3.webp differ
diff --git a/public/assets/cards/focus/contessa-v2.webp b/public/assets/cards/focus/contessa-v2.webp
deleted file mode 100644
index e690fd5..0000000
Binary files a/public/assets/cards/focus/contessa-v2.webp and /dev/null differ
diff --git a/public/assets/cards/focus/contessa-v3.webp b/public/assets/cards/focus/contessa-v3.webp
new file mode 100644
index 0000000..cce3e9f
Binary files /dev/null and b/public/assets/cards/focus/contessa-v3.webp differ
diff --git a/public/assets/cards/focus/duke-v2.webp b/public/assets/cards/focus/duke-v2.webp
deleted file mode 100644
index 7589634..0000000
Binary files a/public/assets/cards/focus/duke-v2.webp and /dev/null differ
diff --git a/public/assets/cards/focus/duke-v3.webp b/public/assets/cards/focus/duke-v3.webp
new file mode 100644
index 0000000..08ff0c4
Binary files /dev/null and b/public/assets/cards/focus/duke-v3.webp differ
diff --git a/public/assets/cards/focus/inquisitor-v2.webp b/public/assets/cards/focus/inquisitor-v2.webp
deleted file mode 100644
index 0d889d9..0000000
Binary files a/public/assets/cards/focus/inquisitor-v2.webp and /dev/null differ
diff --git a/public/assets/cards/focus/inquisitor-v3.webp b/public/assets/cards/focus/inquisitor-v3.webp
new file mode 100644
index 0000000..261376b
Binary files /dev/null and b/public/assets/cards/focus/inquisitor-v3.webp differ
diff --git a/public/assets/cards/inquisitor-v2.webp b/public/assets/cards/inquisitor-v2.webp
deleted file mode 100644
index f797ffa..0000000
Binary files a/public/assets/cards/inquisitor-v2.webp and /dev/null differ
diff --git a/public/assets/cards/inquisitor-v3.webp b/public/assets/cards/inquisitor-v3.webp
new file mode 100644
index 0000000..dab8565
Binary files /dev/null and b/public/assets/cards/inquisitor-v3.webp differ
diff --git a/public/coup-logo-transparent.png b/public/coup-logo-transparent.png
deleted file mode 100644
index b541a81..0000000
Binary files a/public/coup-logo-transparent.png and /dev/null differ
diff --git a/public/coup-logo.png b/public/coup-logo.png
deleted file mode 100644
index 51bff31..0000000
Binary files a/public/coup-logo.png and /dev/null differ
diff --git a/public/embed-image-v3.png b/public/embed-image-v3.png
new file mode 100644
index 0000000..857f789
Binary files /dev/null and b/public/embed-image-v3.png differ
diff --git a/public/embed-image.png b/public/embed-image.png
deleted file mode 100644
index 160a7b2..0000000
Binary files a/public/embed-image.png and /dev/null differ
diff --git a/public/favicon-16x16-v2.png b/public/favicon-16x16-v2.png
new file mode 100644
index 0000000..9628c56
Binary files /dev/null and b/public/favicon-16x16-v2.png differ
diff --git a/public/favicon-16x16.png b/public/favicon-16x16.png
deleted file mode 100644
index 1bd4f13..0000000
Binary files a/public/favicon-16x16.png and /dev/null differ
diff --git a/public/favicon-32x32-v2.png b/public/favicon-32x32-v2.png
new file mode 100644
index 0000000..d9c525b
Binary files /dev/null and b/public/favicon-32x32-v2.png differ
diff --git a/public/favicon-32x32.png b/public/favicon-32x32.png
deleted file mode 100644
index 3fdfdb9..0000000
Binary files a/public/favicon-32x32.png and /dev/null differ
diff --git a/public/favicon-v2.ico b/public/favicon-v2.ico
new file mode 100644
index 0000000..92dc6dd
Binary files /dev/null and b/public/favicon-v2.ico differ
diff --git a/public/favicon.ico b/public/favicon.ico
deleted file mode 100644
index c286b65..0000000
Binary files a/public/favicon.ico and /dev/null differ
diff --git a/public/icons/icon-192-v2.png b/public/icons/icon-192-v2.png
new file mode 100644
index 0000000..55a4b6e
Binary files /dev/null and b/public/icons/icon-192-v2.png differ
diff --git a/public/icons/icon-192.png b/public/icons/icon-192.png
deleted file mode 100644
index 79a367b..0000000
Binary files a/public/icons/icon-192.png and /dev/null differ
diff --git a/public/icons/icon-512-v2.png b/public/icons/icon-512-v2.png
new file mode 100644
index 0000000..68e7764
Binary files /dev/null and b/public/icons/icon-512-v2.png differ
diff --git a/public/icons/icon-512.png b/public/icons/icon-512.png
deleted file mode 100644
index 51bff31..0000000
Binary files a/public/icons/icon-512.png and /dev/null differ
diff --git a/public/icons/icon-maskable-512-v2.png b/public/icons/icon-maskable-512-v2.png
new file mode 100644
index 0000000..3c49b48
Binary files /dev/null and b/public/icons/icon-maskable-512-v2.png differ
diff --git a/public/icons/icon-maskable-512.png b/public/icons/icon-maskable-512.png
deleted file mode 100644
index 89b7356..0000000
Binary files a/public/icons/icon-maskable-512.png and /dev/null differ
diff --git a/public/og-image-v3.png b/public/og-image-v3.png
new file mode 100644
index 0000000..857f789
Binary files /dev/null and b/public/og-image-v3.png differ
diff --git a/public/og-image.png b/public/og-image.png
deleted file mode 100644
index 160a7b2..0000000
Binary files a/public/og-image.png and /dev/null differ
diff --git a/public/sw.js b/public/sw.js
index 16e46de..665eb1b 100644
--- a/public/sw.js
+++ b/public/sw.js
@@ -1,26 +1,26 @@
-const CACHE_NAME = 'coup-assets-v2';
+const CACHE_NAME = 'coup-assets-v3';
const ASSET_URLS = [
- '/icons/icon-192.png',
- '/icons/icon-512.png',
- '/icons/icon-maskable-512.png',
- '/apple-touch-icon.png',
- '/assets/backgrounds/game-table.webp',
- '/assets/backgrounds/game-table-mobile.webp',
- '/assets/brand/coup-online-banner.png',
- '/assets/cards/back.webp',
- '/assets/cards/focus/back.webp',
- '/assets/cards/duke-v2.webp',
- '/assets/cards/assassin-v2.webp',
- '/assets/cards/captain-v2.webp',
- '/assets/cards/ambassador-v2.webp',
- '/assets/cards/contessa-v2.webp',
- '/assets/cards/inquisitor-v2.webp',
- '/assets/cards/focus/duke-v2.webp',
- '/assets/cards/focus/assassin-v2.webp',
- '/assets/cards/focus/captain-v2.webp',
- '/assets/cards/focus/ambassador-v2.webp',
- '/assets/cards/focus/contessa-v2.webp',
- '/assets/cards/focus/inquisitor-v2.webp',
+ '/icons/icon-192-v2.png',
+ '/icons/icon-512-v2.png',
+ '/icons/icon-maskable-512-v2.png',
+ '/apple-touch-icon-v2.png',
+ '/assets/backgrounds/game-table-v2.webp',
+ '/assets/backgrounds/game-table-mobile-v2.webp',
+ '/assets/brand/coup-online-banner-v2.webp',
+ '/assets/cards/back-v2.webp',
+ '/assets/cards/focus/back-v2.webp',
+ '/assets/cards/duke-v3.webp',
+ '/assets/cards/assassin-v3.webp',
+ '/assets/cards/captain-v3.webp',
+ '/assets/cards/ambassador-v3.webp',
+ '/assets/cards/contessa-v3.webp',
+ '/assets/cards/inquisitor-v3.webp',
+ '/assets/cards/focus/duke-v3.webp',
+ '/assets/cards/focus/assassin-v3.webp',
+ '/assets/cards/focus/captain-v3.webp',
+ '/assets/cards/focus/ambassador-v3.webp',
+ '/assets/cards/focus/contessa-v3.webp',
+ '/assets/cards/focus/inquisitor-v3.webp',
'/audio/velvet-court.mp3',
'/audio/court-crowned.mp3',
'/audio/plot-unraveled.mp3',
@@ -49,7 +49,7 @@ self.addEventListener('fetch', event => {
const url = new URL(request.url);
if (url.origin !== self.location.origin) return;
- if (!url.pathname.startsWith('/assets/') && !url.pathname.startsWith('/audio/') && !url.pathname.startsWith('/icons/') && url.pathname !== '/apple-touch-icon.png') return;
+ if (!url.pathname.startsWith('/assets/') && !url.pathname.startsWith('/audio/') && !url.pathname.startsWith('/icons/') && !url.pathname.startsWith('/apple-touch-icon')) return;
event.respondWith(
caches.match(request).then(cached => {
diff --git a/src/app/components/pwa/PWAInstallPrompt.tsx b/src/app/components/pwa/PWAInstallPrompt.tsx
index 621fe14..9852de4 100644
--- a/src/app/components/pwa/PWAInstallPrompt.tsx
+++ b/src/app/components/pwa/PWAInstallPrompt.tsx
@@ -60,7 +60,7 @@ export function PWAInstallPrompt() {
return (
-
+
Install Coup
Faster launch and cached game assets on spotty Wi-Fi.