{"id":13586977,"url":"https://github.com/westandskif/rate-mirrors","last_synced_at":"2026-01-18T00:31:54.750Z","repository":{"id":37587010,"uuid":"330377407","full_name":"westandskif/rate-mirrors","owner":"westandskif","description":"Everyday-use client-side map-aware mirror ranking tool (Arch Linux; Manjaro; custom ones)","archived":false,"fork":false,"pushed_at":"2024-03-06T20:26:50.000Z","size":725,"stargazers_count":348,"open_issues_count":2,"forks_count":17,"subscribers_count":7,"default_branch":"master","last_synced_at":"2024-03-06T21:40:37.503Z","etag":null,"topics":["arch-linux","archlinux","manjaro","mirrors","pacman","speedtest"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/westandskif.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"patreon":"westandskif","custom":["https://boosty.to/westandskif"]}},"created_at":"2021-01-17T11:41:31.000Z","updated_at":"2024-06-22T12:27:16.351Z","dependencies_parsed_at":"2023-11-09T15:26:38.335Z","dependency_job_id":"d107a955-b3f4-411e-a146-8ca9e637763e","html_url":"https://github.com/westandskif/rate-mirrors","commit_stats":null,"previous_names":[],"tags_count":35,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/westandskif%2Frate-mirrors","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/westandskif%2Frate-mirrors/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/westandskif%2Frate-mirrors/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/westandskif%2Frate-mirrors/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/westandskif","download_url":"https://codeload.github.com/westandskif/rate-mirrors/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":223290318,"owners_count":17120888,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["arch-linux","archlinux","manjaro","mirrors","pacman","speedtest"],"created_at":"2024-08-01T15:05:56.790Z","updated_at":"2026-01-18T00:31:54.701Z","avatar_url":"https://github.com/westandskif.png","language":"Rust","funding_links":["https://patreon.com/westandskif","https://boosty.to/westandskif"],"categories":["Rust"],"sub_categories":[],"readme":"# Rate Mirrors\n\n![Tag Badge](https://img.shields.io/github/tag/westandskif/rate-mirrors.svg)\n[![License: CC BY-NC-SA 3.0](https://img.shields.io/badge/License-CC%20BY--NC--SA%203.0-lightgrey.svg)](https://creativecommons.org/licenses/by-nc-sa/3.0/)\n\nA fast mirror ranking tool that finds the best mirrors for your Linux distribution. It uses submarine cable and internet exchange data to intelligently hop between countries and discover fast mirrors in ~30 seconds.\n\n## Table of Contents\n\n- [Quick Start](#quick-start)\n- [Installation](#installation)\n- [Supported Distributions](#supported-distributions)\n- [Usage](#usage)\n- [Common Options](#common-options)\n- [Algorithm](#algorithm)\n- [Examples](#examples)\n- [Troubleshooting](#troubleshooting)\n- [Exit Codes](#exit-codes)\n- [License](#license)\n\n## Quick Start\n\n```bash\n# Arch Linux\nrate-mirrors arch | sudo tee /etc/pacman.d/mirrorlist\n\n# Manjaro\nrate-mirrors manjaro | sudo tee /etc/pacman.d/mirrorlist\n\n# With backup\nexport TMPFILE=\"$(mktemp)\"; \\\n    rate-mirrors --save=$TMPFILE arch --max-delay=21600 \\\n    \u0026\u0026 sudo mv /etc/pacman.d/mirrorlist /etc/pacman.d/mirrorlist-backup \\\n    \u0026\u0026 sudo mv $TMPFILE /etc/pacman.d/mirrorlist\n\n# See all options\nrate-mirrors --help\n```\n\n## Installation\n\n| Platform | Command | Notes |\n|----------|---------|-------|\n| Arch Linux (binary) | `yay -S rate-mirrors-bin` | Pre-built, musl-linked |\n| Arch Linux (source) | `yay -S rate-mirrors` | Built from source, glibc |\n| OpenBSD | `pkg_add rate-mirrors` | From ports |\n| GitHub Releases | [Download](https://github.com/westandskif/rate-mirrors/releases) | Pre-built binaries |\n| From source | `cargo build --release --locked` | Requires Rust toolchain |\n\n## Supported Distributions\n\n### Arch-based\n\n| Command | Distribution | Notes |\n|---------|-------------|-------|\n| `rate-mirrors arch` | Arch Linux | Skips outdated/syncing mirrors |\n| `rate-mirrors archarm` | Arch Linux ARM | |\n| `rate-mirrors arcolinux` | ArcoLinux | |\n| `rate-mirrors artix` | Artix Linux | |\n| `rate-mirrors blackarch` | BlackArch Linux | |\n| `rate-mirrors cachyos` | CachyOS | |\n| `rate-mirrors chaotic-aur` | Chaotic-AUR | Arch Linux repository |\n| `rate-mirrors archlinuxcn` | Arch Linux CN | Chinese community repo |\n| `rate-mirrors endeavouros` | EndeavourOS | Skips outdated mirrors |\n| `rate-mirrors manjaro` | Manjaro | Skips outdated mirrors |\n| `rate-mirrors rebornos` | RebornOS | |\n\n### Other\n\n| Command | Distribution |\n|---------|-------------|\n| `rate-mirrors openbsd` | OpenBSD |\n| `rate-mirrors stdin` | Custom mirrors (see [Advanced Usage](#advanced-usage-stdin)) |\n\n## Usage\n\n```\nrate-mirrors [OPTIONS] \u003cSUBCOMMAND\u003e [SUBCOMMAND-OPTIONS]\n```\n\n- Run `rate-mirrors --help` to see base options\n- Run `rate-mirrors \u003csubcommand\u003e --help` to see subcommand-specific options\n- The tool doesn't need root; use `--allow-root` if you must run as root\n\n## Common Options\n\n| Option | Description | Default |\n|--------|-------------|---------|\n| `--save=FILE` | Save output to file instead of stdout | - |\n| `--concurrency=N` | Number of simultaneous speed tests | 16 |\n| `--max-jumps=N` | Maximum country hops | 7 |\n| `--entry-country=CC` | Starting country code | US |\n| `--exclude-countries=CC,CC` | Exclude countries (comma-separated codes) | - |\n| `--protocol=PROTO` | Test only specified protocol (http/https) | - |\n| `--max-mirrors-to-output=N` | Maximum mirrors to output | - |\n| `--disable-comments` | Disable printing comments | false |\n| `--allow-root` | Allow running as root | false |\n\n### Subcommand Options (arch example)\n\n| Option | Description | Default |\n|--------|-------------|---------|\n| `--completion=N` | Minimum sync completion (0.0-1.0) | 1.0 |\n| `--sort-mirrors-by=MODE` | Sort by: score_asc, score_desc, delay_asc, delay_desc | score_asc |\n\n## Algorithm\n\nThe tool uses:\n- Submarine cable connections data\n- Internet exchange locations and counts per country\n- Continental groupings for geographic proximity\n\n### How it works (arch example):\n\n1. Fetch mirrors from [Arch Linux Mirror Status](https://archlinux.org/mirrors/status/json/)\n2. Filter out incomplete or outdated mirrors\n3. Sort by mirror score\n4. Starting from entry country, find neighbor countries using:\n   - Major internet hubs (first two jumps)\n   - Geographic proximity (every jump)\n5. Test mirrors from each country, track fastest and lowest-latency\n6. Jump to countries of best mirrors, repeat\n7. After max jumps, re-test top mirrors sequentially and output final ranking\n\n**Data attribution:** Submarine cable and IX data from [TeleGeography](https://www2.telegeography.com).\n\n## Examples\n\n### Everyday use on Arch Linux\n\n```bash\nalias ua-drop-caches='sudo paccache -rk3; yay -Sc --aur --noconfirm'\nalias ua-update-all='export TMPFILE=\"$(mktemp)\"; \\\n    sudo true; \\\n    rate-mirrors --save=$TMPFILE arch --max-delay=21600 \\\n      \u0026\u0026 sudo mv /etc/pacman.d/mirrorlist /etc/pacman.d/mirrorlist-backup \\\n      \u0026\u0026 sudo mv $TMPFILE /etc/pacman.d/mirrorlist \\\n      \u0026\u0026 ua-drop-caches \\\n      \u0026\u0026 yay -Syyu --noconfirm'\n```\n\nNotes:\n- `sudo true` prompts for password at the start\n- `paccache` is from `pacman-contrib`\n- `yay` is an AUR helper\n\nAdd to `~/.bashrc` or `~/.zshrc`, then run `ua-update-all`.\n\n### Output example\n\n```\n# STARTED AT: 2025-08-31 14:04:21.217766 +03:00\n# ARGS: rate-mirrors arch\n# FETCHED MIRRORS: 1147\n# MIRRORS LEFT AFTER FILTERING: 730\n# JUMP #1\n# EXPLORING US\n#     + NEIGHBOR UK (by HubsFirst)\n#     + NEIGHBOR DE (by DistanceFirst)\n# [DE] SpeedTestResult { speed: 29.0 MB/s; elapsed: 1.00s; connection_time: 79ms }\n# ...\n# RE-TESTING TOP MIRRORS\n# [SE] SpeedTestResult { speed: 64.6 MB/s; elapsed: 745ms; connection_time: 122ms }\n# [BY] SpeedTestResult { speed: 61.2 MB/s; elapsed: 786ms; connection_time: 16ms }\n# ==== RESULTS (top re-tested) ====\n#   1. [SE] 64.6 MB/s -\u003e https://mirror.osbeck.com/archlinux/\n#   2. [BY] 61.2 MB/s -\u003e http://mirror.datacenter.by/pub/archlinux/\n#   3. [LT] 54.1 MB/s -\u003e http://mirrors.atviras.lt/archlinux/\n# FINISHED AT: 2025-08-31 14:04:40.296066 +03:00\nServer = https://mirror.osbeck.com/archlinux/$repo/os/$arch\nServer = http://mirror.datacenter.by/pub/archlinux/$repo/os/$arch\nServer = http://mirrors.atviras.lt/archlinux/$repo/os/$arch\n```\n\n### Advanced Usage: stdin\n\nFor custom mirror lists or unsupported distributions:\n\n```bash\n# Input format (tab-separated):\n# URL\n# COUNTRY\u003ctab\u003eURL\n# URL\u003ctab\u003eCOUNTRY\n\ncat mirrors.txt | rate-mirrors --concurrency=40 stdin \\\n    --path-to-test=\"extra/os/x86_64/extra.files\" \\\n    --path-to-return='$repo/os/$arch' \\\n    --comment-prefix=\"# \" \\\n    --output-prefix=\"Server = \"\n```\n\nExample `mirrors.txt`:\n```\nhttps://mirror-a.example.org/repo/\nUS\thttps://mirror-b.example.org/repo/\nhttps://mirror-c.example.org/repo/\tDE\n```\n\n## Exit Codes\n\n| Code | Meaning |\n|------|---------|\n| 0 | Success |\n| 1 | Error (network failure, invalid arguments, etc.) |\n\n## License\n\n[Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported (CC BY-NC-SA 3.0)](https://creativecommons.org/licenses/by-nc-sa/3.0/)\n\n---\n\n\u003csub\u003ePreviously known as \"Rate Arch Mirrors\" (changed in v0.4.0). [View old README](https://github.com/westandskif/rate-mirrors/blob/98f6417ff30b5148ab80f742c8eb729b78ca20c1/README.md)\u003c/sub\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwestandskif%2Frate-mirrors","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwestandskif%2Frate-mirrors","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwestandskif%2Frate-mirrors/lists"}