Changelog

Track every release, fix, and improvement in Lamat

Latest v5.6.1 Sep 10, 2026
Echoes now works only while you use the app fix
  • No more background location checks. Echoes used to look for nearby people even when the app was closed, which app stores reject. Now it only checks your location while the Echoes screen is open or when you tap refresh or check in yourself.
  • A clear permission screen comes first. Before the phone asks for location, the app now explains in plain words what is used, when, and that nothing runs in the background — so there are no surprises.
  • Turning Echoes off truly stops everything. Disabling the feature immediately stops all location use, and leftovers from older app versions are safely ignored.
Release build fixed after an update raised the requirements fix
  • The app would not package for release. The build stopped right away saying the project's build tool was too old for the current Flutter version.
  • Updated the build tool behind the scenes. Nothing looks different in the app — this just lets the release version build and install normally again.
New app shell prepared behind the scenes refactor
  • Nothing changes in the app you use. A fresh copy of the app's Android foundation was set up with the latest recommended tools, ready for the future.
  • All store and login settings carried over. Things like notifications, maps, payments, and the app's store identity were carefully moved across so nothing is lost when the switch happens.
iPhone setup kept on its proven path refactor
  • Nothing changes in the app you use. The new template wanted a different way of fetching iPhone building blocks, but the video-call pieces the app relies on don't support it yet — so the current proven method stays, with all its settings carried over.
  • Same app identity on iPhone. The new shell now uses the same app ID as the live app, so updates keep working as usual.
  • iPhone permissions and services moved over. Login with Facebook and Google, notifications, camera and location explanations, and advertising settings were all carried into the new shell, now showing the Lamat name.
  • Web version look carried over. The browser version keeps its icon, loading screen, sharing preview, and login buttons exactly as before.
  • Fixed a hiccup building the new shell. The first test build of the new foundation stopped on a technicality in its settings file — corrected, and the build is being retried.
v5.6.0 Sep 9, 2026
Shop recommendations and smart discovery feature
  • A "For You" row now lives at the top of the Shop. It learns from what a buyer has already purchased and puts similar and featured products right at the front.
  • Buyers without order history still get picks. New shoppers see the newest and featured items instead of an empty recommendation shelf.
Creator affiliate program for the Shop feature
  • Creators can now earn from the Shop. A new Affiliates section lets creators browse commission plans, join them and request product samples from sellers.
  • Personal referral links pay out automatically. Every order placed through a creator's link credits the creator's wallet the moment payment completes — whether the buyer pays with credits or a card.
  • An earnings dashboard tracks it all. Creators see clicks, orders and commission earned at a glance, and can copy any of their links to share.
Seller Center for shop owners feature
  • Sellers get their own control room. The new Seller Center shows revenue, paid orders and product count, plus direct access to seller order fulfilment.
  • Storefronts can be personalised. Sellers set a store name and description, and verification status is clearly displayed.
  • Admin gains seller oversight. A new Shop Sellers admin page lets staff verify or suspend sellers, and the dashboard now shows shop revenue, orders today, new sellers and low-stock products.
Buyer protection: returns and disputes feature
  • Buyers can request a return. Delivered orders now offer a Request Return action with a reason.
  • Sellers can refund directly. Approving and refunding a return reverses the credits back to the buyer's wallet automatically and updates the order timeline.
  • Disputes have an escape hatch. Either party can open a dispute on an order and resolve it with a written outcome.
Subscribe & Save for repeat purchases feature
  • Products can be put on subscription. Sellers flag items as subscribable and buyers pick weekly, biweekly or monthly delivery.
  • Renewals happen hands-free. A scheduled task charges the buyer's wallet and creates the renewal order automatically; if the balance is short it simply tries again next cycle.
  • Easy management from My Orders. A new Subscriptions sheet lists active subscriptions and lets buyers cancel in one tap.
Lamat Plus, Gold and Platinum memberships feature
  • Three premium tiers replace the old one-size-fits-all premium. Members now join Lamat Plus, Gold or Platinum, each unlocking a bigger set of perks, and the app shows a tier badge on member profiles.
  • Plus removes the limits. Members swipe with unlimited likes and rewinds, can browse invisibly with Incognito mode, and change their location to match anywhere with Passport.
  • Upgrading, downgrading or cancelling just works. The membership level updates instantly, and perks expire gracefully when a subscription ends.
