A full-stack school-management application for the Frappe framework.
Admissions · Enrollment · Fees · Attendance · Assessments · Parent Engagement
Edu Quality manages the full lifecycle of a K–12 institution — from a prospective family's first enquiry, through admission, enrollment, fee collection, daily attendance and assessments, all the way to exit and alumni. It is built on the Frappe framework (Python + MariaDB) and ships with three purpose-built React single-page apps for staff, teachers and parents.
- Lead capture and enquiry funnel, web forms for student and job applications
- Application → approval → enrollment workflow with academic-year rollover
- Division creation and shuffle tools, student groups, houses and batches
- ID cards, birthday cards, bonafide certificates and welcome-kit distribution
- Google Workspace account provisioning for students (optional)
- Fee structures, categories, schedules and multi-company splits
- Payment plans and installments, advances, security deposits
- Discounts — referral, payment-plan and time-based — with approval flows
- Online payment via pluggable gateways (payment-request driven)
- Receipts, refunds, and defaulter / collection reporting
- OTP-gated "rules & regulations" undertakings
- Timetables, working-day calendars and daily attendance entry
- Assessments, observations, marks-entry tools and descriptive reports
- CMAP (curriculum mapping) authoring, tracking and print
- PTM (parent-teacher meeting) scheduling with Google Meet links
- SMS-based OTP login and notifications (pluggable gateway)
- WhatsApp and email templates for reminders and updates
- Google Workspace (Admin SDK, Calendar, Drive, Meet) via a service account
Edu Quality is a Frappe app (Python backend + MariaDB) with three independent
Vite/React front-ends served through Frappe's website routing. Each front-end
builds into edu_quality/public/ and is exposed at its own route.
| Front-end | Route | Audience | Stack |
|---|---|---|---|
walsh/ |
/walsh/ |
Admin / management portal | Refine + Mantine + React Query |
ui/ |
/ui/ |
Teachers, principals, students | React + shadcn/ui + Tailwind + TanStack Query |
cmap_mgr/ |
/cmap-tool/ |
CMAP scheduling tool | React + Vite |
The backend is organized into three Frappe modules — Edu Quality (core:
schools, students, assessments, CMAP, PTM), Fees, and Attendance —
plus shared api/, common/, overrides/ and public/py/ helpers.
Requires an existing Frappe bench (v15).
# from your bench directory
bench get-app https://github.com/UnityAppSuite/edu_quality.git
bench --site <site-name> install-app edu_quality
bench --site <site-name> migrateBuild the front-ends (each is a standalone Vite app that outputs to
edu_quality/public/):
cd walsh && yarn install && yarn build # admin portal
cd ui && yarn install && yarn build # teacher / student dashboard
cd cmap_mgr && yarn install && yarn build # CMAP scheduling toolThird-party credentials are read from the site's site_config.json — never
commit real values. Set them with bench set-config or by editing the file:
{
"sms_api_key": "<sms gateway key>",
"sms_sender": "<sender id>",
"sms_app_name": "<name shown in OTP messages>",
"sms_login_template_id": "<dlt template id>",
"sms_update_child_template_id": "<dlt template id>",
"easebuzz_webhook_secret": "<shared secret for settlement webhook>",
"magic_link_ttl_days": 30
}The remaining integrations are configured through Settings DocTypes in the Frappe desk:
| Setting | Where | Purpose |
|---|---|---|
| Email domain for generated accounts | MGR Settings → email_domain |
Student/guardian email addresses |
| Legacy LMS/MGR endpoint (optional) | MGR Settings → url |
External LMS sync (skipped if unset) |
| Refund account | Fees Settings → refund_paid_from_account |
Deposit-refund payment entries |
| Google Workspace | Google Service Account | Domain, service-account JSON, impersonation user |
| Payment gateway | Payment Gateway / Payment Mapping | Online fee collection |
# install the git hooks (ruff, ruff-format, prettier, eslint)
pre-commit install
# run all quality checks locally
pre-commit run --all-files
# front-end dev servers (proxy /api to the Frappe backend)
cd walsh && yarn dev --host
cd ui && yarn devTooling and conventions:
- Python — formatted and linted with ruff
(config in
pyproject.toml); tabs, double quotes, Frappe idioms. - Front-end — prettier + eslint per app.
- Packaging — modern flit-based
pyproject.toml; the app version lives inedu_quality/__init__.py. - Logging — use
frappe.log_error(title=..., message=frappe.get_traceback())(neverfrappe.logger()), with a static, descriptive title.
Run the test suite:
bench --site <site-name> run-tests --app edu_qualityedu_quality/
├── edu_quality/ # core module: schools, students, assessments, CMAP, PTM
│ ├── api/ # REST endpoints (@frappe.whitelist)
│ ├── common/utils/ # shared helpers, incl. access-control (access.py)
│ ├── fees/ # Fees module
│ ├── attendance/ # Attendance module
│ ├── overrides/ # override classes for standard Frappe/ERPNext doctypes
│ ├── public/{py,js}/ # backend helpers + desk client scripts
│ ├── templates/ # print formats, PDFs, jinja includes
│ └── hooks.py # doc events, scheduled tasks, overrides
├── walsh/ ui/ cmap_mgr/ # React single-page apps
└── pyproject.toml # packaging + ruff config
- Create a feature branch off the default branch.
- Ensure
pre-commit run --all-filespasses. - Use conventional-commit messages
(
feat:,fix:,perf:,refactor:,chore:,ci:, …). - Open a pull request describing the change and its rationale.
Edu Quality is licensed under the GNU Affero General Public License v3.0. In short: you are free to use, study, modify and distribute it, and any modified version you run as a network service must make its source available under the same license.