{"architecture":"amd64","config":{"ExposedPorts":{"20128/tcp":{}},"Env":["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin","NODE_VERSION=22.23.1","YARN_VERSION=1.22.22","NODE_ENV=production","PORT=20128","HOSTNAME=0.0.0.0","NEXT_TELEMETRY_DISABLED=1","DATA_DIR=/app/data"],"Entrypoint":["/entrypoint.sh"],"Cmd":["node","custom-server.js"],"WorkingDir":"/app","Labels":{"org.opencontainers.image.created":"2026-07-10T11:14:26.653Z","org.opencontainers.image.description":"Unlimited FREE AI coding. Connect Claude Code, Codex, Cursor, Cline, Copilot, Antigravity to FREE Claude/GPT/Gemini via 40+ providers. Auto-fallback, RTK -40% tokens, never hit limits.","org.opencontainers.image.licenses":"MIT","org.opencontainers.image.revision":"9845a1702f7766607bd7ac3315d1f87e59e45fb5","org.opencontainers.image.source":"https://github.com/decolua/9router","org.opencontainers.image.title":"9router","org.opencontainers.image.url":"https://github.com/decolua/9router","org.opencontainers.image.version":"0.5.30"},"ArgsEscaped":true},"created":"2026-07-10T11:16:56.93329121Z","history":[{"created":"2026-06-16T00:01:29.967161902Z","created_by":"ADD alpine-minirootfs-3.24.1-x86_64.tar.gz / # buildkit","comment":"buildkit.dockerfile.v0"},{"created":"2026-06-16T00:01:29.967161902Z","created_by":"CMD [\"/bin/sh\"]","comment":"buildkit.dockerfile.v0","empty_layer":true},{"created":"2026-06-23T19:01:41.851415711Z","created_by":"ENV NODE_VERSION=22.23.1","comment":"buildkit.dockerfile.v0","empty_layer":true},{"created":"2026-06-23T19:01:41.851415711Z","created_by":"RUN /bin/sh -c addgroup -g 1000 node \u0026\u0026 adduser -u 1000 -G node -s /bin/sh -D node \u0026\u0026 apk add --no-cache libstdc++ \u0026\u0026 apk add --no-cache --virtual .build-deps curl \u0026\u0026 ARCH= OPENSSL_ARCH='linux*' \u0026\u0026 alpineArch=\"$(apk --print-arch)\" \u0026\u0026 case \"${alpineArch##*-}\" in x86_64) ARCH='x64' CHECKSUM=\"25b5ec8550ca8bac9ade321f8b87e1c1aa6a64020ce34efef0217fe84106794c\" OPENSSL_ARCH=linux-x86_64;; x86) OPENSSL_ARCH=linux-elf;; aarch64) OPENSSL_ARCH=linux-aarch64;; arm*) OPENSSL_ARCH=linux-armv4;; ppc64le) OPENSSL_ARCH=linux-ppc64le;; s390x) OPENSSL_ARCH=linux-s390x;; *) ;; esac \u0026\u0026 if [ -n \"${CHECKSUM}\" ]; then set -eu; curl -fsSLO --compressed \"https://unofficial-builds.nodejs.org/download/release/v$NODE_VERSION/node-v$NODE_VERSION-linux-$ARCH-musl.tar.xz\"; echo \"$CHECKSUM node-v$NODE_VERSION-linux-$ARCH-musl.tar.xz\" | sha256sum -c - \u0026\u0026 tar -xJf \"node-v$NODE_VERSION-linux-$ARCH-musl.tar.xz\" -C /usr/local --strip-components=1 --no-same-owner \u0026\u0026 ln -s /usr/local/bin/node /usr/local/bin/nodejs; else echo \"Building from source\" \u0026\u0026 apk add --no-cache --virtual .build-deps-full binutils-gold g++ gcc gnupg libgcc linux-headers make python3 py-setuptools \u0026\u0026 export GNUPGHOME=\"$(mktemp -d)\" \u0026\u0026 for key in 5BE8A3F6C8A5C01D106C0AD820B1A390B168D356 DD792F5973C6DE52C432CBDAC77ABFA00DDBF2B7 CC68F5A3106FF448322E48ED27F5E38D5B0A215F 8FCCA13FEF1D0C2E91008E09770F7A9A5AE15600 890C08DB8579162FEE0DF9DB8BEAB4DFCF555EF4 C82FA3AE1CBEDC6BE46B9360C43CEC45C17AB93C 108F52B48DB57BB0CC439B2997B01419BD92F80A A363A499291CBBC940DD62E41F10027AF002F8B0 ; do { gpg --batch --keyserver hkps://keys.openpgp.org --recv-keys \"$key\" \u0026\u0026 gpg --batch --fingerprint \"$key\"; } || { gpg --batch --keyserver keyserver.ubuntu.com --recv-keys \"$key\" \u0026\u0026 gpg --batch --fingerprint \"$key\"; } ; done \u0026\u0026 curl -fsSLO --compressed \"https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION.tar.xz\" \u0026\u0026 curl -fsSLO --compressed \"https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.asc\" \u0026\u0026 gpg --batch --decrypt --output SHASUMS256.txt SHASUMS256.txt.asc \u0026\u0026 gpgconf --kill all \u0026\u0026 rm -rf \"$GNUPGHOME\" \u0026\u0026 grep \" node-v$NODE_VERSION.tar.xz\\$\" SHASUMS256.txt | sha256sum -c - \u0026\u0026 tar -xf \"node-v$NODE_VERSION.tar.xz\" \u0026\u0026 cd \"node-v$NODE_VERSION\" \u0026\u0026 ./configure \u0026\u0026 make -j$(getconf _NPROCESSORS_ONLN) V= \u0026\u0026 make install \u0026\u0026 apk del .build-deps-full \u0026\u0026 cd .. \u0026\u0026 rm -Rf \"node-v$NODE_VERSION\" \u0026\u0026 rm \"node-v$NODE_VERSION.tar.xz\" SHASUMS256.txt.asc SHASUMS256.txt; fi \u0026\u0026 rm -f \"node-v$NODE_VERSION-linux-$ARCH-musl.tar.xz\" \u0026\u0026 find /usr/local/include/node/openssl/archs -mindepth 1 -maxdepth 1 ! -name \"$OPENSSL_ARCH\" -exec rm -rf {} \\; \u0026\u0026 apk del .build-deps \u0026\u0026 node --version \u0026\u0026 npm --version \u0026\u0026 rm -rf /tmp/* # buildkit","comment":"buildkit.dockerfile.v0"},{"created":"2026-06-23T19:01:41.851415711Z","created_by":"ENV YARN_VERSION=1.22.22","comment":"buildkit.dockerfile.v0","empty_layer":true},{"created":"2026-06-23T19:01:45.657823596Z","created_by":"RUN /bin/sh -c apk add --no-cache --virtual .build-deps-yarn curl gnupg tar \u0026\u0026 export GNUPGHOME=\"$(mktemp -d)\" \u0026\u0026 for key in 6A010C5166006599AA17F08146C2130DFD2497F5 ; do { gpg --batch --keyserver hkps://keys.openpgp.org --recv-keys \"$key\" \u0026\u0026 gpg --batch --fingerprint \"$key\"; } || { gpg --batch --keyserver keyserver.ubuntu.com --recv-keys \"$key\" \u0026\u0026 gpg --batch --fingerprint \"$key\"; } ; done \u0026\u0026 curl -fsSLO --compressed \"https://yarnpkg.com/downloads/$YARN_VERSION/yarn-v$YARN_VERSION.tar.gz\" \u0026\u0026 curl -fsSLO --compressed \"https://yarnpkg.com/downloads/$YARN_VERSION/yarn-v$YARN_VERSION.tar.gz.asc\" \u0026\u0026 gpg --batch --verify yarn-v$YARN_VERSION.tar.gz.asc yarn-v$YARN_VERSION.tar.gz \u0026\u0026 gpgconf --kill all \u0026\u0026 rm -rf \"$GNUPGHOME\" \u0026\u0026 mkdir -p /opt \u0026\u0026 tar -xzf yarn-v$YARN_VERSION.tar.gz -C /opt/ \u0026\u0026 ln -s /opt/yarn-v$YARN_VERSION/bin/yarn /usr/local/bin/yarn \u0026\u0026 ln -s /opt/yarn-v$YARN_VERSION/bin/yarnpkg /usr/local/bin/yarnpkg \u0026\u0026 rm yarn-v$YARN_VERSION.tar.gz.asc yarn-v$YARN_VERSION.tar.gz \u0026\u0026 apk del .build-deps-yarn \u0026\u0026 yarn --version \u0026\u0026 rm -rf /tmp/* # buildkit","comment":"buildkit.dockerfile.v0"},{"created":"2026-06-23T19:01:45.688106838Z","created_by":"COPY docker-entrypoint.sh /usr/local/bin/ # buildkit","comment":"buildkit.dockerfile.v0"},{"created":"2026-06-23T19:01:45.688106838Z","created_by":"ENTRYPOINT [\"docker-entrypoint.sh\"]","comment":"buildkit.dockerfile.v0","empty_layer":true},{"created":"2026-06-23T19:01:45.688106838Z","created_by":"CMD [\"node\"]","comment":"buildkit.dockerfile.v0","empty_layer":true},{"created":"2026-06-26T11:06:35.886888612Z","created_by":"WORKDIR /app","comment":"buildkit.dockerfile.v0"},{"created":"2026-07-10T11:16:46.357492819Z","created_by":"LABEL org.opencontainers.image.title=9router","comment":"buildkit.dockerfile.v0","empty_layer":true},{"created":"2026-07-10T11:16:46.357492819Z","created_by":"ENV NODE_ENV=production","comment":"buildkit.dockerfile.v0","empty_layer":true},{"created":"2026-07-10T11:16:46.357492819Z","created_by":"ENV PORT=20128","comment":"buildkit.dockerfile.v0","empty_layer":true},{"created":"2026-07-10T11:16:46.357492819Z","created_by":"ENV HOSTNAME=0.0.0.0","comment":"buildkit.dockerfile.v0","empty_layer":true},{"created":"2026-07-10T11:16:46.357492819Z","created_by":"ENV NEXT_TELEMETRY_DISABLED=1","comment":"buildkit.dockerfile.v0","empty_layer":true},{"created":"2026-07-10T11:16:46.357492819Z","created_by":"ENV DATA_DIR=/app/data","comment":"buildkit.dockerfile.v0","empty_layer":true},{"created":"2026-07-10T11:16:46.357492819Z","created_by":"COPY /app/public ./public # buildkit","comment":"buildkit.dockerfile.v0"},{"created":"2026-07-10T11:16:46.459677251Z","created_by":"COPY /app/.next/static ./.next/static # buildkit","comment":"buildkit.dockerfile.v0"},{"created":"2026-07-10T11:16:47.421770272Z","created_by":"COPY /app/.next/standalone ./ # buildkit","comment":"buildkit.dockerfile.v0"},{"created":"2026-07-10T11:16:47.465615156Z","created_by":"COPY /app/custom-server.js ./custom-server.js # buildkit","comment":"buildkit.dockerfile.v0"},{"created":"2026-07-10T11:16:47.540260183Z","created_by":"COPY /app/open-sse ./open-sse # buildkit","comment":"buildkit.dockerfile.v0"},{"created":"2026-07-10T11:16:47.568410731Z","created_by":"COPY /app/src/mitm ./src/mitm # buildkit","comment":"buildkit.dockerfile.v0"},{"created":"2026-07-10T11:16:47.60487671Z","created_by":"COPY /app/node_modules/node-forge ./node_modules/node-forge # buildkit","comment":"buildkit.dockerfile.v0"},{"created":"2026-07-10T11:16:49.301883683Z","created_by":"COPY /app/node_modules/next ./node_modules/next # buildkit","comment":"buildkit.dockerfile.v0"},{"created":"2026-07-10T11:16:55.977815843Z","created_by":"RUN /bin/sh -c mkdir -p /app/data \u0026\u0026 chown -R node:node /app \u0026\u0026 mkdir -p /app/data-home \u0026\u0026 chown node:node /app/data-home \u0026\u0026 ln -sf /app/data-home /root/.9router 2\u003e/dev/null || true # buildkit","comment":"buildkit.dockerfile.v0"},{"created":"2026-07-10T11:16:56.93329121Z","created_by":"RUN /bin/sh -c apk --no-cache upgrade \u0026\u0026 apk --no-cache add su-exec \u0026\u0026 printf '#!/bin/sh\\nchown -R node:node /app/data /app/data-home 2\u003e/dev/null\\nexec su-exec node \"$@\"\\n' \u003e /entrypoint.sh \u0026\u0026 chmod +x /entrypoint.sh # buildkit","comment":"buildkit.dockerfile.v0"},{"created":"2026-07-10T11:16:56.93329121Z","created_by":"EXPOSE map[20128/tcp:{}]","comment":"buildkit.dockerfile.v0","empty_layer":true},{"created":"2026-07-10T11:16:56.93329121Z","created_by":"ENTRYPOINT [\"/entrypoint.sh\"]","comment":"buildkit.dockerfile.v0","empty_layer":true},{"created":"2026-07-10T11:16:56.93329121Z","created_by":"CMD [\"node\" \"custom-server.js\"]","comment":"buildkit.dockerfile.v0","empty_layer":true}],"os":"linux","rootfs":{"type":"layers","diff_ids":["sha256:34884abbe92863fce933ed7c39c0e045631af0ed86d5cc0dfbdf9fdca426ce3c","sha256:94ba1b56d694c6431a993fcd1fb36ec47c38a313e32a3e3ca9eda71bc287e873","sha256:fd246171abbe6b0395f94ceba5829950efb68e9c25c5402b26acd15f0038e44c","sha256:dd812e67e5869f0edb739e4274f58af29d8beeca2a08642563809d0622a11e86","sha256:40b6b923a8a7ae2ff1037d1844d0f7cf466f5ee162ac32cb9eec4c0e08cf2076","sha256:48a96455d9f1ea70dd1d35b5e92e75363824ec47347511fc3dc635d1ae9d717f","sha256:b63ae060e3fc52efc7423a60e7a80d6ed6a795e3dfc4031ea66137830014dcd9","sha256:f38ddbaa320d49f319dc92dc11e4c62ad5c42e797e186a5e1c395c808cd1df4c","sha256:fb783eeef727581954de1eee6568953e1d5aff7651bea45b8911d186ab8bf9d3","sha256:7b9184e44737df01a4ba882029c5258a61ec28823aeba1e079e8f8a91c6ace1a","sha256:7a38ff4fc5b0936e5e2a9da88cfc45fd7f72a514393676fbcd23352e7d92fb74","sha256:892b78b3c530956b3a1334898e8fd1d6a6aa6e23243a8ae84757ed22fa63ec21","sha256:677a3edfe1d1571413daf6e43e6a9d4218dca3d7ebb03436e84daa00c930525c","sha256:c5933a26ee6ca63cdf3af61656c65878bd70c1d6a8dd586a801efdfe988d22d5","sha256:3aa6044e07dc21e4cd8c246f3317d9f08d4190c2814a9ef9e73203086a2ebd26"]}}