Repository files navigation

react-native-transformers

⚠️DEPRECATION NOTICE
As of July 2025, this project is no longer actively maintained. While react-native-transformers successfully enables on-device inference of Hugging Face transformer models in React Native and Expo apps, I haven't found a strong or consistent use case to justify continued development.

If you find this project useful and are interested in taking over its maintenance, feel free to fork it or reach out via GitHub. Contributions are still welcome, but this repository is now considered archived in terms of active development.

NPM VersioncodecovTypeDoc

Run Hugging Face transformer models directly on your React Native and Expo applications with on-device inference. No cloud service required!

Overview

react-native-transformers empowers your mobile applications with AI capabilities by running transformer models directly on the device. This means your app can generate text, answer questions, and process language without sending data to external servers - enhancing privacy, reducing latency, and enabling offline functionality.

Built on top of ONNX Runtime, this library provides a streamlined API for integrating state-of-the-art language models into your React Native and Expo applications with minimal configuration.

Key Features

  • On-device inference: Run AI models locally without requiring an internet connection
  • Privacy-focused: Keep user data on the device without sending it to external servers
  • Optimized performance: Leverages ONNX Runtime for efficient model execution on mobile CPUs
  • Simple API: Easy-to-use interface for model loading and inference
  • Expo compatibility: Works seamlessly with both Expo managed and bare workflows

Installation

1. Install peer dependencies

npm install onnxruntime-react-native

2. Install react-native-transformers

# React-Native
npm install react-native-transformers
# Expo
npx expo install react-native-transformers

3. Platform Configuration

React Native CLI

Link the onnxruntime-react-native library:

npx react-native link onnxruntime-react-native
Expo

Add the Expo plugin configuration in app.json or app.config.js:

{ "expo": { "plugins": ["onnxruntime-react-native"] } }

4. Babel Configuration

Add the babel-plugin-transform-import-meta plugin to your Babel configuration:

// babel.config.jsmodule.exports={// ... your existing configplugins: [// ... your existing plugins'babel-plugin-transform-import-meta',],};

You can follow this document to create config file, and you need to run npx expo start --clear to clear the Metro bundler cache.

5. Development Client Setup

For development and testing, it's required to use a development client instead of Expo Go due to the native code of ONNX Runtime and react-native-transformers.

You can set up a development client using one of these methods:

Usage

Text Generation

