PlayHub v0.7.5 Documentation
Production documentation

PlayHub Documentation

Install, configure, operate, secure, and troubleshoot the complete PlayHub video, community, and multi-participant live streaming platform.

Package 0.7.5 Laravel 13 React 19 PHP 8.3+ Standalone and offline-ready

What PlayHub includes

PlayHub is a self-hosted product for publishing on-demand video, running creator channels and communities, hosting real-time rooms, recording replays, monetizing engagement, and administering the complete service from one dashboard.

Video platform

Uploads, FFmpeg processing, renditions, Shorts, playlists, search, discovery, history, watch later, comments, reports, and Creator Studio.

Live rooms

Browser and RTMP broadcasting, multi-participant rooms, screen sharing, control room, moderation, polls, goals, contributions, and replays.

Platform operations

Users, creators, roles, reports, ads, payments, storage, languages, backups, support, diagnostics, branding, and system configuration.

ClientReact applicationPublic website, Creator Studio, live control room, and admin dashboard.
ApplicationLaravel + MySQL + RedisAPIs, authentication, queues, scheduler, notifications, payments, and catalogs.
MediaFFmpeg + LiveKitVideo processing, WebRTC rooms, RTMP ingress, composite egress, and replay delivery.
Server administration is required

PlayHub is not a static PHP theme. Production operation requires CLI access, Redis, FFmpeg, a persistent queue worker, cron, Docker, open media ports, and valid HTTPS.

Server requirements

Use a VPS or dedicated server where you control PHP-FPM, background services, firewall rules, Docker, and process supervision. Shared hosting is suitable only when it exposes every requirement below.

Required software

ComponentMinimum or purposeVerify
Web and CLI PHPPHP 8.3 or newer. Keep PHP-FPM and CLI versions compatible.php -v
MySQL or MariaDBEmpty database with a dedicated UTF-8 capable account.mysql --version
RedisQueues, cache, sessions, streaming runtime, and real-time coordination.redis-cli ping
Node.js20.19.0 or newer for the production frontend build.node --version
npmVersion 9 or newer. The installer uses the locked dependency graph.npm --version
FFmpeg and FFprobeVideo probing, thumbnails, renditions, processing, and media inspection.ffmpeg -version
Docker EngineRuns the LiveKit server, RTMP ingress, and replay egress services.docker version
Docker ComposeCompose v2 is required by the bundled runtime installer.docker compose version
Nginx or ApacheURL rewriting, protected application files, large uploads, and WebSocket proxying.Server-specific
TLS certificateRequired for camera, microphone, secure WebSockets, OAuth, and payments.Open the domain with HTTPS

PHP extensions and functions

Required extensions
bcmath ctype curl dom fileinfo filter gd intl json mbstring openssl
pdo pdo_mysql session tokenizer xml zip zlib

Imagick is recommended for improved image processing. The PHP-FPM user also needs access to exec(), proc_open(), and nohup so the installer can stream process output and start its temporary installation worker.

Capacity and access

  • At least 256 MB PHP memory; 512 MB is preferable for installation.
  • At least 2 GB free for installation and 10 GB before accepting media.
  • Writable storage/, bootstrap/cache/, uploads/, and lang/.
  • Temporary root write access for .env, node_modules/, and build/.
  • Outbound HTTPS to npm and the PlayHub license verification service.
  • Supervisor or systemd access for the queue worker and runtime manager.
  • Cron access for the Laravel scheduler.
  • Root or sudo access for the LiveKit Docker runtime installation.
Subdirectory installation is not supported

Install at a domain root such as https://video.example.com, not at https://example.com/playhub. The document root points to the package root, not the Laravel public/ folder.

Package contents

Upload the complete package and preserve hidden files. The web installer generates environment-specific dependencies and production assets on the destination server.

PathPurposeCustomer action
install.phpFour-step installation wizard and live installation console.Open once, then remove after installation if desired.
app/, routes/, config/Laravel application, API, jobs, services, and configuration.Do not expose or edit without a backup.
resources/React/Vite source and Blade resources.Rebuild after frontend customization.
vendor/Bundled Composer dependencies.Keep present for installer startup.
package.json, package-lock.jsonTested frontend dependency graph.Do not delete the lock file.
branding/Default logo and favicon imported during installation.Keep; replace later from Website Configuration.
gifts/, stickers/Bundled local contribution catalogs.Keep so native catalog import succeeds.
livekit/Docker runtime installer, templates, status exporter, and generated runtime files.Run its installer with sudo after the web install.
server-configs/Nginx and Apache root-domain examples.Apply the matching server configuration.
docs/This standalone documentation.Open docs/index.html directly or publish it.

