← Back to portfolio
Schools in Guinea

FIINOR

A configurable multi-tenant school platform: Django/DRF backend, school PWA, public site and a fleet of appliance boxes. Roughly 228,000 lines of Python, 78,000 lines of TS/TSX and 199 test files.

Client type
Schools in Guinea
Scope
Django/DRF backend, school PWA, public site, fleet of appliance boxes
Volume
~228,000 lines of Python · ~78,000 lines of TS/TSX · 199 test files
Stack
Django 5.2, DRF, PostgreSQL, Redis, Celery, Channels/Daphne, Next.js 15/React 19, Serwist, S3/R2, JWT + TOTP, Prometheus/OpenTelemetry/Loki
FIINOR

Strict multi-tenancy

The client organisation is derived from the authenticated account and never from a header, with object-level permissions over a unit hierarchy (level → class) with inheritance and descending scope.

Fully configurable

Every institution configures its own categories, fee plans, scales, grading formula engine (a dedicated DSL with French aliases), hierarchical periods and aggregated report cards — with no hard-coded business lists anywhere.

Lifetime offline architecture

Running on an appliance box deployed at the client site: encrypted local replica, RS256-signed licence with a clock that survives power cuts, idempotent and resumable sync journal with Merkle acknowledgement. No secret lives on the client workstation, which always relays to the online backend. The workstation is locked in kiosk mode (no shell access, no system account for the end client).

Functional scope

Teaching, the full financial chain (plans → instalments → transactions → allocations), subscription and quota management by school size, media, notifications, referrals, an EdTech-style revision module (courses/quizzes/exams), and dedicated student / teacher / parent / finance / operations portals.

Full commercial lifecycle

Free trial, mobile payment through LengoPay/CinetPay, in-app renewal, licence lease with a grace period.

Django 5.2DRFPostgreSQLRedisCeleryChannels / DaphneNext.js 15React 19SerwistS3 / R2JWT + TOTPPrometheusOpenTelemetryLoki
FIINOR — diagramme / capture