Spicy Незалежна архітектурна оцінка
Незалежний технічний висновок · spicydate.net

Перехід Spicy на native: що робити, а що — ні

Не переписувати все. Запустити, виміряти й виносити в native лише те, що реально впливає на retention і revenue.

17 червня 2026 Оцінка всіх опцій міграції Ризики · дорожня карта · рекомендація
або свайп для навігації
Контекст

Spicy — це вже платформа, а не просто dating-апка

Це соціальна discovery-платформа з подіями, сторісами, чатами, гаманцем, монетами, рефералкою, KYC, бізнес-акаунтами та публічними сторінками.

Dating через події Marketplace подій Creator monetization B2B-реклама Referral-зростання

П'ять бізнес-моделей одночасно роблять продукт технічно й регуляторно складнішим, ніж класична dating-апка. Це головна причина обережності з повним переписуванням.

Поточна архітектура

Вже mobile-ready hybrid

Flutter mobile shell · iOS + Android
WebView
Angular web application
основний UI · бізнес-логіка · 300–400 компонентів · 100+ API
↕ JS bridge

Flutter відповідає за native

push, камера, медіа, Apple / Google / Facebook login, payments, face verification, deep links, sharing.

Web (Angular) тримає продукт

більшість екранів, навігація, профілі, stories, events, referral, admin- і business-флоу.

Висновок: додаток уже існує для iOS та Android. Переписувати фундамент не потрібно — потрібно його посилити.

Масштаб продукту

Складність у «гостроті» 🔥

Чим «гостріший» блок — тим більше в ньому логіки, медіа й ризику, і тим обережніше з його переписуванням.

Storiespaid unlock, likes, gifts, analytics
Eventsmaps, categories, join requests
Chatsvoice, gifts, translation, push
Coins / Wallettop-up, KYC, withdraw
Business accountsevents, followers, chats
Авторизаціяinvite-only, social, 2FA
Профіліverified, activity score
Referrallevels, reward rates
Admin / AImoderation, astro, tips
Public linksпрофілі / івенти для гостей
Головний висновок

Повний native rewrite зараз робити не треба.

Це дорого, довго і ризиковано. Правильний шлях — еволюція, а не революція: залишити hybrid, оптимізувати його, запустити продукт, зібрати реальні дані, а потім точково виносити найважчі модулі в Flutter-native.

Чому не зараз

Чому повний rewrite зараз — неправильно

01

Дуже великий scope

Це не 10–20 екранів, а ціла платформа з ролями, флоу й інтеграціями.

02

Ризик зупинити запуск

4–8 місяців на rewrite — і ринок так і не перевірено.

03

Native — не доведена проблема

Без DAU/MAU, retention і реальних метрик rewrite — це здогадка.

04

Три кодові бази

Swift + Kotlin + Web: кожна фіча коштує дорожче й довше.

05

Policy важливіша за UX

App/Play review, payments, UGC-модерація, KYC — терміновіші ризики.

Тому фокус інший

Запустити, привести users, перевірити events, чати й payments. Native — точково, де він впливає на engagement або revenue.

Рекомендований шлях

Контрольована еволюція

01
Стабілізувати hybrid

Поточна Flutter + Angular WebView app лишається базовою production-версією. Заморозити ідею повного rewrite.

02
Технічний audit · 1–2 тижні

Знайти реальні bottlenecks, відділити відчуття від фактів: performance, WebView, media, payments, compliance, analytics.

03
Оптимізувати performance

Media й caching, lazy loading, skeletons, стабільна навігація, memory, fallback для поганого інтернету, feature flags.

04
Запустити core loop і виміряти traction

Перші реальні події й партнери. Funnel: реєстрація → профіль → подія → чат → payment → retention.

05
Винести 1–2 native islands

Лише найважчі UX-модулі у Flutter-native — там, де native дає вимірюваний impact.

Pure Swift/Kotlin — лише пізніше, за сильного traction, revenue і команди для підтримки трьох кодових баз.

Native islands

Точкова нативність

80–90% — Angular WebView.
10–20% — Flutter-native критичні екрани.

Не вся апка переписується. Технологія островів — Flutter / Dart, бо shell, build pipeline і bridge уже є. Один код на iOS і Android.

Сьогодні
Home WebView
Events WebView
Story WebView
Chat WebView
З островами
Home WebView
Events WebView
Story Viewer Flutter-native
Chat WebView

Перший острів — Story Viewer

Media-heavy UX зі swipe, анімаціями, gifts і paid unlock — тут різниця між WebView і native найпомітніша, а вплив на engagement і revenue найбільший. Далі: Event Feed → Profile Discovery → Chat → Camera/Media.

Усі опції на столі

Чотири варіанти — і чому ми обираємо B

A · Hybrid + оптимізація

baseline

Angular WebView лишається основою, Flutter — native-інтеграції. Найшвидший шлях до запуску, одна кодова база.

