PlayHub v0.9.9 Documentation
Production documentation

PlayHub Documentation

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

Package 0.9.9 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.

Version 0.9.9 operations guide

Version 0.9.9 adds an extension platform, transactional updates, new paid-content workflows, persistent playback, deeper discovery, and expanded administration. Use this section as the operating reference for capabilities introduced in this release.

No public API deprecations

Version 0.9.9 does not deprecate any public PlayHub API. Plugin API v1 is the supported extension contract for new integrations.

Plugins and system updates

Install extensions only from a source you trust. Plugin packages and system updates execute server-side code, so review compatibility, dependencies, requested configuration, and the package source before enabling them.

CapabilityHow it works
Plugin API v1Plugins register trusted PHP service providers, lifecycle hooks, dependency and compatibility rules, migrations, encrypted settings, server-side actions and filters, and namespaced website or Admin Panel pages.
Admin Plugins workspaceUse the workspace to install or update a ZIP package, review diagnostics, configure settings, enable or disable the plugin, and remove its package.
Package hardeningInstallation rejects traversal paths, symlinks, unsafe file types, server-control files, and archives that exceed package size or file-count limits. Package replacement is rollback-safe.
Declared plugin assetsPlugins may declare CSS, JavaScript, modules, images, fonts, JSON, and WebAssembly. PlayHub serves declared files through its protected asset route and browser hook runtime.
Transactional system updaterThe updater verifies signed manifests and checksums, runs preflight checks, protects runtime paths, creates backups, controls maintenance mode, applies database recovery, monitors interruptions, and can roll back a failed update.
Plugin Admin workspacesNamespaced Admin pages receive authenticated requests, navigation, confirmation and alert dialogs, and deterministic mount cleanup through Plugin API v1.

Review preflight

Resolve failed server, dependency, compatibility, disk, permission, and protected-path checks before changing production files.

Verify the backup

Confirm the updater has a recoverable application and database backup before maintenance mode begins.

Apply the signed package

Allow checksum validation, file replacement, migrations, cache refresh, and health checks to finish without manually replacing files in parallel.

Recover or roll back

If monitoring reports an interruption or failed health check, use the updater recovery state and rollback instead of retrying partial file copies.

Direct update from 0.7.5

The packaged Update_v0.9.9 manual update upgrades a verified PlayHub 0.7.5 installation directly to 0.9.9; the 0.7.6 and 0.7.7 packages are not required. Do not use this package on an older release. Run the update as the operating-system user that owns PlayHub and stop uploads, streams, queue jobs, and other writes first.

  • Verify restorable backups of the complete application, .env, database, uploads/, storage/, media, branding, plugins, and service configuration.
  • From the PlayHub root, enable maintenance mode with php artisan down --retry=60.
  • Upload the contents of Update_v0.9.9/ into the existing root. Preserve customer environment files, runtime data, uploads, media, plugins, SSL files, and active server configuration.
  • Do not run npm install, npm run build, composer install, or composer update. The production build is included and the Composer lock is unchanged.
  • Run the guarded database updater below. It verifies the 0.7.5 baseline, approved migration checksums, schema conflicts, and protected table row counts before applying changes.
  • Refresh caches, restart long-running application workers, disable maintenance mode, then verify VERSION, /api/health, core pages, existing data, Plugins, queues, and real-time notifications.
Run after uploading Update_v0.9.9
php update_database.php
Use the approved database updater

Do not run php artisan migrate --force for this manual package. If update_database.php fails, keep maintenance mode enabled, preserve its output, and restore the verified backup before attempting any manual schema change.

Only after the database updater reports success, remove it from the public root and finish deployment:

Post-update cleanup
rm update_database.php
php artisan optimize:clear
php artisan config:cache
php artisan route:cache
php artisan view:cache
php artisan queue:restart
php artisan reverb:restart
php artisan up

If the Artisan Reverb restart command is unavailable, restart Reverb with the installation's existing supervisor or service manager before leaving maintenance mode. LiveKit does not need a restart for this file and database update unless its service configuration also changed.

Plugin API v1 developer reference

Every plugin ZIP must contain plugin.json at its package root. Use a lowercase unique ID, a semantic version, api: 1, explicit compatibility constraints, and safe relative paths. Providers and lifecycle classes require a PSR-4 autoload map that covers their namespaces.

