This guide takes a customer through the complete Circliva setup: licensed PHP installation, Flutter configuration, Firebase push notifications, Google Sign-In, media services, payments, and store-ready builds.
Circliva is delivered as two coordinated products. Keep both original archives unchanged as a backup before you customize anything.
A
Circliva Server
PHP Core API, database schema, protected install.php, administration dashboard, landing and legal pages, upload storage, workers, and Apache/LiteSpeed rules.
B
Circliva Flutter App
Android and iOS source, signed runtime license integration, responsive interface, Firebase messaging, Google Sign-In, cached media, marketplace, wallet, ads, and social features.
Documentation is online onlyCustomer release archives intentionally contain no .md, .markdown, or docs/ content. Installation, updates, configuration, known limitations, and troubleshooting are maintained only on this page so every customer reads the current instructions.
Keep credentials privateNever publish purchase codes, .env, database passwords, signing keystores, Firebase service-account JSON, APNs keys, Stripe secrets, or PayPal secrets in Git or a public download.
02 · Installation map
Use this setup order
Following this order avoids domain, package-name, Firebase, and license mismatches.
Set app IDsFinal Android package and iOS bundle ID.
3
Generate licenseSigned licenses.dart bound to the installation.
4
Connect servicesFirebase, SMTP, storage, video, and payments.
5
Build releasesSigned AAB/APK and iOS archive.
Do not generate the Flutter license too earlyThe website URL, Android package name, and iOS bundle identifier are protected by the signed license. Decide their final production values first.
Based on media traffic; 512 MB PHP memory recommended
Uploads, thumbnails, videos, logs.
Optional tools
FFmpeg and FFprobe
Posters and adaptive HLS video qualities.
Scheduler
Cron with PHP CLI
Push, video, and account-deletion workers.
On shared hosting, confirm that AllowOverride is enabled or that LiteSpeed honors the included rules. The package is designed for Apache/LiteSpeed; customers do not need to create proxy routes.
04 · Server setup
Prepare the domain and database
1. Create the production domain
Create a domain or subdomain, for example social.example.com.
Point its DNS record to the hosting server.
Enable a valid SSL certificate.
Choose an empty document root for this installation.
2. Create the database
Create an empty MySQL database using utf8mb4.
Create a dedicated database user with a strong password.
Grant that user all privileges on this database only.
Record the host, port, database, username, and password for the installer.
3. Upload the server archive
Upload and extract the server ZIP inside the domain document root. If the archive creates an outer circliva/ folder, move the contents of that folder—not the folder itself—into the document root. install.php, public/, storage/, and vendor/ must belong to the same project root. Do not upload the Flutter source into the web document root.
Typical Linux ownership and permissions
cd /home/USER/public_html
chown -R USER:USER .
find . -type d -exec chmod 755 {} \;
find . -type f -exec chmod 644 {} \;
chmod -R 750 storage public/uploads
Shared-hosting noteThe installer checks whether the project, storage/, and public/uploads/ are writable. Prefer correct ownership over insecure global 777 permissions.
05 · Guided installer
Install through install.php
Open https://your-domain.com/install.php.
Confirm every server readiness check is green.
Enter the Circliva purchase code issued by Lumaqode.
Enter the exact HTTPS website URL without an extra path.
Enter the MySQL connection values.
Create the first administrator account using a private email and strong password.
Select Verify & install Circliva once and wait for completion.
Sign in at https://your-domain.com/admin/.
What the installer createsThe environment configuration, database schema, default settings, translations, legal documents, media folders, signed server license, super administrator, and permanent installation lock.
Do not refresh during the database stepThe installer uses a lock and safe checks, but submitting the form repeatedly can interrupt hosting panels with short PHP timeouts. If it stops, read the displayed error before retrying.
Post-install checks
The home page opens at the domain root.
/api/v1/health returns a healthy API response.
/admin/ accepts the administrator account.
storage/install.lock exists.
Opening install.php again reports that installation is locked.
06 · Commercial licensing
Understand the server license
Circliva verifies a purchase before installation and stores a signed runtime license on the customer server. Database and administrator credentials never leave the customer server.
Protected
The raw purchase code is not stored in .env, the database, the installation lock, or the runtime license. Only public verification material ships with the product.
Perpetual and domain-bound
The signed local license has no expiry date. Public pages and the mobile API validate it locally without contacting Lumaqode. A throttled central status check runs only when an authenticated owner opens the administration dashboard, allowing a disabled or reassigned license to be enforced without creating traffic from normal visitors.
A licensing-service outage does not expire the installationThe existing signed license remains valid locally. Central unavailability is not treated as revocation; only a verified disabled, revoked, or mismatched assignment changes the license state.
Moving to a new production domainBack up first and contact Lumaqode support to reassign the license. Copying files or deleting storage/install.lock does not remove the signed runtime checks.
06A · Existing installation
Repair a missing server license binding
Circliva 1.0.3 adds a safe recovery flow for installations created before their central domain binding was recorded. It repairs licensing only; it does not reinstall the site or change the database.
Back up .env, storage/license/, the database, and local uploads.
Use the update archive matching the installed version: Circliva-Update-v1.0.0-to-v1.0.3.zip, v1.0.1-to-v1.0.3, or v1.0.2-to-v1.0.3.
Extract the update into the existing Circliva document root and allow the package to merge its files.
Open https://your-domain.com/update.php, sign in as a super administrator, and complete the update.
If the dashboard still requests licensing attention, open https://your-domain.com/install.php?repair=1.
Enter the original purchase code. The repair request must use the exact domain already assigned to that purchase.
Return to /admin/ and confirm the license status is active.
Existing customer data is preservedThe repair flow does not modify MySQL credentials, users, posts, settings, administrators, or uploaded media. It replaces only the signed license state and the missing central server binding.
Do not use the installer to move domainsA repair accepts only the currently assigned domain. A different domain must first be assigned by Lumaqode support or the licensing dashboard.
Use a super_admin account for initial configuration, then create narrower roles for daily operations.
/admin/
Overview, health, operational summaries, and recent activity.
?page=users
Full user records, status, roles, verification, balance, sessions, and moderation actions.
?page=content
Posts and stories, real media previews, visibility, and moderation.
?page=live
Active Agora broadcasts, current and peak viewers, engagement, history, and staff termination.
?page=reports
User and content reports with decisions and audit history.
?page=verification
Identity documents, verification reasons, approvals, and rejections.
?page=marketplace
Products, orders, fulfillment, categories, commissions, and discounts.
?page=wallet
Withdrawals, transactions, balances, manual adjustments, and financial limits.
?page=ads
Campaign moderation, payment status, delivery, and advertising settings.
?page=translations
Database-managed languages and mobile translation publishing.
?page=legal
Privacy, terms, and account-deletion content by language.
?page=settings
Application, auth, SMTP, Firebase, storage, payments, wallet, ads, and integrations.
?page=access
Roles, permissions, administrator access, and security audit records.
08 · Flutter workstation
Install the development tools
Flutter stable with the Dart SDK required by the included pubspec.yaml.
Android Studio and Android SDK for Android builds.
JDK 17 for the Android Gradle toolchain.
macOS and a current supported Xcode for iOS builds.
A real Android/iOS device for push notification and sign-in tests.
Verify Flutter environment
flutter --version
flutter doctor -v
cd /path/to/circliva
flutter pub get
dart format --output=none --set-exit-if-changed lib
flutter analyze
flutter analyze can inspect the source before the app license is generated. Starting the application itself requires a valid signed licenses.dart.
09 · Application identity
Choose final Android and iOS identifiers
Use identifiers you own, typically based on a reversed company domain. These values must match stores, Firebase, Google Sign-In, and the Circliva app license.
Platform
Where to change it
Example
Android
android/app/build.gradle.kts → namespace and applicationId
com.company.circliva
iOS
Open ios/Runner.xcworkspace or the Xcode project → Runner → Signing & Capabilities
com.company.circliva
Change identifiers before Firebase and licensingChanging them later requires new Firebase app records, updated sign-in credentials, new store records, and a regenerated signed app license.
10 · Flutter license
Generate and install licenses.dart
Finish the server installation on the final HTTPS domain.
Finalize the Android package name and iOS bundle identifier.
Enter the same valid purchase code and exact installation URL.
Enter the exact Android and iOS identifiers.
Generate and download licenses.dart.
Replace lib/core/license/licenses.dart in the Flutter source.
Run the quick verification commands below.
Confirm the license file is present
test -f lib/core/license/licenses.dart && echo "License file found"
flutter pub get
flutter analyze
There is no API URL fallbackThe signed license supplies the protected website and API origins at runtime. Do not add hard-coded production URLs or environment fallbacks; doing so breaks the supported commercial configuration.
11 · First run
Run and verify the application
Development run
flutter devices
flutter run -d DEVICE_ID
The onboarding and authentication screens open without a license error.
Register and sign in against the new server.
Images and videos use HTTPS URLs from the licensed domain.
Light/dark theme and a second screen size are checked.
Use hot reload during development. A full rebuild is only necessary after changing native Android/iOS files, dependencies, Firebase configuration, signing, or release mode.
12 · Android
Sign and build the Android release
The included project targets Android SDK 24 or newer and uses Java/JVM 17. Firebase is activated only when android/app/google-services.json exists.
Copy android/key.properties.example to android/key.properties, then enter the keystore path, alias, store password, and key password. Never commit either file.
Play billing policyDigital goods or paid in-app features in a Google Play build may require Google Play Billing. Do not enable external payment flows in a store build unless the applicable policy or programme permits them.
13 · iOS
Sign and archive the iOS application
Use macOS with Xcode and an active Apple Developer account.
Open the iOS project in Xcode and select the Runner target.
Set the final bundle identifier and Apple Development Team.
Set the deployment target to iOS 15.0 or newer.
Enable Push Notifications and Background Modes → Remote notifications when using FCM.
Run on a real device before archiving.
CocoaPods noteThis project uses Flutter's Swift Package Manager integration for supported plugins. A missing Podfile is not automatically an error. Do not run pod install unless you intentionally migrate the project to CocoaPods.
iOS release
flutter clean
flutter pub get
flutter build ios --release
For App Store Connect, use Xcode: Product → Archive, validate the archive, then distribute it. Complete privacy details, screenshots, support URL, privacy URL, and account-deletion information before review.
Apple payment policyDigital goods and paid in-app features may require Apple In-App Purchase. External Stripe/PayPal checkout must follow the rules applicable to your storefront and distribution method.
14 · Firebase
Do not confuse the three Firebase configurations
Configuration
Location
Contains a private key?
Purpose
google-services.json
Flutter: android/app/
No server private key
Identifies the Android Firebase app.
GoogleService-Info.plist
Flutter: ios/Runner/ and the Xcode Runner target
No server private key
Identifies the iOS Firebase app.
Admin SDK service-account JSON
Uploaded only in /admin/?page=settings
Yes
Allows the PHP server to send FCM notifications.
Never bundle the Admin SDK JSON in FlutterIt grants server privileges. Never place it in assets/, Android/iOS folders, Git, a public web directory, or a customer-facing archive.
Enable Google Analytics only if your privacy plan requires it.
Add one Android app using the exact Android package name.
Add one iOS app using the exact iOS bundle identifier.
Open Cloud Messaging and confirm the Firebase Cloud Messaging API is available.
Configure Authentication → Sign-in method → Google only when you are ready to expose the Google button.
Circliva can still read in-app notifications from its API when Firebase is disabled, but native background push requires the complete client and server Firebase setup.
16 · Firebase Android
Connect the Android app
In Firebase Console, open Project settings → Your apps and register an Android app using the exact value of applicationId.
Add the SHA-1 and SHA-256 fingerprints for the debug, upload, and release signing certificates.
Select Download google-services.json.
Remove any example or old Firebase file from the Flutter project.
Copy the downloaded file to android/app/google-services.json. Keep this exact name; do not rename it.
Confirm the package_name inside its Android client matches the application's applicationId.
Run flutter clean, fetch dependencies, and rebuild the app.
No manual Firebase command is requiredThe included Android Gradle configuration detects android/app/google-services.json and activates the Google Services plugin automatically.
Signing fingerprints
cd android
./gradlew signingReport
cd ..
Release SHA fingerprints matterGoogle Sign-In may work in debug and fail in release when only the debug SHA is registered. Add the upload certificate and, after Play App Signing is active, the Play app-signing certificate fingerprints too.
17 · Firebase iOS
Connect iOS and APNs
In Firebase Console, open Project settings → Your apps and register an Apple app using the exact Runner bundle identifier.
Select Download GoogleService-Info.plist.
Remove any example or old Firebase plist from the Flutter project and copy the downloaded file to ios/Runner/GoogleService-Info.plist.
Open ios/Runner.xcworkspace in Xcode.
If the file is not visible inside the yellow Runner group, right-click Runner and select Add Files to “Runner”…, then choose GoogleService-Info.plist.
Enable Copy items if needed and select the Runner target in Add to targets.
Open Runner → Build Phases → Copy Bundle Resources and confirm GoogleService-Info.plist appears exactly once.
Under Runner → Signing & Capabilities, add Push Notifications.
Add Background Modes and check Remote notifications.
In Apple Developer, create an APNs authentication key.
Upload the APNs key, Key ID, and Apple Team ID in Firebase → Project settings → Cloud Messaging.
Run flutter clean, fetch dependencies, rebuild, and test notifications on a real device.
Copying the plist in Finder is not always enoughThe file must also belong to the Xcode Runner target. If it exists under ios/Runner/ but is missing from Xcode or Copy Bundle Resources, Firebase cannot read it from the built application.
Normal Flutter commands are enoughAfter the two Firebase client files are installed correctly, use flutter run and the standard release build commands. No additional Firebase runtime flags are required.
18 · Firebase server
Upload the Admin SDK JSON safely
In Google Cloud/Firebase project settings, create or download a service-account Admin SDK JSON for the Circliva project.
Sign in as super_admin and open /admin/?page=settings.
Find Push notification credentials → Firebase service account.
Choose the JSON file and select Validate and replace.
Select Test connection.
Delete the downloaded copy from shared computers after the server test succeeds.
Secure storage behaviorThe dashboard validates the service account and stores it outside the public web area. The private key is not saved as a normal database setting and is never displayed back to administrators.
Use the actual PHP CLI and project paths shown by your hosting panel. Push delivery requires device registration, notification permission, the correct client configuration, a valid Admin SDK account, and a running worker.
19 · Authentication
Configure Google Sign-In
Enable Google in Firebase Authentication.
Configure the OAuth consent screen in Google Cloud.
Create/confirm Android OAuth credentials for the exact package name and SHA fingerprints.
Create/confirm iOS credentials for the exact bundle ID and URL scheme.
Add the correct web/server client ID in Circliva application settings when requested.
In /admin/?page=settings, enable Google social login only after both platforms pass a real-device test.
Automatic account creationWhen a valid Google identity does not already belong to a Circliva account, the server creates the user automatically according to the configured social-auth policy. Existing verified email identities are linked safely rather than duplicated.
If Google login is not configured, leave its dashboard switch off. The application will hide the button instead of sending customers into a broken flow.
20 · Email
Configure SMTP and password reset
Open /admin/?page=settings and configure SMTP host, port, encryption, username, password, sender name, sender address, and timeout. Use the built-in test email before enabling production mail.
Encryption
Typical port
Notes
TLS / STARTTLS
587
Usually recommended by transactional email providers.
SSL / implicit TLS
465
Use only when specified by the provider.
None
25
Avoid on production internet connections.
SPF is published for the sending domain.
DKIM is enabled at the email provider.
DMARC policy is configured.
Sender address belongs to the authenticated domain.
Password-reset email arrives and its link/OTP completes successfully.
Saved SMTP passwords are encrypted using the installation application key. Leaving a password field empty while editing preserves the existing secret.
21 · Phone security
Control OTP, WhatsApp, and optional protection
From application settings, administrators can require or disable phone verification and enable/disable the WhatsApp OTP gateway. When mandatory verification is off, customers can create and enter accounts without a forced WhatsApp code.
High-risk protection such as biometric unlock or verification for sensitive operations should remain optional after account creation unless your business rules require it.
Never ship gateway keys in FlutterThe application calls Circliva; Circliva calls the WhatsApp provider. This keeps provider credentials on the server.
22 · Media storage
Choose local storage or S3
The active storage provider is controlled from the administration dashboard. Start with local storage for a small installation or configure Amazon S3 / an S3-compatible provider for scalable media delivery.
Local
Media is stored under public/uploads/. Back up uploads together with the database and plan enough disk space, bandwidth, and web-server limits.
S3 compatible
Configure bucket, region, endpoint, public URL, prefix, and path-style mode in the dashboard. Keep access credentials in server environment values only.
The bucket CORS policy allows the exact required web origins.
Uploads are not publicly writable.
The configured public URL returns images and HLS files with HTTPS.
Lifecycle rules match the business retention policy.
A restore test has been completed before deleting local originals.
23 · Video pipeline
Enable FFmpeg and adaptive HLS video
With FFmpeg and FFprobe available, Circliva can create a poster and HLS renditions such as 360p, 480p, 720p, and 1080p without upscaling beyond the source. The application can then select an appropriate quality and prefetch within its bounded cache.
Verify binaries
which ffmpeg
which ffprobe
ffmpeg -version
ffprobe -version
Set the real binary paths in the server environment when your host installs them outside /usr/bin. Confirm that the PHP user may execute both binaries and write to the selected storage provider.
24 · Real-time video
Configure Agora live streaming
Circliva creates every RTC token on the PHP server. The Agora App Certificate is encrypted with APP_KEY, never included in Flutter, and never returned by the public configuration API.
Create an Agora project in the Agora Console and enable an App Certificate.
Open /admin/?page=settings and locate Agora credentials.
Enter the 32-character App ID and App Certificate.
Choose the RTC token lifetime and maximum broadcast duration.
Enable comments/reactions if required, then enable Agora live streaming.
Open the application on two real devices: start a broadcast on one and join from the LIVE story ring on the other.
Do not add the App Certificate to FlutterOnly the public App ID and a short-lived, user-bound channel token are sent to an authenticated device. If a certificate has ever been committed to the mobile source, rotate it in Agora before production.
Host flow
The host grants camera and microphone permissions, chooses public or followers-only visibility, starts the broadcast, and sends a heartbeat while connected. Leaving or ending the host session closes the broadcast for everyone.
Viewer flow
Authenticated viewers receive audience-only tokens. Current, peak, and unique audience counts come from bounded server heartbeats rather than trusting client-supplied totals.
Discovery
Active hosts appear first in the home story rail with a single red LIVE ring. The same state appears on the profile photo and opens the broadcast directly.
Operations
Administrators can monitor sessions at ?page=live, terminate a broadcast with an audited reason, or disable the entire feature from settings.
Camera and microphone permission descriptions are present on Android and iOS.
Host, audience, token renewal, mute, camera switch, comments, and reactions work on real devices.
Followers-only broadcasts are invisible to non-followers.
Interrupted hosts disappear automatically after the stale-session timeout.
Agora usage limits and billing alerts are configured before launch.
25 · Commerce
Configure payments, wallet, marketplace, and ads
Payments
Enable Stripe and/or PayPal individually in settings. Select test/sandbox mode first, enter client/public and secret values, configure webhooks, and run a real end-to-end test with a small amount before live mode.
Wallet
Control top-ups, transfers, marketplace payment, ad payment, withdrawals, minimum/maximum limits, daily transfer limits, and manual adjustments with required reasons and audit records.
Marketplace
Manage categories, products, inventory, order states, delivery/fulfillment, seller earnings, platform commission, and maximum seller discount.
Advertising
Moderate campaigns independently from payment confirmation, deliver approved paid campaigns in feed, reels, and stories, and monitor impressions, reach, clicks, and spend.
Test mode firstWebhook URLs must be HTTPS and use the exact secrets shown by the payment provider. A successful browser redirect alone is not proof of payment; Circliva confirms server-side webhook events and uses unique transaction references.
Platform commission is calculated on the amount actually paid after the allowed discount. Review Apple and Google payment rules before activating external checkout in store-distributed builds.
26 · Content control
Publish languages and legal documents
Circliva stores mobile translations on the server. Administrators can update language values centrally; the application downloads and caches published versions rather than requiring a new store build for every wording change.
Create and review each language in ?page=translations.
Keep translation keys stable after applications are released.
Test both left-to-right and right-to-left layouts.
Edit Privacy Policy, Terms of Use, and account-deletion information in ?page=legal.
Confirm that legal links are readable before registration and available from settings.
Ask customers to actively accept the required documents during registration.
Run each command manually once as the same hosting user, then inspect its log. Do not run overlapping workers at an aggressive interval if your hosting plan has strict CPU/process limits.
28 · Security
Harden the production installation
Use HTTPS only and redirect HTTP to HTTPS.
Keep APP_ENV=production and APP_DEBUG=false.
Do not modify or remove the root .htaccess.
Confirm direct requests to .env, storage/, vendor/, database/, and scripts/ are denied.
Check the update notes on this documentation page and compare system requirements.
Back up database and files.
Choose the update ZIP whose from version exactly matches the installed version.
Test the update on a staging copy with an authorized staging license.
Extract the update ZIP into the existing document root without deleting .env, storage/, or public/uploads/.
Open /update.php, authenticate as a super administrator, and complete the guided update.
Clear relevant caches, restart workers, and run smoke tests.
Keep the old release and rollback backup until verification is complete.
No documentation files are shipped in updatesThe ZIP contains only executable update files and its signed package manifest. Always return to this page for current update steps and release notes.
30 · Release gate
Production checklist
Server
HTTPS, health endpoint, admin login.
Debug disabled and protected files blocked.
Cron workers and logs verified.
Database and media restore tested.
License shows the correct domain.
Authentication
Registration, login, logout, reset password.
Google login on real Android and iOS devices.
Optional OTP settings match business rules.
Account deletion flow works.
Legal acceptance is recorded.
Social & media
Images, reels, feed video, and stories.
Live host/viewer, token renewal, permissions, and stale cleanup.
Comments, replies, mentions, likes, saves.
Follow requests and notifications.
Chat delivery, reading, and push.
Media cache remains bounded.
Commerce & stores
Test payment and webhook completed.
Wallet never becomes negative.
Commission and seller net are correct.
Marketplace order notifications arrive.
Store privacy/payment policies reviewed.
Release only after real-device testingTest at least one current Android device, one lower supported Android version, one iPhone, and one iPad layout. Include slow-network, offline, denied-permission, and interrupted-payment cases.
31 · Troubleshooting
Solve common setup problems
The root URL returns JSON or a routing error
Confirm the included root and public/.htaccess files were uploaded, Apache/LiteSpeed rewrite rules are enabled, and the archive was extracted at the domain document root. Do not add an Nginx proxy as a first fix.
The installer says a directory is not writable
Correct the project ownership first. Then grant the hosting user write access to the project during installation and to storage/ and public/uploads/ during runtime. Avoid 777.
The Flutter app reports an invalid license
Verify that the server URL, Android package, and iOS bundle ID exactly match the values used to generate licenses.dart. Replace the correct file at lib/core/license/licenses.dart, clean native outputs, and rebuild.
The admin says the server installation is not licensed
First install the update package matching the current server version. Then open /install.php?repair=1 and submit the original purchase code. This is the supported recovery for a missing legacy server binding and preserves the database, users, configuration, and uploads. A genuinely different domain requires reassignment before repair.
Images or videos do not appear
Open the returned media URL in a browser, verify HTTPS and storage public URL, confirm upload permissions, inspect API payloads, and check S3 CORS. For video, inspect storage/logs/video.log and verify FFmpeg/FFprobe.
Push notifications do not arrive
Check device permission and token registration, google-services.json, the iOS Runner target membership of GoogleService-Info.plist, Android/iOS app identifiers, APNs key, Firebase Admin SDK dashboard test, and storage/logs/push.log. Test on a real device.
Google works in debug but fails in release
Add release and Play App Signing SHA-1/SHA-256 fingerprints to the Android Firebase app, verify OAuth consent and client IDs, download a fresh google-services.json, and rebuild.
Password-reset email does not arrive
Run the SMTP dashboard test, verify encryption/port, sender identity, SPF/DKIM/DMARC, spam folder, and the hosting provider's outbound SMTP policy. Inspect server logs without displaying the SMTP password.
There is no Podfile on iOS
The current project uses Flutter Swift Package Manager integration. Open the Xcode project generated by Flutter and build normally. Only introduce CocoaPods if a required plugin or deliberate migration calls for it.
A payment redirects successfully but remains unpaid
Verify webhook URL, signing secret/webhook ID, live versus sandbox mode, server time, and webhook event logs. Circliva intentionally trusts the verified server webhook rather than the browser redirect.