{"id":32780726,"url":"https://github.com/fredericalix/godot_grpc","last_synced_at":"2026-05-06T13:35:44.999Z","repository":{"id":322136210,"uuid":"1088128033","full_name":"fredericalix/godot_grpc","owner":"fredericalix","description":"A production-ready Godot 4.5+ GDExtension that provides a native gRPC client for GDScript and C#.","archived":false,"fork":false,"pushed_at":"2025-11-02T20:22:58.000Z","size":58,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-11-02T20:27:59.952Z","etag":null,"topics":["godot","grpc"],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-3-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/fredericalix.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","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":"2025-11-02T11:21:09.000Z","updated_at":"2025-11-02T18:39:33.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/fredericalix/godot_grpc","commit_stats":null,"previous_names":["fredericalix/godot_grpc"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/fredericalix/godot_grpc","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fredericalix%2Fgodot_grpc","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fredericalix%2Fgodot_grpc/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fredericalix%2Fgodot_grpc/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fredericalix%2Fgodot_grpc/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/fredericalix","download_url":"https://codeload.github.com/fredericalix/godot_grpc/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fredericalix%2Fgodot_grpc/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":282695505,"owners_count":26711827,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-11-04T02:00:05.887Z","response_time":62,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["godot","grpc"],"created_at":"2025-11-04T19:00:56.358Z","updated_at":"2025-11-04T19:01:54.563Z","avatar_url":"https://github.com/fredericalix.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"# godot_grpc\n\nA production-ready **Godot 4.5+ GDExtension** that provides a native gRPC client for GDScript and C#.\n\n[![License](https://img.shields.io/badge/License-BSD_3--Clause-blue.svg)](LICENSE)\n[![Godot](https://img.shields.io/badge/Godot-4.5+-blue.svg)](https://godotengine.org/)\n[![Platform](https://img.shields.io/badge/Platform-macOS%20%7C%20Linux%20%7C%20Windows-lightgrey.svg)]()\n\n## Overview\n\n`godot_grpc` exposes a gRPC client to Godot, handling all transport layer concerns (HTTP/2, channels, streaming) using gRPC C++. Message serialization is kept outside the extension—you pass/receive raw bytes, allowing you to plug in any Protobuf library (we recommend [godobuf](https://github.com/oniksan/godobuf)).\n\n### What it is\n- ✅ gRPC client for unary and server-streaming RPCs\n- ✅ Cross-platform: macOS (Intel + Apple Silicon), Linux x86_64, Windows x64\n- ✅ Clean, minimal API exposed to GDScript/C#\n- ✅ Thread-safe signal emission for async streaming\n- ✅ Flexible: bring your own Protobuf serializer\n- ✅ Production-ready with proper error handling and logging\n\n### What it isn't\n- ❌ No gRPC server implementation (client-only)\n- ❌ No grpc-web or websocket support\n- ❌ No built-in Protobuf message generation (use godobuf or similar)\n- ❌ Client/bidirectional streaming not yet implemented\n\n## Documentation\n\n- **[Tutorial](docs/TUTORIAL.md)** - Step-by-step guide for beginners\n- **[API Reference](docs/API_REFERENCE.md)** - Complete API documentation\n- **[Examples](docs/EXAMPLES.md)** - Practical code examples\n- **[Developer Guide](docs/DEVELOPER_GUIDE.md)** - For contributors\n\n## Features\n\n- **Lifecycle Management**: Connect, disconnect, check connection state\n- **Unary RPCs**: Simple request-response calls\n- **Server-Streaming RPCs**: Receive a stream of messages from the server\n- **Signals**: `message`, `finished`, `error` for streaming events\n- **Metadata**: Send custom headers with calls\n- **Deadlines**: Set per-call timeouts\n- **Logging**: Configurable log levels (NONE, ERROR, WARN, INFO, DEBUG, TRACE)\n- **Graceful Shutdown**: Cancel in-flight calls on disconnect\n\n## Requirements\n\n### Build Requirements\n- **CMake** 3.20+\n- **C++17** compiler (AppleClang 17+, GCC 9+, MSVC 2019+)\n- **vcpkg** for dependency management\n- **godot-cpp** (automatically configured by build system)\n\n### Runtime Requirements\n- **Godot** 4.5 or later\n\n### Dependencies (automatically installed via vcpkg)\n- **gRPC** 1.71.0+\n- **Protobuf** 5.29.5+\n- **Abseil** 20250512.1+\n- **RE2**, **c-ares**, **openssl** (transitive dependencies)\n\n## Installation\n\n### Option 1: Pre-built Binaries (Recommended)\n\nDownload the latest release from the [releases page](https://github.com/yourusername/godot_grpc/releases) and extract the `addons/godot_grpc` folder to your Godot project.\n\n### Option 2: Build from Source\n\n#### 1. Clone the Repository\n\n```bash\ngit clone https://github.com/yourusername/godot_grpc.git\ncd godot_grpc\n```\n\n#### 2. Build the Extension\n\nThe build script will automatically set up vcpkg and install all dependencies:\n\n**macOS/Linux:**\n```bash\n# Build release version (for exported games)\n./scripts/build_vcpkg.sh Release\n\n# Build debug version (for Godot editor)\n./scripts/build_vcpkg.sh Debug\n```\n\n**Windows:**\n```powershell\n.\\scripts\\build_win.ps1 -BuildType Release\n.\\scripts\\build_win.ps1 -BuildType Debug\n```\n\nThe binaries will be placed in `demo/addons/godot_grpc/bin/{platform}/`.\n\n**Build outputs:**\n- **Release**: `libgodot_grpc.{platform}.template_release.{arch}.{ext}` (~17MB)\n- **Debug**: `libgodot_grpc.{platform}.template_debug.{arch}.{ext}` (~65MB)\n\n#### 3. Copy to Your Godot Project\n\nCopy the entire addon folder to your project:\n\n```bash\ncp -r demo/addons/godot_grpc /path/to/your/project/addons/\n```\n\n#### 4. Enable in Godot\n\nThe extension is automatically enabled. Restart Godot to load it.\n\n**Verify it's loaded:**\n```gdscript\n# In any script\nfunc _ready():\n    var client = GrpcClient.new()\n    if client:\n        print(\"godot_grpc loaded successfully!\")\n```\n\n## Quick Start\n\n\u003e **New to gRPC?** Check out the **[Tutorial](docs/TUTORIAL.md)** for a step-by-step guide!\n\n### Basic Example (Unary Call)\n\n```gdscript\nextends Node\n\nvar grpc_client: GrpcClient\n\nfunc _ready():\n    grpc_client = GrpcClient.new()\n    grpc_client.set_log_level(3)  # INFO level\n\n    # Connect to server\n    if grpc_client.connect(\"dns:///localhost:50051\"):\n        print(\"Connected!\")\n        make_hello_call()\n    else:\n        print(\"Failed to connect\")\n\nfunc make_hello_call():\n    # Create request (simplified protobuf encoding)\n    var request = PackedByteArray()\n    request.append(0x0a)  # Field 1, wire type 2 (string)\n    request.append(5)     # Length\n    request.append_array(\"Alice\".to_utf8_buffer())\n\n    # Make the call\n    var response = grpc_client.unary(\"/helloworld.Greeter/SayHello\", request)\n\n    if response.size() \u003e 0:\n        print(\"Server says: \", parse_response(response))\n\nfunc parse_response(data: PackedByteArray) -\u003e String:\n    # Simple protobuf parsing\n    if data.size() \u003e 2:\n        var len = data[1]\n        return data.slice(2, 2 + len).get_string_from_utf8()\n    return \"\"\n\nfunc _exit_tree():\n    grpc_client.close()\n```\n\n**Output:**\n```\nConnected!\nServer says: Hello, Alice! Welcome to godot_grpc demo server.\n```\n\n### Server-Streaming Example\n\n```gdscript\nextends Node\n\nvar grpc_client: GrpcClient\nvar stream_id: int = 0\n\nfunc _ready():\n    grpc_client = GrpcClient.new()\n\n    # Connect signals for async messages\n    grpc_client.message.connect(_on_stream_message)\n    grpc_client.finished.connect(_on_stream_finished)\n    grpc_client.error.connect(_on_stream_error)\n\n    # Connect and start stream\n    if grpc_client.connect(\"dns:///localhost:50051\"):\n        start_metrics_stream()\n\nfunc start_metrics_stream():\n    var request = PackedByteArray()  # Empty or add filters\n\n    stream_id = grpc_client.server_stream_start(\n        \"/metrics.Monitor/StreamMetrics\",\n        request\n    )\n\n    if stream_id \u003e 0:\n        print(\"Stream started with ID: \", stream_id)\n\nfunc _on_stream_message(sid: int, data: PackedByteArray):\n    if sid == stream_id:\n        print(\"Received metric data: \", data)\n\nfunc _on_stream_finished(sid: int, status: int):\n    if sid == stream_id:\n        print(\"Stream completed with status: \", status)\n\nfunc _on_stream_error(sid: int, code: int, msg: String):\n    if sid == stream_id:\n        print(\"Stream error: \", msg)\n\nfunc _exit_tree():\n    if stream_id \u003e 0:\n        grpc_client.server_stream_cancel(stream_id)\n    grpc_client.close()\n```\n\n**More examples:** See [docs/EXAMPLES.md](docs/EXAMPLES.md)\n\n## API Overview\n\n\u003e **Full API documentation:** See [docs/API_REFERENCE.md](docs/API_REFERENCE.md)\n\n### Main Methods\n\n```gdscript\n# Lifecycle\ngrpc_client.connect(endpoint: String, options: Dictionary = {}) -\u003e bool\ngrpc_client.close() -\u003e void\ngrpc_client.is_connected() -\u003e bool\n\n# RPC Calls\ngrpc_client.unary(method: String, request: PackedByteArray, opts: Dictionary = {}) -\u003e PackedByteArray\ngrpc_client.server_stream_start(method: String, request: PackedByteArray, opts: Dictionary = {}) -\u003e int\ngrpc_client.server_stream_cancel(stream_id: int) -\u003e void\n\n# Logging\ngrpc_client.set_log_level(level: int) -\u003e void  # 0=NONE, 1=ERROR, 2=WARN, 3=INFO, 4=DEBUG, 5=TRACE\ngrpc_client.get_log_level() -\u003e int\n```\n\n### Signals\n\n```gdscript\n# Emitted when a stream receives a message\ngrpc_client.message(stream_id: int, data: PackedByteArray)\n\n# Emitted when a stream completes\ngrpc_client.finished(stream_id: int, status_code: int)\n\n# Emitted when a stream encounters an error\ngrpc_client.error(stream_id: int, error_code: int, message: String)\n```\n\n### Common Options\n\n**Connection options:**\n```gdscript\n{\n    \"keepalive_time_ms\": 10000,          # Send keepalive every 10s\n    \"keepalive_timeout_ms\": 5000,        # Wait 5s for keepalive ack\n    \"max_receive_message_length\": 4194304,  # 4MB max\n    \"use_tls\": 1                         # Enable TLS\n}\n```\n\n**Call options:**\n```gdscript\n{\n    \"timeout_ms\": 5000,                  # 5 second timeout\n    \"metadata\": {                        # Custom headers\n        \"authorization\": \"Bearer token123\"\n    }\n}\n```\n\n## Error Handling\n\ngRPC status codes are mapped to Godot error codes. Error details are logged and included in signal emissions.\n\n| gRPC Status | Godot Error |\n|-------------|-------------|\n| OK | OK |\n| CANCELLED | ERR_QUERY_FAILED |\n| UNKNOWN | ERR_BUG |\n| INVALID_ARGUMENT | ERR_INVALID_PARAMETER |\n| DEADLINE_EXCEEDED | ERR_TIMEOUT |\n| NOT_FOUND | ERR_DOES_NOT_EXIST |\n| ALREADY_EXISTS | ERR_ALREADY_EXISTS |\n| PERMISSION_DENIED | ERR_UNAUTHORIZED |\n| RESOURCE_EXHAUSTED | ERR_OUT_OF_MEMORY |\n| FAILED_PRECONDITION | ERR_INVALID_DATA |\n| ABORTED | ERR_BUSY |\n| OUT_OF_RANGE | ERR_PARAMETER_RANGE_ERROR |\n| UNIMPLEMENTED | ERR_UNAVAILABLE |\n| INTERNAL | ERR_BUG |\n| UNAVAILABLE | ERR_CANT_CONNECT |\n| DATA_LOSS | ERR_FILE_CORRUPT |\n| UNAUTHENTICATED | ERR_UNAUTHORIZED |\n\n## Demo\n\nA complete working demo is included in the `demo/` directory.\n\n### Running the Demo\n\n**Terminal 1: Start the demo gRPC server**\n```bash\ncd demo_server\nmake all\nmake run\n```\n\nYou should see: `gRPC server listening on :50051`\n\n**Terminal 2: Run the Godot demo**\n```bash\ncd demo\ngodot  # Or open in Godot Editor and press F5\n```\n\n**Expected output:**\n```\nConnecting to dns:///localhost:50051...\nConnected successfully!\n--- Demo 1: Unary Call ---\nSUCCESS: Received response: Hello, Godot Player! Welcome to godot_grpc demo server.\n--- Demo 2: Server Streaming ---\nStream started with ID: 1\n  [Stream 1] Metric received: cpu_usage = 45.23 (timestamp: 1762084767)\n  [Stream 1] Metric received: memory_usage = 78.90 (timestamp: 1762084767)\n  ...\n```\n\n### What the Demo Includes\n\n- **Unary RPC example**: `/helloworld.Greeter/SayHello`\n- **Server-streaming example**: `/metrics.Monitor/StreamMetrics`\n- **Signal handling**: `message`, `finished`, `error` signals\n- **Simple Protobuf helpers**: Basic encoding/decoding for demonstration\n- **Go server implementation**: Complete gRPC server with two services\n\n**Demo files:**\n- `demo/scripts/grpc_demo.gd` - Main demo script\n- `demo_server/main.go` - gRPC server (Go)\n- `demo_server/*.proto` - Protocol definitions\n\n## Protobuf Integration\n\ngodot_grpc is **transport-only** - it handles the gRPC connection and RPC calls, but you must provide Protobuf serialization.\n\n### Recommended Approach: Use godobuf\n\n[godobuf](https://github.com/oniksan/godobuf) is a pure GDScript Protobuf library:\n\n```gdscript\n# 1. Generate GDScript classes from .proto files\n# (using godobuf's generator)\n\n# 2. Use in your code\nvar hello_request = HelloRequest.new()\nhello_request.name = \"Alice\"\nvar request_bytes = hello_request.to_bytes()\n\nvar response_bytes = grpc_client.unary(\"/helloworld.Greeter/SayHello\", request_bytes)\n\nvar hello_reply = HelloReply.new()\nhello_reply.from_bytes(response_bytes)\nprint(hello_reply.message)\n```\n\n### Manual Serialization (for simple messages)\n\nFor quick prototyping or simple messages:\n\n```gdscript\n# Encode a string field\nfunc encode_string_field(field_num: int, value: String) -\u003e PackedByteArray:\n    var buf = PackedByteArray()\n    buf.append((field_num \u003c\u003c 3) | 2)  # Wire type 2 = length-delimited\n    buf.append(value.length())\n    buf.append_array(value.to_utf8_buffer())\n    return buf\n\n# Use it\nvar request = encode_string_field(1, \"Alice\")\n```\n\nSee [docs/EXAMPLES.md](docs/EXAMPLES.md) for more protobuf helpers.\n\n## Performance Notes\n\n- **Threading**: gRPC completion queues run on background threads. Signals are emitted on the main thread via `call_deferred()`.\n- **Streaming**: Server streams spawn a dedicated reader thread per stream. Avoid creating hundreds of concurrent streams.\n- **Message Size**: Default max message size is unlimited. Set limits via channel options to avoid memory issues.\n- **Deadlines**: Always set reasonable deadlines to prevent hanging calls.\n\n## TLS/Security\n\nBasic TLS support is included but not fully configured. To enable TLS:\n\n```gdscript\ngrpc_client.connect(\"dns:///api.example.com:443\", {\n    \"enable_tls\": true\n})\n```\n\nFor production use, you'll need to extend the channel options to configure:\n- Root certificates\n- Client certificates\n- Certificate verification\n\nThis is left as an exercise for the user (POC-level security only).\n\n## Platform-Specific Notes\n\n### macOS\n- **Architecture**: Native builds for arm64 (Apple Silicon) or x86_64 (Intel)\n- **Universal binaries**: Possible but requires building for both architectures separately\n- **Min version**: macOS 10.15+ (Catalina)\n- **Tested on**: macOS Sequoia 15.0 (Darwin 25.0.0) with Apple M4 Max\n\n### Linux\n- **Architecture**: x86_64 (amd64)\n- **Min glibc**: 2.27+\n- **Tested on**: Ubuntu 20.04+, Debian 11+\n- **Dependencies**: Ensure `libssl`, `libz` are installed\n\n### Windows\n- **Compiler**: Visual Studio 2019+ or MSVC 2019+\n- **Architecture**: x64 only (no 32-bit support)\n- **Runtime**: Links against MSVC runtime (MD)\n- **Not yet tested**: Windows builds are included but untested\n\n## Troubleshooting\n\n\u003e See [docs/TUTORIAL.md](docs/TUTORIAL.md#troubleshooting) for more detailed troubleshooting.\n\n### Build Issues\n\n**Extension won't build:**\n```bash\n# Clean and rebuild\nrm -rf build vcpkg/buildtrees vcpkg/packages\n./scripts/build_vcpkg.sh Release\n```\n\n**vcpkg errors:**\n```bash\n# Ensure vcpkg is set up correctly\ncd vcpkg \u0026\u0026 git pull\n./bootstrap-vcpkg.sh  # macOS/Linux\n```\n\n**Architecture mismatch (macOS):**\n```\nld: warning: ignoring file ... wrong architecture\n```\nSolution: Build for your native architecture (the build script does this automatically)\n\n### Runtime Issues\n\n**Extension not loading:**\n```\nERROR: GDExtension 'res://addons/godot_grpc/godot_grpc.gdextension' failed to load\n```\n\n**Solutions:**\n1. Check architecture matches: `file demo/addons/godot_grpc/bin/macos/*.dylib`\n2. Verify debug build exists for editor: `ls demo/addons/godot_grpc/bin/macos/*debug*`\n3. Check file permissions: `chmod +x demo/addons/godot_grpc/bin/macos/*.dylib`\n4. Restart Godot editor\n\n**Connection fails:**\n```gdscript\n# Returns false\nif !grpc_client.connect(\"dns:///localhost:50051\"):\n```\n\n**Solutions:**\n1. Verify server is running: `netstat -an | grep 50051`\n2. Check endpoint format (must include scheme): `\"dns:///localhost:50051\"`\n3. Try direct IP: `\"ipv4:127.0.0.1:50051\"`\n4. Enable debug logging: `grpc_client.set_log_level(4)`\n\n**Empty response from unary call:**\n```gdscript\nvar response = grpc_client.unary(...)\n# response.size() == 0\n```\n\n**Solutions:**\n1. Check server logs for errors\n2. Verify method name format: `\"/package.Service/Method\"`\n3. Enable debug logging to see gRPC errors\n4. Verify protobuf serialization is correct\n\n**Signals not firing:**\n\n**Solutions:**\n1. Ensure signals connected **before** starting stream:\n   ```gdscript\n   grpc_client.message.connect(_on_message)\n   var stream_id = grpc_client.server_stream_start(...)\n   ```\n2. Check stream started successfully: `stream_id \u003e 0`\n3. Verify server is actually sending messages (check server logs)\n\n## Contributing\n\nContributions are welcome! See [docs/DEVELOPER_GUIDE.md](docs/DEVELOPER_GUIDE.md) for detailed information.\n\n**Quick start:**\n1. Fork the repository\n2. Create a feature branch: `git checkout -b feature/my-feature`\n3. Make your changes with tests\n4. Update documentation\n5. Submit a pull request\n\n**Areas for contribution:**\n- Client-streaming and bidirectional streaming support\n- Full TLS configuration\n- Windows and Linux testing\n- Additional examples and documentation\n- Bug fixes and performance improvements\n\n## License\n\nThis project is licensed under the BSD 3-Clause License. See [LICENSE](LICENSE) for details.\n\n## Acknowledgments\n\n- [Godot Engine](https://godotengine.org/)\n- [gRPC](https://grpc.io/)\n- [godot-cpp](https://github.com/godotengine/godot-cpp)\n- [godobuf](https://github.com/oniksan/godobuf) for Protobuf integration\n\n## Roadmap\n\n### Planned Features\n- [ ] **Client-streaming RPC** - Send multiple messages to server\n- [ ] **Bidirectional streaming RPC** - Full duplex communication\n- [ ] **Enhanced TLS** - Custom CA certs, client certificates, cert verification\n- [ ] **Channel pooling** - Round-robin load balancing across multiple channels\n- [ ] **Interceptors** - Middleware for logging, metrics, auth\n- [ ] **Better error details** - Extract and expose `grpc-status-details-bin`\n\n### Improvements\n- [ ] **Windows/Linux testing** - Verify builds on Windows and Linux\n- [ ] **CI/CD pipeline** - Automated builds for all platforms\n- [ ] **Unit tests** - C++ unit tests with Google Test\n- [ ] **Benchmarks** - Performance testing suite\n- [ ] **Protobuf integration** - Optional built-in protobuf support\n\n### Nice to Have\n- [ ] **Connection retry** - Automatic reconnection with backoff\n- [ ] **Health checking** - gRPC health checking protocol support\n- [ ] **Metrics** - Built-in metrics collection\n- [ ] **Multiple Godot versions** - Support for Godot 4.3+\n\n## Support \u0026 Community\n\n- **Issues**: [GitHub Issues](https://github.com/yourusername/godot_grpc/issues)\n- **Discussions**: [GitHub Discussions](https://github.com/yourusername/godot_grpc/discussions)\n- **Discord**: Godot Engine Discord - #gdnative channel\n\n## Acknowledgments\n\nBuilt with:\n- [Godot Engine](https://godotengine.org/) - The game engine\n- [gRPC C++](https://grpc.io/) - High performance RPC framework\n- [godot-cpp](https://github.com/godotengine/godot-cpp) - Godot C++ bindings\n- [vcpkg](https://vcpkg.io/) - C++ package management\n- [godobuf](https://github.com/oniksan/godobuf) - Recommended protobuf library\n\nSpecial thanks to the Godot and gRPC communities!\n\n---\n\n**Made with ❤️ for the Godot community**\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffredericalix%2Fgodot_grpc","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffredericalix%2Fgodot_grpc","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffredericalix%2Fgodot_grpc/lists"}