Angular + Ionic + Capacitor client for funfunspell.com. Ships as PWA, iOS, and Android. Owns dictation practice UX, speech playback, Auth0 login, i18n, and mobile release builds.
npm start # dev server
npm run test-dev # unit tests (headless, CI-friendly)
npm run lint # ESLint
npm run e2e-ci # Playwright e2e
# Release (see build.sh)
./build.sh build_firebase
./build.sh release_ios
./build.sh release_androidSingle test: npx ng test --browsers=ChromeHeadlessCI --watch=false --include='**/speech.service.spec.ts'
| Repo | Relationship |
|---|---|
esl-rest |
Backend API — dictation, member, interpretation |
image-generation-server |
Vocab images (Firebase; indirect via backend/CDN) |
esl-speech-worker |
Deprecated — TTS is cloud audio from esl-rest + R2 |
- API contract → update services in
src/app/services/; coordinate withesl-restcontrollers - Auth0 / JWT →
FFSAuthService,IdTokenInterceptor; alsoesl-restsecurity if routes change - Interpretation UI →
InterpretationServicecallsGET /interpretation; backend model changes need both repos - Cloud TTS URLs →
TtsCloudService/base-env.ts; keys generated byesl-restTTS pipeline - Practice preload → client-only unless preload API contracts change
- Use
ngOnInit()for page data load — useionViewWillEnter()(Ionic caches pages) - Call
SpeechService.speak()async on iOS Safari without prior user gesture — preload voice viaensureVoiceLoaded() - Include Claude attribution in commit messages
Pipeline: UI (if needed) → architect → implementer → reviewer → tester
| Stage | Agent |
|---|---|
| UX | esl-uiux |
| Architect | esl-ionic-senior-dev |
| Implementer | esl-ionic-programmer |
| Reviewer | esl-ionic-reviewer |
| Tester | esl-ionic-tester |
| Test cleanup | esl-ionic-test-reviewer (loads review-tests skill) |
| Test review | esl-ionic-test-reviewer (loads review-tests skill) |
esl-ionic-test-reviewer prunes/trims weak specs; esl-ionic-tester adds coverage.
Committed agents: .cursor/agents/. They load stack/commands from this file, .cursor/rules/, and CLAUDE.md (do not hardcode stack in agent prompts).
Committed rules: .cursor/rules/. Workspace-level esl-all/.cursor/ is local-only — not source of truth for cloud agents.
See CLAUDE.md for architecture, dictation flow, TTS, auth, and release commands.