Repository navigation
Contributing
This is the short path from a fresh clone to a merged first change. Set up, run one safe test for the area you touch, and open a pull request against the right branch. Adding or changing a service has its own walkthrough in Adding a service. Report security findings through the security policy, never as a public issue.
- Pick or open an issue on the project's GitHub issue tracker. For anything larger than a typo, say on the issue what you plan to change, so the scope is agreed before you write it.
- You need
git, uv, and Python 3.10 or newer for the bootstrapper. Backend tests run under Python 3.12, whichuvcan download for you. The documentation checks in §3.3 also needmakeand the native Cairo library that diagram rendering links. Installlibcairo2on Debian and Ubuntu, or runbrew install cairoon macOS. Docker is only needed to run the stack itself and the Docker-backed suites described in §4.
git clone https://github.com/thekaveh/atlas.git
cd atlas
git switch develop
uv sync --project bootstrapperuv sync installs the bootstrapper and its development group (pytest and the documentation build) into bootstrapper/.venv. Every command below runs from the repository root.
Run the test closest to what you changed before you push. Each command below runs without Docker, without a running stack, and without any live service endpoint. The first run downloads what it needs, so it needs network access once. That is Python 3.12 and the Backend's packages for §3.2, and fonts and diagram assets for the documentation build.
| You change | Run |
|---|---|
The bootstrapper: start.sh/stop.sh flow, wizard, manifest loader or validator, docs tooling |
§3.1, choosing the test file named after the module you touched |
A service manifest (services/<name>/service.yml) |
§3.1 and §3.3, then the checks in Adding a service |
The Backend API (services/backend/app/app/) |
§3.2 |
| Documentation only | §3.3 |
uv run --project bootstrapper pytest bootstrapper/tests/test_manifests.py -qSwap in the test file for the module you changed, or narrow with -k <name>. The whole suite is uv run --project bootstrapper pytest bootstrapper/tests -q, but it takes around 40 minutes and part of it needs Docker (see §4).
The Backend has its own dependencies. This block creates a throwaway Python 3.12 environment with the runtime and test requirements. It uses the same tested constraint as CI, runs one non-live test file, and removes the environment afterwards. Paste it as one block. The parentheses keep the cd and the cleanup inside a subshell. set -e stops at the first failing step, so a failed download reports itself instead of a missing interpreter.
(
set -e
cd services/backend/app/app
BACKEND_TEST_ROOT="$(mktemp -d)"
trap 'rm -rf "$BACKEND_TEST_ROOT"' EXIT
BACKEND_TEST_VENV="$BACKEND_TEST_ROOT/venv"
uv venv --python 3.12 "$BACKEND_TEST_VENV"
VIRTUAL_ENV="$BACKEND_TEST_VENV" uv pip install \
-r requirements.txt -r requirements-dev.txt -c requirements-test-locked.txt
env -u ATLAS_TEST_REDIS_URL -u ATLAS_COMFYUI_LIVE_ENDPOINT \
-u ATLAS_TEI_RERANKER_LIVE_ENDPOINT \
"$BACKEND_TEST_VENV/bin/python" -m pytest tests/test_readiness.py -q -W error
)Replace tests/test_readiness.py with the test file for the route or service you changed, or use tests/ for the whole non-live suite.
requirements-test-locked.txt must pin every package it shares with requirements-locked.txt at the same version, so the tests run the versions the image ships. scripts/check_test_locks.py fails when the two differ.
make docs-check
uv run --project bootstrapper python scripts/check_doc_links.py
PYTHONPATH=bootstrapper uv run --project bootstrapper python -m bootstrapper.docs.regen --all --checkDocumentation is published to three surfaces (this repository, the documentation site and the wiki) from the same Markdown. make docs-check builds all three and fails on drift. Per-service READMEs carry generated blocks: regenerate them with regen --all instead of editing them by hand.
-
Docker-backed suites. The backup, restore and database-role suites drive real containers, and the Compose checks (
test_fragment_equivalence.py,test_source_permutations.py) calldocker compose. Without Docker they skip or cannot run. The required CI jobs run all of them, so you only need them locally when you change those areas. -
Live smokes. A few Backend tests talk to a real Redis, ComfyUI or reranker, and skip unless their
ATLAS_*endpoint variable is set. The command in §3.2 unsets those variables, so it never reaches a live service. -
The stack.
./start.shneeds Docker and is not needed to run any test above.
-
Branch from
develop, for examplegit switch -c fix/1234-readiness-timeout origin/develop. -
Open the pull request against
develop. Never targetmain: it only receives release pull requests that promotedevelop(see Releasing). -
Title it as a Conventional Commits subject:
type: summary. Add an optional(scope)after the type, and a!before the colon only for a breaking change. Examples:fix(backend): report Redis as unavailable when the readiness probe times out,docs(contributing): link the backend test path. Releasing §6 lists the accepted types.Title edits rerun the full workflow. A single-commit pull request can default to its commit subject under the current squash policy. Before merging, ensure the final squash subject matches the checked title; the changelog generator reads that subject.
-
Four required checks must pass, all run by
.github/workflows/services-lint.yml:Manifest lint + unit testsCompose merge + byte-equivalence + source-permutation matrixDocs drift + audit scriptsBuild-validation (Dockerfile + requirements.txt installability)
Adding a service §13.4 says what each one catches and lists a representative local subset. The first is a gate over four parallel jobs. A failing unit test shows up first as a red Bootstrapper suite without Docker (fast) check. A new commit or edit cancels the pull request's previous run.
-
Before merge, the branch must be up to date with
develop(mergedevelopinto it) and every review conversation must be resolved. A maintainer squash-merges it. -
Link the issue in the pull request body. The pull request targets
develop, not the default branch, so GitHub does not close the issue on merge. A maintainer closes it once the change lands.
- One concern per pull request, with a body that says what changed, why, and which commands you ran with their result.
- A test for every behaviour change, in the existing test file for that module where one exists.
- Documentation updated wherever the changed behaviour is described.
- A new or moved image pin or model source comes with its row in the supply-chain license inventory.
make docs-checkfails until the row matches the pin. - Generated files regenerated, not edited:
.env.example(uv run --project bootstrapper python -m services.env_assembler) and the per-service Dependencies & Integrations blocks (regen). Never editkong-dynamic.yml; every start rebuilds it. - Adding a tracked file moves the complexity ratchet.
bootstrapper/tests/test_maintenance_baseline.pythen asks for a highertracked_filesin.maintenance.jsonand in itsEXPECTED_BASELINE_SNAPSHOT. Add a refresh note that names the new file. - No secret, API key or token-shaped literal anywhere in the diff, tests included.
- Docker images, base configurations and scanner exceptions stay as they are unless the issue is about them.
- Development overview for repository layout and required documentation checks.
- Adding a service for manifests, Compose fragments and the full regen and lint chain.
- Documentation map for everything else.
Atlas documentation.
- 1. Overview
- 2. Quick Start
- 3. Core Concepts
- 4. Tracks
-
5. Services
- 5.1. Service Catalog
-
5.2. Service Guides
- 5.2.1. airflow
- 5.2.2. asset-baker
- 5.2.3. asset-worker
- 5.2.4. backend
- 5.2.5. backup
- 5.2.6. blender-mcp
- 5.2.7. celery
- 5.2.8. chatterbox
- 5.2.9. cloud-providers
- 5.2.10. cloudflared
- 5.2.11. comfyui
- 5.2.12. crawl4ai
- 5.2.13. doc-processor
- 5.2.14. docling
- 5.2.15. docling-lightrag-adapter
- 5.2.16. fal
- 5.2.17. globals
- 5.2.18. grafana
- 5.2.19. hermes
- 5.2.20. iceberg-rest
- 5.2.21. jenkins
- 5.2.22. jupyterhub
- 5.2.23. kong
- 5.2.24. label-studio
- 5.2.25. langfuse
- 5.2.26. lightrag
- 5.2.27. litellm
- 5.2.28. llm-graph-builder
- 5.2.29. local-deep-researcher
- 5.2.30. loki
- 5.2.31. mcp-servers
- 5.2.32. minio
- 5.2.33. mlflow
- 5.2.34. multi2vec-clip
- 5.2.35. n8n
- 5.2.36. neo4j
- 5.2.37. ollama
- 5.2.38. open-webui
- 5.2.39. openclaw
- 5.2.40. otel-collector
- 5.2.41. parakeet
- 5.2.42. prometheus
- 5.2.43. ray
- 5.2.44. redis
- 5.2.45. redpanda
- 5.2.46. searxng
- 5.2.47. spark
- 5.2.48. speaches
- 5.2.49. stt-provider
- 5.2.50. supabase
- 5.2.51. supavisor
- 5.2.52. tei-reranker
- 5.2.53. tempo
- 5.2.54. tika
- 5.2.55. trino
- 5.2.56. trueforge
- 5.2.57. tts-provider
- 5.2.58. verba
- 5.2.59. vllm-metal
- 5.2.60. weaviate
- 5.2.61. zeppelin
- 5.3. Provider And Extension Guides
- 6. Configuration
- 7. Operations
- 8. Architecture
- 9. Development
- 10. Reference