Skip to content

Creator Course

Magenta-plum with the softest corners in the set, for one person selling one thing. A student testimonial as the hero, a long instructor section, one price and the refund policy on the page.

5 routes5 pages · 15 blocks31 files · 3,348 lineslucide-reactAdded 2 Sept 2026

What's included

  • app/blog/[slug]/page.tsx
  • app/blog/page.tsx
  • app/globals.css
  • app/layout.tsx
  • app/login/page.tsx
  • app/not-found.tsx
  • and 9 more files
  • 5 pages it is built from, installed with it
  • Needs lucide-react

Works with

  • React
  • Next.js
  • Tailwind CSS
  • TypeScript

npx hoverlab init creator-course ./my-app

Or over MCP, from your editor's agent — no account needed.

License

Free to read, copy and install, for personal and non-commercial projects. Shipping it in client work or a paid product needs Pro ($79 once). The source lands in your repo and stops being ours — no attribution, nothing to upgrade.

Was this useful?

Every screen

Nine weeks · next cohort 9 March

Learn to read a codebase you did not write

The skill nobody teaches and every job assumes: getting oriented in fifty thousand lines of someone else's decisions, quickly, without reading all of it.

I had been a developer for six years and had quietly assumed everyone else found new codebases as slow as I did. Week three broke that. I onboarded onto a new team in September and was shipping in four days.
Nadia OseiSenior engineer, Northwind — cohort 4

Past students now work at

  • Northwind
  • Contoso
  • Lumon
  • Initech
  • Globex
  • Vandelay

What you will be able to do in nine weeks

Written as capabilities rather than topics, because “covers dependency graphs” tells you nothing about whether you could use one on Monday.

  • Find the load-bearing 5% of a codebase in an afternoon

    Most of any repository is leaves. There is a small core that everything else hangs off, and there are repeatable ways to find it that do not involve reading files in alphabetical order. You will do this on four real open-source projects, timed.

  • Reconstruct the decisions nobody wrote down

    Why is there a second cache here? Why does this module import nothing? Git history, issue threads and the shape of the code itself are evidence, and reading them is a learnable skill rather than seniority.

  • Change something safely on day two

    The goal of orientation is not understanding — it is a correct change. You will practise identifying the smallest safe edit and the blast radius around it, which is a different question from “how does this work”.

  • Say “I do not know yet” with a plan attached

    The professional version of being lost is a specific list of what you have ruled out and what you would look at next. Half the cohort says this is the part that changed how they are perceived at work.

Nine weeks, one repository a fortnight

Two hours of recorded material a week and a live session on Thursdays. Everything is recorded, and nobody has ever been penalised for watching it late.

Reviews that start themselves

  • Reviewers assigned by file ownership, not by whoever is online
  • Stale approvals dismissed automatically when the diff changes
  • Merge unblocks the moment the last required check goes green

Who is actually teaching it

Not a faceless academy. One person, who answers the forum posts and runs the Thursday sessions live rather than shipping a recording from 2023.

  • Marcus Okafor

    Instructor — and the person who replies to your posts

    Fourteen years across four companies, most of it inherited code. Spent three years as the person a large payments company sent into failing projects, which is where this material came from — it is the checklist I built for myself and then found I could teach. I have run this cohort eleven times and rewritten a third of it since the first one.

One price, one payment

No upsell tier, no “community edition”, and no separate charge for the live sessions.

Deep Practice — March cohort

£480one payment, no subscription

£640£160 off until 20 February

Join the March cohort

Full refund up to the end of week three, no reason needed, no form to fill in — reply to any email from me. 11 of 340 students have taken it. Access does not expire and there is no subscription to cancel.

What is included

  • Nine weeks of material, yours to keep permanently
  • Nine live Thursday sessions, recorded if you miss one
  • Four real codebases with worked solutions
  • Written feedback on three submitted exercises
  • A private forum where I answer, not a moderator
  • Company invoice on request — most employers pay for this

Before you enrol

Everything people ask before getting started.

How much time does it actually take?

Two hours of recorded material and roughly three hours of exercises a week, plus a 90-minute live session on Thursdays at 18:00 UK. Call it six hours. People who treat it as three hours get noticeably less out of it, and I would rather say that than have you find out in week five.

What do I need to know already?

Comfort in at least one language and some experience of a codebase you did not start. Roughly two years in. It is not a beginner course and it is deliberately not an advanced one — the material is about a skill senior developers usually acquired by accident.

Which languages are the codebases in?

TypeScript, Python, Go and one Rust project. You do not need to know all four — that is somewhat the point, since orienting in an unfamiliar language is the harder version of the same skill. Every exercise has a worked solution.

