Changelog

Track every release, fix, and improvement in Lamat

Latest v5.3.5 Jul 21, 2026
Storage paths fixed to absolute URLs + add_interest validator fix
  • 8 controllers: replaced all 'storage/' . $path with asset('storage/' . $path) so photo URLs stored in DB are absolute URLs
  • InterestController.php: removed user_id from addInterest validator (Flutter never sends it; endpoint already uses auth()->id())
Registration flow fixes fix
  • lib/providers/user_profile_provider.dart: Sanctum token now saved via TokenService.saveToken() after registration — add_interest and getUser calls were unauthenticated
  • RegisterController.php: wrapped user creation + photo uploads in DB::transaction() for atomicity
  • RegisterController.php: added mime-type + size validation on uploaded images (jpeg,png,jpg,gif,webp, max 10MB, max 8 images)
  • RegisterController.php: validation errors now return HTTP 422; duplicate email/username return HTTP 409; server errors return HTTP 500 (previously all returned HTTP 200)
Dynamic api data types refactor refactor
  • replaced all .toSafeString()/.toSafeInt()/.toSafeDouble()/.toSafeBool() extension calls on dynamic receivers with safeStr()/safeInt()/safeDouble()/safeBool() top-level helpers
NoSuchMethodError on dynamic receivers fix
  • lib/utils/num_parsing_extensions.dart: added safeStr/safeInt/safeDouble/safeBool top-level helpers that cast to Object? before calling extension methods (fixes NoSuchMethodError on dynamic receivers)
  • lib/models/config_model.dart: fixed boolFromJson(dynamic value) to use safeStr(value) instead of value.toSafeString(); fixed x.toSafeString() in .map() callback to use safeStr(x)
  • lib/main.dart: wrapped SentryFlutter.init() in try-catch with fallback runApp(buildApp()) when Sentry fails; extracted buildApp() widget function
Bundled Outfit fonts locally fix
  • pubspec.yaml: replaced commented SFDisplay font section with Outfit family (9 weights from assets/fonts/)
  • lib/utils/native_theme.dart: changed both light/dark theme fontFamily from 'Lexend' to 'Outfit' (bundled); removed unused google_fonts import
  • web/canvaskit/: added pre-downloaded canvaskit.js/wasm for offline web rendering
  • web/index.html: set flutter-renderer to canvaskit; added window.flutterConfig.canvasKitBaseUrl pointing to local /canvaskit/
Web startup hangs fix
  • lib/utils/native_theme.dart: replaced GoogleFonts.outfit().fontFamily with 'Lexend' to eliminate CDN font fetch on dark theme; removed google_fonts import
  • web/index.html: added <meta name="flutter-renderer" content="html"> to use HTML renderer (avoids canvaskit.js CDN download)
  • .vscode/launch.json: added --web-renderer=html to all launch configs
  • lib/routes.dart: changed BottomNavBarRoute path from '/' to '/tabs' to prevent URL collision with initial browser URL
Music feature: fixed backend issues fix
  • SoundController.php: removed required id from getFavSounds validator (uses auth()->id())
  • SoundController.php: removed required uid from addFavSound validator (uses auth()->id())
  • FeedService.php: added singer and song_title to getFeeds() response (were selected but not returned)
  • ReelService.php: now stores audio_link and audio_cover during createReel()
  • Music.php (Livewire admin): sound files, covers, and category images now stored as absolute URLs via url('storage/' . $path)
Registration flow tests + build runner fix test
  • test/registration_flow_test.dart: 8 tests covering Registration API, checkUserNameEmail, and image assets — all pass with flutter test
  • lib/providers/api_service.dart: added @visibleForTesting static setDioForTesting(Dio) setter for injectable mock Dio
  • lib/providers/chat_provider.dart: hid FormData from universal_html/html.dart to fix import name conflict with dio FormData
  • build_runner: --force-jit flag required on Dart 3.10.7; use dart run build_runner build --force-jit
Web load time optimization perf
  • web/index.html: enabled preload hint for main.dart.js; added preconnect / dns-prefetch for Google Fonts, Google Maps, Apple CDN
  • pubspec.yaml: removed 13 unused dependencies (cloud_firestore, flutterwave_standard, stacked, injectable, scoped_model, socket_io_client, sms_autofill, zego_plugin_adapter, flutter_background_service, flutter_cached_pdfview, flutter_glass_morphism, flutter_story_view, flutter_wall_layout)
  • pubspec.yaml: removed unused Roboto font family (40+ variants, ~3-4MB) — app uses Outfit exclusively
  • pubspec.yaml: moved mockito from dependencies to dev_dependencies (test-only)
