# Contributing to S-UI Thank you for your interest in contributing to S-UI. This document explains how to set up a development environment, follow project conventions, and submit changes. Your contributions help make the **multi-inbound-per-user** approach and the rest of the project better for everyone. ## Table of Contents - [Code of Conduct](#code-of-conduct) - [Development Environment Setup](#development-environment-setup) - [Coding Conventions and Style Guide](#coding-conventions-and-style-guide) - [Testing](#testing) - [Features That Need Help](#features-that-need-help) - [Pull Request Process](#pull-request-process) - [Adding This Guide in Your Repository](#adding-this-guide-in-your-repository) - [Reporting Bugs and Requesting Features](#reporting-bugs-and-requesting-features) --- ## Code of Conduct Please be respectful and constructive when interacting with maintainers and other contributors. This project is for personal learning and communication; use it responsibly and legally. --- ## Development Environment Setup ### Prerequisites - **Go**: 1.25 or later (see `go.mod` for the exact version). - **Git**: For cloning and submodules. - **C compiler**: Required for CGO (e.g. `gcc`, `musl-dev` on Alpine). - **Node.js** (optional): Only if you plan to work on or rebuild the frontend. The repo can be run with pre-built frontend assets. ### Clone and Submodules ```bash git clone https://github.com/alireza0/s-ui cd s-ui git submodule update --init --recursive ``` The **frontend** lives in a submodule. If you only work on the backend, you can use the existing `web/html` contents or build the frontend once (see below). ### Backend-Only Development (quickest) 1. Build and run with the provided script (builds backend and runs with debug + local DB): ```bash ./runSUI.sh ``` This runs `./build.sh` then `SUI_DB_FOLDER="db" SUI_DEBUG=true ./sui`. 2. Or build manually: ```bash ./build.sh SUI_DB_FOLDER=db SUI_DEBUG=true ./sui ``` Default panel: **http://localhost:2095/app/** (user: `admin`, password: `admin` — change in production). ### Full Stack (Backend + Frontend) 1. **Frontend** (separate repo in submodule): ```bash cd frontend npm install npm run build cd .. ``` 2. **Replace web assets and build backend**: ```bash mkdir -p web/html rm -rf web/html/* cp -R frontend/dist/* web/html/ go build -ldflags "-w -s" -tags "with_quic,with_grpc,with_utls,with_acme,with_gvisor,with_tailscale" -o sui main.go ``` 3. Run: ```bash SUI_DB_FOLDER=db SUI_DEBUG=true ./sui ``` ### Build Tags The backend is built with these tags for full functionality: - `with_quic`, `with_grpc`, `with_utls`, `with_acme`, `with_gvisor`, `with_tailscale` Use the same tags when building locally if you need feature parity with releases. ### Environment Variables (development) | Variable | Description | Example | |----------------|--------------------------------|-----------| | `SUI_DB_FOLDER`| Directory for SQLite DB files | `db` | | `SUI_DEBUG` | Enable debug mode | `true` | | `SUI_LOG_LEVEL`| Log level | `debug` | | `SUI_BIN_FOLDER` | Directory for binaries | `bin` | ### Docker (optional) ```bash git clone https://github.com/alireza0/s-ui cd s-ui git submodule update --init --recursive docker build -t s-ui . # or: docker compose up -d ``` --- ## Coding Conventions and Style Guide ### General - Write clear, maintainable code. Prefer small, focused functions and packages. - Comment non-obvious logic and public APIs. - Handle errors explicitly; avoid ignoring `err` unless intentional. ### Go Style - Follow **standard Go style** and **[Effective Go](https://go.dev/doc/effective_go)**. - Run **gofmt** (or **goimports**) before committing: ```bash gofmt -w . # or: goimports -w . ``` - Use **camelCase** for unexported names and **PascalCase** for exported names. - Keep package names short and lowercase (e.g. `api`, `service`, `util`). - Group imports: standard library, then third-party, then project imports (as in existing files). ### Project Structure Conventions - **`api/`**: HTTP handlers and API routing (e.g. `apiHandler.go`, `apiV2Handler.go`). - **`service/`**: Business logic and panel/core operations. - **`database/model/`**: GORM models and DB entities. - **`util/`**: Shared utilities (e.g. link/sub conversion, JSON). - **`core/`**: sing-box integration and core runtime. - **`sub/`**: Subscription (link/json) handling. When adding new features, place code in the appropriate layer (handler → service → model/util) and avoid circular dependencies. ### Naming and Patterns - Handlers: suffix `Handler` (e.g. `APIHandler`, `APIv2Handler`). - Services: suffix `Service` or use package name (e.g. `ApiService`, `LinkService`). - Models: clear struct names with JSON/gorm tags (see `database/model/`). --- ## Testing ### Current State - The project does not yet have a formal test suite (no `*_test.go` files in the repo). - CI currently focuses on **builds** (e.g. `release.yml`) rather than automated tests. ### What You Can Do Now 1. **Build verification**: Before submitting a PR, ensure the project builds: ```bash go build -ldflags "-w -s" -tags "with_quic,with_grpc,with_utls,with_acme,with_gvisor,with_tailscale" -o sui main.go ``` 2. **Manual testing**: Run with `./runSUI.sh`, test the changed area (panel, API, subscription, etc.). 3. **Future tests**: Contributions that add **unit tests** (e.g. for `util/`, `service/`, or API handlers) or **integration tests** are very welcome. Prefer the standard library `testing` package and table-driven tests where appropriate. ### Running the Linter (optional) ```bash go vet ./... # Optional: staticcheck, golangci-lint, etc. ``` --- ## Features That Need Help Community help is especially valuable in these areas. Check the [Issues](https://github.com/alireza0/s-ui/issues) for current tasks and ideas. ### High-Value Areas - **Multi-inbound per user**: Core differentiator of S-UI; improvements to UX, docs, and robustness are welcome. - **API (v1 and v2)**: Completeness, consistency, and documentation (see [API Documentation](https://github.com/alireza0/s-ui/wiki/API-Documentation)). - **Subscription service**: Link conversion, JSON subscription, and info endpoints (`sub/`, `util/`). - **Testing**: Adding unit and integration tests for critical paths. - **Documentation**: User docs, API examples, and contribution docs (like this file). - **Platform support**: macOS is experimental; Windows and Linux improvements are welcome (see `windows/` and `.github/workflows/`). ### How to Find Tasks - **Good first issue**: Look for issues labeled `good first issue` or `help wanted`. - **Feature requests**: [Feature request template](.github/ISSUE_TEMPLATE/feature_request.md). - **Bugs**: [Bug report template](.github/ISSUE_TEMPLATE/bug_report.md). If you want to work on a larger feature, open an issue first to discuss approach and avoid duplicate work. --- ## Pull Request Process 1. **Fork and branch** - Fork the repository on GitHub. - Create a branch from `main`: e.g. `git checkout -b fix/issue-123` or `feature/sub-improvements`. 2. **Make your changes** - Follow the [Coding Conventions](#coding-conventions-and-style-guide). - Run `gofmt` and ensure the project builds (see [Testing](#testing)). - Keep commits focused and messages clear (e.g. "Fix link conversion for VMess", "Add tests for outJson"). 3. **Push and open a PR** - Push your branch and open a Pull Request against `main`. - Use the PR description to explain: - What problem or feature the PR addresses. - What you changed and how to verify it. - Reference any related issue (e.g. "Fixes #123"). 4. **Review and CI** - Maintainers will review your code. CI (e.g. build workflows) must pass. - Address feedback by pushing new commits to the same branch. 5. **Merge** - Once approved and CI is green, a maintainer will merge your PR. Thank you for contributing! ### PR Guidelines - Prefer **small, reviewable PRs**. Split large features into logical steps. - Avoid unrelated changes (e.g. formatting-only or refactors in a feature PR). - Ensure your branch is up to date with `main` before submitting (rebase or merge as the project prefers). --- ## Adding This Guide in Your Repository If you maintain a fork or your own repository and want the contribution guide to be visible and linked properly: 1. **Keep `CONTRIBUTING.md` in the repository root** GitHub automatically discovers a file named `CONTRIBUTING.md` (or `CONTRIBUTING`) in the root. When someone opens a new issue or pull request, GitHub can show a link to it. The community profile also uses it for the “Contributing” section. 2. **Link from README** Add a short line in your main `README.md` so new contributors see it when they land on the repo, for example: ```markdown **Want to contribute?** See [CONTRIBUTING.md](CONTRIBUTING.md) for development setup, coding conventions, and the pull request process. ``` 3. **Optional: GitHub “Contributing” link** In the repository **Settings → General → Features**, ensure “Issues” (and optionally “Discussions”) are enabled. The link to `CONTRIBUTING.md` appears when users create a new issue or PR; no extra config is needed as long as the file is in the root. 4. **When forking** If you fork S-UI, `CONTRIBUTING.md` is already in the repo. Update the clone URLs and repo names in this file if you want your fork’s contribution instructions to point to your own repository. --- ## Reporting Bugs and Requesting Features - **Bugs**: Use the [bug report template](.github/ISSUE_TEMPLATE/bug_report.md). Include version, OS, steps to reproduce, and expected vs actual behavior. - **Features**: Use the [feature request template](.github/ISSUE_TEMPLATE/feature_request.md). Describe the use case and, if possible, a proposed approach. - **Questions**: Use the [question template](.github/ISSUE_TEMPLATE/question-template.md) or discussions if enabled. --- Thank you for helping S-UI grow. Your contributions make it possible for more users to adopt S-UI in production and benefit from its multi-inbound-per-user design.