StreamCrea — tableau de bord des créateurs

Synchro Twitch, YouTube et Kick, publication multi-réseaux et blog pour abonnés.

StreamCrea — tableau de bord des créateurs
Rôle
Fondateur, développeur full stack
Stack
Laravel 12 · Livewire 3 · Orchid
Plateformes
Twitch · YouTube · Kick
Statut
En ligne

Contexte

Un créateur de contenu suit ses chiffres sur Twitch, YouTube et Kick, puis publie la même annonce sur Facebook, Instagram, X, LinkedIn et Discord, chaque réseau avec son API, ses jetons OAuth qui expirent et ses règles. Un audit a aussi montré qu’en production les rôles ne fonctionnaient pas et que l’administration renvoyait des erreurs 500.

Défi métier

Donner aux créateurs un seul endroit pour leurs chaînes, leurs publications et leurs abonnés.

Solution

Un tableau de bord unique : les chaînes Twitch, YouTube et Kick sont synchronisées toutes les heures, et un hub de publication envoie un message vers plusieurs réseaux, tout de suite ou à une date choisie. Chaque réseau est une classe derrière une interface commune, et un orchestrateur suit la livraison réseau par réseau. Les forfaits sont décrits dans un fichier de configuration et vérifiés à chaque action.

Résultat

En ligne sur streamcrea.com, en quatre langues, avec quatre forfaits Stripe, un blog par créateur et des abonnements de fans. La CI teste chaque route avec chacun des sept rôles, construit les caches de production et lance un test HTTP après chaque déploiement.

Mon rôle

Fondateur et développeur full-stack

Architecture

Utilisateurs

  • Créateurs (tableau de bord)
  • Abonnés et visiteurs
  • Administration Orchid
  • API Sanctum
  • Webhook Stripe

Application

  • Laravel 12 · Livewire 3
  • OAuthHubService
  • Orchestrateur et registre de publication
  • Synchronisation des plateformes
  • Limites par forfait
  • Jobs et planificateur

Services externes

  • Twitch · YouTube · Kick
  • Meta Graph · X · LinkedIn · Discord
  • Stripe · Cashier
  • Sentry · PostHog
  • Resend
  • MySQL 8

Le parcours, étape par étape

  1. Connexion d’un réseau

    Le créateur connecte un compte par OAuth ; les autorisations demandées dépendent du réseau, et le compte est enregistré.

  2. Rédaction

    Le message est créé dans une transaction qui vérifie le forfait et que chaque compte ciblé appartient bien au créateur.

  3. Planification

    Chaque minute, une commande met en file un job de publication pour chaque message dont l’heure est passée.

  4. Publication

    Pour chaque compte, le registre appelle la classe du réseau ; les appels HTTP ont un délai de 30 s et deux nouvelles tentatives.

  5. Suivi

    Le statut, l’identifiant externe ou l’erreur sont écrits réseau par réseau ; le message passe à « publié » ou « échec ».

  6. Jetons

    Chaque jour, un job renouvelle les jetons Google, Twitch et X qui expirent dans moins de 24 heures.

Modèle de données

Les entités principales, leurs champs clés et leurs relations.

User

  • subscription_plan
  • rôles (par équipe)
  • 1—n SocialAccount
  • 1—n SocialPost
  • 1—n Post (blog)
  • 1—n UserMetric

SocialAccount

  • platform (10 plateformes)
  • account_type
  • token_expires_at
  • metadata
  • n—1 User
  • n—n SocialPost

SocialPost

  • body · media
  • post_type
  • status
  • scheduled_at
  • n—n SocialAccount (livraisons)

Livraison (pivot)

  • delivery_status
  • external_post_id
  • error_message
  • published_at
  • SocialPost × SocialAccount

Post (blog)

  • slug · body
  • visibility
  • status
  • n—1 User

UserMetric

  • metric_type · platform
  • metric_value
  • recorded_at
  • n—1 User

CreatorSubscription

  • creator_id · subscriber_id
  • stripe_subscription_id
  • status
  • n—1 User (créateur)
  • n—1 User (abonné)

Fiche technique complète

