AI Chat for Android Auto
An Android Auto voice assistant that sends your spoken questions to an AI provider and reads the responses back through the car's speakers.
You choose the provider — Anthropic, OpenAI, Groq, Mistral, Google Gemini, or a local Ollama instance. API keys are stored on-device in EncryptedSharedPreferences and never leave the phone.
How it works
- Open the AI Chat for Android Auto app on your phone and configure a provider + API key.
- Connect your phone to the car. The app appears in the Android Auto launcher.
- Tap Ask AI (or press Play on the steering wheel) and speak your question.
- The app sends your question to the provider's API and reads the answer aloud.
- Past exchanges appear in the browse list so you can re-ask any previous question.
Setup
Requirements
- Android 6.0+ (API 23)
- Android Auto on the phone
Phone setup
- Install the APK (sideload or Play Store release).
- Open AI Chat for Android Auto on your phone.
- Select a provider, enter your API key, and tap Save Key.
- Tap ↻ to fetch available models and select one.
- Grant microphone permission when prompted.
Android Auto
The app registers as a media browser service, so it requires no special permissions beyond a standard media app. If using a sideloaded build, enable Unknown sources for Android Auto via ADB first:
adb shell settings put global android_auto_unknown_sources 1
Supported providers
| Provider | API key required | Web search | Notes |
|---|---|---|---|
| Anthropic | ✅ | ✅ (built-in) | Default provider |
| OpenAI | ✅ | — | GPT-4o and newer |
| Groq | ✅ | — | Very fast inference |
| Mistral | ✅ | — | |
| Google Gemini | ✅ | — | |
| Ollama (local) | — | — | Requires local server; configure base URL |
| Custom (OpenAI-compatible) | Optional | — | Any endpoint that speaks /v1/chat/completions |
Adding a new provider
OpenAI-compatible API (5 lines)
Add an object to OpenAiCompatibleProvider.kt:
object MyProvider : OpenAiCompatibleProvider() {
override val id = "myprovider" // stable, never change
override val displayName = "My Provider"
override val defaultBaseUrl = "https://api.myprovider.com"
override val defaultModel = "my-model-name"
override val requiresApiKey = true
}
Then add MyProvider to the list in ProviderRegistry.kt.
Unique API format
Implement the AiProvider interface directly (see GeminiProvider.kt as an example), then register it in ProviderRegistry.
The interface requires two methods:
- ask(apiKey, baseUrl, model, question, onResult) — call the API and return the text response
- listModels(apiKey, baseUrl, onResult) — return a list of ModelInfo(id, displayName)
Building from source
# Clone and open in Android Studio, or build from the command line:
./gradlew assembleRelease
Signing credentials go in local.properties (gitignored):
release.storeFile=path/to/release.jks
release.storePassword=...
release.keyAlias=...
release.keyPassword=...
Releasing
Push a tag to trigger the CI pipeline, which builds a signed APK, uploads it to the Package Registry, and creates a GitLab Release with a download link.
git tag v1.2.3 && git push origin v1.2.3
The release will appear under Deploy → Releases in the GitLab sidebar.
CI/CD variables
Configure these in Settings → CI/CD → Variables (all masked):
| Variable | Description |
|---|---|
KEYSTORE_BASE64 |
Release keystore encoded as base64 (base64 -i claudeauto-release.jks \| pbcopy) |
KEYSTORE_PASSWORD |
Keystore password (used for both the store and the key) |
Upcoming work
- Persist conversation history across sessions — current history is in-memory only and lost when the service stops
- Per-provider system prompt customization — let users adjust the assistant's persona and instructions
- Streaming response support — start speaking the first sentence while the rest of the response is still arriving, reducing perceived latency
- Web search for non-Anthropic providers — integrate an external search API (e.g. Brave Search, Tavily) so all providers can answer current-events questions
- Gemini grounding / web search — wire up Google's native grounding tool for Gemini responses
- Hands-free activation — start listening without tapping, triggered by a wake phrase or steering-wheel button mapping
- Export / import configuration — back up and restore provider settings and API keys
- Android Automotive OS (AAOS) support — native in-car OS support alongside the current Android Auto projection mode
Attribution
App icon by icongeek26 from the Outline collection on Flaticon.
License
MIT — see LICENSE.