All projects
Mobile App
Live in production

LetSlic — Social Media App with Group Chat, Stories and Premium

LetSlic, listed on Google Play as Slic, is a social app for photo posts, 24-hour stories and real-time chat with group moderation. We built it for Slic Solutions Private Limited: the React Native app, two Node.js APIs, the superadmin console and the website, plus Premium and ads.

For Slic Solutions Private LimitedJun 2025–Jul 2026
  • Android app (Google Play)
  • iOS app (TestFlight)
  • Public website
  • Superadmin console (web)
  • Mobile API and admin API
Superadmin stories grid with photo stories

Overview

Slic Solutions Private Limited asked us to build LetSlic, a consumer social app in which people post photos, share stories that disappear after 24 hours, follow each other and chat one to one or in groups. CountryDevs built the whole product: a React Native app for Android and iOS, a Node.js mobile API with Socket.IO, a Next.js website that also carries the superadmin console, and a separate Node.js API behind that console, all on MongoDB.

Chat is the centre of it. Messages arrive live on every device a person is signed in on, and group owners can assign member roles and mute or ban members with an end date, with announcements, rules and invite codes stored on the group. People sign in with a phone OTP or email. In 2026 we added the money side, a Premium subscription through Google Play Billing via RevenueCat with its own ledger and AdMob native ads in the feed behind a consent flow, and the design and first code of an adaptive video pipeline, ahead of video posting being switched on.

The app is on Google Play as Slic, published by Slic Solutions Private Limited, and letslic.com is live. iOS builds go to testers through TestFlight; there is no App Store release. We handed the code over in July 2026, and the store listing has been updated since, so the current store build may include changes made after our handover.

Real-time chat that works across a cluster

The problem

LetSlic's mobile API forks one Node.js worker per CPU core. Socket.IO keeps its rooms in each worker's memory, so a phone connected to one worker never hears an event emitted on another. Without shared state the symptoms were the familiar ones: connection counts that read zero, messages that reached the server and stopped there, and online status that disagreed between screens.

What we built

  • A shared adapter. Socket.IO runs on the Redis adapter, so a room means the same thing on every worker.
  • A personal room per person. On sign-in every socket joins user_<id>, across screens and devices. A message sent through the API is pushed to each recipient's personal room, not only to the chat's room, so it reaches someone on the chat list as well as someone with the thread open. Read receipts and per-recipient unread counts travel the same way.
  • Status before presence arrives. Last-active time is stored, so a chat header shows a sensible status before the live presence event lands, and the chat list refetches when the app returns to the foreground.

Group moderation

Groups carry their own moderation: roles assigned per member, mutes and bans with an optional end date, pinned or scheduled announcements with reactions and comments, written rules and invite codes. Staff can open any chat in the superadmin console, see its participants and their roles, and archive or delete it.

Premium and ads under Google Play's rules

Why not a cheaper gateway

A payment gateway such as Razorpay costs far less than Google's commission, but Google Play's Payments Policy requires Play Billing for digital subscriptions sold inside an app distributed on Play, and LetSlic was already published there. We wrote the reasoning up for the client, along with Google's User Choice Billing programme for India, which by our reading saves about 1.5% per transaction in practice. We recommended revisiting it once the subscriber base justifies the extra integration.

RevenueCat, with our own books

We first planned a direct Play Billing integration, then switched to RevenueCat: it handles receipt checks, renewals and billing retries, and covers Apple's store in the same SDK, so iOS becomes a dashboard change later. We kept the records on our side. Each RevenueCat webhook is stored first, with a unique index on its source and event ID, so a resent event is recognised and never processed twice; processing happens after the 200 goes back. Each money event becomes a ledger entry numbered LE-YYYY-NNNNNN. Plans are seeded by an idempotent script that dry-runs by default.

Ads that ask first

AdMob native ads, styled like posts, appear after every fifth post on Android. The consent form runs before the ads SDK starts. Anyone under 18, or with no date of birth on file, is tagged as under the age of consent and limited to G-rated ads. Whether Premium removes ads is one setting, PREMIUM_IS_AD_FREE, which governs the feed, the ads bootstrap and the ad-preferences row in Settings. In July 2026 the client chose to show ads to Premium members too, so it is off.

An adaptive video pipeline, designed before video

