# TypeScript Support

List of exported types from the `lucide-react` package. These can be used to type your components when using Lucide icons in a TypeScript React project

## `LucideProps`

Exports all props that can be passed to an icon component and any other SVG attributes, see: [SVG Presentation Attributes on MDN](https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/Presentation).

ts

    interface LucideProps {
      size?: number | string;
      color?: string;
      strokeWidth?: number;
      absoluteStrokeWidth?: boolean;
      [key: string]: any; // Any other SVG attributes

### Using `LucideProps`

You can use the `LucideProps` interface to type your custom icon components or when you need to work with icon props.

tsx

    import { type LucideProps } from 'lucide-react';
    import { Camera } from 'lucide-react';

    const WrapIcon = (props: LucideProps) => {
      return <Camera {...props} />;
    };

    export default WrapIcon;

## `LucideIcon`

Type for individual icon components.

ts

    type LucideIcon = React.FC<LucideProps>;

### Using `LucideIcon`

You can use the `LucideIcon` type when you need to work with icon components directly.

tsx

    import { type LucideIcon } from 'lucide-react';

    interface ButtonProps {
      icon: LucideIcon;
      label: string;

    const IconButton = ({ icon: Icon, label }: ButtonProps) => {
      return (
        <button aria-label={label}>
          <Icon size={16} />
        </button>
      );
    };

    export default IconButton;

## `IconNode`

Type for the raw SVG structure of an icon. This is an array of SVG elements and their attributes to render the icon. Not commonly used directly in application code. But can be useful for advanced use cases, such as using custom icons or with Lucide Lab.

ts

    type IconNode = [elementName: string, attrs: Record<string, string | number>][];

### Using `IconNode`

You can use the `IconNode` type when you need to work with the raw SVG structure of an icon.

tsx

    import { type IconNode, Icon } from 'lucide-react';

    const customIcon: IconNode = [
      ['circle', { cx: 12, cy: 12, r: 10 }],
      ['line', { x1: 12, y1: 8, x2: 12, y2: 12 }],
      ['line', { x1: 12, y1: 16, x2: 12, y2: 16 }],
    ];

    const MyCustomIcon = () => {
      return (
        <Icon iconNode={customIcon} size={24} color="blue" />
      );
    };

    export default MyCustomIcon;


# Stroke width

All icons are designed with SVG elements using strokes. These have a default stroke width of `2px`.

The `strokeWidth` can be adjusted to create a different look of the icons.

## Adjusting stroke width with `strokeWidth` prop

    import { FolderLock } from "lucide-react";

    function App() {
      return (

          <FolderLock strokeWidth={1} />

      );

    export default App;

[Open Sandbox](https://codesandbox.io/api/v1/sandboxes/define?\[object Object\]&environment=create-react-app "Open in CodeSandbox")

## Absolute stroke width

When adjusting the `size` prop the size of the stroke width will be relative to the size of the icon, this is the default SVG behavior. The `absoluteStrokeWidth` prop is introduced to adjust this behavior to make the stroke width constant no matter the size of the icon.

This means that when `absoluteStrokeWidth` is enabled and the `size` of the icons is set to `48px` the `strokeWidth` will still be `2px` on the screen.

Note `2px` is the default stroke width for a Lucide icon, this can be adjusted to all sizes.

### Adjusting stroke width with `absoluteStrokeWidth` prop

Setting `absoluteStrokeWidth` to `true` will make the stroke width absolute.

    import { RollerCoaster } from "lucide-react";

    function App() {
      return (

          <RollerCoaster
            size={96}
            absoluteStrokeWidth={true}

      );

    export default App;

[Open Sandbox](https://codesandbox.io/api/v1/sandboxes/define?\[object Object\]&environment=create-react-app "Open in CodeSandbox")


# Installation

## Web

Implementation of the Lucide icon library for web applications.

pnpmyarnnpmbun

sh

    pnpm add lucide@next

sh

    yarn add lucide@next

sh

    npm install lucide@next

sh

    bun add lucide@next

For more details, see the [documentation](https://lucide.dev/guide/lucide/).

## React

Implementation of the Lucide icon library for React applications.

pnpmyarnnpmbun

sh

    pnpm add lucide-react@next

sh

    yarn add lucide-react@next

sh

    npm install lucide-react@next

sh

    bun add lucide-react@next

For more details, see the [documentation](https://lucide.dev/guide/react/). For React Native use the `lucide-react-native` package.

## Vue

Implementation of the Lucide icon library for Vue applications.

pnpmyarnnpmbun

sh

    pnpm add @lucide/vue

sh

    yarn add @lucide/vue

sh

    npm install @lucide/vue

sh

    bun add @lucide/vue

For more details, see the [documentation](https://lucide.dev/guide/vue/).

## Svelte

Implementation of the Lucide icon library for Svelte applications.

pnpmyarnnpmbun

sh

    pnpm add @lucide/svelte@next

sh

    yarn add @lucide/svelte@next

sh

    npm install @lucide/svelte@next

sh

    bun add @lucide/svelte@next

> `@lucide/svelte` is only for Svelte 5, for Svelte 4 use the `lucide-svelte` package.

For more details, see the [documentation](https://lucide.dev/guide/svelte/).

## Solid

Implementation of the Lucide icon library for Solid applications.

pnpmyarnnpmbun

sh

    pnpm add lucide-solid@next

sh

    yarn add lucide-solid@next

sh

    npm install lucide-solid@next

sh

    bun add lucide-solid@next

For more details, see the [documentation](https://lucide.dev/guide/solid/).

## Angular

Implementation of the Lucide icon library for Angular applications.

pnpmyarnnpmbun

sh

    pnpm add @lucide/angular

sh

    yarn add @lucide/angular

sh

    npm install @lucide/angular

sh

    bun add @lucide/angular

For more details, see the [documentation](https://lucide.dev/guide/angular/).

## Preact

Implementation of the Lucide icon library for preact applications.

pnpmyarnnpmbun

sh

    pnpm add lucide-preact@next

sh

    yarn add lucide-preact@next

sh

    npm install lucide-preact@next

sh

    bun add lucide-preact@next

For more details, see the [documentation](https://lucide.dev/guide/preact/).

## Astro

Implementation of the Lucide icon library for Astro applications.

pnpmyarnnpmbun

sh

    pnpm add @lucide/astro@next

sh

    yarn add @lucide/astro@next

sh

    npm install @lucide/astro@next

sh

    bun add @lucide/astro@next

For more details, see the [documentation](https://lucide.dev/guide/astro/).

## Static usage

Implementation of the Lucide icon library for multiple usages that like to use: SVG files icons, SVG Sprite, Icon Fonts and static SVG strings export in Common JS modules (for NodeJS).

pnpmyarnnpmbun

sh

    pnpm add lucide-static@next

sh

    yarn add lucide-static@next

sh

    npm install lucide-static@next

sh

    bun add lucide-static@next

For more details, see the [documentation](https://lucide.dev/guide/static/).

## Figma

The Lucide Figma plugin.

Visit [Figma community page](https://www.figma.com/community/plugin/939567362549682242/Lucide-Icons) to install the plugin.


# Stroke width

All icons are designed with SVG elements using strokes. These have a default stroke width of `2px`.

The `strokeWidth` can be adjusted to create a different look of the icons.

## Adjusting stroke width with `strokeWidth` prop

    <!DOCTYPE html>
    <html>
      <body>
        <i data-lucide="folder-lock" stroke-width="1"></i>

        <script src="index.js"></script>
      </body>
    </html>

[Open Sandbox](https://codesandbox.io/api/v1/sandboxes/define?\[object Object\]&environment=parcel "Open in CodeSandbox")


## Global styling

Adjusting icons can be done by using [color](https://lucide.dev/guide/lucide/basics/color), [size](https://lucide.dev/guide/lucide/basics/sizing) and [stroke width](https://lucide.dev/guide/lucide/basics/stroke-width). To style all icons globally, you can either use CSS, or use the `attrs` option in `createIcons`.

We recommend using CSS for global styling, as it is the most straightforward way to achieve this.

This will apply the `color`, `size` and `strokeWidth` props to all icons.

### Style by using attrs on `createIcons`

You can also apply global styles by passing attributes to the `createIcons` function.

    <!DOCTYPE html>
    <html>
      <body>
        <i data-lucide="building"></i>

        <script src="index.js"></script>
      </body>
    </html>

[Open Sandbox](https://codesandbox.io/api/v1/sandboxes/define?\[object Object\]&environment=parcel "Open in CodeSandbox")

### Style by using CSS

Styling icons is easy to accomplish using CSS.

Every icon has a class attribute applied called `lucide`. This class name can be used in the CSS file to target all icons that are being used within the app.

  * The **color** of the icons can be changed using the [`color`](https://developer.mozilla.org/en-US/docs/Web/CSS/color) CSS property.
  * The **size** of the icons can be changed using [`width`](https://developer.mozilla.org/en-US/docs/Web/CSS/width) and [`height`](https://developer.mozilla.org/en-US/docs/Web/CSS/height) CSS properties.
  * The **stroke width** of the icons can be changed using the [`stroke-width`](https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-width) CSS property.

    .lucide {
      /* Change this! */
      color: #ffadff;
      width: 48px;
      height: 48px;
      stroke-width: 1px;

    .app {
      display: grid;
      grid-template-columns: 1fr 1fr 1fr;
      grid-template-rows: 1fr 1fr 1fr;
      gap: 6px;

[Open Sandbox](https://codesandbox.io/api/v1/sandboxes/define?\[object Object\]&environment=parcel "Open in CodeSandbox")


# Sizing

By default, the size of all icons is `24px` by `24px`. The size is adjustable using the `width` and `height` attributes and or by CSS.

## Adjusting the icon size using the `width` and `height` attribute

    <!DOCTYPE html>
    <html>
      <body>
        <i data-lucide="landmark" width="64" height="64"></i>

        <script src="index.js">
        </script>
      </body>
    </html>

[Open Sandbox](https://codesandbox.io/api/v1/sandboxes/define?\[object Object\]&environment=parcel "Open in CodeSandbox")

## Adjusting the icon size via CSS

The CSS properties `width` and `height` can be used to adjust the icon size.

icon.cssindex.htmlindex.js

    .my-beer-icon {
      /* Change this! */
      width: 64px;
      height: 64px;

[Open Sandbox](https://codesandbox.io/api/v1/sandboxes/define?\[object Object\]&environment=parcel "Open in CodeSandbox")

### Dynamically change the icon size based on the font size

It is possible to resize icons based on font size. This can be achieved using the `em` unit. See this [MDN article](https://developer.mozilla.org/en-US/docs/Web/CSS/font-size#ems) for more information on the `em` unit.

icon.cssindex.jsindex.html

    .my-icon {
      /* Icon size will relative to font-size of .text-wrapper */
      width: 1em;
      height: 1em;

    .text-wrapper {
      /* Change this! */
      font-size: 96px;

      /* layout stuff */
      display: flex;
      gap: 0.25em;
      align-items: center;

[Open Sandbox](https://codesandbox.io/api/v1/sandboxes/define?\[object Object\]&environment=parcel "Open in CodeSandbox")

### Resizing with Tailwind

`size-*` utilities can be used to adjust the size of the icon. See the [Tailwind documentation](https://tailwindcss.com/docs/width#setting-both-width-and-height) for more information on the `size-*` utilities.

index.htmlindex.js

    import { createIcons, PartyPopper } from 'lucide/dist/cjs/lucide';
    import "./styles.css";

    createIcons({
      icons: {
        PartyPopper,
    });

[Open Sandbox](https://codesandbox.io/api/v1/sandboxes/define?\[object Object\]&environment=parcel "Open in CodeSandbox")


# Getting started

This guide will help you get started with Lucide in your Vanilla JavaScript project. Make sure you have a your environment set up. If you don't have one yet, you can create a new project using Vite, Parcel or any other boilerplate of your choice.

## Installation

### Package Managers

pnpmyarnnpmbun

sh

    pnpm add lucide

sh

    yarn add lucide

sh

    npm install lucide

sh

    bun add lucide

### CDN

html

We strongly suggest you anchor to a specific version, such as `https://unpkg.com/lucide@x.xxx.x/dist/umd/lucide.min.js`, rather than using `@latest`. This is because the latest version may introduce breaking changes that could potentially break your application. By anchoring to a specific version, you can ensure that your application remains stable and functional, even if there are updates to the library in the future.

## Importing your first icon

Lucide is built with ES Modules, so it's completely tree-shakable.

The `createIcons` function will search for HTMLElements with the attribute `data-lucide` and replace it with the svg from the given icon name.

### Example

html

js

    import { createIcons, icons } from 'lucide';

    // Caution, this will import all the icons and bundle them.
    createIcons({ icons });

    // Recommended way, to include only the icons you need.
    import { createIcons, Menu, ArrowRight, Globe } from 'lucide';

    createIcons({
      icons: {
        Menu,
        ArrowRight,
        Globe
    });

## Advanced Usage

### Additional Options

In the `createIcons` function you can pass some extra parameters:

  * you can pass `nameAttr` to adjust the attribute name to replace icons (default is `data-lucide`).
  * you can pass `attrs` to pass additional custom attributes, for instance CSS classes or stroke options.
  * you can pass `root` to provide a custom DOM element the icons should be replaced in (useful when manipulating small sections of a large DOM or elements in the shadow DOM)
  * you can pass `inTemplates: true` to also replace icons inside `<template>` tags.

Here is a full example:

js

    import { createIcons } from 'lucide';

    createIcons({
      attrs: {
        class: ['my-custom-class', 'icon'],
        'stroke-width': 1,
        stroke: '#333'
      },
      nameAttr: 'data-lucide', // attribute for the icon name.
      root: element, // DOM element to replace icons in.
      inTemplates: true // Also replace icons inside <template> tags.
    });

### Example using a CDN

html

    <!DOCTYPE html>


# Filled Icons

Fills are officially not supported. However, all SVG properties are available on all icons. Fill can still be used and will work fine on certain icons.

Example with stars:

index.htmlindex.jsicon.css

    <!DOCTYPE html>

[Open Sandbox](https://codesandbox.io/api/v1/sandboxes/define?\[object Object\]&environment=parcel "Open in CodeSandbox")


# Accessibility

Lucide icons ship with `aria-hidden="true"` by default. In almost all cases this is exactly what you want.

## Should icons be accessible?

Most of the time, icons are used purely for decoration or visual reinforcement. Exposing decorative icons to assistive technologies can create unnecessary noise for screen reader users.

For a broader explanation of this, and other best practices on how to use icons accessibly in your application, please refer to our detailed guide on accessibility:

[Accessible IconsBest practices for accessible icons in your application.](https://lucide.dev/guide/accessibility)

Only if an icon **conveys essential meaning on its own** should it be made accessible. The sections below explain how to do that in your app.

## Making an icon accessible

To expose an icon to assistive technologies, provide an accessible name by passing a `aria-label` prop to the icon component.

This removes the `aria-hidden` attribute and makes the icon visible to screen readers.

tsx

Choose a label that clearly describes the meaning of the icon or the action it represents in the context of your application.

## Accessible icon buttons

When an icon is used inside a button, the accessible label should usually be applied to the button itself, and not the icon.

html

    <button aria-label="Go to home">

    </button>

This ensures assistive technologies describe the interactive element, rather than the decorative graphic inside it.


# Color

By default, all icons have the color value: `currentColor`. This keyword uses the element's computed text `color` value to represent the icon color.

Read more about [`currentColor` on MDN](https://developer.mozilla.org/en-US/docs/Web/CSS/color_value#currentcolor_keyword).

## Adjust the color using the `color` attribute

The color can be adjusted by passing the color attribute to the element.

    <!DOCTYPE html>

[Open Sandbox](https://codesandbox.io/api/v1/sandboxes/define?\[object Object\]&environment=parcel "Open in CodeSandbox")

## Using parent elements text color value

Because the color of lucide icons uses `currentColor`, the color of the icon depends on the computed `color` of the element, or it inherits it from its parent.

For example, if a parent element's color value is `#fff` and one of the children is a lucide icon, the color of the icon will be rendered as `#fff`. This is browser native behavior.

    <!DOCTYPE html>

        <button style="color: white">

          Like
        </button>

[Open Sandbox](https://codesandbox.io/api/v1/sandboxes/define?\[object Object\]&environment=parcel "Open in CodeSandbox")


# Content Template element

By default icons inside `<template>` tags are not added. By setting the `inTemplates` option to `true`, icons inside templates will also be replaced.

More about [Content Template element on MDN](https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/template).

## Example using `createIcons` function with `template` element

index.jsindex.html

    import { createIcons, Backpack } from 'lucide/dist/cjs/lucide';
    import "./styles.css";

    createIcons({
      icons: {
        Backpack,
      },
      inTemplates: true
    });

    const container = document.getElementById("container");
    const template = document.getElementById("template");

    const firstClone = document.importNode(template.content, true);
    container.appendChild(firstClone);

    const secondClone = document.importNode(template.content, true);
    container.appendChild(secondClone);

[Open Sandbox](https://codesandbox.io/api/v1/sandboxes/define?\[object Object\]&environment=parcel "Open in CodeSandbox")


# With Lucide Lab or custom icons

[Lucide Lab](https://github.com/lucide-icons/lucide-lab) is a collection of icons that are not part of the Lucide main library.

They can be used by adding the `@lucide/lab` package to your project. All props like regular lucide icons can be passed to adjust the icon appearance.

## Using Lucide Lab icons

This creates a single icon based on the iconNode passed and renders a Lucide icon component.

index.htmlindex.js

    <!DOCTYPE html>
    <html>
      <body>
        <i data-lucide="avocado"></i>

        <script src="index.js"></script>
      </body>
    </html>

[Open Sandbox](https://codesandbox.io/api/v1/sandboxes/define?\[object Object\]&environment=parcel "Open in CodeSandbox")


# ShapecastHitbox
A shapecast-centric solution to melee hitboxes on Roblox. Successor to RaycastHitbox.

## Installation
To do


# Ignite

Ignite is a UI library for developing Roblox plugins. It includes 10+ goregeous high-dpi compatible components.

## Getting Started

1. Install Ignite via [Wally](https://wally.run/package/cameronpcampbell/ignite?version=1.0.0) or via [github releases](https://github.com/cameronpcampbell/Ignite/releases).
ignite = "mightypart/ignite@1.0.0"

2. Setup your `default.project.json` (if using rojo).
```json
  "name": "my_ignite_plugin",
  "tree": {
    "$className": "DataModel",

    "ServerStorage": {
      "Plugin": {
        "$path": "src", // replace with the path to your plugin's source.

        "Packages": { "$path": "Packages" }

3. Setup the root script of your plugin.
```lua
--!strict

--> Modules -------------------------------------------------------------------------------------------
local Packages = -- Path to Packages.
local Fusion = require(Packages.Fusion)
local Ignite = require(Packages.Ignite)
-------------------------------------------------------------------------------------------------------

--> Variables -----------------------------------------------------------------------------------------
local Scope = Fusion.scoped(Fusion, Ignite)
-------------------------------------------------------------------------------------------------------

-- We need to pass the plugin to the scope as it can
-- only be obtained in the plugin's root (this) script.
Scope:SetPlugin(plugin)

3. Example Ignite project.
```lua
--!strict

--> Modules -------------------------------------------------------------------------------------------
local Packages = -- Path to Packages.
local Fusion = require(Packages.Fusion)
local Ignite = require(Packages.Ignite)
-------------------------------------------------------------------------------------------------------

--> Variables -----------------------------------------------------------------------------------------
local Scope = Fusion.scoped(Fusion, Ignite)
local Children, OnEvent, peek = Fusion.Children, Fusion.OnEvent, Fusion.peek
-------------------------------------------------------------------------------------------------------

-- We need to pass the plugin to the scope as it can
-- only be obtained in the plugin's root (this) script.
Scope:SetPlugin(plugin)

local CounterState = Scope:Value(0)
local ComputeLabelText = Scope:Computed(function(use) return `Counter is: {use(CounterState)}` end)

Scope:Widget {
  Id = "IgnitePlugin",
  Title = "My First Ignite Plugin 🚀",
  InitDockState = Enum.InitialDockState.Left,
  FloatXSize = 300, FloatYSize = 800,

  [Children] = {
    Scope:TextLabel {
      Text = ComputeLabelText,
      LayoutOrder = 0
    },

    Scope:Button {
      Text = "Increment Counter!",
      LayoutOrder = 1,

      [OnEvent "MouseButton1Click"] = function()
        CounterState:set(peek(CounterState) + 1)
      end
    },

    Scope:New "UIListLayout" {
      SortOrder = Enum.SortOrder.LayoutOrder,
      Padding = UDim.new(0, 8)
    },

    Scope:New "UIPadding" {
      PaddingLeft = UDim.new(0, 8), PaddingRight = UDim.new(0, 8),
      PaddingTop = UDim.new(0, 8), PaddingBottom = UDim.new(0, 8)


_A simple and easy to use reactive UI library for Roblox._

It's great for making UI quickly and easily. Still in development, bugs may occur. Especially useful in Stories/Storybooks, with UI Labs. Feel free to make a Github Issue on it for bugs/improvements.

## Installation

You can get Quark from the `Quark.rbxm` file in the [Github Releases](https://github.com/creepersaur/Quark/releases/latest).
It's adviced to put the Quark module in ReplicatedStorage.

# [Documentation](https://creepersaur.github.io/quark)

Check out the documentation ^^^ for more info. It also serves as a tutorial for beginners.

# Examples

Examples for stories are given in the [examples](./src/examples/) folder. For smaller examples and info, check Documentation above.

## New:

```lua
local New = Quark.New
local Hook = Quark.Hook

New "TextButton" {
    -- Set properties
    Parent = script.parent,
    Size = UDim2.fromOffset(100, 100),
    BackgroundColor3 = Color3.new(1,0,0),

    -- Events
    Hook("Activated", function(self, ...)
        print("Button clicked")
    end),

    -- Set children
    children = {
        New "TextButton" {
            Size = UDim2.fromOffset(75, 30)

## States:

```lua
local State = Quark.State
local Counter = State(0) -- initialize

Counter( Counter() + 1 ) -- increment
print(Counter()) -- print counter value


**  Quark **
* [Documentation](https://creepersaur.github.io/quark/docs.html) API [](https://github.com/creepersaur/quark)

# Quark

A simple reactive UI library for Roblox.

[Documentation](https://creepersaur.github.io/quark/docs.html?GettingStarted/intro) API

Fully open source under the MIT license. Feel free to make changes.


# Nexus-VR-Core
Nexus VR Core is a utility for assisting the development
of VR content on Roblox.

## Documentation
See the [docs directory](docs) for documentation.

## Contributing
Both issues and pull requests are accepted for this project.

## License
Nexus VR Core is available under the terms of the MIT
License. See [LICENSE](LICENSE) for details.


ObjectCache
A robust, blazing fast part cache for Roblox

## Introduction
ObjectCache is a modern implementation on handling thousands of active parts, while keeping performance high.

## Why ObjectCache?
The source code is minimal and with no bloat, and with an important difference - it uses Roblox's `BulkMoveTo` API to achieve peak performance. Instead of manually setting the CFrame of each part one-by-one, all parts are batched together. And best of all, you don't need to worry about any of this! ObjectCache puts all returned objects into a queue to move them away, in the same frame as you call the method.

# Supports models
By utilizing the engine's behavior, the ObjectCache supports using models directly -- and it remains as efficient as ever, much faster than calling `:PivotTo`! To use a model as the template, you just have to set a PrimaryPart, and weld all parts in the model to the PrimaryPart. ObjectCache will call `BulkMoveTo` on the PrimaryPart, which will automatically move all the other parts in the model with it, at much faster speeds than normal!

## API
The API is dead simple - easy to learn, and eventually forget.
ObjectCache is fully typed, but an API reference is always handy to have:
```luau
ObjectCacheConstructor.new(Template: BasePart, CacheSize: number?, CachesContainer: Folder?) -> ObjectCache

ObjectCache:GetPart(PartCFrame: CFrame?): BasePart

ObjectCache:ReturnPart(Part: BasePart)

ObjectCache:Destroy()
You may have noticed that `ObjectCache:GetPart` lets you provide an optional target CFrame. This argument lets you squeeze out the maximum performance out of the module! Since `:GetPart(TargetCFrame)` and `:ReturnPart(Object)` both use queued `workspace:BulkMoveTo` calls, it can actually be more performant to call these two methods every frame.
The following video calls :GetPart and :ReturnPart every frame, yet runs smooth as butter:

*The place file used in the above video* (*can be found here*)[]

# Installation

Simply grab the file from Roblox marketplace: https://create.roblox.com/store/asset/18819618773/ObjectCache


<source media="(prefers-color-scheme: dark)" srcset="/gh-assets/LogoWhite.svg"></source>
      <source media="(prefers-color-scheme: light)" srcset="/gh-assets/LogoBlack.svg"></source>

  Unopinionated utility modules for Roblox and Luau.

## Modules 🧩

| Module            | Install                                                       | Description                          | Learn                                                           |
| ----------------- | ------------------------------------------------------------- | ------------------------------------ | --------------------------------------------------------------- |
| Wrapper           | [Wally](https://wally.run/package/imavafe/wrapper)            | Bind code to `Instance`s             | [Source](https://github.com/ImAvafe/Moonlets/tree/main/modules) |
| Stator            | [Wally](https://wally.run/package/imavafe/stator)             | Create minimal state machines        | [Source](https://github.com/ImAvafe/Moonlets/tree/main/modules) |
| Instantiate       | [Wally](https://wally.run/package/imavafe/instantiate)        | Construct instances w/ less code     | [Source](https://github.com/ImAvafe/Moonlets/tree/main/modules) |
| Leaderboard       | [Wally](https://wally.run/package/imavafe/leaderboard)        | Set leaderboard stats w/ one line    | [Source](https://github.com/ImAvafe/Moonlets/tree/main/modules) |
| HumanoidDescriber | [Wally](https://wally.run/package/imavafe/humanoid-describer) | Easily modify `HumanoidDescription`s | [Source](https://github.com/ImAvafe/Moonlets/tree/main/modules) |
| CoreThemer        | [Wally](https://wally.run/package/imavafe/core-themer)        | Easily theme Roblox's core UI        | [Source](https://github.com/ImAvafe/Moonlets/tree/main/modules) |
| Bootloader        | [Wally](https://wally.run/package/imavafe/bootloader)         | Load / unload OOP services           | [Source](https://github.com/ImAvafe/Moonlets/tree/main/modules) |

If you code in Roblox Studio, you can use [Studio Wally](https://github.com/fewkz/studio-wally) to install Wally packages.

## Values 💖

- **Infer types 🧐** - Types should be inferred where possible, giving you full typing on data you construct.
- **Don't assume 🕊** - You should not be locked into specific formats or methodologies. Not even OOP.
- **Minimize 😌** - Modules should not be bloated, overly-complex, or force their dependencies onto you.


# TweenServiceV2
TweenService V2 efficiently replicates movement between server and client using TweenService
by running the tweens clientside, and then doing a single update server side.

## Module:GetTweenObject(instance [Instance], TweenInfo [TweenInfo Object], PropertyTable [Table]) [Tween]
Parameters are exactly the same as TweenService:Create(), it returns a fake Tween object with Play,
Pause and Stop functions.

### Tween:QueuePlay(Yield [Boolean, optional], Player [Player Object, optional])

Add the tween to a tween queue which will start playing the queue automatically immediately after the previous tween on that instance completes. Behaves exactly the same way as Tween:Play() once started, except the initial firing of the tween is managed on the client. For this reason, best practice is to fire this event as close to when you would like it to be played on the client to maintain alignment between tweens. If fired multiple times in a short time frame, this may result in clients becoming out of sync over time.

## Tween:Play(Yield [Boolean, optional], Player [Player Object, optional])
Runs the tween. The player parameter will only play the tween for that specific player.
The Yield parameter specifies whether the function should yield until the tween has completed or not.

### Tween:Stop(Player [Player Object, optional])
Stops the tween. The player parameter will only stop the tween for that specific player.

### Tween:Pause(Player [Player Object, optional])
Pauses the tween. The player parameter will only pause the tween for that specific player.


# DYSYMMETRICAL
![DysymmetricalLogo](dysdocs/icon.png)
An asymmetrical game engine for Roblox.

## Features

#### Full documentation in most scripts
![DocScreenshot](dysdocs/docs-ss.png)
#### Easy UI Ordering in a single table
![UIOrderScreenshot](dysdocs/uiorder-ss.png)
#### Simple character definitions & Templates for each role
For these templates, the animations will have to be replaced as the ones they have are owned by CodeBots.
![CharScreenshot](dysdocs/chardef-ss.png)

[...]

![AbilitiesScreenshot](dysdocs/abilitydef-ss.png)
#### Pre-made customizable UI
![ShopScreenshot](dysdocs/shop-ss.png)
![EmoteShopScreenshot](dysdocs/emoteshop-ss.png)
![InventoryScreenshot](dysdocs/inventory-ss.png)
![EmoteInventoryScreenshot](dysdocs/emoteinventory-ss.png)
![StatsMenu](dysdocs/stats-ss.png)
![SettingsMenu](dysdocs/settings-ss.png)
![PlayerListUI](dysdocs/playerlist-ss.png)

#### 1K+ lines of documented utils in ReplicatedStorage and ServerScriptService
![UtilsScreenshot](dysdocs/utils-ss.png)
![SUtilsScreenshot](dysdocs/utils-ss2.png)

## DISCLAIMER
NO CODE or ESSENTIAL UI is being stolen from Forsaken.
There are certain assets from Forsaken used in this project's UI but they're nothing major and WILL be replaced soon.

## Getting Started
Read [Getting Started](https://github.com/CodeBotsStudio/Dysymmetrical/wiki/0.-Getting-Started) in the wiki.

## Bug reporting
If you find a certain bug in the engine, it'd be really appreciated if you reported it in the GitHub Issues page for this repo.

If you're able to fix it by yourself, it'd also be a great help if you opened a pull request fixing the issue.

Read `Contributing` below for more information.

## Documentation
Docs for anything added in the engine can be found through code comments at the start of important variables or functions. Any of those that isn't considered important outside of being used internally doesn't have any.

A proper docs page may be made if the project gets too big.

No one's stopping anyone from reading the code by themselves and changing it, though.

For animations, there are templates for Blender in `dysassets\Blend Files`.

## Contributing
Read [Contributing](https://github.com/CodeBotsStudio/Dysymmetrical/wiki/Contributing).

Any (fairly big) contributions made to the engine will be credited.

## Licensing
You may use this project for whatever you want, as long as you keep credit.
Do NOT remove the `print()` calls that identify this engine.
If you do, leave the engine credits in the game's description or in the credits menu in the lobby's sidebar.

Also see [LICENSE](https://github.com/CodeBotsStudio/Dysymmetrical/blob/main/LICENSE).

## Credits
Credits to [@PirosMacska](https://github.com/PirosMacska) for making the `VideoPlayer` module for 2D killer intros

Credits to [@grayzcale](https://github.com/grayzcale/simplepath) for the `SimplePath` module

## Pull Request credits

[@shroomii](https://github.com/shroomiii) in [#1](https://github.com/CodeBotsStudio/Dysymmetrical/pull/1) (clean .gitignore & GitHub Actions)
[@itred12](https://github.com/itred12) in multiple pulls that help to stabilize and optimize the engine a lot


[ CodeBotsStudio ](https://github.com/CodeBotsStudio) / ** [Dysymmetrical](https://github.com/CodeBotsStudio/Dysymmetrical) ** Public

  * [ Notifications ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical) You must be signed in to change notification settings
  * [ Fork 13 ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical)
  * [ Star  32 ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical)

# 0. Getting Started

Jump to bottom

LrgeAlvaro8882 edited this page Jan 11, 2026 · [7 revisions](https://github.com/CodeBotsStudio/Dysymmetrical/wiki/0.-Getting-Started/_history)

### Quick note

Make sure to have [VSCode](https://code.visualstudio.com/download), a GitHub account and [Git](https://git-scm.com/) & [GitHub Desktop](https://desktop.github.com/download/) installed before-hand! (GitHub Desktop isn't mandatory if you're familiar with Git but it makes life a lot easier, I won't be showing how to do it with Git commands).

### Required VSCode extensions

These extensions MUST be installed for everything to work properly and so that you have a smooth development experience.

  * [Rojo](https://marketplace.visualstudio.com/items?itemName=evaera.vscode-rojo)
  * [Selene](https://marketplace.visualstudio.com/items?itemName=Kampfkarren.selene-vscode)
  * [StyLua](https://marketplace.visualstudio.com/items?itemName=JohnnyMorganz.stylua)
  * [Lua](https://marketplace.visualstudio.com/items?itemName=sumneko.lua)
  * [Luau Language Server](https://marketplace.visualstudio.com/items?itemName=JohnnyMorganz.luau-lsp)

### Recommended VSCode extensions

  * [Todo+](https://marketplace.visualstudio.com/items?itemName=fabiospampinato.vscode-todo-plus) (to be able to leave notes like to-do's through code comments and jump to them)
  * [Better Comments](https://marketplace.visualstudio.com/items?itemName=aaron-bond.better-comments) (to make certain types of comments a different color)

### Joining a project (not creating it)

Follow [Joining A Project](https://github.com/CodeBotsStudio/Dysymmetrical/wiki/Joining-A-Project).

### Creating the game's repository

First, extract the latest code of the repository to a folder with the same name as your future GitHub repository.

You can get the code for the repository through `Code -> Download ZIP`

Here's how the final folder should look like:

Open GitHub Desktop (read the quick note at the top if you haven't) and create a new repository called the same as the folder you put Dysymmetrical in. Pick the parent folder when creating the repository so that it creates correctly.

When the repo is created, click `Publish repository` and configure the repo however you want.

GitHub Desktop won't be needed from now on but it's a good alternative to what I'll explain later.

### Rojo setup

Download [Rokit](https://github.com/rojo-rbx/rokit?tab=readme-ov-file#windows) following their installation tutorial.

After that, install [Wally](https://wally.run/install) by running `rokit install`, a package manager required for this engine to work.

When Wally is installed, restart VSCode and run `wally init` and `wally install` in VSCode's terminal.

Now that Wally is set up, create a `selene.toml` file in the root folder of the project.

Then, inside, simply write `std = "roblox"`. This will tell Selene that you want Roblox linting and it will stop complaining about literally everything.

Also make sure to enable the new type solver for the language server's plugin through its config.

To start Rojo, click the play icon besides the Rojo label at the bottom right.

The first time it'll open the Rojo menu at the top. Install the Roblox Studio plugin through the button in the menu if you haven't yet.

When installed, re-open the menu and click the label with a play icon to turn on the local server (also called "to serve"). Make sure that you use `default.project.json`.

This will make a window pop up at the bottom right saying that the Rojo server is listening (on).

### Rojo basics

I'd recommend enabling `Auto Save` to make it behave the same as Studio's editor.

While the Rojo server is listening you can connect it to Studio by opening the plugin window and hitting `Connect`.

If it says anything other than "Connected to session `PROJECTNAMEHERE`", read the Rojo docs.

Now everything is set up! Every time that you enter VSCode you'll have to do these steps.

### GitHub basics

To push changes to GitHub so that they save in the version control and so that collaborators can receive them, open `Source Control` in VSCode, name your changes, commit them and sync them.

If you haven't done this yet, copy your repository's link and add `.git` at the end.

For example: `https://github.com/CodeBotsStudio/Dysymmetrical.git`.

Then, take that link and execute `git remote add origin [LINK]` in the VSCode terminal, replacing `[LINK]` with the link.

To get changes that you don't have from GitHub, open the VSCode terminal and write `git pull origin main`.

### Updating the engine

If you haven't done this yet, execute `git remote add upstream https://github.com/CodeBotsStudio/Dysymmetrical.git`.

After that, execute `git pull upstream main --allow-unrelated-histories` to make the repo have the same commit history as Dysymmetrical to be able to get new commits that add code to your existing code.

When an update releases, you can execute `git pull upstream main` to get the changes from the engine's repository.

Make sure to read the changelog in `ServerScriptService/DYSYMMETRICAL_CHANGELOG` to see if you have to take anything from the example place (e.g. UI).

If there's any merge conflicts, check out [this page](https://code.visualstudio.com/docs/sourcecontrol/overview#_merge-conflicts).

### Clone this wiki locally


[ CodeBotsStudio ](https://github.com/CodeBotsStudio) / ** [Dysymmetrical](https://github.com/CodeBotsStudio/Dysymmetrical) ** Public

  * [ Notifications ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical) You must be signed in to change notification settings
  * [ Fork 13 ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical)
  * [ Star  32 ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical)

# Contributing

Jump to bottom

LrgeAlvaro8882 edited this page Oct 30, 2025 · [2 revisions](https://github.com/CodeBotsStudio/Dysymmetrical/wiki/Contributing/_history)

### Quick note

Read [Quick Note](https://github.com/CodeBotsStudio/Dysymmetrical/wiki/0.-Getting-Started#quick-note), [Required VSCode Extensions](https://github.com/CodeBotsStudio/Dysymmetrical/wiki/0.-Getting-Started#required-vscode-extensions) and [Recommended VSCode Extensions](https://github.com/CodeBotsStudio/Dysymmetrical/wiki/0.-Getting-Started#recommended-vscode-extensions) from [0\. Getting Started](https://github.com/CodeBotsStudio/Dysymmetrical/wiki/0.-Getting-Started).

Also know that I'll refer to **Pull Requests** as **PRs**.

### Creating the PR's repository

First, go to [Dysymmetrical's repository](https://github.com/CodeBotsStudio/Dysymmetrical) and click the button labeled `Fork` at the top right.

Then, leave everything as is _except_ for the name, that'll be named after a summary of 1-3 words of your changes (it can literally be named whatever you want but yeah).

In GitHub Desktop, clone the repository you just created in your local machine (PC) and open it with VSCode. Then, set it up like it says in [0\. Getting Started](https://github.com/CodeBotsStudio/Dysymmetrical/wiki/0.-Getting-Started).

When you get prompted with what you'll use the fork for, indicate that it's for contributing to the parent project.

When you've done your changes and commits, go to your GitHub page and click `Contribute`, then `Open Pull Request`.

Name your PR and describe what you've done in its description, then hit `Create Pull Request`.

After this, your PR will be reviewed and maybe merged into the main branch. You'll also get a thank you. :>

When your PR has been closed, you can remove the PR's repository from your account if you want to.

### Clone this wiki locally


[ CodeBotsStudio ](https://github.com/CodeBotsStudio) / ** [Dysymmetrical](https://github.com/CodeBotsStudio/Dysymmetrical) ** Public

  * [ Notifications ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical) You must be signed in to change notification settings
  * [ Fork 13 ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical)
  * [ Star  32 ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical)

# Joining A Project

Jump to bottom

LrgeAlvaro8882 edited this page Oct 30, 2025 · [1 revision](https://github.com/CodeBotsStudio/Dysymmetrical/wiki/Joining-A-Project/_history)

### Quick note

Read [Quick Note](https://github.com/CodeBotsStudio/Dysymmetrical/wiki/0.-Getting-Started#quick-note), [Required VSCode Extensions](https://github.com/CodeBotsStudio/Dysymmetrical/wiki/0.-Getting-Started#required-vscode-extensions) and [Recommended VSCode Extensions](https://github.com/CodeBotsStudio/Dysymmetrical/wiki/0.-Getting-Started#recommended-vscode-extensions) from [0\. Getting Started](https://github.com/CodeBotsStudio/Dysymmetrical/wiki/0.-Getting-Started).

### Adding someone to an existing repository (OWNER)

If you want to add someone to your GitHub repository to work on the game, you can do either one of these:

  * If the repo is owned by an organization, add them to either the organization or to the repo.
  * If not, add them to the repo directly.

Collaborators in a repo can be viewed in `Settings -> Collaborators`.

Add them preferably through their username.

### Working on the project (COLLABORATOR)

When you get added to a repo, clone it through GitHub Desktop.

After this, follow [0\. Getting Started](https://github.com/CodeBotsStudio/Dysymmetrical/wiki/0.-Getting-Started#rojo-setup) starting from `Rojo Setup`.

### Clone this wiki locally


[ CodeBotsStudio ](https://github.com/CodeBotsStudio) / ** [Dysymmetrical](https://github.com/CodeBotsStudio/Dysymmetrical) ** Public

  * [ Notifications ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical) You must be signed in to change notification settings
  * [ Fork 13 ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical)
  * [ Star  32 ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical)

# 1. Creating A Character

Jump to bottom

LrgeAlvaro8882 edited this page Jan 11, 2026 · [5 revisions](https://github.com/CodeBotsStudio/Dysymmetrical/wiki/1.-Creating-A-Character/_history)

### Quick note

All of the classes are in `ReplicatedStorage/Classes` (e.g. `Character` & `Ability`). This is useful for type checking and for getting the default settings for each class.

It's also important to use `Character.Create[TYPE]()` to make sure that everything necessary is there and that nothing will break (almost) every time the engine is updated.

For assets (that aren't bound to the character's model) used in abilities, define them in `Character.Config` to be able to change them in skin definitions.

### Making the script

Create a new script in `ReplicatedStorage/Characters/(CHARACTERTYPE)` with your character's name as the script name. It should be formatted without spaces and preferably case-sensitive.

For example, I have a character called "Nullex Voyd", so the script will be called `NullexVoyd.luau` in Git.

The character's model that'll be applied to the player will go in `ReplicatedStorage/Assets/Characters/(CHARACTERTYPE)` with the same name as the script. If it isn't named the same it won't work.

  * If you want to make sure a character model never gets leaked and is 100% secure, place it in `ServerStorage/Assets/Characters/(CHARACTERTYPE)` instead. This is useful for dev characters, as it will disable this character's preview on hover in the shop.

### Writing the script

First, we'll define what's the actual character table. Since Nullex Voyd is a killer, I'll do like so:

  * Get the default settings for the set role of the character
  * Set its `Config` variables (read them in the class for further info)
  * For variables that affect how the gameplay plays out with the character, GameplayConfig is available. Set all of the variables that affect gameplay in abilities there to make sure not to change them in skins.

Now, we'll define every ability. All of the abilities should be in an `Abilities` table in `GameplayConfig`, located in the same place as the `Config` table.

Starting with the slash:

The slash is the easiest out of them all as it's already pre-written. `Slash.Duration` is how long the hitbox will linger when enabled. In the Slash config, you can also set `Slash.Damage`.

After that, you can define any abilities you want. They'll be set in the order that you add them to the final table. As an example I'll use the "Callback Ping" ability for Nullex:

  * We create any constants that don't depend on being unique per player.
  * We define the ability basing off of the default settings.
    * Take into account that `Ability.InputName` takes the name of one of the ability input keys defined in `StarterPlayer/StarterPlayerScripts/InputManager:Init()`.

After defining the Config, we move on to making the ability's behaviour.

**QUICK NOTE:** Abilities also have an optional callback called `Ability:ExtraInit()` that only takes `self: Ability.Ability` as an argument just in case you want to create variables or execute code whenever an ability is initialized.

Instead of doing `Ability.Behaviour = function(self) end` you may also do `function Ability:Behaviour() end` and `self` will still be passed, apart from looking nicer. `Ability:Behaviour()` is first called by the server when it receives a signal and checks if it's possible to use the ability. Then, it sends a signal to the client to execute the same function. So, the functions should be split between client and server for it to work properly. They may also have common code, though on rare occasions.

We do this with every ability we want the character to have and, at the end, we define the ability table with all the abilities in order.

After this, define the character's info that'll show up in its `More Info` page. It's optional when the character isn't finished, but you'll eventually have to do it. Make sure to read the template characters to know how to write this.

Then, we return the character table for usage outside of the module.

### Extra attributes

If the character is supposed to be only for developers, add the `Dev` tag to the script in Studio and move the character's model to `ReplicatedStorage/Assets/Characters/(CHARACTERTYPE)`.

### Clone this wiki locally


[ CodeBotsStudio ](https://github.com/CodeBotsStudio) / ** [Dysymmetrical](https://github.com/CodeBotsStudio/Dysymmetrical) ** Public

  * [ Notifications ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical) You must be signed in to change notification settings
  * [ Fork 13 ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical)
  * [ Star  32 ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical)

# 2. Creating A Skin

Jump to bottom

LrgeAlvaro8882 edited this page Jan 11, 2026 · [6 revisions](https://github.com/CodeBotsStudio/Dysymmetrical/wiki/2.-Creating-A-Skin/_history)

### Quick note

All of the classes are in `ReplicatedStorage/Classes` (e.g. `Character` & `Ability`). This is useful for type checking and for getting the default settings for each class.

It's also important to use `Character.Create[TYPE]()` to make sure that everything necessary is there and that nothing will break (almost) every time the engine is updated.

For assets (that aren't bound to the character's model) used in abilities, define them in `Character.Config` to be able to change them in skin definitions.

### Making the script

Create a new script in `ReplicatedStorage/Characters/Skins/(CHARACTERTYPE)/(CHARACTERNAME)` with the skin's name as the script's name and the character that this skin will be for. Just like the character formatting, the name of the script should be formatted without spaces and preferably case-sensitive.

For example, I have a skin for Nullex called "Cyn" (yes, the Murder Drones character), so the script will be like so: `ReplicatedStorage/Characters/Skins/Nullex Voyd/Cyn.luau`.

The skin's model that'll be applied to the player will go in `ReplicatedStorage/Assets/Characters/Skins/(CHARACTERTYPE)/(CHARACTERNAME)` with the same name as the script. If it isn't named the same it won't work.

  * If you want to make sure a character model never gets leaked and is 100% secure, place it in `ServerStorage/Assets/Characters/(CHARACTERTYPE)/(CHARACTERNAME)` instead. This is useful for dev characters, as it will disable this character's preview on hover in the shop.

### Writing the script

Making a skin is a lot simpler than making a character, as the abilities are already defined and only aesthetics have to be changed.

We have to copy the entire table of the root character from `ReplicatedStorage/Characters/(CHARACTERTYPE)` and change variables from the Config.

  * We define the skin by copying the root character's table over and replace anything using `Utils:DeepTableOverwrite()`, which will overwrite any values in the original table that you set in the new one. The price will be for the skin and the quote will show up in the buy notification.
  * We simply return the skin table.

You shouldn't change GameplayConfig at all since that would make a skin P2W or P2L. Skins are supposed to be **cosmetic**.

### Extra attributes

If the skin is supposed to be only for developers, add the `Dev` tag to the script in Studio and move it to `ServerStorage/Assets/Characters/Skins/(CHARACTERTYPE)/(CHARACTERNAME)`.

If not, if the skin is a milestone, add the `Milestone` tag to the script in Studio and move it to `ServerStorage/Assets/Characters/Skins/(CHARACTERTYPE)/(CHARACTERNAME)`.

Any skin that isn't purchasable in the shop should have negative price as the skins in the inventory are ordered by lowest to highest price.

### Clone this wiki locally


[ CodeBotsStudio ](https://github.com/CodeBotsStudio) / ** [Dysymmetrical](https://github.com/CodeBotsStudio/Dysymmetrical) ** Public

  * [ Notifications ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical) You must be signed in to change notification settings
  * [ Fork 13 ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical)
  * [ Star  32 ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical)

# 3. Updating Animations

Jump to bottom

ChadMcOrgans2022 edited this page Nov 28, 2025 · [3 revisions](https://github.com/CodeBotsStudio/Dysymmetrical/wiki/3.-Updating-Animations/_history)

### Quick Note

The default animations need to be changed no matter what. If you do not change them, you will get an error and the animations won't play.

### Finding your Animation's ID

To find your Animation ID, navigate to your Creator Dashboard and find the animations. Click on the one you want to swap and copy the string of numbers in the link. This is your Animation ID. If you don't own the game place, you may need to allow the game or owner to use the animations.

### Changing the Default Animations

Navigate to ReplicatedStorage/Classes. Open the Character script.

#### Changing the Default **Killer** Animations

Find the function called `CharTypes:GetDefaultKillerSettings()`. Scroll down to the AnimationIDs list. It should look something like this.

        AnimationIDs = {
            IdleAnimation = "rbxassetid://(id)",
            WalkAnimation = "rbxassetid://(id)",
            RunAnimation = "rbxassetid://(id)",
            SlashAnimation = "rbxassetid://(id)",
         },

Swap out the default animation IDs with your animation IDs.

To find these, navigate to your Creator Dashboard and find the animations. Click on the one you want to swap and copy the string of numbers in the link. This is your Animation ID.

#### Changing the Default **Survivor** Animations

Find the function called `CharTypes:GetDefaultSurvivorSettings()`. Scroll down to the AnimationIDs list. Similar to before, it should look something like this.

        AnimationIDs = {
            IdleAnimation = "rbxassetid://(id)",
            WalkAnimation = "rbxassetid://(id)",
            RunAnimation = "rbxassetid://(id)",
         },

Swap out the default animation IDs with your animation IDs.

This page was brought to you by: MuffinCakes65

### Clone this wiki locally


[ CodeBotsStudio ](https://github.com/CodeBotsStudio) / ** [Dysymmetrical](https://github.com/CodeBotsStudio/Dysymmetrical) ** Public

  * [ Notifications ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical) You must be signed in to change notification settings
  * [ Fork 13 ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical)
  * [ Star  32 ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical)

# [History](https://github.com/CodeBotsStudio/Dysymmetrical/wiki/_history) / 0\. Getting Started

## Revisions

Compare revisions

  * small update for new stuff

[ LrgeAlvaro8882 ](https://github.com/LrgeAlvaro8882) committed Jan 11, 2026

[240f1a3](https://github.com/CodeBotsStudio/Dysymmetrical/wiki/0.-Getting-Started/240f1a3f61252c4d8596f682aadb0a6b508bc569)

  * this has happened to me twice and it's annoying

[ LrgeAlvaro8882 ](https://github.com/LrgeAlvaro8882) committed Nov 22, 2025

[8004981](https://github.com/CodeBotsStudio/Dysymmetrical/wiki/0.-Getting-Started/800498103aaa76f698a968b0a43909992a80a716)

  * vscode link

[ LrgeAlvaro8882 ](https://github.com/LrgeAlvaro8882) committed Nov 11, 2025

[505b6a7](https://github.com/CodeBotsStudio/Dysymmetrical/wiki/0.-Getting-Started/505b6a757c911c036e80d6f53f86574a3a1a7a19)

  * sorry, aftman isn't needed!

[ LrgeAlvaro8882 ](https://github.com/LrgeAlvaro8882) committed Nov 10, 2025

[b981030](https://github.com/CodeBotsStudio/Dysymmetrical/wiki/0.-Getting-Started/b98103029508ac3bf050b72f24332066bc3d91f3)

  * i forgot

[ LrgeAlvaro8882 ](https://github.com/LrgeAlvaro8882) committed Nov 8, 2025

[f7adbeb](https://github.com/CodeBotsStudio/Dysymmetrical/wiki/0.-Getting-Started/f7adbeb6eb581e40525d73deac0eea2a9b3378c5)

  * joining a project

[ LrgeAlvaro8882 ](https://github.com/LrgeAlvaro8882) committed Oct 30, 2025

[741fd67](https://github.com/CodeBotsStudio/Dysymmetrical/wiki/0.-Getting-Started/741fd67d2f2b85f71cd62162b16aff008e39d109)

  * getting started page

[ LrgeAlvaro8882 ](https://github.com/LrgeAlvaro8882) committed Oct 26, 2025

[83f7984](https://github.com/CodeBotsStudio/Dysymmetrical/wiki/0.-Getting-Started/83f79841b357b0935935155136f71f9cf0352b6c)


[ CodeBotsStudio ](https://github.com/CodeBotsStudio) / ** [Dysymmetrical](https://github.com/CodeBotsStudio/Dysymmetrical) ** Public

  * [ Notifications ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical) You must be signed in to change notification settings
  * [ Fork 13 ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical)
  * [ Star  32 ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical)

# Home

Jump to bottom

LrgeAlvaro8882 edited this page Oct 28, 2025 · [5 revisions](https://github.com/CodeBotsStudio/Dysymmetrical/wiki/Home/_history)

Welcome to the Dysymmetrical wiki!

# Frequently Asked Questions

### Q: "What `X.project.json` file to I use in the Rojo sync server?"

A: It's highly recommended to use `default.project.json` since `pack.project.json` has a different file hierarchy for GitHub Actions and you would have to create most folders manually.

### Q: "It says that Rojo tries to find a `$path` called 'Packages' and it doesn't serve!"

A: Run `wally install` in the terminal to update your packages.

### Q: "Do I mandatorily _definetly_ have to install and use Rojo to use this engine?"

A: Not really, but it's useful to collaborate with people, to keep To-Do's to date in an easier way, and to update the engine periodically.

### Q: "Can I remove the `print()` statements containing the credits for your engine?"

A: You can as long as you leave credit in the released game's description. Credit is mandatory.

### Q: "When I download the engine to test it, the animations, (probably) abilities and `X` features don't work!"

A: It may be missing permission for assets uploaded by CodeBots or me messing up something specific in the code. Usually my mess-ups are fixed momentarily as I test everything as much as I can. Try to replace the assets and/or wait for updating the engine.

### Clone this wiki locally


[ CodeBotsStudio ](https://github.com/CodeBotsStudio) / ** [Dysymmetrical](https://github.com/CodeBotsStudio/Dysymmetrical) ** Public

  * [ Notifications ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical) You must be signed in to change notification settings
  * [ Fork 13 ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical)
  * [ Star  32 ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical)

# [History](https://github.com/CodeBotsStudio/Dysymmetrical/wiki/_history) / Contributing

## Revisions

Compare revisions

  * uh

[ LrgeAlvaro8882 ](https://github.com/LrgeAlvaro8882) committed Oct 30, 2025

[44ba746](https://github.com/CodeBotsStudio/Dysymmetrical/wiki/Contributing/44ba7460800fa19e6b02672600f987eefa0d7972)

  * contributing

[ LrgeAlvaro8882 ](https://github.com/LrgeAlvaro8882) committed Oct 30, 2025

[b1d93e6](https://github.com/CodeBotsStudio/Dysymmetrical/wiki/Contributing/b1d93e68e60e989646671d5d1f6559830446387e)


[ CodeBotsStudio ](https://github.com/CodeBotsStudio) / ** [Dysymmetrical](https://github.com/CodeBotsStudio/Dysymmetrical) ** Public

  * [ Notifications ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical) You must be signed in to change notification settings
  * [ Fork 13 ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical)
  * [ Star  32 ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical)

# [History](https://github.com/CodeBotsStudio/Dysymmetrical/wiki/_history) / Joining A Project

## Revisions

  * joining a project

[ LrgeAlvaro8882 ](https://github.com/LrgeAlvaro8882) committed Oct 30, 2025

[741fd67](https://github.com/CodeBotsStudio/Dysymmetrical/wiki/Joining-A-Project/741fd67d2f2b85f71cd62162b16aff008e39d109)


[ CodeBotsStudio ](https://github.com/CodeBotsStudio) / ** [Dysymmetrical](https://github.com/CodeBotsStudio/Dysymmetrical) ** Public

  * [ Notifications ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical) You must be signed in to change notification settings
  * [ Fork 13 ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical)
  * [ Star  32 ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical)

# [History](https://github.com/CodeBotsStudio/Dysymmetrical/wiki/_history) / 1\. Creating A Character

## Revisions

Compare revisions

  * small update for new stuff

[ LrgeAlvaro8882 ](https://github.com/LrgeAlvaro8882) committed Jan 11, 2026

[240f1a3](https://github.com/CodeBotsStudio/Dysymmetrical/wiki/1.-Creating-A-Character/240f1a3f61252c4d8596f682aadb0a6b508bc569)

  * corrected some things

[ LrgeAlvaro8882 ](https://github.com/LrgeAlvaro8882) committed Dec 23, 2025

[c6efa8a](https://github.com/CodeBotsStudio/Dysymmetrical/wiki/1.-Creating-A-Character/c6efa8ae0f9ca85912f4b9b633f9c6c098d2b783)

  * 1.4.9 update

[ LrgeAlvaro8882 ](https://github.com/LrgeAlvaro8882) committed Nov 20, 2025

[842605f](https://github.com/CodeBotsStudio/Dysymmetrical/wiki/1.-Creating-A-Character/842605f0c2293071d72b7bbab14e4da9b01b2a54)

  * updated format

[ LrgeAlvaro8882 ](https://github.com/LrgeAlvaro8882) committed Nov 18, 2025

[0941483](https://github.com/CodeBotsStudio/Dysymmetrical/wiki/1.-Creating-A-Character/09414834cdda195df0db99ab0075b53375c78103)

  * s

[ LrgeAlvaro8882 ](https://github.com/LrgeAlvaro8882) committed Oct 20, 2025

[89786ec](https://github.com/CodeBotsStudio/Dysymmetrical/wiki/1.-Creating-A-Character/89786ec10c665b74bf47d76d710dd6a6611e9c3a)


[ CodeBotsStudio ](https://github.com/CodeBotsStudio) / ** [Dysymmetrical](https://github.com/CodeBotsStudio/Dysymmetrical) ** Public

  * [ Notifications ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical) You must be signed in to change notification settings
  * [ Fork 13 ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical)
  * [ Star  32 ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical)

# [History](https://github.com/CodeBotsStudio/Dysymmetrical/wiki/_history) / 2\. Creating A Skin

## Revisions

Compare revisions

  * small update for new stuff

[ LrgeAlvaro8882 ](https://github.com/LrgeAlvaro8882) committed Jan 11, 2026

[240f1a3](https://github.com/CodeBotsStudio/Dysymmetrical/wiki/2.-Creating-A-Skin/240f1a3f61252c4d8596f682aadb0a6b508bc569)

  * corrected some things

[ LrgeAlvaro8882 ](https://github.com/LrgeAlvaro8882) committed Dec 23, 2025

[c6efa8a](https://github.com/CodeBotsStudio/Dysymmetrical/wiki/2.-Creating-A-Skin/c6efa8ae0f9ca85912f4b9b633f9c6c098d2b783)

  * 1.4.9 update

[ LrgeAlvaro8882 ](https://github.com/LrgeAlvaro8882) committed Nov 20, 2025

[842605f](https://github.com/CodeBotsStudio/Dysymmetrical/wiki/2.-Creating-A-Skin/842605f0c2293071d72b7bbab14e4da9b01b2a54)

  * updated format

[ LrgeAlvaro8882 ](https://github.com/LrgeAlvaro8882) committed Nov 18, 2025

[0941483](https://github.com/CodeBotsStudio/Dysymmetrical/wiki/2.-Creating-A-Skin/09414834cdda195df0db99ab0075b53375c78103)

  * how do i mess up this bad

[ LrgeAlvaro8882 ](https://github.com/LrgeAlvaro8882) committed Nov 13, 2025

[4207e92](https://github.com/CodeBotsStudio/Dysymmetrical/wiki/2.-Creating-A-Skin/4207e92cbbf2b04c0b9879b186e2d99e651a118e)

  * s

[ LrgeAlvaro8882 ](https://github.com/LrgeAlvaro8882) committed Oct 20, 2025

[89786ec](https://github.com/CodeBotsStudio/Dysymmetrical/wiki/2.-Creating-A-Skin/89786ec10c665b74bf47d76d710dd6a6611e9c3a)


[ CodeBotsStudio ](https://github.com/CodeBotsStudio) / ** [Dysymmetrical](https://github.com/CodeBotsStudio/Dysymmetrical) ** Public

  * [ Notifications ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical) You must be signed in to change notification settings
  * [ Fork 13 ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical)
  * [ Star  32 ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical)

# [History](https://github.com/CodeBotsStudio/Dysymmetrical/wiki/_history) / 3\. Updating Animations

## Revisions

Compare revisions

  * Update 3.-Updating-Animations.md

[ ChadMcOrgans2022 ](https://github.com/ChadMcOrgans2022) committed Nov 28, 2025

[26998e1](https://github.com/CodeBotsStudio/Dysymmetrical/wiki/3.-Updating-Animations/26998e13b59eb08163dface4809c3f6444767c66)

  * Update 3.-Updating-Animations.md

[ ChadMcOrgans2022 ](https://github.com/ChadMcOrgans2022) committed Nov 28, 2025

[6a6578b](https://github.com/CodeBotsStudio/Dysymmetrical/wiki/3.-Updating-Animations/6a6578bf394ec8192a93d526a7b86aa182df40fa)

  * Added a wiki page for changing animations

[ ChadMcOrgans2022 ](https://github.com/ChadMcOrgans2022) committed Nov 28, 2025

[4e63cf9](https://github.com/CodeBotsStudio/Dysymmetrical/wiki/3.-Updating-Animations/4e63cf9c86f1a3f287787ca14eadc5a6c58b3a7f)


[ CodeBotsStudio ](https://github.com/CodeBotsStudio) / ** [Dysymmetrical](https://github.com/CodeBotsStudio/Dysymmetrical) ** Public

  * [ Notifications ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical) You must be signed in to change notification settings
  * [ Fork 13 ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical)
  * [ Star  32 ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical)

# 0. Getting Started

Jump to bottom

LrgeAlvaro8882 edited this page Nov 8, 2025 · [7 revisions](https://github.com/CodeBotsStudio/Dysymmetrical/wiki/0.-Getting-Started/_history)

### Quick note

Make sure to have a GitHub account and [Git](https://git-scm.com/) & [GitHub Desktop](https://desktop.github.com/download/) installed before-hand! (GitHub Desktop isn't mandatory if you're familiar with Git but it makes life a lot easier, I won't be showing how to do it with Git commands).

### Required VSCode extensions

These extensions MUST be installed for everything to work properly and so that you have a smooth development experience.

  * [Rojo](https://marketplace.visualstudio.com/items?itemName=evaera.vscode-rojo)
  * [Selene](https://marketplace.visualstudio.com/items?itemName=Kampfkarren.selene-vscode)
  * [StyLua](https://marketplace.visualstudio.com/items?itemName=JohnnyMorganz.stylua)
  * [Lua](https://marketplace.visualstudio.com/items?itemName=sumneko.lua)
  * [Luau Language Server](https://marketplace.visualstudio.com/items?itemName=JohnnyMorganz.luau-lsp)

### Recommended VSCode extensions

  * [Todo+](https://marketplace.visualstudio.com/items?itemName=fabiospampinato.vscode-todo-plus) (to be able to leave notes like to-do's through code comments and jump to them)
  * [Better Comments](https://marketplace.visualstudio.com/items?itemName=aaron-bond.better-comments) (to make certain types of comments a different color)

### Joining a project (not creating it)

Follow [Joining A Project](https://github.com/CodeBotsStudio/Dysymmetrical/wiki/Joining-A-Project).

### Creating the game's repository

First, extract the latest code of the repository to a folder with the same name as your future GitHub repository.

You can get the code for the repository through `Code -> Download ZIP`

Here's how the final folder should look like:

Open GitHub Desktop (read the quick note at the top if you haven't) and create a new repository called the same as the folder you put Dysymmetrical in. Pick the parent folder when creating the repository so that it creates correctly.

When the repo is created, click `Publish repository` and configure the repo however you want.

GitHub Desktop won't be needed from now on but it's a good alternative to what I'll explain later.

### Rojo setup

Download [Aftman](https://github.com/LPGhatguy/aftman?tab=readme-ov-file#installation) following their installation tutorial.

After that, install [Wally](https://wally.run/install), a package manager required for this engine to work.

When Wally is installed, restart VSCode and run `wally init` and `wally install` in VSCode's terminal.

Now that Wally is set up, click the play icon besides the Rojo label at the bottom right.

The first time it'll open the Rojo menu at the top. Install the Roblox Studio plugin through the button in the menu if you haven't yet.

When installed, re-open the menu and click the label with a play icon to turn on the local server (also called "to serve"). Make sure that you use `default.project.json`.

This will make a window pop up at the bottom right saying that the Rojo server is listening (on).

### Rojo basics

I'd recommend enabling `Auto Save` to make it behave the same as Studio's editor.

While the Rojo server is listening you can connect it to Studio by opening the plugin window and hitting `Connect`.

If it says anything other than "Connected to session `PROJECTNAMEHERE`", read the Rojo docs.

Now everything is set up! Every time that you enter VSCode you'll have to do these steps.

### GitHub basics

To push changes to GitHub so that they save in the version control and so that collaborators can receive them, open `Source Control` in VSCode, name your changes, commit them and sync them.

If you haven't done this yet, copy your repository's link and add `.git` at the end.

For example: `https://github.com/CodeBotsStudio/Dysymmetrical.git`.

Then, take that link and execute `git remote add origin [LINK]` in the VSCode terminal, replacing `[LINK]` with the link.

To get changes that you don't have from GitHub, open the VSCode terminal and write `git pull origin main`.

### Updating the engine

If you haven't done this yet, execute `git remote add upstream https://github.com/CodeBotsStudio/Dysymmetrical.git`.

When an update releases, you can execute `git pull upstream main` to get the changes from the engine's repository.

Make sure to read the changelog in `ServerScriptService/DYSYMMETRICAL_CHANGELOG` to see if you have to take anything from the example place (e.g. UI).

If there's any merge conflicts, check out [this page](https://code.visualstudio.com/docs/sourcecontrol/overview#_merge-conflicts).

### Clone this wiki locally


[ CodeBotsStudio ](https://github.com/CodeBotsStudio) / ** [Dysymmetrical](https://github.com/CodeBotsStudio/Dysymmetrical) ** Public

  * [ Notifications ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical) You must be signed in to change notification settings
  * [ Fork 13 ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical)
  * [ Star  32 ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical)

# 0. Getting Started

Jump to bottom

LrgeAlvaro8882 edited this page Nov 11, 2025 · [7 revisions](https://github.com/CodeBotsStudio/Dysymmetrical/wiki/0.-Getting-Started/_history)

### Quick note

Make sure to have [VSCode](https://code.visualstudio.com/download), a GitHub account and [Git](https://git-scm.com/) & [GitHub Desktop](https://desktop.github.com/download/) installed before-hand! (GitHub Desktop isn't mandatory if you're familiar with Git but it makes life a lot easier, I won't be showing how to do it with Git commands).

### Required VSCode extensions

These extensions MUST be installed for everything to work properly and so that you have a smooth development experience.

  * [Rojo](https://marketplace.visualstudio.com/items?itemName=evaera.vscode-rojo)
  * [Selene](https://marketplace.visualstudio.com/items?itemName=Kampfkarren.selene-vscode)
  * [StyLua](https://marketplace.visualstudio.com/items?itemName=JohnnyMorganz.stylua)
  * [Lua](https://marketplace.visualstudio.com/items?itemName=sumneko.lua)
  * [Luau Language Server](https://marketplace.visualstudio.com/items?itemName=JohnnyMorganz.luau-lsp)

### Recommended VSCode extensions

  * [Todo+](https://marketplace.visualstudio.com/items?itemName=fabiospampinato.vscode-todo-plus) (to be able to leave notes like to-do's through code comments and jump to them)
  * [Better Comments](https://marketplace.visualstudio.com/items?itemName=aaron-bond.better-comments) (to make certain types of comments a different color)

### Joining a project (not creating it)

Follow [Joining A Project](https://github.com/CodeBotsStudio/Dysymmetrical/wiki/Joining-A-Project).

### Creating the game's repository

First, extract the latest code of the repository to a folder with the same name as your future GitHub repository.

You can get the code for the repository through `Code -> Download ZIP`

Here's how the final folder should look like:

Open GitHub Desktop (read the quick note at the top if you haven't) and create a new repository called the same as the folder you put Dysymmetrical in. Pick the parent folder when creating the repository so that it creates correctly.

When the repo is created, click `Publish repository` and configure the repo however you want.

GitHub Desktop won't be needed from now on but it's a good alternative to what I'll explain later.

### Rojo setup

Download [Rokit](https://github.com/rojo-rbx/rokit?tab=readme-ov-file#windows) following their installation tutorial.

After that, install [Wally](https://wally.run/install) by running `rokit install`, a package manager required for this engine to work.

When Wally is installed, restart VSCode and run `wally init` and `wally install` in VSCode's terminal.

Now that Wally is set up, click the play icon besides the Rojo label at the bottom right.

The first time it'll open the Rojo menu at the top. Install the Roblox Studio plugin through the button in the menu if you haven't yet.

When installed, re-open the menu and click the label with a play icon to turn on the local server (also called "to serve"). Make sure that you use `default.project.json`.

This will make a window pop up at the bottom right saying that the Rojo server is listening (on).

### Rojo basics

I'd recommend enabling `Auto Save` to make it behave the same as Studio's editor.

While the Rojo server is listening you can connect it to Studio by opening the plugin window and hitting `Connect`.

If it says anything other than "Connected to session `PROJECTNAMEHERE`", read the Rojo docs.

Now everything is set up! Every time that you enter VSCode you'll have to do these steps.

### GitHub basics

To push changes to GitHub so that they save in the version control and so that collaborators can receive them, open `Source Control` in VSCode, name your changes, commit them and sync them.

If you haven't done this yet, copy your repository's link and add `.git` at the end.

For example: `https://github.com/CodeBotsStudio/Dysymmetrical.git`.

Then, take that link and execute `git remote add origin [LINK]` in the VSCode terminal, replacing `[LINK]` with the link.

To get changes that you don't have from GitHub, open the VSCode terminal and write `git pull origin main`.

### Updating the engine

If you haven't done this yet, execute `git remote add upstream https://github.com/CodeBotsStudio/Dysymmetrical.git`.

When an update releases, you can execute `git pull upstream main` to get the changes from the engine's repository.

Make sure to read the changelog in `ServerScriptService/DYSYMMETRICAL_CHANGELOG` to see if you have to take anything from the example place (e.g. UI).

If there's any merge conflicts, check out [this page](https://code.visualstudio.com/docs/sourcecontrol/overview#_merge-conflicts).

### Clone this wiki locally


[ CodeBotsStudio ](https://github.com/CodeBotsStudio) / ** [Dysymmetrical](https://github.com/CodeBotsStudio/Dysymmetrical) ** Public

  * [ Notifications ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical) You must be signed in to change notification settings
  * [ Fork 13 ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical)
  * [ Star  32 ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical)

# 0. Getting Started

Jump to bottom

LrgeAlvaro8882 edited this page Nov 10, 2025 · [7 revisions](https://github.com/CodeBotsStudio/Dysymmetrical/wiki/0.-Getting-Started/_history)

### Quick note

Make sure to have a GitHub account and [Git](https://git-scm.com/) & [GitHub Desktop](https://desktop.github.com/download/) installed before-hand! (GitHub Desktop isn't mandatory if you're familiar with Git but it makes life a lot easier, I won't be showing how to do it with Git commands).

### Required VSCode extensions

These extensions MUST be installed for everything to work properly and so that you have a smooth development experience.

  * [Rojo](https://marketplace.visualstudio.com/items?itemName=evaera.vscode-rojo)
  * [Selene](https://marketplace.visualstudio.com/items?itemName=Kampfkarren.selene-vscode)
  * [StyLua](https://marketplace.visualstudio.com/items?itemName=JohnnyMorganz.stylua)
  * [Lua](https://marketplace.visualstudio.com/items?itemName=sumneko.lua)
  * [Luau Language Server](https://marketplace.visualstudio.com/items?itemName=JohnnyMorganz.luau-lsp)

### Recommended VSCode extensions

  * [Todo+](https://marketplace.visualstudio.com/items?itemName=fabiospampinato.vscode-todo-plus) (to be able to leave notes like to-do's through code comments and jump to them)
  * [Better Comments](https://marketplace.visualstudio.com/items?itemName=aaron-bond.better-comments) (to make certain types of comments a different color)

### Joining a project (not creating it)

Follow [Joining A Project](https://github.com/CodeBotsStudio/Dysymmetrical/wiki/Joining-A-Project).

### Creating the game's repository

First, extract the latest code of the repository to a folder with the same name as your future GitHub repository.

You can get the code for the repository through `Code -> Download ZIP`

Here's how the final folder should look like:

Open GitHub Desktop (read the quick note at the top if you haven't) and create a new repository called the same as the folder you put Dysymmetrical in. Pick the parent folder when creating the repository so that it creates correctly.

When the repo is created, click `Publish repository` and configure the repo however you want.

GitHub Desktop won't be needed from now on but it's a good alternative to what I'll explain later.

### Rojo setup

Download [Rokit](https://github.com/rojo-rbx/rokit?tab=readme-ov-file#windows) following their installation tutorial.

After that, install [Wally](https://wally.run/install) by running `rokit install`, a package manager required for this engine to work.

When Wally is installed, restart VSCode and run `wally init` and `wally install` in VSCode's terminal.

Now that Wally is set up, click the play icon besides the Rojo label at the bottom right.

The first time it'll open the Rojo menu at the top. Install the Roblox Studio plugin through the button in the menu if you haven't yet.

When installed, re-open the menu and click the label with a play icon to turn on the local server (also called "to serve"). Make sure that you use `default.project.json`.

This will make a window pop up at the bottom right saying that the Rojo server is listening (on).

### Rojo basics

I'd recommend enabling `Auto Save` to make it behave the same as Studio's editor.

While the Rojo server is listening you can connect it to Studio by opening the plugin window and hitting `Connect`.

If it says anything other than "Connected to session `PROJECTNAMEHERE`", read the Rojo docs.

Now everything is set up! Every time that you enter VSCode you'll have to do these steps.

### GitHub basics

To push changes to GitHub so that they save in the version control and so that collaborators can receive them, open `Source Control` in VSCode, name your changes, commit them and sync them.

If you haven't done this yet, copy your repository's link and add `.git` at the end.

For example: `https://github.com/CodeBotsStudio/Dysymmetrical.git`.

Then, take that link and execute `git remote add origin [LINK]` in the VSCode terminal, replacing `[LINK]` with the link.

To get changes that you don't have from GitHub, open the VSCode terminal and write `git pull origin main`.

### Updating the engine

If you haven't done this yet, execute `git remote add upstream https://github.com/CodeBotsStudio/Dysymmetrical.git`.

When an update releases, you can execute `git pull upstream main` to get the changes from the engine's repository.

Make sure to read the changelog in `ServerScriptService/DYSYMMETRICAL_CHANGELOG` to see if you have to take anything from the example place (e.g. UI).

If there's any merge conflicts, check out [this page](https://code.visualstudio.com/docs/sourcecontrol/overview#_merge-conflicts).

### Clone this wiki locally


[ CodeBotsStudio ](https://github.com/CodeBotsStudio) / ** [Dysymmetrical](https://github.com/CodeBotsStudio/Dysymmetrical) ** Public

  * [ Notifications ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical) You must be signed in to change notification settings
  * [ Fork 13 ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical)
  * [ Star  32 ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical)

# 0. Getting Started

Jump to bottom

LrgeAlvaro8882 edited this page Oct 30, 2025 · [7 revisions](https://github.com/CodeBotsStudio/Dysymmetrical/wiki/0.-Getting-Started/_history)

### Quick note

Make sure to have a GitHub account and [Git](https://git-scm.com/) & [GitHub Desktop](https://desktop.github.com/download/) installed before-hand! (GitHub Desktop isn't mandatory if you're familiar with Git but it makes life a lot easier, I won't be showing how to do it with Git commands).

### Required VSCode extensions

These extensions MUST be installed for everything to work properly and so that you have a smooth development experience.

  * [Rojo](https://marketplace.visualstudio.com/items?itemName=evaera.vscode-rojo)
  * [Selene](https://marketplace.visualstudio.com/items?itemName=Kampfkarren.selene-vscode)
  * [StyLua](https://marketplace.visualstudio.com/items?itemName=JohnnyMorganz.stylua)
  * [Lua](https://marketplace.visualstudio.com/items?itemName=sumneko.lua)
  * [Luau Language Server](https://marketplace.visualstudio.com/items?itemName=JohnnyMorganz.luau-lsp)

### Recommended VSCode extensions

  * [Todo+](https://marketplace.visualstudio.com/items?itemName=fabiospampinato.vscode-todo-plus) (to be able to leave notes like to-do's through code comments and jump to them)
  * [Better Comments](https://marketplace.visualstudio.com/items?itemName=aaron-bond.better-comments) (to make certain types of comments a different color)

### Joining a project (not creating it)

Follow [Joining A Project](https://github.com/CodeBotsStudio/Dysymmetrical/wiki/Joining-A-Project).

### Creating the game's repository

First, extract the latest code of the repository to a folder with the same name as your future GitHub repository.

You can get the code for the repository through `Code -> Download ZIP`

Here's how the final folder should look like:

Open GitHub Desktop (read the quick note at the top if you haven't) and create a new repository called the same as the folder you put Dysymmetrical in. Pick the parent folder when creating the repository so that it creates correctly.

When the repo is created, click `Publish repository` and configure the repo however you want.

GitHub Desktop won't be needed from now on but it's a good alternative to what I'll explain later.

### Rojo setup

Download [Aftman](https://github.com/LPGhatguy/aftman?tab=readme-ov-file#installation) following their installation tutorial.

After that, install [Wally](https://wally.run/install), a package manager required for this engine to work.

When Wally is installed, restart VSCode and run `wally install` in VSCode's terminal.

Now that Wally is set up, click the play icon besides the Rojo label at the bottom right.

The first time it'll open the Rojo menu at the top. Install the Roblox Studio plugin through the button in the menu if you haven't yet.

When installed, re-open the menu and click the label with a play icon to turn on the local server (also called "to serve"). Make sure that you use `default.project.json`.

This will make a window pop up at the bottom right saying that the Rojo server is listening (on).

### Rojo basics

I'd recommend enabling `Auto Save` to make it behave the same as Studio's editor.

While the Rojo server is listening you can connect it to Studio by opening the plugin window and hitting `Connect`.

If it says anything other than "Connected to session `PROJECTNAMEHERE`", read the Rojo docs.

Now everything is set up! Every time that you enter VSCode you'll have to do these steps.

### GitHub basics

To push changes to GitHub so that they save in the version control and so that collaborators can receive them, open `Source Control` in VSCode, name your changes, commit them and sync them.

If you haven't done this yet, copy your repository's link and add `.git` at the end.

For example: `https://github.com/CodeBotsStudio/Dysymmetrical.git`.

Then, take that link and execute `git remote add origin [LINK]` in the VSCode terminal, replacing `[LINK]` with the link.

To get changes that you don't have from GitHub, open the VSCode terminal and write `git pull origin main`.

### Updating the engine

If you haven't done this yet, execute `git remote add upstream https://github.com/CodeBotsStudio/Dysymmetrical.git`.

When an update releases, you can execute `git pull upstream main` to get the changes from the engine's repository.

Make sure to read the changelog in `ServerScriptService/DYSYMMETRICAL_CHANGELOG` to see if you have to take anything from the example place (e.g. UI).

If there's any merge conflicts, check out [this page](https://code.visualstudio.com/docs/sourcecontrol/overview#_merge-conflicts).

### Clone this wiki locally


[ CodeBotsStudio ](https://github.com/CodeBotsStudio) / ** [Dysymmetrical](https://github.com/CodeBotsStudio/Dysymmetrical) ** Public

  * [ Notifications ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical) You must be signed in to change notification settings
  * [ Fork 13 ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical)
  * [ Star  32 ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical)

# 0. Getting Started

Jump to bottom

LrgeAlvaro8882 edited this page Nov 22, 2025 · [7 revisions](https://github.com/CodeBotsStudio/Dysymmetrical/wiki/0.-Getting-Started/_history)

### Quick note

Make sure to have [VSCode](https://code.visualstudio.com/download), a GitHub account and [Git](https://git-scm.com/) & [GitHub Desktop](https://desktop.github.com/download/) installed before-hand! (GitHub Desktop isn't mandatory if you're familiar with Git but it makes life a lot easier, I won't be showing how to do it with Git commands).

### Required VSCode extensions

These extensions MUST be installed for everything to work properly and so that you have a smooth development experience.

  * [Rojo](https://marketplace.visualstudio.com/items?itemName=evaera.vscode-rojo)
  * [Selene](https://marketplace.visualstudio.com/items?itemName=Kampfkarren.selene-vscode)
  * [StyLua](https://marketplace.visualstudio.com/items?itemName=JohnnyMorganz.stylua)
  * [Lua](https://marketplace.visualstudio.com/items?itemName=sumneko.lua)
  * [Luau Language Server](https://marketplace.visualstudio.com/items?itemName=JohnnyMorganz.luau-lsp)

### Recommended VSCode extensions

  * [Todo+](https://marketplace.visualstudio.com/items?itemName=fabiospampinato.vscode-todo-plus) (to be able to leave notes like to-do's through code comments and jump to them)
  * [Better Comments](https://marketplace.visualstudio.com/items?itemName=aaron-bond.better-comments) (to make certain types of comments a different color)

### Joining a project (not creating it)

Follow [Joining A Project](https://github.com/CodeBotsStudio/Dysymmetrical/wiki/Joining-A-Project).

### Creating the game's repository

First, extract the latest code of the repository to a folder with the same name as your future GitHub repository.

You can get the code for the repository through `Code -> Download ZIP`

Here's how the final folder should look like:

Open GitHub Desktop (read the quick note at the top if you haven't) and create a new repository called the same as the folder you put Dysymmetrical in. Pick the parent folder when creating the repository so that it creates correctly.

When the repo is created, click `Publish repository` and configure the repo however you want.

GitHub Desktop won't be needed from now on but it's a good alternative to what I'll explain later.

### Rojo setup

Download [Rokit](https://github.com/rojo-rbx/rokit?tab=readme-ov-file#windows) following their installation tutorial.

After that, install [Wally](https://wally.run/install) by running `rokit install`, a package manager required for this engine to work.

When Wally is installed, restart VSCode and run `wally init` and `wally install` in VSCode's terminal.

Now that Wally is set up, click the play icon besides the Rojo label at the bottom right.

The first time it'll open the Rojo menu at the top. Install the Roblox Studio plugin through the button in the menu if you haven't yet.

When installed, re-open the menu and click the label with a play icon to turn on the local server (also called "to serve"). Make sure that you use `default.project.json`.

This will make a window pop up at the bottom right saying that the Rojo server is listening (on).

### Rojo basics

I'd recommend enabling `Auto Save` to make it behave the same as Studio's editor.

While the Rojo server is listening you can connect it to Studio by opening the plugin window and hitting `Connect`.

If it says anything other than "Connected to session `PROJECTNAMEHERE`", read the Rojo docs.

Now everything is set up! Every time that you enter VSCode you'll have to do these steps.

### GitHub basics

To push changes to GitHub so that they save in the version control and so that collaborators can receive them, open `Source Control` in VSCode, name your changes, commit them and sync them.

If you haven't done this yet, copy your repository's link and add `.git` at the end.

For example: `https://github.com/CodeBotsStudio/Dysymmetrical.git`.

Then, take that link and execute `git remote add origin [LINK]` in the VSCode terminal, replacing `[LINK]` with the link.

To get changes that you don't have from GitHub, open the VSCode terminal and write `git pull origin main`.

### Updating the engine

If you haven't done this yet, execute `git remote add upstream https://github.com/CodeBotsStudio/Dysymmetrical.git`.

After that, execute `git pull upstream main --allow-unrelated-histories` to make the repo have the same commit history as Dysymmetrical to be able to get new commits that add code to your existing code.

When an update releases, you can execute `git pull upstream main` to get the changes from the engine's repository.

Make sure to read the changelog in `ServerScriptService/DYSYMMETRICAL_CHANGELOG` to see if you have to take anything from the example place (e.g. UI).

If there's any merge conflicts, check out [this page](https://code.visualstudio.com/docs/sourcecontrol/overview#_merge-conflicts).

### Clone this wiki locally


[ CodeBotsStudio ](https://github.com/CodeBotsStudio) / ** [Dysymmetrical](https://github.com/CodeBotsStudio/Dysymmetrical) ** Public

  * [ Notifications ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical) You must be signed in to change notification settings
  * [ Fork 13 ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical)
  * [ Star  32 ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical)

# 0. Getting Started

Jump to bottom

LrgeAlvaro8882 edited this page Oct 26, 2025 · [7 revisions](https://github.com/CodeBotsStudio/Dysymmetrical/wiki/0.-Getting-Started/_history)

### Quick note

Make sure to have a GitHub account and [Git](https://git-scm.com/) & [GitHub Desktop](https://desktop.github.com/download/) installed before-hand! (GitHub Desktop isn't mandatory if you're familiar with Git but it makes life a lot easier, I won't be showing how to do it with Git commands).

### Required VSCode extensions

These extensions MUST be installed for everything to work properly and so that you have a smooth development experience.

  * [Rojo](https://marketplace.visualstudio.com/items?itemName=evaera.vscode-rojo)
  * [Selene](https://marketplace.visualstudio.com/items?itemName=Kampfkarren.selene-vscode)
  * [StyLua](https://marketplace.visualstudio.com/items?itemName=JohnnyMorganz.stylua)
  * [Lua](https://marketplace.visualstudio.com/items?itemName=sumneko.lua)
  * [Luau Language Server](https://marketplace.visualstudio.com/items?itemName=JohnnyMorganz.luau-lsp)

### Recommended VSCode extensions

  * [Todo+](https://marketplace.visualstudio.com/items?itemName=fabiospampinato.vscode-todo-plus) (to be able to leave notes like to-do's through code comments and jump to them)
  * [Better Comments](https://marketplace.visualstudio.com/items?itemName=aaron-bond.better-comments) (to make certain types of comments a different color)

### Creating the game's repository

First, extract the latest code of the repository to a folder with the same name as your future GitHub repository.

You can get the code for the repository through `Code -> Download ZIP`

Here's how the final folder should look like:

Open GitHub Desktop (read the quick note at the top if you haven't) and create a new repository called the same as the folder you put Dysymmetrical in. Pick the parent folder when creating the repository so that it creates correctly.

When the repo is created, click `Publish repository` and configure the repo however you want.

GitHub Desktop won't be needed from now on but it's a good alternative to what I'll explain later.

### Rojo setup

Download [Aftman](https://github.com/LPGhatguy/aftman?tab=readme-ov-file#installation) following their installation tutorial.

After that, install [Wally](https://wally.run/install), a package manager required for this engine to work.

When Wally is installed, restart VSCode and run `wally install` in VSCode's terminal.

Now that Wally is set up, click the play icon besides the Rojo label at the bottom right.

The first time it'll open the Rojo menu at the top. Install the Roblox Studio plugin through the button in the menu if you haven't yet.

When installed, re-open the menu and click the label with a play icon to turn on the local server (also called "to serve"). Make sure that you use `default.project.json`.

This will make a window pop up at the bottom right saying that the Rojo server is listening (on).

### Rojo basics

I'd recommend enabling `Auto Save` to make it behave the same as Studio's editor.

While the Rojo server is listening you can connect it to Studio by opening the plugin window and hitting `Connect`.

If it says anything other than "Connected to session `PROJECTNAMEHERE`", read the Rojo docs.

Now everything is set up! Every time that you enter VSCode you'll have to do these steps.

### GitHub basics

To push changes to GitHub so that they save in the version control and so that collaborators can receive them, open `Source Control` in VSCode, name your changes, commit them and sync them.

If you haven't done this yet, copy your repository's link and add `.git` at the end.

For example: `https://github.com/CodeBotsStudio/Dysymmetrical.git`.

Then, take that link and execute `git remote add origin [LINK]` in the VSCode terminal, replacing `[LINK]` with the link.

To get changes that you don't have from GitHub, open the VSCode terminal and write `git pull origin main`.

### Updating the engine

If you haven't done this yet, execute `git remote add upstream https://github.com/CodeBotsStudio/Dysymmetrical.git`.

When an update releases, you can execute `git pull upstream main` to get the changes from the engine's repository.

Make sure to read the changelog in `ServerScriptService/DYSYMMETRICAL_CHANGELOG` to see if you have to take anything from the example place (e.g. UI).

If there's any merge conflicts, check out [this page](https://code.visualstudio.com/docs/sourcecontrol/overview#_merge-conflicts).

### Clone this wiki locally