
A thin Flutter client for Android and iOS that connects to Memo running on your desktop. The mobile app is a remote interface — all AI processing stays on your desktop.
Status note (v3.9.0): the companion app is in maintenance mode — no active development — and the desktop web UI is now fully mobile-responsive (see Mobile Navigation), so a phone browser pointed at your Memo instance gets a first-class experience too. Routine delivery to the phone was removed in v3.9.0; routines now deliver through WhatsApp or Telegram self-chat instead. See Routines & Notifications.
Phone (Flutter) ── HTTP/SSE ──→ Desktop Memo (Go backend)
LAN or tunnel
The mobile app communicates with the desktop backend via HTTP/JSON and SSE streaming. No AI models run on the phone — it can be old, slow, and low on battery without mattering.
Connect your phone and desktop to the same Wi-Fi network. Use the Scan button in the mobile app to auto-discover your desktop's IP — it scans all local subnet addresses in parallel. Works with 192.168.x.x, 10.x.x.x, and 172.16–31.x.x ranges. No internet connection required beyond the local network itself.
Start a tunnel from Desktop Settings → Remote Access. Get a public URL accessible from anywhere. One-click setup with your ngrok auth token. Free ngrok generates a new URL each time you start the tunnel — update the mobile app's saved address accordingly, or use Tailscale for a permanent one.
Memo includes an embedded tsnet tunnel — no separate Tailscale binary needed. Memo joins your tailnet directly and provides a stable private URL that survives restarts and IP changes. Since v3.3.4 this is out of beta and uses an interactive one-click login — no auth key to paste. Supports Tailscale Funnel for public internet access with automatic TLS certificates. Install the Tailscale app on the phone as well, then connect to http://your-hostname:8090.
Self-hosted auth has grown well past a single shared token: Settings → Remote Access offers four modes — none, token-only, password, or token + password — with argon2id hashing, brute-force lockout, and per-device tokens. Requests originating from the desktop itself (loopback) never need a credential. The mobile app must present a valid token or session for every request when any credential mode is active. See Self-Hosting for the full model.
Messages stream in real-time via SSE, just like the desktop experience. Provider logos and model names appear in the engine strip.
Switch the active AI provider (OpenAI, Gemini, local llama, etc.) from the mobile app.
Start and stop local models (llama.cpp) from the mobile app.
View the monthly grid with event dots. Tap a day to see events. Add events manually. Long-press to delete. Calendar reminders arrive as real, pre-scheduled local notifications before events start — they reach you even if the app isn't open at the moment the check would run.
Below a 600px breakpoint the desktop NavRail hides entirely behind a floating hamburger drawer, and the chat header collapses into a single overflow sheet with full-width labeled actions. Verified at 375px in both light and dark themes. This benefits the phone browser and the companion app alike.
Routine delivery to the phone no longer exists as of v3.9.0. The old mechanism (the app polling /api/routines/mobile-ready to pre-schedule a local notification ahead of a routine's fire time) was removed outright because there is no actively used mobile app to receive it — the endpoint now returns 404.
This isn't a loss of capability so much as a change of channel: routines can now be created, listed, and cancelled straight from a WhatsApp or Telegram self-chat, and their output is delivered there too — to a surface that's actually in your pocket. See WhatsApp Integration and Telegram Integration.
Calendar reminders are unaffected — they come from the calendar system, not routines, and still arrive as locally pre-scheduled notifications.
The mobile app is fully localized (Turkish/English), with a language toggle available both in Settings and on the pre-pairing connect screen. The mobile app also auto-reconnects with its saved URL on cold start, and shows a real error message instead of a raw exception dump when a connection drops.
0.0.0.0)Prefer not to build from source? A prebuilt Android .apk is available from the download page.