OpenPath
A multi-tenant learning platform for grassroots education nonprofits. Each org gets its own isolated workspace: courses, files, assessments, messaging, and roles. Free.
Real programs, nowhere to host them.
Small education nonprofits run genuine curricula, cohorts, and assessments. Commercial LMS platforms price them out. Others assume a full-time administrator to configure them. The original build ran on a single Flask app. This app could not cleanly separate one organization's data from another's. Onboarding a new org became a risky, manual process.
The goal: one platform where a new nonprofit gets a fully isolated workspace in minutes, at no cost, without a dedicated admin.
One app, tenant-scoped from the database up.
Every request resolves to a tenant. Every query stays scoped to the same tenant. Prisma models carry a tenant key. Role-based access control gates every action. The Next.js app renders the right workspace per organization from one deployment.
+ RBAC middleware
Every path from request to row carries the tenant. The system enforces isolation. Isolation is not assumed.
Flask to a typed, tenant-safe stack, with zero data loss.
The rewrite moved OpenPath from Flask onto Next.js, TypeScript, Prisma, and PostgreSQL. The framework change was the easy part. The hard part: moving live nonprofit data across without dropping a single record or breaking a tenant boundary.
Illustrative excerpt of the tenant-scoping pattern. See the repo for the real implementation.
Tenant key on every model. A scoped client makes cross-tenant reads structurally impossible.
Role-based permissions per workspace. Admins, instructors, and learners see only what they should.
Encrypted credential storage keeps each org's integrations private and separate.
Twenty-plus orgs, one platform.
Running in production for StuImpact partners.