A web application to help you plan your factory in the game Satisfactory. Main features include:
- Logistics tracking with factories inputs and outputs
- Calculator for production planning and power generation
- Game saving & sharing
- Node.js v22 or higher. Use nvm to manage Node.js versions easily.
nvm usewill automatically select the correct version. - NPM as the package manager.
- A code editor like VSCode.
- Clone the repository.
- Install the dependencies with
npm install. - Run the development server with
npm run dev.
This project uses Biome to format the code. You can run npm run format to apply the code style.
- Fork the repository.
- Create a new branch with your feature or fix, like
feature/my-featureorfix/my-fix. - Commit your changes and push the branch to your fork.
- Create a pull request to the
mainbranch of this repository. - Wait for the review and approval of your pull request.
The project runs a single-trunk model on the main branch:
- Preview (
dev.satisfactory-logistics.xyz) auto-deploys on every push tomain. - Production (
satisfactory-logistics.xyz) is deployed only when a release is cut from the GitHub Actions UI.
Releases are run from the GitHub Actions tab via the Release workflow:
- Open the repository on GitHub → Actions → Release → Run workflow.
- Pick the bump type (
patch/minor/major) and run.
The workflow checks out main, runs release-it, and on success:
- Runs
lint,check-types, and tests as a pre-flight check. - Bumps the version in
package.json. - Runs
npm run buildto verify the production build succeeds. - Updates
CHANGELOG.mdfrom conventional commits (feat:,fix:,perf:,refactor:). - Creates a
chore: release vX.Y.Zcommit and avX.Y.Zannotated tag, pushes both back tomain. - Publishes a matching GitHub Release.
- Triggers the Render production deploy hook to rebuild
satisfactory-logistics.xyz.
The Render deploy hook URL is stored as the RENDER_PROD_DEPLOY_HOOK_URL repository secret.
This will generate the items, recipes, buildings, and resources data from the game files.
npm run parse-docs- Load the game inside FModel, as described in the Satisfactory Modding documentation
- Open the Packages > Search window and write
.*(_256|_512)to filter the icons - Press
Ctrl + Ato select all the icons - Right-click on the selection and choose
Save Textures - Open the destination (as configured in FModel output settings) and copy the
FactoryGamefolder todata/assets/ - Copy the exported
FactoryGamefolder todata/assets/(FactoryGame should be a subfolder ofdata/assets/) - Run the
npm run parse-docs -- --with-imagescommand to generate the images
The map view in src/map/ ships with a curated copy of every resource node, deposit, fracking core/satellite, and geyser placement at src/recipes/WorldResourceNodes.json. The list is rebuilt from the game's persistent level whenever the game updates.
To regenerate after a Satisfactory update:
-
Load the game in FModel (same setup as Image Generation above).
-
Navigate to
FactoryGame/Content/FactoryGame/Map/GameLevel01/Persistent_Level.umap. -
Right-click → Save Properties (.json).
-
Move the resulting
Persistent_Level.json(~100MB) todata/Persistent_Level.jsonin this repo. The file is gitignored so it stays out of commits. -
Run:
npm run extract-world-nodes
The script does a two-pass walk over the export: first to collect every
BP_ResourceNode_C/BP_ResourceDeposit_C/BP_FrackingCore_C/BP_FrackingSatellite_C/BP_ResourceNodeGeyser_Cactor with its resource and purity, then to bind each one'sRootComponenttransform for world coordinates. The output is sorted deterministically and a diff vs. the previous bundled file is printed.Useful flags:
--dry-run— parse and report without writing.--input <path>/--output <path>— override defaults.--verbose— log every emitted node (debug).
-
Review the diff in the script's summary output, then commit
src/recipes/WorldResourceNodes.json.
Heads up: the parser holds the entire 100MB JSON in memory. If you see out-of-memory errors, prefix the command with
NODE_OPTIONS="--max-old-space-size=4096".
This project is licensed under the MIT License - see the LICENSE file for details.
