git clone https://github.com/streamer45/streamkit.git
cd streamkit
just build-ui # build the embedded web UI (required before compiling the server)
just dev # starts backend + frontend with hot reloadPrerequisites: Rust 1.92+, Bun 1.3+, Just
Run just --list to see all available commands.
sudo apt install libopus-dev cmake pkg-config libssl-devThe repo pins the toolchain via rust-toolchain.toml (currently Rust 1.92). Install Rust if you haven't already:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | shcurl -fsSL https://bun.sh/install | bashcargo install justsccache caches compiled crate artifacts by input hash, making rebuilds significantly faster. CI uses it automatically; for local development:
cargo install sccache --locked
export RUSTC_WRAPPER=sccache # add to your shell profileNote: You can also uncomment the
rustc-wrapperline in.cargo/config.tomlto enable it repo-wide instead of via environment variable.
Used by just sweep to prune stale build artifacts without a full cargo clean:
cargo install cargo-sweep --lockedRequired by just lint:
cargo install cargo-deny
pip3 install --user reuse # note: the apt version is too oldRequired by just dev:
cargo install cargo-watchBuilding ML plugins (e.g. whisper, sensevoice) requires additional dependencies:
sudo apt install clang libclang-dev- Create a branch:
git checkout -b feat/my-featureorfix/my-bug - Make your changes
- Run
just testandjust lint - Commit and push
- Open a PR
All commits must be signed off to certify you have the right to submit the code (DCO):
git commit -s -m "feat(nodes): add MP3 decoder"This adds a Signed-off-by: Your Name <email> line. The DCO check will fail on PRs without it.
We use Conventional Commits. Format:
type(scope): description
Types: feat, fix, docs, refactor, perf, test, chore, ci, build
Scopes: core, api, engine, nodes, server, client, ui, plugins
Examples:
feat(nodes): add MP3 decoder
fix(engine): prevent panic on empty input
docs: update README
There's a warning-only commit hook - it won't block you, just nudges you toward the convention.
Rust:
cargo fmtfor formatting- Fix all
cargo clippywarnings - Use
Resulttypes, avoidunwrap()in production code - Add doc comments for public APIs
TypeScript:
- ESLint handles formatting
- Avoid
any- use proper types - Functional components with hooks
- Zustand for global state, React Query for server state
All files need SPDX license headers:
// SPDX-FileCopyrightText: © 2025 StreamKit Contributors
//
// SPDX-License-Identifier: MPL-2.0- Keep PRs focused (one feature/fix per PR)
- Add tests for new functionality
- Update docs if behavior changes
- Use conventional commit format for PR titles (they become squash-merge commits)
- CI must pass: tests, formatting, clippy, TypeScript compilation, license headers
Native plugins (fast, no sandbox): See examples/plugins/gain-native/
WASM plugins (sandboxed, cross-language): See examples/plugins/gain-wasm-rust/ or gain-wasm-go/
Contributions are licensed under MPL-2.0.
- Discord: https://discord.gg/dcvxCzay47
- Questions: Open an issue or use GitHub Discussions