Video posting is switched off in the LetSlic app today: the create screens accept photos only and the reels tab is hidden. The client asked us to prepare for video anyway, so that turning it on later would not mean designing the media backend in a hurry.

The design

  1. The app uploads the MP4 to the media bucket on S3.
  2. The upload's S3 event starts a Lambda function, kept as a template in the repo, which submits an AWS Elemental MediaConvert job.
  3. MediaConvert writes HLS to a second bucket: three renditions, 640×360 at up to 0.7 Mbps, 1280×720 at up to 1.5 Mbps and 1920×1080 at up to 3 Mbps, in H.264 with quality-defined variable bitrate, 96 kbps AAC audio and 6-second segments under one master playlist.
  4. When the job finishes, EventBridge calls a webhook on the API that is protected by a shared secret.
  5. The API stores the playlist's CloudFront URL on the post or story; a failed job leaves the video ready to retry.

Where it stands

The job settings, the Lambda template and the webhook are in the code, and we documented the AWS side step by step for the client: the MediaConvert role and queue, the Lambda trigger, the HLS bucket and its CloudFront route. That AWS side has not been set up, so the pipeline has never run end to end; wiring it up and testing it is part of switching video back on, together with an HLS player in the app. In the same pass we added a presigned direct-to-S3 upload endpoint to the API, for the app to adopt when video returns, and a CDN URL helper with a backfill script for existing media.

The challenge

A social app is judged on whether a message shows up the moment it is sent. LetSlic's API runs one Node.js worker per CPU core, and Socket.IO keeps its rooms in each worker's memory, so a message could reach the server and never reach the person it was for, or appear in an open chat but not on the chat list. Groups needed real moderation too: a group with no mutes, bans or rules is a liability for the company that hosts it.

Then the app had to earn money without breaking store rules. Google Play requires its own billing for digital subscriptions sold inside an app, so a cheaper Indian payment gateway was not an option. Ads had to wait for consent and treat users who might be minors differently. And the client wanted video later without rebuilding the media backend when it came.

The solution

For chat we put Socket.IO on a Redis adapter so every worker shares the same rooms, and gave each person a personal room that every one of their open sockets joins. A message sent through the API is pushed to each recipient's personal room, so it lands on the chat list and in the open thread, on every device, whichever worker holds the connection. Group roles, mutes, bans, announcements, rules and invite codes live on the group itself.

For money we chose RevenueCat over a hand-written Play Billing integration and kept our own records: every RevenueCat webhook is stored first under a unique event ID, then processed, and each money event gets a sequential ledger number. AdMob shows a native ad after every fifth post on Android, asks for consent before the ads SDK starts, and treats anyone under 18, or without a date of birth, as a minor. For video we designed an AWS MediaConvert pipeline that turns an upload into adaptive HLS and wrote its first code, so turning video on starts from a documented design instead of a blank page.

The impact

LetSlic is live. letslic.com serves the public site, and the Android app is published on Google Play by Slic Solutions Private Limited as "Slic: Create. Engage. Earn.", last updated on 11 October 2026. The iOS app goes to testers through TestFlight. We handed over four codebases in July 2026, after 13 months of work: the app, a mobile API with 202 route handlers, an admin API, and the website with a superadmin console for users, posts, stories, media, chats, messages, reports, support tickets, feedback and settings.

Some of what we built is not switched on. Video posting and the reels tab are turned off in the app, and the HLS pipeline has not been run end to end: finishing and testing it, with the AWS-side setup, is part of switching video on. Ads are shown to Premium members as well, by the client's choice in July 2026; one setting restores ad-free Premium. We have no usage or revenue figures of our own to report.

Features

What we built into LetSlic

Photo posts and a feed

Multi-photo posts with an infinite-scroll feed, likes, comments and follows. Photos are compressed on the phone, and HEIC, HEIF and WebP images are converted to JPEG before upload.

24-hour stories with highlights

Stories disappear from view after 24 hours; an hourly server job archives them, and a person can keep favourites as highlights on their profile.

Real-time chat

One-to-one and group chats over Socket.IO with typing indicators, read receipts, reactions, edits, deletes and online status, delivered to every device a person is signed in on.

Group moderation tools

Member roles, mutes and bans with an optional end date, set from the group's admin and member screens, plus pinned or scheduled announcements, written rules and invite codes stored on the group.

Phone OTP sign-in

