Skip to content

Repository files navigation

Arcade AI

Universal multi-provider LLM chat client for Android, Windows and Linux — dark, fluid, secure. Windows and Linux builds are beta for now — Android is the primary platform.

🇷🇺 Версия на русском

Arcade AI is a single mobile app that talks to any large language model. Drop in an API key, pick a provider, choose a model — and chat. From global giants (OpenAI, Anthropic, Google) to Russian platforms (GigaChat) to your own endpoint

Black canvas · violet aurora · buttery animations

Arcade AI — chat screen

Built on pure stubbornness and one heroically dying USB stick. 12 providers — and this time they actually work (we checked).


Features

  • 12 built-in providers + a fully custom one (any OpenAI- or Anthropic-compatible endpoint).
  • Streaming responses — text appears token by token, like the web chats.
  • Reasoning view — for thinking models (o-series, DeepSeek R1, Claude with extended thinking) a collapsible panel shows how the model reasoned before answering.
  • Vision — attach photos to your message where the model supports it.
  • Browser (beta) — paste a link into your message and the app downloads the page itself, strips the HTML and hands the clean text to the model. Even a tiny local model (1B on Ollama) can "read the web". Toggle it in settings; the per-page text limit is adjustable (8000 chars by default), and the chat shows only a compact "🌐 site · size" chip.
  • Compare two models — long-press Send to ask two models the same prompt side by side, then keep the better answer and continue with it.
  • Bilingual UI — English / Russian, picked on the welcome screen, switchable later.
  • Security first — API keys live in the hardware-backed Android Keystore (AES-GCM); optional biometric auto-lock on reopen.
  • Crafted design — pure-black surfaces, restrained violet accents, an animated aurora background, and motion on every meaningful transition.

Supported providers

Global Russian / Regional Local & custom
OpenAI, Anthropic, Google Gemini, Groq, DeepSeek, xAI Grok, Mistral, Together AI, OpenRouter, Cohere GigaChat (Sber) Ollama, any custom endpoint

GigaChat uses Sber's OAuth: paste your Authorization key (Base64) and the app fetches and refreshes the short-lived access token for you. Sber's Russian root CA is trusted for *.sberbank.ru so requests don't fail on TLS.

Local models (Ollama) connect to a running Ollama server over HTTP (localhost:11434) — the app does not load .gguf files directly. True on-device GGUF inference (pick a file, run it on the phone via llama.cpp) is on the roadmap, not in this build.

Why these languages?

This started as a "mix the languages to look cool" idea. The honest engineering answer shaped the final stack:

  • Dart + Flutter — the whole app. Flutter is Dart's killer capability: one codebase compiled to native ARM, a self-rendered UI (Skia/Impeller) that looks pixel-identical on every device, and sub-second hot reload. For a polished, heavily-animated single-screen-flow app, nothing else gets you there faster.

  • No Rust (yet) — and that's the secure choice. The instinct was to add Rust for "security via custom encryption." But hand-rolled crypto is a liability; the Android Keystore stores keys in a hardware security module where the secret never leaves the chip — strictly stronger than app-level AES. The app is network-bound (it waits on API calls), so there is no CPU hotspot for Rust to accelerate. Rust earns its place the day we add on-device local inference — that's a real compute task, and it's the planned hook for it.

The principle: every language must pull its weight, not pad a buzzword list.

Remote SSH terminal + OpenCode (experimental)

Working. The setup writes OpenCode's config file (~/.config/opencode/opencode.jsonc) with your provider, base URL, key and model, so OpenCode runs on your model instead of falling back to the free built-ins. Still young — treat the terminal as an early feature — but the core "your provider in OpenCode" flow works.

A separate Terminal (BETA) screen (open it from the chat drawer) turns the app into a thin client for an agentic coding session running on your own machine — no servers on our side. The idea: bring your own compute (a VPS, a home PC, a Raspberry Pi) over SSH and run OpenCode from your phone.

Flow:

  1. Pick your data (the app's active provider + key + base URL + model) or Free (OpenCode's built-in free models, no key).
  2. Enter the machine: host / user / port / password (saved encrypted in the Keystore, optional).
  3. Choose a run modewith confirmation or auto (no confirmation).
  4. A clean step-by-step setup runs in the background (connect → detect package manager → install Node/git → install OpenCode → launch). The raw install output is hidden; on failure there's a collapsible log + retry.
  5. OpenCode's TUI is rendered in a real terminal emulator (xterm) over the SSH shell, with quick keys (Esc/Tab/Ctrl-C, Ctrl+letter, arrows), paste, and a "manual terminal" mode for power users.

Built on dartssh2 (SSH client) + xterm (terminal emulator) — the SSH protocol and the emulator are libraries; the app is the glue + provisioning + UI.

Known rough edges:

  • Your provider/key/URL/model are written into OpenCode's config file, so it uses your model. Pick My data for that, or Free for OpenCode's built-in models.
  • The auto/bypass mode uses a best-effort env var; the exact flag may vary by OpenCode version.
  • Reachability: same LAN works; a machine behind NAT needs Tailscale / a public IP / port forwarding.
  • Installing packages needs root or passwordless sudo; otherwise the install prompts for a sudo password in the terminal.

Architecture

lib/
├── core/        theme, global app state (ChangeNotifier)
├── models/      provider, chat message, generation config
├── data/        provider catalog · Keystore key store · settings
├── services/    streaming LLM client (OpenAI + Anthropic shaping)
├── ui/
│   ├── onboarding/   language → provider grid → connect form
│   ├── chat/         chat screen · model switcher
│   ├── settings/     settings · biometric lock screen
│   └── widgets/      ambient background · bubbles · reasoning block
└── l10n/        EN / RU strings

Build

flutter pub get

# Android (requires the Android SDK; minimum Android 6.0 / API 23)
flutter build apk --release
# output: build/app/outputs/flutter-apk/app-release.apk

# Windows (run on a Windows machine with Visual Studio)
flutter build windows --release

# Linux
flutter build linux --release

Requires Flutter (stable). Windows and Linux users don't need to build anything — every release ships ArcadeAI-Setup-x.y.z.exe (a regular installer: Program Files, Start menu shortcut, uninstaller; built automatically by GitHub Actions from .github/workflows/windows.yml + windows/installer.iss) and ArcadeAI-x.y.z-amd64.deb (packaged by tool/build_deb.sh). Both desktop builds are beta: the core chat works, but they get less testing than Android.

Security model

Concern Approach
API keys at rest Android Keystore via flutter_secure_storage (AES-GCM, hardware-backed)
App reopen Optional biometric / device-credential lock (local_auth)
Network HTTPS to providers; cleartext allowed only for localhost (Ollama)
Telemetry None — the app talks only to the provider you configure

License

MIT — see LICENSE.


Built by github.com/NickIBrody

About

Universal multi-provider LLM chat client for Android (Flutter)

Resources

Stars

9 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages