There are roughly 250 million school-age children in sub-Saharan Africa. The continent adds more students each year than any other region on Earth. The teacher shortage is measured in millions -- UNESCO estimates a deficit of 15 million teachers by 2030. Private tutoring, where it exists, costs 5,000 to 25,000 FCFA per hour, well beyond the reach of most families.
And here is the part that most Silicon Valley edtech companies miss entirely: the curriculum is French. Not just the language -- the entire pedagogical structure. From CP (Cours Preparatoire, age 6) through Terminale (age 18), students across 23 African countries follow the French-system curriculum with its own grade levels, examination formats (CEPE, BEPC, BAC), and subject classifications. When an Ivorian student needs help with her "devoir de SVT pour la classe de 3eme," she does not need Khan Academy. She needs a tutor who understands what 3eme means, what SVT covers at that level, and who can explain it in French with references she recognizes.
This is the problem Deblo.ai was built to solve. Not a chatbot with a French translation layer. A purpose-built AI tutor that understands the African curriculum from the ground up, costs pennies per question, and works on the devices students actually have.
The Dual Product
Deblo is not one product. It is two, sharing a single backend.
Deblo K12 serves students from CP (age 6) to Terminale (age 18). It covers 15+ subjects: Mathematics, French, English, History-Geography, Sciences de la Vie et de la Terre, Physics-Chemistry, Philosophy, Computer Science, and more. It adapts its language, tone, and pedagogical approach based on the student's grade level. A CP student gets QCM (multiple choice) quizzes with mangoes and market analogies. A Terminale student gets Socratic questioning and formal demonstration techniques.
Deblo Pro serves African professionals -- chartered accountants, lawyers, auditors, tax consultants, HR managers, developers, and entrepreneurs. It understands SYSCOHADA (the accounting framework used across 17 African nations), OHADA business law, fiscal compliance, and audit procedures. It can generate Excel spreadsheets with accounting entries, draft legal memorandums as PDFs, execute code in a sandboxed terminal, search the web for current legislation, and send results via email or WhatsApp.
Both products are accessed through the same chat interface. The mode switch happens at conversation creation, and the system prompt, available tools, and credit costs all adapt accordingly.
The Credit System
We priced Deblo for Africa. Not for San Francisco. Not for Paris. For Abidjan, Dakar, Douala, Kinshasa.
The unit of currency inside Deblo is the credit. One credit equals approximately 5 FCFA -- about $0.008 USD. A text message costs 1 credit. A photo analysis costs 2 credits. A Pro request costs 3 credits. A voice call costs 5 credits per minute.
Every new user receives 200 welcome credits. Every day, every user gets 30 free credits -- enough for a student to ask 30 questions without paying anything. The daily refill resets at midnight, and the system checks on each request:
RECHARGE_OPTIONS = [
{"id": "r10", "credits": 20, "bonus": 0, "price_fcfa": 100},
{"id": "r50", "credits": 100, "bonus": 0, "price_fcfa": 500},
{"id": "r100", "credits": 200, "bonus": 10, "price_fcfa": 1000},
{"id": "r500", "credits": 1000, "bonus": 50, "price_fcfa": 5000},
{"id": "r1k", "credits": 2000, "bonus": 160, "price_fcfa": 10000},
{"id": "r5k", "credits": 10000, "bonus": 1000, "price_fcfa": 50000},
{"id": "r10k", "credits": 20000, "bonus": 2400, "price_fcfa": 100000},
{"id": "r20k", "credits": 40000, "bonus": 6000, "price_fcfa": 200000},
{"id": "r50k", "credits": 100000, "bonus": 20000, "price_fcfa": 500000},
{"id": "r100k", "credits": 200000, "bonus": 50000, "price_fcfa": 1000000},
]The smallest recharge is 100 FCFA (~$0.16 USD) for 20 credits. That is 20 questions answered by an AI tutor for the price of a sachet of water. The bonus tiers reward larger purchases -- the 10,000 FCFA package includes 2,160 credits, a 8% bonus.
The credit ledger is the single source of truth for all financial movements. Every credit event -- signup bonus, daily free refill, purchase, AI bonus reward, message deduction -- is logged as an immutable ledger entry with a direction, amount, running balance, event type, and optional reference:
class CreditLedger(Base):
"""Single source of truth for ALL credit movements."""
__tablename__ = "credit_ledger"id = Column(UUID(as_uuid=True), primary_key=True, default=uuid4) user_id = Column(UUID(as_uuid=True), ForeignKey("users.id"), nullable=False) direction = Column(String(6), nullable=False) # 'credit' | 'debit' amount = Column(Integer, nullable=False) # always positive balance_after = Column(Integer, nullable=True) event = Column(String(30), nullable=False) # signup_bonus, purchase, usage_text, etc. description = Column(String(255), nullable=False) reference_id = Column(UUID(as_uuid=True), nullable=True) conversation_id = Column(UUID(as_uuid=True), nullable=True) created_at = Column(DateTime(timezone=True), server_default=func.now()) ```
This design means we can reconstruct any user's credit history at any point in time. No "where did my credits go?" support tickets that we cannot answer. The ledger knows.
The Curriculum Structure
The French-system curriculum used across West and Central Africa follows a specific progression that Deblo must understand natively. This is not a lookup table -- it is core domain knowledge that shapes every system prompt, every grade-level adaptation, and every exam preparation flow.
Primaire (Primary):
CP - Cours Preparatoire (age 6-7)
CE1 - Cours Elementaire 1 (age 7-8)
CE2 - Cours Elementaire 2 (age 8-9)
CM1 - Cours Moyen 1 (age 9-10)
CM2 - Cours Moyen 2 (age 10-11)
--> Exam: CEPE (Certificat d'Etudes Primaires Elementaires)College (Middle School): 6eme - Sixieme (age 11-12) 5eme - Cinquieme (age 12-13) 4eme - Quatrieme (age 13-14) 3eme - Troisieme (age 14-15) --> Exam: BEPC (Brevet d'Etudes du Premier Cycle)
Lycee (High School): 2nde - Seconde (age 15-16) 1ere - Premiere (age 16-17) Tle - Terminale (age 17-18) --> Exam: BAC (Baccalaureat), Series: A (Litteraire), C (Mathematiques), D (Sciences) ```
Each grade level has a distinct class overlay in the system prompt. A CP student sees short sentences, concrete examples from daily Ivorian life, and interactive QCM quizzes. A Terminale student gets rigorous academic language, formal proofs, and exam-oriented methodology.
The examinations are equally specific. The CEPE at the end of CM2 is the gateway from primary to middle school. The BEPC at the end of 3eme determines admission to lycee. The BAC at the end of Terminale -- split into Series A (literary), C (mathematics), and D (sciences) -- determines university eligibility. Each exam has its own format, timing, and scoring conventions. Deblo understands all of them and can generate mock exams in the official format, complete with headers, time allocations, and point rubrics.
The Chat Streaming Protocol
When a student sends a message, Deblo does not return a JSON response. It opens a Server-Sent Events stream and sends tokens in real time. The student sees the AI "typing" -- words appearing as the LLM generates them. This is not a cosmetic choice. On African mobile networks where latency can exceed 500ms per round trip, waiting 10-15 seconds for a complete response feels like the app is frozen. Streaming gives immediate feedback: the AI is working, the response is coming.
The SSE stream carries more than text. It carries structured events: quiz widgets that render as tappable multiple-choice cards, file download links for generated PDFs and Excel spreadsheets, credit balance updates after deduction, and tool progress indicators showing what the AI is doing ("Searching the web...", "Generating your document..."). A single chat message can produce a dozen SSE events of different types, each handled by a dedicated frontend component.
event: content
data: {"text": "Pour resoudre cette equation du second degre, "}event: content data: {"text": "on utilise le discriminant $\\Delta = b^2 - 4ac$."}
event: tool_start data: {"name": "interactive_quiz", "id": "call_abc"}
event: quiz data: {"question": "Quel est le discriminant de $2x^2 + 3x - 5$ ?", "options": ["29", "49", "-31", "19"]}
event: credits data: {"free": 29, "recharge": 100, "total": 129}
event: done data: {"conversation_id": "uuid", "title": "Equation du second degre"} ```
The Tech Stack
Deblo is built on a straightforward modern stack, chosen for speed of development and operational simplicity:
- Frontend: SvelteKit 2 with Svelte 5 runes, TailwindCSS 4, 60+ components
- Backend: Python FastAPI with async SQLAlchemy, 100+ API endpoints across 18 route files
- Database: PostgreSQL 17 with JSONB for conversation messages, pgvector for embeddings
- Cache / Queue: Redis for SSE progress tracking, background job coordination, quiz state
- LLM: OpenRouter as the gateway -- DeepSeek V3 for text, GPT-4o Mini for vision, Claude for complex reasoning
- Mobile: Expo React Native monorepo with 4 shared packages
- Payments: 0fee.dev (our own payment gateway), Stripe, PaiementPro/XPaye for Orange Money, Wave, MTN MoMo, M-Pesa
The backend is a single FastAPI application with 18 route modules:
app.include_router(chat.router, prefix="/api", tags=["chat"])
app.include_router(auth.router, prefix="/api/auth", tags=["auth"])
app.include_router(credits.router, prefix="/api/credits", tags=["credits"])
app.include_router(curriculum.router, prefix="/api", tags=["curriculum"])
app.include_router(parent.router, prefix="/api/parent", tags=["parent"])
app.include_router(upload.router, prefix="/api/upload", tags=["upload"])
app.include_router(admin.router, prefix="/api/admin", tags=["admin"])
app.include_router(org.router, prefix="/api/org", tags=["org"])
app.include_router(projects.router, prefix="/api", tags=["projects"])
app.include_router(webhooks.router, prefix="/webhooks", tags=["webhooks"])
app.include_router(contact.router, prefix="/api", tags=["contact"])
app.include_router(voice.router, prefix="/api", tags=["voice"])
app.include_router(pay.router, prefix="/api/pay", tags=["pay"])
app.include_router(tasks.router, prefix="/api/tasks", tags=["tasks"])
app.include_router(referral.router, prefix="/api/referral", tags=["referral"])
app.include_router(notifications.router, prefix="/api/notifications", tags=["notifications"])
app.include_router(suggestions.router, prefix="/api/suggestions", tags=["suggestions"])
app.include_router(stats.router, prefix="/api/stats", tags=["stats"])Each router owns its domain completely. The chat router handles conversation CRUD, message streaming, and the agentic tool loop. The auth router manages WhatsApp OTP, Google OAuth, access codes, and JWT issuance. The credits router handles balance queries, recharge package listing, and purchase initiation.
Six Countries, Thirteen Currencies
Deblo currently supports 6 countries: Cote d'Ivoire, Senegal, Cameroon, Democratic Republic of Congo, Gabon, and Burkina Faso. Each country has its own currency, payment methods, and mobile money providers.
Prices are stored in FCFA (the CFA Franc used in the UEMOA and CEMAC zones) and converted to local currency at display time. For countries outside the CFA zone -- like the DRC with its Congolese Franc -- we maintain real-time exchange rates.
The payment flow is deliberately simple. A student taps a recharge package, chooses their payment method (Orange Money, Wave, MTN MoMo, or card via Stripe), completes the transaction on their phone, and credits appear in their balance within seconds. The payment poller runs as a background service, checking pending transactions and crediting users as soon as confirmation arrives.
Built From Abidjan in 100+ Sessions
Deblo.ai was built entirely by two people: Thales, the CEO of ZeroSuite, working from Abidjan, Cote d'Ivoire, and Claude, the AI CTO. No human engineers. No outsourcing. No "we used AI to help." The AI wrote the code. All of it.
The build happened across 100+ pair-programming sessions, each documented with a session log. The first session on February 14, 2026, scaffolded the initial SvelteKit frontend and FastAPI backend. By session 67 -- twelve days later -- we deployed to production. By session 90, we had a React Native mobile app. By session 100, we had 24 AI tools, 101+ professional advisors, voice calls, background generation jobs, and a referral system.
The pace was only possible because of a simple loop: Thales defines what to build, Claude builds it, Thales tests it on real devices, and the next session begins. No standups. No sprint planning. No Jira tickets. Just a conversation, a codebase, and a shared understanding of what African students and professionals actually need.
Why This Matters
The pitch for AI tutoring in developed countries is convenience. "Your child can get help at 11 PM." That is nice. It is not urgent.
In Africa, the pitch is access. There are classrooms with 80 students and one teacher. There are entire regions where the nearest qualified math teacher is a two-hour drive away. There are parents who work two jobs and cannot afford a tutor for 10,000 FCFA per hour, but could afford 100 FCFA per week.
Deblo does not replace teachers. It gives students a patient, always-available study companion that speaks their language, understands their curriculum, and costs less than a phone call. That is the bet. And at 5 FCFA per question, it is a bet that can scale to 250 million.
---
This is Part 1 of a 12-part series on building Deblo.ai.
1. AI Tutoring for 250 Million African Students (you are here) 2. 100 Sessions Later: The Architecture of an AI Education Platform 3. The Agentic Loop: 24 AI Tools in a Single Chat 4. System Prompts That Teach: Anti-Cheating, Socratic Method, and Grade-Level Adaptation 5. WhatsApp OTP and the African Authentication Problem 6. Credits, FCFA, and 6 African Payment Gateways 7. SSE Streaming: Real-Time AI Responses in SvelteKit 8. Voice Calls With AI: Ultravox, LiveKit, and WebRTC 9. Building a React Native K12 App in 7 Days 10. 101 AI Advisors: Professional Intelligence for Africa 11. Background Jobs: When AI Takes 30 Minutes to Think 12. From Abidjan to 250 Million: The Deblo.ai Story