# Kadence — the handful of commands you actually run. .DEFAULT_GOAL := help SHELL := /bin/bash help: ## Show this help @grep -hE '^[a-zA-Z_-]+:.*?## ' $(MAKEFILE_LIST) \ | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-18s\033[0m %s\n", $$1, $$2}' up: ## Start the backend + web UI (http://localhost:8000) docker compose up -d --build down: ## Stop everything docker compose down logs: ## Follow the backend log docker compose logs -f app dev: ## Backend with reload + Vite dev server (http://localhost:5173) docker compose -f docker-compose.yml -f docker-compose.dev.yml up test: ## Run the backend test suite cd backend && PYTHONPATH=$$PWD .venv/bin/python -m pytest -q backend-venv: ## Create the backend virtualenv for local work cd backend && python3 -m venv .venv && .venv/bin/pip install -e ".[dev]" web-build: ## Build the web UI into frontend/dist cd frontend && npm install && npm run build desktop: ## Run the native desktop app against localhost:8000 cd desktop && python3 -m kadence_desktop desktop-test: ## Run the desktop app test suite (uses the backend venv) cd desktop && $(CURDIR)/backend/.venv/bin/python -m pytest -q desktop-install: ## Install the launcher entry and icon for your user ./desktop/packaging/install-desktop.sh helper-install: ## Install the privileged blocking helper (asks for sudo) sudo ./desktop/helper/install.sh android-test: ## Run every Android test (no device, no backend needed) cd android && ./gradlew :core:test :app:testDebugUnitTest android-test-core: ## Run just the pure-logic suite (needs only a JDK) cd android && ./gradlew :core:test android-build: ## Build the debug APK (needs the Android SDK) cd android && ./gradlew :app:assembleDebug android-install: ## Install the debug APK on the connected phone cd android && ./gradlew :app:installDebug lint: ## ruff over the backend and the desktop app (what CI runs) # From the repo root and with these arguments, exactly as `.gitea/workflows/lint.yml` # does: ruff decides what counts as a first-party import from where it is invoked, # so a different cwd gives a different answer about import order. backend/.venv/bin/ruff check --config backend/pyproject.toml backend desktop ci-test: ## Every suite, the way CI runs them — no venv assumptions python3 -m venv /tmp/kadence-ci && /tmp/kadence-ci/bin/pip install -q -e "./backend[dev]" cd backend && PYTHONPATH=$$PWD /tmp/kadence-ci/bin/python -m pytest -q cd desktop && /tmp/kadence-ci/bin/python -m pytest -q cd android && ./gradlew :core:test :app:testDebugUnitTest cd frontend && npm ci --no-audit --no-fund && npm run typecheck && npm run build glyph-sdk: ## Download the Glyph Matrix SDK into android/app/libs cd android && ./fetch-glyph-sdk.sh android-sdk: ## Install the Android SDK packages this app builds against ./android/ci/install-sdk.sh android-release: ## Build the release APK (set KADENCE_KEYSTORE* to sign it) cd android && ./gradlew :app:assembleRelease ci-runner: ## Start the Gitea Actions runner (needs GITEA_RUNNER_REGISTRATION_TOKEN) docker compose -f docker-compose.ci.yml up -d report: ## Build and send today's report right now cd backend && PYTHONPATH=$$PWD .venv/bin/python -m app.cli report set-password: ## Set/rotate the web login password (asks for a confirm) docker compose exec app python -m app.cli set-password deploy: ## Push master and redeploy kadence.timka.su on sw_pl_1 git push origin master ssh sw_pl_1 '/opt/kadence/deploy/deploy.sh' deploy-logs: ## Follow the production app log ssh sw_pl_1 'cd /opt/kadence && docker compose -f docker-compose.yml -f docker-compose.prod.yml logs -f --tail 100 app' .PHONY: help up down logs dev test lint ci-test backend-venv web-build desktop desktop-test desktop-install helper-install android-test android-test-core android-build android-install android-sdk android-release glyph-sdk ci-runner report set-password deploy deploy-logs