Open-source project
WangYihang/Platypus avatar
WangYihang/Platypus

Platypus Host Management for Linux Fleets

:hammer: A modern, cross-platform machine manager

1,659 stars225 forksGoLGPL-3.0

At a glance

What is it?
Platypus is a Go-based host management hub with a callback agent, terminal sessions, file transfer, listeners, and tunnels. It fits administrators of owned Linux fleets, but its single-instance architecture and agent enrollment model require careful operational review.
Who is it for?
Platform and infrastructure teams operating owned Linux hosts should consider Platypus when centralized terminals, file management, listeners, and tunnels justify running a dedicated agent on every machine. Organizations needing horizontally replicated control planes, non-Linux hosts, or an SSH workflow without resident agents should reject it.
Can I use it commercially?
Yes, with conditions. LGPL-3.0 is a weak copyleft licence: you can use it inside commercial and closed-source software, but if you distribute changes to its own files, you must publish those changes under the same licence.
Is it still maintained?
Yes. The repository last received commits 2 days ago.
What is it written in?
Mainly Go, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on October 23, 2026, and from our analysis. They are not legal advice.

Editorial analysis

Platypus Centralizes Management of Owned Linux Hosts

Platypus addresses the operational work involved after an organization has accumulated Linux machines that need shells, file movement, network forwarding, and centralized visibility. Its intended users are administrators who own the managed hosts and want those capabilities gathered behind one server. The README explicitly limits the target to fleets of Linux machines. This is broader than a terminal emulator, yet narrower than a full configuration management platform because the documented feature set does not describe desired-state policy, configuration rollout, or inventory reconciliation.

The project centers on outbound connectivity. An administrator installs `platypus-agent` on a host, after which the agent contacts the Platypus server rather than waiting for the server to connect inbound to the machine. That design suits environments where a fleet is spread across private networks and opening management ports directly on each host would be inconvenient. The agent carries out the privileged machine-side work, while the server coordinates clients and exposes administrative APIs.

Platypus is not documented as a Linux-only compilation target for the server or desktop interface. The distinction is in the managed workload. The README calls it a manager for Linux machines and says to install the agent on every host you own. Teams expecting native management of Windows or macOS endpoints do not have support for those targets confirmed in the available documentation.

Agent Callbacks Connect Shells, Files, and Tunnels to Platypus

The communication path begins with `platypus-agent` dialing back to `platypus-server` over TLS and protobuf. According to the architecture description, the server accepts these agent connections on configurable ingress ports, allowing different network groups to reach one control plane. Keeping the callback direction under the agent's control avoids requiring a public inbound management connection to every managed Linux host.

Administrative clients then reach the server through a REST and WebSocket API. Terminal output is streamed through WebSockets. File operations support reading, writing, upload, and download through chunked transfer, which is more suitable for large files than treating each transfer as one opaque API request. The network features include local-port forwarding, remote-port forwarding, and dynamic SOCKS5 tunnels.

The project separates server, agent, and desktop responsibilities. `platypus-server` is the daemon and distribution point for agent binaries. `platypus-agent` remains on each managed machine. `platypus-desktop`, built with Wails v2, connects to a reachable server with a URL and secret. The desktop client organizes sessions, terminals, listeners, files, and tunnels in one interface, and multiple desktop clients can connect to the same server.

There is a documentation inconsistency that should be resolved before deployment. The architecture section calls the server "purely an API" and says that it has no embedded web UI. The Docker documentation and Dockerfile describe a React web bundle embedded through `//go:embed`. The repository therefore contains both API-oriented and embedded UI paths, but the README does not explain which build variants are intended for which deployments.

Docker Compose Provides the Shortest First Platypus Deployment

The quickest documented path starts a full local deployment with Docker Compose. The command builds the server and agent publisher, exposes the management interface, and creates persistent volumes for server data and build caches.

bash
git clone https://github.com/WangYihang/Platypus
cd Platypus
docker-compose up -d

After the services start, open `https://localhost:9443`. The documentation says the container uses a self-signed certificate, so the browser will request confirmation before loading the interface. The Compose file maps `9443:9443` and supplies `PLATYPUS_EXTERNAL_ADDR`, `PLATYPUS_DATA_DIR`, and `PLATYPUS_DEV=1` to the server container.

The first administrator is bootstrapped with a generated secret. Read it through the running server container:

bash
docker compose exec platypus-server cat /app/data/bootstrap.secret

Use that value once to create the initial administrator, then delete `/app/data/bootstrap.secret`. The README states that bootstrap is completed at that point and the secret is no longer accepted. This explicit handoff is preferable to placing an initial administrator password directly in a Compose file, although the secret still has to be protected while it exists in the persistent server volume.

After login, the UI's "Add Agent" action produces a one-line `curl ... | sh` command. According to the README, that command is signed and pinned to the project CA. This enrollment path is the first real use of Platypus because it connects a machine to the control plane; terminals, files, and tunnels become available after the host appears as an agent.

Building Platypus Binaries and Clients from Source

Source builds require Go 1.27+. `protoc` is required only when protobuf code must be regenerated. The basic backend build produces the server and agent binaries under `build/`.

bash
git clone https://github.com/WangYihang/Platypus
cd Platypus
make build

The README reports the outputs as `./build/{platypus-server,platypus-agent}`. The Makefile also defines `platypus-cli`, so the full build target has more outputs than the abbreviated README example names. Available maintenance targets include `make test`, `make lint`, `make snapshot`, and `make help`.

The desktop application has a separate toolchain. It requires Node 22+, the Wails CLI, and platform WebView libraries. Linux uses `webkit2gtk-4.1`, Windows uses WebView2, and macOS uses WKWebView. The following commands install dependencies, build the native application, or begin development:

