Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
70 commits
Select commit Hold shift + click to select a range
1d17c5c
feat(dns): integrate hijacking and fake-IP routing
MFSGA Jul 29, 2026
f452277
feat(nix): add the Chimera NixOS module
MFSGA Jul 29, 2026
7786b28
fix(runtime): harden startup and shutdown lifecycle
MFSGA Jul 29, 2026
8d02680
fix(router): preserve wildcard and matcher behavior
MFSGA Jul 29, 2026
cb00b1a
refactor: resolve baseline clippy warnings
MFSGA Jul 29, 2026
e0ded10
feat(net): route outbound sockets by destination
MFSGA Jul 29, 2026
6cc4c5a
feat(tun): make Linux policy routing transactional
MFSGA Jul 29, 2026
390b8a7
fix(dns): enforce TUN IPv6 capability
MFSGA Jul 29, 2026
5ae5da6
feat(health): add configurable streaming probes
MFSGA Jul 29, 2026
e77c87f
fix(net): handle transient interface state
MFSGA Jul 29, 2026
928903e
fix(nix): improve development and TUN startup
MFSGA Jul 29, 2026
e399b07
fix(vless): preserve streaming state across polls
MFSGA Jul 29, 2026
3ce60b3
feat(net): harden protected socket routing on Windows
MFSGA Jul 29, 2026
0753f5c
fix(hy2): improve address failover and UDP hopping
MFSGA Jul 29, 2026
fbf9c8b
feat(dashboard): add and embed the web control panel
MFSGA Jul 29, 2026
8d88f09
fix(net): bind routes only when TUN is enabled
MFSGA Jul 29, 2026
e418bf8
fix(runtime): keep active services on reload failure
MFSGA Jul 29, 2026
ba61687
fix(http): reject unknown configured outbound
MFSGA Jul 29, 2026
5024254
fix(api): secure controller and LAN proxy access
MFSGA Jul 29, 2026
0215ae1
ci: enforce clash-lib quality gates
MFSGA Jul 29, 2026
a08e150
chore: upgrade
MFSGA Jul 30, 2026
3919a47
fix(clash-lib): satisfy clippy warnings
MFSGA Jul 30, 2026
a51d1db
chore: bump version to v0.24.2
github-actions[bot] Jul 30, 2026
4ea9411
test(runtime): isolate integration test instances
MFSGA Jul 30, 2026
ac8a8fa
fix(api): align core compatibility responses
MFSGA Jul 30, 2026
914a448
test(api): cover smoke and config views
MFSGA Jul 30, 2026
c4a0c57
test(api): cover CORS and reload boundaries
MFSGA Jul 30, 2026
6d65b6b
test(api): cover runtime config updates
MFSGA Jul 30, 2026
6a3fcd7
test(api): cover resources and error responses
MFSGA Jul 30, 2026
9a6071f
test(api): cover providers and delay probes
MFSGA Jul 30, 2026
64a3f2f
test(api): cover selectors and proxy metadata
MFSGA Jul 30, 2026
99118b1
fix(anytls): retain UDP sessions until cancellation
MFSGA Jul 30, 2026
b50fdc7
test(net): cover direct UDP session routing
MFSGA Jul 30, 2026
4921909
test(api): report active proxy chains
MFSGA Jul 30, 2026
eb114bc
feat(ss): add Shadowsocks TCP inbound
MFSGA Jul 30, 2026
ba06f7e
test(ss): cover TCP inbound and user stats
MFSGA Jul 30, 2026
da7533c
nix-add-nodejs-dashboard-build-input
MFSGA Jul 30, 2026
c71dadf
chore: bump version to v0.24.3
github-actions[bot] Aug 1, 2026
e25ace1
feat(shadowsocks): support udp
MFSGA Aug 2, 2026
f34c48e
fix(vless): split oversized Vision frames
MFSGA Aug 12, 2026
665c949
chore: bump version to v0.24.4
github-actions[bot] Aug 12, 2026
d0f097f
feat(dns): reset upstream transports on demand
MFSGA Aug 6, 2026
b14b891
fix(dns): count invalidated transport holders
MFSGA Aug 6, 2026
93ae74e
feat(network): invalidate cached outbound connections
MFSGA Aug 6, 2026
43244db
chore: bump version to v0.24.5
github-actions[bot] Aug 14, 2026
0a24357
fix(hysteria2): terminate UDP sessions on network reset
MFSGA Aug 12, 2026
a20f8b9
test(hysteria2): verify reconnect after network reset
MFSGA Aug 6, 2026
041091e
fix(hysteria2): terminate UDP sessions on network reset
MFSGA Aug 6, 2026
5d09daf
chore: bump version to v0.24.6
github-actions[bot] Aug 14, 2026
ed8c09f
fix(android): bind explicit UDP relay addresses
MFSGA Aug 6, 2026
5a016a1
fix(android): disable Hysteria2 segmentation offload
MFSGA Aug 6, 2026
7c3af31
fix(android): gate platform-specific socket helpers
MFSGA Aug 12, 2026
523e40e
chore: bump version to v0.24.7
github-actions[bot] Aug 14, 2026
b9bb8eb
perf(api): add lightweight connection summary
MFSGA Aug 7, 2026
7d1ee7f
test(api): cover connection summary totals
MFSGA Aug 13, 2026
ec80539
chore: bump version to v0.24.8
github-actions[bot] Aug 16, 2026
5f6b3c3
fix(proxy): handle partial datagram io
MFSGA Sep 2, 2026
20508a1
chore(ref): sync clash-rs reference
MFSGA Sep 2, 2026
ec8ea58
fix(memory): avoid retaining closed flow state
MFSGA Sep 2, 2026
f9011f4
fix(inbound): recover from listener socket errors
MFSGA Sep 2, 2026
b610576
fix(dns): keep fakeip cache mappings consistent
MFSGA Sep 2, 2026
da5b834
fix(transport): reset shadowtls record state
MFSGA Sep 2, 2026
b10391a
feat(memory): configure closed flow history size
MFSGA Sep 2, 2026
8457835
fix(ws): encode websocket request paths
MFSGA Sep 2, 2026
b92bf56
test(vless): lock vision splice command semantics
MFSGA Sep 2, 2026
c140319
fix(urltest): honor tolerance and liveness
MFSGA Sep 2, 2026
ede64fd
fix(config): ignore unknown rule provider fields
MFSGA Sep 2, 2026
a33f2c8
fix(ci): stabilize windows udp integration tests
MFSGA Sep 2, 2026
744a42b
fix(release): handle concurrent master updates
MFSGA Sep 2, 2026
5964a29
chore(deps): bump the actions-dependencies group across 1 directory w…
dependabot[bot] Sep 2, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .envrc
Original file line number Diff line number Diff line change
@@ -1 +1 @@
use flake path:.
use flake
9 changes: 8 additions & 1 deletion .github/dependabot.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -16,4 +16,11 @@ updates:
actions-dependencies:
patterns:
- "*"