A cleaner, store-ready paywall feature
  • The subscription screen got a full makeover. The old custom paywall is replaced with a modern, native purchase experience that follows each store's guidelines.
  • Plans refresh themselves. Pricing, plans and special offers come straight from the App Store and Play Store, so testers and users always see the live catalog.
  • Desktop and web users are covered too. The familiar card-based plan sheet remains available where the new purchase experience isn't supported.
Gold: see who's interested in you feature
  • Gold members see who likes them. A new grid reveals everyone who has already swiped right, so a like back is an instant match.
  • Hand-picked Top Picks arrive daily. A curated batch of the most compatible profiles shows up every day.
  • Weekly perks land automatically. Free Super Likes and a monthly Boost are granted on schedule — no need to claim anything.
Platinum: stand out first feature
  • Platinum likes jump the queue. Likes from Platinum members are shown ahead of everyone else's.
  • Say something before you match. Platinum members can attach a short note to a Super Like, so the other person reads it before deciding.
  • More visibility everywhere. Platinum hosts appear first in Live Streams, get priority placement in the Shop with lower selling fees, and earn a bonus on affiliate commissions. A new Likes Sent history shows the profiles liked over the past week.
Platinum: a dedicated support inbox feature
  • Platinum members get a direct line to us. A new Support area in the profile menu opens a real conversation — start a ticket, reply to it and follow the whole thread in one place.
  • Every message is kept together. Past tickets stay in the inbox with their status, so nothing gets lost between replies.
  • Our team answers from the admin panel. Support staff see new tickets as they arrive, reply directly and close a conversation once it is resolved.
Custom profile themes feature
  • Platinum profiles can dress up. A new theme picker offers six animated gradients — Aurora, Sunset, Midnight, Royal, Rose and Neon — that become the backdrop of the profile header.
  • Visitors see the theme too. The chosen gradient shows up when someone else opens the profile, so a first impression feels personal.
Voice rooms: bigger crowds and reserved seats feature
  • Platinum hosts can welcome more people. Rooms hosted by a Platinum member hold twenty extra listeners before they are full.
  • The front seats are kept for Platinum guests. Reserved seats are marked with a crown so everyone can see them, and members without Platinum are invited to upgrade instead.
App health check: code warnings cleared fix
  • The app's automated health check is green again. Thirty-one code warnings across the discovery pages, voice rooms and profile screens were tidied up, so future updates build on a clean foundation.
  • Nothing looks different — and that is the point. This was behind-the-scenes housekeeping: buttons, badges and layouts all behave exactly as before, just with the code now passing its quality checks.
v5.5.5 Sep 2, 2026
Flutter web CanvasKit error fixed fix
  • Fixed CanvasKit PathBuilder error on web. The app was crashing with "PathBuilder is not a constructor" error because manual CanvasKit files were placed in the web folder instead of letting Flutter generate them automatically during builds.
  • Removed manual CanvasKit files. The web/canvaskit/ directory with manually placed files was removed to allow Flutter to generate the correct CanvasKit assets during web builds.
  • Updated web bootstrap script. Added async attribute to the flutter_bootstrap.js script tag in web/index.html to match current Flutter web best practices.
Service Worker package added for Flutter web feature
  • Added sw package for optimized web performance. The sw (Service Worker) package v0.1.5 was added to dev_dependencies to provide an optimized Service Worker and Bootstrap pipeline for Flutter web builds.
  • Global activation completed. The package was activated globally using dart pub global activate sw, enabling the generation of service worker files with resource manifest and caching logic.
  • Build process enhanced. The new setup allows generating sw.js and bootstrap.js files during web builds, providing intelligent caching, CanvasKit CDN loading, and a professional loading experience.
v5.5.4 Aug 31, 2026
Bug fixes and UI improvements fix
  • General bug fixes and UI enhancements across the application to improve user experience and stability.
v5.5.3 Aug 14, 2026
Public Privacy & Support pages — hosted on the backend feature
  • Four public pages are now live on the backend: Privacy Policy (/privacy), Your Privacy Choices (/privacy-choices), Cookie Policy (/cookies) and Help & Support with a FAQ section (/support). They are open to everyone — no login needed — and are styled to match the site branding.
  • The app's old privacy links now land here too. The in-app browser links that used ?page=pp, ?page=cookies and ?page=faq now redirect to the new public pages instead of opening the landing page.
  • Content is editable from the admin panel. A new "Public Pages" section in the sidebar lets you pick any of the four pages and edit its title and body with the same editor used for blog posts, then save straight to the database. The changes appear on the public pages immediately.
  • The pages live in their own database table. A new public_pages table stores each page's slug, title and HTML content, and comes pre-filled with sensible default Privacy, Privacy Choices, Cookies and Support text — ready to be customised.
