PlayHub v0.9.13 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.13 Laravel 13 React 19 PHP 8.3+ Updated 10 October 2026

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.

What's new in PlayHub 0.9.13

Version 0.9.13 follows 0.9.12 and updates playback, private cloud delivery, Shorts, responsive layouts, branding, signup roles, and content administration. The web version, native app build number, and API contract version have independent histories. See the React Native application guide for Android and iOS.

Playback startup, retry, and adaptive imports

  • Early Play clicks: Watch and standalone embeds use the native media element when it can buffer, or wait for the provider's readiness event. Pending playback has a bounded wait and is cancelled when paused or removed during navigation.
  • Recovery: retry reloads failed media and can restore its previous position. Persistent playback checks that its player is still connected. Unavailable origins, expired links, unsupported formats, and autoplay denial still need a meaningful user action.
  • Player CORS: website and embed players omit unnecessary anonymous crossOrigin attributes. Remote JavaScript HLS/DASH manifests, segments, and captions still need their own valid origin headers.
  • Canonical direct imports: direct HLS imports on the site's bare or www hostname use the canonical HTTPS origin in APP_URL; the original saved import URL remains unchanged. Other domains, unrelated subdomains, credential-bearing URLs, and unrelated explicit ports are excluded.
  • Correct source types: MIME detection reads the URL path independently of query strings and fragments, so signed .m3u8 URLs retain HLS classification. Watch, persistent playback, and embeds let HLS/DASH providers determine live, DVR, or on-demand status; ordinary files remain on demand.
  • Import serialization: a direct import exposes its actual media source rather than an uploaded-file route. Upload processing still generates progressive MP4 renditions; this update adds no automatic HLS/DASH transcoding, DRM, or HDR packaging.

Private and paid video protection

Media requests retain resource-specific authorization and expiring playback links. Authorized owners and administrators can receive signed viewer claims for media requests that cannot attach the website bearer token. Delivery rechecks current access, account restrictions, and private-profile ownership. Cloud playback authorizes the application request before redirecting to a bounded provider-signed URL; protected redirects use private, non-storable headers and cannot outlive the incoming application signature. Private objects have no public-CDN fallback when signing fails. Local delivery preserves byte ranges for seeking.

Shorts classification and discovery fixes

  • Ordinary uploaded videos with measured durations from 1 through 60 seconds become Shorts, including older records saved with a default standard-video flag. Processing checks duration again; automatic classification does not require portrait dimensions.
  • The explicit Upload Short flow still requires a portrait ratio from 0.45 through 0.8 and a maximum duration of 60 seconds.
  • Shorts disable incompatible video ads and chapters. Sale-enabled clips explicitly classified as standard videos stay standard to preserve buyer access. Provider imports retain provider classification, and live replays remain replays.
  • Discovery and returned resources apply the same classification rules. Trending tags sum actual views_count values from the loaded feed, deduplicate case variants and repeated/hash-prefixed tags per video, and rank by views. These are feed totals; no synthetic multiplier, fallback tags, or site-wide aggregate is added.
  • Uploader names and avatars open the correct channel using shared profile navigation. Follow remains a separate action. Missing destinations are disabled, with keyboard focus and narrow-screen styling.

Comments, navigation, and content layouts

Mobile comment menus now render as scrollable sheets in the document body, keeping Delete reachable. Delete and report confirmations render above Shorts overlays. Delete remains permission-controlled and explains that deleting a parent removes its replies.

Opening or dragging the mobile sidebar restores the header and positions the drawer beneath its 64-pixel top bar. Dynamic viewport height and safe-area padding remove the gap caused by a hidden header. Small-screen headers and information pages wrap long content.

Creator Studio content tables reserve room before showing the summary rail. Intermediate widths scroll inside the table container; narrow screens show labeled cards with selection, metrics, and row actions. Admin content receives corresponding mobile selection and overflow fixes.

Branding, signup roles, and administrator actions

Setting or actionNew behavior
Image-only brandingWebsite Configuration accepts empty logo text, a Show logo text switch, and a 16–64 pixel logo image size. Saving another branding field preserves image-only presentation; public configuration uses the same values.
Default signup roleSelect User or Creator. New local and social accounts receive the server-selected role; staff roles and client-supplied role escalation are rejected. Existing/returning social accounts keep their roles. Upload and Live access still follow publishing rules, restrictions, and allowlists.
Edit User / Change RoleCanonical saved values now agree across user rows, team rows, filters, and effective permissions. A channel owner changed to User displays User. Demotion clears legacy administrator flags while preserving other preferences; self-demotion safeguards remain.
Delete categoryConfirmed administrator deletion works for empty and final categories. Videos become Uncategorized in the same transaction while media, engagement, and visibility remain intact. A failure rolls back detachment. Create a replacement category before an upload that requires one.

Cloud display images and fewer provider requests

Private cloud avatars and banners now use the application's signed /media/images route when no explicit public base URL is configured. User Settings and channel profiles preserve complete API avatar_url and cover_url signatures instead of reconstructing unsigned upload paths. Local editing previews retain priority.

Display links last six hours and accept only approved raster paths under avatars, covers, branding, logos, banners, gifts, and stickers. Signature validation happens before reading the private cache. Protected video thumbnails and community, comment, and message images retain their own access routes.

Image operationProvider requestsBehavior
Generate a signed URL0Signing is local; no preliminary existence HEAD request.
Fill a cold display-image cache entry1 authenticated GETNo separate existence, size, or MIME HEAD request. Validate MIME and raster bytes after download.
Serve a warm image0Also supports ETag / Last-Modified conditional responses and HTTP 304.
Cache retentionLocal maintenanceDefaults: 30-day age, 1 GiB pruning target, 20 MiB per image. Daily scheduler and opportunistic hourly checks prune expired then older-used entries; active locks can defer removal.

Oversized, malformed, HTML, and SVG objects are rejected. Successful application overwrites/deletions invalidate cache entries; failed remote changes keep the previous entry usable. Provider-side changes may remain cached until expiry or deliberate maintenance.

Backblaze transaction caps still apply

If an account has exhausted its Class B transaction cap, increase that cap in Backblaze before testing uncached reads. Cached images may stay available, but refused uncached objects cannot be downloaded. This fix does not alter keys, bucket privacy, provider CORS, billing settings, or normal object-read costs.

Shared API, push, and Live updates

The shared backend exposes API v1 for native bootstrap, authentication, refresh, TV pairing, playback, resumable uploads, progress, and notifications. The website continues using its versionless API. Native direct-to-cloud multipart upload is not implemented.

FCM and APNs delivery now includes a durable outbox, queue dispatch, bounded retries, recovery, and registration/preference checks. Delivery defaults to disabled. Bootstrap enables it only with platform credentials and required tables ready. Supervise a worker for the configured push queue (default push); the ordinary videos,default worker does not consume it. Registration success alone does not prove device delivery.

The 9 October connected Android Live pass covers bidirectional real media, supported interaction and moderation, token revocation, recording, and physical replay playback against a local HTTPS backend. It supersedes the earlier blocked milestone notes. Fixes include starting an unchanged saved schedule after its due time, deterministic chat order with equal timestamps, clearing stale ended-summary errors, and reconciling abnormal host loss. See native Live setup and acceptance.

This is scoped development-device acceptance, with a 2,000 ms owner-selected latency gate. It does not establish production acceptance, iOS readiness, all Android GPUs, locked camera FPS, or release-build memory behavior. TURN UDP passed; TURN TCP/TLS were not configured, and optional RTMP ingress was not rerun.

Features retained from previous releases

Persistent and scroll miniplayers, standalone embeds, captions and chapters, provider imports, analytics/CSV exports, VAST and Google IMA, paid videos and community photo sets, wallet tips, boosts, creator earnings, withdrawal review, localized SEO/pages/email templates, plugin management, and transactional updates remain available from the 0.9.9–0.9.12 baseline. Review every documented web version below.

Upgrade and configure 0.9.13

Use the distribution's supported update path and a matching application, locked dependency set, frontend manifest/assets, and database state. The historical 0.7.5 → 0.9.9 manual package has its own guarded procedure and is not a 0.9.13 updater.

  1. Verify recoverable backups of the database, media, environment, administrative settings, and previous deployable release. Preserve customer secrets and storage configuration.
  2. Deploy matching PHP source, locked Composer dependencies, migrations, and frontend release metadata on PHP 8.3+. React 19, Vite 7, and Vidstack 1.15 are the current web toolchain; choose the Node runtime required by its lockfile.
  3. For a source deployment, run the build commands below in the web application root. Deploy the complete build/ output and manifest together, with the configured /build/ base. Retain older chunks while open tabs can still request them.
  4. Apply the release's required migrations through the supported deployment process, refresh caches, and restart supervised workers after active jobs finish. Keep the videos,default worker and Laravel scheduler running; image-cache pruning depends on the scheduler.
  5. Allow writes to private image-cache and media staging directories with enough local disk. Keep those cache files private and preserve protected media routes.
  6. Set APP_URL to the actual canonical HTTPS origin. Test direct-import manifests and relative segments there; configure remote adaptive-source CORS for each required origin.
  7. Review the provider-specific storage requirements, resolve any exhausted transaction cap, and test the intended account. Connection testing performs real write/read/delete operations and does not save settings.
  8. If enabling native push, configure the platform credentials and outbox tables, then supervise the configured push queue. Complete native signing/device delivery separately from the web update.
Web source build · application root
npm ci
npm run build

Acceptance after deployment

  • Verify authorized and unauthorized private-video requests, expiration, seeking, and paid access.
  • Check a cold display image, a warm image, and an ETag / Last-Modified conditional response.
  • Play a direct HLS import in Watch and an embed at the canonical hostname; check segments and captions.
  • Upload a disposable short clip; verify classification, discovery, and seeking.
  • Change a test account role, refresh, and compare displayed role and effective permissions.
  • Delete a disposable category and confirm its videos remain available as Uncategorized.
  • Exercise comment menus, confirmations, the mobile drawer, Creator Studio cards, and Admin selection on narrow screens.
  • Verify queues, the scheduler, real storage uploads, processing, playback, deletion, Live recording, and replay on the actual deployment.

The source records earlier isolated regression/build/browser checks; they do not validate a customer's credentials, cap, origin configuration, services, or deployment. Record the real deployment date and acceptance result. Rollback restores a coherent application/frontend/database release while preserving media and customer configuration.

Web version history

