Skip to content
  • MangoFly

    A self-hosted WireGuard mesh. Devices connect straight to each other; the coordination server is one binary and a SQLite file, and never sees their traffic.

    encrypted WireGuard · peer to peerLaptopbehind home NATServerin a datacentrePhoneon mobile datacoordination serverone binary · one SQLite filecontrol plane only (TLS)keys · tunnel addresses · peer lists · sealed ICE candidatesholds no private keys · carries no traffic · cannot decryptdatacontrol
  • MangoDock

    Docker management with nothing on the hosts. Reaches each daemon over an ordinary SSH session — no agent to install, no port to open.

    The MangoDock dashboard showing three host cards with container state counts, CPU and memory gauges, a usage history and recent events
  • MangoWiFi

    A Wi-Fi 6/7/8 test bench. One binary runs as Console or Agent either side of the access point under test, measuring latency under real load.

    AP under testWi-Fi 6 / 6E / 7Agentstation side · real radioLAN receiveriperf3 -sConsoleUI · orchestrates · probes
  • Blog
  • Nothing phones home

    No telemetry, no analytics, no crash reporter, no account login. Check it with a packet capture on your own network.

    Download MangoSSH
  • Project
  • Download
  • Access

    Accounts and roles

    Authentication is mandatory and three roles are enforced on the server, not hidden in the interface.

    The first request against a fresh install is a “create the admin account” screen, not an open API. There is no environment variable that disables this.

    That is a deliberate departure. Other self-hosted Docker UIs ship with authentication off until somebody opts in, and the honest reading of that default is that many installs never get around to turning it on. MangoDock can start and stop production containers and holds the SSH credentials for every host it manages.

    The three roles

    RoleWhat it can do
    adminEverything, including users, hosts, credentials, and the authentication settings themselves.
    operatorDay-to-day operation — start, stop, deploy, exec, pull. Not the settings that decide who may do those things.
    viewerRead what is there. No action that changes a container, a stack or a setting.

    Enforced on the server

    The role is checked in the route handler, not by hiding a button. A viewer who crafts the request by hand gets the same refusal as a viewer who cannot find the button.

    Sessions

    A session is a random opaque token looked up against a database row on every request — not a signed, JWT-style token verified locally. That costs a query per request, and buys the thing worth having in an admin tool: “log out”, and “an admin disables a compromised account”, take effect on the next request instead of waiting out a token's lifetime.

    The cookie lasts 30 days and slides, refreshed on every authenticated request, so somebody managing infrastructure is not re-prompted in the middle of an incident. Immediate revocation is what bounds the risk of that, rather than a short expiry.

    Passwords are hashed with Argon2. The session token is 32 random bytes, travels only in an HttpOnly cookie, and is never echoed back in a response body once issued.

    The cookie is not marked Secure, on purpose

    Setting it would silently break every plain-HTTP deployment — a LAN tool, or one behind a reverse proxy that terminates TLS in front of it, where the browser never sees https:// on this origin. HttpOnly still blocks JavaScript from reading it, which is the theft vector that matters. If you are crossing an untrusted network, put TLS in front of it: see Behind a reverse proxy.

    Air-gapped

    • Local accounts need nothing outside your network. SSO and LDAP need whatever you point them at, which inside an enclave is your own directory.