How we generate courses without losing quality
AI-generated syllabi are a starting point, not a finished product. Every course on StackGrasp passes through a human-verification and moderation queue before it's publishable, checking structure, accuracy, and disclosure of sponsorship or AI authorship. The catalog today is intentionally small and growing rather than large and thin — every course in it is real, not a placeholder — and this pipeline is the actual mechanism that lets it keep scaling without turning into a pile of unreviewed AI output.
Splitting the work across two models, on purpose
Course content generation doesn't route every request to one model. Structured, long-form planning content — full syllabus generation, career roadmaps — goes to Claude, which handles that kind of multi-section, internally-consistent document generation well. The interactive, low-latency surfaces — live concept explanation, the real-time AI Tutor chat — go to GPT instead, chosen for response speed in a conversational loop rather than document structure. Each half only needs its own API key configured; a missing key fails just the features that depend on it rather than silently mocking a response.
A course isn't "done" the moment a syllabus exists
Generating a syllabus produces structure — modules, lessons, a rough shape — but not the actual lecture content a learner reads or watches. That content is generated lazily and incrementally per lesson, not all at once up front, which used to create a real dead end: a course could show up in the public catalog with a title and outline but mostly empty lessons behind it.
The fix is a "fully_populated" flag maintained incrementally, recomputed every time a lesson's content is actually generated, comparing how many lessons a course's modules claim to have against how much real generated content exists for it. Only courses where that flag is true show up in the public catalog by default — the catalog looking smaller than the full set of syllabi in the database is a feature of this check, not a bug, and the same incompleteness check is what an internal backfill job also queries to find courses still needing content.
What the human-verification pass actually checks
Before a course can go live, it passes through a real moderation queue, not an automatic approval. That review checks course structure against the platform's category and level enums (so a course can't claim a category the frontend's fixed filter chips would never surface), verifies the content is substantively accurate rather than plausible-sounding filler, and confirms two disclosures are present when applicable: whether a course is AI-generated, and whether it's sponsored. Both of those are shown transparently in the UI rather than hidden — a sponsored, AI-generated course is still labeled as both.
Illustrations and audio are generated the same way — and can fail gracefully
Lesson content generation also produces a matching illustration and narrated audio per lesson, alongside the text. Both are best-effort: a missing or invalid API key for the relevant provider just skips that piece rather than blocking the whole lesson or faking a placeholder image. A learner might occasionally hit a lesson with text and audio but no illustration, or vice versa — an honest partial result rather than a broken one dressed up as complete.
Why the catalog stays deliberately small
It would be trivial to generate ten thousand shallow, unreviewed syllabi and call it a large catalog. That's explicitly not the approach here: the moderation queue is a real bottleneck, by design, and a course sits behind it until a human has actually looked at the structure and content rather than trusting model output blind. The catalog is small today because the review step is real, not automated away — and it's expected to keep growing at whatever pace real review can sustain, not faster.