Skip to content

How CashPilot compares

This page compares CashPilot with the other open projects that run several passive income apps in Docker. We checked every project on 2026-11-04. Each cell about another project links to the file it comes from, at a fixed commit, so you can check it yourself. If a cell is wrong or out of date, please open an issue.

Projects compared

Project What we checked Stars on 2026-11-04 License
money4band Release 5.0.0, tag commit af9d903 (2026-07-25) 471 GPL-3.0
income-generator (IGM) main at 65e900d (2026-10-20), plus the README's claims about its 3.0.0-beta.9 binary 238 Proprietary, own license v1.4
InternetIncome main at db9338a (2026-11-03) 257 No LICENSE file. The README allows copying the original and forbids distributing modified copies
CashFactory main at 0ff4bd0 (2025-04-08) 410 The LICENSE file is GPL-3.0, but the README forbids distributing modified copies
home-assistant-passive-income (HA add-ons) Release 2.0.6, bf4b9f4 (2026-11-03) 105 Unlicense
CashPilot Release v1.64.0, main at c7a12bd (2026-11-04) 77 GPL-3.0

money4band has two code lines. Its default branch main (3bfafb1) still holds the 4.x code, and its last code change there was on 2026-03-03. Release 5.0.0 is built from a separate history. We compare 5.0.0 because that is what its latest release ships.

IGM's web UI, fleet management and installer binary are closed source and not in its repository. Where a cell depends on them, it says "README claims" and links the README line. Everything else in IGM's column comes from the shell scripts and compose files in the repo.

Left out: earning-machine and passiveMachine have had no commits since 2024. A GitHub search found nothing else maintained that runs more than one app, only single-app images.

Short version

  • InternetIncome, money4band, IGM and, since v1.69.0, CashPilot can earn on many IPs through proxies. The first three run each app once per proxy, and proxies are InternetIncome's main feature. CashPilot runs extra copies of a service already deployed on a worker, each through a SOCKS5, HTTP CONNECT or Tailscale exit-node proxy (proxied copies).
  • InternetIncome (23) and IGM (20) start more apps than CashPilot's worker (17). CashPilot tracks more services in total (42) because it also follows browser extension, desktop and GPU services that it does not run. Since v1.64.0 it can also run any image you name as a custom service.
  • money4band and IGM claim daily rewards for you, and keep app images updated with Watchtower. CashPilot does neither. It pulls an image again only when you deploy or redeploy.
  • CashPilot is the only one here that reads balances from your provider accounts and keeps a history. money4band 5.0.0 shows estimates from its own catalog, not your accounts. The others link to each provider's dashboard.
  • CashPilot is the only open-source one here with one UI for many servers. IGM's README claims fleet management, but that code is in its closed binary.
  • Since v1.70.0, CashPilot is the only one here that keeps earner containers off your LAN by default, with limits. It is on for new installs and for upgraded installs with no earner on Docker's default bridge. An upgraded install whose earners already sit on that bridge keeps them there until you turn isolation on, a network you name in CASHPILOT_CONTAINER_NETWORK gets no fence from CashPilot, and host-networked Mysterium is never fenced (isolation).

Side by side

CashPilot's column describes v1.64.0, except the proxy, Docker socket and LAN isolation rows, which describe v1.71.1 (0170dee, 2026-11-06), and Mysterium's network in the container settings row, which describes the release after 2.0.6 (01e7310). The other columns describe the commits in the table above.

