Kudlit is a vision-based Baybayin translator and learning app built in Flutter. This repository now treats the bundled Kudlit Design System as the visual source of truth and mirrors it through a Flutter theme, shared assets, and branded placeholder screens.
- App shell and auth flow use a shared Flutter design-system layer under
lib/core/design_system/. - The bundled Baybayin display font and reference assets are copied into
assets/fonts/andassets/brand/for normal Flutter usage. - The home shell, scanner, translator, and learning surfaces are active Flutter feature slices using the shared Kudlit visual system.
- The original design-system source remains in
Kudlit Design System/for previews, reference JSX, and asset provenance.
| Layer | Technology |
|---|---|
| Framework | Flutter (Dart) |
| State management | Riverpod (riverpod_annotation) |
| Routing | go_router |
| Backend auth | Supabase |
| Character detection | YOLO → TFLite (ultralytics_yolo) |
| Language understanding | Gemma 4 |
| Error handling | Either<Failure, T> via fpdart |
flutter doctor
flutter pub get
flutter run -d chromeUseful commands:
flutter analyze
flutter test
flutter build web
dart format lib/ test/The repository includes two web deployment paths:
build.shfor Cloudflare Pages. Configure the build command asbash build.shand the output directory asbuild/web..github/workflows/deploy-pages.ymlfor GitHub Pages. It runs on pushes tomainand can also be started manually from GitHub Actions.
Both deployment paths expect these repository or platform secrets:
SUPABASE_URLSUPABASE_ANON_KEYGEMINI_API_KEYHUGGINGFACE_TOKENis optional.
After a deployment is live, smoke-check the main web routes:
pwsh -NoProfile -ExecutionPolicy Bypass -File scripts/prod-smoke.ps1 -BaseUrl "https://acsadians.github.io/kudlit-app"From kudlit-app/, run:
pwsh -NoProfile -ExecutionPolicy Bypass -File scripts/verify-translate-header-ui.ps1
pwsh -NoProfile -ExecutionPolicy Bypass -File scripts/verify-translate-header-ui.ps1 -Tabs "scan,translate,learn,butty" -Widths "768,1024,1366,1920" -SkipTestsThe script:
- runs
test/features/home/presentation/widgets/translate_density_test.dartunless-SkipTestsis set, - captures screenshots under
test-results/ui-verify/with names liketranslate-header-<tab>-<width>.png, - starts a local static preview only if the target URL is not already reachable.
pwsh -NoProfile -ExecutionPolicy Bypass -File scripts/verify-translate-header-ui.ps1Capture-only pass (skip translate_density_test.dart):
pwsh -NoProfile -ExecutionPolicy Bypass -File scripts/verify-translate-header-ui.ps1 -SkipTestsCustom capture width set:
pwsh -NoProfile -ExecutionPolicy Bypass -File scripts/verify-translate-header-ui.ps1 -Widths "768,1024,1366,1920,1536"lib/
├── app/ App bootstrapping, router, app constants
├── core/
│ ├── config/ Environment and Supabase setup
│ ├── design_system/ Flutter theme, color tokens, shared UI shells
│ ├── error/ Shared failures and exceptions
│ └── usecases/ Base use case abstractions
├── features/
│ └── auth/ Current implemented feature slice
└── main.dart
assets/
├── brand/ Copied Kudlit illustrations and reference art
└── fonts/ Baybayin display font used in the UI
Kudlit Design System/ Reference docs, CSS tokens, previews, JSX UI kit
The app follows feature-first clean architecture:
presentation -> domain <- datadomainstays pure Dart- repositories are defined in
domainand implemented indata - app-wide visual decisions live in
core/design_system/, not inside feature widgets
Current feature intent:
auth: implemented and now wrapped in the branded Kudlit auth shellscanner: native live YOLO scanning plus web webcam preview with capture-based TFLite detection from the active vision model URLtranslator: planned Baybayin transliteration and Gemma-assisted interpretationlearn: planned lessons, quizzes, and reference content
- Token source:
Kudlit Design System/colors_and_type.css - Brand guidance:
Kudlit Design System/README.md - Local repo workflow notes: SKILL.md
- Gemini CLI entrypoint: GEMINI.md
- Repo-local Gemini frontend skill: skills/flutter-frontend/SKILL.md
Important limitation:
- The design docs specify Geist for the UI font, but this repository currently only bundles the Baybayin display font. The shared Flutter theme already applies the Kudlit color, radius, and spacing language, and Baybayin headings use the bundled font directly.
Install obra/superpowers in Gemini CLI:
gemini extensions install https://github.com/obra/superpowersThis repository also includes a local Gemini extension:
Recommended usage:
- Use
obra/superpowersfor process skills such as brainstorming, planning, debugging, TDD, and review - Use the local
flutter-frontendskill for Kudlit-specific Flutter UI and design-system implementation
- Keep UI mobile-first even when using Chrome as the design target.
- Do not bypass
core/design_system/for shared colors, type, surfaces, or brand assets. - Keep widgets focused on display; move business logic into Riverpod notifiers and use cases.
- Prefer relative imports within a feature and
package:kudlit_ph/...across features. - Use single quotes and explicit types.
For repo-level coding rules and architecture constraints, read CLAUDE.md.