Password validation fix + registration flow fix fix
  • RegisterController.php: password regex now allows any non-whitespace special char (was restricted to @$!%*?& only)
  • first_time_update_profile_page.dart: added regex validator matching backend; updated hint text with full requirements
  • password_page.dart: added same regex validator
  • UserProfileController.php: show() now uses auth()->id() instead of requiring id request param — fixes "Baking Your Profile" hang when getUser() omitted the id to hang indefinitely
Voice chat room: gifting, avatar borders, status indicators, chat overlay feature
  • bordered_avatar.dart: new widget — avatar with PpBorder frame, status badges, and speaking indicator
  • gift_button.dart: new widget — floating gift button with diamond balance display, opens GiftSheet
  • chat_overlay.dart: new widget — welcome message / chat overlay at bottom of room
  • user_profile_image.dart: added optional borderImageUrl and isSpeaking params for border decoration
  • room_page.dart: integrated avatar borders (from config ppBorders), host crown badge, floating gift diamond button, chat overlay, and "Send Gift" option in member list context menu; changed from pushReplacement to direct Stack overlay for custom UI on top of Zego
Voice party home screen: app bar tabs, interests section, room card upgrade, broadcast card feature
  • home_screen.dart: integrated tabs (Related/HOT/Explore) with active underline styling, trophy icon + clock in app bar
  • home_screen.dart: ported _InterestsSection with gradient-ring avatars, tag labels, and mini avatars
  • room_card.dart: upgraded to 3 card types (Featured 20+ users / Gold 10+ users / Simple <10 users) with gradient container, framed avatars, tag pills, signal bars, mini avatars, rocket icon
  • room_card.dart: added _SpaceshipRocket, _RocketPainter, _FeaturedFramePainter, _TagPill, _SignalBars, _MiniAvatars shared widgets
  • room_card.dart: added BroadcastRoomCard widget
  • list_live_stream.dart: inserted BroadcastRoomCard at index 3 in ListLiveStreamSearch list view
PK battle: gifting overlay, grid layouts, sound level wave widget feature
  • pk/config.dart: PK foregroundBuilder now shows per-host gift icon (bottom-left), user info name/level/avatar (bottom-right), and sound wave (top-right) driven by host.soundLevel stream
  • pk/config.dart: foreground handles all grid layouts — 1×2 (2 users), 2×2 (4 users), 3×3 (9 users)
  • pk/config.dart: added _showGiftSheet gifting integration + _SoundWaveWidget real-time audio visualization
Dynamic default home page (admin-configurable) feature
  • Migration: added default_home_page to plugins_settings (General Settings) — value can be swipecards, livestreams, livemingle, voiceparty, popballoon, hottakes, blinddate, or reels
  • lib/models/config_model.dart: added defaultHomePage field to Settings class with fromJson/toJson
  • lib/views/tabs/bottom_nav_bar_page.dart: first _BottomNavBarItem now reads configs.plugins?.settings?.defaultHomePage and renders the matching page widget dynamically
plugins_settings: order column + block grouping feature
  • Migration: added order column (int, default 0) to plugins_settings
  • Database: all 59 General Settings ordered by importance with proper block group names (brand, currency, appearance, registration, urls, profile, location, datetime, messages, notifications, live, misc)
  • PluginSettings.php: loadSettings() now orders by order column instead of id
  • plugin-settings.blade.php: block names displayed in uppercase
Safe type conversions across 20+ files refactor
  • Replaced all as String / as String?safeStr() (~65 replacements across auth_user, match_model, streak_model, question_model, user_photo, auth_providers, product_provider, contests_provider, blind_date_provider, notification_service, session_manager, live_mingle_search_screen, item_coin_plan, user_profile_provider, voicechat_rooms_provider, ranking_provider, boost_screen, live_stream_model, other_profile_page, subscriptions)
  • Replaced all .toInt()safeInt() (8 replacements across bank_card_model, stream_goal_model, user_account_settings_model, top_search_model, live_card_model, list_live_card_model)
  • Replaced all int.parse() on map values → safeInt() (116 replacements across profile_controller, user_profile_provider, other_users_provider, voicechat_rooms_provider, teels_provider, ranking_provider)
  • Replaced all double.parse() on map values → safeDouble() (19 replacements across profile_controller, user_profile_provider, other_users_provider, coin_plans)
  • ~208 total replacements — no more unsafe casts from map/dynamic values
