Skip to main content

Contributing to Thermocline

Thank you for considering contributing to Thermocline! Whether you're fixing a typo, reporting a bug, or implementing a major feature, your contribution is valued.

Thermocline is developed and maintained by StronglyAI, Inc., and we believe open source thrives through community collaboration.

Code of Conduct

This project is governed by our Code of Conduct. By participating, you are expected to uphold this code. Please report unacceptable behavior to support@strongly.ai.

Ways to Contribute

ContributionDescription
Bug ReportsOpen an issue with steps to reproduce
Feature RequestsSuggest improvements
CodeSubmit pull requests with fixes or features
DocumentationFix typos, add examples, improve guides
TestingWrite tests, report test failures
CommunityHelp others in Discussions, write blog posts

Finding Something to Work On

Comment on an issue before starting work to avoid duplicate effort and get guidance from maintainers.

Development Setup

Prerequisites

ToolVersionPurpose
Git2.x+Version control
Go1.21+Coordinator, Controller, Operator, CLI
Rust1.75+Storage Engine, Gateway, Query Engine
Docker24.x+Container builds and local testing
kubectl1.26+Kubernetes interaction
Helm3.x+Deployment
MakeAnyBuild automation

Clone and Build

# Fork the repository on GitHub, then:
git clone https://github.com/YOUR_USERNAME/thermocline.git
cd thermocline

# Add upstream remote
git remote add upstream https://github.com/strongly-ai/thermocline.git

# Install dependencies and build
make dev-setup
make build

# Run all tests
make test

# Start local dev environment (Docker Compose)
make dev-up

See the Development Guide for detailed setup instructions.

Making Changes

Branch Naming

Create a branch from main with a descriptive name:

# Sync with upstream
git fetch upstream
git checkout main
git merge upstream/main

# Create your branch
git checkout -b <type>/<short-description>

Branch types: feature/, fix/, docs/, refactor/, test/, chore/

Examples:

  • feature/gcs-storage-adapter
  • fix/cursor-timeout-handling
  • docs/helm-configuration-guide

Commit Messages

Follow Conventional Commits:

<type>(<scope>): <description>

[optional body]

[optional footer(s)]

Types: feat, fix, docs, style, refactor, perf, test, chore

Examples:

feat(storage): add Google Cloud Storage adapter

Implements the storage provider interface for GCS, including:
- Authentication via workload identity
- Multipart uploads for large files
- Retry logic with exponential backoff

Closes #234
fix(gateway): handle connection timeout during TLS handshake

Previously, connections would hang indefinitely if the TLS handshake
stalled. Now enforces a 30-second timeout.

Fixes #567

Keep Changes Focused

  • One logical change per pull request -- Don't mix unrelated changes
  • Small is beautiful -- Smaller PRs are easier to review and merge
  • Break up large features -- Use feature flags or incremental PRs

Pull Request Process

Before Submitting

  1. Sync with upstream -- Rebase on latest main
  2. Run tests -- All tests must pass (make test)
  3. Run linters -- Code must be lint-free (make lint)
  4. Update documentation -- If your change affects user-facing behavior
  5. Add tests -- New features need tests; bug fixes need regression tests

PR Template

## Description
Brief description of what this PR does.

## Motivation
Why is this change needed? Link to issue if applicable.

## Changes
- Bullet points of key changes

## Testing
How was this tested?

## Checklist
- [ ] Tests pass locally
- [ ] Linters pass
- [ ] Documentation updated (if applicable)

Review Process

  1. Automated checks -- CI must pass (tests, lints, builds)
  2. Maintainer review -- At least one maintainer approval required
  3. Address feedback -- Respond to comments and make requested changes
  4. Merge -- Maintainer merges when approved

We aim to provide initial review within 3 business days.

Coding Standards

Go

  • Follow Effective Go guidelines
  • Use gofmt for formatting and golangci-lint for linting
  • Handle errors explicitly -- never ignore them
  • Wrap errors with context: fmt.Errorf("fetch partitions: %w", err)

Rust

  • Follow Rust API Guidelines
  • Use rustfmt for formatting and clippy for linting
  • Prefer Result over panics; use thiserror for error types
  • Use tokio for all async code

General

  • Clarity over cleverness -- Write code that's easy to understand
  • Consistency -- Follow existing patterns in the codebase
  • Comments explain why, not what -- Code should be self-documenting
  • No dead code -- Remove unused code, don't comment it out

Testing Requirements

  • New features must include tests
  • Bug fixes must include regression tests
  • Target coverage > 80% for new code
TypeLocationCommand
Unit tests*_test.go / #[cfg(test)]make test-unit
Integration teststests/integration/make test-integration
Compatibility teststests/compatibility/make test-compatibility
End-to-end teststests/e2e/make test-e2e

Writing Good Tests

  • Test behavior, not implementation -- Tests should survive refactoring
  • Use table-driven tests -- For testing multiple inputs
  • Test edge cases -- Empty inputs, large inputs, invalid inputs
  • Use meaningful assertions -- Error messages should help debugging

Architecture Overview

See Architecture for a detailed system overview. Key areas for contribution:

ComponentLanguageLocation
GatewayRustservices/gateway/
Storage EngineRustservices/storage-engine/
CoordinatorGoservices/coordinator/
Query EngineRustservices/query-engine/
ControllerGoservices/controller/
OperatorGoservices/operator/
CLIGotools/cli/
Helm ChartYAMLdeploy/helm/

Recognition

All contributors are:

  • Listed in our CONTRIBUTORS.md file
  • Thanked in release notes
  • Eligible for Thermocline contributor swag

Becoming a Maintainer

Consistent, high-quality contributors may be invited to become maintainers with write access to the repository and voice in project direction.

Community

License

By contributing to Thermocline, you agree that your contributions will be licensed under the Server Side Public License (SSPL) v1.