StreamCrea — Creator dashboard

Twitch, YouTube and Kick sync, multi-network publishing and a subscriber blog.

StreamCrea — Creator dashboard
Role
Founder, full stack developer
Stack
Laravel 12 · Livewire 3 · Orchid
Platforms
Twitch · YouTube · Kick
Status
Live

Context

A content creator tracks their numbers on Twitch, YouTube and Kick, then posts the same announcement on Facebook, Instagram, X, LinkedIn and Discord, each network with its own API, expiring OAuth tokens and rules. An audit also showed that, in production, roles didn’t work and the admin returned 500 errors.

Business challenge

Give creators one place for their channels, their posts and their subscribers.

Solution

One dashboard: Twitch, YouTube and Kick channels are synced every hour, and a publishing hub sends a post to several networks, now or at a chosen time. Each network is a class behind a shared interface, and an orchestrator tracks delivery network by network. Plans are described in a config file and checked on every action.

Outcome

Live at streamcrea.com, in four languages, with four Stripe plans, a blog per creator and fan subscriptions. CI tests every route with each of the seven roles, builds the production caches and runs an HTTP check after every deployment.

My role

Founder & full-stack developer

Architecture

Users

  • Creators (dashboard)
  • Subscribers and visitors
  • Orchid admin
  • Sanctum API
  • Stripe webhook

Application

  • Laravel 12 · Livewire 3
  • OAuthHubService
  • Publishing orchestrator and registry
  • Platform sync
  • Per-plan limits
  • Jobs and scheduler

External services

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

The flow, step by step

  1. Connecting a network

    The creator connects an account through OAuth; the requested scopes depend on the network, and the account is stored.

  2. Drafting

    The post is created in a transaction that checks the plan and that every targeted account belongs to the creator.

  3. Scheduling

    Every minute, a command queues a publishing job for each post whose time has come.

  4. Publishing

    For each account, the registry calls the network’s class; HTTP calls have a 30 s timeout and two retries.

  5. Tracking

    Status, external ID or error are written network by network; the post becomes “published” or “failed”.

  6. Tokens

    Every day, a job renews Google, Twitch and X tokens that expire within 24 hours.

Data model

The main entities, their key fields and their relations.

User

  • subscription_plan
  • roles (per team)
  • 1—n SocialAccount
  • 1—n SocialPost
  • 1—n Post (blog)
  • 1—n UserMetric

SocialAccount

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

SocialPost

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

Delivery (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 (creator)
  • n—1 User (subscriber)

Full technical sheet

Languages
PHP 8.4, JavaScript, TypeScript (Playwright)
Framework
Laravel 12
Front end
Blade, Livewire 3, Vite 6, Tailwind 3, Flowbite
Admin
Orchid 14, 23 screens
Database
MySQL 8 in development and production, SQLite in CI
Queues and scheduler
Scheduled publishing every minute, hourly sync, daily token renewal
Authentication
Laravel UI, Socialite (Google, Twitch, Kick, YouTube…), Sanctum
Payments
Stripe Checkout, Cashier 16, Free, Perso, Streamer and Enterprise plans
Platform APIs
Twitch Helix, YouTube Data v3, Kick; Meta Graph v19, X API v2, LinkedIn, Discord webhooks
Hosting
Dedicated Apache and MySQL server, SSH deployment followed by an HTTP check
CI/CD
5 GitHub Actions workflows on a self-hosted runner: CI, staging, production, release, Discord
Tests
PHPUnit 11 (154 tests), Playwright (8 specs, 50 tests), route × role matrix
Quality
Pint in CI, Composer and npm audits, Gitleaks
Observability
Sentry, PostHog after consent, Discord alerts, Resend
Languages (UI)
French, English, Spanish, Dutch
Security
spatie/laravel-permission team roles, HSTS and Permissions-Policy headers, rate limiting on OAuth and contact, honeypot

Key features

  • Publishing hub

    Facebook, Instagram (create then publish), X, LinkedIn and Discord, immediate or scheduled.

  • Sync

    YouTube, Twitch and Kick statistics collected every hour.

  • OAuth sign-in

    Sign up and sign in with Google, Twitch, Kick or YouTube.

  • Plans

    Four tiers, with limits checked on every action.

  • Creator blog

    Public posts or posts reserved for paid plans.

  • Fan subscriptions

    A subscriber supports a creator through Stripe.

Problems solved

  1. Roles not working in production

    ProblemPermissions run in team mode, but nothing set the active team: every role check returned false.

    FixA middleware sets the team on every request.

  2. Admin out of service

    ProblemAll 25 admin routes returned a 500 error, for five stacked causes.

    FixCauses fixed one by one; the CI matrix now covers the admin.

  3. Plan granted without a verified payment

    ProblemComing back from Stripe was enough to switch plans.

    FixThe Stripe session is read back and its owner and paid status checked, covered by 15 tests.

  4. Unlimited plans blocked

    ProblemThe ?? 0 operator confused “unlimited” (null) with “missing”.

    Fixarray_key_exists, with a comment explaining why.

  5. Destructive actions over GET

    ProblemA simple image tag could trigger a deletion (CSRF).

    FixMoved to POST and DELETE, and a package that exposed unauthenticated routes was removed.

Technical choices

Choice Why
One class per network, behind an interface Adding a network touches neither the orchestrator nor the other networks.
Route × role matrix on every CI run A matrix that only ran occasionally would protect nothing.
Production caches built in CI Some serialisation errors only show up when caching.
.env reset on the runner A file left over from a previous run made CI non-reproducible.

Timeline

  1. August 2023 First commit, YouTube and Twitch APIs
  2. December 2023 Twitch and YouTube live detection
  3. June 2024 Laravel 11, Stripe and Cashier
  4. October 2025 StreamOne becomes StreamCrea
  5. June 2026 Publishing hub, plans and blogs
  6. September 2026 Route audit, roles and admin fixed

In numbers

529
commits
10
account platforms
7
roles tested on every route
4
languages

Taken from the project’s source code and Git history on 8 October 2026. No usage or revenue figures are published.

Related projects

SaaS
Oct 2024 — present
Vetzy — Laravel SaaS project
SaaS veterinary booking platform for clinics and pet owners with scheduling, notifications and client portal.
PHP, Laravel, Livewire, TailwindCSS, SaaS
View project
SaaS
Sep 2023 — present
Egonix Cards — NFC business cards
NFC business cards: tap the card, the contact lands in a space where it can be exported, segmented and followed up.
Laravel, Livewire, Filament, Stripe, TailwindCSS
View project
SaaS
Jan 2024 — present
Finnexus — Laravel Finance project
Enterprise finance SaaS with analytics, cash-flow forecasts and treasury insights.
Laravel, Livewire, TailwindCSS, Stripe
View project
SaaS
Jan 2023 — present
Laroo — Laravel ERP project
Laravel ERP covering inventory, billing and CRM for growing teams.
Laravel, Livewire, PHP, TailwindCSS
View project

Available for PHP / Laravel / WordPress / Silverstripe missions in Belgium and remote EU.