Kid_learning

Kid Learning (Kidlearning)

A kidsโ€™ English/Chinese vocabulary and speaking-practice app, packaged as a native iOS app using Capacitor.

Features

Tech stack

Project structure

.
โ”œโ”€โ”€ web/                        # Source of truth for the app's web content
โ”‚   โ”œโ”€โ”€ index.html              #   โ€” edit this file for any app changes
โ”‚   โ”œโ”€โ”€ BG/                     #   โ€” background images
โ”‚   โ””โ”€โ”€ dialogue/                #   โ€” dialogue/speaking practice assets
โ”œโ”€โ”€ ios/
โ”‚   โ””โ”€โ”€ App/                    # Native iOS Xcode project
โ”‚       โ”œโ”€โ”€ App.xcodeproj
โ”‚       โ”œโ”€โ”€ App.xcworkspace
โ”‚       โ”œโ”€โ”€ Podfile
โ”‚       โ””โ”€โ”€ App/
โ”‚           โ”œโ”€โ”€ AppDelegate.swift
โ”‚           โ”œโ”€โ”€ Info.plist
โ”‚           โ””โ”€โ”€ public/         # Generated copy of web/ โ€” DO NOT edit directly,
โ”‚                                #   it gets overwritten by `npx cap sync ios`
โ”œโ”€โ”€ package.json
โ”œโ”€โ”€ capacitor.config.json       # webDir points at "web"
โ””โ”€โ”€ codemagic.yaml              # CI build + TestFlight publish pipeline

โš ๏ธ Only edit files inside web/. The ios/App/App/public/ folder is a build artifact, regenerated from web/ every time npx cap sync ios runs (including automatically on every Codemagic build). Changes made directly inside ios/App/App/public/ will be silently overwritten.

Local development

Since this is a plain HTML/JS app, you can just open web/index.html directly in a browser to work on layout, content, or quiz logic โ€” text-to-speech will use the browserโ€™s built-in Web Speech API in that case.

To test the native TTS plugin and other native behavior, you need to build and run the iOS app itself (see below).

Building the iOS app

npm install
npx cap sync ios
cd ios/App
pod install

Then open ios/App/App.xcworkspace in Xcode (not the .xcodeproj) and build/run as usual.

CI (Codemagic)

Every push to main triggers an automated build defined in codemagic.yaml, which:

  1. Installs Capacitor + the text-to-speech plugin
  2. Runs npx cap sync ios (copies web/ into ios/App/App/public/, generates capacitor.js, and updates the Podfile with plugin dependencies)
  3. Installs CocoaPods dependencies
  4. Sets up code signing
  5. Bumps the build number to one above the latest build already on TestFlight (fetched live from App Store Connect, so it never collides with a previous upload)
  6. Builds and archives the .ipa
  7. Uploads to TestFlight and emails a notification

Before this pipeline will work, make sure codemagic.yaml has:

Text-to-speech notes

Troubleshooting