ImageEditor + MapLocationPicker auto_route wrappers refactor
  • lib/widgets/ImageEditor/: @RoutePage() wrapper around image_editor_plus
  • lib/widgets/MapLocationPicker/: @RoutePage() wrapper around map_location_picker
  • lib/routes.dart: added routes at /image/editor and /location-picker
  • media_picker_helper.dart, bottom_nav_bar_page.dart, filter_options_screen.dart, account_settings.dart: replaced Navigator.push + MaterialPageRoute with auto_route push; backButton Navigator.pop() changed to context.router.maybePop()
DiamondEventOverlay removed, Pusher logic moved to myapp.dart refactor
  • lib/widgets/diamond_event_overlay.dart — deleted file (no longer needed)
  • lib/myapp.dart — added _listenToDiamondEvents() that subscribes to pusherServiceProvider.onDiamondEarned and calls DiamondAnimation.show() directly
  • lib/myapp.dart — proper disposal of StreamSubscription in dispose()
  • lib/myapp.dart — removed DiamondEventOverlay wrapper from Stack in build method
  • lib/myapp.dart — removed unused diamond_event_provider import
v5.3.3 Jul 14, 2026
Sentry full implementation fixes fix
  • echo_ping_task.dart — replaced Sentry.setUser() (undefined static method) with Sentry.configureScope → scope.setUser()
  • main.dart — fixed BeforeSendCallback signature; changed named param {hint} to positional hint (sentry 8.14.2 API)
  • myapp.dart — removed outer SentryNavigatorObserver wrapper (NavigatorObserver ≠ Widget); observer already used in navigatorObservers list
v5.3.2 Jul 3, 2026
Extracted RevenueCatService refactor

All RevenueCat business logic extracted from Job into a testable service class. JSON error responses with UUID correlation IDs added for traceable debugging.

  • Created ProPlan & UserSubscription Eloquent models; updated webhook Job to use them (replaces raw DB::table)
  • Dispatch HandleRevenueCatWebhook to webhooks queue via ->onQueue('webhooks')
  • RevenueCatWebhookRequest FormRequest — replaces ad-hoc payload validation with typed rules
  • TransactionsLogger trait — shared between PaymentWebhookController and HandleRevenueCatWebhook Job (DRY)
  • Health endpoint (GET /webhook/health) + try/catch error tracking
  • Input sanitization for origTransId, productId, transactionId (trim + truncate to column limits)
  • Handled PRODUCT_CHANGE, TRANSFER, SUBSCRIPTION_EXTENDED event types
  • Async queue for RevenueCat webhook — new Job dispatched from controller (returns 202)
  • Default match arm logs warning for unhandled event types
  • Renamed $expirationMs$expirationAtMs (matches RC field name)
  • Renamed ConfigService::getRevenueCartgetRevenueCat (typo)
  • Null-safety guard in initPlatformStateForPurchases (removed userID! crash risk)
  • Removed client-side boost_balance sync from subscription_builder.dart; webhook is sole grants source
  • DB transactions in activateRevenueCatSubscription & renewRevenueCatSubscription
  • V2 webhook signature replay protection (5-minute timestamp window)
  • isPremiumUserProvider uses ref.watch (reactive) instead of ref.read (snapshot)
  • User existence check in handleRevenueCat (prevents orphan records)
  • Activation idempotency guard (duplicate webhook detection)
  • Fixed premium_expiry_date type bug (int → MySQL datetime string)
RevenueCat webhook endpoint (backend) feature
  • routes/web.php — Added POST /webhook/revenuecat route
  • PaymentWebhookController — Added handleRevenueCat() with HMAC-SHA256 signature verification (V1/V2); resolves pro_plans by product_id; handles INITIAL_PURCHASE/RENEWAL/CANCELLATION/UNCANCELLATION/EXPIRATION events; inserts/updates users_subscriptions + users tables
Subscription system improvements feature
  • is_subscribed_provider.dart — Derived isPremiumUserProvider from premiumCustomerInfoProvider to eliminate duplicate Purchases.getCustomerInfo() calls; added web guard
  • init_purchase_conf.dart — Typed ref as WidgetRef; added try-catch around RevenueCat init; listener now syncs both activation AND deactivation with early return when state matches
  • offerings_provider.dart — Added kIsWeb guard to return empty list without calling Purchases.getOfferings()
  • subscription_builder.dart — Changed from ref.readref.watch for reactive rebuilds; replaced FutureBuilder with try/await; removed app restart and splash navigation after purchase
v5.3.1 Jul 2, 2026
Wallet system update feature
  • Created tables: users_wallets, users_earnings
  • Added API routes: GET wallets/, GET wallets/{type}, GET earnings
  • Added WalletController: index(), show(), getEarnings()
  • Added Flutter providers: walletsProvider, walletByTypeProvider
  • Updated WalletModel with WalletType/WalletStatus enums (17 fields)
