Developer Docs

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 (malets subgraph): VerticalConfig feature flags decide which Arcade modules are enabled per Malet โ€” digitalKeyVault, immersiveTheme, preOrderReservation, subscriptionGating.
  • Feature Plane (experiences subgraph): Self-contained DigitalVaultModule and GameProfileModule. Each can be extracted to its own subgraph when a dedicated Gaming vertical Team forms.
  • Extensions (services subgraph): 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.