Skip to content

Project Structure

A well-organized project keeps server, client, and shared code cleanly separated. Here is the recommended layout for a Riptide project.

game/
├── ReplicatedStorage/
│ ├── Packages/
│ │ └── Riptide/ ← installed by pesde
│ ├── SharedModules/ ← shared between server & client
│ │ ├── CurrencyConfig.lua
│ │ └── ItemDatabase.lua
│ └── Components/ ← ComponentService modules (shared)
│ ├── Lava.lua
│ └── Checkpoint.lua
├── ServerScriptService/
│ ├── main.server.lua ← server entry point
│ └── Services/ ← server-only modules
│ ├── DataService.lua
│ ├── Economy/
│ │ └── CoinsService.lua
│ └── MatchService.lua
└── StarterPlayer/
└── StarterPlayerScripts/
├── main.client.lua ← client entry point
└── Controllers/ ← client-only modules
├── UIController.lua
└── InputController.lua
FolderPurposePassed to
Services/Server-only game logic (data, economy, combat).ModulesFolder on server
Controllers/Client-only UI and input logic.ModulesFolder on client
SharedModules/Code shared by both server and client.SharedModulesFolder on both
Components/CollectionService-based component classes.ComponentsFolder on both
Packages/External dependencies installed by pesde.require() directly
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local ServerScriptService = game:GetService("ServerScriptService")
local Riptide = require(ReplicatedStorage.Packages.Riptide)
Riptide.Server.Launch({
ModulesFolder = ServerScriptService.Services,
SharedModulesFolder = ReplicatedStorage.SharedModules,
ComponentsFolder = ReplicatedStorage.Components,
})
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Players = game:GetService("Players")
local Riptide = require(ReplicatedStorage.Packages.Riptide)
Riptide.Client.Launch({
ModulesFolder = Players.LocalPlayer.PlayerScripts.Controllers,
SharedModulesFolder = ReplicatedStorage.SharedModules,
ComponentsFolder = ReplicatedStorage.Components,
})

Both ModulesFolder and SharedModulesFolder accept arrays of folders:

Riptide.Server.Launch({
ModulesFolder = {
ServerScriptService.Services,
ServerScriptService.GameplayServices,
},
SharedModulesFolder = {
ReplicatedStorage.SharedModules,
ReplicatedStorage.LibModules,
},
})

This is useful when your codebase grows beyond a single directory per concern.