- package-ecosystem: "npm"
directory: "/clash-dashboard"
schedule:
interval: monthly
groups:
npm-dependencies:
patterns:
- "*"
90 changes: 83 additions & 7 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,79 @@ env:

# Arm builder https://github.blog/changelog/2024-09-03-github-actions-arm64-linux-and-windows-runners-are-now-generally-available/
jobs:
dashboard:
name: Dashboard
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
- uses: actions/setup-node@v7
with:
node-version: 22
cache: npm
cache-dependency-path: clash-dashboard/package-lock.json
- name: Install dashboard dependencies
working-directory: clash-dashboard
run: npm ci
- name: Lint dashboard
working-directory: clash-dashboard
run: npm run lint
- name: Build dashboard
working-directory: clash-dashboard
run: npm run build
- name: Mark dashboard as prebuilt
run: touch clash-dashboard/dist/chimera-prebuilt.marker
- name: Upload dashboard build
uses: actions/upload-artifact@v7
with:
name: dashboard-dist
path: clash-dashboard/dist/
retention-days: 1

quality:
name: Rust quality (${{ matrix.os }})
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, windows-latest]
steps:
- uses: actions/checkout@v7
with:
submodules: true
- uses: actions/cache@v6
with:
path: |
~/.cargo/registry
~/.cargo/git
~/.cargo/bin/
~/.cargo/registry/index/
~/.cargo/registry/cache/
~/.cargo/git/db/
target
key: quality-${{ matrix.os }}-${{ hashFiles('**/Cargo.toml') }}
restore-keys: quality-${{ matrix.os }}-
- uses: ilammy/setup-nasm@v1
if: runner.os == 'Windows'
- uses: dtolnay/rust-toolchain@master
with:
toolchain: ${{ env.RUSTUP_TOOLCHAIN }}
components: rustfmt,clippy
- name: Install Protoc
uses: arduino/setup-protoc@v3
with:
version: "23.x"
repo-token: ${{ secrets.GITHUB_TOKEN }}
- name: Cargo fmt
if: runner.os == 'Linux'
run: cargo fmt --all -- --check
- name: Cargo clippy
run: cargo clippy -p clash-lib --all-targets --all-features -- -D warnings
- name: Test LAN proxy
run: cargo test -p clash-lib --test lan_proxy_tests --all-features

