Skip to content
All Projects
Mobile
Android2024

Team HM

Telegram group replaced. Purpose-built. Daily active use from day one.

Replaced a manual Telegram group workflow — used daily by the full team from day one.

Team HM screenshot
Android
Platform
Daily active
Usage
Telegram group
Previous
Minimal
Permissions

The Challenge

The team was managing internal announcements, shared task lists, and tooling access through a Telegram group — a setup that created noise, buried important messages in chat history, had no access control, and provided no structured way to track whether announcements had been read. The informal nature of the group also meant that operational information and personal messages lived in the same stream.

The Solution

A purpose-built Flutter Android app with role-based access control. Internal announcements have their own structured feed with read receipts — team members can see at a glance which announcements they've missed. Quick-access tooling shortcuts are pinned to the home screen based on the user's role. Offline-aware data fetching means the app loads last-known data from local cache when the connection is poor, and syncs silently when connectivity returns. The install footprint is minimal — no camera, no microphone, no location permissions.

Key Engineering Decisions

Structured announcements with read receipts

Each announcement is a Firestore document. Read state is tracked per user-UID in a subcollection. The admin panel shows who has and hasn't read each announcement — a feature impossible in a chat group.

Role-based access control

Firebase Auth custom claims define user roles. Firestore Security Rules enforce role-based read/write access server-side. The Flutter routing layer checks claims on startup and restricts UI based on permissions.

Offline-aware data fetching

Firestore's built-in local persistence cache serves last-known data immediately on app open, even offline. Updates sync automatically when connectivity returns. Users on poor connections always see data, never a loading spinner.

Minimal permission surface

The app requests only INTERNET permission. No camera, microphone, location, or contacts access — reducing the attack surface and making the security review trivial.

Tech Stack

FlutterDartFirebaseREST APIsProvider

Outcomes & Results

Daily
Active usage
Entire team using from day one
0
Unnecessary permissions
INTERNET only — minimal attack surface
Read receipts
Announcement tracking
Per-user read state — impossible in Telegram

Live Links

Ready to build?

Need something similar built?

I'm available for new projects. Discovery calls are free and I typically respond within 24 hours. You'll work directly with me — from the first call to launch.