Version 0.9.13 is documented above. The entries below preserve the existing published web release history. Native development milestones have their own application history.

Current capability reference

Earlier release-note wording is historical. The current Live implementation uses monetary tip presets rather than coin currency, does not persist peak/unique-viewer or cumulative-watch-time analytics, and does not implement clip creation, active DVR seeking, or a stream-label editor/rendering surface. Use the current Live guide for the supported behavior.

0.9.12 · Google IMA, AdSense, and creator analytics

Version 0.9.12

Released September 7, 2026

Released September 7, 2026. This release adds Google IMA player advertising, a standalone Google AdSense plugin, manual wallet credits, Creator Studio analytics, refined navigation and recommendation loading, and extensive playback and plugin reliability fixes.

Features

FeatureBehavior
Google IMA Player AdsChoose Google IMA per ad alongside Generic VAST, with official SDK lifecycle handling and managed pre-roll, mid-roll, and post-roll delivery.
Managed ad playbackGoogle-managed ad breaks support dynamic watch context, responsive and fullscreen rendering, autoplay and muted signals, controlled skipping, configurable timeouts, recovery, and cleanup.
Player Ads engine controlsAdministrators can select an ad engine, configure 3-30 second load timeouts, enter Google Ad Manager tags, and retain Generic VAST skip timing.
Advertising lifecycle coverageBackend and browser regression coverage protects VAST defaults, IMA tags, dynamic URLs, completion, skipping, no-fill, malformed tags, timeouts, duplicate requests, and cleanup.
Google AdSense pluginA standalone plugin provides validated publisher and ad-unit settings, responsive units, optional Auto ads, non-personalized requests, placement management, and no-fill hiding.
Manual wallet creditsAdministrators can credit any user wallet with a completed, auditable ledger transaction and an optional internal note.
Creator Studio AnalyticsCreators can select reporting periods, compare performance, inspect audience activity and quality, review content mix and publishing distribution, analyze top content, and export CSV data.

Added

  • Added Google IMA HTML5 SDK as a per-ad Player Ads engine alongside Generic VAST, with official AdDisplayContainer, AdsLoader, AdsRequest, and AdsManager lifecycle handling.
  • Added Google-managed pre-roll, mid-roll, and post-roll playback with dynamic watch-page context, responsive and fullscreen ad rendering, autoplay and muted-playback signals, Google-controlled skipping, configurable 3-30 second load timeout, playback recovery, and navigation cleanup.
  • Added Player Ads administration controls for Ad Engine and Ad Load Timeout, with an IMA-specific Google Ad Manager tag field and Generic VAST-only custom skip timing.
  • Added backend and browser-side lifecycle regression tests covering legacy Generic VAST defaults and parsing, IMA tag passthrough, dynamic description URLs, completion, skip, no-fill, malformed tags, timeout, duplicate requests, and cleanup.
  • Added a standalone Google AdSense 1.0.0 plugin with an admin-only settings and placement workspace, validated publisher and ad-unit identifiers, responsive display units, optional Auto ads bootstrap, non-personalized requests, and unfilled-unit hiding.
  • Added Admin Users action for manually crediting any user's wallet with an auditable completed ledger transaction and optional internal note.
  • Added a dedicated Creator Studio Analytics workspace with selectable reporting periods, audience activity charts, period comparisons, CSV export, audience quality metrics, content mix, publishing distribution, and creator-scoped top-content performance.

Changed

  • Kept uploaded content players mounted behind pending pre-rolls so IMA receives a stable content element and its interaction layer remains inside the Vidstack fullscreen surface.
  • Conditionally preloads Google's current production HTML5 IMA SDK only when Google IMA Player Ads are enabled.
  • Added inert hooks to unoccupied first-party website ad positions so enabled plugins can render policy-compliant ads directly in the page document without iframe injection.
  • Grouped enabled plugin administration workspaces beneath the Admin Plugins navigation item instead of displaying each extension as a top-level dashboard option.
  • Corrected the Channel Campaigns and Currency Manager plugin and author homepages, and raised Currency Manager's minimum PlayHub requirement to version 0.9.10.
  • Packaged Channel Campaigns 1.1.3 and Currency Manager 1.1.1 as installable plugin ZIP archives.
  • Redesigned the mobile bottom navigator as a compact, flat, edge-to-edge bar with no shadows, visible Upload or Sign in center-action text, and the configured accent color retained for its raised circular icon and active state.
  • Changed the watch-page Up Next list to show six recommendations initially and six more per explicit Load more action, removed scroll-triggered loading, and kept the complete recommendation panel pinned through its final item on large screens.
  • Changed watch-page comments to load the first 20 comments initially and fetch additional pages only from an explicit Load more comments button instead of page scrolling.
  • Moved the automatic scroll miniplayer to the bottom-left corner and reduced it to a compact 260px desktop width and 220px mobile width.
  • Delayed scroll miniplayer activation until at least 90% of the inline player is outside the viewport, with a separate restoration threshold to prevent boundary flicker.
  • Updated the Channel Campaigns plugin to version 1.1.2, replaced its generic trending-arrow navigation icon with a campaign megaphone, and retained its minimum PlayHub requirement of version 0.9.10.

Fixed

  • Ensured every recoverable IMA initialization, request, VAST, no-fill, media, manager, and timeout failure destroys the active ad state and returns viewers to normal content playback without exposing raw errors.
  • Fixed the automatic scroll miniplayer appearing and immediately disappearing, stopping the main video, or being dismissed during temporary media pauses caused by automatic quality changes.
  • Fixed the persistent navigation miniplayer overlapping the automatic scroll miniplayer by waiting for the watch-page player to finish its exit transition before completing the playback handoff.
  • Fixed VAST pre-roll ads leaving the player area invisible by retaining a stable 16:9 pending-ad surface and ignoring detached player instances during the ad transition.
  • Fixed the automatic scroll miniplayer switching while too much of the inline player was still visible.
  • Fixed enabled plugin providers loading before Laravel's database services were registered, which left plugin API routes, creator and administrator pages, navigation hooks, and sponsored placements unavailable.
  • Fixed plugin JavaScript and CSS delivery behind Nginx configurations that treat extension-ending application routes as missing static files.
  • Fixed manually deployed PlayHub versions being reported as an older completed database update, which incorrectly failed plugin compatibility checks.

Removed

  • Removed the scroll miniplayer volume slider while preserving click-to-mute and click-to-unmute controls.
  • Removed the Admin Dashboard shortcut from the website's left sidebar menu.
0.9.9 · Plugin platform, monetization, and playback

Version 0.9.9

Released September 4, 2026

Released September 4, 2026. A major platform release introducing plugins and transactional updates alongside new monetization, playback, discovery, administration, and mobile experiences.

Features

FeatureBehavior
Plugin API v1Trusted PHP service providers, lifecycle hooks, compatibility checks, migrations, encrypted settings, actions, filters, and namespaced pages provide a complete extension framework.
Admin Plugins workspaceAdministrators can install and update ZIP packages, configure plugins, run diagnostics, enable or disable extensions, and remove packages.
Hardened plugin packagesPlugin installation blocks traversal, symlinks, oversized archives, excessive files, unsafe file types, and server-control files with rollback-safe replacement.
Protected plugin assetsPlugins can declare CSS, JavaScript, modules, images, fonts, JSON, and WebAssembly through a protected delivery route and browser hook runtime.
Transactional system updaterSigned manifests, preflight checks, checksummed downloads, protected paths, backups, maintenance mode, database recovery, interruption monitoring, and rollback secure every update.
Standalone embed playerIframe embeds load only the requested video in a dedicated player instead of embedding the complete video-details page.
Searchable hashtags and mentionsHashtags open matching search results and mentions navigate to linked profiles in video comments, community posts, and community comments.
Paid community photo setsCreators can sell protected photo sets through wallet purchases with platform fees, taxes, permanent buyer access, and seller notifications.
Upload playlist selectionCreators can add a new video to any of their own playlists while completing the upload workflow.
Responsive mobile navigationMobile users receive header search and a fixed bottom navigator with animated active states, guest login behavior, and role-aware Live and Profile actions.
Currency-aware account balanceThe account menu displays wallet balances in the selected currency and provides direct access to Earnings.
Default website languageAdministrators can choose the website default language while preserving each visitor's saved language preference.
Language availability controlsWebsite languages can be enabled or disabled with public catalog enforcement and safeguards that protect the default language.
Community post permissionsPost authors, community owners, platform moderators, and administrators can remove community posts according to their role.
Localized Admin PagesAdministrators can manage localized About, Contact, Developers, FAQ, Help, Refund, Privacy, Terms, and Cookie pages with sections, visibility, footer, search, and sitemap controls.
Localized email templatesEvery system email can be edited, previewed, validated, and reset across installed languages using documented placeholders and update-safe overrides.
Automatic scroll miniplayerActively playing watch-page videos float when less than half visible and return inline on pause, completion, or viewport return.
Persistent in-tab playbackVideos continue across navigation and reloads with a responsive minimized player, queue controls, seek, mute, source refresh, full-player handoff, and Media Session support.
Homepage and Shorts recommendationsDeterministic recommendations combine freshness, engagement quality, momentum, exploration, viewer affinities, watch completion, and creator and category diversity.
Plugin Admin workspacesPlugins can register namespaced Admin workspaces with authenticated requests, navigation, confirmation and alert dialogs, and deterministic cleanup.
Creator tips and donationsViewers can support creators from channels and video pages using wallet-backed contributions with opt-out controls, limits, fees, idempotent transfers, and notifications.
Paid video salesCreators can price videos for wallet purchase with platform commission, permanent buyer access, protected playback, purchase notifications, and a Purchased library.
Branded HTML emailResponsive system email uses the configured website name and accent colors with plain-text alternatives for SMTP, SendGrid, and native mail delivery.
Watch-page video deletionCreators, moderators, and administrators can delete eligible videos from the watch page through a confirmed action.
Purchase tax controlsAdministrators can configure VAT, GST, and Sales Tax for paid videos with buyer-visible totals and auditable tax records.
Mention autocompleteVideo and community composers support mention suggestions, keyboard selection, linked rendering, and preference-aware notifications.
Signup audit dataImmutable signup IP and registration-source data is recorded with admin-only IP visibility in user management.
AirPlay and Google CastFeature-detected casting is available for on-demand videos and live replays with Safari permissions and resumable default-receiver sessions.
Configurable route loadingAdministrators can choose a top loading bar, loading text, or both while each destination completes its initial content requests.
Withdrawal approval workflowAdministrators can approve or reject withdrawals with protected decisions, reviewer audit data, creator notifications, and pending alerts for moderators.
Social sharing previewsVideos, Shorts, live streams, channels, community posts, and playlists receive server-rendered Open Graph and X cards with original artwork or a branded fallback.
Timestamped video descriptionsFormatting, Unicode, and emoji are preserved while clickable minute and hour timestamps seek the active player.
Automatic player chaptersValid timestamped descriptions generate segmented seek bars, active titles, chapter navigation, and cover previews through native Vidstack tracks.
SEO and Sitemaps workspaceAdministrators control metadata, canonical origin, verification, indexing policies, robots rules, social and structured data, and paginated content sitemaps.
Managed video chaptersCreators and administrators can import CUE files or timestamp lists, review unnamed duration-based segments, validate chapter data, and opt videos into native timeline chapters.
Community poll votersClickable vote counts open a paginated dialog showing each voter's public profile and selected option.
YouTube chapter importImported videos can collect chapters from native player markers or timestamped descriptions for editable Step 4 review with explicit opt-out.
Rich description formattingVideo descriptions safely render bold, italic, combined emphasis, external links, and original text layout.
Admin live-stream deletionAdministrators can confirm deletion of live streams together with active sessions, replays, related records, and media.
Automatic Up Next loadingThe watch page loads additional Up Next recommendations near the end of the list while retaining the manual Show more control.
Imported Shorts detectionYouTube Shorts signals and verified portrait metadata from other providers identify imported short-form videos automatically.
Publishing access controlsAdministrators can define upload and live role rules, strict username allowlists, timed restrictions, and profile-complete creator upgrades.
Contextual video recommendationsRelated and Up Next results combine the current channel, category, language, and tags with private watch history, likes, saved videos, and subscriptions.
Video boost campaignsCreators can promote videos with reserved wallet budgets, daily and event billing, paced relevant placement, qualified-event deduplication, reporting, and admin-defined limits.
Creator Studio earningsCreators can review VAST, tip, video sale, and live revenue with source filters, fees, balances, supporter and content details, pagination, and notifications.
Draggable desktop miniplayerThe minimized player remembers bounded desktop positioning and supports resize compatibility, keyboard movement, and recovery after viewport changes.
Persistent theater modeThe watch page includes a remembered desktop theater layout with native player and keyboard controls, expanded playback, and responsive Up Next placement.