Matching now respects who users want to see fix
  • The app and server finally agree on genders. Everyone's gender options come from one single list in the database (the genders table), and the "Show me" choice now stores the id from that same list (or "all"). Previously the server used its own old internal list while the app used the database list, and the matching screens looked for values that were never stored — so gender filtering in swipes, echoes, blind dates, hot takes and live mingle silently showed everyone to everyone. All five now resolve the choice through the same helper, so filtering works properly.
  • The "Show me" settings screens were fixed too. The app previously read and saved the choice by list position, which misidentified straight people as "All" (e.g. picking "Straight Woman" was shown as "All"), and the settings dialog read the option with a broken accessor that could crash. Both the filter screen and account settings now match by the real gender id.
  • Registration now separates the two questions. The sign-up flow now asks "Show me" (which gender you are interested in) and "I'm looking for" (your purpose — love, friendship, etc.) as two separate choices, and both are saved. The old flow mixed these two meanings into one mislabeled picker.
Your exact gender choice is saved — no more male/female fallback fix
  • What you pick is what gets stored. Every way a profile can set gender — sign-up, editing settings, and the server's generic update — now saves the exact gender id from the database list the user selected. Before, the database had a leftover "male" default, and accounts created through Apple, Google, Facebook or phone login silently got the word "male" stored instead of a real gender, so those users could be missed or mismatched by gender filters.
  • Old accounts are repaired. A database update converts any existing "male"/"female" text values to the matching gender from the list, and the column's default is changed so no future account can fall back to "male" again.
The whole gender & dating-intent system was audited and unified refactor
  • "Here for" and "I'm looking for" are now one thing. They stored the same answer (make friends, find a date, etc.) in two separate places — one was written once at sign-up and never used again, the other is what you edit in settings. The duplicate is removed: sign-up now saves straight into the one real field, the profile no longer sends or reads the old one, and a database update merges any existing values before removing the extra column.
  • Double dates were still using the old gender list. The double-date matcher checked hard-coded "men"/"women" values that are never stored anymore, so it silently ignored everyone's preference. It now uses the same gender-list helper as every other feature.
  • All the leftover old-style code was cleaned up. The blocked-users screen shows the gender correctly instead of a 0, live mingle and hot takes store the choice in the same id format as everywhere else, a useless line was removed from swiping, and the admin panel (sign-up, user management, profile editing) now offers the same gender list from the database instead of a fixed Male/Female/Other dropdown.
  • A settings bug in the app was fixed along the way. The advanced filter screen's dropdowns could overwrite several profile fields at once because the code didn't stop after the right one — each choice now updates only its own field.
Your profile now shows up right after you sign in fix
  • No more app restarts after logging in or registering. After signing in (with password, Apple, Google, Facebook or phone) or creating a new account, the main screen sometimes showed an empty profile until the app was restarted. The profile was saved on the server but the app's memory and what the home screen reads were out of sync. Signing in now updates both at once, and the main screen also re-reads the saved profile if it ever starts without it — so your name, photo and account details are there immediately.
Logging out no longer wipes your language, theme and favourites fix
  • Only your session is cleared when you sign out or get logged out. Before, signing out (or the app automatically logging you out after an expired session) also erased preferences like your display language, dark mode choice, favourite music and the features you were introduced to. Now only your login details are removed — restarting the session no longer resets your personal setup.
  • Session-expiry handling was hardened. The routine that detects an expired login and sends you back to the sign-in screen could get stuck after the first timeout and never react again; it now always resets itself. A small background location-ping task was also cleaned up so it always finishes properly.
Login tokens are no longer stored in the database in plain text fix
  • Your access token used to be copied into the database in readable form. Every time you signed in or registered — including through Apple, Google and Facebook — the server wrote your session token in plain text next to your account. Tokens are already protected on the device and in the server's token table, so this duplicate copy was an unnecessary risk if the database ever leaked. New logins no longer write it, and a database update removes the leftover column.
  • Web builds lock the token down too. The app's secure-storage switch on the web now explicitly uses strong encrypted storage instead of the fallback option, and a dead in-memory token variable was removed so no code can read a stale empty token.
