Skip to main content

How I Built an Online Academy as a Solo Developer

March 17, 2026

</>

I built an online academy from scratch, by myself. No team, no funding, no course platform fees eating into revenue. Just me, a code editor, and a lot of caffeine. Here is the honest story of how it happened, what I got right, and what I would do differently.

The Motivation

I had been writing blog posts for a while and noticed a pattern. The posts that did best were the ones that taught something step by step. Readers wanted structured learning paths, not isolated articles. A blog post can explain a concept, but a course can take someone from zero to competent.

The existing platforms — Udemy, Coursera, Teachable — all had the same problem for me as a creator. They take a significant cut of revenue, control the student relationship, and your content lives on their platform. If they change their algorithm or pricing, you are at their mercy.

I wanted full ownership. My content, my platform, my students, my data.

The Tech Decisions

I was already building my blog with Next.js and MDX. The question was whether to build the academy on the same stack or use a dedicated platform.

I chose to build it myself with the same stack. Here is why:

Next.js App Router gave me server-side rendering, static generation, and a file-based routing system that mapped perfectly to a course structure. Each course is a directory. Each lesson is an MDX file. The file system is the CMS.

MDX was the obvious choice for course content. I write in Markdown with the ability to embed React components — interactive quizzes, code playgrounds, diagrams. No WYSIWYG editor, no database for content. Just files in a Git repo.

Firebase handles analytics and authentication. I do not need a complex backend. Firebase Auth gives me Google, Apple, and email sign-in with minimal code. Analytics tells me which courses people actually engage with.

Tailwind CSS for styling. I moved fast without writing custom CSS for every component. The utility-first approach fits a solo developer perfectly — less context switching, less naming things.

The entire course structure looks like this:

app/courses/posts/
  react-fundamentals/
    meta.json          # Course metadata
    01-introduction.mdx
    02-components.mdx
    03-state.mdx
    ...
  typescript-basics/
    meta.json
    01-getting-started.mdx
    ...

Each meta.json contains the course title, summary, tags, level (beginner/intermediate/advanced), and dates. The lessons are numbered MDX files that get sorted automatically. Adding a new lesson means creating a new file. Reordering means renaming files. Simple.

Design Philosophy

I made a deliberate design choice early: no rounded corners. Every element uses sharp edges — cards, buttons, inputs, modals. It gives the entire site a distinct, Microsoft-inspired aesthetic that stands out from the sea of rounded-everything designs that dominate the web.

The color system is intentional too. The brand color is a bold red (#E21B1B). Course levels use traffic-light colors: green for beginner, yellow for intermediate, red for advanced. When you hover over a course card, the border color reflects the course level. Small detail, but it communicates information through design.

Typography matters more than most developers think. I use Ubuntu as the primary sans-serif font for UI elements, Source Serif 4 for long-form prose (course content and blog posts), and JetBrains Mono for code blocks. Each font serves a purpose.

Dark mode was non-negotiable. I implemented it with a .dark class on the HTML element, persisted in localStorage, with a blocking script in the head to prevent the flash of wrong theme. The dark mode is not an afterthought — every color, every shadow, every border is designed for both modes.

The Certificate System

One feature that took more effort than expected was the certificate system. When a student completes all lessons in a course, they can generate a verifiable certificate.

The certificate is generated as an image using Next.js dynamic OG image generation. It includes the student's name, the course title, the completion date, and a unique verification code. Anyone can verify a certificate by visiting a URL with the verification code.

The progress tracking is localStorage-based. No backend needed. The student's browser tracks which lessons they have completed. It is not perfect — progress does not sync across devices — but it is simple, private, and works without requiring students to create accounts just to track their progress.

Content Creation Workflow

Writing courses is the hardest part, and it is not close. The code was the easy part.

My workflow for creating a new course:

  1. Outline first. I write the full lesson list before writing any content. Each lesson title is a promise to the student about what they will learn. If I cannot write a clear title, I do not understand the scope well enough.

  2. Write linearly. I write lessons in order, 1 through N. Each lesson builds on the previous. I resist the urge to jump around.

  3. Code examples are written and tested. Every code snippet in a lesson is code I have actually run. I keep a scratch project where I verify every example works.

  4. Quizzes after key concepts. I embed quizzes directly in the MDX using HTML comments with JSON payloads. They render as interactive multiple-choice questions. Quizzes are not afterthoughts — they reinforce the concepts that students are most likely to forget.

  5. Review after a 48-hour break. I never publish a course the day I finish writing it. Fresh eyes catch confusing explanations, missing context, and assumed knowledge.

A single course with 10-15 lessons takes me about two weeks of focused work. The writing is the bottleneck, not the platform.

Challenges I Faced

Content is a treadmill. Unlike a SaaS product where you build it once and maintain it, educational content needs constant updates. Frameworks release new versions. Best practices change. A course on React from 18 months ago might teach patterns that are now outdated. I spend a significant chunk of time updating existing courses, not just creating new ones.

SEO for courses is different from blog SEO. Blog posts rank for specific queries. Courses compete with established platforms that have massive domain authority. I found that my blog posts actually drive more traffic, and then I funnel readers to the courses. The blog is the acquisition channel; the courses are the product.

Scope creep is real. I started with the plan of "just put MDX files in a directory." Then I wanted progress tracking. Then certificates. Then course recommendations. Then category filters with search. Each feature felt small but added up. I had to learn to say "this is good enough for now" and ship.

Solo developer burnout. Wearing every hat — developer, designer, writer, marketer, support — is exhausting. I dealt with this by batching work. Writing weeks, coding weeks, marketing weeks. Trying to do everything every day leads to doing nothing well.

Lessons Learned

Start with one course, not ten. I launched with a small set of courses and watched what resonated. The data told me what to build next, not my assumptions.

The tech does not matter as much as the content. I could have built this on WordPress with a plugin and the outcome would be similar. What makes an academy valuable is the quality of the teaching, not the framework it is built on. That said, building it myself gave me complete control, and as a developer, that matters to me.

Progress tracking drives completion. The simple progress bar — showing percentage complete — dramatically increases course completion rates. People want to fill the bar. It is a small psychological nudge that works.

Make the first lesson free. Every course has its first lesson accessible without any barrier. Let people experience the teaching style before asking for anything. This was the single best decision for conversions.

Writing is a skill that improves with practice. My early courses were dense and assumed too much knowledge. Over time, I learned to explain things more clearly, use better examples, and anticipate where students would get confused. The only way to get better is to keep writing and listen to feedback.

Where It Stands Now

The academy has grown to cover web development, design, testing, marketing, and DevOps. Over 40 courses with hundreds of lessons. The blog and the academy feed each other — blog posts introduce concepts, courses go deep.

Building it as a solo developer was hard but rewarding. I own every line of code, every word of content, every pixel of design. When I want to change something, I change it. When I want to try a new idea, I ship it.

If you are thinking about building your own course platform, my advice is simple: start writing. The platform can be a static site with Markdown files. The content is what matters. Ship your first course, see if anyone cares, and iterate from there. You do not need permission from a platform. You just need something worth teaching.

Recommended Posts