LatihIsyarat
Public sourceAn offline sign recognition app: 24 static ASL letters, with J/Z motion recognition developed on a separate branch.
A campus project-based learning (PBL) project assessed for semester progression.
My contribution highlights
- Worked on image preprocessing, TensorFlow Lite classification, label mapping, and model identifier validation.
- Built J/Z GRU training/evaluation, sequence feature contracts, labels/metadata, video-grouped splits, and TFLite conversion including float16.
- Integrated J/Z target practice and free mode with clip controls, timeouts, stale result rejection, and session cancellation.
Contents · 8 contribution modules
Main workflow
6 stepsCamera/photo input becomes letter predictions and practice history. Static poses and J/Z motion follow separate paths according to their implementation branch.
01Capture practice input
Choose a camera or photo
UserFind a usable hand
Hand detector
02Recognise poses or motion
Prepare model input
App preprocessorRun offline inference
TensorFlow Lite
03Show and save practice
Read results and guidance
Flutter appLocal history and progress
SQLite & app state
Process details & branches
Choose a camera or photoUser
Start practice using the camera or a photo/upload. Dynamic recognition requires a motion clip with user-controlled start and end.
Find a usable handHand detector
Hand regions or landmarks provide the input for recognition.
Is hand input available?
- Detected. Continue with preprocessing for the recognition path.
- Not usable yet. Input does not produce a usable recognition result; the user needs to adjust the hand position or image.
Prepare model inputApp preprocessor
The input format depends on the type of letter being recognised.
Which recognition path?
- Static poses · default branch. The hand region becomes classifier input for 24 static letters.
- J/Z motion · rama branch. Landmarks across frames become sequence features for a GRU model.
Run offline inferenceTensorFlow Lite
The model predicts a label. J/Z development also handles late results, timeouts, and session cancellation.
Read results and guidanceFlutter app
Predictions feed into the practice display, target letters, and guidance to help users understand recognition results.
Local history and progressSQLite & app state
Save practice activity, manage progress, and release the camera when a session closes or the app changes state.
The default branch contains 24 static letters. J/Z motion, 26-letter progress, and session control are developed on the rama branch.
About LatihIsyarat
LatihIsyarat is a Flutter application for learning the ASL alphabet. Users can practise through the camera, photos or uploads, read letter guidance, and view practice history and progress. Recognition runs offline using TensorFlow Lite, while history is stored locally in SQLite.
I worked on hand detection, image preprocessing, camera recognition integration, J/Z motion development, learning progress, and testing. The default path covers 24 static letters; I developed J/Z on the rama branch.
My contributions
Hand detection in photos and uploads
I developed hand detection for still images and connected it to the photo/upload workflow. I handled hand region selection, input that is not yet suitable for processing, and the connection between detection results and the classifier. This sends user-selected images through the appropriate recognition stages.
Preprocessing and the TensorFlow Lite classifier
I worked on image preprocessing to match the model’s expected input, invoked the TensorFlow Lite classifier, and mapped prediction labels to application results. I also improved model identifier validation and classifier tests so model or label mapping errors can be handled at the recognition layer.
J/Z training package and model contract
On the rama branch, I built a Python J/Z training/evaluation package using sequence features and a GRU model. I prepared labels, metadata, and preprocessing contracts, grouped data by source video, and recorded split manifests. I also checked conversion to TensorFlow Lite, including float16 variants, and archived static model sources.
Hand landmarks and native Android integration
I connected MediaPipe components, detectors/landmarks, frame encoders, sequence preprocessing, and the J/Z classifier. I worked on the native Android/Kotlin bridge and isolate inference so camera frames can become sequence features consumed by the motion recognition service.
J/Z target practice and free mode
I integrated J/Z target practice and a free mode combining static pose and motion recognition. J/Z clips use user-controlled start/end actions. I configured timeouts, rejected results arriving from old sessions, and handled cancellation to keep predictions associated with the active session.
Camera lifecycle and session storage
I fixed camera release when users change pages or the application enters the background. I also handled history storage for interrupted sessions so saving and camera shutdown do not interfere. This work supports camera stability during practice and when stopping a session.
History, 26-letter progress, and guidance
I extended history models and progress to cover 26 letters in the J/Z development, fixed weekly practice markers based on activity dates, and added explanations of J/Z movements to the guide. I also refined practice controls, guidance pages, and progress displays connected to local session data.
Service and application integration tests
I wrote tests for classifiers, hand detectors, J/Z services, camera integration, history, gamification, and guidance. The focus includes input/output contracts, session handling, and connecting recognition results to learning workflows. This development remains distinct from the default branch’s 24-static-letter path.
Fields & core technologies
Project fields
Core technologies
20 commits in the last 12 months
All branches| Nov | Dec | Jan | Feb | Mar | Apr | May | Jun | Jul | Aug | Sept | Oct | Nov | |||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Sunday | |||||||||||||||||||||||||||||||||||||||||||||||||||||
| Monday | |||||||||||||||||||||||||||||||||||||||||||||||||||||
| Tuesday | |||||||||||||||||||||||||||||||||||||||||||||||||||||
| Wednesday | |||||||||||||||||||||||||||||||||||||||||||||||||||||
| Thursday | |||||||||||||||||||||||||||||||||||||||||||||||||||||
| Friday | |||||||||||||||||||||||||||||||||||||||||||||||||||||
| Saturday |
How it is counted · 1 repo · 6 branch
My authored commits reachable from all remote branches at sync time. Each SHA is counted once, even across branches or forks. Merge commits are excluded. Dates use the author timestamp in Western Indonesia Time (UTC+7), rather than push time. The current streak remains active when the last commit was yesterday and today is still in progress.
This calendar covers commits across all branches. Its totals may differ from GitHub’s contribution calendar, which includes other activity types and follows its own branch rules. This calendar covers only the project you are viewing.
Contribution history
20 of my non-merge commits · All branches · Data as of 3 November 2026.
Public commit examples
7d2a84a· Fix JZ stale results, bounded waits, interrupted sessions and compact controlsc222ac8· feat(progress): include JZ history and 26-letter learning progressc2c9ebc· feat(camera): integrate JZ target gestures and mixed free practice8cf16a8· feat: add independent J/Z backend and frontend integration docs