Generated during installation

  • .envProduction URL, database, Redis, mail, media, and runtime variables.
  • node_modules/Installed with npm ci from the tested lock file.
  • build/Vite production assets loaded by the public application.
  • Install lockstorage/app/installed.lock prevents accidental reinstallation.
  • License receiptstorage/app/license.json stores the signed installation activation.

Install PlayHub

Prepare the domain and services before opening the installer. The installation process verifies the same critical dependencies again before writing production state.

1. Prepare the domain and database

Create the domain

Point a clean root domain or subdomain to the extracted PlayHub package and issue a valid SSL certificate.

Create the database

Create an empty MySQL or MariaDB database and a dedicated account with privileges on that database only.

Prepare Redis

Record the host, port, username, password, and database number. Do not expose Redis publicly.

Prepare the owner account

Have the administrator name, username, email, secure password, website URL, timezone, and CodeCanyon purchase code ready.

2. Upload and set ownership

Example Linux permissions
sudo chown -R <web-user>:<web-group> /var/www/playhub
sudo find /var/www/playhub/storage /var/www/playhub/bootstrap/cache /var/www/playhub/uploads -type d -exec chmod 775 {} \;
sudo find /var/www/playhub/storage /var/www/playhub/bootstrap/cache /var/www/playhub/uploads -type f -exec chmod 664 {} \;
Never use 777 for the entire application

Give the web user ownership of runtime paths, then use normal directory and file modes. Broad write access exposes source, credentials, and uploaded files.

3. Configure the web server

Nginx

Use server-configs/nginx-root-install.conf inside the domain's existing server {} block. Keep the root pointed at the package directory, update fastcgi_pass for the installed PHP 8.3 socket, then validate and reload Nginx.

Validate Nginx
sudo nginx -t
sudo systemctl reload nginx

Apache

Enable mod_rewrite, allow .htaccess overrides for the domain, and use server-configs/apache-vhost-example.conf as the virtual host reference. Preserve the root .htaccess file.

4. Complete the four-step installer

Open https://your-domain.com/install.php.

StepWhat happensExpected result
1. RequirementsChecks PHP, extensions, binaries, Docker, Redis, HTTPS, writable paths, disk, package files, and process support.Required checks pass; warnings are understood.
2. ConfigurationCollects license, website, database, Redis, timezone, and initial owner details.Connections and purchase code validate.
3. InstallationCreates .env, installs frontend modules, builds assets, migrates tables, imports catalogs, caches config, and creates the owner.Every console step ends with [OK].
4. CompleteConfirms the installed app and provides website/admin links.Website and /admin open correctly.

Keep the installation page open during Step 3. The console intentionally hides passwords, tokens, and service secrets.

5. Complete the production checklist

  • Open the website and sign in with the owner account.
  • Open /admin and review Website Configuration and System Settings.
  • Configure SMTP or SendGrid and send a test message.
  • Start the persistent queue worker and scheduler.
  • Run the LiveKit runtime installer and test browser plus RTMP streaming.
  • Configure and test local or cloud media storage.
  • Configure Stripe or PayPal before enabling wallet payments.
  • Run an upload, thumbnail, playback, live recording, and replay test.
  • Configure an automatic backup and test one manual backup.
  • Remove install.php after installation if your deployment policy requires it.

Core background services

The web request process must remain short. Video processing, replay finalization, notifications, scheduled publishing, retention, and backups run through queues and the scheduler.

Redis

Use a private Redis service with authentication. The application and LiveKit runtime may share the server but should use the configured database number. The installer default is database 2 for LiveKit coordination.

Connectivity check
redis-cli -h 127.0.0.1 -p 6379 -a 'your-password' -n 2 ping

Queue worker

Direct worker command
cd /var/www/playhub
php artisan queue:work --queue=videos,default --sleep=3 --tries=3 --timeout=7200

Run this through Supervisor or systemd. Do not leave it in an SSH terminal.

Supervisor example
[program:playhub-worker]
process_name=%(program_name)s_%(process_num)02d
command=/usr/bin/php /var/www/playhub/artisan queue:work --queue=videos,default --sleep=3 --tries=3 --timeout=7200
directory=/var/www/playhub
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
user=www-data
numprocs=1
redirect_stderr=true
stdout_logfile=/var/www/playhub/storage/logs/worker.log
stopwaitsecs=7300
Apply Supervisor configuration
sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start playhub-worker:*

Laravel scheduler

Add exactly one cron entry for the web-server user. Laravel decides which internal tasks run each minute.

Crontab
* * * * * cd /var/www/playhub && php artisan schedule:run >> /dev/null 2>&1

The schedule handles future video publishing, replay finalization and retention, scheduled live polls, pruning, and configured automatic backups.

FFmpeg and FFprobe

Both binaries must be executable by the queue-worker user. Set explicit paths in .env when they are not discoverable through that user's PATH.

