Skip to main content
Version: main

Getting started

How do I get started?

First, install react-native-nobodywho.

npm install react-native-nobodywho

No additional initialization step is required — the native module is loaded automatically when you first import from the package.

Now you are ready to pick a model. NobodyWho can download GGUF models directly from Hugging Face — just pass a huggingface: path. See model selection for recommendations.

Then create a Chat object and call .ask!

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); // Yes, indeed, water is wet!

This is a super simple example, but we believe that examples which do simple things, should be simple!

Downloading gated model

Some HuggingFace models are either private or gated by a license that you need to accept. For both scenarios, you need to be authorized to download the model weights.

In that case, you can resort to manually accessing the model page through your web browser, getting the GGUF file downloaded to the device, and then pointing our chat instance to the path where you have stored it:

import { Chat } from "react-native-nobodywho";

const chat = await Chat.fromPath({ modelPath: "./model.gguf" });

Or you can use the downloadModel function, where you can pass in the authorization token:

import { downloadModel, Chat } from "react-native-nobodywho";

const modelPath = await downloadModel({
modelPath: "huggingface:NobodyWho/Qwen_Qwen3-0.6B-GGUF/Qwen_Qwen3-0.6B-Q4_K_M.gguf",
headers: { Authorization: "Bearer your_hf_token" },
});

const chat = await Chat.fromPath({ modelPath });

The token can be then generated in your account settings.

Tracking download progress

When loading a remote model (e.g. via a huggingface: or https:// path), pass an onDownloadProgress option to observe the download. It receives (downloaded, total) byte counts, is throttled to roughly 10 Hz with a guaranteed final emit on completion, and is not called for cached or local files.

const chat = await Chat.fromPath({
modelPath: "huggingface:NobodyWho/Qwen_Qwen3-0.6B-GGUF/Qwen_Qwen3-0.6B-Q4_K_M.gguf",
onDownloadProgress: (downloaded, total) => {
console.log(`${downloaded} / ${total} bytes`);
},
});

To get a full overview of the functionality provided by NobodyWho, simply keep reading.

Android requirements

If you use the x86_64 Android emulator for development, your app must set minSdkVersion to at least 31. This is due to a threading feature (ELF TLS) that the Rust runtime requires on x86_64. ARM64 devices (i.e. all real phones) work with any minSdkVersion.

No specific NDK version is required — NobodyWho ships prebuilt shared libraries, so your project's NDK version does not affect the Rust code.

  • iOS: iPhone 11 or newer with at least 4 GB of RAM. We tested a Qwen3 0.6B (332 MB) on an iPhone X (iOS 16) and while it ran, performance was too slow to be practical.
  • Android: Snapdragon 855 / Adreno 640 / 6 GB RAM or better. The same Qwen3 0.6B model performed notably better on a OnePlus 7 Pro (Android 12) than on the iPhone X tested above.

Feedback & Contributions

We welcome your feedback and ideas!

  • Bug Reports & Improvements: If you encounter a bug or have suggestions, please open an issue on our Issues page.
  • Feature Requests & Questions: For new feature requests or general questions, join the discussion on our Discussions page.