Omni is an experimental open-source Android agent that can see the current screen and operate the phone through Android's Accessibility API. Give it a goal and it can tap, type, swipe, navigate, open apps, and adapt as the screen changes.
8k5aKAlmROHN3diZ.mp4
omni-mobile/— native Kotlin Android applicationomni_backend/— self-hostable Elixir/Phoenix API
The community build uses your own backend and API keys. It does not require Google sign-in, Google Play, Aptoide, Stripe, or a store subscription.
- An Android 10+ phone or emulator
- USB debugging enabled on the phone
- Android Studio with Android SDK 35 and JDK 17
- Elixir 1.19 with Erlang/OTP 28
- Docker with Docker Compose, used for PostgreSQL
- One supported LLM API key
Linux and macOS commands are shown below. On Windows, use WSL or the equivalent PowerShell commands.
git clone https://github.com/stevancarlon/omni.git
cd omniYou need one LLM provider. Put its key, provider name, and model in
omni_backend/.env.
| Provider | Environment variable | Provider value | Example model | Notes |
|---|---|---|---|---|
| Gemini | GEMINI_API_KEY |
gemini |
gemini-2.5-pro |
Supports annotated screenshots |
| Groq | GROQ_API_KEY |
groq |
llama-3.3-70b-versatile |
Fast, but this adapter uses screen text rather than images |
| OpenAI | OPENAI_API_KEY |
openai |
gpt-5.5 |
Also enables Whisper and app-inventory enhancement |
| Anthropic | ANTHROPIC_API_KEY |
claude |
claude-opus-4-6 |
Supports annotated screenshots |
Optional keys:
DEEPGRAM_API_KEYenables wake-word listening and streaming speech recognition. The key must be able to create temporary auth grants.OPENAI_API_KEYadditionally enables Whisper transcription refinement and a generated installed-app inventory when OpenAI is not the main LLM provider.
Store and hosted-service credentials such as Google OAuth, Google Play, Aptoide, Stripe, and Android signing keys are not needed for the community build.
API providers charge according to their own pricing. Set spending limits before testing autonomous tasks.
Create your local environment file:
cd omni_backend
cp .env.example .envOpen .env and replace the example key. A minimal Gemini configuration is:
COMMUNITY_MODE=true
DEFAULT_LLM_PROVIDER=gemini
DEFAULT_LLM_MODEL=gemini-2.5-pro
GEMINI_API_KEY=replace-with-your-real-keyLeave the PostgreSQL values from .env.example unchanged for the Docker setup.
Then start PostgreSQL, install dependencies, create the database, and run the
API:
docker compose up -d postgres
mix setup
mix phx.serverKeep this terminal running. Confirm the API is available on port 4000:
curl http://localhost:4000/api/healthIf mix is unavailable, install the Elixir and Erlang versions listed above or
use a version manager such as mise or asdf.
Connect the phone over USB, approve its debugging prompt, and verify it appears:
adb devicesForward the phone's port 4000 to the backend on your computer:
adb reverse tcp:4000 tcp:4000In a second terminal:
cd omni/omni-mobile
cp local.properties.example local.properties
./gradlew installCommunityDebugIf you are already at the repository root, use cd omni-mobile instead. The
community app uses package ID com.omni.orb.community and connects to
http://127.0.0.1:4000 by default.
To use a remote backend instead of USB forwarding, edit
omni-mobile/local.properties before building:
OMNI_COMMUNITY_BACKEND_URL=https://your-backend.exampleUse HTTPS for any backend exposed beyond your own machine.
- Open Omni Community and choose Connect to community backend.
- Allow microphone and notification permissions when requested.
- On Android 13+, open Settings → Apps → Omni Community, open the overflow menu, and choose Allow restricted settings.
- Return to Omni and enable its Accessibility service during setup.
- Press the listening button and try a low-risk command such as “open Settings.”
Menu names differ between manufacturers. If the Accessibility toggle is greyed out, the restricted-settings step has not been completed.
- Community sign-in returns 404: verify
COMMUNITY_MODE=trueinomni_backend/.env, then restart Phoenix. - The app cannot reach the backend: confirm the health check works, rerun
adb reverse tcp:4000 tcp:4000, and keep the USB connection active. - LLM request fails: make sure
DEFAULT_LLM_PROVIDERmatches the configured key and that the model is available to your provider account. - Wake word does not work: configure
DEEPGRAM_API_KEY; without Deepgram, use the app's manual listening flow. - Gradle cannot find Android SDK: open
omni-mobileonce in Android Studio or setsdk.dirinomni-mobile/local.properties. - Database connection fails: check
docker compose psinsideomni_backendand confirm port55432is free.
cd omni-mobile
./gradlew lintCommunityDebug testCommunityDebugUnitTest assembleCommunityDebug
cd ../omni_backend
mix precommitWarning
Omni can read screen content and interact with other apps. Only install builds you trust. Do not use it to automate passwords, banking, payments, authentication challenges, or other sensitive flows. The sensitive-app guard reduces risk but is not a security boundary.
This is alpha software and is not currently distributed through Google Play. Read the privacy model before using it with real data.
Start with CONTRIBUTING.md, the
roadmap, and issues labeled
good first issue.
Report vulnerabilities privately according to SECURITY.md.
Apache License 2.0. The Omni name, wordmark, and logo may not be used to imply that an unofficial build or deployment is operated or endorsed by the project.