NightMean/OlliteRT

Turn your Android phone into an OpenAI-compatible LLM inference server - Fully local, private and Open Source

327

stars

1,202

commits

Kotlin

primary language

Sep 5, 2026

updated

android
anthropic-api
gemma
home-assistant
kotlin-android
litert
litert-lm
llm
llm-inference
local-llm
on-device-ai
openai-api

README

OlliteRT Icon

OlliteRT

Quick Start | Screenshots | Features | Models | Integrations | API | FAQ | Report a bug

Turn your Android phone into an OpenAI-compatible API LLM server — fully local, private, and open source

GitHub Release Downloads Buy Me a Coffee
OpenAI Compatible Anthropic Compatible
Android 12+ License

What is OlliteRT?

Think of it as Ollama for Android. Pick a model, tap Start, and your phone becomes an LLM server — runs LLMs on your mobile GPU/CPU via Google's LiteRT-LM runtime and serves them as a standard OpenAI-compatible HTTP API on your local network.

No cloud. No API keys. No subscriptions. Just your phone.

Features

  • Multi-model Support — One-tap download from HuggingFace, import .litertlm files or model lists from local storage, or add custom model sources via JSON file or URL
  • Multimodal & Reasoning — Vision, audio, thinking, streaming support, and tool calling (experimental) for capable models
  • Benchmark Built-in — Test and compare models on your device to find the best fit for your hardware
  • Activity Logs — Detailed request/response logs with search, filtering, and JSON highlighting
  • Always On, Low Power — Configurable auto-start on boot, sips ~5-10W vs 300W+ for a GPU server — perfect for that old phone in your drawer*
  • Highly Configurable — Per-model inference settings, GPU/CPU accelerator, idle model unload, listener scope, client IP access rules, bearer token auth, and more
  • Model & Server Monitoring — Live stats dashboard, Prometheus metrics for Grafana, and Home Assistant REST API for remote server control
  • Broad Compatibility — Home Assistant, Open WebUI, OpenClaw, Python, curl — if it talks to OpenAI, it works

[!NOTE] Home Assistant currently requires a custom integration such as Extended OpenAI Conversation or Local OpenAI LLM and OpenAI STT for voice commands — see the Home Assistant client setup

* I am not responsible for any swollen batteries, crispy phones, or spontaneous pocket warmers. Please don't run your LLM on your phone while it's under your pillow. You've been warned.

Screenshots

Models Inference Status Logs