Langages
PHP 8.4, JavaScript, TypeScript (Playwright)
Framework
Laravel 12
Front
Blade, Livewire 3, Vite 6, Tailwind 3, Flowbite
Administration
Orchid 14, 23 écrans
Base de données
MySQL 8 en développement et en production, SQLite en CI
Files et planificateur
Publication planifiée chaque minute, synchronisation horaire, renouvellement des jetons chaque jour
Authentification
Laravel UI, Socialite (Google, Twitch, Kick, YouTube…), Sanctum
Paiement
Stripe Checkout, Cashier 16, forfaits Free, Perso, Streamer et Enterprise
APIs plateformes
Twitch Helix, YouTube Data v3, Kick ; Meta Graph v19, X API v2, LinkedIn, webhooks Discord
Hébergement
Serveur dédié Apache et MySQL, déploiement par SSH puis test HTTP
CI/CD
5 workflows GitHub Actions sur runner auto-hébergé : CI, préproduction, production, release, Discord
Tests
PHPUnit 11 (154 tests), Playwright (8 specs, 50 tests), matrice route × rôle
Qualité
Pint en CI, audits Composer et npm, Gitleaks
Observabilité
Sentry, PostHog après consentement, alertes Discord, Resend
Langues
Français, anglais, espagnol, néerlandais
Sécurité
Rôles spatie/laravel-permission par équipe, en-têtes HSTS et Permissions-Policy, limitation de débit sur OAuth et contact, honeypot

Fonctionnalités clés

  • Hub de publication

    Facebook, Instagram (création puis publication), X, LinkedIn et Discord, immédiat ou planifié.

  • Synchronisation

    Statistiques YouTube, Twitch et Kick relevées toutes les heures.

  • Connexion OAuth

    Inscription et connexion par Google, Twitch, Kick ou YouTube.

  • Forfaits

    Quatre niveaux, avec limites vérifiées à chaque action.

  • Blog par créateur

    Articles publics ou réservés aux forfaits payants.

  • Abonnements de fans

    Un abonné soutient un créateur par Stripe.

Problèmes résolus

  1. Rôles inopérants en production

    ProblèmeLes permissions tournent en mode équipe, mais rien ne fixait l’équipe active : chaque test de rôle renvoyait faux.

    SolutionUn middleware fixe l’équipe à chaque requête.

  2. Administration hors service

    ProblèmeLes 25 routes de l’administration renvoyaient une erreur 500, pour cinq causes empilées.

    SolutionCauses corrigées une à une ; la matrice de CI couvre désormais l’administration.

  3. Forfait attribué sans paiement vérifié

    ProblèmeLe retour de Stripe suffisait à changer de forfait.

    SolutionLa session Stripe est relue, son propriétaire et son statut payé contrôlés, couverts par 15 tests.

  4. Forfaits illimités bloqués

    ProblèmeL’opérateur ?? 0 confondait « illimité » (null) et « absent ».

    Solutionarray_key_exists, avec un commentaire qui explique pourquoi.

  5. Actions destructives en GET

    ProblèmeUne simple image pouvait déclencher une suppression (CSRF).

    SolutionPassage en POST et DELETE, et retrait d’un paquet qui ouvrait des routes non authentifiées.

Choix techniques

Choix Pourquoi
Une classe par réseau, derrière une interface Ajouter un réseau ne touche ni l’orchestrateur ni les autres réseaux.
Matrice route × rôle à chaque CI Une matrice qui ne tournerait qu’occasionnellement ne protégerait de rien.
Caches de production construits en CI Certaines erreurs de sérialisation n’apparaissent qu’à la mise en cache.
.env remis à zéro sur le runner Un fichier resté d’une exécution précédente rendait la CI non reproductible.

Chronologie

  1. Août 2023 Premier commit, APIs YouTube et Twitch
  2. Décembre 2023 Détection du direct Twitch et YouTube
  3. Juin 2024 Laravel 11, Stripe et Cashier
  4. Octobre 2025 StreamOne devient StreamCrea
  5. Juin 2026 Hub de publication, forfaits et blogs
  6. Septembre 2026 Audit des routes, rôles et administration corrigés

En chiffres

529
commits
10
plateformes de compte
7
rôles testés sur chaque route
4
langues

Relevé dans le code source et l’historique Git du projet le 8 octobre 2026. Aucun chiffre d’usage ou de revenu n’est publié.

Projets similaires

SaaS
oct. 2024 — présent
Vetzy — projet Laravel SaaS
Plateforme SaaS vétérinaire de prise de rendez-vous pour cliniques et propriétaires d’animaux.
PHP, Laravel, Livewire, TailwindCSS, SaaS
Voir le projet
SaaS
sept. 2023 — présent
Egonix Cards — cartes de visite NFC
Des cartes de visite NFC : on touche la carte, le contact arrive dans un espace où il s’exporte, se segmente et se relance.
Laravel, Livewire, Filament, Stripe, TailwindCSS
Voir le projet
SaaS
janv. 2024 — présent
Finnexus — projet Laravel Finance
SaaS finance entreprise : analytics, prévisions et trésorerie.
Laravel, Livewire, TailwindCSS, Stripe
Voir le projet
SaaS
janv. 2023 — présent
Laroo — projet Laravel ERP
Solution ERP Laravel pour opérations, inventaire et productivité.
Laravel, Livewire, PHP, TailwindCSS
Voir le projet

Disponible pour missions PHP / Laravel / WordPress / Silverstripe en Belgique et remote EU.