Created by Murry Jeong (comchangs) · Supported by neurosam.AI
YAML-based module handler plugins for infrastructure services. Add support for any service without writing Go code.
35 plugins are bundled in the tow binary — no separate installation needed. Just set the type:
# tow.yaml
modules :
my-db :
type : postgresql
port : 5432
Community Plugins
Install plugins from GitHub repos or URLs:
# From GitHub repo
tow plugin add someuser/tow-plugin-mssql
# From GitHub repo with specific file path
tow plugin add myorg/infra-plugins/oracle.yaml
# From any URL
tow plugin add https://example.com/my-custom-service.yaml
# Remove
tow plugin remove mssql
# List all installed (bundled + external)
tow plugin list
Built-in handlers (Go code: java, springboot, node, python, etc.)
Bundled plugins (embedded in binary: kafka, redis, mysql, etc.)
./plugins/ (project-level, committed to git)
~/.tow/plugins/ (global, installed via tow plugin add)
Plugin
Service
Default Ver.
Port
Health Check
mysql
MySQL relational database
8.4.3
3306
TCP
postgresql
PostgreSQL relational database
16.6
5432
TCP
mariadb
MariaDB relational database
11.4.4
3306
TCP
mongodb
MongoDB document database
7.0.8
27017
Command
clickhouse
ClickHouse analytics database
24.12.3
8123
HTTP /ping
influxdb
InfluxDB time-series database
2.7.10
8086
HTTP /health
Example: PostgreSQL + MongoDB
modules :
main-db :
type : postgresql
port : 5432
data_dirs : [pgdata]
health_check :
type : tcp
timeout : 30
doc-store :
type : mongodb
port : 27017
data_dirs : [data/db, data/log]
Message Brokers & Streaming (3)
Plugin
Service
Default Ver.
Port
Health Check
kafka
Apache Kafka event streaming
3.7.0
9092
TCP
rabbitmq
RabbitMQ message broker
3.13.1
5672
TCP
zookeeper
Apache ZooKeeper coordination
3.9.2
2181
TCP
Example: Kafka + ZooKeeper cluster
modules :
zookeeper :
type : zookeeper
port : 2181
data_dirs : [data]
kafka :
type : kafka
port : 9092
data_dirs : [data/kafka-logs]
environments :
prod :
servers :
- number : 1
host : ${BROKER_1}
modules : [zookeeper, kafka]
- number : 2
host : ${BROKER_2}
modules : [zookeeper, kafka]
- number : 3
host : ${BROKER_3}
modules : [zookeeper, kafka]
Plugin
Service
Default Ver.
Port
Health Check
kafka-connect
Kafka Connect distributed mode
3.7.0
8083
HTTP /connectors
kafka-lag-exporter
Kafka consumer lag monitoring
0.8.2
9999
TCP
kminion
KMinion Kafka monitoring
2.2.3
8080
HTTP /ready
cmak
Cluster Manager for Apache Kafka
3.0.0.6
9000
HTTP
Example: Full Kafka stack with monitoring
modules :
kafka :
type : kafka
port : 9092
kafka-connect :
type : kafka-connect
port : 8083
kafka-lag :
type : kafka-lag-exporter
port : 9999
kafka-ui :
type : cmak
port : 9000
Plugin
Service
Default Ver.
Port
Health Check
redis
Redis in-memory data store
7.2.4
6379
Command (redis-cli ping)
memcached
Memcached distributed caching
1.6.32
11211
TCP
minio
MinIO S3-compatible object storage
latest
9000
HTTP /minio/health/live
etcd
etcd distributed key-value store
3.5.17
2379
HTTP /health
Example: Redis cluster
modules :
redis :
type : redis
port : 6379
data_dirs : [data]
environments :
prod :
servers :
- number : 1
host : ${REDIS_1}
modules : [redis]
- number : 2
host : ${REDIS_2}
modules : [redis]
- number : 3
host : ${REDIS_3}
modules : [redis]
Monitoring & Observability (4)
Plugin
Service
Default Ver.
Port
Health Check
prometheus
Prometheus metrics collection
2.51.1
9090
HTTP /-/healthy
grafana
Grafana visualization dashboard
10.4.1
3000
HTTP /api/health
node-exporter
Prometheus node metrics exporter
1.7.0
9100
HTTP /metrics
kibana
Kibana Elasticsearch visualization
8.17.0
5601
HTTP /api/status
Example: Full monitoring stack
modules :
prometheus :
type : prometheus
port : 9090
grafana :
type : grafana
port : 3000
data_dirs : [data]
node-exporter :
type : node-exporter
port : 9100
Plugin
Service
Default Ver.
Port
Health Check
elasticsearch
Elasticsearch search engine
8.13.0
9200
HTTP /_cluster/health
logstash
Logstash log pipeline
8.17.0
9600
HTTP
fluentd
Fluentd log collector
1.17.1
24224
TCP
loki
Grafana Loki log aggregation
2.9.4
3100
HTTP /ready
promtail
Grafana Promtail log shipper
2.9.4
9080
HTTP /ready
Example: ELK vs Loki stack
# Option A: ELK stack
modules :
elasticsearch :
type : elasticsearch
port : 9200
data_dirs : [es-data]
logstash :
type : logstash
port : 9600
kibana :
type : kibana
port : 5601
# Option B: Grafana Loki stack
modules :
loki :
type : loki
port : 3100
data_dirs : [loki-data]
promtail :
type : promtail
port : 9080
grafana :
type : grafana
port : 3000
Plugin
Service
Default Ver.
Port
Health Check
nginx
Nginx web server / reverse proxy
1.25.4
80
HTTP
haproxy
HAProxy load balancer
3.0.7
80
TCP
Plugin
Service
Default Ver.
Port
Health Check
vault
HashiCorp Vault secrets management
1.18.3
8200
HTTP /v1/sys/health
consul
HashiCorp Consul service mesh
1.20.2
8500
HTTP /v1/status/leader
keycloak
Keycloak identity / SSO
26.0.7
8080
HTTP /health/ready
Example: Vault + Consul
modules :
vault :
type : vault
port : 8200
data_dirs : [vault-data]
consul :
type : consul
port : 8500
data_dirs : [consul-data]
Plugin
Service
Default Ver.
Port
Health Check
jenkins
Jenkins CI/CD server
2.492
8080
HTTP /login
sonarqube
SonarQube code quality
10.7.0
9000
HTTP /api/system/status
Plugin
Service
Default Ver.
Port
Health Check
airflow
Apache Airflow workflow orchestration
2.10.4
8080
HTTP /health
superset
Apache Superset data visualization
4.1.1
8088
HTTP /health
name : myservice
description : My custom service
version : " 1.0.0"
author : Your Name
package :
default_version : " 2.0.0"
url_template : " https://example.com/releases/{{VERSION}}/myservice-{{VERSION}}.tar.gz"
versions :
# Simple: just a URL (uses plugin-level commands)
" 2.0.0 " : " https://example.com/releases/2.0.0/myservice-2.0.0.tar.gz"
# Full override: version-specific commands, provision, health check
" 1.8.0 " :
url : " https://example.com/releases/1.8.0/myservice-1.8.0.tar.gz"
start_cmd : " {{BASE_DIR}}/current/myservice-1.8.0/bin/start --port {{PORT}}"
stop_cmd : " {{BASE_DIR}}/current/myservice-1.8.0/bin/stop"
provision :
packages : [libssl1.1] # older version needs older lib
health_check :
type : tcp # v1.x had no HTTP health endpoint
timeout : 30
# Fallback commands (used when version has no override)
start_cmd : " {{BASE_DIR}}/current/bin/myservice --port {{PORT}}"
stop_cmd : " kill $(cat {{BASE_DIR}}/myservice.pid) 2>/dev/null || true"
status_cmd : " curl -sf http://localhost:{{PORT}}/health"
artifact_path : " external-package/myservice.tar.gz"
package_includes : [bin/, config/, lib/]
health_check :
type : http
target : " http://localhost:{{PORT}}/health"
timeout : 60
provision :
packages : [libssl-dev]
directories : ["{{BASE_DIR}}/data"]
commands : ["sysctl -w vm.max_map_count=262144 2>/dev/null || true"]
data_dirs : [data]
log_file : " myservice.log"
Publishing Your Own Plugin
Option A: GitHub Repository (recommended)
Create a repo (e.g., myuser/tow-plugin-oracle)
Add oracle.yaml following the schema above
Users install with: tow plugin add myuser/tow-plugin-oracle
Convention: name the repo tow-plugin-{service} — tow will automatically look for {service}.yaml in the repo root.
Option B: Submit to bundled collection
Create a YAML file following the schema above
Test: tow validate && tow provision && tow deploy
Submit a PR to neurosamAI/tow-cli
Accepted plugins are bundled in the next release and available to all users without installation.