plugin.json
{
  "id": "vendor.example",
  "name": "Example Plugin",
  "version": "1.0.0",
  "api": 1,
  "requires": {
    "playhub": ">=0.9.9",
    "php": ">=8.3.0",
    "extensions": ["json"]
  },
  "autoload": {
    "psr-4": { "Vendor\\Example\\": "src/" }
  },
  "providers": ["Vendor\\Example\\PluginServiceProvider"],
  "lifecycle": "Vendor\\Example\\Lifecycle",
  "migrations": "database/migrations",
  "assets": {
    "styles": ["assets/example.css"],
    "scripts": ["assets/example.js"]
  },
  "settings": [
    {
      "key": "api_token",
      "label": "API token",
      "type": "password",
      "required": true,
      "public": false
    }
  ],
  "capabilities": ["Example integration"]
}

A provider extends App\Plugins\PluginServiceProvider, returns the exact manifest ID from pluginId(), and accesses its isolated PluginContext through $this->plugin(). The context exposes manifest data, decrypted settings, safe plugin-local paths, and action or filter registration. Hook names use lowercase letters, numbers, dots, colons, dashes, or underscores; lower priorities run first.

Service provider hooks
<?php

namespace Vendor\Example;

use App\Plugins\PluginServiceProvider as BaseProvider;

final class PluginServiceProvider extends BaseProvider
{
    protected function pluginId(): string
    {
        return 'vendor.example';
    }

    public function boot(): void
    {
        $plugin = $this->plugin();
        $plugin->addAction('example.ready', fn () => null);
        $plugin->addFilter('example.title', fn (string $title) => trim($title));
    }
}

An optional lifecycle class extends App\Plugins\PluginLifecycle and may implement enable(), disable(), settingsUpdated(), and uninstall(). Declare Admin or website workspaces through the supported namespaced plugin APIs, keep migrations inside the declared directory, and declare every browser asset in the manifest. Settings support text, password, textarea, boolean, number, and select fields; password settings cannot be public.

Playback, discovery, and video presentation

CapabilityViewer or creator behavior
Standalone embed playerIframe embeds render only the requested video and player instead of the complete video-details page.
Automatic scroll miniplayerAn actively playing watch-page video floats after it falls below 50% visibility and returns inline when paused, ended, or visible again.
Persistent in-tab playbackPlayback can continue across website navigation and reloads with previous/next queue controls, seek, mute, secure source refresh, full-player handoff, and browser Media Session integration.
Homepage and Shorts recommendationsRecommendations combine freshness, engagement quality, momentum, daily exploration, viewer affinity, completed-watch suppression, and creator/category diversity.
AirPlay and Google CastSupported browsers expose feature-detected casting for on-demand video and live replays, including Safari media permission and resumable default-receiver sessions.
Timestamped descriptionsDescriptions preserve formatting, Unicode, and emoji. Clickable m:ss and h:mm:ss timestamps seek the active player.
Automatic chaptersValid timestamped descriptions create native Vidstack chapter tracks with segmented seek bars, active titles, chapter navigation, and cover previews.
Managed chaptersImport CUE files or timestamp lists, review duration-based unnamed segments, validate chapter storage, and opt each video into native timeline chapters.
YouTube chapter importImported videos can read native player markers or timestamped descriptions and present an editable Step 4 chapter review with explicit opt-out.
Rich description formattingDescriptions safely render inline bold, italic, combined emphasis, external links, and the original text layout.
Automatic Up Next loadingThe watch page loads another recommendation page near the end of Up Next while preserving the manual Show more control.
Imported Shorts detectionYouTube Shorts signals or verified portrait metadata from other providers classify imported short-form videos.
Contextual recommendationsRelated and Up Next results combine channel, category, language, and tags with a signed-in viewer's private history, likes, saved videos, and subscriptions.
Draggable miniplayerDesktop users can move the minimized player within viewport bounds. Position and size persist, with constrained resizing, compact or expanded size, keyboard movement, and recovery after viewport changes.
Desktop theater modeThe watch page remembers theater mode, exposes native player and keyboard controls, expands playback, and keeps Up Next responsive.

Monetization and creator revenue

CapabilityConfiguration and access
Paid community photo setsProtected originals are unlocked through wallet purchase with platform fees, configured tax, permanent buyer access, and seller notification.
Currency-aware account balanceThe account menu shows the wallet in the selected currency and links directly to Earnings.
Creator tips and donationsCreators may accept wallet-backed support on channel and video pages, opt out, and rely on configured contribution limits, fees, idempotent transfers, and notifications.
Paid video salesAdministrators enable sales and creators set eligible prices. Wallet checkout applies the platform commission, notifies the purchase participants, and grants permanent Purchased-library access through protected playback links.
Purchase taxesConfigure VAT, GST, or Sales Tax for paid videos. Checkout shows the buyer total and stores an auditable tax record.
Withdrawal approvalsAdministrators or permitted moderators receive pending-request alerts, review requests, approve or reject once, retain reviewer metadata, and notify the creator of the decision.
Video boost campaignsCreators reserve wallet budgets and choose daily, per-click, or per-view billing. Home and Trending placement is paced and relevance-aware, qualified events are deduplicated, promoted labels remain visible, creator controls and reporting are provided, and administrators define limits.
Creator Studio earningsThe earnings cabinet filters creator-scoped VAST, tip, video sale, and live revenue and shows fees, balances, supporter/content details, pagination, and complete notifications for tips, purchases, and channel subscriptions.