Environment example
PLAYHUB_FFMPEG_BINARY=/usr/bin/ffmpeg
PLAYHUB_FFPROBE_BINARY=/usr/bin/ffprobe
PLAYHUB_MAX_UPLOAD_MB=51200
PLAYHUB_CHUNK_SIZE_MB=8

After configuration changes

Refresh Laravel runtime
cd /var/www/playhub
php artisan optimize:clear
php artisan config:cache
php artisan queue:restart

LiveKit, RTMP, and replay recording

PlayHub uses a generated Docker runtime for WebRTC rooms, external-encoder ingress, and composite replay egress. The web installer prepares configuration, but the Docker installation must be run by a server administrator.

PublishBrowser or OBSCamera, microphone, screen share, or RTMP stream key.
RoomLiveKit + RedisWebRTC participants, tracks, permissions, data messages, and layouts.
RecordComposite egressConfigured room layout, participant identity, replay file, processing, and storage.

Install the streaming runtime

Run as root after web installation
sudo /var/www/playhub/livekit/install.sh

If automatic web-user detection is incorrect, pass the PHP-FPM account:

Explicit website user
sudo /var/www/playhub/livekit/install.sh www-data

The script creates livekit/runtime/, generates protected keys and service configuration, starts the Compose project, and registers a project-local manager through systemd when available. The generated project contains these services:

  • playhub-livekitSignaling, rooms, WebRTC media, participant permissions, and TURN configuration.
  • playhub-livekit-ingressReceives RTMP from OBS or another encoder and publishes it into the assigned room.
  • playhub-livekit-egressRenders the room-composite template and writes the recording used by the replay pipeline.

Open firewall ports

PurposeDefaultExposure
LiveKit signalingTCP 7880Normally proxied through HTTPS/WSS; avoid direct public use.
WebRTC over TCPTCP 7881Public inbound when used as ICE fallback.
WebRTC mediaUDP 50000-60000Public inbound and outbound.
RTMP ingressTCP 1936Public only when external encoders are enabled.
TURN UDPUDP 3478Public for clients behind restrictive NAT.
TURN over TLSTCP 5349Public when TURN TLS is enabled with valid certificates.
Never expose Redis, MySQL, or API secrets

Only media and signaling ports belong on the public firewall. LiveKit API credentials, Redis, generated YAML, and keys.yaml remain private.

Configure the public WebSocket URL

In Admin Dashboard > System Settings > Live Streaming > LiveKit, set the public URL to a secure endpoint such as wss://video.example.com/livekit. The reverse proxy must preserve WebSocket upgrades and use a timeout appropriate for long-lived connections.

Nginx WebSocket proxy example
location /livekit/ {
    proxy_pass http://127.0.0.1:7880/;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_read_timeout 86400;
}

If you use a dedicated signaling subdomain, set the admin public URL and proxy host consistently. A mismatch between the browser URL, certificate, proxy path, and admin value causes connection loops.

LiveKit settings reference

SettingUseDefault
EnabledEnables the real-time engine for public live workflows.On
Public URLSecure browser signaling endpoint.APP_URL/livekit
API key / secretSigns room and participant tokens. Treat both as secrets.Generated
RTMP URL / portEncoder endpoint displayed with the stream key.Port 1936
RedisHost, port, username, password, and database used by the media services.127.0.0.1:6379, DB 2
Signal / RTC TCPLiveKit signaling and WebRTC TCP transport.7880 / 7881
RTC UDP rangeWebRTC media ports.50000-60000
External IP / node IPAdvertises the reachable media address to clients.External IP on
Room timeoutsEmpty-room and departure cleanup behavior.300s / 20s
Max participantsOptional room-wide participant ceiling; zero means engine default.0
TURNUDP or TLS relay for restrictive networks.3478 / 5349
SSL/TURN certificatesCertificate directory, domain, certificate, and key paths.Disabled until configured
Advanced JSONValidated advanced server options and ICE server overrides.Generated defaults

Start, inspect, and restart containers

Runtime health
docker compose -f /var/www/playhub/livekit/runtime/docker-compose.yml ps
docker logs playhub-livekit --tail 100
docker logs playhub-livekit-ingress --tail 100
docker logs playhub-livekit-egress --tail 100
Restart generated runtime
docker compose -f /var/www/playhub/livekit/runtime/docker-compose.yml restart

When settings are changed from the admin dashboard, use its save/apply action so generated configuration and service status remain synchronized.

Configure RTMP for OBS

  1. Enable RTMP ingress in LiveKit settings and confirm the ingress container is healthy.
  2. Open Go Live and choose the external encoder workflow.
  3. Copy the generated RTMP server URL and stream key. A typical URL is rtmp://video.example.com:1936/live.
  4. In OBS, select Custom service, paste the server and key, and use H.264 video plus AAC audio.
  5. Start OBS, then confirm the source appears in the PlayHub control room before going public.
Protect every stream key

