{"id":23774679,"url":"https://github.com/maz01001/satisfactoryflowchart","last_synced_at":"2026-05-02T03:08:29.440Z","repository":{"id":270401377,"uuid":"855491046","full_name":"MAZ01001/SatisfactoryFlowchart","owner":"MAZ01001","description":"Simple flowchart for Satisfactory (1.0)","archived":false,"fork":false,"pushed_at":"2025-01-16T17:56:06.000Z","size":1434,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-06-02T08:47:14.049Z","etag":null,"topics":["graph","json-converter","nodejs","satisfactory"],"latest_commit_sha":null,"homepage":"https://maz01001.github.io/SatisfactoryFlowchart/","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/MAZ01001.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","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}},"created_at":"2024-09-11T00:34:59.000Z","updated_at":"2025-03-28T11:18:59.000Z","dependencies_parsed_at":"2024-12-30T22:20:41.682Z","dependency_job_id":"f61f31fb-99b8-40d8-a476-70fb87d4742a","html_url":"https://github.com/MAZ01001/SatisfactoryFlowchart","commit_stats":null,"previous_names":["maz01001/satisfactoryflowchart"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/MAZ01001/SatisfactoryFlowchart","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MAZ01001%2FSatisfactoryFlowchart","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MAZ01001%2FSatisfactoryFlowchart/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MAZ01001%2FSatisfactoryFlowchart/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MAZ01001%2FSatisfactoryFlowchart/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/MAZ01001","download_url":"https://codeload.github.com/MAZ01001/SatisfactoryFlowchart/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MAZ01001%2FSatisfactoryFlowchart/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32521136,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-02T01:12:54.858Z","status":"online","status_checked_at":"2026-05-02T02:00:05.923Z","response_time":132,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["graph","json-converter","nodejs","satisfactory"],"created_at":"2025-01-01T06:16:24.773Z","updated_at":"2026-05-02T03:08:29.420Z","avatar_url":"https://github.com/MAZ01001.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Satisfactory flowchart\n\nSimple flowchart for [Satisfactory](https://www.satisfactorygame.com/ \"Open official Satisfactory website\"), a game developed \u0026 published by _Coffe Stain Studios_ ([game Steam page](https://store.steampowered.com/app/526870/Satisfactory/ \"Open Satisfactory Steam page\")).\n\n\u003e [!NOTE]\n\u003e TODO\n\u003e\n\u003e - build interactive graph/flowchart\n\u003e\n\n- [`data.json`](#datajson)\n- [`data.txt`](#datatxt)\n- [`data.dot`](#datadot)\n- [`gephi.svg`](#gephisvg)\n- [`convert_json.js`](#convert_jsonjs)\n- [Extract images](#extract-images)\n- [Parsing JSON data (notes)](#parsing-json-data-notes)\n- [Legacy U3 flowchart](#legacy-u3-flowchart)\n\n---\n\n## [`data.json`](https://github.com/MAZ01001/SatisfactoryFlowchart/blob/main/data.json \"Click to view file in GitHub\")\n\n`UTF-8` JSON file with the following structure/formatting\n\n```typescript\ndeclare type DATA_JSON = {\n    descriptions: {\n        products: [string, number, string, string, string][]; // [ display name, sink value, element type (Solid|Liquid|Gas), IMG path, description ]\n        manufacturers: [string, string, string][];            // [ display name, IMG path, description ]\n    };\n    recipes: {\n        name: string;                   // recipe display name\n        input: [string, number][];      // [ product display name, amount per cycle (items or m³) ]\n        output: [string, number][];     // [ product display name, amount per cycle (items or m³) ]\n        machine: [string, ...string[]]; // manufacturer display names\n        duration: number;               // time in seconds for one production cycle (items/min = amount * 60 / duration)\n    }[];\n};\n```\n\n\u003cdetails\u003e\u003csummary\u003eclick to show/hide example JSON data in \u003ccode\u003een-US\u003c/code\u003e language\u003c/summary\u003e\n\n```JSON\n{\n\t\"descriptions\": {\n\t\t\"products\": [\n\t\t\t[\"Heavy Modular Frame\",          10800,\"S\",\"./FactoryGame/Content/FactoryGame/Resource/Parts/ModularFrameHeavy/UI/IconDesc_ModularFrameHeavy_256.png\",                      \"A more robust multipurpose frame.\"],\n\t\t\t[\"Nitrogen Gas\",                    10,\"G\",\"./FactoryGame/Content/FactoryGame/Resource/Parts/PackagedNitrogen/UI/IconDesc_NitrogenGas_256.png\",                             \"Has a variety of uses, including metallurgy, cooling, and Nitric Acid production. On MASSAGE-2 (AB)b, it can be extracted from underground gas wells.\"],\n\t\t\t[\"Water\",                            5,\"L\",\"./FactoryGame/Content/FactoryGame/Resource/RawResources/Water/UI/LiquidWater_Pipe_256.png\",                                     \"It's water.\"],\n\t\t\t// ...\n\t\t],\n\t\t\"manufacturers\": [\n\t\t\t[\"Constructor\",         \"./FactoryGame/Content/FactoryGame/Buildable/Factory/ConstructorMk1/UI/IconDesc_ConstructorMk1_256.png\",\"Crafts 1 part into another part.\\n\\nCan be automated by feeding component parts in via a Conveyor Belt connected to the input port. The resulting parts can be automatically extracted by connecting a Conveyor Belt to the output port.\"],\n\t\t\t[\"Crafting Bench\",      \"./FactoryGame/Content/FactoryGame/Buildable/Factory/WorkBench/UI/Workbench_256.png\",                   \"Allows you to manually craft a wide range of different parts. \\nThese parts can then be used to construct various factory buildings, vehicles, and equipment.\"],\n\t\t\t[\"Smelter\",             \"./FactoryGame/Content/FactoryGame/Buildable/Factory/SmelterMk1/UI/IconDesc_SmelterMk1_256.png\",        \"Smelts ore into ingots.\\n\\nCan be automated by feeding ore in via a Conveyor Belt connected to the input port. The resulting ingots can be automatically extracted by connecting a Conveyor Belt to the output port.\"]\n\t\t\t// ...\n\t\t]\n\t},\n\t\"recipes\": [\n\t\t{\n\t\t\t\"name\": \"Excited Photonic Matter\",\n\t\t\t\"input\": [],\n\t\t\t\"output\": [[\"Excited Photonic Matter\",10]],\n\t\t\t\"machine\": [\"Converter\"],\n\t\t\t\"duration\": 3\n\t\t},\n\t\t{\n\t\t\t\"name\": \"Heavy Modular Frame\",\n\t\t\t\"input\": [[\"Screw\",120],[\"Modular Frame\",5],[\"Steel Pipe\",20],[\"Encased Industrial Beam\",5]],\n\t\t\t\"output\": [[\"Heavy Modular Frame\",1]],\n\t\t\t\"machine\": [\"Manufacturer\",\"Crafting Bench\"],\n\t\t\t\"duration\": 30\n\t\t},\n\t\t{\n\t\t\t\"name\": \"Ionized Fuel\",\n\t\t\t\"input\": [[\"Power Shard\",1],[\"Rocket Fuel\",16]],\n\t\t\t\"output\": [[\"Compacted Coal\",2],[\"Ionized Fuel\",16]],\n\t\t\t\"machine\": [\"Refinery\"],\n\t\t\t\"duration\": 24\n\t\t},\n\t\t// ...\n\t]\n}\n```\n\n\u003c/details\u003e\u003cbr\u003e\n\nit uses one tab indentation and except top-levels everything is sorted alphabetically by _name_ with respect to language of _DOCS.json_ file, so binary search is possible (for names)\n\nsome additional spaces have been added to make it more human readable\n\n_there are narrow-non-break-spaces (U+202F) in descriptions between value and unit pairs ie `1000-2000\\u202FMW`_\n\n_liquid/gas volume is already converted to m³ (from dm³)_\n\nScroll [UP](#datajson \"Scroll to start of section: data.json\")\n    | [TOP](#satisfactory-flowchart \"Scroll to top of document: Satisfactory flowchart\")\n\n## [`data.txt`](https://github.com/MAZ01001/SatisfactoryFlowchart/blob/main/data.txt \"Click to view file in GitHub\")\n\nlist of all AWESOME Sink values (coupon cost) in ascending order\n\nDoes not include `FICSIT Coupon` (gives `1` each) and lists non-sinkable items like artifacts or waste, with ones that yield DNA points under `0`\n\nScroll [UP](#datatxt \"Scroll to start of section: data.txt\")\n    | [TOP](#satisfactory-flowchart \"Scroll to top of document: Satisfactory flowchart\")\n\n## [`data.dot`](https://github.com/MAZ01001/SatisfactoryFlowchart/blob/main/data.dot \"Click to view file in GitHub\")\n\ndirected graph of recipe order\n\n\u003e for all recipes `A` and `B`: when `A.outputs` matches at least one product in `B.inputs`: connect `A -\u003e B`\n\nall recipes are connected via index (same index as `data.json`) and labeled with their name (same language as `data.json`)\n\nfirst all recipes (with label) then all connections for each recipe (all outgoing connections inline)\n\nScroll [UP](#datadot \"Scroll to start of section: data.dot\")\n    | [TOP](#satisfactory-flowchart \"Scroll to top of document: Satisfactory flowchart\")\n\n## [`gephi.svg`](https://github.com/MAZ01001/SatisfactoryFlowchart/blob/main/gephi.svg \"Click to view file in GitHub\")\n\na (static) graph view of `data.dot` via \u003chttps://github.com/gephi/gephi/\u003e (outdated)\n\n\u003ca href=\"https://maz01001.github.io/SatisfactoryFlowchart/gephi.png\" title=\"Click to view 4K image full sized\"\u003e\u003cimg src=\"gephi.png\" height=\"256\" alt=\"4K image of generated graph\"\u003e\u003c/a\u003e\n\n\u003e SVG with selectable text here: \u003chttps://maz01001.github.io/SatisfactoryFlowchart/gephi.svg\u003e\n\nScroll [UP](#datadot \"Scroll to start of section: data.dot\")\n    | [TOP](#satisfactory-flowchart \"Scroll to top of document: Satisfactory flowchart\")\n\n## [`convert_json.js`](https://github.com/MAZ01001/SatisfactoryFlowchart/blob/main/convert_json.js \"Click to view file in GitHub\")\n\n- get `node.js`: \u003chttps://github.com/nodejs/node\u003e (easier to install `Visual Studio (Community)` and add `node.js` as dev-environment)\n\n```shell\n# generate data.json with en-US language in current directory (overrides data.json)\nnode convert_json.js /Satisfactory/CommunityResources/Docs/en-US.json data.json\n\n# optionally also generate data.txt to see sink values (overrides data.json and data.txt)\nnode convert_json.js /Satisfactory/CommunityResources/Docs/en-US.json data.json data.txt\n\n# optionally also generate data.dot for graphing (overrides data.json and data.txt and data.dot)\nnode convert_json.js /Satisfactory/CommunityResources/Docs/en-US.json data.json data.txt data.dot\n```\n\nthe script works with any of the languages in the `/Satisfactory/CommunityResources/Docs/` folder; string-sorting is also language dependent\n\n_does not calculate graph connections when `data.dot` CLI-parameter is not supplied_\n\nScroll [UP](#convert_jsonjs \"Scroll to start of section: convert_json.js\")\n    | [TOP](#satisfactory-flowchart \"Scroll to top of document: Satisfactory flowchart\")\n\n## Extract images\n\nrun script ([`convert_json.js`](#convert_jsonjs)) and copy regexp \"FModel IMG path regexp\" logged to console (yellow on black, near the end)\n\n- get `7Zip`: \u003chttps://7-zip.org/\u003e\n- get `FModel`: \u003chttps://github.com/4sval/FModel\u003e\n\n1. open `/Satisfactory/FactoryGameSteam.exe` via 7zip, go to folder `.rsrc` and open `version.txt` and see `PRODUCTVERSION` for Unreal-Engine version ~ `5,3,2,0` = `5.3`\n2. open FModel and follow the steps at \u003chttps://docs.ficsit.app/satisfactory-modding/latest/Development/ExtractGameFiles.html#FModel\u003e \\[[archive](https://github.com/satisfactorymodding/Documentation/blob/13a335186fb21965055007ecc9738ee8fa392708/modules/ROOT/pages/Development/ExtractGameFiles.adoc#fmodel \"(GitHub) plain text permalink of website\")\\] (only `FModel` section) but with the Unreal-Engine version from previous step instead\n3. then in `Archives` tab (Loading Mode: Multiple) select `FactoryGame-Windows.pak` and `FactoryGame-Windows.utoc` and click on Load, it should switch to the `Folders` tab\n4. then click in the folder view and hit \u003ckbd\u003e\u003ckbd\u003eCtrl\u003c/kbd\u003e+\u003ckbd\u003eShift\u003c/kbd\u003e+\u003ckbd\u003eF\u003c/kbd\u003e\u003c/kbd\u003e and paste in the \"FModel IMG path regexp\" from before (make sure to check the `.*` to the right of the search bar) and press \u003ckbd\u003eEnter\u003c/kbd\u003e\n   - current FModel IMG path regexp (might be outdated): `FactoryGame/Content/FactoryGame/(Resource/|Buildable/Factory/(WorkBench|Workshop|QuantumEncoder|Converter|HadronCollider|OilRefinery|FoundryMk1|Packager|ManufacturerMk1|AssemblerMk1|Blender|SmelterMk1|ConstructorMk1)/).*_256`\n5. select all listed files (\u003ckbd\u003e\u003ckbd\u003eCtrl\u003c/kbd\u003e+\u003ckbd\u003eA\u003c/kbd\u003e\u003c/kbd\u003e) and right-click and `safe texture (.png)`\n\nafter all have finished extracting there should be a folder `FactoryGame` inside `/FModel/Output/Exports` with all the icons;\nthis is the root folder with the folder structure that the `data.json` expects,\nso you can copy paste that to the same directory where you have the `data.json` stored (so the relative-paths in `data.json` work)\n\nScroll [UP](#extract-images \"Scroll to start of section: Extract images\")\n    | [TOP](#satisfactory-flowchart \"Scroll to top of document: Satisfactory flowchart\")\n\n## Parsing JSON data (notes)\n\nthe JSON file _Coffe Stain Studios_ provides is in `UTF-16 LE + BOM`\n\nJavaScript (node.js) as most languages use UTF-16 natively so that is not a problem but the BOM (0xFEFF) at start of file needs to be ignored so JSON can be parsed → skip first (utf-16) character (2 bytes) when loading file\n\n(relevant) `NativeClass` names (via regexp `\\.(\\w+)'$`) ! not ordered in JSON file\n\n- product-recipes:\n  - `FGRecipe`\n  - _under `Classes` each as `{mDisplayName, mIngredients, mProduct, mProducedIn}`_\n    - __ignore all that have empty `mProducedIn`__\n    - __ignore all that have `BP_BuildGun_C` or `FGBuildGun` in `mProducedIn`__\n    - `mProducedIn` ~\u003e regexp match all `\"[^\".]*\\.(\\w+)\"` for manufacturer-class-name\n      - __replace `BP_WorkBenchComponent_C`, `FGBuildableAutomatedWorkBench`, and `Build_AutomatedWorkBench_C` with (just one) `Build_WorkBench_C`__\n      - __replace `BP_WorkshopComponent_C` with `Build_Workshop_C`__\n    - `mIngredients` and `mProduct` ~\u003e skip first and last 2 chars; split at each `),(` then regexp match `ItemClass=\"[^']+'[^.]+\\.(\\w+)'\"` (product-class-name) and `Amount=([0-9]+)` (convert to number) on each entry\n    - `mManufactoringDuration` is stored as string so parse to float\n- product descriptions \u0026 img path:\n  - `FGAmmoTypeInstantHit`\n  - `FGAmmoTypeProjectile`\n  - `FGAmmoTypeSpreadshot`\n  - `FGConsumableDescriptor`\n  - `FGEquipmentDescriptor`\n  - `FGResourceDescriptor`\n  - `FGPowerShardDescriptor`\n  - `FGItemDescriptor`\n  - `FGItemDescriptorBiomass`\n  - `FGItemDescriptorNuclearFuel`\n  - `FGItemDescriptorPowerBoosterFuel`\n  - _under `Classes` each as `{ClassName, mDisplayName, mDescription, mForm, mSmallIcon, mResourceSinkPoints}`_\n    - use `ClassName` for resolving class names in recipes later\n    - replace all `\\r\\n` in `mDescription` with `\\n`\n    - `mForm` can be `RF_SOLID`, `RF_LIQUID`, `RF_GAS`, or `RF_INVALID` (string) use first letter and note what is liquid/gas for unit conversion in recipes later\n    - `mSmallIcon` for img paths later during resolving class names in recipes\n    - `mResourceSinkPoints` for AWESOME Sink points (DNA points are not given and others at 0 will clog the sink)\n- manufacturer descriptions:\n  - `FGBuildableManufacturer`\n  - `FGBuildableManufacturerVariablePower`\n  - __and from `FGBuildable` only `Build_WorkBench_C` and `Build_Workshop_C`__\n  - _under `Classes` each as `{ClassName, mDisplayName, mDescription}`_\n- manufacturer img path:\n  - `FGBuildingDescriptor`\n    - __includes more than those found under \"manufacturer descriptions\"__\n  - _under `Classes` each as `{ClassName, mDisplayName, mSmallIcon}`_\n    - ignore all where `ClassName` matches regexp `Beam|Blue|[Ww]alk|Conveyor|Foundation|Generator|Jump|Miner|Pi(?:llar|pe)|Power|Roof|Sign|Storage|Train|Wall|Set_|_8x` (for most but not all redundant images)\n\nafter parsing, when resolving class names in recipes, for every `mSmallIcon` replace `_512` with `_256` then match with regexp `Texture2D /Game/([^.]*)\\.` and replace entire string with `\"/FactoryGame/Content/$1.png\"` (where `$1` is from the regexp match) to match [extracted images](#extract-images) paths/folder structure\n\nalso check if any name in recipes in-/output is a liquid/gas and convert amount accordingly (divide by 1000 when liquid/gas otherwise do nothing)\n\nScroll [UP](#parsing-json-data-notes \"Scroll to start of section: Parsing JSON data (notes)\")\n    | [TOP](#satisfactory-flowchart \"Scroll to top of document: Satisfactory flowchart\")\n\n## Legacy U3 flowchart\n\nif you want to see the old flowchart I made for the U3 (0.3) version of Satisfactory, you can find the code in the legacy branch in this repo\nand a wayback-machine snapshot of the website here: \u003chttps://web.archive.org/web/20240919112412/https://maz01001.github.io/site/satisfactory_u3_flowchart\u003e\n\nit might still be available at its original location \u003chttps://maz01001.github.io/site/satisfactory_u3_flowchart\u003e\nand the source code at [MAZ01001/MAZ01001.github.io/site/satisfactory_u3_flowchart.html](https://github.com/MAZ01001/MAZ01001.github.io/blob/master/site/satisfactory_u3_flowchart.html \"open file in GitHub repository\")\n\nScroll [UP](#legacy-u3-flowchart \"Scroll to start of section: Legacy U3 flowchart\")\n    | [TOP](#satisfactory-flowchart \"Scroll to top of document: Satisfactory flowchart\")\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmaz01001%2Fsatisfactoryflowchart","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmaz01001%2Fsatisfactoryflowchart","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmaz01001%2Fsatisfactoryflowchart/lists"}