Maui AI Debugging
Redth/Maui.Gtk
End-to-end workflow for building, deploying, inspecting, and debugging .NET MAUI and MAUI Blazor Hybrid apps as an AI agent.
Sokol.NET framework development — use for ANY work in this repo: creating or debugging examples, building/running for desktop/Android/iOS/Web, writing or compiling shaders, adding a new C/C++…
$ npx skills add elix22/Sokol.NET --skill sokol-net -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install elix22/Sokol.NET sokol-net --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/elix22/Sokol.NET.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/sokol-net .claude/skills/sokol-net && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "sokol-net" agent skill from https://github.com/elix22/Sokol.NET/tree/main/.claude/skills/sokol-net into .claude/skills/sokol-net/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "sokol-net", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/elix22/Sokol.NET/tree/main/.claude/skills/sokol-netType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add elix22/Sokol.NET --skill sokol-net -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install elix22/Sokol.NET sokol-net --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/elix22/Sokol.NET.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.claude/skills/sokol-net .agents/skills/sokol-net && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "sokol-net" agent skill from https://github.com/elix22/Sokol.NET/tree/main/.claude/skills/sokol-net into .agents/skills/sokol-net/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "sokol-net", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add elix22/Sokol.NET --skill sokol-net -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install elix22/Sokol.NET sokol-net --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/elix22/Sokol.NET.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.claude/skills/sokol-net .cursor/skills/sokol-net && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "sokol-net" agent skill from https://github.com/elix22/Sokol.NET/tree/main/.claude/skills/sokol-net into .cursor/skills/sokol-net/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "sokol-net", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/elix22/Sokol.NET.git --path .claude/skills/sokol-net--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add elix22/Sokol.NET --skill sokol-net -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install elix22/Sokol.NET sokol-net --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/elix22/Sokol.NET.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.claude/skills/sokol-net .gemini/skills/sokol-net && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "sokol-net" agent skill from https://github.com/elix22/Sokol.NET/tree/main/.claude/skills/sokol-net into .gemini/skills/sokol-net/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "sokol-net", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install elix22/Sokol.NET sokol-netInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add elix22/Sokol.NET --skill sokol-net -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/elix22/Sokol.NET.git skills-src && mkdir -p .github/skills && cp -r skills-src/.claude/skills/sokol-net .github/skills/sokol-net && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "sokol-net" agent skill from https://github.com/elix22/Sokol.NET/tree/main/.claude/skills/sokol-net into .github/skills/sokol-net/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "sokol-net", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add elix22/Sokol.NET --skill sokol-net -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install elix22/Sokol.NET sokol-net --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/elix22/Sokol.NET.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.claude/skills/sokol-net .opencode/skills/sokol-net && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "sokol-net" agent skill from https://github.com/elix22/Sokol.NET/tree/main/.claude/skills/sokol-net into .opencode/skills/sokol-net/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "sokol-net", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
sokol-netSokol.NET framework development — use for ANY work in this repo: creating or debugging examples, building/running for desktop/Android/iOS/Web, writing or compiling shaders, adding a new C/C++…
Sokol Net is an agent skill from elix22/Sokol.NET. Sokol.NET framework development — use for ANY work in this repo: creating or debugging examples, building/running for desktop/Android/iOS/Web, writing or compiling shaders, adding a new C/C++ library under ext/ and generating its C bindings with bindgen, rebuilding native libraries, and developing the framework itself under src/ (sokol bindings, Sokol.GUI, Framework/Render2D, imgui). Read BEFORE building, running, or editing bindings — the build system and binding generator have non-obvious rules.
Its SKILL.md is about 2.8k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Game Development, covering Shaders and Debugging. It works with C#, Android, iOS and C++. The repository describes itself as: Cross-platform graphics framework for C with .NET NativeAOT | Desktop • Mobile • Web | Direct3D • Metal • OpenGL • WebGL. The licence is MIT.
5 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 758c087. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
dotnetgitadbxcrunFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use git, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Sokol Net loads about 2.8k tokens when it runs. Until then it costs about 128 tokens; SKILL.md has 996 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from elix22/Sokol.NET at commit 758c087, republished under its MIT licence (© elix22). 996 words, ~2,839 tokens.
.claude/skills/sokol-net/SKILL.md (or your agent's skills folder).C# binding + application framework over the Sokol headers. One C# codebase targets
Windows (D3D11), macOS/iOS (Metal), Linux (OpenGL/glsl430), Android (GLES3), and
WebAssembly (WebGL2) via .NET NativeAOT. Home directory: /Users/elialoni/Development/Sokol.NET.
src/sokol/generated/*.cs. It is generated from C headers.
Change the C header (or bindgen/) and run ./scripts/generate-bindings.sh.ext/ can silently break a different platform. State which
platforms you verified on. WASM and Android GLES3 are the usual silent casualties.ScrollView (src/GUI/Widgets/ScrollView.cs). See root CLAUDE.md §5 — mandatory.dotnet build examples/<name>/<name>.csproj -t:CompileShaders.examples/ and ext/ are private repositories containing their
own CLAUDE.md. If a directory's CLAUDE.md declares it private/proprietary, follow that
file's rules first — and never git add such directories into this repo (no git add -A
anywhere; stage exact paths only).src/sokol/ C# bindings: generated/ (26 files, DO NOT EDIT) + hand-written helpers
src/GUI/ Sokol.GUI — retained-mode widget toolkit (NOT Dear ImGui)
src/Framework/ Higher-level engine pieces (Assets, ECS, Scene, Renderer, Physics…)
src/Render2D/ GPU 2D renderer + particle system
src/imgui/ Dear ImGui bindings (from ext/cimgui)
ext/ C/C++ submodules + ext/CMakeLists.txt (ONE file builds all native libs)
ext/sokol.c Unified C compilation unit (includes the header implementations)
bindgen/ Python binding generator (gen.py = registry, gen_csharp.py = emitter)
libs/<plat>/<arch>/ Pre-built native libraries (committed; rebuild only when ext/ changes)
tools/SokolApplicationBuilder/ Cross-platform build orchestrator
tools/sokol-tools/ sokol-shdc shader compiler binaries
scripts/ build-*, generate-bindings.sh, add-project-to-vscode-config.*
docs/ Deep guides — check here FIRST for any subsystem (list below)One-time setup: ./register.sh (writes ~/.sokolnet_config/sokolnet_home) and
git submodule update --init --recursive.
tools/SokolApplicationBuilder is the orchestrator. Invocation pattern:
dotnet run --project tools/SokolApplicationBuilder -- --task <task> --architecture <arch> [--type release|debug] --path examples/<name>| Task | Purpose |
|---|---|
prepare | compile shaders + copy assets (run before first desktop dotnet run) |
build | full build (+deploy/run on device for android/ios) |
run / clean / cleanall | as named |
createproject --project my_app --destination <dir> | scaffold a standalone project (docs/CREATE_PROJECT.md) |
listdevices | enumerate attached Android/iOS devices (docs/DEVICE_LISTING.md) |
Architectures: desktop (RID defaults to host), android, ios, web.
Fast paths:
# Desktop, JIT (day-to-day dev loop — no NativeAOT wait):
dotnet run --project examples/cube/cube.csproj
# Web build, then serve:
dotnet run --project tools/SokolApplicationBuilder -- --task build --architecture web --path examples/cube
dotnet serve --directory examples/cube/bin/Release/net10.0/browser-wasm/AppBundle.vscode/tasks.json has 500+ pre-made tasks (one per example × platform).
Follow docs/CREATE_EXAMPLE.md. Anatomy of examples/<name>/ (copy from examples/cube):
<name>.csproj (desktop/mobile) and <name>web.csproj (WASM) — two csprojs per example.Source/ — code. Entry: a sokol_main() returning sapp_desc with Init/Frame/Event/Cleanup
callbacks; platform mains in Program.cs.shaders/*.glsl — Sokol cross-compiled dialect; compiled output lands in shaders/compiled/.Assets/, Directory.Build.props (per-example options: optional dynamic libs, package prefix,
icons — docs/ANDROID_PROPERTIES.md, IOS_PROPERTIES.md, APP_ICON.md), wwwroot/ (web shell).After creating: register VS Code tasks with ./scripts/add-project-to-vscode-config.sh <name>,
run prepare, then verify desktop first, then web (web breaks most often), then mobile.
For a project OUTSIDE the repo use --task createproject instead (template in docs/PROJECT_TEMPLATE.md).
.glsl dialect; -t:CompileShaders runs sokol-shdc for every backend:
glsl430 (Linux), hlsl5 (D3D11), metal_macos/metal_ios, glsl300es (Android/WASM).docs/SHADER_GUIDE.md. Gotcha: RGBA32F/data textures read with texelFetch MUST
be declared unfilterable-float + a nonfiltering sampler in sokol-shdc, or Mali GPUs panic.| Target | How |
|---|---|
| Desktop | dotnet run (JIT — real breakpoints work); native crashes: lldb -- dotnet run …; sokol log → stderr |
| Android | adb logcat -s <AppTag>:V *:E (sokol log goes to logcat); --task build installs+launches; device pick: docs/ANDROID_DEVICE_SELECTION.md |
| iOS | xcrun devicectl install/launch; logs in Console.app / devicectl output |
| Web | browser devtools console; stale-build confusion → docs/Browser-Cache-Issues.md; struct-return crashes → see bindings section |
Debug vs Release matters: NativeAOT Debug codegen is drastically slower — perf symptoms seen only in Debug are usually codegen, not your change. Graphics acceptance is visual: build + launch and give the user repro steps; the user supplies screenshots (Claude cannot screencapture here).
Known platform traps (verified, keep in mind when a bug "makes no sense"):
sapp_quit() is broken on stock Android — this repo's sokol_app.h defers shutdown post-frame
and calls finishAndRemoveTask() via JNI.Screen.Instance.Update() needs logical pixels (sw/dpr, sh/dpr) — passing physical
clips drawing to the top-left quadrant.ma_sound_stop() (MiniAudio) is not immediate; to silence a node instantly use
ma_sound_uninit() + free.Checklist — all steps required, in order:
git submodule add <url> ext/<lib> (or copy single-header libs in).ext/CMakeLists.txt (the ONE CMake file; follow the
existing per-platform if (WIN32/APPLE/ANDROID/Emscripten/LINUX) guards). If the lib is C++
or must ship separately (like Assimp/Spine/Ozz), model it as an optional dynamic library
configured via the example's Directory.Build.props instead of bundling into sokol.c.tasks list in bindgen/gen.py:
[ '../ext/<lib>/<header>.h', '<prefix_>', ['<dep_prefix_', …] ] — prefix = the C symbol
prefix to bind; dep prefixes = other bound libs whose types appear in this header.
Output goes to src/sokol/generated/ by default (per-prefix overrides exist in
gen_csharp.py)../scripts/generate-bindings.sh. This also regenerates the struct-return
wrapper headers (ext/sokol_csharp_internal_wrappers.h and per-lib variants): C functions
returning structs by value cannot be P/Invoked from WASM, so the generator auto-creates
*_internal(<args>, out*) C wrappers. A big new lib may need its own
gen_c_<lib>_wrappers_header output wired in gen.py (copy the box2d/miniaudio pattern)
and that header #included in the lib's compilation unit.EntryPointNotFoundException.docs/C-Internal-Wrappers-Auto-Generation.md + docs/WebAssembly-Struct-Return-Workaround.md
before touching any of this machinery../scripts/build-xcode-macos.sh # macOS
./scripts/build-ios-sokol-library.sh all # iOS
./scripts/build-android-sokol-libraries-via-apk.sh # Android (multi-arch: builds the `clear`
# example APK debug+release and extracts the .so libs
# into libs/android/ — NOT build-android-sokol-libraries.sh)
./scripts/build-web-library.sh # Emscripten/WASM
./scripts/build-linux-library.sh # Linux
.\scripts\build-vs2022-windows.ps1 # WindowsOutputs land in libs/<platform>/<arch>/ and are committed. Full doc: docs/BUILD_SYSTEM.md.
src/sokol: hand-written helpers wrap the generated bindings — extend via new hand-written
files, never inside generated/.src/GUI (Sokol.GUI) — retained-mode widgets, NanoVG-drawn. Rules:AnimationManager) — never create a parallel one; never
Unregister a tween from its own callback.HitTest(LocalPosition), not IsHovered.MeasureText, never
Label.Length heuristics.Render2DSurface (GPU); NanoVG Draw() is for text only.sapp_dpi_scale() lies on some Androids (returns 1.0) — scale UI from logical width
(UiMetrics pattern); on WASM sapp_width() is physical/retina.docs/BUILD_SYSTEM.md · docs/SOKOL_APPLICATION_BUILDER.md · docs/CREATE_EXAMPLE.md ·
docs/CREATE_PROJECT.md · docs/SHADER_GUIDE.md · docs/C-Internal-Wrappers-Auto-Generation.md ·
docs/WEBASSEMBLY_BROWSER_GUIDE.md · docs/SOKOL_FILESYSTEM.md · docs/RENDER2D.md ·
docs/RENDER3D.md · docs/PHYSICS3D.md · docs/VSCODE_RUN_GUIDE.md · docs/QUICK_BUILD.md ·
docs/GITHUB_PAGES_SETUP.md (web deploy; macOS case-insensitivity breaks .wasm renames).
State acceptance criteria up front (root CLAUDE.md §4). A framework/example change is done when
it builds and behaves on every platform it touches — at minimum desktop + web for rendering
work, plus one real mobile device for UI/input work — and you have named the platforms verified.
© elix22, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in .claude/skills/sokol-net of elix22/Sokol.NET.
Open the folder on GitHubat commit 758c087
Sokol Net next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Sokol Net this skillelix22/Sokol.NET | 154 | — | ~2.8k | Automated safety check: Pass | MIT | |
| Maui AI DebuggingRedth/Maui.Gtk | 101 | — | ~4.1k | Automated safety check: Pass | MIT | |
| Debugging CodeJetBrains/skills | 366 | 1 repos | ~3.8k | Automated safety check: Pass | None | |
| AppsFlyer Unity Bridge DebuggingAppsFlyerSDK/appsflyer-unity-plugin | 178 | — | ~492 | Automated safety check: Pass | MIT | |
| Try Fix Alternative Approachdotnet/maui | 23k | — | ~8.4k | Automated safety check: Pass | MIT | |
| Genie API Service Docsqualcomm/qai-appbuilder | 247 | — | ~840 | Automated safety check: Pass | Custom licence |
Redth/Maui.Gtk
End-to-end workflow for building, deploying, inspecting, and debugging .NET MAUI and MAUI Blazor Hybrid apps as an AI agent.
JetBrains/skills
A skill your agent uses for debugger-driven runtime root-cause analysis in Rider-supported solutions and projects, including .NET/C, F, VB, C++, Unity, Unreal Engine, and other GameDev or…
AppsFlyerSDK/appsflyer-unity-plugin
Traces a failing call or callback between C# and the native Android or iOS wrappers of the AppsFlyer Unity plugin to find the first broken link.
dotnet/maui
Attempts one alternative fix for a bug, runs the given test command against it and reports what happened, always differing from existing PR fixes.
qualcomm/qai-appbuilder
GenieAPIService technical documentation retrieval. An agent skill from qualcomm/qai-appbuilder.
realsenseai/RealSenseID
RealSenseID face authentication SDK reference. An agent skill from realsenseai/RealSenseID.
Categories
Sokol.NET framework development — use for ANY work in this repo: creating or debugging examples, building/running for desktop/Android/iOS/Web, writing or compiling shaders, adding a new C/C++…. NET.GUI, Framework/Render2D, imgui).
Sokol Net fits situations like: ANY work in this repo: creating; debugging examples; building/running for desktop/Android/iOS/Web; compiling shaders.
Run `npx skills add elix22/Sokol.NET --skill sokol-net -a claude-code`. Or copy the skill folder (.claude/skills/sokol-net in elix22/Sokol.NET) into .claude/skills/sokol-net in your project. Claude Code loads it when a task matches its description.
Run `npx skills add elix22/Sokol.NET --skill sokol-net -a codex`. Or copy the skill folder (.claude/skills/sokol-net in elix22/Sokol.NET) into .agents/skills/sokol-net in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add elix22/Sokol.NET --skill sokol-net -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/sokol-net, .gemini/skills/sokol-net, .github/skills/sokol-net and .opencode/skills/sokol-net in your project.
Going by SKILL.md and its folder, Sokol Net needs the command-line tools its instructions call (dotnet, git, adb and xcrun). Our summary lists: Python 3.
SKILL.md contains no URLs. Its commands use git, which can reach the network depending on how they are called. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Sokol Net is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 2.8k tokens (SKILL.md is roughly 11k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Sokol Net: Maui AI Debugging (Redth/Maui.Gtk, 101 stars), Debugging Code (JetBrains/skills, 366 stars), AppsFlyer Unity Bridge Debugging (AppsFlyerSDK/appsflyer-unity-plugin, 178 stars) and Try Fix Alternative Approach (dotnet/maui, 23k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
elix22 (a GitHub user) maintains it in elix22/Sokol.NET, which has 154 GitHub stars. The repository was last updated on October 8, 2026.
Source: elix22/Sokol.NET on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.