Added

  • Added PlayHub Plugin API v1 with trusted PHP service providers, lifecycle hooks, dependency and compatibility checks, migrations, encrypted plugin settings, server-side actions and filters, and namespaced website and Admin Panel pages.
  • Added an Admin Plugins workspace for ZIP installation and updates, configuration, diagnostics, enable and disable controls, and package removal.
  • Added hardened plugin package handling with traversal, symlink, archive-size, file-count, file-type, and server-control-file protections plus rollback-safe package replacement.
  • Added declared plugin CSS, JavaScript, module, image, font, JSON, and WebAssembly assets with a protected delivery route and browser hook runtime.
  • Added a transactional system updater with signed manifests, preflight checks, protected paths, checksummed downloads, backups, maintenance mode, database recovery, interruption monitoring, and rollback.
  • Added a standalone iframe-safe video player that embeds only the requested video rather than the complete video-details page.
  • Added searchable #hashtag support and linked @mention profile navigation in video comments, community posts, and community comments.
  • Added paid community photo sets with protected original media, wallet purchases, platform fees, tax support, permanent buyer access, and seller notifications.
  • Added playlist selection from the creator's own playlists during video upload.
  • Added a responsive mobile header search and fixed bottom navigator with animated active-item movement, guest login behavior, and Live/Profile availability rules.
  • Added selected-currency wallet balances and an Earnings destination to the account menu.
  • Added a default website language control to Admin Languages while preserving each visitor's saved language preference.
  • Added enable and disable controls for website languages, with public catalog enforcement and default-language safeguards.
  • Added community post removal permissions for post authors, community owners, platform moderators, and administrators.
  • Added localized Admin Pages management for About, Contact, Developers, FAQ, Help, Refund, Privacy, Terms, and Cookie pages, with repeatable content sections, visibility controls, footer integration, search metadata, and sitemap filtering backed by atomic override storage.
  • Added a localized Admin Email Templates workspace for editing, previewing, validating, and resetting every system-generated email across all installed languages, with documented template-specific placeholders and update-safe override storage.
  • Added an automatic scroll miniplayer on video watch pages that floats actively playing videos below 50% visibility and restores them inline on pause, end, or return without activating persistent playback.
  • Added persistent in-tab video playback across website navigation and reloads, with a responsive minimized Vidstack player, previous/next queue controls, seek, mute, full-player handoff, secure source refresh, and browser Media Session integration.
  • Added a deterministic homepage and Shorts recommendation algorithm combining freshness, engagement quality, momentum, daily exploration, viewer affinities, completed-watch suppression, and creator/category diversity.
  • Added namespaced Admin workspace registration to Plugin API v1, including authenticated requests, navigation, confirmation and alert dialogs, and deterministic mount cleanup.
  • Added wallet-backed creator tips and donations to channel profiles and video details, with creator opt-out controls, contribution limits and fees, idempotent transfers, and creator notifications.
  • Added admin-managed paid video sales with creator pricing, wallet purchases, platform commission, permanent buyer access, protected playback links, purchase notifications, and a Purchased library.
  • Added a responsive branded HTML email template using the configured website name and accent colors, with plain-text alternatives across SMTP, SendGrid, and native mail delivery.
  • Added a confirmed watch-page video deletion action for video creators, moderators, and administrators.
  • Added admin-configurable VAT, GST, and Sales Tax for paid video purchases with buyer-visible totals and auditable tax records.
  • Added @mention autocomplete, keyboard selection, linked mention rendering, and preference-aware notifications for video comments, community posts, and community comments.
  • Added immutable signup IP and registration-source tracking with admin-only IP visibility in user management.
  • Enabled feature-detected AirPlay and Google Cast controls for on-demand videos and live replays, including Safari media permission and resumable default-receiver sessions.
  • Added an Admin Website Configuration control for choosing a top loading bar, loading text, or both while each destination finishes its initial content requests.
  • Added an admin withdrawal approval workflow with protected approve and reject decisions, auditable reviewer metadata, creator status notifications, and pending-request alerts for administrators and moderators.
  • Added server-rendered Open Graph and X card previews for videos, Shorts, live streams, channels, community posts, and playlists, with original artwork and a branded 1200x630 fallback image.
  • Added formatting-preserving video descriptions with Unicode and emoji-safe rendering plus clickable m:ss and h:mm:ss timestamps that seek the active player.
  • Added automatic YouTube-style player chapters for valid timestamped descriptions, with a segmented seek bar, active song titles, chapter navigation, and cover previews powered by Vidstack's native track APIs.
  • Added an Admin SEO & Sitemaps workspace with persistent search metadata, canonical origin and verification controls, per-content indexing policy, dynamic robots rules, route-synchronized Open Graph/X/JSON-LD metadata, and paginated database-backed page, video, Short, channel, playlist, image, and live-stream sitemaps.
  • Added admin-controlled video chapters with CUE and timestamp-list import, duration-based unnamed segment review, per-video opt-in, validated chapter storage, and native Vidstack timeline playback.
  • Added clickable community poll vote counts with a paginated voter dialog showing each voter's public profile and selected option.
  • Added automatic YouTube chapter import from native player markers or timestamped descriptions, with editable Step 4 review and explicit opt-out.
  • Added safe inline bold, italic, and combined emphasis rendering plus clickable external links in video descriptions while preserving original text layout.
  • Added confirmed live-stream deletion to the Admin Live Streams row menu with active session, replay, related record, and media cleanup.
  • Added automatic paginated loading near the end of the watch-page Up Next list while retaining the manual Show more control.
  • Added provider-aware Shorts detection for imported videos using YouTube's Shorts signal or verified portrait metadata from other providers.
  • Added admin-managed publishing access with upload and live role rules, a strict username allowlist, timed per-user restrictions, and profile-complete self-service creator upgrades for new User accounts.
  • Added contextual Related and Up Next video recommendations that combine the current video's channel, category, language, and tags with each signed-in viewer's private watch history, likes, saved videos, and subscriptions.
  • Added wallet-backed video boost campaigns with daily, per-click, and per-view billing, reserved budgets, paced relevance-aware placement in Home and Trending, qualified event deduplication, creator controls and reporting, promoted labels, and administrator-defined limits.
  • Added a Creator Studio earnings cabinet with creator-scoped VAST, tip, video sale, and live revenue transactions, source filters, fees, balances, supporter and content details, pagination, and complete creator notifications for tips, purchases, and channel subscriptions.
  • Added persisted desktop drag positioning to the minimized video player with viewport bounds, resize compatibility, keyboard movement, and automatic recovery after viewport changes.
  • Added a persistent desktop theater mode to the video watch page with a native player toggle, keyboard controls, expanded playback, and responsive Up Next placement.

Changed

  • Added section navigation to Admin System Settings and changed settings to persist only from explicit Save actions.
  • Changed the default website theme from dark to light for fresh visitors and new users while preserving saved preferences.
  • Redesigned Admin Dashboard statistics and increased compact-interface typography so application text does not render below 11.5px.
  • Redesigned the edge-to-edge mobile bottom navigator with a raised central action and sliding active-state transition.
  • Updated the mobile header to hide and reveal with the bottom navigator based on scroll direction.
  • Updated the account dropdown to use full-width square rows, a more subtle scrollbar, and the selected-currency wallet balance.
  • Updated all remaining legacy violet accents to follow the active UI accent color.
  • Replaced engagement-event video payouts with completed VAST ad revenue sharing, using VAST CPM metadata or an administrator-defined fallback CPM, a configurable creator percentage, fractional earnings accrual, self-view exclusion, hourly impression deduplication, and idempotent wallet credits.
  • Updated the video player context menu to use an 88% translucent black surface with compact corners, refined border and shadow styling, and a full-height accent rail.
  • Increased Earnings page content typography for clearer revenue summaries, filters, transaction details, and pagination.
  • Refined shared video previews with a minimal white play icon on a black circular background at 75% opacity.

