same data, less suffering.
A calm, fast app for your attendance, results and study materials.
Made for students of College of Engineering Trivandrum.
Open ETLaban → etlaban.vercel.app
Screenshots use a made-up demo student.
ETLab has all your college data, but it is slow and hard to read on a phone. ETLaban logs in to ETLab for you, reads the same pages you would see, and shows them in a clean app that works well on your phone.
It is unofficial. It only reads your data. It never changes anything on ETLab.
Why the name? It's a nod to Sign Laban, the dessert shop every CET student knows. ETLab, but sweeter.
- Am I in trouble? The home screen answers it in one line, like "Every subject is above 75%. Tightest is Data Structures Lab, which can miss 3 more classes."
- Attendance by subject. See how many classes you can miss, or how many you need to attend to get back above your target.
- A real calendar. One small dot per period: dark for present, red for absent. Tap a day to see which classes you missed.
- Results for every semester. SGPA per semester as a small chart, your CGPA, grades, sessional marks and assignments.
- Study materials. Every file from ETLab in one searchable list, quick links to SAC and ASC union cell resources, plus your own saved links (Drive folders, playlists, question banks).
- Your target, your rules. Choose 75%, 80% or 85%. Every number updates.
- Stay signed in. Tick Keep me signed in and ETLaban quietly logs you back in whenever ETLab ends your session, instead of sending you to the login page every few hours.
- Light and dark mode. It follows your phone, or pick one yourself.
- Install it like an app. Add it to your home screen. It opens instantly and still shows your last data when you're offline.
- Works on laptops too. A roomier layout with a sidebar on bigger screens.
This is the most important question, so here is the short answer.
- Your password is not stored, unless you ask. Normally it is sent to ETLab once, to log in, and then thrown away. If you tick Keep me signed in, it is kept encrypted inside your login cookie in your own browser (never on the server), so ETLaban can sign you back in when ETLab logs you out. Logging out deletes it.
- Your data is not stored on the server. Each time you sync, the server fetches your pages from ETLab, turns them into data for the app, and forgets them.
- Your login stays in your own browser. It is kept as an encrypted cookie that scripts on the page can't read. Every student's session is completely separate.
- Your data stays on your phone. The app keeps a copy on your device so it opens fast. Logging out deletes it.
- Only anonymous visit counts. The live site uses Vercel Web Analytics to count page views. It uses no cookies and never sees your username, password or ETLab data.
- The code is open. You can read exactly what it does, right here.
Want the details? See How it works and the security policy.
- Open etlaban.vercel.app in your phone's browser.
- Log in with your normal ETLab username and password.
- Wait a few seconds for the first sync.
- Optional: tap Install (or your browser's Add to Home screen) to keep it on your home screen.
Tap the sync button (the circular arrows) any time to get fresh data. The app also refreshes by itself if your data is more than 3 hours old.
You need Python 3.10 or newer.
git clone https://github.com/AbhineethVS/ETLaban.git
cd ETLaban
pip install -r requirements.txt
python backend_server.pyThen open http://127.0.0.1:8000 in your browser.
To use it on your phone, connect the phone to the same Wi-Fi and open the
Phone address the server prints (something like http://192.168.1.5:8000).
On Windows, allow Python through the firewall for private networks if the phone
can't connect.
The app is ready for Vercel:
- Import this repository in Vercel. Framework: Other. No build command.
- Add one environment variable:
SESSION_SECRET, a long random value. Generate one with:python -c "import secrets; print(secrets.token_urlsafe(48))" - Deploy.
The full guide, with troubleshooting, is in docs/deployment.md.
public/ Everything the browser loads
index.html, login.html, app.html The three pages: landing, login, and the app
base.css, public.css, app.css Styles: shared design system, public pages, app
app.js The app: views, routing, sync, calendar, charts
landing.js, login.js, auth.js Page logic and session helpers
ui.js, theme-init.js Theme switching and small shared behaviour
sw.js, manifest.webmanifest Installable app (PWA) support
icon.svg, *.png App icons
robots.txt, sitemap.xml, llms.txt For search engines and AI assistants
og-image.png Link preview image (source: docs/og-image.html)
etlab/ The backend: log in, fetch pages, read them
api.py The API routes
session.py Encrypted session cookie
client.py Talks to ETLab
attendance.py, results.py,
materials.py, tables.py Turn ETLab pages into data
api/index.py Entry point on Vercel
backend_server.py Entry point on your computer
vercel.json Vercel settings and security headers
docs/ Longer documentation and screenshots
All routes return JSON.
| Method | Route | What it does |
|---|---|---|
| POST | /api/login |
Log in with { username, password, remember }. Sets the session cookie. |
| POST | /api/cookie |
Log in with a pasted ETLab cookie instead (fallback). |
| POST | /api/renew |
Log back in to ETLab with the password saved by Keep me signed in. |
| POST | /api/logout |
Clear the session cookie. |
| GET | /api/me |
{ loggedIn, username } |
| GET | /api/attendance |
Subject totals, this month's and last month's calendar, and each day's periods. |
| GET | /api/results |
Every semester so far: marks, grades, SGPA and CGPA. |
| GET | /api/materials |
Notes and files from ETLab. |
If your ETLab session has expired, data routes answer 401 with "expired": true.
If you chose Keep me signed in, the answer also has "renewable": true: the app calls
/api/renew once and retries. Otherwise it asks you to log in again.
To keep load on ETLab down, the app tells the server what it already has.
/api/attendance?known=2026-10-03:5/6,... skips day pages whose present/total haven't changed
(listed back in reusedDetails). /api/results?cachedSemester=5 skips earlier semesters while
semester 5 is still current (earlierSkipped: true). Tapping Sync, or once a day, fetches every semester.
Earlier semesters that couldn't be read are listed in missingSemesters (the app keeps its saved copy),
and semesterPages says why for each one, e.g. "failed" or "no course table (3 tables, 5120 bytes)".
Bug reports, ideas and pull requests are welcome. Please read CONTRIBUTING.md first. It explains how to set things up and how to fix things when ETLab changes its pages.
Never post your password, cookie or real ETLab pages in an issue.
ETLaban is an independent student project. It is not made by, endorsed by, or connected to ETLab, Etuwa Concepts, College of Engineering Trivandrum, or KTU. It shows the same data ETLab shows you. Always check ETLab itself for anything official, like exam eligibility.
MIT. Use it, change it, share it. Just keep the copyright notice.




