EchoEd is a full-stack education platform with a separate Angular frontend and FastAPI backend.
frontend/ Angular app
|
| HTTP API calls, proxied locally through frontend/proxy.conf.json
v
backend/ FastAPI app
|
| SQLAlchemy models and Alembic migrations
v
PostgreSQL or local development database
The repository also includes:
docs/for runbooks and public project guidance.openspec/for spec-driven planning and validation.curriculum/for curriculum source and seed material.backend/scripts/reseed_demo.pyfor deterministic demo data.
Location: frontend/
Primary technologies:
- Angular
- Tailwind CSS and SCSS
- Playwright for demo smoke testing
- Karma/Jasmine for Angular tests
Important paths:
frontend/src/app/pages/landing/public landing pagefrontend/src/app/pages/login/login flowfrontend/src/app/pages/registration/registration flowfrontend/src/app/pages/user-dashboard/student, teacher, and admin surfacesfrontend/src/app/shared/lesson-viewer.*shared lesson renderingfrontend/src/environments/environment API settingsfrontend/tests/demo/browser smoke tests
Local frontend API calls use frontend/proxy.conf.json to reach the backend at http://127.0.0.1:8000.
Page components are loaded through explicit standalone loadComponent route boundaries. Public, authentication, onboarding, Learn, Teach, Studio, Organization, Admin, and legacy compatibility routes keep their existing guards and URLs while downloading feature code on demand. Recognized dynamic-import failures use the lazy /load-error recovery route.
Location: backend/
Primary technologies:
- FastAPI
- SQLAlchemy
- Alembic
- pytest
- JWT-based authentication
Important paths:
backend/app/main.pywires the API.backend/app/models.pycontains SQLAlchemy models.backend/app/schemas.pycontains request and response schemas.backend/app/auth.pycontains authentication logic.backend/app/database.pyconfigures database access.backend/app/api/routes/contains route modules.backend/app/crud/contains domain helper functions where present.backend/alembic/versions/contains database migrations.backend/tests/contains the backend test suite.
The application exposes /health/live and database-backed /health/ready. HTTP responses include a privacy-safe request ID and baseline security headers; backend request logs record method, path, status, duration, and correlation ID without logging bearer tokens. These are foundations rather than a complete metrics, tracing, or deployment platform; see docs/platform-maturity.
Reuse existing systems before adding new ones:
- Authentication:
backend/app/auth.py,backend/app/api/routes/auth.py - Organizations:
backend/app/api/routes/orgs.py - Courses and lessons:
courses.py,units.py,lessons.py,activities.py - Progress and learning runtime:
progress.py,start_course.py,lesson_sessions.py - Sections and assignments:
sections.py,assignments.py - Forum-style discussion:
posts.py,threads.py - Uploads and assets:
uploads.py - V2 workspace/product wrappers:
v2_platform.py
Do not create parallel auth, organization, progress, lesson, or onboarding systems.
The deterministic demo is reset with:
backend\venv\Scripts\python.exe backend\scripts\reseed_demo.pyThe operator runbook is docs/demo-readiness.md. The public evaluation guide is docs/public-demo.md.
OpenSpec changes live in openspec/changes/.
Useful commands:
cmd /c openspec status --change "<change-name>" --json
cmd /c openspec validate <change-name> --strict
cmd /c openspec instructions apply --change "<change-name>" --jsonIn this repository, implementation is performed by working through the task file for a change and checking off completed tasks. There is no openspec apply CLI subcommand.
Backend tests:
cd backend
pytestFrontend build:
cd frontend
cmd /c npm run buildFrontend unit tests:
cd frontend
cmd /c .\node_modules\.bin\ng.cmd test --watch=false --browsers=ChromeHeadlessDemo smoke:
cd frontend
cmd /c .\node_modules\.bin\playwright.cmd test tests/demo/student-flagship-smoke.spec.tsChanges should be small, scoped, and aligned with existing boundaries. Documentation-only changes do not need backend migrations or frontend tests, but they should still pass OpenSpec validation when tied to an OpenSpec change.