Thanks for your interest in contributing to Hindsight!
-
Fork and clone the repository
git clone git@github.com:vectorize-io/hindsight.git cd hindsight -
Bootstrap your dev environment in one shot:
./scripts/dev/setup.sh
This is idempotent (safe to re-run) and gets you ready to develop, including offline. It:
- installs the required toolchains if missing (uv/Python, Node/npm, Rust/cargo),
- creates
.envfrom.env.example(remember to add your LLM API key), - configures git hooks,
- installs all Python and Node workspace dependencies,
- pre-downloads the local ML models + tokenizer so the API runs offline,
- builds the TypeScript SDK and the Rust CLI.
Useful flags:
--skip-build(deps only),--skip-models(skip ML model download),--with-docs(also build the docs site),--force(rebuild artifacts). Docker image builds are out of scope. Run./scripts/dev/setup.sh --helpfor details.
If you'd rather set things up by hand instead of running the script above:
-
Set up your environment:
cp .env.example .env
Edit the .env to add LLM API key and config as required
-
Install dependencies:
# Python dependencies uv sync --directory hindsight-api/ # Node dependencies (uses npm workspaces) npm install
./scripts/dev/start-api.sh./scripts/dev/start-control-plane.sh./scripts/dev/start-docs.shcd hindsight-api
uv run pytest tests/We use Ruff for Python linting and formatting, and ESLint/Prettier for TypeScript.
Set up git hooks to automatically lint and format code before each commit:
./scripts/setup-hooks.shThis configures git to use the hooks in .githooks/, which run all scripts in scripts/hooks/ on commit. The lint hook runs in parallel:
- Python:
ruff check --fix,ruff format,ty check - TypeScript:
eslint --fix,prettier
# Run all lints (same as pre-commit)
./scripts/hooks/lint.sh
# Or run individually for Python:
cd hindsight-api
uv run ruff check --fix . # Lint and auto-fix
uv run ruff format . # Format code
uv run ty check hindsight_api # Type check- Use Python type hints
- Follow existing code patterns
- Keep functions focused and well-named
- Create a feature branch from
main - Make your changes
- Run tests to ensure nothing breaks
- Submit a PR with a clear description of changes
The project uses scripts/release.sh for creating releases. This script automates the entire release workflow:
- Bumps version in all components (API, clients, CLI, control plane, Helm)
- Regenerates OpenAPI spec and client SDKs (Python, TypeScript, Rust)
- Updates documentation versioning
- Creates a commit and git tag
- Pushes to GitHub (triggers CI/CD to publish packages)
./scripts/release.sh <version>Example:
./scripts/release.sh 0.5.0- During development, version bumps in
__init__.pydo NOT require client regeneration - Clients are only regenerated during releases
- Do not manually run
./scripts/generate-clients.shunless testing generation changes - Client version comments will reflect the API version from the latest release
Open an issue on GitHub with:
- Clear description of the problem
- Steps to reproduce
- Expected vs actual behavior
- Environment details (OS, Python version)
Open a discussion on GitHub or reach out to the maintainers.