How developeracademy-postech/2026-c4-m13-noma works
NOMA is a macOS app for job-seeking Korean learners to practice formal interview speech and receive feedback. The user enters through onboarding and microphone permission, starts interview practice, speaks answers that are transcribed and analyzed, and reviews a saved summary; practice also includes spoken questions, playback, and generated follow-up questions. The graph separates navigation, practice orchestration, speech/AI services, and learning records. Edges reflect the excerpts, SOURCE INDEX references, or README; several UI-to-store interactions and persistence details are not shown in the sampled source.
Main entry points: AppRootView.swift App root · InterviewPracticeReducer.swift Practice reducer · PracticeRecord.swift Practice records · PracticeSummaryView.swift Practice summary
Components 22
App navigation
- App root
NOMA/Application/Routing/AppRootView.swift - Route state
NOMA/Application/Routing/AppRouter.swift - AI onboarding
NOMA/Features/Onboarding/OnboardingView.swift - Mic permission
NOMA/Features/Permission/PermissionView.swift - Home
NOMA/Features/Home/HomeView.swift - AI availability
NOMA/Services/AppleIntelligenceStatus/AppleIntelligenceStatus.swift
Interview practice
- Practice screen
NOMA/Features/InterviewPractice/InterviewPracticeView.swift - Practice store
NOMA/Features/InterviewPractice/InterviewPracticeStore.swift - Practice reducer
NOMA/Features/InterviewPractice/InterviewPracticeReducer.swift - Session state
NOMA/Models/PracticeSession.swift
Speech and AI
- Audio capture
NOMA/Services/AudioRecording/AVAudioRecordingService.swift - Speech transcription
NOMA/Services/SpeechTranscribing/SpeechTranscriptionService.swift - Question speech
NOMA/Services/QuestionSpeaking/AVSpeechSynthesizerService.swift - Audio playback
NOMA/Services/AudioPlaying/AVAudioPlayerService.swift - Sentence feedback
NOMA/Services/InterviewFeedbackGenerating/FoundationModelsFeedbackService.swift - Follow-up generation
NOMA/Services/FollowUpQuestionGenerating/FollowUpQuestionGeneratingService.swift
Learning records
- Analysis loading
NOMA/Features/PracticeSummary/AnswerAnalysisLoadingView.swift - Practice summary
NOMA/Features/PracticeSummary/PracticeSummaryView.swift - Learning history
NOMA/Features/LearningHistory/LearningHistoryView.swift - Practice records
NOMA/Models/PracticeRecord.swift - Memo window
NOMA/Features/InterviewPractice/MemoWindowView.swift
Other components
- Learner
Connections 32
- Learner → App root: opens app
- App root → Home: shows home
NOMA/Application/Routing/AppRootView.swift - App root → Route state: binds routes
NOMA/Application/Routing/AppRootView.swift - App root → AI availability: checks availability
NOMA/Application/Routing/AppRootView.swift - App root → AI onboarding: routes to
NOMA/Application/Routing/AppRootView.swift - App root → Mic permission: routes to
NOMA/Application/Routing/AppRootView.swift - App root → Practice screen: routes to
NOMA/Application/Routing/AppRootView.swift - App root → Analysis loading: routes to
NOMA/Application/Routing/AppRootView.swift - App root → Practice summary: routes to
NOMA/Application/Routing/AppRootView.swift - App root → Learning history: routes to
NOMA/Application/Routing/AppRootView.swift - App root → Practice store: creates store
NOMA/Application/Routing/AppRootView.swift - App root → Practice reducer: injects reducer
NOMA/Application/Routing/AppRootView.swift - App root → Audio capture: injects recorder
NOMA/Application/Routing/AppRootView.swift - App root → Audio playback: injects player
NOMA/Application/Routing/AppRootView.swift - App root → Question speech: injects speaker
NOMA/Application/Routing/AppRootView.swift - App root → Speech transcription: injects transcriber
NOMA/Application/Routing/AppRootView.swift - App root → Sentence feedback: injects feedback
NOMA/Application/Routing/AppRootView.swift - App root → Follow-up generation: injects generator
NOMA/Application/Routing/AppRootView.swift - Practice reducer → Audio capture: records audio
NOMA/Features/InterviewPractice/InterviewPracticeReducer.swift - Practice reducer → Speech transcription: transcribes stream
NOMA/Features/InterviewPractice/InterviewPracticeReducer.swift - Practice reducer → Question speech: speaks question
NOMA/Features/InterviewPractice/InterviewPracticeReducer.swift - Practice reducer → Audio playback: controls playback
NOMA/Features/InterviewPractice/InterviewPracticeReducer.swift - Practice reducer → Sentence feedback: generates feedback
NOMA/Features/InterviewPractice/InterviewPracticeReducer.swift - Practice reducer → Follow-up generation: requests follow-up
NOMA/Features/InterviewPractice/InterviewPracticeReducer.swift - Practice reducer → Session state: updates session
NOMA/Features/InterviewPractice/InterviewPracticeReducer.swift - Practice screen → Practice store: uses store
- Analysis loading → Practice summary: continues to
- Practice summary → Practice records: reads record
NOMA/Features/PracticeSummary/PracticeSummaryView.swift - Home → Practice records: shows history
NOMA/Features/Home/HomeView.swift - Learning history → Practice records: browses records
- App root → Memo window: opens window
NOMA/Application/NOMAApp.swift - App root → Practice records: configures model
NOMA/Application/NOMAApp.swift