Built for Indian Private Schools

Every student.
Every rupee.
One system.

SchoolMIS by designbykalakar replaces your attendance registers, fee ledgers, exam mark sheets and salary books with a single, privately hosted system — purpose-built for your school, maintained by one person who built it.

SchoolMIS  /  Class 6-A · Attendance · Today
#
Student
Attendance
Fees
Term avg
001
Aarav Sharma
Present
Paid
91%
002
Priya Nair
Present
Due
88%
003
Rahul Verma
Absent
Paid
74%
004
Ananya Iyer
Present
Overdue
95%
005
Kabir Mehta
Present
Paid
83%
006
Shreya Patel
Present
Paid
71%
9 Fully integrated modules
400+ Students supported
5 Staff roles with scoped access
0 Third-party data handlers
Complete Coverage

Everything a school runs on, built in from day one.

Nine modules covering the full school lifecycle — from a child's admission application to their final report card, and from a teacher's monthly salary to the school's annual balance sheet.

MODULE 01 Core

Student Records & Admissions

Permanent student records, guardian information, admission pipeline from application through enrollment, sibling linking, RTE quota tracking, and Transfer Certificate management.

MODULE 02 Operations

Attendance

Daily attendance marking by section, default-present with exception model, 7-day backdate support, holiday calendar, and attendance percentage calculations that feed directly into report cards.

MODULE 03 Finance

Fees & Accounts

Per-class fee structures, monthly invoice generation, partial payment support, receipt numbers for every transaction, dues reports by class, and automatic journal entries into the accounting module.

MODULE 04 Academics

Exams & Report Cards

Subject-wise mark entry per exam term, bulk entry for a full section in one save, grade scale, term-on-term comparison, and computed report cards with attendance pulled from Module 02.

MODULE 05 Operations

PTM Notes & Student Summary

A single staff-facing student summary page for parent-teacher meetings — attendance, marks, fee status, and leaving/transfer flags in one view. Append-only meeting notes with follow-up date tracking.

MODULE 06 Migration

Bulk Data Import

Excel-based import wizard for migrating existing paper and spreadsheet records. Plain-language error preview with green/red/yellow rows. Batch revert capability. Covers students, guardians, fee history, and last year's attendance and marks.

MODULE 07 Communication

WhatsApp & SMS Alerts

Parent notifications for absence, overdue fees, and school circulars — triggered by staff from within the system. Meets parents where they already are, without requiring a separate parent app or portal login.

MODULE 08 Finance

Payroll & Double-Entry Accounting

Per-staff customisable salary structures, monthly payroll runs with printable payslips, full chart of accounts, journal ledger, trial balance, and Income & Expenditure Statement and Balance Sheet — PDF-exportable for your CA.

MODULE 09 Management

Role-Sensitive Dashboard

The principal sees today's attendance, low-attendance students, overdue fees, pending payroll, PTM follow-ups, and a 6-month I&E trend — on one screen, on login. The accountant sees the finance and payroll view only.

How it works

Built around how your school actually runs.

Each feature below includes a plain-language description for school management, and an optional technical detail for IT teams evaluating the implementation. Every screen shares one consistent design language — a teacher who learns attendance marking already knows where to look on the fees or exams screen.

Data Integrity

Fee payments automatically update the books

When a fee payment is recorded, the accounting ledger updates in the same action — no double-entry, no end-of-month reconciliation, no two systems that disagree with each other. The accountant has one correct number at all times.

FeePayment.save() triggers a post_save signal that
auto-creates a JournalEntry with two JournalLine rows:
  Dr Bank/Cash (payment_mode maps to Account FK)
  Cr Fee Income (FeeCategory maps to Account FK)

Entry is posted immediately. Linked via GenericForeignKey
→ ContentType → FeePayment for full audit traceability.
Reversal creates equal-and-opposite entry; original is never deleted.
Why this matters Your CA or auditor can pull the Income & Expenditure Statement at any point in the year and it will match the fee collection records exactly — no manual journal entries required.
Continuity

A student's history follows them through every year

Promotions, class changes, and transfers don't overwrite history. Every year's enrollment, attendance, marks, and fee records are preserved — the system can answer "what was Aarav's attendance in 4th standard" five years from now.

Student is permanent — never deleted, only status-updated.
Enrollment (student × academic_year × section) is the
per-year anchor. All attendance, marks, and fee invoices
FK to Enrollment, not directly to Student.

django-simple-history on Student, Enrollment, and
AdmissionApplication provides field-level change tracking
with who/when for every edit — audit trail from day one.
Practical example When a parent disputes an attendance record from two terms ago, you have the exact record — date, status, and which staff member marked it — in three clicks.
Migration

Move from paper and Excel without re-typing everything

The bulk import wizard generates a pre-filled Excel template from your current class list. Staff fill it in offline, upload it, and see a clear preview — green rows ready to import, red rows with plain-language explanations of what needs fixing — before anything is committed.

Template generated via openpyxl with built-in data
validation dropdowns (Class, Gender, Relationship) pulling
live from SchoolClass queryset — never stale.

Import is a two-phase operation: validate-all-rows-first,
then atomic commit of valid rows only. Each row's errors
are plain-language strings, never stack traces.

All created records tagged with ImportBatch FK —
full batch revert available until any record gains
dependent data (Attendance / Fees / Marks).
What this looks like in practice A data-entry person types your existing register into the template in 2–3 days. Upload once. All 300+ students appear in the system with their guardians, class assignments, and opening fee balances.
Accounting

Balance sheets and payslips your CA can actually use