A stream key authorizes publishing to that live session. Do not show it on screen, include it in support screenshots, or reuse it outside the generated stream.

Participants, permissions, and layouts

  • The host publishes camera, microphone, and screen tracks.
  • Ordinary viewers subscribe only and cannot publish.
  • Accepted guests or cohosts receive role-scoped publishing permission.
  • Viewers can request audio-only or audio-and-video participation when enabled.
  • Moderators can manage chat, bans, requests, and participants within assigned privileges.
  • Adaptive grid, host focus, split screen, and screen share update the stage and recording layout.

Recording and replay pipeline

Room composite starts

The egress service loads the configured layout and records published participant tracks.

Identity and audio-only states render

Participant names and designed audio-only tiles are part of the composite template, not browser overlays burned accidentally into the source.

Recording completes

The application records egress status and queues replay finalization when the stream ends.

Replay processes

The queue validates media, creates thumbnails and chapters, associates chat/events, and moves the replay to ready state.

Storage replicates

When cloud storage is enabled, completed replay media is uploaded to the configured provider and retains its delivery metadata.

Live diagnostics

The control room diagnostics show actual connection state, source tracks, bitrate, frame rate, latency, network quality, room status, and runtime reachability. Check diagnostics before restarting services. A camera permission issue and a failed egress container require different fixes.

Configure every platform area

Most settings are available under Admin Dashboard > Website Configuration or Admin Dashboard > System Settings. Save each block independently and use its connection test where provided.

General, branding, and design

AreaSettingsOperational note
IdentityPlatform name, website title, logo text, logo file/URL, and favicon.Use optimized transparent assets and verify light plus dark themes.
Homepage panelPresentation title, description, feature bullets, and brand mark fallback.The uploaded logo replaces the fallback mark when available.
ThemeLight, dark, or system mode; public and admin accent palettes.Obsidian Gold is the package default.
TypographyFont family/import URL, sizes, weights, and navigation scale.Only use trusted HTTPS font sources.
LayoutContent widths, sidebar dimensions, radii, controls, and design tokens.Review mobile after changing dimensions.
LocalizationDefault timezone, items per page, and active language.Timezone affects schedules, ads, and publishing.

Registration, login, and account security

BlockAvailable settingsDefault
RegistrationPublic signup, phone collection, required username, blocked IPs, and email/SMS/no verification.Public on, no verification
Verification codesDigits, expiry minutes, resend limit, invalid attempts, and IP block time.4 digits, 5 minutes, 3 attempts
Password policyStrength meter and required strength from 0 to 10.Enabled
CaptchaSimple PHP captcha or Google reCAPTCHA with site/secret keys.Off
Login identifiersEmail, username, and phone number.Email
Login protectionTwo-factor authentication, max attempts, captcha threshold, and temporary ban.2FA on, 5 attempts, 15-minute ban
Social loginGoogle, Facebook, and Apple credentials plus callback URLs.Off

For OAuth, copy the exact callback URL displayed in the admin UI into the provider console. Scheme, domain, path, and trailing slash must match.

Email, SMS, analytics, and payments

  • SMTP: host, port, encryption, username, password, from address, and from name.
  • SendGrid: API key, sender identity, and support notification address.
  • SMS OTP: Twilio, Vonage, or MessageBird credentials and a test phone number.
  • Google Analytics: enable flag and Measurement ID.
  • Stripe: publishable and secret keys for wallet top-ups and paid flows.
  • PayPal: sandbox/live environment, client ID, and client secret.
  • Payment currency: USD, EUR, GBP, CAD, or AUD in the current admin selector.
  • Use each Test action before enabling its public feature.
The default mailer does not deliver email

A fresh installation uses the log mailer until SMTP or SendGrid is configured. Password reset, verification, moderator, ban, and notification email will not reach users while delivery is unconfigured.

Uploads and video processing

  • Enable or disable public upload workflows.
  • Select the allowed output renditions and default playback quality.
  • Set server and PHP upload limits that match the maximum accepted file.
  • Keep the videos,default worker supervised for probing, thumbnails, and encoding.
  • Use moderation defaults to auto-approve, require review, set default visibility, and enable profanity filtering.
  • Test with a short H.264/AAC file before accepting large production uploads.

Video import providers

Enable only providers you intend to offer. Direct URL, YouTube, Vimeo, Dailymotion, and Twitch settings support provider-specific keys or tokens where required. The mass-import tool uses the enabled provider list and can apply category, visibility, tags, kids status, monetization, duplicate handling, and stop-on-error behavior.

Live streaming product settings

