Skip to Content
FeaturesLocal Directory Linking

Local Directory Linking

Linking points one of your project’s dependencies at a local folder, so you can iterate on a package inside a real game without publishing on every change. Roblox only for now.

$forest link [path]

The target is a normal package workspace with its own forest.json; Forest reads the package’s identity from it. While linked, the package’s folder in your Packages/ tree is a live view of the linked source: edit a file there and Rojo, Studio, and luau-lsp see the change immediately, no reinstall needed.

forest link
$ forest link ../signal-dev
⚠ 1 package linked locally:
⚠ forest/signal -> ../signal-dev (registry pin: 2.4.0, linked: 2.5.0-dev)
🌳 Linked forest/signal -> ../signal-dev

Links live in a gitignored .forest/links.json; neither forest.json nor forest-lock.json changes. A teammate who pulls your commits gets a completely normal registry install, and CI ignores links by default, so a stray link can never change what CI builds. You also can’t forget one is active: every install and forest tree prints a banner naming the linked packages.

Safety rails while a link is active:

  • forest publish refuses to publish your package while any of its dependencies is linked, because the tree you tested isn’t the tree consumers would get.
  • forest link with no arguments lists active links and how each linked copy has drifted from the pinned registry version.

When you’re done, forest unlink restores the exact registry version your lockfile pins:

$forest unlink [package-name]

Going deeper

Last updated on