One Rust core serves 6 application bindings
NobodyWho wraps a shared Rust engine for Kotlin, Swift, React Native, Flutter, Python, and Godot. The core handles chat, templates, grammars, sampling, and context shifting. llama.cpp supplies text, vision, embeddings, and reranking, while ONNX Runtime handles speech recognition, speech generation, and voice activity detection. That makes the project more useful to app developers than another local chat window.
The API accepts a local model path, a URL, or a Hugging Face reference. GGUF chat models download and cache on first use, and the README suggests a roughly 330 MB Qwen3 0.6B model as a small integration check. Tool signatures can generate structured grammars without a separate schema. None of this requires a hosted API key, so prompts and model execution can stay on the device.
Memory and target support set the real boundary
Desktop support covers 64-bit Linux, macOS, and Windows, with one missing corner: Windows ARM64. macOS uses Metal, while Linux and Windows can use Vulkan and fall back to CPU. The README estimates free RAM at roughly 1.5 times the model file, or 2 times on a busy machine. It calls 8 GB a comfortable floor for models up to about 2 GB.
Mobile limits are more specific. The documented baseline is iPhone 11 with 4 GB of RAM, or Android hardware around Snapdragon 855, Adreno 640, and 6 GB. A phone needs about twice the model file size in available memory, according to the README. Godot exports to desktop and Android but not iOS. There is no browser export, and issue 111 remains the public request for WASM support.
What happened when we ran it
We cloned commit e295839 into a 3-CPU, 12 GB Rust sandbox. The project lives under ./nobodywho/. Installation succeeded in 84 seconds and installed 587 packages. The repository contained 1,098 files, about 93,242 lines of source, and occupied 24.7 MB before the installed toolchain and dependencies. Our scan found 16 CI workflow files, no Dockerfile, and no tests directory.
The source build failed with exit code 101 after 124 seconds. The log says rustfmt was not installed for Rust 1.98.0, labels that condition non-fatal, and continues. Later, the llama-cpp-sys-2 build script called CMake's build step. gmake reported that no Makefile existed and had no target to run, after which the Rust build script panicked. The tail does not show why the Makefile was absent.
Tests then failed with exit code 101 after 7 seconds. Their tail repeats the non-fatal rustfmt message and the same missing-Makefile failure from llama-cpp-sys-2. No test summary was produced, so there is no passed or failed test count to report. This is a build prerequisite or generation failure in our fresh container, not a measurement of model correctness, response speed, or any published package.
Published packages avoid most source-build machinery
Python users can install from PyPI, React Native from npm, Flutter from pub.dev, Kotlin from Maven Central, Swift through Swift Package Manager, and Godot through AssetLib. The Godot instructions require version 4.5 or newer and an import option called Ignore asset root. An experimental local server exposes models and chat completions on port 8888 through an OpenAI-shaped API.
Building the workspace asks more. The Linux contribution guide recommends Nix with flakes, a stable Rust toolchain, and a local Qwen 2.5 1.5B Instruct GGUF file through TEST_MODEL. Windows contributors need CMake, LLVM, MSVC, and the Vulkan SDK. Those requirements explain why a package consumer and a core contributor have very different setup experiences. Start with the package for your binding unless you need to change the engine.
Godot tool calls still have a main-thread gap
Issue 203 documents that Godot tool callbacks cannot await asynchronous results under the current interface. The model invokes the callable from a worker thread, while some Godot operations must run on the main thread. Issue 513 gives concrete examples such as changing a door texture or waiting for a player to choose an item. Workarounds involve deferred calls and extra synchronization state.
That constraint matters for games because tool use often changes scenes, waits for animation, or asks the player for input. Synchronous data lookups are a better fit today. The README's type-safe tool grammar solves argument shape; it does not solve thread ownership or awaiting a signal. Prototype one representative scene interaction before designing an NPC system around these callbacks.
September releases show active multi-binding work
GitHub recorded 1,395 stars, 19 combined open issues and pull requests, and a push on September 25, 2026. Recent releases include Swift 4.0.0, React Native 4.0.0, Kotlin 4.0.0, Flutter 4.0.0, Python 3.0.0, and Godot 11.0.0. Current pull requests cover llama.cpp updates, speech quantization fixes, Android backends, and configurable context shifting.
NobodyWho earns a trial when one local feature must ship through several of its 6 bindings. The packaged APIs and frank platform table reduce discovery work. Source adoption is harder to recommend from our evidence because the 587-package setup reached neither a successful build nor a test summary. Prove the exact model, memory budget, binding, and device first. That result matters more than support listed at the framework level.