AreaOptionsPackage default
Creator toolsWebcam preview, scheduling, thumbnails, appearance, DVR, chat, replay, and advanced settings.Feature-dependent
Monetization toolsAds, Super Chat, super stickers, gifts, tips, goal bar, and alerts.Configurable
EngagementPolls, pinned messages, labels, moderation, and slow mode.Standard moderation, 10s slow mode
ResolutionAuto, 480p, 720p, 1080p, 1440p, and 2160p.Auto
Frame rate30 or 60 fps.30 fps
LatencyNormal, low, or ultra-low.Low
AudienceEveryone, signed-in, subscribers, invited, or private.Everyone
Replay retentionOff, 24 hours, 7, 30, or 90 days, or forever.Forever
LimitsSchedule horizon, thumbnails, poll options/duration, labels, diagnostics sample, tips, and ads.Review before launch

Current validation supports up to 365 days for scheduling, 5 MB thumbnails, 6 poll options, 1440 poll minutes, 8 stream labels, and a 512 KB diagnostic probe. Tip defaults are USD 1 minimum and USD 500 maximum unless changed.

Website ads and player ads

The website ad manager supports media or trusted HTML, placement, status, schedule, targeting, display rules, and performance data. Placements include after header, left sidebar, before footer, home feed, video grid, comments, below player, watch sidebar, Shorts, search, channel, live, community, and floating bottom.

Player ads are configured separately for VAST pre-roll delivery. Configure tag URLs, skip timing, wrapper depth, MP4 preference, and tracking. Test the VAST response and media CORS from a browser before enabling it globally.

Monetization

Monetization can be enabled globally with a platform commission percentage and integer earning rates for click, view, like, subscriber, and comment events. Memberships, wallets, contributions, ads, creator earnings, and payouts depend on real transaction data and configured payment providers.

Languages

The Languages page manages the bundled 128 language packs. Select a language, review metadata and plural rules, edit translated PHP entries, and save. Back up customized lang/ files before applying an update.

Maintenance mode

Enable maintenance mode with a customer-facing message and optional allowed IP addresses or prefixes. Always include your administration IP before saving, then verify the public state in a private browser window.

Storage, cloud, and media lifecycle

PlayHub supports local uploads and S3-compatible cloud workflows, including Amazon S3, Google Cloud Storage interoperability, Backblaze B2, and Azure Blob configuration exposed by the admin storage page.

Storage settings

ProviderRequired valuesVerify
LocalWritable uploads path and sufficient server disk.Upload, play, delete, and check range requests.
Amazon S3 / compatibleEndpoint, key, secret, bucket, region, and optional public base URL.Use Test Connection, then upload and remove a sample.
Backblaze B2S3 endpoint, key ID, application key, bucket ID/name, and region.Confirm bucket permissions and public URL.
Azure BlobAccount name, account key, and container.Test write/read/delete from admin.
Google CloudInteroperability access key, secret, and bucket.Enable compatible access and test.

Use the records prefix to separate PlayHub objects and set a public base URL when a CDN or custom delivery domain fronts the bucket. Configure reported cloud capacity so dashboard usage percentages are meaningful.

Membership storage quotas

Starter, Plus, Premium, Pro, and VIP memberships can have independent storage quotas and monthly prices. VIP can be unlimited. A user-specific quota overrides the membership default when set by an administrator.

Video processing lifecycle

Upload session validates

File type, size, storage quota, ownership, and chunk state are checked.

Worker probes media

FFprobe reads duration, dimensions, streams, orientation, and codec metadata.

FFmpeg creates outputs

Configured renditions and thumbnails are generated without blocking the browser request.

Storage finalizes

Files remain local or are moved to the active cloud disk with their public URL metadata.

Video becomes ready

Visibility and moderation state determine when viewers can discover it.

Test deletion as well as upload

A valid cloud configuration must support write, read, public delivery, and delete. Catalog gift and sticker files intentionally remain local.

Feature guide

This section explains where each major PlayHub feature appears and what must be configured for it to operate.

Viewer experience

  • Home discovery, trending blocks, categories, creators, and personalized content.
  • Database-backed search for videos, channels, playlists, live streams, and tags.
  • Responsive video player, quality selection, captions, progress, and watch history.
  • Likes, comments, replies, mentions, reactions, attachments for signed-in users, and stickers.
  • Watch Later, favorites, bookmarks, playlists, liked videos, and history collections.
  • Public channel profiles, subscriptions, notifications, playlists, community, and messaging.
  • Shorts feed with engagement actions and creator navigation.
  • Reports for profiles, videos, comments, and community content.

Creator Studio

  • Upload and edit video metadata, thumbnail, category, tags, audience, visibility, and schedule.
  • Track processing status and use real channel analytics and content search.
  • Moderate recent comments with reply, view, link, pin, and report actions.
  • Create and manage playlists, select owned videos, and expose public collections.
  • Manage channel profile, social links, description, branding, community, and library.
  • Review revenue, memberships, wallet contributions, gifts, tips, and monetized events.

Community and messaging

