Configuration
Every Glitch option across its three config files — what a stream earns with the defaults, the app, money, tiers and earnings, the simulated audience and categories, and the simulated chat, emotes and chat lines.
Three files, all in escrow_ignore:
shared/config.lua: the app, money, tiers, earnings, limits and rate limitsshared/config/audience.lua: the simulated audience and the categoriesshared/config/chat.lua: the simulated chat, emotes and fake usernames
Text players see lives in locales/en.json, including the simulated chat lines (sim.<pack>.<n>).
What a stream earns with the defaults
A one-hour stream at average interest, worked out with the same model the server runs:
| Tier | Typical crowd | Ads | Simulated subs | Simulated bits | Total |
|---|---|---|---|---|---|
| Streamer | 10 viewers | $179 | $22 | $30 | about $230 |
| Affiliate | 32 viewers | $711 | $71 | $259 | about $1,040 |
| Partner | 64 viewers | $1,787 | $205 | $536 | about $2,530 |
Real subs and cheers come on top, and are never capped. An exciting stream draws a bigger crowd than average; an idle one draws almost none and earns nothing while AFK.
shared/config.lua
| Option | Default | Meaning |
|---|---|---|
Config.Debug | false | Has no effect in this version; leave it false |
Config.App.id | glitch | The app id on the phone, and the id to use in the phone's preinstalled apps. Leave it as glitch: the phone only serves the id declared in fxmanifest.lua |
Config.App.color | #12B872 | The icon colour where pictures are not shown |
Config.App.iconBackground | green gradient | 1 to 3 colours behind the icon picture (web/dist/icon.svg) |
Config.App.order | 64 | Where the app sorts in the Store and on a new home screen; lower comes first |
Config.Money.account | bank | Where viewers pay from and cash-outs land |
Config.Money.subPrice | 250 | One month's subscription |
Config.Money.subDays | 30 | Days a month lasts (real days) |
Config.Money.maxMonthsAhead | 3 | How far ahead a viewer may pay |
Config.Money.bitPrice | 1 | What one bit costs |
Config.Money.cheers | 100, 500, 1000, 5000 | Bit amounts viewers can cheer |
Config.Money.minCashout | 50 | The smallest cash-out |
Config.Tiers | see below | The tiers, lowest first |
Config.TierWindow | 5 | Recent paid streams averaged for a tier's viewer threshold |
Config.Earnings.adPerViewerMinute | 0.3 | Ad revenue per viewer per minute, before the tier's multiplier |
Config.Earnings.minStreamMinutes | 10 | Shorter streams earn nothing from the simulated audience |
Config.Earnings.checkpointSeconds | 60 | How often a live stream's progress is saved |
Config.SimSupport.followsPerViewerHour | 0.25 | Simulated follows per viewer per hour |
Config.SimSupport.subsPerViewerHour | 0.015 | Simulated subs per viewer per hour |
Config.SimSupport.cheersPerViewerHour | 0.04 | Simulated cheers per viewer per hour |
Config.SimSupport.cheerBits | list | Bit amounts a simulated cheer picks from |
Config.Limits.* | Lengths (title, name, bio, chat, report note), list sizes, chat backlog, players per chat room, moderators per channel, the slow mode and timeout choices | |
Config.RateLimits.* | Requests per player per kind: { burst, per milliseconds }. opened (3 per 10 s) covers taking a phone out, when Glitch checks which account that phone is on | |
Config.Notifications.live | true | Tell followers when a channel goes live |
Config.Notifications.support | true | Tell streamers about subs and cheers |
Config.Notifications.liveFollowersMax | 300 | Followers told per go-live, most recent first |
Config.Notifications.liveRepeatMinutes | 30 | A follower hears about one channel at most this often |
Config.Report.reasons | six reasons | Report reasons on offer |
Config.PoliceJobs | police jobs | On-duty jobs that count as police near a streamer |
Simulated earnings are per tick, scaled by engagement (0.5 for a dull stream to 1.5 for a gripping one) and the tier.
Tiers
| Tier | Followers | Avg viewers | Streams | Ad multiplier | Platform cut | Hourly cap | Daily cap |
|---|---|---|---|---|---|---|---|
| Streamer | 0 | 0 | 0 | 1.0 | 50% | $600 | $2,500 |
| Affiliate | 50 | 8 | 5 | 1.3 | 40% | $1,500 | $6,000 |
| Partner | 400 | 30 | 20 | 1.6 | 30% | $3,000 | $12,000 |
A channel holds the highest tier whose three thresholds it meets. The caps limit what the simulated audience pays per rolling hour and day, counted per channel and per streaming character across all their channels; a cap of 0 means no cap, not no pay. To stop the simulated audience paying, set Config.Earnings.adPerViewerMinute, Config.SimSupport.subsPerViewerHour and Config.SimSupport.cheersPerViewerHour to 0. The cut applies to real and simulated subs and cheers.
shared/config/audience.lua
The short names in this table (baseViewers and the rest) are inside Config.Audience.
| Option | Default | Meaning |
|---|---|---|
Config.Sim.tickSeconds | 3 | One pass per live stream this often |
baseViewers | 3 | What a brand new channel draws |
followerTurnout | 0.03 | Share of followers who tune in |
popularityMax | 2000 | Popularity never goes past this |
rampMinutes, rampStart | 8, 0.35 | How the crowd builds after going live |
interestMin, interestMax | 0.35, 1.6 | Crowd multiplier at zero and full interest |
interestTau, spikeTau | 20, 30 | Seconds for interest to follow events, and for an event's excitement to fade |
growthPerMinute, decayPerMinute | 0.35, 0.45 | How fast the crowd closes the gap to its target, up and down |
jitter | 0.04 | Random wobble per tick |
consistencyPerDay, consistencyMax | 0.05, 0.3 | Crowd bonus for days streamed in the last week |
idleGraceDays, idleDecayPerDay | 3, 0.03 | Popularity fades after this long offline |
primeTime, lateNight | 18-23 ×1.15, 2-5 ×0.85 | In-game hours that draw more or fewer viewers |
realWeight | 5 | One real viewer counts as this many simulated ones toward popularity |
realPresenceBoost, realPresenceMax | 0.08, 1.0 | Each real viewer raises the simulated crowd's target, up to +100% |
realGrowthBoost, realGrowthMax | 0.15, 2.0 | And makes it grow faster |
learnRate | 0.25 | Share of the gap between popularity and a stream's audience learned per hour streamed |
followBoost, subBoost | 2, 6 | Popularity per real follow and sub |
chatBoost, chatBoostMax | 0.1, 30 | Popularity per real chat message, capped per stream |
simFollowBoost | 0.05 | Popularity per simulated follow |
afkSeconds, afkRadius | 180, 25 | Staying within this many metres with nothing happening this long is AFK, and an AFK stream earns nothing; the radius is also the one spot stillMinutes looks at |
afkTargetMult, afkDecayMult | 0.1, 3 | An AFK stream aims for a tenth of its crowd, which leaves three times faster |
loopWindow, loopPath, loopRadius, loopPenalty | 180, 250, 45, 0.55 | Going round in a small circle is repetitive and duller |
stillMinutes, stillPenalty | 20, 0.6 | One spot this long bores the crowd unless real viewers are there |
cellSize, newAreaSeconds | 250, 60 | Map cells; reaching one not seen this stream is a new area |
fastSpeed, highSpeed | 38, 42 | m/s counted as flat out, and that sets chat off |
crashDrop, crashBody | 13, 60 | A sudden stop with body damage, or this much damage at once, is a crash |
damageDrop, actionSeconds | 8, 30 | Health lost in a tick that counts as action, and how long action lasts |
nearRadius, nearCap, policeRadius | 35, 3, 60 | Company and police nearby |
talkThreshold, hintMaxAge | 0.15, 30 | Share of time talking that counts, and how long a client hint lasts |
Config.Spikes sets how much excitement each event adds (crash, death, damage, speed, police, new area).
Categories
Config.Categories lists each category's id, crowd multiplier mult, and weights: what makes that kind of stream interesting. Signals run 0 to 1: motion (speed), vehicle, social (players nearby), action (taking damage), danger (police or wanted), explore (new areas), talk (the microphone) and ambience (night, rain, storms, fog). The name players see is category.<id> in locales/en.json.
shared/config/chat.lua
The short names in this table (basePerMinute to emoteChance) are inside Config.Chat.
| Option | Default | Meaning |
|---|---|---|
basePerMinute, perViewerPerMinute, maxPerMinute | 1.5, 0.45, 45 | Simulated messages per minute at average interest |
maxPerTick | 5 | Most messages in one tick |
reactionMax | 3 | Most lines reacting to one event |
quietSeconds | 60 | Nothing happening this long starts the "quiet" lines |
poolBase, poolPerViewer, poolMax | 10, 1.5, 120 | How many simulated chatters a stream has |
subShare | 0.15 | Share of simulated chatters with a sub badge |
emoteChance | 0.3 | Chance a line gets an emote added |
Config.Emotes | 16 emotes | The emotes chat understands, written :name: |
Config.SimNames | two word lists | Simulated usernames are one word from each |
Config.ChatPacks | empty | Your own extra lines, by pack |
Adding chat lines
Add lines to a pack either in locales/en.json ("sim.crash.7": "...") or in Config.ChatPacks:
Config.ChatPacks = {
crash = { 'my insurance agent felt that {streamer} :skull:' },
cat_racing = { 'that apex was clean :fire:' },
}Packs: ambient, greet, hype, talk, quiet, afk, loop, night, rain, crash, death, damage, speed, area, police, follow, sub, cheer, welcome, and one per category (cat_<id>). Lines may use {streamer}, {user}, {bits} and {category}.
Installation
Setting up Glitch on top of Oxide Phone — requirements, start order, database tables, getting the app on phones, live stream limits, money, photo storage, checking it works and updating.
Admin
Moderating Glitch — who counts as an admin, the Moderation queue in Studio, what a ban does, the /glitch command and where admin actions and payments are logged.