Turn your laptop into an automatic teaching log. No timers, no manual attendance sheets, no end-of-month Excel scramble.
Pedexa is a Chrome extension built for teachers and faculty who run their classes over Google Meet. It silently detects when a class starts, asks one quick question, and handles the rest — timing, logging, attendance, and reporting — without the teacher ever touching a stopwatch.
Teachers who take online classes usually end up doing three annoying things by hand every single day:
- Manually noting down the time a class started and ended.
- Manually marking attendance in a separate register or spreadsheet.
- Manually compiling all of this at the end of the month for the administration.
None of this is hard — it's just tedious, easy to forget, and easy to get wrong. Pedexa removes all three from the teacher's plate.
The extension watches for a Google Meet tab, starts a timer the moment the teacher joins, asks what subject is being taught, and stops the timer the moment the call ends. Everything is saved locally and surfaced in a clean dashboard with stats, charts, and one-click Excel export.
- A background service worker watches for Google Meet tabs joining/leaving a call.
- The instant a teacher clicks Join now, the timer starts — no action needed.
- A small popup appears once per session: "What are you teaching? (DBMS / OS / CN / DSA / + custom)". One click and it's gone.
- When the call ends, the timer stops automatically and the session is saved with Date, Subject, Start Time, End Time, and Duration.
- Clicking the extension icon opens a full-screen dashboard tab, not a tiny popup.
- Profile, set once on install (name, institute, default subjects).
- Stats panel: total hours this week, total classes this month, current teaching streak (e.g. "5-day streak 🔥").
- Pie chart (Chart.js) showing time distribution across subjects.
- A simple session history table (searchable/filterable by date or subject) — useful for verifying data before export.
- A roster page where the teacher pastes/types student names once (one-time setup per class/section).
- A floating attendance checklist injected directly into the Google Meet sidebar during a live class, so marking absentees takes seconds.
- A one-click export button on the dashboard that generates a clean
.xlsx/.csvfile of the month's teaching log — ready to forward to administration.
| Layer | Choice | Why |
|---|---|---|
| UI | React + Tailwind CSS | Fast to build, clean modern look |
| Extension runtime | Manifest V3 (service worker + content scripts) | Required for new Chrome extensions |
| Storage | chrome.storage.local |
Free, built-in, fully on-device — no backend, no privacy concerns |
| Charts | Chart.js | Lightweight, simple API, good enough for pie/bar views |
| Export | SheetJS (xlsx) or papaparse for CSV |
Generates real Excel files client-side, no server needed |
No backend, no database server, no hosting cost. Everything lives on the teacher's machine — which is also a strong privacy selling point: student names and class data never leave the laptop.
┌─────────────────────┐
│ meet.google.com │ Content script detects "Join now" / "Leave call"
│ (content script) │ clicks via DOM observation (MutationObserver)
└──────────┬───────────┘
│ chrome.runtime.sendMessage
▼
┌─────────────────────┐
│ Background service │ Starts/stops timer, owns session state,
│ worker │ writes finished sessions to storage
└──────────┬───────────┘
│ chrome.storage.local
▼
┌─────────────────────┐
│ Dashboard (full tab)│ React app reads storage, renders stats,
│ + Roster + Export │ charts, roster, attendance, export button
└─────────────────────┘
The subject-picker popup and the in-meet attendance checklist are both injected UI (content scripts rendering a small React root) rather than the standard extension popup — this is what makes them appear inside the Meet tab instead of requiring the teacher to click the toolbar icon mid-class.
Keeping this explicit early avoids painful schema migrations later:
{
"profile": {
"name": "Prem Shaw",
"institute": "IIIT Bhopal",
"defaultSubjects": ["DBMS", "OS", "CN", "DSA"]
},
"sessions": [
{
"id": "a1b2c3",
"date": "2026-06-17",
"subject": "DBMS",
"startTime": "10:00:12",
"endTime": "10:54:40",
"durationMinutes": 54,
"meetingId": "abc-defg-hij"
}
],
"roster": {
"DBMS": ["Aarav Singh", "Diya Patel", "..."]
},
"attendance": {
"a1b2c3": { "Aarav Singh": "present", "Diya Patel": "absent" }
}
}Use chrome.storage.local.QUOTA_BYTES (default ~10MB) — comfortably enough for years of session logs, but worth showing remaining quota in settings once roster + attendance data grows.
The original plan covers the happy path well. A few things to bake in early so the extension feels reliable in real classroom conditions:
- Multiple Meet tabs: track sessions per
tabId, not globally — a teacher might have a Meet tab open in the background while testing something else. - Missed subject selection: if the teacher closes the popup without picking a subject, don't discard the session — log it as "Uncategorized" and let them relabel it later from the dashboard.
- Accidental tab close vs. real "Leave call": detect both the Meet "You left the meeting" screen and the tab/window being closed mid-call, so timers don't run forever in the background.
- Idle/disconnect time: if the teacher's network drops and Meet auto-leaves, don't silently lose that as "0 minutes" — flag sessions under a minute for a quick manual review.
- Editable history: let teachers manually correct duration/subject on the dashboard — automation should save time, not create a new chore when it gets something wrong.
- Export scope: let the export button filter by date range (e.g. "this month only") rather than always dumping the entire history.
- Privacy framing: since everything is local-only, make that explicit in the UI ("Your data never leaves this device") — it's a genuine advantage over a cloud-based competitor and worth highlighting in onboarding.
Pedexa/
├── manifest.json
├── icons/
├── src/
│ ├── background/
│ │ └── service-worker.js
│ ├── content-scripts/
│ │ ├── meet-detector.js
│ │ ├── subject-picker.jsx
│ │ └── attendance-sidebar.jsx
│ ├── dashboard/
│ │ ├── App.jsx
│ │ ├── components/
│ │ │ ├── StatsPanel.jsx
│ │ │ ├── SubjectPieChart.jsx
│ │ │ ├── StreakCounter.jsx
│ │ │ ├── SessionHistory.jsx
│ │ │ ├── RosterManager.jsx
│ │ │ └── ExportButton.jsx
│ │ └── index.html
│ └── utils/
│ ├── storage.js
│ └── exportToExcel.js
└── README.md
{
"permissions": ["storage", "tabs", "scripting"],
"host_permissions": ["https://meet.google.com/*"]
}Keeping the permission list this small matters — it makes the Chrome Web Store review faster and makes teachers more comfortable installing it (no scary "read all your browsing data" warning).
git clone https://github.com/<your-username>/Pedexa.git
cd Pedexa
npm install
npm run buildThen load it in Chrome:
- Go to
chrome://extensions - Enable Developer mode
- Click Load unpacked and select the
dist/folder
- Step 1 — Auto timer + subject popup
- Step 2 — Dashboard with stats and charts
- Step 3 — Roster, attendance, Excel export
- Weekly email/notification digest ("You taught 12 hrs this week")
- Per-section roster switching (multiple class sections)
- Optional cloud backup/sync (still local-first by default)
- Support for Zoom/MS Teams in addition to Google Meet
Issues and PRs are welcome. This started as a personal tool to solve a real, daily annoyance — if it's useful to other teachers, contributions that keep it simple and privacy-respecting are especially appreciated.
MIT
