Thank you for your interest in contributing! This document covers branch conventions, PR requirements, local development setup, and the recommended branch protection configuration for maintainers.
| Type | Pattern | Example |
|---|---|---|
| New feature | feature/<short-description> |
feature/http3-support |
| Bug fix | bugfix/<short-description> |
bugfix/hpack-eviction-overflow |
| Documentation | docs/<short-description> |
docs/vitepress-rfc-pages |
| Refactor | refactor/<short-description> |
refactor/decoder-buffer-reuse |
| Chore / CI | chore/<short-description> |
chore/update-akka-1.5.63 |
Branch names must be lowercase with hyphens. No underscores, no slashes beyond the prefix.
Before opening a PR, verify the following locally:
dotnet build --configuration Release ./src/TurboHTTP.slnThe build must produce zero errors and zero warnings (TreatWarningsAsErrors is enabled).
dotnet test ./src/TurboHTTP.slnRun a specific RFC section to speed up iteration:
# Run only HTTP/2 tests
dotnet test ./src/TurboHTTP.Tests/TurboHTTP.Tests.csproj --filter "FullyQualifiedName~RFC9113"
# Run a specific test class
dotnet test ./src/TurboHTTP.Tests/TurboHTTP.Tests.csproj --filter "FullyQualifiedName~Http2DecoderBasicFrameTests"Slopwatch detects LLM reward-hacking patterns such as disabled tests, suppressed warnings, and empty catch blocks. Run it after any substantive change:
dotnet slopwatch ./src/TurboHTTP.slnThe output must report no issues.
Every PR that changes production code must include corresponding unit tests (and stream tests where applicable). See CLAUDE.md for test conventions and file naming.
- Allman braces — opening brace on its own line
- 4-space indent, no tabs
_fieldNameprefix for private fields- Use
varwhen the type is apparent from the right-hand side - Default to
sealedclasses and records - No
async void,.Result,.GetAwaiter(),.GetResult, or.Wait() - Always pass
CancellationTokenthrough async chains - Always use braces for control structures (even single-line bodies)
# Full test suite
dotnet test ./src/TurboHTTP.sln
# Unit tests only
dotnet test ./src/TurboHTTP.Tests/TurboHTTP.Tests.csproj
# Stream tests only
dotnet test ./src/TurboHTTP.StreamTests/TurboHTTP.StreamTests.csproj
# Filter by RFC
dotnet test ./src/TurboHTTP.Tests/TurboHTTP.Tests.csproj --filter "FullyQualifiedName~RFC9112"
# Filter by display name keyword
dotnet test ./src/TurboHTTP.Tests/TurboHTTP.Tests.csproj --filter "DisplayName~HPACK"Prerequisites: Node.js 20+
cd docs
npm install
npm run docs:devThe dev server starts at http://localhost:5173/.
To build the static site:
npm run docs:build
npm run docs:preview # preview the production build locallyTo regenerate LikeC4 SVG exports (requires the likec4 CLI):
npx likec4 export svg --output docs/public/diagrams docs/likec4This project does not enforce a commit message format, but please keep messages clear and scoped. Prefer:
feat: add HTTP/3 negotiation via ALPN
fix: correct HPACK dynamic table eviction when max-size is zero
docs: add RFC 9111 caching page to VitePress
Open an issue on GitHub before starting work on a significant change. This avoids duplicate effort and lets maintainers give early feedback on the approach.