* Use 'docker compose' not 'docker-compose' * server, client, and voicebot directories always run in a conatiners with those names * All tests created must be put in tests/, which is bind mounted into the containers in /tests. * In client, to run any npm, npx, node, etc. you need to run via 'docker compose exec client COMMAND' * In voicebot, to run any python code, you need to run via 'docker compose exec voicebot uv run COMMAND' * In server, to run any python code, you need to run via 'docker compose exec server uv run COMMAND' * Server runs HTTPS, self-signed (-k for curl). It is port 8001 on the host and port 8000 inside the docker container. public_url is set to /ai-voicebot, so URLs should be https://localhost:8001/ai-voicebot/... (from host) or https://server:8000/ai-voicebot/... (from inside docker). * Voicebot runs HTTP. It is not exposed to the host and is connected to by server at http://voicebot:8788. * All services use hot-load. Any time you change a file, the service will reload. This is not an error. Examination of logs should occur beginning with the messages after the most recent startup complete. * All docker tail calls should be time relative, not message count relative. Eg., --since 10m not -n 100.