Fixed

  • Fixed embedded-player source initialization and playback outside the PlayHub application shell.
  • Fixed persistent miniplayer controls indicating playback after navigation when media was paused or detached.
  • Fixed mobile header, player, action, and page layouts overflowing narrow viewports.
  • Fixed mobile search icon sizing, responsive input collapse, and right-side alignment before Messages.
  • Fixed community and comment mentions opening search instead of the mentioned channel profile.
  • Fixed comment hashtags not linking to hashtag search results.
  • Fixed video uploads lacking an owned-playlist selector.
  • Fixed light-theme surfaces retaining dark native scrollbars.
  • Fixed Admin Panel settings saving when a field received focus.
  • Replaced the bootstrap "Loading PlayHub" message with a route-aware loading experience that reaches 100% before revealing completed page content.
  • Fixed live stream recordings reserving black replay tiles for connected viewers and invited guests who did not publish audio or video.
  • Removed Shorts from the standard video player's Up Next suggestions and autoplay sequence.
  • Made the login identifier label follow the enabled email, username, and phone methods, with all three enabled on fresh installations.
  • Replaced hardcoded PlayHub branding in emails, SMS messages, public copy, sharing metadata, and visible interface text with the configured website name.
  • Added configurable VAST pre-roll, timed mid-roll, and post-roll ad breaks to the watch-page player.
  • Prevented Shorts from being configured or treated as paid videos.
  • Fixed profile and search pages crashing while creator tip settings are loading.
  • Fixed the left sidebar showing public playlists from other creators instead of only the signed-in creator's playlists.
  • Fixed S3 video and thumbnail requests reusing cached redirects after their temporary cloud URLs had expired.
  • Fixed iPhone playback stalls by prioritizing compatible processed renditions, supporting Safari MP4 suffix byte ranges, preserving direct tap-to-play activation, eagerly loading metadata, and constraining the mobile player to a stable 16:9 layout.
  • Kept the current page visible during route loading and replaced it only after the destination content is ready when using the top loading bar.
  • Fixed creator profile cover editing so selected images remain local previews until Save and Cancel leaves no uploaded file behind.
  • Fixed comment composers, comments, replies, and Studio comment rows showing default avatars instead of user profile avatars.
  • Added confirmation before deleting comments or replies from comment panels, Creator Studio, and comment moderation.
  • Added confirmation before reporting comments or replies from comment panels and Creator Studio.
  • Fixed the Creator Studio Content summary sidebar overlapping the content table on smaller desktop screens.
  • Fixed single community images expanding beyond the post layout by constraining their width and viewport height without cropping them.
  • Fixed uploads automatically selecting the first category; new local and imported videos now require an explicit category choice from a default "-" option.
  • Improved YouTube provider imports to populate description and tags using consent-aware page metadata and structured fallbacks when the Data API response is unavailable.
  • Fixed upload and video-edit tag inputs retaining committed tag text after rendering the tag chip.
  • Fixed tag-chip remove buttons showing a nested hover block instead of a stable X hover state.
  • Fixed upload-form required markers appearing between field labels and character counters instead of beside their labels.
  • Removed the Not Interested action from the creator's own video menu.
  • Preserved video-description line breaks while filtering hashtag tokens already represented in the separate video tag block.
  • Fixed YouTube chapter imports when standard watch pages are rate-limited by using the first-party player metadata fallback and parsing native player markers from current response locations.
  • Moved hashtags from imported YouTube descriptions into the Tags field while preserving description formatting and removing empty hashtag-only lines.
  • Fixed the watch-page Autoplay alignment and increased the initial Up Next recommendation batch.
  • Fixed fractional seconds appearing in duration labels and added a persistent, constrained desktop resize control to the minimized player.
  • Fixed minimized-player resizing with window-wide drag tracking, persistent sizing, and a click-to-toggle compact or expanded size.
  • Fixed long Creator Studio Content video titles expanding table rows by clamping them to three lines with an ellipsis.
  • Fixed theater mode moving Up Next below the player; recommendations now remain in the right sidebar while the main navigation yields more player width.
  • Fixed the header hamburger behavior in theater mode so it exits theater and opens the left navigation in one action.
  • Fixed the automatic scroll mini-player so it only appears during active playback, suppresses its context menu, and closes without creating a persistent mini-player when navigating away.
  • Smoothed automatic scroll mini-player transitions and prevented flicker when scrolling near the activation boundary.
  • Fixed the Shorts detail player exceeding the viewport while preserving its 9:16 aspect ratio across desktop and mobile screens.
  • Removed the LightGallery production-license warning by replacing the unlicensed runtime with PlayHub's native image viewer while preserving gallery controls and responsive navigation.
  • Fixed shared video and Shorts previews by adding a centered play indicator to their Open Graph images on WhatsApp and other social platforms.
  • Fixed Vidstack pause and navigation teardown races that caused detached-player exceptions on watch pages, Shorts, and the persistent miniplayer.
  • Isolated livestream media and sticker test fixtures from installation files so the full test suite runs against temporary storage.

Removed

  • Removed the unlicensed LightGallery dependency and replaced it with PlayHub's native responsive image viewer.
  • Removed the mobile header theme switcher.
  • Removed the duplicate Go Live action from the header while retaining the sidebar action.
  • Removed the sidebar user summary card.
  • Removed the obsolete Admin System Settings collapse control.
  • Removed the Product license heading and instructional paragraph from setup while preserving license verification.

Deprecated

  • No public PlayHub APIs are deprecated in v0.9.9.
0.7.5 · Production package and installer

Version 0.7.5

Current release

A distribution-ready release focused on installation reliability, licensing, language management, backups, and first-run operations.

Features

FeatureBehavior
Four-step web installerRequirements, configuration, live installation console, and completion are presented as a guided production workflow.
Full server readiness scanPHP, extensions, Redis, Node, npm, FFmpeg, Docker, storage, HTTPS, and disk capacity are checked before install.
Live dependency consoleThe installer streams real npm, Vite, migration, catalog import, and administrator provisioning output.
Owner account provisioningInstallation creates a verified owner account and channel without exposing credentials in the console.
Language file managerAdministrators can select, edit, and save any of the bundled language packs from the dashboard.
Configurable system backupsDatabase, source, media, and selected folders can be measured, selected, archived, and scheduled.
Bundled catalog restorationGifts, stickers, logo, and favicon remain available as core package content after a clean installation.

Improved

  • Installer errors now expose actionable process output instead of a generic failed state.
  • Production assets are built from the locked dependency graph for repeatable deployment.
  • Backup summary, cron inventory, and recent system changes use real runtime information.

Fixed

  • Resolved npm binary and open_basedir detection issues in restricted PHP-FPM environments.
  • Prevented incomplete installs from reporting success before Vite and database verification finish.
  • Removed empty demo states from first-run discovery sections.

Security

  • Signed license receipts and installation locks are stored outside public media paths.
  • Passwords and service secrets are redacted from the streamed installer console.
0.7.4 · Trust, reporting, and operations

Version 0.7.4

Operations release

Platform-wide reporting, real administrative actions, account lifecycle tools, and customer-facing profile workflows.

Features

FeatureBehavior
Unified report workflowProfiles, videos, comments, and community content share a real report dialog and moderation pipeline.
Report bulk actionsModerators can select reports and apply status, assignment, priority, or resolution actions in one operation.
Real reported-item mediaAdmin reports display the actual profile avatar, video thumbnail, or content preview associated with the report.
Permanent user deletionAdministrators can remove an account completely and optionally delete all videos owned by that user.
Roles and permissionsAdmin roles, permission groups, team members, invitations, scopes, and status controls are operational.
Channel favoritesViewers can favorite channels and open a dedicated favorites collection from the profile menu.
Direct profile messagingThe profile Message action opens the real private conversation instead of a local composer placeholder.
Public playlist navigationPlaylist cards and titles open their respective public playlist pages across the website.

Improved

  • Admin creators, reports, support, and monetization pages now read database-backed metrics and actions.
  • Profile action menus use consistent icons and responsive bottom-sheet behavior.
  • Search and library layouts align metadata, verified badges, and side content consistently.

Fixed

  • Fixed report, message, and playlist controls that previously behaved as visual-only demonstrations.
  • Fixed mobile community action sheets reopening after every touch.
  • Fixed verified badges and subscriber counts wrapping onto incorrect rows.

Security

  • Moderator and ban events can send account notifications and configured email notices.
  • Destructive account removal requires explicit confirmation and optional media-deletion consent.
0.7.3 · Monetization and creator support

Version 0.7.3

Commerce release

Wallet payments, gifts, super stickers, advertising, and real monetization analytics for creators and operators.

Features

FeatureBehavior
Live gift catalogAdministrators can add, price, update, paginate, and delete locally stored gifts used during live streams.
Super sticker catalogCategorized stickers work in live streams and comments with scrolling pagination and local file management.
Instant tipsPreset coins send their amount immediately while the custom coin opens a validated amount dialog.
Wallet top-upsStripe or PayPal checkout opens in a new tab and returns confirmed funds to the viewer wallet.
Contribution animationsTips, gifts, and stickers animate in real time for hosts, participants, and viewers based on value.
Advertising managerHTML and media ads can target sidebars, headers, footers, feeds, videos, and comments with date controls.
Revenue analyticsMemberships, creator earnings, commission, gifts, and tips are represented by real transactions and source totals.
Replay contributionsGifts, tips, stickers, and super chats are stored as stream events and displayed again in replay context.

Improved

  • Gift and tip selections now send immediately when the wallet has enough balance.
  • Sticker categories and pagination prevent loading the complete catalog at once.
  • Revenue by Source adapts cleanly to narrow admin dashboard panels.

Fixed

  • Fixed frozen recharge dialogs after checkout tabs were closed.
  • Fixed missing spacing between usernames and contribution activity text.
  • Fixed gift dropdown placement and mobile presentation.
0.7.2 · Multi-participant live and replay

Version 0.7.2

Live collaboration release

A complete guest participation lifecycle, live moderators, composited recordings, and richer replays.

Features

FeatureBehavior
Participant join requestsViewers request audio-only or audio-and-video participation and wait for host approval in real time.
Multi-participant roomsAccepted guests publish inside the same room with responsive host and participant layouts.
Per-stream moderatorsHosts can appoint moderators who manage chat, bans, participant requests, and participant removal.
Participant system eventsChat records when participants join, leave, or are removed by the host or moderator.
Live polls with votersPolls publish to every live role while only the host can inspect each voter and selected option.
Functional layout presetsAdaptive grid, host focus, split screen, and screen-share arrangements update the live stage.
Composited replay identityRecorded multi-participant layouts display each participant name in the corresponding video tile.
Audio-only replay designAudio participants receive a polished avatar, identity, and audio state instead of an empty black tile.
Cloud replay replicationCompleted replay media is uploaded to the configured cloud disk while retaining storage metadata.

