1. Welcome
Quick intro, high-level checklist, and a reminder about server requirements.
Thanks for choosing the ReelsX short-form video platform. This guide walks through the installation steps, manual setup, demo users, mobile app configuration, and all major admin panels.
Before you run the installer, ensure the target server meets the minimum requirements:
storage/ and bootstrap/cache/ directories.reelsx_db).
node_modules, storage/logs,
if you prefer running composer on the server).public_html/ (or the target directory)
and upload the archive, then extract it.
Without terminal access, you can complete migrations by visiting /install after
uploading.
ReelsX bundles a polished Codecanyone-style wizard for first-time installs. Browse to
/install after configuring your vhost or running php artisan serve.
Quick intro, high-level checklist, and a reminder about server requirements.
Automated PHP version and extension checks. You must satisfy all prerequisites to continue.
Validates directory write access for storage and
bootstrap/cache.
Guided form covering application info, database credentials, cache/session drivers, and
mail setup. Values are persisted to .env.
Runs migrations, seeds all demo data, performs artisan maintenance commands, and logs output in real time.
Displays environment summary, seeded demo accounts, and the path to the
storage/installed marker.
If you cannot access the browser wizard (headless servers, CLI-only environments), follow these steps:
cp .env.example .env
php artisan key:generate
.env, ensure the database exists, then run:
php artisan migrate --force
php artisan db:seed --force
php artisan optimize:clear
php artisan storage:link
php -r "file_exists('storage/installed') || touch('storage/installed');"
storage/installed anytime you need to re-run the
wizard.
The web server needs write permissions on specific directories. If the setup wizard warns about permissions or if you receive HTTP 500 errors, apply the correct permissions below.
storage/ (including all subdirectories: app, framework, logs)bootstrap/cache/# Change ownership to the web server user
sudo chown -R www-data:www-data storage bootstrap/cache
# Grant read, write, and execute permissions
sudo chmod -R 775 storage bootstrap/cache
storage folder → Change Permissions.775 and click save.bootstrap/cache.777 on a production server.
Use 775 or 755 with proper ownership.
For high-performance production hosting, we recommend a VPS running Ubuntu Server with Nginx.
sudo apt update && sudo apt upgrade -y
sudo apt install software-properties-common -y
sudo add-apt-repository ppa:ondrej/php -y
sudo apt update
sudo apt install nginx mysql-server php8.2-fpm php8.2-mysql php8.2-common php8.2-curl php8.2-xml php8.2-bcmath php8.2-mbstring php8.2-tokenizer php8.2-zip php8.2-gd php8.2-intl -y
sudo mysql_secure_installation
sudo mysql
CREATE DATABASE reelsx CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'reelsx_user'@'localhost' IDENTIFIED BY 'your_strong_password';
GRANT ALL PRIVILEGES ON reelsx.* TO 'reelsx_user'@'localhost';
FLUSH PRIVILEGES;
EXIT;
curl -sS https://getcomposer.org/installer | php
sudo mv composer.phar /usr/local/bin/composer
cd /var/www/reelsx
cp .env.example .env
composer install --no-dev --optimize-autoloader
# Edit .env: APP_ENV=production, APP_DEBUG=false, DB_* values
php artisan key:generate
php artisan migrate --force
php artisan db:seed --force
php artisan storage:link
sudo chown -R www-data:www-data /var/www/reelsx
sudo find /var/www/reelsx -type f -exec chmod 644 {} \;
sudo find /var/www/reelsx -type d -exec chmod 755 {} \;
sudo chmod -R 775 /var/www/reelsx/storage /var/www/reelsx/bootstrap/cache
server {
listen 80;
server_name yourdomain.com;
root /var/www/reelsx/public;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-Content-Type-Options "nosniff";
index index.php;
charset utf-8;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
error_page 404 /index.php;
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.(?!well-known).* {
deny all;
}
}
sudo ln -s /etc/nginx/sites-available/reelsx /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginx
sudo apt install certbot python3-certbot-nginx -y
sudo certbot --nginx -d yourdomain.com
[program:reelsx-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/reelsx/artisan queue:work --sleep=3 --tries=3 --max-time=3600
autostart=true
autorestart=true
user=www-data
numprocs=2
redirect_stderr=true
stdout_logfile=/var/www/reelsx/storage/logs/worker.log
sudo supervisorctl reread && sudo supervisorctl update
sudo supervisorctl start reelsx-worker:*
sudo crontab -u www-data -e
# Add:
* * * * * cd /var/www/reelsx && php artisan schedule:run >> /dev/null 2>&1
The seeders provision default accounts for quick testing with the default password
12345678.
| Role | Password | |
|---|---|---|
| Administrator | admin@example.com |
12345678 |
| Test User | user@example.com |
12345678 |
Keeping your system up-to-date is crucial for security and new features.
.env to
old.env.
storage folder to
old_storage.
.env, rename
old.env back to .env.
storage, rename
old_storage back to storage.
| Feature | Description |
|---|---|
| Video Feed | Vertical swipe feed (For You / Following / Recent), hardware-accelerated with media_kit, current + next video preload |
| Video Creation | Camera recording, gallery import, FFmpeg trimming, audio sync with Sound Library, pro video editor, caption & tags |
| Sound Library | Browse trending sounds, bookmark favourites, see reels using a sound |
| Discovery | Search reels, users, sounds; suggested creators and playlists |
| Engagement | Likes, comments, comment likes, bookmarks, follow/unfollow, native share, report |
| Playlists | Create/manage playlists, batch-add videos, watch progress tracking |
| Profiles | Reels / Liked / Saved tabs, follower/following lists, verified badge, KYC submission |
| Messaging | 1-to-1 chat, image attachments, 3-second delta polling, unread badge |
| Notifications | Activity alerts, unread count, mark read, admin broadcast |
| Rewards | Daily streak, task system, leaderboard, payout requests, referral codes |
| Wallet | In-app balance, Stripe top-up, offline payments, withdrawal requests |
| Paid Content | Mark reels as premium; viewers spend wallet credits to unlock |
| Blog & CMS | In-app blog articles; admin-managed CMS pages (Privacy, Terms, etc.) |
| Support Tickets | Open/reply/close tickets; admin reply panel |
| Deep Links | Shareable reel links with OpenGraph preview |
All configuration lives in your .env file. Key variables:
| Key | Purpose |
|---|---|
APP_URL |
Full public URL of the backend (e.g. https://reelsx.com) |
APP_ENV |
production or local |
APP_DEBUG |
Set to false in production |
DB_HOST / DB_DATABASE / DB_USERNAME / DB_PASSWORD |
MySQL connection |
MAIL_MAILER / MAIL_HOST / MAIL_PORT / MAIL_USERNAME / MAIL_PASSWORD
|
SMTP / email delivery |
STRIPE_SECRET / STRIPE_KEY |
Stripe payment gateway |
FILESYSTEM_DISK |
local, s3, or do_spaces |
AWS_ACCESS_KEY_ID / AWS_SECRET_ACCESS_KEY / AWS_BUCKET / AWS_DEFAULT_REGION
|
S3 / DigitalOcean Spaces storage |
QUEUE_CONNECTION |
database (default) or redis |
Access at /admin — automatically redirects to /admin/login when not
authenticated, or straight to the dashboard if already logged in.
| Section | Capabilities |
|---|---|
| Dashboard | Key metrics: users, reels, revenue, active sessions |
| Users | View, edit, ban, delete, reset password, verify |
| Reels | Browse, view stats, delete reels and comments |
| Sounds | Upload, edit, delete audio tracks |
| Playlists | Review and remove user playlists |
| Finance | Wallet transactions, offline payment approval, reward payouts, withdrawals |
| KYC Queue | Review identity documents, approve / reject |
| Reports | Review flagged content, update status, delete |
| Tickets | Reply, change status, close / delete support tickets |
| Notifications | Send broadcast notifications to all users |
| Blogs & Pages | Create and manage blog posts and CMS pages |
| Roles & Permissions | Custom admin roles with granular Spatie permissions |
| Settings | General, email, payment, storage, security, rewards, referral, landing page |
| Activity Log | Audit trail of all admin actions with timestamps |
| System Updater | Apply software updates from the admin panel at /admin/updater |
ReelsX includes a state-of-the-art, responsive web application engineered with Laravel 12 Blade, modern CSS3 design variables, and dynamic JavaScript. It offers a native desktop and mobile browser experience matching TikTok and Instagram Reels.
Up Arrow (↑) / Down Arrow (↓): Jump to previous / next reelSpacebar: Toggle Play / PauseM key: Toggle Audio Mute / UnmuteLocated at /create, creators can publish short videos with rich metadata:
/@username): Displays cover banners, avatar badge, verified blue checkmark, creator bio, website link, and a 5-metric performance summary bar (Reels, Views, Likes, Followers, Following)./explore): Real-time discovery grid with trending hashtags chips, top audio tracks, creator recommendations, and search filters./chat): Delta polling (3s) delivers fast message exchanges with photo attachments./notifications): Instant activity alerts for new followers, likes, comments, and rewards.ReelsX allows administrators to fully customize platform branding and color schemes directly from the admin panel without editing any code.
Admin Panel → Settings → General Settings.
Admins can pick any custom primary brand color using the integrated HTML5 color swatch picker or typing a HEX code (e.g. #FE2C55, #6366F1, #00C8FF):
--primary, --primary-hover, --primary-gradient, --shadow-glow), instantly restyling all website buttons, navigation badges, and glowing highlights across all pages.ReelsX features a comprehensive monetization engine enabling creators to earn from their content and administrators to collect platform fees.
/wallet)Admin → Finance → Offline Payments queue./rewards)/admin with admin@example.com / password.
APP_DEBUG=false in .env for production.| Issue | Fix |
|---|---|
| HTTP 500 after install | Run php artisan optimize:clear. Check
storage/logs/laravel.log. Verify folder permissions.
|
| Blank page / white screen | Set APP_DEBUG=true temporarily to see the error message, then revert.
|
| Images not loading | Run php artisan storage:link to create the public symlink. |
| Emails not sending | Check MAIL_* values in .env. Test with
php artisan tinker →
Mail::raw('test', fn($m) => $m->to('you@email.com')).
|
| Queue jobs not running | Run php artisan queue:work manually or check Supervisor is running.
|
| Installer wizard loops | Delete storage/installed to reset, or run manual install commands. |
Setting up SSL (HTTPS) is required for secure communication between the Flutter mobile app and the Laravel backend. Here are the most common SSL issues less-technical buyers encounter and how to fix them easily.
Symptom: Your site displays ERR_TOO_MANY_REDIRECTS or fails to load
when proxied through Cloudflare.
Cause: Cloudflare SSL mode is set to "Flexible", causing Cloudflare to contact your server over HTTP while your server forces an HTTPS redirect.
Fix: Log in to your Cloudflare Dashboard → go to SSL/TLS tab → change the encryption mode to Full or Full (Strict).
Symptom: Images, avatars, or media files don't display or show browser security warnings.
Cause: Your backend is configured with an http:// URL instead of
https:// in your environment file.
Fix: Open your backend .env file and update APP_URL:
APP_URL=https://yourdomain.com
Then run php artisan optimize:clear in your terminal or cPanel terminal to clear
cached configurations.
Symptom: The mobile app cannot connect to the backend or logs
HandshakeException: CERTIFICATE_VERIFY_FAILED.
Cause: Self-signed certificate, expired certificate, or incomplete certificate chain (missing intermediate CA bundle on your server).
Fix:
cert.pem.Symptom: cPanel AutoSSL fails or status says "Domain does not resolve to IP".
Fix:
To verify your SSL setup is working properly before testing the mobile app, open your browser and visit:
https://yourdomain.com/api/reels
If your browser shows a green padlock icon without any warnings and returns a JSON response, your backend SSL is correctly configured!
Common server environment compatibility questions and deployment guidelines to help buyers set up the ReelsX platform smoothly.
Yes. ReelsX is built on Laravel 12 and fully compatible with PHP 8.2, PHP 8.3, and PHP 8.4. Ensure that required extensions (OpenSSL, PDO, Mbstring, Tokenizer, JSON, cURL, Fileinfo, BCMath, GD / Imagick) are active. Ensure system functions such as proc_open and exec are not disabled in php.ini if executing CLI workers or artisan commands.
cPanel shared hosting works for standard web browsing and basic API requests. However, for handling short-form video hosting, queue workers, real-time message polling, and high concurrent user traffic, a Linux VPS (Ubuntu 22.04/24.04 LTS LEMP stack with 2GB+ RAM) is strongly recommended for optimal performance.
ReelsX requires MySQL 8.0+ or MariaDB 10.5+. Ensure your database collation is set to utf8mb4_unicode_ci for full emoji and international character support. MariaDB strict mode compatibility is handled automatically via Laravel database configuration.
Default web server configurations cap upload request payloads at 2MB or 8MB. To support high-definition video uploads, increase upload_max_filesize = 100M and post_max_size = 100M in php.ini. Additionally, add client_max_body_size 100M; to your Nginx server block (or LimitRequestBody 104857600 in Apache).
Mobile app client-side video trimming and audio sync are handled natively on the device using FFmpeg-kit. On the backend server, standard image thumbnails and avatar processing require PHP GD or Imagick extension. Server-side FFmpeg is optional if you choose local video thumbnail generation.
Yes. ReelsX utilizes Laravel's Filesystem abstraction layer. You can seamlessly stream and store video media on AWS S3, DigitalOcean Spaces, MinIO, or Cloudflare R2 by selecting your storage driver and entering your bucket credentials in the Admin Panel settings or .env file.
On some Apache cPanel setups, HTTP Authorization headers are stripped before reaching PHP. Add CGIPassAuth On or the line RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] to your public/.htaccess file to pass Sanctum bearer tokens to Laravel API endpoints.
Yes. Modern Android (Android 9+) and iOS versions block cleartext unencrypted HTTP traffic by default. Your Laravel backend domain must have a valid SSL certificate (e.g., Let's Encrypt or Cloudflare SSL) configured on APP_URL for API calls and deep links to function properly.
If persistent Supervisor background daemons are restricted on your host, set QUEUE_CONNECTION=database in .env and configure a standard cPanel Cron job running php artisan schedule:run every minute to process background tasks and scheduled notifications.
Complete guide to re-branding, configuring, and publishing the ReelsX mobile application.
build.gradle.kts)reelsx_app directory.flutter pub get
flutter run
media_kit requires native video binaries. Always do a
full flutter run after adding or updating the package — Hot Restart alone will not
load native libraries.
Link the mobile app to your installed Laravel server.
lib/config/app_config.dart.baseUrl (must end with /api):
static const String baseUrl = 'https://your-domain.com/api';
static const String appName = 'ReelsX';
static const String appTagline = 'Create. Share. Go Viral.';
ReelsX includes a built-in deep linking system so shared reel links open directly in the mobile app when installed.
app_config.dart// lib/config/app_config.dart
static const String defaultDeepLinkBaseUrl = 'https://yourdomain.com';
static const String deepLinkScheme = 'reelsx'; // custom URI scheme
static const String deepLinkHost = 'reel';
https://yourdomain.com/reel/42 opens the
reel directly in the app.reelsx://reel/42 launches the app immediately.
Android: Registered in android/app/src/main/AndroidManifest.xml
under <intent-filter> tags.
iOS: Registered in ios/Runner/Info.plist under
CFBundleURLTypes.
Android: Open android/app/src/main/AndroidManifest.xml and update:
android:label="Your App Name"
iOS: Open ios/Runner/Info.plist and update:
<key>CFBundleDisplayName</key>
<string>Your App Name</string>
com.reelsx.app with com.yourcompany.appname across the entire project.
applicationId in android/app/build.gradle.kts.android/app/src/main/kotlin/com/reelsx/app/ to match your new
package path.AndroidManifest.xml package attribute.ios/Runner.xcodeproj in Xcode.We use the flutter_launcher_icons package to generate icons for all devices.
assets/images/logo/logo.png with your logo (1024×1024px, no
transparency recommended).pubspec.yaml under flutter_launcher_icons
if needed.dart run flutter_launcher_icons
assets/images/logo/logo.png with your own logo file.backgroundColor in
lib/pages/splash/splash_page.dart.
All brand colors are defined centrally in lib/config/app_config.dart.
lib/config/app_config.dart.// Primary accent (used for buttons, icons, highlights)
static const Color primaryColor = Color(0xFFFF2D55); // Change this
// Secondary gradient color
static const Color secondaryColor = Color(0xFF833AB4); // Change this
The app supports both light and dark mode. The user can switch theme from
Settings inside the app. The default mode is controlled by
SettingsController which reads from GetStorage.
The app supports multiple languages using GetX translations.
lib/translations/ directory.es_ES.dart for Spanish.en_US.dart and translate the string values.lib/translations/app_translations.dart.@override
Map<String, Map<String, String>> get keys => {
'en_US': enUS,
'es_ES': esES, // Add this
};
To publish on Google Play, you must sign the app with a release keystore.
Open android/app/build.gradle.kts and confirm:
android {
compileSdk = 36 // must be explicit integer (NOT flutter.compileSdkVersion)
defaultConfig {
targetSdk = 36
minSdk = 21
}
}
Run the keytool command to create your keystore file. Replace
<path-to-keystore-file> with the file path where you want to store your
generated keystore file:
keytool -genkey -v -keystore <path-to-keystore-file> -keyalg RSA -keysize 2048 -validity 10000 -alias upload
Keep your keystore file safe and never commit it to version control.
key.propertiesCreate a file named key.properties inside your app's android/ directory
(i.e. android/key.properties):
storePassword=your_keystore_password
keyPassword=your_key_password
keyAlias=upload
storeFile=<path-to-keystore-file>
<path-to-keystore-file> with the
path to your generated keystore file. Using a relative path (relative to the android/ directory) or
standard forward slashes (e.g., <path-to-keystore-file>) ensures cross-platform compatibility across Windows,
macOS, and Linux.
build.gradle.kts Signing Configval keystorePropertiesFile = rootProject.file("key.properties")
val keystoreProperties = java.util.Properties()
if (keystorePropertiesFile.exists()) {
keystoreProperties.load(java.io.FileInputStream(keystorePropertiesFile))
}
android {
signingConfigs {
create("release") {
keyAlias = keystoreProperties["keyAlias"] as String
keyPassword = keystoreProperties["keyPassword"] as String
storeFile = file(keystoreProperties["storeFile"] as String)
storePassword = keystoreProperties["storePassword"] as String
}
}
buildTypes {
release {
signingConfig = signingConfigs.getByName("release")
}
}
}
# App Bundle (recommended for Google Play)
flutter build appbundle --release
# Standalone APK
flutter build apk --release
iOS requires code signing via Apple Developer certificates before distribution.
open ios/Runner.xcworkspace
Under the General tab, set the Bundle Identifier to match your
Apple App ID (e.g. com.yourdomain.reelsx).
ReelsX uses a RESTful API for all Flutter ↔ Laravel communication. Include
Accept: application/json on all requests. Protected endpoints require
Authorization: Bearer {token}.
| Method | Endpoint | Description | Auth |
|---|---|---|---|
| POST | /api/auth/register |
Register new user | No |
| POST | /api/auth/login |
Login → returns Sanctum token | No |
| POST | /api/auth/forgot-password |
Send OTP to email | No |
| POST | /api/auth/verify-otp |
Verify OTP code | No |
| POST | /api/auth/reset-password |
Set new password after OTP | No |
| POST | /api/auth/logout |
Revoke current token | Yes |
| Method | Endpoint | Description | Auth |
|---|---|---|---|
| GET | /api/reels |
Paginated feed (?tab=for_you|following|recent) |
No |
| POST | /api/reels/{id}/view |
Increment view count | No |
| POST | /api/reels |
Upload reel (multipart/form-data) | Yes |
| POST | /api/reels/{id}/like |
Toggle like | Yes |
| POST | /api/reels/{id}/bookmark |
Toggle bookmark | Yes |
| GET | /api/reels/{id}/comments |
List comments | Yes |
| POST | /api/reels/{id}/comments |
Post a comment | Yes |
| POST | /api/reels/{id}/purchase |
Purchase paid reel | Yes |
| Method | Endpoint | Description | Auth |
|---|---|---|---|
| GET | /api/user |
Authenticated user profile | Yes |
| POST | /api/user/profile |
Update profile | Yes |
| GET | /api/users/{id} |
Public user profile | No |
| GET | /api/users/{id}/reels |
User's uploaded reels | No |
| GET | /api/users/{id}/followers |
Follower list | No |
| GET | /api/users/{id}/following |
Following list | No |
| POST | /api/users/{id}/follow |
Toggle follow | Yes |
| GET | /api/user/verification |
KYC status | Yes |
| POST | /api/user/verification |
Submit KYC documents | Yes |
| Method | Endpoint | Description | Auth |
|---|---|---|---|
| GET | /api/chat/conversations |
Conversation list | Yes |
| POST | /api/chat/start |
Start conversation | Yes |
| GET | /api/chat/conversations/{id}/messages |
Message history | Yes |
| POST | /api/chat/send |
Send message/image | Yes |
| GET | /api/chat/conversations/{id}/poll |
Poll new messages (delta) | Yes |
| GET | /api/chat/unread-count |
Global unread count | Yes |
| Method | Endpoint | Description | Auth |
|---|---|---|---|
| GET | /api/rewards/summary |
Points, streak, tasks | Yes |
| POST | /api/rewards/streak/claim |
Claim streak bonus | Yes |
| POST | /api/rewards/tasks/{id}/claim |
Claim task reward | Yes |
| GET | /api/rewards/leaderboard |
Points leaderboard | Yes |
| GET | /api/wallet |
Wallet balance | Yes |
| POST | /api/wallet/topup/initiate |
Initiate top-up | Yes |
| POST | /api/wallet/offline/submit |
Submit offline receipt | Yes |
| POST | /api/wallet/withdraw/request |
Request withdrawal | Yes |
| GET | /api/notifications |
Notification list | Yes |
| POST | /api/reports |
Report content | Yes |
| GET | /api/recommendations/creators |
Suggested creators | No |
| GET | /api/sounds |
Sound library | No |
| GET | /api/playlists/my |
My playlists | Yes |
| GET | /api/tickets |
Support tickets | Yes |
| POST | /api/tickets |
Open new ticket | Yes |