Download Android v1.0.0 · Design System · System Audit
Kudlit is a Flutter app for Baybayin discovery: scan glyphs, translate Filipino text, practice lessons, and get guidance from Butty, the app's learning companion. It combines a playful Filipino visual identity with practical mobile workflows for learners who want to recognize, write, and understand Baybayin without jumping between separate tools.
- Scan Baybayin glyphs with a camera-first scanner on Android and a web preview path for browser testing.
- Translate in both directions between Filipino text and Baybayin Unicode, with clearer input surfaces for longer writing.
- Learn by doing through lessons, glyph references, quiz surfaces, and sketch-oriented practice flows.
- Ask Butty for help through AI-assisted explanation surfaces designed to show user-facing answers, not raw prompt scaffolding.
- Built mobile first with responsive auth, scan, translate, learn, profile, settings, and legal flows hardened across portrait and landscape checks.
- Brand-led interface using the bundled Kudlit design system, Baybayin display font, and original Butty/learning artwork.
The current public Android package is available from the GitHub Release:
- Version:
v1.0.0 - APK:
app-release.apk - Verified device metadata:
versionName=1.0.0,versionCode=2
- Install: Open the
v1.0.0GitHub Release, download the Android APK, and install Kudlit. - Enter: Start on the branded welcome screen and continue as a guest for the fastest demo path.
- Scan: Open Scan, show the camera/gallery controls, and explain that Kudlit is built for Baybayin recognition with clear fallback states.
- Translate: Switch to Translate, type a Filipino phrase, and show the Baybayin Unicode output flow.
- Learn: Open Learn to show lessons, glyph references, and quiz-oriented practice.
- Ask Butty: Switch to Butty and show the companion as the support layer for explanations and learning guidance.
- Close: Point back to the APK release and the bundled design system as proof that the app is packaged, branded, and ready for hands-on testing.
| Surface | What it does |
|---|---|
| Scan | Camera and gallery-based Baybayin recognition with responsive scanner controls and clear fallback states. |
| Translate | Filipino-to-Baybayin and Baybayin-to-Filipino translation surfaces with copy/share/explain affordances. |
| Learn | Lessons, glyph references, quiz entry points, and mobile-friendly study cards. |
| Butty | Companion guidance for explanations, learning support, and AI-assisted help surfaces. |
| Auth/Profile/Settings | Branded account entry, legal pages, profile polish, and safer navigation patterns. |
- 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, learning, profile, and settings 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"pwsh -NoProfile -ExecutionPolicy Bypass -File scripts/scan-layout-overlap-pass.ps1This strict pass runs test/features/scanner/presentation/widgets/scan_tab_responsive_matrix_test.dart, captures matrix and transition screenshots, and writes:
qa-artifact/scan-layout-strict-overlap/report.jsonqa-artifact/scan-layout-strict-overlap/scan-layout-overlap-contact-sheet.htmlqa-artifact/scan-layout-strict-overlap/matrix/qa-artifact/scan-layout-strict-overlap/transitions/
Latest verified timestamp: 2026-05-10T18:08:55.7427350+08:00.
Default matrix set in script:
360x740,390x844,430x932,844x390,1024x768- strict tiny stress widths:
340x260,320x240
Transition stress test uses:
- URL query
qa_camera_status=unavail-ready - phases:
early,mid,late - waits: 300ms, 1200ms, 2100ms
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/ Auth feature slice
│ ├── scanner/ Scanner detection, model, and camera logic
│ ├── translator/ AI/chat translation and memory logic
│ └── learning/ Lesson and reference logic
└── 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: active Baybayin transliteration and Gemma-assisted interpretation surfaceslearn: active 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.