Ризик
✓ Так — на найближчі 3–6 місяців

B · Hybrid + native islands

обрано

Більшість app — web, найважчі модулі — Flutter-native. Точково покращує UX, не вбиває roadmap, зберігає одну mobile-базу.

Ризик
✓ Найкращий стратегічний шлях

C · Повний Flutter-native

пізніше

Весь mobile UI у Flutter, web окремо. Кращий UX, одна mobile-база, дешевше за Swift+Kotlin — але великий scope.

Ризик
Лише після traction і 1–2 успішних островів

D · Pure Swift + Kotlin

не зараз

Окремо iOS і Android, web окремо. Максимальна якість — але 3 кодові бази, дорожча команда, довший time-to-market.

Ризик
Не для раннього growth-stage
Платежі

Три розділені потоки

Потік 1 · digital

Apple IAP / Google Play Billing

Усе digital всередині app: coins, premium, paid stories, gifts із digital benefit, boosts, unlock.

Потік 2 · offline / B2B

Зовнішній PSP

Реальні offline-події, реклама ресторанів і клубів, lead generation для бізнесу.

Потік 3 · payout

Payout provider + KYC

Виведення creator-балансу. На старті — manual payouts лише після KYC.

Правило: усе digital, що купується в app, іде через IAP / Play Billing. Coins називати «in-app credits», не «грошима». Розділяти coins-wallet (купується) і creator-balance (виводиться).
Чат

Лишаємо GetStream — але страхуємось

  • Не писати свій месенджер зараз: delivery, retries, read receipts, media, push, blocks, GDPR, scaling — це не просто WebSocket.
  • Залишити GetStream і додати власний abstraction layer (ChatProvider interface) для майбутнього виходу.
  • Дзеркалити critical metadata у свій backend: gifts, paid actions, moderation status, blocks, reports.
  • Налаштувати exports / backups і webhooks / event mirroring.

Свій чат — лише коли

GetStream cost перевищує власну infra + команду, і є стабільні 50–100k+ active users.

Потрібні: сильний backend, 24/7 support, moderation/fraud-команда і чітка стратегія міграції даних. До того — GetStream.

Compliance & policy

Найбільший ризик — не native, а policy

  • UGC-модерація: report / block / фільтри / admin review, audit log дій.
  • NSFW прихований за замовчуванням, без промо sexual content.
  • AI-модерація тексту й зображень + human review для high-risk.
  • 18+ age gate, Terms, Community Guidelines, Privacy, Content Policy.

Позиціонування вирішує все

Для App Store, Google Play, PSP і рекламних платформ продукт має звучати як events-based social discovery — verified profiles, curated experiences — а не adult/escort-marketplace.

Це збігається з продуктовим баченням команди: ставка на живий, якісний контент і реальні зустрічі, а не на приватний платний контент.

Фокус 30–60 днів

Не фічі й не rewrite — а core loop

реєстрація профіль знайти подію join чат зустріч offline повертається

Робити

  • 2–3 реальні event-партнери (бари, клуби, speed dating).
  • 5–10 якісних подій і перша контрольна аудиторія.
  • Ручна модерація supply-side і вимірювання funnel.

Не робити

  • 10 нових модулів і повний rewrite.
  • Власний чат і payouts без KYC.
  • Aggressive adult positioning та реклама без стабільного funnel.
Дорожня карта

Поетапний план

0–2 тижAudit: performance, payment matrix, policy review, analytics event map, вибір першого native-острова.
2–6 тижОптимізація + launch readiness: WebView і media, навігація, loading/error states, crash-моніторинг, перші event-партнери.
6–12 тижControlled beta: вимір funnel, перший native island — Story Viewer, закриття payment/UGC gaps.
3–6 місДругий острів (Event Feed / Profile Discovery), старт B2B-монетизації, обережний creator-payout.
6–12 місРішення про ширшу Flutter-native міграцію — лише якщо метрики виправдовують.
Audit 1–2 тиж Оптимізація 2–4 тиж Story Viewer 4–6 тиж Event Feed 4–8 тиж Chat native 6–10+ тиж Full Flutter-native 6–12 міс Pure Swift/Kotlin 9–18 міс

Оцінки орієнтовні, без доступу до коду. Після audit їх потрібно уточнити.

Фінальна рекомендація

Еволюція, а не революція

Зараз
  • Тримати hybrid
  • Технічний audit
  • Оптимізувати performance
  • Запустити core loop
  • Виміряти traction
Далі
  • Story Viewer як острів
  • Потім Event Feed
  • Залишити GetStream
  • Розділити платежі
  • Посилити moderation
Пізніше
  • Ширша Flutter-native міграція — лише після traction
  • Pure Swift/Kotlin — лише якщо бізнес виправдає 3 кодові бази

Не переписувати платформу зараз. Запустити, довести цінність, виміряти проблеми — і переписувати тільки те, що реально впливає на retention, revenue або довіру.