``` ├── .cargo/ ├── config.toml ├── .editorconfig ├── .github/ ├── ISSUE_TEMPLATE/ ├── bug_report.yml ├── config.yml ├── feature_request.yml ├── workflows/ ├── alpha.yml ├── dev.yml ├── release.yml ├── updater.yml ├── .gitignore ├── .husky/ ├── pre-commit ├── pre-push ├── .tool-versions ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── UPDATELOG.md ├── docs/ ├── preview_dark.png ├── preview_light.png ├── package.json ├── pnpm-lock.yaml ``` ## /.cargo/config.toml ```toml path="/.cargo/config.toml" [target.aarch64-unknown-linux-gnu] linker = "aarch64-linux-gnu-gcc" [target.armv7-unknown-linux-gnueabihf] linker = "arm-linux-gnueabihf-gcc" ``` ## /.editorconfig ```editorconfig path="/.editorconfig" root = true [*] charset = utf-8 end_of_line = lf indent_size = 2 insert_final_newline = true [*.rs] charset = utf-8 end_of_line = lf indent_size = 4 insert_final_newline = true ``` ## /.github/ISSUE_TEMPLATE/bug_report.yml ```yml path="/.github/ISSUE_TEMPLATE/bug_report.yml" name: 问题反馈 / Bug report title: "[BUG] " description: 反馈你遇到的问题 / Report the issue you are experiencing labels: ["bug"] type: "Bug" body: - type: markdown attributes: value: | ## 在提交问题之前,请确认以下事项: 1. 请 **确保** 您已经查阅了 [Clash Verge Rev 官方文档](https://clash-verge-rev.github.io/guide/term.html) 以及 [常见问题](https://clash-verge-rev.github.io/faq/windows.html) 2. 请 **确保** [已有的问题](https://github.com/clash-verge-rev/clash-verge-rev/issues?q=is%3Aissue) 中没有人提交过相似issue,否则请在已有的issue下进行讨论 3. 请 **务必** 给issue填写一个简洁明了的标题,以便他人快速检索 4. 请 **务必** 查看 [Alpha](https://github.com/clash-verge-rev/clash-verge-rev/releases/tag/alpha) 版本更新日志 5. 请 **务必** 尝试 [Alpha](https://github.com/clash-verge-rev/clash-verge-rev/releases/tag/alpha) 版本,确定问题是否仍然存在 6. 请 **务必** 按照模板规范详细描述问题以及尝试更新 Alpha 版本,否则issue将会被直接关闭 ## Before submitting the issue, please make sure of the following checklist: 1. Please make sure you have read the [Clash Verge Rev official documentation](https://clash-verge-rev.github.io/guide/term.html) and [FAQ](https://clash-verge-rev.github.io/faq/windows.html) 2. Please make sure there is no similar issue in the [existing issues](https://github.com/clash-verge-rev/clash-verge-rev/issues?q=is%3Aissue), otherwise please discuss under the existing issue 3. Please be sure to fill in a concise and clear title for the issue so that others can quickly search 4. Please be sure to check out [Alpha](https://github.com/clash-verge-rev/clash-verge-rev/releases/tag/alpha) version update log 5. Please be sure to try the [Alpha](https://github.com/clash-verge-rev/clash-verge-rev/releases/tag/alpha) version to ensure that the problem still exists 6. Please describe the problem in detail according to the template specification and try to update the Alpha version, otherwise the issue will be closed - type: textarea id: description attributes: label: 问题描述 / Describe the bug description: 详细清晰地描述你遇到的问题,并配合截图 / Describe the problem you encountered in detail and clearly, and provide screenshots validations: required: true - type: textarea attributes: label: 软件版本 / Verge Version description: 请提供Verge的具体版本,如果是alpha版本,请注明下载时间(精确到小时分钟) / Please provide the specific version of Verge. If it is an alpha version, please indicate the download time (accurate to hours and minutes) validations: required: true - type: textarea attributes: label: 复现步骤 / To Reproduce description: 请提供复现问题的步骤 / Steps to reproduce the behavior validations: required: true - type: dropdown attributes: label: 操作系统 / OS options: - Windows - Linux - MacOS validations: required: true - type: input attributes: label: 操作系统版本 / OS Version description: 请提供你的操作系统版本,Linux请额外提供桌面环境及窗口系统 / Please provide your OS version, for Linux, please also provide the desktop environment and window system validations: required: true - type: textarea attributes: label: 日志(勿上传日志文件,请粘贴日志内容) / Log (Do not upload the log file, paste the log content directly) description: 请提供完整或相关部分的Debug日志(请在“软件左侧菜单”->“设置”->“日志等级”调整到debug,Verge错误请把“杂项设置”->“app日志等级”调整到debug,并重启Verge生效。日志文件在“软件左侧菜单”->“设置”->“日志目录”下) / Please provide a complete or relevant part of the Debug log (please adjust the "Log level" to debug in "Software left menu" -> "Settings" -> "Log level". If there is a Verge error, please adjust "Miscellaneous settings" -> "app log level" to debug, and restart Verge to take effect. The log file is under "Software left menu" -> "Settings" -> "Log directory") validations: required: true ``` ## /.github/ISSUE_TEMPLATE/config.yml ```yml path="/.github/ISSUE_TEMPLATE/config.yml" contact_links: - name: 讨论交流 / Communication url: https://t.me/clash_verge_rev about: 在 Telegram 群组中与其他用户讨论交流 / Communicate with other users in the Telegram group ``` ## /.github/ISSUE_TEMPLATE/feature_request.yml ```yml path="/.github/ISSUE_TEMPLATE/feature_request.yml" name: 功能请求 / Feature request title: "[Feature] " description: 提出你的功能请求 / Propose your feature request labels: ["enhancement"] type: "Feature" body: - type: markdown attributes: value: | ## 在提交问题之前,请确认以下事项: 1. 请 **确保** 您已经查阅了 [Clash Verge Rev 官方文档](https://clash-verge-rev.github.io/guide/term.html) 确认软件不存在类似的功能 2. 请 **确保** [已有的问题](https://github.com/clash-verge-rev/clash-verge-rev/issues?q=is%3Aissue) 中没有人提交过相似issue,否则请在已有的issue下进行讨论 3. 请 **务必** 给issue填写一个简洁明了的标题,以便他人快速检索 4. 请 **务必** 先下载 [Alpha](https://github.com/clash-verge-rev/clash-verge-rev/releases/tag/alpha) 版本测试,确保该功能还未实现 5. 请 **务必** 按照模板规范详细描述问题,否则issue将会被关闭 ## Before submitting the issue, please make sure of the following checklist: 1. Please make sure you have read the [Clash Verge Rev official documentation](https://clash-verge-rev.github.io/guide/term.html) to confirm that the software does not have similar functions 2. Please make sure there is no similar issue in the [existing issues](https://github.com/clash-verge-rev/clash-verge-rev/issues?q=is%3Aissue), otherwise please discuss under the existing issue 3. Please be sure to fill in a concise and clear title for the issue so that others can quickly search 4. Please be sure to download the [Alpha](https://github.com/clash-verge-rev/clash-verge-rev/releases/tag/alpha) version for testing to ensure that the function has not been implemented 5. Please describe the problem in detail according to the template specification, otherwise the issue will be closed - type: textarea id: description attributes: label: 功能描述 / Feature description description: 详细清晰地描述你的功能请求 / A clear and concise description of what the feature is validations: required: true - type: textarea attributes: label: 使用场景 / Use case description: 请描述你的功能请求的使用场景 / Please describe the use case of your feature request validations: required: true - type: checkboxes id: os-labels attributes: label: 适用系统 / Target OS description: 请选择该功能适用的操作系统(至少选择一个) / Please select the operating system(s) for this feature request (select at least one) options: - label: windows - label: macos - label: linux validations: required: true ``` ## /.github/workflows/alpha.yml ```yml path="/.github/workflows/alpha.yml" name: Alpha Build on: workflow_dispatch: schedule: # UTC+8 0,6,12,18 - cron: "0 16,22,4,10 * * *" permissions: write-all env: CARGO_INCREMENTAL: 0 RUST_BACKTRACE: short concurrency: # only allow per workflow per commit (and not pr) to run at a time group: "${{ github.workflow }} - ${{ github.head_ref || github.ref }}" cancel-in-progress: ${{ github.ref != 'refs/heads/main' }} jobs: check_commit: runs-on: ubuntu-latest outputs: should_run: ${{ steps.check.outputs.should_run }} steps: - name: Checkout repository uses: actions/checkout@v4 with: fetch-depth: 2 - name: Check if version changed or src changed id: check run: | # For manual workflow_dispatch, always run if [ "${{ github.event_name }}" == "workflow_dispatch" ]; then echo "should_run=true" >> $GITHUB_OUTPUT exit 0 fi # Store current version from package.json CURRENT_VERSION=$(cat package.json | jq -r '.version') echo "Current version: $CURRENT_VERSION" # Get the previous commit's package.json version git checkout HEAD~1 package.json PREVIOUS_VERSION=$(cat package.json | jq -r '.version') echo "Previous version: $PREVIOUS_VERSION" # Reset back to current commit git checkout HEAD package.json # Check if version changed if [ "$CURRENT_VERSION" != "$PREVIOUS_VERSION" ]; then echo "Version changed from $PREVIOUS_VERSION to $CURRENT_VERSION" echo "should_run=true" >> $GITHUB_OUTPUT exit 0 fi # Check if src or src-tauri directories changed CURRENT_SRC_HASH=$(git rev-parse HEAD:src) PREVIOUS_SRC_HASH=$(git rev-parse HEAD~1:src 2>/dev/null || echo "") CURRENT_TAURI_HASH=$(git rev-parse HEAD:src-tauri 2>/dev/null || echo "") PREVIOUS_TAURI_HASH=$(git rev-parse HEAD~1:src-tauri 2>/dev/null || echo "") echo "Current src hash: $CURRENT_SRC_HASH" echo "Previous src hash: $PREVIOUS_SRC_HASH" echo "Current tauri hash: $CURRENT_TAURI_HASH" echo "Previous tauri hash: $PREVIOUS_TAURI_HASH" if [ "$CURRENT_SRC_HASH" != "$PREVIOUS_SRC_HASH" ] || [ "$CURRENT_TAURI_HASH" != "$PREVIOUS_TAURI_HASH" ]; then echo "Source directories changed" echo "should_run=true" >> $GITHUB_OUTPUT else echo "Version and source directories unchanged" echo "should_run=false" >> $GITHUB_OUTPUT fi delete_old_assets: needs: check_commit if: ${{ needs.check_commit.outputs.should_run == 'true' }} runs-on: ubuntu-latest steps: - name: Delete Old Alpha Release Assets uses: actions/github-script@v7 with: github-token: ${{ secrets.GITHUB_TOKEN }} script: | const releaseTag = 'alpha'; try { // Get the release by tag name const { data: release } = await github.rest.repos.getReleaseByTag({ owner: context.repo.owner, repo: context.repo.repo, tag: releaseTag }); console.log(`Found release with ID: ${release.id}`); // Delete each asset if (release.assets && release.assets.length > 0) { console.log(`Deleting ${release.assets.length} assets`); for (const asset of release.assets) { console.log(`Deleting asset: ${asset.name} (${asset.id})`); await github.rest.repos.deleteReleaseAsset({ owner: context.repo.owner, repo: context.repo.repo, asset_id: asset.id }); } console.log('All assets deleted successfully'); } else { console.log('No assets found to delete'); } } catch (error) { if (error.status === 404) { console.log('Release not found, nothing to delete'); } else { console.error('Error:', error); throw error; } } update_tag: name: Update tag runs-on: ubuntu-latest needs: delete_old_assets steps: - name: Checkout repository uses: actions/checkout@v4 - name: Fetch Alpha update logs id: fetch_alpha_logs run: | # Check if UPDATELOG.md exists if [ -f "UPDATELOG.md" ]; then # Extract the section starting with ## and containing -alpha until the next ## or end of file # ALPHA_LOGS=$(awk '/^## .*-alpha/{flag=1; print; next} /^## /{flag=0} flag' UPDATELOG.md) ALPHA_LOGS=$(awk '/^## v/{if(flag) exit; flag=1} flag' UPDATELOG.md) if [ -n "$ALPHA_LOGS" ]; then echo "Found alpha update logs" echo "ALPHA_LOGS<> $GITHUB_ENV echo "$ALPHA_LOGS" >> $GITHUB_ENV echo "EOF" >> $GITHUB_ENV else echo "No alpha sections found in UPDATELOG.md" fi else echo "UPDATELOG.md file not found" fi shell: bash - name: Set Env run: | echo "BUILDTIME=$(TZ=Asia/Shanghai date)" >> $GITHUB_ENV shell: bash - run: | # 检查 ALPHA_LOGS 是否存在,如果不存在则使用默认消息 if [ -z "$ALPHA_LOGS" ]; then echo "No alpha logs found, using default message" ALPHA_LOGS="More new features are now supported. Check for detailed changelog soon." else echo "Using found alpha logs" fi # 生成 release.txt 文件 cat > release.txt << EOF $ALPHA_LOGS ## 我应该下载哪个版本? ### MacOS - MacOS intel芯片: x64.dmg - MacOS apple M芯片: aarch64.dmg ### Linux - Linux 64位: amd64.deb/amd64.rpm - Linux arm64 architecture: arm64.deb/aarch64.rpm - Linux armv7架构: armhf.deb/armhfp.rpm ### Windows (不再支持Win7) #### 正常版本(推荐) - 64位: x64-setup.exe - arm64架构: arm64-setup.exe #### 便携版问题很多不再提供 #### 内置Webview2版(体积较大,仅在企业版系统或无法安装webview2时使用) - 64位: x64_fixed_webview2-setup.exe - arm64架构: arm64_fixed_webview2-setup.exe ### FAQ - [常见问题](https://clash-verge-rev.github.io/faq/windows.html) ### 稳定机场VPN推荐 - [狗狗加速](https://verge.dginv.click/#/register?code=oaxsAGo6) Created at ${{ env.BUILDTIME }}. EOF - name: Upload Release uses: softprops/action-gh-release@v2 with: tag_name: alpha name: "Clash Verge Rev Alpha" body_path: release.txt prerelease: true token: ${{ secrets.GITHUB_TOKEN }} generate_release_notes: true alpha: needs: update_tag strategy: fail-fast: false matrix: include: - os: windows-latest target: x86_64-pc-windows-msvc - os: windows-latest target: aarch64-pc-windows-msvc - os: macos-latest target: aarch64-apple-darwin - os: macos-latest target: x86_64-apple-darwin - os: ubuntu-22.04 target: x86_64-unknown-linux-gnu runs-on: ${{ matrix.os }} steps: - name: Checkout Repository uses: actions/checkout@v4 - name: Install Rust Stable uses: dtolnay/rust-toolchain@stable - name: Add Rust Target run: rustup target add ${{ matrix.target }} - name: Rust Cache uses: Swatinem/rust-cache@v2 with: workspaces: src-tauri cache-all-crates: true cache-on-failure: true - name: Install dependencies (ubuntu only) if: matrix.os == 'ubuntu-22.04' run: | sudo apt-get update sudo apt-get install -y libxslt1.1 libwebkit2gtk-4.1-dev libayatana-appindicator3-dev librsvg2-dev patchelf - name: Install Node uses: actions/setup-node@v4 with: node-version: "22" - uses: pnpm/action-setup@v4 name: Install pnpm with: run_install: false - name: Pnpm install and check run: | pnpm i pnpm check ${{ matrix.target }} - name: Release Alpha Version run: pnpm release-alpha-version - name: Patch Alpha Hash run: pnpm fix-alpha-version - name: Tauri build uses: tauri-apps/tauri-action@v0 env: NODE_OPTIONS: "--max_old_space_size=4096" GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }} TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }} APPLE_CERTIFICATE: ${{ secrets.APPLE_CERTIFICATE }} APPLE_CERTIFICATE_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }} APPLE_SIGNING_IDENTITY: ${{ secrets.APPLE_SIGNING_IDENTITY }} APPLE_ID: ${{ secrets.APPLE_ID }} APPLE_PASSWORD: ${{ secrets.APPLE_PASSWORD }} APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }} with: tagName: alpha releaseName: "Clash Verge Rev Alpha" releaseBody: "More new features are now supported." releaseDraft: false prerelease: true tauriScript: pnpm args: --target ${{ matrix.target }} alpha-for-linux-arm: needs: update_tag strategy: fail-fast: false matrix: include: - os: ubuntu-22.04 target: aarch64-unknown-linux-gnu arch: arm64 - os: ubuntu-22.04 target: armv7-unknown-linux-gnueabihf arch: armhf runs-on: ${{ matrix.os }} steps: - name: Checkout Repository uses: actions/checkout@v4 - name: Install Rust Stable uses: dtolnay/rust-toolchain@stable - name: Add Rust Target run: rustup target add ${{ matrix.target }} - name: Rust Cache uses: Swatinem/rust-cache@v2 with: workspaces: src-tauri cache-all-crates: true - name: Install Node uses: actions/setup-node@v4 with: node-version: "22" - name: Install pnpm uses: pnpm/action-setup@v4 with: run_install: false - name: Pnpm install and check run: | pnpm i pnpm check ${{ matrix.target }} - name: Release Alpha Version run: pnpm release-alpha-version - name: Patch Alpha Hash run: pnpm fix-alpha-version - name: "Setup for linux" run: |- sudo ls -lR /etc/apt/ cat > /tmp/sources.list << EOF deb [arch=amd64,i386] http://archive.ubuntu.com/ubuntu jammy main multiverse universe restricted deb [arch=amd64,i386] http://archive.ubuntu.com/ubuntu jammy-security main multiverse universe restricted deb [arch=amd64,i386] http://archive.ubuntu.com/ubuntu jammy-updates main multiverse universe restricted deb [arch=amd64,i386] http://archive.ubuntu.com/ubuntu jammy-backports main multiverse universe restricted deb [arch=armhf,arm64] http://ports.ubuntu.com/ubuntu-ports jammy main multiverse universe restricted deb [arch=armhf,arm64] http://ports.ubuntu.com/ubuntu-ports jammy-security main multiverse universe restricted deb [arch=armhf,arm64] http://ports.ubuntu.com/ubuntu-ports jammy-updates main multiverse universe restricted deb [arch=armhf,arm64] http://ports.ubuntu.com/ubuntu-ports jammy-backports main multiverse universe restricted EOF sudo mv /etc/apt/sources.list /etc/apt/sources.list.default sudo mv /tmp/sources.list /etc/apt/sources.list sudo dpkg --add-architecture ${{ matrix.arch }} sudo apt-get update -y sudo apt-get -f install -y sudo apt-get install -y \ linux-libc-dev:${{ matrix.arch }} \ libc6-dev:${{ matrix.arch }} sudo apt-get install -y \ libxslt1.1:${{ matrix.arch }} \ libwebkit2gtk-4.1-dev:${{ matrix.arch }} \ libayatana-appindicator3-dev:${{ matrix.arch }} \ libssl-dev:${{ matrix.arch }} \ patchelf:${{ matrix.arch }} \ librsvg2-dev:${{ matrix.arch }} - name: "Install aarch64 tools" if: matrix.target == 'aarch64-unknown-linux-gnu' run: | sudo apt install -y \ gcc-aarch64-linux-gnu \ g++-aarch64-linux-gnu - name: "Install armv7 tools" if: matrix.target == 'armv7-unknown-linux-gnueabihf' run: | sudo apt install -y \ gcc-arm-linux-gnueabihf \ g++-arm-linux-gnueabihf - name: Build for Linux run: | export PKG_CONFIG_ALLOW_CROSS=1 if [ "${{ matrix.target }}" == "aarch64-unknown-linux-gnu" ]; then export PKG_CONFIG_PATH=/usr/lib/aarch64-linux-gnu/pkgconfig/:$PKG_CONFIG_PATH export PKG_CONFIG_SYSROOT_DIR=/usr/aarch64-linux-gnu/ elif [ "${{ matrix.target }}" == "armv7-unknown-linux-gnueabihf" ]; then export PKG_CONFIG_PATH=/usr/lib/arm-linux-gnueabihf/pkgconfig/:$PKG_CONFIG_PATH export PKG_CONFIG_SYSROOT_DIR=/usr/arm-linux-gnueabihf/ fi pnpm build --target ${{ matrix.target }} env: NODE_OPTIONS: "--max_old_space_size=4096" TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }} TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }} - name: Get Version run: | sudo apt-get update sudo apt-get install jq echo "VERSION=$(cat package.json | jq '.version' | tr -d '"')" >> $GITHUB_ENV echo "BUILDTIME=$(TZ=Asia/Shanghai date)" >> $GITHUB_ENV - name: Upload Release uses: softprops/action-gh-release@v2 with: tag_name: alpha name: "Clash Verge Rev Alpha" prerelease: true token: ${{ secrets.GITHUB_TOKEN }} files: | src-tauri/target/${{ matrix.target }}/release/bundle/deb/*.deb src-tauri/target/${{ matrix.target }}/release/bundle/rpm/*.rpm alpha-for-fixed-webview2: needs: update_tag strategy: fail-fast: false matrix: include: - os: windows-latest target: x86_64-pc-windows-msvc arch: x64 - os: windows-latest target: aarch64-pc-windows-msvc arch: arm64 runs-on: ${{ matrix.os }} steps: - name: Checkout Repository uses: actions/checkout@v4 - name: Add Rust Target run: rustup target add ${{ matrix.target }} - name: Rust Cache uses: Swatinem/rust-cache@v2 with: workspaces: src-tauri cache-all-crates: true cache-on-failure: true - name: Install Node uses: actions/setup-node@v4 with: node-version: "22" - uses: pnpm/action-setup@v4 name: Install pnpm with: run_install: false - name: Pnpm install and check run: | pnpm i pnpm check ${{ matrix.target }} - name: Release Alpha Version run: pnpm release-alpha-version - name: Patch Alpha Hash run: pnpm fix-alpha-version - name: Download WebView2 Runtime run: | invoke-webrequest -uri https://github.com/westinyang/WebView2RuntimeArchive/releases/download/109.0.1518.78/Microsoft.WebView2.FixedVersionRuntime.109.0.1518.78.${{ matrix.arch }}.cab -outfile Microsoft.WebView2.FixedVersionRuntime.109.0.1518.78.${{ matrix.arch }}.cab Expand .\Microsoft.WebView2.FixedVersionRuntime.109.0.1518.78.${{ matrix.arch }}.cab -F:* ./src-tauri Remove-Item .\src-tauri\tauri.windows.conf.json Rename-Item .\src-tauri\webview2.${{ matrix.arch }}.json tauri.windows.conf.json - name: Tauri build id: build uses: tauri-apps/tauri-action@v0 env: NODE_OPTIONS: "--max_old_space_size=4096" GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }} TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }} with: tauriScript: pnpm args: --target ${{ matrix.target }} - name: Rename run: | $files = Get-ChildItem ".\src-tauri\target\${{ matrix.target }}\release\bundle\nsis\*-setup.exe" foreach ($file in $files) { $newName = $file.Name -replace "-setup\.exe$", "_fixed_webview2-setup.exe" Rename-Item $file.FullName $newName } $files = Get-ChildItem ".\src-tauri\target\${{ matrix.target }}\release\bundle\nsis\*.nsis.zip" foreach ($file in $files) { $newName = $file.Name -replace "-setup\.nsis\.zip$", "_fixed_webview2-setup.nsis.zip" Rename-Item $file.FullName $newName } $files = Get-ChildItem ".\src-tauri\target\${{ matrix.target }}\release\bundle\nsis\*-setup.exe.sig" foreach ($file in $files) { $newName = $file.Name -replace "-setup\.exe\.sig$", "_fixed_webview2-setup.exe.sig" Rename-Item $file.FullName $newName } - name: Upload Release uses: softprops/action-gh-release@v2 with: tag_name: alpha name: "Clash Verge Rev Alpha" prerelease: true token: ${{ secrets.GITHUB_TOKEN }} files: src-tauri/target/${{ matrix.target }}/release/bundle/nsis/*setup* - name: Portable Bundle run: pnpm portable-fixed-webview2 ${{ matrix.target }} --alpha env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} ``` ## /.github/workflows/dev.yml ```yml path="/.github/workflows/dev.yml" name: Development Test on: workflow_dispatch: permissions: write-all env: CARGO_INCREMENTAL: 0 RUST_BACKTRACE: short concurrency: # only allow per workflow per commit (and not pr) to run at a time group: "${{ github.workflow }} - ${{ github.head_ref || github.ref }}" cancel-in-progress: ${{ github.ref != 'refs/heads/main' }} jobs: dev: strategy: fail-fast: false matrix: include: - os: windows-latest target: x86_64-pc-windows-msvc bundle: nsis - os: macos-latest target: aarch64-apple-darwin bundle: dmg - os: macos-latest target: x86_64-apple-darwin bundle: dmg runs-on: ${{ matrix.os }} steps: - name: Checkout Repository uses: actions/checkout@v4 - name: Install Rust Stable uses: dtolnay/rust-toolchain@stable - name: Add Rust Target run: rustup target add ${{ matrix.target }} - name: Rust Cache uses: Swatinem/rust-cache@v2 with: workspaces: src-tauri cache-all-crates: true cache-on-failure: true - name: Install Node uses: actions/setup-node@v4 with: node-version: "20" - uses: pnpm/action-setup@v4 name: Install pnpm with: run_install: false - name: Pnpm install and check run: | pnpm i pnpm check ${{ matrix.target }} - name: Tauri build uses: tauri-apps/tauri-action@v0 env: NODE_OPTIONS: "--max_old_space_size=4096" GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }} TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }} APPLE_CERTIFICATE: ${{ secrets.APPLE_CERTIFICATE }} APPLE_CERTIFICATE_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }} APPLE_SIGNING_IDENTITY: ${{ secrets.APPLE_SIGNING_IDENTITY }} APPLE_ID: ${{ secrets.APPLE_ID }} APPLE_PASSWORD: ${{ secrets.APPLE_PASSWORD }} APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }} with: tauriScript: pnpm args: --target ${{ matrix.target }} -b ${{ matrix.bundle }} - name: Upload Artifacts if: matrix.os == 'macos-latest' uses: actions/upload-artifact@v4 with: name: ${{ matrix.target }} path: src-tauri/target/${{ matrix.target }}/release/bundle/dmg/*.dmg if-no-files-found: error - name: Upload Artifacts if: matrix.os == 'windows-latest' uses: actions/upload-artifact@v4 with: name: ${{ matrix.target }} path: src-tauri/target/${{ matrix.target }}/release/bundle/nsis/*.exe if-no-files-found: error ``` ## /.github/workflows/release.yml ```yml path="/.github/workflows/release.yml" name: Release Build on: workflow_dispatch: permissions: write-all env: CARGO_INCREMENTAL: 0 RUST_BACKTRACE: short concurrency: # only allow per workflow per commit (and not pr) to run at a time group: "${{ github.workflow }} - ${{ github.head_ref || github.ref }}" cancel-in-progress: ${{ github.ref != 'refs/heads/main' }} jobs: release: strategy: fail-fast: false matrix: include: - os: windows-latest target: x86_64-pc-windows-msvc - os: windows-latest target: aarch64-pc-windows-msvc - os: macos-latest target: aarch64-apple-darwin - os: macos-latest target: x86_64-apple-darwin - os: ubuntu-22.04 target: x86_64-unknown-linux-gnu runs-on: ${{ matrix.os }} steps: - name: Checkout Repository uses: actions/checkout@v4 - name: Install Rust Stable uses: dtolnay/rust-toolchain@stable - name: Add Rust Target run: rustup target add ${{ matrix.target }} - name: Rust Cache uses: Swatinem/rust-cache@v2 with: workspaces: src-tauri cache-all-crates: true cache-on-failure: true - name: Install dependencies (ubuntu only) if: matrix.os == 'ubuntu-22.04' run: | sudo apt-get update sudo apt-get install -y libxslt1.1 libwebkit2gtk-4.1-dev libayatana-appindicator3-dev librsvg2-dev patchelf - name: Install Node uses: actions/setup-node@v4 with: node-version: "22" - uses: pnpm/action-setup@v4 name: Install pnpm with: run_install: false - name: Pnpm install and check run: | pnpm i pnpm check ${{ matrix.target }} - name: Tauri build uses: tauri-apps/tauri-action@v0 env: NODE_OPTIONS: "--max_old_space_size=4096" GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }} TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }} APPLE_CERTIFICATE: ${{ secrets.APPLE_CERTIFICATE }} APPLE_CERTIFICATE_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }} APPLE_SIGNING_IDENTITY: ${{ secrets.APPLE_SIGNING_IDENTITY }} APPLE_ID: ${{ secrets.APPLE_ID }} APPLE_PASSWORD: ${{ secrets.APPLE_PASSWORD }} APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }} with: tagName: v__VERSION__ releaseName: "Clash Verge Rev v__VERSION__" releaseBody: "More new features are now supported." tauriScript: pnpm args: --target ${{ matrix.target }} release-for-linux-arm: strategy: fail-fast: false matrix: include: - os: ubuntu-22.04 target: aarch64-unknown-linux-gnu arch: arm64 - os: ubuntu-22.04 target: armv7-unknown-linux-gnueabihf arch: armhf runs-on: ${{ matrix.os }} steps: - name: Checkout Repository uses: actions/checkout@v4 - name: Install Rust Stable uses: dtolnay/rust-toolchain@stable - name: Add Rust Target run: rustup target add ${{ matrix.target }} - name: Rust Cache uses: Swatinem/rust-cache@v2 with: workspaces: src-tauri cache-all-crates: true - name: Install Node uses: actions/setup-node@v4 with: node-version: "22" - name: Install pnpm uses: pnpm/action-setup@v4 with: run_install: false - name: Pnpm install and check run: | pnpm i pnpm check ${{ matrix.target }} - name: "Setup for linux" run: |- sudo ls -lR /etc/apt/ cat > /tmp/sources.list << EOF deb [arch=amd64,i386] http://archive.ubuntu.com/ubuntu jammy main multiverse universe restricted deb [arch=amd64,i386] http://archive.ubuntu.com/ubuntu jammy-security main multiverse universe restricted deb [arch=amd64,i386] http://archive.ubuntu.com/ubuntu jammy-updates main multiverse universe restricted deb [arch=amd64,i386] http://archive.ubuntu.com/ubuntu jammy-backports main multiverse universe restricted deb [arch=armhf,arm64] http://ports.ubuntu.com/ubuntu-ports jammy main multiverse universe restricted deb [arch=armhf,arm64] http://ports.ubuntu.com/ubuntu-ports jammy-security main multiverse universe restricted deb [arch=armhf,arm64] http://ports.ubuntu.com/ubuntu-ports jammy-updates main multiverse universe restricted deb [arch=armhf,arm64] http://ports.ubuntu.com/ubuntu-ports jammy-backports main multiverse universe restricted EOF sudo mv /etc/apt/sources.list /etc/apt/sources.list.default sudo mv /tmp/sources.list /etc/apt/sources.list sudo dpkg --add-architecture ${{ matrix.arch }} sudo apt update sudo apt install -y \ libxslt1.1:${{ matrix.arch }} \ libwebkit2gtk-4.1-dev:${{ matrix.arch }} \ libayatana-appindicator3-dev:${{ matrix.arch }} \ libssl-dev:${{ matrix.arch }} \ patchelf:${{ matrix.arch }} \ librsvg2-dev:${{ matrix.arch }} - name: "Install aarch64 tools" if: matrix.target == 'aarch64-unknown-linux-gnu' run: | sudo apt install -y \ gcc-aarch64-linux-gnu \ g++-aarch64-linux-gnu - name: "Install armv7 tools" if: matrix.target == 'armv7-unknown-linux-gnueabihf' run: | sudo apt install -y \ gcc-arm-linux-gnueabihf \ g++-arm-linux-gnueabihf - name: Build for Linux run: | export PKG_CONFIG_ALLOW_CROSS=1 if [ "${{ matrix.target }}" == "aarch64-unknown-linux-gnu" ]; then export PKG_CONFIG_PATH=/usr/lib/aarch64-linux-gnu/pkgconfig/:$PKG_CONFIG_PATH export PKG_CONFIG_SYSROOT_DIR=/usr/aarch64-linux-gnu/ elif [ "${{ matrix.target }}" == "armv7-unknown-linux-gnueabihf" ]; then export PKG_CONFIG_PATH=/usr/lib/arm-linux-gnueabihf/pkgconfig/:$PKG_CONFIG_PATH export PKG_CONFIG_SYSROOT_DIR=/usr/arm-linux-gnueabihf/ fi pnpm build --target ${{ matrix.target }} env: NODE_OPTIONS: "--max_old_space_size=4096" TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }} TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }} - name: Get Version run: | sudo apt-get update sudo apt-get install jq echo "VERSION=$(cat package.json | jq '.version' | tr -d '"')" >> $GITHUB_ENV echo "BUILDTIME=$(TZ=Asia/Shanghai date)" >> $GITHUB_ENV - name: Upload Release uses: softprops/action-gh-release@v2 with: tag_name: v${{env.VERSION}} name: "Clash Verge Rev v${{env.VERSION}}" body: "More new features are now supported." token: ${{ secrets.GITHUB_TOKEN }} files: | src-tauri/target/${{ matrix.target }}/release/bundle/deb/*.deb src-tauri/target/${{ matrix.target }}/release/bundle/rpm/*.rpm release-for-fixed-webview2: strategy: fail-fast: false matrix: include: - os: windows-latest target: x86_64-pc-windows-msvc arch: x64 - os: windows-latest target: aarch64-pc-windows-msvc arch: arm64 runs-on: ${{ matrix.os }} steps: - name: Checkout Repository uses: actions/checkout@v4 - name: Add Rust Target run: rustup target add ${{ matrix.target }} - name: Rust Cache uses: Swatinem/rust-cache@v2 with: workspaces: src-tauri cache-all-crates: true cache-on-failure: true - name: Install Node uses: actions/setup-node@v4 with: node-version: "22" - uses: pnpm/action-setup@v4 name: Install pnpm with: run_install: false - name: Pnpm install and check run: | pnpm i pnpm check ${{ matrix.target }} - name: Download WebView2 Runtime run: | invoke-webrequest -uri https://github.com/westinyang/WebView2RuntimeArchive/releases/download/109.0.1518.78/Microsoft.WebView2.FixedVersionRuntime.109.0.1518.78.${{ matrix.arch }}.cab -outfile Microsoft.WebView2.FixedVersionRuntime.109.0.1518.78.${{ matrix.arch }}.cab Expand .\Microsoft.WebView2.FixedVersionRuntime.109.0.1518.78.${{ matrix.arch }}.cab -F:* ./src-tauri Remove-Item .\src-tauri\tauri.windows.conf.json Rename-Item .\src-tauri\webview2.${{ matrix.arch }}.json tauri.windows.conf.json - name: Tauri build id: build uses: tauri-apps/tauri-action@v0 env: NODE_OPTIONS: "--max_old_space_size=4096" GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }} TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }} with: tauriScript: pnpm args: --target ${{ matrix.target }} - name: Rename run: | $files = Get-ChildItem ".\src-tauri\target\${{ matrix.target }}\release\bundle\nsis\*-setup.exe" foreach ($file in $files) { $newName = $file.Name -replace "-setup\.exe$", "_fixed_webview2-setup.exe" Rename-Item $file.FullName $newName } $files = Get-ChildItem ".\src-tauri\target\${{ matrix.target }}\release\bundle\nsis\*.nsis.zip" foreach ($file in $files) { $newName = $file.Name -replace "-setup\.nsis\.zip$", "_fixed_webview2-setup.nsis.zip" Rename-Item $file.FullName $newName } $files = Get-ChildItem ".\src-tauri\target\${{ matrix.target }}\release\bundle\nsis\*-setup.exe.sig" foreach ($file in $files) { $newName = $file.Name -replace "-setup\.exe\.sig$", "_fixed_webview2-setup.exe.sig" Rename-Item $file.FullName $newName } - name: Upload Release uses: softprops/action-gh-release@v2 with: tag_name: v${{steps.build.outputs.appVersion}} name: "Clash Verge Rev v${{steps.build.outputs.appVersion}}" body: "More new features are now supported." token: ${{ secrets.GITHUB_TOKEN }} files: src-tauri/target/${{ matrix.target }}/release/bundle/nsis/*setup* - name: Portable Bundle run: pnpm portable-fixed-webview2 ${{ matrix.target }} env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} release-update: runs-on: ubuntu-latest needs: [release, release-for-linux-arm] steps: - name: Checkout repository uses: actions/checkout@v4 - name: Install Node uses: actions/setup-node@v4 with: node-version: "22" - uses: pnpm/action-setup@v4 name: Install pnpm with: run_install: false - name: Pnpm install run: pnpm i - name: Release updater file run: pnpm updater env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} release-update-for-fixed-webview2: runs-on: ubuntu-latest needs: [release-for-fixed-webview2] steps: - name: Checkout repository uses: actions/checkout@v4 - name: Install Node uses: actions/setup-node@v4 with: node-version: "22" - uses: pnpm/action-setup@v4 name: Install pnpm with: run_install: false - name: Pnpm install run: pnpm i - name: Release updater file run: pnpm updater-fixed-webview2 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} submit-to-winget: runs-on: ubuntu-latest needs: [release-update] steps: - name: Checkout repository uses: actions/checkout@v4 with: fetch-depth: 0 - name: Get Version run: | sudo apt-get update sudo apt-get install jq echo "VERSION=$(cat package.json | jq '.version' | tr -d '"')" >> $GITHUB_ENV - name: Submit to Winget uses: vedantmgoyal9/winget-releaser@main with: identifier: ClashVergeRev.ClashVergeRev version: ${{env.VERSION}} release-tag: v${{env.VERSION}} installers-regex: '_(arm64|x64|x86)-setup\.exe$' token: ${{ secrets.WINGET_TOKEN }} ``` ## /.github/workflows/updater.yml ```yml path="/.github/workflows/updater.yml" name: Updater CI on: workflow_dispatch permissions: write-all jobs: release-update: runs-on: ubuntu-latest steps: - name: Checkout repository uses: actions/checkout@v4 - name: Install Node uses: actions/setup-node@v4 with: node-version: "22" - uses: pnpm/action-setup@v4 name: Install pnpm with: run_install: false - name: Pnpm install run: pnpm i - name: Release updater file run: pnpm updater env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} release-update-for-fixed-webview2: runs-on: ubuntu-latest steps: - name: Checkout repository uses: actions/checkout@v4 - name: Install Node uses: actions/setup-node@v4 with: node-version: "22" - uses: pnpm/action-setup@v4 name: Install pnpm with: run_install: false - name: Pnpm install run: pnpm i - name: Release updater file run: pnpm updater-fixed-webview2 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} ``` ## /.gitignore ```gitignore path="/.gitignore" node_modules .pnpm-store .DS_Store dist dist-ssr *.local update.json scripts/_env.sh .vscode .tool-versions .idea ``` ## /.husky/pre-commit ```husky/pre-commit path="/.husky/pre-commit" #!/bin/bash #pnpm pretty-quick --staged # 运行 clippy fmt cargo fmt --manifest-path ./src-tauri/Cargo.toml if [ $? -ne 0 ]; then echo "rustfmt failed to format the code. Please fix the issues and try again." exit 1 fi #git add . # 允许提交 exit 0 ``` ## /.husky/pre-push ```husky/pre-push path="/.husky/pre-push" #!/bin/bash # 运行 clippy # cargo clippy --manifest-path ./src-tauri/Cargo.toml --fix # 如果 clippy 失败,阻止 push # if [ $? -ne 0 ]; then # echo "Clippy found issues in sub_crate. Please fix them before pushing." # exit 1 # fi # 允许 push exit 0 ``` ## /.tool-versions ```tool-versions path="/.tool-versions" nodejs 21.7.1 ``` ## /CONTRIBUTING.md # CONTRIBUTING Thank you for your interest in contributing to Clash Verge Rev! This document provides guidelines and instructions to help you set up your development environment and start contributing. ## Development Setup Before you start contributing to the project, you need to set up your development environment. Here are the steps you need to follow: ### Prerequisites 1. **Install Rust and Node.js**: Our project requires both Rust and Node.js. Please follow the instructions provided [here](https://tauri.app/v1/guides/getting-started/prerequisites) to install them on your system. ### Setup for Windows Users If you're a Windows user, you may need to perform some additional steps: - Make sure to add Rust and Node.js to your system's PATH. This is usually done during the installation process, but you can verify and manually add them if necessary. - The gnu `patch` tool should be installed When you setup `Rust` environment, Only use toolchain with `Windows MSVC` , to change settings follow command: ```shell rustup target add x86_64-pc-windows-msvc rustup set default-host x86_64-pc-windows-msvc ``` ### Install Node.js Package After installing Rust and Node.js, install the necessary Node.js and Node Package Manager: ```shell npm install pnpm -g ``` ### Install Dependencies ```shell pnpm install ``` ### Download the Mihomo Core Binary You have two options for downloading the clash binary: - Automatically download it via the provided script: ```shell pnpm run check # Use '--force' to force update to the latest version # pnpm run check --force ``` - Manually download it from the [Mihomo release](https://github.com/MetaCubeX/mihomo/releases). After downloading, rename the binary according to the [Tauri configuration](https://tauri.app/v1/api/config#bundleconfig.externalbin). ### Run the Development Server To run the development server, use the following command: ```shell pnpm dev # If an app instance already exists, use a different command pnpm dev:diff ``` ### Build the Project To build this project: ```shell pnpm build ``` For a faster build, use the following command ```shell pnpm build:fast ``` This uses Rust's fast-release profile which significantly reduces compilation time by disabling optimization and LTO. The resulting binary will be larger and less performant than the standard build, but it's useful for testing changes quickly. The `Artifacts` will display in the `log` in the Terminal. ### Build clean To clean rust build: ```shell pnpm clean ``` ### Portable Version (Windows Only) To package portable version after the build: ```shell pnpm portable ``` ## Contributing Your Changes Once you have made your changes: 1. Fork the repository. 2. Create a new branch for your feature or bug fix. 3. Commit your changes with clear and concise commit messages. 4. Push your branch to your fork and submit a pull request to our repository. We appreciate your contributions and look forward to your active participation in our project! ## /LICENSE ``` path="/LICENSE" GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . ``` ## /README.md