Improved

  • Host and viewer stage alignment now uses the same participant geometry.
  • Replay players preserve full parent width while respecting portrait and landscape media.
  • Reconnect logic automatically republishes camera and microphone tracks after page reload.

Fixed

  • Fixed participants appearing as Guest instead of their real account name.
  • Fixed black host previews after reconnecting a resumed live session.
  • Fixed replay overlays remaining stuck on Connecting to the recording room.
0.6.8 · Interaction and action system

Version 0.6.8

Experience release

Consistent menus, dialogs, icon actions, responsive sheets, and functional content controls across the public application.

Features

FeatureBehavior
Shared dropdown systemVideo, replay, profile, comment, and community actions reuse the same accessible dropdown patterns.
Mobile bottom sheetsAction menus adapt into touch-friendly bottom sheets with stable close behavior on small screens.
Custom confirmation dialogsDestructive and sensitive actions use branded application dialogs instead of browser confirm prompts.
Watch later actionsVideos can be added to or removed from Watch Later through matching clock-based actions.
Pin and unpin controlsProfile videos expose clear pin states and correctly paired pin or unpin icons.
Responsive toast placementDesktop notifications retain their position while mobile toasts become top-aligned and full-width.

Improved

  • Active navigation, accent color, and theme state are synchronized throughout public and admin surfaces.
  • Select controls use compact containers without duplicated borders or heavy placeholder shells.
  • Action icons now communicate distinct concepts for favorites, likes, live content, and subscriptions.

Fixed

  • Fixed dropdowns opening behind video players and adjacent content.
  • Fixed sticky replay tabs creating oversized mobile layouts.
  • Fixed several active buttons using inconsistent gradient backgrounds.
0.6.7 · Live discovery and configuration

Version 0.6.7

Live discovery release

Stream browsing, tags, pre-live configuration, diagnostics, and discoverable live metadata.

Features

FeatureBehavior
Live stream tagsHosts add comma-separated tags before going live and viewers can use them to open matching search results.
Pre-live settings dialogStreamers review and update title, required description, category, tags, participation, and recording options.
In-stream settingsThe host can change supported stream settings without ending the active broadcast.
Stream diagnosticsLive bitrate, frame rate, latency, source state, tracks, network quality, and service status are inspectable.
Live browse pageCurrent streams and past replays use real category filters, sorting, and grid or list presentation.
Trending replay topicsReplay discovery topics are generated from real published replay data rather than demo content.

Improved

  • Go Live is available from the authenticated sidebar and displays missing-runtime requirements clearly.
  • Host preview audio is muted locally without muting the published stream.
  • Goal bars and polls update immediately when created during an active stream.

Fixed

  • Fixed stream reconnect using GET against a POST-only activation route.
  • Fixed tags remaining a single text value instead of individual tokens.
  • Fixed viewer live layouts leaving excessive empty space below the player.
0.6.6 · Replay experience

Version 0.6.6

Replay release

A complete replay page with adaptive playback, chat replay, chapters, moments, analytics, and creator context.

Features

FeatureBehavior
Adaptive replay playerReplay media fits its parent while portrait and landscape sources preserve their intended composition.
Chat replayVisible live messages, system events, and contributions return at their recorded replay timestamps.
Replay chaptersOpening, midpoint, highlights, and wrap-up chapters seek the player to exact moments.
Top momentsReplay events surface meaningful checkpoints, gifts, and stream milestones with thumbnails.
Replay analyticsViews, likes, comments, gifts, peak viewers, and performance actions are available to the creator.
Replay action menuShare, copy, save, watch later, playlist, report, and owner actions use the common menu system.
More from creatorRelated replays present real thumbnails, descriptions, duration, views, and creator navigation.

Improved

  • Replay visuals inherit the stream theme and accent used before going live.
  • Replay cards include two lines of description without creating oversized empty space.
  • Notifications distinguish the host, an interacting viewer, and a participant when a replay becomes ready.

Fixed

  • Fixed replay pages opened from profile Live returning a server error.
  • Fixed the recording-room overlay being burned into completed replay video.
  • Fixed mobile overview navigation remaining heavily fixed during scroll.
0.6.5 · Live streaming foundation

Version 0.6.5

Streaming release

Browser and RTMP streaming, control room workflows, live chat, invitations, recording, and host operations.

Features

FeatureBehavior
Browser broadcastingHosts publish camera, microphone, and screen-share tracks with role-aware local controls.
RTMP ingressExternal encoders receive a real LiveKit-backed RTMP URL and unique stream key.
Live control roomHosts manage participants, backstage invitations, layout, spotlight, screen share, polls, and settings.
Guest invitationsUsername suggestions find real users and send a live guest invitation with confirmation.
Live chatViewers, hosts, participants, and moderators exchange real-time messages and reactions.
Composite recordingRoom recording captures the configured layout for processing into an on-platform replay.
Automatic reconnectReloaded control rooms attempt a safe session reconnect before displaying a manual action.

Improved

  • The host stream and guest streams use a consistent adaptive stage geometry.
  • Live cards use real viewer counts, status, thumbnails, category, and description.
  • Streaming status messages avoid exposing infrastructure provider names to public viewers.

Fixed

  • Fixed missing live-stream thumbnails when starting a broadcast.
  • Fixed local host playback producing duplicate audio.
  • Fixed the control room host identity overlay covering the video.
0.6.4 · Profile library

Version 0.6.4

Library release

Personal library navigation, private-state handling, collections, and channel-side information architecture.

Features

FeatureBehavior
Profile library tabChannel profiles expose a dedicated Library tab with owner-aware private states.
Saved content collectionsLiked videos, watch later, playlists, history, bookmarks, and favorites use distinct destinations.
Channel information railAbout details, joined date, videos, subscribers, views, likes, and comments appear in a stable side rail.
Profile search controlThe profile navigation search icon opens channel-scoped search instead of acting as decoration.

Improved

  • Library content and the profile information rail align correctly across wide and narrow screens.
  • Empty private libraries use concise states rather than large blank containers.

Fixed

  • Fixed the profile library sidebar appearing on the wrong side.
  • Fixed duplicate heart icons for favorites and liked videos.
0.6.2 · Unified search

Version 0.6.2

Search release

Database-backed search results for videos, channels, playlists, live streams, and creator tools.

Features

FeatureBehavior
Global search resultsVideos, channels, playlists, categories, and live content are returned from real database queries.
Creator Studio searchStudio search filters real creator content, comments, playlists, and channel data.
Live profile searchThe Live tab can search its current streams and replays without losing the active profile context.
Search result actionsResult menus open the same share, playlist, report, and save workflows used elsewhere.

Improved

  • Video titles, creator names, verified badges, and metadata share a consistent left alignment.
  • Channel results keep names and verification in one row while omitting redundant handles.

Fixed

  • Fixed category changes leaving Trending videos in an infinite skeleton state.
  • Fixed search titles beginning a few pixels before their related metadata.
0.6.1 · Profile actions

Version 0.6.1

Interaction release

Functional subscription, share, block, report, notification, edit, and channel relationship actions.

Features

FeatureBehavior
Subscription controlsSubscribe and unsubscribe update the relationship and subscriber count in place.
Profile overflow menuCopy, share, edit, mute, favorite, report, and block actions respect account permissions.
Verified identity systemThe shared verified mark renders consistently beside account names across public and admin screens.
Channel social linksConfigured Instagram, YouTube, Twitch, Facebook, TikTok, and LinkedIn links appear on profiles.

Improved

  • Interactive button states now share the active accent and avoid layout shifts.
  • Subscriber metadata aligns with the creator name rather than the avatar edge.

Fixed

  • Fixed verified badges wrapping beneath names on video and channel pages.
  • Removed stray numeric profile output when the related value was empty.
0.6.0 · Profile design system

Version 0.6.0

Profile release

Responsive creator identity, cover media, channel navigation, metadata, and content sections.

Features

FeatureBehavior
Creator profile headerCover media, avatar, identity, verification, subscriber count, and actions form one responsive header.
Channel navigationHome, Videos, Live, Playlists, Shorts, Community, About, and Library are first-class profile tabs.
Channel statisticsViews, likes, comments, total length, joined date, and publishing counts use real data.
Profile owner controlsChannel owners receive edit and management actions without exposing them to visitors.

Improved

  • Icon and text alignment remains stable at mobile, tablet, and desktop widths.
  • Long channel names and descriptions truncate gracefully without overlapping actions.

Fixed

  • Fixed profile content spacing after empty category or biography values.
  • Fixed channel search and dropdown controls using inconsistent hit areas.
0.5.9 · Guided upload wizard

Version 0.5.9

Publishing release

A staged creator upload flow with metadata, validation, scheduling, checks, and playback preview.

Features

FeatureBehavior
Upload stepsFile, details, visibility, checks, and publish stages give creators a clear upload path.
Chunked uploadsLarge media uploads resume through configurable chunk sessions with progress feedback.
Real tag inputCreators enter individual tags with limits, duplicate prevention, and removable tokens.
Schedule publishingA native date and time input keeps videos private until their configured release.
Upload previewThumbnail, title, progress, duration, and timeline provide a stable pre-publish preview.

Improved

  • Upload limits, categories, languages, and configured renditions are loaded from backend settings.
  • Required descriptions and validation messages are clear before publication.

Fixed

  • Fixed numeric rendition arrays merging with stale defaults.
  • Fixed upload controls resizing while dynamic status content changed.
0.5.8 · Expanded profile tabs

Version 0.5.8

Channel content release

Dedicated profile content for live streams, playlists, Shorts, communities, about information, and libraries.

Features

FeatureBehavior
Profile Live tabActive streams and past replays use real cards, status, descriptions, categories, and owner actions.
Profile Playlists tabPublic playlist collections are available to visitors and navigate to the selected playlist.
Profile Shorts tabVertical videos have a dedicated channel surface with creator metadata.
Profile Community tabChannel posts, media, polls, comments, and reactions are available from the creator profile.
Profile About tabBiography, details, links, and channel facts are organized in a dedicated view.

