Edge AI
Run AI on your devices
Run more than 10,000 open-source models directly on desktops, phones, smartwatches, industrial machines, cars, drones and robots – offline, with no internet connection required.
Learn moreLocal AI
Nobodywho builds local AI infrastructure that enables LLMs to run fully offline, both on-premises and directly on edge devices. Run AI whilst maintaining full control of your data and lowering costs.
Run AI on your own servers or directly on your devices, kept fast and up to date by our Assurance Layer.
Run AI on your devices
Run more than 10,000 open-source models directly on desktops, phones, smartwatches, industrial machines, cars, drones and robots – offline, with no internet connection required.
Learn moreRun AI on your servers
Deploy AI on your own or leased GPU servers, with multi-user access, predictable costs and no per-token fees.
Learn moreKeep your local AI performing at its best
Manage, monitor, re-train and optimise AI across edge devices and on-premises servers through a single control layer.
Learn moreSovereign AI
Distributed compute
Open Source
You can read every line of the engine that runs your models. For regulated industries and public institutions, that is not a nice-to-have, it is the precondition for trust.
The engine is yours to run, fork and extend. If we disappear tomorrow, your deployment keeps working exactly as it did today.
Nobodywho is released under the EUPL 1.2, the European Union's own open-source licence, written for European law and compatible with the licences you already use.
Development happens on GitHub, in public. Issues, roadmap and releases are visible to everyone who depends on them.
Enterprise
Run AI on your own servers or directly on your devices, with the Nobodywho inference engine at the core. Our Assurance Layer keeps models fast, accurate and up to date, and our team is with you from first setup to daily operation. We make switching to local AI seamless.
Run AI on your devices.
With our inference engine you can run more than 10,000 open-source models directly on desktops, phones, smartwatches, industrial machines, cars, drones and robots – even offline, with no internet connection required.
Our inference runtime embeds directly into your application, using each device's hardware to accelerate AI. No server required, wherever your software runs.
LLM/VLM inference, speech-to-text, text-to-speech, voice activity detection, embeddings and reranking in one SDK.
Nobodywho detects tool calls and automatically triggers schema-constrained generation derived from the function signature. This ensures every call uses the expected argument names and value types.
Hugging Face download and cache, memory-based model selection, automatic CPU/GPU selection and memory-aware layer offloading.
Turn-aware context shifting removes complete old exchanges while preserving system instructions, recent turns and tool-call structure.
All features are available across Rust, Kotlin, Swift, Python, Dart, TypeScript and GDScript.
Architecture-specific CPU instructions and GPU kernels with support for Metal, Vulkan, CUDA and numerous other backends. Supports quantized models, which reduce model size and memory requirements.
Run AI on your servers.
Deploy AI on your own or leased GPU servers, with multi-user access, predictable costs and no per-token fees.
Enterprise inference on infrastructure you control, built for regulated and classified environments with strict data residency requirements.
Nobodywho benchmarks models and serving configurations for your hardware and GPU topology, then deploys the best-fit setup for your workload and desired balance of model quality, latency and throughput. Priority-aware routing and scheduling keep user requests responsive while background agents use otherwise available capacity.
Nobodywho connects to common enterprise software such as Slack, email and CRM through ready-to-use integrations. For internal or specialized systems, we can build a custom integration, or your team can connect it directly through our API.
Nobodywho agents connect to enterprise integrations in both directions: employees can invoke them from tools such as Slack, while agents can use connected systems to complete work. They can also run scheduled or event-driven workflows in the background, with permissions, approval gates and full auditability.
vLLM is a high-performance open-source engine with rapid support for new models. It exposes an OpenAI-compatible API, which allows existing systems and integrations to use the local deployment with minimal integration changes.
Keep your local AI performing at its best.
Manage, monitor, re-train and optimise AI across edge devices and on-premises servers through a single control layer.
Measure model quality against your own data and monitor performance in production. Visibility into inference activity, usage patterns and anomalies across your deployment.
Model selection based on your domain use cases and hardware, evaluated against your own data. We update the models as better ones become available, your hardware changes or your requirements evolve.
Tune inference performance for your devices and servers: the right quantisation, GPU backend and serving configuration for the hardware you actually run on.
Adapt models to your domain, terminology and tasks using your own data. We fine-tune and evaluate models against your use cases, then re-train as your data and requirements evolve to maintain quality over time.
Our hybrid setup automatically routes each task to the right model – running it on your edge device when the local model is capable, or sending it to a larger model on your servers or in the cloud when needed. Ready-made connections to tools such as Slack, email and CRM; custom integrations for internal systems, or direct access through the API.
Run AI agents that carry out tasks across your tools and systems, on demand, on a schedule or in response to events. We optimise deployments for these workflows, with permissions, approval steps and audit trails that keep your team in control.
Extend your local AI setup with tools built around the way your organisation works. We develop custom interfaces, internal applications and deployment utilities tailored to your infrastructure, giving your team practical ways to use and manage AI.
Keep deployments available and up to date, backed by 24/7 support. Training and enablement that leaves your team owning the capability, beyond the contract rather than dependent on it.
Free
We get the Nobodywho tech stack up and running on your servers or edge devices.
from 500EUR / month
On request
Lease GPU servers from us and run On-Prem AI without buying hardware. Price depends on the type of GPUs.
Request a quoteNot sure which plan fits? A short call is usually enough to tell.
Documentation
Nobodywho is a local-first inference engine for language models, with the same API across seven languages and frameworks. Streaming chat, tool calling, structured output, embeddings, text-to-speech, speech-to-text and RAG — entirely offline, GPU-accelerated, built on llama.cpp.
This page is a mirror of the essentials. The complete, always-current documentation lives at docs.nobodywho.ooo, and the code at GitHub.
Nobodywho is a lightweight, open-source inference engine for running open-weights LLMs inside your software. We provide a simple, efficient, offline and privacy-forward way of interacting with LLMs. No infrastructure needed!
In short, if you want to run an LLM, integrate it with tools, configure its output, enable real-time streaming of tokens, create embeddings, or synthesize speech, Nobodywho makes it easy.
All of this is enabled by llama.cpp, while having a nice, simple API.
No need to mess around with docker containers, GPU servers, API keys, etc. We make it easy to run local models in Kotlin, Swift, Python, Flutter, React Native, Expo and Godot!
The runtime is free under EUPL 1.2, for proprietary and commercial projects alike. Open source and open weights mean no vendor lock-in: the capability stays with you, beyond any contract.
Start with the two foundational guides: LLM Basics explains tokens, context, samplers and tools; Model Selection helps you choose a model that fits your hardware.
We deploy and look after Nobodywho for enterprises – on your servers or your devices.
Basics
Our goal with Nobodywho is to make it easy to run local LLMs. For this reason we have made it possible to use Nobodywho with minimal knowledge of how LLMs work. However you still need to know some basic concepts, so for these we provide some brief explanations. The concepts covered are tokens, context, samplers, tools, and thinking/reasoning.
Tokens are the fundamental units a language model processes. A single token is typically a word, a word fragment or a punctuation mark: "hello" is one token, whereas "understanding" may split into "understand" and "ing". Each model has its own token vocabulary, fixed during training.
The model generates text sequentially, one token at a time. That is why Nobodywho's default response streams tokens and lets you read the reply as it is produced.
Context is all the text the model can see while generating a response: earlier messages in the conversation, the current user prompt and the system instructions. It works as the model's memory of the conversation; once a chat is initialised, most interaction is context manipulation.
Models have a maximum context size (context window or context length), measured in tokens and typically between 2,048 and 128,000. When it fills up you must start a new conversation, remove old messages or summarise earlier content. Nobodywho handles this automatically by removing older messages. Larger contexts allow longer conversations but reduce response speed.
During CPU inference, work is distributed across a thread pool. Because all threads synchronise at barriers, performance is bounded by the slowest thread: hyperthreads add no compute, and efficiency cores run slower than performance cores. Nobodywho defaults to performance cores only. On a 12-core Mac (8 P-cores, 4 E-cores), 8 threads is roughly twice as fast as all 12:
| threads | prompt processing | generation |
|---|---|---|
| 8 (performance cores) | 435 tok/s | 90 tok/s |
| 12 (all logical CPUs) | 327 tok/s | 48 tok/s |
Adjusting this is rarely necessary, except to keep CPU free for other work or to correct a misdetected topology.
A language model does not output text directly; it produces a probability distribution over possible next tokens. Samplers decide which token is chosen, in two steps: shifting the distribution and sampling from it.
These steps can be chained.
These cannot be chained, since each directly selects the next token. Nobodywho also supports advanced configurations such as JSON Schema following.
Speculative decoding speeds up inference without changing the model's output: a draft proposes tokens and the target model verifies them together. Nobodywho implements MTP (Multi-Token Prediction) from Gemma 4, which uses trained "heads" rather than a separate draft model. Download the MTP heads as a companion .gguf (e.g. mtp-gemma-4-E2B-it.gguf), pass it as the draft model path when loading, and enable it when constructing the chat.
Structured output (code, JSON, maths, tool calls) shows a substantial speed-up; prose shows modest to neutral gains. MTP adds roughly 5% VRAM and is off by default. Results vary by hardware — unified-memory systems may see little or negative change.
Tools (function calling) let the model request external actions instead of only generating text: database searches, calculations, API calls, custom code. You define the available tools; the model decides when to use them based on the conversation. After a tool runs, you hand its result back so the dialogue can continue.
Some models are trained to reason step by step before answering. Check the model's Hugging Face page for thinking support. Reasoning appears between model-specific tags in the raw output:
<think>
...reasoning steps...
</think>
...final answer...
<think>...</think><|channel>thought ...<channel|>[THINK]…[/THINK]Tags vary by model and template, so consult the model's chat template for parsing.
Basics
A well-balanced ~2 GB chat model:
huggingface:NobodyWho/Qwen_Qwen3-4B-GGUF/Qwen_Qwen3-4B-Q4_K_M.gguf
A smaller, faster alternative:
huggingface:NobodyWho/Qwen_Qwen3-0.6B-GGUF/Qwen_Qwen3-0.6B-Q4_K_M.gguf
Or pass auto and let Nobodywho pick a model based on available memory.
huggingface:owner/repo/filename.gguf (shorthand hf:)https:// link to a hosted modelowner/repo:quantizationModels download once and are cached locally for offline use.
A filename like Qwen_Qwen3-0.6B-Q4_K_M.gguf breaks down as:
Quantisation reduces bits per weight to shrink the model and speed it up with minimal accuracy loss; Q4–Q5 generally works well.
Memory estimate is roughly parameter count × quantisation level: 2B @ Q8 ≈ 2 GB, 14B @ Q4 ≈ 7 GB.
Requirements for chat: the model must be instruction-tuned and carry a Jinja2 chat template in its metadata.
Python
First, install nobodywho:
pip install nobodywho
Or preferably:
uv add nobodywho
Next, pick a model. Nobodywho can download GGUF models directly from Hugging Face — just pass a huggingface: path. See model selection for recommendations.
Then make a Chat object and call .ask():
from nobodywho import Chat
chat = Chat('huggingface:NobodyWho/Qwen_Qwen3-0.6B-GGUF/Qwen_Qwen3-0.6B-Q4_K_M.gguf')
response = chat.ask('Is water wet?')
# print each token as it is generated
for token in response:
print(token, end="", flush=True)
# ...or get the entire response as a single string
full_response = response.completed()
print(full_response)
This is a super simple example, but we believe that examples which do simple things should be simple.
These guides open on docs.nobodywho.ooo.
Kotlin
First, add Nobodywho to your build.gradle.kts:
// Android
implementation("ai.nobodywho:nobodywho-android:2.2.0")
// Desktop JVM (Linux, macOS, Windows)
implementation("ai.nobodywho:nobodywho:2.2.0")
Next, pick a model. Nobodywho can download GGUF models directly from Hugging Face — just pass an hf:// path. See model selection for recommendations.
Then create a Chat and call .ask:
import ai.nobodywho.Chat
import kotlinx.coroutines.runBlocking
fun main() = runBlocking {
val chat = Chat.fromPath(
modelPath = "hf://NobodyWho/Qwen_Qwen3-0.6B-GGUF/Qwen_Qwen3-0.6B-Q4_K_M.gguf"
)
// stream tokens as they are generated
chat.ask("Is water wet?").asFlow().collect { token ->
print(token)
}
// ...or get the entire response as a single string
val response = chat.ask("Is water wet?").completed()
println(response)
}
On Android, use lifecycleScope or viewModelScope instead of runBlocking.
These guides open on docs.nobodywho.ooo.
Swift
Add Nobodywho with Swift Package Manager. In Xcode, go to File → Add Package Dependencies and enter:
https://github.com/nobodywho-ooo/nobodywho-swift.git
Or add it to your Package.swift:
dependencies: [
.package(url: "https://github.com/nobodywho-ooo/nobodywho-swift.git", from: "2.1.0")
]
Models can be loaded from a local file, a Hugging Face repository using hf://, or any https:// URL. Read more about model selection.
import NobodyWho
// From a Hugging Face repository
let chat = try await Chat.fromPath(
modelPath: "hf://NobodyWho/Qwen_Qwen3-0.6B-GGUF/Qwen_Qwen3-0.6B-Q4_K_M.gguf"
)
// From an HTTPS URL
let chat = try await Chat.fromPath(
modelPath: "https://huggingface.co/NobodyWho/Qwen_Qwen3-0.6B-GGUF/resolve/main/Qwen_Qwen3-0.6B-Q4_K_M.gguf"
)
// From a local file
let chat = try await Chat.fromPath(modelPath: "/path/to/model.gguf")
Once you have a Chat, call .ask to get a response:
let response = try await chat.ask("Is water wet?").completed()
print(response) // Yes, indeed, water is wet!
GPU acceleration is enabled by default using Metal on all Apple platforms.
These guides open on docs.nobodywho.ooo.
React Native / Expo
# React Native
npm install react-native-nobodywho
# Expo
npx expo install react-native-nobodywho
No additional initialisation step is required — the native module is loaded automatically when you first import from the package.
Nobodywho contains native code and cannot run in Expo Go; you need a development build.
CNG projects — for the first build, run the platform command:
npx expo run:ios
# or
npx expo run:android
After upgrading Nobodywho, regenerate the native folders:
npx expo prebuild --clean
npx expo run:ios
Bare projects — native folders are committed; autolinking registers the module on the next expo run:* build.
import { Chat } from "react-native-nobodywho";
const chat = await Chat.fromPath({
modelPath: "huggingface:NobodyWho/Qwen_Qwen3-0.6B-GGUF/Qwen_Qwen3-0.6B-Q4_K_M.gguf",
});
const response = await chat.ask("Is water wet?").completed();
console.log(response);
For x86_64 Android emulators set minSdkVersion to 31 or higher; ARM64 devices support any minSdkVersion.
These guides open on docs.nobodywho.ooo.
Flutter
First, install nobodywho:
flutter pub add nobodywho
Import it under the nobodywho namespace, which avoids clashes with generic names like Model and Chat:
import 'package:nobodywho/nobodywho.dart' as nobodywho;
Initialise the package exactly once, as early as possible:
await nobodywho.NobodyWho.init();
Any Nobodywho call before .init() results in an error — and so does a second call to .init().
Select a model and create a Chat:
final chat = await nobodywho.Chat.fromPath(
modelPath: 'huggingface:NobodyWho/Qwen_Qwen3-0.6B-GGUF/Qwen_Qwen3-0.6B-Q4_K_M.gguf',
);
final msg = await chat.ask('Is water wet?').completed();
print(msg); // Yes, indeed, water is wet!
These guides open on docs.nobodywho.ooo.
Godot
res://addons/nobodywho. Open Create Node and you should see NobodyWhoChat. If it is missing, restart Godot.| Term | Definition |
|---|---|
| Model (GGUF) | A *.gguf file containing the model weights |
| System prompt | Text establishing the ground rules for the model's behaviour |
| Token | Smallest unit of text emitted by the model |
| Chat | Node managing context, user input and conversation state |
| Context | Message history and metadata sent to the model each turn |
| Worker | Background task handling model readiness and communication |
Download a model — "Qwen3 0.6B Q4_K_M" is a lightweight, fast starting point. Add a NobodyWhoModel node and set its model_path (local path, Hugging Face reference or HTTPS URL). Then add a NobodyWhoChat node with a script:
extends NobodyWhoChat
func _ready():
# configure the node (feel free to do this in the UI)
self.system_prompt = "You are an evil wizard."
self.model_node = get_node("../ChatModel")
# connect signals to signal handlers
self.response_updated.connect(_on_response_updated)
self.response_finished.connect(_on_response_finished)
# Start the worker. Not required, but recommended early so the model
# is ready when the user prompts the first time. ask() calls it too.
self.start_worker()
self.ask("How are you?")
func _on_response_updated(token):
# this will print every time a new token is generated
print(token)
func _on_response_finished(response):
# this will print when the entire response is finished
print(response)
You can also call ask() straight away — prompts issued before the worker is ready are queued and dispatched as soon as loading completes.
chat.worker_started.connect(func():
print("Ready to chat!")
)
chat.worker_failed.connect(func(err):
push_error("Model load failed: " + err)
)
chat.start_worker()
When you run the scene, tokens should appear in the console as the model generates its response.
These guides open on docs.nobodywho.ooo.
About
Nobodywho is a Copenhagen-based company building local AI infrastructure: an open-source inference engine that runs large language models directly on devices and on organisations' own servers, so AI can be used without sending data outside the infrastructure you control.
The engine is free under the EUPL 1.2 licence and used across Kotlin, Swift, Python, Flutter, React Native, Expo and Godot. For organisations that want it deployed and kept in shape, we offer managed Edge and On-Prem deployments with an Assurance Layer of onboarding, model selection, monitoring, optimisation and support.
Notes from the team – releases, comparisons and the technical details of running models on small hardware. Posts open on nobodywho.ai.
Everyone is talking about Jev – here it is in 25 lines of Python.
Mobile memory warnings and handling them in Rust.
Engine design, model format, hardware, platforms, cloud and licensing, side by side.
Nobodywho now works with Expo – run on-device LLMs in your Expo apps.
Detect when someone starts and stops speaking, on-device.
How many worker threads should you use for CPU inference? Not all of them.
STT and TTS in Nobodywho – easily generate and transcribe audio.
The Nobodywho Chat app is now available on mobile.
Swift bindings and the development challenges of Apple Watch and Vision Pro.
Run LLMs fully on-device in your Android and JVM apps.
Questions we get asked most often.
Nobodywho is an open-source inference engine for running large language models on-device or on-premises, built by a Copenhagen-based team for companies that want AI without sending data outside their own infrastructure.
Yes. The core engine is open source under the EUPL 1.2 licence and available on GitHub.
No. The EU AI Act does not legally mandate on-premises deployment. Nobodywho recommends it for control and simplicity, not as a compliance requirement.
Nobodywho is based in Copenhagen, Denmark, and operates within the EU.
Edge runs on-device, optimised for specific hardware, and is priced per device. Prem is a shared on-premises deployment for your organisation, priced per GPU server.
Edge, Prem, and Assurance are all priced on request, based on your deployment. Book a meeting to get a quote.
Guided onboarding, 24/7 support, model selection and optimisation, and bespoke tooling, layered on top of either Edge or Prem.
Yes. The open-source SDK is free to run yourself, on-edge or on-prem, with no enterprise engagement required. Start with the docs.
Something we did not answer? We are happy to talk.
Contact
Tell us what you are building and where it needs to run. We usually reply within a working day.