My main project

ChatYadro

A social platform for local communities. Chats, feed, audio calls, classifieds and 22 community types with configurable roles and modules, all in one app. Published on RuStore, the Russian Android app store, since August 2026.

5.0
RuStore rating, 6 reviews
22
community types
88
screens in the app
100%
solo development

What it looks like

The store listing from RuStore: a short video and the screens on a phone. Interface is in Russian.

Store video 25 seconds, no sound, the same one as in the store
ChatYadro feed: friends’ stories, community news, photos and videos
Everything in one feed Stories, news from the world and your communities, photos and video
A community screen: chats, news, calendar, fees
A community shaped around what you do Sections, roles and news, different for each type
Creating a chat thread: official, private or open
Conversations do not drown Official, private and open threads inside a chat
Classifieds board: a tractor, a quad bike, stretch ceilings
Sell, buy, give away Among your own people, not strangers
Mini-games screen: tic-tac-toe, quiz, puzzles, battleship, checkers
Seven games, all offline Ratings, statistics and opponents from your community
Appearance settings: dark theme, accent colour, text size
Make it yours Dark theme, accent colour and text size

Swipe sideways →

The road to the store

Publishing on RuStore did not work on the first try. Here is how it went: handling a rejection says more than a smooth story.

  1. 7 August 2026

    Submission

    Store listing, screenshots and video, age rating, 17 types of collected data declared in the "Data safety" section, and a justification for every permission. The build was verified by unpacking the APK: the permissions and version matched what was declared.

  2. 11 August 2026

    Rejection

    The store asked for proof of registration in the national register of personal-data operators. I sent the register record and a screenshot of the status check. The issue turned out to be legal, not technical.

  3. 11 August 2026, evening

    Rebuild

    The same file cannot be resubmitted: the store requires a higher version number. I rebuilt from the production commit in a separate working copy, bumping only the version, so that beta-only changes that had never been in a release APK did not slip into the store.

  4. 16 August 2026

    Published

    Review passed, the app is in the catalogue. A noticeable share of new members came from the store, which is visible by build version in the server logs. Every rating so far is five stars.

What people say on RuStore

Every rating in the store is five stars. One review in full, translated from Russian.

★★★★★
Downloaded the app and started using it. Much more convenient, it doesn't freeze, there are all sorts of fun features. I'll ask all my relatives to install it too, and to friends who haven't yet: I recommend it. The app is 🔥
Evgeniy · RuStore, September 2026 · all reviews →

What makes ChatYadro different

A niche that neither Telegram nor Nextdoor covers.

🏘

Multi-tenancy

A user creates their own community from 22 types: neighbourhood association, family, school, workplace, shop, car club, sports, clinic and more. Each type has its own roles and modules.

🎭

Two-level roles

Platform-wide roles (user, moderator, admin) plus per-community roles for each type. For a neighbourhood association: Chairman, Board member, Resident, Gardener.

📱

Where it runs

Android from RuStore or as an APK from the site. In a desktop browser as a regular site. On iPhone as a PWA from the home screen: there is no App Store version, and I say so plainly. One Flutter codebase for everything.

📞

WebRTC audio calls

1:1 voice calls over WebRTC with Socket.IO signalling. Works in the browser without installing anything, over any network. Plus voice messages with three playback speeds and a "listened" mark.

💬

A complete chat

Photos and videos in batches, files up to 50 MB, contacts as cards, about 250 emoji in custom categories, reactions. Polls right in the conversation, with anonymity enforced on the server: "who voted for what" is not returned even to the author.

🎨

Photo editor before sending

Brush, caption, two blur modes, rotate and crop, right in the app before the photo goes out. With a short tutorial where the tools draw themselves.

🎓

In-app learning

22 courses arranged in "Beginner, Confident, Pro" tiers, with medals for completion. The audience is non-technical, so the courses cover every screen, not just the main flows.

🧩

Community modules

Each type ships its own set: classifieds, calendar, fees, notes, "Neighbours' help" (requests with responses and a clear lifecycle), "Shopping", construction calculators. Anything unneeded can be switched off in the community settings.

🛡

Auto-moderation

A custom moderation engine with editable term dictionaries. Three reports trigger a soft hide, then a hard remove. An audit log of admin actions and report reviews with an object card.

📋

Legal infrastructure

Compliance with Russian personal-data law (152-FZ): versioned consents, a signature log with IP and a SHA-256 hash of the document, registration in the register of data operators. Public legal texts are generated from the same sources as the in-app screens, so they cannot diverge.

🎮

Games and tools

Seven built-in games (checkers, chess, puzzle, quiz, battleship, tic-tac-toe, a word game). Plus community tools: weather, calendars, fees, SOS.

📰

Feed ranking

Pure chronology worked badly: the feed opened with two-month-old posts. I added a freshness window, unseen-first ordering and a cap of two consecutive posts per author. The window size was chosen by measuring live data, not by eye.

Two problems I am proud of

Both were solved with measurements, not guesswork.

🎬

Media: before and after

Videos were uploaded exactly as the camera recorded them, and photos from the browser were not compressed at all. I added on-device compression and server-side transcoding to 720p: the video library went from 630 to 204 MB, bitrate from 5.7 to 1.9 Mbit/s, the heaviest clip from 48.2 to 4.6 MB, a photo from 3.8 MB to 729 KB. Plus first-frame thumbnails via ffmpeg, an on-device file cache and upload progress. iPhone (HEVC) video is converted in the background: the message goes out immediately and the final file arrives via a socket event.

✍️

Spell-checking in the browser

A user request: a PWA has no system spell-checker. I built a service on hunspell ru_RU via nspell with lazy dictionary loading and a cache. The built-in suggester was not enough: it fixes one error per word, while common Russian typos need two, so I added a table of typical misspellings. Text is parsed in two passes: emails, links and numbers are dropped whole, otherwise the checker pulled fragments of email addresses out as separate words.

Tech stack

Modern full-stack at every layer.

Client

  • Flutter 3.38 · Dart 3.10
  • PWA (Service Worker, Wake Lock)
  • WebRTC (audio calls)
  • Custom design system (glassmorphism)
  • Rich-text post editor (Quill)
  • Optimistic UI with socket echo

Backend

  • Node.js 20 · Express 5
  • Socket.IO 4 (single channel)
  • PostgreSQL 15 (Docker)
  • S3-compatible object storage
  • ffmpeg async workers
  • JWT (15-min access + opaque refresh)

Infrastructure

  • Nginx (HTTP/2, gzip)
  • PM2 process manager
  • Let's Encrypt (auto-renewal)
  • rclone to cloud storage (AES-256 encrypted backups)
  • Firebase Cloud Messaging (FCM)
  • Web Push (VAPID)

Want to try it?

Android from the store. iPhone and desktop via the step-by-step guide with pictures (in Russian).