- Introduction
- Pitch
- Hogwarts
- Live Demo
- MVP
- Roadmap
- Launch Sprint
- PRD
- Get Started
- Localhost
- Architecture
- Structure
- Pattern
- Page
- Layout
- Content
- Types
- Config
- Actions
- Queries
- Authorization
- Validation
- Form
- Table
- Detail
- Card
- Util
- Hooks
- List Params
- Views
- README.md
- ISSUE.md
- Technology Stack
- Database
- File
- CDN Assets
- Entry Points
- Dashboard
- Authentication
- Credentials
- OAuth
- Flow Diagrams
- Multi-Tenancy
- Offline
- Onboarding
- Onboarding Videos
- Add Values
- Admission
- Application
- Attendance
- Compliance
- Profile
- Exams
- Exam Wizard
- Timetable
- Classrooms
- Notifications
- Conference
- LMS (Lumos)
- Finance
- Fee Management
- Invoice
- Wallet
- Salary
- Payroll
- Timesheet
- Expenses
- Budget
- Receipt
- Accounts
- Banking
- Reports
- Dashboard
- Permissions
- Messages
- Integration Flow
- Provision
- AI Document Processing
- Document Intelligence
- Internationalization
- Translation
- Translation Guide
- Icons
- Docs Factory
- Inspiration
- Listings
- Teachers
- Students
- Catalog
- Library
- Contributing
- Code of conduct
- GitHub Workflow
- Database Seeds
- Database Safety
- Test Accounts
- Playwright
- Prettier
- Block Rebound
Each milestone is a concrete moment where the platform delivers usable value to a school owner. They build sequentially from first signup to full operation.
Status
| # | Milestone | Status | What it is | Prereq |
|---|---|---|---|---|
| 1 | School Online | ~93% | Live school URL + join code after onboarding | Complete 15 onboarding steps |
| 2 | Share and Invite | ~70% | Members join via URL or join code | School Online |
| 3 | First Announcement | ~97% | Post visible to all members | School Online |
| 4 | Team Onboard | ~88% | Add teachers manually or via CSV | School Online |
| 5 | Students In | ~93% | Add students manually, CSV, or admission | School Online |
| 6 | Classes Formed | ~90% | Class = teacher + subject + students | Team + Students |
| 7 | Timetable Running | ~95% | Weekly schedule for all classes | Classes |
| 8 | Attendance Tracked | ~95% | Mark daily attendance per class | Classes + Timetable |
| 9 | Grades Recorded | ~90% | Exams, marks, report cards | Classes + Students |
| 10 | Fees Collected | ~78% | Fee structure + payments | Students |
| 11 | Parents Connected | ~85% | Parents linked, see grades and attendance | Students + Guardians |
| 12 | School Automated | ~60% | Cross-system triggers (attendance + grades + fees) | All above |
Per-milestone notes
1. School Online — ~93%
15-step onboarding; platform provisions a live subdomain via middleware rewrite (school.databayt.org).
- All 15 steps shipped with routes, validation, server actions
- School creation atomic (
$transaction) completeOnboarding()activates school, firesprovisionSchoolDefaults(), generates join code- Location step uses Mapbox
| Gap | Effort | Impact |
|---|---|---|
Duplicate action.ts + actions.ts in subdomain | Quick | Cleanup |
| Stripe not integrated (price/discount steps store data only) | Large | Revenue |
| DNS providers stubbed (custom domains scaffolded) | Large | Enterprise |
2. Share and Invite — ~70%
Backend solid (~1089 lines in actions.ts); UI gaps block self-enrollment.
inviteMember(), approve/reject/suspend, role change, bulk ops, CSV exportMembershipRequestmodel with status trackingjoinSchoolByCode()exists (no UI)/accept-invite?token=...accept/decline flow- Public school marketing pages exist
expire-invitationscron exists (not yet invercel.json)
| Gap | Effort | Impact |
|---|---|---|
| No join code entry UI for users | Quick | Self-enrollment |
| No join code display/copy UI for admins | Quick | Sharing |
| No bulk invite UI (paste multiple emails) | Medium | Efficiency |
Register expire-invitations cron | Quick | Cleanup |
3. First Announcement — ~97%
Full CRUD (~1251 lines), audience scoping, priority, scheduling, pinning, auto-translate (Google Translate API), read tracking, in-app notifications, scheduled publishing cron, export, parent portal view.
| Gap | Effort | Impact |
|---|---|---|
Email notifications not wired (publish dispatches in-app only despite emailOnPublish toggle) | Quick | Reach |
| No file attachments | Medium | Usability |
4. Team Onboard — ~88%
Email invite + accept link, CSV/XLSX/JSON bulk import via bulkImportTeachers(), downloadable templates, role-specific profile creation, member CSV export.
| Gap | Effort | Impact |
|---|---|---|
| No bulk invite (paste multiple emails) | Medium | Efficiency |
| No post-import teacher onboarding wizard | Large | Experience |
5. Students In — ~93%
Full CRUD (7-step registration), CSV/XLSX/JSON bulk import, admission pipeline (campaigns → applications → merit list → enrollment → section placement with capacity checks), guardian linking, student access codes.
No critical MVP gaps.
6. Classes Formed — ~90%
Class = Subject + Teacher + Grade + Term + Classroom + Students. Full CRUD (~65KB actions), StudentClass bridge with capacity, subject-teacher roles (PRIMARY, CO_TEACHER, ASSISTANT), catalog subject linking, CSV export.
| Gap | Effort | Impact |
|---|---|---|
gradeId not auto-derived from subject/catalog on createClass | Quick | Data integrity |
7. Timetable Running — ~95%
3-phase AI generation (974 lines), visual grid editor, role-based views, conflict detection (teacher/room/student), substitutions, templates, PDF/CSV export, RBAC across 28+ guarded mutations, readable preview names.
| Gap | Effort | Impact |
|---|---|---|
Performance optimizations (React.memo, virtual scrolling) | Medium | Scale |
| ARIA labels, keyboard nav | Medium | A11y |
8. Attendance Tracked — ~95%
Most complete subsystem. Daily marking with 6 statuses, smart class auto-select, bulk shortcuts (P/A/L, Ctrl+S), QR/barcode/RFID/geofence verification, excuses (7 categories), interventions (14 types), analytics, CSV export, kiosk mode, hall passes.
| Gap | Effort | Impact |
|---|---|---|
STAFF role has write access (should be read-only) | Quick | Security |
24 .tsx.bak files to delete | Quick | Hygiene |
No parent notification on absence (dispatchNotification missing in attendance save) | Quick | Communication |
9. Grades Recorded — ~90%
40+ exam routes, full CRUD for exams and marks, manual / auto-calculate / AI-assisted / bulk / OCR mark entry, question bank with AI generation + CSV, GPA 4.0/5.0/letter/CGPA configs, report cards (queries via class.termId), progress reports, certificates, exam wizard.
| Gap | Effort | Impact |
|---|---|---|
| Academic metrics (GPA, pass rate) on admin dashboard return hardcoded zeros | Medium | Visibility |
| No real-time collaboration during grading | Large | Workflow |
10. Fees Collected — ~78%
Models: FeeStructure, FeeAssignment, Payment, Refund, Scholarship, Fine. Tabbed UI (5 tabs), CRUD with schoolId scope, financial reports (balance sheet, income statement, trial balance), invoice wizard, bulk generation, email sending, fee-overdue cron, dashboard stats.
| Gap | Effort | Impact |
|---|---|---|
| Auto-invoice on fee assignment | Quick | Workflow |
| Receipt PDF generator | Medium | Records |
| Late fee auto-calc on overdue | Quick | Revenue |
paymentNumber uses Date.now()+random (no DB unique) | Quick | Data integrity |
| No parent self-service payment portal | Large | Revenue |
| No online payment gateway per school | Large | Revenue |
11. Parents Connected — ~85%
Guardian and StudentGuardian linked via admission/enrollment, parent portal routes (attendance, announcements, events), getMyChildren() / getChildGrades() / getChildTimetable() / getChildOverview(), dashboard with real grade trends and term progress, excuse submission, parent-teacher messaging, invoice history, admin parent listing.
| Gap | Effort | Impact |
|---|---|---|
| No attendance → parent dispatch | Quick | Communication |
| No grade → parent dispatch | Quick | Communication |
| No fee breakdown view for parents | Medium | Transparency |
| No daily digest email (preference toggle exists, no impl) | Medium | Engagement |
12. School Automated — ~60%
getDashboardSummary() with parallel metric fetching, notification system (6 models, 20 files, in-app + email), 10 active cron jobs (announcements, expiry, email queue, notification cleanup, event/assignment/teacher reminders, fee overdue, attendance policies, scheduled reports), inline triggers on fees, payments, assignments, announcements, exams, admission, membership, substitutions.
| Gap | Effort | Impact |
|---|---|---|
| Attendance save doesn't notify parents | Quick | Communication |
| Grade recording doesn't notify parents | Quick | Communication |
| Hardcoded academic metrics on dashboard | Medium | Visibility |
| No daily parent digest cron | Medium | Engagement |
| No cross-system analytics dashboard | Large | Reporting |
Fix plan
Tier 1 — quick wins (under 1 hour each)
| # | Fix | Milestone | Files |
|---|---|---|---|
| 1 | Join code display/copy for admins | 2 | membership/content.tsx |
| 2 | Join code entry dialog (calls joinSchoolByCode()) | 2 | new join-code-dialog.tsx |
| 3 | Announcement email dispatch (add "email" to channels when emailOnPublish) | 3 | announcements/actions.ts ~L1241 |
| 4 | Attendance → parent notification on ABSENT/LATE | 8, 11, 12 | attendance/actions.ts |
| 5 | Real GPA/pass rate from ExamResult | 9, 12 | dashboard/actions.ts ~L350 |
| 6 | Auto-invoice in assignFee() | 10 | finance/fees/actions.ts |
| 7 | Late fee creation in fee-overdue cron | 10 | api/cron/fee-overdue/route.ts |
| 8 | paymentNumber @@unique + sequential generation | 10 | prisma/models/finance.prisma, fees/actions.ts |
| 9 | STAFF attendance read-only | 8 | attendance/authorization.ts |
| 10 | Subdomain duplicate cleanup (action.ts → actions.ts) | 1 | onboarding/subdomain/ |
| 11 | Register expire-invitations cron | 2 | vercel.json |
| 12 | Delete 24 .tsx.bak files | 8 | attendance/**/*.bak |
| 13 | gradeId auto-derive in createClass() | 6 | classes/actions.ts |
Tier 2 — medium (2-4 hours each)
| # | Fix | Milestone | Files |
|---|---|---|---|
| 14 | Bulk invite (multi-email textarea) | 2, 4 | membership/invite-dialog.tsx |
| 15 | Grade → parent dispatch on result publish | 11, 12 | exams/manage/actions/crud.ts |
| 16 | Receipt PDF (@react-pdf template) | 10 | new finance/receipt-pdf.tsx |
| 17 | Daily parent digest cron | 11, 12 | new api/cron/parent-digest/route.ts |
| 18 | Parent fee breakdown view | 11 | dashboard/parent.tsx |
| 19 | Announcement file attachments | 3 | prisma/models/announcement.prisma |
Tier 3 — large (1-2 days each)
| # | Fix | Milestone | Files |
|---|---|---|---|
| 20 | Stripe per-school payments | 10 | finance/, Stripe MCP |
| 21 | Parent self-service payment portal | 10, 11 | new parent route |
| 22 | Cross-system analytics dashboard | 12 | analytics/ |
| 23 | DNS provider implementation (Cloudflare/Vercel API) | 1 | lib/dns-service.ts |
| 24 | Teacher post-import onboarding wizard | 4 | new |
| 25 | Timetable a11y + performance | 7 | timetable/ |
Priority
Tier 1 unblocks self-enrollment (1, 2), wires the last notification channels (3, 4), and puts real academic data on the dashboard (5). Tier 2 completes the parent notification loop and adds financial documents. Tier 3 is growth-stage — Stripe, custom domains, cross-system analytics.
See also
On This Page
StatusPer-milestone notes1. School Online — ~93%2. Share and Invite — ~70%3. First Announcement — ~97%4. Team Onboard — ~88%5. Students In — ~93%6. Classes Formed — ~90%7. Timetable Running — ~95%8. Attendance Tracked — ~95%9. Grades Recorded — ~90%10. Fees Collected — ~78%11. Parents Connected — ~85%12. School Automated — ~60%Fix planTier 1 — quick wins (under 1 hour each)Tier 2 — medium (2-4 hours each)Tier 3 — large (1-2 days each)PrioritySee also