Improved

  • Tab state is reflected in navigation and responsive layouts.
  • Live cards use descriptions when present and fall back to creator identity when empty.

Fixed

  • Fixed excessive white space between live descriptions, category, and card actions.
  • Fixed Live tab search remaining inactive.
0.5.7 · Profile video management

Version 0.5.7

Video profile release

Channel video cards, pinning, deletion, watch actions, metadata, and responsive grids.

Features

FeatureBehavior
Channel video gridPublished videos use real thumbnails, duration, title, views, age, and creator metadata.
Pinned profile videoChannel owners can pin or unpin a selected video from the overflow menu.
Owner video actionsEdit, playlist, share, copy, watch later, report, and delete actions respect ownership.
Profile video deletionDeletion moves into the standard overflow menu with a custom confirmation dialog.

Improved

  • Video cards maintain stable image ratios and action placement across breakpoints.
  • Metadata uses consistent icons and hierarchy throughout profile and search lists.

Fixed

  • Fixed delete actions occupying a full duplicate button row.
  • Fixed unpin and watch-later actions using unrelated icons.
0.5.6 · Creator profile foundation

Version 0.5.6

Identity release

Creator channels, cover positioning, biographies, categories, social links, and audience actions.

Features

FeatureBehavior
Automatic creator channelsRegistration creates a creator channel with an editable identity and unique slug.
Cover positioningCreators upload and position responsive channel cover media.
Channel biographyA formatted creator description and About content introduce the channel.
Creator categoryChannels associate with a content category used by discovery and profile metadata.
Profile audience actionsVisitors subscribe, share, message, favorite, report, or block from the channel header.

Improved

  • Avatar fallback initials and verified identity display consistently.
  • Profile content uses compact, readable typography rather than oversized presentation text.

Fixed

  • Fixed cover and avatar media distorting on narrow viewports.
  • Fixed channel actions overlapping long creator names.
0.5.5 · Studio stability

Version 0.5.5

Quality release

Responsive Creator Studio tables, side summaries, dropdown containment, and operational content states.

Features

FeatureBehavior
Responsive content tableStudio content changes from a dense desktop table to readable mobile rows without losing actions.
Performance summariesViews, comments, visibility, monetization, status, and recent performance remain visible in context.
Stable action menusStudio dropdowns stay within the viewport and above neighboring panels.
Content status systemPublished, replay, draft, scheduled, and processing states use distinct real statuses.

Improved

  • Studio side content remains aligned and contained at intermediate widths.
  • Tables preserve minimum dimensions so labels and actions cannot shift the layout.

Fixed

  • Fixed recent comment dropdowns being clipped by their parent panel.
  • Fixed side cards overflowing the Creator Studio content grid.
0.5.3 · Studio content management

Version 0.5.3

Content release

Searchable creator content, bulk selection, filters, visibility, monetization, scheduling, and performance tools.

Features

FeatureBehavior
Content inventoryCreators see videos, Shorts, live replays, drafts, and scheduled content in one inventory.
Content searchSearch filters the creator content collection using real titles and metadata.
Content filtersType, visibility, monetization, status, and date controls narrow the content table.
Bulk content selectionCheckbox selection prepares multi-item creator actions without changing table dimensions.
Recent performanceTop content and compact performance indicators summarize channel activity.

Improved

  • Creator content actions share the public video action language and iconography.
  • Mobile content rows retain important metadata while hiding redundant table labels.

Fixed

  • Fixed Studio search returning demonstration rows instead of creator data.
  • Fixed action columns becoming inaccessible on narrow screens.
0.5.2 · Video upload pipeline

Version 0.5.2

Media release

Validated uploads, FFmpeg media processing, thumbnails, renditions, captions, import metadata, and storage controls.

Features

FeatureBehavior
Validated media uploadFile type, extension, MIME, size, checksum, and ownership are validated before processing.
FFmpeg renditionsConfigured output qualities create playback-ready renditions with real media metadata.
Thumbnail generationUploads create and store video thumbnails with owner-provided thumbnail support.
Caption storageCreators can attach supported caption files and expose them during playback.
Video import metadataYouTube, Vimeo, Dailymotion, and direct URL imports retain source details and status.
Local and S3 storageMedia storage can use the server disk or a configured S3-compatible provider.

Improved

  • Processing jobs use a dedicated videos queue and production timeouts.
  • Upload settings control file limits, chunk size, default quality, and output renditions.

Fixed

  • Fixed uploads being marked ready before media conversion completed.
  • Fixed thumbnail failures leaving incomplete content records.
0.5.1 · Creator Studio

Version 0.5.1

Creator release

A focused operating surface for channel analytics, recent comments, content, publishing, and creator actions.

Features

FeatureBehavior
Studio dashboardCreators receive channel metrics, recent performance, comments, publishing actions, and shortcuts.
Recent commentsReal comments display creator, text, video thumbnail, age, and a functional action dropdown.
Channel analyticsViews, watch time, subscribers, content, and engagement metrics summarize channel activity.
Creator quick actionsUpload, go live, manage content, comments, playlists, and channel settings are directly accessible.

Improved

  • Operational information uses compact panels and scan-friendly hierarchy.
  • Creator tools remain consistent in light and dark themes.

Fixed

  • Fixed recent comment menus appearing below surrounding cards.
  • Fixed Creator Studio search and shortcuts acting as static demonstrations.
0.5.0 · Discovery foundation

Version 0.5.0

Foundation release

The initial public video platform: home discovery, playback, creators, subscriptions, engagement, and personal viewing tools.

Features

FeatureBehavior
Home discoveryFeatured, trending, recent, category, creator, and continue-watching content form the public homepage.
Video playbackResponsive playback, title, creator, actions, description, comments, and related videos share one watch page.
Explore and trendingVisitors browse real videos, creators, topics, and categories with sorting and discovery sections.
Channel subscriptionsAuthenticated viewers subscribe to creators and browse their subscription feed.
Watch LaterViewers save content into a dedicated Watch Later collection.
Likes and commentsVideos and comments support authenticated engagement with persisted counts.
Viewing history and progressPlayback position and history allow viewers to resume content across sessions.
Responsive light and dark themesThe platform defaults to light mode and supports a true-black dark appearance.

Improved

  • Core layouts are responsive across desktop, tablet, and mobile.
  • Authentication creates secure sessions and a creator channel for each new account.

Fixed

  • Established protected root-domain routing for Laravel and the React application.
  • Protected application internals and private storage from direct web access.

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.

Developing plugins

Use the dedicated Plugin development guide to create a Plugin API v1 package from an empty directory, add backend and browser integrations, package it safely, and test its complete lifecycle.

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.

Develop a PlayHub plugin from scratch

PlayHub Plugin API v1 lets an extension add Laravel services, routes, migrations, settings, server hooks, browser hooks, website pages, and Admin workspaces without changing PlayHub core files. This guide builds a small but complete acme.example-tools plugin and explains how each part is loaded.

Plugins are trusted application code

A plugin provider runs inside Laravel and can access the application, database, filesystem, and configured services. Develop and test on a non-production installation, review every dependency and file, and install packages only from trusted authors.

1. Prepare the development environment

  • Use a staging PlayHub 0.9.9 or newer installation with PHP 8.3 or newer and the PHP ZIP extension.
  • Keep the plugin in its own source directory and source-control repository; do not develop by editing PlayHub core files.
  • Choose a globally unique lowercase plugin ID such as acme.example-tools and a matching PHP namespace such as Acme\ExampleTools.
  • Decide whether the plugin needs a backend provider, database tables, settings, browser assets, a website page, an Admin workspace, or only a subset.
  • Use a staging database and take a backup before testing migrations or uninstall behavior.
  • Plan authorization for every endpoint. A hidden Admin navigation link is not a server-side permission check.

2. Create the package structure

Create the following directory tree. Only plugin.json is always required; the other paths are included when declared by the manifest or used by the plugin.

acme.example-tools
acme.example-tools/
├── plugin.json
├── README.md
├── CHANGELOG.md
├── src/
│   ├── PluginServiceProvider.php
│   └── Lifecycle.php
├── routes/
│   └── api.php
├── database/
│   └── migrations/
│       └── 2026_09_06_000000_create_example_tools_notes.php
└── assets/
    ├── example-tools.js
    └── example-tools.css

Namespace classes, routes, tables, cache keys, browser globals, and CSS classes with the vendor and plugin name. This prevents collisions with PlayHub and other extensions.

3. Write the plugin manifest

Place plugin.json at the package root. Provider and lifecycle classes must be covered by the declared PSR-4 namespace. Paths use forward slashes and must remain inside the package.

plugin.json
{
  "id": "acme.example-tools",
  "name": "Example Tools",
  "version": "1.0.0",
  "api": 1,
  "description": "A complete PlayHub Plugin API v1 example.",
  "homepage": "https://example.com/playhub-plugins/example-tools",
  "author": {
    "name": "Acme",
    "url": "https://example.com"
  },
  "requires": {
    "playhub": ">=0.9.9",
    "php": ">=8.3.0",
    "extensions": ["json"]
  },
  "dependencies": {},
  "autoload": {
    "psr-4": {
      "Acme\\ExampleTools\\": "src/"
    }
  },
  "providers": [
    "Acme\\ExampleTools\\PluginServiceProvider"
  ],
  "lifecycle": "Acme\\ExampleTools\\Lifecycle",
  "migrations": "database/migrations",
  "assets": {
    "styles": ["assets/example-tools.css"],
    "scripts": ["assets/example-tools.js"]
  },
  "settings": [
    {
      "key": "greeting",
      "label": "Greeting",
      "type": "text",
      "description": "Text displayed by the example pages.",
      "default": "Hello from Example Tools",
      "required": true,
      "public": true,
      "max_length": 120
    },
    {
      "key": "api_token",
      "label": "External API token",
      "type": "password",
      "description": "Optional private credential used only on the server.",
      "required": false,
      "public": false
    }
  ],
  "capabilities": [
    "Example website page",
    "Example Admin workspace",
    "Backend status endpoint"
  ]
}

Manifest field reference

