Skip to content
Heracles LDMT Heracles Linux Deployment Maintenance Tools
Built in China · Open source · Self-hosted

A homegrown Linux automation tool — the SSH console that replaces Ansible.

Green install: nothing to prepare. A JRE ships inside the package, so there is no JDK to install and no environment variables to set — unzip it and run startup. It drives machines over plain SSH, so targets need no agent. One browser tab for your whole Linux fleet.

v1.0.0No JDKNo agentApache-2.0
Operations / Machines
Heracles-LDMT screenshot: Operations / Machines
Green install

Nothing to install. Unzip and run.

Tools in this space usually start by asking for a JDK, a Python setup and an agent on every machine. This one asks for none of the three.

1

No JDK

A JRE ships inside the package. The startup script picks the x86_64 or aarch64 build from uname -m and launches with it — no JAVA_HOME, no yum install java.

2

No setup

Unzip and run ./startup.sh. Port 8766, the SQLite database and the sample data are all part of the package: no config file to edit, no dependency to add.

3

No agent

Plain SSH — the target needs port 22 open and a working account. Nothing to deploy, no extra port, no Python runtime.

4

Nothing left behind

No system directories, no registered services, no kernel modules. The whole program is one directory; delete it and the machine is as it was.

Sound familiar?

One machine takes twenty commands. Twenty machines?Copy-paste across terminals until one of them fails silently — and you still have to find out which.
One runbook, three engineers, three different machines.Nothing is recorded, so afterwards you reconstruct the timeline from memory.
A different distribution means different commands.Switching between apt and yum is exactly when mistakes happen at 2 a.m.
Capabilities

What you get

Six things you would otherwise do by hand — with the limits of each spelled out, so you do not find them the hard way.

1

Bulk install

Pick an application, pick machines, start. Every machine streams its own console, so you can see which one broke and where.

2

Applications and commands

Commands are the blocks; an application is the sequence. Four command types and global variables — no YAML to learn, no inventory file to keep.

3

Distribution aware

Debian, Red Hat, SUSE, Unix or other — the right package and mirror commands are chosen per machine. Kylin and UOS are their own types.

4

File manager

Browse, upload, compress, change permissions. A two-pane browser over the same SSH connection, with a dedicated landing directory for ISOs.

5

Web terminal

A quick fix no longer needs a second terminal app on your desktop. Close the tab and the connection closes.

6

Audit trail

Every install, on every machine, with its exit code and full output. Roles and departments decide who sees what.

Where this differs

No YAML. A command is a block.

Most tools in this space describe a task in YAML, which has a learning curve. Here the idea is flatter: a command is a block, a few blocks make an application, and variables inside a command are replaced per target machine at run time.

One command, two distribution families

Both the source-refresh step and the install step differ per family. So both are variables — share what to install, not how to install it.

  • Four command types: returns, takes arguments, runs without returning, uploads a file
  • Variables include $IP$, $LOGIN_NAME$, $BASE_DIR$ and the install / mirror commands
  • Commands are reusable across applications — change once, applied everywhere
# As written in the application
$SOURCE_INSTALL_COMMAND$ && $PACKAGE_INSTALL_COMMAND$ -y nginx

# What 192.168.1.31 receives (Debian family)
apt-get update && apt-get install -y nginx

# What 192.168.1.52 receives (Red Hat family)
yum makecache && yum install -y nginx
Why not just write apt-get update? Because on a Red Hat machine it fails at the first step with command not found — which disproves the very claim this block is making. The source refresh has to be a variable too.

Running in three steps

No JDK, no database, no config file. One package, one port, one browser tab.

1

Unzip

You get the jar, the startup script and a jre directory. The target machine only needs sshd running.

2

Run ./startup.sh

It unpacks the bundled JRE for this architecture, starts in the background and prints the log and the URL.

3

Sign in, add a machine

Open http://server-ip:8766/ , sign in as admin / admin, and change the password right away.

Where it fits, where it does not

Placing it correctly is more useful than overselling it.

AspectHeracles LDMTAnsibleManual SSH
Learning curve✓ install and go~ YAML and inventory✓ none
Target requirements✓ SSH only~ Python runtime✓ SSH only
Server-side dependencies✓ JRE bundled, unzip and go~ Python plus deps✓ none
GUI✓ file manager + terminal— CLI— none
Bulk install progress✓ per-machine live output~ read the log— manual loop
Install records✓ automatic~ needs a log pipeline— none
Domestic distributions✓ Kylin and UOS are first-class~ adapt yourself~ tribal knowledge
This table is about trade-offs, not ranking. If you need to orchestrate dozens of middleware stacks, replay idempotently, or plug into a CMDB, Ansible is the better fit. If you just want twenty fewer terminal windows and a record of what was installed, this is.
Latest release

v1.0.0

JRE bundledLicense Apache-2.0
The package is not uploaded yet. An administrator can fill the version, size, SHA-256 and package address in Settings → Reading, and this card updates automatically.

Try it in the browser

The demo site is still being set up. Until then, run the package locally — it is the same build, and it comes with sample machines so the console is not empty.

Connect your first machine today

One jar, one port, one browser tab. If it does not fit, you have lost ten minutes.