bash
make desktop-deps
make desktop-build
make desktop-dev

The documented desktop binary is `desktop/build/bin/platypus-desktop`. There is also a static browser UI path. Building it produces `desktop/frontend/dist-web/`, while the preview command serves that bundle on `http://localhost:8080`:

bash
make web-ui
make web-ui-serve

The browser build is described as lacking real-time event push. That difference may matter for operators who expect terminal and session changes to appear immediately. The README says the resulting bundle is static and can be hosted on GitHub Pages, S3, or nginx, then pointed at a Platypus server through its login form.

Server Secrets and Single-Instance State Constrain Production Use

Platypus refuses to start without `PLATYPUS_CA_KEK` unless development mode is explicitly enabled. The documented key is 32 bytes represented as hexadecimal and is used to seal the CA private key with AES-256-GCM. The development alternative writes a fallback key next to the encrypted database at `<data-dir>/ca.kek`, which the README explicitly describes as unsafe for production.

The Compose deployment sets `PLATYPUS_DEV=1`, so it is convenient for initial access but is not a production secret-handling example. A production deployment should provide `PLATYPUS_CA_KEK` and omit that development switch. The exact secret-injection mechanism, such as a systemd environment file or container secret, is not documented in the available quick-start instructions.

The server is also single-instance only. Its opaque-token verifier caches verified tokens in a per-process LRU. Revocation is applied synchronously in the process that performs logout, a password change, AAT revocation, or user deletion. Without a cross-process invalidation channel, another replica can accept a revoked token until the cache TTL expires, which the README sets at 30 seconds.

Consequently, multiple load-balanced `platypus-server` processes against one database are outside the supported architecture. The README recommends vertical scaling with a high-availability stand-by instead. High availability here should not be interpreted as active-active horizontal replication, because token state is not synchronized across processes.

Platypus Differs from SSH Fleet Administration

OpenSSH is the clearest alternative for teams whose main requirement is remote command execution and file transfer. SSH places an authentication protocol and daemon on each host, while administrators establish outbound connections from their workstations or automation systems. Platypus instead installs a resident agent that dials a central server over its TLS and protobuf channel. The central callback model can simplify access across segmented networks and gives the UI a common place to organize hosts, sessions, files, listeners, and tunnels.

The choice is not simply interface preference. Platypus adds a server-side control plane, bearer-token-authenticated REST operations, an agent distribution path, listener configuration, and multi-host dispatch facilities. SSH can cover terminals and file copying without that Platypus-specific API or persistent management daemon. An organization already standardized on SSH configuration, host keys, jump hosts, and shell-native workflows may find the added deployment surface unnecessary.

Platypus is also the wrong choice when horizontally scaled replicas are non-negotiable, since one database must not be served by multiple live server instances until cross-process token invalidation exists. It is similarly a poor fit for an environment that cannot run an always-available agent with the permissions needed for shells, file management, and port forwarding. The documentation does not provide a detailed minimum Linux privilege matrix, so required capabilities and service-account boundaries should be established before fleet rollout.

Platypus Development Is Recent, While Tagged Releases Are Older

The repository is not archived, and its last push was on 2026-10-17. That is recent activity, but it does not mean every released interface is backed by a matching published binary. The listed releases are `v1.5.1` from 2022-02-04, `v1.5.0` from 2021-07-16, and `v1.4.4` from 2021-07-15.

This gap matters during adoption. The current README describes Go 1.27, Go 1.27 Docker images, Wails v2, an embedded web UI, signed agent distribution, and production encryption controls that are not tied to the listed historical release archives. Source checkout, the Compose build, and the newest release binary should therefore not be treated as equivalent options without checking their contents and deployment instructions.

Platypus is licensed under `LGPL-3.0`. That license governs use and distribution of the licensed project, but the repository documentation does not offer legal guidance for a particular deployment. Organizations modifying or redistributing components should review the license against their own distribution model.

Upgrade cost also extends beyond downloading a binary. `PLATYPUS_CA_KEK` protects the server CA key, agents are enrolled with project trust material, and server persistence includes the data directory. The README does not document a rollback procedure, database migration compatibility policy, or production upgrade rehearsal. Those omissions do not prove a migration is unsafe, but they mean they cannot be considered covered by the published quick-start material.

Editorial conclusion

Platform and infrastructure teams operating owned Linux hosts should consider Platypus when centralized terminals, file management, listeners, and tunnels justify running a dedicated agent on every machine. Organizations needing horizontally replicated control planes, non-Linux hosts, or an SSH workflow without resident agents should reject it. Before adoption, verify whether one server instance, its database, and the `PLATYPUS_CA_KEK` meet the intended availability and secret-management requirements.

Frequently asked questions

How do I start a complete Platypus deployment?

The README recommends running `docker-compose up -d` from a clone of the repository, then opening `https://localhost:9443`. The Compose configuration exposes port 9443 and stores server data in the `platypus_data` volume.

How is the first Platypus administrator created?

The container writes a one-use `bootstrap_secret` to `/app/data/bootstrap.secret`. Read it with the documented `docker compose exec` command, use it once to create the first admin, and then delete the file.

Can I run multiple Platypus server replicas against one database?

No. The README identifies the server as single-instance only because revoked opaque tokens can remain valid in other processes until the 30-second cache TTL. Vertical scaling with a stand-by is the documented production shape.

Official sources

  1. Issues
  2. License: LGPL-3.0
  3. README
  4. Releases
  5. WangYihang/Platypus on GitHub
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/wangyihang-platypus.svg)](https://hysenlabs.com/projects/wangyihang-platypus)

Was this useful?