A full-stack healthcare scheduling system built with Django + Vue 3. Three roles (Admin, Doctor, Patient) cover the full appointment lifecycle: book → confirm → complete → cancel, plus doctor schedule management, medical records, and per-user profile/avatar/password self-service.
Prerequisites: git, docker, docker compose v2 (Compose v1 is not
supported). Podman is auto-detected as a fallback.
cp .env.example .env
# edit .env: set DJANGO_SECRET_KEY, POSTGRES_PASSWORD,
# DJANGO_SUPERUSER_PASSWORD before first boot
# content portal media: MINIO_ROOT_USER, MINIO_ROOT_PASSWORD (see .env.example)
sh ./init-stack.shThe init script auto-detects Podman or Docker, installs Compose v2 if missing, and brings up all three services.
Force a runtime explicitly:
sh ./init-stack.sh --runtime=podman # or --runtime=dockerStale containers / networks blocking startup? Run cleanup, then re-init:
sh ./cleanup-stack.sh # containers + network only
sh ./cleanup-stack.sh --purge-data # also wipes Postgres volume (irreversible)- Frontend: http://127.0.0.1:5173
- Backend API: http://127.0.0.1:8000/api/
- Swagger UI: http://127.0.0.1:8000/api/docs/swagger/
The backend bootstrap script creates a Django superuser on first boot from
these .env variables (idempotent — safe to leave set):
DJANGO_SUPERUSER_USERNAME(defaultadmin)DJANGO_SUPERUSER_EMAILDJANGO_SUPERUSER_PASSWORD
Log in at the frontend with that admin account, then create doctor and patient accounts from the Users page in the admin UI to walk through the full workflow.
If something goes wrong on first boot, jump to
docs/setup.md → Troubleshooting.
- Python 3.12+
- Django 4.2 + Django REST Framework
- Simple JWT (refresh + blacklist)
- drf-spectacular (OpenAPI / Swagger)
- Database: SQLite for local dev, PostgreSQL in Docker / production
- MinIO (S3-compatible object storage for content portal media)
- Vue 3 + TypeScript
- Vite
- Pinia
- Vue Router
- Axios
- Element Plus (with auto-import)
modern-clinic-platform/
├── backend/ # Django API — see backend/README.md
├── frontend/ # Vue admin console — see frontend/README.md
├── docs/
│ ├── setup.md # Full setup, validation, and troubleshooting
│ ├── internal/ # Change governance, roadmap, product overview
│ └── superpowers/specs/ # Active refactor program specs
├── openspec/changes/ # OpenSpec change proposals (per-feature)
├── docker-compose.yml # Default compose stack (db + backend + frontend)
├── docker-compose.2c4g.yml # Tuned override for 2c4g/50G hosts
├── init-stack.sh # One-command bring-up (Podman → Docker)
├── cleanup-stack.sh # Stop containers, optionally purge DB
└── .env.example # Copy to .env, then edit secrets
backend/README.md— module map, local venv flow, pytest/ruff/black, migrations, bootstrap script, OpenAPI regen.frontend/README.md— directory map, vitest / vue-tsc / build commands, feature-boundary conventions, auto-imports, debugging tips.
For every change in this repository:
- Create a
feature/*branch from the latestmain. - Implement and verify locally (tests + lint + manual smoke).
- Commit on the feature branch.
- Push and open a Pull Request.
- Merge after CI and review pass.
- Switch back to local
mainand pull the latest remote.
CI lives at .github/workflows/ci.yml and gates merges on
backend-tests, migrations-check, and frontend-tests.
docs/setup.md— full setup, env vars, validation, Troubleshooting.docs/internal/— change governance, roadmap, product overview. Read before proposing a non-trivial change.docs/superpowers/specs/2026-04-26-clinic-platform-refactor-design.md— top-level design for the active full-stack refactor program.