Earnings system: pagination + service + UI feature
  • WalletController.getEarnings — now accepts page/limit, returns pagination block
  • WalletService.getEarnings — refactored with page/offset + count query
  • Created EarningModel, EarningTotals, PeriodEarningTotals, EarningsResponse
  • Created EarningListNotifier (paginated StateNotifier) + earningListProvider
  • Created earnings_page.dart with LiquidGlass cards, period/totals summary, type filter, infinite scroll
  • Registered EarningsRoute in routes.dart + regenerated routes.gr.dart
Wallet totals now computed from real source tables fix
  • Added computeWalletComputedTotals(): aggregates balance, points, earnings, withdrawals, rewards, gifts, deposits, transactions count from 6 real tables
  • formatWallet now accepts computed array param, overrides all stored totals
  • getAllWallets / getWalletByType pre-compute totals once before formatting
  • Flutter EarningTotals: added gifts, deposits, withdrawals fields
  • Flutter PeriodEarningTotals: added bonus, gifts fields
  • earnings_page: added Gifts / Deposits / Withdrawals chips
Paginated withdrawals system (backend + Flutter) feature
  • WalletService.getWithdrawals: paginated query on users_withdrawals, optional status filter, aggregate totals by status
  • WalletController.getWithdrawals: delegates to service with page/limit/status
  • Route GET withdrawals/ added to api.php
  • Created WithdrawalModel, WithdrawalTotals, WithdrawalResponse (Dart)
  • Added WithdrawalListNotifier + withdrawalListProvider
  • Created withdrawals_page.dart with LiquidGlass cards, status filter chips, aggregate summary, infinite scroll
Created migration files for users_wallets + users_earnings
  • 2026_07_02_000001_create_users_wallets_table.php
  • 2026_07_02_000002_create_users_earnings_table.php
  • Both registered in migrations table (batch 9) to prevent re-run
v5.3.0 Jul 1, 2026
Massive Navigator.push → auto_route refactoring refactor

Completed project-wide migration from raw Navigator.push + MaterialPageRoute to auto_route across 40+ files. Added 7 missing route classes. Only third-party MapLocationPicker remains unconverted.

  • Refactored 4 message-related files (chats, chat_page, conversation_tile, media_message) — 9 replacements
  • Refactored feeds_home_page.dart — 14 replacements (CameraScreenTeels, LiveStreamScreen, TextStatus, FeedPostPage, ProfileNested, etc.)
  • Refactored 6 more files (bottom_nav_bar_page, for_u_screen, pickup_screen, live_mingle_search_screen, live_providers, call_utilities)
  • Refactored wallet (5 files), otherProfile (4), notification, echoes (2), comment_screen
  • Refactored 9 additional files (events, contests, security_and_privacy, report_screen, loading_page, google_login, user_is_banned_page, subscription_builder)
Blind Date — critical fixes fix
  • #1_startTimer_startTimer() to actually start the countdown timer
  • #2 — Moved navigation out of build() in blind_date_waiting.dart and blind_date_lobby.dart; added _navigated flags and transition guards to prevent duplicate navigations
  • #3 — Added _pollTimer?.cancel() in reveal() and auto-stop polling when session status is revealed/expired
  • #4 — Replaced Future.doWhile with Timer.periodic + cancel in dispose()
  • #5 — Wrapped async _init() in addPostFrameCallback
  • #6 — Changed _prefs from nullable to late SharedPreferences
  • #7/#14_onTimeUp now navigates to BlindDateExpired (was incorrectly navigating to BlindDateWaiting)
  • #8 — Converted BlindDateSection from ConsumerWidget to ConsumerStatefulWidget, added fetchEvents() in initState
  • #10 — Replaced all Navigator.pushReplacement with context.router.replace
  • #11 — Removed unused import of blind_date_provider.dart from echo_feed_page.dart
  • #12/#13 — Replaced clearError bool with sentinel pattern in copyWith
  • #15 — Added EasyLoading.showError in pollStatus catch block
Restructured BlindDateCall reveal flow feature

Cameras start off; tap Reveal turns on MY camera (they see me); poll detects mutual reveal; 2s delay then navigate to BlindDateReveal. _onTimeUp now calls skip() before navigating to properly end the Zego call.

Fixed blind_date_reveal.dart reactivity fix

Replaced one-time ref.read(blindDateProvider) with ref.listen to reactively detect partner data; _checkMatch now receives matchInfo as parameter.

Splash animation from configs fix

