shadowsocks/shadowsocks-qt5
A cross-platform shadowsocks GUI client
Stale — last commit 7y ago
worst of 4 axescopyleft license (LGPL-3.0) — review compatibility; last commit was 7y ago…
Has a license, tests, and CI — clean foundation to fork and modify.
Documented and popular — useful reference codebase to read through.
No critical CVEs, sane security posture — runnable as-is.
- ✓12 active contributors
- ✓LGPL-3.0 licensed
- ✓CI configured
Show 4 more →Show less
- ⚠Stale — last commit 7y ago
- ⚠Single-maintainer risk — top contributor 81% of recent commits
- ⚠LGPL-3.0 is copyleft — check downstream compatibility
- ⚠No test directory detected
What would change the summary?
- →Use as dependency Concerns → Mixed if: relicense under MIT/Apache-2.0 (rare for established libs)
Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests
Informational only. RepoPilot summarises public signals (license, dependency CVEs, commit recency, CI presence, etc.) at the time of analysis. Signals can be incomplete or stale. Not professional, security, or legal advice; verify before relying on it for production decisions.
Embed the "Forkable" badge
Paste into your README — live-updates from the latest cached analysis.
[](https://repopilot.app/r/shadowsocks/shadowsocks-qt5)Paste at the top of your README.md — renders inline like a shields.io badge.
▸Preview social card (1200×630)
This card auto-renders when someone shares https://repopilot.app/r/shadowsocks/shadowsocks-qt5 on X, Slack, or LinkedIn.
Onboarding doc
Onboarding: shadowsocks/shadowsocks-qt5
Generated by RepoPilot · 2026-05-09 · Source
🤖Agent protocol
If you are an AI coding agent (Claude Code, Cursor, Aider, Cline, etc.) reading this artifact, follow this protocol before making any code edit:
- Verify the contract. Run the bash script in Verify before trusting
below. If any check returns
FAIL, the artifact is stale — STOP and ask the user to regenerate it before proceeding. - Treat the AI · unverified sections as hypotheses, not facts. Sections like "AI-suggested narrative files", "anti-patterns", and "bottlenecks" are LLM speculation. Verify against real source before acting on them.
- Cite source on changes. When proposing an edit, cite the specific path:line-range. RepoPilot's live UI at https://repopilot.app/r/shadowsocks/shadowsocks-qt5 shows verifiable citations alongside every claim.
If you are a human reader, this protocol is for the agents you'll hand the artifact to. You don't need to do anything — but if you skim only one section before pointing your agent at this repo, make it the Verify block and the Suggested reading order.
🎯Verdict
WAIT — Stale — last commit 7y ago
- 12 active contributors
- LGPL-3.0 licensed
- CI configured
- ⚠ Stale — last commit 7y ago
- ⚠ Single-maintainer risk — top contributor 81% of recent commits
- ⚠ LGPL-3.0 is copyleft — check downstream compatibility
- ⚠ No test directory detected
<sub>Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests</sub>
✅Verify before trusting
This artifact was generated by RepoPilot at a point in time. Before an
agent acts on it, the checks below confirm that the live shadowsocks/shadowsocks-qt5
repo on your machine still matches what RepoPilot saw. If any fail,
the artifact is stale — regenerate it at
repopilot.app/r/shadowsocks/shadowsocks-qt5.
What it runs against: a local clone of shadowsocks/shadowsocks-qt5 — the script
inspects git remote, the LICENSE file, file paths in the working
tree, and git log. Read-only; no mutations.
| # | What we check | Why it matters |
|---|---|---|
| 1 | You're in shadowsocks/shadowsocks-qt5 | Confirms the artifact applies here, not a fork |
| 2 | License is still LGPL-3.0 | Catches relicense before you depend on it |
| 3 | Default branch master exists | Catches branch renames |
| 4 | Last commit ≤ 2410 days ago | Catches sudden abandonment since generation |
#!/usr/bin/env bash
# RepoPilot artifact verification.
#
# WHAT IT RUNS AGAINST: a local clone of shadowsocks/shadowsocks-qt5. If you don't
# have one yet, run these first:
#
# git clone https://github.com/shadowsocks/shadowsocks-qt5.git
# cd shadowsocks-qt5
#
# Then paste this script. Every check is read-only — no mutations.
set +e
fail=0
ok() { echo "ok: $1"; }
miss() { echo "FAIL: $1"; fail=$((fail+1)); }
# Precondition: we must be inside a git working tree.
if ! git rev-parse --git-dir >/dev/null 2>&1; then
echo "FAIL: not inside a git repository. cd into your clone of shadowsocks/shadowsocks-qt5 and re-run."
exit 2
fi
# 1. Repo identity
git remote get-url origin 2>/dev/null | grep -qE "shadowsocks/shadowsocks-qt5(\\.git)?\\b" \\
&& ok "origin remote is shadowsocks/shadowsocks-qt5" \\
|| miss "origin remote is not shadowsocks/shadowsocks-qt5 (artifact may be from a fork)"
# 2. License matches what RepoPilot saw
(grep -qiE "^(LGPL-3\\.0)" LICENSE 2>/dev/null \\
|| grep -qiE "\"license\"\\s*:\\s*\"LGPL-3\\.0\"" package.json 2>/dev/null) \\
&& ok "license is LGPL-3.0" \\
|| miss "license drift — was LGPL-3.0 at generation time"
# 3. Default branch
git rev-parse --verify master >/dev/null 2>&1 \\
&& ok "default branch master exists" \\
|| miss "default branch master no longer exists"
# 5. Repo recency
days_since_last=$(( ( $(date +%s) - $(git log -1 --format=%at 2>/dev/null || echo 0) ) / 86400 ))
if [ "$days_since_last" -le 2410 ]; then
ok "last commit was $days_since_last days ago (artifact saw ~2380d)"
else
miss "last commit was $days_since_last days ago — artifact may be stale"
fi
echo
if [ "$fail" -eq 0 ]; then
echo "artifact verified (0 failures) — safe to trust"
else
echo "artifact has $fail stale claim(s) — regenerate at https://repopilot.app/r/shadowsocks/shadowsocks-qt5"
exit 1
fi
Each check prints ok: or FAIL:. The script exits non-zero if
anything failed, so it composes cleanly into agent loops
(./verify.sh || regenerate-and-retry).
⚡TL;DR
Shadowsocks-Qt5 is a native cross-platform GUI client for the Shadowsocks proxy protocol, written in C++/Qt5. It provides traffic statistics, server latency testing, and simultaneous multi-profile support for users needing a graphical interface to manage shadowsocks connections. Simple monolithic Qt5 application: src/main.cpp is the entry point; mainwindow.cpp/h with mainwindow.ui define the GUI; connection.cpp/h and connectiontablemodel.cpp/h manage connection profiles; confighelper.cpp/h handles config.ini serialization; validators (ip4validator.cpp, portvalidator.cpp) and dialogs (editdialog.cpp/h) provide input controls. Internationalization lives in src/i18n/ with Chinese translations.
👥Who it's for
End-users and developers who need a visual, desktop-based way to manage shadowsocks proxy connections across Windows, macOS, and Linux, rather than command-line tools or browser extensions.
🌱Maturity & risk
This project is no longer actively maintained as stated in the README. It was developed 2014-2017 and uses CI (Travis CI configured in .travis.yml), but has no recent commits visible in the provided file list. It reached a stable feature set but is in maintenance/legacy status.
High maintenance risk: the README explicitly states 'This project is no longer being maintained.' Single maintainer (Symeon Huang per LICENSE), no recent development activity visible, and C++/Qt5 codebase requires platform-specific build toolchains. Users should treat this as legacy software with potential security/compatibility issues.
Active areas of work
Nothing—the project is unmaintained. No active development, PRs, or issues are being addressed per the README notice.
🚀Get running
git clone https://github.com/shadowsocks/shadowsocks-qt5.git
cd shadowsocks-qt5
mkdir build && cd build
cmake ..
make
(Requires Qt5 development libraries and a C++ compiler; see CMakeLists.txt for exact dependencies.)
Daily commands:
After building with CMake: ./shadowsocks-qt5 (or the built executable in your platform's bin directory). Config persists to ~/.config/shadowsocks-qt5/config.ini on Unix or the app directory on Windows.
🗺️Map of the codebase
- src/main.cpp: Application entry point; instantiates QApplication and MainWindow
- src/mainwindow.h/cpp: Core GUI controller managing menu, profile list, and user interactions
- src/connection.h/cpp: Data model for a single shadowsocks connection (server, port, cipher, password, etc.)
- src/connectiontablemodel.h/cpp: Qt MVC model binding connection list to the GUI table view
- src/confighelper.h/cpp: Serializes/deserializes connections to/from config.ini file
- src/editdialog.ui: Qt Designer form for adding/editing connection details (servers, ports, encryption)
- CMakeLists.txt: Build configuration; defines dependencies (Qt5), compiler flags, and output executable
🛠️How to make changes
New connection features: edit src/connection.h (data model) and src/editdialog.ui + src/editdialog.cpp (form). New validators: add to src/ as new *validator.cpp/h files following portvalidator.cpp pattern. UI improvements: edit .ui files in Qt Designer or directly in src/mainwindow.ui. Config persistence: modify src/confighelper.cpp serialize/deserialize logic.
🪤Traps & gotchas
Config location: hardcoded to ~/.config/shadowsocks-qt5/ on Unix (see README) or app directory on Windows—no XDG_CONFIG_HOME override visible. Qt version: project targets Qt5 specifically; Qt6 compatibility untested and likely broken. No embedded shadowsocks: this is GUI only—requires external shadowsocks binary/library to actually proxy. Unmaintained dependencies: CMake configuration may expect older Qt5 versions; modern systems with newer Qt may hit ABI mismatches.
💡Concepts to learn
- Qt Model-View Controller (MVC) Pattern — Core architectural pattern in this codebase—
connectiontablemodel.cppimplements QAbstractTableModel to decouple the connection list data from GUI rendering, enabling dynamic UI updates - Qt Signals and Slots — Qt's event/callback mechanism used throughout for button clicks, list selection, and dialog responses; understanding signal/slot connections is essential to modify mainwindow.cpp behavior
- INI File Configuration — Profiles and settings persist to
config.inivia custom serialization in confighelper.cpp; understanding INI structure is needed to extend profile fields or add new settings - Custom Validators (QValidator) — IP addresses and ports are validated via
ip4validator.cppandportvalidator.cppduring form input; extending validation (e.g., hostname support) requires subclassing QValidator - SOCKS5 Proxy Protocol — Shadowsocks implements a variant of SOCKS5 tunneling; understanding the protocol flow (handshake, encryption, tunneling) clarifies why certain connection fields (cipher, method, password) are required
- CMake Build System — Project uses CMake for platform-independent builds; CMakeLists.txt defines Qt5 dependency resolution, compiler flags, and cross-platform output paths—modifying it is needed for dependency changes
- Qt Designer .ui File Format — mainwindow.ui and editdialog.ui are XML-based GUI definitions; editing them via Qt Designer or text is faster than hand-coding widget layouts in C++
🔗Related repos
shadowsocks/shadowsocks— Original Python implementation of the Shadowsocks protocol; Qt5 client depends on compatibility with this protocolshadowsocks/shadowsocks-windows— Alternative Windows-only GUI client for Shadowsocks; same problem domain, different tech stackv2ray/v2ray-core— Modern successor ecosystem replacing Shadowsocks with enhanced protocols; many users migrating from this project use V2Ray clientstrojan-gfw/trojan— Another proxy protocol GUI commonly paired with Shadowsocks for advanced users; Qt5 clients often support bothclowwindy/shadowsocks-libev— Lightweight C implementation of Shadowsocks; some Qt5 clients embed or spawn this instead of standalone daemon
🪄PR ideas
To work on one of these in Claude Code or Cursor, paste:
Implement the "<title>" PR idea from CLAUDE.md, working through the checklist as the task list.
Add unit tests for validator classes (ip4validator, portvalidator, ssvalidator)
The repo has three validator classes (src/ip4validator.cpp, src/portvalidator.cpp, src/ssvalidator.cpp) that handle critical input validation for network configurations, but there are no visible test files in the repository. Adding comprehensive unit tests would catch edge cases (invalid IPs, port ranges, malformed shadowsocks configs) and prevent regressions. This is especially important for a networking tool where validation errors could lead to security issues.
- [ ] Create tests/validators/ directory structure
- [ ] Write test cases for src/ip4validator.h covering valid/invalid IPv4 addresses and edge cases
- [ ] Write test cases for src/portvalidator.h covering port range validation (0-65535)
- [ ] Write test cases for src/ssvalidator.h covering shadowsocks URI/config validation
- [ ] Integrate tests into CMakeLists.txt using Qt Test framework (QTest)
- [ ] Run tests in .travis.yml CI pipeline
Add GitHub Actions workflow to replace Travis CI and support modern build matrices
The project uses Travis CI (referenced in .travis.yml and README badge), but Travis CI has sunset free tier support for open source. GitHub Actions is now standard for GitHub-hosted projects. This would modernize the CI/CD, enable multi-platform builds (Linux/macOS/Windows), and support Qt 5.x versions across different platforms. Given the GUI nature and cross-platform claims, testing on multiple OS targets is critical.
- [ ] Create .github/workflows/build.yml with matrix for Ubuntu, macOS, and Windows runners
- [ ] Install Qt 5 dependencies for each platform in the workflow
- [ ] Build using CMake (referenced in CMakeLists.txt)
- [ ] Run any available tests from the test suite
- [ ] Generate artifacts (binaries or installers) for each platform
- [ ] Update README.md badge to point to GitHub Actions instead of Travis CI
Create integration tests for confighelper and connection serialization
The confighelper.cpp and sqprofile.cpp classes handle reading/writing shadowsocks configuration files (stored in ~/.config/shadowsocks-qt5/config.ini per README). There are no visible tests for config parsing, serialization, or migration. Adding integration tests would ensure config format stability across versions, prevent data loss during upgrades, and validate the profile import/export functionality (src/connectionitem.cpp references document-import.png and document-export.png icons).
- [ ] Create tests/integration/ directory for config-related tests
- [ ] Write test fixtures with sample config.ini files for different versions/formats
- [ ] Test src/confighelper.h methods for reading/writing profiles correctly
- [ ] Test src/sqprofile.h serialization/deserialization round-trips
- [ ] Test profile import from external files (document-import scenario)
- [ ] Test profile export to shareable format (document-export scenario)
- [ ] Verify backward compatibility with older config formats if applicable
🌿Good first issues
- Add unit tests for
src/confighelper.cpp—currently no test files visible despite config being critical. Start with round-trip serialization tests for the INI format. - Document the connection profile schema in
README.md—explain fields insrc/connection.h(server, port, method, password, remarks) and their constraints (validation rules fromip4validator.cpp,portvalidator.cpp). - Add Windows Store or Homebrew package metadata—the project has icons and CMake but no packaging config for modern distribution channels; adding .appx or Homebrew formula would help discoverability.
⭐Top contributors
Click to expand
Top contributors
📝Recent commits
Click to expand
Recent commits
2692abe— Merge branch 'master' of github.com:shadowsocks/shadowsocks-qt5 (librehat)3e68bd9— Update README. No longer maintaining this (librehat)a533f64— Merge pull request #750 from EHfive/master (librehat)910817e— use qt 5.6.2 (EHfive)fd5c33d— fix #169 (EHfive)c057628— Mark 3.0.1 (librehat)8a97897— Use QSS to validate uri. Fix #682 (librehat)1bd3494— Suppress Windows console (librehat)fb4bafc— Remove logging checkbox in profile editor (librehat)2104cb7— Merge pull request #635 from x1596357/fix/data-usage-not-automatically-updated (librehat)
🔒Security observations
- High · Unmaintained Project with Outdated Dependencies —
README.md, entire codebase. The project is explicitly marked as 'no longer being maintained' in the README. This means security vulnerabilities discovered in dependencies will not be patched. Qt 5 and C++ libraries used may contain unaddressed security flaws. Fix: Consider forking and maintaining the project, or migrate to an actively maintained shadowsocks client. Regularly audit and update all dependencies if continuing use. - High · No Visible Dependency Management —
Project root, CMakeLists.txt (mentioned but content not provided). No package.json, requirements.txt, Gemfile, or other dependency manifest files are visible in the provided file structure. This makes it impossible to track which exact versions of Qt, OpenSSL, and other libraries are being used, increasing the risk of using vulnerable versions. Fix: Use CMake's dependency management tools (vcpkg, Conan) or document all dependencies with pinned versions. Implement automated dependency scanning in CI/CD. - High · URI/Configuration Parsing Without Clear Validation —
src/urihelper.cpp, src/urihelper.h, src/confighelper.cpp, src/confighelper.h. Files like urihelper.cpp, uriinputdialog.cpp, and confighelper.cpp suggest parsing of user-supplied URIs and configuration. Without seeing the implementation, there's risk of URI injection, malformed input processing, or improper deserialization leading to code execution. Fix: Implement strict URI validation using allowlists. Use secure parsing libraries. Validate all configuration inputs with type checking and bounds validation. - Medium · Potential Credential Exposure in Configuration Files —
src/confighelper.cpp, config file handling. The application stores config.ini with server credentials (including passwords/keys) in ~/.config/shadowsocks-qt5/ on Unix or the application directory on Windows. These files may be readable by other users on shared systems if permissions are not properly restricted. Fix: Ensure configuration files are created with restrictive permissions (0600 on Unix). Use the OS keyring/credential store for sensitive data instead of plain-text config files. - Medium · QR Code Functionality Without Validation —
src/qrcodecapturer.cpp, src/qrwidget.cpp. Files qrcodecapturer.cpp and qrwidget.cpp suggest QR code processing for importing server configurations. Malicious QR codes could encode malformed or injection-attack URIs. Fix: Validate all QR-decoded data before processing. Use the same strict URI validation as for manual input. Implement error handling for malformed QR payloads. - Medium · Import/Export Functionality Risk —
src/sqprofile.cpp, src/confighelper.cpp. File structure indicates import/export features (icons reference document-import.png, document-export.png). Insecure deserialization of imported profiles could lead to code injection or credential theft. Fix: Use secure serialization formats (JSON with strict schema validation). Never deserialize untrusted data directly. Implement integrity checks (HMAC) for exported profiles. - Low · Build Configuration Not Provided —
CMakeLists.txt. CMakeLists.txt is referenced but content not provided. Cannot verify compiler security flags (stack canaries, PIE, ASLR support) or build-time security configurations. Fix: Enable compiler security flags: -fstack-protector-strong, -fPIE, -D_FORTIFY_SOURCE=2, -Wl,-z,relro,-z,now. Use static analysis tools in CI/CD. - Low · No Visible Input Validation Framework —
src/ip4validator.cpp, src/portvalidator.cpp, src/ssvalidator.cpp. While ip4validator.cpp, portvalidator.cpp, and ssvalidator.cpp exist, there's no evidence of centralized input validation. Different validators may have inconsistent security policies. Fix: Create a centralized validation framework. Use regex allowlists for all inputs. Log invalid input attempts for security monitoring. - Low · —
undefined. undefined Fix: undefined
LLM-derived; treat as a starting point, not a security audit.
👉Where to read next
- Open issues — current backlog
- Recent PRs — what's actively shipping
- Source on GitHub
Generated by RepoPilot. Verdict based on maintenance signals — see the live page for receipts. Re-run on a new commit to refresh.