riptide/core

A lightweight and professional framework for Roblox.

    ____  _       __  _     __   
   / __ \(_)___  / /_(_)___/ /__ 
  / /_/ / / __ \/ __/ / __  / _ \
 / _, _/ / /_/ / /_/ / /_/ /  __/
/_/ |_/_/ .___/\__/_/\__,_/\___/ 
       /_/                       

Luau Roblox Pesde License CI

A lightweight, strictly-typed, and modular framework for Roblox.

Read the Documentation ๐Ÿ“š โ€ข Releases

๐ŸŒŠ Why Riptide?

Riptide was built from the ground up for production Roblox games. It solves the most common architecture problems while remaining invisible, staying out of your way, and scaling elegantly.

  • Deterministic Lifecycle: Phased initialization (Init โ†’ Start) eliminates race conditions.
  • Dependency Injection: Ditch circular require() chains. Inject your dependencies safely using canonical paths.
  • Unified Networking: One single RemoteEvent and RemoteFunction handle your entire game's network traffic. Zero ReplicatedStorage clutter. Let Riptide multiplex everything.
  • Strictly Typed: 100% --!strict Luau. Enjoy flawless autocomplete and compile-time safety right out of the box.
  • Built-in Power: Comes fully loaded with a robust StateMachine, ComponentService, and StateReplication.

๐Ÿ“ฆ Installation

Riptide is formally distributed via Pesde. Install it directly into your project using the Pesde CLI:

pesde add riptide/core

Via Wally

If you prefer Wally, Riptide is dual-published to the Wally index:

[dependencies]
Riptide = "riptide/[email protected]"

Manual Installation (.rbxm)

If you strictly prefer not to use package managers, you can download Riptide.rbxm directly from the Releases tab and insert it into ReplicatedStorage.Packages.

๐Ÿ Quick Look

Write clean, modular code with predictable execution phases.

--!strict
local RiptidePkg = require(ReplicatedStorage.Packages.Riptide)
type Riptide = RiptidePkg.Riptide

local PlayerState = {}

function PlayerState:Init(Riptide: Riptide)
    self.DataService = Riptide.GetService("DataService")
    
    Riptide.Network.Register("PlayerJumped", function(player, height)
        print(player.Name .. " jumped " .. height .. " studs!")
    end)
end

function PlayerState:Start(Riptide: Riptide)
    self.DataService:GiveMoney(100)
end

return PlayerState

๐Ÿงช Testing Architecture

Riptide guarantees production stability through a custom Hybrid Testing Architecture built on frktest.

  • Development / CI: Lightning-fast unit tests run via Lune CLI ensuring 0 millisecond regressions during active coding (lune run test/lune/RunLuneTests.luau).
  • Engine Integration: The exact same mock-free test suites seamlessly compile and run inside standard Roblox Studio DataModels, validating true Client/Server replication, network invocations, and Instance boundary behaviors.

Every single framework feature (StateReplication, ComponentService, Unified Networking, Async, and StateMachine) is covered by comprehensive Integration tests mapped across both sides of the network boundary.

๐Ÿ“š Documentation

For complete setup guides, API reference, and examples, visit our official documentation site:

๐Ÿ‘‰ Go to Riptide Documentation

๐Ÿ“„ License

This project is licensed under the MIT License - see the LICENSE file for details.