splash_gif_anim.dart — show anim from configs (NetworkImage) with fallback to local asset (AssetImage) from AppConstants.splashAnim.

Security v5.2.0 Jun 29, 2026
License system overhaul refactor
  • Refactored license generation: removed LMT format, now uses SRC format (PRODUCT-SRC-R/E-XXXXXXXX-XXXXXXXX-XXXXXXXX) for all products
  • Fixed license verification bug: SRC codes from admin generator now verify correctly
  • Removed backward compatibility for old LMT format licenses
  • Made admin dashboard multi-product aware (product selector, per-product stats, source purchases tab)
  • Added admin-list-source-purchases API endpoint
  • Unified license storage: removed lamat_licenses table, all licenses now in source_purchases
  • Renamed users table to license_verifications
  • Updated all PHP code to use new table names
  • Created migrations: 012_drop_lamat_licenses_table.sql, 013_rename_users_to_license_verifications.sql
Rewrite create_update_zip.sh fix

Now creates timestamped folder at script location instead of hardcoded zip path; cross-platform (macOS, Windows via Git Bash/WSL).

v5.1.0 Jun 28, 2026
Advanced filter screen & swipe preferences feature
  • Created users_swipe_preferences table (uid, category, value with unique constraint)
  • Added updateUserSwipePreference route + controller method (updateOrInsert pattern)
  • Created AdvancedFilterOptionsScreen showing 23 category dropdowns from DB answers
  • Added updateUserSwipePreference method to UserProfileNotifier
Profile list constants — questions & answers feature

Inserted 26 questions and 165 answer options across 4 batches covering: report reasons, here_to, religion, hair/eye/skin color, zodiac, education, personality, family_plans, drinking, smoking, working, diet, social_media_activity, sleeping_habits, going_out, weekends, phone habits, drugs, pets, children, love_language, has_baby, language, com_style.

App Images Icons plugin feature
  • Created AppImagesIcons model class with 20 fields (background, splash, icons, etc.)
  • Added appImagesIcons field to Plugins class
  • Inserted plugin (id=91) and 20 settings into plugins + plugins_settings tables
  • Backend: Added getAppImagesIcons() method in ConfigService.php
Mobile App Colors plugin feature
  • Created MobileAppColors model class with 37 color fields (primary, secondary, gradients, etc.)
  • Added mobileAppColors field to Plugins class
  • Inserted plugin (id=90) and 37 settings into plugins + plugins_settings tables
  • Backend: Added getMobileAppColors() method in ConfigService.php
UI / App configuration fields from AppConstants feature
  • Expanded Settings model with 34 new fields (app_name, is_demo, web_app_url, toggles, etc.)
  • Inserted 34 new settings into plugins_settings for General Settings plugin
  • Backend: Expanded getSettingsPlugin() method with all new config fields
Rewards plugin — all reward/credit fields feature
  • Expanded Rewards model with 64 new fields (teel_upload_reward through hot_takes_win_debate_reward)
  • Inserted 64 new settings into plugins_settings for Rewards plugin
  • Backend: Expanded getRewards() method with all new reward credit fields
Sentry plugin feature
  • Added Sentry model class with enabled and dsn fields
  • Added sentry field to Plugins class
  • Inserted plugin (id=89) and 2 settings into plugins + plugins_settings tables
  • Backend: Added getSentry() method in ConfigService.php
RevenueCart plugin feature
  • Added RevenueCart model class with enabled, apple_api_key, google_api_key, entitlement_id, app_id fields
  • Added revenueCart field to Plugins class
  • Inserted plugin (id=88) and 5 settings into plugins + plugins_settings tables
  • Backend: Added getRevenueCart() method in ConfigService.php
AdMob plugin feature
  • Added Admob model class with enabled, android_*_id, ios_*_id fields
  • Added admob field to Plugins class
  • Inserted plugin (id=87) and 11 settings into plugins + plugins_settings tables
  • Backend: Added getAdmob() method in ConfigService.php
v5.0.0 Jun 14, 2026
Push Notifications admin page feature
  • Marketing tab (OneSignal): send to all or specific user, writes to activity table
  • Real Messages tab (FCM + users_chats): send to specific user, inserts into users_chats + activity table + FCM push
  • Added fcm_server_key and fcm_project_id to plugins_settings for the OneSignal plugin
  • Route: /push-notifications → PushNotifications
  • Sidebar: added "Push Notifications" nav item after Theme Manager
  • Reuses existing: FcmService::sendChatMessage(), OneSignalService::sendPromotional()/sendToUser()
v1 - 4 Jun 14, 2026
Older versions (v1 - v4) archive