What if I miss the live sessions?

They are recorded and posted the same evening, and the forum is where most of the actual discussion happens anyway. About a third of each cohort is in a timezone that makes 18:00 UK impossible and they do fine.

Will my employer pay for it?

Usually, yes. There is a one-page justification you can forward and I will invoice a company directly, with a PO number if procurement needs one. Roughly 60% of students go this route.

Does access expire?

No. The material, the recordings and the forum stay available, including the updates I make for later cohorts. There is no subscription and nothing to cancel.

What if it is not for me?

Full refund any time up to the end of week three — reply to an email and say so. No form, no exit interview, no attempt to talk you out of it. 11 people out of 340 have done it and I would rather that number were higher than have anyone stay resentful.

…which is why the migration queues behind the reporting job rather than failing outright. The lock is held for as long as the report runs, and on a large table that can be several minutes.

The safe version is to set a lock timeout and accept that the migration may need a second pass, rather than letting it wait indefinitely and block every write behind it.

Live components in your current theme — switch routes, or the phone icon to check the mobile layout. Colours are this template’s Plum palette, which ships in app/globals.css. Magenta-plum with 20px corners — the softest shape in the set. Personal and a little expensive, for a product that is one person rather than a company.

Get it

31 files · .zip · nothing to configure · Pro

then

cd creator-course
npm install
npm run dev

The archive contains the whole project — routes, blocks, theme tokens, Tailwind and PostCSS config, tsconfig and a .gitignore. One runtime dependency, and no Hoverlab dependency at all: it is your code from the moment it unzips.

For AI

The component, its props, the design tokens it expects and the command that installs it — as one prompt. Paste it into Claude, Cursor, v0 or ChatGPT and what they build around it will match the rest of the catalog instead of inventing its own system.

See the prompt

Routes

PathPageFile
/Creator Course Landing Pageapp/page.tsx
/blogBlog Indexapp/blog/page.tsx
/blog/[slug]Article Pageapp/blog/[slug]/page.tsx
/loginSign-In Screenapp/login/page.tsx
404404 Pageapp/not-found.tsx

What you get

project root(8 files)

  • GETTING-STARTED.md
  • gitignore
  • next.config.ts
  • package.json
  • postcss.config.mjs
  • README.md
  • tailwind.config.ts
  • tsconfig.json

app/(7 files)

  • blog/[slug]/page.tsx
  • blog/page.tsx
  • globals.css
  • layout.tsx
  • login/page.tsx
  • not-found.tsx
  • page.tsx

components/(16 files)

  • article-header.tsx
  • auth-login-card.tsx
  • blog-post-grid.tsx
  • cta-inline-card.tsx
  • faq-accordion.tsx
  • feature-icon-grid.tsx
  • feature-tabs.tsx
  • footer-minimal.tsx
  • hero-testimonial.tsx
  • logo-strip.tsx
  • navbar-simple.tsx
  • newsletter-signup.tsx
  • not-found-404.tsx
  • pricing-single.tsx
  • team-grid.tsx
  • theme-provider.tsx

Every file is listed. The 15 files in components/ are the blocks the pages import — each one has its own page if you want to read it on its own.

Project files

Everything except the blocks. Opens on app/globals.css — the file that makes the rest look right, since every block styles itself with bg-card and text-muted-foreground rather than literal colours.

app/globals.css
@tailwind base;
@tailwind components;
@tailwind utilities;

/**
 * Design tokens — the Plum palette.
 *
 * Magenta-plum with 20px corners — the softest shape in the set. Personal and a little expensive, for a product that is one person rather than a company.
 *
 * This file is the reason a pasted block looks right. Every block and page
 * styles itself with semantic classes — `bg-card`, `text-muted-foreground`,
 * `border-border` — rather than literal colours, so they inherit whatever
 * you define here instead of fighting it. Change a value below and every
 * section in the project moves with it. Change the hue on `--primary` and
 * `--ring` together and you have rebranded the site.
 *
 * Values are bare HSL channels, not `hsl(...)` calls. That is what lets
 * Tailwind compose them with an alpha suffix: `bg-primary/10` expands to
 * `hsl(var(--primary) / 0.1)`, which is impossible if the variable already
 * carries its own function wrapper.
 *
 * Every foreground/background pair below clears WCAG AA (4.5:1) in both
 * themes. If you retune one, check the pair rather than trusting the eye —
 * mid-lightness accents are the ones that fail.
 */

