Dit is a Morse code practice app for web and iOS. It offers various modes to help users learn and practice Morse code, providing instant feedback and tracking progress. The app is built using a monorepo architecture with shared logic and native modules for audio and haptic feedback.
- Convenient daily practice — Easy to use and accessible for consistent learning
- Auditory reflex over decoding — Build direct sound-to-character recognition rather than analytical translation
- Koch method foundation — Start at manageable speeds with Farnsworth spacing and high-frequency characters
- Variable speed training — Gradually increase effective speed through adjustable Farnsworth spacing
- Early meaningful words — Learn high-frequency characters first to form words quickly
- Self-paced progression — Carousel structure removes rigid linear requirements
Practice — Match the prompted letter. Get it right, move on. Get it wrong, start over.
Freestyle — Tap out whatever you want and see what letter it is. Word mode lets you spell things out.
Listen — Hear a letter, type the answer.
- Turborepo monorepo with shared Morse logic in
packages/core - Web app in
apps/web(Vite + React) - iOS app in
apps/ios(Expo + React Native) - Native bridge in
modules/dit-native(audio, haptics, glass view) - Firebase Auth + Realtime Database for sync
- UI intent: web ships custom React components; iOS prefers Expo UI/SwiftUI components when available, with React Native fallbacks as needed
apps/web— web client, unit tests inapps/web/tests/unit, e2e tests inapps/web/tests/e2eapps/ios— iOS app, assets inapps/ios/assets, native code inapps/ios/iosandapps/ios/nativepackages/core— shared Morse logic + typesmodules/dit-native— Expo native modulescripts— repo tooling helpers
Install deps:
pnpm installWeb app:
pnpm --filter @dit/web deviOS app simulator:
pnpm --filter @dit/ios iosiOS app on physical device:
pnpm --filter @dit/ios ios --deviceRun all dev servers via Turbo:
pnpm run devpnpm run build
pnpm run lint
pnpm run test:unit
pnpm run test:e2e
pnpm run test:typespnpm run deploy # builds web app and deploys to Firebase- Root
.envfor shared config apps/ios/.envfor Expo-specific configapps/ios/GoogleService-Info.plistfor Firebase iOS config (local only, copy fromapps/ios/GoogleService-Info.example.plist)
See docs/ for detailed references:
- APP_BEHAVIOR.md — intended behavior across platforms
- IOS_APP_STORE_RELEASE.md — iOS build, export, and upload flow
- STYLE_GUIDE.md — code style and naming conventions
- NATIVE_IOS.md — iOS native module details
- PEDAGOGICAL_PHILOSOPHY.md — learning methodology