A lightweight HTTP bridge that enables external systems and automation tools to control and monitor your Satisfactory factory through FicsIt-Networks mod integration.
Satisfactory Bridge acts as a bidirectional communication layer between external systems and the Satisfactory game. It provides a simple REST API for sending commands to your factory and receiving status updates, enabling automated factory control and monitoring.
- 🔌 Simple REST API - Easy integration with automation tools and external systems
- 🎮 FicsIt-Networks Integration - Full Lua client library for in-game computers
- 🔐 Secure API Key Authentication - Protect your factory from unauthorized access
- 📊 Command Queue Management - FIFO queue with view/clear capabilities
- 🔄 Bidirectional Communication - Send commands and receive responses
- 🐧 Linux Ready - Includes Alpine Linux init script for service deployment
- 📝 Comprehensive Logging - Monitor all bridge activity with detailed logs
- External Factory Control - Integrate with automation systems to optimize production
- Remote Monitoring - Check factory status from external dashboards
- Scripted Automation - Automate complex factory operations and workflows
- Integration Testing - Automate game state verification for mod development
┌─────────────┐ ┌──────────────┐ ┌──────────────────┐
│ External │ │ Bridge │ │ Satisfactory │
│ System │ │ Server │ │ FicsIt Computer │
└──────┬──────┘ └──────┬───────┘ └────────┬─────────┘
│ │ │
│ POST /command │ │
│ {"action": "get_status"} │ │
├───────────────────────────────►│ │
│ │ │
│ │ Stores in queue │
│ │ │
│ │ GET /command │
│ │◄─────────────────────────────────┤
│ │ │
│ │ Returns & removes oldest command │
│ ├─────────────────────────────────►│
│ │ │
│ │ Executes command │
│ │ in factory │
│ │ │
│ │ POST /response │
│ │◄─────────────────────────────────┤
│ │ {"status": "success", ...} │
│ │ │
│ GET /responses │ │
├───────────────────────────────►│ │
│◄───────────────────────────────┤ │
│ Returns all responses │ │
│ │ │
- Bridge Server (
main.go) - Lightweight Go HTTP server managing command queue and responses - Parser (
parser/) - Optional log parser for monitoring factory health from game logs - Lua Clients (
lua/,ficsit/) - In-game scripts for FicsIt-Networks computers
- Go 1.22 or higher (for building from source)
- Satisfactory game with FicsIt-Networks mod installed
- Linux server or container (Alpine, Ubuntu, Debian, etc.)
# Clone the repository
git clone https://github.com/kushie/satisfactory-bridge.git
cd satisfactory-bridge
# Build the bridge server
go build -o bridge main.go
# (Optional) Build the log parser
cd parser && go build && cd ..Generate a strong API key and set environment variables:
# Generate a secure API key
export BRIDGE_API_KEY="$(openssl rand -base64 32)"
# Optional: Set custom port (default is :8080)
export BRIDGE_PORT=":8080"./bridgeYou should see:
Satisfactory Bridge Server
Version: 1.0.0
Port: :8080
API Key: ****xxxx
- Open Satisfactory and place a Computer in your factory
- Connect an Internet Card to the computer
- Connect machines you want to control via network cables
- Open the computer's filesystem and create a new Lua file
- Copy the contents of
ficsit/bridge_client.lua - Edit the configuration:
local BRIDGE_URL = "http://<your-bridge-ip>:8080"
local API_KEY = "<your-api-key-here>"
local POLL_INTERVAL = 2- Run the script and verify connection
For production deployment on Alpine Linux:
# Install dependencies
apk add go git openrc
# Clone and build
git clone https://github.com/kushie/satisfactory-bridge.git
cd satisfactory-bridge
go build -o bridge main.go
# Install as a service
cp bridge /usr/local/bin/
cp bridge.initd /etc/init.d/bridge
chmod +x /etc/init.d/bridge
# Create configuration
cat > /etc/conf.d/bridge << EOF
BRIDGE_API_KEY="$(openssl rand -base64 32)"
BRIDGE_PORT=":8080"
EOF
# Enable and start
rc-update add bridge default
rc-service bridge start| Variable | Default | Description |
|---|---|---|
BRIDGE_API_KEY |
(required) | API key for authentication. Must be set. |
BRIDGE_PORT |
:8080 |
Port to listen on (format: :PORT) |
-
Use Strong API Keys
# Generate cryptographically secure key openssl rand -base64 32 -
Use HTTPS in Production
- Run behind a reverse proxy (nginx, Caddy, Traefail)
- Enable TLS/SSL with Let's Encrypt
-
Restrict Network Access
- Use firewall rules to limit access
- Only expose to trusted networks
-
Rotate API Keys Regularly
- Change keys periodically
- Use different keys for dev/staging/production
See SECURITY.md for comprehensive security guidelines.
All authenticated endpoints require an API key via header or query parameter:
- Header:
X-API-Key: your-api-key - Query:
?key=your-api-key
Health check endpoint (no authentication required).
Response:
{
"ok": true,
"service": "satisfactory-bridge",
"version": "1.0.0",
"commands_queued": 0,
"responses_count": 5,
"uptime": "2h15m30s"
}Push a command to the queue for the game to execute.
Request:
{
"id": "optional-unique-id",
"action": "set_standby",
"target": "iron_smelter_01",
"params": {
"enabled": false
}
}Response:
{
"ok": true,
"command_id": "20260213123045.123",
"queued": 1
}Poll for the next command (FIFO). Returns and removes the oldest command from the queue.
Response (with command):
{
"ok": true,
"command": {
"id": "20260213123045.123",
"action": "get_status",
"target": "factory",
"created_at": "2026-02-13T12:30:45.123Z"
},
"queued": 0
}Response (empty queue):
{
"ok": true,
"command": null,
"queued": 0
}View all pending commands without removing them (non-destructive).
Response:
{
"ok": true,
"commands": [
{
"id": "123",
"action": "toggle",
"target": "constructor_01",
"created_at": "2026-02-13T12:30:45.123Z"
}
],
"count": 1
}Clear all pending commands.
Response:
{
"ok": true,
"cleared": 5
}Game reports command execution result.
Request:
{
"command_id": "123",
"status": "success",
"data": {
"machine_count": 42,
"machines": [...]
}
}Response:
{
"ok": true
}Alternative response submission via GET (workaround for FicsIt-Networks POST crashes on Linux servers).
Query Parameters:
command_id- The command IDstatus- Execution status (default: "ok")data- Response data (optional)
Example:
GET /response?command_id=123&status=success&data=Machine+started
Retrieve all responses (last 100).
Response:
{
"ok": true,
"responses": [
{
"command_id": "123",
"status": "success",
"data": {"message": "pong"},
"timestamp": "2026-02-13T12:30:50.123Z"
}
]
}# Push a status check command
curl -X POST http://localhost:8080/command \
-H "X-API-Key: YOUR-API-KEY-HERE" \
-H "Content-Type: application/json" \
-d '{
"action": "get_status"
}'
# Game polls and executes command...
# Retrieve response
curl -H "X-API-Key: YOUR-API-KEY-HERE" \
http://localhost:8080/responses# Turn off a specific machine
curl -X POST http://localhost:8080/command \
-H "X-API-Key: YOUR-API-KEY-HERE" \
-H "Content-Type: application/json" \
-d '{
"action": "set_standby",
"target": "iron_smelter_01",
"params": {
"enabled": true
}
}'# Clear all pending commands
curl -X DELETE http://localhost:8080/queue \
-H "X-API-Key: YOUR-API-KEY-HERE"When using ficsit/bridge_client.lua:
| Action | Description | Parameters |
|---|---|---|
ping |
Test connectivity | None |
get_status |
Get all machine statuses | None |
list_machines |
List discovered machines | None |
toggle |
Toggle machine on/off | target: machine name |
set_standby |
Set machine standby state | target: machine nameparams.enabled: boolean |
start_all |
Start all machines | None |
stop_all |
Stop all machines | None |
For easier control, nickname your machines in-game:
- Look at a machine
- Press Middle Mouse Button
- Give it a descriptive name (e.g.,
iron_smelter_01)
Then reference it in commands:
{
"action": "toggle",
"target": "iron_smelter_01"
}satisfactory-bridge/
├── main.go # Bridge server
├── parser/ # Log parser
│ ├── main.go
│ └── go.mod
├── lua/ # LEXIS factory control script
│ └── lexis-factory-control-v6.lua
├── ficsit/ # FicsIt-Networks client
│ ├── bridge_client.lua
│ └── README.md
├── bridge.initd # Alpine init script
├── go.mod # Go module definition
├── LICENSE # MIT License
├── CONTRIBUTING.md # Contribution guidelines
├── SECURITY.md # Security policy
└── README.md # This file
# Build bridge server
go build -o bridge main.go
# Build with optimization
go build -ldflags="-s -w" -o bridge main.go
# Cross-compile for Linux (from macOS/Windows)
GOOS=linux GOARCH=amd64 go build -o bridge main.go# Test the bridge server
export BRIDGE_API_KEY="test-key"
./bridge &
# Run test commands
curl http://localhost:8080/status
curl -H "X-API-Key: test-key" http://localhost:8080/queue
# Stop the server
killall bridgeError: ERROR: BRIDGE_API_KEY environment variable is required
Solution: Set the BRIDGE_API_KEY environment variable before starting:
export BRIDGE_API_KEY="your-secure-key"
./bridgeSymptoms: FicsIt computer shows timeout errors
Solutions:
- Verify bridge is running:
curl http://<bridge-ip>:8080/status - Check firewall allows port 8080
- Ensure correct IP address in Lua script
- Verify API key matches in both bridge and Lua script
Solution: Connect an Internet Card component to your FicsIt computer via the component network.
Solutions:
- Check command queue:
curl -H "X-API-Key: YOUR-KEY" http://<bridge-ip>:8080/queue - Verify Lua script is running in-game
- Check bridge logs for errors
- Ensure machines are connected to computer via network cables
Solutions:
- Connect machines to computer using network cables
- Only production machines are discoverable (constructors, smelters, assemblers, etc.)
- Check cables are properly connected to both machine and computer
- Try restarting the Lua script
Contributions are welcome! Please see CONTRIBUTING.md for guidelines.
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Make your changes
- Test locally
- Commit using conventional commits format
- Push to your fork
- Open a Pull Request
This project is licensed under the MIT License - see the LICENSE file for details.
- FicsIt-Networks - The mod that makes this all possible
- Satisfactory game by Coffee Stain Studios
- The Satisfactory modding community
- Issues: Report bugs or request features via GitHub Issues
- Security: Report vulnerabilities privately - see SECURITY.md
Made with ❤️ for factory automation enthusiasts