Sign-in and password reset by SMS one-time code through MSG91, with clear wrong-code and too-many-attempts states, alongside email sign-in.

Premium subscription

Monthly and yearly plans sold through Google Play Billing via RevenueCat, giving a verified badge and priority support with a 24-hour response target. Webhooks are stored once and posted to an internal ledger.

Native ads in the feed

AdMob native ads styled like posts after every fifth post on Android, behind Google's consent form, with under-18 and unknown-age users tagged as minors and limited to G-rated ads.

Push notifications

Firebase Cloud Messaging with Notifee on the phone for likes, comments, follows and new messages.

Superadmin console

A web console for users, posts, stories, media, chats, messages, user reports, support tickets, in-app feedback and platform settings, with user and chat analytics.

In-app support and feedback

People raise numbered support tickets and send categorised feedback from the app; the team processes, resolves and closes them in the console.

By the numbers
13
Months from first commit to handover (Jun 2025 – Jul 2026)
202
Route handlers in the mobile API at handover
5
Posts between native ads in the feed
3
HLS renditions in the video job settings (360p, 720p, 1080p)
Screens

What LetSlic looks like

Superadmin chats grid with direct and group chats
Chats overview: total, active and group chat counts and a grid of direct and group conversations with last message and member count.
Chat details modal listing group participants
Chat detail modal for a seeded group chat: creation date, member and message counts, participants with owner/member roles, and archive/delete controls.
Superadmin messages grid
Message oversight: totals by text, media and pinned messages, search and filters, and a grid of recent messages with sender and chat type.
Chat analytics donut charts and an activity trend chart
Chat analytics on the dashboard: chat status and direct-versus-group type distribution donuts and the chat activity trend line.
Superadmin analytics dashboard with user statistics tiles and post analytics bar charts
The superadmin analytics dashboard: user statistics (totals, activation rate, weekly activity) and post analytics charts for content type and tag usage.
Superadmin reports table with moderation actions
User reports queue: reporter, target (post or user), reason such as spam, harassment or false information, description and status, with review, resolve and dismiss actions.
Superadmin media files table
Media library listing uploaded files with preview, type, size, uploader and the post they belong to, plus image/video/storage counters.
Superadmin support tickets table
Support desk: ticket counts, filters by status, type and priority, and a ticket table with numbered tickets, type and priority badges and process/resolve/close actions.
Superadmin feedback table
In-app feedback inbox grouped by category (bug report, feature request, UI improvement, performance) with priority and status, ready to process or resolve.
Superadmin platform settings page
Platform settings: system, database and version status cards, general settings (name, language, time zone, currency), user-management rules and email/notification configuration.
Slic contact page with the 'Want to delete your account?' notice
Contact page with support highlights and the account-deletion notice that tells users how to request removal of their account and data.
App screens

Inside the mobile app

Weekend Photo Walk group thread with messages from four members, a header reading Someone is typing and a typing bubble above the composer
A group chat in which another member's typing indicator arrives over Socket.IO while the thread is open; the owner's last message went out a moment earlier.
Group Info screen with members marked Member and a Settings list of Media & Files, Search, Privacy Settings, Moderation, Announcements, Group Rules, Custom Roles and Invite Links
The owner's group info screen lists each member's role and opens the group's privacy, moderation, announcement, rules, custom-role and invite-link settings.
Members screen with Active, Banned and Muted tabs, Owner, Admin and Member filters, and five members with the owner badge on Alex Rivera
Member management for a group owner, with Active, Banned and Muted tabs, role filters and multi-select for bulk actions.
Full-screen story of a misty beach with a caption, Kenji Tanaka's name and date, progress bars at the top and like, comment and more buttons
A story from someone the user follows, with segmented progress bars for each story in the set, the posting date and quick react and reply actions.
Slic home screen with search, a notifications bell, a row of story avatars and a feed of text and photo posts from Fei Zhang
The home feed opens with a stories row in which unseen stories have a gradient ring and seen ones turn grey, above posts from followed accounts.
Slic Android post view of a camera tossed in the air in an autumn forest, with Alex Rivera's name, a blue verified badge, 6 likes and 3 comments
A full-screen photo post from a Premium member, with the blue verified badge next to the author's name and live like, comment and share counts.
Letslic Premium screen with a verified badge icon, two perks and a card saying Premium isn't available yet, plus Restore purchases
The Premium screen lists the verified badge and 24-hour priority support; in this local run the store was offline, so it shows its own not-available state instead of plan cards.
Letslic Premium screen reading You're a Premium member, with a Renews on date card and Restore purchases
After a subscription event is processed by the server, the same screen shows the member state and the renewal date taken from the server's subscription record.
Get Support form with a Priority Support 24h response banner, issue type chips, a subject and a description filled in
A Premium member raising a support ticket sees the priority-support notice with its 24-hour response target, then picks an issue type and describes the problem.
Let's Chat list with the Weekend Photo Walk group and a direct chat with Maya Chen, each with an unread badge
The chat list keeps group and one-to-one conversations together with the last message, its time and an unread count for each.
Notifications list showing three comment notifications, a like and several started following you entries with unread dots
In-app notifications for comments, likes and new followers, each with the sender's avatar, a type badge and an unread marker.
Project details
Tech stack
React NativeTypeScriptReduxNode.jsExpressMongoDBSocket.IORedisNext.jsRevenueCatGoogle AdMobFirebase Cloud MessagingMSG91AWS S3AWS Elemental MediaConvertAWS LambdaAmazon CloudFront
Timeline & team
Jun 2025–Jul 2026
FAQ