compile:
name: ${{ matrix.release-name || matrix.target || 'Unknown' }}
needs: [dashboard, quality]
runs-on: ${{ matrix.os || 'ubuntu-latest' }}
strategy:
fail-fast: false
Expand Down Expand Up @@ -107,10 +178,15 @@ jobs:
extra-args: -F "standard"
no-test: true
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v7
with:
submodules: true
- uses: actions/cache@v5
- name: Download dashboard build
uses: actions/download-artifact@v8
with:
name: dashboard-dist
path: clash-dashboard/dist
- uses: actions/cache@v6
with:
path: |
~/.cargo/registry
Expand Down Expand Up @@ -208,15 +284,15 @@ jobs:
uses: actions/upload-artifact@v7
if: ${{ !matrix.no-release }}
with:
name: ${{ matrix.release-name || matrix.target }}
name: binary-${{ matrix.release-name || matrix.target }}
path: ${{ env.PACKAGE }}-${{ matrix.release-name || matrix.target }}${{ matrix.postfix }}

- name: Setup tmate session
if: ${{ failure() }}
if: ${{ failure() && github.actor != 'dependabot[bot]' }}
timeout-minutes: 15
uses: mxschmitt/action-tmate@v3
with:
detached: true
timeout-minutes: 15
limit-access-to-actor: true

release:
Expand All @@ -226,7 +302,7 @@ jobs:
permissions:
contents: write
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v7
with:
fetch-depth: 0
fetch-tags: true
Expand All @@ -235,7 +311,7 @@ jobs:
uses: actions/upload-artifact/merge@v7
with:
name: binaries
pattern: "*"
pattern: "binary-*"
retention-days: 1

- name: Download binaries
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/coverage.yml
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ jobs:
CLASH_DOCKER_TEST: ${{ startsWith(matrix.os, 'ubuntu') && 'true' || 'false' }}

- name: Upload coverage to Codecov
uses: codecov/codecov-action@v6
uses: codecov/codecov-action@v7
with:
token: ${{ secrets.CODECOV_TOKEN }}
files: codecov.json
Expand Down
14 changes: 13 additions & 1 deletion .github/workflows/proxy-throughput-release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ jobs:

steps:
- name: Checkout
uses: actions/checkout@v6
uses: actions/checkout@v7

- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
Expand Down Expand Up @@ -109,6 +109,17 @@ jobs:
e2e_throughput \
-- --test-threads=4 --nocapture 2>&1 | tee throughput-test.log

- name: Run network reset reconnect tests
env:
RUST_LOG: ${{ env.RUST_LOG }}
CLASH_RS_CI: "true"
run: |
set -o pipefail
RUSTFLAGS="--cfg docker_test --cfg throughput_test" \
cargo test -p clash-lib --release --all-features \
proxy::hysteria2::e2e::e2e_network_reset_reauthenticates_hysteria2 \
-- --exact --nocapture 2>&1 | tee network-reset-test.log

