Good morning 👋
Loading…
🎥 Today's classes
Loading…
🛒 Latest purchases
Loading…
📊 More statsMoney chart · Usage & Costing · Device & Location Alerts · Student Report · Enrollment · Join List
📈 Last 7 days — money in
📊 Usage & Costing
Aggregate app usage — not per-student — for estimating your Netlify/Firebase/AI costs.
"Total Question-Answering Hours" is time actually spent answering MCQ questions (summed from every attempt) — a good proxy for engagement, not full time-in-app (browsing, reading, etc). Live Session and Challenge attempts aren't counted in Tests Given yet, only regular/practice tests.
| Date | Active Students | Tests Given | Hours |
|---|---|---|---|
| Pick a range above. | |||
🛡️ Device & Location Alerts
Students flagged for a new device or a far-away login.
| Name | Flag | Details | ||
|---|---|---|---|---|
| No alerts right now. | ||||
🏅 Student Report
Ranked by activity + score — who's actually working, who's coasting.
| Rank | Name | Tests Given | Avg Score | Last Active | |
|---|---|---|---|---|---|
| No students yet. | |||||
🎓 Enrollment Overview
How many students hold each access flag right now.
| Enrollment | Students |
|---|---|
| No students yet. | |
🆕 Student Join List
| Name | Phone | Joined | Entry Type | Login Method | |
|---|---|---|---|---|---|
| No data yet — connect Firebase to see live students. | |||||
🔍 Duplicate Accounts
Shows phone numbers that have 2+ accounts — e.g. a student signed up twice, or a guest
account ended up separate from the real one. Display only; nothing is deleted — you can
change access from here with ✏️/+15 days; decide the rest yourself after checking.
₹11-paid status is matched by the contact number on Razorpay's own captured
payment, not by an order's uid — the payment may sit on a third (guest) UID that
does not show on either account.
⚡ Fix everyone's access
For every duplicate number (independent of the filter above — this runs on ALL of them): access goes to the account with the most attempts (mcqAttempts + mqbAttempts + judiciaryAttempts + mockAttempts combined); on a tie the oldest account wins. The other accounts are not touched at all — no access is removed, nothing is deleted or merged.
Batch Summary
| Batch | Students | Tests Allotted | Given | Reviewed |
|---|---|---|---|---|
| No students yet. | ||||
📋 Old Students (Batch 2026) (list of those who picked the "2026" batch on join.html — Pending to Approved)
| Name | Number | Status | |||
|---|---|---|---|---|---|
| No entries. | |||||
Create Student Login (Copy Checking Portal)
Give each student a unique ID + password so they can log into the Copy Checking Portal and upload their answer sheets — no phone OTP needed.
Bulk Import Students
Paste one student per line as Name, Phone (comma or tab separated) — Student ID and password are auto-generated from the phone number, same as a single Create above. Pick where to put all of them below; you can fine-tune any individual student afterward from the table.
🔁 Bulk Change Ending Date
Move students whose ending date is a fixed old date to a new date in one go — only the ending date changes, nothing else.
| Name | Student ID | Batch | Phone | Signup Date | Course End Date | 💰 Plan | 📅 ADPO Access | Tests | Last Login | Activity | ||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| No data yet — connect Firebase to see live students. | ||||||||||||
🖨️ Print Studio
Print-ready documents straight from the live data (or pasted text). Output = your browser's own print (Save as PDF) so Hindi renders correctly — no PDF library. In the print dialog turn on "Headers and footers" if you want page numbers.
0 · Book mode
1 · Source
2 · Layout
3 · Options
4 · Notes & Old↔New law
5 · Case Laws & MCQ per section
pyqTags, solutionEn/Hi) — these toggles enable themselves once the data arrives.actLaw; section link: exact sectionProvision first, otherwise “Section N / Article N / धारा N” in the text — those are marked “text-matched” (may be a cross-reference). Max 500 across all blocks in the whole PDF.6 · Educator boxes
Old | New lines become a table. Boxes live in memory — save a .json with “Save notes & boxes”.7 · Cover page
8 · Contents (needs “Table of contents” ticked in Options)
9 · Chapter summary, Glossary & Index
10 · Old vs New law comparison table
mqbSectionMappings (only IPC / CrPC / IEA ↔ BNS / BNSS / BSA). The penalty “Same / →” is an estimate read from the text — death, life, years, fine — and can be wrong, so you can correct it with a manual paste or with boxes.11 · One Liners appendix
Fonts & sizes
1 · Source
2 · Layout
3 · Options
Fonts & sizes
1 · Source
2 · Slides
Fonts & sizes
➕ Custom slides
🌐 Translation, Essay & Summarisation
⚖️ Judgment Writing
For each homework: every student, who uploaded, what was reviewed, and who needs a reminder.
🔐 Paper 4 — Access Control
Which content each tier can see. These settings are read by the student portal and by the Firestore/Storage rules, so no code change is needed. Free also includes guests, so tick that column carefully.
| Content | 🆓 Free / Guest | 🎓 Demo | 💰 Paid |
|---|---|---|---|
| Loading… | |||
✍️ Subjective Answer Writing
📌 One Liners / Quiz
Live content for the student-facing "One Liners / Quiz" quick-recall feature — publishing here makes cards available immediately, there is no separate staging step. Subject is fixed (MPGK / Law / Computer); Unit and Topic are free text, taken straight from the pasted headers.
Bulk Import via Paste
Pick the Subject once for this whole batch. A Unit: line and a
Topic: line start a new group — every numbered line after them is a card,
until the next Unit:/Topic: line changes the group. Each card is two lines: the numbered
Hindi line, then the English line right below it, both "Question — Answer".
Format:
Unit: History of Madhya Pradesh
Topic: Forts and Defensive Heritage
1. भीमबेटका किस जिले में है? — रायसेन
Bhimbetka is in which district? — Raisen
2. ग्वालियर का किला किसने बनवाया? — सूरज सेन
Who built Gwalior Fort? — Suraj Sen
📁 Folders
Organize cards into folders (sub-folders are allowed). Picking a folder lists all cards in it and its sub-folders below. Subject / Unit / Topic stay as they are — a folder is just an extra layer.
| Whole Unit | Subject | Unit | Topic | Cards | ||
|---|---|---|---|---|---|---|
| Loading… | ||||||
Settings
AI Cost
Estimated Claude API spend, based on this project's own call log (not fetched from Anthropic — there's no API for that). Figures are estimates from Anthropic's list price per token; check the Anthropic Console for your actual bill and remaining balance, which isn't something any app can read back automatically.
| Feature | Calls | Cost |
|---|---|---|
| No usage logged yet. | ||
Other Platform Costs
GitHub, Netlify and Firebase don't offer an API a personal project can use to read back its own bill — that only exists for GitHub/Google Cloud org-level billing accounts, which needs extra one-time setup in each platform's own console (not something I can do from code). So these three are manual for now: check each platform's billing page occasionally and note the number here, so it sits next to the real Claude number above for one place to check everything.
Usually $0 unless you're on a paid plan or heavy on Actions minutes.
Usually $0 unless you're past the free-tier bandwidth/build limits.
Check Firebase Console → Usage and billing. This is the one most likely to move as usage grows.
Two-Factor Authentication
Require a 6-digit code from an authenticator app (Google Authenticator, Authy, etc.) in addition to your password when logging into this admin panel.
Checking status…
OTP Login
Set your phone number to log into this panel with an SMS OTP instead of email+password — same as the student portal's OTP login. Note: OTP login skips two-factor authentication even if you have it enabled above, since it's a full alternative sign-in path, not a second factor on top of your password.
Preview as Student
Opens the student portal in a new tab, signed in as a dedicated test account with full access to every batch and paper — no fees, nothing tracked for real. Use it to try out uploads, MCQs, everything, exactly as a fully-paid student would see it. Only reachable from here — there's no public way to sign into this account.
Free Trial Courses
Which courses show up as options on the public "New Student" free-trial signup form. Each phone number gets exactly one free trial ever, for one of these courses — they can't re-signup once used, and they can't free-trial a course they're already a paid student in.
📅 Exam Dates
Drives the countdown banner and revision schedule on the student dashboard (adpo-mcq.html) —
writes appSettings/examDates. Leave a course's date/time blank to leave it
untouched (not cleared) — only courses you actually fill in get saved.
📅 Course End Dates (Defaults)
The default Course End Date auto-filled for new ADPO students (Create/Bulk Import forms) and
used by "📅 Set ADPO Default" on the Students page — writes appSettings/courseDefaults.
This does NOT change any student's date by itself.
Add Another Admin
1. Firebase Console → Authentication → Users → Add User (email + password).
2. Copy that user's UID.
3. Firebase Console → Firestore → create/open the admins collection →
add a document whose Document ID is that UID (fields can be empty, e.g. { role: "admin" }).
4. That user can now log in to this panel.
Telegram Channels
Channels the Telegram bot posts to when an authorized sender DMs it news (see Reverse Connection below). To connect one: message
@BotFather on Telegram → /newbot → follow the prompts to get a bot
token (set once via firebase functions:secrets:set TELEGRAM_BOT_TOKEN, not entered
here) → add that bot as an admin of your channel → forward any message from the
channel to @userinfobot to get its numeric Chat ID (looks like
-1001234567890).
Social Media Style Guide
Ongoing instructions for how Claude should draft the posts the Telegram bot makes — e.g. "always keep the headline under 8 words" or "prefer Ember templates for exam alerts, Classic for case law." Applied to every generation from now on, no code changes needed.
Telegram Reverse Connection
DM your bot (@Legalom_social_bot) raw news text — or forward it a photo/PDF — and it drafts a post and auto-posts the poster to every connected channel above. Only Telegram accounts listed here are allowed to trigger it (anyone else who messages the bot is ignored). To find your own numeric Telegram user ID: message @userinfobot directly (don't forward anything — just chat with it) and it replies with your ID.
Check a Phone Number List
Paste a list of phone numbers (one per line, or comma/space separated — any format works, they're matched by digits only). Get back which of them are already registered as students right now — handy for checking how many of an older contact list have since joined.
🧰 Maintenance Tools
One-off admin utilities — not day-to-day work, safe to leave alone unless you know you need one. Each button here recomputes/overwrites its own data fresh every time, so re-running one is always safe.
Backfill Report Card Mirror
Recomputes mqbReportCardMirror for every already-submitted MQB attempt. Needed after that mirror's own shape changes (a field gets added) — brand-new attempts always pick up a change automatically; this is only for attempts that already existed before it.
📏 Question Length Backfill
Fills in a length field on mqbQuestions (Short/Medium/Long, by character count) — needed for whatever
uses that to filter/balance a test. "Preview" counts by reading questionEn/Hi directly (no backend
dependency); "Run Backfill" calls backfillMqbQuestionLength to actually write the field.
📏 Question Size Rules
Word-count thresholds that decide Short/Medium/Long for the Question Length Backfill above. Saving here changes only the RULE — already-backfilled questions keep their old size until Run Backfill runs again.
(fewer = short)
🎁 Free Trial Duration
How many trial days Create Student's "Free trial" checkbox and approving a pending signup give — change it here, no code change needed.
🎨 Student Interface
Text, colors and sizes shown on the student dashboard (adpo-mcq.html) — writes one shared doc
(appSettings/studentUI) that page reads on load. Every field's placeholder shows what's
live today — leave a field empty (or a color's checkbox unchecked) and that piece
keeps its default exactly as it is now; nothing changes until you type/pick something and Save.
Clearing a field you'd previously filled in and saving again reverts it back to default too. The
preview on the left updates as you type — it's a live look, nothing is saved until you press Save.
🔐 Login Interface
Text, tile visibility, and tile order shown on the login pages (index.html / join.html / portal.html) —
writes one shared doc (appSettings/loginUI) those pages read via getLoginUISettings
(index.html and join.html don't carry the Firestore SDK, so they read this through a callable — same
reason getFeatureFlags exists). Every field's placeholder shows what's live today
— leave a field empty and it keeps its default; nothing changes until you type/pick something and Save.
The preview on the left updates as you type. footerText is shared by index.html's and
join.html's footers — one field, both pages. This editor doesn't cover colors/sizes yet, though the
engine on those 3 pages already supports them.
🎛️ Feature Switches
Toggles for flags that today live as hardcoded const values inside individual page files
(adpo-mcq.html, copy-check.html, etc.) — this page writes to one shared Firestore doc
(appSettings/featureFlags) those pages read on load instead. A flag genuinely missing from
that doc (not yet migrated, or the doc itself doesn't exist) always falls back to that page's own
previous hardcoded value — flipping nothing here can never be what breaks a page that hasn't been
wired up to read it yet.
Switches
🔐 Login & Free Access
The one place for the whole-ADPO Free-for-All switch (settings/adpoAccess) and the
login rules (settings/loginPolicy, enforced on the server). Live — another admin's change
shows up here at once. Demos are given on WhatsApp only (since 29 Oct 2026). To make one MQB test
free, use the 🆓 button in Test Maker.
Login Settings
🎉 Free Promo — ON / OFF
The whole course free for everyone — switch it off or on instantly from here. It switches off automatically after the date; nothing to do.
💰 Course Plans
Course catalogue — the price, duration and enrolment flag for each plan. This is only a catalogue; no payment is taken here. One course (ADPO Foundation, for example) can have several plans — 3, 6 or 12 months, at different prices.
| Course | Price | Duration | Students | Enrolment flag | Active? | |
|---|---|---|---|---|---|---|
| Loading… | ||||||
🚩 Reported Questions
Students flag MCQ questions they think are wrong, from either the ADPO MCQ system or Book Maker's subject question banks. Ask Claude to suggest a fix, jump to the question with "Go Fix It" to edit it, then mark the report Resolved or Dismiss it once you're done.
Student Comments (auto-clears 7 days after your reply)