{"id":21667692,"url":"https://github.com/georgik/esp-idf-component-raylib","last_synced_at":"2026-04-01T19:32:59.364Z","repository":{"id":264527187,"uuid":"893587582","full_name":"georgik/esp-idf-component-raylib","owner":"georgik","description":"ESP-IDF Component Wrapper for Raylib","archived":false,"fork":false,"pushed_at":"2026-03-18T15:28:21.000Z","size":140,"stargazers_count":17,"open_issues_count":1,"forks_count":3,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-03-19T05:46:01.547Z","etag":null,"topics":["embedded","esp32","esp32p4","esp32s3","graphics","mipi-dsi","raylib","spi"],"latest_commit_sha":null,"homepage":"https://components.espressif.com/components/georgik/raylib/","language":"C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/georgik.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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":null,"dco":null,"cla":null}},"created_at":"2024-11-24T20:22:14.000Z","updated_at":"2026-03-18T08:53:32.000Z","dependencies_parsed_at":"2025-03-20T07:16:10.840Z","dependency_job_id":"22ba59b8-5c94-4f8a-9fcb-0f613b1720e9","html_url":"https://github.com/georgik/esp-idf-component-raylib","commit_stats":null,"previous_names":["georgik/esp-idf-component-raylib"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/georgik/esp-idf-component-raylib","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/georgik%2Fesp-idf-component-raylib","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/georgik%2Fesp-idf-component-raylib/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/georgik%2Fesp-idf-component-raylib/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/georgik%2Fesp-idf-component-raylib/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/georgik","download_url":"https://codeload.github.com/georgik/esp-idf-component-raylib/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/georgik%2Fesp-idf-component-raylib/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31291147,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-01T13:12:26.723Z","status":"ssl_error","status_checked_at":"2026-04-01T13:12:25.102Z","response_time":53,"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":["embedded","esp32","esp32p4","esp32s3","graphics","mipi-dsi","raylib","spi"],"created_at":"2024-11-25T11:44:56.151Z","updated_at":"2026-04-01T19:32:59.355Z","avatar_url":"https://github.com/georgik.png","language":"C","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ESP-IDF Component: Raylib\n\nESP-IDF wrapper component for [raylib](https://www.raylib.com/) - a simple and easy-to-use library to enjoy videogames programming.\n\nThis component enables running raylib on ESP32 microcontrollers using the **CPU-based software renderer** (no GPU required), making it possible to create graphics applications on embedded devices with LCD displays.\n\n## Architecture: Port Layer\n\nThis implementation uses a **board-agnostic port layer** (`esp_raylib_port`) that separates display hardware management from the raylib rendering engine:\n\n- **esp_raylib_port**: Stable API for display initialization and framebuffer operations\n- **Inversion of control**: Application creates display handles and passes them to the port\n- **Deterministic builds**: Board selection via Kconfig, no dynamic component injection\n- **Multi-board support**: Switch boards by changing `SDKCONFIG_DEFAULTS`\n\n## Try it Online\n\nTest Raylib on ESP32 directly in your browser using Wokwi simulation (no hardware or build required):\n\n\n[![ESP32-S3-BOX-3 Green Screen](docs/img/raylib-hello-esp-box-3-green.webp)](https://wokwi.com/experimental/viewer?diagram=https%3A%2F%2Fraw.githubusercontent.com%2Fgeorgik%2Fesp-idf-component-raylib%2Fmain%2Fraylib%2Fexamples%2Fhello%2Fwokwi%2Fesp-box-3%2Fdiagram.json\u0026firmware=https%3A%2F%2Fgithub.com%2Fgeorgik%2Fesp-idf-component-raylib%2Freleases%2Fdownload%2Fv6.0.0%2Fhello-esp-box-3.bin)\n\n[![ESP32-S3-BOX-3 Hello World](docs/img/raylib-hello-esp-box-3-hello.webp)](https://wokwi.com/experimental/viewer?diagram=https%3A%2F%2Fraw.githubusercontent.com%2Fgeorgik%2Fesp-idf-component-raylib%2Fmain%2Fraylib%2Fexamples%2Fhello%2Fwokwi%2Fesp-box-3%2Fdiagram.json\u0026firmware=https%3A%2F%2Fgithub.com%2Fgeorgik%2Fesp-idf-component-raylib%2Freleases%2Fdownload%2Fv6.0.0%2Fhello-esp-box-3.bin)\n\n**[Run ESP32-S3-BOX-3 (320x240)](https://wokwi.com/experimental/viewer?diagram=https%3A%2F%2Fraw.githubusercontent.com%2Fgeorgik%2Fesp-idf-component-raylib%2Fmain%2Fraylib%2Fexamples%2Fhello%2Fwokwi%2Fesp-box-3%2Fdiagram.json\u0026firmware=https%3A%2F%2Fgithub.com%2Fgeorgik%2Fesp-idf-component-raylib%2Freleases%2Fdownload%2Fv6.0.0%2Fhello-esp-box-3.bin)**\n\n\n## Flash Pre-built Binaries\n\nNo build required! Flash pre-built binaries directly from your browser using ESP Launchpad:\n\n[![Try it with ESP Launchpad](https://espressif.github.io/esp-launchpad/assets/try_with_launchpad.png)](https://georgik.github.io/esp-idf-component-raylib/?flashConfigURL=https://georgik.github.io/esp-idf-component-raylib/config/config.toml)\n\n**Supported boards:**\n- ESP32-S3-BOX-3\n- M5Stack Core2\n\n**Requirements:**\n- Chrome or Edge browser (WebSerial support required)\n- USB cable connected to your board\n\n## For Developers of ESP-IDF Component\n\n### Quick Start for Development\n\nClone the repository and build in-place (no publishing required):\n\n```bash\n# Clone the repository\ngit clone --recurse-submodules https://github.com/georgik/esp-idf-component-raylib.git\ncd esp-idf-component-raylib\n\n# Navigate to the example\ncd raylib/examples/hello\n\n# Set your target chip\nidf.py set-target esp32s3\n\n# Build the example (uses local components automatically)\nidf.py build\n\n# Flash to your board\nidf.py -p /dev/ttyUSB0 flash monitor\n```\n\n**How it works:** The example's `idf_component.yml` uses `override_path` to reference the local `raylib` and `esp_raylib_port` components. Changes you make to the component source code are immediately reflected when you rebuild - no need to publish or create separate projects.\n\n### Development Workflow\n\n1. **Make changes** to component source code in `raylib/` or `esp_raylib_port/`\n2. **Rebuild** the example: `cd raylib/examples/hello \u0026\u0026 idf.py build`\n3. **Test** on hardware or in Wokwi simulator\n4. **Iterate** - changes take effect immediately\n\n### Board-Specific Testing\n\nTest with different board configurations:\n\n```bash\ncd raylib/examples/hello\n\n# ESP-BOX-3\ncp sdkconfig.defaults.esp-box-3 sdkconfig.defaults\nidf.py set-target esp32s3\nidf.py build\n\n# ESP32-P4 (Chip Revision 3.0+)\ncp sdkconfig.defaults.esp32_p4_function_ev_board sdkconfig.defaults\nidf.py set-target esp32p4\nidf.py build\n\n# ESP32-P4 (Chip Revision 1.0 - older boards)\ncp sdkconfig.defaults.esp32_p4_function_ev_board_rev-1.0 sdkconfig.defaults\nidf.py set-target esp32p4\nidf.py build\n\n# M5Stack Core2\ncp sdkconfig.defaults.m5stack_core2 sdkconfig.defaults\nidf.py set-target esp32\nidf.py build\n```\n\n**Note - ESP32-P4 Chip Revisions:**\nThe ESP32-P4 Function EV Board is available with different chip revisions:\n- **Rev 3.0+**: Use `sdkconfig.defaults.esp32_p4_function_ev_board` (200MHz Octal PSRAM)\n- **Rev 1.0**: Use `sdkconfig.defaults.esp32_p4_function_ev_board_rev-1.0` (compatible with older silicon)\n\nTo check your chip revision:\n```bash\nesptool.py --port /dev/ttyUSB0 chip_id\n```\nLook for \"Revision: X.Y\" in the output.\n\n### Clean Build\n\nTo ensure a clean build after making changes:\n\n```bash\ncd raylib/examples/hello\nidf.py fullclean\nidf.py build\n```\n\n### Verifying Component Dependencies\n\nCheck that components are resolved from local paths:\n\n```bash\ncd raylib/examples/hello\nidf.py reconfigure 2\u003e\u00261 | grep -i \"component\\|dependency\"\n```\n\nExpected output should show paths like:\n```\n/Users/georgik/projects/esp-idf-component-raylib/esp_raylib_port\n/Users/georgik/projects/esp-idf-component-raylib/raylib\n```\n\n### CI/CD Testing\n\nFor automated testing across multiple configurations, use `idf-build-apps`:\n\n```bash\npip install idf-build-apps\nidf-build-apps build raylib/examples\n```\n\n## For Maintainers\n\n### Upgrading Raylib Submodule\n\nThis component uses the official raylib library as a Git submodule. To upgrade:\n\n```bash\n# Navigate to the raylib submodule\ncd raylib/raylib\n\n# Fetch latest changes\ngit fetch origin\n\n# Check available updates\ngit log HEAD..origin/master --oneline\n\n# Choose upgrade strategy:\n# Option 1: Latest master (bleeding edge)\ngit checkout origin/master\n\n# Option 2: Specific release tag (recommended)\ngit checkout 6.0\n\n# Option 3: Specific commit\ngit checkout \u003ccommit-hash\u003e\n\n# Return to main repo and stage the update\ncd ../..\ngit add raylib/raylib\n\n# Update version in raylib/idf_component.yml\n# (e.g., 5.6.0~0 -\u003e 6.0.0~0)\n```\n\n**Post-Upgrade Checklist:**\n\n1. **Update component wrapper code:**\n   - [ ] Remove `utils.c` from `raylib/CMakeLists.txt` `SRCS` (removed in 6.0)\n   - [ ] Update compile flag: `GRAPHICS_API_OPENGL_11_SOFTWARE` → `GRAPHICS_API_OPENGL_SOFTWARE`\n   - [ ] Add `-Wno-unused-label` to compile options (software renderer has unused labels)\n   - [ ] Add `SW_FRAMEBUFFER_COLOR_TYPE=R5G6B5` to compile definitions\n\n2. **Update platform code:**\n   - [ ] Fix include order in `raylib/src/platforms/rcore_esp_idf.c`: `config.h` must be before `rlgl.h`\n   - [ ] Add render dimensions initialization in `raylib/raylib/src/rcore.c` (before `rlglInit()` call)\n   - [ ] Restore `swGetColorBuffer()` in `raylib/raylib/src/external/rlsw.h` (function declaration + implementation)\n   - [ ] Add vertical flip in `SwapScreenBuffer()` for LCD coordinate system\n\n3. **Update config.h:**\n   - [ ] Ensure `SW_FRAMEBUFFER_COLOR_TYPE R5G6B5` is defined\n   - [ ] Ensure `SW_COLOR_BUFFER_BITS=16` is set\n   - [ ] Check for conflicts with new raylib headers\n\n4. **Test compilation:**\n   ```bash\n   cd raylib/examples/hello\n   idf.py fullclean\n   idf.py set-target esp32s3\n   idf.py build\n   ```\n\n5. **Test on hardware:**\n   ```bash\n   idf.py -p /dev/ttyUSB0 flash monitor\n   ```\n   Verify:\n   - [ ] Display shows correct colors (RGB565, not RGBA8888)\n   - [ ] Image orientation is correct (not upside down)\n   - [ ] Text is readable\n   - [ ] Animation is smooth\n   - [ ] No memory corruption\n\n6. **Test multiple targets:**\n   - [ ] ESP32-S3 (most common)\n   - [ ] ESP32-P4 (if available)\n   - [ ] ESP32 (baseline)\n\n7. **Commit changes:**\n   ```bash\n   git add raylib/CMakeLists.txt raylib/include/config.h raylib/src/platforms/ raylib/raylib/src/rcore.c raylib/raylib/src/external/rlsw.h\n   git commit -m \"Upgrade raylib to 6.0.0\"\n   ```\n\n**Common Issues and Fixes:**\n\n- **Display shows wrong colors/purple tint**:\n  - **Cause**: Software renderer using RGBA8888 instead of RGB565\n  - **Fix**: Add `SW_FRAMEBUFFER_COLOR_TYPE=R5G6B5` to compile definitions AND ensure config.h is included before rlgl.h\n\n- **Display shows nothing/green screen only**:\n  - **Cause**: `swGetColorBuffer()` returning NULL or 0×0 dimensions\n  - **Fix**: Initialize `CORE.Window.render.width/height` in `rcore.c` before `rlglInit()` call\n\n- **Display is upside down**:\n  - **Cause**: LCD coordinate system origin differs from software renderer\n  - **Fix**: Add vertical flip in `SwapScreenBuffer()` when copying framebuffer\n\n- **Build error: undefined reference to swGetColorBuffer**:\n  - **Cause**: Function removed in Raylib 6.0\n  - **Fix**: Restore function in rlsw.h (function declaration + implementation)\n\n- **Build error: utils.c not found**:\n  - **Cause**: File removed in Raylib 6.0\n  - **Fix**: Remove from CMakeLists.txt SRCS list\n\n### Migration: Raylib 5.6 to 6.0\n\nVersion 6.0 of raylib introduced several breaking changes that required specific updates to the ESP-IDF wrapper. This section documents the changes made to the wrapper component during the upgrade.\n\n#### Wrapper-Specific Changes\n\nThe ESP-IDF wrapper required the following modifications to work with Raylib 6.0:\n\n**1. Include Order Fix**\n\n**Problem**: The software renderer's internal pixel format was defaulting to RGBA8888 instead of RGB565.\n\n**Root Cause**: `config.h` (which defines `SW_FRAMEBUFFER_COLOR_TYPE`) was included **after** `rlgl.h`. Since `rlgl.h` includes the software renderer (`rlsw.h`), the `#ifndef SW_FRAMEBUFFER_COLOR_TYPE` check in `rlsw.h` evaluated to `true` before the wrapper's configuration could take effect.\n\n**Fix**: Changed include order in `raylib/src/platforms/rcore_esp_idf.c`:\n```c\n// Before:\n#include \"raylib.h\"\n#include \"rlgl.h\"\n#include \"config.h\"  // Too late!\n\n// After:\n#include \"config.h\"   // Must be first\n#include \"raylib.h\"\n#include \"rlgl.h\"\n```\n\n**2. Compile Definition for Pixel Format**\n\n**Problem**: Even with correct include order, the pixel format was still RGBA8888.\n\n**Root Cause**: Header-only macro definitions don't always propagate correctly through complex include chains.\n\n**Fix**: Added `SW_FRAMEBUFFER_COLOR_TYPE=R5G6B5` directly to compile definitions in `raylib/CMakeLists.txt`:\n```cmake\ntarget_compile_definitions(${COMPONENT_TARGET} PUBLIC\n    GRAPHICS_API_OPENGL_SOFTWARE\n    PLATFORM_CUSTOM\n    SW_COLOR_BUFFER_BITS=16\n    SW_DEPTH_BUFFER_BITS=16\n    SW_FRAMEBUFFER_COLOR_TYPE=R5G6B5  # Added this\n)\n```\n\n**3. Restored swGetColorBuffer() Function**\n\n**Problem**: Direct framebuffer access was removed in Raylib 6.0 PR #5655. The replacement `swReadPixels()` function was not working correctly for embedded use (it returns conversion data, not raw framebuffer).\n\n**Solution**: Added `swGetColorBuffer()` back to `raylib/raylib/src/external/rlsw.h`:\n```c\n// Function declaration (after line 672)\nSWAPI void *swGetColorBuffer(int *width, int *height);\n\n// Function implementation (after swReadPixels)\nvoid *swGetColorBuffer(int *width, int *height)\n{\n    if (width) *width = RLSW.colorBuffer-\u003ewidth;\n    if (height) *height = RLSW.colorBuffer-\u003eheight;\n    return RLSW.colorBuffer-\u003epixels;\n}\n```\n\n**Why**: Direct framebuffer access is essential for embedded platforms to avoid expensive format conversions on every frame.\n\n**4. Fixed Render Dimensions Initialization**\n\n**Problem**: Software renderer was initialized with 0×0 dimensions, causing `swGetColorBuffer()` to return zero-sized buffer.\n\n**Root Cause**: In `raylib/raylib/src/rcore.c`, `rlglInit()` is called with `CORE.Window.render.width/height` before these values are set (they're set later in `SetupViewport()`).\n\n**Fix**: Added initialization code in `rcore.c` (lines 686-692) to set render dimensions before `rlglInit()`:\n```c\n// FIX: Initialize render dimensions for embedded platforms\n// On desktop platforms, these are set by the window creation code.\n// On embedded platforms with no window manager, we need to set them\n// before rlglInit() is called.\nif (CORE.Window.render.width == 0 || CORE.Window.render.height == 0)\n{\n    CORE.Window.render.width = CORE.Window.screen.width;\n    CORE.Window.render.height = CORE.Window.screen.height;\n}\n```\n\n**5. Added Vertical Flip for LCD Coordinate System**\n\n**Problem**: Display was upside down compared to expected output.\n\n**Root Cause**: LCD panels typically have coordinate origin (0,0) at bottom-left, while software renderer assumes top-left.\n\n**Fix**: Modified `SwapScreenBuffer()` in `raylib/src/platforms/rcore_esp_idf.c` to flip framebuffer vertically:\n```c\n// Copy with vertical flip for LCD coordinate system\nfor (int row = 0; row \u003c screen_height; row++) {\n    int src_row = screen_height - 1 - row;  // Flip vertically\n    memcpy(framebuffer + (row * screen_width),\n           sw_framebuffer + (src_row * screen_width),\n           screen_width * sizeof(uint16_t));\n}\n```\n\n#### Raylib 6.0 Breaking Changes (Generic)\n\nThese are changes in the upstream raylib library that affected all platforms:\n\n**1. utils.h Module Removed**\n\n- **Change**: The `utils.h` header no longer exists\n- **Impact**: `TRACELOG()` and related functions moved to `config.h`\n- **Fix**: Update includes from `#include \"utils.h\"` to `#include \"config.h\"`\n\n**2. Software Renderer Flag Renamed**\n\n- **Change**: `GRAPHICS_API_OPENGL_11_SOFTWARE` → `GRAPHICS_API_OPENGL_SOFTWARE`\n- **Impact**: Compile flag in `CMakeLists.txt` needed updating\n- **Fix**: Updated in wrapper's `CMakeLists.txt`\n\n**3. Removed Source Files**\n\n- **Change**: `utils.c` removed from raylib 6.0\n- **Impact**: Build failure if still in `SRCS` list\n- **Fix**: Removed from `CMakeLists.txt` `SRCS`\n\n**4. Software Renderer Warnings**\n\n- **Change**: New unused labels in `rlsw.h`\n- **Impact**: Compiler warnings about unused labels\n- **Fix**: Added `-Wno-unused-label` to compile options\n\n#### API Compatibility\n\nMost raylib drawing APIs remain unchanged. Your application code should work without modifications if it uses standard raylib functions:\n- `DrawCircle()`, `DrawRectangle()`, `DrawText()`\n- `ClearBackground()`, `BeginDrawing()`, `EndDrawing()`\n- Texture loading and rendering\n- Input handling\n\n**Performance improvements in 6.0**:\n- Software renderer optimizations\n- Better framebuffer management for embedded targets\n- Improved low-level rendering APIs\n\n#### Testing Checklist\n\nAfter upgrading, verify on actual hardware:\n\n- [ ] Display shows correct colors (not inverted or wrong format)\n- [ ] Image is oriented correctly (not upside down)\n- [ ] Text rendering is readable\n- [ ] Memory usage is within PSRAM limits\n- [ ] Performance is acceptable (frame rate)\n- [ ] All drawing primitives work (shapes, text, textures)\n- [ ] No memory leaks or corruption over time\n\n#### Important Points for Embedded Development\n\n1. **Pixel format configuration must happen at compile time**, not through headers alone\n2. **Direct framebuffer access is critical** for embedded performance - avoid conversion functions\n3. **Coordinate system differences** between software renderer and LCD panels require manual flipping\n4. **Render dimensions must be initialized before `rlglInit()`** on embedded platforms\n5. **Always test on actual hardware** - simulators may not catch pixel format issues\n\nFor more details on upstream changes, see the official raylib changelog: https://github.com/raysan5/raylib/blob/master/CHANGELOG\n\n## Build from Source (For Users)\n\nUsers installing this component from the component registry can build examples with:\n\n```bash\ncd raylib/examples/hello\n\n# Method 1: Explicit SDKCONFIG_DEFAULTS\nidf.py set-target esp32s3\nidf.py -DSDKCONFIG_DEFAULTS=\"sdkconfig.defaults;sdkconfig.defaults.esp-box-3\" reconfigure build flash monitor\n\n# Method 2: Using ESPBrew (recommended for multi-board development)\nespbrew --cli-only .\n```\n\n## Repository Structure\n\n```\nesp-idf-component-raylib/\n├── README.md                  # This file\n├── esp_raylib_port/           # Port layer component (georgik/esp_raylib_port)\n│   ├── idf_component.yml      # Published separately\n│   └── src/                   # Board-agnostic display API\n└── raylib/                    # Main component (georgik/raylib)\n    ├── README.md              # Component documentation\n    ├── CMakeLists.txt         # Component build configuration\n    ├── idf_component.yml      # Component metadata\n    ├── include/               # Wrapper headers\n    ├── src/                   # ESP-IDF platform backend\n    ├── raylib/                # Submodule: official raylib (master)\n    └── examples/\n        └── hello/             # Demo application\n            └── README.md      # Example documentation\n```\n\n## Documentation\n\n- **[Component Documentation](raylib/README.md)** - Architecture, configuration, and API\n- **[Hello Example](raylib/examples/hello/README.md)** - Complete working example with build instructions\n\n## Features\n\n- **Software Rendering** - No OpenGL/GPU required, runs entirely on CPU\n- **RGB565 Framebuffer** - Optimized for ESP LCD panels\n- **PSRAM Support** - Allocates framebuffers in external PSRAM\n- **ESP-BSP Integration** - Works with esp-bsp noglib components\n- **2D Graphics** - Shapes, textures, text rendering, sprites\n\n## Supported Hardware\n\n**Fully tested and working:**\n- **ESP32-S3-BOX-3** (320x240 ILI9341, SPI)\n- **ESP32-P4 Function EV Board** (1024x600, MIPI-DSI) - Rev 1.0 and 3.0+\n- **M5Stack Core S3** (320x240, SPI)\n- **M5Stack Core2** (320x240 ILI9342C, SPI, PMU-powered)\n\n**Easy to add:** Any board with ESP-BSP noglib support or custom esp_lcd panel.\n\n## Requirements\n\n- **ESP-IDF 5.5+** (tested with 6.0)\n- **ESP32-S3** or **ESP32-P4** (PSRAM recommended)\n- **Board Support Package (BSP)** noglib version for your board\n\n## What Can You Build?\n\nWith raylib on ESP32, you can create:\n- 2D games and animations\n- Interactive dashboards and HMIs\n- Data visualization\n- Educational demos\n- Retro-style graphics applications\n\n## Learning Resources\n\n- [raylib official website](https://www.raylib.com/)\n- [raylib cheatsheet](https://www.raylib.com/cheatsheet/cheatsheet.html)\n- [raylib examples](https://www.raylib.com/examples.html)\n\n## Current Limitations\n\n- Audio module not yet implemented\n- 3D models disabled (requires filesystem)\n- Touch input framework ready but not yet connected\n- Large displays (1024x600) render slowly at full resolution\n\nSee [Component README](raylib/README.md) for detailed information.\n\n## Contributing\n\nContributions welcome.\n\n## License\n\nThis wrapper component: **zlib/libpng** (matching raylib license)\n\n## Credits\n\n- [raylib](https://www.raylib.com/) by Ramon Santamaria ([@raysan5](https://github.com/raysan5))\n- Software renderer (rlsw) by Le Juez Victor ([@Bigfoot71](https://github.com/Bigfoot71))\n- Software renderer merged via [raylib PR #4832](https://github.com/raysan5/raylib/pull/4832)\n- ESP-IDF platform integration by this component\n\n## Documentation\n\n- **[Component Documentation](raylib/README.md)** - Architecture, configuration, and API\n- **[Hello Example](raylib/examples/hello/README.md)** - Complete working example\n- **[Implementation Guide](PLAN_A_IMPLEMENTATION.md)** - Detailed user guide and API reference\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgeorgik%2Fesp-idf-component-raylib","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgeorgik%2Fesp-idf-component-raylib","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgeorgik%2Fesp-idf-component-raylib/lists"}