A high-performance Go reimplementation of subconverter using mihomo for automatic proxy protocol support.
Module: github.com/gfunc/subconvergo
Status: Production-ready for Clash format. Other formats are functional but less thoroughly tested.
# Clone and build
git clone https://github.com/gfunc/subconvergo.git
cd subconvergo
make build
# Run server
./subconvergo
# Server starts on http://localhost:25500
# Test it
curl http://localhost:25500/version- 13 Proxy Protocols: SS, SSR, VMess, VLESS, Trojan, Hysteria, Hysteria2, TUIC, AnyTLS, Snell, WireGuard, SOCKS5, HTTP
- High Performance: Sub-25µs parsing, comprehensive test coverage
- Auto Protocol Updates: New protocols supported via mihomo upgrades
- Full Compatibility: Same API and config format as C++ version
- Production Ready: 50+ tests, comprehensive benchmarks, Docker support
- Extensible: Fallback architecture for future protocols
- Caching System: File-based caching with TTL and stale-while-revalidate support
- Improved Observability: Parser, handler, and generator log contextual info/errors to simplify troubleshooting
- Configuration Reference - Complete config options, filtering, protocols
- API Reference - Endpoints, parameters, supported formats
- Development Guide - Building, testing, architecture, workflow
- Smoke Tests - Detailed guide to the integration test suite
- Feature Parity - Comparison with C++ subconverter
While Subconvergo aims for full compatibility with the C++ version, there are some intentional differences:
- Clash Source Format: By default, Subconvergo ignores the
proxy-groupsandrulesdefined in the source subscription (including Clash configs) to provide a clean slate for the target configuration. This aligns with the C++ version's behavior. You can override this by settingignore_source=falsein the request parameters. - Deduplication: Subconvergo automatically deduplicates proxies and proxy groups to ensure valid configuration output. Duplicate names are suffixed (e.g.,
Proxy_1). - Protocol Parsing: Subconvergo uses
mihomoadapters for parsing, which may have stricter or slightly different validation logic compared to the custom parsers in the C++ version. - Local File URI: Subconvergo supports
file://URIs for subscription sources - Clash Relay Groups: Subconvergo automatically converts deprecated
relayproxy groups into a chain ofdialer-proxyconfigurations usingproxy-providerswhen generating Clash configs. This ensures compatibility with modern Clash/Mihomo versions that have removedrelaysupport.
Coverage: See make coverage for per-package numbers | Status: ✅ All Passing
# Unit tests (fast, no Docker)
make test-unit
# Smoke tests (integration/API with Docker)
make testSee Smoke Tests for details on the integration test suite and parity verification.
- Go 1.25+
- Docker (for smoke tests)
- Python 3.8+ (for smoke tests)
# Install dependencies
go mod download
# Build
make build
# Development mode (auto-reload)
make devThis Go implementation is a drop-in replacement for most use cases.
- Same
base/directory structure - Same configuration format (pref.ini/yml/toml)
- Core API endpoints (
/sub,/version,/readconf,/getprofile,/getruleset,/render) - All proxy protocols (SS, SSR, VMess, Trojan, VLESS, Hysteria, Hysteria2, TUIC, AnyTLS, Snell, WireGuard, etc.)
listparameter (Node List/Proxy Provider output)filenameparameter- QuickJS filter/sort script execution
📖 Complete Feature Parity Status
Contributions welcome! Please ensure:
- ✅ Unit tests pass:
make test-unit - ✅ Smoke tests pass:
make test - ✅ Code formatted:
make fmt
MIT License - See LICENSE file
- mihomo - Proxy protocol support
- subconverter - Original implementation