The Income & Expenditure Statement and Balance Sheet are PDF-exportable, formatted to Indian accounting conventions (lakhs, I&E not P&L), and carry a clear disclaimer that they require CA certification before any official submission.

Full double-entry ledger: Account (CoA) →
JournalEntryJournalLine (Dr XOR Cr per line).
Balance enforced in JournalEntry.save()
unbalanced entries are rejected at the model layer.

Financial statements are computed on-demand from
JournalLine aggregations — never stored/snapshotted,
always reflect the current ledger state.

PDF generation via WeasyPrint from Django templates.
INR formatting uses Indian number grouping (1,00,000).
Tax readiness Every generated statement includes school name, reporting period, generation timestamp, and a CA certification disclaimer — ready to hand to your auditor without reformatting.
For IT Teams

A stack chosen for reliability, not trend.

Every technology in SchoolMIS has been chosen because it will still work correctly, be maintained, and be understood by any competent developer five years from now.

// Backend

  • Django 5 + Django REST Framework
  • PostgreSQL 15 with full relational integrity
  • django-simple-history for audit trails
  • Gunicorn WSGI server in production
  • pytest for automated test suite

// Frontend

  • Server-rendered Django templates
  • HTMX for interactive UI without a JS build step
  • No JavaScript framework, no npm, no webpack
  • Print-friendly CSS on all financial output
  • Mobile-first responsive layout

// Infrastructure

  • Self-hosted on a dedicated Linux VPS (India region)
  • nginx reverse proxy + Let's Encrypt TLS
  • Tailscale for secure remote administration
  • systemd service management with auto-restart
  • Nightly encrypted pg_dump + offsite backup

// Data & Security

  • Your data on your server — no shared cloud database
  • Role-based access via Django Groups + permissions
  • Sensitive data never exposed to wrong role in HTTP response
  • Atomic writes with 50-generation rolling backups
  • All transport encrypted TLS 1.2+ minimum
┌─────────────────────────────────────────────────────────────────────┐ │ SchoolMIS — System Architecture │ └─────────────────────────────────────────────────────────────────────┘ Browser / Mobile India VPS (Bangalore region) ──────────────── ────────────────────────────────────── Staff device ──── HTTPS ──► nginx [:443] │ ├──► Django app (gunicorn [:8000]) │ │ │ ├── Templates + HTMX (server-rendered) │ ├── REST API endpoints │ └── Signal handlers (auto-journal, SSE) │ │ │ └──► PostgreSQL [:5432] │ schoolmis_db │ Your admin device ─ Tailscale VPN ─► SSH / Django admin panel (Stockholm) Remote maintenance access Backup chain: pg_dump (nightly) ──► encrypted local ──► offsite S3 ──► Stockholm pull point-in-time WAL archiving for intra-day recovery
Access Control

Every staff member sees exactly what their role requires.

Access is enforced server-side. A teacher cannot see fee amounts even by inspecting browser source. A front-office staff member cannot approve payroll. Role boundaries are hard constraints, not UI-level hiding.

Server-side enforcement

Permissions checked in Django views, not in JavaScript. Sensitive data (fee amounts, payroll figures) is never sent to the browser for roles without access.

Full audit trail

Every edit to a student record, admission application, or enrollment is logged with who made it and when. Disputed changes have a verifiable answer.

Isolated by architecture, not just convention

Every record is scoped to your school at the database query level — a structural boundary, not a permissions checkbox that could be misconfigured. No third-party data handlers, ever.

Role permissions at a glance:

Action Principal Accountant Front Office Teacher
Student records & admissionsOwn class only
Mark attendanceOwn section only
View fee details & amountsFlag only, no amounts
Record fee payments
Manage payroll
View own payslip
Financial statements
Enter exam marksOwn section only
Bulk import dataFinancial data only
Send WhatsApp alertsOwn section only
Built to Grow

One school today. A school group tomorrow — same system.

SchoolMIS is architected as a multi-tenant system from the ground up. A single campus runs on the exact same backbone that would serve a network of schools under one management — no re-platforming, no data migration, no "we'll rebuild it properly later."

True data isolation, not a filter

Every query is automatically scoped to a school at the database layer. There is no code path — a form, a report, an admin screen — that can accidentally surface one school's students, fees or payroll to another.

Fails safe, never silent

If the system can't confirm which school a request belongs to, it stops and raises an error rather than guessing. A missing safeguard shows up immediately as a bug report, never as leaked data.

Independent configuration per school

Each school can enable or disable optional modules — payroll, accounting, timetable — on its own timeline, without affecting any other school sharing the platform.

For School Groups & Trusts

Central oversight without cross-contamination

A management trust running multiple schools gets one place to onboard a new campus, without any risk of one school's staff seeing another's records — even by accident, even under a shared login for a support visit.

Tenant context is resolved once per request/command and held in a
contextvars-scoped variable — the same mechanism this
codebase already trusted for audit-history tracking, extended to
data isolation. The default model manager is tenant-scoped
and fails closed: with no tenant context, a query raises
rather than silently returning unfiltered or empty results.

Verified with a dedicated isolation test suite — 24 scenarios
exercising cross-tenant access directly, plus a full sweep of
every object-fetch call site across every app confirming none
bypass the tenant-scoped manager.
What this means for you Starting with one school costs nothing extra. If a second campus or a sister school joins later, it's a new school record — not a new deployment, not a new contract renegotiation, not a rebuild.
Get started

Ready to see it running for your school?

A short conversation is enough to understand whether SchoolMIS fits your school's size, structure, and existing process. No obligation, no sales pitch.