v5.5.3 Aug 13, 2026
Location permission explanation added for the App Store fix
  • Apple asked for a privacy explanation for using the device's location in the background, so a new build had to be prepared. The app already explained why it needs location while open and in general. Apple also wanted the wording that covers the "always" option, so this explanation was added to the iOS settings. The explanation text matches the existing ones — "This app needs access to location to save your default location." — and the updated build is ready to be uploaded to the App Store as version 5.5.3 (build 17).
v5.5.3 Aug 12, 2026
Chat actions now use the safe request method refactor
  • Any action that changes a chat no longer travels as a plain GET request. Marking a message as read, reacting to, deleting, starring, pinning, editing or forwarding a message, and creating or restoring chat streaks now use the POST method, which is the proper way to change data on the server. Simply viewing chats, messages, streaks or call history still use GET, and nothing else about the requests was touched.
Profile actions now use the safe request method refactor
  • Updating your profile, photos, stories, credits or settings no longer happens over a GET request. Updating profile fields, settings and notifications, following or unfollowing, liking, adding or removing interests, boosting, visiting, purchasing or deleting stories, deleting conversations or photos, spending credits and saving favourite sounds now all use the POST method. Anything that only reads data — your profile, followers, rankings, matches, visitors or payout history — still uses GET.
Apple Sign-In on iPhone is now instant refactor
  • On iPhone, signing in with Apple no longer asks the server to re-check the Apple token. Apple's login screen already confirms who the user is on the device, so the app now simply tells the server which Apple identity signed in, and the server signs into that account. Fewer steps and no extra network checks, so Apple sign-in on iOS is faster and less likely to break. The Apple button only signs into an existing account — it never creates a new one automatically — and Android / web keep the full secure verification since those flows need it.
The whole app now uses POST for actions that change data refactor
  • Every remaining action that changes data — in feeds, reels, voice chat rooms, stories, events, live streams, wallets, meetings, subscriptions, notifications, blocking, rankings and location updates — was moved from GET to the POST method in both the app and the server. Anything that only reads information (listing feeds, sounds, rooms, balances, transactions, matches or comments) stays as a quick GET request. The server routes were updated to accept the new method, so the app and backend always agree.
Going live now uses the proper request method refactor
  • Starting or joining a live stream no longer travels as a plain GET request. Starting a stream and recording who joined it now use the POST method, and the server was updated to match. Loading the list of live streams still uses GET.
Date-request photos are now sent with the request feature
  • Photos chosen for a date request now travel with the request itself in one upload. Previously the app uploaded each photo separately and then a second request created the date. Now the photos are uploaded as part of the same single request when you send the date invite, and the server keeps them attached to the date — they appear in both users' "my meetings" screens as before.
Posting a feed is now one upload instead of several feature
  • Creating a feed post with multiple photos is now a single upload. The app used to create the post first, then send each photo one by one. Now the post details and all its photos are sent together at once, so posting is faster and the post never exists without its photos. The same tidy-up was applied to reels, and the old file-upload helper endpoints were retired.
v5.5.2 Aug 07, 2026
Android release builds now complete successfully fix
  • Release builds no longer stop at the Google Maps setup. The automated build for the Play Store was failing before compiling because the tool that reads the Maps API key was listed in the build settings without its version number. The version is now declared, so the build loads the tool correctly and can proceed all the way through.
  • Removed duplicate, unused build files. The project carried two copies of its build settings, and only one set was actually used. The unused copies were removed so the release build always reads from a single, consistent set of settings.
The app's coding tools are now up to date fix
  • Release builds no longer crash inside the map plugin. After the first fix, the build got further but still stopped while compiling the Google Maps part of the app, because the version of the Kotlin coding tools the project was using was older than what the map plugin needs. The project now uses the same up-to-date tool versions that the current version of the app framework recommends, so the map code compiles cleanly.
Companion build tools refreshed to match feature
  • Crash reporting, Firebase setup and Play Store publishing tools were updated. These three helper tools were several years behind the current versions the build system recommends. Newer versions are officially designed for the build system now in use, fix known problems with newer Android builds, and everything the app needs was already in place, so the update is safe.
  • Every other build setting was double-checked. The remaining build tools and libraries were reviewed one by one against the current build system and all of them are compatible, so no other changes were needed.
Crash reports updated to work with the new tools fix
  • The crash-reporting SDK was brought up to date. The version in use was from a couple of years ago and no longer compiled with the newer build tools, which stopped the Play Store build again. It has been updated to the current version, and the way the app uses it stays exactly the same, so crash reports keep working as before.