Quick Start

  1. Download & install the APK
    Get it on GitHub
  2. Download a modelGemma 4 E2B is recommended for most devices (2.4 GB, runs on 8 GB RAM)
  3. Start the server — Tap the Start Server button on the downloaded model card
  4. Configure your client — Use the endpoint shown on the Status screen (e.g. http://PHONE_IP:8000/v1) with any OpenAI-compatible client — Open WebUI, OpenClaw, Home Assistant, Python, etc. See Client Setup for detailed guides.

[!IMPORTANT] Requires: Android 12+ · arm64-v8a device · 6 GB RAM minimum · 8 GB+ recommended for multimodal models (see model table)

Available Models

ModelSizeMin RAMContextCapabilities
Gemma 4 E2B2.4 GB8 GB32KText · Vision · Audio · Thinking · Tools · MTP
Gemma 4 E4B3.4 GB12 GB32KText · Vision · Audio · Thinking · Tools · MTP
Gemma 3n E2B3.4 GB8 GB4KText · Vision · Audio
Gemma 3n E4B4.6 GB12 GB4KText · Vision · Audio
Gemma 3 1B0.5 GB6 GB1KText
Qwen 2.5 1.5B1.5 GB6 GB4KText
DeepSeek-R1 1.5B1.7 GB6 GB4KText

⭐ Recommended — E2B for most devices, E4B for high-end

[!NOTE] Tool calling is experimental and may not always be reliable due to model limitations.

See the Model Guide for recommendations, capability details, and import instructions.

Integrations

API Endpoints

Available endpoints — click to expand
MethodEndpointDescription
POST/v1/chat/completionsOpenAI Chat Completions API (streaming + non-streaming)
POST/v1/completionsOpenAI Completions API
POST/v1/responsesOpenAI Responses API
POST/v1/messagesAnthropic Messages API (streaming + non-streaming)
POST/v1/messages/count_tokensAnthropic input-token estimator
POST/v1/audio/transcriptionsAudio transcription
GET/v1/modelsList available models
GET/v1/models/{id}Get detail for a specific model
GET/ or /v1Server info (version, status, endpoints)
GET/healthHealth check (with optional ?metrics=true)
GET/metricsPrometheus metrics
GET/pingSimple liveness check
GET/v1/server/configRead model and server configuration
POST/v1/server/configUpdate model and server configuration

Full API docs and examples: docs/api/API.md

Limitations

Known limitations — click to expand
  • arm64-v8a only — other architectures (armeabi-v7a, x86, x86_64) are not supported. The LiteRT runtime ships native libraries for x86_64 but they crash on Android emulators due to unsupported CPU instructions. Nearly all Android devices from 2017+ are arm64-v8a.
  • Single model, single request — one model loaded at a time, requests queue sequentially (LiteRT SDK limitation). On-demand model loading via client requests is planned for a future release.
  • Tool calling is model-dependent — Native tool calling requires models trained for function calling (such as Gemma 4). For models that don't support native tool calling, you can disable Tool Schema Injection in settings to use prompt-based fallback parsing instead.
  • Token counts are estimated — the LiteRT runtime doesn't expose a tokenizer API, so counts are approximated using character length ÷ 4. Reasonably accurate for English text, less so for code or multilingual content.
  • Imported models are copied to app storage — when importing a model from your device, the file is copied rather than moved. You can delete the original after import to reclaim space.
  • No GGUF support — only .litertlm models are supported (LiteRT runtime limitation). Models are available from the LiteRT Community on HuggingFace. Advanced users can convert HuggingFace models to .litertlm using Google's litert-torch tooling (Linux, 32GB+ RAM required).
  • LiteRT runtime constraints — OlliteRT is built on Google's LiteRT-LM runtime, optimized for mobile. Features like logprobs, grammar-based output constraints, repetition penalties, and LoRA adapters are not available.

FAQ & Troubleshooting

  • FAQ — Model support, privacy, battery, architecture, tool calling
  • Troubleshooting — Connection issues, performance, crashes, auto-start, storage

Privacy & Security

  • Privacy Policy — no data is collected, no telemetry, no analytics
  • Security Guide — bearer token auth, network exposure, HTTPS, securing your server

Contributing

Building from Source

  • Building — build instructions, signing setup, lint, and tests
  • Architecture — package structure, request flow, and dependency list

Product flavors — all installable side-by-side:

FlavorIconPurpose
stableStable release
betaBeta testing
devLocal development

Support the Project

What happens on your phone stays on your phone. If that matters to you, consider supporting OlliteRT.

   

Credits

License

Licensed under the Apache License 2.0.

Contributors

NightMean

1,202 commits

NightMean/OlliteRT

Turn your Android phone into an OpenAI-compatible LLM inference server - Fully local, private and Open Source

327

stars

1,202

commits

Kotlin

primary language

Sep 5, 2026

updated

android
anthropic-api
gemma
home-assistant
kotlin-android
litert
litert-lm
llm
llm-inference
local-llm
on-device-ai
openai-api

README

OlliteRT Icon

OlliteRT

Quick Start | Screenshots | Features | Models | Integrations | API | FAQ | Report a bug

Turn your Android phone into an OpenAI-compatible API LLM server — fully local, private, and open source

GitHub Release Downloads Buy Me a Coffee
OpenAI Compatible Anthropic Compatible
Android 12+ License

What is OlliteRT?

Think of it as Ollama for Android. Pick a model, tap Start, and your phone becomes an LLM server — runs LLMs on your mobile GPU/CPU via Google's LiteRT-LM runtime and serves them as a standard OpenAI-compatible HTTP API on your local network.

No cloud. No API keys. No subscriptions. Just your phone.

Features

  • Multi-model Support — One-tap download from HuggingFace, import .litertlm files or model lists from local storage, or add custom model sources via JSON file or URL
  • Multimodal & Reasoning — Vision, audio, thinking, streaming support, and tool calling (experimental) for capable models
  • Benchmark Built-in — Test and compare models on your device to find the best fit for your hardware
  • Activity Logs — Detailed request/response logs with search, filtering, and JSON highlighting
  • Always On, Low Power — Configurable auto-start on boot, sips ~5-10W vs 300W+ for a GPU server — perfect for that old phone in your drawer*
  • Highly Configurable — Per-model inference settings, GPU/CPU accelerator, idle model unload, listener scope, client IP access rules, bearer token auth, and more
  • Model & Server Monitoring — Live stats dashboard, Prometheus metrics for Grafana, and Home Assistant REST API for remote server control
  • Broad Compatibility — Home Assistant, Open WebUI, OpenClaw, Python, curl — if it talks to OpenAI, it works

[!NOTE] Home Assistant currently requires a custom integration such as Extended OpenAI Conversation or Local OpenAI LLM and OpenAI STT for voice commands — see the Home Assistant client setup

* I am not responsible for any swollen batteries, crispy phones, or spontaneous pocket warmers. Please don't run your LLM on your phone while it's under your pillow. You've been warned.

Screenshots

Models Inference Status Logs

Quick Start

  1. Download & install the APK
    Get it on GitHub
  2. Download a modelGemma 4 E2B is recommended for most devices (2.4 GB, runs on 8 GB RAM)
  3. Start the server — Tap the Start Server button on the downloaded model card
  4. Configure your client — Use the endpoint shown on the Status screen (e.g. http://PHONE_IP:8000/v1) with any OpenAI-compatible client — Open WebUI, OpenClaw, Home Assistant, Python, etc. See Client Setup for detailed guides.

[!IMPORTANT] Requires: Android 12+ · arm64-v8a device · 6 GB RAM minimum · 8 GB+ recommended for multimodal models (see model table)

Available Models

ModelSizeMin RAMContextCapabilities
Gemma 4 E2B2.4 GB8 GB32KText · Vision · Audio · Thinking · Tools · MTP
Gemma 4 E4B3.4 GB12 GB32KText · Vision · Audio · Thinking · Tools · MTP
Gemma 3n E2B3.4 GB8 GB4KText · Vision · Audio
Gemma 3n E4B4.6 GB12 GB4KText · Vision · Audio
Gemma 3 1B0.5 GB6 GB1KText
Qwen 2.5 1.5B1.5 GB6 GB4KText
DeepSeek-R1 1.5B1.7 GB6 GB4KText

⭐ Recommended — E2B for most devices, E4B for high-end

[!NOTE] Tool calling is experimental and may not always be reliable due to model limitations.

See the Model Guide for recommendations, capability details, and import instructions.

Integrations

API Endpoints

Available endpoints — click to expand
MethodEndpointDescription
POST/v1/chat/completionsOpenAI Chat Completions API (streaming + non-streaming)
POST/v1/completionsOpenAI Completions API
POST/v1/responsesOpenAI Responses API
POST/v1/messagesAnthropic Messages API (streaming + non-streaming)
POST/v1/messages/count_tokensAnthropic input-token estimator
POST/v1/audio/transcriptionsAudio transcription
GET/v1/modelsList available models
GET/v1/models/{id}Get detail for a specific model
GET/ or /v1Server info (version, status, endpoints)
GET/healthHealth check (with optional ?metrics=true)
GET/metricsPrometheus metrics
GET/pingSimple liveness check
GET/v1/server/configRead model and server configuration
POST/v1/server/configUpdate model and server configuration

Full API docs and examples: docs/api/API.md

Limitations

Known limitations — click to expand
  • arm64-v8a only — other architectures (armeabi-v7a, x86, x86_64) are not supported. The LiteRT runtime ships native libraries for x86_64 but they crash on Android emulators due to unsupported CPU instructions. Nearly all Android devices from 2017+ are arm64-v8a.
  • Single model, single request — one model loaded at a time, requests queue sequentially (LiteRT SDK limitation). On-demand model loading via client requests is planned for a future release.
  • Tool calling is model-dependent — Native tool calling requires models trained for function calling (such as Gemma 4). For models that don't support native tool calling, you can disable Tool Schema Injection in settings to use prompt-based fallback parsing instead.
  • Token counts are estimated — the LiteRT runtime doesn't expose a tokenizer API, so counts are approximated using character length ÷ 4. Reasonably accurate for English text, less so for code or multilingual content.
  • Imported models are copied to app storage — when importing a model from your device, the file is copied rather than moved. You can delete the original after import to reclaim space.
  • No GGUF support — only .litertlm models are supported (LiteRT runtime limitation). Models are available from the LiteRT Community on HuggingFace. Advanced users can convert HuggingFace models to .litertlm using Google's litert-torch tooling (Linux, 32GB+ RAM required).
  • LiteRT runtime constraints — OlliteRT is built on Google's LiteRT-LM runtime, optimized for mobile. Features like logprobs, grammar-based output constraints, repetition penalties, and LoRA adapters are not available.

FAQ & Troubleshooting

  • FAQ — Model support, privacy, battery, architecture, tool calling
  • Troubleshooting — Connection issues, performance, crashes, auto-start, storage

Privacy & Security

  • Privacy Policy — no data is collected, no telemetry, no analytics
  • Security Guide — bearer token auth, network exposure, HTTPS, securing your server

Contributing

Building from Source

  • Building — build instructions, signing setup, lint, and tests
  • Architecture — package structure, request flow, and dependency list

Product flavors — all installable side-by-side:

FlavorIconPurpose
stableStable release
betaBeta testing
devLocal development

Support the Project

What happens on your phone stays on your phone. If that matters to you, consider supporting OlliteRT.

   

Credits

License

Licensed under the Apache License 2.0.

Contributors

NightMean

1,202 commits

Languages

Kotlin

100.0%