[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-openai-zoom-video-sdk-linux":3,"mdc-bzs1e9-key":36,"related-org-openai-zoom-video-sdk-linux":2522,"related-repo-openai-zoom-video-sdk-linux":2729},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":25,"repoUrl":26,"updatedAt":27,"license":28,"forks":29,"topics":30,"repo":31,"sourceUrl":34,"mdContent":35},"zoom-video-sdk-linux","integrate Zoom Video SDK for Linux","Zoom Video SDK for Linux - C++ headless bots, raw audio\u002Fvideo capture\u002Finjection, Qt\u002FGTK integration, Docker support",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"openai","OpenAI","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fopenai.png",[12,16,19,22],{"name":13,"slug":14,"type":15},"Linux","linux","tag",{"name":17,"slug":18,"type":15},"Docker","docker",{"name":20,"slug":21,"type":15},"Zoom","zoom",{"name":23,"slug":24,"type":15},"Communications","communications",3992,"https:\u002F\u002Fgithub.com\u002Fopenai\u002Fplugins","2026-06-30T19:00:57.102",null,465,[],{"repoUrl":26,"stars":25,"forks":29,"topics":32,"description":33},[],"OpenAI Plugins","https:\u002F\u002Fgithub.com\u002Fopenai\u002Fplugins\u002Ftree\u002FHEAD\u002Fplugins\u002Fzoom\u002Fskills\u002Fvideo-sdk\u002Flinux","---\nname: zoom-video-sdk-linux\ndescription: \"Zoom Video SDK for Linux - C++ headless bots, raw audio\u002Fvideo capture\u002Finjection, Qt\u002FGTK integration, Docker support\"\n---\n\n# Zoom Video SDK - Linux Development\n\nExpert guidance for developing with the Zoom Video SDK on Linux. Build headless bots, raw media capture\u002Finjection applications, and custom UI integrations with Qt\u002FGTK.\n\n**Official Documentation**: https:\u002F\u002Fdevelopers.zoom.us\u002Fdocs\u002Fvideo-sdk\u002Flinux\u002F\n**API Reference**: https:\u002F\u002Fmarketplacefront.zoom.us\u002Fsdk\u002Fcustom\u002Flinux\u002F\n**Sample Repository**: https:\u002F\u002Fgithub.com\u002Fzoom\u002Fvideosdk-linux-raw-recording-sample\n\n## Quick Links\n\n**New to Video SDK? Follow this path:**\n\n1. **[SDK Architecture Pattern](concepts\u002Fsdk-architecture-pattern.md)** - Universal 3-step pattern for ANY feature\n2. **[Session Join Pattern](examples\u002Fsession-join-pattern.md)** - Complete working code to join a session\n3. **[Raw Data vs Canvas](concepts\u002Fraw-data-vs-canvas.md)** - **CRITICAL**: Linux has NO Canvas API - raw data ONLY\n4. **[Raw Video Capture](examples\u002Fraw-video-capture.md)** - Capture and process YUV420 frames\n\n**Reference:**\n- **[Singleton Hierarchy](concepts\u002Fsingleton-hierarchy.md)** - 5-level SDK navigation map\n- **[API Reference](references\u002Flinux-reference.md)** - Complete API documentation\n- **[Qt\u002FGTK Integration](examples\u002Fqt-gtk-integration.md)** - UI framework patterns\n- **[Troubleshooting](troubleshooting\u002Fcommon-issues.md)** - Quick diagnostics\n- **[SKILL.md](SKILL.md)** - Complete documentation navigation\n\n**Having issues?**\n- PulseAudio setup → [PulseAudio Guide](troubleshooting\u002Fpulseaudio-setup.md)\n- Qt dependencies → [Qt Dependencies](troubleshooting\u002Fqt-dependencies.md)\n- Build errors → [Build Errors Guide](troubleshooting\u002Fbuild-errors.md)\n\n## Key Differences from Windows\u002FmacOS\n\n| Feature | Linux | Windows\u002FMac |\n|---------|-------|-------------|\n| **Canvas API** | ❌ Not available | ✅ Available |\n| **Raw Data Pipe** | ✅ **ONLY option** | ✅ Available |\n| **UI Integration** | Qt, GTK, SDL2, OpenGL | Win32\u002FWinForms\u002FWPF, Cocoa |\n| **Headless Support** | ✅ Excellent (Docker) | Limited |\n| **Audio** | PulseAudio required | Native |\n| **Virtual Devices** | ✅ Required for headless | Optional |\n\n## SDK Overview\n\nThe Zoom Video SDK for Linux is a C++ library optimized for:\n- **Headless Bots**: Docker\u002FWSL support, no display required\n- **Raw Data Access**: Capture YUV420 video, PCM audio\n- **Raw Data Injection**: Virtual camera\u002Fmic for custom media\n- **Screen Sharing**: Capture or inject share data\n- **Cloud Recording**: Record sessions to Zoom cloud\n- **Live Streaming**: Stream to RTMP endpoints\n- **Live Transcription**: Real-time speech-to-text\n- **Qt\u002FGTK Integration**: Full UI framework support\n\n## Prerequisites\n\n### System Requirements\n\n- **OS**: Ubuntu 20.04+, Debian 11+, or compatible\n- **Architecture**: x64 (recommended), ARM64\n- **Compiler**: GCC 9+, Clang 10+\n- **CMake**: 3.14 or later\n- **Qt5**: Bundled with SDK (do NOT install system Qt5)\n\n### Dependencies\n\n```bash\nsudo apt update\nsudo apt install -y build-essential gcc cmake libglib2.0-dev liblzma-dev \\\n    libxcb-image0 libxcb-keysyms1 libxcb-xfixes0 libxcb-xkb1 libxcb-shape0 \\\n    libxcb-shm0 libxcb-randr0 libxcb-xtest0 libgbm1 libxtst6 libgl1 libnss3 \\\n    libasound2 libpulse0\n\n# For headless Linux\nsudo apt install -y pulseaudio\n\n# PulseAudio configuration (CRITICAL for audio)\nmkdir -p ~\u002F.config\necho \"[General]\" > ~\u002F.config\u002Fzoomus.conf\necho \"system.audio.type=default\" >> ~\u002F.config\u002Fzoomus.conf\n\n# Log directory\nmkdir -p ~\u002F.zoom\u002Flogs\n```\n\n## Quick Start\n\n```cpp\n#include \"zoom_video_sdk_api.h\"\n#include \"zoom_video_sdk_interface.h\"\n#include \"zoom_video_sdk_delegate_interface.h\"\n\nUSING_ZOOM_VIDEO_SDK_NAMESPACE\n\n\u002F\u002F 1. Create SDK\nIZoomVideoSDK* sdk = CreateZoomVideoSDKObj();\n\n\u002F\u002F 2. Initialize\nZoomVideoSDKInitParams init_params;\ninit_params.domain = \"https:\u002F\u002Fzoom.us\";\ninit_params.enableLog = true;\ninit_params.logFilePrefix = \"bot\";\ninit_params.videoRawDataMemoryMode = ZoomVideoSDKRawDataMemoryModeHeap;\ninit_params.shareRawDataMemoryMode = ZoomVideoSDKRawDataMemoryModeHeap;\ninit_params.audioRawDataMemoryMode = ZoomVideoSDKRawDataMemoryModeHeap;\n\nsdk->initialize(init_params);\n\n\u002F\u002F 3. Add delegate\nsdk->addListener(myDelegate);\n\n\u002F\u002F 4. Join session\nZoomVideoSDKSessionContext ctx;\nctx.sessionName = \"my-session\";\nctx.userName = \"Linux Bot\";\nctx.token = \"jwt-token\";\nctx.audioOption.connect = true;\nctx.audioOption.mute = false;\nctx.videoOption.localVideoOn = false;\n\n\u002F\u002F For headless: Virtual audio speaker\nctx.virtualAudioSpeaker = new VirtualSpeaker();\n\nIZoomVideoSDKSession* session = sdk->joinSession(ctx);\n```\n\nSee **[Session Join Pattern](examples\u002Fsession-join-pattern.md)** for complete code.\n\n## Key Features\n\n| Feature | Linux Support | Guide |\n|---------|---------------|-------|\n| **Session Management** | ✅ Full | [Session Join](examples\u002Fsession-join-pattern.md) |\n| **Raw Video (YUV420)** | ✅ ONLY rendering option | [Raw Video](examples\u002Fraw-video-capture.md) |\n| **Raw Audio (PCM)** | ✅ Full | [Raw Audio](examples\u002Fraw-audio-capture.md) |\n| **Virtual Camera\u002FMic** | ✅ Full | [Virtual Devices](examples\u002Fvirtual-audio-video.md) |\n| **Cloud Recording** | ✅ Full | [Recording](examples\u002Fcloud-recording.md) |\n| **Live Streaming** | ✅ Full | [Live Stream](examples\u002Flive-streaming.md) |\n| **Live Transcription** | ✅ Full | [Transcription](examples\u002Ftranscription.md) |\n| **Command Channel** | ✅ Full | [Commands](examples\u002Fcommand-channel.md) |\n| **Chat** | ✅ Full | [Chat](examples\u002Fchat.md) |\n| **Qt Integration** | ✅ Recommended | [Qt\u002FGTK](examples\u002Fqt-gtk-integration.md) |\n| **GTK Integration** | ✅ Supported | [Qt\u002FGTK](examples\u002Fqt-gtk-integration.md) |\n| **Docker\u002FHeadless** | ✅ Excellent | [Virtual Devices](examples\u002Fvirtual-audio-video.md) |\n\n## Critical Gotchas\n\n### ⚠️ CRITICAL #1: No Canvas API on Linux\n\n**Problem**: Linux SDK does NOT have Canvas API like Windows\u002FMac.\n\n**Solution**: You MUST use Raw Data Pipe and implement your own rendering.\n\nSee: **[Raw Data vs Canvas](concepts\u002Fraw-data-vs-canvas.md)**\n\n### ⚠️ CRITICAL #2: PulseAudio Required for Audio\n\n**Problem**: SDK requires PulseAudio for raw audio functions.\n\n**Solution**:\n```bash\nsudo apt install -y pulseaudio\nmkdir -p ~\u002F.config\necho \"[General]\" > ~\u002F.config\u002Fzoomus.conf\necho \"system.audio.type=default\" >> ~\u002F.config\u002Fzoomus.conf\n```\n\nSee: **[PulseAudio Setup](troubleshooting\u002Fpulseaudio-setup.md)**\n\n### ⚠️ CRITICAL #3: Qt5 Dependencies\n\n**Problem**: SDK requires Qt5 libraries (bundled, NOT system Qt5).\n\n**Solution**:\n```bash\n# Copy from SDK package\ncp -r samples\u002Fqt_libs\u002FQt\u002Flib\u002F* lib\u002Fzoom_video_sdk\u002F\n\n# Create symlinks\ncd lib\u002Fzoom_video_sdk\nfor lib in libQt5*.so.5; do ln -sf $lib ${lib%.5}; done\n```\n\nSee: **[Qt Dependencies](troubleshooting\u002Fqt-dependencies.md)**\n\n### ⚠️ CRITICAL #4: Heap Memory Mode\n\nAlways use heap mode for raw data:\n\n```cpp\ninit_params.videoRawDataMemoryMode = ZoomVideoSDKRawDataMemoryModeHeap;\ninit_params.shareRawDataMemoryMode = ZoomVideoSDKRawDataMemoryModeHeap;\ninit_params.audioRawDataMemoryMode = ZoomVideoSDKRawDataMemoryModeHeap;\n```\n\n### ⚠️ CRITICAL #5: Virtual Audio for Headless\n\n**Problem**: Docker\u002Fheadless environments have no audio devices.\n\n**Solution**: Use virtual audio speaker and mic.\n\n```cpp\nsession_context.virtualAudioSpeaker = new VirtualSpeaker();\nsession_context.virtualAudioMic = new VirtualMic();\n```\n\nSee: **[Virtual Audio\u002FVideo](examples\u002Fvirtual-audio-video.md)**\n\n## Sample Repositories\n\n### Official Samples\n\n| Repository | Description |\n|-----------|-------------|\n| **[raw-recording-sample](https:\u002F\u002Fgithub.com\u002Fzoom\u002Fvideosdk-linux-raw-recording-sample)** | Raw audio\u002Fvideo capture |\n| **[qt-quickstart](https:\u002F\u002Fgithub.com\u002Ftanchunsiong\u002Fvideosdk-linux-qt-quickstart)** | Qt6 UI integration |\n| **[gtk-quickstart](https:\u002F\u002Fgithub.com\u002Ftanchunsiong\u002Fvideosdk-linux-gtk-quickstart)** | GTK3 UI integration |\n\n### Sample Architecture\n\n```\nHeadless Bot (Docker):\n┌──────────────────────────────────┐\n│  Virtual Audio Speaker\u002FMic       │\n├──────────────────────────────────┤\n│  Raw Data Processing             │\n│  - YUV420 → File\u002FStream\n\n\n## Merged from video-sdk\u002Flinux\u002FSKILL.md\n\n# Zoom Video SDK Linux - Complete Documentation Index\n\n## Quick Start Path\n\n**If you're new to the SDK, follow this order:**\n\n1. **Read the architecture pattern** → [concepts\u002Fsdk-architecture-pattern.md](concepts\u002Fsdk-architecture-pattern.md)\n   - Universal formula: Singleton → Delegate → Subscribe\n   - Once you understand this, you can implement any feature\n\n2. **Understand Linux specifics** → [concepts\u002Fraw-data-vs-canvas.md](concepts\u002Fraw-data-vs-canvas.md)\n   - **CRITICAL**: Linux has NO Canvas API - raw data ONLY\n\n3. **Implement session join** → [examples\u002Fsession-join-pattern.md](examples\u002Fsession-join-pattern.md)\n   - Complete working JWT + session join code\n\n4. **Setup environment** → [troubleshooting\u002Fpulseaudio-setup.md](troubleshooting\u002Fpulseaudio-setup.md)\n   - PulseAudio configuration (required for audio)\n   - [troubleshooting\u002Fqt-dependencies.md](troubleshooting\u002Fqt-dependencies.md)\n   - Qt5 library setup (bundled with SDK)\n\n5. **Implement features** → Choose from examples below\n\n---\n\n## Documentation Structure\n\n```\nvideo-sdk\u002Flinux\u002F\n├── SKILL.md                          # Main skill overview\n├── SKILL.md                          # This file - navigation guide\n├── linux.md                          # Platform summary\n│\n├── concepts\u002F                         # Core architectural patterns\n│   ├── sdk-architecture-pattern.md  # Universal formula for ANY feature\n│   ├── singleton-hierarchy.md       # 5-level navigation guide\n│   └── raw-data-vs-canvas.md        # Linux-specific: raw data ONLY\n│\n├── examples\u002F                         # Complete working code\n│   ├── session-join-pattern.md      # JWT auth + session join\n│   └── command-channel.md           # Command channel with threading\n│\n├── troubleshooting\u002F                  # Problem solving guides\n│   ├── pulseaudio-setup.md          # Audio configuration\n│   ├── qt-dependencies.md           # Qt5 library setup\n│   ├── build-errors.md              # Common build issues\n│   └── common-issues.md             # Quick diagnostic workflow\n│\n└── references\u002F                       # Reference documentation\n    └── linux-reference.md           # API hierarchy, methods, error codes\n```\n\n---\n\n## By Use Case\n\n### I want to build a headless bot\n1. [SDK Architecture Pattern](concepts\u002Fsdk-architecture-pattern.md) - Understand the pattern\n2. [Session Join Pattern](examples\u002Fsession-join-pattern.md) - Join sessions\n3. [PulseAudio Setup](troubleshooting\u002Fpulseaudio-setup.md) - Configure audio\n4. [Raw Data vs Canvas](concepts\u002Fraw-data-vs-canvas.md) - Understand Linux differences\n\n### I'm getting build errors\n1. [Build Errors Guide](troubleshooting\u002Fbuild-errors.md) - SDK build issues\n2. [Qt Dependencies](troubleshooting\u002Fqt-dependencies.md) - Qt5 setup\n3. [Common Issues](troubleshooting\u002Fcommon-issues.md) - Quick diagnostics\n\n### I'm getting runtime errors\n1. [PulseAudio Setup](troubleshooting\u002Fpulseaudio-setup.md) - Audio not working\n2. [Qt Dependencies](troubleshooting\u002Fqt-dependencies.md) - Library not found\n3. [Common Issues](troubleshooting\u002Fcommon-issues.md) - Error code tables\n\n### I want to use command channel\n1. [Command Channel](examples\u002Fcommand-channel.md) - Send\u002Freceive commands\n2. [Common Issues](troubleshooting\u002Fcommon-issues.md) - Threading requirements\n\n### I want to implement a specific feature\n1. [SDK Architecture Pattern](concepts\u002Fsdk-architecture-pattern.md) - **START HERE!**\n2. [Singleton Hierarchy](concepts\u002Fsingleton-hierarchy.md) - Navigate to the feature\n3. [API Reference](references\u002Flinux-reference.md) - Method signatures\n\n---\n\n## Most Critical Documents\n\n### 1. SDK Architecture Pattern (MASTER DOCUMENT)\n**[concepts\u002Fsdk-architecture-pattern.md](concepts\u002Fsdk-architecture-pattern.md)**\n\nThe universal 3-step pattern:\n1. Get singleton (SDK, helpers, session, users)\n2. Implement delegate (event callbacks)\n3. Subscribe and use\n\n### 2. Raw Data vs Canvas (LINUX-SPECIFIC)\n**[concepts\u002Fraw-data-vs-canvas.md](concepts\u002Fraw-data-vs-canvas.md)**\n\n**CRITICAL**: Unlike Windows\u002FMac, Linux SDK has NO Canvas API. You MUST use raw data pipe.\n\n### 3. PulseAudio Setup (MOST COMMON ISSUE)\n**[troubleshooting\u002Fpulseaudio-setup.md](troubleshooting\u002Fpulseaudio-setup.md)**\n\nAudio requires PulseAudio configuration.\n\n### 4. Qt Dependencies\n**[troubleshooting\u002Fqt-dependencies.md](troubleshooting\u002Fqt-dependencies.md)**\n\nSDK requires bundled Qt5 libraries, NOT system Qt5.\n\n---\n\n## Key Learnings\n\n### Critical Discoveries:\n\n1. **Linux has NO Canvas API**\n   - Windows\u002FMac have Canvas API for SDK-rendered video\n   - Linux MUST use Raw Data Pipe\n   - See: [Raw Data vs Canvas](concepts\u002Fraw-data-vs-canvas.md)\n\n2. **PulseAudio is MANDATORY**\n   - SDK requires PulseAudio for raw audio\n   - Must configure ~\u002F.config\u002Fzoomus.conf\n   - See: [PulseAudio Setup](troubleshooting\u002Fpulseaudio-setup.md)\n\n3. **Use Bundled Qt5, NOT System Qt5**\n   - SDK includes specific Qt5 versions\n   - Copy from samples\u002Fqt_libs\u002F\n   - See: [Qt Dependencies](troubleshooting\u002Fqt-dependencies.md)\n\n4. **Helpers Control YOUR Streams Only**\n   - `videoHelper->startVideo()` starts YOUR camera\n   - To see others, subscribe to their VideoPipe\n   - See: [Singleton Hierarchy](concepts\u002Fsingleton-hierarchy.md)\n\n5. **Virtual Devices for Headless**\n   - Docker\u002Fheadless needs virtual audio speaker\u002Fmic\n   - Set before joining session\n   - See: [Session Join Pattern](examples\u002Fsession-join-pattern.md)\n\n6. **Always Use Heap Memory Mode**\n   ```cpp\n   init_params.videoRawDataMemoryMode = ZoomVideoSDKRawDataMemoryModeHeap;\n   ```\n\n7. **GLib Main Loop Required**\n   - while\u002Fsleep loops don't dispatch SDK events\n   - Must use g_main_loop_run()\n   - See: [Common Issues](troubleshooting\u002Fcommon-issues.md)\n\n8. **All SDK Calls Must Be on Main Thread**\n   - Background thread SDK calls return error 2 (Internal_Error)\n   - Use g_idle_add() to schedule on GLib main thread\n   - See: [Command Channel](examples\u002Fcommand-channel.md)\n\n9. **Command Channel is Session-Scoped**\n   - Does NOT span across different sessions\n   - Both sender and receiver must be in the same session\n   - See: [Command Channel](examples\u002Fcommand-channel.md)\n\n---\n\n## Sample Repositories\n\n- **[raw-recording-sample](https:\u002F\u002Fgithub.com\u002Fzoom\u002Fvideosdk-linux-raw-recording-sample)** - Official raw data sample\n- **[qt-quickstart](https:\u002F\u002Fgithub.com\u002Ftanchunsiong\u002Fvideosdk-linux-qt-quickstart)** - Qt6 UI integration\n- **[gtk-quickstart](https:\u002F\u002Fgithub.com\u002Ftanchunsiong\u002Fvideosdk-linux-gtk-quickstart)** - GTK3 UI integration\n\n---\n\n## Quick Reference\n\n### \"My code won't compile\"\n→ [Build Errors Guide](troubleshooting\u002Fbuild-errors.md)\n\n### \"Audio not working\"\n→ [PulseAudio Setup](troubleshooting\u002Fpulseaudio-setup.md)\n\n### \"Library not found\"\n→ [Qt Dependencies](troubleshooting\u002Fqt-dependencies.md)\n\n### \"How do I implement [feature]?\"\n→ [SDK Architecture Pattern](concepts\u002Fsdk-architecture-pattern.md)\n\n### \"What error code means what?\"\n→ [Common Issues](troubleshooting\u002Fcommon-issues.md)\n\n---\n\n## Document Version\n\nBased on **Zoom Video SDK for Linux v2.x**\n\n---\n\n**Happy coding!**\n\nRemember: The [SDK Architecture Pattern](concepts\u002Fsdk-architecture-pattern.md) is your key to unlocking the entire SDK. Read it first!\n\n## Operations\n\n- [RUNBOOK.md](RUNBOOK.md) - 5-minute preflight and debugging checklist.\n",{"data":37,"body":38},{"name":4,"description":6},{"type":39,"children":40},"root",[41,50,56,99,106,114,182,190,262,270,306,312,474,480,485,567,573,580,633,639,998,1004,1313,1327,1333,1640,1646,1652,1662,1672,1684,1690,1699,1708,1807,1819,1825,1834,1842,1992,2003,2009,2014,2042,2048,2057,2066,2089,2101,2107,2113,2197,2203,2213,2218,2227,2318,2322,2327,2369,2372,2378,2384,2393,2399,2407,2413,2421,2434,2442,2448,2456,2459,2465,2475,2478,2486,2497,2503,2516],{"type":42,"tag":43,"props":44,"children":46},"element","h1",{"id":45},"zoom-video-sdk-linux-development",[47],{"type":48,"value":49},"text","Zoom Video SDK - Linux Development",{"type":42,"tag":51,"props":52,"children":53},"p",{},[54],{"type":48,"value":55},"Expert guidance for developing with the Zoom Video SDK on Linux. Build headless bots, raw media capture\u002Finjection applications, and custom UI integrations with Qt\u002FGTK.",{"type":42,"tag":51,"props":57,"children":58},{},[59,65,67,75,80,81,87,92,93],{"type":42,"tag":60,"props":61,"children":62},"strong",{},[63],{"type":48,"value":64},"Official Documentation",{"type":48,"value":66},": ",{"type":42,"tag":68,"props":69,"children":73},"a",{"href":70,"rel":71},"https:\u002F\u002Fdevelopers.zoom.us\u002Fdocs\u002Fvideo-sdk\u002Flinux\u002F",[72],"nofollow",[74],{"type":48,"value":70},{"type":42,"tag":60,"props":76,"children":77},{},[78],{"type":48,"value":79},"API Reference",{"type":48,"value":66},{"type":42,"tag":68,"props":82,"children":85},{"href":83,"rel":84},"https:\u002F\u002Fmarketplacefront.zoom.us\u002Fsdk\u002Fcustom\u002Flinux\u002F",[72],[86],{"type":48,"value":83},{"type":42,"tag":60,"props":88,"children":89},{},[90],{"type":48,"value":91},"Sample Repository",{"type":48,"value":66},{"type":42,"tag":68,"props":94,"children":97},{"href":95,"rel":96},"https:\u002F\u002Fgithub.com\u002Fzoom\u002Fvideosdk-linux-raw-recording-sample",[72],[98],{"type":48,"value":95},{"type":42,"tag":100,"props":101,"children":103},"h2",{"id":102},"quick-links",[104],{"type":48,"value":105},"Quick Links",{"type":42,"tag":51,"props":107,"children":108},{},[109],{"type":42,"tag":60,"props":110,"children":111},{},[112],{"type":48,"value":113},"New to Video SDK? Follow this path:",{"type":42,"tag":115,"props":116,"children":117},"ol",{},[118,133,147,168],{"type":42,"tag":119,"props":120,"children":121},"li",{},[122,131],{"type":42,"tag":60,"props":123,"children":124},{},[125],{"type":42,"tag":68,"props":126,"children":128},{"href":127},"concepts\u002Fsdk-architecture-pattern.md",[129],{"type":48,"value":130},"SDK Architecture Pattern",{"type":48,"value":132}," - Universal 3-step pattern for ANY feature",{"type":42,"tag":119,"props":134,"children":135},{},[136,145],{"type":42,"tag":60,"props":137,"children":138},{},[139],{"type":42,"tag":68,"props":140,"children":142},{"href":141},"examples\u002Fsession-join-pattern.md",[143],{"type":48,"value":144},"Session Join Pattern",{"type":48,"value":146}," - Complete working code to join a session",{"type":42,"tag":119,"props":148,"children":149},{},[150,159,161,166],{"type":42,"tag":60,"props":151,"children":152},{},[153],{"type":42,"tag":68,"props":154,"children":156},{"href":155},"concepts\u002Fraw-data-vs-canvas.md",[157],{"type":48,"value":158},"Raw Data vs Canvas",{"type":48,"value":160}," - ",{"type":42,"tag":60,"props":162,"children":163},{},[164],{"type":48,"value":165},"CRITICAL",{"type":48,"value":167},": Linux has NO Canvas API - raw data ONLY",{"type":42,"tag":119,"props":169,"children":170},{},[171,180],{"type":42,"tag":60,"props":172,"children":173},{},[174],{"type":42,"tag":68,"props":175,"children":177},{"href":176},"examples\u002Fraw-video-capture.md",[178],{"type":48,"value":179},"Raw Video Capture",{"type":48,"value":181}," - Capture and process YUV420 frames",{"type":42,"tag":51,"props":183,"children":184},{},[185],{"type":42,"tag":60,"props":186,"children":187},{},[188],{"type":48,"value":189},"Reference:",{"type":42,"tag":191,"props":192,"children":193},"ul",{},[194,208,221,235,249],{"type":42,"tag":119,"props":195,"children":196},{},[197,206],{"type":42,"tag":60,"props":198,"children":199},{},[200],{"type":42,"tag":68,"props":201,"children":203},{"href":202},"concepts\u002Fsingleton-hierarchy.md",[204],{"type":48,"value":205},"Singleton Hierarchy",{"type":48,"value":207}," - 5-level SDK navigation map",{"type":42,"tag":119,"props":209,"children":210},{},[211,219],{"type":42,"tag":60,"props":212,"children":213},{},[214],{"type":42,"tag":68,"props":215,"children":217},{"href":216},"references\u002Flinux-reference.md",[218],{"type":48,"value":79},{"type":48,"value":220}," - Complete API documentation",{"type":42,"tag":119,"props":222,"children":223},{},[224,233],{"type":42,"tag":60,"props":225,"children":226},{},[227],{"type":42,"tag":68,"props":228,"children":230},{"href":229},"examples\u002Fqt-gtk-integration.md",[231],{"type":48,"value":232},"Qt\u002FGTK Integration",{"type":48,"value":234}," - UI framework patterns",{"type":42,"tag":119,"props":236,"children":237},{},[238,247],{"type":42,"tag":60,"props":239,"children":240},{},[241],{"type":42,"tag":68,"props":242,"children":244},{"href":243},"troubleshooting\u002Fcommon-issues.md",[245],{"type":48,"value":246},"Troubleshooting",{"type":48,"value":248}," - Quick diagnostics",{"type":42,"tag":119,"props":250,"children":251},{},[252,260],{"type":42,"tag":60,"props":253,"children":254},{},[255],{"type":42,"tag":68,"props":256,"children":258},{"href":257},"SKILL.md",[259],{"type":48,"value":257},{"type":48,"value":261}," - Complete documentation navigation",{"type":42,"tag":51,"props":263,"children":264},{},[265],{"type":42,"tag":60,"props":266,"children":267},{},[268],{"type":48,"value":269},"Having issues?",{"type":42,"tag":191,"props":271,"children":272},{},[273,284,295],{"type":42,"tag":119,"props":274,"children":275},{},[276,278],{"type":48,"value":277},"PulseAudio setup → ",{"type":42,"tag":68,"props":279,"children":281},{"href":280},"troubleshooting\u002Fpulseaudio-setup.md",[282],{"type":48,"value":283},"PulseAudio Guide",{"type":42,"tag":119,"props":285,"children":286},{},[287,289],{"type":48,"value":288},"Qt dependencies → ",{"type":42,"tag":68,"props":290,"children":292},{"href":291},"troubleshooting\u002Fqt-dependencies.md",[293],{"type":48,"value":294},"Qt Dependencies",{"type":42,"tag":119,"props":296,"children":297},{},[298,300],{"type":48,"value":299},"Build errors → ",{"type":42,"tag":68,"props":301,"children":303},{"href":302},"troubleshooting\u002Fbuild-errors.md",[304],{"type":48,"value":305},"Build Errors Guide",{"type":42,"tag":100,"props":307,"children":309},{"id":308},"key-differences-from-windowsmacos",[310],{"type":48,"value":311},"Key Differences from Windows\u002FmacOS",{"type":42,"tag":313,"props":314,"children":315},"table",{},[316,339],{"type":42,"tag":317,"props":318,"children":319},"thead",{},[320],{"type":42,"tag":321,"props":322,"children":323},"tr",{},[324,330,334],{"type":42,"tag":325,"props":326,"children":327},"th",{},[328],{"type":48,"value":329},"Feature",{"type":42,"tag":325,"props":331,"children":332},{},[333],{"type":48,"value":13},{"type":42,"tag":325,"props":335,"children":336},{},[337],{"type":48,"value":338},"Windows\u002FMac",{"type":42,"tag":340,"props":341,"children":342},"tbody",{},[343,365,390,411,432,453],{"type":42,"tag":321,"props":344,"children":345},{},[346,355,360],{"type":42,"tag":347,"props":348,"children":349},"td",{},[350],{"type":42,"tag":60,"props":351,"children":352},{},[353],{"type":48,"value":354},"Canvas API",{"type":42,"tag":347,"props":356,"children":357},{},[358],{"type":48,"value":359},"❌ Not available",{"type":42,"tag":347,"props":361,"children":362},{},[363],{"type":48,"value":364},"✅ Available",{"type":42,"tag":321,"props":366,"children":367},{},[368,376,386],{"type":42,"tag":347,"props":369,"children":370},{},[371],{"type":42,"tag":60,"props":372,"children":373},{},[374],{"type":48,"value":375},"Raw Data Pipe",{"type":42,"tag":347,"props":377,"children":378},{},[379,381],{"type":48,"value":380},"✅ ",{"type":42,"tag":60,"props":382,"children":383},{},[384],{"type":48,"value":385},"ONLY option",{"type":42,"tag":347,"props":387,"children":388},{},[389],{"type":48,"value":364},{"type":42,"tag":321,"props":391,"children":392},{},[393,401,406],{"type":42,"tag":347,"props":394,"children":395},{},[396],{"type":42,"tag":60,"props":397,"children":398},{},[399],{"type":48,"value":400},"UI Integration",{"type":42,"tag":347,"props":402,"children":403},{},[404],{"type":48,"value":405},"Qt, GTK, SDL2, OpenGL",{"type":42,"tag":347,"props":407,"children":408},{},[409],{"type":48,"value":410},"Win32\u002FWinForms\u002FWPF, Cocoa",{"type":42,"tag":321,"props":412,"children":413},{},[414,422,427],{"type":42,"tag":347,"props":415,"children":416},{},[417],{"type":42,"tag":60,"props":418,"children":419},{},[420],{"type":48,"value":421},"Headless Support",{"type":42,"tag":347,"props":423,"children":424},{},[425],{"type":48,"value":426},"✅ Excellent (Docker)",{"type":42,"tag":347,"props":428,"children":429},{},[430],{"type":48,"value":431},"Limited",{"type":42,"tag":321,"props":433,"children":434},{},[435,443,448],{"type":42,"tag":347,"props":436,"children":437},{},[438],{"type":42,"tag":60,"props":439,"children":440},{},[441],{"type":48,"value":442},"Audio",{"type":42,"tag":347,"props":444,"children":445},{},[446],{"type":48,"value":447},"PulseAudio required",{"type":42,"tag":347,"props":449,"children":450},{},[451],{"type":48,"value":452},"Native",{"type":42,"tag":321,"props":454,"children":455},{},[456,464,469],{"type":42,"tag":347,"props":457,"children":458},{},[459],{"type":42,"tag":60,"props":460,"children":461},{},[462],{"type":48,"value":463},"Virtual Devices",{"type":42,"tag":347,"props":465,"children":466},{},[467],{"type":48,"value":468},"✅ Required for headless",{"type":42,"tag":347,"props":470,"children":471},{},[472],{"type":48,"value":473},"Optional",{"type":42,"tag":100,"props":475,"children":477},{"id":476},"sdk-overview",[478],{"type":48,"value":479},"SDK Overview",{"type":42,"tag":51,"props":481,"children":482},{},[483],{"type":48,"value":484},"The Zoom Video SDK for Linux is a C++ library optimized for:",{"type":42,"tag":191,"props":486,"children":487},{},[488,498,508,518,528,538,548,558],{"type":42,"tag":119,"props":489,"children":490},{},[491,496],{"type":42,"tag":60,"props":492,"children":493},{},[494],{"type":48,"value":495},"Headless Bots",{"type":48,"value":497},": Docker\u002FWSL support, no display required",{"type":42,"tag":119,"props":499,"children":500},{},[501,506],{"type":42,"tag":60,"props":502,"children":503},{},[504],{"type":48,"value":505},"Raw Data Access",{"type":48,"value":507},": Capture YUV420 video, PCM audio",{"type":42,"tag":119,"props":509,"children":510},{},[511,516],{"type":42,"tag":60,"props":512,"children":513},{},[514],{"type":48,"value":515},"Raw Data Injection",{"type":48,"value":517},": Virtual camera\u002Fmic for custom media",{"type":42,"tag":119,"props":519,"children":520},{},[521,526],{"type":42,"tag":60,"props":522,"children":523},{},[524],{"type":48,"value":525},"Screen Sharing",{"type":48,"value":527},": Capture or inject share data",{"type":42,"tag":119,"props":529,"children":530},{},[531,536],{"type":42,"tag":60,"props":532,"children":533},{},[534],{"type":48,"value":535},"Cloud Recording",{"type":48,"value":537},": Record sessions to Zoom cloud",{"type":42,"tag":119,"props":539,"children":540},{},[541,546],{"type":42,"tag":60,"props":542,"children":543},{},[544],{"type":48,"value":545},"Live Streaming",{"type":48,"value":547},": Stream to RTMP endpoints",{"type":42,"tag":119,"props":549,"children":550},{},[551,556],{"type":42,"tag":60,"props":552,"children":553},{},[554],{"type":48,"value":555},"Live Transcription",{"type":48,"value":557},": Real-time speech-to-text",{"type":42,"tag":119,"props":559,"children":560},{},[561,565],{"type":42,"tag":60,"props":562,"children":563},{},[564],{"type":48,"value":232},{"type":48,"value":566},": Full UI framework support",{"type":42,"tag":100,"props":568,"children":570},{"id":569},"prerequisites",[571],{"type":48,"value":572},"Prerequisites",{"type":42,"tag":574,"props":575,"children":577},"h3",{"id":576},"system-requirements",[578],{"type":48,"value":579},"System Requirements",{"type":42,"tag":191,"props":581,"children":582},{},[583,593,603,613,623],{"type":42,"tag":119,"props":584,"children":585},{},[586,591],{"type":42,"tag":60,"props":587,"children":588},{},[589],{"type":48,"value":590},"OS",{"type":48,"value":592},": Ubuntu 20.04+, Debian 11+, or compatible",{"type":42,"tag":119,"props":594,"children":595},{},[596,601],{"type":42,"tag":60,"props":597,"children":598},{},[599],{"type":48,"value":600},"Architecture",{"type":48,"value":602},": x64 (recommended), ARM64",{"type":42,"tag":119,"props":604,"children":605},{},[606,611],{"type":42,"tag":60,"props":607,"children":608},{},[609],{"type":48,"value":610},"Compiler",{"type":48,"value":612},": GCC 9+, Clang 10+",{"type":42,"tag":119,"props":614,"children":615},{},[616,621],{"type":42,"tag":60,"props":617,"children":618},{},[619],{"type":48,"value":620},"CMake",{"type":48,"value":622},": 3.14 or later",{"type":42,"tag":119,"props":624,"children":625},{},[626,631],{"type":42,"tag":60,"props":627,"children":628},{},[629],{"type":48,"value":630},"Qt5",{"type":48,"value":632},": Bundled with SDK (do NOT install system Qt5)",{"type":42,"tag":574,"props":634,"children":636},{"id":635},"dependencies",[637],{"type":48,"value":638},"Dependencies",{"type":42,"tag":640,"props":641,"children":646},"pre",{"className":642,"code":643,"language":644,"meta":645,"style":645},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","sudo apt update\nsudo apt install -y build-essential gcc cmake libglib2.0-dev liblzma-dev \\\n    libxcb-image0 libxcb-keysyms1 libxcb-xfixes0 libxcb-xkb1 libxcb-shape0 \\\n    libxcb-shm0 libxcb-randr0 libxcb-xtest0 libgbm1 libxtst6 libgl1 libnss3 \\\n    libasound2 libpulse0\n\n# For headless Linux\nsudo apt install -y pulseaudio\n\n# PulseAudio configuration (CRITICAL for audio)\nmkdir -p ~\u002F.config\necho \"[General]\" > ~\u002F.config\u002Fzoomus.conf\necho \"system.audio.type=default\" >> ~\u002F.config\u002Fzoomus.conf\n\n# Log directory\nmkdir -p ~\u002F.zoom\u002Flogs\n","bash","",[647],{"type":42,"tag":648,"props":649,"children":650},"code",{"__ignoreMap":645},[651,674,727,760,803,817,827,837,862,870,879,898,934,964,972,981],{"type":42,"tag":652,"props":653,"children":656},"span",{"class":654,"line":655},"line",1,[657,663,669],{"type":42,"tag":652,"props":658,"children":660},{"style":659},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[661],{"type":48,"value":662},"sudo",{"type":42,"tag":652,"props":664,"children":666},{"style":665},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[667],{"type":48,"value":668}," apt",{"type":42,"tag":652,"props":670,"children":671},{"style":665},[672],{"type":48,"value":673}," update\n",{"type":42,"tag":652,"props":675,"children":677},{"class":654,"line":676},2,[678,682,686,691,696,701,706,711,716,721],{"type":42,"tag":652,"props":679,"children":680},{"style":659},[681],{"type":48,"value":662},{"type":42,"tag":652,"props":683,"children":684},{"style":665},[685],{"type":48,"value":668},{"type":42,"tag":652,"props":687,"children":688},{"style":665},[689],{"type":48,"value":690}," install",{"type":42,"tag":652,"props":692,"children":693},{"style":665},[694],{"type":48,"value":695}," -y",{"type":42,"tag":652,"props":697,"children":698},{"style":665},[699],{"type":48,"value":700}," build-essential",{"type":42,"tag":652,"props":702,"children":703},{"style":665},[704],{"type":48,"value":705}," gcc",{"type":42,"tag":652,"props":707,"children":708},{"style":665},[709],{"type":48,"value":710}," cmake",{"type":42,"tag":652,"props":712,"children":713},{"style":665},[714],{"type":48,"value":715}," libglib2.0-dev",{"type":42,"tag":652,"props":717,"children":718},{"style":665},[719],{"type":48,"value":720}," liblzma-dev",{"type":42,"tag":652,"props":722,"children":724},{"style":723},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[725],{"type":48,"value":726}," \\\n",{"type":42,"tag":652,"props":728,"children":730},{"class":654,"line":729},3,[731,736,741,746,751,756],{"type":42,"tag":652,"props":732,"children":733},{"style":665},[734],{"type":48,"value":735},"    libxcb-image0",{"type":42,"tag":652,"props":737,"children":738},{"style":665},[739],{"type":48,"value":740}," libxcb-keysyms1",{"type":42,"tag":652,"props":742,"children":743},{"style":665},[744],{"type":48,"value":745}," libxcb-xfixes0",{"type":42,"tag":652,"props":747,"children":748},{"style":665},[749],{"type":48,"value":750}," libxcb-xkb1",{"type":42,"tag":652,"props":752,"children":753},{"style":665},[754],{"type":48,"value":755}," libxcb-shape0",{"type":42,"tag":652,"props":757,"children":758},{"style":723},[759],{"type":48,"value":726},{"type":42,"tag":652,"props":761,"children":763},{"class":654,"line":762},4,[764,769,774,779,784,789,794,799],{"type":42,"tag":652,"props":765,"children":766},{"style":665},[767],{"type":48,"value":768},"    libxcb-shm0",{"type":42,"tag":652,"props":770,"children":771},{"style":665},[772],{"type":48,"value":773}," libxcb-randr0",{"type":42,"tag":652,"props":775,"children":776},{"style":665},[777],{"type":48,"value":778}," libxcb-xtest0",{"type":42,"tag":652,"props":780,"children":781},{"style":665},[782],{"type":48,"value":783}," libgbm1",{"type":42,"tag":652,"props":785,"children":786},{"style":665},[787],{"type":48,"value":788}," libxtst6",{"type":42,"tag":652,"props":790,"children":791},{"style":665},[792],{"type":48,"value":793}," libgl1",{"type":42,"tag":652,"props":795,"children":796},{"style":665},[797],{"type":48,"value":798}," libnss3",{"type":42,"tag":652,"props":800,"children":801},{"style":723},[802],{"type":48,"value":726},{"type":42,"tag":652,"props":804,"children":806},{"class":654,"line":805},5,[807,812],{"type":42,"tag":652,"props":808,"children":809},{"style":665},[810],{"type":48,"value":811},"    libasound2",{"type":42,"tag":652,"props":813,"children":814},{"style":665},[815],{"type":48,"value":816}," libpulse0\n",{"type":42,"tag":652,"props":818,"children":820},{"class":654,"line":819},6,[821],{"type":42,"tag":652,"props":822,"children":824},{"emptyLinePlaceholder":823},true,[825],{"type":48,"value":826},"\n",{"type":42,"tag":652,"props":828,"children":830},{"class":654,"line":829},7,[831],{"type":42,"tag":652,"props":832,"children":834},{"style":833},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic",[835],{"type":48,"value":836},"# For headless Linux\n",{"type":42,"tag":652,"props":838,"children":840},{"class":654,"line":839},8,[841,845,849,853,857],{"type":42,"tag":652,"props":842,"children":843},{"style":659},[844],{"type":48,"value":662},{"type":42,"tag":652,"props":846,"children":847},{"style":665},[848],{"type":48,"value":668},{"type":42,"tag":652,"props":850,"children":851},{"style":665},[852],{"type":48,"value":690},{"type":42,"tag":652,"props":854,"children":855},{"style":665},[856],{"type":48,"value":695},{"type":42,"tag":652,"props":858,"children":859},{"style":665},[860],{"type":48,"value":861}," pulseaudio\n",{"type":42,"tag":652,"props":863,"children":865},{"class":654,"line":864},9,[866],{"type":42,"tag":652,"props":867,"children":868},{"emptyLinePlaceholder":823},[869],{"type":48,"value":826},{"type":42,"tag":652,"props":871,"children":873},{"class":654,"line":872},10,[874],{"type":42,"tag":652,"props":875,"children":876},{"style":833},[877],{"type":48,"value":878},"# PulseAudio configuration (CRITICAL for audio)\n",{"type":42,"tag":652,"props":880,"children":882},{"class":654,"line":881},11,[883,888,893],{"type":42,"tag":652,"props":884,"children":885},{"style":659},[886],{"type":48,"value":887},"mkdir",{"type":42,"tag":652,"props":889,"children":890},{"style":665},[891],{"type":48,"value":892}," -p",{"type":42,"tag":652,"props":894,"children":895},{"style":665},[896],{"type":48,"value":897}," ~\u002F.config\n",{"type":42,"tag":652,"props":899,"children":901},{"class":654,"line":900},12,[902,908,914,919,924,929],{"type":42,"tag":652,"props":903,"children":905},{"style":904},"--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF",[906],{"type":48,"value":907},"echo",{"type":42,"tag":652,"props":909,"children":911},{"style":910},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[912],{"type":48,"value":913}," \"",{"type":42,"tag":652,"props":915,"children":916},{"style":665},[917],{"type":48,"value":918},"[General]",{"type":42,"tag":652,"props":920,"children":921},{"style":910},[922],{"type":48,"value":923},"\"",{"type":42,"tag":652,"props":925,"children":926},{"style":910},[927],{"type":48,"value":928}," >",{"type":42,"tag":652,"props":930,"children":931},{"style":665},[932],{"type":48,"value":933}," ~\u002F.config\u002Fzoomus.conf\n",{"type":42,"tag":652,"props":935,"children":937},{"class":654,"line":936},13,[938,942,946,951,955,960],{"type":42,"tag":652,"props":939,"children":940},{"style":904},[941],{"type":48,"value":907},{"type":42,"tag":652,"props":943,"children":944},{"style":910},[945],{"type":48,"value":913},{"type":42,"tag":652,"props":947,"children":948},{"style":665},[949],{"type":48,"value":950},"system.audio.type=default",{"type":42,"tag":652,"props":952,"children":953},{"style":910},[954],{"type":48,"value":923},{"type":42,"tag":652,"props":956,"children":957},{"style":910},[958],{"type":48,"value":959}," >>",{"type":42,"tag":652,"props":961,"children":962},{"style":665},[963],{"type":48,"value":933},{"type":42,"tag":652,"props":965,"children":967},{"class":654,"line":966},14,[968],{"type":42,"tag":652,"props":969,"children":970},{"emptyLinePlaceholder":823},[971],{"type":48,"value":826},{"type":42,"tag":652,"props":973,"children":975},{"class":654,"line":974},15,[976],{"type":42,"tag":652,"props":977,"children":978},{"style":833},[979],{"type":48,"value":980},"# Log directory\n",{"type":42,"tag":652,"props":982,"children":984},{"class":654,"line":983},16,[985,989,993],{"type":42,"tag":652,"props":986,"children":987},{"style":659},[988],{"type":48,"value":887},{"type":42,"tag":652,"props":990,"children":991},{"style":665},[992],{"type":48,"value":892},{"type":42,"tag":652,"props":994,"children":995},{"style":665},[996],{"type":48,"value":997}," ~\u002F.zoom\u002Flogs\n",{"type":42,"tag":100,"props":999,"children":1001},{"id":1000},"quick-start",[1002],{"type":48,"value":1003},"Quick Start",{"type":42,"tag":640,"props":1005,"children":1009},{"className":1006,"code":1007,"language":1008,"meta":645,"style":645},"language-cpp shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","#include \"zoom_video_sdk_api.h\"\n#include \"zoom_video_sdk_interface.h\"\n#include \"zoom_video_sdk_delegate_interface.h\"\n\nUSING_ZOOM_VIDEO_SDK_NAMESPACE\n\n\u002F\u002F 1. Create SDK\nIZoomVideoSDK* sdk = CreateZoomVideoSDKObj();\n\n\u002F\u002F 2. Initialize\nZoomVideoSDKInitParams init_params;\ninit_params.domain = \"https:\u002F\u002Fzoom.us\";\ninit_params.enableLog = true;\ninit_params.logFilePrefix = \"bot\";\ninit_params.videoRawDataMemoryMode = ZoomVideoSDKRawDataMemoryModeHeap;\ninit_params.shareRawDataMemoryMode = ZoomVideoSDKRawDataMemoryModeHeap;\ninit_params.audioRawDataMemoryMode = ZoomVideoSDKRawDataMemoryModeHeap;\n\nsdk->initialize(init_params);\n\n\u002F\u002F 3. Add delegate\nsdk->addListener(myDelegate);\n\n\u002F\u002F 4. Join session\nZoomVideoSDKSessionContext ctx;\nctx.sessionName = \"my-session\";\nctx.userName = \"Linux Bot\";\nctx.token = \"jwt-token\";\nctx.audioOption.connect = true;\nctx.audioOption.mute = false;\nctx.videoOption.localVideoOn = false;\n\n\u002F\u002F For headless: Virtual audio speaker\nctx.virtualAudioSpeaker = new VirtualSpeaker();\n\nIZoomVideoSDKSession* session = sdk->joinSession(ctx);\n","cpp",[1010],{"type":42,"tag":648,"props":1011,"children":1012},{"__ignoreMap":645},[1013,1021,1029,1037,1044,1052,1059,1067,1075,1082,1090,1098,1106,1114,1122,1130,1138,1147,1155,1164,1172,1181,1190,1198,1207,1216,1225,1234,1243,1252,1261,1270,1278,1287,1296,1304],{"type":42,"tag":652,"props":1014,"children":1015},{"class":654,"line":655},[1016],{"type":42,"tag":652,"props":1017,"children":1018},{},[1019],{"type":48,"value":1020},"#include \"zoom_video_sdk_api.h\"\n",{"type":42,"tag":652,"props":1022,"children":1023},{"class":654,"line":676},[1024],{"type":42,"tag":652,"props":1025,"children":1026},{},[1027],{"type":48,"value":1028},"#include \"zoom_video_sdk_interface.h\"\n",{"type":42,"tag":652,"props":1030,"children":1031},{"class":654,"line":729},[1032],{"type":42,"tag":652,"props":1033,"children":1034},{},[1035],{"type":48,"value":1036},"#include \"zoom_video_sdk_delegate_interface.h\"\n",{"type":42,"tag":652,"props":1038,"children":1039},{"class":654,"line":762},[1040],{"type":42,"tag":652,"props":1041,"children":1042},{"emptyLinePlaceholder":823},[1043],{"type":48,"value":826},{"type":42,"tag":652,"props":1045,"children":1046},{"class":654,"line":805},[1047],{"type":42,"tag":652,"props":1048,"children":1049},{},[1050],{"type":48,"value":1051},"USING_ZOOM_VIDEO_SDK_NAMESPACE\n",{"type":42,"tag":652,"props":1053,"children":1054},{"class":654,"line":819},[1055],{"type":42,"tag":652,"props":1056,"children":1057},{"emptyLinePlaceholder":823},[1058],{"type":48,"value":826},{"type":42,"tag":652,"props":1060,"children":1061},{"class":654,"line":829},[1062],{"type":42,"tag":652,"props":1063,"children":1064},{},[1065],{"type":48,"value":1066},"\u002F\u002F 1. Create SDK\n",{"type":42,"tag":652,"props":1068,"children":1069},{"class":654,"line":839},[1070],{"type":42,"tag":652,"props":1071,"children":1072},{},[1073],{"type":48,"value":1074},"IZoomVideoSDK* sdk = CreateZoomVideoSDKObj();\n",{"type":42,"tag":652,"props":1076,"children":1077},{"class":654,"line":864},[1078],{"type":42,"tag":652,"props":1079,"children":1080},{"emptyLinePlaceholder":823},[1081],{"type":48,"value":826},{"type":42,"tag":652,"props":1083,"children":1084},{"class":654,"line":872},[1085],{"type":42,"tag":652,"props":1086,"children":1087},{},[1088],{"type":48,"value":1089},"\u002F\u002F 2. Initialize\n",{"type":42,"tag":652,"props":1091,"children":1092},{"class":654,"line":881},[1093],{"type":42,"tag":652,"props":1094,"children":1095},{},[1096],{"type":48,"value":1097},"ZoomVideoSDKInitParams init_params;\n",{"type":42,"tag":652,"props":1099,"children":1100},{"class":654,"line":900},[1101],{"type":42,"tag":652,"props":1102,"children":1103},{},[1104],{"type":48,"value":1105},"init_params.domain = \"https:\u002F\u002Fzoom.us\";\n",{"type":42,"tag":652,"props":1107,"children":1108},{"class":654,"line":936},[1109],{"type":42,"tag":652,"props":1110,"children":1111},{},[1112],{"type":48,"value":1113},"init_params.enableLog = true;\n",{"type":42,"tag":652,"props":1115,"children":1116},{"class":654,"line":966},[1117],{"type":42,"tag":652,"props":1118,"children":1119},{},[1120],{"type":48,"value":1121},"init_params.logFilePrefix = \"bot\";\n",{"type":42,"tag":652,"props":1123,"children":1124},{"class":654,"line":974},[1125],{"type":42,"tag":652,"props":1126,"children":1127},{},[1128],{"type":48,"value":1129},"init_params.videoRawDataMemoryMode = ZoomVideoSDKRawDataMemoryModeHeap;\n",{"type":42,"tag":652,"props":1131,"children":1132},{"class":654,"line":983},[1133],{"type":42,"tag":652,"props":1134,"children":1135},{},[1136],{"type":48,"value":1137},"init_params.shareRawDataMemoryMode = ZoomVideoSDKRawDataMemoryModeHeap;\n",{"type":42,"tag":652,"props":1139,"children":1141},{"class":654,"line":1140},17,[1142],{"type":42,"tag":652,"props":1143,"children":1144},{},[1145],{"type":48,"value":1146},"init_params.audioRawDataMemoryMode = ZoomVideoSDKRawDataMemoryModeHeap;\n",{"type":42,"tag":652,"props":1148,"children":1150},{"class":654,"line":1149},18,[1151],{"type":42,"tag":652,"props":1152,"children":1153},{"emptyLinePlaceholder":823},[1154],{"type":48,"value":826},{"type":42,"tag":652,"props":1156,"children":1158},{"class":654,"line":1157},19,[1159],{"type":42,"tag":652,"props":1160,"children":1161},{},[1162],{"type":48,"value":1163},"sdk->initialize(init_params);\n",{"type":42,"tag":652,"props":1165,"children":1167},{"class":654,"line":1166},20,[1168],{"type":42,"tag":652,"props":1169,"children":1170},{"emptyLinePlaceholder":823},[1171],{"type":48,"value":826},{"type":42,"tag":652,"props":1173,"children":1175},{"class":654,"line":1174},21,[1176],{"type":42,"tag":652,"props":1177,"children":1178},{},[1179],{"type":48,"value":1180},"\u002F\u002F 3. Add delegate\n",{"type":42,"tag":652,"props":1182,"children":1184},{"class":654,"line":1183},22,[1185],{"type":42,"tag":652,"props":1186,"children":1187},{},[1188],{"type":48,"value":1189},"sdk->addListener(myDelegate);\n",{"type":42,"tag":652,"props":1191,"children":1193},{"class":654,"line":1192},23,[1194],{"type":42,"tag":652,"props":1195,"children":1196},{"emptyLinePlaceholder":823},[1197],{"type":48,"value":826},{"type":42,"tag":652,"props":1199,"children":1201},{"class":654,"line":1200},24,[1202],{"type":42,"tag":652,"props":1203,"children":1204},{},[1205],{"type":48,"value":1206},"\u002F\u002F 4. Join session\n",{"type":42,"tag":652,"props":1208,"children":1210},{"class":654,"line":1209},25,[1211],{"type":42,"tag":652,"props":1212,"children":1213},{},[1214],{"type":48,"value":1215},"ZoomVideoSDKSessionContext ctx;\n",{"type":42,"tag":652,"props":1217,"children":1219},{"class":654,"line":1218},26,[1220],{"type":42,"tag":652,"props":1221,"children":1222},{},[1223],{"type":48,"value":1224},"ctx.sessionName = \"my-session\";\n",{"type":42,"tag":652,"props":1226,"children":1228},{"class":654,"line":1227},27,[1229],{"type":42,"tag":652,"props":1230,"children":1231},{},[1232],{"type":48,"value":1233},"ctx.userName = \"Linux Bot\";\n",{"type":42,"tag":652,"props":1235,"children":1237},{"class":654,"line":1236},28,[1238],{"type":42,"tag":652,"props":1239,"children":1240},{},[1241],{"type":48,"value":1242},"ctx.token = \"jwt-token\";\n",{"type":42,"tag":652,"props":1244,"children":1246},{"class":654,"line":1245},29,[1247],{"type":42,"tag":652,"props":1248,"children":1249},{},[1250],{"type":48,"value":1251},"ctx.audioOption.connect = true;\n",{"type":42,"tag":652,"props":1253,"children":1255},{"class":654,"line":1254},30,[1256],{"type":42,"tag":652,"props":1257,"children":1258},{},[1259],{"type":48,"value":1260},"ctx.audioOption.mute = false;\n",{"type":42,"tag":652,"props":1262,"children":1264},{"class":654,"line":1263},31,[1265],{"type":42,"tag":652,"props":1266,"children":1267},{},[1268],{"type":48,"value":1269},"ctx.videoOption.localVideoOn = false;\n",{"type":42,"tag":652,"props":1271,"children":1273},{"class":654,"line":1272},32,[1274],{"type":42,"tag":652,"props":1275,"children":1276},{"emptyLinePlaceholder":823},[1277],{"type":48,"value":826},{"type":42,"tag":652,"props":1279,"children":1281},{"class":654,"line":1280},33,[1282],{"type":42,"tag":652,"props":1283,"children":1284},{},[1285],{"type":48,"value":1286},"\u002F\u002F For headless: Virtual audio speaker\n",{"type":42,"tag":652,"props":1288,"children":1290},{"class":654,"line":1289},34,[1291],{"type":42,"tag":652,"props":1292,"children":1293},{},[1294],{"type":48,"value":1295},"ctx.virtualAudioSpeaker = new VirtualSpeaker();\n",{"type":42,"tag":652,"props":1297,"children":1299},{"class":654,"line":1298},35,[1300],{"type":42,"tag":652,"props":1301,"children":1302},{"emptyLinePlaceholder":823},[1303],{"type":48,"value":826},{"type":42,"tag":652,"props":1305,"children":1307},{"class":654,"line":1306},36,[1308],{"type":42,"tag":652,"props":1309,"children":1310},{},[1311],{"type":48,"value":1312},"IZoomVideoSDKSession* session = sdk->joinSession(ctx);\n",{"type":42,"tag":51,"props":1314,"children":1315},{},[1316,1318,1325],{"type":48,"value":1317},"See ",{"type":42,"tag":60,"props":1319,"children":1320},{},[1321],{"type":42,"tag":68,"props":1322,"children":1323},{"href":141},[1324],{"type":48,"value":144},{"type":48,"value":1326}," for complete code.",{"type":42,"tag":100,"props":1328,"children":1330},{"id":1329},"key-features",[1331],{"type":48,"value":1332},"Key Features",{"type":42,"tag":313,"props":1334,"children":1335},{},[1336,1356],{"type":42,"tag":317,"props":1337,"children":1338},{},[1339],{"type":42,"tag":321,"props":1340,"children":1341},{},[1342,1346,1351],{"type":42,"tag":325,"props":1343,"children":1344},{},[1345],{"type":48,"value":329},{"type":42,"tag":325,"props":1347,"children":1348},{},[1349],{"type":48,"value":1350},"Linux Support",{"type":42,"tag":325,"props":1352,"children":1353},{},[1354],{"type":48,"value":1355},"Guide",{"type":42,"tag":340,"props":1357,"children":1358},{},[1359,1383,1407,1431,1454,1477,1500,1523,1547,1570,1594,1617],{"type":42,"tag":321,"props":1360,"children":1361},{},[1362,1370,1375],{"type":42,"tag":347,"props":1363,"children":1364},{},[1365],{"type":42,"tag":60,"props":1366,"children":1367},{},[1368],{"type":48,"value":1369},"Session Management",{"type":42,"tag":347,"props":1371,"children":1372},{},[1373],{"type":48,"value":1374},"✅ Full",{"type":42,"tag":347,"props":1376,"children":1377},{},[1378],{"type":42,"tag":68,"props":1379,"children":1380},{"href":141},[1381],{"type":48,"value":1382},"Session Join",{"type":42,"tag":321,"props":1384,"children":1385},{},[1386,1394,1399],{"type":42,"tag":347,"props":1387,"children":1388},{},[1389],{"type":42,"tag":60,"props":1390,"children":1391},{},[1392],{"type":48,"value":1393},"Raw Video (YUV420)",{"type":42,"tag":347,"props":1395,"children":1396},{},[1397],{"type":48,"value":1398},"✅ ONLY rendering option",{"type":42,"tag":347,"props":1400,"children":1401},{},[1402],{"type":42,"tag":68,"props":1403,"children":1404},{"href":176},[1405],{"type":48,"value":1406},"Raw Video",{"type":42,"tag":321,"props":1408,"children":1409},{},[1410,1418,1422],{"type":42,"tag":347,"props":1411,"children":1412},{},[1413],{"type":42,"tag":60,"props":1414,"children":1415},{},[1416],{"type":48,"value":1417},"Raw Audio (PCM)",{"type":42,"tag":347,"props":1419,"children":1420},{},[1421],{"type":48,"value":1374},{"type":42,"tag":347,"props":1423,"children":1424},{},[1425],{"type":42,"tag":68,"props":1426,"children":1428},{"href":1427},"examples\u002Fraw-audio-capture.md",[1429],{"type":48,"value":1430},"Raw Audio",{"type":42,"tag":321,"props":1432,"children":1433},{},[1434,1442,1446],{"type":42,"tag":347,"props":1435,"children":1436},{},[1437],{"type":42,"tag":60,"props":1438,"children":1439},{},[1440],{"type":48,"value":1441},"Virtual Camera\u002FMic",{"type":42,"tag":347,"props":1443,"children":1444},{},[1445],{"type":48,"value":1374},{"type":42,"tag":347,"props":1447,"children":1448},{},[1449],{"type":42,"tag":68,"props":1450,"children":1452},{"href":1451},"examples\u002Fvirtual-audio-video.md",[1453],{"type":48,"value":463},{"type":42,"tag":321,"props":1455,"children":1456},{},[1457,1464,1468],{"type":42,"tag":347,"props":1458,"children":1459},{},[1460],{"type":42,"tag":60,"props":1461,"children":1462},{},[1463],{"type":48,"value":535},{"type":42,"tag":347,"props":1465,"children":1466},{},[1467],{"type":48,"value":1374},{"type":42,"tag":347,"props":1469,"children":1470},{},[1471],{"type":42,"tag":68,"props":1472,"children":1474},{"href":1473},"examples\u002Fcloud-recording.md",[1475],{"type":48,"value":1476},"Recording",{"type":42,"tag":321,"props":1478,"children":1479},{},[1480,1487,1491],{"type":42,"tag":347,"props":1481,"children":1482},{},[1483],{"type":42,"tag":60,"props":1484,"children":1485},{},[1486],{"type":48,"value":545},{"type":42,"tag":347,"props":1488,"children":1489},{},[1490],{"type":48,"value":1374},{"type":42,"tag":347,"props":1492,"children":1493},{},[1494],{"type":42,"tag":68,"props":1495,"children":1497},{"href":1496},"examples\u002Flive-streaming.md",[1498],{"type":48,"value":1499},"Live Stream",{"type":42,"tag":321,"props":1501,"children":1502},{},[1503,1510,1514],{"type":42,"tag":347,"props":1504,"children":1505},{},[1506],{"type":42,"tag":60,"props":1507,"children":1508},{},[1509],{"type":48,"value":555},{"type":42,"tag":347,"props":1511,"children":1512},{},[1513],{"type":48,"value":1374},{"type":42,"tag":347,"props":1515,"children":1516},{},[1517],{"type":42,"tag":68,"props":1518,"children":1520},{"href":1519},"examples\u002Ftranscription.md",[1521],{"type":48,"value":1522},"Transcription",{"type":42,"tag":321,"props":1524,"children":1525},{},[1526,1534,1538],{"type":42,"tag":347,"props":1527,"children":1528},{},[1529],{"type":42,"tag":60,"props":1530,"children":1531},{},[1532],{"type":48,"value":1533},"Command Channel",{"type":42,"tag":347,"props":1535,"children":1536},{},[1537],{"type":48,"value":1374},{"type":42,"tag":347,"props":1539,"children":1540},{},[1541],{"type":42,"tag":68,"props":1542,"children":1544},{"href":1543},"examples\u002Fcommand-channel.md",[1545],{"type":48,"value":1546},"Commands",{"type":42,"tag":321,"props":1548,"children":1549},{},[1550,1558,1562],{"type":42,"tag":347,"props":1551,"children":1552},{},[1553],{"type":42,"tag":60,"props":1554,"children":1555},{},[1556],{"type":48,"value":1557},"Chat",{"type":42,"tag":347,"props":1559,"children":1560},{},[1561],{"type":48,"value":1374},{"type":42,"tag":347,"props":1563,"children":1564},{},[1565],{"type":42,"tag":68,"props":1566,"children":1568},{"href":1567},"examples\u002Fchat.md",[1569],{"type":48,"value":1557},{"type":42,"tag":321,"props":1571,"children":1572},{},[1573,1581,1586],{"type":42,"tag":347,"props":1574,"children":1575},{},[1576],{"type":42,"tag":60,"props":1577,"children":1578},{},[1579],{"type":48,"value":1580},"Qt Integration",{"type":42,"tag":347,"props":1582,"children":1583},{},[1584],{"type":48,"value":1585},"✅ Recommended",{"type":42,"tag":347,"props":1587,"children":1588},{},[1589],{"type":42,"tag":68,"props":1590,"children":1591},{"href":229},[1592],{"type":48,"value":1593},"Qt\u002FGTK",{"type":42,"tag":321,"props":1595,"children":1596},{},[1597,1605,1610],{"type":42,"tag":347,"props":1598,"children":1599},{},[1600],{"type":42,"tag":60,"props":1601,"children":1602},{},[1603],{"type":48,"value":1604},"GTK Integration",{"type":42,"tag":347,"props":1606,"children":1607},{},[1608],{"type":48,"value":1609},"✅ Supported",{"type":42,"tag":347,"props":1611,"children":1612},{},[1613],{"type":42,"tag":68,"props":1614,"children":1615},{"href":229},[1616],{"type":48,"value":1593},{"type":42,"tag":321,"props":1618,"children":1619},{},[1620,1628,1633],{"type":42,"tag":347,"props":1621,"children":1622},{},[1623],{"type":42,"tag":60,"props":1624,"children":1625},{},[1626],{"type":48,"value":1627},"Docker\u002FHeadless",{"type":42,"tag":347,"props":1629,"children":1630},{},[1631],{"type":48,"value":1632},"✅ Excellent",{"type":42,"tag":347,"props":1634,"children":1635},{},[1636],{"type":42,"tag":68,"props":1637,"children":1638},{"href":1451},[1639],{"type":48,"value":463},{"type":42,"tag":100,"props":1641,"children":1643},{"id":1642},"critical-gotchas",[1644],{"type":48,"value":1645},"Critical Gotchas",{"type":42,"tag":574,"props":1647,"children":1649},{"id":1648},"️-critical-1-no-canvas-api-on-linux",[1650],{"type":48,"value":1651},"⚠️ CRITICAL #1: No Canvas API on Linux",{"type":42,"tag":51,"props":1653,"children":1654},{},[1655,1660],{"type":42,"tag":60,"props":1656,"children":1657},{},[1658],{"type":48,"value":1659},"Problem",{"type":48,"value":1661},": Linux SDK does NOT have Canvas API like Windows\u002FMac.",{"type":42,"tag":51,"props":1663,"children":1664},{},[1665,1670],{"type":42,"tag":60,"props":1666,"children":1667},{},[1668],{"type":48,"value":1669},"Solution",{"type":48,"value":1671},": You MUST use Raw Data Pipe and implement your own rendering.",{"type":42,"tag":51,"props":1673,"children":1674},{},[1675,1677],{"type":48,"value":1676},"See: ",{"type":42,"tag":60,"props":1678,"children":1679},{},[1680],{"type":42,"tag":68,"props":1681,"children":1682},{"href":155},[1683],{"type":48,"value":158},{"type":42,"tag":574,"props":1685,"children":1687},{"id":1686},"️-critical-2-pulseaudio-required-for-audio",[1688],{"type":48,"value":1689},"⚠️ CRITICAL #2: PulseAudio Required for Audio",{"type":42,"tag":51,"props":1691,"children":1692},{},[1693,1697],{"type":42,"tag":60,"props":1694,"children":1695},{},[1696],{"type":48,"value":1659},{"type":48,"value":1698},": SDK requires PulseAudio for raw audio functions.",{"type":42,"tag":51,"props":1700,"children":1701},{},[1702,1706],{"type":42,"tag":60,"props":1703,"children":1704},{},[1705],{"type":48,"value":1669},{"type":48,"value":1707},":",{"type":42,"tag":640,"props":1709,"children":1711},{"className":642,"code":1710,"language":644,"meta":645,"style":645},"sudo apt install -y pulseaudio\nmkdir -p ~\u002F.config\necho \"[General]\" > ~\u002F.config\u002Fzoomus.conf\necho \"system.audio.type=default\" >> ~\u002F.config\u002Fzoomus.conf\n",[1712],{"type":42,"tag":648,"props":1713,"children":1714},{"__ignoreMap":645},[1715,1738,1753,1780],{"type":42,"tag":652,"props":1716,"children":1717},{"class":654,"line":655},[1718,1722,1726,1730,1734],{"type":42,"tag":652,"props":1719,"children":1720},{"style":659},[1721],{"type":48,"value":662},{"type":42,"tag":652,"props":1723,"children":1724},{"style":665},[1725],{"type":48,"value":668},{"type":42,"tag":652,"props":1727,"children":1728},{"style":665},[1729],{"type":48,"value":690},{"type":42,"tag":652,"props":1731,"children":1732},{"style":665},[1733],{"type":48,"value":695},{"type":42,"tag":652,"props":1735,"children":1736},{"style":665},[1737],{"type":48,"value":861},{"type":42,"tag":652,"props":1739,"children":1740},{"class":654,"line":676},[1741,1745,1749],{"type":42,"tag":652,"props":1742,"children":1743},{"style":659},[1744],{"type":48,"value":887},{"type":42,"tag":652,"props":1746,"children":1747},{"style":665},[1748],{"type":48,"value":892},{"type":42,"tag":652,"props":1750,"children":1751},{"style":665},[1752],{"type":48,"value":897},{"type":42,"tag":652,"props":1754,"children":1755},{"class":654,"line":729},[1756,1760,1764,1768,1772,1776],{"type":42,"tag":652,"props":1757,"children":1758},{"style":904},[1759],{"type":48,"value":907},{"type":42,"tag":652,"props":1761,"children":1762},{"style":910},[1763],{"type":48,"value":913},{"type":42,"tag":652,"props":1765,"children":1766},{"style":665},[1767],{"type":48,"value":918},{"type":42,"tag":652,"props":1769,"children":1770},{"style":910},[1771],{"type":48,"value":923},{"type":42,"tag":652,"props":1773,"children":1774},{"style":910},[1775],{"type":48,"value":928},{"type":42,"tag":652,"props":1777,"children":1778},{"style":665},[1779],{"type":48,"value":933},{"type":42,"tag":652,"props":1781,"children":1782},{"class":654,"line":762},[1783,1787,1791,1795,1799,1803],{"type":42,"tag":652,"props":1784,"children":1785},{"style":904},[1786],{"type":48,"value":907},{"type":42,"tag":652,"props":1788,"children":1789},{"style":910},[1790],{"type":48,"value":913},{"type":42,"tag":652,"props":1792,"children":1793},{"style":665},[1794],{"type":48,"value":950},{"type":42,"tag":652,"props":1796,"children":1797},{"style":910},[1798],{"type":48,"value":923},{"type":42,"tag":652,"props":1800,"children":1801},{"style":910},[1802],{"type":48,"value":959},{"type":42,"tag":652,"props":1804,"children":1805},{"style":665},[1806],{"type":48,"value":933},{"type":42,"tag":51,"props":1808,"children":1809},{},[1810,1811],{"type":48,"value":1676},{"type":42,"tag":60,"props":1812,"children":1813},{},[1814],{"type":42,"tag":68,"props":1815,"children":1816},{"href":280},[1817],{"type":48,"value":1818},"PulseAudio Setup",{"type":42,"tag":574,"props":1820,"children":1822},{"id":1821},"️-critical-3-qt5-dependencies",[1823],{"type":48,"value":1824},"⚠️ CRITICAL #3: Qt5 Dependencies",{"type":42,"tag":51,"props":1826,"children":1827},{},[1828,1832],{"type":42,"tag":60,"props":1829,"children":1830},{},[1831],{"type":48,"value":1659},{"type":48,"value":1833},": SDK requires Qt5 libraries (bundled, NOT system Qt5).",{"type":42,"tag":51,"props":1835,"children":1836},{},[1837,1841],{"type":42,"tag":60,"props":1838,"children":1839},{},[1840],{"type":48,"value":1669},{"type":48,"value":1707},{"type":42,"tag":640,"props":1843,"children":1845},{"className":642,"code":1844,"language":644,"meta":645,"style":645},"# Copy from SDK package\ncp -r samples\u002Fqt_libs\u002FQt\u002Flib\u002F* lib\u002Fzoom_video_sdk\u002F\n\n# Create symlinks\ncd lib\u002Fzoom_video_sdk\nfor lib in libQt5*.so.5; do ln -sf $lib ${lib%.5}; done\n",[1846],{"type":42,"tag":648,"props":1847,"children":1848},{"__ignoreMap":645},[1849,1857,1885,1892,1900,1913],{"type":42,"tag":652,"props":1850,"children":1851},{"class":654,"line":655},[1852],{"type":42,"tag":652,"props":1853,"children":1854},{"style":833},[1855],{"type":48,"value":1856},"# Copy from SDK package\n",{"type":42,"tag":652,"props":1858,"children":1859},{"class":654,"line":676},[1860,1865,1870,1875,1880],{"type":42,"tag":652,"props":1861,"children":1862},{"style":659},[1863],{"type":48,"value":1864},"cp",{"type":42,"tag":652,"props":1866,"children":1867},{"style":665},[1868],{"type":48,"value":1869}," -r",{"type":42,"tag":652,"props":1871,"children":1872},{"style":665},[1873],{"type":48,"value":1874}," samples\u002Fqt_libs\u002FQt\u002Flib\u002F",{"type":42,"tag":652,"props":1876,"children":1877},{"style":723},[1878],{"type":48,"value":1879},"*",{"type":42,"tag":652,"props":1881,"children":1882},{"style":665},[1883],{"type":48,"value":1884}," lib\u002Fzoom_video_sdk\u002F\n",{"type":42,"tag":652,"props":1886,"children":1887},{"class":654,"line":729},[1888],{"type":42,"tag":652,"props":1889,"children":1890},{"emptyLinePlaceholder":823},[1891],{"type":48,"value":826},{"type":42,"tag":652,"props":1893,"children":1894},{"class":654,"line":762},[1895],{"type":42,"tag":652,"props":1896,"children":1897},{"style":833},[1898],{"type":48,"value":1899},"# Create symlinks\n",{"type":42,"tag":652,"props":1901,"children":1902},{"class":654,"line":805},[1903,1908],{"type":42,"tag":652,"props":1904,"children":1905},{"style":904},[1906],{"type":48,"value":1907},"cd",{"type":42,"tag":652,"props":1909,"children":1910},{"style":665},[1911],{"type":48,"value":1912}," lib\u002Fzoom_video_sdk\n",{"type":42,"tag":652,"props":1914,"children":1915},{"class":654,"line":819},[1916,1922,1927,1932,1937,1942,1947,1952,1957,1962,1967,1972,1977,1982,1987],{"type":42,"tag":652,"props":1917,"children":1919},{"style":1918},"--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic",[1920],{"type":48,"value":1921},"for",{"type":42,"tag":652,"props":1923,"children":1924},{"style":723},[1925],{"type":48,"value":1926}," lib ",{"type":42,"tag":652,"props":1928,"children":1929},{"style":1918},[1930],{"type":48,"value":1931},"in",{"type":42,"tag":652,"props":1933,"children":1934},{"style":665},[1935],{"type":48,"value":1936}," libQt5*.so.5",{"type":42,"tag":652,"props":1938,"children":1939},{"style":910},[1940],{"type":48,"value":1941},";",{"type":42,"tag":652,"props":1943,"children":1944},{"style":1918},[1945],{"type":48,"value":1946}," do",{"type":42,"tag":652,"props":1948,"children":1949},{"style":659},[1950],{"type":48,"value":1951}," ln",{"type":42,"tag":652,"props":1953,"children":1954},{"style":665},[1955],{"type":48,"value":1956}," -sf",{"type":42,"tag":652,"props":1958,"children":1959},{"style":723},[1960],{"type":48,"value":1961}," $lib ",{"type":42,"tag":652,"props":1963,"children":1964},{"style":910},[1965],{"type":48,"value":1966},"${",{"type":42,"tag":652,"props":1968,"children":1969},{"style":723},[1970],{"type":48,"value":1971},"lib",{"type":42,"tag":652,"props":1973,"children":1974},{"style":910},[1975],{"type":48,"value":1976},"%",{"type":42,"tag":652,"props":1978,"children":1979},{"style":723},[1980],{"type":48,"value":1981},".5",{"type":42,"tag":652,"props":1983,"children":1984},{"style":910},[1985],{"type":48,"value":1986},"};",{"type":42,"tag":652,"props":1988,"children":1989},{"style":1918},[1990],{"type":48,"value":1991}," done\n",{"type":42,"tag":51,"props":1993,"children":1994},{},[1995,1996],{"type":48,"value":1676},{"type":42,"tag":60,"props":1997,"children":1998},{},[1999],{"type":42,"tag":68,"props":2000,"children":2001},{"href":291},[2002],{"type":48,"value":294},{"type":42,"tag":574,"props":2004,"children":2006},{"id":2005},"️-critical-4-heap-memory-mode",[2007],{"type":48,"value":2008},"⚠️ CRITICAL #4: Heap Memory Mode",{"type":42,"tag":51,"props":2010,"children":2011},{},[2012],{"type":48,"value":2013},"Always use heap mode for raw data:",{"type":42,"tag":640,"props":2015,"children":2017},{"className":1006,"code":2016,"language":1008,"meta":645,"style":645},"init_params.videoRawDataMemoryMode = ZoomVideoSDKRawDataMemoryModeHeap;\ninit_params.shareRawDataMemoryMode = ZoomVideoSDKRawDataMemoryModeHeap;\ninit_params.audioRawDataMemoryMode = ZoomVideoSDKRawDataMemoryModeHeap;\n",[2018],{"type":42,"tag":648,"props":2019,"children":2020},{"__ignoreMap":645},[2021,2028,2035],{"type":42,"tag":652,"props":2022,"children":2023},{"class":654,"line":655},[2024],{"type":42,"tag":652,"props":2025,"children":2026},{},[2027],{"type":48,"value":1129},{"type":42,"tag":652,"props":2029,"children":2030},{"class":654,"line":676},[2031],{"type":42,"tag":652,"props":2032,"children":2033},{},[2034],{"type":48,"value":1137},{"type":42,"tag":652,"props":2036,"children":2037},{"class":654,"line":729},[2038],{"type":42,"tag":652,"props":2039,"children":2040},{},[2041],{"type":48,"value":1146},{"type":42,"tag":574,"props":2043,"children":2045},{"id":2044},"️-critical-5-virtual-audio-for-headless",[2046],{"type":48,"value":2047},"⚠️ CRITICAL #5: Virtual Audio for Headless",{"type":42,"tag":51,"props":2049,"children":2050},{},[2051,2055],{"type":42,"tag":60,"props":2052,"children":2053},{},[2054],{"type":48,"value":1659},{"type":48,"value":2056},": Docker\u002Fheadless environments have no audio devices.",{"type":42,"tag":51,"props":2058,"children":2059},{},[2060,2064],{"type":42,"tag":60,"props":2061,"children":2062},{},[2063],{"type":48,"value":1669},{"type":48,"value":2065},": Use virtual audio speaker and mic.",{"type":42,"tag":640,"props":2067,"children":2069},{"className":1006,"code":2068,"language":1008,"meta":645,"style":645},"session_context.virtualAudioSpeaker = new VirtualSpeaker();\nsession_context.virtualAudioMic = new VirtualMic();\n",[2070],{"type":42,"tag":648,"props":2071,"children":2072},{"__ignoreMap":645},[2073,2081],{"type":42,"tag":652,"props":2074,"children":2075},{"class":654,"line":655},[2076],{"type":42,"tag":652,"props":2077,"children":2078},{},[2079],{"type":48,"value":2080},"session_context.virtualAudioSpeaker = new VirtualSpeaker();\n",{"type":42,"tag":652,"props":2082,"children":2083},{"class":654,"line":676},[2084],{"type":42,"tag":652,"props":2085,"children":2086},{},[2087],{"type":48,"value":2088},"session_context.virtualAudioMic = new VirtualMic();\n",{"type":42,"tag":51,"props":2090,"children":2091},{},[2092,2093],{"type":48,"value":1676},{"type":42,"tag":60,"props":2094,"children":2095},{},[2096],{"type":42,"tag":68,"props":2097,"children":2098},{"href":1451},[2099],{"type":48,"value":2100},"Virtual Audio\u002FVideo",{"type":42,"tag":100,"props":2102,"children":2104},{"id":2103},"sample-repositories",[2105],{"type":48,"value":2106},"Sample Repositories",{"type":42,"tag":574,"props":2108,"children":2110},{"id":2109},"official-samples",[2111],{"type":48,"value":2112},"Official Samples",{"type":42,"tag":313,"props":2114,"children":2115},{},[2116,2132],{"type":42,"tag":317,"props":2117,"children":2118},{},[2119],{"type":42,"tag":321,"props":2120,"children":2121},{},[2122,2127],{"type":42,"tag":325,"props":2123,"children":2124},{},[2125],{"type":48,"value":2126},"Repository",{"type":42,"tag":325,"props":2128,"children":2129},{},[2130],{"type":48,"value":2131},"Description",{"type":42,"tag":340,"props":2133,"children":2134},{},[2135,2155,2176],{"type":42,"tag":321,"props":2136,"children":2137},{},[2138,2150],{"type":42,"tag":347,"props":2139,"children":2140},{},[2141],{"type":42,"tag":60,"props":2142,"children":2143},{},[2144],{"type":42,"tag":68,"props":2145,"children":2147},{"href":95,"rel":2146},[72],[2148],{"type":48,"value":2149},"raw-recording-sample",{"type":42,"tag":347,"props":2151,"children":2152},{},[2153],{"type":48,"value":2154},"Raw audio\u002Fvideo capture",{"type":42,"tag":321,"props":2156,"children":2157},{},[2158,2171],{"type":42,"tag":347,"props":2159,"children":2160},{},[2161],{"type":42,"tag":60,"props":2162,"children":2163},{},[2164],{"type":42,"tag":68,"props":2165,"children":2168},{"href":2166,"rel":2167},"https:\u002F\u002Fgithub.com\u002Ftanchunsiong\u002Fvideosdk-linux-qt-quickstart",[72],[2169],{"type":48,"value":2170},"qt-quickstart",{"type":42,"tag":347,"props":2172,"children":2173},{},[2174],{"type":48,"value":2175},"Qt6 UI integration",{"type":42,"tag":321,"props":2177,"children":2178},{},[2179,2192],{"type":42,"tag":347,"props":2180,"children":2181},{},[2182],{"type":42,"tag":60,"props":2183,"children":2184},{},[2185],{"type":42,"tag":68,"props":2186,"children":2189},{"href":2187,"rel":2188},"https:\u002F\u002Fgithub.com\u002Ftanchunsiong\u002Fvideosdk-linux-gtk-quickstart",[72],[2190],{"type":48,"value":2191},"gtk-quickstart",{"type":42,"tag":347,"props":2193,"children":2194},{},[2195],{"type":48,"value":2196},"GTK3 UI integration",{"type":42,"tag":574,"props":2198,"children":2200},{"id":2199},"sample-architecture",[2201],{"type":48,"value":2202},"Sample Architecture",{"type":42,"tag":640,"props":2204,"children":2208},{"className":2205,"code":2207,"language":48},[2206],"language-text","Headless Bot (Docker):\n┌──────────────────────────────────┐\n│  Virtual Audio Speaker\u002FMic       │\n├──────────────────────────────────┤\n│  Raw Data Processing             │\n│  - YUV420 → File\u002FStream\n\n\n## Merged from video-sdk\u002Flinux\u002FSKILL.md\n\n# Zoom Video SDK Linux - Complete Documentation Index\n\n## Quick Start Path\n\n**If you're new to the SDK, follow this order:**\n\n1. **Read the architecture pattern** → [concepts\u002Fsdk-architecture-pattern.md](concepts\u002Fsdk-architecture-pattern.md)\n   - Universal formula: Singleton → Delegate → Subscribe\n   - Once you understand this, you can implement any feature\n\n2. **Understand Linux specifics** → [concepts\u002Fraw-data-vs-canvas.md](concepts\u002Fraw-data-vs-canvas.md)\n   - **CRITICAL**: Linux has NO Canvas API - raw data ONLY\n\n3. **Implement session join** → [examples\u002Fsession-join-pattern.md](examples\u002Fsession-join-pattern.md)\n   - Complete working JWT + session join code\n\n4. **Setup environment** → [troubleshooting\u002Fpulseaudio-setup.md](troubleshooting\u002Fpulseaudio-setup.md)\n   - PulseAudio configuration (required for audio)\n   - [troubleshooting\u002Fqt-dependencies.md](troubleshooting\u002Fqt-dependencies.md)\n   - Qt5 library setup (bundled with SDK)\n\n5. **Implement features** → Choose from examples below\n\n---\n\n## Documentation Structure\n\n",[2209],{"type":42,"tag":648,"props":2210,"children":2211},{"__ignoreMap":645},[2212],{"type":48,"value":2207},{"type":42,"tag":51,"props":2214,"children":2215},{},[2216],{"type":48,"value":2217},"video-sdk\u002Flinux\u002F\n├── SKILL.md                          # Main skill overview\n├── SKILL.md                          # This file - navigation guide\n├── linux.md                          # Platform summary\n│\n├── concepts\u002F                         # Core architectural patterns\n│   ├── sdk-architecture-pattern.md  # Universal formula for ANY feature\n│   ├── singleton-hierarchy.md       # 5-level navigation guide\n│   └── raw-data-vs-canvas.md        # Linux-specific: raw data ONLY\n│\n├── examples\u002F                         # Complete working code\n│   ├── session-join-pattern.md      # JWT auth + session join\n│   └── command-channel.md           # Command channel with threading\n│\n├── troubleshooting\u002F                  # Problem solving guides\n│   ├── pulseaudio-setup.md          # Audio configuration\n│   ├── qt-dependencies.md           # Qt5 library setup\n│   ├── build-errors.md              # Common build issues\n│   └── common-issues.md             # Quick diagnostic workflow\n│\n└── references\u002F                       # Reference documentation\n└── linux-reference.md           # API hierarchy, methods, error codes",{"type":42,"tag":640,"props":2219,"children":2222},{"className":2220,"code":2221,"language":48},[2206],"\n---\n\n## By Use Case\n\n### I want to build a headless bot\n1. [SDK Architecture Pattern](concepts\u002Fsdk-architecture-pattern.md) - Understand the pattern\n2. [Session Join Pattern](examples\u002Fsession-join-pattern.md) - Join sessions\n3. [PulseAudio Setup](troubleshooting\u002Fpulseaudio-setup.md) - Configure audio\n4. [Raw Data vs Canvas](concepts\u002Fraw-data-vs-canvas.md) - Understand Linux differences\n\n### I'm getting build errors\n1. [Build Errors Guide](troubleshooting\u002Fbuild-errors.md) - SDK build issues\n2. [Qt Dependencies](troubleshooting\u002Fqt-dependencies.md) - Qt5 setup\n3. [Common Issues](troubleshooting\u002Fcommon-issues.md) - Quick diagnostics\n\n### I'm getting runtime errors\n1. [PulseAudio Setup](troubleshooting\u002Fpulseaudio-setup.md) - Audio not working\n2. [Qt Dependencies](troubleshooting\u002Fqt-dependencies.md) - Library not found\n3. [Common Issues](troubleshooting\u002Fcommon-issues.md) - Error code tables\n\n### I want to use command channel\n1. [Command Channel](examples\u002Fcommand-channel.md) - Send\u002Freceive commands\n2. [Common Issues](troubleshooting\u002Fcommon-issues.md) - Threading requirements\n\n### I want to implement a specific feature\n1. [SDK Architecture Pattern](concepts\u002Fsdk-architecture-pattern.md) - **START HERE!**\n2. [Singleton Hierarchy](concepts\u002Fsingleton-hierarchy.md) - Navigate to the feature\n3. [API Reference](references\u002Flinux-reference.md) - Method signatures\n\n---\n\n## Most Critical Documents\n\n### 1. SDK Architecture Pattern (MASTER DOCUMENT)\n**[concepts\u002Fsdk-architecture-pattern.md](concepts\u002Fsdk-architecture-pattern.md)**\n\nThe universal 3-step pattern:\n1. Get singleton (SDK, helpers, session, users)\n2. Implement delegate (event callbacks)\n3. Subscribe and use\n\n### 2. Raw Data vs Canvas (LINUX-SPECIFIC)\n**[concepts\u002Fraw-data-vs-canvas.md](concepts\u002Fraw-data-vs-canvas.md)**\n\n**CRITICAL**: Unlike Windows\u002FMac, Linux SDK has NO Canvas API. You MUST use raw data pipe.\n\n### 3. PulseAudio Setup (MOST COMMON ISSUE)\n**[troubleshooting\u002Fpulseaudio-setup.md](troubleshooting\u002Fpulseaudio-setup.md)**\n\nAudio requires PulseAudio configuration.\n\n### 4. Qt Dependencies\n**[troubleshooting\u002Fqt-dependencies.md](troubleshooting\u002Fqt-dependencies.md)**\n\nSDK requires bundled Qt5 libraries, NOT system Qt5.\n\n---\n\n## Key Learnings\n\n### Critical Discoveries:\n\n1. **Linux has NO Canvas API**\n   - Windows\u002FMac have Canvas API for SDK-rendered video\n   - Linux MUST use Raw Data Pipe\n   - See: [Raw Data vs Canvas](concepts\u002Fraw-data-vs-canvas.md)\n\n2. **PulseAudio is MANDATORY**\n   - SDK requires PulseAudio for raw audio\n   - Must configure ~\u002F.config\u002Fzoomus.conf\n   - See: [PulseAudio Setup](troubleshooting\u002Fpulseaudio-setup.md)\n\n3. **Use Bundled Qt5, NOT System Qt5**\n   - SDK includes specific Qt5 versions\n   - Copy from samples\u002Fqt_libs\u002F\n   - See: [Qt Dependencies](troubleshooting\u002Fqt-dependencies.md)\n\n4. **Helpers Control YOUR Streams Only**\n   - `videoHelper->startVideo()` starts YOUR camera\n   - To see others, subscribe to their VideoPipe\n   - See: [Singleton Hierarchy](concepts\u002Fsingleton-hierarchy.md)\n\n5. **Virtual Devices for Headless**\n   - Docker\u002Fheadless needs virtual audio speaker\u002Fmic\n   - Set before joining session\n   - See: [Session Join Pattern](examples\u002Fsession-join-pattern.md)\n\n6. **Always Use Heap Memory Mode**\n   ```cpp\n   init_params.videoRawDataMemoryMode = ZoomVideoSDKRawDataMemoryModeHeap;\n",[2223],{"type":42,"tag":648,"props":2224,"children":2225},{"__ignoreMap":645},[2226],{"type":48,"value":2221},{"type":42,"tag":115,"props":2228,"children":2229},{"start":829},[2230,2260,2289],{"type":42,"tag":119,"props":2231,"children":2232},{},[2233,2238],{"type":42,"tag":60,"props":2234,"children":2235},{},[2236],{"type":48,"value":2237},"GLib Main Loop Required",{"type":42,"tag":191,"props":2239,"children":2240},{},[2241,2246,2251],{"type":42,"tag":119,"props":2242,"children":2243},{},[2244],{"type":48,"value":2245},"while\u002Fsleep loops don't dispatch SDK events",{"type":42,"tag":119,"props":2247,"children":2248},{},[2249],{"type":48,"value":2250},"Must use g_main_loop_run()",{"type":42,"tag":119,"props":2252,"children":2253},{},[2254,2255],{"type":48,"value":1676},{"type":42,"tag":68,"props":2256,"children":2257},{"href":243},[2258],{"type":48,"value":2259},"Common Issues",{"type":42,"tag":119,"props":2261,"children":2262},{},[2263,2268],{"type":42,"tag":60,"props":2264,"children":2265},{},[2266],{"type":48,"value":2267},"All SDK Calls Must Be on Main Thread",{"type":42,"tag":191,"props":2269,"children":2270},{},[2271,2276,2281],{"type":42,"tag":119,"props":2272,"children":2273},{},[2274],{"type":48,"value":2275},"Background thread SDK calls return error 2 (Internal_Error)",{"type":42,"tag":119,"props":2277,"children":2278},{},[2279],{"type":48,"value":2280},"Use g_idle_add() to schedule on GLib main thread",{"type":42,"tag":119,"props":2282,"children":2283},{},[2284,2285],{"type":48,"value":1676},{"type":42,"tag":68,"props":2286,"children":2287},{"href":1543},[2288],{"type":48,"value":1533},{"type":42,"tag":119,"props":2290,"children":2291},{},[2292,2297],{"type":42,"tag":60,"props":2293,"children":2294},{},[2295],{"type":48,"value":2296},"Command Channel is Session-Scoped",{"type":42,"tag":191,"props":2298,"children":2299},{},[2300,2305,2310],{"type":42,"tag":119,"props":2301,"children":2302},{},[2303],{"type":48,"value":2304},"Does NOT span across different sessions",{"type":42,"tag":119,"props":2306,"children":2307},{},[2308],{"type":48,"value":2309},"Both sender and receiver must be in the same session",{"type":42,"tag":119,"props":2311,"children":2312},{},[2313,2314],{"type":48,"value":1676},{"type":42,"tag":68,"props":2315,"children":2316},{"href":1543},[2317],{"type":48,"value":1533},{"type":42,"tag":2319,"props":2320,"children":2321},"hr",{},[],{"type":42,"tag":100,"props":2323,"children":2325},{"id":2324},"sample-repositories-1",[2326],{"type":48,"value":2106},{"type":42,"tag":191,"props":2328,"children":2329},{},[2330,2343,2356],{"type":42,"tag":119,"props":2331,"children":2332},{},[2333,2341],{"type":42,"tag":60,"props":2334,"children":2335},{},[2336],{"type":42,"tag":68,"props":2337,"children":2339},{"href":95,"rel":2338},[72],[2340],{"type":48,"value":2149},{"type":48,"value":2342}," - Official raw data sample",{"type":42,"tag":119,"props":2344,"children":2345},{},[2346,2354],{"type":42,"tag":60,"props":2347,"children":2348},{},[2349],{"type":42,"tag":68,"props":2350,"children":2352},{"href":2166,"rel":2351},[72],[2353],{"type":48,"value":2170},{"type":48,"value":2355}," - Qt6 UI integration",{"type":42,"tag":119,"props":2357,"children":2358},{},[2359,2367],{"type":42,"tag":60,"props":2360,"children":2361},{},[2362],{"type":42,"tag":68,"props":2363,"children":2365},{"href":2187,"rel":2364},[72],[2366],{"type":48,"value":2191},{"type":48,"value":2368}," - GTK3 UI integration",{"type":42,"tag":2319,"props":2370,"children":2371},{},[],{"type":42,"tag":100,"props":2373,"children":2375},{"id":2374},"quick-reference",[2376],{"type":48,"value":2377},"Quick Reference",{"type":42,"tag":574,"props":2379,"children":2381},{"id":2380},"my-code-wont-compile",[2382],{"type":48,"value":2383},"\"My code won't compile\"",{"type":42,"tag":51,"props":2385,"children":2386},{},[2387,2389],{"type":48,"value":2388},"→ ",{"type":42,"tag":68,"props":2390,"children":2391},{"href":302},[2392],{"type":48,"value":305},{"type":42,"tag":574,"props":2394,"children":2396},{"id":2395},"audio-not-working",[2397],{"type":48,"value":2398},"\"Audio not working\"",{"type":42,"tag":51,"props":2400,"children":2401},{},[2402,2403],{"type":48,"value":2388},{"type":42,"tag":68,"props":2404,"children":2405},{"href":280},[2406],{"type":48,"value":1818},{"type":42,"tag":574,"props":2408,"children":2410},{"id":2409},"library-not-found",[2411],{"type":48,"value":2412},"\"Library not found\"",{"type":42,"tag":51,"props":2414,"children":2415},{},[2416,2417],{"type":48,"value":2388},{"type":42,"tag":68,"props":2418,"children":2419},{"href":291},[2420],{"type":48,"value":294},{"type":42,"tag":574,"props":2422,"children":2424},{"id":2423},"how-do-i-implement-feature",[2425,2427,2432],{"type":48,"value":2426},"\"How do I implement ",{"type":42,"tag":652,"props":2428,"children":2429},{},[2430],{"type":48,"value":2431},"feature",{"type":48,"value":2433},"?\"",{"type":42,"tag":51,"props":2435,"children":2436},{},[2437,2438],{"type":48,"value":2388},{"type":42,"tag":68,"props":2439,"children":2440},{"href":127},[2441],{"type":48,"value":130},{"type":42,"tag":574,"props":2443,"children":2445},{"id":2444},"what-error-code-means-what",[2446],{"type":48,"value":2447},"\"What error code means what?\"",{"type":42,"tag":51,"props":2449,"children":2450},{},[2451,2452],{"type":48,"value":2388},{"type":42,"tag":68,"props":2453,"children":2454},{"href":243},[2455],{"type":48,"value":2259},{"type":42,"tag":2319,"props":2457,"children":2458},{},[],{"type":42,"tag":100,"props":2460,"children":2462},{"id":2461},"document-version",[2463],{"type":48,"value":2464},"Document Version",{"type":42,"tag":51,"props":2466,"children":2467},{},[2468,2470],{"type":48,"value":2469},"Based on ",{"type":42,"tag":60,"props":2471,"children":2472},{},[2473],{"type":48,"value":2474},"Zoom Video SDK for Linux v2.x",{"type":42,"tag":2319,"props":2476,"children":2477},{},[],{"type":42,"tag":51,"props":2479,"children":2480},{},[2481],{"type":42,"tag":60,"props":2482,"children":2483},{},[2484],{"type":48,"value":2485},"Happy coding!",{"type":42,"tag":51,"props":2487,"children":2488},{},[2489,2491,2495],{"type":48,"value":2490},"Remember: The ",{"type":42,"tag":68,"props":2492,"children":2493},{"href":127},[2494],{"type":48,"value":130},{"type":48,"value":2496}," is your key to unlocking the entire SDK. Read it first!",{"type":42,"tag":100,"props":2498,"children":2500},{"id":2499},"operations",[2501],{"type":48,"value":2502},"Operations",{"type":42,"tag":191,"props":2504,"children":2505},{},[2506],{"type":42,"tag":119,"props":2507,"children":2508},{},[2509,2514],{"type":42,"tag":68,"props":2510,"children":2512},{"href":2511},"RUNBOOK.md",[2513],{"type":48,"value":2511},{"type":48,"value":2515}," - 5-minute preflight and debugging checklist.",{"type":42,"tag":2517,"props":2518,"children":2519},"style",{},[2520],{"type":48,"value":2521},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":2523,"total":2728},[2524,2545,2568,2585,2601,2620,2639,2655,2671,2685,2697,2712],{"slug":2525,"name":2525,"fn":2526,"description":2527,"org":2528,"tags":2529,"stars":2542,"repoUrl":2543,"updatedAt":2544},"prior-auth-packet-builder","build healthcare prior authorization packets","Build a concise prior authorization packet from local case files and payer policy docs.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2530,2533,2536,2539],{"name":2531,"slug":2532,"type":15},"Documents","documents",{"name":2534,"slug":2535,"type":15},"Healthcare","healthcare",{"name":2537,"slug":2538,"type":15},"Insurance","insurance",{"name":2540,"slug":2541,"type":15},"Regulatory Compliance","regulatory-compliance",28169,"https:\u002F\u002Fgithub.com\u002Fopenai\u002Fopenai-agents-python","2026-04-16T05:11:39.180399",{"slug":2546,"name":2546,"fn":2547,"description":2548,"org":2549,"tags":2550,"stars":2565,"repoUrl":2566,"updatedAt":2567},"aspnet-core","build ASP.NET Core web applications","Build, review, refactor, or architect ASP.NET Core web applications using current official guidance for .NET web development. Use when working on Blazor Web Apps, Razor Pages, MVC, Minimal APIs, controller-based Web APIs, SignalR, gRPC, middleware, dependency injection, configuration, authentication, authorization, testing, performance, deployment, or ASP.NET Core upgrades.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2551,2554,2556,2559,2562],{"name":2552,"slug":2553,"type":15},".NET","dotnet",{"name":2555,"slug":2546,"type":15},"ASP.NET Core",{"name":2557,"slug":2558,"type":15},"Blazor","blazor",{"name":2560,"slug":2561,"type":15},"C#","csharp",{"name":2563,"slug":2564,"type":15},"Web Development","web-development",23787,"https:\u002F\u002Fgithub.com\u002Fopenai\u002Fskills","2026-04-12T05:07:02.819491",{"slug":2569,"name":2569,"fn":2570,"description":2571,"org":2572,"tags":2573,"stars":2565,"repoUrl":2566,"updatedAt":2584},"chatgpt-apps","build ChatGPT Apps SDK applications","Build, scaffold, refactor, and troubleshoot ChatGPT Apps SDK applications that combine an MCP server and widget UI. Use when Codex needs to design tools, register UI resources, wire the MCP Apps bridge or ChatGPT compatibility APIs, apply Apps SDK metadata or CSP or domain settings, or produce a docs-aligned project scaffold. Prefer a docs-first workflow by invoking the openai-docs skill or OpenAI developer docs MCP tools before generating code.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2574,2577,2580,2583],{"name":2575,"slug":2576,"type":15},"Apps SDK","apps-sdk",{"name":2578,"slug":2579,"type":15},"ChatGPT","chatgpt",{"name":2581,"slug":2582,"type":15},"MCP","mcp",{"name":9,"slug":8,"type":15},"2026-04-12T05:07:05.468097",{"slug":2586,"name":2586,"fn":2587,"description":2588,"org":2589,"tags":2590,"stars":2565,"repoUrl":2566,"updatedAt":2600},"cli-creator","build CLIs from API docs","Build a composable CLI for Codex from API docs, an OpenAPI spec, existing curl examples, an SDK, a web app, an admin tool, or a local script. Use when the user wants Codex to create a command-line tool that can run from any repo, expose composable read\u002Fwrite commands, return stable JSON, manage auth, and pair with a companion skill.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2591,2594,2597],{"name":2592,"slug":2593,"type":15},"API Development","api-development",{"name":2595,"slug":2596,"type":15},"CLI","cli",{"name":2598,"slug":2599,"type":15},"Codex","codex","2026-04-12T05:07:04.132762",{"slug":2602,"name":2602,"fn":2603,"description":2604,"org":2605,"tags":2606,"stars":2565,"repoUrl":2566,"updatedAt":2619},"cloudflare-deploy","deploy projects to Cloudflare","Deploy applications and infrastructure to Cloudflare using Workers, Pages, and related platform services. Use when the user asks to deploy, host, publish, or set up a project on Cloudflare.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2607,2610,2613,2616],{"name":2608,"slug":2609,"type":15},"Cloudflare","cloudflare",{"name":2611,"slug":2612,"type":15},"Cloudflare Pages","cloudflare-pages",{"name":2614,"slug":2615,"type":15},"Cloudflare Workers","cloudflare-workers",{"name":2617,"slug":2618,"type":15},"Deployment","deployment","2026-04-12T05:07:14.275118",{"slug":2621,"name":2621,"fn":2622,"description":2623,"org":2624,"tags":2625,"stars":2565,"repoUrl":2566,"updatedAt":2638},"define-goal","define and set measurable project goals","Help the user define a concrete, measurable goal before starting work, especially when they ask to use the goal tool, create a goal, set an objective, clarify success criteria, or turn a fuzzy intention into a quantitative outcome. Use this skill for goal creation and goal refinement only; it does not manage durable snapshots, decision logs, or long-running execution artifacts.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2626,2629,2632,2635],{"name":2627,"slug":2628,"type":15},"Productivity","productivity",{"name":2630,"slug":2631,"type":15},"Project Management","project-management",{"name":2633,"slug":2634,"type":15},"Strategy","strategy",{"name":2636,"slug":2637,"type":15},"Task Management","task-management","2026-05-23T06:17:16.870838",{"slug":2640,"name":2640,"fn":2641,"description":2642,"org":2643,"tags":2644,"stars":2565,"repoUrl":2566,"updatedAt":2654},"figma","translate Figma designs into code","Use the Figma MCP server to fetch design context, screenshots, variables, and assets from Figma, and to translate Figma nodes into production code. Trigger when a task involves Figma URLs, node IDs, design-to-code implementation, or Figma MCP setup and troubleshooting.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2645,2648,2650,2653],{"name":2646,"slug":2647,"type":15},"Design","design",{"name":2649,"slug":2640,"type":15},"Figma",{"name":2651,"slug":2652,"type":15},"Frontend","frontend",{"name":2581,"slug":2582,"type":15},"2026-04-12T05:06:47.939943",{"slug":2656,"name":2656,"fn":2657,"description":2658,"org":2659,"tags":2660,"stars":2565,"repoUrl":2566,"updatedAt":2670},"figma-code-connect-components","connect Figma designs to code components","Connects Figma design components to code components using Code Connect mapping tools. Use when user says \"code connect\", \"connect this component to code\", \"map this component\", \"link component to code\", \"create code connect mapping\", or wants to establish mappings between Figma designs and code implementations. For canvas writes via `use_figma`, use `figma-use`.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2661,2662,2665,2666,2667],{"name":2646,"slug":2647,"type":15},{"name":2663,"slug":2664,"type":15},"Design System","design-system",{"name":2649,"slug":2640,"type":15},{"name":2651,"slug":2652,"type":15},{"name":2668,"slug":2669,"type":15},"UI Components","ui-components","2026-05-10T05:59:52.971881",{"slug":2672,"name":2672,"fn":2673,"description":2674,"org":2675,"tags":2676,"stars":2565,"repoUrl":2566,"updatedAt":2684},"figma-create-design-system-rules","generate design system rules from Figma","Generates custom design system rules for the user's codebase. Use when user says \"create design system rules\", \"generate rules for my project\", \"set up design rules\", \"customize design system guidelines\", or wants to establish project-specific conventions for Figma-to-code workflows. Requires Figma MCP server connection.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2677,2678,2679,2682,2683],{"name":2646,"slug":2647,"type":15},{"name":2663,"slug":2664,"type":15},{"name":2680,"slug":2681,"type":15},"Documentation","documentation",{"name":2649,"slug":2640,"type":15},{"name":2651,"slug":2652,"type":15},"2026-05-16T06:07:47.821474",{"slug":2686,"name":2686,"fn":2687,"description":2688,"org":2689,"tags":2690,"stars":2565,"repoUrl":2566,"updatedAt":2696},"figma-implement-design","translate Figma designs into application code","Translates Figma designs into production-ready application code with 1:1 visual fidelity. Use when implementing UI code from Figma files, when user mentions \"implement design\", \"generate code\", \"implement component\", provides Figma URLs, or asks to build components matching Figma specs. For Figma canvas writes via `use_figma`, use `figma-use`.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2691,2692,2693,2694,2695],{"name":2646,"slug":2647,"type":15},{"name":2649,"slug":2640,"type":15},{"name":2651,"slug":2652,"type":15},{"name":2668,"slug":2669,"type":15},{"name":2563,"slug":2564,"type":15},"2026-05-16T06:07:40.583615",{"slug":2698,"name":2698,"fn":2699,"description":2700,"org":2701,"tags":2702,"stars":2565,"repoUrl":2566,"updatedAt":2711},"hatch-pet","create animated pets for Codex","Create, repair, validate, visually QA, and package Codex-compatible animated pets and pet spritesheets from character art, generated images, company or prospect brand cues, or visual references. Use when a user wants a lightweight-worker Codex pet workflow, a non-pixel custom pet style, a prospect or company mascot pet, or a full 8x9 animated pet atlas with transparent unused cells, QA contact sheets, and pet.json packaging. This skill composes the installed $imagegen system skill for visual generation and uses bundled scripts for deterministic spritesheet assembly.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2703,2706,2707,2710],{"name":2704,"slug":2705,"type":15},"Animation","animation",{"name":2598,"slug":2599,"type":15},{"name":2708,"slug":2709,"type":15},"Creative","creative",{"name":2646,"slug":2647,"type":15},"2026-05-02T05:31:48.48485",{"slug":2713,"name":2713,"fn":2714,"description":2715,"org":2716,"tags":2717,"stars":2565,"repoUrl":2566,"updatedAt":2727},"imagegen","generate and edit raster images","Generate or edit raster images when the task benefits from AI-created bitmap visuals such as photos, illustrations, textures, sprites, mockups, or transparent-background cutouts. Use when Codex should create a brand-new image, transform an existing image, or derive visual variants from references, and the output should be a bitmap asset rather than repo-native code or vector. Do not use when the task is better handled by editing existing SVG\u002Fvector\u002Fcode-native assets, extending an established icon or logo system, or building the visual directly in HTML\u002FCSS\u002Fcanvas.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2718,2719,2720,2723,2726],{"name":2708,"slug":2709,"type":15},{"name":2646,"slug":2647,"type":15},{"name":2721,"slug":2722,"type":15},"Image Generation","image-generation",{"name":2724,"slug":2725,"type":15},"Images","images",{"name":9,"slug":8,"type":15},"2026-05-15T06:23:24.312127",675,{"items":2730,"total":2843},[2731,2747,2763,2775,2793,2811,2831],{"slug":2732,"name":2732,"fn":2733,"description":2734,"org":2735,"tags":2736,"stars":25,"repoUrl":26,"updatedAt":27},"accessibility-and-inclusive-visualization","make data visualizations accessible","Make data visualizations accessible and inclusive. Use when the user needs chart or diagram accessibility guidance, text alternatives for complex visuals, color and contrast review, keyboard support, reduced-motion behavior for animation or parallax, or an accessibility QA workflow for exported figures, UML-like diagrams, and dashboards.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2737,2740,2743,2746],{"name":2738,"slug":2739,"type":15},"Accessibility","accessibility",{"name":2741,"slug":2742,"type":15},"Charts","charts",{"name":2744,"slug":2745,"type":15},"Data Visualization","data-visualization",{"name":2646,"slug":2647,"type":15},{"slug":2748,"name":2748,"fn":2749,"description":2750,"org":2751,"tags":2752,"stars":25,"repoUrl":26,"updatedAt":2762},"agent-browser","automate browser interactions for agents","Browser automation CLI for AI agents. Use when the user needs to interact with websites, verify dev server output, test web apps, navigate pages, fill forms, click buttons, take screenshots, extract data, or automate any browser task. Also triggers when a dev server starts so you can verify it visually.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2753,2756,2759],{"name":2754,"slug":2755,"type":15},"Agents","agents",{"name":2757,"slug":2758,"type":15},"Browser Automation","browser-automation",{"name":2760,"slug":2761,"type":15},"Testing","testing","2026-04-06T18:41:03.44016",{"slug":2764,"name":2764,"fn":2765,"description":2766,"org":2767,"tags":2768,"stars":25,"repoUrl":26,"updatedAt":2774},"agent-browser-verify","verify dev server output with automated browser","Automated browser verification for dev servers. Triggers when a dev server starts to run a visual gut-check with agent-browser — verifies the page loads, checks for console errors, validates key UI elements, and reports pass\u002Ffail before continuing.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2769,2770,2773],{"name":2757,"slug":2758,"type":15},{"name":2771,"slug":2772,"type":15},"Local Development","local-development",{"name":2760,"slug":2761,"type":15},"2026-04-06T18:41:17.526867",{"slug":2776,"name":2776,"fn":2777,"description":2778,"org":2779,"tags":2780,"stars":25,"repoUrl":26,"updatedAt":2792},"agents-sdk","build AI agents on Cloudflare Workers","Build AI agents on Cloudflare Workers using the Agents SDK. Load when creating stateful agents, durable workflows, real-time WebSocket apps, scheduled tasks, MCP servers, or chat applications. Covers Agent class, state management, callable RPC, Workflows integration, and React hooks. Biases towards retrieval from Cloudflare docs over pre-trained knowledge.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2781,2782,2783,2786,2789],{"name":2754,"slug":2755,"type":15},{"name":2614,"slug":2615,"type":15},{"name":2784,"slug":2785,"type":15},"SDK","sdk",{"name":2787,"slug":2788,"type":15},"Serverless","serverless",{"name":2790,"slug":2791,"type":15},"WebSockets","websockets","2026-04-06T18:39:51.717063",{"slug":2794,"name":2794,"fn":2795,"description":2796,"org":2797,"tags":2798,"stars":25,"repoUrl":26,"updatedAt":2810},"ai-elements","build chat UIs with AI Elements","AI Elements component library guidance — pre-built React components for AI interfaces built on shadcn\u002Fui. Use when building chat UIs, message displays, tool call rendering, streaming responses, reasoning panels, or any AI-native interface with the AI SDK.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2799,2800,2803,2806,2807],{"name":2651,"slug":2652,"type":15},{"name":2801,"slug":2802,"type":15},"React","react",{"name":2804,"slug":2805,"type":15},"shadcn\u002Fui","shadcn-ui",{"name":2668,"slug":2669,"type":15},{"name":2808,"slug":2809,"type":15},"Vercel","vercel","2026-04-06T18:40:59.619419",{"slug":2812,"name":2812,"fn":2813,"description":2814,"org":2815,"tags":2816,"stars":25,"repoUrl":26,"updatedAt":2830},"ai-gateway","configure Vercel AI Gateway","Vercel AI Gateway expert guidance. Use when configuring model routing, provider failover, cost tracking, or managing multiple AI providers through a unified API.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2817,2820,2823,2826,2829],{"name":2818,"slug":2819,"type":15},"AI Infrastructure","ai-infrastructure",{"name":2821,"slug":2822,"type":15},"Cost Optimization","cost-optimization",{"name":2824,"slug":2825,"type":15},"LLM","llm",{"name":2827,"slug":2828,"type":15},"Performance","performance",{"name":2808,"slug":2809,"type":15},"2026-04-06T18:40:44.377464",{"slug":2832,"name":2832,"fn":2833,"description":2834,"org":2835,"tags":2836,"stars":25,"repoUrl":26,"updatedAt":2842},"ai-generation-persistence","implement persistence patterns for AI generations","AI generation persistence patterns — unique IDs, addressable URLs, database storage, and cost tracking for every LLM generation",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2837,2838,2841],{"name":2821,"slug":2822,"type":15},{"name":2839,"slug":2840,"type":15},"Database","database",{"name":2824,"slug":2825,"type":15},"2026-04-06T18:41:08.513425",600]