Questions about this project

How does LetSlic deliver chat messages when its server runs several workers?

Socket.IO runs on a Redis adapter, so rooms are shared across every Node.js worker. Each person's sockets also join a personal room, and a new message is pushed to every recipient's personal room, so it reaches the chat list and the open thread on all their devices.

Why does LetSlic sell Premium through Google Play Billing instead of Razorpay?

Google Play's Payments Policy requires Play Billing for digital subscriptions sold inside an app distributed on Play, and LetSlic was already published there. We use RevenueCat on top of Play Billing and keep our own webhook log and ledger of every subscription event.

Can LetSlic stream video in adaptive quality?

Not yet. Video posting is switched off in the app. We designed the pipeline for it, where an S3 upload starts an AWS MediaConvert job that produces 360p, 720p and 1080p HLS streams served through CloudFront, wrote its first code and documented the AWS setup. It has not been run end to end; finishing and testing it is part of switching video on.

Is LetSlic on the Apple App Store?

No. The Android app is on Google Play as Slic, published by Slic Solutions Private Limited. iOS builds go to testers through TestFlight, and there is no App Store release.

More work

Other things we shipped

All projects
Storafleet fleet overview with storage totals, trend line, transfers list and per-provider footprint barsFeatured
Saasfor Storafleet

Storafleet — Multi-Cloud Storage Control Plane

Storafleet is CountryDevs' own SaaS control plane for object storage. Teams connect buckets they already own on 50+ providers, including AWS S3, Cloudflare R2, Backblaze B2, Wasabi and MinIO, then browse, migrate, search, secure and cost-check them from one console.

Next.js 15ReactRedux ToolkitNode.js+11
50+Storage providers in the connection roster
Case study
Pakka Logistics home page hero on desktopFeatured
Mobile Appfor Pakka Logistics

Pakka Logistics — Porter-Style Delivery Platform

Pakka Logistics is a Porter-style delivery platform for India. We built all of it: Android apps for customers and drivers, a business portal, an operations console and the website. The web platform is live; the Android apps are being prepared for Google Play.

React NativeTypeScriptRedux ToolkitNode.js+12
96.3%API routes exercised by a probe before launch (260 of 270)
Case study
LeafRanger home page hero with headline 'Your plants have an expert now' and a Herb chat cardFeaturedLaunching
Mobile Appfor LeafRanger

LeafRanger — AI Plant Care App and Plant Marketplace

LeafRanger is CountryDevs' own AI plant-care app. We built the Android and iOS app, two Node.js backends, the admin and vendor consoles and leafranger.com: photo plant ID and diagnosis, light-mapped rooms, weather-aware watering and a multi-vendor plant shop.

React NativeTypeScriptRedux ToolkitKotlin+11
~$0.004Measured cost of one AI vision scan
Case study
Got a project?

Let's build the
next one together

Tell us what you're trying to ship. We'll come back with a scope, a timeline, and a fixed price — usually within 48 hours.

Not ready for a full build? Start with a fixed-price Discovery Sprint, or get a code audit of an app someone else built.

More on what we build from Bangalore for Indian businesses: App Development Company in Bangalore.