# Sunbird Saral Overview

Overview

Sunbird Saral attempts to create a connection between the information that exists in the physical world and ties it to digital structured information.

Saral literally means simplicity, has been conceptualized to enable users to create structured digital information using mobile devices. The process is also called Saralify or Phygitization. Saral should be viewed as an OCR-plus application that is capable of doing OCR and can also understand the structure of the physical input.

Saral v1.x works as an edge location solution to phygitize  data on physical layout printed sheets and upload the data to the backend. This backend data will be then pushed to [`CQube`](https://cqube.sunbird.org) (Analytics system) for insights and take actions accordingly.

[`Saral SDK`](/engage/saral-sdk-source-code-repository)  is  the core Phygitization component interfaced with [`Saral Layout Specification`](/learn/specifications/layout-specification). Saral v1.x App is a reference Android App built on [`Saral SDK`](/engage/saral-sdk-source-code-repository)&#x20;

[`Saral SDK`](/engage/saral-sdk-source-code-repository)  can be used to build custom Android applications with OCR capabilities(OMR, Handwritten Digit recognition)`. Refer` [Application Architecture](/learn/saral-app-architecture) for more details about [`Saral SDK`](/engage/saral-sdk-source-code-repository)

Download the Saral poster below to get a brief overview of how Saral can make a difference:

{% file src="/files/XVFt6KH6MMmbBedgOR8Z" %}

&#x20;                                               &#x20;


# Saral Quick Guide

* Is SARAL for you? - Discuss more [here](https://github.com/orgs/Sunbird-Saral/discussions/91)

## **Getting Started**

* What kind of team will you need? - [Refer](https://docs.google.com/document/d/1pLTSwwak-u9CGl1IMyFbeFmgHH69kG_e/edit#heading=h.3znysh7)
* What kind of hardware you need to run SARAL smoothly?
  * Saral backend Production deployment - [Refer](https://docs.google.com/document/d/1pLTSwwak-u9CGl1IMyFbeFmgHH69kG_e/edit#heading=h.2jxsxqh)
  * Saral backend local/dev setup - [Refer](https://docs.google.com/document/d/1pLTSwwak-u9CGl1IMyFbeFmgHH69kG_e/edit#heading=h.1t3h5sf)
* What are the prerequisites for installation?
  * Saral backend - [Refer](https://docs.google.com/document/d/1pLTSwwak-u9CGl1IMyFbeFmgHH69kG_e/edit#heading=h.30j0zll)
  * Saral frontend - [Refer](https://docs.google.com/document/d/1Z_9HBaB_I1vAM7FQ3XhNL0f0bkl8j4BN/edit?usp=share_link\&ouid=114303898945073408189\&rtpof=true\&sd=true)

## **Use Saral**

* How to setup the frontend (app) - [Refer](https://docs.google.com/document/d/1Z_9HBaB_I1vAM7FQ3XhNL0f0bkl8j4BN/edit?usp=share_link\&ouid=114303898945073408189\&rtpof=true\&sd=true)
* How to set up the backend
  * local/development setup - [Refer](https://docs.google.com/document/d/1pLTSwwak-u9CGl1IMyFbeFmgHH69kG_e/edit#heading=h.3dy6vkm)
  * Production deployment - [Refer](https://docs.google.com/document/d/1pLTSwwak-u9CGl1IMyFbeFmgHH69kG_e/edit#heading=h.44sinio)
* What is training the app, why is it necessary, what you get out of the box wrt training, how to train the app more?
  * SARAL uses ML model to detect digits/ alpha-numeric characters, so in order to get better accuracy in detection, training of the model is required. Steps to train [Refer](https://github.com/Sunbird-Saral/react-native-saral-sdk/tree/develop/ml_models)
* How to conduct a pilot for SARAL - KGBV assessments [Refer](https://docs.google.com/document/d/1SMV2VRhOpEB1n8foHdK70X1--KSI0CPl/edit?usp=share_link\&ouid=114303898945073408189\&rtpof=true\&sd=true)
* How to conduct QA testing on SARAL - [Refer](https://docs.google.com/document/d/1dQtFgG0kxlL0BQ0o-k4p8RPn9vdbI7K3/edit?usp=sharing\&ouid=108822542868117713442\&rtpof=true\&sd=true)
* Performance benchmarking of SARAL(production setup) - [Refer](https://docs.google.com/document/d/118ZMNR-1N4HsOyB61PwNJZWcpuscalrS/edit?usp=sharing\&ouid=108822542868117713442\&rtpof=true\&sd=true)
* How to conduct a full-scale rollout of SARAL for my use case - NAT assessment case study in UP [Refer](https://docs.google.com/document/d/1SMV2VRhOpEB1n8foHdK70X1--KSI0CPl/edit?usp=share_link\&ouid=114303898945073408189\&rtpof=true\&sd=true)

## **How to Enhance Saral**

* What all aspects of the app are configurable - [Refer](/learn/features/configurable-branding)
* How to create & add a new form in SARAL for assessments?
  * To create new form layout you can use this tool. [Refer](https://github.com/Sunbird-Saral/Saral-Layout-Generator/blob/main/README.md)
  * After form layout is created take a pdf printout and follow this doc to generate ROI [Refer](https://docs.google.com/document/d/1hLWCCaj0DlX9uaMOFDY331ZIqDcnfGjRhGJdqpYJMRg/edit)
* How to make customizations in the app and still be able to get SARAL upgrades?\
  A front end developer with React native skills should be able to customize and upgrade refering this documentation

## **Monitor SARAL**

* How can I monitor the health of my instance - [Refer](https://docs.google.com/document/d/1pLTSwwak-u9CGl1IMyFbeFmgHH69kG_e/edit#heading=h.1pxezwc)
* How can I track the usage of the instance ( telemetry)?\
  Through play console & firebase

## **Support & contribute**

* How can I seek support for SARAL?\
  Through github discussion forum [Link](https://github.com/orgs/Sunbird-Saral/discussions)
* How can I suggest improvements for SARAL?\
  Through github discussion forum [Link](https://github.com/orgs/Sunbird-Saral/discussions)

## Want to experience Saral?

Write to us about your usecase [here](https://github.com/orgs/Sunbird-Saral/discussions)


# Saral Implementation Manual

Click on the file  below to download the PDF version of the Saral transformation story and the implementation details.

{% file src="/files/nAnXHPc6gkh3a5orrBhL" %}


# Software Requirement

Software Requirement for Development or Maintenance

| Technology       | Purpose                                                                                                                                   | Reference                                           |
| ---------------- | ----------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------- |
| **OpenCV**       | Real time computer vision technology for OCR use cases.Used in Saral App to capture ROI(Region Of Interest) images for AI/ML predictions. | [https://opencv.org/](https://opencv.org)           |
| **TensorFlow**   | Machine Learning Platform for OCR use cases.Used in Saral App development.                                                                | [https://tensorflow.org/](https://tensorflow.org)   |
| **Android**      | Andorid App Development.Used in Saral App development.                                                                                    | [https://www.android.com/](https://www.android.com) |
| **React Native** | Reactive Native App development.Used in Saral App development.                                                                            | [https://reactnative.dev/](https://reactnative.dev) |
| **MongoDB**      | Backend data store **(Reference backend Implementation)**                                                                                 | [https://www.mongodb.com/](https://www.mongodb.com) |
| **Docker**       | DevOps **(Reference backend Implementation)**                                                                                             | [https://www.docker.com/](https://www.docker.com)   |
| **NodeJS**       | **Reference backend API Implementation**                                                                                                  | <https://nodejs.org/en/>                            |
| **Java 8**       | Android Layer code in SaralSDK , OpenCV Libraries                                                                                         | <https://www.java.com/>                             |


# Application Architecture

Application Architecture of Saral App

**Overall Architecture**

![](/files/1gi7eufoCIef7dABgqYl)

* [ ] Refer [`CQube`](https://cqube.sunbird.org)for documentation
* [ ] Saral uses [Tensorflow Lite](https://www.tensorflow.org/lite) AI/ML model embedded within Android Application for predicting Handwritten digits.
* [ ] Each layout is configurable in the backend as JSON. Refer [Layout specification](/learn/specifications/layout-specification) and[Layout configuration](/use/layout-configuration) for more details.

**Saral SDK and Application Architecture**

![](/files/c3FpCRtyUcRyPITkhDRA)

* [ ] [**Saral SDK**](/engage/saral-sdk-source-code-repository) is an Android and React Native Software Development kit with core logic to predict  handwritten digits and OMR bubbles.
* [ ] [**Saral SDK**](/engage/saral-sdk-source-code-repository) accepts layout JSON as input and enriches the JSON with predictions and sends back the response. Refer [Layout specification](/learn/specifications/layout-specification)
* [ ] [**Saral SDK**](/engage/saral-sdk-source-code-repository) component can be reused for Android and React Native App development with handwritten digits and OMR bubbles prediction capabilities.

**Handwritten Digits ML Model**

Handwritten Digits Machine Learning model is build using Python,Keras ,Tensor-flow technologies.

This Machine Learning model is built on [Resnet164](https://arxiv.org/abs/1603.05027) Architecture.

To embed this model in Android SDK/Application , its converted from HDF5 to TFLite format.

Model is trained on MNIST Handwritten digits open data-set along with handwritten digits from the field.

[OpenCV](https://opencv.org/) is used for capturing ROI’s(Region Of Interest) and processing images before passing them to ML model for prediction.

![](/files/bcZiUpkL2RaNkqxdYNsx)

**OMR(Optical Mark Recognition) Detection**

For OMR detection [Saral SDK](https://saral.sunbird.org/engage/saral-sdk-source-code-repository) uses OpenCV Computer Vision Technology to capture answer sheet images , sub-divide them into individual ROI(Region of Interest Images).

Individual ROI(Region Of Interest) images of answer sheet are processed using [OTSU thresholding](https://learnopencv.com/otsu-thresholding-with-opencv/) in OpenCV and predict if OMR bubble is filled or unfilled using pixel count.

![](/files/Bnhtenpj8cJQ2W9IoJWl)


# Features

Saral App Features

<figure><img src="/files/zCyhh2ihbAt2FCehgodu" alt=""><figcaption></figcaption></figure>


# Configurable Branding

Branding of App is configurable through backend APIs

Saral v1.0 App supports configurable branding feature. As this application will be used by different states , this feature will avoid maintaining different frontend source code to customise color themese and logs displayed.

Logo and theme colors can be customised by using below REST APIs. To understand more on these APIs , refer swagger documentation.

```
GET  /brand
GET  /brand/default
```

Refer sample brand json returned by `GET /brand` API below. If entry without state value is configured in backend , it will be used as default theme and logo.

```
{
    "appName": "Saral OCR App",
    "themeColor1": "#D72819",
    "themeColor2": "#FBE9E7",
    "themeColor3": "#ACCCCE",
    "themeColor4": "#FF5733",
    "themeColor5": "#e5b6b3",
     "logoImage": "/9j/4AAQSkZJRgABAQEASABIAAD/7QA4UGhvdG9zaG9wIDMuMAA4QklNBAQAAAAAAAA4QklNBCUAAAAAABDUHYzZjwCyBOmACZjs+EJ+/+ICNElDQ19QUk9GSUxFAAEBAAACJGFwcGwEAAAAbW50clJHQiBYWVogB+EABwAHAA0AFgAgYWNzcEFQUEwAAAAAQVBQTAAAAAAAAAAAAAAAAAAAAAAAAPbWAAEAAAAA0y1hcHBsyhqVgiV/EE04mRPV0eoVggAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKZGVzYwAAAPwAAABlY3BydAAAAWQAAAAjd3RwdAAAAYgAAAAUclhZWgAAAZwAAAAUZ1hZWgAAAbAAAAAUYlhZWgAAAcQAAAAUclRSQwAAAdgAAAAgY2hhZAAAAfgAAAAsYlRSQwAAAdgAAAAgZ1RSQwAAAdgAAAAgZGVzYwAAAAAAAAALRGlzcGxheSBQMwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB0ZXh0AAAAAENvcHlyaWdodCBBcHBsZSBJbmMuLCAyMDE3AABYWVogAAAAAAAA81EAAQAAAAEWzFhZWiAAAAAAAACD3wAAPb////+7WFlaIAAAAAAAAEq/AACxNwAACrlYWVogAAAAAAAAKDgAABELAADIuXBhcmEAAAAAAAMAAAACZmYAAPKnAAANWQAAE9AAAApbc2YzMgAAAAAAAQxCAAAF3v//8yYAAAeTAAD9kP//+6L///2jAAAD3AAAwG7/4QkgaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJYTVAgQ29yZSA2LjAuMCI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiLz4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8P3hwYWNrZXQgZW5kPSJ3Ij8+/9sAQwACAQEBAQECAQEBAgICAgIEAwICAgIFBAQDBAYFBgYGBQYGBgcJCAYHCQcGBggLCAkKCgoKCgYICwwLCgwJCgoK/9sAQwECAgICAgIFAwMFCgcGBwoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK/8AAEQgAlgCZAwEiAAIRAQMRAf/EAB0AAAEEAwEBAAAAAAAAAAAAAAIAAwgJAQUHBgT/xABEEAABAgUCBAQDBQUGAwkAAAABAgMABAUGEQchCBIxQQkTUXEiYYEUMkJSkRUjYnKhJHOCkrHwFjOyF0NEVGOTosHD/8QAGwEAAQUBAQAAAAAAAAAAAAAABQADBAYHAgH/xAAxEQABAwMBBgUEAQUBAAAAAAABAAIDBAURIQYSMUFRcWGBobHREyIykcEUFSNC4WL/2gAMAwEAAhEDEQA/AL/IXWFCJxuYSSHISMBP0hcxBwT9IXfmAGI0Goeo9maWW29dl9V5mQkmdgpxXxLV2QhI3Wo9kgEx6GknATUkscTC95wBxJW/OEnOB7xzrV/il0X0S55W8LrbcqATkUmnjz5k990g4RnsVlIMRP4guP7UHUgv27pqX7doqspLyHMTsyn+JaT+6B/Kg57FRG0R5mHnHXFPOOKUpSipa1qyST3JidDQuOryqFdtt4oiY6Ju9/6PDyHE+ilLqP4oN4TzypTS+xJKQY3Am6w4X3VD1CEFKUH5ErEcZu3i84kLyeU5VNWqqwD0bprolEpHoPICf65PrHOlKzuYbJycwTjpoWcGqj1V+u9acyyu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",
    "supportIcon":"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",
    "Logout":"/9j/4AAQSkZJRgABAQEBLAEsAAD/4QBWRXhpZgAATU0AKgAAAAgABAEaAAUAAAABAAAAPgEbAAUAAAABAAAARgEoAAMAAAABAAIAAAITAAMAAAABAAEAAAAAAAAAAAEsAAAAAQAAASwAAAAB/+0ALFBob3Rvc2hvcCAzLjAAOEJJTQQEAAAAAAAPHAFaAAMbJUccAQAAAgAEAP/hDIFodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvADw/eHBhY2tldCBiZWdpbj0n77u/JyBpZD0nVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkJz8+Cjx4OnhtcG1ldGEgeG1sbnM6eD0nYWRvYmU6bnM6bWV0YS8nIHg6eG1wdGs9J0ltYWdlOjpFeGlmVG9vbCAxMS44OCc+CjxyZGY6UkRGIHhtbG5zOnJkZj0naHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyc+CgogPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9JycKICB4bWxuczp0aWZmPSdodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyc+CiAgPHRpZmY6UmVzb2x1dGlvblVuaXQ+MjwvdGlmZjpSZXNvbHV0aW9uVW5pdD4KICA8dGlmZjpYUmVzb2x1dGlvbj4zMDAvMTwvdGlmZjpYUmVzb2x1dGlvbj4KICA8dGlmZjpZUmVzb2x1dGlvbj4zMDAvMTwvdGlmZjpZUmVzb2x1dGlvbj4KIDwvcmRmOkRlc2NyaXB0aW9uPgoKIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PScnCiAgeG1sbnM6eG1wTU09J2h0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8nPgogIDx4bXBNTTpEb2N1bWVudElEPmFkb2JlOmRvY2lkOnN0b2NrOjQ0NWRlNjY3LWI2ZTItNDQxMi04Nzk5LTBmODIwNTI4MzE1MTwveG1wTU06RG9jdW1lbnRJRD4KICA8eG1wTU06SW5zdGFuY2VJRD54bXAuaWlkOjg3MzM3ZjQ2LWYyMjEtNGE3YS05MDZiLTcxYWNkOWZhNDBiNTwveG1wTU06SW5zdGFuY2VJRD4KIDwvcmRmOkRlc2NyaXB0aW9uPgo8L3JkZjpSREY+CjwveDp4bXBtZXRhPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAo8P3hwYWNrZXQgZW5kPSd3Jz8+/9sAQwADAgIDAgIDAwMDBAMDBAUIBQUEBAUKBwcGCAwKDAwLCgsLDQ4SEA0OEQ4LCxAWEBETFBUVFQwPFxgWFBgSFBUU/8AACwgA8ADwAQERAP/EAB4AAQABBAMBAQAAAAAAAAAAAAAJAQcICgIDBgQF/8QAQxAAAQMDAgMEBQcJCQEBAAAAAQACAwQFBgcRCAkhEjFBURMiMmFxOEJSc4GStBQVJGJydIORwRYjNENEk6GjslOi/9oACAEBAAA/AJU0REREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREVO5B1VURERERERERERERERERFF7zJOYtnek+qdTphplWw2Ce1wQyXW8mnjnqHSysEjYYhIHNY1rHMJdsXEu2HZDfWry2eYrnerOqUGmGplbDf57nBNJaryKdkFQ2WJhkdDKIw1rmljXkO2DgW7Htb9JQURERERERERERERERERUPsla+3My+W9qh+8Uf4GBcuWR8t7TL66t/A1C2B2+yFVERERERERERERERF+TlOWWXCLDWXvILrR2W0UbPSVFdXzthhib5uc4gD+qjl4iec1Yccqqi06Q2BuT1Ebi0369tfDRHbxihaWySA+bjH8CvRcCfNEruILUSn091BsdutF/uLHutdys/bZT1D2NL3Qvjkc4scWtcWuDiDttsDtvIafZPwWvtzMvlvaofvFH+BgXLlkfLe0y+urfwNQtgdvshYC8dvM5l4bM6dgGD2Khv2UUsMc1yrLq95paMyN7TIhGxzXPeWEOJ7QDQ5o9Yk7eK4eOc5Yciq4bVq7jzcYmkcGtvtkD5qMb/AP1hcTJGB5tMnwCkZxTLrJnFho75j12o73aKxnpKeuoJ2zQyt82uaSD/AE8V+uiIiIiIiIiIiIrL8UfFfhPCpg5vuUVJqbjUhzLZZKVw/Kq+Qd4aD7LB07Uh6N38SQ0wW8TvGBqFxT5K6uyq5GnssEpfb8fo3FtHRjqAQ3579u+R27judthsBZEAlSEcsHgrz69az41qlkVlrMdw6xudXUs9wjMMlxmLHNiELHesWAu7Rft2SG7AknpM/tszb3LX25mXy3tUP3ij/AwLlyyPlvaZfXVv4GoWwOBu3b3KGzmmcGWeUms9/wBWMcstZkWJ3uOKorpKCMzSW2aOJsb/AErGjtCMiMODwCBuQdthvHXsQr28MXF7qFwsZMK/FLmZrPPI19wsFY4uo60Dv3bv6j9u6Ruzh47jcGdHha4ssJ4rMH/PmL1BpblTBrLnY6p4/KqCQ9wcB7THdezIOjtvAgtF6kREREREREREVpuJziPxnhh0quOY5FIJZGf3FutrHhstfVEEshZ5dxLnfNaCevQHXu1x1vyviB1FueZ5fXmsudY7ssiZuIaWEE9iGFpJ7MbQeg7ySSSSST8mkOj2W65ZzQYjhlolvF5qzuI2eqyGMbdqWV56MY3cbuPTqB1JAM0/CHyydP8Ah7pqK+5RDTZznrezJ+XVcPao6F/ftTQuG24P+a8F3TcBm+yzNA2Q+yVr7czL5b2qH7xR/gYFy5ZHy3tMvrq38DULYHb7IQjdYa8XfLL0/wCIamrb7jUNNg+ev3kFwpIezSVz+vSphaNtyf8ANYA/rue33KFbV/RvLdC85r8SzS0S2i8Uh37D/WjmjJPZlieOj2O2Ozh7wdiCB9Gh+tmVcP8AqLbMzxCvNFdKJ2z43bmGqiJ9eGZu/rRuA6jvHQgggEbCXDBxIY1xP6VW7McekEMrtoLjbHvDpaCqABfE/wAx1Ba75zSD06gXaRERERERERF1VVTFRU0tRPKyCCJhfJLI4NaxoBJJJ7gAN91r6cfnFfV8UetdbV0VTJ/YqyOfQ2GmPRrogfXqCPpSkB3mGhjfBWO0x02yDV3O7Nh+LULrjfbtUCnpoGnYbnqXOPzWNaC5zj0AaStgjhA4R8X4T9OIrLamR1+Q1jWS3m+uj2lrZgO4eLYm9QxngOp3cSTflFQ+yVr7czL5b2qH7xR/gYFy5ZHy3tMvrq38DULYHb7IVUViOLzhJxfiw03msd2ZHQZBSNdLZr62PeWimI7j4uidsA9niOo2cARr7an6aZDpBnl6w7KaF1uvtpnNPUwE7jfva9p+cxzSHNcOhDgVe/gE4rqvhc1ro6ysqZP7F3tzKG/Uw6tEXa9SoA+lESXeZaXt8VsGUlVDXU0VRTysnglYJI5YnBzXtI3DgR3gjYgrtRERERERERYT82DiEk0f4dZMZtdUYMgzaR9sYWO2fHRtG9U8dfFpZF/FPkoL+8qZnlEcKsGAaaP1bv1GDkeURllrErPWpbcHdHN8jM5va3+g1n0ipD0RUPsla+3My+W9qh+8Uf4GBcuWR8t7TL66t/A1C2B2+yFVEUeXN14VYNQNMm6s2KjH9pMWiDLmImetVW4uO7j5mFx7W/0HSeQUMg6FTn8p3iEk1f4dWYxdKoz3/CZWWx5e7d8lE4E0rz18GtfF/CHms2URERERERFQnYbqC3m3arSZ9xW11hin9JbsSoYbXG1vs+mc3007vj2pGsP1YWNfD5pXUa2a04bg1OXN/PdyipppGd8cG/ameP2Y2vd9i2WrJaKPH7PQ2u3U7KW30UEdNTwRjZscTGhrGgeQaAPsX2oiooaeatwjZ3T673XU+wWGvyDGMhip31E9tgfO6hqI4WwubK1oJa1wja4PI7PrEb7jrXlTcJGdz672zVC/WGvx/GMehqHU81ygdA6uqJYXQtbE14Bc1okc4vA29UDck9JlR0VURfHebTR360VtsuFOyroKyB9PUQSDdskb2lr2keRaSPtWtLxCaUz6I615pgs5c78yXKWmhe/vkg37ULz+1G5jvtWSXKQ1WkwDiuobDLP6O3ZbQzWuRrvZ9M1vpoHfHtRuYPrCp0wdxuqoiIiIiIioe5aymveXSZ7rbn2RyP7Zul9rqsHya6d5aB7g3YfYsueTRgjMi4m7rkE7A6PHrDPNC4j2Zpnshb/+HTKbNERFQjdANlVERFCfzmMFZj3EzachhYGx5DYYZZXbdXTwySQuP3BCsQ9A8ukwLWzAsjjf2Da77Q1ZPm1k7C4fAt3H2rZrb3KqIiIiIiIvju85prVWTN33jhe8bd/RpK1ZppXTzPkcSXPcXEnzJ3UoXI2o2Pver9UQDIymtcTT4gOfUk/+QpY0RERERERRPc8miY276QVYAEj4LpE4+JAdTEf+j/NRdwSugmZI07OY4OBHmDutpmzzmptVHM7feSFjzv39Wgr7ERERERERdVTC2pp5Yn+zI0sPwI2/qtW3I7VJYr/c7bK3sy0dTLTuafAse5pH/Ckd5H9/jptR9TrIXD0tbaaSta3fvEM7mE/94/mpekRERERERRD88C/x1OommFkDv72jtVZWubv4TTMYD/0OUcGN2qS+3+222JvalrKmKnY0eJe8NA/5W0lSwNpqeOFnsxtDB8ANv6LtRERERERFQ9x8VrncdGnz9NOLPU+zGIxQvvEtwgBHT0VT+kM29wEu32L2nLF1Ri0x4v8AEDVSiGgv4lsM7y7Ybzgeh/7mRfzU/o6hVREREREVD0BUAnM81Ri1N4v8v/JZRNQY+2KwwODtxvAD6Yf7z5R9i8TwLafP1L4s9MLMIjLDHeIrhOAOnoqbeofv7iItvtWxi3u8lVERERERERRIc63RV9vyrDNUqKn/AEW4U5sdxkaDs2ePtSQOd73MdI3+EFGfbLjU2e40tfRTvpaymlZNDPGdnRva7tNcD5ggFbInClrxQ8RuhWL5xSvjFZV04huVOz/T1sezZ2beA7XrDza9p8VdtERERERWl4qtd6Hhy0LyjOKp0Zq6OnMNtp5P9RWybtgj28R2vWPk1rj4LW6udyqrxcquvrp31VZVSvnnnkO7pJHOLnOJ8yST9qkw5KOiklwyrM9Uq2n/AEW3wCx257gdnTydmSdzfe1jY2/xSpb0REREREREVqeKLQqh4jND8owSrLIp6+n7dBVPH+Hq2HtQSeeweADt3tc4eK1wcpxm54bkd0sN6o5LfdrZUyUlXSyjZ0UrHFr2n4EFZb8tHjKbw1amyY9ktX6LT7JpWR1sjz6tvqfZjqvc3b1ZP1dndewAZ2aeeOqhZNDI2WJ7Q5j2HdrgeoII7wV2IiIiIuueeOmhfLK9sUTGlznvOwaB1JJ8AoJ+ZdxlM4lNTI8cxmr9Lp9jMr46OVh9W4VPVslV727epH+ru755AxHxXGbnmeR2yw2WjkuF2uVTHSUlLEN3SyvcGsaPiSFsfcLmhVDw56H4xglGWSz0FP26+qYP8TVvPank89i8kDfua1o8FdZEREREREREUX/No4KJb7BUa34XQ+krKaJrcnoadm7pYmjZlaAO8saA2T9UNd81xUS/cVJBy6eZS3TCmt2mGqla92KMIgtGQzEudbB82CfxMH0Xd8fcd2bdiYC33ClutFT1lFUxVdJURtlhngeHxyMcN2ua4bggjqCOhX0IiIi+evuFLaqKorK2oipKSnjdLNPO8MjjY0buc5x6AADck9AogOYpzKWam01y0w0rrXtxR5MF3yGElrrmOvagg8RB9J3fJ3DZm/bje7ypaeUvwTzWCng1uzSg9HW1UJbjFDUM2dFE4EPrHA9xe0lsf6pc75zSpP0RERERERERF1zwR1ML4pWNkie0tcx43DgehBB7wobeYhy2azS2tuWpOlttkrMJlLqi52SlYXSWc9S6SNo6up/HYdY/2OrY7erT5FZPcJ/MG1J4WnxWuknbk+FdvtSY7c5HdiPc7uNPL1dA49egBYSSS0nqpYdBOZVonrhBTUzsiZhmQSAB1pyV7abd3lHOT6KTr3esHH6IWUlPUxVULJoZGyxPaHNkYd2uB7iCOhXYCD4puB4rrnqYqaF800jYomNLnSPOzWgeJJ6BYt69cyrRLQ+Cppm5FHmeQRghtpxp7akh3lJOD6KPr3+sXD6JUT/FfzBtSeKR81rq524xhXb7UeO2yR3Yl2O7TUS9HTuHToQGAgENB6rGDq4+ZUivLt5bFZqdW23UrVO2PpMLiLai2WOqYWyXc97ZJWnq2n7iAesn7HV0yEEMdNCyKJjY42ANaxo2AA6AAeAXNERERERERERFxc0PaWuG4PQgqPDjG5TVg1PqK/LdJX0mKZNKXTVFjlHYt1a/qSY9h+jvPkAWE7dGdXGJjVDR7NNGMllsGbY5X45dGb7RVsXZbKAdu1G8btkb+swke9ePBIXusA131G0sLRiGcZBjkYO/obbcpYoj8Yw7sn7Qrz2fma8SlmjEcepdRUMA2H5ZbKKc/edCSf5pd+ZrxKXiMxyal1FOwjY/kdsooD95sII/mrMZ/rvqNqkXDL84yDI43Hf0NyuUssQ+EZd2R9gXhdyV7HS3R3NNaMlisGEY5X5HdHkbxUUW7YgTt2pHnZsbf1nkD3qWfg35Tdg0vqKHLdWX0mWZPEWzU9kiHbt1E/vBk3H6Q8e8BgO/R3RykPa0MaABsAqoiIiIiIiIiIiIvNZ7ptiuqFglsmXY/bsjtUvU0lypmzMB+k3ceq7yc3YjzWDur/Jl0vy6WerwW/3XA6p+5bSSD84UTfcGvLZG/wC4fgsUM35NetmPyyOsNxxnKqb5ggrX0sx+LJWBo++Vaq5cs7iUtkzo36ZVU4Hz6W40crT92ZLZyzuJS6TNjZplVQA/PqrjRxNH3pldXB+TXrZkErHX6441itN88T1r6qYfBkLC0/fCyv0f5M2l2ISwVedX6655VM2LqSMfm+id5gtYXSH/AHB8FnHgWm2LaX2CKyYjj9uxy1R9RSW2mbCwn6TuyPWcfFx3J816RERERERERERERERERU7I8ggaB4BVRERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERf/Z",
    "About":"iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAABmJLR0QA/wD/AP+gvaeTAAAA/ElEQVRoge2YQQrCMBBFn+IBxKXu9BDi6fQ4Ct6sCMatYF10Y2MlQzWZTMyD2ZXwfiedlEClUqnkyAY4Aw5olesGnICVVH4NNBmI+9VIQxwzkP1UR192MhDgAiwkSRVwwDz00J1+6llkqRB+F3pMk+v8mBpAm5j729+vQwPja8x3oMgAUVodC8k38DZ7hSR5EUVuIVOYD1DPAW3Mj9EiO2AKSYCxB1kS/qIDWRPzHFD7F6pjNCVFBhgam1vgis5t3CtOEurhLbBTlA9eLUoC5HBD3dJd7i7HBNAuR/fmRfIEFttLF9HEtDwYlwfj8mBcHozLg3F5gIO2QMUST5trMZMUEmsXAAAAAElFTkSuQmCC",
    "Help":"iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAABmJLR0QA/wD/AP+gvaeTAAABoElEQVRIie2WzU4CMRDHfxrjTQ8kxC8kfiS+ihEVMcSzD2DAiy/ikagX0Ys3DT6Cr2DwIDHgyZt4MFFYPLQbSoPtFIjxwD+Z7G53pr9Od7YtjPVHmgjwTQN7wDawAqR0+yvwAlSAW6AxqsEtASWgBXQ81gZu9MCGUg74EABtawLZQaHHqAxCoWb2xVBobkioCRdnnsI9vXUgD8xo2weqDv8msCgBX3igiT4xCVQ1/xZ35oOmcVdvXvtlNKgBbOm2A0dci+7v11cFR3AHNbVY2dV126wn9sgETVrgjGtUqO/VsUYf6eu0J7anbxu85gm29Qkc6vtNj++662WckcS+UMsnwDzu4oqreyTgEx0zBzwK/J3gpwBwUsc8CP2rJmjKAteADdfIDL0J/WI9mw92cd0HdhaiiuvlMvLtr6wtEvh/41lAAM4FHZUN/yuBf8kHBbXx+6o7BPwOLEjAoLYy17YYaeA17qluA7tSaKyiBy6pg0IoNFaWsEXFnN6dQaGxksApqjIlWV4i+KYhx9sU3ePtKr3H2xpqDbjTz2P9H/0AJ/xJq47cBwgAAAAASUVORK5CYII=",
    "ClearCache":"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",
}
```

From `v1.5.0` release screen customizations are supported using brand APIs. `screenLabels` is optional element which can be populated if screens of app needs to be customised. Keys under `screenLabels`are fixed as per Saral App screens, but values can be changed based on what needs to be displayed.

Sample for `screenLabels` customisation.

```
{
    "appName": "Saral OCR App",
    "themeColor1": "#D72819",
    "themeColor2": "#FBE9E7",
    "themeColor3": "#ACCCCE",
    "themeColor4": "#FF5733",
    "themeColor5": "#e5b6b3",
    "logoImage": "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",
     "screenLabels": {
      "loginComponent": [{
        "UserId": "User ID",
        "Password": "Password",
        "RememberMeText": "Remember Me",
        "LoginText": "Login"
      }],
      "selectDetails": [{
        "School": "Organization",
        "SchoolId": "Organization Id",
        "Class": "Category",
        "Section": "Skill",
        "Subject": "Skill Assesment"
      }],
      "studentList": [{
        "School": "Organization",
        "SchoolId": "Organization Id"
      }],
      "scanHistory": [{
        "School": "Organization",
        "SchoolId": "Organization Id"
      }],
      "myScan": [{
        "School": "Organization",
        "SchoolId": "Organization Id"
      }],
      "scanStatus": [{
        "School": "Organization",
        "SchoolId": "Organization Id"
      }],
      "scanStatusLocal": [{
        "School": "Organization",
        "SchoolId": "Organization Id",
        "ReviewScanText" : "Review Scan",
        "SubmitAllScan" : "Submit all scans",
        "SummaryPage" : "Summary Page"
      }],
      "scanHistoryCard": [{
        "School": "Organization",
        "SchoolId": "Organization Id",
        "Class": "Category",
        "Section": "Skill",
        "Subject": "Skill Assesment",
        "ExamDate":"Asses. Date",
        "ExamType": "Asses. Type",
        "ExamId": "Asses. Id",
        "ExamDetail": "Asses. Details",
        "Details": "Details",
        "TotalStudent":"Total Students",
        "PresentStudents":"Present Students",
        "ScanNotSubmitedYet":"Scans not submitted yet",
        "TotalScanSubmited":"Total scans submitted",
        "ReviewScanText" : "Review Scan",
        "SubmitAllScan" : "Submit all scans",
        "SummaryPage" : "Summary Page"
      }],
      "examDetailsPopup": [
       "Question Id",
       "Indicator Title",
       "Question Marks"
      ],
      "scannedDetailComponent": [{
        "Subject": "Skill Assesment",
        "StudentId":"Employee ID",
        "Exam": "Assesment",
        "StudentDetail": "Employee Details",
        "CorrectId": "please correct employe id",
        "RecordNo":"Record Number",
        "ListTableHeading" : [
          "Sr No",
           "Questions",
          "Rating"
        ]
      }]
    }
}
```


# Capture AI/ML Training Data

Steps how to capture field specific training data to improve accuracy of AI/ML predictions

**Saral App** internally uses AI/ML model to predict scanned layout ROIs(Region Of Interest). Current capabilities of this model is to detect **handwritten digits** and **OMR** answers. Internally model is trained with [MNIST](http://yann.lecun.com/exdb/mnist/) database. But as the handwritten digits can be sometimes field specific , this feature is handy to collect training data from production and improve accuracy of the model predictions.

**Step 1**: For a selected school , make sure **storeTrainingData** flag to be returned as true from backend API `GET /schools`.

```
{
    "schools": [
        {
            "name": "Dummy school 1",
            "schoolId": "up001",
            "state": "up",
            "district": "delhi",
            "block": "haldwani",
            "hmName": "acbc",
            "noOfStudents": "100",
            "storeTrainingData": true,
            "createdAt": "2021-12-06T05:25:38.487Z",
            "updatedAt": "2021-12-06T05:25:38.487Z"
        }
      ]
  }
```

**Step 2**: Saral frontend application will capture layout ROIs(Region of Interest) images and convert them into **Base64** images and send them as part of `PUT /saveMarks` API. Saral App also compares the actual preidictions with user overrides if any , and populate training data only if necessary. This training data can be extracted from backend to train the AI/ML model to improve accuracy on iterative fashion.

Sample request from Saral App to backend API`PUT /saveMarks`

```
{
	"_id": {
		"$oid": "619b38c8b18890002b7b186b"
	},
	"studentIdTrainingData": [
		"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"
	],
	"studentAvailability": true,
	"createdOn": "1637562568166",
	"section": "D",
	"predictedStudentId": "3302008" ,
	"predictionConfidence" : [98.0,98.1],
	"studentId": "3302004",
	"securedMarks": 0,
	"totalMarks": 0,
	"marksInfo": [
		{
			"trainingData": [],
			"predictedMarks": "",
			"predictionConfidence" : [] ,
			"questionId": "QUESTION1",
			"obtainedMarks": "0"
		},
		{
			"trainingData": [],
			"questionId": "QUESTION2",
			"obtainedMarks": "2"
		},
		{
			"trainingData": [],
			"questionId": "QUESTION3",
			"obtainedMarks": "1"
		},
		{
			"trainingData": [],
			"questionId": "QUESTION4",
			"obtainedMarks": "3"
		},
		{
			"trainingData": [],
			"questionId": "QUESTION5",
			"obtainedMarks": "1"
		}
	],
	"schoolId": "gujrat001",
	"examDate": "05/10/2021",
	"subject": "Hindi",
	"classId": "5",
	"__v": 0
}
```


# Support

Support feature to troubleshoot Saral App issues

As Saral App is an edge location solution to collect data from the field, when there are issues with data collection, this feature is helpful to quickly share failures logs with the support team. Its recommended sharing these logs with the implementation support team to look into the failure and identify the root cause.

This feature is available from `v1.0.0-beta.5` release and above.

![](/files/2bhrikx7GvcsmHCS6skz)![](/files/9aX1h9MZizXyBa4AEa3v)

![](/files/fP9Apb61wKnzjXCuqQiu)![](/files/BVE45TOE9jbiOU7UJkjI)


# Share App data

Share App data for troubleshooting

This feature is useful to troubleshoot issues with Saral App captured data and backend sync-up issues. Users can share this info with the support team directly for troubleshooting issues.

This feature is a quick way to share the AI/ML training data with the support team from the field to help improve accuracy with handwritten digits predictions.

This feature is available from `v1.0.0-beta.4` release and above.

![](/files/VKOdLcLgCKRGyPiMcRgd)![](/files/f1qQEMb3UeS5CvKeorKP)

![](/files/krS7Y8FcuoRuB9IUs7xW)![](/files/aNna89GkpOrN63Li59eG)


# Auto Sync

Auto Sync from Saral App to Saral backend

Saral App is used in the field to collect data, but the challenge is in few remote places there is no internet connectivity all the time. So once useres login to Saral App, scanned data is initially stored in mobile local storage. Users can manually sync data to Saral backend by clicking on the `Save All Scans` button. `Auto Sync` feature polls data in local storage at a frequency and pushes it to the backend.&#x20;

This feature is available from `v1.0.0-beta.5` release and above.

![](/files/i3qJObT4UfeJG5sfNISx)![](/files/m4fuLEmUUy473fbzEe8p)

&#x20; ![](/files/lDqCtaFG7VZFmxHovYtJ)![](/files/oFc39mjGHBQc32bHAzYw)

Auto Sync can be controlled by following configuration:

```
autoSynch - boolean
autoSynchFrequency - integer
autoSyncBatchSize - integer
```

`autoSynch` is a boolean property in `/schools/login` API response. if it's set to true then Auto Sync process will be enabled.

`autoSynchFrequency` is frequency at which auto-synch to be executed.&#x20;

`autoSyncBatchSize` is batch size for auto-sync functionality. Auto-sync triggers based on number of records available in local storage. if its minimum of `autoSyncBatchSize` and other configuration matches, auto sync to backend will be triggered in mobile app. Default value if not set is 10.

`/schools/login` API response with `autoSynch` and `autoSynchFrequency` configuration reference.

```
{
"school" : {
    "storeTrainingData" : true,
    "name" : "Dummy school 4",
    "schoolId" : "u002",
    "state" : "up",
    "autoSynch" : true,
    "autoSynchFrequency" : 9000,
    "autoSyncBatchSize": 20
}
}
```


# Multi-Page support

Saral App supports multi-page layouts from `v1.5.0` release. [Layout specification](/learn/specifications/layout-specification) supports adding pages element to input number of pages configured for given layout and assign `page`  at each cell level. if a `page` element is not present in a cell , cell is applicable for all the pages. This support is added to `SaraSDK`.&#x20;

Example below shows layout with 3 pages where each question cells assigned with page number.&#x20;

```
      "layout": {
          "version": "1.0",
          "name": "ANY1S15QMULTIPAGE Exam Sheet Form",
          "pages": "3",
          "cells": [
              {
                  "cellId": "2",
                  "page": "1",
                  "rois": [
                      {
                          "annotationTags": "QUESTION1_0",
                          "extractionMethod": "CELL_OMR",
                          "roiId": "8",
                          "index": 0,
                          "rect": {
                              "top": 165,
                              "left": 275,
                              "bottom": 194,
                              "right": 300
                          }
                      },
```


# Profile Menu

Saral App has profile menu feature and it has below menu options. This feature is available from \`v1.5.0\` release.

![](/files/nOVPCkDGnPxy1oOaRf69)

![](/files/HZvOM2UsLafYhYBYnh4f)![](/files/0IBoLQdzprvsR6MuVHaS)![](/files/wHBUIQNDIQwPBA5Zh6PB)![](/files/y66QxJt6cP9sKZE0He3P)

**About**: In Saral App Information with release details.

**Help** : Help feature navigates the user to Saral features webpage.

**Logout** : User logout functionality where user data gets synced up with backend and removes user data from the device.

**Support** : Saral App keep tracks of failure logs and can be shared with support team using this feature. Refer [Support](/learn/features/support)


# Dynamic Validations

Saral App supports dynamic validation feature. As this application will be used by different educational boards , this feature will avoid maintaining different frontend source code to customise validations. This feature is available from `v1.5.1` release.

The validations can be configured in the ROI Layouts JSON in backend using regular expressions and failure messages.&#x20;

Refer [Layout specification](/learn/specifications/layout-specification) and [Layout configuration](/use/layout-configuration)for details about ROI Layout configuration.

Dynamic validation will come from backend with regular expression, and dynamic validation is used at cell level if validation is not available at cell level then in that case result validation will be used which is used as global result validation and it will also come from backend.

Result validation(This is global result validation irrespective of cell level)&#x20;

`"resultValidation": { "validate": { "regExp": "[0-1]", "errorMsg": "Omr result should be 1 or 0" } }`

Cell level validation&#x20;

`"validate": { "regExp": "[0-1]", "errorMsg": "Omr result should be 1 or 0" }`

`"validate": { "regExp": "[0-5]", "errorMsg": "Omr result should be 0 to 5" }`


# Dynamic Tagging

Saral App supports dynamic tagging feature. This feature is able to tag each question with category of questions as applicable.

This feature can be enabled when `/schools/login` response has `tags` field set to true.

```
{
   "school":{
      "storeTrainingData":true,
      "name":"Dummy School 1",
      "schoolId":"u002",
      "state":"up",
      "autoSync":false,
      "autoSyncFrequency":900000,
      "tags":true
   }
}
```

![](/files/YNFFkgR9LLfrv941ENIY) ![](/files/7qRj7Hor9M6M7uNGLc3s)


# Minimal Mode

For non-academic use-cases, there will be no fixed participants like students and hierarchy like class,section etc. So minimal mode is to address these non-academic use-cases where a layout roi can be selected by user,scanned and push the scanned data to backend.

`/schools/login` API reponse has flag `isMinimalMode` to enable minimal mode by default for given organization or school. Refer below sample response for `/schools/login` API for reference.

```
{
    "school": {
        "storeTrainingData": true,
        "name": "Dummy school 3",
        "schoolId": "demouser",
        "state": "gujrat",
        "autoSync": false,
        "autoSyncFrequency": 600000,
        "tags": false,
        "isMinimalMode": true
    }
}
```

![](/files/deZKiTf5gD1sDdC0SgXN) ![](/files/7naXXjWleemodlsPLvpa) ![](/files/NLNZRyBSwhDJBkP0xNje)&#x20;

From `v1.5.6` release and above, a switch option is added to switch between Regular and Minimal mode.&#x20;

![](/files/yR7fvwD7wYaeMKYfulGn)![](/files/V0BWmc1vxA9ggsZBaRKF)

For minimal mode , classsId and sectionId will be defaulted to `0.`Backend data can be differentiated using these field values.


# Offline mode

This feature will be avilable from Saral release `v1.5.6` and above.

> When we login into the app backend should have an offlineMode flag true, offline mode will be enabled. Also as this feature caches api response as needed , this will occupy additional mobile local storage. Please ensure sufficient storage is available on the device.&#x20;

```
{
"name": "Dummy school 1",
"schoolId": "u001",
"password": "tarento@123",
"state": "up",
"autoSync": false,
"autoSyncFrequency": 600000,
"storeTrainingData": true,
"tags": true,
"supportEmail": "abc@gmail.com , xyz@gmail.com",
"offlineMode": true
```

},

> When the internet is available, the user has to navigate to all the screens with specific selections for the first time. During subsequent app usage, the internet is not required to navigate and scan using the app.

> When the internet is not available on the device, the user can navigate to screens and selections tried by the user when the internet is available.

> In offline mode we can scan the layout but we cannot save it . It will be stored in local storage and when net is available then we can hit save all scan Api

> user will be able to log in through Login Api Cache by entering schoolD and password if any school hasn't cache then it would not logged in and will throw an error "You don't have cache".

> in offline mode if user click on log-out it will just navigate to log-in page. if user close the app and bring back the app that will be logged in the same school. logout we don't erase any data.we have given an interface to switch multiple school without loosing marks data and api cache.

> **we have remove user cache**: it will erase the logged in school's api cache except the marks.

![IMG\_20221017\_130043](https://user-images.githubusercontent.com/91952702/196121468-eeb521c7-1f64-4b3d-8227-8d61f31824ab.jpg)

***

> **remove all user cache**: it will erase the all schools api cache except the marks.

![IMG\_20221017\_130104](https://user-images.githubusercontent.com/91952702/196121542-8a1de48a-37d0-42cf-b705-e404978f62c6.jpg)

***

> in multiple user case if u logout current logged in school while you have network only logged in school's data will be stored in db and rest of data will be there in local and you can go one by one school and save it

> autosync process will be disabled when offline mode is active.

> user will be able to log in through Login Api Cache by entering schoolD and password if any school hasn't cache then it would not logged in and will throw an error "You don't have cache".


# App Force Update

App force update feature

> App force updates when a new version of the app is available in the play store. This feature is available from release `v1.5.7` and above.

1. `isAppForceUpdateEnabled` flag set to true in the `POST /schools/login` API response will enable this feature.
2. If the play store has a new version of the app , then in app there would an alert which shows user an alert message to force update the app.
3. If there is any error occurred while populating alert message of app force update, support logs which will capture failure logs.
4. Multiple users on the same device , data will be retained after the update. If there is no data struture change between versions of the app , data stored in the device before update can be pushed to backend after app upgrade.

```javascript

{
    "name": "Dummy school 1",
    "schoolId": "u001",
    "password": "tarento@123",
    "state": "up",
    "autoSync": false,
    "autoSyncFrequency": 600000,
    "storeTrainingData": true,
    "tags": true,
    "supportEmail": "abc@gmail.com , xyz@gmail.com",
    "offlineMode": true,
    "isAppForceUpdateEnabled": true

  }
```

![appForceUpdate](https://user-images.githubusercontent.com/86999055/203745089-11a24f18-69f6-4f22-805a-35439de93ed0.jpg)


# Review results/marks

From `v1.5.7` release user will have option to review the scanned and saved results from Scan Status and Save Status screens. Review popup will show both obtained marks and predicted marks. Predicted marks is marks detected by the model where is Obtained marks is the final marks/results submitted by the user.

![](/files/6Vsd7oxSdoAON3JZphBz)![](/files/HunAb3EacLtNq1OSEPCC)![](/files/DxAL8h1Skb7cjhsUqPbE)![](/files/ejmovpP4o70b6COCJQ1F)


# Firebase Analytics and Crashlytics

Firebase Analytics and Crashlytics can be enabled/disabled using `/schools/login` API by setting `isFBAnalyticsEnabled` flag to true or false. Refer below sample response from `/schools/login` API. This feature will will be available starting from Saral App release `v1.5.8`

```
{
    "name": "Dummy school 1",
    "schoolId": "u001",
    "password": "xxxxx",
    "state": "up",
    "autoSync": false,
    "autoSyncFrequency": 600000,
    "storeTrainingData": true,
    "tags": true,
    "supportEmail": "abc@gmail.com , xyz@gmail.com",
    "offlineMode": true,
    "isAppForceUpdateEnabled": true,
     "isFBAnalyticsEnabled": true
  }
```

Refer to firebase pricing @ <https://firebase.google.com/pricing>


# ML model deployment using Firebase

<\<TBD - Coming up in future releases>>


# Improved Low light Performance - Manual Edit

Manual Entry of data from Saral App to Saral backend

Saral App is used in the field to collect data, but the challenge is in few places where there is low lighting or layout format challenge causing difficulty to scan layout. So once user login to Saral App, and isManualEditEnabled flag is set, Scanning Layout for a duration more than the set time defined by scanTimeoutMs shows a popup\\

"Do you want to continue with manual edit screen ?". On clicking yes user can enter/edit data manually.\\

This feature is available from v1.5.9 release and above.

![](/files/LvjeKClPj3zVgPicJDJ8)

![](/files/gRT3aUdFLVsNCpd6sHoB)

Manual Edit option can be controlled by following configuration:

```
isManualEditEnabled - boolean
scanTimeoutMs - integer
```

`isManualEditEnabled` is a boolean property in `/schools/login` API response. if it's set to true then Manual Edit process will be enabled.\
`scanTimeoutMs` is an integer property in `/schools/login` API response. It specifies the scanning timeout.\\

`/schools/login` API response with `isManualEditEnabled` and `scanTimeoutMs` configuration reference.

```
{
"school" : {
    "storeTrainingData" : true,
    "name" : "Dummy school 4",
    "schoolId" : "u002",
    "state" : "up",
    "autoSynch" : true,
    "autoSynchFrequency" : 9000,
    "autoSyncBatchSize": 20,
    "isManualEditEnabled": true,
    "scanTimeoutMs": 60000
}
}
```


# Vertical Forms Scanning Support

Saral App supports Vertical page(potrait) layouts from `v1.7.0` release. [Layout specification](/learn/specifications/layout-specification) supports adding `verticalScanLayout` element to true/false to indicate if layout need to be scanned vertically(potrait mode).This support is added to `SaraSDK`.

![](/files/M0ORwPgX667pmpZxRxkb)

Example below shows roi of vertically scannable layout where `verticalScanLayout` is set to true.

```
"layout": {
      "version": "1.0",
      "name": "AdmissionFrom",
      "pages": "2",
      "threshold": {
          "experimentalOMRDetection": false,
          "minWidth": 0,
          "minHeight": 0,
          "detectionRadius": 12,
          "verticalScanLayout": true
      },
      "cells": [
          {
              "cellId": "1",
              "page": "1",
              "rois": [
                  {
                      "annotationTags": "ADDMISSIONNUMBER_1",
                      "extractionMethod": "NUMERIC_CLASSIFICATION",
                      "roiId": "1",
                      "index": 0,
                      "rect": {
                          "top": 108,
                          "left": 217,
                          "bottom": 116,
                          "right": 229
                      }
```


# Improve Processing Speed for big layouts

Saral App supports layouts with more data fields to be processed in chunks to enhance processing speed from `v1.7.0` release. [Layout specification](/learn/specifications/layout-specification) supports adding `chunkSendData` element to true/false to indicate if layout need to be processed in chunks.This support is added to `SaraSDK`.

Example below shows roi of vertically scannable layout where `verticalScanLayout` is set to true.

```
"layout": {
      "version": "1.0",
      "name": "AdmissionFrom",
      "pages": "2",
      "threshold": {
          "experimentalOMRDetection": false,
          "minWidth": 0,
          "minHeight": 0,
          "detectionRadius": 12,
          "verticalScanLayout": true,
          "chunkSendData": true
      },
      "cells": [
          {
              "cellId": "1",
              "page": "1",
              "rois": [
                  {
                      "annotationTags": "ADDMISSIONNUMBER_1",
                      "extractionMethod": "NUMERIC_CLASSIFICATION",
                      "roiId": "1",
                      "index": 0,
                      "rect": {
                          "top": 108,
                          "left": 217,
                          "bottom": 116,
                          "right": 229
                      }
```


# Admissions Data Capture

From `v1.7.0` release user will have option to scan, review, edit and save admissions form using Saral.

Below is the workflow of Admissions usecase with Saral.

![](/files/AqWyrtBDuvBs6FznPNRM)


# Securing PII Data Capture - Admissions

Saral supports handling secure storage of PII data by providing configurable field encryption of PII schema with different data security levels like encryption, encryption+masking, encryption+hashing.

Saral App supports enabling PII data encryption from `v1.7.0` release which is added to admissions usecase.

The admissions record captures sensitive PII data of a student. It is necessary to manage data security.

Saral reference backend provides data encryption feature for Admissions record which can be configured at field level(each and every column/key in admissions record). Currently supports 6 different levels of encryption termed as:

* ENCRYPTANDHASH - does encryption of data first and then hashing of encrypted data for added security
* ENCRYPT - does encryption of data only
* HASH - does hashing of data only
* MASK - does masking of data only
* ENCRYPTANDMASK - does encryption of data first and then masking of encrypted data for added security
* ENCRYPTARRAY - does encryption of array type of data

Saral reference solution uses below algorithms for data security

```
Encryption: AES 256
Hashing: SHA 256
```

Data encryption can be configured under branding for a specific state. A new key named “encryptionSchemas” is added to brands schema which holds an object containing info about field level encryption enabling/disabling with the type of encryption. Refer to [configurable-branding.md](/learn/features/configurable-branding) for more details.

By default the reference solution implements admissions record encryption as shown in below sample, which is added to default branding record and saved under brand collection in DB.

```
"encryptionSchemas": {
      "admissions": {
       "studentAadharNumber": "ENCRYPTANDMASK",
       "studentFirstname": "ENCRYPT",
       "studentSurname": "ENCRYPT",
       "studentDateOfBirth": "ENCRYPT",
       "studentAddress": "ENCRYPT",
       "studentBlock": "ENCRYPT",
       "studentDistrict": "ENCRYPT",
       "guardianFirstname": "ENCRYPT",
       "guardianSurname": "ENCRYPT",
       "fatherName": "ENCRYPT",
       "fatherContactDetails_phone1": "ENCRYPTANDMASK",
       "fatherContactDetails_phone2": "ENCRYPTANDMASK",
       "motherName": "ENCRYPT",
       "motherContactDetails_phone1": "ENCRYPTANDMASK",
       "motherContactDetails_phone2": "ENCRYPTANDMASK",
       "rollNumber": "ENCRYPTANDHASH",
       "addressOnRationCard_address": "ENCRYPTANDHASH",
       "addressOnRationCard_ward": "ENCRYPTANDHASH",
       "addressOnRationCard_block": "ENCRYPTANDHASH",
       "addressOnRationCard_district": "ENCRYPTANDHASH",
       "predictionInfo": {
          "trainingData": "ENCRYPTARRAY"
       }
      }
    }
```

Reference solution also allows state/adaptors to override the above encryption config by defining a similar structure as shown above in state specific branding.

**Refer to this documentation to know more about additional guidelines that can be implemented to secure data** [**Data Security guidelines for Saral - Admissions use case**](https://docs.google.com/document/d/1tH5B3bZF57YoVUDJhVb_ra7Xti7I_DENof0KClZJlRM/edit?usp=sharing)


# Specifications

Saral App specifications


# Layout specification

Saral App Layout specification.

This is the layout specification for Saral App. Layout ROIs are captured in this format and configured in the backend for each exam. Internally Saral App uses this json interface for predicting ROIs.

Checkout Github release tag and refer&#x20;

Release v1.5 refer

`Project-Saral/specs/v1.5/saral-physical-layout-representation-specs.yaml`

Release v1.0 refer

`Project-Saral/specs/v1/saral-physical-layout-representation-specs.yaml`

![](/files/pB2vHRn34jX15C4BNdJ6)

1. The **Cell** is a field-level grouping of ROIs. It is a group of ROI's which will be predicted and grouped together. For example, Student ID may have 13 ROI's(for 13 digits) and they are all grouped under one cell to represent the student ID field as a whole.&#x20;
2. ROI(Region Of Interest) is an area of interest in the image that will be used as input to predict/recognize a character/digit/OMR.

`Refer` [Source Code Repository](/engage/source-code-repository)


# Backend API Swagger Doc

Saral App backend API Swagger documentation

Checkout Github release tag and refer to&#x20;

Release v1.5 refer

`Project-Saral/specs/v1.5/swagger-saral-apidoc.yaml`

Release v1 refer

`Project-Saral/specs/v1/swagger-saral-apidoc.yaml`

`Refer` [Source Code Repository](/engage/source-code-repository)


# Videos


# Feature Explanation


# Usage by States


# ML Model Accuracy/Results

## Handwritten Alphanumeric model

#### Iteration 1:

| Model details                  | Dataset          | Accuracy achieved |
| ------------------------------ | ---------------- | ----------------- |
| Model trained and inference on | Existing dataset | 99.80%            |
| Model inference on             | NIST dataset     | 62.70%            |
| Average across all datasets    | -                | 81.25%            |

**Reasoning** - As model is trained on the existing dataset, doesn't perform good on NIST dataset

#### Iteration 2:

| Model details    | Dataset                                    | Accuracy achieved |
| ---------------- | ------------------------------------------ | ----------------- |
| Model trained on | Existing dataset + NIST misclassifications | 83.30%            |

**Reasoning** - After training the model on NIST misclassifications, improvement in accuracy

#### Iteration 3:

| Model details    | Dataset                                    | Accuracy achieved |
| ---------------- | ------------------------------------------ | ----------------- |
| Model trained on | Existing dataset + NIST misclassifications | 93.90%            |

**Reasoning** - After training the model on NIST misclassifications as per previous checkpoint, improvement in accuracy

#### Iteration 4:

| Model details    | Dataset                                                                  | Accuracy achieved |
| ---------------- | ------------------------------------------------------------------------ | ----------------- |
| Model trained on | Existing dataset + manually collected dataset from sheets (\~1K samples) | 93.90%            |

**Reasoning** - Training the model upon previous checkpoint and adding manually collected data, improvement in accuracy

## Handwritten Digits model

#### Iteration 1:

| Model details                  | Dataset                                 | Accuracy achieved |
| ------------------------------ | --------------------------------------- | ----------------- |
| Model trained and inference on | Existing dataset                        | 99.90%            |
| Model inference on             | NIST dataset                            | 60.00%            |
| Model inference on             | Obtained production data (\~50 samples) | 97.70%            |
| Average across all datasets    | -                                       | 85.80%            |

**Reasoning** - As model is trained on the existing dataset, doesn't perform good on NIST dataset

#### Iteration 2:

| Model details    | Dataset                                   | Accuracy achieved |
| ---------------- | ----------------------------------------- | ----------------- |
| Model trained on | Existing dataset + NIST misclasifications | 96.40%            |

**Reasoning** - After training the model on NIST misclassifications, improvement in accuracy

#### Iteration 3:

| Model details    | Dataset                                                                       | Accuracy achieved |
| ---------------- | ----------------------------------------------------------------------------- | ----------------- |
| Model trained on | Existing dataset + NIST misclasifications + production dataset (\~50 samples) | 99.70%            |

**Reasoning**: After training the model on NIST misclassifications and production dataset, improvement in accuracy

#### Iteration 4:

| Model details    | Dataset                                                                                             | Accuracy achieved |
| ---------------- | --------------------------------------------------------------------------------------------------- | ----------------- |
| Model trained on | Existing dataset + NIST misclasifications + manually collected dataset from sheets (\~8.6k samples) | 98.30%            |

**Reasoning**: As averaging upon a large production dataset, the accuracy slightly dips as compared to iteration 3

## Sample dataset images

#### Existing dataset

**Handwritten alphanumeric**

![0a56f9eb1545428f8d9aea0665b7c460](https://user-images.githubusercontent.com/104554231/229728834-a7681ad6-bd4f-488b-8e65-62052d418a02.jpg) ![0b0de241b7e64e918fada2f896efdf24](https://user-images.githubusercontent.com/104554231/229728866-6c7b8765-3cb9-4acb-b99e-6c3b1e3cf4bf.jpg) ![00b6ef24818b4323b4ada81ad433af67](https://user-images.githubusercontent.com/104554231/229728911-c39fd804-f2ec-4dfa-9075-9d64e7c84fa1.jpg) ![0ac132e3693c47ccb2fe40fb465ba060](https://user-images.githubusercontent.com/104554231/229728951-b2815ce4-f177-40ca-8192-c6eb2778c04e.jpg) ![0aeaa24048ff4c5d8312d37671c6e08e](https://user-images.githubusercontent.com/104554231/229728980-9a5a1fbb-7644-49c8-b2fa-57a974a69e0e.jpg) ![0b7f1f188faf453b83704a069791f28f](https://user-images.githubusercontent.com/104554231/229729018-546e5cb8-7cd1-40ee-b92a-24660bd7eb50.jpg) ![0bd15fe615db458781bce7dc32a926b5](https://user-images.githubusercontent.com/104554231/229729053-75efe9dd-7769-4595-8dce-faac1839bd8d.jpg) ![0adb585eae814b62a56695650cac0666](https://user-images.githubusercontent.com/104554231/229729111-a142f1a1-22bc-43ac-9a04-11f77fabe794.jpg) ![0b0ffa9c3dcf497c8da259d391f5f159](https://user-images.githubusercontent.com/104554231/229729165-b4060026-56b8-4b1c-ace2-f6d1d17e403e.jpg) ![0b2c4c540a7247629e1dd7a9abd59962](https://user-images.githubusercontent.com/104554231/229729203-2e311e0d-e77a-4076-a338-be7c2ad58e48.jpg)

**Handwritten digits**

![0b1a2b29b0904989a3f6df3a13b93d89](https://user-images.githubusercontent.com/104554231/229729405-0ac01786-e0b8-4724-90c9-f94b7da24581.jpg) ![0abb9b222a1142bdaabd30b6742ca8b2](https://user-images.githubusercontent.com/104554231/229729424-baee18ff-46b5-4612-8fd2-0f12bda1d658.jpg) ![0afd4ac792f14b8185d54cb9d0937b3e](https://user-images.githubusercontent.com/104554231/229729467-fea6c80e-f714-4e8b-882e-50f554338779.jpg) ![0ac2ad40-7af8-44b4-9829-284a2b33416c\_printed](https://user-images.githubusercontent.com/104554231/229729496-2c3eb05b-3f22-44b6-9c81-7fc0d7c9d4c9.jpg) ![00af4fd32ddc42efbfb1222725599ecf](https://user-images.githubusercontent.com/104554231/229729524-9d6f9b28-6689-452f-a6fe-53d2a28c04ee.jpg) ![0aa35cc5-4472-455d-a575-7167c15df849\_generated](https://user-images.githubusercontent.com/104554231/229729574-0ce01249-f857-49b5-8c68-bebe392fc562.jpg) ![0a8986b29e804002a3136ddf110f3638](https://user-images.githubusercontent.com/104554231/229729638-552ef113-a3c6-447f-abe7-c6c5fdd46ce2.jpg) ![0a1d909f2f2847b795ac40cefa452c3e](https://user-images.githubusercontent.com/104554231/229729688-4fcec72c-fc81-4be6-9800-b725b69e4f1f.jpg) ![0\_\_0040c46a-eae7-4219-bffb-7dd418ad9ffb\_up\_govt](https://user-images.githubusercontent.com/104554231/229729726-92b53d2b-bb33-4e1a-8324-25b880ad56ff.jpg) ![00c9de07f7b640d083680a5c21661a8b](https://user-images.githubusercontent.com/104554231/229729771-5b7fd3fd-404b-45c5-bcc4-6e16b21ad20d.jpg)

#### NIST dataset

**Handwritten alphanumeric**

![hsf\_0\_00017](https://user-images.githubusercontent.com/104554231/229730299-9d3eb74d-6824-4f05-bfbc-a7ef6a2c9257.png) ![hsf\_0\_00043](https://user-images.githubusercontent.com/104554231/229730351-eef9aae8-492f-4847-8a84-23bc733576e0.png) ![hsf\_0\_00017](https://user-images.githubusercontent.com/104554231/229730382-02997f2e-e4c1-4c0f-9e4d-e2793b2a4d90.png) ![hsf\_0\_00020](https://user-images.githubusercontent.com/104554231/229730415-a14cc5e9-5f27-48ae-b6e4-de00adc4c0af.png) ![hsf\_0\_00010](https://user-images.githubusercontent.com/104554231/229730469-ad835be3-79dc-4711-9b24-fed9f2b6eb43.png) ![hsf\_0\_00017](https://user-images.githubusercontent.com/104554231/229730508-87491dc2-d789-499d-bc50-4cfe564101c6.png) ![hsf\_0\_00020](https://user-images.githubusercontent.com/104554231/229730556-4d3d3834-4c23-4359-8e0f-2832a5cf89be.png) ![hsf\_0\_00008](https://user-images.githubusercontent.com/104554231/229730590-e064eb19-020c-4285-ada4-b074f22bd787.png) ![hsf\_0\_00025](https://user-images.githubusercontent.com/104554231/229730636-2e7131fd-b6c4-4784-a01c-fdbc3afd49d6.png) ![hsf\_0\_00010](https://user-images.githubusercontent.com/104554231/229730689-a3def9d9-0462-4c80-ad81-1ac4659f2ed4.png)

**Handwritten digits**

![hsf\_0\_00015](https://user-images.githubusercontent.com/104554231/229730804-f4cf3b8a-1676-4c59-aafe-40ad101701c2.png) ![hsf\_0\_00010](https://user-images.githubusercontent.com/104554231/229730833-fdd7070e-b2ad-4a93-9aec-8be4dd8ed0d1.png) ![hsf\_0\_00017](https://user-images.githubusercontent.com/104554231/229730849-48c5ae43-e46a-4a77-8a16-898b1b74d21f.png) ![hsf\_0\_00009](https://user-images.githubusercontent.com/104554231/229730879-b3eeab31-185e-488d-ad11-5d7f36e0b64f.png) ![hsf\_0\_00117](https://user-images.githubusercontent.com/104554231/229730925-14c9b2b2-385f-4f4d-900c-22ea831ca552.png) ![hsf\_0\_00009](https://user-images.githubusercontent.com/104554231/229730959-b5e501af-eda4-43b4-84d9-5aad992ba148.png) ![hsf\_0\_00012](https://user-images.githubusercontent.com/104554231/229730998-b65b66fb-99a6-450d-ac69-a983bc3f4395.png) ![hsf\_0\_00019](https://user-images.githubusercontent.com/104554231/229731041-a4a7dae7-3829-402b-960a-ffc75569dcdf.png) ![hsf\_0\_00009](https://user-images.githubusercontent.com/104554231/229731085-130d9b21-bae1-4e90-b328-26e70a8c498a.png) ![hsf\_0\_00013](https://user-images.githubusercontent.com/104554231/229731151-6a285899-bad4-43a2-87a7-863809a69afb.png)

#### Manually collected

**Handwritten alphanumeric**

![img014-032](https://user-images.githubusercontent.com/104554231/229731461-842be1d2-7f05-4b46-a9a9-7c33773ae1e6.jpg) ![img015-044](https://user-images.githubusercontent.com/104554231/229731590-65a8bf93-cce0-404d-a106-75ce0e9be53e.jpg) ![img016-045](https://user-images.githubusercontent.com/104554231/229731652-9e0980c2-7560-4267-a5cf-3fb09fae0b73.jpg) ![img023-039](https://user-images.githubusercontent.com/104554231/229731690-82841cf8-9bc6-4bd8-8ee8-8f0efbbc7d09.jpg) ![img026-001](https://user-images.githubusercontent.com/104554231/229731742-997c7dfd-bdd4-4776-bffb-5847c189b68e.jpg) ![img029-045](https://user-images.githubusercontent.com/104554231/229731791-d463c5fb-1f2f-490d-9f37-248146334d52.jpg) ![img013-040](https://user-images.githubusercontent.com/104554231/229731828-c6bc84e5-6f45-4182-aa67-b7abb6972212.jpg) ![img032-053](https://user-images.githubusercontent.com/104554231/229731876-b87e2d75-6e3e-4900-9701-9d8a071b0904.jpg) ![img034-055](https://user-images.githubusercontent.com/104554231/229731969-69e1e111-b13d-4f51-83b3-ee89dd384f02.jpg) ![img011-033](https://user-images.githubusercontent.com/104554231/229732030-4c5265ed-c320-481d-925b-1bd42eda74d8.jpg)

**Handwritten digits**

![33665](https://user-images.githubusercontent.com/104554231/229732166-dfb1e6f4-79a4-46dd-aa86-5c1eba6c6ba8.png) ![33679](https://user-images.githubusercontent.com/104554231/229732203-f38acb46-7212-4cc2-9718-15af59ff4c84.png) ![33758](https://user-images.githubusercontent.com/104554231/229732228-97da7a10-36b3-4c27-bdb4-38ec83bd112a.png) ![33745](https://user-images.githubusercontent.com/104554231/229732258-a04a6986-902c-471f-920a-0ca86639cca6.png) ![33650](https://user-images.githubusercontent.com/104554231/229732280-f7ef258a-3445-43f3-aa20-7ae8b57c1919.png) ![33753](https://user-images.githubusercontent.com/104554231/229732313-6e6841df-6024-4d68-affa-b50fea353fea.png) ![31372](https://user-images.githubusercontent.com/104554231/229732377-385301ff-6d24-4f76-b111-45b37caf7596.png) ![33362](https://user-images.githubusercontent.com/104554231/229732444-23a8ef8a-0dd1-4789-846f-d675f2b75e9b.png) ![31075](https://user-images.githubusercontent.com/104554231/229732556-37b99ce5-4e90-4e62-8c69-c6162cdc789d.png) ![31065](https://user-images.githubusercontent.com/104554231/229732609-20634d4f-a4eb-43e2-b03f-a7ac0425dc02.png)

#### Some unhandled misclassifications

![18103](https://user-images.githubusercontent.com/104554231/229733361-616dc17a-9c84-4d3f-9046-8790fc4009b6.png) ![28926](https://user-images.githubusercontent.com/104554231/229733480-2d30388b-1653-4778-bda0-4949899ea6f2.png) ![607](https://user-images.githubusercontent.com/104554231/229733515-47e25ccf-8448-49bd-8456-b65acf300dd6.png) ![30658](https://user-images.githubusercontent.com/104554231/229733543-1604df90-5953-4b3b-9312-f3759e924ca6.png) ![402](https://user-images.githubusercontent.com/104554231/229733591-6b75ac87-e14c-4c13-9035-3fcd8f510e69.png) ![32358](https://user-images.githubusercontent.com/104554231/229733649-ac697ba2-7c1a-4e56-bceb-dff83a5f684e.png) ![24141](https://user-images.githubusercontent.com/104554231/229733812-ec789498-8f13-4374-8f1d-c9aaf1f8a0ed.png) ![30838](https://user-images.githubusercontent.com/104554231/229733864-cee75918-1478-4a2f-8443-dd7fe3585430.png) ![24158](https://user-images.githubusercontent.com/104554231/229733937-99a629bd-a961-497d-af0b-8e5c87f4f97f.png) ![32225](https://user-images.githubusercontent.com/104554231/229733986-c1bf94b8-8efe-438f-a737-6d4c99725d48.png)

**Reasoning**: Generally occurs if the digits are written in corners of the cell


# Roadmap

Check out the latest developments @ [JIRA Board](https://project-sunbird.atlassian.net/jira/software/c/projects/SS/boards/118/backlog?issueLimit=100)


# Workspace Setup - Playbook

Developer Environment Setup - Playbook

## Software Prerequisites

* [React Native](https://reactnative.dev/)
* NodeJs (Recommended version v16.9.1 LTS)
* NPM
* OpenJDK 8
* [Android Studio Dowload](https://developer.android.com/studio)
* [Vysor](< https://www.vysor.io/download>)
* NDK old Version **20.0.5594570** needed to be compatible. Use command `sdkmanager 'ndk;20.0.5594570'` to switch to ndk **20.0.5594570**. (This command is handy on Mac or Linux)
* Saral SDK (This SDK is embedded in Saral App code base).                                                           Refer  [Saral SDK Source Code Repository](/engage/saral-sdk-source-code-repository)

### Optional software

* Docker to bring up reference backend as a container (<https://docs.docker.com/desktop/>)

## Other tools used

* [Microsoft VoTT(Visual Object Tagging Tool)](https://github.com/microsoft/VoTT)  [VoTT Project Setup Video](https://www.youtube.com/watch?v=uXxE4Sas3uQ)
* [Jupyter Notebook](https://jupyter.org/) for transforming VoTT raw json to Saral ROI json. Refer to source repository path **specs\v1\README.md** file for more details. You may consider installing the extension in MS Visual Studio Code.
* PostMan or any other REST client tool to invoke/test Rest APIs.

### Source Code references

> > Open Terminal and clone source code `git clone https://github.com/Sunbird-Saral/Project-Saral.git.`
> >
> > `For latest repo refer` [Source Code Repository](/engage/source-code-repository)

> > Change Directory to `Project-Saral/` folder and switch to release tag as per release notes. `git checkout tags/<tag_name>`

> > `$FRONTEND_FOLDER = Project-Saral/v1.0/frontend`

> > `$BACKEND_FOLDER = Project-Saral/v1.0/backend`

## Frontend Setup

* [Setting up the React Native development environment](https://reactnative.dev/docs/environment-setup)  **Note**: Choose `React Native CLI Quick Start` tab for setup instructions.
* Download [**NDK 20.0.5594570**](https://androidsdkoffline.blogspot.com/p/android-ndk-side-by-side-direct-download.html) and extract archive to **$ANDROID\_HOME**\ndk folder.
* In Android Studio, navigate to `File\Project Structure\SDK Location` and set Android NDK location to **$ANDROID\_HOME**\ndk\android-ndk-r20 (extracted in the last step).
* Make sure `sdk.dir` paths are set properly in [$**FRONTEND\_FOLDER**](#source-code-references)**\\**&#x53;aralAp&#x70;**\\**&#x61;ndroid\local.properties.&#x20;
* Register on [Google Firebase](https://firebase.google.com/), add the Saral project on the firebase dashboard and download the corresponding **google-services.json**.
* Place downloaded `google-services.json` under [$**FRONTEND\_FOLDER**](#source-code-references)/SaralApp/android/app folder.
* Once Vysor and AVD are configured as per the instructions, follow the below steps to bring up the application.
* Open a terminal in [$**FRONTEND\_FOLDER**](#source-code-references)**/SaralApp** and run `npm i` the command.
* `cd android && ./gradlew clean && cd ..`
* `npx react-native run-android`
* Make sure backend **BASE\_URL** is configured in [$**FRONTEND\_FOLDER**](#source-code-references)**/SaralApp/src/configs/config.js** file.
* Successful frontend deployment should show Saral OCR login screen on AVD or USB connected Android device.

## Backend Setup

* Install node and MongoDB in your local machine.
* From Saral release `v1.5.4` and above, please execute below commands from [$**BACKEND\_FOLDER**](#source-code-references) in a terminal.

> > `cp ../../specs/v1.5/swagger-saral-maintenance.yaml ./src`

> > `cp ../../specs/v1.5/swagger-saral-frontend.yaml ./src`

> > `cp ../../specs/v1.5/swagger-saral-apidoc.yaml ./src`

* Install npm packages by running `npm i` from [$**BACKEND\_FOLDER**](#source-code-references).
* Create a subfolder inside the backend folder name it as configuration.
* Now create a file in **config\dev.env** and paste the below commands

> > `PORT=3000`

> > `MONGODB_URL=mongodb://localhost:27017/saraldata_dev`

> > `JWT_SECRET=SARALDATA_NODE`

* Run `npm run dev` command from a terminal in [$**BACKEND\_FOLDER**](#source-code-references)**.**
* Successful backend local deployment should show Server is up on port 3000

## Backend DevOps

Dockerfile is available under [$**BACKEND\_FOLDER**](#source-code-references) folder.

Build docker image using `docker build . -t saral-backend:1.0-latest the` command from [$**BACKEND\_FOLDER**](#source-code-references) folder in a Terminal.

Docker swarm stack reference file available at [$**BACKEND\_FOLDER**](#source-code-references)/saralbackend-stack.yml

Docker-compose reference file available at [$**BACKEND\_FOLDER**](#source-code-references)/docker-compose.yml

## Backend Data Load

* Make sure the backend server is running
* Command to delete/clean existing data:

  `node ./data/import-data.js --delete`
* Command to load data from data files in ./backend/data folder.

  `node ./data/import-data.js --import`

## Useful Developer Tools

<https://www.npmjs.com/package/react-devtools> Note: For the current version of Saral execute `npm i -g react-devtools@"<4.11.0"`


# Saral App Reference Backend

Reference backend implementation for Saral App to function

This is a reference backend with REST APIs developed using NodeJs,MongoDB, Docker.

The source code and binary distrubtion(docker image) of the same are available in public repositiries. More details can be found in the [Release Notes](/engage/releases).

**Reference** : Checkout [Source Code Repository](/engage/source-code-repository) and switch to desired branch or tag and refer to `v1.0/backend/README.md` for more details.


# Generating APK from source code

Steps how to generate APK from source code

### Source Code references

> > Open Terminal and clone source code `git clone https://github.com/Sunbird-Saral/Project-Saral.git`
> >
> > `Refer`[Source Code Repository](/engage/source-code-repository)for latest repository location.

> > Change Directory to `Project-Saral/` folder and switch to release tag as per release notes. `git checkout tags/<tag_name>`

> > `$FRONTEND_FOLDER = Project-Saral/v1.0/frontend`

> > `$BACKEND_FOLDER = Project-Saral/v1.0/backend`

### Saral v1.0 Android App bundling/packaging

1. Follow Frontend Setup steps @ [Workspace Setup - Playbook](/use/workspace-setup-playbook)
2. Implementing Saral App for specific purpose , its recommended to change default package `com.saralapp`  references to implementation specific package for example `com.saralapp.xxstate` for xxstate. Refer below screenshot.                                           ![](/files/3LBBVMQl9ZVmkvewbkki)                                              &#x20;
3. App Icon can be customised/replaced by generating App icon using standard icon editors and replace icons in below folders.
   * $FRONTEND\_FOLDER\SaralApp\android\app\src\main\res\mipmap-mdpi
   * $FRONTEND\_FOLDER\SaralApp\android\app\src\main\res\mipmap-hdpi&#x20;
   * $FRONTEND\_FOLDER\SaralApp\android\app\src\main\res\mipmap-xhdpi&#x20;
   * $FRONTEND\_FOLDER\SaralApp\android\app\src\main\res\mipmap-xxhdpi&#x20;
   * $FRONTEND\_FOLDER\SaralApp\android\app\src\main\res\mipmap-xxxhdpi
4. Open Terminal in [**`$FRONTEND_FOLDER`**](#source-code-references)`/SaralApp/android` folder

> > `./gradlew clean`

APK Signing can be enabled using the below Gradle files. Make sure the Keystore file is to be used for signing placed in [**`$FRONTEND_FOLDER`**](#source-code-references)`/SaralApp/android/app` folder.

> > [**`$FRONTEND_FOLDER`**](#source-code-references)`/SaralApp/android/gradle.properties`

```
MYAPP_RELEASE_STORE_FILE=my-upload-key.keystore

MYAPP_RELEASE_STORE_PASSWORD=changeit

MYAPP_RELEASE_KEY_ALIAS=hwrecog-key-alias

MYAPP_RELEASE_KEY_PASSWORD=changeit
```

> > [**`$FRONTEND_FOLDER`**](#source-code-references)`/SaralApp/android/app/build.gradle`

**Note**: Make sure `signingConfig signingConfigs.release` the line is uncommented. Also set `enableSeparateBuildPerCPUArchitecture` flag to true to generate CPU architecture specific APKs. This will also reduce the size of the APK compared to universal APK.

```
    signingConfigs {
          release {
         if (project.hasProperty('MYAPP_RELEASE_STORE_FILE')) {
            storeFile file(MYAPP_RELEASE_STORE_FILE)
             storePassword MYAPP_RELEASE_STORE_PASSWORD
             keyAlias MYAPP_RELEASE_KEY_ALIAS
             keyPassword MYAPP_RELEASE_KEY_PASSWORD

             // Optional, specify signing versions used
               v1SigningEnabled true
               v2SigningEnabled true
         }
     }
         debug {
             storeFile file('debug.keystore')
             storePassword 'android'
             keyAlias 'androiddebugkey'
             keyPassword 'android'
         }
     }

    buildTypes {
        debug {
            signingConfig signingConfigs.release
        }
        release {
            signingConfig signingConfigs.release
            /* These are optional params to shrink the app size*/
            shrinkResources enableProguardInReleaseBuilds
            zipAlignEnabled enableProguardInReleaseBuilds
            useProguard enableProguardInReleaseBuilds

            minifyEnabled enableProguardInReleaseBuilds
            minifyEnabled true
            shrinkResources true
            /* These are optional params to shrink the app size*/
                                    
            debug {
                debuggable true
            }
        }
    }
```

1. Update `google-services.json` file in [**`$FRONTEND_FOLDER`**](#source-code-references)`/SaralApp/android/app` folder.
2. Edit [**`$FRONTEND_FOLDER`**](#source-code-references)`/SaralApp/src/config/config.js` to change apkVersionId , apkURL, BASE\_URL as per the implementation.&#x20;
3. Open Terminal in [**`$FRONTEND_FOLDER`**](#source-code-references)`/SaralApp/android` folder

> > `./gradlew assembleRelease`

(OR)

> > `./gradlew assembleDebug`

3\. You can find the release apk file in `Project-Saral/v1.0/frontend/SaralApp/android/app/build/outputs/apk/release or debug` folder.

**Note:** If releasing APK file for a client/implementation, its recommended to build APK from the release tag and modify implementation-specific **BASE\_URL** entry and `google-services.json` file.

1. Open terminal from [**`$FRONTEND_FOLDER`**](#source-code-references)`/SaralApp/android` folder and execute the below command to verify apk signature.

`jarsigner -verbose -verify ./app/build/outputs/apk/release/app-release.apk`


# Generate AAB(App bundle) from source code

Steps how to generate ABB from source code

### Source Code references

> > Open Terminal and clone source code `git clone https://github.com/Sunbird-Saral/Project-Saral.git`
> >
> > `Refer`[Source Code Repository](/engage/source-code-repository)for latest repository location.

> > Change Directory to `Project-Saral/` folder and switch to release tag as per release notes. `git checkout tags/<tag_name>`

> > `$FRONTEND_FOLDER = Project-Saral/v1.0/frontend`

> > `$BACKEND_FOLDER = Project-Saral/v1.0/backend`

### Saral v1.0 Android App bundling/packaging

1. Follow Frontend Setup steps @ [Workspace Setup - Playbook](/use/workspace-setup-playbook)
2. Implementing Saral App for specific purpose , its recommended to change default package `com.saralapp` references to implementation specific package for example `com.saralapp.xxstate` for xxstate. Refer below screenshot.                                           ![](/files/3LBBVMQl9ZVmkvewbkki)                                                                                                   &#x20;
3. App Icon can be customised/replaced by generating App icon using standard icon editors and replace icons in below folders.
   * $FRONTEND\_FOLDER\SaralApp\android\app\src\main\res\mipmap-mdpi
   * $FRONTEND\_FOLDER\SaralApp\android\app\src\main\res\mipmap-hdpi&#x20;
   * $FRONTEND\_FOLDER\SaralApp\android\app\src\main\res\mipmap-xhdpi&#x20;
   * $FRONTEND\_FOLDER\SaralApp\android\app\src\main\res\mipmap-xxhdpi&#x20;
   * $FRONTEND\_FOLDER\SaralApp\android\app\src\main\res\mipmap-xxxhdpi
4. Open Terminal in [**`$FRONTEND_FOLDER`**](#source-code-references)`/SaralApp/android` folder

> > `./gradlew clean`

1. AAB Signing can be enabled using the below Gradle files. Make sure the Keystore file is to be used for signing placed in [**`$FRONTEND_FOLDER`**](#source-code-references)`/SaralApp/android/app` folder.

> > [**`$FRONTEND_FOLDER`**](#source-code-references)`/SaralApp/android/gradle.properties`

```
MYAPP_RELEASE_STORE_FILE=my-upload-key.keystore

MYAPP_RELEASE_STORE_PASSWORD=changeit

MYAPP_RELEASE_KEY_ALIAS=hwrecog-key-alias

MYAPP_RELEASE_KEY_PASSWORD=changeit
```

> > [**`$FRONTEND_FOLDER`**](#source-code-references)`/SaralApp/android/app/build.gradle`

Note: Make sure `signingConfig signingConfigs.release` the line is uncommented.

```
    signingConfigs {
          release {
         if (project.hasProperty('MYAPP_RELEASE_STORE_FILE')) {
            storeFile file(MYAPP_RELEASE_STORE_FILE)
             storePassword MYAPP_RELEASE_STORE_PASSWORD
             keyAlias MYAPP_RELEASE_KEY_ALIAS
             keyPassword MYAPP_RELEASE_KEY_PASSWORD

             // Optional, specify signing versions used
               v1SigningEnabled true
               v2SigningEnabled true
         }
     }
         debug {
             storeFile file('debug.keystore')
             storePassword 'android'
             keyAlias 'androiddebugkey'
             keyPassword 'android'
         }
     }

    buildTypes {
        debug {
            signingConfig signingConfigs.release
        }
        release {
            signingConfig signingConfigs.release
            /* These are optional params to shrink the app size*/
            shrinkResources enableProguardInReleaseBuilds
            zipAlignEnabled enableProguardInReleaseBuilds
            useProguard enableProguardInReleaseBuilds

            minifyEnabled enableProguardInReleaseBuilds
            minifyEnabled true
            shrinkResources true
            /* These are optional params to shrink the app size*/
                        
            debug {
                debuggable true
            }
        }
    }
```

1. Update `google-services.json` file in [**`$FRONTEND_FOLDER`**](#source-code-references)`/SaralApp/android/app` folder.
2. Edit [**`$FRONTEND_FOLDER`**](#source-code-references)`/SaralApp/src/config/config.js` to change apkVersionId , apkURL, BASE\_URL as per the implementation.&#x20;
3. Open Terminal in [**`$FRONTEND_FOLDER`**](#source-code-references)`/SaralApp/android` folder

> > `./gradlew bundleRelease`

(OR)

> > `./gradlew bundleDebug`

1. You can find the release .aab file in `Project-Saral/v1.0/frontend/SaralApp/android/app/build/outputs/bundle/release or debug` folder.

**Note:** If releasing AAB file for a client/implementation, recommended creating a sub-branch(say v1.0.0-beta.1-up-apk) from release tag and modify implementation-specific Base URL.

1. Open terminal from [**`$FRONTEND_FOLDER`**](#source-code-references)`/SaralApp/android` folder and execute the below command to verify if AAB signature.

`jarsigner -verbose -verify ./app/build/outputs/apk/release/app-release.aab`

AAB file can't be used for installation and testing directly. Its for publishing to playstore. Once AAB file is generated , use below command to generate universal APK for installation and testing before publishing to Google play-store.

1. Download Bundletool from [Bundle Tool Releases](https://github.com/google/bundletool/releases)
2. `java -jar <bundletool-all-1.10.0.jar> build-apks --bundle=app-release.aab --output=app-release.apks --mode=universal --ks=keystore.jks --ks-pass=pass:your_keystore_password --ks-key-alias=your_key_alias --key-pass=pass:your_key_password`


# Sign already generated APK file with private Key

Sign existing APK file with keystore

Refer [Workspace Setup - Playbook](/use/workspace-setup-playbook)to setup Android on the developer machine.

Execute below command from a terminal:

**`$ANDROID_HOME`**`/build-tools/{build-tool-version}/apksigner sign --ks <keystore.jks> --out <saral-release-signed.apk> <saral-app-unsigned-aligned.apk>`

OR

**`%ANDROID_HOME%`**`/build-tools/{build-tool-version}/apksigner sign --ks <keystore.jks> --out <saral-release-signed.apk> <saral-app-unsigned-aligned.apk>`

Example:

**`$ANDROID_HOME`**`/build-tools/30.0.2/apksigner sign --ks my-release-key.jks --out saral-release-signed.apk saral-app-unsigned-aligned.apk`

Please enter keystore password when prompted. This will generate signed apk with the name provided in  `--out`  parameter.


# Layout configuration

Layout configuration for Saral App to detect and predict

Refer [Layout specification](/learn/specifications/layout-specification)

1. Capture the printed layout using saral app for tagging.

   1. > Set debug option to true to store the image in android mobile. Modify below java file under /saralsdk and change below highlighted flags to true.

   SaralSDKOpenCVScannerActivity.java

   > > ```
   > >    mTableCornerDetection           = new TableCornerCirclesDetection(true);
   > >    mDetectShaded                   = new DetectShaded(true);
   > > ```

   2. > With the above changes, run the scan on the mobile.
   3. > Use the below command to grab the android level logs and search for 'SrlSDK::CVOps: Saving file:' and 'SrlSDK::DetectShaded: Saving file:'. This will give you path to where the saved images are stored in your android phone.

   `adb logcat`

   4. > Use the below command to pull the images finally. `adb pull <image path in android phone found in above logs>` example: `adb pull /storage/emulated/0/Android/data/com.saralapp/files/Download/table_4Fg.jpg`

2\. Tools like [MS VoTT](https://github.com/microsoft/VoTT) can be used to tag ROIs with the layout. This will give a raw VoTT Json with ROI coordinates.

3\. Use [Jupyter Notebook](https://jupyter.org) to transform raw VoTT Json to target [Layout specification](/learn/specifications/layout-specification) json format. Existing layout transformation notebooks can be referred @ `/specs/v1.5/jupyter-notebook` in[ ](/engage/source-code-repository)the [Repository](/engage/source-code-repository).

4\. This final layout json should be configured in backend `GET /roi/{examId}` API for each exam to enable the layout.

Starting from `v1.5.0` release each layout can have threshold minimum width,minimum height and detectionRadius configured. This configuration is used by App to detect the sheet only if minimum width and height between dark corner circles is met with scanned sheet/layout. This is to avoid invalid scans which may result in unwanted predictions.

Sample layout with threshould minWidth, minHeight and radius(radius of 4 corner dark circles for alignment) configuration.

`threshold\experimentalOMRDetection` flag is used to enable experimental feature to detection OMR filled with pencil or any color pen. This experimental feature will be available from v1.5.6 release or above.

```
  "layout": {
      "version": "1.0",
      "name": "HINDI8S13QOMR Exam Sheet Form",
      "threshold": {
          "minWidth" : 500,
          "minHeight": 200,
          "detectionRadius": 12,
          "experimentalOMRDetection": true
      },            
      "cells": [
          {
              "cellId": "1",
              "rois": [
                  {
                      "annotationTags": "ROLLNUMBERID1_1",
                      "extractionMethod": "NUMERIC_CLASSIFICATION",
                      "roiId": "1",
                      "index": 0,
                      "rect": {
                          "top": 151,
                          "left": 54,
                          "bottom": 178,
                          "right": 69
                      }
                  },
```

**Extraction Methods Supported**

<table><thead><tr><th width="402">extractionMethod</th><th>Description</th></tr></thead><tbody><tr><td><strong>NUMERIC_CLASSIFICATION</strong></td><td>This extraction method is used for handwritten digits 0 to 9.</td></tr><tr><td><strong>CELL_OMR</strong></td><td>This extraction method is used for omr detection. Added <code>experimentalOMRDetection</code>flag to support OMR filled with pencil,any color ball pens.</td></tr><tr><td><strong>BLOCK_ALPHANUMERIC_CLASSIFICATION</strong></td><td>This extraction method is used for Alphanumeric detection . For example Address filed can hold block letters with digits. This feature is available from v1.5.6 release and above.</td></tr></tbody></table>


# Debug/Run Saral App from Android Studio

Run or Debug Saral App

### Source Code references

> > Open Terminal and clone source code `git clone https://github.com/Sunbird-Saral/Project-Saral.git`
> >
> > For latest repository details , refer: [Source Code Repository](/engage/source-code-repository)

> > Change Directory to `Project-Saral/` folder and switch to release tag as per release notes. `git checkout tags/<tag_name>`

> > `$FRONTEND_FOLDER = Project-Saral/v1.0/frontend`

> > `$BACKEND_FOLDER = Project-Saral/v1.0/backend`

Make sure [Workspace Setup - Playbook](/use/workspace-setup-playbook) is done. Follow below steps for debugging/running application from Android Studio

1. Open [**`$FRONTEND_FOLDER`**](#source-code-references)`/SaralApp/android folder` from Android Studio.
2. Run `npx react-native start` command from Terminal in [**`$FRONTEND_FOLDER`**](#source-code-references)`/SaralApp` the directory.
3. Run `adb reverse tcp:8081 tcp:8081` from another terminal
4. Now click on the `Run` or `Debug` button from Android studio.
5. When you are debugging, have debug breakpoints in android code as needed for troubleshooting.


# Saral App Debug Tips

Saral App Debug Tips

## SaralSdk log tracing from Android studio

In Android studio,open Logcat view at the bottom while running android application. Use "SrlSdk" as a filter in Logcat view to monitor Saral SDK logs. This is easy way to monitor whats happening within [SaralSDK](/engage/saral-sdk-source-code-repository) code.

## Debug React Native Layer

1. Install `react-native-cli` using the below command.

`npm install --global react-native-cli`

2\. Run the below command from the frontend folder

`react-native run-android`

3\. Run the below command to trace logs.

`react-native log-android`

## Android logs

> Install <https://developer.android.com/studio/command-line/adb>

> use the below log command to monitor android logs.

`adb log-cat`

## SaralSdk log tracing from Android studio

In Android studio,open Logcat view at the bottom while running android application. Use "SrlSdk" as a filter in Logcat view to monitoring Saral SDK logs. This is easy way to monitor whats happening with in SaralSDK code.

## Navigate to the Android device path to check files stored.

`adb shell cd <Path>`

> Example: `storage/emulated/0/Android/data/com.saralapp/files/Download`

## Capture scanned images from Android phone

* > Set debug option to true to store the image in android mobile. Modify below java file under /saralsdk and change below highlighted flags to true.

SaralSDKOpenCVScannerActivity.java

> > ```
> >    mTableCornerDetection           = new TableCornerCirclesDetection(true);
> >    mDetectShaded                   = new DetectShaded(true);
> > ```

* > With the above changes, run the scan on the mobile.
* > Use the below command to grab the android level logs and search for 'SrlSDK::CVOps: Saving file:' and 'SrlSDK::DetectShaded: Saving file:'. This will give you path to where the saved images are stored in your android phone.

`adb logcat`

* > Use the below command to pull the images finally. `adb pull <image path in android phone found in above logs>` example: `adb pull /storage/emulated/0/Android/data/com.saralapp/files/Download/table_4Fg.jpg`


# Saral App Usage Guidelines

Guidelines how to use the Saral App

1. Make sure scanning with Mobile/Tab happens in Landscape mode(shown in **Figure#1** below). ![](/files/5ZdWANBRrAxqnSlA9ZLC)(**Figure#1**)

2\. Printed layouts have 4 dark circles on the corner of the sheets(shown in **Figure#2**). Make sure these are printed with a proper quality printer. Avoid xerox copies of these layouts.

![](/files/mmKUdlnbTrSsG6eSmiu3)(**Figure#2**)

3\. Make sure the user is holding the device is in a stable state until the predictions appear on the App screen.

4\. For OMR sheets make sure bubbles are filled using a blue or black ball pen without any gaps for proper detection.

5\. Minimum width and height between dark circles for each layout can be configured in the backend layout json as threshold. This will have addtional check to layout detection logic. Only if minimum width and height requirement configured in layout is met , layout detection succeeds. App shows warining message as show in below screenshot if minumum height and width is not met. This feature is available from `v1.5.0` release

![](/files/q4ZbDUqw5JrjiCdtsSkI)

(**Figure#3)** Warning when threshould is configured in layout json and criteria is not met.

6\. Succesful scan from Saral App will have indications shown in below Figures.

![](/files/jI9lqlh8Wo2rlYcVVxTT)

(**Figure#4**) Detected the layout to be processed for detection.

![](/files/HxYJTXoh77Vhycw6RUgu)

(**Figure#5**) Processing detected layout for predictions. Make sure the "Please wait, scanning is in progress !!" message in blue colour is in the same direction as the layout. If both of them are  oriented in a different direction then its the wrong way to scan.


# Update BASE\_URL,apkURL in APK

From unix/mac terminal open apk attached with release in `vi` editor and update `BASE_URL` using below steps.

1\) Download APK file from release notes Assets section into \<target\_folder>.                                   For example for `v1.5.0` release download apk from  <https://github.com/Sunbird-Saral/Project-Saral/releases/download/v1.5.0/saral-app-unsigned-v1.5.0.apk>

2\) Open Terminal or shell in \<target\_folder> and use below `vi` command to open apk in `vi` editor.

&#x20;`vi saral-app-unsigned-v1.5.x.apk`&#x20;

3\) Press `Esc` key and type `/index.android.bundle` and presss `Enter` key to locate `assets/index.android.bundle` file and press `Enter` key. This will open up the file for editing.

4\) Search for `TO_BE_REPLACED` string and replace it with target BASE\_URL. For example \`[https://saral-statename.anuvaad.org](https://saral-statename.anuvaad.org/)\`

5\) Press `Esc` key and enter `:wq` to save and go to file list the `vi` editor. Press `Esc` key and enter `:q` to quit the `vi` editor.

6\) APK file should be updated with target BASE\_URL with above steps.

7\) Search for `apkURL` and change the value to actual Playstore URL based on the implementation.


# Update BASE\_URL,apkURL in AAB

With in saral-app-v1.xxx.aab file , open `base/assets/index.android.bundle` file&#x20;

Search for `TO_BE_REPLACED` string and replace it with target BASE\_URL. For example \`[https://saral-statename.anuvaad.org](https://saral-statename.anuvaad.org/)\`

Search for `apkURL` and change value to actual Playstore URL based on the implementation.


# Sign already generated AAB(Android App Bundle) file with private key

Make sure JAVA is configured on your machine and `jarsigner` command is available.

Use below command to sign the AAB file. This command will prompt you for keystore passphrase or password.

`jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore [path to keystore] -signedjar [name for the output signed file].aab [path to unsigned aab] [keystore alias]`

**Example:**

`jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore hwrecog-upload-key.keystore -signedjar app-release-signed.aab app-release.aab hwrecog-key-alias`


# Google Play Store App Publish Considerations

Play Store App publish have pre-requisites interms of privacy policy , misleading claim policy etc.

Refer to [Developer Program Policy](https://support.google.com/googleplay/android-developer/answer/11899428) for more details. These policies can be changed by google time to time, so please refer latest policies before publishing App in playstore.

**Privacy Policy** for App to be listed in the playstore to be generated and publish this policy of the app as a URL. The same `Privacy Policy URL` needs to be added in the play store "Store Listing" section of your application before publishing the Application.

**Misleading Claims** Google team reviews the app content including logos , images , content to see if any misleading claims. For example "government affiliation or authorization to facilitate government services through your app". A [Advance Notice Form](https://support.google.com/googleplay/android-developer/contact/adv_note) to be submitted for any such affiliations or claims for google team to review it.

\ <br>


# Layout Design Guidelines

Layout Design Guidelines

Below are the guidlines to design layouts compatible with `Saral App` and `SaralSDK`.

&#x20;  <img src="https://lh4.googleusercontent.com/9JO0k5Ftl0gIE6WfkP9WJNcFXmcem_mrgBMgeyuYXS-BVQmH5ItLs42w0PEIhDCpZd1sQtoxyp8h1wZBDNLBnIvv-MkkL4cfv83c1v_0TweqMfHK80Mda6_EjVwMYf_UT3sbDZFxyR5ws8qqd4RPJg" alt="" data-size="line">  Alignment Circle Radius Width – 36px & Height 36px Border Radius – 100px or use directly Circle shape. These alignment circles should be present in the corners of the overall table area to be able to facilitate scanning the sheet.

&#x20;<img src="https://lh4.googleusercontent.com/0WV1oieI6PHnYvW4ZHJsXhUpqIAoQG5piEslebLV8vmmdNXguEaUVBSaIn22yUgVKMGMJ-juIIJYJ9n1JqBqp2N1ScfXCrsf0wpvGGBbVhStgTb0Tn4Hpsiqh7RrUN2pDN8bB84LvffsBV8R_5TE-g" alt="" data-size="line">  Box for informational fields(Can’t be scanned): Width – 26px & Height 26px Border Color - #C2C2C2 Fill Color - #ffffff

<img src="https://lh3.googleusercontent.com/b-sfMMUdQrRuxbGNBvz8pTcqBxs7iwfB1cNHv9pqDT4MiOERMwkKIukYEfvWGwgNV8Y30ZIUvsAEU-lqbLeGiwF-echpeuWLYTpxdzd6Htz7ipfB8h8pJdjVtbpkvxiukYViThiSN36Pgfi3QROfzw" alt="" data-size="line">  Box for Handwritten Digit or Block Letter: Width – 21px & Height 26px Border Color - #C2C2C2 Fill Color - #ffffff

<img src="https://lh5.googleusercontent.com/zEgPnCNC7j2xI2FMGIIHOPEoeViRnrG-aPaSFexYYDY3zbSa8VX-aMQLIOl0oE52L2v4useidsqZO-Y601y5DtGT5XfXlguMx1hbQZPLsF9Iugd8A2sTDyWg3vi2GCmKk_wIUkI4NH36pl-mtHrmMg" alt="" data-size="line">   OMR Bubble Width – 12px & Height - 12px Border Radius – 100px or use directly Circle shape Fill Color - #ffffff, Border Color - #C2C2C2

<img src="https://lh5.googleusercontent.com/T9n-rKcUlcIdcacqr36gPtpXSoTIsnccT7_87hQR3nxYllU2sqrUnnd5eoeVfNGV9ZDnimYRXeexFFApbAo_EvM48clT-WvNvhJJjkWshfgjPGL5Cc6Tzoz94jaX0odsnQ-z0hi2Da0gZCfHhKdPIA" alt="" data-size="line">  Row & Column Width – 41px, Height-41px Border – 1px, Border Color - #000

**Text** Font Name – “Noto Sans”, Color- #707070, Font Size – 9px (Optional, can use other fonts and colors)

**Page Size** – Custom Size, Maximum Dimension In MM - Maximum Width – 842 mm & Maximum Height- 595 mm Dimension In Inch - Maximum Width – 33 inch & Maximum Height- 24 inch Dimension In Pixel (300ppi/dpi) - Maximum Width – 3182 pixel & Maximum Height- 2248 pixel Mode - Landscape

Refer some of the layouts designed and used in `Saral` implementations.

![](/files/L4aTk8LxgFIagZWXKRqJ)  ![](/files/Vo8VyCfO6tAs2u1Dd2Nr)

![](/files/t1LWDiJuMxRI9n48d2jP) ![](/files/gz8qEm2EgvAgeNKF6nbn)

![](/files/zXZzgwnVUpOcpWWHHSce)


# Firebase setup for Saral App Telemetry

Firebase setup for Saral App Telemetry

## **Setup react native side**

Some libraries have to be installed to add firebase Google Analytics and firebase Google Crashlytics in react native

```
npm i @react-native-firebase/app
npm i @react-native-firebase/analytics
npm i @react-native-firebase/crashlytics
```

### **Add In your module (app-level) Gradle file under dependencies**

```
implementation "com.google.firebase:firebase-iid:21.1.0"
implementation "com.google.firebase:firebase-bom:31.2.2"
implementation 'com.google.firebase:firebase-analytics'
implementation ('com.google.firebase:firebase-iid:21.1.0'){
transitive = true}
```

### **On the top of (app-level) Gradle file add this line**

```
apply plugin: 'com.google.gms.google-services'
apply plugin: 'com.google.firebase.analytics'
apply plugin: 'com.google.firebase.crashlytics'
```

### **Add In your root-level (project-level) Gradle file under dependencies**

```
classpath("com.google.gms:google-services:4.3.3")
classpath "com.google.firebase:firebase-iid:19.0.0"
classpath 'com.google.firebase:firebase-crashlytics-gradle:2.7.1'
```

### **Add In your frontend/SaralApp/android/app/src/main/AndroidManifest.xml**

```
< meta-data android:name="firebase_analytics_collection_enabled" android:value="true" />

< meta-data android:name="firebase_crashlytics_collection_enabled" android:value="true" />
```

### **To link the app to firebase, go to the firebae console and make project**

[firebase console](https://firebase.google.com/)

### **To link the app after the project is created**

Add google-service.json under android/app

## **Firebase Analytics Run time configuration**

For enable or disable at run time environment firebase\_analytics\_collection\_enabled in App.js file **frontend/SaralApp/App.js**

You need to add flag **isFBAnalyticsEnabled** in login api

> > /schools/login

Response from api

> > "school": { "storeTrainingData": true, "name": "Dummy school 4", "schoolId": "u002", "state": "up", "district": "district1", "autoSync": true, "autoSyncFrequency": 900000, "tags": true, "autoSyncBatchSize": 10, "offlineMode": true, "isAppForceUpdateEnabled": false, "isFBAnalyticsEnabled": true, "userId": "u002" }

Add in code useEffect(async()=>{ let hasFBAnalytics = await getLoginData();

```
const hasFBAnalyticsValue = hasFBAnalytics.school && hasFBAnalytics.school.enableFBAnalytics
if(hasFBAnalyticsValue != null){
if (__DEV__) {
  analytics().setAnalyticsCollectionEnabled(hasFBAnalyticsValue);
  crashlytics().setCrashlyticsCollectionEnabled(hasFBAnalyticsValue);}  else{
  analytics().setAnalyticsCollectionEnabled(hasFBAnalyticsValue);
  crashlytics().setCrashlyticsCollectionEnabled(hasFBAnalyticsValue);}}},[])
```

**DEV** variable. By default if you run your app with **npx react-native run-android**, it will run in Debug mode and **DEV** will be true. In release mode, **DEV** will be false.\
Here **hasFBAnalyticsValue** is the flag which will come from backend as boolean.\
**If mobile is not connected with internet then data will not pushed to the firebase**

After adding all dependencie rebuild the app using **npx react-native run-android**

## **Firebase Pricing plans**

Get started at no cost,then pay as you go.\
Firebase service will be free of cost for some time but after some time events triggered it will be chargeable\
Here is the link for know all plans [pricing plans](https://firebase.google.com/pricing#blaze-calculator)


# Firebase setup for TFLite model deployment

Firebase setup for TFLite model deployment

### **Firstly We need an account of firebase to publish and download TFLite model**

<https://console.firebase.google.com/>

#### **1. Enter project name:**

![](/files/M5MrdGgKuAZGam6yZSfR)

#### **2. Press on Continue button:**

![](/files/fwJCds6Wnw29S40G3HVG)

#### **3. Select Account to continue:**

![](/files/GtPHQJgPgjxO8SGrD1hu)

#### **4. Press on continue button:**

![](/files/HQSoFVbSQnnQGHJftfQq)

#### **5. Click on Android:**

![](/files/6KW47Ik5rXihekQNGy4m)

#### **6. Add package name which will get from android/app/build.gradle file then once added package name click on Register button:**

![](/files/YPV9l5DT2jGB86y4ge7h)

#### **7. Download Service json file:**

![](/files/Zd6e0hnQochJMPnkxNXR)

#### **8. Do not add this dependency which is already added in project:**

![](/files/nWsLNk1SlYo1HstCbDCv)

#### **9. Press continue button:**

![](/files/ySQ0h6jX9Vit0LlPeE1L)

### **Firebase setup for Remote configuration to enable TFLite model**

i) If remote config flag is set as true in firebase.\
ii) Then tflite model will be downloaded in mobile once it's timer completed.\
iii) Timer can be change in RemoteConfig.java file.\
iv) Timer will be count in second.

![](/files/UAN4SveYjqIji1u5tkiK)

### **There are some step for enable remote configuration which are listed below.**

#### **1. Press on Remote Config**

![](/files/GenxFpcC4iMBErC8WbHF)

#### **2. Press on Create Configuration**

![](/files/PmxGxEZnU9nn0AcPJphy)

#### **3. Add field name with its data type and save it:**

![](/files/T5ePQvr4S6BK0bmyp6vZ)

#### **4. Click on Publish Changes**

![](/files/yxEeQDmSFbis1c1pt0J3)


# Alternatives for Saral components

## **Alternatives for Saral components:**

Saral uses a variety of components in order to enable a set of workflows. The choice of these has been driven by the needs for the initial set of workflows that the Saral reference solution enables. These choices however, are to be based on adopter needs and an adopter can choose to use alternative components, if that is what their requirements dictate. This section captures a few details on how two components can be replaced by alternatives.

#### Table of content

1. [How to Migrate Saral backend to use Postgresql instead of MongoDB](#how-to-migrate-saral-backend-to-use-postgresql-instead-of-mongodb)
2. [Open-Source alternative for Firebase Analytics](#open-source-alternative-for-firebase-analytics)

\ <br>

## **How to Migrate Saral backend to use Postgresql instead of MongoDB**

This guide explains high level steps on how to switch from MongoDB to another alternative - PostgreSQL as the database for your Saral backend application using Sequelize. Sequelize is an ORM (Object-Relational Mapping) for Node.js, providing a higher-level abstraction over SQL databases.

### **Prerequisites**

* Node.js installed on your system
* PostgreSQL installed and running on your system

### **Steps**

#### **1. Install Necessary dependency:**

* To use postgresql install node libraries like **sequelize, pg, pg-hstore**

#### **2. Modify Mongoose models to sequelize models:**

**Saral Database Schema:**

* Mongoose version of collection schemas can be found in below link:[ https://github.com/Sunbird-Saral/Project-Saral/tree/main/v1.0/backend/src/models](https://github.com/Sunbird-Saral/Project-Saral/tree/main/v1.0/backend/src/models)
* Additionally find sample data for these schemas in below link:\
  <https://github.com/Sunbird-Saral/Project-Saral/tree/main/v1.0/backend/data>

Schema details of different collections used in saral:

* Brand

  | **Key Name** | **Type** | **Required** |
  | ------------ | -------- | ------------ |
  | logoImage    | String   | true         |
  | themeColor1  | String   |              |
  | themeColor2  | String   |              |
  | themeColor3  | String   |              |
  | themeColor4  | String   |              |
  | themeColor5  | String   |              |
  | appName      | String   | true         |
  | state        | String   |              |
  | supportIcon  | String   |              |
  | Logout       | String   |              |
  | About        | String   |              |
  | Support      | String   |              |
  | Help         | String   |              |
  | screenLabels | object   |              |
  | ClearCache   | String   |              |
* Classes

  | **Key Name** | **Type** | **Required** |
  | ------------ | -------- | ------------ |
  | className    | String   | true         |
  | classId      | String   | true         |
  | sections     | Array    |              |
  | schoolId     | String   | true         |
* Counters

  | **Key Name**   | **Type** | **Required** |
  | -------------- | -------- | ------------ |
  | counter\_value | Number   |              |
  | \_id           | String   | true         |
* Exams

  | **Key Name** | **Type** | **Required** |
  | ------------ | -------- | ------------ |
  | examId       | Number   | true         |
  | classId      | String   | true         |
  | type         | String   | true         |
  | schoolId     | String   |              |
  | examLO       | String   | true         |
  | examDate     | String   |              |
  | subject      | String   | true         |
  | set          | Array    |              |
  | totalMarks   | Number   | true         |
  | questions    | object   |              |
  | state        | String   |              |
* locks

  | **Key Name** | **Type** | **Required** |
  | ------------ | -------- | ------------ |
  | lockType     | String   | true         |
  | lockId       | String   | true         |
* Marks

  | **Key Name**              | **Type**     | **Required** |
  | ------------------------- | ------------ | ------------ |
  | examId                    | Number       |              |
  | classId                   | String       | true         |
  | schoolId                  | String       | true         |
  | examDate                  | String       |              |
  | subject                   | String       | true         |
  | set                       | String       |              |
  | totalMarks                | Number       | true         |
  | section                   | String       | true         |
  | studentId                 | String       | true         |
  | studentIdTrainingData     | Array        |              |
  | predictedStudentId        | String       |              |
  | predictionConfidence      | Array        |              |
  | studentAvailability       | Boolean      | true         |
  | marksInfo                 | Array object |              |
  | totalMarks                | Number       | true         |
  | maxMarksTrainingData      | Array        |              |
  | maxMarksPredicted         | String       |              |
  | maxMarksConfidence        | Array        |              |
  | maxMarksTrainingData      | Array        |              |
  | securedMarks              | Number       | true         |
  | obtainedMarksTrainingData | Array        |              |
  | obtainedMarksPredicted    | String       |              |
  | obtainedMarksConfidence   | Array        |              |
  | createdOn                 | String       |              |
  | roiId                     | String       |              |
  | shardedKey                | String       | true         |
  | userId                    | String       | true         |
* Roi

  | **Key Name** | **Type** | **Required** |
  | ------------ | -------- | ------------ |
  | subject      | String   | true         |
  | classId      | String   | true         |
  | roiId        | String   | true         |
  | roi          | object   | true         |
  | set          | String   |              |
  | state        | String   | true         |
  | type         | String   |              |
* Schools

  | **Key Name**            | **Type** | **Required** |
  | ----------------------- | -------- | ------------ |
  | name                    | String   | true         |
  | schoolId                | String   | true         |
  | autoSync                | Boolean  |              |
  | autoSyncFrequency       | Number   |              |
  | autoSyncBatchSize       | Number   |              |
  | tags                    | Boolean  |              |
  | isMinimalMode           | Boolean  |              |
  | supportEmail            | String   |              |
  | isAppForceUpdateEnabled | Boolean  |              |
  | offlineMode             | Boolean  |              |
  | isManualEditEnabled     | Boolean  |              |
  | scanTimeOutMs           | Number   |              |
  | district                | String   | true         |
  | isFBAnalyticsEnabled    | Boolean  |              |
  | block                   | String   |              |
  | useCase2                | Boolean  |              |
  | useCase3                | Boolean  |              |
  | useCase4                | Boolean  |              |
  | useCase5                | Boolean  |              |
  | state                   | String   | true         |
* Students

  | **Key Name** | **Type** | **Required** |
  | ------------ | -------- | ------------ |
  | name         | String   | true         |
  | studentId    | String   | true         |
  | fatherName   | String   |              |
  | classId      | String   | true         |
  | className    | String   | true         |
  | schoolId     | String   | true         |
  | section      | String   |              |
* Users

  | **Key Name** | **Type** | **Required** |
  | ------------ | -------- | ------------ |
  | name         | String   | true         |
  | userId       | String   | true         |
  | schoolId     | String   | true         |
  | password     | String   | true         |
* Roisv2

  | **Key Name** | **Type** | **Required** |
  | ------------ | -------- | ------------ |
  | schemaName   | String   | true         |
  | schoolId     | String   | true         |
  | roiId        | String   | true         |
  | roi          | object   | true         |
  | state        | String   | true         |
* Admissions

  | **Key Name**                  | **Type**        | **Required** | **Additional info**                                                                     |
  | ----------------------------- | --------------- | ------------ | --------------------------------------------------------------------------------------- |
  | userId                        | String          | true         |                                                                                         |
  | schoolId                      | String          | true         |                                                                                         |
  | admissionNumber               | String          | true         |                                                                                         |
  | dateOfAdmission               | String          | true         |                                                                                         |
  | studentAadharNumber           | String          | true         |                                                                                         |
  | studentFirstname              | String          | true         |                                                                                         |
  | studentSurname                | String          | true         |                                                                                         |
  | studentDateOfBirth            | String          | true         |                                                                                         |
  | studentGender                 | String          | true         |                                                                                         |
  | studentAddress                | String          | true         |                                                                                         |
  | studentBlock                  | String          | true         |                                                                                         |
  | studentDistrict               | String          | true         |                                                                                         |
  | guardianFirstname             | String          | true         |                                                                                         |
  | guardianSurname               | String          | true         |                                                                                         |
  | guardianRelation              | String          | true         |                                                                                         |
  | fatherName                    | String          | true         |                                                                                         |
  | fatherEducation               | String          | true         |                                                                                         |
  | fatherOccupation              | String          | true         |                                                                                         |
  | fatherContactDetails\_phone1  | String          | true         |                                                                                         |
  | fatherContactDetails\_phone2  | String          | false        |                                                                                         |
  | motherName                    | String          | true         |                                                                                         |
  | motherEducation               | String          | true         |                                                                                         |
  | motherOccupation              | String          | true         |                                                                                         |
  | motherContactDetails\_phone1  | String          | true         |                                                                                         |
  | motherContactDetails\_phone2  | String          | false        |                                                                                         |
  | rollNumber                    | String          | true         |                                                                                         |
  | religion                      | String          | true         |                                                                                         |
  | category                      | String          | true         |                                                                                         |
  | typeOfRationCard              | String          | true         |                                                                                         |
  | CwSN                          | String          | true         |                                                                                         |
  | addressOnRationCard\_address  | String          | true         |                                                                                         |
  | addressOnRationCard\_ward     | String          | true         |                                                                                         |
  | addressOnRationCard\_block    | String          | true         |                                                                                         |
  | addressOnRationCard\_district | String          | true         |                                                                                         |
  | outOfSchool                   | String          | true         |                                                                                         |
  | predictionInfo                | Array of Object | false        | This is optional field used to hold array of object containing info about training data |

#### **Note:**

**All the relationship/link between different collections is defined at Application level(code logic) since mongodb is NoSQL. We can either keep the same workflow using postgresql or feel free to move this to DB level and below is roughly how the ERD diagram would look like.**

**But make sure to recheck this against the code level logic and change accordingly**

![alt\_text](/files/3qJIRgkTEdOxUOKGR2DH)

#### **3. Setup proper indexes for DB query performance similar to once set in mongodb.**

Refer to mongoose models for index details

<https://github.com/Sunbird-Saral/Project-Saral/tree/main/v1.0/backend/src/models>

#### **4. Set up database connection**

Create a connection to your PostgreSQL database using Sequelize. Modify code in file to allow connection pooling and DB connection logic to use postgresql.

<https://github.com/Sunbird-Saral/Project-Saral/blob/main/v1.0/backend/src/db/mongoose.js>

Or add a new connection setup file.

#### **5. Modify middlewares, routes and controllers to use Sequelize**

* Modify controllers to use sequelize instead of mongoose <https://github.com/Sunbird-Saral/Project-Saral/tree/main/v1.0/backend/src/controller>
* Modify routes to use sequelize instead of mongoose <https://github.com/Sunbird-Saral/Project-Saral/tree/main/v1.0/backend/src/routers>
* Modify middlewares to use sequelize instead of mongoose <https://github.com/Sunbird-Saral/Project-Saral/tree/main/v1.0/backend/src/middleware>

#### **6. Modify Unit test cases to maintain code coverage and sonar gate quality checks.**

<https://github.com/Sunbird-Saral/Project-Saral/tree/main/v1.0/backend/test>

#### **7. Modify docker and docker-compose files to host Saral backend server to interact with postgresql DB.**

\ <br>

## **Open-Source alternative for Firebase Analytics**

Firebase Analytics is leveraged in order to understand basic user behavior on the Saral mobile application - including metrics such as number of logins, device profile etc. for the Saral mobile application. It allows for customization of all properties and events according to the application.

It also provides a simple dashboard for reporting.

Firebase is one of the options for basic measurement and tracking of the mobile application. There are many alternatives available, and the choice of tool should be driven by the reporting and measurement needs of the adopter

If an adopter chooses to not leverage Firebase, during the generation of the mobile app - they can skip the details on Firebase integration after the setup of the React native project.

#### **A few open source alternatives for Firebase include:**

* Kuzzle: Documentation link for integration <https://kuzzle.io/kuzzle-iot-open-source-platform/real-time-geolocation/>
* Superbase : Documentation link for setup <https://supabase.com/docs/guides/realtime/broadcast>


# Source Code Repository

Source Code Repository

{% embed url="<https://github.com/Sunbird-Saral/Project-Saral.git>" %}


# Saral SDK Source Code Repository

Saral SDK Source Code Repository

This is Saral React Native interface for Android environment. This SDK holds core features of AI/ML based predictions for Handwritten digits and OMR using [Layout specification](/learn/specifications/layout-specification) as interface. Saral SDK accepts [Layout specification](/learn/specifications/layout-specification) based layout json as input and responds with predictions enriched into input layout json.

{% embed url="<https://github.com/Sunbird-Saral/react-native-saral-sdk.git>" %}


# Tracker

Saral App Issue Tracker

{% embed url="<https://github.com/Sunbird-Saral/Project-Saral/issues>" %}


# Releases


# Saral - Solution Providers

Get in touch with the following Solution Providers if you would like to roll out solutions that employ Saral. These teams are part of the Saral community, and can help you craft an effective programs that leverage Saral.

[Tarento](https://www.tarento.com), Bangalore

Contact : <thillai.rajan@tarento.com>

[Tekdi Technologies Pvt. Ltd](https://www.tekdi.net)., Pune

Contact :  <sales@tekditechnologies.com> , +91 93378 29925


# Experience Saral

Saral allows quick and reliable capture of information from physical formats to structured, digital formats using mobile devices.

1\) Saral is a mobile application and can be download from Play Store (Saral-App). Alternatively User can download the App from the below mentioned link.

{% embed url="<https://drive.google.com/file/d/1vQVH5QRvkUqzeClcmb1d-Fw2iOf0kn36/view?usp=sharing>" %}

2\) Saral uses pre-defined template Layouts for scanning. Such templates should be available with user. User can find the supported sample mark-sheet/assessment template layouts attached below. User is advised to take print outs of the same. Avoid using photocopies as unclear photocopies are prone to error while scanning.

{% file src="/files/Lg4lu9hBCIPDtZyf9EQd" %}
Saral Assessment-Sheet Layout
{% endfile %}

{% file src="/files/MHTyVsz8spYc57XnxkGw" %}
Saral Attendance-Sheet Layout
{% endfile %}

Alternatively, latest published versions of all layouts will be available at below mentioned location.

{% embed url="<https://github.com/Sunbird-Saral/Project-Saral/tree/v1-develop/docs/layout-design/Design>" %}

Also layout specification and configuration as well as design guidelines for ROI can be found [here](https://saral.sunbird.org/learn/specifications/layout-specification) and [here](https://saral.sunbird.org/use/layout-configuration) and [here](https://saral.sunbird.org/use/layout-design-guidelines).

3\) Once user is ready with above mobile application and properly filled print outs, user is ready to convert their physical data into structured digital data.

Saral has capability to support multiple OCR and OMR based forms digitisation. Below is the workflow guide for Assessments. Similar guide for Admission forms can be found [here](https://saral.sunbird.org/learn/features/capture-admissions-record).

* Open Saral App on your mobile device and login to Saral Mobile App with the below Credentials

&#x20;       Username: u002

&#x20;       Password: tarento\@123

* Select option Assessments
* On the next page, select the following and click on Submit
  * Class - 2
  * Section - D
  * Subject - Hindi
  * Paper Set - B
* User will see list of students and an option to make attendance for each student. Mark attendance and click on Next to see Summary page before actual scan starts.
* Start scanning all your assessment sheets.
* You can verify your scan sheets and edit them if required before submitting all your data.
* Click on Submit to complete the process.

4\) Once data is submitted, it is digitised into structured format and saved into back-end database. User can view structured digital data by connecting to database using below mentioned details.

* Download and install MongoDB Compass using details mentioned [here](https://www.mongodb.com/docs/compass/current/install/).&#x20;
* Connect to MongoDB database using URL  ¨mongodb://3.110.36.135:27017¨
* Once connected, user can view digitised data

User can refer [here](https://saral.sunbird.org/learn/videos/feature-explanation) to know more about Saral features

User can refer here for Saral app [usage guidelines](https://saral.sunbird.org/use/saral-app-usage-guidelines).


# Dev Environment - Installation & Maintenance


# Saral Installation Guide (Non-Prod)

Saral allows quick and reliable capture of information from physical formats to structured, digital formats.

Using Saral results in extensive savings in terms of time and effort, when information from physical sources (such as paper) needs to be digitised and stored in a structured manner for analysis.

## Prerequisites

1\) Since, backend infra for Saral is hosted on AWS, user Must have a valid AWS account.

2\) Saral is a mobile application and its APK can be generated from source code. Process for the same can be found [here](https://saral.sunbird.org/use/generating-apk-from-source-code). Provision has been made such that adopters can create their own configurations for Saral application. Refer [here](https://saral.sunbird.org/use/update-base_url-apkurl-in-apk) and [here](https://saral.sunbird.org/use/generate-aab-app-bundle-from-source-code) to know about detail guide for the same.&#x20;

User can publish their own configured saral app on Google play sore. Please refer [here](https://saral.sunbird.org/use/google-play-store-app-publish-recommendations) to know process to set it up.

Saral provides facility to pull varied analytical reports using Firebase Application. Please refer [here](https://saral.sunbird.org/use/firebase-setup-for-tflite-model-deployment) to know process to set Firebase account and configure it. Once Firebase account has been setup, refer [here](https://saral.sunbird.org/use/firebase-setup-for-saral-app-telemetry) to konw how to update it in source code. Please note, mobile APK needs to be rebuild for changes to get reflected.

3\) Saral app supports pre-configured template layouts. User is advised to take print outs of the same for their use. Current application version supports Assessment and layout for the same can be found attached below.&#x20;

{% file src="/files/AOSnkmHzJKt2tklyoV0i" %}
Saral Assessment-Sheet Layout
{% endfile %}

Latest published versions of all layouts will be available at below mentioned location.

{% embed url="<https://github.com/Sunbird-Saral/Project-Saral/tree/v1-develop/docs/layout-design/Design>" %}

Along with template files, ROI Json file are available at below location.

{% embed url="<https://github.com/Sunbird-Saral/Project-Saral/tree/v1-develop/v1.0/backend/data/layout>" %}

All layouts are configurable. Please refer [here](https://saral.sunbird.org/use/layout-configuration) to configure your own layout and create corresponding ROI file for it.

4\) Download and install MongoDB and Mongo Compass for your OS (Windows, mac, Linux) from below link&#x20;

{% embed url="<https://www.mongodb.com/docs/compass/current/install/>" %}
Download and Install Compass
{% endembed %}

```
# To Import the public key used by the package management system run 
sudo apt-get install gnupg curl

# To import the MongoDB public GPG key from https://www.mongodb.org/static/pgp/server-7.0.asc, run the following command
curl -fsSL https://www.mongodb.org/static/pgp/server-7.0.asc | \
   sudo gpg -o /usr/share/keyrings/mongodb-server-7.0.gpg \
   --dearmor
   
# To Create a list file for MongoDB run  
sudo touch /etc/apt/sources.list.d/mongodb-org-7.0.list

# To add Mongo Repo to package manager run 
echo "deb [ arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-7.0.gpg ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/7.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-7.0.list

# To Reload local package database run
sudo apt-get update

#To Install the MongoDB packages run
sudo apt-get install -y mongodb-org
```

5\) Saral user docker for containerisation and hence, to Install docker on Ubuntu Linux use below details

```
# To Update the package index run
sudo apt update

# To Install prerequisites for Docker run
sudo apt install -y apt-transport-https ca-certificates curl software-properties-common

# To Add Docker GPG key run
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

# To Add Docker repository run
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# To Update the package index again (with Docker repository) run
sudo apt update

# To Install Docker run
sudo apt install -y docker-ce docker-ce-cli containerd.io

# To Add the current user to the docker group (to run Docker commands without sudo) run
sudo usermod -aG docker $USER

# To Install Docker Compose run
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

# To Print Docker and Docker Compose versions run
docker --version
docker-compose --version
```

6\) Create a docker-compose.yml file and paste below code snippet in it. Please make sure to replace your MongoDB instance IP in the below code snippet.

<pre><code>version: '2.4'
services:
  sandbox:
    image: jonathanrogers/saral-backend:v1.7.0
    container_name: sandbox
    environment:
      - PROFILE=dev
      - PORT=3005
      - MONGODB_URL=mongodb://&#x3C;Insert your actual Mongo DB IP here>:27017/saralv1newdb
      - JWT_SECRET=SARALDATA_NODE
<strong>      - MONGODB_POOL_SIZE=50
</strong>      - MIN_MONGODB_POOL_SIZE=30
      - WHITELIST_DOMAINS=&#x3C;add your domain/subdomain name here(eg: https://your-domain-name.com)>

    ports:
      - "3005:3005"
</code></pre>

To execute docker compose file, please execute below mention command in your VM terminal

[**`sudo docker compose up -d`**](#user-content-fn-1)[^1]

7\) Use NGINX to setup Domain Name and SSL Certificate. Refer [here](https://docs.google.com/document/d/1Rz2nhyc_8oy56fwVHTO18ZbBT2Tss-ii8SbvqeNFiEY/edit?usp=sharing) for installation guide.

8\) Postman Collections

{% file src="/files/Z4Yt9vtfertmnPCKJbZl" %}
Postman Collections
{% endfile %}

9\) Cloud Infra provisioning requirement and costing

Please refer [here](https://docs.google.com/spreadsheets/d/1IrQqBEMG_phASHvORvkQ8qRl30hndvj4yBsDCl6eoho/edit?usp=sharing) for minimum infra required to be provisioned for Saral sand box and the monthly costing associated with it.

Please note, there is need to whitelist server IP/domain for application to work. Please refer [here](https://docs.google.com/document/d/1pLTSwwak-u9CGl1IMyFbeFmgHH69kG_e/edit#heading=h.3znysh7) to understand steps for the whitelisting

Once all above steps are completed, Saral will be ready to use.

Refer [here](https://saral.sunbird.org/saral-implementation-manual)[ ](https://saral.sunbird.org/step-by-step-guide-to-use-saral)to know more about implementation details of Saral.

Refer [here](https://saral.sunbird.org/step-by-step-guide-to-use-saral) to know about user User Experience of Saral.

[^1]:


# Saral - Sandbox Maintenance Guide (Non-Prod)

Purpose -&#x20;

This guide is created to help teams to maintain sandbox in ready to use clean condition for the demo purposes.

1. Mongo DB collections clean up

During Demo large amount of sample data will be created which is no use post demo and to other demo users. Hence, it becomes necessary to clean such test data.  This is 2 step process where in first step current data will be deleted and in next step, fresh test data will be loaded for demo purposes. Please use below commands in sequence for clean up of data.

1. &#x20;To delete any old data from database run the following command in the VM where the sandbox app is installed. Execute below command in the terminal of your VM where docker is installed.

```
docker exec sandbox node ./data/import-data.js --delete
```

2. &#x20;To add golden data to the database run the following command in the VM where the sandbox app is installed. Execute below command in the terminal of your VM where docker is installed.

```
docker exec sandbox node ./data/import-data.js --import
```

2. Logging and Monitoring

Saral application stack has been enabled with logging and monitoring. Click [here](https://tekdi-docs.netlify.app/docs/learning/grafana/) for details on installation and setup guide

3. Click [here](https://docs.google.com/document/d/1T0x8RWGHxG578rytLDTivA1bducZYwUTl_VYwYLmLcs/edit#heading=h.q7kutkgpepnj) for troubleshooting guide on Docker and Docker Compose. This will also lists steps to check connection issue between Mongo DB and Backend Service.


# Saral Easy Installer

Easy installer is built using the following technologies:-

1> Terraform&#x20;

2> Helm

#### Reference architecture

Required AWS services to operate core Saral services :

* Amazon VPC
* Amazon Document DB
* Amazon Elastic Kubernetes Service (Amazon EKS)
* AWS Fargate
* Application Load Balancing (ALB)


# Saral Production-Environment User Installation Guide

Saral allows quick and reliable capture of information from physical formats to structured, digital formats.

Using Saral results in extensive savings in terms of time and effort, when information from physical sources (such as paper) needs to be digitised and stored in a structured manner for analysis.

## Prerequisites

1\) Since, backend infra for Saral is hosted on AWS, user Must have a valid AWS account.

2\) Saral is a mobile application and its APK can be generated from source code. Process for the same can be found [here](https://saral.sunbird.org/use/generating-apk-from-source-code). Provision has been made such that adopters can create their own configurations for Saral application. Refer [here](https://saral.sunbird.org/use/update-base_url-apkurl-in-apk) and [here](https://saral.sunbird.org/use/generate-aab-app-bundle-from-source-code) to know about detail guide for the same.&#x20;

User can publish their own configured saral app on Google play sore. Please refer [here](https://saral.sunbird.org/use/google-play-store-app-publish-recommendations) to know process to set it up.

Saral provides facility to pull varied analytical reports using Firebase Application. Please refer [here](https://saral.sunbird.org/use/firebase-setup-for-tflite-model-deployment) to know process to set Firebase account and configure it. Once Firebase account has been setup, refer [here](https://saral.sunbird.org/use/firebase-setup-for-saral-app-telemetry) to konw how to update it in source code. Please note, mobile APK needs to be rebuild for changes to get reflected.

3\) Saral app supports pre-configured template layouts. User is advised to take print outs of the same for their use. Current application version supports Assessment and layout for the same can be found attached below.&#x20;

{% file src="/files/AOSnkmHzJKt2tklyoV0i" %}
Saral Assessment-Sheet Layout
{% endfile %}

Latest published versions of all layouts will be available at below mentioned location.

{% embed url="<https://github.com/Sunbird-Saral/Project-Saral/tree/v1-develop/docs/layout-design/Design>" %}

Along with template files, ROI Json file are available at below location.

{% embed url="<https://github.com/Sunbird-Saral/Project-Saral/tree/v1-develop/v1.0/backend/data/layout>" %}

All layouts are configurable. Please refer [here](https://saral.sunbird.org/use/layout-configuration) to configure your own layout and create corresponding ROI file for it.

4\) Download and install MongoDB and Mongo Compass for your OS (Windows, mac, Linux) from below link&#x20;

{% embed url="<https://www.mongodb.com/docs/compass/current/install/>" %}
Download and Install Compass
{% endembed %}

```
# To Import the public key used by the package management system run 
sudo apt-get install gnupg curl

# To import the MongoDB public GPG key from https://www.mongodb.org/static/pgp/server-7.0.asc, run the following command
curl -fsSL https://www.mongodb.org/static/pgp/server-7.0.asc | \
   sudo gpg -o /usr/share/keyrings/mongodb-server-7.0.gpg \
   --dearmor
   
# To Create a list file for MongoDB run  
sudo touch /etc/apt/sources.list.d/mongodb-org-7.0.list

# To add Mongo Repo to package manager run 
echo "deb [ arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-7.0.gpg ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/7.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-7.0.list

# To Reload local package database run
sudo apt-get update

#To Install the MongoDB packages run
sudo apt-get install -y mongodb-org
```

5\) Postman Collections

{% file src="/files/Z4Yt9vtfertmnPCKJbZl" %}
Postman Collections
{% endfile %}

6\) Cloud Infra provisioning requirement and costing

Please refer [here](https://saral.sunbird.org/saral-easy-installer/reference-documents/saral-infra-requirements-and-associated-cost) for minimum infra required to be provisioned for Saral Dev environment and the monthly costing associated with it.

Please refer [here](https://saral.sunbird.org/saral-easy-installer/reference-documents/saral-infra-cost-benefit-analysis) to understand different combination of Infra that can be provisioned for Saral and its usage scenario details along with the cost associated with it. This will help user to choose which infra is suitable as per need.

Please note, there is need to whitelist server IP/domain for application to work. Please refer [here](https://docs.google.com/document/d/1pLTSwwak-u9CGl1IMyFbeFmgHH69kG_e/edit#heading=h.3znysh7) to understand steps for the whitelisting

Once all above steps are completed, Saral will be ready to use.

Refer [here](https://saral.sunbird.org/saral-implementation-manual)[ ](https://saral.sunbird.org/step-by-step-guide-to-use-saral)to know more about implementation details of Saral.

Refer [here](https://saral.sunbird.org/step-by-step-guide-to-use-saral) to know about user User Experience of Saral.


# Manual Installation for Prod

Prerequisites

1>  AWS IAM account with administrator access

2> Ubuntu 20.04LTS on Local Machine

3> Download the following zip file and extract to folder

{% file src="/files/zs2qNJHFxlMTq0NfqQCn" %}

Open the location of the above folder in terminal&#x20;

&#x20;And in the open terminal window execute the commands one by one in the "Saral-Prod-manual-install-steps.txt" file  to provision the EKS Infra required to install Saral

In the same  terminal  run the following commands to install the Saral application on the EKS cluster

`kubectl apply -f saral_backend_EKS.yml`

Go to the Certificate manager in the AWS console&#x20;

And generate a SSL certificate for the domain/subdomain  to be used with the saral app

Once the certificate is generated and the status shows as issued copy the arn of the certificate and find the file "ing.yml" in the folder and update and save the value for the certificate arn in it. &#x20;

Run the following command to activate the load balancer and the ingress object

`kubectl apply -f ing.yml`

Once the above commands are run wait 10-15 minutes for the Load balancer and ingress object to be provisioned

then run&#x20;

`kubectl get ing`&#x20;

From the output of the above command find the value under the address column and copy it,  use it to map to domain/subdomain  using the CNAME option in your DNS manger.


# Automating the Infra provisioning and install of the Saral application

Overview

Sunbird Saral attempts to create a connection between the information that exists in the physical world and ties it to digital structured information.

Saral literally means simplicity, has been conceptualized to enable users to create structured digital information using mobile devices. The process is also called Saralify or Phygitization. Saral should be viewed as an OCR-plus application that is capable of doing OCR and can also understand the structure of the physical input.

Saral v1.x works as an edge location solution to phygitize data on physical layout printed sheets and upload the data to the backend. This backend data will be then pushed to [`CQube`](https://cqube.sunbird.org) (Analytics system) for insights and take actions accordingly.

[`Saral SDK`](https://saral.sunbird.org/engage/saral-sdk-source-code-repository) is the core Phygitization component interfaced with [`Saral Layout Specification`](https://saral.sunbird.org/learn/specifications/layout-specification). Saral v1.x App is a reference Android App built on [`Saral SDK`](https://saral.sunbird.org/engage/saral-sdk-source-code-repository)

[`Saral SDK`](https://saral.sunbird.org/engage/saral-sdk-source-code-repository) can be used to build custom Android applications with OCR capabilities(OMR, Handwritten Digit recognition)`. Refer` [Application Architecture](https://saral.sunbird.org/learn/saral-app-architecture) for more details about [`Saral SDK`](https://saral.sunbird.org/engage/saral-sdk-source-code-repository)


# Prerequisites

**Requirements**

Before you start, ensure you have the following:

* An AWS IAM account with administrator access.
* Ubuntu 20.04 LTS installed on your local machine.
* SSL certificate generated for your domain/subdomain

```
     To generate certificate from AWS
              1> Go to Certificate manager in AWS web console
              2> On top left hand side click on list certificates
              3> Once open on the top right side click on Request
              4> Click next
              5> Type the FQDN(fully qualified domain/subdomain name eg:   abcd.domain.com)
              6> Click request
              7> Click on refresh button
              8> You should see the newely requested certificate.
              9> Click on the certificate ID
              10> Under Domain you should see the generated CNAME records
              11> Add these CNAME records to your domain manager.
              12> Once CNAME records are entered in Domain manager it should take between 1-3 hours to generate the certificates
              13> Once generated the status should show in green issued
              14> Click on certificate ID once more
              15> Find and copy the Certificate ARN
```

* AWS CLI installed on your machine.
* To install follow the below steps

```
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/instal
```

#### &#x20;**Verify AWS CLI Installation**

1. Run the following command to check if AWS CLI is installed properly.

   ```bash
   aws --version
   ```

   You should see the version of AWS CLI installed.
2. **Configure AWS CLI**

   Use the AWS configure command to set up your credentials.

   ```bash
   aws configure
   ```

   Enter your AWS Access Key ID, Secret Access Key, region, and output format when prompted.
3. **Install terraform**

```shell-session
 sudo apt-get update && sudo apt-get install -y gnupg software-properties-common
```

Install the HashiCorp [GPG key](https://apt.releases.hashicorp.com/gpg)

```shell-session
wget -O- https://apt.releases.hashicorp.com/gpg | \
gpg --dearmor | \
sudo tee /usr/share/keyrings/hashicorp-archive-keyring.gpg > /dev/null
```

Verify the key's fingerprint.

```shell-session
 gpg --no-default-keyring \
--keyring /usr/share/keyrings/hashicorp-archive-keyring.gpg \
--fingerprint
```

```shell-session
echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] \
https://apt.releases.hashicorp.com $(lsb_release -cs) main" | \
sudo tee /etc/apt/sources.list.d/hashicorp.list
```

Download the package information from HashiCorp.

```shell-session
 sudo apt update
```

Install Terraform from the new repository.

```shell-session
 sudo apt-get install terraform
```

### Verify the installation <a href="#verify-the-installation" id="verify-the-installation"></a>

Verify that the installation worked by opening a new terminal session and listing Terraform's available subcommands.

```shell-session
 terraform -help
```

Add any subcommand to `terraform -help` to learn more about what it does and available options.

```shell-session
 terraform -help plan
```


# What automation does

You should have the entire Saral Infra setup on you AWS account Infra structure Which Includes the following components

<table data-full-width="true"><thead><tr><th width="64">Sr No</th><th>Name of Resource  Provisioned</th></tr></thead><tbody><tr><td>1</td><td><p> EKS cluster with fargate Nodes</p><p></p></td></tr><tr><td>2</td><td> VPC</td></tr><tr><td>3</td><td>Subnets (2-Private and 2-Public subnet for EKS cluster 2-Private subnets for Document DB)</td></tr><tr><td>4</td><td>Application load balancer controller</td></tr><tr><td>5</td><td>NAT gateway</td></tr><tr><td>6</td><td>Elastic IP</td></tr><tr><td>7</td><td>AWS document DB</td></tr></tbody></table>

The following is the reference architecture of the Infra provisioned by the installer

<figure><img src="/files/FDqv3bFMSSW5FWLjEbrs" alt=""><figcaption><p>Saral AWS reference Architecture</p></figcaption></figure>


# Run installer

Automating the Infra provisioning and install of the Saral application

Download and extract from the following file

{% file src="/files/rbbFCJzGXEzyYq1h2paA" %}

or go to following github link to download the folder

```
https://github.com/Sunbird-Saral/devops
```

Open the extracted folder in terminal and type the following commands

```
cd Saral-Automation
```

```
ls
```

You should see a file with the name

```
install-saral.sh
```

Run the following commands to make the file executable

```
chmod +x install-saral.sh
```

To execute the file type the following command

```
./install-saral.sh
```

```
Choose option "1. AWS"
```

You will be prompted to enter the AWS Document DB **Username** and **Password**

enter the details and also save those with you

Once the entire process is run on the same terminal window you should see outputs of the "**Document db host-name"** copy and keep it.

<br>


# Post install steps

Once the entire Infrastructure is setup

We need to update the application with the **"document db hostname", "username", "password" and the "ssl certificate arn".**

1. Go to the following folder "Saral-Automation/Saral-EKS/helm/saral-backend-chart/"
2. Fill the value.yml file with the following details

```
a. under docdb->connections-> fill documentdb username, documentdb password, documentdb hostname
b. under whitelist->domain-> fill in your domain/subdomain 
c. under ingress->certificateARN-> fill the certificate arn that you will get from AWS certificate manager
```

Once you have updated the values in the `value.yml` file, use the following command to deploy the chart

Open the helm folder in a terminal window and run the following

Below command will deploy the application to your Kubernetes cluster using the values you have specified in the values.yml file

```
helm install saral-backend ./saral-backend-chart
```

Verify the deployment by checking the status of the pods.

```
kubectl get pods
```

You should see the pods associated with your deployment running successfully

To uninstall the `saral-backend` deployment using Helm, execute the following command

```
helm uninstall saral-backend
```


# Monitoring-Stack

To install Monitoring Stack to the EKS server ie install Prometheus and Grafana Follow

1>  Rerun the following file located in the "Saral-Automation" folder previously downloaded from&#x20;

<https://saral.sunbird.org/saral-easy-installer/saral-production-user-installation-guide/automating-the-infra-provisioning-and-install-of-the-saral-application>

```
./install-saral.sh
```

And select the option "4. AWS-Monitoring\_Stack"  on screen this will install the monitoring stack on the Saral EKS cluster.


# Reference Documents

This page will provide links to the reference documents used throughtout the Saral documentation.


# SARAL Infra Requirements & Associated Cost

**Dev Infrastructure:**

<table><thead><tr><th width="73">No</th><th width="510">Resource Name</th><th width="284">What it hosts</th><th width="119">Environment</th><th>Resource Type</th><th width="301">Configuration</th><th width="191">Monthly Cost in USD</th><th>Usage Scenario</th></tr></thead><tbody><tr><td>1</td><td>Saral-Sandbox-Instance</td><td>Backend (Saral Node application)</td><td>Sandbox</td><td>EC2 Instance</td><td>Instance Type<br>t3a.medium | Family: t3a |<br>2 vCPU | 2 GiB Memory<br>Storage GP3: 30GB"</td><td>$20.70</td><td></td></tr><tr><td>2</td><td>Saral-Sandbox-DB-Instance</td><td>Mongo DB</td><td>Sandbox</td><td>EC2 Instance</td><td>Instance Type<br>t3a.medium | Family: t3a |<br>2 vCPU | 2 GiB Memory<br>Storage GP3: 30GB"</td><td>$20.70</td><td></td></tr><tr><td>3</td><td>Saral-Sandbox-Elastic IP for DB-Instance and Sandbox-Instance</td><td>Elastic IP</td><td>Sandbox</td><td>Public static IP</td><td></td><td>$7.20</td><td></td></tr></tbody></table>

**Production Infrastructure:**

<table><thead><tr><th width="68">No</th><th width="171">Resource Name</th><th width="140">What it hosts</th><th width="135">Environment</th><th width="120">Resource</th><th width="147">Configuration</th><th width="182">Monthly Cost in USD</th><th width="382">Usage Scenario</th><th data-hidden></th></tr></thead><tbody><tr><td>1</td><td>Amazon EKS</td><td>EKS Controle Plane</td><td>Production</td><td>EKS Cluster</td><td>NA</td><td>$73.00</td><td></td><td></td></tr><tr><td>2</td><td>AWS Fargate Nodes</td><td>Backend (Saral Node application)</td><td>Production</td><td>Fargate nodes</td><td>6</td><td>$56.79</td><td>3,000 Users (with peak concurrency of 500-1000 users) can Successfully Login and Submit the Marksheet for 4,50,000 Students at a 1500 students save per second. Test Duration 5 Minutes with average response time of 10-20 Seconds with 100% Success rate</td><td></td></tr><tr><td>3</td><td>Network Address Translation (NAT) Gateway</td><td>Elastic IP</td><td>Production</td><td>NAT gateway</td><td>1</td><td>$41.72</td><td></td><td></td></tr><tr><td>4</td><td>Application Load Balancer</td><td>Load balancer</td><td>Production</td><td>Load balancer</td><td>1</td><td>$29.13</td><td></td><td></td></tr><tr><td>5</td><td>Amazon DocumentDB (with MongoDB compatibility)</td><td>Mongo DB</td><td>Production</td><td>Database</td><td>1</td><td>$235.45</td><td></td><td></td></tr></tbody></table>


# Saral Infra Cost Benefit Analysis

|    | A                      |   | B                                 | C                     | D                                                                                                                                                                                                                                                                         | E       | F                                                                                         | G                | H                                                           | I      | J                                                                                                                                                                                                                                                          | K                                              | L                                                                                                        | M       | N                                         | O                                              | P                        | Q      | R                                         | S                                              | T      | U       | V                                         | W                                                                                                                                    | X                                      | Y      | Z |   |
| -- | ---------------------- | - | --------------------------------- | --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------- | ----------------------------------------------------------------------------------------- | ---------------- | ----------------------------------------------------------- | ------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------- | -------------------------------------------------------------------------------------------------------- | ------- | ----------------------------------------- | ---------------------------------------------- | ------------------------ | ------ | ----------------------------------------- | ---------------------------------------------- | ------ | ------- | ----------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------ | -------------------------------------- | ------ | - | - |
| 1  | What                   |   | Why                               | Current               | Option 1 - Sprint 1 Delivery                                                                                                                                                                                                                                              |         | Option 2 - Sprint 2 Delivery (Unlimited Usage)                                            |                  | Option 3 - Sprint 3 Delivery (Limited Usage)                |        | Option 4 - Sprint 3 Delivery (Specific Usage) (UP pilot)                                                                                                                                                                                                   |                                                | Option 5 - Sprint 3 Delivery (Specific Usage)                                                            |         |                                           |                                                |                          |        |                                           |                                                |        |         |                                           |                                                                                                                                      |                                        |        |   |   |
| 2  |                        |   |                                   | Choice                | Sizing                                                                                                                                                                                                                                                                    | Cost    | Choice                                                                                    | Sizing           | Cost                                                        |        | Choice                                                                                                                                                                                                                                                     | Sizing                                         | Cost                                                                                                     |         | Choice                                    | Sizing                                         | Cost                     |        | Choice                                    | Sizing                                         | Cost   |         | Choice                                    | Sizing                                                                                                                               | Cost                                   |        |   |   |
|    |                        |   |                                   |                       |                                                                                                                                                                                                                                                                           |         |                                                                                           |                  |                                                             |        |                                                                                                                                                                                                                                                            |                                                |                                                                                                          |         |                                           |                                                |                          |        |                                           |                                                |        |         |                                           |                                                                                                                                      |                                        |        |   |   |
| 3  | Environment            |   |                                   | Production (UP Pilot) | Sandbox                                                                                                                                                                                                                                                                   |         | Production                                                                                |                  | Production                                                  |        | Production                                                                                                                                                                                                                                                 |                                                | Production                                                                                               |         |                                           |                                                |                          |        |                                           |                                                |        |         |                                           |                                                                                                                                      |                                        |        |   |   |
| 4  | CI/CD                  |   | Deployment Pipeline               | Jenkins               | T2 Large (2 CPU, 8Mem,50 Disk) X1                                                                                                                                                                                                                                         | $77.00  | Saral Sandbox Instance                                                                    | <p>t3a.Medium    |  Family: t3a<br>2vCPU 8 GiB Memory<br>Storage GP3: 30GB</p> | $20.70 |                                                                                                                                                                                                                                                            | NA                                             |                                                                                                          |         |                                           | NA                                             |                          |        |                                           | NA                                             |        |         |                                           | NA                                                                                                                                   |                                        |        |   |   |
| 5  | Monitoring & Logging   |   | Cloud Health Monitoring & Logging | Jenkins               | Same as above                                                                                                                                                                                                                                                             | $0.00   | NA                                                                                        |                  |                                                             |        | NA                                                                                                                                                                                                                                                         |                                                |                                                                                                          |         | NA                                        |                                                |                          |        | NA                                        |                                                |        |         | NA                                        |                                                                                                                                      |                                        |        |   |   |
| 6  | Orchestration          |   |                                   | EKS(Managed service)  |                                                                                                                                                                                                                                                                           | $73.00  | NA                                                                                        |                  |                                                             |        | AWS Fargate                                                                                                                                                                                                                                                | 6                                              | $56.79                                                                                                   |         | AWS Fargate                               | 6                                              | $56.79                   |        | AWS Fargate                               | 6                                              | $56.79 |         | AWS Fargate                               | 6                                                                                                                                    | $56.79                                 |        |   |   |
| 7  | Database               |   | Storage of Digitized Data         | MongoDB standalone    | m5a.xlarge (4CPU,16mem, 100GB)X1                                                                                                                                                                                                                                          | $90.00  | Document -DB                                                                              | <p>t3a.Medium    |  Family: t3a<br>2vCPU 8 GiB Memory<br>Storage GP3: 30GB</p> | $20.70 |                                                                                                                                                                                                                                                            | Amazon DocumentDB (with MongoDB compatibility) | 1                                                                                                        | $235.45 |                                           | Amazon DocumentDB (with MongoDB compatibility) | 1 instance(db.t3.medium) | $82.49 |                                           | Amazon DocumentDB (with MongoDB compatibility) | 1      | $235.45 |                                           | <p>Ec2 instance with Mongodb ( Compute Savings Plans<br>automatically applies to all usage on EC2<br>Reservation term<br>1 year)</p> | <p>1 (m5a.xlarge)<br>storage:100gb</p> | $68.98 |   |   |
| 8  | Compute                |   | For node service                  | EKS nodes             | M4.large (2 CPU, 8Mem, 50 Disk) X2                                                                                                                                                                                                                                        | $162.00 | NA                                                                                        |                  |                                                             |        | Amazon EKS                                                                                                                                                                                                                                                 | 1                                              | $73.00                                                                                                   |         | Amazon EKS                                | 1                                              | $73.00                   |        | Amazon EKS                                | 1                                              | $73.00 |         | Amazon EKS                                | 1                                                                                                                                    | $73.00                                 |        |   |   |
| 9  | Network Infrastructure |   |                                   |                       | <p>Virtual Private Cloud Cost<br>2xNAT Gateway for Public Subnet with 100GB of data transfer = $92.96<br>Inbound Data Transfer = 1 TB = $0<br>Outbound Internet Data Transfer = 100GB = $12.93<br>Intra Region Data Transfer (Across Availability Zones) = 100GB = $2</p> | $106.00 | NA                                                                                        |                  |                                                             |        | Network Address Translation (NAT) Gateway                                                                                                                                                                                                                  | 1                                              | $41.72                                                                                                   |         | Network Address Translation (NAT) Gateway | 1                                              | $41.72                   |        | Network Address Translation (NAT) Gateway | 1                                              | $41.72 |         | Network Address Translation (NAT) Gateway | 1                                                                                                                                    | $41.72                                 |        |   |   |
| 10 | App Load Balancer      |   | Balancing incoming traffic        |                       |                                                                                                                                                                                                                                                                           | $17.45  | NA                                                                                        |                  |                                                             |        | Application Load Balancer                                                                                                                                                                                                                                  | 1                                              | $29.13                                                                                                   |         | Application Load Balancer                 | 1                                              | $29.13                   |        | Application Load Balancer                 | 1                                              | $29.13 |         | Application Load Balancer                 | 1                                                                                                                                    | $29.13                                 |        |   |   |
| 11 | IP                     |   | for Assigning static IP           |                       |                                                                                                                                                                                                                                                                           |         | Elastic IP                                                                                | Public Static IP | $7.20                                                       |        |                                                                                                                                                                                                                                                            |                                                |                                                                                                          |         |                                           |                                                |                          |        |                                           |                                                |        |         |                                           |                                                                                                                                      |                                        |        |   |   |
| 12 | Total Cost per month   |   |                                   |                       |                                                                                                                                                                                                                                                                           | $525    |                                                                                           |                  | $49                                                         |        | Total                                                                                                                                                                                                                                                      |                                                | $436                                                                                                     |         | Total                                     |                                                | $283                     |        | Total                                     |                                                | $436   |         | Total                                     |                                                                                                                                      | $270                                   |        |   |   |
| 13 | Time to Market         |   |                                   | Ready Right now       | Ready Right now                                                                                                                                                                                                                                                           |         | Ready Right now                                                                           |                  | Ready Right now                                             |        | Ready Right now                                                                                                                                                                                                                                            |                                                | Ready Right now                                                                                          |         |                                           |                                                |                          |        |                                           |                                                |        |         |                                           |                                                                                                                                      |                                        |        |   |   |
| 14 | Ease for Adopter       |   |                                   | Very Low              | High (3 Hours)                                                                                                                                                                                                                                                            |         | High (3 Hours)                                                                            |                  | High (3 Hours)                                              |        | Low                                                                                                                                                                                                                                                        |                                                | High (3 Hours)                                                                                           |         |                                           |                                                |                          |        |                                           |                                                |        |         |                                           |                                                                                                                                      |                                        |        |   |   |
| 15 | Usage Scenario         |   |                                   |                       | This Infra is for Sandbox (Dev) purpose and will work seemlessly for demo/test purpose                                                                                                                                                                                    |         | This infra will be highly scalable and will be able to scale deending upon incoming load. |                  |                                                             |        | 3,000 Users (with peak concurrency of 500-1000 users) can Successfully Login and Submit the Marksheet for 4,50,000 Students at a 1500 students save per second. Test Duration 5 Minutes with average response time of 10-20 Seconds with 100% Success rate |                                                | This infra will work without Document DB and single instance of MongoDB. MongoDB will be scaled manually |         |                                           |                                                |                          |        |                                           |                                                |        |         |                                           |                                                                                                                                      |                                        |        |   |   |


# Tool for Saral Easy Layout generation and Auto generate ROI json

A tool has been developed to simplify the creation of new forms and automatically generate ROI JSON compatible with the Saral application. This tool aims to expedite the adaptation of new forms by Saral with minimal or no need for development time.

* Read More about tool and its usage [click here](https://github.com/Sunbird-Saral/Saral-Layout-Generator)
* To try out the tool [click here](http://saral-template.sunbird.org.in/webapp/)