All parts of the app now build with the same language level fix
  • Fixed a mismatch that stopped the messaging library from building. One of the chat libraries was being compiled partly with an old version of Java's language settings and partly with a newer one, and the build tools refuse to mix them. The build now uses one consistent language level across every part of the app, which the stricter newer build tools require.
The live chat connection library builds again fix
  • Mended an old chat library that no longer worked with the current app framework. The library that keeps real-time chat and game features connected had been abandoned and referenced an old app-framework feature that no longer exists, which stopped the Play Store build once more. A fixed copy of the library is now kept inside the project with that outdated reference removed — the way the app talks to it is unchanged, so live chat behaves exactly as before.
v5.5.1 Aug 06, 2026
Logged-in sessions now last 90 days feature
  • No more silent sign-outs after a day. The login token that keeps users signed in used to expire after 24 hours, which meant people who opened the app on a later day would suddenly find their feed failing even though they still looked logged in. Sessions are now valid for 90 days from login, so staying signed in just works.
  • Fresh logins still work exactly as before. Every time someone signs in — password, phone, Google, Facebook or Apple — they receive a new 90-day session, so this change only makes things more convenient, never less secure.
Sign in with Apple is now protected against stolen logins fix
  • Every Apple sign-in now gets a one-time secret code. When someone signs in with Apple, the app creates a unique code and asks Apple to stamp it onto the login receipt. Our server checks the stamp before letting anyone in, and refuses to accept a receipt that has been used before — so a stolen or copied login can't be reused to get into an account.
  • Apple's session details are now kept safely on file. The server stores the Apple refresh token it receives at login, so the account stays linked to Apple even on Android and the web where Apple behaves differently.
Apple sign-in now behaves correctly on every device fix
  • iPhone, Android and web are each handled the way Apple expects. The login flow now speaks Apple's language per platform, which keeps sign-in working consistently and avoids the session being rejected on one device while working on another.
  • Verified email addresses are now read accurately. Apple's "email verified" flag is interpreted exactly as Apple sends it, so unverified details are never mistaken for verified ones.
Expired sessions now return you to login gracefully fix
  • No more frozen screens when a login runs out. If a session ever does end (for example a blocked account or an older login that ran past its date), the app now notices the rejection, clears the local session in the background and sends you back to the sign-in screen — instead of quietly showing error after error while the app appears broken.
  • Everything is tidied up automatically. The stale login is removed from the device and all in-memory profile details are reset, so the next sign-in starts clean with no leftovers from the previous account.
v5.5.0 Aug 04, 2026
A new Shop tab inside Teels feature
  • A full marketplace now lives in the app. Teels has a new fourth tab (For You / Following / Trending / Shop). The Shop tab shows a browsable product grid with category filters and a search screen with sorting and endless scrolling, so users can discover goods without leaving the video feed.
  • Products now have real catalog data. Sellers can list physical or digital items with stock, SKU, currency, shipping fee, media gallery, featured flag and SEO fields. Digital items are marked clearly and need no shipping.
  • The Shop tab can be turned on from the admin panel. A new "LAMAT SHOP" plugin controls whether the tab is visible and lets the owner toggle wallet or gateway payment, set the default currency, shipping fee and free shipping threshold, and set the platform fee.
Product pages, cart and checkout feature
  • Product page: swipeable image gallery, stock and quantity controls, seller info and an Add to Cart / Buy Now action that both drop the item straight into the cart.
  • Cart: change quantities, remove items and see the running subtotal before checking out.
  • Checkout: pick a saved shipping address (or add a new one), apply a coupon, and pay either with the in-app wallet balance or through the standard payment gateways in a secure in-app browser. Digital orders skip the address step entirely.
Orders, sellers and delivery tracking feature
  • Orders behind the scenes: orders are created automatically grouped per seller, payment is confirmed through the wallet or the payment webhooks, and the seller is credited automatically minus the platform fee. Digital goods are delivered instantly after payment.
  • My Orders / Seller Orders: buyers can cancel, track and confirm delivery; sellers can mark orders shipped (with a tracking number) or delivered. Every status change is kept in a history.
  • Shipping addresses: save and manage multiple addresses, mark one as the default, and reuse them at checkout.
Order details now show where to ship fix
  • The order page now displays the saved shipping address for physical orders, pulled from the address book automatically.
