[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-anthropic-video-sdklinux":3,"mdc--fqv8bm-key":38,"related-repo-anthropic-video-sdklinux":2532,"related-org-anthropic-video-sdklinux":2650},{"slug":4,"name":5,"fn":6,"description":7,"org":8,"tags":13,"stars":27,"repoUrl":28,"updatedAt":29,"license":30,"forks":31,"topics":32,"repo":33,"sourceUrl":36,"mdContent":37},"video-sdklinux","video-sdk\u002Flinux","build Zoom Video SDK bots for Linux","Zoom Video SDK for Linux - C++ headless bots, raw audio\u002Fvideo capture\u002Finjection, Qt\u002FGTK integration, Docker support",{"slug":9,"name":10,"logoUrl":11,"githubOrg":12},"anthropic","Anthropic","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fanthropic.png","anthropics",[14,18,21,24],{"name":15,"slug":16,"type":17},"Linux","linux","tag",{"name":19,"slug":20,"type":17},"C#","c",{"name":22,"slug":23,"type":17},"SDK","sdk",{"name":25,"slug":26,"type":17},"Zoom","zoom",22885,"https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fknowledge-work-plugins","2026-04-10T04:57:09.409501",null,2736,[],{"repoUrl":28,"stars":27,"forks":31,"topics":34,"description":35},[],"Open source repository of plugins primarily intended for knowledge workers to use in Claude Cowork","https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fknowledge-work-plugins\u002Ftree\u002FHEAD\u002Fpartner-built\u002Fzoom-plugin\u002Fskills\u002Fvideo-sdk\u002Flinux","---\nname: video-sdk\u002Flinux\ndescription: \"Zoom Video SDK for Linux - C++ headless bots, raw audio\u002Fvideo capture\u002Finjection, Qt\u002FGTK integration, Docker support\"\nuser-invocable: false\ntriggers:\n- linux video sdk\n- zoom linux\n- raw data linux\n- qt zoom\n- gtk zoom\n- virtual audio linux\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":39,"body":48},{"name":5,"description":7,"user-invocable":40,"triggers":41},false,[42,43,44,45,46,47],"linux video sdk","zoom linux","raw data linux","qt zoom","gtk zoom","virtual audio linux",{"type":49,"children":50},"root",[51,60,66,109,116,124,192,200,272,280,316,322,484,490,495,577,583,590,643,649,1008,1014,1323,1337,1343,1650,1656,1662,1672,1682,1694,1700,1709,1718,1817,1829,1835,1844,1852,2002,2013,2019,2024,2052,2058,2067,2076,2099,2111,2117,2123,2207,2213,2223,2228,2237,2328,2332,2337,2379,2382,2388,2394,2403,2409,2417,2423,2431,2444,2452,2458,2466,2469,2475,2485,2488,2496,2507,2513,2526],{"type":52,"tag":53,"props":54,"children":56},"element","h1",{"id":55},"zoom-video-sdk-linux-development",[57],{"type":58,"value":59},"text","Zoom Video SDK - Linux Development",{"type":52,"tag":61,"props":62,"children":63},"p",{},[64],{"type":58,"value":65},"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":52,"tag":61,"props":67,"children":68},{},[69,75,77,85,90,91,97,102,103],{"type":52,"tag":70,"props":71,"children":72},"strong",{},[73],{"type":58,"value":74},"Official Documentation",{"type":58,"value":76},": ",{"type":52,"tag":78,"props":79,"children":83},"a",{"href":80,"rel":81},"https:\u002F\u002Fdevelopers.zoom.us\u002Fdocs\u002Fvideo-sdk\u002Flinux\u002F",[82],"nofollow",[84],{"type":58,"value":80},{"type":52,"tag":70,"props":86,"children":87},{},[88],{"type":58,"value":89},"API Reference",{"type":58,"value":76},{"type":52,"tag":78,"props":92,"children":95},{"href":93,"rel":94},"https:\u002F\u002Fmarketplacefront.zoom.us\u002Fsdk\u002Fcustom\u002Flinux\u002F",[82],[96],{"type":58,"value":93},{"type":52,"tag":70,"props":98,"children":99},{},[100],{"type":58,"value":101},"Sample Repository",{"type":58,"value":76},{"type":52,"tag":78,"props":104,"children":107},{"href":105,"rel":106},"https:\u002F\u002Fgithub.com\u002Fzoom\u002Fvideosdk-linux-raw-recording-sample",[82],[108],{"type":58,"value":105},{"type":52,"tag":110,"props":111,"children":113},"h2",{"id":112},"quick-links",[114],{"type":58,"value":115},"Quick Links",{"type":52,"tag":61,"props":117,"children":118},{},[119],{"type":52,"tag":70,"props":120,"children":121},{},[122],{"type":58,"value":123},"New to Video SDK? Follow this path:",{"type":52,"tag":125,"props":126,"children":127},"ol",{},[128,143,157,178],{"type":52,"tag":129,"props":130,"children":131},"li",{},[132,141],{"type":52,"tag":70,"props":133,"children":134},{},[135],{"type":52,"tag":78,"props":136,"children":138},{"href":137},"concepts\u002Fsdk-architecture-pattern.md",[139],{"type":58,"value":140},"SDK Architecture Pattern",{"type":58,"value":142}," - Universal 3-step pattern for ANY feature",{"type":52,"tag":129,"props":144,"children":145},{},[146,155],{"type":52,"tag":70,"props":147,"children":148},{},[149],{"type":52,"tag":78,"props":150,"children":152},{"href":151},"examples\u002Fsession-join-pattern.md",[153],{"type":58,"value":154},"Session Join Pattern",{"type":58,"value":156}," - Complete working code to join a session",{"type":52,"tag":129,"props":158,"children":159},{},[160,169,171,176],{"type":52,"tag":70,"props":161,"children":162},{},[163],{"type":52,"tag":78,"props":164,"children":166},{"href":165},"concepts\u002Fraw-data-vs-canvas.md",[167],{"type":58,"value":168},"Raw Data vs Canvas",{"type":58,"value":170}," - ",{"type":52,"tag":70,"props":172,"children":173},{},[174],{"type":58,"value":175},"CRITICAL",{"type":58,"value":177},": Linux has NO Canvas API - raw data ONLY",{"type":52,"tag":129,"props":179,"children":180},{},[181,190],{"type":52,"tag":70,"props":182,"children":183},{},[184],{"type":52,"tag":78,"props":185,"children":187},{"href":186},"examples\u002Fraw-video-capture.md",[188],{"type":58,"value":189},"Raw Video Capture",{"type":58,"value":191}," - Capture and process YUV420 frames",{"type":52,"tag":61,"props":193,"children":194},{},[195],{"type":52,"tag":70,"props":196,"children":197},{},[198],{"type":58,"value":199},"Reference:",{"type":52,"tag":201,"props":202,"children":203},"ul",{},[204,218,231,245,259],{"type":52,"tag":129,"props":205,"children":206},{},[207,216],{"type":52,"tag":70,"props":208,"children":209},{},[210],{"type":52,"tag":78,"props":211,"children":213},{"href":212},"concepts\u002Fsingleton-hierarchy.md",[214],{"type":58,"value":215},"Singleton Hierarchy",{"type":58,"value":217}," - 5-level SDK navigation map",{"type":52,"tag":129,"props":219,"children":220},{},[221,229],{"type":52,"tag":70,"props":222,"children":223},{},[224],{"type":52,"tag":78,"props":225,"children":227},{"href":226},"references\u002Flinux-reference.md",[228],{"type":58,"value":89},{"type":58,"value":230}," - Complete API documentation",{"type":52,"tag":129,"props":232,"children":233},{},[234,243],{"type":52,"tag":70,"props":235,"children":236},{},[237],{"type":52,"tag":78,"props":238,"children":240},{"href":239},"examples\u002Fqt-gtk-integration.md",[241],{"type":58,"value":242},"Qt\u002FGTK Integration",{"type":58,"value":244}," - UI framework patterns",{"type":52,"tag":129,"props":246,"children":247},{},[248,257],{"type":52,"tag":70,"props":249,"children":250},{},[251],{"type":52,"tag":78,"props":252,"children":254},{"href":253},"troubleshooting\u002Fcommon-issues.md",[255],{"type":58,"value":256},"Troubleshooting",{"type":58,"value":258}," - Quick diagnostics",{"type":52,"tag":129,"props":260,"children":261},{},[262,270],{"type":52,"tag":70,"props":263,"children":264},{},[265],{"type":52,"tag":78,"props":266,"children":268},{"href":267},"SKILL.md",[269],{"type":58,"value":267},{"type":58,"value":271}," - Complete documentation navigation",{"type":52,"tag":61,"props":273,"children":274},{},[275],{"type":52,"tag":70,"props":276,"children":277},{},[278],{"type":58,"value":279},"Having issues?",{"type":52,"tag":201,"props":281,"children":282},{},[283,294,305],{"type":52,"tag":129,"props":284,"children":285},{},[286,288],{"type":58,"value":287},"PulseAudio setup → ",{"type":52,"tag":78,"props":289,"children":291},{"href":290},"troubleshooting\u002Fpulseaudio-setup.md",[292],{"type":58,"value":293},"PulseAudio Guide",{"type":52,"tag":129,"props":295,"children":296},{},[297,299],{"type":58,"value":298},"Qt dependencies → ",{"type":52,"tag":78,"props":300,"children":302},{"href":301},"troubleshooting\u002Fqt-dependencies.md",[303],{"type":58,"value":304},"Qt Dependencies",{"type":52,"tag":129,"props":306,"children":307},{},[308,310],{"type":58,"value":309},"Build errors → ",{"type":52,"tag":78,"props":311,"children":313},{"href":312},"troubleshooting\u002Fbuild-errors.md",[314],{"type":58,"value":315},"Build Errors Guide",{"type":52,"tag":110,"props":317,"children":319},{"id":318},"key-differences-from-windowsmacos",[320],{"type":58,"value":321},"Key Differences from Windows\u002FmacOS",{"type":52,"tag":323,"props":324,"children":325},"table",{},[326,349],{"type":52,"tag":327,"props":328,"children":329},"thead",{},[330],{"type":52,"tag":331,"props":332,"children":333},"tr",{},[334,340,344],{"type":52,"tag":335,"props":336,"children":337},"th",{},[338],{"type":58,"value":339},"Feature",{"type":52,"tag":335,"props":341,"children":342},{},[343],{"type":58,"value":15},{"type":52,"tag":335,"props":345,"children":346},{},[347],{"type":58,"value":348},"Windows\u002FMac",{"type":52,"tag":350,"props":351,"children":352},"tbody",{},[353,375,400,421,442,463],{"type":52,"tag":331,"props":354,"children":355},{},[356,365,370],{"type":52,"tag":357,"props":358,"children":359},"td",{},[360],{"type":52,"tag":70,"props":361,"children":362},{},[363],{"type":58,"value":364},"Canvas API",{"type":52,"tag":357,"props":366,"children":367},{},[368],{"type":58,"value":369},"❌ Not available",{"type":52,"tag":357,"props":371,"children":372},{},[373],{"type":58,"value":374},"✅ Available",{"type":52,"tag":331,"props":376,"children":377},{},[378,386,396],{"type":52,"tag":357,"props":379,"children":380},{},[381],{"type":52,"tag":70,"props":382,"children":383},{},[384],{"type":58,"value":385},"Raw Data Pipe",{"type":52,"tag":357,"props":387,"children":388},{},[389,391],{"type":58,"value":390},"✅ ",{"type":52,"tag":70,"props":392,"children":393},{},[394],{"type":58,"value":395},"ONLY option",{"type":52,"tag":357,"props":397,"children":398},{},[399],{"type":58,"value":374},{"type":52,"tag":331,"props":401,"children":402},{},[403,411,416],{"type":52,"tag":357,"props":404,"children":405},{},[406],{"type":52,"tag":70,"props":407,"children":408},{},[409],{"type":58,"value":410},"UI Integration",{"type":52,"tag":357,"props":412,"children":413},{},[414],{"type":58,"value":415},"Qt, GTK, SDL2, OpenGL",{"type":52,"tag":357,"props":417,"children":418},{},[419],{"type":58,"value":420},"Win32\u002FWinForms\u002FWPF, Cocoa",{"type":52,"tag":331,"props":422,"children":423},{},[424,432,437],{"type":52,"tag":357,"props":425,"children":426},{},[427],{"type":52,"tag":70,"props":428,"children":429},{},[430],{"type":58,"value":431},"Headless Support",{"type":52,"tag":357,"props":433,"children":434},{},[435],{"type":58,"value":436},"✅ Excellent (Docker)",{"type":52,"tag":357,"props":438,"children":439},{},[440],{"type":58,"value":441},"Limited",{"type":52,"tag":331,"props":443,"children":444},{},[445,453,458],{"type":52,"tag":357,"props":446,"children":447},{},[448],{"type":52,"tag":70,"props":449,"children":450},{},[451],{"type":58,"value":452},"Audio",{"type":52,"tag":357,"props":454,"children":455},{},[456],{"type":58,"value":457},"PulseAudio required",{"type":52,"tag":357,"props":459,"children":460},{},[461],{"type":58,"value":462},"Native",{"type":52,"tag":331,"props":464,"children":465},{},[466,474,479],{"type":52,"tag":357,"props":467,"children":468},{},[469],{"type":52,"tag":70,"props":470,"children":471},{},[472],{"type":58,"value":473},"Virtual Devices",{"type":52,"tag":357,"props":475,"children":476},{},[477],{"type":58,"value":478},"✅ Required for headless",{"type":52,"tag":357,"props":480,"children":481},{},[482],{"type":58,"value":483},"Optional",{"type":52,"tag":110,"props":485,"children":487},{"id":486},"sdk-overview",[488],{"type":58,"value":489},"SDK Overview",{"type":52,"tag":61,"props":491,"children":492},{},[493],{"type":58,"value":494},"The Zoom Video SDK for Linux is a C++ library optimized for:",{"type":52,"tag":201,"props":496,"children":497},{},[498,508,518,528,538,548,558,568],{"type":52,"tag":129,"props":499,"children":500},{},[501,506],{"type":52,"tag":70,"props":502,"children":503},{},[504],{"type":58,"value":505},"Headless Bots",{"type":58,"value":507},": Docker\u002FWSL support, no display required",{"type":52,"tag":129,"props":509,"children":510},{},[511,516],{"type":52,"tag":70,"props":512,"children":513},{},[514],{"type":58,"value":515},"Raw Data Access",{"type":58,"value":517},": Capture YUV420 video, PCM audio",{"type":52,"tag":129,"props":519,"children":520},{},[521,526],{"type":52,"tag":70,"props":522,"children":523},{},[524],{"type":58,"value":525},"Raw Data Injection",{"type":58,"value":527},": Virtual camera\u002Fmic for custom media",{"type":52,"tag":129,"props":529,"children":530},{},[531,536],{"type":52,"tag":70,"props":532,"children":533},{},[534],{"type":58,"value":535},"Screen Sharing",{"type":58,"value":537},": Capture or inject share data",{"type":52,"tag":129,"props":539,"children":540},{},[541,546],{"type":52,"tag":70,"props":542,"children":543},{},[544],{"type":58,"value":545},"Cloud Recording",{"type":58,"value":547},": Record sessions to Zoom cloud",{"type":52,"tag":129,"props":549,"children":550},{},[551,556],{"type":52,"tag":70,"props":552,"children":553},{},[554],{"type":58,"value":555},"Live Streaming",{"type":58,"value":557},": Stream to RTMP endpoints",{"type":52,"tag":129,"props":559,"children":560},{},[561,566],{"type":52,"tag":70,"props":562,"children":563},{},[564],{"type":58,"value":565},"Live Transcription",{"type":58,"value":567},": Real-time speech-to-text",{"type":52,"tag":129,"props":569,"children":570},{},[571,575],{"type":52,"tag":70,"props":572,"children":573},{},[574],{"type":58,"value":242},{"type":58,"value":576},": Full UI framework support",{"type":52,"tag":110,"props":578,"children":580},{"id":579},"prerequisites",[581],{"type":58,"value":582},"Prerequisites",{"type":52,"tag":584,"props":585,"children":587},"h3",{"id":586},"system-requirements",[588],{"type":58,"value":589},"System Requirements",{"type":52,"tag":201,"props":591,"children":592},{},[593,603,613,623,633],{"type":52,"tag":129,"props":594,"children":595},{},[596,601],{"type":52,"tag":70,"props":597,"children":598},{},[599],{"type":58,"value":600},"OS",{"type":58,"value":602},": Ubuntu 20.04+, Debian 11+, or compatible",{"type":52,"tag":129,"props":604,"children":605},{},[606,611],{"type":52,"tag":70,"props":607,"children":608},{},[609],{"type":58,"value":610},"Architecture",{"type":58,"value":612},": x64 (recommended), ARM64",{"type":52,"tag":129,"props":614,"children":615},{},[616,621],{"type":52,"tag":70,"props":617,"children":618},{},[619],{"type":58,"value":620},"Compiler",{"type":58,"value":622},": GCC 9+, Clang 10+",{"type":52,"tag":129,"props":624,"children":625},{},[626,631],{"type":52,"tag":70,"props":627,"children":628},{},[629],{"type":58,"value":630},"CMake",{"type":58,"value":632},": 3.14 or later",{"type":52,"tag":129,"props":634,"children":635},{},[636,641],{"type":52,"tag":70,"props":637,"children":638},{},[639],{"type":58,"value":640},"Qt5",{"type":58,"value":642},": Bundled with SDK (do NOT install system Qt5)",{"type":52,"tag":584,"props":644,"children":646},{"id":645},"dependencies",[647],{"type":58,"value":648},"Dependencies",{"type":52,"tag":650,"props":651,"children":656},"pre",{"className":652,"code":653,"language":654,"meta":655,"style":655},"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","",[657],{"type":52,"tag":658,"props":659,"children":660},"code",{"__ignoreMap":655},[661,684,737,770,813,827,837,847,872,880,889,908,944,974,982,991],{"type":52,"tag":662,"props":663,"children":666},"span",{"class":664,"line":665},"line",1,[667,673,679],{"type":52,"tag":662,"props":668,"children":670},{"style":669},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[671],{"type":58,"value":672},"sudo",{"type":52,"tag":662,"props":674,"children":676},{"style":675},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[677],{"type":58,"value":678}," apt",{"type":52,"tag":662,"props":680,"children":681},{"style":675},[682],{"type":58,"value":683}," update\n",{"type":52,"tag":662,"props":685,"children":687},{"class":664,"line":686},2,[688,692,696,701,706,711,716,721,726,731],{"type":52,"tag":662,"props":689,"children":690},{"style":669},[691],{"type":58,"value":672},{"type":52,"tag":662,"props":693,"children":694},{"style":675},[695],{"type":58,"value":678},{"type":52,"tag":662,"props":697,"children":698},{"style":675},[699],{"type":58,"value":700}," install",{"type":52,"tag":662,"props":702,"children":703},{"style":675},[704],{"type":58,"value":705}," -y",{"type":52,"tag":662,"props":707,"children":708},{"style":675},[709],{"type":58,"value":710}," build-essential",{"type":52,"tag":662,"props":712,"children":713},{"style":675},[714],{"type":58,"value":715}," gcc",{"type":52,"tag":662,"props":717,"children":718},{"style":675},[719],{"type":58,"value":720}," cmake",{"type":52,"tag":662,"props":722,"children":723},{"style":675},[724],{"type":58,"value":725}," libglib2.0-dev",{"type":52,"tag":662,"props":727,"children":728},{"style":675},[729],{"type":58,"value":730}," liblzma-dev",{"type":52,"tag":662,"props":732,"children":734},{"style":733},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[735],{"type":58,"value":736}," \\\n",{"type":52,"tag":662,"props":738,"children":740},{"class":664,"line":739},3,[741,746,751,756,761,766],{"type":52,"tag":662,"props":742,"children":743},{"style":675},[744],{"type":58,"value":745},"    libxcb-image0",{"type":52,"tag":662,"props":747,"children":748},{"style":675},[749],{"type":58,"value":750}," libxcb-keysyms1",{"type":52,"tag":662,"props":752,"children":753},{"style":675},[754],{"type":58,"value":755}," libxcb-xfixes0",{"type":52,"tag":662,"props":757,"children":758},{"style":675},[759],{"type":58,"value":760}," libxcb-xkb1",{"type":52,"tag":662,"props":762,"children":763},{"style":675},[764],{"type":58,"value":765}," libxcb-shape0",{"type":52,"tag":662,"props":767,"children":768},{"style":733},[769],{"type":58,"value":736},{"type":52,"tag":662,"props":771,"children":773},{"class":664,"line":772},4,[774,779,784,789,794,799,804,809],{"type":52,"tag":662,"props":775,"children":776},{"style":675},[777],{"type":58,"value":778},"    libxcb-shm0",{"type":52,"tag":662,"props":780,"children":781},{"style":675},[782],{"type":58,"value":783}," libxcb-randr0",{"type":52,"tag":662,"props":785,"children":786},{"style":675},[787],{"type":58,"value":788}," libxcb-xtest0",{"type":52,"tag":662,"props":790,"children":791},{"style":675},[792],{"type":58,"value":793}," libgbm1",{"type":52,"tag":662,"props":795,"children":796},{"style":675},[797],{"type":58,"value":798}," libxtst6",{"type":52,"tag":662,"props":800,"children":801},{"style":675},[802],{"type":58,"value":803}," libgl1",{"type":52,"tag":662,"props":805,"children":806},{"style":675},[807],{"type":58,"value":808}," libnss3",{"type":52,"tag":662,"props":810,"children":811},{"style":733},[812],{"type":58,"value":736},{"type":52,"tag":662,"props":814,"children":816},{"class":664,"line":815},5,[817,822],{"type":52,"tag":662,"props":818,"children":819},{"style":675},[820],{"type":58,"value":821},"    libasound2",{"type":52,"tag":662,"props":823,"children":824},{"style":675},[825],{"type":58,"value":826}," libpulse0\n",{"type":52,"tag":662,"props":828,"children":830},{"class":664,"line":829},6,[831],{"type":52,"tag":662,"props":832,"children":834},{"emptyLinePlaceholder":833},true,[835],{"type":58,"value":836},"\n",{"type":52,"tag":662,"props":838,"children":840},{"class":664,"line":839},7,[841],{"type":52,"tag":662,"props":842,"children":844},{"style":843},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic",[845],{"type":58,"value":846},"# For headless Linux\n",{"type":52,"tag":662,"props":848,"children":850},{"class":664,"line":849},8,[851,855,859,863,867],{"type":52,"tag":662,"props":852,"children":853},{"style":669},[854],{"type":58,"value":672},{"type":52,"tag":662,"props":856,"children":857},{"style":675},[858],{"type":58,"value":678},{"type":52,"tag":662,"props":860,"children":861},{"style":675},[862],{"type":58,"value":700},{"type":52,"tag":662,"props":864,"children":865},{"style":675},[866],{"type":58,"value":705},{"type":52,"tag":662,"props":868,"children":869},{"style":675},[870],{"type":58,"value":871}," pulseaudio\n",{"type":52,"tag":662,"props":873,"children":875},{"class":664,"line":874},9,[876],{"type":52,"tag":662,"props":877,"children":878},{"emptyLinePlaceholder":833},[879],{"type":58,"value":836},{"type":52,"tag":662,"props":881,"children":883},{"class":664,"line":882},10,[884],{"type":52,"tag":662,"props":885,"children":886},{"style":843},[887],{"type":58,"value":888},"# PulseAudio configuration (CRITICAL for audio)\n",{"type":52,"tag":662,"props":890,"children":892},{"class":664,"line":891},11,[893,898,903],{"type":52,"tag":662,"props":894,"children":895},{"style":669},[896],{"type":58,"value":897},"mkdir",{"type":52,"tag":662,"props":899,"children":900},{"style":675},[901],{"type":58,"value":902}," -p",{"type":52,"tag":662,"props":904,"children":905},{"style":675},[906],{"type":58,"value":907}," ~\u002F.config\n",{"type":52,"tag":662,"props":909,"children":911},{"class":664,"line":910},12,[912,918,924,929,934,939],{"type":52,"tag":662,"props":913,"children":915},{"style":914},"--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF",[916],{"type":58,"value":917},"echo",{"type":52,"tag":662,"props":919,"children":921},{"style":920},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[922],{"type":58,"value":923}," \"",{"type":52,"tag":662,"props":925,"children":926},{"style":675},[927],{"type":58,"value":928},"[General]",{"type":52,"tag":662,"props":930,"children":931},{"style":920},[932],{"type":58,"value":933},"\"",{"type":52,"tag":662,"props":935,"children":936},{"style":920},[937],{"type":58,"value":938}," >",{"type":52,"tag":662,"props":940,"children":941},{"style":675},[942],{"type":58,"value":943}," ~\u002F.config\u002Fzoomus.conf\n",{"type":52,"tag":662,"props":945,"children":947},{"class":664,"line":946},13,[948,952,956,961,965,970],{"type":52,"tag":662,"props":949,"children":950},{"style":914},[951],{"type":58,"value":917},{"type":52,"tag":662,"props":953,"children":954},{"style":920},[955],{"type":58,"value":923},{"type":52,"tag":662,"props":957,"children":958},{"style":675},[959],{"type":58,"value":960},"system.audio.type=default",{"type":52,"tag":662,"props":962,"children":963},{"style":920},[964],{"type":58,"value":933},{"type":52,"tag":662,"props":966,"children":967},{"style":920},[968],{"type":58,"value":969}," >>",{"type":52,"tag":662,"props":971,"children":972},{"style":675},[973],{"type":58,"value":943},{"type":52,"tag":662,"props":975,"children":977},{"class":664,"line":976},14,[978],{"type":52,"tag":662,"props":979,"children":980},{"emptyLinePlaceholder":833},[981],{"type":58,"value":836},{"type":52,"tag":662,"props":983,"children":985},{"class":664,"line":984},15,[986],{"type":52,"tag":662,"props":987,"children":988},{"style":843},[989],{"type":58,"value":990},"# Log directory\n",{"type":52,"tag":662,"props":992,"children":994},{"class":664,"line":993},16,[995,999,1003],{"type":52,"tag":662,"props":996,"children":997},{"style":669},[998],{"type":58,"value":897},{"type":52,"tag":662,"props":1000,"children":1001},{"style":675},[1002],{"type":58,"value":902},{"type":52,"tag":662,"props":1004,"children":1005},{"style":675},[1006],{"type":58,"value":1007}," ~\u002F.zoom\u002Flogs\n",{"type":52,"tag":110,"props":1009,"children":1011},{"id":1010},"quick-start",[1012],{"type":58,"value":1013},"Quick Start",{"type":52,"tag":650,"props":1015,"children":1019},{"className":1016,"code":1017,"language":1018,"meta":655,"style":655},"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",[1020],{"type":52,"tag":658,"props":1021,"children":1022},{"__ignoreMap":655},[1023,1031,1039,1047,1054,1062,1069,1077,1085,1092,1100,1108,1116,1124,1132,1140,1148,1157,1165,1174,1182,1191,1200,1208,1217,1226,1235,1244,1253,1262,1271,1280,1288,1297,1306,1314],{"type":52,"tag":662,"props":1024,"children":1025},{"class":664,"line":665},[1026],{"type":52,"tag":662,"props":1027,"children":1028},{},[1029],{"type":58,"value":1030},"#include \"zoom_video_sdk_api.h\"\n",{"type":52,"tag":662,"props":1032,"children":1033},{"class":664,"line":686},[1034],{"type":52,"tag":662,"props":1035,"children":1036},{},[1037],{"type":58,"value":1038},"#include \"zoom_video_sdk_interface.h\"\n",{"type":52,"tag":662,"props":1040,"children":1041},{"class":664,"line":739},[1042],{"type":52,"tag":662,"props":1043,"children":1044},{},[1045],{"type":58,"value":1046},"#include \"zoom_video_sdk_delegate_interface.h\"\n",{"type":52,"tag":662,"props":1048,"children":1049},{"class":664,"line":772},[1050],{"type":52,"tag":662,"props":1051,"children":1052},{"emptyLinePlaceholder":833},[1053],{"type":58,"value":836},{"type":52,"tag":662,"props":1055,"children":1056},{"class":664,"line":815},[1057],{"type":52,"tag":662,"props":1058,"children":1059},{},[1060],{"type":58,"value":1061},"USING_ZOOM_VIDEO_SDK_NAMESPACE\n",{"type":52,"tag":662,"props":1063,"children":1064},{"class":664,"line":829},[1065],{"type":52,"tag":662,"props":1066,"children":1067},{"emptyLinePlaceholder":833},[1068],{"type":58,"value":836},{"type":52,"tag":662,"props":1070,"children":1071},{"class":664,"line":839},[1072],{"type":52,"tag":662,"props":1073,"children":1074},{},[1075],{"type":58,"value":1076},"\u002F\u002F 1. Create SDK\n",{"type":52,"tag":662,"props":1078,"children":1079},{"class":664,"line":849},[1080],{"type":52,"tag":662,"props":1081,"children":1082},{},[1083],{"type":58,"value":1084},"IZoomVideoSDK* sdk = CreateZoomVideoSDKObj();\n",{"type":52,"tag":662,"props":1086,"children":1087},{"class":664,"line":874},[1088],{"type":52,"tag":662,"props":1089,"children":1090},{"emptyLinePlaceholder":833},[1091],{"type":58,"value":836},{"type":52,"tag":662,"props":1093,"children":1094},{"class":664,"line":882},[1095],{"type":52,"tag":662,"props":1096,"children":1097},{},[1098],{"type":58,"value":1099},"\u002F\u002F 2. Initialize\n",{"type":52,"tag":662,"props":1101,"children":1102},{"class":664,"line":891},[1103],{"type":52,"tag":662,"props":1104,"children":1105},{},[1106],{"type":58,"value":1107},"ZoomVideoSDKInitParams init_params;\n",{"type":52,"tag":662,"props":1109,"children":1110},{"class":664,"line":910},[1111],{"type":52,"tag":662,"props":1112,"children":1113},{},[1114],{"type":58,"value":1115},"init_params.domain = \"https:\u002F\u002Fzoom.us\";\n",{"type":52,"tag":662,"props":1117,"children":1118},{"class":664,"line":946},[1119],{"type":52,"tag":662,"props":1120,"children":1121},{},[1122],{"type":58,"value":1123},"init_params.enableLog = true;\n",{"type":52,"tag":662,"props":1125,"children":1126},{"class":664,"line":976},[1127],{"type":52,"tag":662,"props":1128,"children":1129},{},[1130],{"type":58,"value":1131},"init_params.logFilePrefix = \"bot\";\n",{"type":52,"tag":662,"props":1133,"children":1134},{"class":664,"line":984},[1135],{"type":52,"tag":662,"props":1136,"children":1137},{},[1138],{"type":58,"value":1139},"init_params.videoRawDataMemoryMode = ZoomVideoSDKRawDataMemoryModeHeap;\n",{"type":52,"tag":662,"props":1141,"children":1142},{"class":664,"line":993},[1143],{"type":52,"tag":662,"props":1144,"children":1145},{},[1146],{"type":58,"value":1147},"init_params.shareRawDataMemoryMode = ZoomVideoSDKRawDataMemoryModeHeap;\n",{"type":52,"tag":662,"props":1149,"children":1151},{"class":664,"line":1150},17,[1152],{"type":52,"tag":662,"props":1153,"children":1154},{},[1155],{"type":58,"value":1156},"init_params.audioRawDataMemoryMode = ZoomVideoSDKRawDataMemoryModeHeap;\n",{"type":52,"tag":662,"props":1158,"children":1160},{"class":664,"line":1159},18,[1161],{"type":52,"tag":662,"props":1162,"children":1163},{"emptyLinePlaceholder":833},[1164],{"type":58,"value":836},{"type":52,"tag":662,"props":1166,"children":1168},{"class":664,"line":1167},19,[1169],{"type":52,"tag":662,"props":1170,"children":1171},{},[1172],{"type":58,"value":1173},"sdk->initialize(init_params);\n",{"type":52,"tag":662,"props":1175,"children":1177},{"class":664,"line":1176},20,[1178],{"type":52,"tag":662,"props":1179,"children":1180},{"emptyLinePlaceholder":833},[1181],{"type":58,"value":836},{"type":52,"tag":662,"props":1183,"children":1185},{"class":664,"line":1184},21,[1186],{"type":52,"tag":662,"props":1187,"children":1188},{},[1189],{"type":58,"value":1190},"\u002F\u002F 3. Add delegate\n",{"type":52,"tag":662,"props":1192,"children":1194},{"class":664,"line":1193},22,[1195],{"type":52,"tag":662,"props":1196,"children":1197},{},[1198],{"type":58,"value":1199},"sdk->addListener(myDelegate);\n",{"type":52,"tag":662,"props":1201,"children":1203},{"class":664,"line":1202},23,[1204],{"type":52,"tag":662,"props":1205,"children":1206},{"emptyLinePlaceholder":833},[1207],{"type":58,"value":836},{"type":52,"tag":662,"props":1209,"children":1211},{"class":664,"line":1210},24,[1212],{"type":52,"tag":662,"props":1213,"children":1214},{},[1215],{"type":58,"value":1216},"\u002F\u002F 4. Join session\n",{"type":52,"tag":662,"props":1218,"children":1220},{"class":664,"line":1219},25,[1221],{"type":52,"tag":662,"props":1222,"children":1223},{},[1224],{"type":58,"value":1225},"ZoomVideoSDKSessionContext ctx;\n",{"type":52,"tag":662,"props":1227,"children":1229},{"class":664,"line":1228},26,[1230],{"type":52,"tag":662,"props":1231,"children":1232},{},[1233],{"type":58,"value":1234},"ctx.sessionName = \"my-session\";\n",{"type":52,"tag":662,"props":1236,"children":1238},{"class":664,"line":1237},27,[1239],{"type":52,"tag":662,"props":1240,"children":1241},{},[1242],{"type":58,"value":1243},"ctx.userName = \"Linux Bot\";\n",{"type":52,"tag":662,"props":1245,"children":1247},{"class":664,"line":1246},28,[1248],{"type":52,"tag":662,"props":1249,"children":1250},{},[1251],{"type":58,"value":1252},"ctx.token = \"jwt-token\";\n",{"type":52,"tag":662,"props":1254,"children":1256},{"class":664,"line":1255},29,[1257],{"type":52,"tag":662,"props":1258,"children":1259},{},[1260],{"type":58,"value":1261},"ctx.audioOption.connect = true;\n",{"type":52,"tag":662,"props":1263,"children":1265},{"class":664,"line":1264},30,[1266],{"type":52,"tag":662,"props":1267,"children":1268},{},[1269],{"type":58,"value":1270},"ctx.audioOption.mute = false;\n",{"type":52,"tag":662,"props":1272,"children":1274},{"class":664,"line":1273},31,[1275],{"type":52,"tag":662,"props":1276,"children":1277},{},[1278],{"type":58,"value":1279},"ctx.videoOption.localVideoOn = false;\n",{"type":52,"tag":662,"props":1281,"children":1283},{"class":664,"line":1282},32,[1284],{"type":52,"tag":662,"props":1285,"children":1286},{"emptyLinePlaceholder":833},[1287],{"type":58,"value":836},{"type":52,"tag":662,"props":1289,"children":1291},{"class":664,"line":1290},33,[1292],{"type":52,"tag":662,"props":1293,"children":1294},{},[1295],{"type":58,"value":1296},"\u002F\u002F For headless: Virtual audio speaker\n",{"type":52,"tag":662,"props":1298,"children":1300},{"class":664,"line":1299},34,[1301],{"type":52,"tag":662,"props":1302,"children":1303},{},[1304],{"type":58,"value":1305},"ctx.virtualAudioSpeaker = new VirtualSpeaker();\n",{"type":52,"tag":662,"props":1307,"children":1309},{"class":664,"line":1308},35,[1310],{"type":52,"tag":662,"props":1311,"children":1312},{"emptyLinePlaceholder":833},[1313],{"type":58,"value":836},{"type":52,"tag":662,"props":1315,"children":1317},{"class":664,"line":1316},36,[1318],{"type":52,"tag":662,"props":1319,"children":1320},{},[1321],{"type":58,"value":1322},"IZoomVideoSDKSession* session = sdk->joinSession(ctx);\n",{"type":52,"tag":61,"props":1324,"children":1325},{},[1326,1328,1335],{"type":58,"value":1327},"See ",{"type":52,"tag":70,"props":1329,"children":1330},{},[1331],{"type":52,"tag":78,"props":1332,"children":1333},{"href":151},[1334],{"type":58,"value":154},{"type":58,"value":1336}," for complete code.",{"type":52,"tag":110,"props":1338,"children":1340},{"id":1339},"key-features",[1341],{"type":58,"value":1342},"Key Features",{"type":52,"tag":323,"props":1344,"children":1345},{},[1346,1366],{"type":52,"tag":327,"props":1347,"children":1348},{},[1349],{"type":52,"tag":331,"props":1350,"children":1351},{},[1352,1356,1361],{"type":52,"tag":335,"props":1353,"children":1354},{},[1355],{"type":58,"value":339},{"type":52,"tag":335,"props":1357,"children":1358},{},[1359],{"type":58,"value":1360},"Linux Support",{"type":52,"tag":335,"props":1362,"children":1363},{},[1364],{"type":58,"value":1365},"Guide",{"type":52,"tag":350,"props":1367,"children":1368},{},[1369,1393,1417,1441,1464,1487,1510,1533,1557,1580,1604,1627],{"type":52,"tag":331,"props":1370,"children":1371},{},[1372,1380,1385],{"type":52,"tag":357,"props":1373,"children":1374},{},[1375],{"type":52,"tag":70,"props":1376,"children":1377},{},[1378],{"type":58,"value":1379},"Session Management",{"type":52,"tag":357,"props":1381,"children":1382},{},[1383],{"type":58,"value":1384},"✅ Full",{"type":52,"tag":357,"props":1386,"children":1387},{},[1388],{"type":52,"tag":78,"props":1389,"children":1390},{"href":151},[1391],{"type":58,"value":1392},"Session Join",{"type":52,"tag":331,"props":1394,"children":1395},{},[1396,1404,1409],{"type":52,"tag":357,"props":1397,"children":1398},{},[1399],{"type":52,"tag":70,"props":1400,"children":1401},{},[1402],{"type":58,"value":1403},"Raw Video (YUV420)",{"type":52,"tag":357,"props":1405,"children":1406},{},[1407],{"type":58,"value":1408},"✅ ONLY rendering option",{"type":52,"tag":357,"props":1410,"children":1411},{},[1412],{"type":52,"tag":78,"props":1413,"children":1414},{"href":186},[1415],{"type":58,"value":1416},"Raw Video",{"type":52,"tag":331,"props":1418,"children":1419},{},[1420,1428,1432],{"type":52,"tag":357,"props":1421,"children":1422},{},[1423],{"type":52,"tag":70,"props":1424,"children":1425},{},[1426],{"type":58,"value":1427},"Raw Audio (PCM)",{"type":52,"tag":357,"props":1429,"children":1430},{},[1431],{"type":58,"value":1384},{"type":52,"tag":357,"props":1433,"children":1434},{},[1435],{"type":52,"tag":78,"props":1436,"children":1438},{"href":1437},"examples\u002Fraw-audio-capture.md",[1439],{"type":58,"value":1440},"Raw Audio",{"type":52,"tag":331,"props":1442,"children":1443},{},[1444,1452,1456],{"type":52,"tag":357,"props":1445,"children":1446},{},[1447],{"type":52,"tag":70,"props":1448,"children":1449},{},[1450],{"type":58,"value":1451},"Virtual Camera\u002FMic",{"type":52,"tag":357,"props":1453,"children":1454},{},[1455],{"type":58,"value":1384},{"type":52,"tag":357,"props":1457,"children":1458},{},[1459],{"type":52,"tag":78,"props":1460,"children":1462},{"href":1461},"examples\u002Fvirtual-audio-video.md",[1463],{"type":58,"value":473},{"type":52,"tag":331,"props":1465,"children":1466},{},[1467,1474,1478],{"type":52,"tag":357,"props":1468,"children":1469},{},[1470],{"type":52,"tag":70,"props":1471,"children":1472},{},[1473],{"type":58,"value":545},{"type":52,"tag":357,"props":1475,"children":1476},{},[1477],{"type":58,"value":1384},{"type":52,"tag":357,"props":1479,"children":1480},{},[1481],{"type":52,"tag":78,"props":1482,"children":1484},{"href":1483},"examples\u002Fcloud-recording.md",[1485],{"type":58,"value":1486},"Recording",{"type":52,"tag":331,"props":1488,"children":1489},{},[1490,1497,1501],{"type":52,"tag":357,"props":1491,"children":1492},{},[1493],{"type":52,"tag":70,"props":1494,"children":1495},{},[1496],{"type":58,"value":555},{"type":52,"tag":357,"props":1498,"children":1499},{},[1500],{"type":58,"value":1384},{"type":52,"tag":357,"props":1502,"children":1503},{},[1504],{"type":52,"tag":78,"props":1505,"children":1507},{"href":1506},"examples\u002Flive-streaming.md",[1508],{"type":58,"value":1509},"Live Stream",{"type":52,"tag":331,"props":1511,"children":1512},{},[1513,1520,1524],{"type":52,"tag":357,"props":1514,"children":1515},{},[1516],{"type":52,"tag":70,"props":1517,"children":1518},{},[1519],{"type":58,"value":565},{"type":52,"tag":357,"props":1521,"children":1522},{},[1523],{"type":58,"value":1384},{"type":52,"tag":357,"props":1525,"children":1526},{},[1527],{"type":52,"tag":78,"props":1528,"children":1530},{"href":1529},"examples\u002Ftranscription.md",[1531],{"type":58,"value":1532},"Transcription",{"type":52,"tag":331,"props":1534,"children":1535},{},[1536,1544,1548],{"type":52,"tag":357,"props":1537,"children":1538},{},[1539],{"type":52,"tag":70,"props":1540,"children":1541},{},[1542],{"type":58,"value":1543},"Command Channel",{"type":52,"tag":357,"props":1545,"children":1546},{},[1547],{"type":58,"value":1384},{"type":52,"tag":357,"props":1549,"children":1550},{},[1551],{"type":52,"tag":78,"props":1552,"children":1554},{"href":1553},"examples\u002Fcommand-channel.md",[1555],{"type":58,"value":1556},"Commands",{"type":52,"tag":331,"props":1558,"children":1559},{},[1560,1568,1572],{"type":52,"tag":357,"props":1561,"children":1562},{},[1563],{"type":52,"tag":70,"props":1564,"children":1565},{},[1566],{"type":58,"value":1567},"Chat",{"type":52,"tag":357,"props":1569,"children":1570},{},[1571],{"type":58,"value":1384},{"type":52,"tag":357,"props":1573,"children":1574},{},[1575],{"type":52,"tag":78,"props":1576,"children":1578},{"href":1577},"examples\u002Fchat.md",[1579],{"type":58,"value":1567},{"type":52,"tag":331,"props":1581,"children":1582},{},[1583,1591,1596],{"type":52,"tag":357,"props":1584,"children":1585},{},[1586],{"type":52,"tag":70,"props":1587,"children":1588},{},[1589],{"type":58,"value":1590},"Qt Integration",{"type":52,"tag":357,"props":1592,"children":1593},{},[1594],{"type":58,"value":1595},"✅ Recommended",{"type":52,"tag":357,"props":1597,"children":1598},{},[1599],{"type":52,"tag":78,"props":1600,"children":1601},{"href":239},[1602],{"type":58,"value":1603},"Qt\u002FGTK",{"type":52,"tag":331,"props":1605,"children":1606},{},[1607,1615,1620],{"type":52,"tag":357,"props":1608,"children":1609},{},[1610],{"type":52,"tag":70,"props":1611,"children":1612},{},[1613],{"type":58,"value":1614},"GTK Integration",{"type":52,"tag":357,"props":1616,"children":1617},{},[1618],{"type":58,"value":1619},"✅ Supported",{"type":52,"tag":357,"props":1621,"children":1622},{},[1623],{"type":52,"tag":78,"props":1624,"children":1625},{"href":239},[1626],{"type":58,"value":1603},{"type":52,"tag":331,"props":1628,"children":1629},{},[1630,1638,1643],{"type":52,"tag":357,"props":1631,"children":1632},{},[1633],{"type":52,"tag":70,"props":1634,"children":1635},{},[1636],{"type":58,"value":1637},"Docker\u002FHeadless",{"type":52,"tag":357,"props":1639,"children":1640},{},[1641],{"type":58,"value":1642},"✅ Excellent",{"type":52,"tag":357,"props":1644,"children":1645},{},[1646],{"type":52,"tag":78,"props":1647,"children":1648},{"href":1461},[1649],{"type":58,"value":473},{"type":52,"tag":110,"props":1651,"children":1653},{"id":1652},"critical-gotchas",[1654],{"type":58,"value":1655},"Critical Gotchas",{"type":52,"tag":584,"props":1657,"children":1659},{"id":1658},"️-critical-1-no-canvas-api-on-linux",[1660],{"type":58,"value":1661},"⚠️ CRITICAL #1: No Canvas API on Linux",{"type":52,"tag":61,"props":1663,"children":1664},{},[1665,1670],{"type":52,"tag":70,"props":1666,"children":1667},{},[1668],{"type":58,"value":1669},"Problem",{"type":58,"value":1671},": Linux SDK does NOT have Canvas API like Windows\u002FMac.",{"type":52,"tag":61,"props":1673,"children":1674},{},[1675,1680],{"type":52,"tag":70,"props":1676,"children":1677},{},[1678],{"type":58,"value":1679},"Solution",{"type":58,"value":1681},": You MUST use Raw Data Pipe and implement your own rendering.",{"type":52,"tag":61,"props":1683,"children":1684},{},[1685,1687],{"type":58,"value":1686},"See: ",{"type":52,"tag":70,"props":1688,"children":1689},{},[1690],{"type":52,"tag":78,"props":1691,"children":1692},{"href":165},[1693],{"type":58,"value":168},{"type":52,"tag":584,"props":1695,"children":1697},{"id":1696},"️-critical-2-pulseaudio-required-for-audio",[1698],{"type":58,"value":1699},"⚠️ CRITICAL #2: PulseAudio Required for Audio",{"type":52,"tag":61,"props":1701,"children":1702},{},[1703,1707],{"type":52,"tag":70,"props":1704,"children":1705},{},[1706],{"type":58,"value":1669},{"type":58,"value":1708},": SDK requires PulseAudio for raw audio functions.",{"type":52,"tag":61,"props":1710,"children":1711},{},[1712,1716],{"type":52,"tag":70,"props":1713,"children":1714},{},[1715],{"type":58,"value":1679},{"type":58,"value":1717},":",{"type":52,"tag":650,"props":1719,"children":1721},{"className":652,"code":1720,"language":654,"meta":655,"style":655},"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",[1722],{"type":52,"tag":658,"props":1723,"children":1724},{"__ignoreMap":655},[1725,1748,1763,1790],{"type":52,"tag":662,"props":1726,"children":1727},{"class":664,"line":665},[1728,1732,1736,1740,1744],{"type":52,"tag":662,"props":1729,"children":1730},{"style":669},[1731],{"type":58,"value":672},{"type":52,"tag":662,"props":1733,"children":1734},{"style":675},[1735],{"type":58,"value":678},{"type":52,"tag":662,"props":1737,"children":1738},{"style":675},[1739],{"type":58,"value":700},{"type":52,"tag":662,"props":1741,"children":1742},{"style":675},[1743],{"type":58,"value":705},{"type":52,"tag":662,"props":1745,"children":1746},{"style":675},[1747],{"type":58,"value":871},{"type":52,"tag":662,"props":1749,"children":1750},{"class":664,"line":686},[1751,1755,1759],{"type":52,"tag":662,"props":1752,"children":1753},{"style":669},[1754],{"type":58,"value":897},{"type":52,"tag":662,"props":1756,"children":1757},{"style":675},[1758],{"type":58,"value":902},{"type":52,"tag":662,"props":1760,"children":1761},{"style":675},[1762],{"type":58,"value":907},{"type":52,"tag":662,"props":1764,"children":1765},{"class":664,"line":739},[1766,1770,1774,1778,1782,1786],{"type":52,"tag":662,"props":1767,"children":1768},{"style":914},[1769],{"type":58,"value":917},{"type":52,"tag":662,"props":1771,"children":1772},{"style":920},[1773],{"type":58,"value":923},{"type":52,"tag":662,"props":1775,"children":1776},{"style":675},[1777],{"type":58,"value":928},{"type":52,"tag":662,"props":1779,"children":1780},{"style":920},[1781],{"type":58,"value":933},{"type":52,"tag":662,"props":1783,"children":1784},{"style":920},[1785],{"type":58,"value":938},{"type":52,"tag":662,"props":1787,"children":1788},{"style":675},[1789],{"type":58,"value":943},{"type":52,"tag":662,"props":1791,"children":1792},{"class":664,"line":772},[1793,1797,1801,1805,1809,1813],{"type":52,"tag":662,"props":1794,"children":1795},{"style":914},[1796],{"type":58,"value":917},{"type":52,"tag":662,"props":1798,"children":1799},{"style":920},[1800],{"type":58,"value":923},{"type":52,"tag":662,"props":1802,"children":1803},{"style":675},[1804],{"type":58,"value":960},{"type":52,"tag":662,"props":1806,"children":1807},{"style":920},[1808],{"type":58,"value":933},{"type":52,"tag":662,"props":1810,"children":1811},{"style":920},[1812],{"type":58,"value":969},{"type":52,"tag":662,"props":1814,"children":1815},{"style":675},[1816],{"type":58,"value":943},{"type":52,"tag":61,"props":1818,"children":1819},{},[1820,1821],{"type":58,"value":1686},{"type":52,"tag":70,"props":1822,"children":1823},{},[1824],{"type":52,"tag":78,"props":1825,"children":1826},{"href":290},[1827],{"type":58,"value":1828},"PulseAudio Setup",{"type":52,"tag":584,"props":1830,"children":1832},{"id":1831},"️-critical-3-qt5-dependencies",[1833],{"type":58,"value":1834},"⚠️ CRITICAL #3: Qt5 Dependencies",{"type":52,"tag":61,"props":1836,"children":1837},{},[1838,1842],{"type":52,"tag":70,"props":1839,"children":1840},{},[1841],{"type":58,"value":1669},{"type":58,"value":1843},": SDK requires Qt5 libraries (bundled, NOT system Qt5).",{"type":52,"tag":61,"props":1845,"children":1846},{},[1847,1851],{"type":52,"tag":70,"props":1848,"children":1849},{},[1850],{"type":58,"value":1679},{"type":58,"value":1717},{"type":52,"tag":650,"props":1853,"children":1855},{"className":652,"code":1854,"language":654,"meta":655,"style":655},"# 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",[1856],{"type":52,"tag":658,"props":1857,"children":1858},{"__ignoreMap":655},[1859,1867,1895,1902,1910,1923],{"type":52,"tag":662,"props":1860,"children":1861},{"class":664,"line":665},[1862],{"type":52,"tag":662,"props":1863,"children":1864},{"style":843},[1865],{"type":58,"value":1866},"# Copy from SDK package\n",{"type":52,"tag":662,"props":1868,"children":1869},{"class":664,"line":686},[1870,1875,1880,1885,1890],{"type":52,"tag":662,"props":1871,"children":1872},{"style":669},[1873],{"type":58,"value":1874},"cp",{"type":52,"tag":662,"props":1876,"children":1877},{"style":675},[1878],{"type":58,"value":1879}," -r",{"type":52,"tag":662,"props":1881,"children":1882},{"style":675},[1883],{"type":58,"value":1884}," samples\u002Fqt_libs\u002FQt\u002Flib\u002F",{"type":52,"tag":662,"props":1886,"children":1887},{"style":733},[1888],{"type":58,"value":1889},"*",{"type":52,"tag":662,"props":1891,"children":1892},{"style":675},[1893],{"type":58,"value":1894}," lib\u002Fzoom_video_sdk\u002F\n",{"type":52,"tag":662,"props":1896,"children":1897},{"class":664,"line":739},[1898],{"type":52,"tag":662,"props":1899,"children":1900},{"emptyLinePlaceholder":833},[1901],{"type":58,"value":836},{"type":52,"tag":662,"props":1903,"children":1904},{"class":664,"line":772},[1905],{"type":52,"tag":662,"props":1906,"children":1907},{"style":843},[1908],{"type":58,"value":1909},"# Create symlinks\n",{"type":52,"tag":662,"props":1911,"children":1912},{"class":664,"line":815},[1913,1918],{"type":52,"tag":662,"props":1914,"children":1915},{"style":914},[1916],{"type":58,"value":1917},"cd",{"type":52,"tag":662,"props":1919,"children":1920},{"style":675},[1921],{"type":58,"value":1922}," lib\u002Fzoom_video_sdk\n",{"type":52,"tag":662,"props":1924,"children":1925},{"class":664,"line":829},[1926,1932,1937,1942,1947,1952,1957,1962,1967,1972,1977,1982,1987,1992,1997],{"type":52,"tag":662,"props":1927,"children":1929},{"style":1928},"--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic",[1930],{"type":58,"value":1931},"for",{"type":52,"tag":662,"props":1933,"children":1934},{"style":733},[1935],{"type":58,"value":1936}," lib ",{"type":52,"tag":662,"props":1938,"children":1939},{"style":1928},[1940],{"type":58,"value":1941},"in",{"type":52,"tag":662,"props":1943,"children":1944},{"style":675},[1945],{"type":58,"value":1946}," libQt5*.so.5",{"type":52,"tag":662,"props":1948,"children":1949},{"style":920},[1950],{"type":58,"value":1951},";",{"type":52,"tag":662,"props":1953,"children":1954},{"style":1928},[1955],{"type":58,"value":1956}," do",{"type":52,"tag":662,"props":1958,"children":1959},{"style":669},[1960],{"type":58,"value":1961}," ln",{"type":52,"tag":662,"props":1963,"children":1964},{"style":675},[1965],{"type":58,"value":1966}," -sf",{"type":52,"tag":662,"props":1968,"children":1969},{"style":733},[1970],{"type":58,"value":1971}," $lib ",{"type":52,"tag":662,"props":1973,"children":1974},{"style":920},[1975],{"type":58,"value":1976},"${",{"type":52,"tag":662,"props":1978,"children":1979},{"style":733},[1980],{"type":58,"value":1981},"lib",{"type":52,"tag":662,"props":1983,"children":1984},{"style":920},[1985],{"type":58,"value":1986},"%",{"type":52,"tag":662,"props":1988,"children":1989},{"style":733},[1990],{"type":58,"value":1991},".5",{"type":52,"tag":662,"props":1993,"children":1994},{"style":920},[1995],{"type":58,"value":1996},"};",{"type":52,"tag":662,"props":1998,"children":1999},{"style":1928},[2000],{"type":58,"value":2001}," done\n",{"type":52,"tag":61,"props":2003,"children":2004},{},[2005,2006],{"type":58,"value":1686},{"type":52,"tag":70,"props":2007,"children":2008},{},[2009],{"type":52,"tag":78,"props":2010,"children":2011},{"href":301},[2012],{"type":58,"value":304},{"type":52,"tag":584,"props":2014,"children":2016},{"id":2015},"️-critical-4-heap-memory-mode",[2017],{"type":58,"value":2018},"⚠️ CRITICAL #4: Heap Memory Mode",{"type":52,"tag":61,"props":2020,"children":2021},{},[2022],{"type":58,"value":2023},"Always use heap mode for raw data:",{"type":52,"tag":650,"props":2025,"children":2027},{"className":1016,"code":2026,"language":1018,"meta":655,"style":655},"init_params.videoRawDataMemoryMode = ZoomVideoSDKRawDataMemoryModeHeap;\ninit_params.shareRawDataMemoryMode = ZoomVideoSDKRawDataMemoryModeHeap;\ninit_params.audioRawDataMemoryMode = ZoomVideoSDKRawDataMemoryModeHeap;\n",[2028],{"type":52,"tag":658,"props":2029,"children":2030},{"__ignoreMap":655},[2031,2038,2045],{"type":52,"tag":662,"props":2032,"children":2033},{"class":664,"line":665},[2034],{"type":52,"tag":662,"props":2035,"children":2036},{},[2037],{"type":58,"value":1139},{"type":52,"tag":662,"props":2039,"children":2040},{"class":664,"line":686},[2041],{"type":52,"tag":662,"props":2042,"children":2043},{},[2044],{"type":58,"value":1147},{"type":52,"tag":662,"props":2046,"children":2047},{"class":664,"line":739},[2048],{"type":52,"tag":662,"props":2049,"children":2050},{},[2051],{"type":58,"value":1156},{"type":52,"tag":584,"props":2053,"children":2055},{"id":2054},"️-critical-5-virtual-audio-for-headless",[2056],{"type":58,"value":2057},"⚠️ CRITICAL #5: Virtual Audio for Headless",{"type":52,"tag":61,"props":2059,"children":2060},{},[2061,2065],{"type":52,"tag":70,"props":2062,"children":2063},{},[2064],{"type":58,"value":1669},{"type":58,"value":2066},": Docker\u002Fheadless environments have no audio devices.",{"type":52,"tag":61,"props":2068,"children":2069},{},[2070,2074],{"type":52,"tag":70,"props":2071,"children":2072},{},[2073],{"type":58,"value":1679},{"type":58,"value":2075},": Use virtual audio speaker and mic.",{"type":52,"tag":650,"props":2077,"children":2079},{"className":1016,"code":2078,"language":1018,"meta":655,"style":655},"session_context.virtualAudioSpeaker = new VirtualSpeaker();\nsession_context.virtualAudioMic = new VirtualMic();\n",[2080],{"type":52,"tag":658,"props":2081,"children":2082},{"__ignoreMap":655},[2083,2091],{"type":52,"tag":662,"props":2084,"children":2085},{"class":664,"line":665},[2086],{"type":52,"tag":662,"props":2087,"children":2088},{},[2089],{"type":58,"value":2090},"session_context.virtualAudioSpeaker = new VirtualSpeaker();\n",{"type":52,"tag":662,"props":2092,"children":2093},{"class":664,"line":686},[2094],{"type":52,"tag":662,"props":2095,"children":2096},{},[2097],{"type":58,"value":2098},"session_context.virtualAudioMic = new VirtualMic();\n",{"type":52,"tag":61,"props":2100,"children":2101},{},[2102,2103],{"type":58,"value":1686},{"type":52,"tag":70,"props":2104,"children":2105},{},[2106],{"type":52,"tag":78,"props":2107,"children":2108},{"href":1461},[2109],{"type":58,"value":2110},"Virtual Audio\u002FVideo",{"type":52,"tag":110,"props":2112,"children":2114},{"id":2113},"sample-repositories",[2115],{"type":58,"value":2116},"Sample Repositories",{"type":52,"tag":584,"props":2118,"children":2120},{"id":2119},"official-samples",[2121],{"type":58,"value":2122},"Official Samples",{"type":52,"tag":323,"props":2124,"children":2125},{},[2126,2142],{"type":52,"tag":327,"props":2127,"children":2128},{},[2129],{"type":52,"tag":331,"props":2130,"children":2131},{},[2132,2137],{"type":52,"tag":335,"props":2133,"children":2134},{},[2135],{"type":58,"value":2136},"Repository",{"type":52,"tag":335,"props":2138,"children":2139},{},[2140],{"type":58,"value":2141},"Description",{"type":52,"tag":350,"props":2143,"children":2144},{},[2145,2165,2186],{"type":52,"tag":331,"props":2146,"children":2147},{},[2148,2160],{"type":52,"tag":357,"props":2149,"children":2150},{},[2151],{"type":52,"tag":70,"props":2152,"children":2153},{},[2154],{"type":52,"tag":78,"props":2155,"children":2157},{"href":105,"rel":2156},[82],[2158],{"type":58,"value":2159},"raw-recording-sample",{"type":52,"tag":357,"props":2161,"children":2162},{},[2163],{"type":58,"value":2164},"Raw audio\u002Fvideo capture",{"type":52,"tag":331,"props":2166,"children":2167},{},[2168,2181],{"type":52,"tag":357,"props":2169,"children":2170},{},[2171],{"type":52,"tag":70,"props":2172,"children":2173},{},[2174],{"type":52,"tag":78,"props":2175,"children":2178},{"href":2176,"rel":2177},"https:\u002F\u002Fgithub.com\u002Ftanchunsiong\u002Fvideosdk-linux-qt-quickstart",[82],[2179],{"type":58,"value":2180},"qt-quickstart",{"type":52,"tag":357,"props":2182,"children":2183},{},[2184],{"type":58,"value":2185},"Qt6 UI integration",{"type":52,"tag":331,"props":2187,"children":2188},{},[2189,2202],{"type":52,"tag":357,"props":2190,"children":2191},{},[2192],{"type":52,"tag":70,"props":2193,"children":2194},{},[2195],{"type":52,"tag":78,"props":2196,"children":2199},{"href":2197,"rel":2198},"https:\u002F\u002Fgithub.com\u002Ftanchunsiong\u002Fvideosdk-linux-gtk-quickstart",[82],[2200],{"type":58,"value":2201},"gtk-quickstart",{"type":52,"tag":357,"props":2203,"children":2204},{},[2205],{"type":58,"value":2206},"GTK3 UI integration",{"type":52,"tag":584,"props":2208,"children":2210},{"id":2209},"sample-architecture",[2211],{"type":58,"value":2212},"Sample Architecture",{"type":52,"tag":650,"props":2214,"children":2218},{"className":2215,"code":2217,"language":58},[2216],"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",[2219],{"type":52,"tag":658,"props":2220,"children":2221},{"__ignoreMap":655},[2222],{"type":58,"value":2217},{"type":52,"tag":61,"props":2224,"children":2225},{},[2226],{"type":58,"value":2227},"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":52,"tag":650,"props":2229,"children":2232},{"className":2230,"code":2231,"language":58},[2216],"\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",[2233],{"type":52,"tag":658,"props":2234,"children":2235},{"__ignoreMap":655},[2236],{"type":58,"value":2231},{"type":52,"tag":125,"props":2238,"children":2239},{"start":839},[2240,2270,2299],{"type":52,"tag":129,"props":2241,"children":2242},{},[2243,2248],{"type":52,"tag":70,"props":2244,"children":2245},{},[2246],{"type":58,"value":2247},"GLib Main Loop Required",{"type":52,"tag":201,"props":2249,"children":2250},{},[2251,2256,2261],{"type":52,"tag":129,"props":2252,"children":2253},{},[2254],{"type":58,"value":2255},"while\u002Fsleep loops don't dispatch SDK events",{"type":52,"tag":129,"props":2257,"children":2258},{},[2259],{"type":58,"value":2260},"Must use g_main_loop_run()",{"type":52,"tag":129,"props":2262,"children":2263},{},[2264,2265],{"type":58,"value":1686},{"type":52,"tag":78,"props":2266,"children":2267},{"href":253},[2268],{"type":58,"value":2269},"Common Issues",{"type":52,"tag":129,"props":2271,"children":2272},{},[2273,2278],{"type":52,"tag":70,"props":2274,"children":2275},{},[2276],{"type":58,"value":2277},"All SDK Calls Must Be on Main Thread",{"type":52,"tag":201,"props":2279,"children":2280},{},[2281,2286,2291],{"type":52,"tag":129,"props":2282,"children":2283},{},[2284],{"type":58,"value":2285},"Background thread SDK calls return error 2 (Internal_Error)",{"type":52,"tag":129,"props":2287,"children":2288},{},[2289],{"type":58,"value":2290},"Use g_idle_add() to schedule on GLib main thread",{"type":52,"tag":129,"props":2292,"children":2293},{},[2294,2295],{"type":58,"value":1686},{"type":52,"tag":78,"props":2296,"children":2297},{"href":1553},[2298],{"type":58,"value":1543},{"type":52,"tag":129,"props":2300,"children":2301},{},[2302,2307],{"type":52,"tag":70,"props":2303,"children":2304},{},[2305],{"type":58,"value":2306},"Command Channel is Session-Scoped",{"type":52,"tag":201,"props":2308,"children":2309},{},[2310,2315,2320],{"type":52,"tag":129,"props":2311,"children":2312},{},[2313],{"type":58,"value":2314},"Does NOT span across different sessions",{"type":52,"tag":129,"props":2316,"children":2317},{},[2318],{"type":58,"value":2319},"Both sender and receiver must be in the same session",{"type":52,"tag":129,"props":2321,"children":2322},{},[2323,2324],{"type":58,"value":1686},{"type":52,"tag":78,"props":2325,"children":2326},{"href":1553},[2327],{"type":58,"value":1543},{"type":52,"tag":2329,"props":2330,"children":2331},"hr",{},[],{"type":52,"tag":110,"props":2333,"children":2335},{"id":2334},"sample-repositories-1",[2336],{"type":58,"value":2116},{"type":52,"tag":201,"props":2338,"children":2339},{},[2340,2353,2366],{"type":52,"tag":129,"props":2341,"children":2342},{},[2343,2351],{"type":52,"tag":70,"props":2344,"children":2345},{},[2346],{"type":52,"tag":78,"props":2347,"children":2349},{"href":105,"rel":2348},[82],[2350],{"type":58,"value":2159},{"type":58,"value":2352}," - Official raw data sample",{"type":52,"tag":129,"props":2354,"children":2355},{},[2356,2364],{"type":52,"tag":70,"props":2357,"children":2358},{},[2359],{"type":52,"tag":78,"props":2360,"children":2362},{"href":2176,"rel":2361},[82],[2363],{"type":58,"value":2180},{"type":58,"value":2365}," - Qt6 UI integration",{"type":52,"tag":129,"props":2367,"children":2368},{},[2369,2377],{"type":52,"tag":70,"props":2370,"children":2371},{},[2372],{"type":52,"tag":78,"props":2373,"children":2375},{"href":2197,"rel":2374},[82],[2376],{"type":58,"value":2201},{"type":58,"value":2378}," - GTK3 UI integration",{"type":52,"tag":2329,"props":2380,"children":2381},{},[],{"type":52,"tag":110,"props":2383,"children":2385},{"id":2384},"quick-reference",[2386],{"type":58,"value":2387},"Quick Reference",{"type":52,"tag":584,"props":2389,"children":2391},{"id":2390},"my-code-wont-compile",[2392],{"type":58,"value":2393},"\"My code won't compile\"",{"type":52,"tag":61,"props":2395,"children":2396},{},[2397,2399],{"type":58,"value":2398},"→ ",{"type":52,"tag":78,"props":2400,"children":2401},{"href":312},[2402],{"type":58,"value":315},{"type":52,"tag":584,"props":2404,"children":2406},{"id":2405},"audio-not-working",[2407],{"type":58,"value":2408},"\"Audio not working\"",{"type":52,"tag":61,"props":2410,"children":2411},{},[2412,2413],{"type":58,"value":2398},{"type":52,"tag":78,"props":2414,"children":2415},{"href":290},[2416],{"type":58,"value":1828},{"type":52,"tag":584,"props":2418,"children":2420},{"id":2419},"library-not-found",[2421],{"type":58,"value":2422},"\"Library not found\"",{"type":52,"tag":61,"props":2424,"children":2425},{},[2426,2427],{"type":58,"value":2398},{"type":52,"tag":78,"props":2428,"children":2429},{"href":301},[2430],{"type":58,"value":304},{"type":52,"tag":584,"props":2432,"children":2434},{"id":2433},"how-do-i-implement-feature",[2435,2437,2442],{"type":58,"value":2436},"\"How do I implement ",{"type":52,"tag":662,"props":2438,"children":2439},{},[2440],{"type":58,"value":2441},"feature",{"type":58,"value":2443},"?\"",{"type":52,"tag":61,"props":2445,"children":2446},{},[2447,2448],{"type":58,"value":2398},{"type":52,"tag":78,"props":2449,"children":2450},{"href":137},[2451],{"type":58,"value":140},{"type":52,"tag":584,"props":2453,"children":2455},{"id":2454},"what-error-code-means-what",[2456],{"type":58,"value":2457},"\"What error code means what?\"",{"type":52,"tag":61,"props":2459,"children":2460},{},[2461,2462],{"type":58,"value":2398},{"type":52,"tag":78,"props":2463,"children":2464},{"href":253},[2465],{"type":58,"value":2269},{"type":52,"tag":2329,"props":2467,"children":2468},{},[],{"type":52,"tag":110,"props":2470,"children":2472},{"id":2471},"document-version",[2473],{"type":58,"value":2474},"Document Version",{"type":52,"tag":61,"props":2476,"children":2477},{},[2478,2480],{"type":58,"value":2479},"Based on ",{"type":52,"tag":70,"props":2481,"children":2482},{},[2483],{"type":58,"value":2484},"Zoom Video SDK for Linux v2.x",{"type":52,"tag":2329,"props":2486,"children":2487},{},[],{"type":52,"tag":61,"props":2489,"children":2490},{},[2491],{"type":52,"tag":70,"props":2492,"children":2493},{},[2494],{"type":58,"value":2495},"Happy coding!",{"type":52,"tag":61,"props":2497,"children":2498},{},[2499,2501,2505],{"type":58,"value":2500},"Remember: The ",{"type":52,"tag":78,"props":2502,"children":2503},{"href":137},[2504],{"type":58,"value":140},{"type":58,"value":2506}," is your key to unlocking the entire SDK. Read it first!",{"type":52,"tag":110,"props":2508,"children":2510},{"id":2509},"operations",[2511],{"type":58,"value":2512},"Operations",{"type":52,"tag":201,"props":2514,"children":2515},{},[2516],{"type":52,"tag":129,"props":2517,"children":2518},{},[2519,2524],{"type":52,"tag":78,"props":2520,"children":2522},{"href":2521},"RUNBOOK.md",[2523],{"type":58,"value":2521},{"type":58,"value":2525}," - 5-minute preflight and debugging checklist.",{"type":52,"tag":2527,"props":2528,"children":2529},"style",{},[2530],{"type":58,"value":2531},"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":2533,"total":2649},[2534,2550,2566,2582,2599,2618,2634],{"slug":2535,"name":2535,"fn":2536,"description":2537,"org":2538,"tags":2539,"stars":27,"repoUrl":28,"updatedAt":2549},"accessibility-review","run WCAG accessibility audits","Run a WCAG 2.1 AA accessibility audit on a design or page. Trigger with \"audit accessibility\", \"check a11y\", \"is this accessible?\", or when reviewing a design for color contrast, keyboard navigation, touch target size, or screen reader behavior before handoff.",{"slug":9,"name":10,"logoUrl":11,"githubOrg":12},[2540,2543,2546],{"name":2541,"slug":2542,"type":17},"Accessibility","accessibility",{"name":2544,"slug":2545,"type":17},"Design","design",{"name":2547,"slug":2548,"type":17},"WCAG","wcag","2026-04-06T17:58:05.682394",{"slug":2551,"name":2551,"fn":2552,"description":2553,"org":2554,"tags":2555,"stars":27,"repoUrl":28,"updatedAt":2565},"account-research","research accounts for sales intel","Research a company or person and get actionable sales intel. Works standalone with web search, supercharged when you connect enrichment tools or your CRM. Trigger with \"research [company]\", \"look up [person]\", \"intel on [prospect]\", \"who is [name] at [company]\", or \"tell me about [company]\".",{"slug":9,"name":10,"logoUrl":11,"githubOrg":12},[2556,2559,2562],{"name":2557,"slug":2558,"type":17},"CRM","crm",{"name":2560,"slug":2561,"type":17},"Research","research",{"name":2563,"slug":2564,"type":17},"Sales","sales","2026-04-06T17:56:41.410418",{"slug":2567,"name":2567,"fn":2568,"description":2569,"org":2570,"tags":2571,"stars":27,"repoUrl":28,"updatedAt":2581},"analyze","answer data questions and run analyses","Answer data questions -- from quick lookups to full analyses. Use when looking up a single metric, investigating what's driving a trend or drop, comparing segments over time, or preparing a formal data report for stakeholders.",{"slug":9,"name":10,"logoUrl":11,"githubOrg":12},[2572,2575,2578],{"name":2573,"slug":2574,"type":17},"Analytics","analytics",{"name":2576,"slug":2577,"type":17},"Data Analysis","data-analysis",{"name":2579,"slug":2580,"type":17},"SQL","sql","2026-04-06T17:57:21.593647",{"slug":2583,"name":2583,"fn":2584,"description":2585,"org":2586,"tags":2587,"stars":27,"repoUrl":28,"updatedAt":2598},"architecture","create and evaluate architecture decision records","Create or evaluate an architecture decision record (ADR). Use when choosing between technologies (e.g., Kafka vs SQS), documenting a design decision with trade-offs and consequences, reviewing a system design proposal, or designing a new component from requirements and constraints.",{"slug":9,"name":10,"logoUrl":11,"githubOrg":12},[2588,2591,2592,2595],{"name":2589,"slug":2590,"type":17},"ADR","adr",{"name":610,"slug":2583,"type":17},{"name":2593,"slug":2594,"type":17},"Documentation","documentation",{"name":2596,"slug":2597,"type":17},"Engineering","engineering","2026-04-06T17:57:49.26444",{"slug":2600,"name":2600,"fn":2601,"description":2602,"org":2603,"tags":2604,"stars":27,"repoUrl":28,"updatedAt":2617},"audit-support","support SOX 404 control testing","Support SOX 404 compliance with control testing methodology, sample selection, and documentation standards. Use when generating testing workpapers, selecting audit samples, classifying control deficiencies, or preparing for internal or external audits.",{"slug":9,"name":10,"logoUrl":11,"githubOrg":12},[2605,2608,2611,2614],{"name":2606,"slug":2607,"type":17},"Audit","audit",{"name":2609,"slug":2610,"type":17},"Finance","finance",{"name":2612,"slug":2613,"type":17},"Regulatory Compliance","regulatory-compliance",{"name":2615,"slug":2616,"type":17},"SOX","sox","2026-04-06T17:57:36.714815",{"slug":2619,"name":2619,"fn":2620,"description":2621,"org":2622,"tags":2623,"stars":27,"repoUrl":28,"updatedAt":2633},"brand-review","review content against brand voice","Review content against your brand voice, style guide, and messaging pillars, flagging deviations by severity with specific before\u002Fafter fixes. Use when checking a draft before it ships, when auditing copy for voice consistency and terminology, or when screening for unsubstantiated claims, missing disclaimers, and other legal flags.",{"slug":9,"name":10,"logoUrl":11,"githubOrg":12},[2624,2627,2630],{"name":2625,"slug":2626,"type":17},"Branding","branding",{"name":2628,"slug":2629,"type":17},"Marketing","marketing",{"name":2631,"slug":2632,"type":17},"Writing","writing","2026-04-06T17:58:19.548331",{"slug":2635,"name":2635,"fn":2636,"description":2637,"org":2638,"tags":2639,"stars":27,"repoUrl":28,"updatedAt":2648},"brand-voice-enforcement","enforce brand voice in content","This skill applies brand guidelines to content creation. It should be used when the user asks to \"write an email\", \"draft a proposal\", \"create a pitch deck\", \"write a LinkedIn post\", \"draft a presentation\", \"write a Slack message\", \"draft sales content\", or any content creation request where brand voice should be applied. Also triggers on \"on-brand\", \"brand voice\", \"enforce voice\", \"apply brand guidelines\", \"brand-aligned content\", \"write in our voice\", \"use our brand tone\", \"make this sound like us\", \"rewrite this in our tone\", or \"this doesn't sound on-brand\". Not for generating guidelines from scratch (use guideline-generation) or discovering brand materials (use discover-brand).\n",{"slug":9,"name":10,"logoUrl":11,"githubOrg":12},[2640,2641,2644,2647],{"name":2625,"slug":2626,"type":17},{"name":2642,"slug":2643,"type":17},"Communications","communications",{"name":2645,"slug":2646,"type":17},"Content Creation","content-creation",{"name":2631,"slug":2632,"type":17},"2026-04-06T18:00:23.528956",200,{"items":2651,"total":2828},[2652,2671,2683,2695,2714,2725,2746,2766,2776,2791,2799,2812],{"slug":2653,"name":2653,"fn":2654,"description":2655,"org":2656,"tags":2657,"stars":2668,"repoUrl":2669,"updatedAt":2670},"algorithmic-art","create algorithmic art with p5.js","Creating algorithmic art using p5.js with seeded randomness and interactive parameter exploration. Use this when users request creating art using code, generative art, algorithmic art, flow fields, or particle systems. Create original algorithmic art rather than copying existing artists' work to avoid copyright violations.",{"slug":9,"name":10,"logoUrl":11,"githubOrg":12},[2658,2661,2662,2665],{"name":2659,"slug":2660,"type":17},"Creative","creative",{"name":2544,"slug":2545,"type":17},{"name":2663,"slug":2664,"type":17},"Generative Art","generative-art",{"name":2666,"slug":2667,"type":17},"JavaScript","javascript",161831,"https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fskills","2026-04-06T17:56:15.455818",{"slug":2672,"name":2672,"fn":2673,"description":2674,"org":2675,"tags":2676,"stars":2668,"repoUrl":2669,"updatedAt":2682},"brand-guidelines","apply Anthropic brand colors and typography","Applies Anthropic's official brand colors and typography to any sort of artifact that may benefit from having Anthropic's look-and-feel. Use it when brand colors or style guidelines, visual formatting, or company design standards apply.",{"slug":9,"name":10,"logoUrl":11,"githubOrg":12},[2677,2678,2679],{"name":2625,"slug":2626,"type":17},{"name":2544,"slug":2545,"type":17},{"name":2680,"slug":2681,"type":17},"Typography","typography","2026-04-06T17:56:05.042852",{"slug":2684,"name":2684,"fn":2685,"description":2686,"org":2687,"tags":2688,"stars":2668,"repoUrl":2669,"updatedAt":2694},"canvas-design","create posters and visual art as PNG or PDF","Create beautiful visual art in .png and .pdf documents using design philosophy. You should use this skill when the user asks to create a poster, piece of art, design, or other static piece. Create original visual designs, never copying existing artists' work to avoid copyright violations.",{"slug":9,"name":10,"logoUrl":11,"githubOrg":12},[2689,2690,2691],{"name":2659,"slug":2660,"type":17},{"name":2544,"slug":2545,"type":17},{"name":2692,"slug":2693,"type":17},"PDF","pdf","2026-04-06T17:56:03.794732",{"slug":2696,"name":2696,"fn":2697,"description":2698,"org":2699,"tags":2700,"stars":2668,"repoUrl":2669,"updatedAt":2713},"claude-api","build apps with the Claude API","Reference for the Claude API \u002F Anthropic SDK — model ids, pricing, params, streaming, tool use, MCP, agents, caching, token counting, model migration.\nTRIGGER — read BEFORE opening the target file; don't skip because it \"looks like a one-liner\" — whenever: the prompt names Claude\u002FAnthropic in any form (Claude, Anthropic, Fable, Opus, Sonnet, Haiku, `anthropic`, `@anthropic-ai`, `claude-*`, `us.anthropic.*`, `[1m]`); the user asks about an LLM (pricing\u002Fmodel choice\u002Flimits\u002Fcaching) — never answer from memory; OR the task is LLM-shaped with provider unstated (agent\u002FMCP\u002Ftool-definition\u002Fmulti-agent\u002FRAG\u002FLLM-judge\u002Fcomputer-use; generate\u002Fsummarize\u002Fextract\u002Fclassify\u002Frewrite\u002Fconverse over NL; debugging refusals\u002Fcutoffs\u002Fstreaming\u002Ftool-calls\u002Ftokens).\nSKIP only when another provider is being worked on (overrides all triggers): OpenAI\u002FGPT\u002FGemini\u002FLlama\u002FMistral\u002FCohere\u002FOllama named in the query; OR `grep -rE 'openai|langchain_openai|google.generativeai|genai|mistralai|cohere|ollama'` over the project hits (run this grep FIRST if no provider named — don't Read the file).",{"slug":9,"name":10,"logoUrl":11,"githubOrg":12},[2701,2704,2705,2708,2710],{"name":2702,"slug":2703,"type":17},"Agents","agents",{"name":10,"slug":9,"type":17},{"name":2706,"slug":2707,"type":17},"Anthropic SDK","anthropic-sdk",{"name":2709,"slug":2696,"type":17},"Claude API",{"name":2711,"slug":2712,"type":17},"LLM","llm","2026-07-28T05:36:08.213335",{"slug":2715,"name":2715,"fn":2716,"description":2717,"org":2718,"tags":2719,"stars":2668,"repoUrl":2669,"updatedAt":2724},"doc-coauthoring","co-author documentation and technical specs","Guide users through a structured workflow for co-authoring documentation. Use when user wants to write documentation, proposals, technical specs, decision docs, or similar structured content. This workflow helps users efficiently transfer context, refine content through iteration, and verify the doc works for readers. Trigger when user mentions writing docs, creating proposals, drafting specs, or similar documentation tasks.",{"slug":9,"name":10,"logoUrl":11,"githubOrg":12},[2720,2721],{"name":2593,"slug":2594,"type":17},{"name":2722,"slug":2723,"type":17},"Technical Writing","technical-writing","2026-04-06T17:56:14.18897",{"slug":2726,"name":2726,"fn":2727,"description":2728,"org":2729,"tags":2730,"stars":2668,"repoUrl":2669,"updatedAt":2745},"docx","create and edit Word documents","Use this skill whenever the user wants to create, read, edit, or manipulate Word documents (.docx files) or Word templates (.dotx files). Triggers include: any mention of 'Word doc', 'word document', '.docx', '.dotx', or requests to produce professional documents with formatting like tables of contents, headings, page numbers, or letterheads. Also use when extracting or reorganizing content from .docx or .dotx files, inserting or replacing images in documents, performing find-and-replace in Word files, working with tracked changes or comments, or converting content into a polished Word document. If the user asks for a 'report', 'memo', 'letter', 'template', or similar deliverable as a Word or .docx file, use this skill. Do NOT use for PDFs, spreadsheets, Google Docs, or general coding tasks unrelated to document generation.",{"slug":9,"name":10,"logoUrl":11,"githubOrg":12},[2731,2734,2736,2739,2742],{"name":2732,"slug":2733,"type":17},"Documents","documents",{"name":2735,"slug":2726,"type":17},"DOCX",{"name":2737,"slug":2738,"type":17},"Office","office",{"name":2740,"slug":2741,"type":17},"Templates","templates",{"name":2743,"slug":2744,"type":17},"Word","word","2026-07-18T05:16:23.136271",{"slug":2747,"name":2747,"fn":2748,"description":2749,"org":2750,"tags":2751,"stars":2668,"repoUrl":2669,"updatedAt":2765},"frontend-design","design production-grade frontend interfaces","Guidance for distinctive, intentional visual design when building new UI or reshaping an existing one. Helps with aesthetic direction, typography, and making choices that don't read as templated defaults.",{"slug":9,"name":10,"logoUrl":11,"githubOrg":12},[2752,2753,2756,2759,2762],{"name":2544,"slug":2545,"type":17},{"name":2754,"slug":2755,"type":17},"Frontend","frontend",{"name":2757,"slug":2758,"type":17},"React","react",{"name":2760,"slug":2761,"type":17},"Tailwind CSS","tailwind-css",{"name":2763,"slug":2764,"type":17},"UI Components","ui-components","2026-04-06T17:56:16.723469",{"slug":2767,"name":2767,"fn":2768,"description":2769,"org":2770,"tags":2771,"stars":2668,"repoUrl":2669,"updatedAt":2775},"internal-comms","write internal company communications","A set of resources to help me write all kinds of internal communications, using the formats that my company likes to use. Claude should use this skill whenever asked to write some sort of internal communications (status reports, leadership updates, 3P updates, company newsletters, FAQs, incident reports, project updates, etc.).",{"slug":9,"name":10,"logoUrl":11,"githubOrg":12},[2772,2773,2774],{"name":2642,"slug":2643,"type":17},{"name":2740,"slug":2741,"type":17},{"name":2631,"slug":2632,"type":17},"2026-04-06T17:56:20.695522",{"slug":2777,"name":2777,"fn":2778,"description":2779,"org":2780,"tags":2781,"stars":2668,"repoUrl":2669,"updatedAt":2790},"mcp-builder","build MCP servers","Guide for creating high-quality MCP (Model Context Protocol) servers that enable LLMs to interact with external services through well-designed tools. Use when building MCP servers to integrate external APIs or services, whether in Python (FastMCP) or Node\u002FTypeScript (MCP SDK).",{"slug":9,"name":10,"logoUrl":11,"githubOrg":12},[2782,2783,2786,2787],{"name":2702,"slug":2703,"type":17},{"name":2784,"slug":2785,"type":17},"API Development","api-development",{"name":2711,"slug":2712,"type":17},{"name":2788,"slug":2789,"type":17},"MCP","mcp","2026-04-06T17:56:10.357665",{"slug":2693,"name":2693,"fn":2792,"description":2793,"org":2794,"tags":2795,"stars":2668,"repoUrl":2669,"updatedAt":2798},"read edit and manipulate PDF files","Use this skill whenever the user wants to do anything with PDF files. This includes reading or extracting text\u002Ftables from PDFs, combining or merging multiple PDFs into one, splitting PDFs apart, rotating pages, adding watermarks, creating new PDFs, filling PDF forms, encrypting\u002Fdecrypting PDFs, extracting images, and OCR on scanned PDFs to make them searchable. If the user mentions a .pdf file or asks to produce one, use this skill.",{"slug":9,"name":10,"logoUrl":11,"githubOrg":12},[2796,2797],{"name":2732,"slug":2733,"type":17},{"name":2692,"slug":2693,"type":17},"2026-04-06T17:56:02.483316",{"slug":2800,"name":2800,"fn":2801,"description":2802,"org":2803,"tags":2804,"stars":2668,"repoUrl":2669,"updatedAt":2811},"pptx","create and edit PowerPoint presentations","Use this skill any time a .pptx or .potx file is involved in any way — as input, output, or both. This includes: creating slide decks, pitch decks, or presentations; reading, parsing, or extracting text from any .pptx or .potx file (even if the extracted content will be used elsewhere, like in an email or summary); editing, modifying, or updating existing presentations; combining or splitting slide files; working with templates (.potx), layouts, speaker notes, or comments. Trigger whenever the user mentions \"deck,\" \"slides,\" \"presentation,\" or references a .pptx or .potx filename, regardless of what they plan to do with the content afterward. If a .pptx or .potx file needs to be opened, created, or touched, use this skill.",{"slug":9,"name":10,"logoUrl":11,"githubOrg":12},[2805,2808],{"name":2806,"slug":2807,"type":17},"PowerPoint","powerpoint",{"name":2809,"slug":2810,"type":17},"Presentations","presentations","2026-07-18T05:16:24.1471",{"slug":2813,"name":2813,"fn":2814,"description":2815,"org":2816,"tags":2817,"stars":2668,"repoUrl":2669,"updatedAt":2827},"skill-creator","create and optimize agent skills","Create new skills, modify and improve existing skills, and measure skill performance. Use when users want to create a skill from scratch, edit, or optimize an existing skill, run evals to test a skill, benchmark skill performance with variance analysis, or optimize a skill's description for better triggering accuracy.",{"slug":9,"name":10,"logoUrl":11,"githubOrg":12},[2818,2819,2820,2823,2826],{"name":2702,"slug":2703,"type":17},{"name":2593,"slug":2594,"type":17},{"name":2821,"slug":2822,"type":17},"Evals","evals",{"name":2824,"slug":2825,"type":17},"Performance","performance",{"name":2722,"slug":2723,"type":17},"2026-04-19T06:45:40.804",490]