Carmel Linx is a lightweight, high-performance, and mobile-friendly Outcome-Based Education (OBE) Exam Management System built for Carmel Polytechnic. The entire system operates directly inside your college's Google Workspace (Google Drive & Google Sheets), ensuring 100% data ownership and zero external database costs.
To verify the styling, user roles, exam engine, tab-monitoring, and reports locally on your machine before uploading to Google Drive:
- Open your Terminal (PowerShell or Command Prompt) in this directory:
cd "c:\Users\fotonlabz\Desktop\Test Portal"
- Install Node.js Dependencies:
npm install
- Start the Local Server:
npm start
- Open in Browser: Navigate to http://localhost:3000
The local database (db_mock.json) is pre-populated with active accounts:
- Super Admin: Mobile
9000000001| Password:admin123 - Principal: Mobile
9000000002| Password:principal123 - ECE HOD: Mobile
9845000001| Password:password123 - Faculty (Lecturer/Demo): Mobile
9845000002| Password:password123 - Tutor / Mentor: Mobile
9845000004| Password:password123 - Students (ECE Semester 3):
REG24EC01| Password:password123(Amal Raj)REG24EC02| Password:password123(Diya Elizabeth)
Once you are satisfied with the local preview, follow these steps to make it live for the entire college.
Create a new Google Spreadsheet in your college Google Drive. Create the following 9 tabs (sheets) and paste the exact headers in row 1:
Students- Headers:
Reg_No|Adm_No|Name|Email|Password|Branch|Year_Of_Admission|Semester|Photo_Drive_Link|Classroom_ID|Status
- Headers:
Staff_Profiles- Headers:
Mobile_No|Name|Email|Branch|Designation|Password|Photo_Drive_Link|Account_Status
- Headers:
Class_Management- Headers:
Classroom_ID|Branch|Batch_Year|Tutor_Mobile_No|Mentor_Mobile_No
- Headers:
Subject_Faculty_Mapping- Headers:
Mapping_ID|Classroom_ID|Subject_Code|Subject_Name|Faculty_Mobile_No
- Headers:
Question_Bank- Headers:
Subject_Code|Question_ID|Type|Question_Text|Options|Correct_Answer|CO_Tag
- Headers:
Test_Config- Headers:
Test_ID|Subject_Code|Classroom_ID|Test_Name|Start_Time|End_Time|Duration|Selected_COs|MCQ_Count|Descriptive_Count|Target_Percentage|Pass_Threshold|Is_Active
- Headers:
Test_Logs- Headers:
Log_ID|Reg_No|Test_ID|Action|Timestamp|Details
- Headers:
Student_Responses- Headers:
Response_ID|Reg_No|Test_ID|Question_ID|Selected_Option|Descriptive_Text|Marks_Obtained|Evaluated_By|Status
- Headers:
Series_Test_Marks- Headers:
Mark_ID|Reg_No|Classroom_ID|Subject_Code|Series_Exam_Name|CO_Tag|Max_Marks|Marks_Obtained|Entered_By|Timestamp
- Headers:
- In your Google Spreadsheet, click Extensions -> Apps Script.
- Remove any default code in
Code.gs.
Create matching files in the Google Apps Script sidebar:
- Create script files (
.gs) and copy contents:Code.gs(fromCode.gs)Auth.gs(fromAuth.gs)DataService.gs(fromDataService.gs)AIEvaluator.gs(fromAIEvaluator.gs)Report.gs(fromReport.gs)
- Create HTML files (
.html) and copy contents:Common_CSS.html(fromCommon_CSS.html)Login.html(fromLogin.html)Student_Exam.html(fromStudent_Exam.html)Faculty_Dashboard.html(fromFaculty_Dashboard.html)HOD_Dashboard.html(fromHOD_Dashboard.html)Tutor_Dashboard.html(fromTutor_Dashboard.html)Admin_Dashboard.html(fromAdmin_Dashboard.html)
To enable automated grading of descriptive answers:
- Go to the Apps Script editor Project Settings (gear icon).
- Under Script Properties, click Add script property.
- Set Property Name:
GEMINI_API_KEY - Set Property Value: (Your Gemini API Key from Google AI Studio)
- Click Save script properties.
- In the top-right corner of the editor, click Deploy -> New deployment.
- Click the gear icon next to "Select type" and choose Web app.
- Configure settings:
- Execute as:
Me (your-institutional-email) - Who has access:
Anyone(Crucial so students can access from their devices)
- Execute as:
- Click Deploy.
- Copy the generated Web App URL – this is the link students and staff will use to access the Carmel Linx portal!
To maintain a clean, simple, and easily debuggable codebase, you should always create independent HTML and GS files for new features rather than adding complex nested logic to existing dashboards.
Here is the architectural blueprint for expanding Carmel Linx:
To support upcoming features, add these sheets as tabs in your Google Spreadsheet:
Attendance_Logs:Log_ID|Reg_No|Classroom_ID|Date|Status(Present/Absent) |HourAssignment_Marks:Entry_ID|Reg_No|Subject_Code|Assignment_No|CO_Tag|Max_Marks|Marks_ObtainedTutor_Diary:Diary_ID|Classroom_ID|Date|Topic_Discussed|Action_Taken|Remarks
Create these files as independent frontend layers in your GAS project:
Tutor_Diary.html: A dedicated form for entering and reviewing online tutor/mentor diaries.Attendance_Roster.html: A high-speed, checkbox-based student attendance register grid.Course_File_Generator.html: A printable layout aggregating syllabus documents, question banks, attendance summaries, quiz averages, and attainment levels for a given subject.
AttainmentCalculator.gs:- Implement
calculateProgramOutcomeAttainment()to aggregate Course Outcomes (COs) and map them to Program Outcomes (POs). - Write a function to bundle and export a compiled Course File into a clean PDF format.
- Implement