- Backend
- Use Python 3.10+ (the project targets 3.14 with Django 5.2.8+). Check with
python3 --version.- With pyenv: install e.g.
pyenv install 3.14andpyenv local 3.14in the repo.
- With pyenv: install e.g.
- Install a container runtime (Docker Desktop or OrbStack, etc.)
- Install pipx:
brew install pipx - Install Poetry (version should be 2.x, aligned with Dockerfile):
pipx install poetry(orpipx install poetry==2.1.2to pin)- If prompted, add pipx’s bin dir to
PATH(often~/.local/bin) in~/.zshrcand restart the shell.
- Run
poetry config virtualenvs.in-project true
- Use Python 3.10+ (the project targets 3.14 with Django 5.2.8+). Check with
- Frontend
- Install Node:
brew install node - Install Yarn:
npm install --global yarn
- Install Node:
- Connect to the web docker instance
- From the root of the project:
docker compose run --rm web bash
- From the root of the project:
- Load the seed data into the database (inside that shell)
python manage.py loaddata api/seed/0001_initial.json
- Backend
- Copy
.env-sampleto.envand set secrets. Fordocker compose, thewebservice setsDATABASE_URLto use thedbhostname (seedocker-compose.yml); that matches CI and production. - Run
poetry installfrom the repo root if you want a local venv for editor/IDE tooling (optional). - Migrations and tests — run inside Docker (same environment as CI and production). Do not rely on host
poetry run …for migrate/test unless you know what you are doing.- Migrations:
docker compose run --rm web python manage.py migrate - Tests:
docker compose run --rm web python manage.py test - Full CI-style backend test (compose build + migrate + test):
./scripts/test-backend.sh
- Migrations:
- PostgreSQL: Django 5.2 requires PostgreSQL 14+. Compose uses Postgres 16. If you previously used Postgres 13 in Docker, run
docker compose down -vto drop the old volume (or migrate data yourself), then bring the stack up again and re-seed. - Run
docker compose up --build(mac) orsudo docker compose up --build(Linux) from the root of the project. - To access the backend api, go to
localhost:8080/apiin a browser. - To access the Django Admin, go to
localhost:8080/adminin a browser.
- Copy
- Frontend
- Go to the
frontendfolder in a terminal. - Run
yarn install && yarn start. - To view the web application, go to
localhost:3000in a browser. - Note: To login to auth0, you'll need to access
localhost:8080first.
- Go to the
Major backend upgrades are tracked against Django’s release notes. When bumping Django, read the Backwards incompatible changes sections in order:
Official guide: Upgrading Django.
For these examples it's assumed that asdf is the version manager being used for Python, Node, and Pipx.
https://asdf-vm.com/guide/getting-started.html
sudo apt update; sudo apt install --no-install-recommends make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-devsudo apt install -y gcc make zlib1g-dev libreadline-dev libreadline8 sqlite3 libsqlite3-dev libbz2-dev python-tk python3-tk tk-devInstall Python (3.10+; 3.14 is supported with Django 5.2.8+).
asdf plugin add python
asdf install python 3.14.0
asdf global python 3.14.0Install pipx
asdf plugin add pipx
asdf install pipx latest
asdf global pipx latestInstall Poetry (2.x recommended)
pipx install poetry
pipx ensurepath
source ~/.zshrc
poetry config virtualenvs.in-project trueInstall Docker directions from here: https://get.docker.com/
# 1. download the script
curl -fsSL https://get.docker.com -o install-docker.sh
# 2. verify the script's content
cat install-docker.sh
# 3. run the script with --dry-run to verify the steps it executes
sh install-docker.sh --dry-run
# 4. run the script either as root, or using sudo to perform the installation.
sudo sh install-docker.sh
# remove install-docker.sh
rm install-docker.shInstall Node
asdf plugin add nodejs
asdf install nodejs latest
asdf global nodejs latestInstall Yarn
npm install --global yarnAdd Docker group directions from here: https://docs.docker.com/engine/install/linux-postinstall/
# Create the docker group
sudo groupadd docker
# Add your user to the docker group
sudo usermod -aG docker $USER
newgrp docker
# Verify that you can run docker commands
docker run hello-worldCopy the .env-sample file in root and populate it with your values.
Run migrations, seed the database, and create an admin user (all inside the web container so it matches CI/production).
# TODO: Figure out why sudo is needed here and when running build
# access console in Docker
sudo docker compose run --rm web bash
# in that shell:
python manage.py migrate
python manage.py loaddata api/seed/0001_initial.json
python manage.py createsuperuser
exit- Web server
- Typescript
- React
- Python/Django
- Websockets
- Material UI
- Docker
- Memcached
- Async
- RQ
https://profy.dev/article/react-tech-stack#1-most-popular-react-libraries
Standard web server w/ db, when songs are requested search the db to see if they already exist. If they don’t exist, fire off a request to the async server which can go out and locate the song, then hit a webhook on the web server with the result.
Use SSE to push data to clients to keep them up to date. SSE loop can check memcached to see if current state has changed, and if so update it.
- Data
- Song contents
- Timer
- Current position (cur song / total songs)