Whitepaper · Education Access Programmes, Africa Region
How a single Android phone, a local WiFi hotspot, and no internet connection can deliver a full learning management system to a classroom.
Kul turns a single Android phone into a self-contained classroom server. It broadcasts its own WiFi hotspot, runs a full learning platform locally, and requires no mobile data, no ISP, and no external server - connectivity is something Kul catches up on later, not something it depends on to run.
For communities where the nearest reliable internet connection is a bus ride away, most EdTech is unusable by design: it assumes a live connection to a cloud service. Kul inverts that assumption. Course content, quizzes, learning records, and user accounts all live on the device itself, in an embedded database. When the box does get connectivity - at a district office, over a staff member's phone hotspot, during a supply run - it syncs new content down and learning data up, then goes fully offline again.
This paper documents what Kul currently does, drawn directly from its production codebase, and proposes it as a candidate for a pilot in low-connectivity school settings across Africa.
Across much of rural and peri-urban Africa, the binding constraint on digital learning is not devices or willingness - it is the network. Grid power is intermittent, fibre and 4G coverage thin out sharply outside major towns, and the recurring data cost of a cloud-hosted platform is often the line item that kills a program after the pilot year ends. Most learning platforms treat connectivity as a given and offline mode as an afterthought - a cached page, a "sync when you're back online" banner. That model breaks down completely in a setting where "back online" might mean once a week.
The practical requirement is different: software that is fully functional with zero connectivity, that treats an internet connection as an occasional, opportunistic event rather than a dependency - and that fits on hardware already common in these regions, an Android phone, rather than requiring a server room, a satellite link, or a subscription.
One phone is the classroom's entire server. Everything a learner's device needs is served over a WiFi network the phone itself creates.
The box runs a standard web server and database on the phone itself: an embedded Postgres instance (no external database to install or maintain), a session-based login system that verifies credentials against that local database rather than calling out to an identity provider, and a content library stored on disk. Learner devices connect to the phone's hotspot exactly as they would to a home WiFi router, open a browser, and are on the platform - no app installation, no SIM, no data plan.
When the box is provisioned with connectivity - for initial setup, or a periodic refresh - it pulls new or updated course content from a central content system and pushes accumulated usage and learning-record data back up. The rest of the time, that link simply doesn't exist, and nothing in the classroom experience depends on it.
The interface itself keeps this state visible rather than implicit: a persistent indicator shows whether the box currently has an internet path or not, so a tutor never has to guess why a sync hasn't happened - offline is a normal, expected state, not an error condition the UI tries to hide.
Ten capabilities, each already implemented and running in the product today.
The box provisions its own WiFi access point, DNS, and HTTPS-terminating web server on-device. Any phone, tablet, or laptop in range can reach the platform with no internet path required.
Structured courses with lesson content and quiz/activity flows are served from local storage, with progress tracked down to the individual item - not just per course - so a lesson plan, a slide deck, and a spreadsheet exercise inside the same module each carry their own completion state. Content can be a platform's own material or an established third-party curriculum - a running deployment today serves a Computer Science course adapted from the Raspberry Pi Foundation's Teach Computing scheme, mapped to local grade and term structures.
Worksheets, slide decks, and spreadsheet exercises open and page directly inside the browser - real editable-format spreadsheets render as an interactive grid, PDFs as a paginated viewer - with no Excel, Word, or PDF reader installed on the learner's device.
Video and audio lessons play through the browser's own player - no codec pack, no external app - and richer material ships as a self-contained HTML5 package (multi-page lessons, embedded quizzes, its own navigation) rendered the same way as every other content item. Every format carries its own completion and progress tracking, captured locally from the first watch or listen.
A tutor pairs their device with the classroom over a QR code and can drive navigation, lesson progression, and quiz start/stop across every connected learner screen in real time - one teacher, one synchronized lesson, no shared screen or projector required.
Learner activity is captured as xAPI statements against a local Learning Record Store running on the box itself, so learning analytics are gathered offline from day one and are portable to any xAPI-compatible reporting system once synced.
Four built-in roles - admin, content creator, tutor, learner - govern who can manage courses, view reports, or administer the box, enforced identically on the server and in the interface.
Curriculum is authored once in a central content system and packaged down to every box during a sync window - one authoring workflow, any number of offline classrooms.
Administrators and tutors get usage and progress charts rendered directly on the box, so a program officer can read outcomes on a visit without waiting for data to reach a central server.
Branding - name, logo, tagline, colour - is a configuration file, not a code change, so the same platform can be relabeled per country office, programme, or implementing partner. Confirmed on a live deployment, which runs under a partner programme's own logo alongside the platform's own mark, with no visible trace of a shared underlying codebase.
"Offline support" means different things across the EdTech landscape. Most products offer one piece of what Kul does as a single, integrated system.
Offline-capable learning tools generally fall into one of three patterns:
None of these combine a phone-hosted classroom hotspot, a local LRS that both generates and stores xAPI statements from day one, and native rendering of working documents - with a single teacher device able to drive every connected screen through a synchronized lesson. That combination is what Kul is built around, and it's the basis for the comparison below.
| Capability | Kul | Single-device offline LMS apps | Kolibri | Kio Kit |
|---|---|---|---|---|
| Own WiFi hotspot, zero external setup | Yes | - | Partial (needs a server device configured) | Yes |
| Local LRS generates & stores xAPI from usage | Yes | Cloud LRS, post-sync | Content-package import only | - |
| Native in-browser spreadsheet / PDF viewer | Yes | - | - | Depends on bundled app |
| One teacher device drives every learner screen | Yes | - | - | - |
| Fleet analytics without a cloud round-trip | Yes | - | Partial | - |
Comparison compiled from public product documentation as of August 2026; vendors' offline and analytics capabilities evolve, and this should be treated as directional rather than exhaustive.
Three capabilities now in active development, extending the same on-box architecture described above.
Purpose-built views per role - a fleet-level rollup for administrators, a live classroom view for tutors, a content-performance view for authors - built on the same on-device learning-record data already being captured today.
A dedicated console for box configuration, user and content management, and device health, building on the existing admin role rather than replacing it.
A companion phone with an internet connection pairs with the box over the local network and pushes software and content updates to it automatically - removing the manual cable-and-laptop step currently needed to refresh a box in the field.
Working with children's data in a low-resource setting raises the bar on data handling, not lowers it - and Kul's offline-first architecture happens to align with that bar rather than fight it.
Accounts, sessions, course content, and learning records live in an embedded database on the phone. Nothing is sent to a third-party cloud unless and until the box is deliberately synced - there is no background telemetry call a field team needs to trust or audit, because for most of a box's operating life there is no network path for one to travel on.
Login uses signed, locally-verified sessions rather than a call out to a remote auth provider, so authentication keeps working indefinitely without connectivity - a school does not lose the ability to log learners in because the nearest tower is down.
Rather than a bespoke event schema, learning activity is recorded as xAPI statements against a local Learning Record Store. xAPI is a widely adopted interoperability standard for learning data - records captured on a Kul box in one region are structurally compatible with any downstream xAPI-consuming reporting or research system, which matters for a programme that needs to aggregate outcomes across many independently offline sites.
The on-box web server terminates TLS locally and applies a restrictive content-security policy out of the box, rather than relying on network-level protections that don't exist on an offline LAN.
Four roles map directly onto how a school programme is actually staffed - from a single national administrator down to the learner in front of the device.
| Role | Can manage box & users | Can author content | Can view reports | Typical person |
|---|---|---|---|---|
| Admin | Yes | Yes | Yes | Programme / box administrator |
| Content creator | - | Yes | - | Curriculum author |
| Tutor | - | - | Yes | Classroom facilitator |
| Learner | - | - | - | Student (default role on sign-up) |
A Kul box is one Android phone. Setup provisions the hotspot, local DNS, web server, and database directly on the device, with a scripted backup-and-restore path for cloning a working box's configuration and content onto replacement hardware - a practical necessity when the nearest repair shop is a day's travel away.
Kul's architecture was not built to satisfy a checklist - but the constraints that shaped it are the same ones that shape connectivity-limited education programming.
Because the platform's baseline requirement is a phone and a room, not a network subscription, it is deployable in exactly the settings - rural, off-grid, low-connectivity - where commercial EdTech is least viable, without a separate "offline edition" or feature downgrade.
Standards-based xAPI capture means learning activity is measurable from the first offline session, not only once a site comes online - closing the data gap that usually makes the hardest-to-reach classrooms also the hardest to evaluate.
Local-first storage and locally-verified authentication minimise the data that ever needs to leave a device, and give an implementing partner a concrete, auditable answer to where a child's data lives at any point in time.
Marginal cost per classroom is one phone, not a server or a recurring cloud bill - a cost profile that scales with programme size in a way infrastructure-heavy platforms do not.
Role-based administration and white-label branding mean a country office or implementing partner can run and present the platform as its own, with a permission structure that supports training local staff into the admin and content-creator roles rather than depending on outside operators.
A focused, low-risk way to evaluate Kul against real classroom conditions before any wider commitment.
3–5 schools spanning the connectivity and power conditions the wider programme actually faces - including at least one fully off-grid site.
Load an initial course set relevant to the programme's subject focus and grade band; train a local admin and a small number of tutors on the four-role model.
No special handling - the pilot succeeds or fails on the same power, staffing, and connectivity conditions as a real deployment.
Use the xAPI records already gathered on-device - completion, quiz performance, time-on-task - as the evaluation basis, synced up at the end of the term rather than requiring live connectivity throughout.
Use pilot data and facilitator feedback to size a wider rollout, and to prioritise which of the roadmap items in the appendix matter most for the next phase.
| Layer | Technology | Notes |
|---|---|---|
| Host device | Android phone, via Termux | No dedicated server hardware |
| Networking | On-device hotspot + local DNS | hostapd / dnsmasq, self-provisioned |
| Web / TLS | nginx reverse proxy | Local certificate, HTTPS on the LAN |
| Application server | Express (Node.js) | Plain JavaScript, no build step |
| Database | Embedded Postgres (PGlite) + Drizzle ORM | No external DB server to install |
| Auth & RBAC | Better Auth, 4-role access control | Locally-verified sessions |
| Client | SvelteKit 5 SPA, installable PWA | Client-rendered, works fully offline |
| Classroom control | WebRTC (PeerJS), QR pairing | Teacher device drives learner devices over LAN |
| Learning records | xAPI statements → local LRS | Standards-based, sync-ready |
| Content sync | Directus CMS integration | Runs only when connectivity is available |
| Format | Engine | Notes |
|---|---|---|
| PDF.js, self-hosted | Paginated in-browser viewer, no external reader | |
| Spreadsheet | SheetJS, self-hosted | Renders real .xlsx as a searchable, sortable grid |
| Video | Native HTML5 <video> | .mp4, own xAPI progress handler |
| Audio | Native HTML5 <audio> | .mp3, own xAPI progress handler |
| Interactive / HTML5 | Self-contained package in a same-origin iframe | Multi-page lessons, embedded quizzes, own navigation and progress |
| Images | - | No dedicated gallery/lightbox component today |
| Word / PowerPoint | - | Not rendered natively - converted to PDF at authoring time |
| SCORM / H5P | - | No package player currently wired up |
Every viewer above is vendored and served same-origin - no CDN, no external asset - consistent with running with zero connectivity. Formats marked " - " are gaps today, not claims.
xAPI (Experience API): an open standard for recording learning activity as portable, structured statements, independent of the platform that generated them.
LRS (Learning Record Store): the database that stores xAPI statements - here, running locally on the box rather than in the cloud.
RBAC (Role-Based Access Control): restricting what a user can do based on an assigned role rather than per-user configuration.
White-label: the ability to rebrand a platform's name, logo, and visual identity per deployment without changing its code.