{"id":29835202,"url":"https://github.com/livekit/client-sdk-esp32","last_synced_at":"2026-02-11T06:03:50.331Z","repository":{"id":305275798,"uuid":"983191564","full_name":"livekit/client-sdk-esp32","owner":"livekit","description":"LiveKit Client SDK for ESP32 series chips. Easily enable real-time audio, video, and data for embedded projects.","archived":false,"fork":false,"pushed_at":"2026-02-10T22:14:23.000Z","size":5441,"stargazers_count":94,"open_issues_count":13,"forks_count":24,"subscribers_count":12,"default_branch":"main","last_synced_at":"2026-02-11T01:33:14.339Z","etag":null,"topics":["agents","c","embedded","esp32","real-time","webrtc"],"latest_commit_sha":null,"homepage":"https://docs.livekit.io/","language":"C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/livekit.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2025-05-14T02:50:28.000Z","updated_at":"2026-02-10T22:14:23.000Z","dependencies_parsed_at":"2025-07-19T10:33:52.733Z","dependency_job_id":"ab6e26ea-4aed-471b-841a-dc225c089964","html_url":"https://github.com/livekit/client-sdk-esp32","commit_stats":null,"previous_names":["livekit/client-sdk-esp32"],"tags_count":8,"template":false,"template_full_name":null,"purl":"pkg:github/livekit/client-sdk-esp32","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/livekit%2Fclient-sdk-esp32","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/livekit%2Fclient-sdk-esp32/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/livekit%2Fclient-sdk-esp32/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/livekit%2Fclient-sdk-esp32/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/livekit","download_url":"https://codeload.github.com/livekit/client-sdk-esp32/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/livekit%2Fclient-sdk-esp32/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29327892,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-11T03:52:29.695Z","status":"ssl_error","status_checked_at":"2026-02-11T03:52:23.094Z","response_time":97,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["agents","c","embedded","esp32","real-time","webrtc"],"created_at":"2025-07-29T12:17:27.792Z","updated_at":"2026-02-11T06:03:50.322Z","avatar_url":"https://github.com/livekit.png","language":"C","funding_links":[],"categories":["Protocols"],"sub_categories":["Network protocols"],"readme":"\u003c!--BEGIN_BANNER_IMAGE--\u003e\n\n\u003cpicture\u003e\n  \u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"/.github/banner_dark.png\"\u003e\n  \u003csource media=\"(prefers-color-scheme: light)\" srcset=\"/.github/banner_light.png\"\u003e\n  \u003cimg style=\"width:100%;\" alt=\"The LiveKit icon, the name of the repository and some sample code in the background.\" src=\"https://raw.githubusercontent.com/livekit/client-sdk-esp32/main/.github/banner_light.png\"\u003e\n\u003c/picture\u003e\n\n\u003c!--END_BANNER_IMAGE--\u003e\n\n# ESP32 SDK for LiveKit\n\n[![API Reference](https://img.shields.io/badge/API_Reference-blue)](https://livekit.github.io/client-sdk-esp32/)\n[![Component Registry](https://components.espressif.com/components/livekit/livekit/badge.svg)](https://components.espressif.com/components/livekit/livekit)\n[![CI Status](https://img.shields.io/github/actions/workflow/status/livekit/client-sdk-esp32/ci.yml?label=CI)](https://github.com/livekit/client-sdk-esp32/actions/workflows/ci.yml)\n\nUse this SDK to add realtime video, audio and data features to your ESP32 projects. By connecting to [LiveKit](https://livekit.io/) Cloud or a self-hosted server, you can quickly build applications such as multi-modal AI, live streaming, or video calls with minimal setup.\n\n\u003e [!IMPORTANT]\n\u003e This SDK is currently in Developer Preview mode and not ready for production use.\n\u003e There may be bugs and APIs are subject to change during this period.\n\n## Features\n\n- **Supported chips**: ESP32-S3 and ESP32-P4\n- **Bidirectional audio**: Opus encoding, acoustic echo cancellation (AEC)\n- **Video publishing**: H.264 encoding, subscribing coming soon\n- **AI Agents**: interact with agents in the cloud built with [LiveKit Agents](https://docs.livekit.io/agents/)\n- **Real-time data**: data packets, remote method calls (RPC)\n\n## Getting Started\n\nBefore you begin, please ensure you have ESP IDF v5.4 or higher installed on your system (see installation guide for [macOS/Linux](https://docs.espressif.com/projects/esp-idf/en/latest/esp32s3/get-started/linux-macos-setup.html) or [Windows](https://docs.espressif.com/projects/esp-idf/en/latest/esp32s3/get-started/windows-setup.html)).\n\n### Examples\n\nOne of the best ways to get started with LiveKit is by reviewing the [examples](./components/livekit/examples/) and choosing one as a starting point for your project:\n\n- [**Voice AI Agent**](./components/livekit/examples/voice_agent/README.md): Conversational AI voice agent that interacts with hardware based on user requests.\n- [**Minimal**](./components/livekit/examples/minimal/README.md): Basic example of connecting to a LiveKit room with bidirectional audio.\n- [**Minimal Video**](./components/livekit/examples/minimal_video/README.md): Equivalent to the minimal example with video publishing.\n\nOnce you have chosen an example to be your starting point, create a fresh project from it locally using the following command:\n\n```sh\nidf.py create-project-from-example \"livekit/livekit=0.3.5:\u003cexample\u003e\"\n```\n\nSubstitute *\\\u003cexample\\\u003e* for the example's directory name.\n\n### Installation\n\nIf you would like to add LiveKit to your existing application, add it as a dependency using IDF:\n\n```sh\nidf.py add-dependency \"livekit/livekit=0.3.5\"\n```\n\n\u003e [!IMPORTANT]\n\u003e Be sure to pin to a specific version as shown in the command above, as subsequent v0.x.x releases may have breaking changes.\n\n## API Overview\n\nWith LiveKit added as a dependency to your application, include the LiveKit header and invoke\n`livekit_system_init` early in your application's main function:\n\n```c\n#include \"livekit.h\"\n\nvoid app_main(void)\n{\n    livekit_system_init();\n    // Your application code...\n}\n```\n\n### Configure media pipeline\n\nLiveKit for ESP32 puts your application in control of the media pipeline; your application configures a capturer and/or renderer and provides their handles when creating a room.\n\n#### Capturer: input from camera/microphone\n\n- Required for rooms which will publish media tracks\n- Created using the Espressif [*esp_capture*](https://components.espressif.com/components/espressif/esp_capture/) component\n- Capture audio capture over I2S, video from MIPI CSI or DVI cameras\n- After configuration, you will provide the `esp_capture_handle_t` when creating a room\n\n#### Renderer: output to display/speaker\n\n- Required for rooms which will subscribe to media tracks\n- Created using the Espressif [*av_render*](https://components.espressif.com/components/tempotian/av_render/) component\n- Playback audio over I2S, video on LCD displays supported by *esp_lcd*\n- After configuration, you will provide the `av_render_handle_t` when creating a room\n\n### Create room\n\nCreate a room object, specifying your capturer, renderer, and handlers for room events:\n\n```c\nstatic livekit_room_handle_t room_handle = NULL;\n\nlivekit_room_options_t room_options = {\n    .publish = {\n        .kind = LIVEKIT_MEDIA_TYPE_AUDIO,\n        .audio_encode = {\n            .codec = LIVEKIT_AUDIO_CODEC_OPUS,\n            .sample_rate = 16000,\n            .channel_count = 1\n        },\n        .capturer = my_capturer\n    },\n    .subscribe = {\n        .kind = LIVEKIT_MEDIA_TYPE_AUDIO,\n        .renderer = my_renderer\n    },\n    .on_state_changed = on_state_changed,\n    .on_participant_info = on_participant_info\n};\nif (livekit_room_create(\u0026room_handle, \u0026room_options) != LIVEKIT_ERR_NONE) {\n    ESP_LOGE(TAG, \"Failed to create room object\");\n}\n```\n\nThis example does not show all available fields in room options—please refer to the [API reference](https://livekit.github.io/client-sdk-esp32/group__Lifecycle.html#structlivekit__room__options__t)\nfor an extensive list.\n\nTypically, you will want to create the room object early in your application's lifecycle, and connect/disconnect as necessary based on user interaction.\n\n### Connect room\n\nWith a room room handle, connect by providing a server URL and token:\n\n```c\nlivekit_room_connect(room_handle, \"\u003cyour server URL\u003e\", \"\u003ctoken\u003e\");\n```\n\nThe connect method is asynchronous; use your `on_state_changed` handler provided in room options\nto get notified when the connection is established or fails (e.g. due to an expired token, etc.).\n\nOnce connected, media exchange will begin:\n\n1. If a capturer was provided, video and/or audio tracks will be published.\n2. If a renderer was provided, the first video and/or audio tracks in the room will be subscribed to.\n\n### Real-time data\n\nIn addition to real-time audio and video, LiveKit offers several methods for exchange real-time data between participants in a room.\n\n#### Remote method call (RPC)\n\nDefine an RPC handler:\n\n```c\nstatic void get_cpu_temp(const livekit_rpc_invocation_t* invocation, void* ctx)\n{\n    float temp = board_get_temp();\n    char temp_string[16];\n    snprintf(temp_string, sizeof(temp_string), \"%.2f\", temp);\n    livekit_rpc_return_ok(temp_string);\n}\n```\n\nRegister the handler on the room to allow it to be invoked by remote participants:\n\n```c\nlivekit_room_rpc_register(room_handle, \"get_cpu_temp\", get_cpu_temp);\n```\n\n\u003e [!TIP]\n\u003e In the [*voice_agent*](./components/livekit/examples/voice_agent/) example, RPC is used to allow an AI agent to interact\n\u003e with hardware by defining a series of methods for the agent to invoke.\n\n#### User packets\n\nPublish a user packet containing a raw data payload under a specific topic:\n\n```c\nconst char* command = \"G5 I0 J3 P0 Q-3 X2 Y3\";\n\nlivekit_payload_t payload = {\n     .bytes = (uint8_t*)command,\n     .size = strlen(command)\n};\nlivekit_data_publish_options_t options = {\n    .payload = \u0026payload,\n    .topic = \"gcode\",\n    .lossy = false,\n    .destination_identities = (char*[]){ \"printer-1\" },\n    .destination_identities_count = 1\n};\nlivekit_room_publish_data(room_handle, \u0026options);\n```\n\n## Documentation\n\nPlease refer to the [LiveKit Docs](https://docs.livekit.io/home/) for an introduction to the platform and its features. For more detail about the APIs available in this SDK, please refer to the [API Reference](https://livekit.github.io/client-sdk-esp32/).\n\n## Known Issues\n\n- In some cases, a remote participant leaving the room can lead to a disconnect.\n\n## Getting Help \u0026 Contributing\n\nWe invite you to join our [developer community](https://community.livekit.io/c/robotics) to ask questions, suggest improvements, or discuss how you can best contribute to this SDK.\n\n\u003c!--BEGIN_REPO_NAV--\u003e\n\u003cbr/\u003e\u003ctable\u003e\n\u003cthead\u003e\u003ctr\u003e\u003cth colspan=\"2\"\u003eLiveKit Ecosystem\u003c/th\u003e\u003c/tr\u003e\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\u003ctd\u003eLiveKit SDKs\u003c/td\u003e\u003ctd\u003e\u003ca href=\"https://github.com/livekit/client-sdk-js\"\u003eBrowser\u003c/a\u003e · \u003ca href=\"https://github.com/livekit/client-sdk-swift\"\u003eiOS/macOS/visionOS\u003c/a\u003e · \u003ca href=\"https://github.com/livekit/client-sdk-android\"\u003eAndroid\u003c/a\u003e · \u003ca href=\"https://github.com/livekit/client-sdk-flutter\"\u003eFlutter\u003c/a\u003e · \u003ca href=\"https://github.com/livekit/client-sdk-react-native\"\u003eReact Native\u003c/a\u003e · \u003ca href=\"https://github.com/livekit/rust-sdks\"\u003eRust\u003c/a\u003e · \u003ca href=\"https://github.com/livekit/node-sdks\"\u003eNode.js\u003c/a\u003e · \u003ca href=\"https://github.com/livekit/python-sdks\"\u003ePython\u003c/a\u003e · \u003ca href=\"https://github.com/livekit/client-sdk-unity\"\u003eUnity\u003c/a\u003e · \u003ca href=\"https://github.com/livekit/client-sdk-unity-web\"\u003eUnity (WebGL)\u003c/a\u003e · \u003cb\u003eESP32\u003c/b\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003eServer APIs\u003c/td\u003e\u003ctd\u003e\u003ca href=\"https://github.com/livekit/node-sdks\"\u003eNode.js\u003c/a\u003e · \u003ca href=\"https://github.com/livekit/server-sdk-go\"\u003eGolang\u003c/a\u003e · \u003ca href=\"https://github.com/livekit/server-sdk-ruby\"\u003eRuby\u003c/a\u003e · \u003ca href=\"https://github.com/livekit/server-sdk-kotlin\"\u003eJava/Kotlin\u003c/a\u003e · \u003ca href=\"https://github.com/livekit/python-sdks\"\u003ePython\u003c/a\u003e · \u003ca href=\"https://github.com/livekit/rust-sdks\"\u003eRust\u003c/a\u003e · \u003ca href=\"https://github.com/agence104/livekit-server-sdk-php\"\u003ePHP (community)\u003c/a\u003e · \u003ca href=\"https://github.com/pabloFuente/livekit-server-sdk-dotnet\"\u003e.NET (community)\u003c/a\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003eUI Components\u003c/td\u003e\u003ctd\u003e\u003ca href=\"https://github.com/livekit/components-js\"\u003eReact\u003c/a\u003e · \u003ca href=\"https://github.com/livekit/components-android\"\u003eAndroid Compose\u003c/a\u003e · \u003ca href=\"https://github.com/livekit/components-swift\"\u003eSwiftUI\u003c/a\u003e · \u003ca href=\"https://github.com/livekit/components-flutter\"\u003eFlutter\u003c/a\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003eAgents Frameworks\u003c/td\u003e\u003ctd\u003e\u003ca href=\"https://github.com/livekit/agents\"\u003ePython\u003c/a\u003e · \u003ca href=\"https://github.com/livekit/agents-js\"\u003eNode.js\u003c/a\u003e · \u003ca href=\"https://github.com/livekit/agent-playground\"\u003ePlayground\u003c/a\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003eServices\u003c/td\u003e\u003ctd\u003e\u003ca href=\"https://github.com/livekit/livekit\"\u003eLiveKit server\u003c/a\u003e · \u003ca href=\"https://github.com/livekit/egress\"\u003eEgress\u003c/a\u003e · \u003ca href=\"https://github.com/livekit/ingress\"\u003eIngress\u003c/a\u003e · \u003ca href=\"https://github.com/livekit/sip\"\u003eSIP\u003c/a\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003eResources\u003c/td\u003e\u003ctd\u003e\u003ca href=\"https://docs.livekit.io\"\u003eDocs\u003c/a\u003e · \u003ca href=\"https://github.com/livekit-examples\"\u003eExample apps\u003c/a\u003e · \u003ca href=\"https://livekit.io/cloud\"\u003eCloud\u003c/a\u003e · \u003ca href=\"https://docs.livekit.io/home/self-hosting/deployment\"\u003eSelf-hosting\u003c/a\u003e · \u003ca href=\"https://github.com/livekit/livekit-cli\"\u003eCLI\u003c/a\u003e\u003c/td\u003e\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003c!--END_REPO_NAV--\u003e","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flivekit%2Fclient-sdk-esp32","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flivekit%2Fclient-sdk-esp32","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flivekit%2Fclient-sdk-esp32/lists"}