Clash
Continuation of Clash Verge

A Clash Meta GUI based on Tauri.

## Preview | Dark | Light | | -------------------------------- | --------------------------------- | | ![预览](./docs/preview_dark.png) | ![预览](./docs/preview_light.png) | ## Install 请到发布页面下载对应的安装包:[Release page](https://github.com/clash-verge-rev/clash-verge-rev/releases)
Go to the [release page](https://github.com/clash-verge-rev/clash-verge-rev/releases) to download the corresponding installation package
Supports Windows (x64/x86), Linux (x64/arm64) and macOS 10.15+ (intel/apple). ### 安装说明和常见问题,请到[文档页](https://clash-verge-rev.github.io/)查看:[Doc](https://clash-verge-rev.github.io/) --- ### TG 频道: [@clash_verge_rev](https://t.me/clash_verge_re) ## Promotion [狗狗加速 —— 技术流机场 Doggygo VPN](https://verge.dginv.click/#/register?code=oaxsAGo6) - 高性能海外机场,免费试用,优惠套餐,解锁流媒体,全球首家支持 Hysteria 协议。 - 使用 Clash Verge 专属邀请链接注册送 3 天,每天 1G 流量免费试用:[点此注册](https://verge.dginv.click/#/register?code=oaxsAGo6) - Clash Verge 专属 8 折优惠码: verge20 (仅有 500 份) - 优惠套餐每月仅需 15.8 元,160G 流量,年付 8 折 - 海外团队,无跑路风险,高达 50% 返佣 - 集群负载均衡设计,高速专线(兼容老客户端),极低延迟,无视晚高峰,4K 秒开 - 全球首家 Hysteria 协议机场,现已上线更快的 `Hysteria2` 协议(Clash Verge 客户端最佳搭配) - 解锁流媒体及 ChatGPT - 官网:[https://狗狗加速.com](https://verge.dginv.click/#/register?code=oaxsAGo6) ## Features - 基于性能强劲的 Rust 和 Tauri 2 框架 - 内置[Clash.Meta(mihomo)](https://github.com/MetaCubeX/mihomo)内核,并支持切换 `Alpha` 版本内核。 - 简洁美观的用户界面,支持自定义主题颜色、代理组/托盘图标以及 `CSS Injection`。 - 配置文件管理和增强(Merge 和 Script),配置文件语法提示。 - 系统代理和守卫、`TUN(虚拟网卡)` 模式。 - 可视化节点和规则编辑 - WebDav 配置备份和同步 ### FAQ Refer to [Doc FAQ Page](https://clash-verge-rev.github.io/faq/windows.html) ### Donation [捐助Clash Verge Rev的开发](https://github.com/sponsors/clash-verge-rev) ## Development See [CONTRIBUTING.md](./CONTRIBUTING.md) for more details. To run the development server, execute the following commands after all prerequisites for **Tauri** are installed: ```shell pnpm i pnpm run check pnpm dev ``` ## Contributions Issue and PR welcome! ## Acknowledgement Clash Verge rev was based on or inspired by these projects and so on: - [zzzgydi/clash-verge](https://github.com/zzzgydi/clash-verge): A Clash GUI based on tauri. Supports Windows, macOS and Linux. - [tauri-apps/tauri](https://github.com/tauri-apps/tauri): Build smaller, faster, and more secure desktop applications with a web frontend. - [Dreamacro/clash](https://github.com/Dreamacro/clash): A rule-based tunnel in Go. - [MetaCubeX/mihomo](https://github.com/MetaCubeX/mihomo): A rule-based tunnel in Go. - [Fndroid/clash_for_windows_pkg](https://github.com/Fndroid/clash_for_windows_pkg): A Windows/macOS GUI based on Clash. - [vitejs/vite](https://github.com/vitejs/vite): Next generation frontend tooling. It's fast! ## License GPL-3.0 License. See [License here](./LICENSE) for details. ## /UPDATELOG.md ## v2.2.4-alpha #### 已知问题 - 仅在Ubuntu 22.04/24.04,Fedora 41 **Gnome桌面环境** 做过简单测试,不保证其他其他Linux发行版可用,将在未来做进一步适配和调优 - MacOS 自定义图标与速率显示推荐图标尺寸为 256x256。其他尺寸(可能)会导致不正常图标和速率间隙 - MacOS 下 墙贴主要为浅色,Tray 图标深色时图标闪烁;彩色 Tray 速率颜色淡 - Linux 下 Clash Verge Rev 内存占用显著高于 Windows / MacOS ### 2.2.4 相对于 2.2.3 #### 修复了: - 首页“代理模式”快速切换导致的卡死问题 - 解锁测试报错信息 - Macos 快捷键关闭窗口无法启用自动轻量模式 - 静默启动异常窗口创建和关闭流程 - 使用 tauri window-state 管理窗口,尝试解决各种窗口异常 - Windows 错误的全局快捷键 'Ctrl+Q' 注册 - Vless URL 解码时网络类型错误 - 切换自定义代理地址导致系统代理状态异常 - Macos TUN 默认无效网卡名称 #### 新增了: - 允许代理主机地址设置为非 127.0.0.1 对 WSL 代理友好 - 关闭系统代理时关闭已建立的网络连接 - 托盘显示当前轻量模式状态 - Webdav 请求加入 UA - Webdav 支持目录重定向 - 移除 Webdav 跨平台备份恢复限制 - 增强 Webdav 备份目录检查和文件上传重试机制 - 系统代理守卫可检查意外设置变更并恢复 - 定时自动订阅更新也能自动回退使用代理 - 订阅请求超时机制,防止订阅更新的时候卡死 - 订阅卡片点击时间可切换下次自动更新时间,自动更新触发后页面有明确的成功与否提示 #### 优化了: - 系统代理 Bypass 设置 - Windows 下使用 Startup 文件夹的方式实现开机自启,解决管理员模式下开机自启的各种问题 - 增加 IP 信息请求重试机制,减少 Network Error 发生的情况 - 切换到规则页面时自动刷新规则数据 - 重构更新失败回退机制,使用后端完成更新失败后回退到使用 Clash 代理再次尝试更新 - 编辑非激活订阅的时候不在触发当前订阅配置重载 - 改进核心功能防止主进程阻塞、改进MihomoManager实现,以及优化窗口创建流程。减少应用程序可能出现的主进程卡死情况 ## v2.2.3 #### 已知问题 - 仅在Ubuntu 22.04/24.04,Fedora 41 **Gnome桌面环境** 做过简单测试,不保证其他其他Linux发行版可用,将在未来做进一步适配和调优 - MacOS 自定义图标与速率显示推荐图标尺寸为 256x256。其他尺寸(可能)会导致不正常图标和速率间隙 - MacOS 下 墙贴主要为浅色,Tray 图标深色时图标闪烁;彩色 Tray 速率颜色淡 - Linux 下 Clash Verge Rev 内存占用显著高于 Windows / MacOS ### 2.2.3 相对于 2.2.2 #### 修复了: - 首页“当前代理”因为重复刷新导致的CPU占用过高的问题 - “开机自启”和“DNS覆写”开关跳动问题 - 自定义托盘图标未能应用更改 - MacOS 自定义托盘图标显示速率时图标和文本间隙过大 - MacOS 托盘速率显示不全 - Linux 在系统服务模式下无法拉起 Mihomo 内核 - 使用异步操作,避免获取系统信息和切换代理模式可能带来的崩溃 - 相同节点名称可能导致的页面渲染出错 - URL Schemes被截断的问题 - 首页流量统计卡更好的时间戳范围 - 静默启动无法触发自动轻量化计时器 #### 新增了: - Mihomo(Meta)内核升级至 1.19.4 - Clash Verge Rev 从现在开始不再强依赖系统服务和管理权限 - 支持根据用户偏好选择Sidecar(用户空间)模式或安装服务 - 增加载入初始配置文件的错误提示,防止切换到错误的订阅配置 - 检测是否以管理员模式运行软件,如果是提示无法使用开机自启 - 代理组显示节点数量 - 统一运行模式检测,支持管理员模式下开启TUN模式 - 托盘切换代理模式会根据设置自动断开之前连接 - 如订阅获取失败回退使用Clash内核代理再次尝试 #### 移除了: - 实时保存窗口位置和大小。这个功能可能会导致窗口异常大小和位置,还需观察。 #### 优化了: - 重构了后端内核管理逻辑,更轻量化和有效的管理内核,提高了性能和稳定性 - 前端统一刷新应用数据,优化数据获取和刷新逻辑 - 优化首页流量图表代码,调整图表文字边距 - MacOS 托盘速率更好的显示样式和更新逻辑 - 首页仅在有流量图表时显示流量图表区域 - 更新DNS默认覆写配置 - 移除测试目录,简化资源初始化逻辑 ## v2.2.2 **发行代号:拓** 感谢 Tunglies 对 Verge 后端重构,性能优化做出的重大贡献! 代号释义: 本次发布在功能上的大幅扩展。新首页设计为用户带来全新交互体验,DNS 覆写功能增强网络控制能力,解锁测试页面助力内容访问自由度提升,轻量模式提供灵活使用选择。此外,macOS 应用菜单集成、sidecar 模式、诊断信息导出等新特性进一步丰富了软件的适用场景。这些新增功能显著拓宽了 Clash Verge 的功能边界,为用户提供了更强大的工具和可能性。 #### 已知问题 - 仅在Ubuntu 22.04/24.04,Fedora 41 **Gnome桌面环境** 做过简单测试,不保证其他其他Linux发行版可用,将在未来做进一步适配和调优 ### 2.2.2 相对于 2.2.1(已下架不再提供) #### 修复了: - 弹黑框的问题(原因是服务崩溃触发重装机制) - MacOS进入轻量模式以后隐藏Dock图标 - 增加轻量模式缺失的tray翻译 - Linux下的窗口边框被削掉的问题 #### 新增了: - 加强服务检测和重装逻辑 - 增强内核与服务保活机制 - 增加服务模式下的僵尸进程清理机制 - 新增当服务模式多次尝试失败后自动回退至用户空间模式 ### 2.2.1 相对于 2.2.0(已下架不再提供) #### 修复了: 1. **首页** - 修复 Direct 模式首页无法渲染 - 修复 首页启用轻量模式导致 ClashVergeRev 从托盘退出 - 修复 系统代理标识判断不准的问题 - 修复 系统代理地址错误的问题 - 代理模式“多余的切换动画” 2. **系统** - 修复 MacOS 无法使用快捷键粘贴/选择/复制订阅地址。 - 修复 代理端口设置同步问题。 - 修复 Linux 无法与 Mihomo 核心 和 ClashVergeRev 服务通信 3. **界面** - 修复 连接详情卡没有跟随主题色 4. **轻量模式** - 修复 MacOS 轻量模式下 Dock 栏图标无法隐藏。 #### 新增了: 1. **首页** - 首页文本过长自动截断 2. **轻量模式** - 新增托盘进入轻量模式支持 - 新增进入轻量模式快捷键支持 3. **系统** - 在 ClashVergeRev 对 Mihomo 进行操作时,总是尝试确保两者运行 - 服务器模式下启动mihomo内核的时候查找并停止其他已经存在的内核进程,防止内核假死等问题带来的通信失败 4. **托盘** - 新增 MacOS 启用托盘速率显示时,可选隐藏托盘图标显示 --- ## 2.2.0(已下架不再提供) #### 新增功能 1. **首页** - 新增首页功能,默认启动页面改为首页。 - 首页流量图卡片显示上传/下载名称。 - 首页支持轻量模式切换。 - 流量统计数据持久保存。 - 限制首页配置文件卡片URL长度。 2. **DNS 设置与覆写** - 新增 DNS 覆写功能。 - 默认启用 DNS 覆写。 3. **解锁测试** - 新增解锁测试页面。 4. **轻量模式** - 新增轻量模式及设置。 - 添加自动轻量模式定时器。 5. **系统支持** - Mihomo(meta)内核升级 1.19.3 - macOS 支持 CMD+W 关闭窗口。 - 新增 macOS 应用菜单。 - 添加 macOS 安装服务时候的管理员权限提示。 - 新增 sidecar(用户空间启动内核) 模式。 6. **其他** - 增强延迟测试日志和错误处理。 - 添加诊断信息导出。 - 新增代理命令。 #### 修复 1. **系统** - 修复 Windows 热键崩溃。 - 修复 macOS 无框标题。 - 修复 macOS 静默启动崩溃。 - 修复 macOS tray图标错位到左上角的问题。 - 修复 Windows/Linux 运行时崩溃。 - 修复 Win10 阴影和边框问题。 - 修复 升级或重装后开机自启状态检测和同步问题。 2. **构建** - 修复构建失败问题。 #### 优化 1. **性能** - 重构后端,巨幅性能优化。 - 优化首页组件性能。 - 优化流量图表资源使用。 - 提升代理组列表滚动性能。 - 加快应用退出速度。 - 加快进入轻量模式速度。 - 优化小数值速度更新。 - 增加请求超时至 60 秒。 - 修复代理节点选择同步。 - 优化修改verge配置性能。 2. **重构** - 重构后端,巨幅性能优化。 - 优化定时器管理。 - 重构 MihomoManager 处理流量。 - 优化 WebSocket 连接。 3. **其他** - 更新依赖。 - 默认 TUN 堆栈改为 gvisor。 --- ## v2.1.2 **发行代号:臻** 代号释义: 千锤百炼臻至善,集性能跃升、功能拓展、交互焕新于一体,彰显持续打磨、全方位优化的迭代精神。 感谢 Tychristine 对社区群组管理做出的重大贡献! ##### 2.1.2相对2.1.1(已下架不再提供)更新了: - 无法更新和签名验证失败的问题(该死的CDN缓存) - 设置菜单区分Verge基本设置和高级设置 - 增加v2 Updater的更多功能和权限 - 退出Verge后Tun代理状态仍保留的问题 ##### 2.1.1相对2.1.0(已下架不再提供)更新了: - 检测所需的Clash Verge Service版本(杀毒软件误报可能与此有关,因为检测和安装新版本Service需管理员权限) - MacOS下支持彩色托盘图标和更好速率显示(感谢Tunglies) - 文件类型判断不准导致脚本检测报错的问题 - 打开Win下的阴影(Win10因底层兼容性问题,可能圆角和边框显示不太完美) - 边框去白边 - 修复Linux下编译问题 - 修复热键无法关闭面板的问题 ##### 2.1.0 - 发行代号:臻 ### 功能新增 - 新增窗口状态实时监控与自动保存功能 - 增强核心配置变更时的验证与错误处理机制 - 支持通过环境变量`CLASH_VERGE_REV_IP`自定义复制IP地址 - 添加连接表列宽持久化设置与进程过滤功能 - 新增代理组首字母导航与动态滚动定位功能 - 实现连接追踪暂停/恢复功能 - 支持从托盘菜单快速切换代理配置 - 添加轻量级模式开关选项 - 允许用户自定义TUN模式增强类型和FakeIP范围 - 新增系统代理状态指示器 - 增加Alpha版本自动重命名逻辑 - 优化字母导航工具提示与防抖交互机制 ### 性能优化 - 重构代理列表渲染逻辑,提升布局计算效率 - 优化代理数据更新机制,采用乐观UI策略 - 改进虚拟列表渲染性能(Virtuoso) - 提升主窗口Clash模式切换速度(感谢Tunglies) - 加速内核关闭流程并优化管理逻辑 - 优化节点延迟刷新速率 - 改进托盘网速显示更新逻辑 - 提升配置验证错误信息的可读性 - 重构服务架构,优化代码组织结构(感谢Tunglies) - 优化内核启动时的配置验证流程 ### 问题修复 - 修复删除节点时关联组信息残留问题 - 解决菜单切换异常与重复勾选问题 - 修正连接页流量计算错误 - 修复Windows圆角显示异常问题 - 解决控制台废弃API警告 - 修复全局热键空值导致的崩溃 - 修复Alpha版本Windows打包重命名问题 - 修复MacOS端口切换崩溃问题 - 解决Linux持续集成更新器问题 - 修复静默启动后热键失效问题 - 修正TypeScript代理组类型定义 - 修复Windows托盘图标空白问题 - 优化远程目标地址显示(替换旧版IP展示) ### 交互体验 - 统一多平台托盘图标点击行为 - 优化代理列表滚动流畅度 - 改进日志搜索功能与数据管理 - 重构热键管理逻辑,修复托盘冻结问题 - 优化托盘网速显示样式 - 增强字母导航工具提示的动态响应 ### 国际化 - 新增配置检查多语言支持 - 添加轻量级模式多语言文本 - 完善多语言翻译内容 ### 维护更新 - 将默认TUN协议栈改为gVisor - 更新Node.js运行版本 - 移除自动生成更新器文件 - 清理废弃代码与未使用组件 - 禁用工作流自动Alpha标签更新 - 更新依赖库版本 - 添加MacOS格式转换函数专项测试 - 优化开发模式日志输出 ### 安全增强 - 强化应用启动时的配置验证机制 - 改进脚本验证与异常处理流程 - 修复编译警告(移除无用导入) --- ## v2.0.3 ### Notice - !!使用出现异常的,打开设置-->配置目录 备份 后 删除所有文件 尝试是否正常!! - 历时3个月的紧密开发与严格测试稳定版2.0.0终于发布了:巨量改进与性能、稳定性提升,目前Clash Verge Rev已经有了比肩cfw的健壮性;而且更强大易用! - 由于更改了服务安装逻辑,每次更新安装需要输入系统密码卸载老版本服务和安装新版本服务,以后可以丝滑使用tun(虚拟网卡)模式 ### 2.0.3相对于2.0.2改进修复了: 1. 修复VLess-URL识别网络类型错误 f400f90 #2126 2. 新增系统代理绕过文本校验 c71e18e 3. 修复脚本编辑器UI显示不正确 6197249 #2267 4. 修复Shift热键无效 589324b #2278 5. 新增nushell环境变量复制 d233a84 6. 修复全局扩展脚本无法覆写DNS d22b37c #2235 7. 切换到系统代理相对于稳定的版本 38745d4 8. 修改fake-ip-range网段 0e3b631 9. 修复窗口隐藏后WebSocket未断开连接,减小内存风险 b42d13f 10. 改进系统代理绕过设置 c5c840d 11. 修复i18n翻译文本缺失 b149084 12. 修复双击托盘图标打开面板 f839d3b #2346 13. 修复Windows10窗口白色边框 4f6ca40 #2425 14. 修复Windows窗口状态恢复 4f6ca40 15. 改进保存配置文件自动重启Mihomo内核 0669f7a 16. 改进更新托盘图标性能 d9291d4 17. 修复保存配置后代理列表未更新 542baf9 #2460 18. 新增MacOS托盘显示实时速率,可在"界面设置"中关闭 1b2f1b6 19. 新增托盘菜单显示已设置的快捷键 eeff4d4 20. 新增重载配置文件错误响应"400"时显示更多错误信息 c5989d2 #2492 21. 修复GUI代理状态与菜单显示不一致 13b63b5 #2502 22. 新增默认语言跟随系统语言(无语言支持即为英语),添加了阿拉伯语、印尼语、鞑靼语支持 9655f77 #2940 ### Features - Meta(mihomo)内核升级 1.19.1 - 增加更多语言和托盘语言跟随 - MacOS增加状态栏速率显示 - 托盘显示快捷键 - 重载配置文件错误响应"400"时显示更多错误信息 - 改进保存配置文件自动重启Mihomo内核 ### Performance - 改进更新托盘图标性能 - 窗口隐藏后WebSocket断开连接 --- ## v2.0.2 ### Notice - !!使用出现异常的,打开设置-->配置目录 备份 后 删除所有文件 尝试是否正常!! - 历时3个月的紧密开发与严格测试稳定版2.0.0终于发布了:巨量改进与性能、稳定性提升,目前Clash Verge Rev已经有了比肩cfw的健壮性;而且更强大易用! - 由于更改了服务安装逻辑,Mac/Linux 首次安装需要输入系统密码卸载和安装服务,以后可以丝滑使用 tun(虚拟网卡)模式 - 因 Tauri 2.0 底层 bug,关闭窗口后保留webview进程,优点是再次打开面板更快,缺点是内存使用略有增加 ### 2.0.2相对于2.0.1改进了: - MacOS 下自定义图标可以支持彩色、单色切换 - 修正了 Linux 下多个内核僵尸进程的问题 - 修正了 DNS ipv6 强制覆盖的逻辑 - 修改了 MacOS tun 模式下覆盖设置 dns 字段的问题 - 修正了 MacOS tray 图标不会随代理模式更改的问题 - 静默启动下重复运行会出现多个实例的bug - 安装的时候自动删除历史残留启动项 - Tun模式默认是还用内核推荐的 mixed 堆栈 - 改进了默认窗口大小(启动软件窗口不会那么小了) - 改进了 WebDAV 备份超时时间机制 - 测试菜单添加滚动条 - 改进和修正了 Tun 模式下对设置的覆盖逻辑 - 修复了打开配置出错的问题 - 修复了配置文件无法拖拽添加的问题 - 改善了浅色模式的对比度 ### 2.0.1相对于2.0.0改进了: - 无法从 2.0rc和2.0.0 升级的问题(已经安装了2.0版本的需手动下载安装) - MacOS 系统下少有的无法安装服务,无法启动的问题,目前更健壮了 - 当系统中没有 yaml 编辑器的情况下,打开文件程序崩溃的问题 - Windows 应用内升级和覆盖安装不会删除老执行文件的问题 - 修改优化了 mac 下 fakeip 段和 dns - 测试菜单 svg 图标格式检查 - 应用内升级重复安装 vs runtime 的问题 - 修复外部控制下密码有特殊字符认证出错的问题 - 修复恢复 Webdav 备份设置后, Webdav 设置丢失的问题 - 代理页面增加快速回到顶部的按钮 ### Breaking changes - 重大框架升级:使用 Tauri 2.0(巨量改进与性能提升) - 出现 bug 到 issues 中提出;以后不再接受1.x版本的bug反馈。 - 强烈建议完全删除 1.x 老版本再安装此版本 !!使用出现异常的,打开设置-->配置目录 备份 后 删除所有文件 尝试是否正常!! ### Features - Meta(mihomo)内核升级 1.18.10 - Win 下的系统代理替换为 Shadowsocks/CFW/v2rayN 等成熟的 sysproxy.exe 方案,解决拨号/VPN 环境下无法设置系统代理的问题 - 服务模式改进为启动软件时自动安装,TUN 模式可自由开启不再限制于服务模式 - Mac 下可用 URL Scheme 导入订阅 - 可使用 Ctrl(cmd)+Q 快捷键退出程序 - 成功导入订阅的提示消息 - 能自动选中新导入的订阅 - 日志加入颜色区分 - 改进多处文本表述 - 加入图标 svg 格式检测 - 增加更多 app 调试日志 - 添加 MacOS 下白色桌面的 tray 黑色配色(但会代理系统代理、tun 模式图标失效的问题) - 增加 Webdav 备份功能 - 添加统一延迟的设置开关 - 添加 Windows 下自动检测并下载 vc runtime 的功能 - 支持显示 mux 和 mptcp 的节点标识 - 延迟测试连接更换 http 的 cp.cloudflare.com/generate_204 (关闭统一延迟的情况下延迟测试结果会有所增加) - 重构日志记录逻辑,可以收集和筛选所有日志类型了(之前无法记录debug的日志类型) ### Performance - 优化及重构内核启动管理逻辑 - 优化 TUN 启动逻辑 - 重构和优化 app_handle - 重构系统代理绕过逻辑 - 移除无用的 PID 创建逻辑 - 优化系统 DNS 设置逻辑 - 后端实现窗口控制 - 重构 MacOS 下的 DNS 设置逻辑 ### Bugs Fixes - 修复已有多个订阅导入新订阅会跳选订阅的问题 - 修复多个 Linux 下的 bug, Tun 模式在 Linux 下目前工作正常 - 修复 Linux wayland 下任务栏图标缺失的问题 - 修复 Linux KDE 桌面环境无法启动的问题 - 移除多余退出变量和钩子 - 修复 MacOS 下 tray 菜单重启 app 失效的问题 - 修复某些特定配置文件载入失败的问题 - 修复 MacOS 下 tun 模式 fakeip 不生效的问题 - 修复 Linux 下 关闭 tun 模式文件报错的问题 - 修复快捷键设置的相关 bug - 修复 Win 下点左键菜单闪现的问题(Mac 下的操作逻辑相反,默认情况下不管点左/右键均会打开菜单,闪现不属于 bug) ### Known issues - Windows 下窗口大小无法记忆(等待上游修复) - Webdav 备份因为安全性和兼容性问题,暂不支持跨平台配置同步 --- ## v1.7.7 ### Bugs Fixes - 修复导入订阅没有自动重载(不显示节点)的问题 - 英语状态下修复 Windows 工具栏提示文本超过限制的问题 --- ## v1.7.6 ### Notice - Clash Verge Rev 目前已进入稳定周期,日后更新将着重于 bug 修复与内核常规升级 ### Features - Meta(mihomo)内核升级 1.18.7 - 界面细节调整 - 优化服务模式安装逻辑 - 移除无用的 console log - 能自动选择第一个订阅 ### Bugs Fixes - 修复服务模式安装问题 - 修复 Mac 下的代理绕过 CIDR 写法过滤 - 修复 32 位升级 URL - 修复不同分组 URL 测试地址配置无效的问题 - 修复 Web UI 下的一处 hostname 参数 --- ## v1.7.5 ### Features - 展示局域网 IP 地址信息 - 在设置页面直接复制环境变量 - 优化服务模式安装逻辑 ### Performance - 优化切换订阅速度 - 优化更改端口速度 ### Bugs Fixes - 调整 MacOS 托盘图标大小 - Trojan URI 解析错误 - 卡片拖动显示层级错误 - 代理绕过格式检查错误 - MacOS 下编辑器最大化失败 - MacOS 服务安装失败 - 更改窗口大小导致闪退的问题 --- ## v1.7.3 ### Features - 支持可视化编辑订阅代理组 - 支持可视化编辑订阅节点 - 支持可视化编辑订阅规则 - 扩展脚本支持订阅名称参数 `function main(config, profileName)` ### Bugs Fixes - 代理绕过格式检查错误 --- ## v1.7.2 ### Break Changes - 更新后请务必重新导入所有订阅,包括 Remote 和 Local - 此版本重构了 Merge/Script,更新前请先备份好自定义 Merge 和 Script(更新并不会删除配置文件,但是旧版 Merge 和 Script 在更新后无法从前端访问,备份以防万一) - Merge 改名为 `扩展配置`,分为 `全局扩展配置` 和 `订阅扩展配置`,全局扩展配置对所有订阅生效,订阅扩展配置只对关联的订阅生效 - Script 改名为 `扩展脚本`,同样分为 `全局扩展脚本` 和 `订阅扩展脚本` - 订阅扩展配置在订阅右键菜单里进入 - 执行优先级为: 全局扩展配置 -> 全局扩展脚本 -> 订阅扩展配置 ->订阅扩展脚本 - 扩展配置删除了 `prepend/append` 能力,请使用 右键订阅 -> `编辑规则`/`编辑节点`/`编辑代理组` 来代替 - MacOS 用户更新后请重新安装服务模式 ### Features - 升级内核到 1.18.6 - 移除内核授权,改为服务模式实现 - 自动填充本地订阅名称 - 添加重大更新处理逻辑 - 订阅单独指定扩展配置/脚本(需要重新导入订阅) - 添加可视化规则编辑器(需要重新导入订阅) - 编辑器新增工具栏按钮(格式化、最大化/最小化) - WEBUI 使用最新版 metacubex,并解决无法自动登陆问问题 - 禁用部分 Webview2 快捷键 - 热键配置新增连接符 + 号 - 新增部分悬浮提示按钮,用于解释说明 - 当日志等级为`Debug`时(更改需重启软件生效),支持点击内存主动内存回收(绿色文字) - 设置页面右上角新增 TG 频道链接 - 各种细节优化和界面性能优化 ### Bugs Fixes - 修复代理绕过格式检查 - 通过进程名称关闭进程 - 退出软件时恢复 DNS 设置 - 修复创建本地订阅时更新间隔无法保存 - 连接页面列宽无法调整 --- ## v1.7.1 ### Break Changes - 更新后请务必重新导入所有订阅,包括 Remote 和 Local - 此版本重构了 Merge/Script,更新前请先备份好自定义 Merge 和 Script(更新并不会删除配置文件,但是旧版 Merge 和 Script 在更新后无法从前端访问,备份以防万一) - Merge 改名为 `扩展配置`,分为 `全局扩展配置` 和 `订阅扩展配置`,全局扩展配置对所有订阅生效,订阅扩展配置只对关联的订阅生效 - Script 改名为 `扩展脚本`,同样分为 `全局扩展脚本` 和 `订阅扩展脚本` - 订阅扩展配置在订阅右键菜单里进入 - 执行优先级为: 全局扩展配置 -> 全局扩展脚本 -> 订阅扩展配置 ->订阅扩展脚本 - 扩展配置删除了 `prepend/append` 能力,请使用 右键订阅 -> `编辑规则`/`编辑节点`/`编辑代理组` 来代替 - MacOS 用户更新后请重新安装服务模式 ### Features - 升级内核到 1.18.6 - 移除内核授权,改为服务模式实现 - 自动填充本地订阅名称 - 添加重大更新处理逻辑 - 订阅单独指定扩展配置/脚本(需要重新导入订阅) - 添加可视化规则编辑器(需要重新导入订阅) - 编辑器新增工具栏按钮(格式化、最大化/最小化) - WEBUI 使用最新版 metacubex,并解决无法自动登陆问问题 - 禁用部分 Webview2 快捷键 - 热键配置新增连接符 + 号 - 新增部分悬浮提示按钮,用于解释说明 - 当日志等级为`Debug`时(更改需重启软件生效),支持点击内存主动内存回收(绿色文字) - 设置页面右上角新增 TG 频道链接 - 各种细节优化和界面性能优化 ### Bugs Fixes - 修复代理绕过格式检查 - 通过进程名称关闭进程 - 退出软件时恢复 DNS 设置 - 修复创建本地订阅时更新间隔无法保存 - 连接页面列宽无法调整 --- ## v1.7.0 ### Break Changes - 此版本重构了 Merge/Script,更新前请先备份好自定义 Merge 和 Script(更新并不会删除配置文件,但是旧版 Merge 和 Script 在更新后无法从前端访问,备份以防万一) - Merge 改名为 `扩展配置`,分为 `全局扩展配置` 和 `订阅扩展配置`,全局扩展配置对所有订阅生效,订阅扩展配置只对关联的订阅生效 - Script 改名为 `扩展脚本`,同样分为 `全局扩展脚本` 和 `订阅扩展脚本` - 执行优先级为: 全局扩展配置 -> 全局扩展脚本 -> 订阅扩展配置 ->订阅扩展脚本 - MacOS 用户更新后请重新安装服务模式 ### Features - 移除内核授权,改为服务模式实现 - 自动填充本地订阅名称 - 添加重大更新处理逻辑 - 订阅单独指定扩展配置/脚本(需要重新导入订阅) - 添加可视化规则编辑器(需要重新导入订阅) - 编辑器新增工具栏按钮(格式化、最大化/最小化) - WEBUI 使用最新版 metacubex,并解决无法自动登陆问问题 - 禁用部分 Webview2 快捷键 - 热键配置新增连接符 + 号 - 新增部分悬浮提示按钮,用于解释说明 - 当日志等级为`Debug`时(更改需重启软件生效),支持点击内存主动内存回收(绿色文字) - 设置页面右上角新增 TG 频道链接 ### Bugs Fixes - 修复代理绕过格式检查 - 通过进程名称关闭进程 - 退出软件时恢复 DNS 设置 - 修复创建本地订阅时更新间隔无法保存 - 连接页面列宽无法调整 --- ## v1.6.6 ### Features - MacOS 应用签名 - 删除 AppImage - 应用更新对话框添加下载按钮 - 设置系统代理绕过时保留默认值 - 系统代理绕过设置输入格式检查 ### Bugs Fixes - MacOS 代理组图标无法显示 - RPM 包依赖缺失 --- ## v1.6.5 ### Features - 添加 RPM 包支持 - 优化细节 ### Bugs Fixes - MacOS 10.15 编辑器空白的问题 - MacOS 低版本启动白屏的问题 --- ## v1.6.4 ### Features - 系统代理支持 PAC 模式 - 允许关闭不使用的端口 - 使用新的应用图标 - MacOS 支持切换托盘图标单色/彩色模式 - CSS 注入支持通过编辑器编辑 - 优化代理组列表性能 - 优化流量图显性能 - 支持波斯语 ### Bugs Fixes - Kill 内核后 Tun 开启缓慢的问题 - 代理绕过为空时使用默认值 - 无法读取剪切板内容 - Windows 下覆盖安装无法内核占用问题 --- ## v1.6.2 ### Features - 支持本地文件拖拽导入 - 重新支持 32 位 CPU - 新增内置 Webview2 版本 - 优化 Merge 逻辑,支持深度合并 - 删除 Merge 配置中的 append/prepend-provider 字段 - 支持更新稳定版内核 ### Bugs Fixes - MacOS DNS 还原失败 - CMD 环境变量格式错误 - Linux 下与 N 卡的兼容性问题 - 修改 Tun 设置不立即生效 --- ## v1.6.1 ### Features - 鼠标悬浮显示当前订阅的名称 [#938](https://github.com/clash-verge-rev/clash-verge-rev/pull/938) - 日志过滤支持正则表达式 [#959](https://github.com/clash-verge-rev/clash-verge-rev/pull/959) - 更新 Clash 内核到 1.18.4 ### Bugs Fixes - 修复 Linux KDE 环境下系统代理无法开启的问题 - 窗口最大化图标调整 [#924](https://github.com/clash-verge-rev/clash-verge-rev/pull/924) - 修改 MacOS 托盘点击行为(左键菜单,右键点击事件) - 修复 MacOS 服务模式安装失败的问题 --- ## v1.6.0 ### Features - Meta(mihomo)内核回退 1.18.1(当前新版内核 hy2 协议有 bug,等修复后更新) - 多处界面细节调整 [#724](https://github.com/clash-verge-rev/clash-verge-rev/pull/724) [#799](https://github.com/clash-verge-rev/clash-verge-rev/pull/799) [#900](https://github.com/clash-verge-rev/clash-verge-rev/pull/900) [#901](https://github.com/clash-verge-rev/clash-verge-rev/pull/901) - Linux 下新增服务模式 - 新增订阅卡片右键可以打开机场首页 - url-test 支持手动选择、节点组 fixed 节点使用角标展示 [#840](https://github.com/clash-verge-rev/clash-verge-rev/pull/840) - Clash 配置、Merge 配置提供 JSON Schema 语法支持、连接界面调整 [#887](https://github.com/clash-verge-rev/clash-verge-rev/pull/887) - 修改 Merge 配置文件默认内容 [#889](https://github.com/clash-verge-rev/clash-verge-rev/pull/889) - 修改 tun 模式默认 mtu 为 1500,老版本升级,需在 tun 模式设置下“重置为默认值”。 - 使用 npm 安装 meta-json-schema [#895](https://github.com/clash-verge-rev/clash-verge-rev/pull/895) - 更新部分翻译 [#904](https://github.com/clash-verge-rev/clash-verge-rev/pull/904) - 支持 ico 格式的任务栏图标 ### Bugs Fixes - 修复 Linux KDE 环境下系统代理无法开启的问题 - 修复延迟检测动画问题 - 窗口最大化图标调整 [#816](https://github.com/clash-verge-rev/clash-verge-rev/pull/816) - 修复 Windows 某些情况下无法安装服务模式 [#822](https://github.com/clash-verge-rev/clash-verge-rev/pull/822) - UI 细节修复 [#821](https://github.com/clash-verge-rev/clash-verge-rev/pull/821) - 修复使用默认编辑器打开配置文件 - 修复内核文件在特定目录也可以更新的问题 [#857](https://github.com/clash-verge-rev/clash-verge-rev/pull/857) - 修复服务模式的安装目录问题 - 修复删除配置文件的“更新间隔”出现的问题 [#907](https://github.com/clash-verge-rev/clash-verge-rev/issues/907) ### 已知问题(历史遗留问题,暂未找到有效解决方案) - MacOS M 芯片下服务模式无法安装;临时解决方案:在内核 ⚙️ 下,手动授权,再打开 tun 模式。 - MacOS 下如果删除过网络配置,会导致无法正常打开系统代理;临时解决方案:使用浏览器代理插件或手动配置系统代理。 - Window 拨号连接下无法正确识别并打开系统代理;临时解决方案:使用浏览器代理插件或使用 tun 模式。 --- ## v1.5.11 ### Features - Meta(mihomo)内核更新 1.18.2 ### Bugs Fixes - 升级图标无法点击的问题 - 卸载时检查安装目录是否为空 - 代理界面图标重合的问题 --- ## v1.5.10 ### Features - 优化 Linux 托盘菜单显示 - 添加透明代理端口设置 - 删除订阅前确认 ### Bugs Fixes - 删除 MacOS 程序坞图标 - Windows 下 service 日志没有清理 - MacOS 无法开启系统代理 --- ## v1.5.9 ### Features - 缓存代理组图标 - 使用`boa_engine` 代替 `rquickjs` - 支持 Linux armv7 ### Bugs Fixes - Windows 首次安装无法点击 - Windows 触摸屏无法拖动 - 规则列表 `REJECT-DROP` 颜色 - MacOS Dock 栏不显示图标 - MacOS 自定义字体无效 - 避免使用空 UA 拉取订阅 --- ## v1.5.8 ### Features - 优化 UI 细节 - Linux 绘制窗口圆角 - 开放 DevTools ### Bugs Fixes - 修复 MacOS 下开启 Tun 内核崩溃的问题 --- ## v1.5.7 ### Features - 优化 UI 各种细节 - 提供菜单栏图标样式切换选项(单色/彩色/禁用) - 添加自动检查更新开关 - MacOS 开启 Tun 模式自动修改 DNS - 调整可拖动区域(尝试修复触摸屏无法拖动的问题) --- ## v1.5.6 ### Features - 全新专属 Verge rev UI 界面 (by @Amnesiash) 及细节调整 - 提供允许无效证书的开关 - 删除不必要的快捷键 - Provider 更新添加动画 - Merge 支持 Provider - 更换订阅框的粘贴按钮,删除默认的"Remote File" Profile 名称 - 链接菜单添加节点显示 ### Bugs Fixes - Linux 下图片显示错误 --- ## v1.5.4 ### Features - 支持自定义托盘图标 - 支持禁用代理组图标 - 代理组显示当前代理 - 修改 `打开面板` 快捷键为`打开/关闭面板` --- ## v1.5.3 ### Features - Tun 设置添加重置按钮 ### Bugs Fixes - Tun 设置项显示错误的问题 - 修改一些默认值 - 启动时不更改启动项设置 --- ## v1.5.2 ### Features - 支持自定义延迟测试超时时间 - 优化 Tun 相关设置 ### Bugs Fixes - Merge 操作出错 - 安装后重启服务 - 修复管理员权限启动时开机启动失效的问题 --- ## v1.5.1 ### Features - 保存窗口最大化状态 - Proxy Provider 显示数量 - 不再提供 32 位安装包(因为 32 位经常出现各种奇怪问题,比如 tun 模式无法开启;现在系统也几乎没有 32 位了) ### Bugs Fixes - 优化设置项名称 - 自定义 GLOBAL 代理组时代理组显示错误的问题 --- ## v1.5.0 ### Features - 删除 Clash 字段过滤功能 - 添加 socks 端口和 http 端口设置 - 升级内核到 1.18.1 ### Bugs Fixes - 修复 32 位版本无法显示流量信息的问题 --- ## v1.4.11 ### Break Changes - 此版本更改了 Windows 安装包安装模式,需要卸载后手动安装,否则无法安装到正确位置 ### Features - 优化了系统代理开启的代码,解决了稀有场景下代理开启卡顿的问题 - 添加 MacOS 下的 debug 日志,以便日后调试稀有场景下 MacOS 下无法开启系统代理的问题 - MacOS 关闭 GUI 时同步杀除后台 GUI [#306](https://github.com/clash-verge-rev/clash-verge-rev/issues/306) ### Bugs Fixes - 解决自动更新时文件占用问题 - 解决稀有场景下系统代理开启失败的问题 - 删除冗余内核代码 --- ## v1.4.10 ### Features - 设置中添加退出按钮 - 支持自定义软件启动页 - 在 Proxy Provider 页面展示订阅信息 - 优化 Provider 支持 ### Bugs Fixes - 更改端口时立即重设系统代理 - 网站测试超时错误 --- ## v1.4.9 ### Features - 支持启动时运行脚本 - 支持代理组显示图标 - 新增测试页面 ### Bugs Fixes - 连接页面时间排序错误 - 连接页面表格宽度优化 --- ## v1.4.8 ### Features - 连接页面总流量显示 ### Bugs Fixes - 连接页面数据排序错误 - 新建订阅时设置更新间隔无效 - Windows 拨号网络无法设置系统代理 - Windows 开启/关闭系统代理延迟(使用注册表即可) - 删除无效的背景模糊选项 --- ## v1.4.7 ### Features - Windows 便携版禁用应用内更新 - 支持代理组 Hidden 选项 - 支持 URL Scheme(MacOS & Linux) --- ## v1.4.6 ### Features - 更新 Clash Meta(mihomo) 内核到 v1.18.0 - 支持 URL Scheme(暂时仅支持 Windows) - 添加窗口置顶按钮 - UI 优化调整 ### Bugs Fixes - 修复一些编译错误 - 获取订阅名称错误 - 订阅信息解析错误 --- ## v1.4.5 ### Features - 更新 MacOS 托盘图标样式(@gxx2778 贡献) ### Bugs Fixes - Windows 下更新时无法覆盖`clash-verge-service.exe`的问题(需要卸载重装一次服务,下次更新生效) - 窗口最大化按钮变化问题 - 窗口尺寸保存错误问题 - 复制环境变量类型无法切换问题 - 某些情况下闪退的问题 - 某些订阅无法导入的问题 --- ## v1.4.4 ### Features - 支持 Windows aarch64(arm64) 版本 - 支持一键更新 GeoData - 支持一键更新 Alpha 内核 - MacOS 支持在系统代理时显示不同的托盘图标 - Linux 支持在系统代理时显示不同的托盘图标 - 优化复制环境变量逻辑 ### Bugs Fixes - 修改 PID 文件的路径 ### Performance - 优化创建窗口的速度 --- ## v1.4.3 ### Break Changes - 更改配置文件路径到标准目录(可以保证卸载时没有残留) - 更改 appid 为 `io.github.clash-verge-rev.clash-verge-rev` - 建议卸载旧版本后再安装新版本,该版本安装后不会使用旧版配置文件,你可以手动将旧版配置文件迁移到新版配置文件目录下 ### Features - 移除页面切换动画 - 更改 Tun 模式托盘图标颜色 - Portable 版本默认使用当前目录作为配置文件目录 - 禁用 Clash 字段过滤时隐藏 Clash 字段选项 - 优化拖拽时光标样式 ### Bugs Fixes - 修复 windows 下更新时没有关闭内核导致的更新失败的问题 - 修复打开文件报错的问题 - 修复 url 导入时无法获取中文配置名称的问题 - 修复 alpha 内核无法显示内存信息的问题 --- ## v1.4.2 ### Features - update clash meta core to mihomo 1.17.0 - support both clash meta stable release and prerelease-alpha release - fixed the problem of not being able to set the system proxy when there is a dial-up link on windows system [#833](https://github.com/zzzgydi/clash-verge/issues/833) - support new clash field - support random mixed port - add windows x86 and linux armv7 support - support disable tray click event - add download progress for updater - support drag to reorder the profile - embed emoji fonts - update depends - improve UI style --- ## v1.4.1 ### Features - update clash meta core to newest 虚空终端(2023.11.23) - delete clash core UI - improve UI - change Logo to original --- ## v1.4.0 ### Features - update clash meta core to newest 虚空终端 - delete clash core, no longer maintain - merge Clash nyanpasu changes - remove delay display different color - use Meta Country.mmdb - update dependencies - small changes here and there --- ## v1.3.8 ### Features - update clash meta core - add default valid keys - adjust the delay display interval and color ### Bug Fixes - fix connections page undefined exception --- ## v1.3.7 ### Features - update clash and clash meta core - profiles page add paste button - subscriptions url textfield use multi lines - set min window size - add check for updates buttons - add open dashboard to the hotkey list ### Bug Fixes - fix profiles page undefined exception --- ## v1.3.6 ### Features - add russian translation - support to show connection detail - support clash meta memory usage display - support proxy provider update ui - update geo data file from meta repo - adjust setting page ### Bug Fixes - center the window when it is out of screen - use `sudo` when `pkexec` not found (Linux) - reconnect websocket when window focus ### Notes - The current version of the Linux installation package is built by Ubuntu 20.04 (Github Action). --- ## v1.3.5 ### Features - update clash core ### Bug Fixes - fix blurry system tray icon (Windows) - fix v1.3.4 wintun.dll not found (Windows) - fix v1.3.4 clash core not found (macOS, Linux) --- ## v1.3.4 ### Features - update clash and clash meta core - optimize traffic graph high CPU usage when window hidden - use polkit to elevate permission (Linux) - support app log level setting - support copy environment variable - overwrite resource file according to file modified - save window size and position ### Bug Fixes - remove fallback group select status - enable context menu on editable element (Windows) --- ## v1.3.3 ### Features - update clash and clash meta core - show tray icon variants in different system proxy status (Windows) - close all connections when mode changed ### Bug Fixes - encode controller secret into uri - error boundary for each page --- ## v1.3.2 ### Features - update clash and clash meta core ### Bug Fixes - fix import url issue - fix profile undefined issue --- ## v1.3.1 ### Features - update clash and clash meta core ### Bug Fixes - fix open url issue - fix appimage path panic - fix grant root permission in macOS - fix linux system proxy default bypass --- ## v1.3.0 ### Features - update clash and clash meta - support opening dir on tray - support updating all profiles with one click - support granting root permission to clash core(Linux, macOS) - support enable/disable clash fields filter, feel free to experience the latest features of Clash Meta ### Bug Fixes - deb add openssl depend(Linux) - fix the AppImage auto launch path(Linux) - fix get the default network service(macOS) - remove the esc key listener in macOS, cmd+w instead(macOS) - fix infinite retry when websocket error --- ## v1.2.3 ### Features - update clash - adjust macOS window style - profile supports UTF8 with BOM ### Bug Fixes - fix selected proxy - fix error log --- ## v1.2.2 ### Features - update clash meta - recover clash core after panic - use system window decorations(Linux) ### Bug Fixes - flush system proxy settings(Windows) - fix parse log panic - fix ui bug --- ## v1.2.1 ### Features - update clash version - proxy groups support multi columns - optimize ui ### Bug Fixes - fix ui websocket connection - adjust delay check concurrency - avoid setting login item repeatedly(macOS) --- ## v1.2.0 ### Features - update clash meta version - support to change external-controller - support to change default latency test URL - close all connections when proxy changed or profile changed - check the config by using the core - increase the robustness of the program - optimize windows service mode (need to reinstall) - optimize ui ### Bug Fixes - invalid hotkey cause panic - invalid theme setting cause panic - fix some other glitches --- ## v1.1.2 ### Features - the system tray follows i18n - change the proxy group ui of global mode - support to update profile with the system proxy/clash proxy - check the remote profile more strictly ### Bug Fixes - use app version as default user agent - the clash not exit in service mode - reset the system proxy when quit the app - fix some other glitches --- ## v1.1.1 ### Features - optimize clash config feedback - hide macOS dock icon - use clash meta compatible version (Linux) ### Bug Fixes - fix some other glitches --- ## v1.1.0 ### Features - add rule page - supports proxy providers delay check - add proxy delay check loading status - supports hotkey/shortcut management - supports displaying connections data in table layout(refer to yacd) ### Bug Fixes - supports yaml merge key in clash config - detect the network interface and set the system proxy(macOS) - fix some other glitches --- ## v1.0.6 ### Features - update clash and clash.meta ### Bug Fixes - only script profile display console - automatic configuration update on demand at launch --- ## v1.0.5 ### Features - reimplement profile enhanced mode with quick-js - optimize the runtime config generation process - support web ui management - support clash field management - support viewing the runtime config - adjust some pages style ### Bug Fixes - fix silent start - fix incorrectly reset system proxy on exit --- ## v1.0.4 ### Features - update clash core and clash meta version - support switch clash mode on system tray - theme mode support follows system ### Bug Fixes - config load error on first use --- ## v1.0.3 ### Features - save some states such as URL test, filter, etc - update clash core and clash-meta core - new icon for macOS --- ## v1.0.2 ### Features - supports for switching clash core - supports release UI processes - supports script mode setting ### Bug Fixes - fix service mode bug (Windows) --- ## v1.0.1 ### Features - adjust default theme settings - reduce gpu usage of traffic graph when hidden - supports more remote profile response header setting - check remote profile data format when imported ### Bug Fixes - service mode install and start issue (Windows) - fix launch panic (Some Windows) --- ## v1.0.0 ### Features - update clash core - optimize traffic graph animation - supports interval update profiles - supports service mode (Windows) ### Bug Fixes - reset system proxy when exit from dock (macOS) - adjust clash dns config process strategy --- ## v0.0.29 ### Features - sort proxy node - custom proxy test url - logs page filter - connections page filter - default user agent for subscription - system tray add tun mode toggle - enable to change the config dir (Windows only) --- ## v0.0.28 ### Features - enable to use clash config fields (UI) ### Bug Fixes - remove the character - fix some icon color --- ## v0.0.27 ### Features - supports custom theme color - tun mode setting control the final config ### Bug Fixes - fix transition flickers (macOS) - reduce proxy page render --- ## v0.0.26 ### Features - silent start - profile editor - profile enhance mode supports more fields - optimize profile enhance mode strategy ### Bug Fixes - fix csp restriction on macOS - window controllers on Linux --- ## v0.0.25 ### Features - update clash core version ### Bug Fixes - app updater error - display window controllers on Linux ### Notes If you can't update the app properly, please consider downloading the latest version from github release. --- ## v0.0.24 ### Features - Connections page - add wintun.dll (Windows) - supports create local profile with selected file (Windows) - system tray enable set system proxy ### Bug Fixes - open dir error - auto launch path (Windows) - fix some clash config error - reduce the impact of the enhanced mode --- ## v0.0.23 ### Features - i18n supports - Remote profile User Agent supports ### Bug Fixes - clash config file case ignore - clash `external-controller` only port ## /docs/preview_dark.png Binary file available at https://raw.githubusercontent.com/clash-verge-rev/clash-verge-rev/refs/heads/main/docs/preview_dark.png ## /docs/preview_light.png Binary file available at https://raw.githubusercontent.com/clash-verge-rev/clash-verge-rev/refs/heads/main/docs/preview_light.png ## /package.json ```json path="/package.json" { "name": "clash-verge", "version": "2.2.4-alpha.2", "license": "GPL-3.0-only", "scripts": { "dev": "cross-env RUST_BACKTRACE=1 tauri dev -f verge-dev", "dev:diff": "cross-env RUST_BACKTRACE=1 tauri dev -f verge-dev", "build": "cross-env NODE_OPTIONS='--max-old-space-size=4096' tauri build", "build:fast": "cross-env NODE_OPTIONS='--max-old-space-size=4096' tauri build -- --profile fast-release", "tauri": "tauri", "web:dev": "vite", "web:build": "tsc --noEmit && vite build", "web:serve": "vite preview", "check": "node scripts/check.mjs", "updater": "node scripts/updater.mjs", "updater-fixed-webview2": "node scripts/updater-fixed-webview2.mjs", "portable": "node scripts/portable.mjs", "portable-fixed-webview2": "node scripts/portable-fixed-webview2.mjs", "fix-alpha-version": "node scripts/fix-alpha_version.mjs", "release-version": "node scripts/release_version.mjs", "release-alpha-version": "node scripts/release-alpha_version.mjs", "prepare": "husky", "clippy": "cargo clippy --manifest-path ./src-tauri/Cargo.toml" }, "dependencies": { "@dnd-kit/core": "^6.3.1", "@dnd-kit/sortable": "^10.0.0", "@dnd-kit/utilities": "^3.2.2", "@emotion/react": "^11.14.0", "@emotion/styled": "^11.14.0", "@juggle/resize-observer": "^3.4.0", "@mui/icons-material": "^6.4.8", "@mui/lab": "6.0.0-beta.25", "@mui/material": "^6.4.8", "@mui/x-data-grid": "^7.28.0", "@tauri-apps/api": "2.2.0", "@tauri-apps/plugin-clipboard-manager": "^2.2.2", "@tauri-apps/plugin-dialog": "^2.2.0", "@tauri-apps/plugin-fs": "^2.2.0", "@tauri-apps/plugin-global-shortcut": "^2.2.0", "@tauri-apps/plugin-notification": "^2.2.2", "@tauri-apps/plugin-process": "^2.2.0", "@tauri-apps/plugin-shell": "2.2.0", "@tauri-apps/plugin-updater": "2.3.0", "@tauri-apps/plugin-window-state": "^2.2.0", "@types/d3-shape": "^3.1.7", "@types/json-schema": "^7.0.15", "ahooks": "^3.8.4", "axios": "^1.8.3", "cli-color": "^2.0.4", "d3-shape": "^3.2.0", "dayjs": "1.11.13", "foxact": "^0.2.44", "glob": "^11.0.1", "i18next": "^24.2.3", "js-base64": "^3.7.7", "js-yaml": "^4.1.0", "lodash-es": "^4.17.21", "monaco-editor": "^0.52.2", "monaco-yaml": "^5.3.1", "nanoid": "^5.1.5", "peggy": "^4.2.0", "react": "^18.3.1", "react-dom": "^18.3.1", "react-error-boundary": "^4.1.2", "react-hook-form": "^7.54.2", "react-i18next": "^13.5.0", "react-markdown": "^9.1.0", "react-monaco-editor": "^0.56.2", "react-router-dom": "^6.30.0", "react-transition-group": "^4.4.5", "react-virtuoso": "^4.12.5", "recharts": "^2.15.1", "sockette": "^2.0.6", "swr": "^2.3.3", "tar": "^7.4.3", "types-pac": "^1.0.3", "zustand": "^5.0.3" }, "devDependencies": { "@actions/github": "^6.0.0", "@tauri-apps/cli": "2.2.7", "@types/js-cookie": "^3.0.6", "@types/js-yaml": "^4.0.9", "@types/lodash-es": "^4.17.12", "@types/react": "^18.3.18", "@types/react-dom": "^18.3.5", "@types/react-transition-group": "^4.4.12", "@vitejs/plugin-legacy": "^6.0.2", "@vitejs/plugin-react": "^4.3.4", "adm-zip": "^0.5.16", "cross-env": "^7.0.3", "https-proxy-agent": "^7.0.6", "husky": "^9.1.7", "meta-json-schema": "^1.19.3", "node-fetch": "^3.3.2", "prettier": "^3.5.3", "pretty-quick": "^4.1.1", "sass": "^1.86.0", "terser": "^5.39.0", "typescript": "^5.8.2", "vite": "^6.2.2", "vite-plugin-monaco-editor": "^1.1.0", "vite-plugin-svgr": "^4.3.0" }, "prettier": { "tabWidth": 2, "semi": true, "singleQuote": false, "endOfLine": "lf" }, "type": "module", "packageManager": "pnpm@9.13.2" } ``` The content has been capped at 50000 tokens, and files over NaN bytes have been omitted. The user could consider applying other filters to refine the result. The better and more specific the context, the better the LLM can follow instructions. If the context seems verbose, the user can refine the filter using uithub. Thank you for using https://uithub.com - Perfect LLM context for any GitHub repo.