You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
NGDP is Blizzard's comprehensive content distribution system that powers all modern Blizzard games (World of Warcraft, Overwatch, Diablo, etc.). It consists of multiple integrated components working together to deliver game content efficiently and securely from Blizzard's servers to millions of clients worldwide.
System Overview
graph TB
subgraph "๐ข Blizzard Infrastructure"
DEV[Game Developers]
BUILD[Build System]
CDN[Global CDN Network]
RIBBIT[Ribbit API Servers]
end
subgraph "๐ Distribution Layer"
TACT[TACT Protocol]
BLTE[BLTE Compression]
CRYPTO[Encryption Layer]
end
subgraph "๐ป Client Side"
BNET[Battle.net Client]
CASC[Local CASC Storage]
GAME[Game Client]
end
DEV --> BUILD
BUILD --> CDN
BUILD --> RIBBIT
BNET --> RIBBIT
RIBBIT --> TACT
TACT --> BLTE
BLTE --> CRYPTO
CRYPTO --> CASC
CASC --> GAME
CDN --> TACT
Loading
NGDP uses two main protocols:
TACT (Transfer And Content Transport) - For downloading content from CDN
CASC (Content Addressable Storage Container) - For local storage and organization
Complete NGDP Flow
sequenceDiagram
participant Dev as ๐งโ๐ป Game Developers
participant Build as ๐๏ธ Build System
participant CDN as ๐ CDN Network
participant Ribbit as ๐ก Ribbit API
participant Client as ๐ป Battle.net Client
participant Game as ๐ฎ Game Client
Dev->>Build: Submit game content
Build->>Build: Create build artifacts
Build->>CDN: Upload BLTE-compressed files
Build->>Ribbit: Publish build metadata
Note over Client: User clicks "Play"
Client->>Ribbit: Query product versions
Ribbit->>Client: Return build info + CDN endpoints
Client->>CDN: Download build configuration
Client->>CDN: Download manifests (root, encoding, install)
Client->>CDN: Download game files by priority
Client->>Client: Decompress BLTE data
Client->>Client: Decrypt encrypted files
Client->>Client: Store in local CASC
Game->>Client: Request game file
Client->>Game: Serve from CASC storage
Loading
Server-Side: Content Creation & Distribution
1. Content Development & Build Process
flowchart TD
subgraph "๐ข Blizzard Development"
A[Game Assets Created] --> B[Asset Processing]
B --> C[Build Compilation]
C --> D[BLTE Compression]
D --> E[Content Addressing]
E --> F[Manifest Generation]
end
subgraph "๐ Generated Manifests"
F --> G[Root Manifest<br/>FileDataID โ CKey]
F --> H[Encoding Manifest<br/>CKey โ EKey + Size]
F --> I[Install Manifest<br/>Platform + Tags]
F --> J[Download Manifest<br/>Priority Order]
F --> K[Size Manifest<br/>Install Sizes]
end
subgraph "๐ Distribution"
G --> L[Upload to CDN]
H --> L
I --> L
J --> L
K --> L
L --> M[Ribbit API Update]
end
Loading
2. Ribbit API (Product Discovery)
graph LR
subgraph "๐ก Ribbit Servers"
A[us.version.battle.net:1119]
B[eu.version.battle.net:1119]
C[kr.version.battle.net:1119]
end
subgraph "๐ Product Information"
D[Product List]
E[Version History]
F[Build Configurations]
G[CDN Endpoints]
end
A --> D
B --> D
C --> D
D --> E
E --> F
F --> G
style A fill:#e1f5fe
style B fill:#e1f5fe
style C fill:#e1f5fe
Loading
Status: โ Complete (ribbit-client)
3. CDN Infrastructure
graph TB
subgraph CDN ["๐ Global CDN Network"]
subgraph US ["๐บ๐ธ US CDN"]
US1[us.cdn.blizzard.com]
US2[level3.blizzard.com]
end
subgraph EU ["๐ช๐บ EU CDN"]
EU1[eu.cdn.blizzard.com]
EU2[eu.actual.battle.net]
end
subgraph ASIA ["๐ฐ๐ท Asia CDN"]
KR1[kr.cdn.blizzard.com]
KR2[blzddist1-a.akamaihd.net]
end
end
subgraph FILES ["๐ CDN File Structure"]
CONFIG["/config/[hash]<br/>Build Configs"]
DATA["/data/[hash]<br/>Game Files"]
PATCH["/patch/[hash]<br/>Patches"]
end
US1 --> CONFIG
EU1 --> CONFIG
KR1 --> CONFIG
US1 --> DATA
EU1 --> DATA
KR1 --> DATA
US1 --> PATCH
EU1 --> PATCH
KR1 --> PATCH
Loading
Status: โ Complete (tact-client, ngdp-cdn)
Client-Side: Download & Storage Process
4. Battle.net Client Flow
sequenceDiagram
participant User as ๐ค User
participant BNet as ๐ป Battle.net
participant Ribbit as ๐ก Ribbit API
participant CDN as ๐ CDN
participant CASC as ๐พ Local CASC
User->>BNet: Click "Play Game"
BNet->>Ribbit: Get product versions
Ribbit->>BNet: Build info + CDN list
BNet->>CDN: Download BuildConfig
CDN->>BNet: BuildConfig (BLTE compressed)
BNet->>BNet: Parse BuildConfig
Note over BNet: Get manifest hashes
BNet->>CDN: Download Root Manifest
BNet->>CDN: Download Encoding Manifest
BNet->>CDN: Download Install Manifest
BNet->>BNet: Parse manifests
Note over BNet: Determine files to download
loop For each required file
BNet->>CDN: Download file by EKey
CDN->>BNet: BLTE compressed data
BNet->>BNet: Decompress & decrypt
BNet->>CASC: Store in local archive
end
User->>BNet: Launch game
BNet->>CASC: Verify installation
CASC->>BNet: Ready
Loading
5. TACT Protocol (File Download)
flowchart TD
subgraph "๐ File Resolution"
A[FileDataID] --> B[Root Manifest Lookup]
B --> C[Content Key CKey]
C --> D[Encoding Manifest Lookup]
D --> E[Encoding Key EKey]
end
subgraph "โฌ๏ธ Download Process"
E --> F[CDN Request by EKey]
F --> G[BLTE Compressed Data]
G --> H[BLTE Decompression]
H --> I[Decryption if needed]
I --> J[Original File Content]
end
subgraph "๐พ Storage"
J --> K[CASC Archive Storage]
K --> L[Index Update]
end
Loading
Status: โ Complete (tact-client, tact-parser)
6. BLTE Compression System
graph TD
subgraph "๐ฆ BLTE Compression Modes"
A[Original File] --> B{Size Check}
B -->|Small| C[Mode 'N': No Compression]
B -->|Medium| D[Mode 'Z': ZLib]
B -->|Large| E[Mode '4': LZ4]
B -->|Recursive| F[Mode 'F': Multi-chunk]
B -->|Encrypted| G[Mode 'E': Salsa20/ARC4]
end
subgraph "๐ Encryption Keys"
H[19,419 WoW Keys]
I[Salsa20 Cipher]
J[ARC4 Cipher]
end
G --> H
H --> I
H --> J
style C fill:#c8e6c9
style D fill:#fff3e0
style E fill:#e3f2fd
style F fill:#f3e5f5
style G fill:#ffebee
Loading
Status: โ Complete (blte with full compression/decompression + encryption)
Status: โ Complete (casc-storage with full read/write support)
8. Game Client Integration
sequenceDiagram
participant Game as ๐ฎ Game Client
participant CASC as ๐พ CASC Storage
participant BNet as ๐ป Battle.net
participant CDN as ๐ CDN
Game->>CASC: Request file by FileDataID
CASC->>CASC: Look up in local storage
alt File exists locally
CASC->>Game: Return file data
else File missing
CASC->>BNet: Request file download
BNet->>CDN: Download missing file
CDN->>BNet: BLTE compressed data
BNet->>CASC: Store decompressed file
CASC->>Game: Return file data
end
Note over Game: Streaming download<br/>Game can start before<br/>all files downloaded
Advanced CLI Features - Core functionality complete, convenience features pending
โ Real-World Validation
All components tested with actual Blizzard game data:
Test Scenario
Status
Details
Build Config Downloads
โ Pass
All products (WoW, Agent, BNA)
BLTE Decompression
โ Pass
All compression modes validated
CASC File Extraction
โ Pass
WoW 1.13.2 and 1.14.2 installations
Manifest Parsing
โ Pass
Root, Encoding, Install, Download, Size
Encryption Handling
โ Pass
19,419 keys, Salsa20/ARC4
Usage Example
sequenceDiagram
participant User as ๐ค User
participant CLI as ๐ฅ๏ธ ngdp CLI
participant Ribbit as ๐ก ribbit-client
participant CDN as ๐ tact-client
participant CASC as ๐พ casc-storage
User->>CLI: ngdp products list
CLI->>Ribbit: Query available products
Ribbit->>CLI: Return product list
CLI->>User: Display products
User->>CLI: ngdp download build wow_classic_era latest
CLI->>Ribbit: Get latest build info
CLI->>CDN: Download manifests & files
CDN->>CLI: BLTE compressed data
CLI->>CASC: Store decompressed files
CASC->>User: Installation complete
Legend: โ Working | ๐ก Partial/Limited | โ Not Implemented | โ Unknown
Bottom Line: We have implemented client-side NGDP consumption based on reverse-engineering existing game installations and CDN observations. We can successfully download, parse, and extract game content, but we don't yet understand the complete server-side pipeline for content creation and distribution.