Getting started¶
This guide gets you from a fresh clone to a running stack you can develop
against. Cluster operations (deploy, rollback, debugging) are documented
separately in
OPERATIONS.md.
Prerequisites¶
| Tool | Minimum version | Used by |
|---|---|---|
git |
2.40+ | Submodule workflows |
make |
4.x | Submodule helpers (root Makefile) |
docker |
24+ | All service images |
python |
3.12 | Every Python service (uv manages it) |
uv |
0.5+ | Python dependency + venv management |
node |
22 LTS | Frontend builds |
npm |
10+ | Frontend dependency management |
helm |
3.14+ | Chart linting / templating |
kubectl |
1.30+ | Cluster access |
gcloud |
latest | GKE auth + Secret Manager |
Mobile development additionally needs Android Studio (Gradle 8.6 – 8.13) and / or Xcode (iOS 13+) — see the mobile app READMEs.
Clone + initialize¶
The parent repo holds every submodule pointer. Clone with submodules in one shot:
If you already cloned without --recurse-submodules, run:
Other day-to-day helpers:
make sync # Update all submodules to latest cashless-v2
make status # Show each submodule's HEAD + branch
make dirty # Show submodules with local changes
make branches # Show current branch per submodule
Branching policy¶
This project is pre-launch. Until everything is implemented and deployed, we do not work with pull requests. Push commits directly to the active development branch in each repo:
- Parent monorepo + all submodules:
cashless-v2. - Do not create
feat/*feature branches or open PRs for intermediate work. - Do not split work across review rounds — land it and move on.
Once the platform launches, feature branches and PR reviews resume as the default.
Running a backend service locally¶
Each Python service uses uv and its own pyproject.toml. Example for
cashless-backend:
cd backend/cashless-backend
uv venv
source .venv/bin/activate
uv pip install -e ".[dev]"
cp .env.example .env
# Edit .env — point at a local MySQL + Redis
gunicorn -c gunicorn.conf.py app:app
personalaccount-api and cashless-auth follow the same shape; check each
service's README for the exact entrypoint.
Do NOT run installs at the root
There is no root build system. npm install, pip install, and
gradle build at the parent repo will fail. Always cd into the
specific submodule first.
Running a frontend locally¶
cd frontend/cashless-admin-ui
npm install
npm run start # Angular CLI dev server on :4200
npm test # Jest
npm run test:e2e # Playwright (needs the dev server up)
All four web frontends (cashless-admin-ui, cashless-refund-ui,
marketplace-user-ui, personalaccount-ui) share the same Angular 21 +
ESLint 9 + Jest + Playwright shape on cashless-v2. The legacy Angular 7
versions on develop / master are not the integration target.
Building images¶
Every service image is built by GitHub Actions on push to cashless-v2, but
you can reproduce a build locally:
# Backend example — build context is the parent repo root so submodules resolve
docker build \
-f backend/cashless-backend/Dockerfile \
-t cashless-backend:dev \
.
Images push to ghcr.io/cashless-media/<service>:sha-<12 hex>. ArgoCD Image
Updater detects new tags and writes them into
deploy/argocd/values/<service>.yaml.
Connecting to the dev2 cluster¶
gcloud container clusters get-credentials cashless-dev2 \
--region us-central1 --project cashless-media
kubectl --context cashless-dev2 -n cashless get pods
ArgoCD UI lives behind a port-forward:
kubectl --context cashless-dev2 -n argocd \
port-forward svc/argocd-server 8080:80
# open http://localhost:8080
Grab the initial admin password from the argocd-initial-admin-secret
Secret in the argocd namespace.
Where to look next¶
- Services — every public host and what runs behind it.
- API reference — Swagger / OpenAPI for every backend.
- Architecture — service boundaries, deploy flow, data layer.
OPERATIONS.md— cluster bootstrap, deploy debugging, on-call runbook.- Per-submodule
CLAUDE.md— service-specific invariants and context.