← Back to blog

September 2, 2026 · The Pengo Team

Shipping a mobile agent app that matches the web inbox

Search, attachments, assignment, password reset, push deep links, and status labels - how the Pengo Flutter app stays in sync with the dashboard agents already use.

#mobile #product

Support doesn’t stop when agents leave their desk. But most “mobile apps” for live chat are notification wrappers around a WebView - slow, offline-hostile, and missing the workflows agents rely on desktop-side.

We shipped a native Flutter agent app because the job on mobile is narrow and high-stakes: see incoming chats, claim them, reply with context, and get back to the customer fast.

Feature parity where it counts

Search. Global search hits messages, visitor names, emails, and internal notes via the same /api/inbox/search endpoint as the web app. Results group by type and deep-link into the conversation.

Attachments. Agents pick images or PDFs, upload through /api/inbox/upload, and send messages with the returned public URL. No “coming soon” placeholder - if you can attach it on web, you can attach it mobile.

Assignment. Swipe right on a conversation or open the assign sheet. Claiming uses the same atomic update as web: set assigned_to, move status from pending to open, disable the bot. Conflicts surface if another agent got there first.

Password reset. Forgot-password sends a Supabase reset email with a deep link back to the app. Agents locked out of desktop can recover without filing an IT ticket.

Push notifications that open the right chat

Firebase Cloud Messaging delivers alerts when new visitor messages arrive while the app is backgrounded. Tapping a notification reads chat_id from the payload and navigates via a shared DeepLinkHandler wired into GoRouter - including cold starts from terminated state.

Foreground messages render as local notifications with the same payload contract so behavior is consistent iOS and Android.

Status vocabulary aligned with web

Database statuses stay engineer-friendly (pending, open, snoozed, resolved). Agent UI labels follow the web inbox:

StatusShown as
pendingIncoming
openOpen
snoozedSnoozed
resolvedResolved

Filter chips read All · Open · Incoming - the same mental model as the dashboard sidebar.

Branding: Pengo cyan, not generic purple

Launcher icons, splash screens, and in-app accents use Pengo cyan (#06B6D4) to match the web product. Small detail, but agents notice when the mobile app feels like a different company’s white-label.

Architecture choices

  • Bloc for inbox and chat state - predictable event reducers, easy to test.
  • Supabase realtime for message streams; REST for search and uploads.
  • GoRouter with auth guards and pengo://chat/{id} deep links.
  • Repository providers for Supabase, API client, and auth - no service locator soup.

Offline mode shows a banner; messages queue isn’t shipped yet - we’d rather be honest about connectivity than lose drafts silently.

What’s next

Biometric app lock is in the tree. Live Activities on iOS show active chat context on the Lock Screen. Home screen widgets surface unread counts.

If you’re evaluating Pengo for a distributed team, install the agent app alongside the widget on your staging site. Trigger a chat from your phone browser, claim it from the app, attach a screenshot, resolve it - that five-minute drill tells you more than any feature matrix.

Mobile isn’t an afterthought channel. It’s how you answer the visitor who wrote “hello?” at 11 PM and meant it.