PRD · FLYER Teacher · Mobile app · Current state and UI proposal

FLYER Teacher mobile app: what exists today

Reference for the iOS and Android teacher app as of version 1.7.3: screens, flows, gaps against teacher.flyer.us, known issues, the engineering setup, and a proposed UI redesign.

Key facts, origin and limits
Store name
Teacher Assistant AI (iOS) · FLYER Teacher (Android)
Version
1.7.3 · App Store 13/10/2026
Rating
4.5 / 5 · 13 ratings (App Store VN)
Code
Gitea flyer/mobile-partner · dev @ d0233fd
Date
15/10/2026
Current-state reference · UI proposal (tab 3) is a draft for discussion

Written in response to these requests of 15/10/2026:

  • Hiện tại đã có documents cho Teacher Mobile App chưa
  • could you build PRD show what we have at the moment at roadmap.flyer.vn/teacher-mobile-app
  • Đề xuất cho anh một bản UI/UX tốt hơn cho Teacher Mobile App nhé https://roadmap.flyer.vn/teacher-mobile-app/#screens (16/10/2026, answered in the UI proposal tab)

Drafted by an AI assistant in one working session. Before this page, the app had no product documentation: the repository README is an unedited GitLab template, the docs/ folder holds one design spec (Assign Test share via Zalo, 22/07/2026), and the Notion page "FLYER Teacher App" (06/2023) is a sales paragraph.

Sources for the UI proposal: the 35 screenshots on the Screens tab; the API schema generated from production on 15/10/2026 (for which operations already exist); platform figures from earlier read-replica studies: /teacher-top5 (1,131 active teachers, 01/06–31/08/2026: 86% desktop, 11% phone browser, 2.4% app sessions; 16.3% of assignments with no submission; AI records linked to a student 5 of 620 speaking, 4 of 465 writing) and /assignment-v2 (19/09/2026: 49.9% submission rate, 97.1% of assignments to whole classes, 40.6% with a due date). For section 5: the Bingo AI Co-Teacher PRD and its production notes of 14/10/2026 (cold-start suggestions, duplicate names, pause default), and the v4 API types in partner-web-main (src/api/__generated__/openapi-v4.ts, @ 587e719).

Sources: source code of mobile-partner branch dev @ d0233fd (14/10/2026), read by three read-only code agents and checked by hand; partner-web-main @ 587e719 (06/10/2026) for the web comparison; App Store lookup API for store facts; 35 screenshots taken on 15/10/2026 from a local Debug build of the same commit on the iOS Simulator (iPhone 17 Pro), signed in with a real teacher account.

Limits:

  • Student names, class join codes and the referral code are blurred in screenshots. Class names and the account owner's own name are left visible.
  • The local build talks to production (api.flyer.us). Screens were only viewed; nothing was created, assigned or deleted.
  • Android was not built: the build machine has no Android SDK. Android behaviour is described from code only.
  • The camera flow was not captured because the simulator has no camera. The Assign Test flow was captured up to the test picker; steps 2 and 3 are described from code.
  • "Partial" and "No" in the web comparison are based on which screens and data calls exist in code, not on hands-on use of every feature.
  • No usage numbers (active teachers on the app, sessions by device): the production read-replica was not queried in this session.
  • UI proposal: the phone screens are HTML mock-ups, not React Native. Their data is illustrative (invented classes of 12–22 students and invented student names), chosen to show a typical class load; the test account behind the screenshots has classes of 1–3 students.
  • UI proposal: platform figures describe all teachers on teacher.flyer.us and the app together, not app users alone. Phase sizes are rough estimates before design detail.
Live version
1.7.3
iOS 15.1+ · Android 9+ (SDK 28)
Screen folders in code
27
83 routes · 5 bottom tabs · 2 roles
Web catalog covered
3 / 20
Plus 7 partial, 10 missing
Product events tracked
0
Firebase Analytics linked, never called
In shortThe app is a mobile companion to teacher.flyer.us for four jobs: checking class and student results, assigning tests, grading writing and speaking with AI, and browsing the content library. Content creation, school administration, attendance, rewards, challenges and finance stay on the web. The same binary also serves parents. Recent engineering effort has gone mostly into CI/CD: 8 of the last 10 merged pull requests are build or release work.

