Skip to main content

Documentation Index

Fetch the complete documentation index at: https://mintlify.com/AlonsoSam/vozi-android/llms.txt

Use this file to discover all available pages before exploring further.

When a child opens VOZI, the app takes them from a pastel welcome screen straight to their learning path — no account creation, no password, no friction. A parent or educator sets up a profile once, and the child taps their avatar card to jump into a Duolingo-style phoneme map where each station represents a Spanish sound to practice. The entire child-facing flow is designed for ages 4–7: large tap targets, emoji avatars, animated station circles, and a single forward-moving path with clear visual states.

Welcome Screen and Profile Selection

The app opens on WelcomeScreen, which shows the VOZI logo, the tagline, and a white rounded card with a large coral Iniciar button. Tapping it pushes ProfilesScreen onto the navigation stack via AppRouter.profiles.
1

App opens

WelcomeScreen is displayed. No login is required for children.
2

Tap Iniciar

The app navigates to ProfilesScreen (/profiles), which lists all child profiles stored locally on the device.
3

Select a profile

Tapping a profile card calls ProfileScope.of(context).select(profile.id) and pushes ChildHomeScreen (/home).
4

No profiles yet

If no profiles exist, an empty-state view appears with a single Crear perfil button that navigates to CreateProfileScreen.
Children never log in. Authentication is optional and adults-only (via Supabase). Profile data is stored locally on the device using shared_preferences and can optionally sync to the cloud from the parent dashboard.

Creating a Profile

CreateProfileScreen collects three pieces of information before creating the profile and navigating directly to ChildHomeScreen. The name field accepts a nickname or alias — the app explicitly avoids using real names.

Name (alias)

A short nickname or alias for the child. Real names are not required. The hint text reads “Apodo del niño o niña”.

Age Band

Choose between 4 a 5 años (AgeBand.young, code 4-5) and 6 a 7 años (AgeBand.older, code 6-7). Shown as two large tap targets.

Avatar

One of 8 emoji avatars displayed in a centered wrap grid. The selection is shown as a large preview at the top of the screen.
The ChildProfile model fields are:
FieldTypeDescription
idString (UUID)Stable unique identifier, compatible with Supabase
nameStringChild’s alias/nickname
ageBandAgeBandyoung (4–5) or older (6–7)
avatarAvatarOptionSelected avatar from the 8-option catalog
pointsintTotal points earned (starts at 0)
completedPhonemesSet<String>Phoneme codes completed at ≥90% accuracy
practicedPhonemesSet<String>Phoneme codes attempted at least once
updatedAtDateTimeLast local modification timestamp (UTC)
isDirtyboolWhether there are unsynced local changes
deletedAtDateTime?Tombstone timestamp; non-null means the profile is soft-deleted (hidden in UI, pending Supabase propagation)

Available Avatars

The 8 avatars are defined in AvatarOption.all. The key is what gets saved and synced; the emoji is display-only. The first 6 keys are cross-platform compatible with VOZI iOS.
KeyEmojiTint Color
fox🦊VoziTheme.peach
bear🐻VoziTheme.sunshine
cat🐱VoziTheme.bubblegum
owl🦉VoziTheme.lavender
fish🐠VoziTheme.teal
starVoziTheme.coral
rabbit🐰VoziTheme.sky
dog🐶VoziTheme.mint

The Phoneme Learning Path

ChildHomeScreen displays a Duolingo-style path under the heading Tu camino de sonidos. Each of the 9 phonemes appears as a circular station that zigzags down the screen using a custom _PathConnectorPainter with cubic Bézier curves. Stations alternate left and right. The currently active station has an animated pulsing ring (_PulseRing) and a floating ¡Vamos! badge.

Station States

Each station is rendered according to a _Stop enum value computed by _ProgressPath._statusFor():
StateVisualCondition
completed✓ check icon + gold star accentPhoneme is in completedPhonemes (≥90% session)
availablePhoneme code text + play badgeAccessible; previous phoneme has been practiced
locked🔒 lock icon, muted gradientPrevious phoneme has not yet been practiced
premiumLocked👑 crown icon, gold gradientApp is not in Premium mode and phoneme is not R
Only the R phoneme is free. All other phonemes (RR, S, L, TR, PR, PL, BR, BL) are premiumLocked in the free tier and show a message prompting children to ask an adult. Premium is managed exclusively in the parent dashboard.

Phoneme Progression Order

The 9 phonemes are declared in Phoneme enum order. A phoneme is unlocked when the phoneme at order - 1 appears in practicedPhonemes (any result unlocks the next; the 90% threshold only gates the reward, not progression).
OrderCodeDisplay NameColor TokenHex
0RRVoziTheme.coral#FF7373
1RRRRVoziTheme.peach#FF9E6B
2SSVoziTheme.sunshine#FFC74D
3LLVoziTheme.sky#59A8F5
4TRTRVoziTheme.mint#4DCCA3
5PRPRVoziTheme.lavender#AD8FF0
6PLPLVoziTheme.bubblegum#F780BD
7BRBRVoziTheme.teal#33BDC7
8BLBLVoziTheme.grape#8C75EB
Colors are resolved by VoziTheme.phonemeColor(code) and used consistently for station circles, connector curves, exercise screens, and reward cards.

Age Band Experience

The age band selected at profile creation (AgeBand.young for 4–5, AgeBand.older for 6–7) is stored with the profile and displayed on the child home screen header below their name. In the current implementation the age band is informational and guides the overall educational intent of the app:
  • 4–5 years (young): More audio support is expected; the Listen button is the primary interaction before speaking.
  • 6–7 years (older): Greater autonomy; children are expected to attempt speaking sooner.
The age band is also passed to attempt metrics when syncing to Supabase, so educators can segment progress data by age group.

Progress Reset

Adults can reset a child’s progress from two places in the app — both protected by the parent PIN gate:
1

Via the child home menu

Tap the overflow menu (⋮) on ChildHomeScreenReiniciar progreso. A confirmation dialog appears before any data is cleared.
2

Via the parent dashboard

Navigate to the parent dashboard → tap the red Reiniciar progreso button at the bottom.
Resetting progress sets points to 0, clears completedPhonemes and practicedPhonemes, and deletes the local attempt history. The profile itself (name, avatar, age band) is not deleted. The reset is marked isDirty = true so the next Supabase sync propagates the reset to the cloud.

Build docs developers (and LLMs) love