{"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-20T10:23:03.821Z","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":"79918c7830695bbca4a45c9fea4a42c3e9fd73d1","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.40"},"ArgsEscaped":true},"created":"2026-07-20T10:25:37.784177096Z","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-20T10:25:26.405787716Z","created_by":"LABEL org.opencontainers.image.title=9router","comment":"buildkit.dockerfile.v0","empty_layer":true},{"created":"2026-07-20T10:25:26.405787716Z","created_by":"ENV NODE_ENV=production","comment":"buildkit.dockerfile.v0","empty_layer":true},{"created":"2026-07-20T10:25:26.405787716Z","created_by":"ENV PORT=20128","comment":"buildkit.dockerfile.v0","empty_layer":true},{"created":"2026-07-20T10:25:26.405787716Z","created_by":"ENV HOSTNAME=0.0.0.0","comment":"buildkit.dockerfile.v0","empty_layer":true},{"created":"2026-07-20T10:25:26.405787716Z","created_by":"ENV NEXT_TELEMETRY_DISABLED=1","comment":"buildkit.dockerfile.v0","empty_layer":true},{"created":"2026-07-20T10:25:26.405787716Z","created_by":"ENV DATA_DIR=/app/data","comment":"buildkit.dockerfile.v0","empty_layer":true},{"created":"2026-07-20T10:25:26.405787716Z","created_by":"COPY /app/public ./public # buildkit","comment":"buildkit.dockerfile.v0"},{"created":"2026-07-20T10:25:26.767678799Z","created_by":"COPY /app/.next/static ./.next/static # buildkit","comment":"buildkit.dockerfile.v0"},{"created":"2026-07-20T10:25:27.46532407Z","created_by":"COPY /app/.next/standalone ./ # buildkit","comment":"buildkit.dockerfile.v0"},{"created":"2026-07-20T10:25:27.537379689Z","created_by":"COPY /app/custom-server.js ./custom-server.js # buildkit","comment":"buildkit.dockerfile.v0"},{"created":"2026-07-20T10:25:27.61375993Z","created_by":"COPY /app/open-sse ./open-sse # buildkit","comment":"buildkit.dockerfile.v0"},{"created":"2026-07-20T10:25:27.639348515Z","created_by":"COPY /app/src/mitm ./src/mitm # buildkit","comment":"buildkit.dockerfile.v0"},{"created":"2026-07-20T10:25:27.666198971Z","created_by":"COPY /app/node_modules/node-forge ./node_modules/node-forge # buildkit","comment":"buildkit.dockerfile.v0"},{"created":"2026-07-20T10:25:29.287060798Z","created_by":"COPY /app/node_modules/next ./node_modules/next # buildkit","comment":"buildkit.dockerfile.v0"},{"created":"2026-07-20T10:25:36.471651119Z","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-20T10:25:37.784177096Z","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-20T10:25:37.784177096Z","created_by":"EXPOSE map[20128/tcp:{}]","comment":"buildkit.dockerfile.v0","empty_layer":true},{"created":"2026-07-20T10:25:37.784177096Z","created_by":"ENTRYPOINT [\"/entrypoint.sh\"]","comment":"buildkit.dockerfile.v0","empty_layer":true},{"created":"2026-07-20T10:25:37.784177096Z","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:a6814b1cab11492f63074b5b6395e817a6762b636d544a8491aa4ce1f2a7af55","sha256:61a123f661871c912ab2611c0dc8b1137b3d939e32da4bfb50df605c9bc7a342","sha256:8e5985d4b58dbe5e91259da3cbb0deb8c5dac0fbae75f8b0cb106bbcfc02a246","sha256:d8f67b9be1ef6ecc61f0b9767624d89b10ce2d4631f73214c4b4580e3db5a1f6","sha256:ca0bf6538cfafa1ed81a4067d6ed29cc2c3f372a9d2efc183db76ad58f2c70ae","sha256:1d88d3f6172c435478a20aac2635e466d6377d66eab157e1ef998c7924c6729b","sha256:6c72d64e02fbe5a412331f01f73f8618fde7851363ccd33838f94db6e73f3810","sha256:fa16be63a1294129dc0f3a51cc454394efdfa68097b7ab0806d2f56c6458175a","sha256:8e88fec0f2c9fa1077d0f2f24bac769eb469224b4ccf80f2f63792f962dda811","sha256:20a51fab3fa41fedd13ce6d82ff8f6cea29e8a1b2ea7c85c37cdcc8bafea69ed"]}}