Roles

RoleEntryWhat the role sees
TeacherSelect role → sign inFive tabs below. Gated by teacher verification, teacher profile and current school.
ParentSelect role, or "Switch to parents profile" in the teacher menuOne child at a time: performance, test history, weekly report, tuition bills with bank QR.
StudentNoneNot supported. Students use the FLYER student app.

Teacher bottom tabs

1Dashboard4 stats, quick actions, study-time chart, class ranking
2ClassesClass list, class dashboard, invite, create, edit, delete
3StudentsAll school students, performance, test history
4AssignAssigned tests, progress, 3-step assign wizard
5MenuProfile, switch school, affiliate, help, settings, parent switch

Tabs show icons only; the labels exist in code but are not rendered.

Feature inventory

AreaWhat existsState
Sign in / sign upPhone or username + password, Google, Apple (iOS). Sign-up by phone + OTP. Forgot password by OTP. One active session per account.Live
OnboardingName, optional email and phone, first class, class code and invite link. Unverified teachers are sent to a Google Form.Live
DashboardClasses, students, completed tests, study hours (default last 30 days; 9 preset ranges plus custom); study-time chart; top 10 classes by study time and accuracy; referral banner.Live
ClassesCreate (General, Placement test, IELTS), edit, delete; class dashboard with charts by test level; per-student report; invite by link or email.Live
StudentsList with filter, summary sheet, performance overview, test history, test result. Students join through the invite link; teachers cannot create, edit or delete student accounts.Live
Assign tests3 steps: pick test (8 types, search, filters), pick classes or students, options (start, deadline, hide answers, exam mode, auto-lock, share via Zalo). Progress per assignment.Live
ExploreTest library by CEFR level with Free/Premium tags, filters, preview, assign.Live
ProgramFLYER Original, school and own programs; book → unit → lesson → assign. Browse only.Live
Writing AIIELTS Task 1/2, KET Part 6/7, PET, Flyers. Typed essay or images; score, criteria, corrections, samples. History list.Live
Grade from photosUp to 5 photos of handwritten work from camera or gallery. App-only.Live
Speaking AIRecord up to 119 s; pronunciation, fluency, grammar, vocabulary; CEFR, IELTS, TOEIC, PTE, TOEFL estimate. Daily limit set on the server. Audio-file upload is commented out.Live
NotificationsIn-app list (Class / FLYER News), school and class requests to accept or decline, push via Firebase with topics per role.Live
AffiliateReferral code and link, share, referred students, reward (50,000 VND per student upgrade).Live
SettingsEdit profile, change password, switch school, language (EN/VI), terms, delete account, help (phone call), report bug (email).Live
Parent modeChild switcher; report, history, weekly report, tuition bills with bank-transfer QR.Live
What's newPopup once per app version, teachers only.Live
Maintenance / forced updateRemote Config switches: maintenance overlay, minimum app version.Live
In-app purchaseNone. No paywall or subscription screen.None
Product analyticsNone. No custom events; only Firebase automatic events, if any.None

