{"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-07T09:30:55.909Z","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":"b10b8070632cbdeb3c6b26b0ccf60f433ebf5014","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.20"},"ArgsEscaped":true},"created":"2026-07-07T09:33:26.003366428Z","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-07T09:33:16.061034124Z","created_by":"LABEL org.opencontainers.image.title=9router","comment":"buildkit.dockerfile.v0","empty_layer":true},{"created":"2026-07-07T09:33:16.061034124Z","created_by":"ENV NODE_ENV=production","comment":"buildkit.dockerfile.v0","empty_layer":true},{"created":"2026-07-07T09:33:16.061034124Z","created_by":"ENV PORT=20128","comment":"buildkit.dockerfile.v0","empty_layer":true},{"created":"2026-07-07T09:33:16.061034124Z","created_by":"ENV HOSTNAME=0.0.0.0","comment":"buildkit.dockerfile.v0","empty_layer":true},{"created":"2026-07-07T09:33:16.061034124Z","created_by":"ENV NEXT_TELEMETRY_DISABLED=1","comment":"buildkit.dockerfile.v0","empty_layer":true},{"created":"2026-07-07T09:33:16.061034124Z","created_by":"ENV DATA_DIR=/app/data","comment":"buildkit.dockerfile.v0","empty_layer":true},{"created":"2026-07-07T09:33:16.061034124Z","created_by":"COPY /app/public ./public # buildkit","comment":"buildkit.dockerfile.v0"},{"created":"2026-07-07T09:33:16.803587765Z","created_by":"COPY /app/.next/static ./.next/static # buildkit","comment":"buildkit.dockerfile.v0"},{"created":"2026-07-07T09:33:17.512285317Z","created_by":"COPY /app/.next/standalone ./ # buildkit","comment":"buildkit.dockerfile.v0"},{"created":"2026-07-07T09:33:17.55516045Z","created_by":"COPY /app/custom-server.js ./custom-server.js # buildkit","comment":"buildkit.dockerfile.v0"},{"created":"2026-07-07T09:33:17.608711168Z","created_by":"COPY /app/open-sse ./open-sse # buildkit","comment":"buildkit.dockerfile.v0"},{"created":"2026-07-07T09:33:17.623733742Z","created_by":"COPY /app/src/mitm ./src/mitm # buildkit","comment":"buildkit.dockerfile.v0"},{"created":"2026-07-07T09:33:17.64486289Z","created_by":"COPY /app/node_modules/node-forge ./node_modules/node-forge # buildkit","comment":"buildkit.dockerfile.v0"},{"created":"2026-07-07T09:33:19.191854881Z","created_by":"COPY /app/node_modules/next ./node_modules/next # buildkit","comment":"buildkit.dockerfile.v0"},{"created":"2026-07-07T09:33:24.811194171Z","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-07T09:33:26.003366428Z","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-07T09:33:26.003366428Z","created_by":"EXPOSE map[20128/tcp:{}]","comment":"buildkit.dockerfile.v0","empty_layer":true},{"created":"2026-07-07T09:33:26.003366428Z","created_by":"ENTRYPOINT [\"/entrypoint.sh\"]","comment":"buildkit.dockerfile.v0","empty_layer":true},{"created":"2026-07-07T09:33:26.003366428Z","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:e31a9895f395874c579e1aff7d8abdab0c0d67c4812957b20c92901b01fb8366","sha256:a5348ac18bf6cd678747b2336c058acddd220ddd2037a27699791300f1773137","sha256:00359609de60f426576045c214671e1226f9cb5b746533fb5489d09601d42601","sha256:8b5c82c50f55a27c58ebaceb6bace27da0fc00d09e6c5f9da6b47734a11e8c87","sha256:55b0d6b6523abd5165d246c46c6be556502ea50a24238f7006d53b960350a2d0","sha256:a762250f9ae45b47df666635ea2507f2a9f799770539208079915c6f5f235e99","sha256:fc8f7583b964de4ba277e92994c5f6bdb427956b6677dd2d39da9031be581789","sha256:1557d3bebab87791c64e9edcc292470bba20237abfa3c217ec1a3e865c388763","sha256:f15418b763640612509a3303ee7d0572b872bf77f62867870ddf5e04bae23022","sha256:6a56c814d8072bf98a8a89f47321bcfcd03166403b8475624f97c2d0c6b3f6d6"]}}