Video advertising now supports VAST pre-roll, timed mid-roll, and post-roll breaks. Creator video payouts use completed VAST impressions with the VAST CPM or administrator fallback CPM, a configurable creator percentage, fractional accrual, self-view exclusion, hourly deduplication, and idempotent wallet crediting. Shorts cannot be sold as paid videos and are excluded from the standard player's Up Next and autoplay sequence.

Community, creator, and publishing workflows

CapabilityWorkflow
Hashtags and linked mentionsHashtags open search results and linked mentions open the referenced channel profile in video comments, community posts, and community comments.
Upload playlist selectionThe upload workflow lets a creator add the new video to one of that creator's own playlists.
Responsive mobile navigationThe mobile header provides search and coordinates with a fixed bottom navigator, animated active state, guest login behavior, and role-aware Live/Profile availability.
Community post removalPost authors, community owners, platform moderators, and administrators can remove posts according to their permissions.
Watch-page video deletionCreators, moderators, and administrators receive a confirmed delete action when their role can remove the current video.
Mention autocompleteType @ in supported video or community composers to receive suggestions, use keyboard selection, render a linked mention, and send preference-aware notifications.
Community poll votersClick a poll vote count to open paginated voter details with each public profile and selected option.
Publishing access controlsAdministrators define upload and live role rules, a strict username allowlist, timed user restrictions, and profile-complete self-service creator upgrades for new User accounts.

Administration, localization, and delivery

CapabilityAdministration behavior
Default website languageChoose the default in Admin Languages. A returning visitor's saved language preference remains authoritative.
Language availabilityEnable or disable public languages while default-language safeguards prevent an invalid catalog state.
Localized Admin PagesEdit About, Contact, Developers, FAQ, Help, Refund, Privacy, Terms, and Cookie pages by language with repeatable sections, visibility, footer, search metadata, sitemap controls, and atomic update-safe override storage.
Localized email templatesEdit, preview, validate, or reset every system email for each installed language using the documented template placeholders and update-safe overrides.
Branded HTML emailSystem email uses the configured website name and accent colors with responsive HTML and plain-text alternatives through SMTP, SendGrid, or native mail.
Signup audit dataUser management records immutable signup IP and registration source; full IP visibility remains admin-only.
Route loading modeWebsite Configuration can show a top loading bar, loading text, or both until the destination's initial requests finish.
Social sharing previewsVideos, Shorts, live streams, channels, community posts, and playlists receive server-rendered Open Graph and X cards using original artwork or the branded 1200x630 fallback.
SEO and SitemapsConfigure search metadata, canonical origin, verification, per-content indexing, dynamic robots rules, synchronized Open Graph/X/JSON-LD, and paginated content sitemaps.
Live-stream deletionThe Admin Live Streams row menu can delete an eligible stream after confirmation and clean the active session, replay, related records, and media.

Upgrade behavior and removed controls

  • System Settings now uses section navigation and persists changes only when Save is selected.
  • Fresh visitors and new accounts start in light theme; existing saved preferences remain unchanged.
  • The mobile header and bottom navigator coordinate hide/reveal behavior based on scroll direction.
  • The account menu uses full-width rows and displays the selected-currency wallet balance.
  • Legacy violet accents now follow the active UI accent color.
  • The video-player context menu uses the updated translucent compact design and accent rail.
  • Admin Dashboard and Earnings typography is larger for compact interfaces and transaction details.
  • Shared previews use a centered white play indicator on a translucent black circle.
  • Comment deletion and reporting now require confirmation in viewer, Creator Studio, and moderation workflows.
  • New local and imported videos require an explicit category instead of preselecting the first category.
  • YouTube imports preserve descriptions, move description hashtags into Tags, and fall back to current first-party player metadata for tags and chapters.
  • Temporary S3 links refresh correctly, while iPhone playback prioritizes compatible renditions and supports Safari byte ranges.
  • Route loading keeps the current page visible and reaches 100% before replacing it with ready destination content.