CashPilot money4band 5.0.0 IGM InternetIncome CashFactory HA add-ons
Apps it can start (see how we counted) 17 run by the worker, plus custom images; 42 tracked in total 15 (catalog). The README says 35, which includes community and dropped apps 20 (apps.json) 23 (script) 11 (compose file) 10 (add-on folders)
How you install it Docker Compose: one UI plus a worker on each server; the worker starts earners through the Docker API (fleet) Python CLI or a prebuilt binary that writes a compose file (release) curl \| sh installer (README) that downloads a closed binary, checked only against a SHA256SUMS file from the same release (installer) One bash script of 1,608 lines that calls sudo docker run (script) A static compose file plus setup.sh run with sudo (setup) A Home Assistant add-on repository; needs Home Assistant OS or Supervised
Many servers, one view Yes (fleet) No, one stack per device README claims yes, in the closed binary (README) No No No
Many proxies or IPs Yes, since v1.69.0: extra copies of a deployed service, each through a SOCKS5, HTTP CONNECT or Tailscale exit-node proxy. SOCKS5 and HTTP CONNECT carry TCP only (the tunnel lets out only TCP to the proxy's port, so SOCKS5 UDP relays are dropped); a Tailscale exit node carries UDP too. The earner shares a tunnel container's network namespace whose firewall lets out only loopback, the tunnel and the tunnel's own connection to the proxy (TCP to its address and port, or tailscaled's marked packets), so a dead proxy stops it instead of leaking (proxied copies, code, tunnel firewall). Services that need host networking, published ports, volumes, devices or NET_ADMIN, NET_RAW or SYS_ADMIN cannot run through a proxy (proxied copies) Yes (README, code) Yes (README, compose) Yes, its main feature (README) No No
Earnings 15 collectors read balances from provider accounts and keep a history. Some need a cookie or token copied from your browser, and some of those expire (see each service's guide) Estimates from catalog ranges, not account data (code) None found in the scripts None None None
Payouts Proposes a payout when a balance drops, and records it once you confirm (schema) None None None None None
Daily reward claiming No Yes, sidecars (README) Yes (README, compose) No No No
Credentials at rest Encrypted (Fernet) in the UI's database; the key file sits in the same data volume (code). Earner credentials reach each worker as container environment variables, so they are plain text in that worker's Docker config (docker inspect) Encrypted (Fernet); the key file sits in the data directory (code) Encrypted (AES-256 with openssl); the key file sits beside the vault (code) Plain text in properties.conf; some passwords are passed as docker run arguments (script) Plain text in .env (file) Add-on options, stored by the Supervisor in /data/options.json (HA docs)
Earner container settings Every capability dropped, then the catalog adds back what a service needs; no-new-privileges; a pids limit; privileged refused (code, code). Mysterium runs in its own network namespace on the fenced bridge with NET_ADMIN, SETUID and SETGID, on an image pinned by digest (catalog) no-new-privileges on every non-privileged service (code); the proxy container is privileged with NET_ADMIN (template) Nothing set on app services; Mysterium gets NET_ADMIN (compose); the proxy container gets NET_ADMIN, with no-new-privileges and a pids limit (compose) Ebesucher runs with seccomp=unconfined (script); proxy containers and Mysterium get NET_ADMIN Nothing set No add-on asks for privileged, host network or Docker API access (example config)
Docker socket mounted into Since v1.71.0, a socket proxy (sockguard 2.4.5, pinned by digest), read-only. The worker gets a filtered copy that refuses privileged containers, binds of / or of the socket, and capabilities or devices outside the catalog's (compose, details); never an earner (code) Watchtower (template) Watchtower, which is read-only with no-new-privileges (compose) Five restart helper containers (script) and Watchtower (script) Portainer, published on ports 8000, 9000 and 9443 on all interfaces (compose), and two Watchtowers (compose, compose) None
Image tags 4 of the 17 earner images are pinned to a version or digest; the rest float All 15 app images use :latest (example); proxy container pinned to v2.6.0, Watchtower to :1 No tag, so Docker uses latest (compose); a tag is set only for some ARM builds Mostly :latest (example); EarnApp :lite, Honeygain pinned to 0.6.6 when proxied on amd64 (script), Traffmonetizer per-arch tags on ARM; Watchtower :nightly :latest or no tag, except EarnApp :lite (compose) One version per add-on, bumped by a daily CI job (workflow, example)
App image updates Pulled again on each deploy or redeploy; no automatic updater Watchtower (template) Watchtower every 4 hours (compose) Watchtower once a day, if you turn it on (script) Two Watchtowers, each limited to one app, PacketStream (compose) and EarnFM (compose); the other 9 apps are not updated Home Assistant's add-on updates
LAN isolation On by default since v1.70.0 for new installs and for upgraded installs with no earner on Docker's default bridge: the worker puts earners on its own bridge and writes a firewall table that drops private ranges, the tailnet range, cloud metadata, the host's connected subnets, the host itself and, with public IP detection on, the home's public IP (isolation, code). An upgraded install whose earners already sit on the default bridge stays there until you press Turn on isolation; CASHPILOT_ISOLATION=off turns it off; with CASHPILOT_CONTAINER_NETWORK set, CashPilot writes no fence for that network and the firewall rules are yours (isolation, code). Host-networked Mysterium is not covered. A check shows what earners can reach (check) Own bridge subnet (config), which does not block the LAN None merged None found None found None found
ARM arm64 UI and worker; checks each service's platforms before a deploy (ARM) arm64 and armv7 binaries (release) README claims amd64 and arm64, arm32 with limits, and sets up QEMU (README) Needs binfmt emulation for amd64-only images (README) README says it does not work on a Raspberry Pi (README) Per add-on; ProxyRack is amd64 only (config)
UI Web UI, plus Desktop, Android, MCP and Home Assistant clients CLI, menus and a local web dashboard bound to 127.0.0.1 by default (code) CLI, menus, and per the README a web UI on port 4747 reachable on the LAN (README) None, a script A bookmarks page on port 80 plus Portainer (README) The Home Assistant add-on panel
Commits on the default branch, 2026-08-06 to 2026-11-04 286 6, all docs (5.0.0 is on a separate history) 6 31 0 23
Latest release v1.64.0, 2026-11-04 5.0.0, 2026-07-25 3.0.0-beta.9, 2026-09-23 No versioned releases v1.10, 2024-07-17 2.0.6, 2026-11-03
Outbound calls besides the apps GitHub releases once a day (CASHPILOT_UPDATE_CHECK=off stops it, code); api.ipify.org, ifconfig.me or icanhazip.com once an hour from each worker, for its public IP (CASHPILOT_EGRESS_DETECT=off stops it, code); CoinGecko and Frankfurter for exchange rates (code); public Ethereum, Polygon and Solana RPC nodes for on-chain balances (code); each provider, for collectors. The browser loads Google Fonts (template) and Chart.js from jsDelivr (template) GitHub releases, for its update check (code); Docker Hub and ghcr.io, to check image tags (code); when you run the IP check, api.ipify.org, ifconfig.me or icanhazip.com for your public IP and ip-api.com over plain HTTP for IP scores (code) GitHub releases (code); api.ipify.org, ifconfig.me or icanhazip.com for your public IP (code); ip-api.com over plain HTTP for IP scores (code). The closed binary was not checked None found None found None found

None of the projects sends usage telemetry in the code we read. IGM's closed binary could not be read.

Every project here passes app credentials to containers as environment variables, and InternetIncome passes some as command arguments too, so on the host that runs the apps they are plain text in Docker's container config (Env and Args in docker inspect), readable by anyone with Docker access. The "Credentials at rest" row describes the stored copy only.

How we counted

  • CashPilot. Services in the catalog with status active or beta and a Docker image, not counting GPU compute. The number on this page comes from scripts/generate_readme_tables.py, and CI fails if it drifts.
  • money4band 5.0.0. One JSON file per app in config/catalog/supported/: 15. The README's "35 apps" also counts the community catalog, which is off by default (config), apps with no Docker image, and dropped apps.
  • IGM. Entries in apps.json: 20, all enabled. The proxy container, Watchtower and the claim sidecars are not counted.
  • InternetIncome. Each # Starting ... container comment block in internetIncome.sh, other than the proxy and Watchtower blocks: 24. Ebesucher's Chrome and Firefox blocks are one app, and so are EarnFM and EarnFM Fleetshare, which use the same EarnFM account. The Depin extensions block starts Grass and Gradient (script), two apps. Total 23. The README table lists 27 apps, some with a signup link only.
  • CashFactory. Earning services in docker-compose.yml: 11. Portainer, the web server and the two Watchtowers are not counted. One service is commented out.
  • HA add-ons. Add-on folders with a config file: 10.

We did not check whether each app on each list still pays out.

Where CashPilot is behind

  • Services that need host networking, published ports, volumes, devices or extra network capabilities cannot run through a proxy, so 8 of the 17 (EarnApp, URnetwork, ProxyBase Markets, Bitping, Mysterium, Storj, Sia and Anyone Protocol) earn only from the server's own IP (proxied copies).
  • Fewer apps that it starts itself than IGM or InternetIncome.
  • No daily reward claiming and no automatic image updates.
  • 13 of the 17 earner images float on their publisher's latest tag.
  • The socket proxy is not yet a root boundary: a compromised worker can still create containers within its policy, and two-step escapes (joining another container's process namespace, a symlink in an allowed folder) are not refused (details).
  • The encryption key for stored credentials sits in the same volume as the data, and on each worker the earner credentials are plain text in Docker's container config.
  • Some collectors need a cookie or token copied from the browser, and some of those expire, so earnings tracking needs upkeep for those services.
  • The UI loads fonts and Chart.js from third-party CDNs.
  • LAN isolation stays off on an upgraded install whose earners sit on Docker's default bridge until you turn it on, it gives no fence to a network named in CASHPILOT_CONTAINER_NETWORK, and it never covers host-networked Mysterium (isolation).
  • A much smaller community than money4band's.
  • It releases often, sometimes several times a day.