What is a “Package”?
Packages have been used in software development for decades. They are a core part of modern development workflows, but to many in the virtual experience space, packages and package managers are a new concept.
A package is a bundle of code that accomplishes a specific task. Packages can be as small as a single function, or as large as an entire framework. As an analogy, think of making spaghetti. You need several ingredients to make spaghetti, such as pasta, sauce, and meatballs. Each of these ingredients can be thought of as a package.
Developing games without a package manager is like making spaghetti from scratch. You have to gather, or “re-invent”, all the ingredients yourself, which can be time-consuming and error-prone.
Modern Development Challenges Without Packages
| Without packages | With a package manager | |
|---|---|---|
| Common tasks | Re-invent solved problems yourself, duplicating effort on every project. | Install a proven package and build on it. |
| Bug fixes | A bug copied into five projects must be found and fixed five times. | Fix it once, publish a new version, and every project picks it up with one update. |
| Team code sharing | Copied folders drift apart; teammates end up on different versions of the “same” code. | Everyone installs by name and version; the lockfile guarantees the whole team gets an identical tree. |
| Community | Cut off from shared libraries and open-source contributions. | A whole registry of maintained, licensed, community-built packages. |
Using packages allows developers to leverage existing code, reduce duplication, and streamline collaboration.
What is a “Package Manager”?
As the name suggests, a package manager is a tool that helps you manage packages. It handles the installation, updating, and removal of packages, as well as managing dependencies between packages.
Package managers have been widely adopted in other programming communities for years, such as npm for JavaScript, pip for Python, and Maven for Java.
Forest across platforms
Forest is one registry and one CLI serving more than one game platform. The ideas in this Concepts section, packages, publishing, versioning, dependencies, private access, and Studios, are the same no matter what you build for. What changes is how packages are laid out and imported once they reach your project, and that lives under Platforms:
- Roblox: Luau packages requested by instance path, installed into a
Packages/folder you mount in the datamodel. - UEFN: Verse packages imported with
using, installed flat underContent/ForestPackages.
Each package targets exactly one platform, recorded as the platform field in its forest.json.