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.
My main project
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.
The store listing from RuStore: a short video and the screens on a phone. Interface is in Russian.
Swipe sideways →
Publishing on RuStore did not work on the first try. Here is how it went: handling a rejection says more than a smooth story.
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.
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.
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.
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.
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 🔥
A niche that neither Telegram nor Nextdoor covers.
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.
Platform-wide roles (user, moderator, admin) plus per-community roles for each type. For a neighbourhood association: Chairman, Board member, Resident, Gardener.
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.
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.
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.
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.
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.
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.
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.
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.
Seven built-in games (checkers, chess, puzzle, quiz, battleship, tic-tac-toe, a word game). Plus community tools: weather, calendars, fees, SOS.
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.
Both were solved with measurements, not guesswork.
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.
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.
Modern full-stack at every layer.
Android from the store. iPhone and desktop via the step-by-step guide with pictures (in Russian).