Select a screen to enlarge it. Each view can be shared by link (#screens/<area>). Chips show the route name in code.

1What the current screens get wrongAdded 16/10/2026

16/10/2026 (2): Bingo AI Co-Teacher added (section 5, 2 new screens, entry points on Today, Class, Student and Assignments). 16/10/2026: first version: diagnosis, navigation change, 13 clickable screens, build notes, phasing.

ProblemSeen onEvidence
Home reports volume, not work to doHome16.3% of assignments get no submission on the platform; no app screen flags them.
Icon-only tabs; tools hidden in home tilesHomeTab labels exist in code but are not rendered. Explore, Program and the AI tools open only from home tiles.
Numbers contradict each otherStudents, Parent8 number issues across 9 screens, listed in the Issues tab.
After assigning, nothing can be doneAssignRemind, extend and manual scoring exist in the API; the app calls none of them.
AI grading sits outside the classAI gradingOn the platform, 5 of 620 speaking and 4 of 465 writing records are linked to a student.
Long lists of label–value rowsClassesThe class dashboard stacks two 11-row level tables; a writing report is one block of text.
Filters before contentAssign, ContentAssign step 1 opens on three empty dropdowns. Explore does not start from the level of the teacher's classes.
Alerts are not groupedMenu212 "Class Target!" items in the Class tab, one per student, with no action besides opening.
Secondary actions look primaryMenu"Switch to parents profile" and "Log out" are full-width filled buttons; help is a phone call.

2Direction

ScopeThe app carries 2.4% of teacher sessions; desktop carries 86%. The redesign treats the app as the place to check and nudge between lessons. Building content and running the school stay on the web.
Today firstOpen on what needs action, ranked: tests nobody started, answers to grade, quiet classes.
Close the loopEvery assignment shows its state and one action: Remind, Extend or Grade.
AI inside the classEvery AI grading belongs to a student and lands in that student's record. The teacher confirms the score.
One number, one formatOne stated date range per screen. Percent as %, hours with one decimal, dates with the year.
Context carries overAssigning from a class, a student or a test pre-fills the form. Defaults cover the common case.
Labels and large targetsLabelled tabs, Open Sans 15 px body, 44 pt touch targets, colour only with text.

3Navigation

4Screens

Each phone is a working 390×844 layout. Tap inside it: tabs, the + button, Remind, Extend and Grade respond. Compare puts today's screen next to the proposal.

5Bingo AI Co-Teacher on mobile

Live on the web (production capture 14/10/2026, PRD); not in the app. Approving a weekly queue takes a minute between lessons, so it fits the app's check-and-nudge role. Open the Bingo screens.

WhereWhat the teacher seesAgainst the Bingo PRD mobile design
Today"6 suggestions to review" with Review and Approve allSame home banner
SuggestionsPer student: level, reason, two tests, Approve / Change / Skip; paused students shown apartSame vertical cards with buttons, no swiping
Class"Bingo AI · Suggest mode" row opening the queue and the class settingsSame settings per class
StudentSkill bars from single-skill tests, next Bingo testDiffers bars instead of a 4-axis radar: exact values, and a missing skill reads as "—" instead of a broken shape
AssignmentsTests sent by Bingo carry a "Bingo" label in the same listNew answers the PRD's open question on labelling
Tab barNo Bingo tabSame no sixth tab; the menu shortcut moves to Today and Class

What the API returns, and what the screens show

API fieldShown as
reason_code = WEAK_SKILL + target_skill"Weakest skill: Speaking · 55%"
reason_code = NO_DATA_FOR_SKILL"No graded Writing yet"
target_skill_tied = true"Skills are level · Listening picked"
skipped_for_unfinished = true"Paused: 2 Bingo tests not done yet" with Remind
assign_at, assign_weekdays"Go out Mon 20 Oct, 17:00": approval does not send at once
mode, weekly_target, level_band, max_duration_minutes, skip_when_unfinished, source_schoolThe six rows of the settings screen

The PRD's example reasons ("4 of 5 speaking tests lost points on long vowels") are richer than the API's reason codes. The mobile screens show only what the API returns.

Decisions needed

QuestionObservationSuggested answer
Student with no graded workProduction suggested the same two tests to three such students, citing "skills are level"For NO_HISTORY, suggest a placement test instead
Pause when unfinishedPRD rule: pause at 2 unfinished tests. Production default: never pauseDefault to 2, as the PRD says
Automatic mode from the phoneSwitching to Automatic sends tests without reviewAllow, with a confirmation that names the class and the weekly count
Students with the same nameTwo "Hoàng Nghiệp" in one production classShow the username under the name

6What it takes

ScreenChangeBackend
Tab barLabels, 4 tabs and a + buttonNone
TodayRank tests nobody started, answers to grade, quiet classesNone existing assignment and class queries; a summary query is optional
AssignmentsGroup by state; Remind; ExtendExists partnerViewerAssignTestRemindStudent, …RemindParent, partnerAssignTestUpdate (end date); unused by the app
Assignment detailThree groups, Grade, weak-question bannerExists PartnerAssignTestProfiles, partnerViewerAssignTestScoreUserAttempts
Assign a testOne screen, defaults, options foldedNone same PartnerAssignTestCreate
Bingo AISuggestion queue, class settings, skills on the student screen, label in AssignmentsExists 8 REST endpoints under /v4/teacher/bingo/ in the web's v4 client; the app needs a v4 client (it has v3 only)
Grade with AI draftAI drafts a score on the exam scale for a submitted answer; the teacher confirmsSmall AI inputs already take learnerProfileId; running AI on an assignment answer needs a hook
Grade from photosPick the student on the same screenNone send learnerProfileId
ClassMerge dashboard, students and assignments; one date rangeNone existing queries with one date input
StudentAccuracy in %, hours with one decimal, dated chartConfirm the unit behind "2.19"
LibraryExplore and Program in one tab, filtered by class levelNone
NotificationsDecisions first; repeated alerts groupedNone grouping on the client
ProfilePlain list; in-app feedback with screenshotSmall feedback endpoint

7Phasing

PhaseScopeBackendRough size
1 · Quick winsLabelled tab bar and + button; one number format and stated ranges; Profile and Notifications cleanup; AI tools send the studentNone2–3 weeks
2 · Assignment loopToday, Assignments tracking, Remind, Extend, detail groups, manual grading, Bingo suggestion queueNone; existing mutations and the v4 Bingo endpoints3–4 weeks
3 · HubsClass hub, Library, one-screen assign, AI draft for submitted writing, Bingo class settingsSmall hook for AI on answers4–5 weeks

Product events (/tracking-events, surface app_teacher) ship with phase 1, so phases 2 and 3 can be judged on data.

8How to know it worked

QuestionMetricNowTarget
Do teachers act from the app?App sessions with an action (remind, extend, grade, assign)Not measuredBaseline in 4 weeks
Does the loop save assignments?Submission rate, reminded vs not reminded49.9% overall+10 points when reminded
Is AI grading in the class?AI records linked to a studentUnder 1%Over 60%
Is the Bingo queue handled?Suggestions approved, changed or skipped before the send timeNot measuredOver 80%
Do the numbers agree?Open number issues from the Issues tab80

9Assumptions to test before building

AssumptionHow to test
Teachers open the app between lessons to check and nudge, not to build content.5 teacher interviews with the prototype; session data after phase 1
Reminders help more than they annoy.Once per student per 24 hours, opt-in per class; compare reminded and not reminded
A due date on by default is acceptable (40.6% of assignments set one today).Share of teachers who clear the default in phase 2
Teachers will confirm an AI draft instead of grading from scratch.Share of drafts confirmed unchanged, edited, or discarded

1Sign in, sign up, routing

FlowSteps
Sign in
  1. Select role: Teacher or Parent
  2. One field for phone number or username, then password
  3. Or Google; or Apple on iOS. Social sign-in may require verifying the account with phone + password
Sign up
  1. Phone number only
  2. OTP by FLYER SMS for +84, Firebase for other countries
  3. Password of 8–16 characters, then teacher onboarding (also when the Parent role was selected)
After sign-inNot verified as teacher → Google Form · no teacher profile → onboarding · no current school → pick a school · otherwise the five tabs. A sign-in on another device signs this one out.

2Classes and students

FlowSteps
Create classType (General, Placement test, IELTS with target score) → level → name.
Get students inNo manual add. Share the join link (school domain + class code, e.g. tung.flyer.us/join-class?classCode=…), send the email template, or invite by email address. Students join from their own app.
Check a studentStudents tab or class → student card → summary sheet → performance (tests, accuracy, time) and test history → test result.

3Assign a test

StepWhat the teacher does
1 · TestResource (All, FLYER tests, school domains), type, skill, level, or search. 8 types: Reading & Listening, Speaking, Writing, Mini, Practice quiz, IELTS, Discussion, Study. Can start pre-filled from Explore or Program.
2 · WhoWhole classes or individual students. Classes that already have the test are marked.
3 · OptionsStart time · deadline (off by default; +7 days when switched on) · hide answers · exam mode · auto-lock after deadline · share via Zalo with message preview.
DoneSummary screen. With Zalo on: system share sheet (pick Zalo, then the group) or copy message.
Follow upAssigned test → progress per student (first/last submit, attempts, highest score, average time) and answer overview. No manual grading in the app.

Result screens: IELTS speaking and KET/PET speaking or writing open as web views; all other results are native screens.

4AI grading

ToolInputOutput
Writing AITask type, question, essay text; optional images (1 for IELTS, up to 3 otherwise, 3 MB each)Score, criteria analysis, suggestions, corrections, sample answers, vocabulary
Grade from photosUp to 5 photos from camera or gallery; task type incl. GeneralSame report, plus an image viewer
Speaking AIFree recording up to 119 s, pause and resume, no promptOverall and 4 sub-scores, exam-scale estimates, transcript with word audio

5Parent mode

Welcome screen → parent name (first time) → child switcher → four tabs: Report (tests assigned, accuracy, study hours, progress, chart) · History · Weekly (submissions, study time, self-study, skill bars versus last week, written summary) · Billing (unpaid and paid tuition, overdue popup, bank QR to save or share). Push notifications open the weekly report or a bill.

Same as web
3
Explore, AI grading, assign
Partial
7
Mostly read-only versions
Missing
10
Gifts is not on web either
App-only
5
Photos, push, Apple, deletion, parent switch

Rows follow the 20 areas of the FLYER Teacher PRD catalog, then other web features.

AreaWebAppWhat the app lacks
ReportsYesPartial4 headline numbers, a study-time chart and rankings; limited drill-down (completed-test list, class dashboard). No daily, weekly or monthly reports, no export.
Explore testsYesYesNo playlists; no worksheet preview or print.
ProgramYesPartialBrowse and assign only. No create, edit or AI-generate; no class progress.
Auto-assignYesNoWhole feature.
Placement testYesPartialHas the class type and the new-students list. Cannot send a placement link or see results.
AI gradingYesYesNo audio-file upload for speaking.
AI teaching assistantYesNoWhole feature.
Create testYesNoWhole feature (all builders).
My libraryYesNoOwn tests reachable only through "Choose resource" when assigning.
Exam managementYesNoWhole feature.
Class managementYesPartialOverview and student report only; 8 of 10 web class tabs missing (3 of the 10 appear on the web only when enabled per school). No co-teachers, no pinning.
StudentsYesPartialNo create, edit, delete, password reset or transfer. Only email invites and approval of leave-class requests.
Assign homeworkYesYesNo manual grading; "needs grading" is shown but cannot be acted on.
RewardsYesNoWhole feature.
AttendanceYes, per-school settingNoWhole feature.
GiftsPrototype onlyNoNot live on either platform.
ChallengesYesNoWhole feature.
Online teachingYes, per-school settingNoWhole feature.
Finance / tuitionYesPartialParents can view bills and get a bank-transfer QR; teachers cannot create bills or track payments.
SettingsYesPartialPersonal settings only. No school accounts, roles, teacher invites, courses, store or theme.
Other web features
Bingo AI Co-TeacherYesNoWhole feature.
GamesYesNoWhole feature.
Plans and diamondsYesNoNo plan, billing or diamond screens.
School admin, white-labelYesPartialSwitch school only. No school branding or portal numbers.
OnboardingYesYesNo quick-start checklist or guided tours.
NotificationsYesYesNone; the app adds push.
What's newYesYesPopup per version only, no history.

App-only

FeatureNote
Grade from photosIn-app camera, up to 5 photos. The web accepts uploaded image files but has no camera flow.
Push notificationsFirebase topics per role; tap opens a test result, weekly report or bill.
Teacher ⇄ parent switchOne tap in the menu, same account. The parent role itself also exists on the web.
Sign in with AppleiOS only.
Delete accountIn-app deletion, required by the App Store.

"Seen" = visible in the screenshots on the Screens tab. "Code" = found by reading the source; not reproduced on a device.

1Numbers that disagree

IssueWhereBasisLevel
Accuracy shown as 2.19 with a "(%)" label for a student with 110 completed tests; the unit is unclear.Student sheet, student performanceSeenMedium
One student, two test-time values: 9,98 hours on the card and in performance, 09:00:53 in the summary sheet.Students tab, student sheetSeenMedium
Student chart dates are day/month without year and out of order (05/08 … 22/12, 23/07, 07/01, 02/05).Student performanceSeenMedium
Same class, same screen: 150 completed tests and 33.73 h (last 30 days) versus 144 and 32.53 h (15/09–15/10).Class dashboardSeen; ranges differ, needs checkCheck
Parent weekly report: the circle reads 9 "Assignment submissions", while the summary below reads "completed 0 teacher-assigned exercises. Out of 9 assignments due this week, 0 were submitted on time."Parent weekly reportSeenMedium
Parent view labelled "Last 30 days" shows 1.543,81 total study hours, more than the 720 hours in 30 days. Probably an all-time figure under a 30-day label.Parent child performanceSeenMedium
Writing record listed as 7.5, report header shows SCORE: 8, body says 7.5/10.Writing list, writing reportSeenLow
Number formats differ: comma decimals in the English UI ("9,98 Hours", "54,53%", "1.543,81") and durations written out elsewhere ("2 months, 2 days, 5 hours, 6 minutes").Students tab, parent view, class student reportSeenLow

2Broken or dead paths

IssueWhere in codeBasisLevel
"New feature" notifications navigate to RECAP_2023, a route that is not registered.notification/screens/NotificationList.tsx:222-223CodeMedium
Parent menu links to the teacher notification screen.parent/ParentMenuScreen.tsx:185CodeMedium
Sign-up always leads to teacher onboarding, even when Parent was selected.register/index.tsxCodeCheck
Links that open the app (universal link flyer.dynalinks.app, scheme flyer-partner://) are configured, but no screen handles them. Only push links to /test-result are mapped.navigator/configNavigator.tsCodeMedium
Push messages that arrive while the app is open are probably not shown (no foreground display library).provider/NotificationProvider.tsxCode, uncertainCheck
12 routes are registered but never opened: 10 retired filter screens, the AI hub and an older dashboard report.navigator/listNavigator.tsCodeLow
"Assign test" picker, resource "All Tests": the first two items are Korean-language lessons tagged Pre A1, followed by phonics items coded JP305 and JP306.Assign step 1Seen; why these rank first is unclearCheck

3Text and polish

IssueBasis
Some labels are hard-coded in English and do not translate ("Speaking AI", "Writing AI", "Premium/Free", "Hi,"). Default language is English on first launch although the fallback language is Vietnamese.Code
Vietnamese store display name has a trailing space ("Trợ Giảng AI "). Photo-library permission text reads "Flyer need photo library use for upload your profile".Code
Help Center is a phone call; Report a bug opens email. No in-app bug report.Code (buttons seen)

1Stack

FrameworkReact Native 0.81.4 · React 19.1 · Expo 54 (bare, with ios/ and android/) · Hermes · New Architecture on
LanguageTypeScript 5.5, strict · ESLint (airbnb, unicorn, cspell) with zero warnings allowed · Husky pre-commit lint + type-check
State and dataJotai · Apollo Client (GraphQL) · TanStack Query (REST)
NavigationReact Navigation 7: one root native stack (83 routes) + 5 bottom tabs
UIOwn components (96 files), action sheets, toasts, ECharts and SVG charts, Lottie, OpenSans
LanguagesEnglish, Vietnamese (i18next, ~1,280 strings each)
Size357 source files, ~54,600 lines; largest areas: assign test 6.5k, AI tools 6.1k, parent 4.7k, dashboard 3.5k lines
Package managerYarn 4.12 (the Android workflow pins 4.7.0)

2Backend and environments

LayerDetail
GraphQL/v2/graphql over HTTP, WebSocket for 1 subscription (single-session sign-out). 63 queries, 44 mutations defined; 58 and 36 used. Hasura endpoint removed on 14/10/2026 (#66).
REST v3Hooks generated from the OpenAPI spec: 5 of ~270 used (school list; parent weekly report and tuition). The total follows the live staging spec, downloaded on every generation.
Headersx-session-token, device MOBILE_TEACHER or MOBILE_PARENT, device info JSON. REST calls send the token only.
EnvironmentisDev = false is committed, so local builds use production. CI rewrites the line per build (scripts/set-is-dev.js), but runs GraphQL codegen before that step, so development builds are generated from the production schema.
HostsProduction api.flyer.us, Firebase mover-online-english · development staging-api.flyer.us, Firebase flyer-english-staging

3Native services

ServiceState
Firebase Auth (Google, Apple, phone)Active
Firebase Messaging (push)Active topics allDevices, teacherApp / parentApp, plus dev in development builds
Remote ConfigActive 2 live keys (maintenance, minimum version), 2 unused
CrashlyticsActive crash capture on by default; the only custom logging is GraphQL errors. No iOS symbol upload step found.
Firebase AnalyticsLinked, unused 0 custom events. See /tracking-events.
Camera, image picker, audioActive vision-camera, image-picker, expo-av (deprecated in Expo 54)
CodePush, AppsFlyer, expo-updatesDead code commented out or package removed; config left behind. No over-the-air updates.

4Build and release

ItemDetail
CI on pull requestsGitea Actions: install, codegen, lint, type-check. No tests, no build.
iOS releaseManual workflow: fastlane builds the IPA → Firebase App Distribution (development) or TestFlight (production). Added 05–06/10/2026.
Android releaseManual workflow: APK → Firebase App Distribution (development, since 06/2025), or AAB → Play Store internal track (production, added 12/10/2026).
Versioningversion.config.json shared by both pipelines (1.7.3, Android code 58). The Xcode project still says 1.7.2, so local builds show "1.7.2 (1)".
Bundle idcom.flyer.partner for every environment: staging and production cannot sit on the same phone.
Branchesdev is the real trunk; main last updated 08/2024.
Activity 202662 commits (two engineers wrote 61). By month: Jan 22 · Feb 1 · Mar 4 · Apr–Jun 0 · Jul 1 · Aug 17 · Sep 3 · Oct 1–14: 14. 8 of the last 10 pull requests are CI/build work.

5Engineering risks

RiskLevel
Android release keystore and its password are committed to the repository.High
Session token stored in plain AsyncStorage, not Keychain/Keystore. Apollo developer tools are enabled in production builds.Medium
Local and debug builds write to production data by default.Medium
One test file, and it is broken; CI never runs tests.Medium
No product events: feature adoption on the app cannot be measured.Medium
OpenAPI generator downloads the spec from staging-api.flyer.vn while the app calls .flyer.us.Low

Local build steps for the iOS Simulator (pod install, codegen, Xcode 26.4 workaround now merged in #62) were verified on 15/10/2026 and are kept by the product team; the repository README does not cover them.

Updated 15/10/2026 · Related: FLYER Teacher PRD catalog · Measurement events · What's new PRD · UI/UX rating of teacher.flyer.us