Authenticated creators can publish community posts with text and media. Users can react, comment, report, and use categorized stickers. Suggested communities and subscription actions use real channel data. Profile Message opens the existing private conversation or creates the correct conversation destination.

Go Live and control room

  • Required title and description, category, comma-separated tag tokens, visibility, schedule, and thumbnail.
  • Browser camera/microphone, screen share, or external RTMP source.
  • Local host preview remains muted while the published audio track stays live.
  • Pre-live and in-stream settings with participant acceptance and recording controls.
  • Invite guest username suggestions, backstage state, request approval, and removal.
  • Adaptive grid, host focus, split screen, screen share, and spotlight behavior.
  • Real diagnostics, viewer count, stream health, latency, bitrate, and track status.
  • Automatic reconnect and track republishing after a recoverable page reload.

Live engagement and commerce

  • Real-time chat, reactions, pinned messages, slow mode, deletion, and viewer chat bans.
  • Polls publish to every role; the host can inspect voter identities and selections.
  • Goals update live when created or changed during the broadcast.
  • Preset tips send immediately; custom tips enforce configured minimum and maximum.
  • Gifts and categorized super stickers send immediately when wallet funds are sufficient.
  • Wallet recharge opens configured Stripe or PayPal checkout in a separate tab.
  • Contribution animations scale for small, medium, and large values on every live side.
  • Chat records participant join, leave, removal, gifts, stickers, tips, and system events.

Live roles

RolePublishingPrimary capabilities
HostCamera, microphone, screen, or RTMPFull control room, invites, layouts, settings, moderators, polls, goals, and end stream.
Participant / guestAudio-only or audio/video after approvalPublishes assigned tracks and appears in stage plus replay composite.
ModeratorOnly when separately accepted as participantDelete chat, ban viewers, restrict comments, accept requests, and remove participants.
ViewerNoWatch, chat, react, vote, contribute, and request participation when enabled.

Replays

Completed streams become responsive replay pages with adaptive portrait/landscape presentation, chat replay, chapters, top moments, stream events, likes, comments, clips, analytics, contribution history, creator information, and related replays. Multi-participant composites include participant labels; audio-only participants use an intentional identity tile instead of an empty black block.

Admin dashboard reference

The dashboard reads production data and applies real actions. Role and permission scopes determine which pages a team member can access.

PageWhat it managesImportant actions
DashboardPlatform metrics, moderation queue, top creators, health, and quick actions.Review reports, open analytics, inspect system health.
UsersAccounts, state, role, verification, storage quota, activity, and deletion.Edit, reset password, change role, ban, email, permanently delete with optional videos.
CreatorsChannels, category, subscribers, 28-day views, revenue, applications, and verification.Verify, suspend, review, filter, and export.
ContentVideos, Shorts, posts, categories, imports, and moderation.Approve, reject, feature, edit, delete, bulk category, mass import, export.
Live StreamsLive, scheduled, and ended sessions with actual health and viewers.Inspect, moderate, stop, open replay, and filter by category/health.
GiftsLocal gift image, name, price, status, and pagination.Add, update, delete file plus record.
StickersLocal sticker image, unique name, category, status, and pagination.Add, categorize, update, and delete.
AdsHTML/media creative, placement, schedule, targeting, display, and reporting.Create, preview, enable, pause, edit, duplicate, and delete.
ReportsProfile, video, comment, and community reports with real previews.Assign, prioritize, change status, resolve, bulk update, export.
MonetizationRevenue, sources, memberships, commission, contributions, and creator earnings.Filter, inspect, export, and configure rates/settings.
AnalyticsGrowth, engagement, viewers, content, creators, and date-based performance.Change range, inspect data, export.
SupportCustomer tickets, system incidents, priority, agent, SLA, and replies.Assign, respond, escalate, resolve, search, and filter.
Roles & PermissionsAdmin roles, permission matrix, groups, invitations, scopes, and members.Create/edit roles, invite member, change status, audit access.
Website ConfigurationBrand, homepage content, theme, colors, typography, navigation, and layout.Preview, save, reset selected design values.
LanguagesInstalled language metadata and PHP translation entries.Select, edit, validate, save, and restore with backup.
System SettingsRegistration, login, live, storage, uploads, imports, ads, mail, SMS, integrations, moderation, and maintenance.Save/test blocks, clear cache, inspect logs, backups, and cron jobs.

Reports and moderation workflow

  1. A signed-in user opens a report action on a supported item and submits a reason.
  2. The record appears in Admin Reports with the real avatar, thumbnail, or content preview.
  3. An administrator sets priority, moderator, and status or applies a bulk action.
  4. Content/user actions are performed from the relevant admin page.
  5. The report is resolved with an auditable status change.

Roles and notifications

Use the permission matrix to grant the smallest necessary scope. When a user is appointed as a platform or live moderator, PlayHub can send an in-app notification and configured email. Ban events can also send email; delivery requires SMTP or SendGrid.