FieldPurpose and rules
idRequired stable identifier. Use lowercase letters and numbers separated by dots, dashes, or underscores. admin, core, playhub, and system are reserved.
name, versionRequired display name and semantic version such as 1.0.0, 1.1.0-beta.1, or 2.0.0+build.4.
apiSet to 1. PlayHub rejects a package targeting an unsupported Plugin API version.
description, homepage, authorOptional package metadata displayed in Admin Plugins. Homepage and author URLs must use HTTP or HTTPS.
requiresPlayHub and PHP version constraints plus required PHP extensions. Declare the real minimum versions instead of relying on defaults.
dependenciesOptional object mapping another plugin ID to a version constraint, for example "acme.base": "^1.2". Required plugins must be installed, compatible, and enabled.
autoload.psr-4Maps each plugin PHP namespace to a package directory. Namespace keys must end in a backslash. PlayHub provides its own plugin class loader, so a Composer autoload rebuild is not required.
providersLaravel service-provider classes loaded when the plugin is enabled. Keep providers small and defer side effects to boot() or lifecycle methods.
lifecycleOptional class for enable, disable, settings-update, and uninstall behavior.
migrationsOptional directory containing Laravel migrations. The declared directory must exist and migrations run when the plugin is enabled.
assetsDeclared CSS, JavaScript or module scripts, and additional image, font, JSON, or WebAssembly files. Only declared files are served by the protected plugin-asset route.
settingsAdmin-configurable fields stored as an encrypted array. Supported types are text, password, textarea, boolean, number, and select.
capabilitiesShort human-readable capability labels shown in Admin Plugins.

4. Create the service provider

Extend PlayHub's plugin provider, return the exact manifest ID, and use the plugin context for package paths, settings, actions, and filters. Register container bindings in register(); load routes and hooks in boot().

src/PluginServiceProvider.php
<?php

namespace Acme\ExampleTools;

use App\Plugins\PluginServiceProvider as PlayHubPluginServiceProvider;
use Illuminate\Support\Facades\Route;

final class PluginServiceProvider extends PlayHubPluginServiceProvider
{
    protected function pluginId(): string
    {
        return 'acme.example-tools';
    }

    public function boot(): void
    {
        $context = $this->plugin();

        Route::prefix('api/example-tools')
            ->group($context->path('routes/api.php'));

        $context->addFilter(
            'playhub.public_settings',
            function (array $settings) use ($context): array {
                $settings['example_tools'] = [
                    'greeting' => $context->setting(
                        'greeting',
                        'Hello from Example Tools'
                    ),
                ];

                return $settings;
            }
        );
    }
}

The provider is instantiated only for an enabled, compatible plugin. A provider exception disables that plugin's runtime contribution and is recorded in Admin Plugins. Do not perform slow remote requests during application bootstrap.

PluginContext methods

MethodUse
id(), version(), manifest()Read the installed plugin identity and normalized manifest.
settings(), setting($key, $default)Read the plugin's decrypted server-side settings. Never log secret values.
path($relativePath)Resolve a validated path inside the installed plugin directory. Traversal and absolute paths are rejected.
addAction(), action()Register or dispatch server-side event hooks.
addFilter(), filter()Register or apply server-side value transformations.

5. Add routes and authorize them

The provider above adds an /api/example-tools prefix. This read-only status route can be public. Any endpoint that reads private data or changes state must use auth:sanctum, validate its request, authorize the user in a controller or policy, and apply an appropriate throttle.

routes/api.php
<?php

use Illuminate\Support\Facades\Route;

Route::get('/status', static fn () => response()
    ->json([
        'ok' => true,
        'plugin' => 'acme.example-tools',
        'version' => '1.0.0',
    ])
    ->header('Cache-Control', 'no-store'))
    ->middleware('throttle:60,1');
Protect operations on the server

registerAdminPage() controls where a page appears; it does not authorize custom API routes. Require authentication and check the administrator, moderator, creator, owner, or resource permission again inside every protected controller action.

6. Add database migrations when needed

Use a plugin-specific table prefix and a globally unique migration filename. Add a new migration for every released schema change; never edit a migration that customers may already have run.

database/migrations/2026_09_06_000000_create_example_tools_notes.php
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    public function up(): void
    {
        Schema::create('example_tools_notes', function (Blueprint $table): void {
            $table->id();
            $table->foreignId('user_id')->index();
            $table->string('title', 160);
            $table->text('body')->nullable();
            $table->timestamps();
        });
    }

    public function down(): void
    {
        Schema::dropIfExists('example_tools_notes');
    }
};

PlayHub runs declared pending migrations with --force while enabling the plugin. Disabling or removing a plugin does not automatically roll migrations back. Preserve customer data by default; if uninstall should remove owned tables, implement that decision explicitly and disclose it to administrators.

7. Implement lifecycle behavior

The lifecycle class is resolved through Laravel's container. Each method is optional. Keep enable and settings-update operations repeatable, avoid logging credentials, and leave the application consistent if an exception occurs.

src/Lifecycle.php
<?php

namespace Acme\ExampleTools;

use App\Plugins\PluginContext;
use App\Plugins\PluginLifecycle;

final class Lifecycle extends PluginLifecycle
{
    public function enable(PluginContext $context): void
    {
        logger()->info('Example Tools enabled.', [
            'plugin' => $context->id(),
            'version' => $context->version(),
        ]);
    }

    public function disable(PluginContext $context): void
    {
        logger()->info('Example Tools disabled.');
    }

    public function settingsUpdated(
        PluginContext $context,
        array $previousSettings
    ): void {
        logger()->info('Example Tools settings updated.');
    }

    public function uninstall(PluginContext $context): void
    {
        // Remove only plugin-owned data that the administrator expects to lose.
    }
}
Lifecycle methodWhen it runs
enable($context)After compatibility validation, class validation, and pending plugin migrations, before the plugin is marked enabled.
disable($context)When the plugin is disabled. Use it to pause plugin-owned jobs or external activity, not to destroy customer data.
settingsUpdated($context, $previousSettings)After new encrypted settings are stored for an enabled plugin. An exception restores the previous settings.
uninstall($context)When a previously enabled plugin is removed. Package removal continues even if this hook reports an error.

8. Add browser assets and pages

Declared scripts load through PlayHub's protected asset route. Register with the exact plugin ID. A website page receives request, navigate, and user tools. An Admin workspace also receives PlayHub confirm and alert dialogs.

assets/example-tools.js
const PLUGIN_ID = 'acme.example-tools';

function mountExample(container, tools, greeting) {
  const controller = new AbortController();
  const section = document.createElement('section');
  section.className = 'example-tools';

  const title = document.createElement('h2');
  title.textContent = greeting;
  const status = document.createElement('p');
  status.textContent = 'Checking the plugin API...';
  section.append(title, status);
  container.replaceChildren(section);

  tools.request('/example-tools/status', {
    signal: controller.signal,
    trackPageLoading: false,
  }).then((payload) => {
    status.textContent = payload.ok
      ? `Plugin ${payload.version} is ready.`
      : 'The plugin API reported a problem.';
  }).catch((error) => {
    if (error.name !== 'AbortError') {
      status.textContent = error.message || 'The plugin API is unavailable.';
    }
  });

  return () => {
    controller.abort();
    container.replaceChildren();
  };
}

