Arcade & Gaming
The Arcade vertical powers game studios, indie publishers, and hardware manufacturers with four integrated systems: digital key vault distribution, game profile pages, immersive dark-mode storefronts, and pre-order reservation queues. Malet Owners configure these features via the Storefront Window layout system.
NOTE
These features live in the experiences subgraph โ the same cross-vertical Feature Plane that houses Entertainment & Experiences, Professional Services, Wellness & Beauty, Culture & Arts, and Tech & Electronics. The architecture is documented in docs/architecture/18-progressive-vertical-extraction.md.
Architecture: Two-Plane Design
The Arcade vertical uses the same Control + Feature plane separation as its sibling verticals:
- Control Plane (
maletssubgraph): VerticalConfig feature flags decide which Arcade modules are enabled per Malet โdigitalKeyVault,immersiveTheme,preOrderReservation,subscriptionGating. - Feature Plane (
experiencessubgraph): Self-containedDigitalVaultModuleandGameProfileModule. Each can be extracted to its own subgraph when a dedicated Gaming vertical Team forms. - Extensions (
servicessubgraph): Gaming platform and digital delivery type fields on existing Service entities.
Three new Storefront Window layout slot types are available: HERO_TRAILER, DIGITAL_LIBRARY, and PRE_ORDER_QUEUE.
What Arcade Reuses
| Reused System | From Vertical | Arcade Use Case |
|---|---|---|
| Digital Credit Wallets | Entertainment | Store credit for refunded/revoked keys |
| Gamified Loyalty | Entertainment | Reward purchases, pre-orders, and achievement milestones |
Digital Key Vault
Securely manage pools of unique license keys (Steam, PSN, Xbox, or custom) and distribute them atomically on checkout. Each product can have one vault containing thousands of keys.
Key Lifecycle
AVAILABLE โ CLAIMED (on checkout)
โ REVOKED (on refund)
Create a Vault
# Create a key vault for a product (Malet Owner)
mutation {
createDigitalVault(maletId: "m_indie_studio", productId: "prod_shadow_quest", platform: "Steam") {
id
productId
platform
totalKeys
availableKeys
}
}
Import Keys (Bulk CSV Upload)
Upload batches of license keys into a vault. Keys are appended to the pool and stock counters update atomically:
# Import a batch of keys (Malet Owner)
mutation {
importDigitalKeys(
vaultId: "vault_1"
keys: [
"STEAM-AAAA-BBBB-CCCC"
"STEAM-DDDD-EEEE-FFFF"
"STEAM-GGGG-HHHH-IIII"
"STEAM-JJJJ-KKKK-LLLL"
"STEAM-MMMM-NNNN-OOOO"
]
) {
id
totalKeys
availableKeys
}
}
TIP
Import keys in batches of 500-1000 for optimal performance. The $push with $each operator handles bulk inserts efficiently.
Claim a Key (Checkout)
When a Buyer completes a Murchase, the system atomically claims exactly one available key using MongoDB's arrayFilters. This is the critical path โ no two Buyers can receive the same key:
# Claim one key atomically (called during checkout)
mutation {
claimDigitalKey(
productId: "prod_shadow_quest"
claimantId: "user_kagiso"
murchaseId: "murch_42"
) {
vaultId
claimedKey # "STEAM-AAAA-BBBB-CCCC"
availableKeys # 4 remaining
}
}
Revoke a Key (Refund)
When a Murchase is refunded, the key is revoked (not returned to the available pool to prevent reuse of potentially redeemed keys):
# Revoke a claimed key (Malet Owner โ on refund)
mutation {
revokeDigitalKey(vaultId: "vault_1", key: "STEAM-AAAA-BBBB-CCCC") {
id
availableKeys
}
}
Queries
# Get vault details (Malet Owner โ includes all keys)
query {
digitalVault(id: "vault_1") {
id
productId
platform
totalKeys
availableKeys
keys {
key
status
claimantId
claimedAt
murchaseId
}
}
}
# Get all vaults for a Malet (Malet Owner dashboard)
query {
maletDigitalVaults(maletId: "m_indie_studio") {
id
productId
platform
totalKeys
availableKeys
}
}
# Buyer's Digital Library โ all claimed keys across vaults
query {
myDigitalLibrary(buyerId: "user_kagiso") {
productId
platform
key
claimedAt
}
}
Digital Library
The myDigitalLibrary query returns all keys a Buyer has claimed across all Malets. This powers the "My Games" / "Digital Library" page in the Buyer's account:
| Product | Platform | Key | Claimed |
|---|---|---|---|
| Shadow Quest | Steam | STEAM-AAAA-BBBB-CCCC |
2026-04-09 |
| Neon Rush DLC | PSN | PSN-XXXX-YYYY-ZZZZ |
2026-04-08 |
| Cosmic Drift | Xbox | XBOX-1111-2222-3333 |
2026-04-05 |
IMPORTANT
Keys act as bearer tokens. In Phase 2, keys will be encrypted at rest (AES-256-GCM) and decrypted only during the claimKey() operation. For now, ensure vault access is restricted to Malet Owners.
Game Profiles
Rich game/software showcase pages with platform compatibility, system requirements, developer information, and trailer media.
Mutations
# Create or update a game profile (Malet Owner)
mutation {
upsertGameProfile(
maletId: "m_indie_studio"
productId: "prod_shadow_quest"
developer: "Studio Kasi"
platforms: ["PC", "PlayStation 5", "Xbox Series X"]
publisher: "Mallnline Games"
ageRating: "PEGI 16"
trailerUrl: "https://r2.mallnline.com/trailers/shadow-quest.mp4"
) {
id
developer
platforms
ageRating
trailerUrl
}
}
# Add a system requirement
mutation {
addGameSystemRequirement(
productId: "prod_shadow_quest"
component: "CPU"
minimum: "Intel i5-8400 / AMD Ryzen 5 1600"
recommended: "Intel i7-12700 / AMD Ryzen 7 5800X"
) {
id
systemRequirements {
component
minimum
recommended
}
}
}
# Add more requirements
mutation {
addGameSystemRequirement(
productId: "prod_shadow_quest"
component: "GPU"
minimum: "GTX 1060 6GB / RX 580"
recommended: "RTX 4070 / RX 7800 XT"
) {
id
systemRequirements {
component
minimum
recommended
}
}
}
# Remove a system requirement
mutation {
removeGameSystemRequirement(productId: "prod_shadow_quest", component: "GPU") {
id
systemRequirements {
component
minimum
recommended
}
}
}
Queries
# Get game profile for a product (public โ product detail page)
query {
gameProfile(productId: "prod_shadow_quest") {
id
developer
publisher
platforms
releaseDate
ageRating
trailerUrl
systemRequirements {
component
minimum
recommended
}
}
}
# All game profiles for a Malet (Malet Owner / storefront)
query {
maletGameProfiles(maletId: "m_indie_studio") {
id
productId
developer
platforms
releaseDate
ageRating
}
}
System Requirements Display
The systemRequirements array renders as a comparison table on the product page:
| Component | Minimum | Recommended |
|---|---|---|
| CPU | Intel i5-8400 | Intel i7-12700 |
| GPU | GTX 1060 6GB | RTX 4070 |
| RAM | 8 GB | 16 GB |
| Storage | 50 GB HDD | 50 GB SSD |
Gaming Platform & Delivery Types
Extended service fields for digital game products on the existing services subgraph:
Service Fields
| Field | Type | Description |
|---|---|---|
gamePlatform |
GamePlatform |
PC, PLAYSTATION, XBOX, NINTENDO, MOBILE |
digitalDeliveryType |
DigitalDeliveryType |
KEY_CODE, DOWNLOAD_LINK, ACCOUNT_ACTIVATION |
Delivery Types
| Type | Description | Example |
|---|---|---|
KEY_CODE |
Unique license key from the Digital Vault | Steam key, PSN code, Xbox code |
DOWNLOAD_LINK |
Direct download URL (no key) | DRM-free game, indie bundle |
ACCOUNT_ACTIVATION |
Account-level flag set on purchase | Season pass, premium membership |
Example: Create a Game Service
mutation {
createOneService(
input: {
service: {
name: "Shadow Quest โ Deluxe Edition"
description: "Award-winning action RPG with Season 1 DLC included"
price: 59900 # R599.00 (cents)
maletId: "m_indie_studio"
gamePlatform: PC
digitalDeliveryType: KEY_CODE
}
}
) {
id
name
gamePlatform
digitalDeliveryType
}
}
Workroom Steps
The Arcade vertical ships with 4 default Workroom steps for game launch lifecycle management:
| Step | Type | Assignee | Description |
|---|---|---|---|
| Key Upload | FORM |
Malet Owner | Upload digital license keys via CSV. Verify key count matches expected inventory |
| Storefront Setup | APPROVAL |
Malet Owner | Configure game profile, system requirements, trailer, and platform tags |
| Launch Review | APPROVAL |
Malet Owner | Final review of pricing, pre-order dates, and promotional materials before going live |
| Post-Launch Analytics | FORM |
Malet Owner | Record launch day sales, key claim rate, and community feedback |
These steps are automatically configured on new Arcade Malets via the vertical seed (deep purple/neon green branding).
Deferred Features
The following capabilities are planned for future phases using in-house, open-source/standard solutions โ no third-party SaaS dependencies:
| Feature | Phase | Approach |
|---|---|---|
| Redis Cart Reservation | Phase 2 | 10-minute TTL lock via Redis on addToCart for limited-stock items |
| Key Encryption at Rest | Phase 2 | AES-256-GCM encryption in MongoDB, decrypt only at checkout |
| Subscription Gating | Phase 2 | Stripe webhook โ arcade_premium role for gated content access |
| Immersive Dark Mode | Phase 2 | forceDarkMode in ThemeConfig + HeroVideoWidget with muted HLS autoplay |
TIP
All Phase 2 deferred features are tracked in the consolidated docs/PHASE2_BACKLOG.md. The digitalKeyVault, immersiveTheme, preOrderReservation, and subscriptionGating feature flags are already present in the Control Plane.
Frontend Implementation
Three Svelte 5 storefront widgets render the Arcade vertical in the Visitor-facing storefront:
Components
| Widget | File | Description |
|---|---|---|
DigitalVault |
src/lib/components/arcade/DigitalVault.svelte |
License key library with masked keys (tap-to-reveal toggle), platform badges (Steam/PSN/Xbox/PC/Nintendo), and key status indicators (Available/Claimed/Revoked). Auth-gated. |
GameProfileCard |
src/lib/components/arcade/GameProfileCard.svelte |
Game detail card with video trailer, developer/publisher info, release date, age rating badge, platform tags, and system requirements comparison table (Min vs Recommended). |
PreOrderQueue |
src/lib/components/arcade/PreOrderQueue.svelte |
Category navigation cards (Upcoming Releases, Hardware, Limited Editions, Gift Cards) with hover effects and CTA linking to filtered product listings. |
File Map
| File | Purpose |
|---|---|
src/lib/queries/arcade.ts |
GraphQL queries (GET_MY_DIGITAL_KEYS, GET_GAME_PROFILE, GET_VAULT_AVAILABILITY) + TypeScript interfaces |
src/lib/utils/arcadeUtils.ts |
9 utility functions โ platform icons, key masking/status, stock level labels/colors, age rating icons |
src/lib/components/storefront/WidgetRegistry.svelte |
Widget registration: DIGITAL_VAULT, GAME_PROFILE, PRE_ORDER_QUEUE |
tests/arcadeUtils.test.ts |
18 unit tests covering all utility functions |
Layout Slot Types
| Slot Type | Widget | Auth Required |
|---|---|---|
DIGITAL_VAULT |
DigitalVault |
โ Yes |
GAME_PROFILE |
GameProfileCard |
No |
PRE_ORDER_QUEUE |
PreOrderQueue |
No |
NOTE
For Visitor-facing documentation on digital keys, game profiles, and pre-orders, see the Support Manual: Digital Keys & Gaming.
Related
- Entertainment & Experiences โ Provides Credit Wallets for store credit and Gamified Loyalty for purchase rewards
- Tech & Electronics โ Sibling vertical with spec engine and warranty management; shares the
experiencessubgraph - Culture & Arts โ Sibling vertical; Digital Vault pattern parallels the Exhibition artwork provenance model
- Crypto โ Encryption Microservice โ Will power Phase 2 AES-256-GCM key encryption at rest for the Digital Vault
- Storefront Sections โ Configure
DIGITAL_VAULT,GAME_PROFILE, andPRE_ORDER_QUEUElayout slots - Teams & Sub-Groups โ Organize game studio staff with the org โ team โ member hierarchy
- Support: Digital Keys & Gaming โ Visitor-facing guide