ISS
← Field Notes
Dev Tools screenshot
May 27, 2026 · Dev Tools · 2 min read

Wiring All 121 API Endpoints the Official Client Left on the Table

A native Android client for Stoat that implements all 121 platform API endpoints, adds push for de-Googled phones, and fixes a bug that had users DoSing the backend.

Stoatally is a native Android client for the Stoat chat platform, built with Kotlin and Jetpack Compose. No wrappers, no web views for the core functionality. It does message search across channels or whole servers, server administration with a role editor and permission matrix, push notifications, LiveKit voice and video, rich media, and custom emoji. It connects to any Stoat or Revolt-compatible instance, so it is not locked to a single server. It is live at stoatally.app.

100% API coverage

The headline number is completeness. Stoat exposes 121 API endpoints. The official Android client wired 65 of them. This client wires all 121, with every screen connected to live data and nothing stubbed. That is the difference between a client that covers the common paths and one that can actually do full server administration: ban and kick management, channel creation and reordering, the whole permission surface.

Getting from 65 to 121 is reverse-engineering work. You are mapping a platform's real API from the outside, filling in the endpoints the official app never exercised, and doing it well enough that features like search filters by date, author, and pinned status behave against real servers.

Two fixes worth calling out

Two details stand out from the build. First, push notifications work on de-Googled phones. Instead of assuming Firebase is present, Stoatally supports both FCM and UnifiedPush through a self-hosted stoatcord-bot relay, with separate channels for mentions, DMs, and general traffic. That is the kind of thing that matters a lot to the people who run Stoat and nothing to everyone else.

Second, a member-list bug got fixed that had every user quietly DoSing the backend. A client-side mistake in how the member list was fetched meant ordinary usage was hammering the server harder than it should. Fixing it in the client took load off the whole platform, not just this one app. Alongside those, the project logged 45-plus bug fixes overall.

There is also a companion piece: stoatcord-bot, a TypeScript bot running on Bun that bridges Discord to Stoat, relays push, and can migrate servers and export message history. Together they make Stoat usable on Android the way the platform deserves.

Have something that needs building, or stabilizing?

These notes are the work log. The paid work runs through Moonshine Labs, my product and engineering studio. Tell us what you're building, or grab a call.

Work with us →
the studio: moonshinelabs.io