{"id":19773066,"url":"https://github.com/r-unic/flamework-template","last_synced_at":"2026-04-02T16:00:15.002Z","repository":{"id":188395239,"uuid":"632715311","full_name":"R-unic/flamework-template","owner":"R-unic","description":"my flamework template","archived":false,"fork":false,"pushed_at":"2025-02-27T00:21:50.000Z","size":421,"stargazers_count":12,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-11-09T13:02:54.896Z","etag":null,"topics":["boilerplate","flamework","rbxts","roblox","roblox-ts","template"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/R-unic.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2023-04-26T01:35:12.000Z","updated_at":"2025-10-20T22:38:46.000Z","dependencies_parsed_at":null,"dependency_job_id":"af2c5a82-99d2-41ae-b7c4-60e3fb2bada0","html_url":"https://github.com/R-unic/flamework-template","commit_stats":null,"previous_names":["r-unic/flamework-template"],"tags_count":15,"template":true,"template_full_name":null,"purl":"pkg:github/R-unic/flamework-template","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/R-unic%2Fflamework-template","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/R-unic%2Fflamework-template/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/R-unic%2Fflamework-template/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/R-unic%2Fflamework-template/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/R-unic","download_url":"https://codeload.github.com/R-unic/flamework-template/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/R-unic%2Fflamework-template/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31309572,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-02T12:59:32.332Z","status":"ssl_error","status_checked_at":"2026-04-02T12:54:48.875Z","response_time":89,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["boilerplate","flamework","rbxts","roblox","roblox-ts","template"],"created_at":"2024-11-12T05:08:32.372Z","updated_at":"2026-04-02T16:00:14.970Z","avatar_url":"https://github.com/R-unic.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Runic's Flamework Template\n\nThis is my own pre-configured template you can use for your Roblox TypeScript projects that use [Flamework](https://flamework.fireboltofdeath.dev/docs/).\nIt aims to be decently simple and lightweight but still provide as many reusable things as possible to create any type of game. React/Roact is not included, you'll have to install that yourself if you want it. ESLint and Prettier are also not included.\n\n## Libraries\n- `@rbxts/firebase`\n- `@rbxts/ez-log`\n- `@rbxts/lazy`\n- `@rbxts/lazy-iterator`\n- `@rbxts/flamework-meta-utils`\n- `@rbxts/array-utils`\n- `@rbxts/instance-utility`\n- `@rbxts/wave`\n- `@rbxts/runit`\n  - Test files are located in `src/tests`\n- `@rbxts/flamework-binary-serializer`\n  - This package serializes tables and instances into buffers (list of bytes) which reduces the size of the data massively. It is useful for optimizing networking\n  - Includes serializers which are created \u0026 exported in `shared/network.ts`\n  - You can skip manually deserializing arguments from remotes by using the `@LinkSerializedRemote` decorator\n\n## Features\n- Snippets:\n  - Flamework controller\n  - Flamework service\n  - Flamework component\n  - Flamework UI component\n  - rUnit test\n- Frontend:\n  - Custom mouse controller\n  - `ReplicaController` which stores a copy of the local player's data\n  - Procedural animation system for cameras or models with these animations included (just delete it if you don't want it):\n    - Landing\n    - Mouse sway\n    - Walk cycle\n  - `CharacterController` for easily retrieving character, root, \u0026 humanoid\n  - Custom camera controller to switch between cameras on the fly with these camera components included (but optional):\n    - Default (default roblox cam)\n    - FirstPerson (default roblox cam locked to 1P)\n    - Aerial\n    - Fixed\n    - FlyOnTheWall\n    - FirstPersonAnimated (uses procedural animation system)\n  - UI:\n    - Customizable control panel made with Iris\n      - Performance stats, movement system, and camera system mods already included\n      - For common classes rendered in your control panel, use the `WithControlPanelSettings` class to define a `renderControlPanelSettings` method that renders the class' settings in control panel\n    - Animation components (Gradient, Rotation, Transparency, Scale, SpringScale)\n    - Effect controller (such as fading black in/out)\n- Backend:\n  - Cmdr for custom commands\n  - Graceful Firebase API instead of DataStoreService\n  - Product/gamepass transaction handler\n  - Automatic audio replication\n- Tons of utility functions and classes (comma format, abbreviation, repr, array shuffle/flatten/reverse, springs, sin/cos waves, bitfields, string builder, etc.)\n- Tons of utility decorators\n  - Method decorators\n    - `@Cooldown(length: number)` - Only allows the function to be executed once every `length` seconds\n    - `@Memoize()` - Cache the first result the function returns and return the cached result from then on out\n    - `@StudioOnly()` - Only allows the function to be executed in studio\n    - `@LogBenchmark(formatter)` - Logs how long the function took to execute, use `formatter` callback to customize message\n    - `@OnInput(binding: RawActionEntry | RawActionEntry[], actionName?: string, options?: ActionOptions)` - Binds an input to the function, with an optional action name to bind a function to the input's release\n    - `@OnAxisInput(binding: AxisActionEntry, actionName?: string)` - Binds an axis input to the function, with an optional action name to bind a function to the input's release\n    - `@OnInputRelease(actionName: string)` - Binds an input releasing to the function given the same action name provided to `@OnInput`\n    - `@Retry(times: number, delay?: number, retryCondition?: (fn: () =\u003e void) =\u003e boolean` - Retries the function every time `retryCondition` returns true, `times` times, with `delay` seconds in between\n    - `@ValidateReturn(validator: (returnValue: unknown) =\u003e boolean, whenInvalid?: (returnValue: unknown) =\u003e void)` - Calls `whenInvalid` when `validator` returns false\n    - `@SpawnTask()` - Wraps the method in a `task.spawn`\n    - `@LinkRemote(remote: ClientReceiver)` - Binds a method to a remote being fired\n    - `@LinkSerializedRemote(remote: ClientReceiver, deserializer: Serializer)` - Binds a method to a remote being fired and automatically deserializes arguments\n- Custom lifecycle hooks:\n  - OnCharacterAdd/OnCharacterRemove\n  - OnPlayerJoin/OnPlayerLeave\n  - OnDataLoad/OnDataUpdate\n  - LogStart (logs when a singleton/component is started)\n\n## Usage\n\nFirst, create the folder on your computer where you want your project to be stored.\nThen, open a terminal at that directory and run the following commands:\n\n```bash\nnpx degit R-unic/flamework-template\nnpm i\n```\n\nThat's it! The template has been installed. For further information on how to use Flamework in your project, please see [here](https://flamework.fireboltofdeath.dev/).\n\n## Setup\n\n### Firebase\nYou need a `FIREBASE_URL` and `FIREBASE_AUTH` value inside of a DataStore named `EnvironmentInfo`. You can get `FIREBASE_URL` by simply creating a Real-Time Database on Firebase, then copying this link.\n![copy-link-ui-on-firebase](https://github.com/R-unic/flamework-template/assets/49625808/c4866db0-f05d-4da3-8856-11365c843fa6)\n\nTo get `FIREBASE_AUTH` you need to first click the settings icon next to \"Project Overview\", Click \"Project settings\", then click \"Service accounts\". Click the \"Database secrets\" tab under the text \"Legacy credentials\", then copy the secret that should be there by default. If there is no secret there, press \"Add secret\".\n\nYou can easily set these values by running this in your Roblox command bar:\n```lua\ngame:GetService(\"DataStoreService\"):GetDataStore(\"EnvironmentInfo\"):SetAsync(\"FIREBASE_URL\", \"https://database-name-default-rtdb.firebaseio.com/\")\ngame:GetService(\"DataStoreService\"):GetDataStore(\"EnvironmentInfo\"):SetAsync(\"FIREBASE_AUTH\", \"tHiSisAveRYrEaLFiRebAsEAuTHkeY\")\n```\n\n### Creator/Developer Permissions\nAdd your user ID to the [`DevID`](https://github.com/R-unic/flamework-template/blob/master/src/shared/constants.ts#L4) enum.\nThis is fairly important because this is what a few systems use to detect whether or not the player has developer permissions.\n\n### Automatically Index Children\nThis is taken directly from the Roblox TS website because I think it's worth knowing about. What if you wanted to access something you're currently storing inside of the Workspace service in Studio? Well, Roblox TS would have no clue of that thing existing inside of there. Luckily, you can solve this issue extremely easily.\n\nIt uses the [io-serve](https://www.npmjs.com/package/io-serve) package (optional, but quite useful) and the [rbxts-object-to-tree\n](https://create.roblox.com/store/asset/3379119778/rbxtsobjecttotree?externalSource=www) Roblox Studio plugin.\n\nYou can find the full guide [here](https://roblox-ts.com/docs/guides/indexing-children#rbxts-object-to-tree-plugin-by-validark).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fr-unic%2Fflamework-template","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fr-unic%2Fflamework-template","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fr-unic%2Fflamework-template/lists"}