Skip to content
Social & MediaAndroidiOS

Onlink

Encrypted 1:1 and group chat, self-destructing messages, and an approval-gated admin console

A Flutter chat app and a companion Flutter admin console sharing one Firestore backend: message data is encrypted client-side before it is stored, conversations carry an adjustable 1-6 day self-destruct timer, the chat screen blocks screenshots and screen recording, and idle sessions auto-log-out after 5 minutes.

Onlink — app screenshot
Onlink — app screenshot
Onlink — app screenshot

Both repositories are private. Client-side encryption, self-destructing messages and the group-approval queue are explained below.

About this project

Onlink is two coordinated Flutter apps — a GetX-based chat client and a separate admin console — reading and writing one shared Firestore backend. Rather than a generic messenger, the client is built around privacy features: message data is encrypted on the device before it is stored, and decrypted again on read.

Conversations also self-destruct on a timer, adjustable from 1 to 6 days per chat or group. Each message stores its own expiry timestamp (current time plus the chat's configured window), and the conversation list filters out any message whose expiry has passed at render time, so old messages actually disappear rather than just being hidden behind a setting. On top of that, the chat screen blocks screenshots and screen recording, and a 5-minute idle timer signs the user out automatically.

Starting a 1:1 chat goes through a request/approve flow — search a user by email or name, send a request, and the recipient has to accept before either side can message (chats carry a waiting/approved/rejected status). Group chats sit behind a matching admin-side workflow: the admin console's "Groups Requests" queue lets an admin review a new group's member list, add or remove members, and approve or reject it before it can be used.

The admin console itself is the operational side of the same product: create and manage user accounts, review the pending-groups queue, browse all groups, and — behind a Firebase re-authentication prompt that requires re-entering the admin's password — bulk-delete all chats or wipe all app data. Voice messages (in-app recording via the device mic, uploaded to Firebase Storage, played back with position/duration controls) and image messages round out the message types.

Key features

  • Client-side encryption of message data before it is stored
  • Adjustable 1-6 day self-destruct timer per chat/group — messages carry their own expiry timestamp and are filtered out of the conversation view once it passes
  • Screenshot/screen-recording blocked on the chat screen, plus an automatic 5-minute idle-session logout
  • Request/approve chat model: search a user by email or name, send a request, and the recipient must accept before messaging opens
  • Group chats with an admin-side approval queue — review member lists, add/remove members, approve or reject a new group from the console
  • Voice messages (in-app recording, Firebase Storage upload, playback with position/duration controls) and image messages
  • Admin console: create/manage user accounts, browse all groups, and a password-reauthenticated bulk-delete for all chats or all app data

More in Social & Media

~/sherazi.dev$./say-hello

Say hello.

Questions about a case study, one of the packages, AI tooling or Flutter in general are always welcome.

// or browse the packages on pub.dev(opens in a new tab)