zhongyitang is a self-hosted OpenAI-compatible LLM gateway whose engine installer downloads llama.cpp releases from GitHub and a halogen rootfs from ghcr.io, pinned by an embedded SHA-256 but with no signature verification.
zhongyitang, published on PyPI by CodeOfMe since October 11, 2026 and still served as version 0.2.6 on November 6, 2026, is a self-hosted, OpenAI-compatible LLM gateway and console. It is not malicious: it is an ordinary local tool, and its one policy-relevant behaviour is that it downloads executables it does not bundle. When a user asks it to install an engine, it fetches llama.cpp release archives from github.com/ggml-org/llama.cpp/releases and a halogen rootfs image from ghcr.io; each download is pinned to an exact version with a SHA-256 embedded in the package and checked before unpacking, but no GPG, minisign, sigstore or Authenticode signature, and no signed checksum file, is verified.
What zhongyitang does
zhongyitang is a command-line tool and local web console for running a self-hosted, OpenAI-compatible LLM gateway. It starts an HTTP gateway on localhost that fronts local inference engines, issues its own API keys, and can publish the gateway through a Cloudflare tunnel. To describe an existing tunnel it reads the user's cloudflared configuration and parses its ingress rules locally; to bring up a tunnel it writes a new configuration (backing up any file it did not create) and launches cloudflared, which makes an outbound connection to Cloudflare. For engines it does not bundle, it downloads the engine executable: llama.cpp release archives from GitHub, and a halogen rootfs image from ghcr.io. It also checks the newest llama.cpp nightly tag by fetching the releases Atom feed.
What the code does
src/zhongyitang/engines/llamacpp.py:43-96 — a manifest mapping llama.cpp versions and backends to archive names and SHA-256 values, all embedded in the package.
src/zhongyitang/engines/llamacpp.py:98-102 — composes the canonical GitHub release download URL for an archive.
src/zhongyitang/engines/llamacpp.py:123-144 — latest_release() fetches the llama.cpp releases Atom feed to find the newest nightly tag.
src/zhongyitang/binary.py:145-223 — download() fetches the archive, checks the byte size and the embedded SHA-256, and refuses the file on a mismatch; it verifies no signature.
src/zhongyitang/binary.py:315-349 — install() downloads, verifies, unpacks and registers one version of a binary set.
src/zhongyitang/binary.py:376-467 — pull_oci() pulls the halogen image from ghcr.io and checks each blob's SHA-256 against the registry manifest, which is fetched over TLS and not signed.
src/zhongyitang/cli.py:382-424 — the zyt binary latest and zyt binary install commands that reach those download paths.
src/zhongyitang/tunnel.py:323-328, 244-270 — status() reads the cloudflared configuration and scan_ingress() parses its ingress block; the parsed result is only displayed locally and is never sent anywhere.
Timeline (UTC)
| When | What |
| October 11, 2026 | First zhongyitang version published to PyPI |
| November 6, 2026 | Version 0.2.6 published; still served and downloadable from PyPI |
If you installed it
zhongyitang does not fetch an engine executable on its own; the download happens only when you run a command such as zyt binary install llama.cpp or zyt binary image <halogen image>. If you want those engines, obtain the llama.cpp release or the halogen image directly from their publishers and verify the publisher's own signature or checksums yourself, since zhongyitang checks only the embedded SHA-256 and no signature. Alternatively, point zhongyitang at a binary you already installed and trust via engine.llamacpp_exe or PATH, and do not use its download commands.