Maintenance, backups, updates, and security

Production reliability depends on repeatable backups, service supervision, log review, and tested updates.

Backups

The admin backup dialog inventories selectable folders and their sizes, includes the database, supports large-file behavior, compression level, retention count, and automatic frequency. Large media libraries may be better protected by storage-provider versioning plus database/application backups.

  • Back up the complete database.
  • Back up .env, the signed license receipt, and install lock privately.
  • Back up local uploads, replays, branding, gifts, stickers, and customized language files.
  • Back up livekit/runtime/, especially keys, generated configuration, and certificates.
  • Retain multiple generations and test restoration on a separate domain/server.

Safe update sequence

Read the release notes

Confirm the supported upgrade path and any server requirement changes.

Create and verify a backup

Keep database, environment, media, custom language, catalogs, and runtime configuration.

Enable maintenance mode

Allow the administrator IP and stop new writes while applying the update.

Apply files and migrations

Preserve runtime content, run migrations, and rebuild frontend assets only as instructed.

Refresh services

Clear/cache configuration, restart queue workers, verify scheduler, and inspect containers.

Run smoke tests

Test login, upload, playback, comments, live, replay, payments, and admin actions before reopening.

Logs and health

  • Laravelstorage/logs/laravel.log
  • Queue workerSupervisor/systemd output and storage/logs/worker.log when using the example.
  • Web serverNginx or Apache access/error logs.
  • PHP-FPMPool error log, timeout, memory, permission, and disabled-function errors.
  • LiveKitDocker logs plus livekit/runtime/status/ and livekit/runtime/logs/.
  • Health endpointAdmin System Settings links to the application health response.

Security checklist

  • Keep APP_ENV=production and APP_DEBUG=false.
  • Enforce HTTPS and secure WebSockets on every public page.
  • Protect .env, license files, Redis, database, LiveKit keys, and payment secrets.
  • Use dedicated database and storage credentials with minimum privileges.
  • Restrict Docker and server-management access to trusted administrators.
  • Patch PHP, Node.js, FFmpeg, Docker, Composer packages, and the operating system.
  • Review admin members, permission groups, reports, failed jobs, and logs regularly.
  • Test backup restoration and account recovery before an incident occurs.

Troubleshooting

Start with the exact error, the service that owns the failing step, and the corresponding log. Avoid changing multiple systems at once.

Installer reports a network error during npm installation

Confirm DNS and outbound HTTPS access to registry.npmjs.org, then verify the PHP-FPM user can execute Node and npm and write storage/app/npm-cache plus the application root. Check proxy, hosting-panel, certificate, and firewall restrictions. Keep the original package-lock.json.

Installer reports vite: command not found

The locked npm install did not complete or node_modules/.bin is incomplete. Restore the original package.json and package-lock.json, remove the partial node_modules, verify write permissions and network access, then rerun installation.

Unable to start the background installer worker

Enable proc_open(), exec(), and nohup for PHP-FPM. Confirm the web user can write the application root and storage/app. Some shared hosts prohibit detached processes; use a server plan that permits them.

open_basedir warnings or restricted binary paths

The installer can detect but cannot change PHP-FPM or hosting-panel policy. Allow the PlayHub root, /tmp, and required binary locations, then restart PHP-FPM. Keep web and CLI PHP versions/extensions aligned.

The website returns HTTP 500

Inspect storage/logs/laravel.log, the PHP-FPM log, and web-server error log. Verify .env, APP_KEY, database access, writable runtime paths, and PHP extensions. Run php artisan optimize:clear. Never enable debug on a public production site.

Frontend changes do not appear

PlayHub serves the generated build/ assets. Run npm ci when dependencies are missing, then npm run build. Clear application and reverse-proxy/CDN caches and confirm the generated asset filenames changed.

Uploads fail before processing begins

Compare the PlayHub upload limit with PHP upload_max_filesize/post_max_size, Nginx client_max_body_size, disk space, user quota, and write permissions. Large uploads also need compatible server timeouts.

Videos remain in Processing

Confirm the videos,default queue worker is running and FFmpeg/FFprobe are executable by that user. Inspect Laravel and worker logs, then run php artisan queue:failed. Fix the root cause before php artisan queue:retry all.

Thumbnail cannot be stored

Check the active media disk, local/cloud write permission, bucket credentials, records prefix, image extension support, FFmpeg output, and available space. Use the admin storage connection test and verify write/read/delete, not only authentication.

Email or password reset codes are not delivered

The default log mailer does not send. Configure SMTP or SendGrid, save, test, clear/cache configuration, and inspect the provider activity/suppression list. Ensure the from address is authorized and the queue worker is running for queued mail.

SMS verification codes are not delivered

