Michael Ouroumis logoichael Ouroumis

What I Learned Running a Free Education Platform

Developer workspace with analytics dashboard, course content, and code editor representing the daily work of running an education platform

I've written about why I built FreeAcademy and how it scaled to 171 countries. But I haven't talked much about the messy middle — the daily reality of actually running a free education platform.

After a year of building, writing, debugging, and shipping, here's what I've actually learned.

Why I Built It

The short version: I was tired of paywalled education. Every good course seemed to cost $99–$299. Documentation was free but scattered. YouTube had tutorials but no structure.

I wanted something in between — structured courses with interactive playgrounds, completely free. No premium tiers, no upsells, no "unlock the next module for $49."

FreeAcademy.ai now has 110+ courses across programming, AI, data science, and business. Over 170 countries have used it. But getting here taught me things I never expected.

Tech Decisions That Mattered

What Paid Off

Next.js + Static Generation was the single best decision. Course content rarely changes, so generating it at build time means pages load instantly worldwide. No server costs per request. No database queries for content reads. When a student in Lagos opens an SQL course, they get the same speed as someone in London.

Supabase for auth and progress tracking gave me a production-ready PostgreSQL database with Row-Level Security, auth, and storage — all on the free tier. It handles user progress, streaks, badges, certificates, and exam results without me managing any infrastructure.

MDX for course content lets me write courses in Markdown with embedded React components. A code example in a lesson isn't a screenshot — it's a live, runnable playground. Students can modify the code and see results immediately.

Browser-based code playgrounds using sql.js, Pyodide, and sandboxed JavaScript were worth every hour of development. No server-side execution means no security nightmares, no compute costs, and no cold starts. A student can run SQL queries, write Python, or execute JavaScript entirely in their browser.

What I'd Change

Starting with only MDX content was a bottleneck. Every course update required a code commit and redeploy. I eventually built a hybrid system — an admin panel that stores courses in Supabase alongside the MDX courses in the filesystem. If I started over, I'd build the database-backed content system from day one.

Underestimating search was a mistake. I added Fuse.js for client-side search after students started requesting it. It works, but building search into the content model earlier would have been smarter.

Content Strategy

How I Decide What to Build

I use a simple pipeline:

  1. GitHub Issues as a backlog — every course idea becomes an issue. I label them by category, difficulty, and estimated time.
  2. Analytics-driven prioritization — I check which topics people search for, which pages have high bounce rates, and which courses get completed vs. abandoned.
  3. Trend awareness — when ChatGPT exploded, I built a Prompt Engineering course. When agents became the next wave, I added Agentic AI with Python.

The Content Assembly Line

I've built scripts that help automate parts of the content pipeline — generating course scaffolding, validating MDX compilation, checking for broken links, and ensuring quiz questions are properly formatted. The admin panel handles database-backed courses with live preview, autosave, and draft/publish workflows.

But the actual writing? That's still manual. I've found that AI-assisted drafting can help with structure, but the explanations need a human touch — especially when you're trying to teach a concept to someone who's never seen it before.

Growth and SEO Lessons

What Actually Drove Traffic

Long-tail keywords crushed it. Broad terms like "learn JavaScript" are impossible to rank for. But "interactive SQL playground free" and "learn prompt engineering for Claude" brought in steady organic traffic.

Structured data matters. Adding FAQ schema, course schema, and breadcrumb markup to course pages meaningfully improved click-through rates from search results.

Content depth beats content breadth. My best-performing courses aren't the ones with the most topics — they're the ones with the most thorough explanations and working code examples. The SQL Practice course with 25+ interactive lessons outperforms courses with twice the topic count.

What Surprised Me

Most of my traffic comes from countries I didn't initially target. India, Nigeria, the Philippines, Brazil, Egypt — places where free education isn't a nice-to-have, it's essential. That changed how I think about content. I now prioritize clarity over cleverness and avoid cultural assumptions.

Another surprise: blog posts drive more course enrollments than social media. A well-written post on FreeAcademy's blog that solves a specific problem naturally leads readers into related courses.

The Hardest Parts

Scaling Content Alone

110+ courses sound impressive until you realize each one needs to be written, structured, tested, and maintained by one person. Typos slip through. Code examples break when dependencies update. Quiz questions need revision when students flag ambiguity.

The admin panel I built for database-backed courses helps non-developers contribute, but the quality bar means I still review everything.

Quality vs. Quantity

There's constant pressure to ship more courses. More content means more SEO surface area, more reasons for students to return, more topics covered. But a mediocre course is worse than no course — it erodes trust.

I've learned to ship fewer, better courses rather than rushing to fill every category. A TypeScript Fundamentals course with 30+ well-structured lessons is worth more than five shallow courses.

Feature Development vs. Content Creation

Every hour spent building a new platform feature is an hour not spent writing content. Every hour writing content is an hour not spent improving the platform. This tension never goes away.

My rough split: 70% content, 30% features. Features compound (a better playground benefits every course), but content is what students come for.

The Cost of Free

Infrastructure

The actual hosting costs are surprisingly low:

  • Vercel for hosting — the free tier covers most of it thanks to static generation
  • Supabase for database — the free tier handles the current load
  • Domain and DNS — standard annual costs
  • Total: roughly $50/month at current scale

Static generation is the key. When 90% of your pages are pre-rendered HTML, you're not paying for compute on every request.

The Real Cost: Time

Infrastructure is cheap. My time isn't. Writing a comprehensive course takes 40–80 hours. Maintaining existing courses takes another 10+ hours monthly. Building and improving the platform is essentially a second job.

I keep it sustainable by treating it as a long-term investment rather than a sprint. Some weeks I ship a full course. Other weeks I fix three typos and update a dependency. Both matter.

How I Keep It Free

No ads. No premium tiers. No data selling. So how does it work?

FreeAcademy is part of a broader portfolio. It demonstrates what I can build, drives traffic to my other projects, and — honestly — it's fulfilling. The emails from students who landed their first developer job after completing courses are worth more than any subscription revenue.

What's Next

FreeAcademy is heading toward:

  • More interactive content — expanding the code playground to support more languages and more guided exercises
  • Community features — comments, discussions, and peer learning
  • Certificate improvements — making completion certificates more verifiable and shareable
  • AI-assisted learning — using AI to provide personalized hints and explanations within courses

Advice for Builders

If you're thinking about starting a similar project:

  1. Start with content, not features. The fanciest platform means nothing without courses people want to take.
  2. Pick a boring stack. Next.js, PostgreSQL, and Markdown will outperform any trendy framework when you need to ship content at 2 AM.
  3. Make it work offline-first. Browser-based execution means your students don't need fast internet or powerful machines.
  4. Measure everything. Analytics tell you what your students actually need, not what you think they need.
  5. Ship before you're ready. My first course had formatting issues and a broken quiz. Students still completed it and asked for more.

Building in public means showing the reality — not just the launch day screenshot, but the Tuesday night debugging session and the spreadsheet tracking which courses need updating.

If you want to see the result of all these lessons, check out FreeAcademy.ai. And if you're building something similar, reach out — I'm happy to share what I've learned.

Enjoyed this post? Share: