saascode
Thick

Thick

Thick is a self-hosted live-streaming and creator-community platform with full source code included.

inside the product
01· Landing
02· Browse
03· Watch
04· Studio
05· Pricing
the complete operation

Thick is a self-hosted live-streaming platform you own and brand: your own Twitch, running on your own infrastructure. You run the media server and the CDN account yourself, so your infrastructure cost tracks how many people broadcast, not how many people watch.

Thick in depth

Audience growth stops creating a bigger platform tax.

Audience growth should improve the business, but metered platforms can turn every successful broadcast into a larger bill. That changes programming decisions: teams hesitate to promote a stream, creators worry about spikes, and a breakout event becomes an infrastructure surprise instead of a win. The problem compounds when the brand and audience relationship also belong to the host. A streaming business needs room to grow without treating every new viewer as a new tax or every format decision as permission requested from somebody else's platform.

  • Live streaming (Live streaming with signed admission, hashed stream keys, and manifest-driven HLS playback)
  • VOD replays
  • Viewer analytics
  • Advanced analytics

Each channel keeps its community active between broadcasts.

A live audience is intense and temporary. When the broadcast ends, conversation usually scatters across unrelated tools, the creator loses the context that made the moment valuable, and viewers have no obvious reason to return before the next show. That weakens both retention and the creator's relationship with the people who support them. The operating problem is continuity: each channel needs a place where followers can keep up, respond, and reconnect without rebuilding the community from zero every time the live indicator turns on.

  • Follows and live-now alerts (Channel follows with live-first discovery and configurable go-live automations)
  • Streamer feed
  • Comments
  • Per-post content gating
  • Direct messages

Creator support becomes one understandable channel economy.

Creator support becomes difficult to understand when subscriptions live in one system, tips in another, status in a third, and payout requests somewhere else again. Viewers cannot see how their support adds up, creators cannot recognize their strongest supporters, and the platform team spends its time reconciling disconnected records. The cost is more than administration: each extra step makes a spontaneous act of support less likely, while creators receive a fragmented picture of what their audience values and whether the business they are building is actually moving.

  • Wave-coin wallet
  • Channel subscriptions
  • Tipping
  • Leaderboards and badges
  • Cash-out queue

Live conversation stays useful as the audience accelerates.

Live chat can go from welcoming to unusable in minutes. The failure is rarely one dramatic incident; it is the accumulation of spam, repeated messages, hostile participants, and small delays while everyone assumes somebody else is handling it. Creators lose focus, viewers stop contributing, and moderators burn time reacting without a shared boundary for what belongs in the room. A growing live platform needs moderation to remain a normal operating job, not an emergency that begins only after the conversation has already driven good participants away.

  • Live chat
  • Stream moderation
  • Slow mode by default
  • Chat moderation rules
complete feature inventory
Custom emotesA switched-off capability returns "not found" rather than "forbidden", so a disabled area cannot be probed from the outside.

Every major capability is a feature switch you control from the admin features screen. The switches that ship with Thick:

You receive this. It ships behind a feature flag and sits on the Pro tier tier as configured, so it is revenue you can reserve for your own paying customers.

Open streamer signupThere is deliberately no "anyone can broadcast instantly" mode. Instant open broadcasting would require content fingerprinting and an abuse-handling operation that this product does not include.

Two modes, controlled by one switch (open_signup, off by default):

You receive this. It ships behind a feature flag and sits on the tier as configured, so it is revenue you can reserve for your own paying customers.

Discord sign-in (Discord OAuth sign-in through the configured social-provider registry)Discord OAuth sign-in through the configured social-provider registry

You receive this. It ships behind a feature flag and sits on the tier as configured, so it is revenue you can reserve for your own paying customers.

Connect APIA switched-off capability returns "not found" rather than "forbidden", so a disabled area cannot be probed from the outside.

Every major capability is a feature switch you control from the admin features screen. The switches that ship with Thick:

You receive this. It ships behind a feature flag and sits on the tier as configured, so it is revenue you can reserve for your own paying customers.

Live streaming (Live streaming with signed admission, hashed stream keys, and manifest-driven HLS playback)Live streaming with signed admission, hashed stream keys, and manifest-driven HLS playback
VOD replaysRecording is automatic: when vod_replay is on, the live broadcast is captured, pulled from the media server, remuxed to HLS with a thumbnail, and uploaded to your storage zone. Each replay job carries an explicit state — queued, processing, succeeded, failed, or retryable-failed — along with its processing log and error code, so a replay that never appeared can be diagnosed rather than guessed at.

Uploading a pre-recorded video file is not supported in this version. Replays come from live broadcasts only — the recording path starts at your media server. A direct upload path is a later addition, as are clips (cutting a shareable segment out of a stream or replay).

