Thanks for your interest in contributing. Please read this guide before opening a PR.
These are non-negotiable. PRs that violate them will not be merged regardless of feature value.
- Documentation first — every public function gets a NumPy-style docstring before code review
- Tests alongside code — every new function ships with at least one unit test
- No happy-path-only code — error handling is required, not optional
- No empty commits — every commit in the PR has a clear, purposeful change
- Conventional Commits —
feat(module): description/fix(module): description
git clone https://github.com/chrislyonsKY/occulus.git
cd occulus
pip install -e ".[dev]"# Lint
ruff check src/ tests/
# Format
ruff format src/ tests/
# Type check
mypy src/
# Unit tests (no network required)
pytest -m "not integration"
# All tests including integration (requires network)
pytestAll four must pass before opening a PR.
- Fork the repo and create a branch:
feat/your-featureorfix/your-bug - Make your changes, keeping commits atomic and well-described
- Ensure all checks pass locally
- Open a PR with a description of what changed and why
- Link any related issues
feat(module): add windowed COG read
fix(stac): handle empty results from pagination
test(search): add edge case for antimeridian bbox
docs(readme): update quick start example
Scope is the module name (e.g., search, download, config).
Occulus is a point cloud analysis library. It is not:
- A GIS application or full raster processing stack (use GDAL/rasterio for raster workflows)
- A real-time streaming engine or interactive 3D editor
- A data acquisition or sensor control toolkit
Features outside this scope will not be accepted regardless of quality. Open a discussion first if you're unsure whether something fits.
Be direct, be kind, be useful. Harassment of any kind is not tolerated.