cmliu/CF-Workers-docker.io
这个项目是一个基于 Cloudflare Workers 的 Docker 镜像代理工具。它能够中转对 Docker 官方镜像仓库的请求,解决一些访问限制和加速访问的问题。
Slowing — last commit 11mo ago
weakest axisno license — legally unclear; no tests detected
no license — can't legally use code; no tests detected
Documented and popular — useful reference codebase to read through.
no license — can't legally use code; last commit was 11mo ago
- ✓Last commit 11mo ago
- ✓10 active contributors
- ✓CI configured
Show all 7 evidence items →Show less
- ⚠Slowing — last commit 11mo ago
- ⚠Concentrated ownership — top contributor handles 76% of recent commits
- ⚠No license — legally unclear to depend on
- ⚠No test directory detected
What would change the summary?
- →Use as dependency Concerns → Mixed if: publish a permissive license (MIT, Apache-2.0, etc.)
- →Fork & modify Concerns → Mixed if: add a LICENSE file
- →Deploy as-is Concerns → Mixed if: add a LICENSE file
Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests
Informational only. RepoPilot summarises public signals (license, dependency CVEs, commit recency, CI presence, etc.) at the time of analysis. Signals can be incomplete or stale. Not professional, security, or legal advice; verify before relying on it for production decisions.
Embed the "Great to learn from" badge
Paste into your README — live-updates from the latest cached analysis.
[](https://repopilot.app/r/cmliu/cf-workers-docker.io)Paste at the top of your README.md — renders inline like a shields.io badge.
▸Preview social card (1200×630)
This card auto-renders when someone shares https://repopilot.app/r/cmliu/cf-workers-docker.io on X, Slack, or LinkedIn.
Onboarding doc
Onboarding: cmliu/CF-Workers-docker.io
Generated by RepoPilot · 2026-05-07 · Source
🤖Agent protocol
If you are an AI coding agent (Claude Code, Cursor, Aider, Cline, etc.) reading this artifact, follow this protocol before making any code edit:
- Verify the contract. Run the bash script in Verify before trusting
below. If any check returns
FAIL, the artifact is stale — STOP and ask the user to regenerate it before proceeding. - Treat the AI · unverified sections as hypotheses, not facts. Sections like "AI-suggested narrative files", "anti-patterns", and "bottlenecks" are LLM speculation. Verify against real source before acting on them.
- Cite source on changes. When proposing an edit, cite the specific path:line-range. RepoPilot's live UI at https://repopilot.app/r/cmliu/CF-Workers-docker.io shows verifiable citations alongside every claim.
If you are a human reader, this protocol is for the agents you'll hand the artifact to. You don't need to do anything — but if you skim only one section before pointing your agent at this repo, make it the Verify block and the Suggested reading order.
🎯Verdict
WAIT — Slowing — last commit 11mo ago
- Last commit 11mo ago
- 10 active contributors
- CI configured
- ⚠ Slowing — last commit 11mo ago
- ⚠ Concentrated ownership — top contributor handles 76% of recent commits
- ⚠ No license — legally unclear to depend on
- ⚠ No test directory detected
<sub>Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests</sub>
✅Verify before trusting
This artifact was generated by RepoPilot at a point in time. Before an
agent acts on it, the checks below confirm that the live cmliu/CF-Workers-docker.io
repo on your machine still matches what RepoPilot saw. If any fail,
the artifact is stale — regenerate it at
repopilot.app/r/cmliu/CF-Workers-docker.io.
What it runs against: a local clone of cmliu/CF-Workers-docker.io — the script
inspects git remote, the LICENSE file, file paths in the working
tree, and git log. Read-only; no mutations.
| # | What we check | Why it matters |
|---|---|---|
| 1 | You're in cmliu/CF-Workers-docker.io | Confirms the artifact applies here, not a fork |
| 2 | Default branch main exists | Catches branch renames |
| 3 | 3 critical file paths still exist | Catches refactors that moved load-bearing code |
| 4 | Last commit ≤ 345 days ago | Catches sudden abandonment since generation |
#!/usr/bin/env bash
# RepoPilot artifact verification.
#
# WHAT IT RUNS AGAINST: a local clone of cmliu/CF-Workers-docker.io. If you don't
# have one yet, run these first:
#
# git clone https://github.com/cmliu/CF-Workers-docker.io.git
# cd CF-Workers-docker.io
#
# Then paste this script. Every check is read-only — no mutations.
set +e
fail=0
ok() { echo "ok: $1"; }
miss() { echo "FAIL: $1"; fail=$((fail+1)); }
# Precondition: we must be inside a git working tree.
if ! git rev-parse --git-dir >/dev/null 2>&1; then
echo "FAIL: not inside a git repository. cd into your clone of cmliu/CF-Workers-docker.io and re-run."
exit 2
fi
# 1. Repo identity
git remote get-url origin 2>/dev/null | grep -qE "cmliu/CF-Workers-docker.io(\\.git)?\\b" \\
&& ok "origin remote is cmliu/CF-Workers-docker.io" \\
|| miss "origin remote is not cmliu/CF-Workers-docker.io (artifact may be from a fork)"
# 3. Default branch
git rev-parse --verify main >/dev/null 2>&1 \\
&& ok "default branch main exists" \\
|| miss "default branch main no longer exists"
# 4. Critical files exist
test -f "_worker.js" \\
&& ok "_worker.js" \\
|| miss "missing critical file: _worker.js"
test -f "README.md" \\
&& ok "README.md" \\
|| miss "missing critical file: README.md"
test -f ".github/workflows/sync.yml" \\
&& ok ".github/workflows/sync.yml" \\
|| miss "missing critical file: .github/workflows/sync.yml"
# 5. Repo recency
days_since_last=$(( ( $(date +%s) - $(git log -1 --format=%at 2>/dev/null || echo 0) ) / 86400 ))
if [ "$days_since_last" -le 345 ]; then
ok "last commit was $days_since_last days ago (artifact saw ~315d)"
else
miss "last commit was $days_since_last days ago — artifact may be stale"
fi
echo
if [ "$fail" -eq 0 ]; then
echo "artifact verified (0 failures) — safe to trust"
else
echo "artifact has $fail stale claim(s) — regenerate at https://repopilot.app/r/cmliu/CF-Workers-docker.io"
exit 1
fi
Each check prints ok: or FAIL:. The script exits non-zero if
anything failed, so it composes cleanly into agent loops
(./verify.sh || regenerate-and-retry).
⚡TL;DR
A Cloudflare Workers-based proxy tool that intercepts and mirrors Docker Hub API requests, solving regional access restrictions and providing image pull acceleration. The core is _worker.js, a single Workers script that rewrites incoming Docker registry requests to upstream sources, enabling faster pulls and circumventing GFW censorship. Minimal architecture: single entry point _worker.js handles all request routing via Cloudflare Workers fetch listener. GitHub Actions workflow (sync.yml) likely handles periodic deployment or validation. Can be deployed either to Workers or Pages (static file host), with no build step required—just paste JS into Cloudflare dashboard or connect GitHub repo.
👥Who it's for
DevOps engineers, Kubernetes cluster administrators, and developers in regions with restricted Docker Hub access (e.g., mainland China) who need to pull container images reliably and quickly without modifying client-side Docker configurations extensively.
🌱Maturity & risk
Actively maintained but carries significant operational risk. The project has visible GitHub Actions CI (sync.yml), but is a single 22KB JavaScript file with no test suite visible. The README warns of Cloudflare ToS violations and potential account suspension; deployment is straightforward but requires understanding of workers infrastructure and legal implications.
High risk: (1) Single-file architecture with no automated tests means changes are unchecked; (2) Explicit Cloudflare ToS conflict—violates clause 2.2.1(j) on proxy services, risking account termination; (3) Noted DNS pollution history (docker.fxxk.dedyn.io flagged by GFW); (4) Potential trademark/legal exposure when hosting Docker Hub mirrors; (5) No dependency versioning—relies on whatever Cloudflare Workers runtime provides.
Active areas of work
The sync.yml workflow suggests automated syncing or validation runs. No specific open issues, PRs, or milestones visible in the file list, indicating either a stable/dormant phase or active use without public development backlog. README mentions it as a working solution with deployment instructions but no active feature roadmap.
🚀Get running
Clone and deploy (no local dev environment needed): git clone https://github.com/cmliu/CF-Workers-docker.io.git, then copy contents of _worker.js into Cloudflare Workers dashboard → Save and Deploy. Alternatively, fork the repo and connect to Cloudflare Pages for auto-deployment on push.
Daily commands:
No local run step—this is deployed-only code. To test locally: use wrangler dev (Cloudflare's CLI) if you have wrangler installed (npm install -g wrangler), then wrangler dev in the repo root. Otherwise, deploy to Cloudflare Workers directly via dashboard: paste _worker.js content, click 'Save and Deploy'.
🗺️Map of the codebase
_worker.js— Core entry point implementing the Docker registry proxy logic on Cloudflare Workers; handles all request routing and upstream server selectionREADME.md— Deployment instructions and usage guide; essential for understanding supported deployment modes (Workers vs Pages) and configuration patterns.github/workflows/sync.yml— CI/CD workflow for automated deployment; critical for understanding how code changes propagate to production
🧩Components & responsibilities
- Cloudflare Worker (_worker.js) (JavaScript, Cloudflare Fetch API, URL parsing) — Intercepts incoming Docker registry requests, maps hostnames to upstream servers, transforms headers, and forwards requests while streaming responses back to clients
- Failure mode: If upstream is unreachable or returns errors, the error is transparently proxied back to the client; if hostname is not recognized, returns 404
- GitHub Actions CI/CD Pipeline (GitHub Actions YAML, Cloudflare Wrangler CLI or API) — Monitors main branch for changes to _worker.js; automatically deploys new code to Cloudflare Workers account
- Failure mode: If deployment credentials are invalid or Cloudflare API is down, deployment fails and alerts developer; previous Worker code remains active
- Upstream Docker Registries (Docker Registry HTTP API, OCI Image Spec) — Public Docker registries (Docker Hub, custom mirrors) that serve the actual container images; proxy forwards requests to these servers
- Failure mode: Rate limiting, network errors, or service outages at upstream cause corresponding failures for downstream clients
🔀Data flow
Docker Client→Cloudflare Worker— Client sends docker pull requests to the Worker's domain (e.g., docker.example.com); includes image name, tag, and layer digest queriesCloudflare Worker→Upstream Docker Registry— Worker translates the client's request path and hostname into an upstream registry URL; forwards with modified headers (Host, User-Agent, etc.)Upstream Docker Registry→Cloudflare Worker— Registry responds with manifest, layer blobs, or authentication challenges; Worker streams response back to clientCloudflare Worker→Docker Client— Worker proxies registry response (headers, status codes, body) transparently to client; client receives image data as if directly from registry
🛠️How to make changes
Add Support for a New Docker Registry Mirror
- Open _worker.js and locate the upstream server mapping section (typically an object/switch statement handling different hosts) (
_worker.js) - Add a new case for your mirror hostname that returns the corresponding upstream Docker registry URL (
_worker.js) - Commit and push to main branch to trigger the GitHub Actions deployment workflow (
.github/workflows/sync.yml)
Modify Request/Response Headers for Registry Compatibility
- Locate the request transformation logic in _worker.js (likely in the fetch handler before forwarding to upstream) (
_worker.js) - Add custom headers or modify existing ones to match upstream registry requirements (e.g., User-Agent, Authorization headers) (
_worker.js) - Test locally by simulating Docker pull requests, then commit to trigger deployment (
_worker.js)
Deploy to a New Cloudflare Account or Domain
- Fork the repository or clone it to your own GitHub account (
README.md) - For Workers deployment: copy the _worker.js code into your Cloudflare Workers editor and save/deploy manually (
_worker.js) - For Pages deployment: connect your forked repo to Cloudflare Pages in the dashboard for automatic CI/CD (
.github/workflows/sync.yml)
🔧Why these technologies
- Cloudflare Workers — Serverless edge runtime that intercepts requests globally with minimal latency; ideal for transparent HTTP proxying at Cloudflare's network edge
- GitHub Actions — Automates deployment of Worker code to Cloudflare on every push to main; enables continuous delivery without manual steps
- Cloudflare Pages — Alternative deployment method offering simplified UI-based workflows for non-technical users; integrates native GitHub sync
⚖️Trade-offs already made
-
Single _worker.js file with all logic inline
- Why: Keeps deployment simple and self-contained; reduces configuration complexity for users
- Consequence: Less modular; scaling to many upstream servers or complex routing logic becomes harder to maintain
-
Manual upstream server configuration via code changes
- Why: No database or external config service required; fully portable and deployable instantly
- Consequence: Every new mirror or upstream requires a code commit and redeploy; no runtime configuration flexibility
-
No authentication or rate-limiting enforcement in the proxy itself
- Why: Keeps proxy lightweight; delegates auth to upstream Docker registry
- Consequence: Proxy can be abused for high-volume pulls; vulnerable to Cloudflare ToS violations if used for heavy proxying
🚫Non-goals (don't propose these)
- Does not cache Docker layers locally; only proxies requests in real-time
- Does not implement Docker registry authentication or token management
- Does not support private Docker registries (only public mirrors)
- Does not provide observability/logging infrastructure; relies on Cloudflare's native logs
- Not designed for persistent storage or state management
📊Code metrics
- Avg cyclomatic complexity: ~5 — Single-file architecture with straightforward request forwarding logic; minimal branching; no complex data structures or algorithms
- Largest file:
_worker.js(300 lines) - Estimated quality issues: ~3 — No request validation, hardcoded config, lack of error handling and retry logic; relies entirely on Cloudflare's infrastructure stability
⚠️Anti-patterns to avoid
- Hardcoded Upstream Mappings (Medium) —
_worker.js: Upstream server URLs are typically hardcoded in the Worker logic; changes require code edits and redeployment rather than runtime configuration - No Request Validation or Sanitization (Medium) —
_worker.js: The proxy forwards requests as-is to upstream without checking for malicious payloads or path traversal attempts; relies on upstream registry to validate - Transparent Error Propagation (Low) —
_worker.js: All upstream errors (429, 5xx) are returned directly to client without retry logic or fallback; poor resilience for rate-limited upstreams
🔥Performance hotspots
_worker.js(Concurrency) — All request routing logic is serial; no parallel fetches from multiple upstreams or intelligent failover if primary upstream is slow_worker.js (upstream mapping)(Scalability) — Hostname-to-upstream lookup is O(1) but changes require code redeploy; scales poorly as number of upstream mirrors increasesCloudflare Workers platform(Platform Limits) — Workers have a 30-second CPU timeout; very large image pulls or slow upstreams may timeout before transfer completes
🪤Traps & gotchas
(1) Cloudflare ToS violation: Code explicitly violates section 2.2.1(j); deployment risk is real and acknowledged. (2) No env vars or config file—all upstream registry URLs are hardcoded in _worker.js, requiring code edits to change behavior. (3) Workers runtime limits: script must stay under Cloudflare's CPU/memory bounds; large response streaming may fail. (4) DNS/domain risk: using your own domain exposes you to Netcraft scanning and potential Google Safe Browsing blacklisting (documented in README). (5) Docker API version: no version negotiation visible; assumes Docker Hub v2 API stability.
🏗️Architecture
💡Concepts to learn
- HTTP request proxying / man-in-the-middle rewriting — Core technique in
_worker.js—intercepts Docker client requests, rewrites Host headers and URLs, forwards to upstream, and rewrites responses. Essential to understand for modifying routing logic. - Docker Registry HTTP API V2 — The protocol being proxied—uses specific endpoints like
/v2/, authentication headers, and blob manifests. Must know to correctly intercept and forward requests without breaking image pulls. - Cloudflare Workers (edge computing / serverless) — Deployment target—runs code at edge locations globally, not on traditional servers. Constraints like CPU time limits and lack of persistent storage affect what
_worker.jscan do. - TLS certificate pinning / hostname verification bypass — Proxying upstream HTTPS requests requires careful certificate handling; Docker clients validate TLS, so the proxy must preserve certificate authenticity or clients reject responses.
- DNS-based upstream selection — Code likely uses hostname routing (e.g., docker.io vs. k8s.gcr.io from the same domain) to pick different upstreams; understanding DNS and Host header tricks clarifies request routing.
- Rate limiting / token bucket (implicit in mirror use case) — Docker Hub enforces rate limits; a working proxy must cache or batch requests intelligently or clients still hit quotas. Current code doesn't show caching—risk factor.
- GFW (Great Firewall) / regional network censorship evasion — Explicit use case in README—proxy hides Docker Hub traffic inside Cloudflare's trusted ASN, bypassing DPI (deep packet inspection). Understanding GFW mechanics explains why simple mirrors fail.
🔗Related repos
dnsmasq-china-list/dnsmasq-china-list— DNS-based solution to route Docker Hub traffic; complementary approach to HTTP-layer proxying in this repo.DaoCloud/public-image-mirror— Similar Docker image mirror service; different implementation (likely containerized), shows alternative architectural approach to same problem.cloudflare/workers-sdk— Official Cloudflare Workers development toolkit; essential for local testing and deployment of_worker.js.moby/moby— Docker daemon source; understanding its registry protocol (v2 API) is necessary to maintain compatibility with_worker.jsproxying logic.cmliu/CloudFlare-Workers-Vless— Same author's another Cloudflare Workers project; shows pattern of edge-computing solutions for restricted regions.
🪄PR ideas
To work on one of these in Claude Code or Cursor, paste:
Implement the "<title>" PR idea from CLAUDE.md, working through the checklist as the task list.
Add request/response logging and monitoring middleware to _worker.js
The _worker.js file currently lacks observability for debugging failed requests and monitoring proxy performance. Adding structured logging for cache hits/misses, upstream response times, and error rates would help maintainers diagnose issues with Docker image pulls and detect abuse patterns. This is critical for a proxy service that may receive complaints about broken pulls.
- [ ] Add logging function to _worker.js that captures: request method/path, response status code, cache status, and upstream response time
- [ ] Implement error logging for authentication failures and upstream connection errors
- [ ] Add Cloudflare Analytics Engine integration to track metrics like cache hit ratio and error rates over time
- [ ] Document the logging format and how to access logs in README.md under a new 'Monitoring' section
Create automated integration tests in .github/workflows to validate Docker registry endpoints
The repo has a sync.yml workflow but lacks tests to verify the proxy correctly handles Docker API requests (manifest fetches, blob downloads, authentication). Without these, contributions could accidentally break core functionality. Add tests for common Docker operations to catch regressions.
- [ ] Create .github/workflows/test.yml that runs on PRs and push to main
- [ ] Add tests for: pulling public image metadata, handling Docker authentication headers, verifying blob/manifest route responses
- [ ] Test edge cases like rate-limit headers, authentication failures, and upstream server timeouts
- [ ] Document test coverage expectations in CONTRIBUTING.md
Add configuration validation schema and environment variable support to _worker.js
Currently _worker.js appears to have hardcoded upstream addresses based on hostname. Contributors need clear documentation on which environment variables or configuration options are available (if any). Formalizing this with schema validation would prevent misconfiguration and make the code more maintainable.
- [ ] Document in README.md all configurable options: upstream URLs, cache TTL, allowed hosts, rate limits with example configurations
- [ ] Add a CONFIG section at the top of _worker.js with validation logic that checks required environment variables on startup
- [ ] Create a CONFIGURATION.md file with detailed explanation of each setting and how to customize upstream mirrors
- [ ] Add validation error messages that guide users toward correct setup (addressing the Netcraft/GFW warnings)
🌿Good first issues
- Add support for additional upstream registries (quay.io, ECR, ACR) by expanding the hostname→upstream mapping in
_worker.jsand documenting in README. - Create automated tests for request/response transformation logic (currently none visible)—mock Cloudflare Workers context and test that
/library/nginx:latestcorrectly routes to the chosen upstream. - Document the exact Cloudflare Workers KV setup (if using authentication caching) or clarify in README why KV is not needed; current docs assume working knowledge.
⭐Top contributors
Click to expand
Top contributors
- @cmliu — 48 commits
- @AinzRimuru — 5 commits
- @imdingtalk — 3 commits
- @Fengshi991 — 1 commits
- @SeeleVolleri — 1 commits
📝Recent commits
Click to expand
Recent commits
059ff30— Merge pull request #118 from Fengshi991/fix2 (cmliu)ed3959b— fix:群晖搜索和标签索引 (Fengshi991)b038e75— fix: 更新 bestcfipas 镜像服务链接并添加新镜像服务 (cmliu)630c359— Merge pull request #115 from SeeleVolleri/main (cmliu)b3af922— fix: 修正第三方 DockerHub 镜像服务列表链接格式 (cmliu)8eea838— fix: 更新 bestcfipas 镜像服务链接并添加新镜像服务 (cmliu)9a8bcc2— fix: 更新镜像服务列表,修正链接和添加新服务 (cmliu)910a198— Add warning (SeeleVolleri)a15daf2— docs: 更新鸣谢部分,添加赞助支持和开源代码引用 (cmliu)8e96d54— style: 更新搜索界面样式,优化响应速度和用户体验 (cmliu)
🔒Security observations
This project presents significant security and legal risks. It operates as an unauthorized proxy in violation of Cloudflare's Terms of Service and has been flagged by security services as phishing/malicious. The core architecture lacks essential security controls including input validation, rate limiting, security headers, and audit logging. Additionally, the service poses MITM risks for Docker image distribution. The project acknowledges these risks but provides no compensating controls. Deployment and use of this project are not recommended without substantial security hardening and legal review. Organizations should consider approved Docker registry mirrors or self-hosted solutions instead.
- High · Proxy Service Violates Cloudflare Terms of Service —
README.md. The project explicitly acknowledges in the README that it violates Cloudflare's Terms of Service (Section 2.2.1(j)) which prohibits using Services to provide proxy services. This creates legal and operational risk including account termination. Fix: Review Cloudflare's acceptable use policies. Consider alternative deployment methods that comply with ToS, or use self-hosted infrastructure instead. - High · Man-in-the-Middle (MITM) Risk in Proxy Implementation —
_worker.js. As a Docker image proxy/mirror, the service intercepts requests between clients and Docker Hub. Without proper HTTPS validation and certificate pinning, there is risk of image tampering or credential interception when pulling docker images. Fix: Implement strict HTTPS enforcement, validate upstream certificates, add security headers (Content-Security-Policy, X-Content-Type-Options), and log security events. - High · Domain Name Flagged as Phishing/Malicious —
README.md. README documents that the original domain (docker.fxxk.dedyn.io) was flagged by Netcraft and Google Safe Browsing as phishing. The project warns of potential future blocking and legal liability (lawyer letters mentioned). Fix: Use legitimate domain names, implement abuse prevention measures, monitor security reputation databases, and ensure transparent operation within legal frameworks. - Medium · Missing Input Validation on Request Forwarding —
_worker.js. Worker scripts that proxy requests to upstream services (Docker Hub) need robust input validation to prevent header injection, request smuggling, or cache poisoning attacks. Fix: Implement strict input validation for all HTTP headers and request parameters. Use allowlisting for permitted headers. Validate all URL components before forwarding to upstream. - Medium · Insufficient Security Headers Configuration —
_worker.js, deployment configuration. No evidence of security headers (HSTS, X-Frame-Options, X-Content-Type-Options, CSP) being configured in the worker configuration or deployment documentation. Fix: Add comprehensive security headers to all responses. Include: Strict-Transport-Security, X-Content-Type-Options: nosniff, X-Frame-Options: DENY, and appropriate Content-Security-Policy. - Medium · No Rate Limiting or DDoS Protection Documented —
Project documentation and _worker.js. Public proxy service with no documented rate limiting, DDoS protection, or abuse prevention mechanisms. Service could be exploited for large-scale attacks or resource exhaustion. Fix: Implement Cloudflare rate limiting rules, IP-based throttling, request size limits, and monitoring for suspicious patterns. Use Cloudflare's built-in DDoS protection. - Medium · Lack of Audit Logging and Monitoring —
_worker.js, deployment configuration. No documentation of audit logs for proxy requests, authentication attempts, or security events. This prevents detecting abuse, breach investigation, or compliance verification. Fix: Implement comprehensive logging of all requests including source IP, user-agent, request path, and response status. Send logs to secure centralized logging service. - Low · Missing Dependency Lock File —
Root directory. No package.json, package-lock.json, or dependency manifest provided. Cannot assess third-party dependency vulnerabilities. Cloudflare Workers may have dependencies not visible. Fix: Maintain explicit dependency manifests with version pinning and checksums. Perform regular dependency scanning using tools like npm audit or Snyk.
LLM-derived; treat as a starting point, not a security audit.
👉Where to read next
- Open issues — current backlog
- Recent PRs — what's actively shipping
- Source on GitHub
Generated by RepoPilot. Verdict based on maintenance signals — see the live page for receipts. Re-run on a new commit to refresh.