Shop payments and orders made more reliable fix
  • Server maintenance is back. A setup issue on the server prevented administrative tasks from running, which also blocked database updates for the Shop. That is fixed, and all Shop database changes are now applied.
  • Coupons are only used once an order is actually paid. Previously a coupon could be spent the moment an order was started, even if the buyer never paid. Now the coupon is redeemed only when payment goes through, whether by wallet or payment gateway.
  • Wallet payments always charge the right amount. The wallet can only hold whole credit units, so orders are rounded up fairly so the seller is never paid less, and everything (balance, record, order status) is saved as one clean step.
  • One order = one seller. Each order now only covers products from a single seller. If a cart mixes sellers, the app asks you to place a separate order, so every seller is paid correctly.
  • Order steps are kept strict and clear. Sellers can only move an order forward in the right order (paid, fulfilled, shipped) and can no longer skip ahead; digital purchases are delivered instantly and can't be mistaken for physical shipments. Tracking details are stored when an order is shipped.
  • Payments are private. Users can only check the status of their own payments, and a payment link can't be reused after an order is paid.
  • Smaller fixes: cart quantities are kept between 1 and 99 with stock checked, price sorting in the shop is now accurate, gateway payments record the reference properly and are protected against being processed twice, and the order lists now show the product name and image for each order at a glance.
Shop management pages in the admin panel feature
  • Manage everything about the Shop from the admin panel. Five new items appear in the sidebar under Pro Plans: Shop Orders, Shop Coupons, Shop Products, Shop Categories and Shop Reviews — all available to the admin without touching the database directly.
  • Shop Orders: every order is listed with the buyer, seller, type, total and status, with filters and an easy dropdown to move an order forward or resolve it (paid, shipped, delivered, cancelled, refunded). Each admin change is recorded in the order history.
  • Shop Coupons: create, edit, enable or delete discount codes with percent or fixed discounts, minimum spends, usage limits and validity dates. Live usage counts are shown next to each coupon.
  • Shop Products: search and filter the product catalog, feature items, hide or re-list them, or remove them.
  • Shop Categories: add, rename and reorder the shop categories, with icons and auto-generated slugs.
  • Shop Reviews: browse all product reviews with star ratings, hide or show them, and remove any that are inappropriate.
Sign in with Apple now works on iPhone fix
  • Apple sign-in on iOS is now truly enabled. The permission that lets the app talk to Apple's sign-in page was never actually attached to the app when it was built, so the login would not work on an iPhone. The permission file is now wired into the build correctly.
  • The app's identity matches on the server. The server now knows the iPhone app's real bundle identifier, so when someone signs in with their Apple ID the app is accepted as the genuine Lamat app and the login goes through. This also keeps the iPhone's universal-link setup consistent.
  • Getting Apple sign-in fully live still needs the "Sign in with Apple" capability turned on for the app in the Apple Developer portal and a matching provisioning profile.
