MemoDocumentation
EN

Mobile Companion App

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.

Architecture

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.

Connection Methods

LAN (Local Network)

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.

ngrok Tunnel

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.

Tailscale Tunnel (Embedded)

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.

Authentication

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.

Features

Streaming Chat

Messages stream in real-time via SSE, just like the desktop experience. Provider logos and model names appear in the engine strip.

Session Management

  • View all chat sessions
  • Switch between sessions
  • Create new sessions

Provider Toggle

Switch the active AI provider (OpenAI, Gemini, local llama, etc.) from the mobile app.

Model Start/Stop

Start and stop local models (llama.cpp) from the mobile app.

Calendar Tab

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.

Navigation (v3.9.0)

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.

Routines & Notifications

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.

Localization

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.

Setup

Prerequisites

  • Memo desktop app running
  • Flutter 3.10+ (for building from source)
  • Android Studio or Xcode (for platform builds)

Connection

  1. Launch Memo on your desktop
  2. Go to Settings → Remote Access → Enable LAN access (bind to 0.0.0.0)
  3. Configure auth if the backend will be reachable beyond localhost
  4. Launch the mobile app
  5. Enter your desktop's IP:port (or use LAN Scan)
  6. Enter credentials if configured
  7. Start chatting

Prefer not to build from source? A prebuilt Android .apk is available from the download page.