Viewer analytics
Advanced analytics

You receive this. It ships behind a feature flag and sits on the Pro tier (when active) tier as configured, so it is revenue you can reserve for your own paying customers.

Live chatEvery live broadcast has a chat room next to the player. Messages fan out in real time to everyone watching, including signed-out viewers, who can read but not post. Posting requires an account. The whole surface is controlled by chat_enabled.

Slow mode is on by default for new broadcasts (slow_mode_default), which is the cheapest possible protection against a raid of copy-paste spam on a channel that has just started growing.

Stream moderation

Available in chat to streamers and channel moderators (stream_moderation):

Slow mode by defaultEvery live broadcast has a chat room next to the player. Messages fan out in real time to everyone watching, including signed-out viewers, who can read but not post. Posting requires an account. The whole surface is controlled by chat_enabled.

Slow mode is on by default for new broadcasts (slow_mode_default), which is the cheapest possible protection against a raid of copy-paste spam on a channel that has just started growing.

Chat moderation rulesEach rule has a position, so ordering is explicit, and an active toggle, so you can disable one without deleting it and losing its configuration.

Beyond commands, Thick carries a deterministic rule engine so moderation does not depend on a human being awake. Rules exist at platform level (your defaults, applying everywhere) and at channel level (a streamer's own additions), and are edited from the moderation screen. Rule kinds include:

You receive this. It ships behind a feature flag and sits on the tier as configured, so it is revenue you can reserve for your own paying customers.

Follows and live-now alerts (Channel follows with live-first discovery and configurable go-live automations)Channel follows with live-first discovery and configurable go-live automations
Streamer feedThe feed is a chronological wall, not a course or a classroom. A streamer composes at /studio/feed/compose (text plus media) and manages their own posts at /studio/feed. Followers read and comment; comments are threaded and load page by page.
CommentsThe feed is a chronological wall, not a course or a classroom. A streamer composes at /studio/feed/compose (text plus media) and manages their own posts at /studio/feed. Followers read and comment; comments are threaded and load page by page.
Per-post content gatingGating is resolved in the database, not in the page, so a locked post cannot be read by calling the API directly — a visitor who does not qualify sees the post greyed out with its requirement, never its content. Streamers set a default for new posts at /studio/settings/gating. The whole capability can be switched off with content_gating_enabled.

Each post carries a gating setting, so a streamer can reward the people who support them:

Direct messagesThick includes one-to-one messaging between a viewer and a streamer. It is deliberately narrow: no group threads, no shared inbox, no typing indicators. Messages arrive live, and each message records when it was read.

Each streamer chooses who may open a thread with them at /studio/settings/dm-policy: anyone, followers_only, or subs_only. Someone who does not qualify sees the thread read-only with an explanation instead of a send box. The policy is enforced on the server, not just hidden in the UI.

Messaging as a whole is controlled by dms_enabled. Administrative visibility into private threads is a separate switch, dms_oversight, and it is off by default — reading your users' private messages is a decision you opt into deliberately, and the oversight screen at /admin/dms-oversight only exists while it is on. /admin/community gives you a non-invasive overview of public feed activity instead.

Admin DM oversightThick includes one-to-one messaging between a viewer and a streamer. It is deliberately narrow: no group threads, no shared inbox, no typing indicators. Messages arrive live, and each message records when it was read.

Each streamer chooses who may open a thread with them at /studio/settings/dm-policy: anyone, followers_only, or subs_only. Someone who does not qualify sees the thread read-only with an explanation instead of a send box. The policy is enforced on the server, not just hidden in the UI.

Messaging as a whole is controlled by dms_enabled. Administrative visibility into private threads is a separate switch, dms_oversight, and it is off by default — reading your users' private messages is a decision you opt into deliberately, and the oversight screen at /admin/dms-oversight only exists while it is on. /admin/community gives you a non-invasive overview of public feed activity instead.

You receive this. It ships behind a feature flag and sits on the tier as configured, so it is revenue you can reserve for your own paying customers.

Wave-coin walletEvery account has one wallet holding a whole-number coin balance — no fractions. Behind it sits a full ledger: every credit and every debit is a row with the amount, the resulting balance, a reason (purchase, tip, subscription, refund, cash-out) and a reference to whatever caused it.

Two guarantees are enforced in the database, not in application code:

Every movement takes a row lock and writes the ledger entry in the same transaction, so two simultaneous tips cannot both spend the same balance. A daily reconciliation job re-adds the ledger and asserts it still equals the stored balance.

Viewers see their balance and full history at /me/wallet, filtered by purchases, tips, subscriptions and refunds. You see every movement across every account at /admin/wave-coin/transactions.

Channel subscriptionsThese are viewer-to-streamer subscriptions paid in coins, not platform plans you sell. Each streamer defines their own tiers at /studio/channel-subs/tiers — name, monthly coin price, perks and ordering — with 500, 1000 and 2500 coins per month as the suggested three-tier starting point.

Renewal happens on the subscription's monthly anniversary: a scheduled job debits the tier price from the subscriber's wallet and extends the period. If the wallet is short, the renewal simply does not go through — there is no debt, no negative balance and no collections. Viewers manage their subscriptions at /me/subscriptions; streamers see subscribers by tier at /studio/channel-subs. Switch: channel_subs_enabled.

Subscription status is also what subs_only gating and subs_only message policies check.

TippingA viewer can tip a streamer any amount they hold, with an optional message, either from the channel or during a live broadcast, where the tip pops up on screen in real time. The tip debits the viewer, credits the streamer and raises an event other automations can react to. Switch: tipping_enabled.
Leaderboards and badgesTips and subscriptions accumulate into a per-channel supporter standing: total coins spent, a tier code and badges. Each channel gets a capped top-100 leaderboard, and streamers see their top supporters on the earnings screen. Standing tiers (label, minimum spend, colour, icon) are configuration, so you can name and shape them for your community. Switch: gamification_enabled.
Cash-out queueA streamer requests a cash-out from /studio/earnings/cashout: an amount in coins plus their payout details. You work the queue at /admin/cashouts, tabbed by status, with a detail view per request at /admin/cashouts/[id] showing the streamer, the amount, their wallet history and the audit trail of every state change.
what's included

The platform underneath the product — counted in this product's own source, not claimed from a template. Where a row carries a list, open it to read the names behind the number.

AlipayCoinbasedLocalFlutterwaveKakaoPayKomojuLemon SqueezyMercado PagoMollieNOWPaymentsOpnPaddlePagSeguroPayPalPaystackRazorpayStripeWeChat Pay
AlipayAppleBitbucketDiscordFacebookFigmaGitHubGitLabGoogleKakaoKeycloakLINELinkedInMicrosoft AzureNaverNotionQQSlackSnapchatSpotifyTwitchVKWeChatWeiboWorkOSXYandexZoom
the schema and build
114page modules
361http operations
80tables
116migrations
161,886lines of source
6roles
measured 2026-09-01release v1.0.0 · built 2026-08-06
80 tables · 126 relationships
organizations41 refsusers40 refsstreamers13 refsstreams7 refsactive_boostsadmin_notificationsanalytics_dailyanalytics_eventsanalytics_funnelsannouncement_dismissalsannouncementsapi_key_logsapi_keysassistant_actionsassistant_conversationsassistant_messagesassistant_usageaudit_logsauthautomation_logautomation_templatescashout_requestschannel_moderatorschannel_post_commentschannel_postschannel_subscription_tierschannel_subscriptionschat_banschat_messageschat_moderation_ruleschat_timeoutscredit_balancescredit_transactionscurrenciesdata_exportsdata_importsdm_messagesdm_threadsfaq_categoriesfaq_itemsfeature_flagsfollowsinbound_webhook_eventsinbound_webhookslanguagesmarketing_audience_membersmarketing_audiencesnotification_lognotification_rulesnotificationsorganization_limit_overridesplansplatform_secretsplatform_settingsprocessed_eventsproduct_purchasesproductsprovider_pricespush_devicesrecordingsreport_templatesrolesscheduled_tasksseo_metastream_categoriesstreamer_applicationssubscriptionssupporter_standingssupporter_tierstheme_page_sectionstheme_section_librarytheme_sectionstipstranslationsuser_sessionsviewer_eventsvod_jobswallet_transactionswalletswebhook_logswebhooks

Hover a table to isolate what it touches; click one to read its relationships. The big nodes are what everything else hangs off. organizations is referenced by 41 tables because every single record in this product belongs to an organization, and that is what makes tenant isolation a property of the database rather than something the application has to remember on every query.

all 80 tables, as text

active_boosts · admin_notifications · analytics_daily · analytics_events · analytics_funnels · announcement_dismissals · announcements · api_key_logs · api_keys · assistant_actions · assistant_conversations · assistant_messages · assistant_usage · audit_logs · automation_log · automation_templates · cashout_requests · channel_moderators · channel_post_comments · channel_posts · channel_subscription_tiers · channel_subscriptions · chat_bans · chat_messages · chat_moderation_rules · chat_timeouts · credit_balances · credit_transactions · currencies · data_exports · data_imports · dm_messages · dm_threads · faq_categories · faq_items · feature_flags · follows · inbound_webhook_events · inbound_webhooks · languages · marketing_audience_members · marketing_audiences · notification_log · notification_rules · notifications · organization_limit_overrides · organizations · plans · platform_secrets · platform_settings · processed_events · product_purchases · products · provider_prices · push_devices · recordings · report_templates · roles · scheduled_tasks · seo_meta · stream_categories · streamer_applications · streamers · streams · subscriptions · supporter_standings · supporter_tiers · theme_page_sections · theme_section_library · theme_sections · tips · translations · user_sessions · users · viewer_events · vod_jobs · wallet_transactions · wallets · webhook_logs · webhooks

what you need to run Thick

The chassis, and anything particular to this product. 4 required, 1 optional.

Node host and Supabaserequired

Run the Next 16.2.10 application with React 19.2.3 and a Supabase project.

Streaming serverrequired

Run the media server that receives and transcodes incoming broadcasts.

Scheduled runnerrequired

Execute the seven jobs declared in `vercel.json`; another host must wire the same schedules.

Email deliveryrequired

Configure one shipped provider: Brevo, Mailgun, Resend, SendGrid, or SMTP.

Upstash and Sentryoptional

Optional cache/rate-limit and error-monitoring services exposed by the application.

Already built — plug and play

Every provider integration in this list ships wired into the product. You bring your own keys, connect them in the admin, and go live — there is no integration code to write. Nothing is resold through us: the ongoing cost is whatever these providers charge you. Capabilities marked plan-gated elsewhere on this page unlock by plan, not by extra code.

questions worth answering
What exactly do I receive after purchase?

The complete source repository behind the live demo — 161,886 lines across the application and its database, 80 tables defined by 116 migrations that the shipped scripts apply for you, plus the seed data, the demo accounts and the setup documentation. Not a subset and not a scaffold: the same code that runs the demo you just used.

Is the live demo the same product whose source I receive?

Yes. The Thick demo runs the delivered release (v1.0.0), and the build figures on this page are measured from that same source — not from a showcase build kept separately.

Can I test every account role before buying?

Yes — all 4 of them: Channel moderator, Streamer, Viewer, Platform owner. Each one is seeded in the live demo and reachable from the role board above, so you can inspect the product from the customer's side, the agent's side and the administrator's side before you decide.

Is this a complete product or a starter template?

Complete. 114 page modules and 361 HTTP operations, with authentication, roles, billing, an administration panel, background jobs and seeded demo data all wired and running. A template gives you the shape of an application; this is one you can deploy and start operating.

Can I rebrand and modify it?

Yes, without asking. The name, identity, copy, styling and code are yours to change. Rebranding and operating it as your own service is exactly what the licence is for.

What does the licence allow?

A perpetual, worldwide, non-exclusive, non-transferable licence to the product you bought and to every update released for it. The Standard licence covers one business — yours. If you deploy for clients, the Client licence covers up to five. You can modify it, rebrand it, deploy it and charge your own customers.

Can I resell the source code?

No. Reselling, redistributing, sublicensing or giving away the source itself is not permitted under either licence. You build and deliver products with it — the code stays with you.

What services and ongoing costs are required?

You bring your own accounts, so we never mark anything up and there is no ongoing cost to us beyond the purchase. Required: Node host and Supabase, Streaming server, Scheduled runner, Email delivery. Optional: Upstash and Sentry. The table above says exactly what stops working without each one; most have usable free tiers at low volume.

How difficult is deployment?

Two ways, and most buyers use the first. The installer in your saascode dashboard walks it: you create free accounts at Vercel and Supabase, connect them, and it provisions the database, applies 116 migrations, seeds the data, deploys and verifies the result — you watch the steps go green. Or take the source and do it yourself with the shipped scripts and docs, which is the same sequence run by hand.

What updates and support are included?

Updates to that product for as long as we maintain it — no renewal fee and no expiry date on your access. Support covers download problems, defects in the code as shipped, questions about what the product does and how it is structured, and licence questions. It does not cover debugging your own modifications, building features for you, or setting up your hosting and third-party accounts.

Why does a complete codebase cost $499?

Because it was built once and is distributed many times. SaaSCode builds each product and ships the same finished release through the catalog, so the price reflects repeatable distribution — not a reduced codebase, an unfinished template, or what the same work would cost commissioned.

Do I need to be a developer?

No, for the normal path. You create free accounts at Vercel and Supabase, connect them to the installer in your saascode dashboard, and it does the deployment for you — provision, migrate, seed, deploy, verify. What it asks of you is creating two accounts and copying a token, not writing code. If you would rather deploy it yourself, or host it somewhere else, the full source and the scripts are yours to do that with. Running the product day to day needs no technical skill at all: that happens through its own interface, which is what the demo shows.