importReact,{useState,useEffect}from'react';import{View,Text,Button}from'react-native';import{Pipeline}from'react-native-transformers';exportdefaultfunctionApp(){const[output,setOutput]=useState('');const[isLoading,setIsLoading]=useState(false);const[isModelReady,setIsModelReady]=useState(false);// Load model on component mountuseEffect(()=>{loadModel();},[]);constloadModel=async()=>{setIsLoading(true);try{// Load a small Llama modelawaitPipeline.TextGeneration.init('Felladrin/onnx-Llama-160M-Chat-v1','onnx/decoder_model_merged.onnx',{// The fetch function is required to download model filesfetch: async(url)=>{// In a real app, you might want to cache the downloaded filesconstresponse=awaitfetch(url);returnresponse.url;},});setIsModelReady(true);}catch(error){console.error('Error loading model:',error);alert('Failed to load model: '+error.message);}finally{setIsLoading(false);}};constgenerateText=()=>{setOutput('');// Generate text from the prompt and update the UI as tokens are generatedPipeline.TextGeneration.generate('Write a short poem about programming:',(text)=>setOutput(text));};return(<Viewstyle={{padding: 20}}><Buttontitle={isModelReady ? 'Generate Text' : 'Load Model'}onPress={isModelReady ? generateText : loadModel}disabled={isLoading}/><Textstyle={{marginTop: 20}}>{output||'Generated text will appear here'}</Text></View>);}

With Custom Model Download

For Expo applications, use expo-file-system to download models with progress tracking:

import*asFileSystemfrom'expo-file-system';import{Pipeline}from'react-native-transformers';// In your model loading functionawaitPipeline.TextGeneration.init('model-repo','model-file',{fetch: async(url)=>{constlocalPath=FileSystem.cacheDirectory+url.split('/').pop();// Check if file already existsconstfileInfo=awaitFileSystem.getInfoAsync(localPath);if(fileInfo.exists){console.log('Model already downloaded, using cached version');returnlocalPath;}// Download file with progress trackingconstdownloadResumable=FileSystem.createDownloadResumable(url,localPath,{},(progress)=>{constpercentComplete=progress.totalBytesWritten/progress.totalBytesExpectedToWrite;console.log(`Download progress: ${(percentComplete*100).toFixed(1)}%`);});constresult=awaitdownloadResumable.downloadAsync();returnresult?.uri;},});

Supported Models

react-native-transformers works with ONNX-formatted models from Hugging Face. Here are some recommended models based on size and performance:

ModelTypeSizeDescription
Felladrin/onnx-Llama-160M-Chat-v1Text Generation~300MBSmall Llama model (160M parameters)
microsoft/Phi-3-mini-4k-instruct-onnx-webText Generation~1.5GBMicrosoft's Phi-3-mini model
Xenova/distilgpt2_onnx-quantizedText Generation~165MBQuantized DistilGPT-2
Xenova/tiny-mamba-onnxText Generation~85MBTiny Mamba model
Xenova/all-MiniLM-L6-v2-onnxText Embedding~80MBSentence embedding model

API Reference

For detailed API documentation, please visit our TypeDoc documentation.

Contributing

Contributions are welcome! See the contributing guide to learn how to contribute to the repository and the development workflow.

License

This project is licensed under the MIT License. See the LICENSE file for details.

Acknowledgements

  • ONNX Runtime for efficient model execution on mobile devices
  • @huggingface/transformers for transformer model implementations
  • Hugging Face for providing pre-trained models and model hosting

External Links

About

Run local LLM from Huggingface in React-Native or Expo using onnxruntime.

Topics

Resources

Code of conduct

Contributing

Stars

134 stars

Watchers

3 watching

Forks

Releases

Sponsor this project

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

react-native-transformers

⚠️DEPRECATION NOTICE
As of July 2025, this project is no longer actively maintained. While react-native-transformers successfully enables on-device inference of Hugging Face transformer models in React Native and Expo apps, I haven't found a strong or consistent use case to justify continued development.

If you find this project useful and are interested in taking over its maintenance, feel free to fork it or reach out via GitHub. Contributions are still welcome, but this repository is now considered archived in terms of active development.

NPM VersioncodecovTypeDoc

Run Hugging Face transformer models directly on your React Native and Expo applications with on-device inference. No cloud service required!

Overview

react-native-transformers empowers your mobile applications with AI capabilities by running transformer models directly on the device. This means your app can generate text, answer questions, and process language without sending data to external servers - enhancing privacy, reducing latency, and enabling offline functionality.

Built on top of ONNX Runtime, this library provides a streamlined API for integrating state-of-the-art language models into your React Native and Expo applications with minimal configuration.

Key Features

  • On-device inference: Run AI models locally without requiring an internet connection
  • Privacy-focused: Keep user data on the device without sending it to external servers
  • Optimized performance: Leverages ONNX Runtime for efficient model execution on mobile CPUs
  • Simple API: Easy-to-use interface for model loading and inference
  • Expo compatibility: Works seamlessly with both Expo managed and bare workflows

Installation

1. Install peer dependencies

npm install onnxruntime-react-native

2. Install react-native-transformers

# React-Native
npm install react-native-transformers
# Expo
npx expo install react-native-transformers

3. Platform Configuration

React Native CLI

Link the onnxruntime-react-native library:

npx react-native link onnxruntime-react-native
Expo

Add the Expo plugin configuration in app.json or app.config.js:

{ "expo": { "plugins": ["onnxruntime-react-native"] } }

4. Babel Configuration

Add the babel-plugin-transform-import-meta plugin to your Babel configuration:

// babel.config.jsmodule.exports={// ... your existing configplugins: [// ... your existing plugins'babel-plugin-transform-import-meta',],};

You can follow this document to create config file, and you need to run npx expo start --clear to clear the Metro bundler cache.

5. Development Client Setup

For development and testing, it's required to use a development client instead of Expo Go due to the native code of ONNX Runtime and react-native-transformers.

You can set up a development client using one of these methods:

Usage

Text Generation

importReact,{useState,useEffect}from'react';import{View,Text,Button}from'react-native';import{Pipeline}from'react-native-transformers';exportdefaultfunctionApp(){const[output,setOutput]=useState('');const[isLoading,setIsLoading]=useState(false);const[isModelReady,setIsModelReady]=useState(false);// Load model on component mountuseEffect(()=>{loadModel();},[]);constloadModel=async()=>{setIsLoading(true);try{// Load a small Llama modelawaitPipeline.TextGeneration.init('Felladrin/onnx-Llama-160M-Chat-v1','onnx/decoder_model_merged.onnx',{// The fetch function is required to download model filesfetch: async(url)=>{// In a real app, you might want to cache the downloaded filesconstresponse=awaitfetch(url);returnresponse.url;},});setIsModelReady(true);}catch(error){console.error('Error loading model:',error);alert('Failed to load model: '+error.message);}finally{setIsLoading(false);}};constgenerateText=()=>{setOutput('');// Generate text from the prompt and update the UI as tokens are generatedPipeline.TextGeneration.generate('Write a short poem about programming:',(text)=>setOutput(text));};return(<Viewstyle={{padding: 20}}><Buttontitle={isModelReady ? 'Generate Text' : 'Load Model'}onPress={isModelReady ? generateText : loadModel}disabled={isLoading}/><Textstyle={{marginTop: 20}}>{output||'Generated text will appear here'}</Text></View>);}

With Custom Model Download

For Expo applications, use expo-file-system to download models with progress tracking:

import*asFileSystemfrom'expo-file-system';import{Pipeline}from'react-native-transformers';// In your model loading functionawaitPipeline.TextGeneration.init('model-repo','model-file',{fetch: async(url)=>{constlocalPath=FileSystem.cacheDirectory+url.split('/').pop();// Check if file already existsconstfileInfo=awaitFileSystem.getInfoAsync(localPath);if(fileInfo.exists){console.log('Model already downloaded, using cached version');returnlocalPath;}// Download file with progress trackingconstdownloadResumable=FileSystem.createDownloadResumable(url,localPath,{},(progress)=>{constpercentComplete=progress.totalBytesWritten/progress.totalBytesExpectedToWrite;console.log(`Download progress: ${(percentComplete*100).toFixed(1)}%`);});constresult=awaitdownloadResumable.downloadAsync();returnresult?.uri;},});

Supported Models

react-native-transformers works with ONNX-formatted models from Hugging Face. Here are some recommended models based on size and performance:

ModelTypeSizeDescription
Felladrin/onnx-Llama-160M-Chat-v1Text Generation~300MBSmall Llama model (160M parameters)
microsoft/Phi-3-mini-4k-instruct-onnx-webText Generation~1.5GBMicrosoft's Phi-3-mini model
Xenova/distilgpt2_onnx-quantizedText Generation~165MBQuantized DistilGPT-2
Xenova/tiny-mamba-onnxText Generation~85MBTiny Mamba model
Xenova/all-MiniLM-L6-v2-onnxText Embedding~80MBSentence embedding model

API Reference

For detailed API documentation, please visit our TypeDoc documentation.

Contributing

Contributions are welcome! See the contributing guide to learn how to contribute to the repository and the development workflow.

License

This project is licensed under the MIT License. See the LICENSE file for details.

Acknowledgements

  • ONNX Runtime for efficient model execution on mobile devices
  • @huggingface/transformers for transformer model implementations
  • Hugging Face for providing pre-trained models and model hosting

External Links

About

Run local LLM from Huggingface in React-Native or Expo using onnxruntime.

Topics

Resources

Code of conduct

Contributing

Stars

134 stars

Watchers

3 watching

Forks

Releases

Sponsor this project

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

react-native-transformers

⚠️DEPRECATION NOTICE
As of July 2025, this project is no longer actively maintained. While react-native-transformers successfully enables on-device inference of Hugging Face transformer models in React Native and Expo apps, I haven't found a strong or consistent use case to justify continued development.

If you find this project useful and are interested in taking over its maintenance, feel free to fork it or reach out via GitHub. Contributions are still welcome, but this repository is now considered archived in terms of active development.

NPM VersioncodecovTypeDoc

Run Hugging Face transformer models directly on your React Native and Expo applications with on-device inference. No cloud service required!

Overview

react-native-transformers empowers your mobile applications with AI capabilities by running transformer models directly on the device. This means your app can generate text, answer questions, and process language without sending data to external servers - enhancing privacy, reducing latency, and enabling offline functionality.

Built on top of ONNX Runtime, this library provides a streamlined API for integrating state-of-the-art language models into your React Native and Expo applications with minimal configuration.

Key Features

  • On-device inference: Run AI models locally without requiring an internet connection
  • Privacy-focused: Keep user data on the device without sending it to external servers
  • Optimized performance: Leverages ONNX Runtime for efficient model execution on mobile CPUs
  • Simple API: Easy-to-use interface for model loading and inference
  • Expo compatibility: Works seamlessly with both Expo managed and bare workflows

Installation

1. Install peer dependencies

npm install onnxruntime-react-native

2. Install react-native-transformers

# React-Native
npm install react-native-transformers
# Expo
npx expo install react-native-transformers

3. Platform Configuration

React Native CLI

Link the onnxruntime-react-native library:

npx react-native link onnxruntime-react-native
Expo

Add the Expo plugin configuration in app.json or app.config.js:

{ "expo": { "plugins": ["onnxruntime-react-native"] } }

4. Babel Configuration

Add the babel-plugin-transform-import-meta plugin to your Babel configuration:

// babel.config.jsmodule.exports={// ... your existing configplugins: [// ... your existing plugins'babel-plugin-transform-import-meta',],};

You can follow this document to create config file, and you need to run npx expo start --clear to clear the Metro bundler cache.

5. Development Client Setup

For development and testing, it's required to use a development client instead of Expo Go due to the native code of ONNX Runtime and react-native-transformers.

You can set up a development client using one of these methods:

Usage

Text Generation

importReact,{useState,useEffect}from'react';import{View,Text,Button}from'react-native';import{Pipeline}from'react-native-transformers';exportdefaultfunctionApp(){const[output,setOutput]=useState('');const[isLoading,setIsLoading]=useState(false);const[isModelReady,setIsModelReady]=useState(false);// Load model on component mountuseEffect(()=>{loadModel();},[]);constloadModel=async()=>{setIsLoading(true);try{// Load a small Llama modelawaitPipeline.TextGeneration.init('Felladrin/onnx-Llama-160M-Chat-v1','onnx/decoder_model_merged.onnx',{// The fetch function is required to download model filesfetch: async(url)=>{// In a real app, you might want to cache the downloaded filesconstresponse=awaitfetch(url);returnresponse.url;},});setIsModelReady(true);}catch(error){console.error('Error loading model:',error);alert('Failed to load model: '+error.message);}finally{setIsLoading(false);}};constgenerateText=()=>{setOutput('');// Generate text from the prompt and update the UI as tokens are generatedPipeline.TextGeneration.generate('Write a short poem about programming:',(text)=>setOutput(text));};return(<Viewstyle={{padding: 20}}><Buttontitle={isModelReady ? 'Generate Text' : 'Load Model'}onPress={isModelReady ? generateText : loadModel}disabled={isLoading}/><Textstyle={{marginTop: 20}}>{output||'Generated text will appear here'}</Text></View>);}

With Custom Model Download

For Expo applications, use expo-file-system to download models with progress tracking:

import*asFileSystemfrom'expo-file-system';import{Pipeline}from'react-native-transformers';// In your model loading functionawaitPipeline.TextGeneration.init('model-repo','model-file',{fetch: async(url)=>{constlocalPath=FileSystem.cacheDirectory+url.split('/').pop();// Check if file already existsconstfileInfo=awaitFileSystem.getInfoAsync(localPath);if(fileInfo.exists){console.log('Model already downloaded, using cached version');returnlocalPath;}// Download file with progress trackingconstdownloadResumable=FileSystem.createDownloadResumable(url,localPath,{},(progress)=>{constpercentComplete=progress.totalBytesWritten/progress.totalBytesExpectedToWrite;console.log(`Download progress: ${(percentComplete*100).toFixed(1)}%`);});constresult=awaitdownloadResumable.downloadAsync();returnresult?.uri;},});

Supported Models

react-native-transformers works with ONNX-formatted models from Hugging Face. Here are some recommended models based on size and performance:

ModelTypeSizeDescription
Felladrin/onnx-Llama-160M-Chat-v1Text Generation~300MBSmall Llama model (160M parameters)
microsoft/Phi-3-mini-4k-instruct-onnx-webText Generation~1.5GBMicrosoft's Phi-3-mini model
Xenova/distilgpt2_onnx-quantizedText Generation~165MBQuantized DistilGPT-2
Xenova/tiny-mamba-onnxText Generation~85MBTiny Mamba model
Xenova/all-MiniLM-L6-v2-onnxText Embedding~80MBSentence embedding model

API Reference

For detailed API documentation, please visit our TypeDoc documentation.

Contributing

Contributions are welcome! See the contributing guide to learn how to contribute to the repository and the development workflow.

License

This project is licensed under the MIT License. See the LICENSE file for details.

Acknowledgements

  • ONNX Runtime for efficient model execution on mobile devices
  • @huggingface/transformers for transformer model implementations
  • Hugging Face for providing pre-trained models and model hosting

External Links

About

Run local LLM from Huggingface in React-Native or Expo using onnxruntime.

Topics

Resources

Code of conduct

Contributing

Stars

134 stars

Watchers

3 watching

Forks

Releases

Sponsor this project

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

react-native-transformers

⚠️DEPRECATION NOTICE
As of July 2025, this project is no longer actively maintained. While react-native-transformers successfully enables on-device inference of Hugging Face transformer models in React Native and Expo apps, I haven't found a strong or consistent use case to justify continued development.

If you find this project useful and are interested in taking over its maintenance, feel free to fork it or reach out via GitHub. Contributions are still welcome, but this repository is now considered archived in terms of active development.

NPM VersioncodecovTypeDoc

Run Hugging Face transformer models directly on your React Native and Expo applications with on-device inference. No cloud service required!

Overview

react-native-transformers empowers your mobile applications with AI capabilities by running transformer models directly on the device. This means your app can generate text, answer questions, and process language without sending data to external servers - enhancing privacy, reducing latency, and enabling offline functionality.

Built on top of ONNX Runtime, this library provides a streamlined API for integrating state-of-the-art language models into your React Native and Expo applications with minimal configuration.

Key Features

  • On-device inference: Run AI models locally without requiring an internet connection
  • Privacy-focused: Keep user data on the device without sending it to external servers
  • Optimized performance: Leverages ONNX Runtime for efficient model execution on mobile CPUs
  • Simple API: Easy-to-use interface for model loading and inference
  • Expo compatibility: Works seamlessly with both Expo managed and bare workflows

Installation

1. Install peer dependencies

npm install onnxruntime-react-native

2. Install react-native-transformers

# React-Native
npm install react-native-transformers
# Expo
npx expo install react-native-transformers

3. Platform Configuration

React Native CLI

Link the onnxruntime-react-native library:

npx react-native link onnxruntime-react-native
Expo

Add the Expo plugin configuration in app.json or app.config.js:

{ "expo": { "plugins": ["onnxruntime-react-native"] } }

4. Babel Configuration

Add the babel-plugin-transform-import-meta plugin to your Babel configuration:

// babel.config.jsmodule.exports={// ... your existing configplugins: [// ... your existing plugins'babel-plugin-transform-import-meta',],};

You can follow this document to create config file, and you need to run npx expo start --clear to clear the Metro bundler cache.

5. Development Client Setup

For development and testing, it's required to use a development client instead of Expo Go due to the native code of ONNX Runtime and react-native-transformers.

You can set up a development client using one of these methods:

Usage

Text Generation

importReact,{useState,useEffect}from'react';import{View,Text,Button}from'react-native';import{Pipeline}from'react-native-transformers';exportdefaultfunctionApp(){const[output,setOutput]=useState('');const[isLoading,setIsLoading]=useState(false);const[isModelReady,setIsModelReady]=useState(false);// Load model on component mountuseEffect(()=>{loadModel();},[]);constloadModel=async()=>{setIsLoading(true);try{// Load a small Llama modelawaitPipeline.TextGeneration.init('Felladrin/onnx-Llama-160M-Chat-v1','onnx/decoder_model_merged.onnx',{// The fetch function is required to download model filesfetch: async(url)=>{// In a real app, you might want to cache the downloaded filesconstresponse=awaitfetch(url);returnresponse.url;},});setIsModelReady(true);}catch(error){console.error('Error loading model:',error);alert('Failed to load model: '+error.message);}finally{setIsLoading(false);}};constgenerateText=()=>{setOutput('');// Generate text from the prompt and update the UI as tokens are generatedPipeline.TextGeneration.generate('Write a short poem about programming:',(text)=>setOutput(text));};return(<Viewstyle={{padding: 20}}><Buttontitle={isModelReady ? 'Generate Text' : 'Load Model'}onPress={isModelReady ? generateText : loadModel}disabled={isLoading}/><Textstyle={{marginTop: 20}}>{output||'Generated text will appear here'}</Text></View>);}

With Custom Model Download

For Expo applications, use expo-file-system to download models with progress tracking:

import*asFileSystemfrom'expo-file-system';import{Pipeline}from'react-native-transformers';// In your model loading functionawaitPipeline.TextGeneration.init('model-repo','model-file',{fetch: async(url)=>{constlocalPath=FileSystem.cacheDirectory+url.split('/').pop();// Check if file already existsconstfileInfo=awaitFileSystem.getInfoAsync(localPath);if(fileInfo.exists){console.log('Model already downloaded, using cached version');returnlocalPath;}// Download file with progress trackingconstdownloadResumable=FileSystem.createDownloadResumable(url,localPath,{},(progress)=>{constpercentComplete=progress.totalBytesWritten/progress.totalBytesExpectedToWrite;console.log(`Download progress: ${(percentComplete*100).toFixed(1)}%`);});constresult=awaitdownloadResumable.downloadAsync();returnresult?.uri;},});

Supported Models

react-native-transformers works with ONNX-formatted models from Hugging Face. Here are some recommended models based on size and performance:

ModelTypeSizeDescription
Felladrin/onnx-Llama-160M-Chat-v1Text Generation~300MBSmall Llama model (160M parameters)
microsoft/Phi-3-mini-4k-instruct-onnx-webText Generation~1.5GBMicrosoft's Phi-3-mini model
Xenova/distilgpt2_onnx-quantizedText Generation~165MBQuantized DistilGPT-2
Xenova/tiny-mamba-onnxText Generation~85MBTiny Mamba model
Xenova/all-MiniLM-L6-v2-onnxText Embedding~80MBSentence embedding model

API Reference

For detailed API documentation, please visit our TypeDoc documentation.

Contributing

Contributions are welcome! See the contributing guide to learn how to contribute to the repository and the development workflow.

License

This project is licensed under the MIT License. See the LICENSE file for details.

Acknowledgements

  • ONNX Runtime for efficient model execution on mobile devices
  • @huggingface/transformers for transformer model implementations
  • Hugging Face for providing pre-trained models and model hosting

External Links

About

Run local LLM from Huggingface in React-Native or Expo using onnxruntime.

Topics

Resources

Code of conduct

Contributing

Stars

134 stars

Watchers

3 watching

Forks

Releases

Sponsor this project

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

react-native-transformers

⚠️DEPRECATION NOTICE
As of July 2025, this project is no longer actively maintained. While react-native-transformers successfully enables on-device inference of Hugging Face transformer models in React Native and Expo apps, I haven't found a strong or consistent use case to justify continued development.

If you find this project useful and are interested in taking over its maintenance, feel free to fork it or reach out via GitHub. Contributions are still welcome, but this repository is now considered archived in terms of active development.

NPM VersioncodecovTypeDoc

Run Hugging Face transformer models directly on your React Native and Expo applications with on-device inference. No cloud service required!

Overview

react-native-transformers empowers your mobile applications with AI capabilities by running transformer models directly on the device. This means your app can generate text, answer questions, and process language without sending data to external servers - enhancing privacy, reducing latency, and enabling offline functionality.

Built on top of ONNX Runtime, this library provides a streamlined API for integrating state-of-the-art language models into your React Native and Expo applications with minimal configuration.

Key Features

  • On-device inference: Run AI models locally without requiring an internet connection
  • Privacy-focused: Keep user data on the device without sending it to external servers
  • Optimized performance: Leverages ONNX Runtime for efficient model execution on mobile CPUs
  • Simple API: Easy-to-use interface for model loading and inference
  • Expo compatibility: Works seamlessly with both Expo managed and bare workflows

Installation

1. Install peer dependencies

npm install onnxruntime-react-native

2. Install react-native-transformers

# React-Native
npm install react-native-transformers
# Expo
npx expo install react-native-transformers

3. Platform Configuration

React Native CLI

Link the onnxruntime-react-native library:

npx react-native link onnxruntime-react-native
Expo

Add the Expo plugin configuration in app.json or app.config.js:

{ "expo": { "plugins": ["onnxruntime-react-native"] } }

4. Babel Configuration

Add the babel-plugin-transform-import-meta plugin to your Babel configuration:

// babel.config.jsmodule.exports={// ... your existing configplugins: [// ... your existing plugins'babel-plugin-transform-import-meta',],};

You can follow this document to create config file, and you need to run npx expo start --clear to clear the Metro bundler cache.

5. Development Client Setup

For development and testing, it's required to use a development client instead of Expo Go due to the native code of ONNX Runtime and react-native-transformers.

You can set up a development client using one of these methods:

Usage

Text Generation

importReact,{useState,useEffect}from'react';import{View,Text,Button}from'react-native';import{Pipeline}from'react-native-transformers';exportdefaultfunctionApp(){const[output,setOutput]=useState('');const[isLoading,setIsLoading]=useState(false);const[isModelReady,setIsModelReady]=useState(false);// Load model on component mountuseEffect(()=>{loadModel();},[]);constloadModel=async()=>{setIsLoading(true);try{// Load a small Llama modelawaitPipeline.TextGeneration.init('Felladrin/onnx-Llama-160M-Chat-v1','onnx/decoder_model_merged.onnx',{// The fetch function is required to download model filesfetch: async(url)=>{// In a real app, you might want to cache the downloaded filesconstresponse=awaitfetch(url);returnresponse.url;},});setIsModelReady(true);}catch(error){console.error('Error loading model:',error);alert('Failed to load model: '+error.message);}finally{setIsLoading(false);}};constgenerateText=()=>{setOutput('');// Generate text from the prompt and update the UI as tokens are generatedPipeline.TextGeneration.generate('Write a short poem about programming:',(text)=>setOutput(text));};return(<Viewstyle={{padding: 20}}><Buttontitle={isModelReady ? 'Generate Text' : 'Load Model'}onPress={isModelReady ? generateText : loadModel}disabled={isLoading}/><Textstyle={{marginTop: 20}}>{output||'Generated text will appear here'}</Text></View>);}

With Custom Model Download

For Expo applications, use expo-file-system to download models with progress tracking:

import*asFileSystemfrom'expo-file-system';import{Pipeline}from'react-native-transformers';// In your model loading functionawaitPipeline.TextGeneration.init('model-repo','model-file',{fetch: async(url)=>{constlocalPath=FileSystem.cacheDirectory+url.split('/').pop();// Check if file already existsconstfileInfo=awaitFileSystem.getInfoAsync(localPath);if(fileInfo.exists){console.log('Model already downloaded, using cached version');returnlocalPath;}// Download file with progress trackingconstdownloadResumable=FileSystem.createDownloadResumable(url,localPath,{},(progress)=>{constpercentComplete=progress.totalBytesWritten/progress.totalBytesExpectedToWrite;console.log(`Download progress: ${(percentComplete*100).toFixed(1)}%`);});constresult=awaitdownloadResumable.downloadAsync();returnresult?.uri;},});

Supported Models

react-native-transformers works with ONNX-formatted models from Hugging Face. Here are some recommended models based on size and performance:

ModelTypeSizeDescription
Felladrin/onnx-Llama-160M-Chat-v1Text Generation~300MBSmall Llama model (160M parameters)
microsoft/Phi-3-mini-4k-instruct-onnx-webText Generation~1.5GBMicrosoft's Phi-3-mini model
Xenova/distilgpt2_onnx-quantizedText Generation~165MBQuantized DistilGPT-2
Xenova/tiny-mamba-onnxText Generation~85MBTiny Mamba model
Xenova/all-MiniLM-L6-v2-onnxText Embedding~80MBSentence embedding model

API Reference

For detailed API documentation, please visit our TypeDoc documentation.

Contributing

Contributions are welcome! See the contributing guide to learn how to contribute to the repository and the development workflow.

License

This project is licensed under the MIT License. See the LICENSE file for details.

Acknowledgements

  • ONNX Runtime for efficient model execution on mobile devices
  • @huggingface/transformers for transformer model implementations
  • Hugging Face for providing pre-trained models and model hosting

External Links

About

Run local LLM from Huggingface in React-Native or Expo using onnxruntime.

Topics

Resources

Code of conduct

Contributing

Stars

134 stars

Watchers

3 watching

Forks

Releases

Sponsor this project

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

react-native-transformers

⚠️DEPRECATION NOTICE
As of July 2025, this project is no longer actively maintained. While react-native-transformers successfully enables on-device inference of Hugging Face transformer models in React Native and Expo apps, I haven't found a strong or consistent use case to justify continued development.

If you find this project useful and are interested in taking over its maintenance, feel free to fork it or reach out via GitHub. Contributions are still welcome, but this repository is now considered archived in terms of active development.

NPM VersioncodecovTypeDoc

Run Hugging Face transformer models directly on your React Native and Expo applications with on-device inference. No cloud service required!

Overview

react-native-transformers empowers your mobile applications with AI capabilities by running transformer models directly on the device. This means your app can generate text, answer questions, and process language without sending data to external servers - enhancing privacy, reducing latency, and enabling offline functionality.

Built on top of ONNX Runtime, this library provides a streamlined API for integrating state-of-the-art language models into your React Native and Expo applications with minimal configuration.

Key Features

  • On-device inference: Run AI models locally without requiring an internet connection
  • Privacy-focused: Keep user data on the device without sending it to external servers
  • Optimized performance: Leverages ONNX Runtime for efficient model execution on mobile CPUs
  • Simple API: Easy-to-use interface for model loading and inference
  • Expo compatibility: Works seamlessly with both Expo managed and bare workflows

Installation

1. Install peer dependencies

npm install onnxruntime-react-native

2. Install react-native-transformers

# React-Native
npm install react-native-transformers
# Expo
npx expo install react-native-transformers

3. Platform Configuration

React Native CLI

Link the onnxruntime-react-native library:

npx react-native link onnxruntime-react-native
Expo

Add the Expo plugin configuration in app.json or app.config.js:

{ "expo": { "plugins": ["onnxruntime-react-native"] } }

4. Babel Configuration

Add the babel-plugin-transform-import-meta plugin to your Babel configuration:

// babel.config.jsmodule.exports={// ... your existing configplugins: [// ... your existing plugins'babel-plugin-transform-import-meta',],};

You can follow this document to create config file, and you need to run npx expo start --clear to clear the Metro bundler cache.

5. Development Client Setup

For development and testing, it's required to use a development client instead of Expo Go due to the native code of ONNX Runtime and react-native-transformers.

You can set up a development client using one of these methods:

Usage

Text Generation

importReact,{useState,useEffect}from'react';import{View,Text,Button}from'react-native';import{Pipeline}from'react-native-transformers';exportdefaultfunctionApp(){const[output,setOutput]=useState('');const[isLoading,setIsLoading]=useState(false);const[isModelReady,setIsModelReady]=useState(false);// Load model on component mountuseEffect(()=>{loadModel();},[]);constloadModel=async()=>{setIsLoading(true);try{// Load a small Llama modelawaitPipeline.TextGeneration.init('Felladrin/onnx-Llama-160M-Chat-v1','onnx/decoder_model_merged.onnx',{// The fetch function is required to download model filesfetch: async(url)=>{// In a real app, you might want to cache the downloaded filesconstresponse=awaitfetch(url);returnresponse.url;},});setIsModelReady(true);}catch(error){console.error('Error loading model:',error);alert('Failed to load model: '+error.message);}finally{setIsLoading(false);}};constgenerateText=()=>{setOutput('');// Generate text from the prompt and update the UI as tokens are generatedPipeline.TextGeneration.generate('Write a short poem about programming:',(text)=>setOutput(text));};return(<Viewstyle={{padding: 20}}><Buttontitle={isModelReady ? 'Generate Text' : 'Load Model'}onPress={isModelReady ? generateText : loadModel}disabled={isLoading}/><Textstyle={{marginTop: 20}}>{output||'Generated text will appear here'}</Text></View>);}

With Custom Model Download

For Expo applications, use expo-file-system to download models with progress tracking:

import*asFileSystemfrom'expo-file-system';import{Pipeline}from'react-native-transformers';// In your model loading functionawaitPipeline.TextGeneration.init('model-repo','model-file',{fetch: async(url)=>{constlocalPath=FileSystem.cacheDirectory+url.split('/').pop();// Check if file already existsconstfileInfo=awaitFileSystem.getInfoAsync(localPath);if(fileInfo.exists){console.log('Model already downloaded, using cached version');returnlocalPath;}// Download file with progress trackingconstdownloadResumable=FileSystem.createDownloadResumable(url,localPath,{},(progress)=>{constpercentComplete=progress.totalBytesWritten/progress.totalBytesExpectedToWrite;console.log(`Download progress: ${(percentComplete*100).toFixed(1)}%`);});constresult=awaitdownloadResumable.downloadAsync();returnresult?.uri;},});

Supported Models

react-native-transformers works with ONNX-formatted models from Hugging Face. Here are some recommended models based on size and performance:

ModelTypeSizeDescription
Felladrin/onnx-Llama-160M-Chat-v1Text Generation~300MBSmall Llama model (160M parameters)
microsoft/Phi-3-mini-4k-instruct-onnx-webText Generation~1.5GBMicrosoft's Phi-3-mini model
Xenova/distilgpt2_onnx-quantizedText Generation~165MBQuantized DistilGPT-2
Xenova/tiny-mamba-onnxText Generation~85MBTiny Mamba model
Xenova/all-MiniLM-L6-v2-onnxText Embedding~80MBSentence embedding model

API Reference

For detailed API documentation, please visit our TypeDoc documentation.

Contributing

Contributions are welcome! See the contributing guide to learn how to contribute to the repository and the development workflow.

License

This project is licensed under the MIT License. See the LICENSE file for details.

Acknowledgements

  • ONNX Runtime for efficient model execution on mobile devices
  • @huggingface/transformers for transformer model implementations
  • Hugging Face for providing pre-trained models and model hosting

External Links

About

Run local LLM from Huggingface in React-Native or Expo using onnxruntime.

Topics

Resources

Code of conduct

Contributing

Stars

134 stars

Watchers

3 watching

Forks

Releases

Sponsor this project

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

react-native-transformers

⚠️DEPRECATION NOTICE
As of July 2025, this project is no longer actively maintained. While react-native-transformers successfully enables on-device inference of Hugging Face transformer models in React Native and Expo apps, I haven't found a strong or consistent use case to justify continued development.

If you find this project useful and are interested in taking over its maintenance, feel free to fork it or reach out via GitHub. Contributions are still welcome, but this repository is now considered archived in terms of active development.

NPM VersioncodecovTypeDoc

Run Hugging Face transformer models directly on your React Native and Expo applications with on-device inference. No cloud service required!

Overview

react-native-transformers empowers your mobile applications with AI capabilities by running transformer models directly on the device. This means your app can generate text, answer questions, and process language without sending data to external servers - enhancing privacy, reducing latency, and enabling offline functionality.

Built on top of ONNX Runtime, this library provides a streamlined API for integrating state-of-the-art language models into your React Native and Expo applications with minimal configuration.

Key Features

  • On-device inference: Run AI models locally without requiring an internet connection
  • Privacy-focused: Keep user data on the device without sending it to external servers
  • Optimized performance: Leverages ONNX Runtime for efficient model execution on mobile CPUs
  • Simple API: Easy-to-use interface for model loading and inference
  • Expo compatibility: Works seamlessly with both Expo managed and bare workflows

Installation

1. Install peer dependencies

npm install onnxruntime-react-native

2. Install react-native-transformers

# React-Native
npm install react-native-transformers
# Expo
npx expo install react-native-transformers

3. Platform Configuration

React Native CLI

Link the onnxruntime-react-native library:

npx react-native link onnxruntime-react-native
Expo

Add the Expo plugin configuration in app.json or app.config.js:

{ "expo": { "plugins": ["onnxruntime-react-native"] } }

4. Babel Configuration

Add the babel-plugin-transform-import-meta plugin to your Babel configuration:

// babel.config.jsmodule.exports={// ... your existing configplugins: [// ... your existing plugins'babel-plugin-transform-import-meta',],};

You can follow this document to create config file, and you need to run npx expo start --clear to clear the Metro bundler cache.

5. Development Client Setup

For development and testing, it's required to use a development client instead of Expo Go due to the native code of ONNX Runtime and react-native-transformers.

You can set up a development client using one of these methods:

Usage

Text Generation

importReact,{useState,useEffect}from'react';import{View,Text,Button}from'react-native';import{Pipeline}from'react-native-transformers';exportdefaultfunctionApp(){const[output,setOutput]=useState('');const[isLoading,setIsLoading]=useState(false);const[isModelReady,setIsModelReady]=useState(false);// Load model on component mountuseEffect(()=>{loadModel();},[]);constloadModel=async()=>{setIsLoading(true);try{// Load a small Llama modelawaitPipeline.TextGeneration.init('Felladrin/onnx-Llama-160M-Chat-v1','onnx/decoder_model_merged.onnx',{// The fetch function is required to download model filesfetch: async(url)=>{// In a real app, you might want to cache the downloaded filesconstresponse=awaitfetch(url);returnresponse.url;},});setIsModelReady(true);}catch(error){console.error('Error loading model:',error);alert('Failed to load model: '+error.message);}finally{setIsLoading(false);}};constgenerateText=()=>{setOutput('');// Generate text from the prompt and update the UI as tokens are generatedPipeline.TextGeneration.generate('Write a short poem about programming:',(text)=>setOutput(text));};return(<Viewstyle={{padding: 20}}><Buttontitle={isModelReady ? 'Generate Text' : 'Load Model'}onPress={isModelReady ? generateText : loadModel}disabled={isLoading}/><Textstyle={{marginTop: 20}}>{output||'Generated text will appear here'}</Text></View>);}

With Custom Model Download

For Expo applications, use expo-file-system to download models with progress tracking:

import*asFileSystemfrom'expo-file-system';import{Pipeline}from'react-native-transformers';// In your model loading functionawaitPipeline.TextGeneration.init('model-repo','model-file',{fetch: async(url)=>{constlocalPath=FileSystem.cacheDirectory+url.split('/').pop();// Check if file already existsconstfileInfo=awaitFileSystem.getInfoAsync(localPath);if(fileInfo.exists){console.log('Model already downloaded, using cached version');returnlocalPath;}// Download file with progress trackingconstdownloadResumable=FileSystem.createDownloadResumable(url,localPath,{},(progress)=>{constpercentComplete=progress.totalBytesWritten/progress.totalBytesExpectedToWrite;console.log(`Download progress: ${(percentComplete*100).toFixed(1)}%`);});constresult=awaitdownloadResumable.downloadAsync();returnresult?.uri;},});

Supported Models

react-native-transformers works with ONNX-formatted models from Hugging Face. Here are some recommended models based on size and performance:

ModelTypeSizeDescription
Felladrin/onnx-Llama-160M-Chat-v1Text Generation~300MBSmall Llama model (160M parameters)
microsoft/Phi-3-mini-4k-instruct-onnx-webText Generation~1.5GBMicrosoft's Phi-3-mini model
Xenova/distilgpt2_onnx-quantizedText Generation~165MBQuantized DistilGPT-2
Xenova/tiny-mamba-onnxText Generation~85MBTiny Mamba model
Xenova/all-MiniLM-L6-v2-onnxText Embedding~80MBSentence embedding model

API Reference

For detailed API documentation, please visit our TypeDoc documentation.

Contributing

Contributions are welcome! See the contributing guide to learn how to contribute to the repository and the development workflow.

License

This project is licensed under the MIT License. See the LICENSE file for details.

Acknowledgements

  • ONNX Runtime for efficient model execution on mobile devices
  • @huggingface/transformers for transformer model implementations
  • Hugging Face for providing pre-trained models and model hosting

External Links

About

Run local LLM from Huggingface in React-Native or Expo using onnxruntime.

Topics

Resources

Code of conduct

Contributing

Stars

134 stars

Watchers

3 watching

Forks

Releases

Sponsor this project

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

react-native-transformers

⚠️DEPRECATION NOTICE
As of July 2025, this project is no longer actively maintained. While react-native-transformers successfully enables on-device inference of Hugging Face transformer models in React Native and Expo apps, I haven't found a strong or consistent use case to justify continued development.

If you find this project useful and are interested in taking over its maintenance, feel free to fork it or reach out via GitHub. Contributions are still welcome, but this repository is now considered archived in terms of active development.

NPM VersioncodecovTypeDoc

Run Hugging Face transformer models directly on your React Native and Expo applications with on-device inference. No cloud service required!

Overview

react-native-transformers empowers your mobile applications with AI capabilities by running transformer models directly on the device. This means your app can generate text, answer questions, and process language without sending data to external servers - enhancing privacy, reducing latency, and enabling offline functionality.

Built on top of ONNX Runtime, this library provides a streamlined API for integrating state-of-the-art language models into your React Native and Expo applications with minimal configuration.

Key Features

  • On-device inference: Run AI models locally without requiring an internet connection
  • Privacy-focused: Keep user data on the device without sending it to external servers
  • Optimized performance: Leverages ONNX Runtime for efficient model execution on mobile CPUs
  • Simple API: Easy-to-use interface for model loading and inference
  • Expo compatibility: Works seamlessly with both Expo managed and bare workflows

Installation

1. Install peer dependencies

npm install onnxruntime-react-native

2. Install react-native-transformers

# React-Native
npm install react-native-transformers
# Expo
npx expo install react-native-transformers

3. Platform Configuration

React Native CLI

Link the onnxruntime-react-native library:

npx react-native link onnxruntime-react-native
Expo

Add the Expo plugin configuration in app.json or app.config.js:

{ "expo": { "plugins": ["onnxruntime-react-native"] } }

4. Babel Configuration

Add the babel-plugin-transform-import-meta plugin to your Babel configuration:

// babel.config.jsmodule.exports={// ... your existing configplugins: [// ... your existing plugins'babel-plugin-transform-import-meta',],};

You can follow this document to create config file, and you need to run npx expo start --clear to clear the Metro bundler cache.

5. Development Client Setup

For development and testing, it's required to use a development client instead of Expo Go due to the native code of ONNX Runtime and react-native-transformers.

You can set up a development client using one of these methods:

Usage

Text Generation

importReact,{useState,useEffect}from'react';import{View,Text,Button}from'react-native';import{Pipeline}from'react-native-transformers';exportdefaultfunctionApp(){const[output,setOutput]=useState('');const[isLoading,setIsLoading]=useState(false);const[isModelReady,setIsModelReady]=useState(false);// Load model on component mountuseEffect(()=>{loadModel();},[]);constloadModel=async()=>{setIsLoading(true);try{// Load a small Llama modelawaitPipeline.TextGeneration.init('Felladrin/onnx-Llama-160M-Chat-v1','onnx/decoder_model_merged.onnx',{// The fetch function is required to download model filesfetch: async(url)=>{// In a real app, you might want to cache the downloaded filesconstresponse=awaitfetch(url);returnresponse.url;},});setIsModelReady(true);}catch(error){console.error('Error loading model:',error);alert('Failed to load model: '+error.message);}finally{setIsLoading(false);}};constgenerateText=()=>{setOutput('');// Generate text from the prompt and update the UI as tokens are generatedPipeline.TextGeneration.generate('Write a short poem about programming:',(text)=>setOutput(text));};return(<Viewstyle={{padding: 20}}><Buttontitle={isModelReady ? 'Generate Text' : 'Load Model'}onPress={isModelReady ? generateText : loadModel}disabled={isLoading}/><Textstyle={{marginTop: 20}}>{output||'Generated text will appear here'}</Text></View>);}

With Custom Model Download

For Expo applications, use expo-file-system to download models with progress tracking:

import*asFileSystemfrom'expo-file-system';import{Pipeline}from'react-native-transformers';// In your model loading functionawaitPipeline.TextGeneration.init('model-repo','model-file',{fetch: async(url)=>{constlocalPath=FileSystem.cacheDirectory+url.split('/').pop();// Check if file already existsconstfileInfo=awaitFileSystem.getInfoAsync(localPath);if(fileInfo.exists){console.log('Model already downloaded, using cached version');returnlocalPath;}// Download file with progress trackingconstdownloadResumable=FileSystem.createDownloadResumable(url,localPath,{},(progress)=>{constpercentComplete=progress.totalBytesWritten/progress.totalBytesExpectedToWrite;console.log(`Download progress: ${(percentComplete*100).toFixed(1)}%`);});constresult=awaitdownloadResumable.downloadAsync();returnresult?.uri;},});

Supported Models

react-native-transformers works with ONNX-formatted models from Hugging Face. Here are some recommended models based on size and performance:

ModelTypeSizeDescription
Felladrin/onnx-Llama-160M-Chat-v1Text Generation~300MBSmall Llama model (160M parameters)
microsoft/Phi-3-mini-4k-instruct-onnx-webText Generation~1.5GBMicrosoft's Phi-3-mini model
Xenova/distilgpt2_onnx-quantizedText Generation~165MBQuantized DistilGPT-2
Xenova/tiny-mamba-onnxText Generation~85MBTiny Mamba model
Xenova/all-MiniLM-L6-v2-onnxText Embedding~80MBSentence embedding model

API Reference

For detailed API documentation, please visit our TypeDoc documentation.

Contributing

Contributions are welcome! See the contributing guide to learn how to contribute to the repository and the development workflow.

License

This project is licensed under the MIT License. See the LICENSE file for details.

Acknowledgements

  • ONNX Runtime for efficient model execution on mobile devices
  • @huggingface/transformers for transformer model implementations
  • Hugging Face for providing pre-trained models and model hosting

External Links

About

Run local LLM from Huggingface in React-Native or Expo using onnxruntime.

Topics

Resources

Code of conduct

Contributing

Stars

134 stars

Watchers

3 watching

Forks

Releases

Sponsor this project

Used by

Contributors

Languages