WAR stands for "Whispers Across Realms" - bridging the gap between industrial automation and modern IT infrastructure.
Factory floors speak their own languages: EtherNet/IP, S7comm, ADS, FINS. Meanwhile, your data platforms expect REST, MQTT, Kafka, and Redis. WarLink translates between these worlds, letting you stream PLC data to dashboards, databases, and analytics pipelines without writing custom integration code. No expensive middleware. No vendor lock-in. Just a single binary that runs anywhere.
At its heart WarLink is a TUI (Text User Interface) gateway for industrial PLCs, and can connect and read / write data from Allen-Bradley, Siemens, Beckhoff, and Omron PLCs. It will then republish that data via REST API, MQTT, Kafka, and Redis/Valkey for use in the wider factory infrastructure. It includes advanced features for grouping tags into 'Soft-UDTs' and a rules engine for executing actions (publish, webhook, writeback) when specific PLC conditions are met. It is optimized for high-performance read from PLCs and writing to upstream services, with write-back functionality for discrete types.
BETA - Allen-Bradley Logix and Siemens support is well-tested. Beckhoff is stable but requires more testing. Omron, SLC-500, and MicroLogix are moderately tested. PLC/5 is untested.
War was originally designed as an "Edge" application to simplify pushing data out of NAT'd process networks, but is found to also work well in the server room for aggregating and monitoring data factory-wide. It has been designed for easy configuration and back up (single-file config), and works well for distribution with Ansible and other distribution managers. WarLink runs on most modern terminals, and includes a built-in SSH server and daemon-mode for when you prefer to run it in the background on existing computers or servers, while connecting to it remotely to refine the configuration or monitor conditions.
- WarLink is not a real-time control system - See Safety and Intended Use
- Write-back should only be used for acknowledgments on dedicated tags
- Never use WarLink for safety-critical functions or machine control
- This software is provided without warranty - use at your own risk
Pre-built binaries are available on the Releases page for Linux, macOS, and Windows.
git clone https://github.com/yatesdr/warlink.git
cd warlink
go build -o warlink ./cmd/warlink./warlinkConfiguration is stored at ~/.warlink/config.yaml and created automatically on first run.
- User Interface Guide - TUI tabs and keyboard shortcuts
- Web UI Guide - Browser-based management interface
- Writing Values - Writing to PLC tags (status codes, acknowledgments)
- Configuration Reference - Config file format and options
- PLC Setup Guide - PLC-specific setup and troubleshooting
- REST API - HTTP endpoints for tag values and writes
- MQTT - Topics, QoS settings, and write-back
- Valkey/Redis - Keys, Pub/Sub, and write-back queue
- Kafka - Topics, authentication, and batching
- API Consumer Examples - Code samples for Python, Node.js, Go, C#
- Daemon Mode - Background service with SSH access
- Rules Engine - Automation rules with publish, webhook, and writeback actions
- TagPacks - Aggregate tags for atomic publishing
- Multi-Instance Deployment - Namespace isolation for multiple sites
- Data Types - Types, byte order, and UDT support
- Performance Guide - Optimization and benchmarking
- Best Practices - Namespace design, tag selection, security
- Troubleshooting - Common issues and solutions
- Architecture Overview - Data flow and system design
- Safety and Intended Use - Important limitations and proper use of write-back
- Developer Guide - Using drivers in your own Go applications
- Use Case Examples - Production tracking, alarm aggregation, cross-site monitoring
- Migration Guide - Migrating from Kepware, Ignition, or custom solutions
- Multi-PLC Support - Connect to multiple PLCs from different vendors simultaneously
- Tag Browser - Browse and select tags with real-time value updates
- UDT Support - Automatic structure unpacking with change detection filtering
- Health Monitoring - Periodic health publishing (REST, MQTT, Valkey, Kafka)
- REST API - HTTP endpoints for tag values and writes
- MQTT - Publish tags with optional write-back
- Valkey/Redis - Key storage with Pub/Sub and write-back queue
- Kafka - High-throughput tag changes and rule events
- TagPacks - Group tags within a single PLC or across multiple PLCs for atomic publishing, useful for aggregating related data for upstream IT processes
- Rules Engine - Automation rules with publish (MQTT QoS 2, Kafka), webhook, and writeback actions triggered by PLC conditions
- Daemon Mode - Background service with SSH access
- Web UI - Browser-based management interface with dark mode, setup wizard, and real-time SSE updates
- High Performance - Batched reads, optimized publishing, 100K+ messages/sec
| Family | Models | Tag Discovery | Protocol | Support Level |
|---|---|---|---|---|
| Allen-Bradley Logix | ControlLogix, CompactLogix, Micro800 | Automatic | EtherNet/IP | Tested on Micro820, L7, L8 |
| Allen-Bradley SLC-500 | SLC 5/03, 5/04, 5/05 | Automatic (file directory) | PCCC over EtherNet/IP | Tested on SLC 5/05 |
| Allen-Bradley PLC/5 | PLC-5 series | Manual | PCCC over EtherNet/IP | Untested |
| Allen-Bradley MicroLogix | MicroLogix 1000/1100/1200/1400/1500 | Automatic (file directory) | PCCC over EtherNet/IP | Tested on MicroLogix 1400 |
| Siemens | S7-300/400/1200/1500 | Manual | S7comm | Tested on S7-1200 |
| Beckhoff | TwinCAT 2/3 | Automatic | ADS | Tested on CX9020 |
| Omron (FINS) | CS1, CJ1/2, CP1 | Manual | FINS TCP/UDP | Tested on CP1 |
| Omron (EIP) | NJ, NX Series | Automatic (no UDT members) | EtherNet/IP | Experimental |
WarLink is designed for high-throughput industrial data streaming with batched PLC reads, change filtering, and efficient broker publishing.
Simulated publishing test with 50 PLCs × 100 tags (5,000 total tags) on localhost:
| Broker | Confirmed Delivery | Implementation |
|---|---|---|
| Kafka | 290,000+ msg/s | Batched async |
| Valkey | 45,000+ msg/s | Synchronous |
| MQTT | 32,000+ msg/s | Synchronous QoS 1 |
| PLC Family | Batching | Typical Throughput |
|---|---|---|
| Allen-Bradley Logix | Yes (MSP) | 500-2,000 tags/sec |
| Siemens S7 | Yes (PDU) | 300-1,500 tags/sec |
| Beckhoff ADS | Yes (SumUp) | 1,000-5,000 tags/sec |
| Omron FINS | Yes (Multi-read) | 300-1,500 tags/sec |
| Omron EIP | Yes (MSP) | 500-2,000 tags/sec |
| Allen-Bradley PCCC | Yes (contiguous) | Tested on SLC 5/05, MicroLogix 1400 |
Run warlink --stress-test-republishing to benchmark your system.
| Tab | Key | Action |
|---|---|---|
| Global | P/B/T/R/E/M/V/K/D |
Jump to tab |
| Global | Shift+Tab |
Cycle tabs |
| Global | N |
Configure namespace |
| Global | F6 |
Cycle themes |
| Global | ? |
Help |
| Global | Q |
Quit |
| PLCs | d/a/e/x |
Discover/Add/Edit/Remove |
| PLCs | c/C/i |
Connect/Disconnect/Info |
| Browser | / then c |
Filter / Clear filter |
| Browser | p |
Switch PLC |
| Browser | Space/w/i |
Toggle publish/writable/ignore |
| Browser | s/d |
Per-service config / Details |
| Browser | a/e/x |
Add/Edit/Delete (manual PLCs) |
| TagPacks | a/x |
Add/Remove (context-sensitive) |
| TagPacks | Space/e/i |
Toggle enable/Edit/Ignore changes |
| Rules | a/x/e |
Add/Remove/Edit |
| Rules | Space/F |
Toggle enable / Test fire |
| Services | a/e/x/c/C |
Add/Edit/Remove/Connect/Disconnect |
--config <path> Path to config file (default: ~/.warlink/config.yaml)
--namespace <name> Set instance namespace (saved to config)
--log <path> Write debug messages to a file
--log-debug [filter] Enable protocol debugging (omron,ads,logix,pccc,s7,mqtt,kafka,valkey,tui)
-d, --no-tui Headless mode (no local TUI)
-p <port> HTTP listen port (overrides config)
--host <addr> HTTP bind address (overrides config)
--admin-user <user> Create/update admin user (saved to config)
--admin-pass <pass> Password for admin user (saved to config)
--no-api Disable REST API (ephemeral)
--no-webui Disable browser UI (ephemeral)
--ssh-port <port> SSH listen port (default: 2222)
--ssh-pass <pw> SSH password for remote TUI access
--ssh-keys <path> Path to authorized_keys file or directory
--stress-test-republishing Stress test Kafka, MQTT, and Valkey throughput
--test-duration <dur> Stress test duration (default: 10s)
--test-tags <n> Simulated tags per PLC (default: 100)
--test-plcs <n> Simulated PLCs (default: 50)
-y Skip confirmation prompts
--version Show version
Run as a background service with SSH access:
./warlink -d --ssh-pass "secret"
ssh -p 2222 localhostAdd the web UI to daemon mode for browser-based management alongside SSH:
./warlink -d --ssh-pass "secret" --admin-user admin --admin-pass "password"See Daemon Mode for systemd setup, Docker deployment, and security options.
This project builds on excellent open source libraries:
PLC Communication:
- gos7 - Siemens S7 protocol reference
- fins - Omron FINS/UDP protocol reference
- pylogix - Allen-Bradley EtherNet/IP reference
Infrastructure:
- paho.mqtt.golang - MQTT client
- go-redis - Redis/Valkey client
- kafka-go - Kafka client
User Interface:
- tview - Terminal UI framework
- tcell - Terminal cell library
- x/crypto/ssh - SSH server