- name: Format results as Markdown
if: always()
env:
Expand Down Expand Up @@ -142,6 +153,7 @@ jobs:
${{ env.THROUGHPUT_RESULTS_FILE }}
throughput-comment.md
throughput-test.log
network-reset-test.log
retention-days: 90

- name: Post PR comment
Expand Down
15 changes: 14 additions & 1 deletion .github/workflows/proxy-throughput.yml
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ jobs:

steps:
- name: Checkout
uses: actions/checkout@v6
uses: actions/checkout@v7

- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
Expand Down Expand Up @@ -82,6 +82,7 @@ jobs:
run: |
docker pull v2fly/v2fly-core:v4.45.2
docker pull p4gefau1t/trojan-go:latest
docker pull tobyxdd/hysteria:latest
docker pull nicolaka/netshoot:latest

# Download once so parallel clash-rs instances don't race to fetch it
Expand All @@ -107,6 +108,17 @@ jobs:
e2e_throughput \
-- --test-threads=4 --nocapture 2>&1 | tee throughput-test.log

- name: Run network reset reconnect tests
env:
RUST_LOG: ${{ env.RUST_LOG }}
CLASH_RS_CI: "true"
run: |
set -o pipefail
RUSTFLAGS="--cfg docker_test --cfg throughput_test" \
cargo test -p clash-lib --all-features \
proxy::hysteria2::e2e::e2e_network_reset_reauthenticates_hysteria2 \
-- --exact --nocapture 2>&1 | tee network-reset-test.log

- name: Format results as Markdown
if: always()
env:
Expand Down Expand Up @@ -140,6 +152,7 @@ jobs:
${{ env.THROUGHPUT_RESULTS_FILE }}
throughput-comment.md
throughput-test.log
network-reset-test.log
retention-days: 90

- name: Post PR comment
Expand Down
44 changes: 37 additions & 7 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,18 @@ on:
permissions:
contents: write

concurrency:
group: release
cancel-in-progress: false

jobs:
release:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v7
with:
fetch-depth: 0
ref: master
token: ${{ secrets.ADMIN_PAT }}

- name: Configure Git
Expand All @@ -36,6 +41,11 @@ jobs:
- name: Install cargo-edit
run: cargo install cargo-edit

- name: Sync latest master
run: |
git fetch origin master
git rebase origin/master

- name: Bump version
run: cargo set-version --bump ${{ github.event.inputs.version_type }}

Expand All @@ -51,10 +61,30 @@ jobs:
git add Cargo.toml clash-bin/Cargo.toml clash-dns/Cargo.toml clash-doc/Cargo.toml clash-ffi/Cargo.toml clash-lib/Cargo.toml Cargo.lock
git commit -m "chore: bump version to ${{ steps.version.outputs.version }}"

- name: Create tag
run: git tag ${{ steps.version.outputs.version }}

- name: Push changes
- name: Push release atomically
env:
VERSION: ${{ steps.version.outputs.version }}
run: |
git push origin master
git push origin ${{ steps.version.outputs.version }}
set -euo pipefail

for attempt in 1 2 3 4 5; do
echo "Push attempt $attempt/5"

# The branch may have advanced while this release job was running.
# Rebase the version bump onto the latest master before publishing.
git fetch origin master
git rebase origin/master
git update-ref "refs/tags/$VERSION" HEAD

if git push --atomic origin HEAD:master "refs/tags/$VERSION"; then
exit 0
fi

git update-ref -d "refs/tags/$VERSION" || true
if [ "$attempt" -eq 5 ]; then
echo "Failed to publish release after 5 attempts"
exit 1
fi

sleep $((attempt * 2))
done
4 changes: 2 additions & 2 deletions .github/workflows/spell-check.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,6 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout Actions Repository
uses: actions/checkout@v6
uses: actions/checkout@v7
- name: Spell Check Repo
uses: crate-ci/typos@v1.46.0
uses: crate-ci/typos@v1.50.0
4 changes: 2 additions & 2 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ docs/
start*.*
release*.*

config*.yaml
config*.yaml*

cache.db
scripts/
Expand All @@ -17,4 +17,4 @@ Country.mmdb

geosite.dat

xray*
xray*
Loading
Loading