Enable one supported provider, enter every required credential and sender, use international phone format, and run the admin test. Check provider balance, geographic permissions, sender approval, and delivery logs.

Redis connection fails

Confirm host, port, username, password, database number, bind address, and firewall. Test from the application host as the same network context. Do not use a public Redis endpoint without TLS/private networking and authentication.

Go Live says the Docker runtime is missing

Complete the web installation, then run sudo /var/www/playhub/livekit/install.sh. Confirm Docker daemon and Compose v2, inspect Compose status, and verify the admin LiveKit status snapshot updates.

Live page stays on Connecting

Verify HTTPS, the public WSS URL, certificate, proxy WebSocket headers, API key/secret, LiveKit container health, and browser console. A public URL pointing to an unproxied internal port will not work from viewers' browsers.

Live audio works but video is black

Open control-room diagnostics and confirm a video track is published/subscribed, camera permission is granted, and the selected device is active. After reconnect, verify local tracks were republished. For replay only, inspect egress logs and the composite template.

Some viewers cannot connect while others can

This usually indicates NAT/firewall/TURN behavior. Open the RTC TCP and UDP range, advertise the correct external/node IP, and configure TURN or TURN TLS with a reachable domain and valid certificate.

OBS cannot publish to RTMP

Confirm ingress is healthy, TCP 1936 is open, the public RTMP host resolves to the server, and the stream key is current. Verify OBS uses the exact server URL and key generated for that stream. Inspect ingress logs while starting the encoder.

Replay is missing, stuck, or has only audio

Inspect the egress container first, then Laravel and queue logs. Confirm recording started before the room ended, the egress output path is writable, the queue worker runs, FFmpeg can inspect the result, and cloud storage accepts the finalized file.

Payments open but wallet balance does not update

Confirm Stripe/PayPal live or sandbox mode matches the credentials, the checkout return URL uses the correct domain, webhooks can reach the server over HTTPS, and webhook secrets/events are configured as required. Check transaction and provider logs before crediting manually.

OAuth redirects to an invalid URL

Copy the exact callback URL shown in System Settings to the provider console. Confirm APP_URL, HTTPS, proxy forwarded headers, and domain. Clear/cache config after correcting environment values.

Scheduled videos, polls, retention, or backups do not run

Install the one-minute Laravel scheduler cron under the correct user. Run php artisan schedule:list and php artisan schedule:run -v, then inspect cron mail/system logs and Laravel logs.

License verification fails

Confirm the complete purchase code, correct installation domain/URL, outbound HTTPS to the license service, certificate validation, and accurate server clock. Contact support before moving an activated installation to another domain.

Commands and important paths

Common commands

TaskCommand
Application statusphp artisan about
Clear all application cachesphp artisan optimize:clear
Build production config cachephp artisan config:cache
Run migrationsphp artisan migrate --force
List scheduled tasksphp artisan schedule:list
Run scheduler nowphp artisan schedule:run -v
List failed jobsphp artisan queue:failed
Retry failed jobsphp artisan queue:retry all
Restart workersphp artisan queue:restart
Install locked frontend modulesnpm ci
Build frontendnpm run build
LiveKit statusdocker compose -f livekit/runtime/docker-compose.yml ps

Important paths

PathPurpose
.envEnvironment-specific production configuration and secrets.
storage/logs/laravel.logApplication exceptions and operational messages.
storage/app/installed.lockPrevents installer reuse.
storage/app/license.jsonSigned domain license receipt.
storage/app/playhub-*.jsonAdmin-managed settings persisted by each settings module.
uploads/Local media and live replay outputs when local storage is active.
gifts/, stickers/Local contribution catalog images.
lang/Bundled and customized PHP language packs.
livekit/runtime/Generated Compose, YAML, keys, certificates, status, and logs.
build/Vite production frontend assets served to browsers.

Prepare a useful support request

Use the support channel on the CodeCanyon item page. A reproducible report with sanitized logs can be diagnosed much faster than a screenshot without server context.

Include

  • PlayHub package version and whether this is a fresh install or update.
  • Operating system, web server, PHP-FPM and CLI PHP versions.
  • MySQL/MariaDB, Redis, Node.js, npm, FFmpeg, Docker, and Compose versions.
  • Exact page, user role, action sequence, expected result, and actual result.
  • Browser console/network error when the issue is client-side.
  • Relevant Laravel, worker, web-server, PHP-FPM, or container log excerpt.
  • Whether the problem reproduces with a short test video or private test stream.
Remove secrets before sharing logs

Never send passwords, database credentials, Redis passwords, full .env, LiveKit secrets, stream keys, payment keys, private certificates, purchase codes, or the signed license receipt in a public ticket.

License notice

PlayHub requires a valid CodeCanyon purchase code during installation. Activation is tied to the installation domain and must follow the applicable Envato license. Do not redistribute the source package or share a purchase code.