v5.4.1 Aug 03, 2026
Sign in with Apple now works on Android and Web feature
  • New Apple callback page: the server now answers the "Return URL" (/apple/callback) that Apple redirects to after login. On Android it safely hands Apple's response back to the app so login completes automatically; everywhere else it sends users back to the web app.
  • Code exchange: the login API now accepts either an Apple identity token (iPhone) or an authorization code (Android/Web) and verifies it with Apple before creating a session.
  • App side: the login screen passes Apple the right identifiers for Android and Web, the Android app registers the Apple callback screen, and login no longer fails on repeat sign-ins.
  • Setup still required: fill in the Apple Team ID, Service ID and Sign in with Apple key in the server settings, and register the return URLs (https://lamatt.abbble.co.za/apple/callback and https://lamat.abbble.co.za/) on the Service ID.
Security fix for Apple sign-in security
  • The email used to link an Apple login to an account used to come from the app itself. Someone with any Apple account could have attached a victim's email to their own login and take over the victim's account. The email is now taken only from Apple's verified token.
Cleaner code on the login screen refactor
  • The LoginButton and LangaugeSwitcher widgets were moved out of the login page into their own files under lib/widgets so they can be reused more easily.
Apple sign-in managed from the admin panel feature
  • New Apple plugin: a database migration adds the Apple plugin and its settings (enabled, Service ID, Key ID, Team ID, private key, Return URL) so everything can be configured from the admin panel instead of the server settings file.
  • Config API: the app's configuration now includes the Apple login details. The private key is never sent to the app.
  • App: the login screen reads these settings and only shows the Sign in with Apple button when the plugin is switched on and a Service ID is filled in.
v5.4.0 Jul 31, 2026
FCM HTTP v1 push notifications refactor
  • composer.json: added kreait/laravel-firebase ^7.2 (FCM HTTP v1 via service account); enabled ext-sodium in C:\xampp\php\php.ini (required by lcobucci/jwt).
  • config/firebase.php: new — published package config; credentials resolved from FIREBASE_CREDENTIALS pointing at storage/app/firebase/service-account.json.
  • FcmService.php: send() now prefers the FCM HTTP v1 API (CloudMessage) when a service account is present, and falls back to the legacy server-key API on failure or when no service account exists; added hasServiceAccount(); public method signatures unchanged.
  • PushNotifications.php: sendRealMessage() no longer requires fcm_server_key when a Firebase service account is configured; updated error message.
Block direct web access to sensitive files security
  • root .htaccess: requests that map to a real file/dir under .env*, .git, storage/app/firebase, app/, config/, database/, vendor/, tests/, bootstrap/ now return 403 (docroot is the project root, so these were previously served raw — the Firebase service account and .env were publicly downloadable).
  • storage/app/firebase/.htaccess: new — Require all denied scoped to the service account directory.
  • FcmService.php: data values are cast to strings before sending (FCM payloads require strings — CallController passes ints, which previously forced a v1 TypeError and silent legacy fallback); hasServiceAccount() accepts absolute credential paths.
Fix storage block breaking admin panel images fix
  • The broad storage/ deny was breaking uploaded images served through the public/storage junction to storage/app/public.
  • root .htaccess: deny list narrowed to storage/app/firebase only (plus the original non-storage entries).
  • storage/.htaccess: removed; storage/app/firebase/.htaccess: new with Require all denied.
Preinstall page shows real errors + JSON fix fix
  • Error visibility: new red #manual-error alert — the actual server error message is now rendered (previously dropped), and the output log auto-reveals with a red border on failure.
  • JSON fix: the ?action=check/install/status handlers ran after the HTML was echoed, so responses started with <!DOCTYPE and failed r.json() ("Unexpected token '<'"). All three handlers now run at the top of the script, before any output or the vendor-exists redirect.
  • No env checks: ?action=check removed — the flow starts directly at "Install dependencies" (2 steps: install → complete).
  • Cross-OS hardening: runCommand() accepts unset by-ref args (fixed TypeError); Windows uses cmd /s /c for quote-safe launching with output captured; Linux/macOS uses nohup so composer survives request end; Windows status detects php.exe via tasklist; --no-ansi keeps logs clean everywhere.
v5.3.9 Jul 30, 2026
Spotify Music Anthem feature
  • SpotifyService.php: new backend service for Spotify Web API — Client Credentials auth with cached token, searchTracks() and getTrack().
  • SpotifyController.php: new endpoints — GET /spotify/search, POST /spotify/set-anthem, DELETE /spotify/remove-anthem.
  • Migration: added Spotify Anthem plugin with spotify_client_id, spotify_client_secret, and spotify_enabled settings.
  • config_model.dart: added SpotifyAnthemPlugin model and registered in Plugins class.
  • spotify_anthem_model.dart: new Flutter model for parsing anthem JSON (id, name, artist, imageUrl, previewUrl).
  • spotify_anthem_widget.dart: reusable LiquidGlass card showing track art, name, and artist.
  • spotify_search_page.dart: search page with LiquidGlass-styled search bar and track list; tap to select anthem.
  • user_image_card.dart: anthem overlay on swipe cards when user has set a track.
  • edit_profile_page.dart / account_settings.dart: anthem selector that opens the Spotify search page.
v5.3.8 Jul 29, 2026
Fix wrong MESSAGE protocol action code fix
  • ably_service.dart: changed MESSAGE action from 16 to 17 — action 16 is AUTH, not MESSAGE. All chat messages published via Ably REST arrived with action 17 and were silently dropped by the switch statement.
Fix WebSocket format param fix
  • ably_service.dart: added format=json&v=1.2 to WebSocket URL. Ably defaults to binary msgpack encoding — without this param, all frames arrived as binary and failed JSON parsing.
  • ably_service.dart: added clientId field to CONNECT message for proper token authentication.
Fix token URL, reduce TTL, add throttle fix
  • AblyService.php: extracted keyName from full apiKey for token request URL (was using full key with secret in URL path, causing 404).
  • AblyService.php: reduced token TTL from 24h to 1h.
  • routes/api.php: added throttle:10,1 to ably/token endpoint to prevent abuse.
Cache 1-on-1 messages in Hive feature
  • chat_provider.dart: conversation messages cached per user-pair in Hive under key chat_msg_{userId}_{peerId}.
  • chat_provider.dart: cached messages shown instantly on page load; background refresh fetches only delta.
  • constants.dart: added cachedMessagesPrefix to HiveConstants.
Incremental fetch via since param feature
  • ChatService.php: added since param — filters by time > since OR edited_at > since; includes recently deleted messages for client-side cache cleanup.
  • ChatController.php: accepts since query param and passes to service.
  • ChatController.php: deleteForEveryone now sets edited_at = now() so deletes are detected by incremental sync.
  • chat_provider.dart: tracks latest message timestamp; subsequent polls/Ably events pass since to fetch only changes.
Respect AblyRealtime plugin enabled flag feature
  • chat_provider.dart: reads AblyRealtime.enabled from config model in connectAbly(); only connects when plugin is enabled.
  • ably_service.dart: added setEnabled() setter — early return in connect() when disabled; no connection attempt.
v5.3.7 Jul 28, 2026
Apple Sign-In improvements & security fix security
  • auth_providers.dart: send full_name (givenName + familyName) from Apple credential to the backend
  • AppleConnectController.php: accept full_name param and use it for user creation instead of deriving from email prefix
  • AppleConnectController.php: SECURITY — JWT signature is now verified via openssl_verify() using Apple's JWK public keys (previously only base64-decoded the payload with no cryptographic verification)
  • AppleConnectController.php: added claim validation: exp (not expired), iss (must be https://appleid.apple.com), aud (must match bundle ID)
  • AppleConnectController.php: added rsaJwkToPem, base64urlDecode, derLength helpers for JWT verification
Ably Realtime chat delivery feature
  • ably_service.dart: new — WebSocket-based Ably realtime client with auto-reconnect
  • chat_provider.dart: poll reduced from 2s to 30s; Ably events trigger instant refresh
  • ChatController.php: publishes message to Ably after sendMessage
  • AblyService.php: new — REST publish + token generation via Guzzle
  • AblyAuthController.php: new — token & status endpoints
  • plugins: added "Ably Realtime" plugin + settings (ably_api_key, ably_channel_prefix, ably_enabled)
v5.3.6 Jul 23, 2026
iOS build configuration fixes fix
  • Info.plist: merged orphaned fbapi/fb-messenger-share-api into LSApplicationQueriesSchemes array
  • Info.plist: removed second CFBundleURLTypes dict with orphaned CFBundleTypeRole
  • Info.plist: removed duplicate NSCameraUsageDescription and NSMicrophoneUsageDescription entries
  • Info.plist: changed CFBundleName from "myapp" to "Lamat"
  • Runner.entitlements: changed aps-environment from "development" to "production"
  • project.pbxproj: set TARGETED_DEVICE_FAMILY = "1,2" in Release (iPad support)
  • project.pbxproj: removed hardcoded MARKETING_VERSION = 1 (uses FLUTTER_BUILD_NAME)
  • project.pbxproj: aligned IPHONEOS_DEPLOYMENT_TARGET to 13.0 at project level
  • Podfile: uncommented platform :ios, '13.0'
Updated FirebaseFirestore pod tag fix
  • Podfile: updated invertase/firestore-ios-sdk-frameworks tag from 10.29.0 to 12.16.0 (matches Firebase iOS SDK v12.16.0)
Added missing ProGuard rules fix
  • proguard-rules.pro: added keep rules for RevenueCat, OneSignal, Sentry, Facebook, Pusher, Google Billing, ML Kit, and Stripe to prevent release crashes
Cleaned up build.gradle files refactor
  • build.gradle: removed invalid classpath, deprecated dexOptions, old support multidex, redundant play-services deps, jcenter, and buildToolsVersion
  • build.gradle: narrowed broad pickFirst '**/*.so' to specific libc++_shared.so per arch
  • build.gradle: bumped minSdk to 26
  • root build.gradle: removed jcenter() and buildToolsVersion
Added splashBgDark field feature
  • config_model.dart: added splashBgDark field to AppImagesIcons
  • constants.dart: added setter for splashBgDark in initialize()
  • migration: added splash_bg_dark to plugins_settings for "App Images Icons"
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