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 ../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 are your machine’s state, not your project’s
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 publishrefuses to publish your package while any of its dependencies is linked, because the tree you tested isn’t the tree consumers would get.forest linkwith 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
forest linkandforest unlinkreferences, including copy mode and the--linksinstall flag for CI.