@layer base {
  :root {
    --background: 310 35% 99%;
    --foreground: 312 35% 10%;
    --card: 0 0% 100%;
    --card-foreground: 312 35% 10%;
    --popover: 0 0% 100%;
    --popover-foreground: 312 35% 10%;
    --primary: 312 72% 36%;
    --primary-foreground: 0 0% 100%;
    --secondary: 312 32% 96%;
    --secondary-foreground: 312 35% 20%;
    --muted: 312 24% 96%;
    --muted-foreground: 312 10% 42%;
    --accent: 286 45% 94%;
    --accent-foreground: 290 45% 22%;
    --destructive: 0 72% 47%;
    --destructive-foreground: 0 0% 100%;
    --border: 312 22% 90%;
    --input: 312 22% 90%;
    --ring: 312 72% 36%;

    --radius: 1.25rem;
  }

  .dark {
    --background: 312 34% 5%;
    --foreground: 310 15% 97%;
    --card: 312 28% 8%;
    --card-foreground: 310 15% 97%;
    --popover: 312 28% 8%;
    --popover-foreground: 310 15% 97%;
    --primary: 310 80% 72%;
    --primary-foreground: 312 42% 7%;
    --secondary: 312 22% 15%;
    --secondary-foreground: 310 15% 97%;
    --muted: 312 22% 15%;
    --muted-foreground: 312 10% 68%;
    --accent: 286 26% 18%;
    --accent-foreground: 288 45% 88%;
    --destructive: 0 62% 52%;
    --destructive-foreground: 0 0% 100%;
    --border: 312 20% 19%;
    --input: 312 20% 19%;
    --ring: 310 80% 72%;
  }
}

@layer base {
  * {
    @apply border-border;
  }

  body {
    @apply bg-background text-foreground antialiased;
  }

  /**
   * Global motion opt-out.
   *
   * Blocks guard their own animations with Tailwind's `motion-safe:`, but
   * third-party CSS and anything you add later will not. This is the
   * backstop: it neutralises every animation and transition on the page
   * for users who have asked the OS for reduced motion, rather than
   * relying on each author to remember.
   */
  @media (prefers-reduced-motion: reduce) {
    *,
    *::before,
    *::after {
      animation-duration: 0.01ms !important;
      animation-iteration-count: 1 !important;
      transition-duration: 0.01ms !important;
      scroll-behavior: auto !important;
    }
  }
}

More Landing Pages

Open the full page for this template

Startup Waitlist

The waitlist hero with the count on it

A pre-launch site in violet: one email field, a blog to keep the list warm, and no pricing to be held to. The smallest honest thing to put in front of a product that does not exist yet.

4 routes4 pages13 blocksUltraviolet
Pro
Open the full page for this template

Developer Tool

The terminal hero, typing the install

Near-black buttons, square corners and a terminal-green accent. Install command above the fold, real code before any prose, docs and changelog behind it.

5 routes5 pages17 blocksGraphite
Pro
Open the full page for this template

Mobile App

The store-badge download hero

Emerald and 16px corners, built around one conversion: the store install. Badges and the App Store rating above the fold, a single price, and an account area for the subscription.

5 routes5 pages18 blocksSignal
Pro
Open the full page for this template

Agency Studio

Case studies that name the constraint

Terracotta on warm paper, with no blue in it anywhere. Full-bleed hero, client list, the actual team, a journal and a careers page — and no pricing, on purpose.

5 routes5 pages15 blocksSandstone
Pro
Open the full page for this template

Local Service

Hours, address and phone above the fold

Deep teal, for a business people let into their house. A booking widget above the fold, every price published, and a compliance footer with the registrations a regulated trade has to show.

4 routes4 pages14 blocksHarbour
Pro
Open the full page for this template

Marketplace

Both sides of the market on one page

Dark olive on warm off-white, built for two audiences at once: search and real listings for buyers, the seller economics below the fold, and a browse route behind it.

5 routes5 pages19 blocksMoss
Pro
Open the full page for this template

Enterprise

The security posture band

Burgundy and square corners — the register of things bought in a boardroom. Numbers in the hero, a comparison table that concedes rows, and published prices instead of a sales wall.

5 routes5 pages18 blocksClaret
Pro
Open the full page for this template

Integration Platform

The integration grid, sorted by depth

High-chroma blue. The connector names in the hero, a catalogue with honest live/beta/planned status, four SDK languages and a dated roadmap for everyone who is not on the list.

4 routes4 pages14 blocksCobalt
Open the full page for this template

Newsletter

The archive, above the testimonials

One decision, made from the archive: a hero with the field in it, the back issues as the actual argument, and the three worries about handing over an address answered as content.

6 routes6 pages22 blocksTideline