🏦 LIC
⚖ Legal Om

Admin Panel Login

— or —

Good morning 👋

—money today
—students active
—tests taken
🆕 New students
—
📩 Demo asks
—
🎥 Classes today
—
📅 This week
—
🔴Live Class PortalToday's classes, Connect OBS, class chatOpen →
🔴 Needs you

Loading…

Your apps

🎥 Today's classes

Loading…

Teacher portal →

🛒 Latest purchases

📊 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.

or pick a range: to
0
Active Students (took ≥1 test)
0
Tests Given
0
Total Question-Answering Hours
0
Avg Tests / Day

"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.

DateActive StudentsTests GivenHours
Pick a range above.

🛡️ Device & Location Alerts

Students flagged for a new device or a far-away login.

NameFlagDetails
No alerts right now.

🏅 Student Report

Ranked by activity + score — who's actually working, who's coasting.

RankNameTests GivenAvg ScoreLast Active
No students yet.

🎓 Enrollment Overview

How many students hold each access flag right now.

EnrollmentStudents
No students yet.

🆕 Student Join List

Last 24 hours
Last 3 days
Last 7 days
All time
NamePhoneJoinedEntry TypeLogin Method
No data yet — connect Firebase to see live students.

Students

📊 Student Journey 🔁 Duplicate check

🔍 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

BatchStudentsTests AllottedGivenReviewed
No students yet.

📋 Old Students (Batch 2026) (list of those who picked the "2026" batch on join.html — Pending to Approved)

⏳ Pending: 0 ✅ Approved: 0
— Approve and Bulk Approve both give ADPO access until this date
NameNumberEmailStatus
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.

Students can only upload to homework created for their batch.

Leave blank/0 if you don't want to track fees for this student.

Auto-fills to the ADPO default when ADPO is checked below — change or clear it if this student needs something different.

Leave all unchecked to keep using Batch above. Check specific ones (e.g. only Judiciary Foundation, or only Paper 4) to target this student more precisely for homework and practice questions.

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.

from to
from to

🔁 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.

to (optional, for a range)
NameStudent IDBatchPhoneSignup DateCourse End Date💰 Plan📅 ADPO AccessTestsLast LoginActivity
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

📄 Bare Act only
📝 Study material
📚 Complete book
✅ MCQ only →
These buttons set the switches below in one go (you can change each one later). Pick the Act / range first.

1 · Source

☁️ Firestore (live)
📋 Paste (@@ACT/@@SEC)
Loading Bare Act data…

2 · Layout

◫ EN left · HI right
▬ EN only
🇮🇳 HI only
⊟ EN then HI

3 · Options

Definition⚠ PunishmentProvisoExplanationSchedule
Click any paragraph in the preview to change its type (this session only — nothing is saved).

4 · Notes & Old↔New law

Section-wise note: click “+ 📝 Note” under a section in the preview. Notes live only in this session's memory — nothing is saved to Firestore; use “Save notes” to make a .json before refreshing.

5 · Case Laws & MCQ per section

PYQ tags / solution are not in the Case Law library yet (fields pyqTags, solutionEn/Hi) — these toggles enable themselves once the data arrives.
Act questions come only from 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

📌 Remember This💡 Exam Tip⚠️ Common Mistake📖 Definition⚡ Important Case🔄 Old vs New Law
For a section: click “+ 📌 Box” under the section in the preview (before or after the section). For the whole document: the buttons below. In “Old vs New”, Old | New lines become a table. Boxes live in memory — save a .json with “Save notes & boxes”.

7 · Cover page

1 Classic
2 Modern
3 Minimal
4 Bold
5 Scales
The cover is one full page at the paper size (selected in the Page size card). Each design comes in Light and Dark.

8 · Contents (needs “Table of contents” ticked in Options)

Page numbers mean the printed sheet number (cover = 1), the same one the browser shows in “Headers and footers”. They are worked out by measuring the layout (Chrome has no native TOC page numbers): all numbers carry “≈”: usually exact, but long PDFs (after ~60+ pages) can be off by ±1 page. They are re-measured automatically when paper size / fonts change.

9 · Chapter summary, Glossary & Index

Auto = each section's title + the first sentence where there is a punishment + the terms that are defined. Manual = “+ ✎ Summary note” at the end of a chapter in the preview (memory only, saved in the notes .json).
Index page numbers are measured like the TOC (“≈”). Glossary / Index start on a new page.

10 · Old vs New law comparison table

Rows come automatically from 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

One Liners are not linked to the Act's sections, so this is an appendix — you pick the Subject / Unit / Topic. Live (active) cards, max 500.

Fonts & sizes

Sliders start at the current look (19 / 11 / 9.5 pt). Applies to the print and the preview.
Pick an Act to preview.

1 · Source

☁️ MCQ bank (live)
📋 Paste
Loading filters…
Pick at least one of Subject / Act / GK Category — the bank is never read in full. Max 500 questions per PDF.

2 · Layout

▬ 1 column
◫ 2 columns
EN
हिं
EN+हिं

3 · Options

Fonts & sizes

Sliders start at the current look (19 / 11 / 9.5 pt). Applies to the print and the preview.
Load questions (or paste) to preview.

1 · Source

✅ MCQ bank
📌 One Liners
📋 Paste
📖 Bare Act
At least one filter is required. Max 500 questions per deck.

2 · Slides

EN
हिं
EN+हिं
●
●
●
●
●

Fonts & sizes

Slide sizes are relative to the current look (44 / 25 / 18 = unchanged). Bare Act slides: Body = exact pt.

➕ Custom slides

No custom slides yet.
Custom slides belong to the deck type they were made in (Bare Act / MCQ / One Liners). Hover a slide in the preview → "+ Slide after this". Slides stay in memory — use Save (.json) to keep them.
Slides print one per page. Long questions: use fewer per slide.
Load a source to preview the slides.

🌐 Translation, Essay & Summarisation

⚖️ Judgment Writing

For each homework: every student, who uploaded, what was reviewed, and who needs a reminder.

Check copies again against the current rules. Your own comments are kept, and nothing is sent to a student.

🔐 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.

All One Liners

Whole UnitSubjectUnitTopicCards
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.

$0.00
Today
$0.00
This Month
$0.00
Total (logged)
0
API Calls (logged)
FeatureCallsCost
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.

Live Preview

🔐 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.

Live Preview

🎛️ 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.

Free-for-All (whole ADPO course)
Off

Login Settings

Enrolled Students
Free / Demo Students

🎉 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.

CoursePriceDurationStudentsEnrolment flagActive?
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.

🚫 Auto-hidden (Reported queue)
Questions reported by 5 different students are hidden from students automatically. Restore puts the exact old status back and dismisses their pending reports (the count restarts from zero). Questions hidden by a question-bank audit are listed separately below, with the audit's reason.
Loading…
Loading…