Supporting Commy in your panel

If you run a panel (Remnawave, Marzban, 3x-ui, your own backend), your subscription already works in Commy. Here is exactly what it reads.

Subscription formats

A link list (plain or base64), Clash/Mihomo YAML, sing-box JSON, and a JSON array of Xray configs (what Remnawave serves Happ).

Response headers

Header What Commy does
subscription-userinfo Quota and expiry on the card (upload=…; download=…; total=…; expire=…)
profile-title The subscription’s name (base64:… allowed)
profile-update-interval Auto-refresh interval, in hours
profile-web-page-url A “Website” button on the card
support-url A “Support” button
announce An announcement under the quota, as is (base64:… allowed)
commy-manifest A signed address-recovery manifest — Commy Cloud

Request headers

Commy identifies as Commy/<version> (users can change the User-Agent in the subscription menu) and, unless switched off, sends x-hwid, x-device-os, x-ver-os and x-device-model to the subscription host only — like Happ and INCY. They are not sent on to another host after a redirect.

An “Add to Commy” button

commy://import/https://sub.example.com/sub/<token>

Commy also opens other clients’ links — so the buttons of your subscription page already work:

happ://add/<url>            incy://import/<url>        v2raytun://import/<url>
hiddify://import/<url>      streisand://import/<url>   sub://<base64(url)>
v2rayng://install-config?url=<url>    clash://install-config?url=<url>
clashmeta://install-config?url=<url>  stash://install-config?url=<url>
sing-box://import-remote-profile?url=<url>   sn://subscription?url=<url>

A name in such a link (name=, the #fragment) is a hint: if the panel sends profile-title, that wins.

Panel placeholders

When a panel answers with one entry at 0.0.0.0 and the reason in its name (“App not supported”, “Device limit reached”), Commy shows the text on the card and never treats it as a server.