User
- subscription_plan
- roles (per team)
- 1—n SocialAccount
- 1—n SocialPost
- 1—n Post (blog)
- 1—n UserMetric
Twitch, YouTube and Kick sync, multi-network publishing and a subscriber blog.
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.
Give creators one place for their channels, their posts and their subscribers.
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.
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.
Founder & full-stack developer
Users
Application
External services
The creator connects an account through OAuth; the requested scopes depend on the network, and the account is stored.
The post is created in a transaction that checks the plan and that every targeted account belongs to the creator.
Every minute, a command queues a publishing job for each post whose time has come.
For each account, the registry calls the network’s class; HTTP calls have a 30 s timeout and two retries.
Status, external ID or error are written network by network; the post becomes “published” or “failed”.
Every day, a job renews Google, Twitch and X tokens that expire within 24 hours.
The main entities, their key fields and their relations.
Facebook, Instagram (create then publish), X, LinkedIn and Discord, immediate or scheduled.
YouTube, Twitch and Kick statistics collected every hour.
Sign up and sign in with Google, Twitch, Kick or YouTube.
Four tiers, with limits checked on every action.
Public posts or posts reserved for paid plans.
A subscriber supports a creator through Stripe.
ProblemPermissions run in team mode, but nothing set the active team: every role check returned false.
FixA middleware sets the team on every request.
ProblemAll 25 admin routes returned a 500 error, for five stacked causes.
FixCauses fixed one by one; the CI matrix now covers the admin.
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.
ProblemThe ?? 0 operator confused “unlimited” (null) with “missing”.
Fixarray_key_exists, with a comment explaining why.
ProblemA simple image tag could trigger a deletion (CSRF).
FixMoved to POST and DELETE, and a package that exposed unauthenticated routes was removed.
Taken from the project’s source code and Git history on 8 October 2026. No usage or revenue figures are published.
Available for PHP / Laravel / WordPress / Silverstripe missions in Belgium and remote EU.