Version 0.9.9 removes the unlicensed LightGallery dependency in favor of PlayHub's native responsive image viewer. It also removes the mobile-header theme switcher, duplicate header Go Live action, sidebar user summary card, obsolete System Settings collapse control, and setup's Product license heading and instructional paragraph. License verification remains required.

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 OR KNL (Kontackt Direct License) 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.The configured website name is used in email, SMS, public copy, sharing metadata, and visible interface text.
Homepage panelPresentation title, description, feature bullets, and brand mark fallback.The uploaded logo replaces the fallback mark when available.
ThemeLight by default with optional dark 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, default language, and enabled public languages.Saved visitor language preferences override the default while their language remains enabled.

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.All three on fresh installations
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.
  • Email templates: localized HTML/plain-text content, per-template placeholders, preview, validation, and update-safe overrides.
  • 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, timed mid-roll, and post-roll delivery. Configure tag URLs, break timing, 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 platform fees, paid-video commission, contribution limits, boost limits, purchase taxes, withdrawal review, and a creator share of completed VAST impressions. VAST revenue uses provider CPM metadata or the administrator fallback CPM with fractional earnings, self-view exclusion, hourly impression deduplication, and idempotent credits. Memberships, wallets, tips, paid videos, paid photo sets, boosts, 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 default language, enable or disable public languages, review metadata and plural rules, edit translated PHP entries, and save. The default language cannot be disabled, and a visitor's saved preference is preserved while available. 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, signup source/IP, activity, and deletion.Edit, reset password, change role, ban, email, inspect admin-only signup data, 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, chapters, publishing access, and moderation.Approve, reject, feature, edit, delete, import/review chapters, control publishing, bulk category, mass import, export.
Live StreamsLive, scheduled, and ended sessions with actual health and viewers.Inspect, moderate, stop, open replay, delete with related media cleanup, 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.
MonetizationVAST revenue, paid videos, taxes, boosts, memberships, commission, contributions, withdrawals, and creator earnings.Filter, inspect, export, configure limits/fees/shares, and approve or reject withdrawals.
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.
PluginsPlugin ZIP packages, compatibility, configuration, diagnostics, lifecycle state, and removal.Install/update, configure, diagnose, enable/disable, and remove trusted packages.
PagesLocalized policy, support, company, and developer pages with repeatable sections and metadata.Edit by language, control visibility/footer/search/sitemap state, and save update-safe overrides.
Email TemplatesLocalized templates, placeholders, responsive HTML, and plain-text alternatives.Edit, preview, validate, reset, and test delivery.
SEO & SitemapsSearch metadata, canonical origin, verification, indexing, robots, social cards, structured data, and content sitemaps.Configure policy, verify public metadata, and inspect generated sitemap pages.
Website ConfigurationBrand, homepage content, theme, colors, typography, navigation, and layout.Preview, save, reset selected design values.
LanguagesInstalled language metadata, default/availability state, and PHP translation entries.Set default, enable/disable, edit, validate, save, and restore with backup.
System SettingsRegistration, login, live, storage, uploads, imports, ads, mail, SMS, integrations, moderation, and maintenance.Navigate by section, use explicit Save/test actions, 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.

Transactional system updates

Read the signed manifest

Confirm the upgrade path, release notes, compatibility, server requirements, protected paths, and package signature.

Pass preflight

Resolve disk, permissions, service, dependency, and database checks before the updater changes production state.

Verify the updater backup

Keep database, environment, media, plugin settings, custom language, page/email overrides, catalogs, and runtime configuration.

Allow the transaction to finish

The updater manages maintenance mode, checksummed downloads, protected files, replacement, migrations, cache refresh, and interruption monitoring.

Run health checks

Verify login, upload, playback, comments, live, replay, plugins, paid content, mail, SEO output, and administrator actions before reopening.

Recover or roll back

Use database recovery and the updater rollback when validation fails; do not leave a partially applied package in service.

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.
  • Install only trusted plugins and investigate every compatibility, package-hardening, or checksum failure.
  • 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.

A plugin ZIP is rejected or cannot be enabled

Open Admin Plugins diagnostics and verify the plugin's PlayHub/PHP compatibility, declared dependencies, package limits, and required settings. Rebuild the ZIP without traversal paths, symlinks, server-control files, unsupported file types, or unnecessary archive nesting. Install only the original package from a trusted source.

A system update is interrupted or fails validation

Do not copy another package over the interrupted transaction. Review the updater interruption state, preflight/checksum error, backup record, maintenance state, and application log. Use database recovery or rollback to return to the verified backup, resolve the root cause, and rerun preflight before retrying.

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 ordinary Laravel migrations (not the 0.9.9 manual update)php 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 Or the Direct Support portal. 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 or KNL (Kontackt Direct License) 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.