window.PlayHub.register(PLUGIN_ID, (plugin) => {
  const greeting = String(
    plugin.settings.greeting || 'Hello from Example Tools'
  );

  plugin.registerPage({
    path: '/example-tools',
    authRequired: false,
    mount: (container, tools) =>
      mountExample(container, tools, greeting),
  });

  plugin.registerAdminPage({
    path: `/admin/extensions/${PLUGIN_ID}`,
    label: 'Example Tools',
    title: 'Example Tools',
    subtitle: 'Verify the example plugin runtime and API.',
    icon: 'plugin',
    mount: (container, tools) =>
      mountExample(container, tools, greeting),
  });
});
assets/example-tools.css
.example-tools {
  max-width: 760px;
  padding: 24px;
  border: 1px solid var(--line, #dfe3ea);
  border-radius: 8px;
  background: var(--surface, #fff);
}

.example-tools h2 {
  margin: 0 0 8px;
}

.example-tools p {
  margin: 0;
}

The mount function must return cleanup when it creates listeners, timers, observers, requests, or external DOM. PlayHub calls cleanup during route changes and Admin workspace unmounting. Use the provided navigation and request tools so authentication, language headers, and route loading remain integrated.

Browser Plugin API v1

APIBehavior
window.PlayHub.register(id, setup)Registers one enabled plugin. Duplicate IDs or an ID not present in the enabled plugin metadata are rejected.
plugin.settingsContains only manifest settings marked public: true. Never expose tokens, passwords, or private configuration.
addAction(), addFilter()Registers browser listeners. Filters must return synchronously; promise-returning browser filters are rejected.
onReady(callback)Runs after PlayHub's browser application is ready, or queues the callback until it is ready.
registerPage(definition)Adds a website route. Set authRequired: false only when the page and its API are safe for guests.
registerAdminPage(definition)Adds a route under /admin/extensions/<plugin-id> with label, title, subtitle, icon, and mount function.
navigate(path, options)Performs same-origin PlayHub navigation. Cross-origin targets are rejected.
doAction(), applyFilters()Dispatches a browser action or applies a browser filter chain when the plugin owns an integration contract.

9. Configure settings correctly

All plugin settings are encrypted at rest. The public flag controls whether a value is also sent to the browser, not whether it is stored encrypted. Keep public false unless frontend code genuinely needs the value; password fields can never be public.

Setting typeUseful fields
text, password, textareadefault, placeholder, required, public, and max_length. Textarea defaults to a larger maximum length.
booleanUse a true or false default. Suitable for feature switches.
numberUse numeric default, min, and max values.
selectProvide one or more options with value and label. The default must match an option value.

A required field without a usable default must be configured in Admin Plugins before the plugin can be enabled. Server code reads every setting through PluginContext; browser code receives only public settings.

10. Use actions and filters safely

Actions announce an event and are appropriate for side effects. Filters receive a value and must return the value that the next listener should receive. Hook names start with a lowercase letter and may contain lowercase letters, numbers, dots, colons, dashes, and underscores. Priorities range from -1000 to 1000; lower values run first and equal priorities keep registration order.

Verified core hookEnvironment and purpose
playhub.plugins.bootedServer action after enabled plugin providers finish booting.
playhub.public_settingsServer filter for adding safe public configuration to the website payload.
playhub.admin.page_dataServer filter for the authenticated Admin page-data payload.
playhub.notification.payloadServer filter for notification presentation data.
playhub.readyBrowser action after the main application is mounted.
playhub.route.changedBrowser action after client-side navigation.
playhub.navigation.groupsBrowser filter for adding or adjusting navigation groups.
playhub.navigation.targetBrowser filter applied before same-origin navigation.

Prefix custom hooks with the plugin ID, for example acme.example-tools.note.created. Catch expected integration failures inside the plugin and preserve the documented input and output type of every core filter.

11. Validate and package the ZIP

Validate JSON and PHP syntax before packaging. The example below creates a ZIP whose root contains plugin.json; one wrapper directory is also accepted.

Run inside acme.example-tools
php -r 'json_decode(file_get_contents("plugin.json"), true, 64, JSON_THROW_ON_ERROR); echo "Manifest JSON is valid.\n";'
find . -name '*.php' -print0 | xargs -0 -n1 php -l
zip -r ../acme.example-tools-1.0.0.zip . -x '*.DS_Store' '.git/*'
  • The default maximum ZIP size is 25 MB, with up to 2,000 entries, 100 MB uncompressed, and 20 MB per file.
  • Do not include symlinks, traversal paths, absolute paths, duplicate paths, .env, .htaccess, .user.ini, or web.config.
  • Every PSR-4 directory, migration directory, and declared asset must exist in the package.
  • Declare browser assets explicitly. Supported delivered files include CSS, JS, MJS, common web images, fonts, JSON, and WebAssembly.
  • Exclude development artifacts such as .git/, node_modules/, tests, source maps, and unneeded vendor files. Package only reviewed runtime files you may redistribute.
  • Include a README, changelog, license information, configuration instructions, and destructive-uninstall warning when applicable.

12. Install and test the plugin

Upload the ZIP

Open Admin Panel > Plugins, install the ZIP, and review its identity, version, requirements, dependencies, capabilities, checksum, and diagnostics. New packages are installed disabled.

Configure settings

Enter required values before enabling. Confirm private credentials are password fields with public: false.

Enable the plugin

PlayHub validates compatibility and dependencies, registers the PSR-4 loader, validates runtime classes, runs pending migrations, invokes enable(), and marks the plugin enabled.

Refresh and exercise every surface

Open /example-tools, then Admin Panel > Plugins > Example Tools. Test the API, settings, authorization, browser console, responsive layout, and Laravel logs.

Test disable and removal

Confirm routes, pages, hooks, listeners, jobs, and assets stop affecting PlayHub after disable. Test uninstall on disposable data and verify the documented data-retention behavior.

Release and update workflow

  1. Increase the semantic version in plugin.json and update the changelog.
  2. Add new migrations for schema changes and preserve existing setting keys whenever possible.
  3. Test a fresh installation and an update from every supported previous plugin version.
  4. Disable the installed plugin before uploading the replacement ZIP. The manifest ID must remain unchanged.
  5. Review preserved settings, enable the new package, verify migrations, and test all backend and browser surfaces again.

PlayHub creates a rollback-safe package replacement during installation, but plugin migrations and external side effects still require the plugin author's own forward-compatible design. An enabled dependent plugin prevents its required dependency from being disabled or removed.

Pre-release checklist

  • The manifest ID, provider ID, browser registration ID, and package identity match exactly.
  • All PHP files pass syntax checks and every manifest class is covered by PSR-4.
  • Fresh enable, repeated enable, disable, settings update, package update, and uninstall behavior are tested.
  • Routes validate input, authenticate callers, authorize resources, throttle abuse, and never return secrets.
  • Migrations use plugin-owned names, preserve existing data, and support upgrades from released versions.
  • Browser mounts clean up requests, timers, observers, event listeners, and inserted DOM.
  • Public settings and logs contain no credentials, tokens, personal data, or private configuration.
  • The plugin works in light and dark themes, narrow mobile layouts, and the supported browsers.
  • The ZIP installs through Admin Plugins without manual file edits or core modifications.

Common development errors

ErrorResolution
Manifest is missing or invalidPut one valid plugin.json at the ZIP root or inside one wrapper directory and validate its JSON syntax.
Provider or lifecycle class cannot loadConfirm the namespace ends with a backslash in autoload.psr-4, the path exists, filename case matches, and the class is declared in the manifest.
Plugin is incompatibleCorrect the PlayHub, PHP, extension, and plugin dependency constraints or update the staging environment.
Plugin cannot be updatedDisable the installed version first, keep the same plugin ID, increase its version, and upload the replacement ZIP again.
Required setting blocks enablementConfigure the field in Admin Plugins or provide a valid manifest default.
Admin page does not appearDeclare and load the script, call window.PlayHub.register(), keep the path under the plugin's Admin namespace, enable the plugin, and refresh the next request.
API request returns 401 or 403Confirm the route middleware and controller authorization match the intended audience and that the provided tools.request() helper is used.
Asset returns 404Confirm the exact relative path is declared in assets, exists in the ZIP, and the plugin is enabled.

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:*

Set the active queue connection’s retry interval above its longest job timeout. Otherwise another worker may reserve a media job while the first still runs. The documented local configuration uses timeout 21600 seconds and DB_QUEUE_RETRY_AFTER=21660; Redis needs its own corresponding override rather than the 90-second fallback. Match these values to your supervised worker and actual workload.

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. Publish and allow the effective turn.relay_range_start–turn.relay_range_end UDP range separately from the TURN listener and RTC media ports when using TURN relay.

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.

Use the guarded signaling route

Adapt the shipped livekit/nginx-app-test-location.conf to the production host, PHP upstream, document root, and actual signaling port. Verify Nginx has http_auth_request_module. The include handles the LiveKit prefix and WebSocket upgrades; avoid duplicate competing locations.

The private /__playhub_livekit_admission FastCGI subrequest calls Laravel /api/livekit/admission and validates the JWT against current stream/account/stage authorization and server-held identity versions. Cached kicked or revoked grants remain denied after token refresh. Query and Bearer credentials must agree; the exact admitted credential is passed upstream. Keep direct core signaling host-private and do not expose a bypass join route.

Suppress token-bearing signaling access/error logs: the Windows include uses NUL; Unix deployments use /dev/null. Validate before reloading. A guarded missing-token request returning 403 is expected; prove real host/viewer media and cached-token rejoin separately. See the current Live service guide for networking, health checks, queues, and TURN.

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 on the host; bridge containers require a reachable authenticated listener through the configured host gateway.
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
node tools/live-health.cjs --json
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

Camera hosting requires core LiveKit and Redis; RTMP ingress and recording egress are optional services required only for their workflows. In bridge networking, configure host access through host.docker.internal/host-gateway; container loopback cannot reach a host-only Redis listener. Start the configured optional services and verify their real listeners and dependencies.

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 renditions, associates available chat/events, and moves the replay to ready state. Event checkpoints are distinct from authored video chapters.

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, chat, replay, and advanced settings. DVR is stored as a setting; active RTC seeking is not exposed.Feature-dependent
Monetization toolsAds, Super Chat, super stickers, gifts, tips, goal bar, and alerts.Configurable
EngagementPolls, pinned messages, moderation, and slow mode. Stream-label settings are stored; a label editor/rendering surface is not implemented.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, storage of 8 stream-label settings, and a 512 KB diagnostic probe. Stored label settings do not establish a label editor or rendered overlay. 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

ProviderConfigurationDelivery and limits
Default / LocalConfigured video disk; standard public disk uses uploads/. Writable media/staging paths and disk headroom.Keep protected routes for private/paid media. Switching providers does not move existing objects.
Amazon S3 / compatibleAccess key/secret with optional session token or AWS credential chain; bucket, region, optional endpoint/public base, selectable path-style addressing.ACL headers omitted by default for bucket-policy storage. R2-style endpoints are configurable; validate the actual service/account.
Google Cloud StorageHMAC interoperability access key/secret, bucket, S3/XML endpoint, region, addressing flag, optional public base.Uses S3 interoperability, not JSON service-account files. Private playback requires signing-capable credentials; uniform access omits ACLs.
Backblaze B2S3-compatible key ID/application key, bucket name, S3 endpoint/region, addressing/ACL flags, optional public base.Endpoint region inferred if omitted; conflicts rejected. A native bucket ID alone is insufficient. Verify caps and read/write/delete permissions.
Azure BlobAccount/shared key, container, optional endpoint; or validated account-key connection string. Optional public base and prefix.Private container; protected temporary links require shared-key signing. SAS-only backend access cannot mint temporary URLs in this adapter. Emulator support is for local development.

Records prefixes are normalized and applied once. Endpoint/public-base URLs require HTTP(S) without credentials, queries, or fragments. S3-compatible adapters stream reads with bounded retries/timeouts and optional checksums only when required. Default ACL omission can be disabled for a provider requiring legacy ACLs.

Saved secrets are masked. Blank secret fields preserve current values; explicit clearing is validated, partial saves preserve other settings, and replacement refreshes cached disk connections. Test Connection uses the submitted configuration to write, verify, read, and delete a unique object, checks cleanup, and sanitizes errors. It performs real provider operations and does not save the tested settings.

Set a public base URL only for intentionally public delivery. Without one, private display images use signed application links and protected video uses authorized provider redirects. See image caching and private delivery fixes. Reported cloud capacity is administrator-configured, not a queried provider quota; membership quotas are application policy. Changing provider, bucket, or prefix requires an explicit object migration.

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, authorized playback, seeking, and deletion. 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.
  • Policy-aware reconnect after recoverable network interruptions. Background and development reload behavior depend on the host lifecycle; a reload does not guarantee continued publishing.

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 receipts drive bounded, deduplicated alerts according to stream settings.
  • Chat and contribution archives show the actual recorded messages, receipts, and available system events; quick reactions are emoji chat messages.

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 recordings pass through replay finalization and video processing before playback is ready. Replay surfaces expose recorded media, available archived chat/events, timestamp checkpoints, likes, comments, creator information, and related replays. Checkpoints support manual seeking and are distinct from authored video chapters; archived chat is not a continuously playhead-synchronized feed. An existing Clips tab does not provide clip creation. Available counters do not establish peak/unique viewers or cumulative watch-time analytics. Multi-participant composites include participant identity tiles. See the current Live and replay capability guide for platform-specific behavior and acceptance.

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

Keep signaling and recording-template grants out of logs and support attachments. Prefer node tools/live-health.cjs --json, categorical status/errors, and sanitized diagnostics; raw Egress logs may contain token-bearing template URLs. Redact those URLs before sharing any retained diagnostic output.

  • 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 sanitized egress status/errors 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.