Yeko is a multi-tenant EdTech platform designed to modernize school management in French-speaking Africa. It provides a comprehensive ecosystem for schools, teachers, students, and parents, focusing on "Confiance Absolue" (Absolute Trust) through robust architecture and rigorous security.
This project is a TypeScript monorepo managed with pnpm 10.x, deploying primarily to Cloudflare Workers.
| App | Description | tech Stack |
|---|---|---|
yeko-core |
Platform-wide Admin Dashboard (Catalogs, Programs, School Mgmt) | TanStack Start, Better Auth (core) |
yeko-school |
School Management Hub (Enrollment, Billing, Classes) | TanStack Start, Better Auth (school) |
yeko-teacher |
Teacher PWA (Attendance, Grades, Messaging) | TanStack Start, PGlite (Offline drafts) |
data-service |
Shared Hono API & Data Processing Service | Hono, @repo/data-ops |
@repo/data-ops: Centralized data layer (Drizzle ORM, Neon PostgreSQL, Better Auth schemas).@workspace/ui: Shared component library built on Tailwind CSS v4 and shadcn/ui.@repo/logger: Structured logging system based on LogTape.@repo/queue-worker: Background job processing via Cloudflare Queues.@workspace/typescript-config: Standardized TS configurations.
- Frontend: React 19, TanStack Start (SSR), TanStack Router (File-based), Tailwind CSS v4, Motion.
- Database: PostgreSQL on Neon (Serverless), Drizzle ORM.
- Authentication: Better Auth with per-app cookie isolation.
- Validation: Zod (Strict input sanitation).
- Error Handling:
@praha/byethrow(Result monad pattern — No-Throw Policy). - Offline Support: PGlite for local-first draft persistence in the Teacher app.
- Payments: Polar.sh integration.
- i18n:
typesafe-i18n(Core/Teacher) andi18next(School) — French (Primary), English (Secondary).
- pnpm
10.28.2or later. - Docker & Docker Compose (Highly recommended).
- Wrangler CLI (for Cloudflare deployment).
Start the entire ecosystem with hot-reload:
# Spin up all services
make docker-up
# Access points:
# - Core: http://localhost:3000
# - School: http://localhost:3001
# - Teacher: http://localhost:3002
# - Service: http://localhost:8787If you prefer running outside Docker:
# 1. Initialize dependencies and build shared packages
pnpm run setup
# 2. Start specific applications
pnpm dev:yeko-core
pnpm dev:yeko-school
pnpm dev:yeko-teacherEvery school-scoped database query MUST include tenant filtering. Cross-tenant data leakage is treated as a critical security defect.
where(eq(table.schoolId, ctx.schoolId))We never throw raw exceptions in the data layer. Every async operation returns a ResultAsync.
const result = await getStudents(schoolId);
if (R.isFailure(result)) return handleError(result.error);All UI strings must be localized. Hardcoded French or English strings in JSX are prohibited.
Deployments are handled via Cloudflare Workers:
pnpm deploy:yeko-core
pnpm deploy:yeko-school
pnpm deploy:yeko-teacher
pnpm deploy:data-serviceThis project is licensed under the ISC License. See the LICENSE file for details.
