lthn.io/config/social.php
Claude 77cc45dd83
feat: lthn.io CorePHP app — TLD website + blockchain services
Modules:
- Chain: daemon RPC client (DaemonRpc singleton, cached queries)
- Explorer: block browser, tx viewer, alias directory, search, stats API
- Names: .lthn TLD registrar portal (availability check, lookup, directory)
- Trade: scaffold (DEX frontend + API)
- Pool: scaffold (mining pool dashboard)

Replaces 5 Node.js containers (5.9GB) with one FrankenPHP app.
Built on CorePHP framework pattern from host.uk.com.

Co-Authored-By: Charon <charon@lethean.io>
2026-04-03 16:13:55 +01:00

621 lines
19 KiB
PHP

<?php
return [
/*
|--------------------------------------------------------------------------
| SocialHost Configuration
|--------------------------------------------------------------------------
|
| This file contains configuration for the SocialHost social media
| management system, including provider settings, limits, and features.
|
*/
/*
|--------------------------------------------------------------------------
| Media Storage
|--------------------------------------------------------------------------
*/
'disk' => env('SOCIAL_DISK', 'public'),
'max_file_size' => [
'image' => env('SOCIAL_MAX_IMAGE_SIZE', 1024 * 15), // 15MB
'gif' => env('SOCIAL_MAX_GIF_SIZE', 1024 * 15), // 15MB
'video' => env('SOCIAL_MAX_VIDEO_SIZE', 1024 * 200), // 200MB
],
'mime_types' => [
'image/jpg',
'image/jpeg',
'image/gif',
'image/png',
'image/webp',
'video/mp4',
'video/x-m4v',
'video/quicktime',
],
/*
|--------------------------------------------------------------------------
| Media Processing
|--------------------------------------------------------------------------
*/
'ffmpeg_path' => env('FFMPEG_PATH', '/usr/bin/ffmpeg'),
'ffprobe_path' => env('FFPROBE_PATH', '/usr/bin/ffprobe'),
/*
|--------------------------------------------------------------------------
| Caching
|--------------------------------------------------------------------------
*/
'cache_prefix' => env('SOCIAL_CACHE_PREFIX', 'social'),
'cache_ttl' => env('SOCIAL_CACHE_TTL', 3600), // 1 hour
/*
|--------------------------------------------------------------------------
| Logging
|--------------------------------------------------------------------------
*/
'log_channel' => env('SOCIAL_LOG_CHANNEL', null),
/*
|--------------------------------------------------------------------------
| Provider Credentials
|--------------------------------------------------------------------------
|
| OAuth credentials for each social network provider.
|
*/
'credentials' => [
'twitter' => [
'client_id' => env('TWITTER_CLIENT_ID'),
'client_secret' => env('TWITTER_CLIENT_SECRET'),
'tier' => env('TWITTER_TIER', 'free'), // free, basic, pro, enterprise
],
'facebook' => [
'client_id' => env('FACEBOOK_CLIENT_ID'),
'client_secret' => env('FACEBOOK_CLIENT_SECRET'),
'api_version' => env('FACEBOOK_API_VERSION', 'v18.0'),
],
'instagram' => [
'client_id' => env('INSTAGRAM_CLIENT_ID'),
'client_secret' => env('INSTAGRAM_CLIENT_SECRET'),
],
'linkedin' => [
'client_id' => env('LINKEDIN_CLIENT_ID'),
'client_secret' => env('LINKEDIN_CLIENT_SECRET'),
],
'tiktok' => [
'client_id' => env('TIKTOK_CLIENT_ID'),
'client_secret' => env('TIKTOK_CLIENT_SECRET'),
],
'youtube' => [
'client_id' => env('YOUTUBE_CLIENT_ID'),
'client_secret' => env('YOUTUBE_CLIENT_SECRET'),
],
'pinterest' => [
'client_id' => env('PINTEREST_CLIENT_ID'),
'client_secret' => env('PINTEREST_CLIENT_SECRET'),
],
'threads' => [
'client_id' => env('THREADS_CLIENT_ID'),
'client_secret' => env('THREADS_CLIENT_SECRET'),
],
'bluesky' => [
// Uses credentials auth, no OAuth app
],
'mastodon' => [
// Dynamic per-instance OAuth
],
'reddit' => [
'client_id' => env('REDDIT_CLIENT_ID'),
'client_secret' => env('REDDIT_CLIENT_SECRET'),
],
'medium' => [
'client_id' => env('MEDIUM_CLIENT_ID'),
'client_secret' => env('MEDIUM_CLIENT_SECRET'),
],
'devto' => [
// Uses API key auth
],
'hashnode' => [
// Uses API key auth
],
'wordpress' => [
// Uses API key or app passwords
],
'telegram' => [
// Uses bot token
],
'discord' => [
'webhook_enabled' => env('DISCORD_WEBHOOK_ENABLED', true),
],
'slack' => [
'webhook_enabled' => env('SLACK_WEBHOOK_ENABLED', true),
],
],
/*
|--------------------------------------------------------------------------
| Provider Options
|--------------------------------------------------------------------------
|
| Platform-specific posting limits and capabilities.
|
*/
'providers' => [
'twitter' => [
'name' => 'X (Twitter)',
'simultaneous_posting' => false,
'character_limit' => 280,
'media_limit' => [
'photos' => 4,
'videos' => 1,
'gifs' => 1,
'allow_mixing' => false,
],
'poll_limit' => [
'min_options' => 2,
'max_options' => 4,
'max_option_length' => 25,
'min_duration_minutes' => 5,
'max_duration_minutes' => 10080, // 7 days
'default_duration_minutes' => 1440, // 1 day
],
'features' => ['posts', 'threads', 'polls', 'analytics'],
'auth_type' => 'oauth2',
],
'facebook_page' => [
'name' => 'Facebook Page',
'simultaneous_posting' => true,
'character_limit' => 5000,
'media_limit' => [
'photos' => 10,
'videos' => 1,
'gifs' => 1,
'allow_mixing' => false,
],
'features' => ['posts', 'stories', 'reels', 'analytics'],
'auth_type' => 'oauth2',
],
'facebook_group' => [
'name' => 'Facebook Group',
'simultaneous_posting' => true,
'character_limit' => 5000,
'media_limit' => [
'photos' => 10,
'videos' => 1,
'gifs' => 1,
'allow_mixing' => false,
],
'features' => ['posts'],
'auth_type' => 'oauth2',
],
'instagram' => [
'name' => 'Instagram',
'simultaneous_posting' => true,
'character_limit' => 2200,
'media_limit' => [
'photos' => 10,
'videos' => 1,
'gifs' => 0,
'allow_mixing' => true,
],
'features' => ['posts', 'stories', 'reels', 'analytics'],
'auth_type' => 'oauth2',
],
'linkedin' => [
'name' => 'LinkedIn Profile',
'simultaneous_posting' => false,
'character_limit' => 3000,
'media_limit' => [
'photos' => 9,
'videos' => 1,
'gifs' => 1,
'allow_mixing' => false,
],
'poll_limit' => [
'min_options' => 2,
'max_options' => 4,
'max_option_length' => 140,
'min_duration_minutes' => 1440, // 1 day
'max_duration_minutes' => 20160, // 14 days
'default_duration_minutes' => 4320, // 3 days
],
'features' => ['posts', 'articles', 'polls', 'analytics'],
'auth_type' => 'oauth2',
],
'linkedin_page' => [
'name' => 'LinkedIn Page',
'simultaneous_posting' => false,
'character_limit' => 3000,
'media_limit' => [
'photos' => 9,
'videos' => 1,
'gifs' => 1,
'allow_mixing' => false,
],
'poll_limit' => [
'min_options' => 2,
'max_options' => 4,
'max_option_length' => 140,
'min_duration_minutes' => 1440, // 1 day
'max_duration_minutes' => 20160, // 14 days
'default_duration_minutes' => 4320, // 3 days
],
'features' => ['posts', 'articles', 'polls', 'analytics'],
'auth_type' => 'oauth2',
],
'tiktok' => [
'name' => 'TikTok',
'simultaneous_posting' => true,
'character_limit' => 2200,
'media_limit' => [
'photos' => 0,
'videos' => 1,
'gifs' => 0,
'allow_mixing' => false,
],
'features' => ['videos', 'analytics'],
'auth_type' => 'oauth2',
],
'youtube' => [
'name' => 'YouTube',
'simultaneous_posting' => true,
'character_limit' => 5000,
'media_limit' => [
'photos' => 0,
'videos' => 1,
'gifs' => 0,
'allow_mixing' => false,
],
'features' => ['videos', 'shorts', 'analytics'],
'auth_type' => 'oauth2',
],
'pinterest' => [
'name' => 'Pinterest',
'simultaneous_posting' => true,
'character_limit' => 500,
'media_limit' => [
'photos' => 1,
'videos' => 0,
'gifs' => 0,
'allow_mixing' => false,
],
'features' => ['pins', 'boards', 'analytics'],
'auth_type' => 'oauth2',
],
'threads' => [
'name' => 'Threads',
'simultaneous_posting' => true,
'character_limit' => 500,
'media_limit' => [
'photos' => 10,
'videos' => 1,
'gifs' => 1,
'allow_mixing' => false,
],
'features' => ['posts', 'threads'],
'auth_type' => 'oauth2',
],
'mastodon' => [
'name' => 'Mastodon',
'simultaneous_posting' => true,
'character_limit' => 500, // Default, varies by instance
'media_limit' => [
'photos' => 4,
'videos' => 1,
'gifs' => 1,
'allow_mixing' => false,
],
'poll_limit' => [
'min_options' => 2,
'max_options' => 4,
'max_option_length' => 50, // Default, varies by instance
'min_duration_minutes' => 5,
'max_duration_minutes' => 10080, // 7 days
'default_duration_minutes' => 1440, // 1 day
],
'features' => ['posts', 'threads', 'polls'],
'auth_type' => 'oauth2_server',
],
'bluesky' => [
'name' => 'Bluesky',
'simultaneous_posting' => true,
'character_limit' => 300,
'media_limit' => [
'photos' => 4,
'videos' => 0,
'gifs' => 0,
'allow_mixing' => false,
],
'features' => ['posts', 'threads'],
'auth_type' => 'credentials',
],
'reddit' => [
'name' => 'Reddit',
'simultaneous_posting' => true,
'character_limit' => 40000,
'media_limit' => [
'photos' => 20,
'videos' => 1,
'gifs' => 1,
'allow_mixing' => false,
],
'features' => ['posts'],
'auth_type' => 'oauth2',
],
'medium' => [
'name' => 'Medium',
'simultaneous_posting' => true,
'character_limit' => 0, // No limit
'media_limit' => [
'photos' => 0, // Inline in content
'videos' => 0,
'gifs' => 0,
'allow_mixing' => false,
],
'features' => ['articles'],
'auth_type' => 'oauth2',
],
'devto' => [
'name' => 'DEV.to',
'simultaneous_posting' => true,
'character_limit' => 0,
'media_limit' => [
'photos' => 0,
'videos' => 0,
'gifs' => 0,
'allow_mixing' => false,
],
'features' => ['articles'],
'auth_type' => 'api_key',
],
'hashnode' => [
'name' => 'Hashnode',
'simultaneous_posting' => true,
'character_limit' => 0,
'media_limit' => [
'photos' => 0,
'videos' => 0,
'gifs' => 0,
'allow_mixing' => false,
],
'features' => ['articles'],
'auth_type' => 'api_key',
],
'wordpress' => [
'name' => 'WordPress',
'simultaneous_posting' => true,
'character_limit' => 0,
'media_limit' => [
'photos' => 0,
'videos' => 0,
'gifs' => 0,
'allow_mixing' => false,
],
'features' => ['articles', 'pages'],
'auth_type' => 'api_key',
],
'telegram' => [
'name' => 'Telegram',
'simultaneous_posting' => true,
'character_limit' => 4096,
'media_limit' => [
'photos' => 10,
'videos' => 1,
'gifs' => 1,
'allow_mixing' => false,
],
'features' => ['posts'],
'auth_type' => 'bot_token',
],
'discord' => [
'name' => 'Discord',
'simultaneous_posting' => true,
'character_limit' => 2000,
'media_limit' => [
'photos' => 10,
'videos' => 1,
'gifs' => 1,
'allow_mixing' => true,
],
'features' => ['posts'],
'auth_type' => 'webhook',
],
'slack' => [
'name' => 'Slack',
'simultaneous_posting' => true,
'character_limit' => 40000,
'media_limit' => [
'photos' => 10,
'videos' => 1,
'gifs' => 1,
'allow_mixing' => true,
],
'features' => ['posts'],
'auth_type' => 'webhook',
],
'vk' => [
'name' => 'VK',
'simultaneous_posting' => true,
'character_limit' => 15895,
'media_limit' => [
'photos' => 10,
'videos' => 1,
'gifs' => 1,
'allow_mixing' => false,
],
'features' => ['posts', 'analytics'],
'auth_type' => 'oauth2',
],
'lemmy' => [
'name' => 'Lemmy',
'simultaneous_posting' => true,
'character_limit' => 10000,
'media_limit' => [
'photos' => 1,
'videos' => 0,
'gifs' => 0,
'allow_mixing' => false,
],
'features' => ['posts'],
'auth_type' => 'credentials_server',
],
'farcaster' => [
'name' => 'Farcaster',
'simultaneous_posting' => true,
'character_limit' => 320,
'media_limit' => [
'photos' => 2,
'videos' => 0,
'gifs' => 0,
'allow_mixing' => false,
],
'features' => ['posts'],
'auth_type' => 'signer',
],
'nostr' => [
'name' => 'Nostr',
'simultaneous_posting' => true,
'character_limit' => 0,
'media_limit' => [
'photos' => 0,
'videos' => 0,
'gifs' => 0,
'allow_mixing' => false,
],
'features' => ['posts'],
'auth_type' => 'keys',
],
],
/*
|--------------------------------------------------------------------------
| Default Settings
|--------------------------------------------------------------------------
*/
'defaults' => [
'queue_times_per_day' => 4,
'posts_per_page' => 20,
'analytics_retention_days' => 365,
],
/*
|--------------------------------------------------------------------------
| Webhook Events
|--------------------------------------------------------------------------
*/
'webhook_events' => [
'post.published',
'post.failed',
'post.scheduled',
'account.connected',
'account.disconnected',
'account.error',
'account.refreshed',
],
/*
|--------------------------------------------------------------------------
| Feature Flags
|--------------------------------------------------------------------------
|
| Control feature availability for gradual rollout and A/B testing.
| Phase 8: Vue → Livewire migration flags.
|
*/
'features' => [
// Two-factor authentication (disabled until native implementation)
'two_factor_auth' => env('SOCIAL_TWO_FACTOR_AUTH', false),
// Redirect legacy MixPost Vue routes to Livewire equivalents
'redirect_mixpost_routes' => env('SOCIAL_REDIRECT_MIXPOST', true),
// Use native Livewire UI (when false, falls back to MixPost Vue)
'livewire_ui' => env('SOCIAL_LIVEWIRE_UI', true),
// Enable new post composer (Phase 8 feature)
'new_composer' => env('SOCIAL_NEW_COMPOSER', true),
// Enable kanban view for posts
'kanban_view' => env('SOCIAL_KANBAN_VIEW', true),
// Enable calendar view for posts
'calendar_view' => env('SOCIAL_CALENDAR_VIEW', true),
// Enable AI-powered features (requires AI credits entitlement)
'ai_suggestions' => env('SOCIAL_AI_SUGGESTIONS', true),
// Enable bulk post operations
'bulk_operations' => env('SOCIAL_BULK_OPERATIONS', true),
// Enable advanced analytics dashboard
'advanced_analytics' => env('SOCIAL_ADVANCED_ANALYTICS', true),
// Enable webhook management UI
'webhook_management' => env('SOCIAL_WEBHOOK_MANAGEMENT', true),
// Enable template system
'templates' => env('SOCIAL_TEMPLATES', true),
],
/*
|--------------------------------------------------------------------------
| Migration Settings
|--------------------------------------------------------------------------
|
| Settings for the MixPost → Native SocialHost migration.
|
*/
'migration' => [
// Allow access to legacy MixPost API endpoints
'allow_legacy_api' => env('SOCIAL_ALLOW_LEGACY_API', true),
// Keep MixPost tables after migration (safety net)
'preserve_mixpost_tables' => env('SOCIAL_PRESERVE_MIXPOST_TABLES', true),
// Migration completed flag
'migration_complete' => env('SOCIAL_MIGRATION_COMPLETE', false),
],
];