π Publish in under 60 minutes β see the Quickstart Guide
| Β | Β |
|---|---|
| Time to first publish | < 60 minutes |
| Core loop | Tap β Upgrade β Rebirth β Pets β Offline earnings |
| Content updates | Edit one file (GameConfig.luau) |
| Security | Fully server-authoritative + session locking |
| Balance | Real Python simulator that gates CI |
| UI | 100% code, mobile-first, accessibility built-in |
| License | MIT β keep 100% of revenue |
Every star and fork helps more people find a solid foundation instead of starting from scratch.
All UI is built in code (no manual GUI objects). 44px minimum touch targets. Full Reduced Motion + colour-blind support. Mobile-first by design.
A complete, production-ready Roblox idle tycoon you can publish today.
Core loop: Tap vat β earn Goo β buy upgrades β unlock zones β rebirth for permanent multipliers β hatch pets β daily rewards + leaderboards.
Why idle/tycoon? Best revenue-per-hour for solo devs on Roblox. Your entire content pipeline is data in spreadsheets (one row = new zone/pet/upgrade). This is how you ship weekly and beat the algorithm.
Read
STRATEGY.mdfirst β it covers genre economics, competition, retention loops, and real monetization numbers.
| Feature | Why it saves you time / money |
|---|---|
| Modular service architecture | Add a full system with one file. No bootstrap edits ever. |
| Declarative networking | All remotes + validators + rate limits in one table. Security is impossible to forget. |
| Fully server-authoritative | Client sends intent only. Exploiters get zero value. |
| Session-locked DataStores | Prevents the #1 duplication bug in idle games. |
| Idempotent purchases | Save-before-confirm. Never double-charge or lose a sale. |
| Code-only mobile-first UI | 44px targets, Reduced Motion, accessibility β zero GUI objects in Studio. |
| Real CI balance simulator | Fails the build on bad progression. Caught a 33-minute rebirth during dev. |
| Single source of truth content | Everything lives in GameConfig.luau + Content.luau. Weekly updates = 15 min. |
| Accessibility by default | Reduced Motion, colour-blind modes, text scaling β persisted server-side. |
.rbxlx from Releasesid = 0 with your real Gamepass/Product IDsβ Full quickstart: QUICKSTART.md
git clone https://github.com/DLinacre/slime-factory-tycoon.git
cd slime-factory-tycoon
aftman install # or rokit install
rojo serve
Install the Rojo plugin in Studio and click Connect.
Download the latest .rbxlx from the Releases page and open in Roblox Studio.
slime-factory-tycoon/
βββ src/
β βββ shared/ β ReplicatedStorage/Modules
β β βββ GameConfig.luau β
economy, zones, pets, prices
β β βββ Content.luau β
achievements, cosmetics, settings, seasons
β β βββ Theme.luau β
colour, type, motion, breakpoints
β β βββ Net.luau declarative remotes + validators + rate limits
β β βββ Validate.luau composable argument validators
β β βββ ServiceRegistry.luau service locator + lifecycle
β β βββ Format.luau number abbreviation (1.2K / 3.4M / 5.6aa)
β βββ server/ β ServerScriptService
β β βββ Bootstrap.server.luau build β register β start. Nothing else.
β β βββ Services/ auto-discovered, no manual wiring
β β βββ DataManager.luau session-locked saves, autosave, BindToClose
β β βββ EconomyService.luau authoritative income, clicks, anti-cheat
β β βββ MonetizationService.luau gamepasses + idempotent ProcessReceipt
β β βββ PetService.luau server-side hatch RNG, published odds
β β βββ InventoryService.luau generic UID-keyed containers
β β βββ AchievementService.luau stat-driven unlocks
β β βββ CosmeticService.luau cosmetics (no economy access by design)
β β βββ SettingsService.luau server-persisted, cross-device
β β βββ DailyRewardService.luau 7-day streak
β β βββ LeaderboardService.luau OrderedDataStore, throttled
β β βββ CodeService.luau promo codes
β βββ client/ β StarterPlayer/StarterPlayerScripts
β βββ ClientMain.client.luau input, prediction, batched remotes
β βββ UI.luau themed component library
β βββ AudioEngine.luau pooled procedural SFX
β βββ UIBuilder.luau screen composition
βββ tools/
β βββ balance_sim.py progression simulator (runs in CI)
β βββ sync_site.py one-way sync to linacre.site
β βββ verify.sh every CI gate, locally
βββ assets/ logo Β· icon set Β· banner (PNG + WebP)
βββ game.manifest.json machine-readable project data
βββ docs β STRATEGY Β· SETUP Β· SECURITY Β· OPTIMISATION Β· LAUNCH Β· BRAND
The whole point of the architecture. Each of these is a single row in a data file, with no other code change:
| To add a⦠| Edit | Result |
|---|---|---|
| Upgrade | GameConfig.Upgrades |
Appears in the shop, priced, balanced |
| Zone | GameConfig.Zones |
Unlocks at its threshold, applies its multiplier |
| Pet | GameConfig.Pets |
Enters the hatch pool at its rarity weight |
| Achievement | Content.Achievements |
Tracks its stat, grants its reward automatically |
| Cosmetic | Content.Cosmetics |
Unlocks by progression, crystals, or Robux |
| Setting | Content.Settings |
Renders, validates, and persists itself |
| Remote | Net.REMOTES |
Created, validated, and rate-limited automatically |
Adding a service is one file in src/server/Services/ β itβs discovered and started automatically.
The part Iβm most glad exists. It parses GameConfig.luau directly β no duplicated numbers β simulates a player, and reports where theyβd get stuck.
$ python3 tools/balance_sim.py --hours 6
==============================================================
BALANCE SIM -- 6.0h session, 3.0 taps/s, 1.0x mult
==============================================================
parsed: 5 upgrades, 6 zones
rebirths reached : 4
lifetime goo : 298.69M
final zone : Neon Labs
longest stall : 2.9 min
timeline:
1.38 min Unlocked Goo Refinery
11.47 min Unlocked Toxic Caverns
21.78 min Rebirth #1
56.23 min Rebirth #2
77.73 min Unlocked Neon Labs
114.52 min Rebirth #3
with 2x Goo gamepass:
rebirths 4 -> 5
first rebirth 21.8 min -> 10.8 min (2.01x faster)
^ this is your gamepass sales pitch, in numbers
balance within target ranges.
It caught a real bug during development: the original rebirth cost put the first prestige at 33 minutes, well past where most players quit. Halving it moved it to 22 minutes. Thatβs a retention fix found in a second, without shipping anything.
CI runs --check, which exits non-zero if you push a config change that breaks these targets:
Full reasoning β including why players actually buy each item β is in STRATEGY.md.
Gamepasses: 2x Goo (199) Β· Auto-Clicker (149) Β· VIP (399) Β· +5 Pet Slots (299) Β· Lucky Egg (349) Β· Fast Rebirth (249)
Dev products: crystal packs (99 / 499 / 999) Β· 3x boost (79) Β· server-wide boost (199) Β· instant rebirth (149) Β· skip egg cooldown (49)
The server-wide boost is the highest-ROI item here: the buyer gets public thanks, and every other player in the server watches a purchase notification teach them that boosts exist. Itβs an advertisement that players pay you to run.
Premium Payout is treated as its own lever β Premium members get a permanent visible 1.25Γ and a dedicated daily chest. Youβre not selling them anything; youβre buying session time that Roblox pays you for.
Full threat model in SECURITY.md.
UpdateAsync (dupe prevention)Deliberately not included: client-side anti-cheat, remote name obfuscation, auto-banning. Theyβre either trivially bypassed or they punish real players for lag. Capping rewards server-side is strictly better than banning.
| Doc | Whatβs in it |
|---|---|
| STRATEGY.md | Genre analysis, competition, retention loop, full monetization plan, compliance |
| SETUP.md | Click-by-click Studio setup, object tree, file mapping |
| SECURITY.md | Exploits, dupe bugs, remote hardening, DataStore protection |
| OPTIMISATION.md | Mobile-first performance, server load, load times |
| LAUNCH.md | Release checklist, Roblox SEO, icon/thumbnail ideas, analytics to watch |
| BRAND.md | Palette semantics, typography, motion, accessibility, voice |
The line is drawn structurally, not by good intentions:
CosmeticService has no access to the economy multiplier. Pay-to-win isnβt discouraged here, itβs unrepresentable β a cosmetic physically cannot change income because the code path doesnβt exist.showOffers is a setting. A player can turn every shop popup off permanently, and the game still works.Not a backlog item. Shipped, persisted server-side, and synced across devices:
UI.tween() collapses to an instant property set, so every animation in the game respects it automatically rather than each call site remembering.UI.button.The project page at linacre.site/games renders directly from game.manifest.json. tools/sync_site.py recomputes the stats from source and copies the manifest and art across, so the website canβt drift from the repository β and canβt display a number that isnβt derived from the code.
Where information genuinely doesnβt exist yet (screenshots, the Roblox link), the page shows βComing Soonβ or a disabled βNot Yet Availableβ button. No placeholder imagery, no invented player counts.
AnalyticsService + funnel trackingCurrent state: v0.3.0 β fully playable and publishable.
PRs welcome. CI runs selene, stylua --check, the balance simulator, and a Rojo build. Run every CI check locally with one command β no tooling required beyond Python
(lint/format/build steps auto-skip if the tools arenβt installed):
./tools/verify.sh
Note on the CI badge: GitHub Actions requires Actions minutes to be enabled on the account. If the badge shows failing with zero steps executed, thatβs a billing/entitlement issue on the repo ownerβs account, not the code β
./tools/verify.shruns the identical checks locally.
Most first Roblox games earn very little. Success comes from shipping update #12+, not a perfect first version.
This template gives you:
Realistic timeline: 1 weekend to a playable game β 2-4 weekends to a publishable game with your own assets and IDs.
The balance simulator already proved its value β it caught a 33-minute first rebirth during development and moved it to ~22 minutes.
Can I sell a game made with this? Yes. MIT licence, no attribution required, keep all revenue.
Do I need to credit you? No. Appreciated, never required.
Will this get me moderated on Roblox? Nothing here violates Roblox policy. Hatch odds are published in-game, there are no fake timers, and thereβs no real-money gambling framing. You remain responsible for your own content and any changes you make.
Do I need Rojo?
No. Download the .rbxlx
and open it in Studio. Rojo is only for live-syncing your editor.
Why isnβt there a GitHub Actions badge?
Actions has no runner minutes on this account, so hosted jobs finish without
executing. Rather than display a badge that reports a failure that isnβt real,
the checks run locally β ./tools/verify.sh runs the identical gates.
Is this actually production-ready? The architecture, security and save handling are. You still need your own art, your own asset IDs, and a play-test pass before publishing.
My DataStores arenβt saving. Game Settings β Security β enable Studio Access to API Services. Without it every DataStore call fails silently and the code looks broken. It isnβt.
MIT β see LICENSE. Use it commercially, keep the Robux, no attribution required.