gitextract_61kki5cn/ ├── .cursor/ │ ├── GUIDE.md │ ├── PERSONALIZATION.md │ ├── rules/ │ │ ├── _/ │ │ │ └── .gitignore │ │ ├── _context/ │ │ │ └── .gitkeep │ │ ├── _core/ │ │ │ ├── communication.mdc │ │ │ ├── persona.mdc │ │ │ ├── prefer-clis.mdc │ │ │ ├── principles.mdc │ │ │ ├── standards.mdc │ │ │ └── terminal.mdc │ │ ├── _global.mdc │ │ ├── _globs/ │ │ │ ├── GLOBS.md │ │ │ └── react/ │ │ │ └── best-practices.mdc │ │ ├── benchmarks-create.mdc │ │ ├── cli-github-search.mdc │ │ ├── cli-pack.mdc │ │ ├── cli-worktree.mdc │ │ ├── cli-wrangler.mdc │ │ ├── docs-diagram.mdc │ │ ├── docs-openapi-spec.mdc │ │ ├── docs-prd.mdc │ │ ├── docs-structure.mdc │ │ ├── docs-sync.mdc │ │ ├── docs-tech-stack.mdc │ │ ├── gh-docs-sync.mdc │ │ ├── gh-task-continue.mdc │ │ ├── gh-task-execute.mdc │ │ ├── gh-task-plan.mdc │ │ ├── logging-session.mdc │ │ ├── pnpm-fixes.mdc │ │ ├── project-todos-next.mdc │ │ ├── project-update-rules.mdc │ │ ├── project-update-user-rules.mdc │ │ ├── prompt-improve.mdc │ │ ├── pull-request-create.mdc │ │ ├── react-rules.mdc │ │ ├── scripts-create.mdc │ │ ├── task-continue.mdc │ │ ├── task-execute.mdc │ │ ├── task-next.mdc │ │ ├── task-outline.mdc │ │ ├── task-plan.mdc │ │ └── zen-coding.mdc │ └── workflows/ │ ├── development/ │ │ ├── benchmarks.md │ │ ├── logging.md │ │ └── scripts.md │ ├── documentation/ │ │ ├── diagram.md │ │ ├── openapi-spec.md │ │ ├── prd.md │ │ ├── sync.md │ │ └── tech-stack.md │ ├── task/ │ │ └── parallel.md │ ├── tools/ │ │ ├── cli/ │ │ │ ├── ghx.md │ │ │ ├── repomix.md │ │ │ ├── worktree.md │ │ │ └── wrangler.md │ │ └── package-managers/ │ │ └── pnpm/ │ │ └── build-script-fixes.md │ └── workflows/ │ ├── analysis/ │ │ └── document-failures.md │ ├── config/ │ │ ├── personalize-rule.md │ │ └── update-personal-rules.md │ ├── dependencies/ │ │ └── audit.md │ ├── docs/ │ │ ├── structure.md │ │ └── sync.md │ ├── github/ │ │ ├── continue-github.md │ │ ├── execute-github.md │ │ ├── plan-github.md │ │ ├── pr-create-github.md │ │ └── review-github.md │ ├── meta/ │ │ └── create-workflow.md │ ├── project/ │ │ └── update-project-rules.md │ ├── prompts/ │ │ └── improve-prompt.md │ ├── scripts/ │ │ └── create-script.md │ └── task/ │ ├── continue.md │ ├── execute.md │ ├── next.md │ ├── outline.md │ ├── plan.md │ └── todos-next.md ├── .eslintrc.js ├── .github/ │ └── workflows/ │ └── jest.yml ├── .gitignore ├── .hive/ │ ├── issues.jsonl │ └── memories.jsonl ├── .husky/ │ └── pre-commit ├── .kodiak.toml ├── .node-version ├── .nvmrc ├── .storybook/ │ ├── main.js │ └── preview.js ├── @types/ │ ├── assets/ │ │ └── index.d.ts │ ├── browser-cookies.d.ts │ ├── cueplayer-react.d.ts │ ├── file-extension.d.ts │ ├── friendly-time.d.ts │ ├── humanize-list.d.ts │ ├── mdx.d.ts │ ├── react-textfit.d.ts │ ├── remove-markdown.d.ts │ └── tincanjs.d.ts ├── CLAUDE.md ├── LICENSE ├── README.md ├── ai/ │ └── diagrams/ │ ├── README.md │ ├── analytics-tracking-flow.md │ ├── auth-login-flow.md │ ├── course-progression-flow.md │ ├── email-automation-flow.md │ ├── form-submission-flow.md │ ├── free-user-pro-content-overlay-flow.md │ ├── inngest-background-jobs-flow.md │ ├── lesson-playback-flow.md │ ├── search-functionality-flow.md │ ├── stripe-payment-flow.md │ ├── subscription-access-control-flow.md │ ├── tip-creation-flow.md │ ├── trpc-api-flow.md │ ├── user-navigation-flow.md │ ├── video-upload-processing-flow.md │ ├── webhook-processing-flow.md │ ├── workshop-registration-flow.md │ └── xstate-machine-flow.md ├── bin/ │ └── validate ├── config/ │ └── jest/ │ └── cssTransform.js ├── cypress/ │ ├── fixtures/ │ │ └── example.json │ ├── integration/ │ │ └── spec.js │ ├── plugins/ │ │ └── index.js │ └── support/ │ ├── commands.js │ └── index.js ├── cypress.json ├── docs/ │ ├── decisions/ │ │ ├── 0001-adopt-architecture-decision-records.md │ │ ├── 0002-upgrade-next-mdx-remote-to-v6.md │ │ ├── 0003-direct-pg-course-shell.md │ │ └── README.md │ ├── latest-courses-component-plan.md │ ├── post-page-refactoring-plan.md │ ├── stripe-upgrade-analysis.md │ ├── stripe-upgrade-plan.md │ ├── tasks/ │ │ ├── 2025-06-02-11-40-ai-dev-essentials-landing-page.md │ │ ├── 2025-08-13-copy-as-prompt-feature.md │ │ └── 2025-08-18-14-35-stripe-sdk-upgrade.md │ └── typesense-new-lessons-feature.md ├── jest/ │ └── json-reporter.js ├── jest.config.js ├── next-env.d.ts ├── next-sitemap.js ├── next.config.mjs ├── package.json ├── postcss.config.js ├── prisma/ │ └── schema.prisma ├── public/ │ ├── bitmovin/ │ │ ├── bitmovinplayer-ui.css │ │ ├── bitmovinplayer-ui.js │ │ └── receiver.css │ ├── opensearch.xml │ ├── robots.txt │ ├── site.webmanifest │ ├── sitemap.xml │ ├── tags-sitemap-0.xml │ ├── tags-sitemap-1.xml │ ├── tags-sitemap-10.xml │ ├── tags-sitemap-11.xml │ ├── tags-sitemap-12.xml │ ├── tags-sitemap-13.xml │ ├── tags-sitemap-14.xml │ ├── tags-sitemap-15.xml │ ├── tags-sitemap-16.xml │ ├── tags-sitemap-17.xml │ ├── tags-sitemap-18.xml │ ├── tags-sitemap-19.xml │ ├── tags-sitemap-2.xml │ ├── tags-sitemap-20.xml │ ├── tags-sitemap-21.xml │ ├── tags-sitemap-22.xml │ ├── tags-sitemap-23.xml │ ├── tags-sitemap-24.xml │ ├── tags-sitemap-25.xml │ ├── tags-sitemap-26.xml │ ├── tags-sitemap-27.xml │ ├── tags-sitemap-28.xml │ ├── tags-sitemap-29.xml │ ├── tags-sitemap-3.xml │ ├── tags-sitemap-4.xml │ ├── tags-sitemap-5.xml │ ├── tags-sitemap-6.xml │ ├── tags-sitemap-7.xml │ ├── tags-sitemap-8.xml │ └── tags-sitemap-9.xml ├── rtl.setup.js ├── setupTests.ts ├── src/ │ ├── adapters/ │ │ └── stripe-adapter.ts │ ├── api/ │ │ ├── egghead/ │ │ │ └── users/ │ │ │ └── from-token.ts │ │ └── stripe/ │ │ ├── stripe-checkout-redirect.ts │ │ └── stripe-lifetime-checkout-redirect.ts │ ├── app/ │ │ ├── (content)/ │ │ │ ├── courses/ │ │ │ │ ├── [course]/ │ │ │ │ │ └── [lesson]/ │ │ │ │ │ ├── Player.tsx │ │ │ │ │ ├── PlayerSidebar.tsx │ │ │ │ │ └── page.tsx │ │ │ │ └── layout.tsx │ │ │ ├── lessons/ │ │ │ │ └── [slug]/ │ │ │ │ └── embed/ │ │ │ │ ├── _components/ │ │ │ │ │ ├── embed-lesson.css │ │ │ │ │ ├── embed-lesson.tsx │ │ │ │ │ ├── embed-player.tsx │ │ │ │ │ └── minimal-embed-player.tsx │ │ │ │ ├── layout.tsx │ │ │ │ └── page.tsx │ │ │ └── tips/ │ │ │ ├── [tipId]/ │ │ │ │ ├── edit/ │ │ │ │ │ ├── page.tsx │ │ │ │ │ └── tip-navigation.tsx │ │ │ │ └── page.tsx │ │ │ ├── _components/ │ │ │ │ └── tips-lists.tsx │ │ │ ├── layout.tsx │ │ │ ├── new/ │ │ │ │ └── page.tsx │ │ │ └── page.tsx │ │ ├── _components/ │ │ │ ├── compact-feed-skeleton.tsx │ │ │ ├── compact-feed.tsx │ │ │ ├── compact-hits.tsx │ │ │ ├── course-info.tsx │ │ │ └── search.tsx │ │ ├── _trpc/ │ │ │ ├── Provider.tsx │ │ │ ├── client.ts │ │ │ └── serverClient.ts │ │ ├── api/ │ │ │ ├── cron/ │ │ │ │ └── route.ts │ │ │ ├── deepgram/ │ │ │ │ └── webhook/ │ │ │ │ └── route.ts │ │ │ ├── feedback/ │ │ │ │ └── route.ts │ │ │ ├── inngest/ │ │ │ │ └── route.ts │ │ │ ├── lessons/ │ │ │ │ └── [slug]/ │ │ │ │ └── download/ │ │ │ │ └── route.ts │ │ │ ├── mux/ │ │ │ │ └── webhook/ │ │ │ │ └── route.ts │ │ │ ├── pricing/ │ │ │ │ └── route.ts │ │ │ ├── stripe/ │ │ │ │ └── checkout/ │ │ │ │ └── lifetime/ │ │ │ │ └── route.ts │ │ │ ├── trpc/ │ │ │ │ └── [trpc]/ │ │ │ │ └── route.ts │ │ │ ├── videos/ │ │ │ │ └── [videoResourceId]/ │ │ │ │ └── srt/ │ │ │ │ └── route.ts │ │ │ ├── webhooks/ │ │ │ │ ├── sanity/ │ │ │ │ │ └── route.ts │ │ │ │ ├── tips/ │ │ │ │ │ └── mux/ │ │ │ │ │ └── route.ts │ │ │ │ └── transloadit/ │ │ │ │ └── route.ts │ │ │ └── workshop-quote/ │ │ │ └── route.ts │ │ ├── blocked/ │ │ │ ├── _components/ │ │ │ │ └── blocked.tsx │ │ │ ├── layout.tsx │ │ │ └── page.tsx │ │ ├── layout.tsx │ │ ├── page.tsx │ │ ├── providers.tsx │ │ └── user/ │ │ ├── activity/ │ │ │ └── page.tsx │ │ ├── bookmarks/ │ │ │ └── page.tsx │ │ ├── layout.tsx │ │ ├── membership/ │ │ │ ├── layout.tsx │ │ │ └── page.tsx │ │ ├── profile/ │ │ │ └── page.tsx │ │ └── team/ │ │ └── page.tsx │ ├── components/ │ │ ├── EggheadPlayer/ │ │ │ ├── index.js │ │ │ ├── players/ │ │ │ │ ├── Base.js │ │ │ │ ├── Bitmovin.js │ │ │ │ └── YouTube.js │ │ │ ├── props.js │ │ │ ├── use-egghead-player.ts │ │ │ └── utils.js │ │ ├── GridBackground.tsx │ │ ├── app/ │ │ │ ├── app-footer.tsx │ │ │ ├── app-main.tsx │ │ │ ├── footer.tsx │ │ │ ├── header/ │ │ │ │ ├── banner-context.tsx │ │ │ │ ├── banner-data.ts │ │ │ │ ├── header-button-shaped-link.tsx │ │ │ │ ├── images.tsx │ │ │ │ ├── index.tsx │ │ │ │ ├── search-bar.tsx │ │ │ │ └── server-header-shell.tsx │ │ │ ├── layout.tsx │ │ │ ├── main.tsx │ │ │ └── team/ │ │ │ └── index.tsx │ │ ├── blog/ │ │ │ ├── article-course-card.tsx │ │ │ └── article-talk-card.tsx │ │ ├── buttons/ │ │ │ └── index.tsx │ │ ├── card/ │ │ │ ├── card.stories.mdx │ │ │ ├── heading.tsx │ │ │ ├── horizontal-resource-card.tsx │ │ │ ├── index.tsx │ │ │ ├── new-horizontal-resource-card.tsx │ │ │ ├── new-vertical-resource-card.tsx │ │ │ ├── overlay/ │ │ │ │ ├── overlay-horiztonal-resource-card.tsx │ │ │ │ └── overlay-vertical-resource-card.tsx │ │ │ ├── search-hit-resource-card.tsx │ │ │ ├── topic-page-horizontal-resource-card.tsx │ │ │ ├── vertical-resource-collection-card.tsx │ │ │ └── verticle-resource-card.tsx │ │ ├── code-block.tsx │ │ ├── community-resource.tsx │ │ ├── contributors.tsx │ │ ├── copy-as-prompt-button.tsx │ │ ├── copy-resource.tsx │ │ ├── course/ │ │ │ └── course-podcast.tsx │ │ ├── courses/ │ │ │ ├── course-card.tsx │ │ │ ├── latest-courses-feed.tsx │ │ │ └── new-lessons-badge.tsx │ │ ├── cta/ │ │ │ ├── email/ │ │ │ │ └── email-form.tsx │ │ │ └── sale/ │ │ │ ├── countdown-timer.tsx │ │ │ ├── header-banner.tsx │ │ │ ├── lifetime-header-banner.tsx │ │ │ ├── workshop-early-bird-header-banner.tsx │ │ │ └── workshop-header-banner.tsx │ │ ├── customer-io/ │ │ │ └── email-entry-form.tsx │ │ ├── dialog.tsx │ │ ├── external-tracked-link.tsx │ │ ├── feedback-input/ │ │ │ ├── images/ │ │ │ │ ├── Confounded.js │ │ │ │ ├── Ghost.js │ │ │ │ ├── Hearteyes.js │ │ │ │ ├── NeutralFace.js │ │ │ │ ├── Smile.js │ │ │ │ └── Sob.js │ │ │ └── index.tsx │ │ ├── five-stars.tsx │ │ ├── forms/ │ │ │ ├── generic-newsletter-signup.tsx │ │ │ ├── newsletter-signup.tsx │ │ │ └── quiz/ │ │ │ ├── completed-message.tsx │ │ │ ├── essay-question.tsx │ │ │ ├── multiple-choice-question.tsx │ │ │ ├── spinner.tsx │ │ │ └── submit.tsx │ │ ├── generic-error-boundary.tsx │ │ ├── grid/ │ │ │ └── index.tsx │ │ ├── guides/ │ │ │ └── guide-template.tsx │ │ ├── icons/ │ │ │ ├── bookmark.tsx │ │ │ ├── cancel.tsx │ │ │ ├── check.tsx │ │ │ ├── clock.tsx │ │ │ ├── closed-captioning.tsx │ │ │ ├── community-resource-icon.tsx │ │ │ ├── eggo.tsx │ │ │ ├── folder-download.tsx │ │ │ ├── icon-x.tsx │ │ │ ├── lock.tsx │ │ │ ├── rss.tsx │ │ │ ├── star.jsx │ │ │ ├── svg-icon.jsx │ │ │ └── tip-icons.tsx │ │ ├── image-with-placeholder.tsx │ │ ├── invoices/ │ │ │ └── index.tsx │ │ ├── last-resource.tsx │ │ ├── layouts/ │ │ │ ├── collection-page-layout.tsx │ │ │ ├── multi-module-collection-page-layout.tsx │ │ │ ├── php-collection-page-layout.tsx │ │ │ ├── scrimba-course-layout.tsx │ │ │ └── tag-list.tsx │ │ ├── like-button.tsx │ │ ├── link.tsx │ │ ├── login-required.tsx │ │ ├── markdown/ │ │ │ ├── mdx-components.tsx │ │ │ ├── mdx.tsx │ │ │ ├── serialize-mdx.ts │ │ │ ├── shiki-remote-plugin.ts │ │ │ └── transcript-components.tsx │ │ ├── markdown.tsx │ │ ├── mdx/ │ │ │ ├── article-series-list.tsx │ │ │ ├── callout.tsx │ │ │ ├── card.js │ │ │ ├── cheat-sheet.js │ │ │ ├── code-block.tsx │ │ │ ├── course-widget.tsx │ │ │ ├── course.tsx │ │ │ ├── email-subscribe-widget.tsx │ │ │ ├── header-card.js │ │ │ ├── index.tsx │ │ │ ├── prose-section.js │ │ │ ├── question-reveal.js │ │ │ ├── resource-link.js │ │ │ ├── resource-widget.tsx │ │ │ └── topic-interest-form.tsx │ │ ├── monitoring/ │ │ │ ├── ai-dev-essentials-error-boundary.tsx │ │ │ └── performance-monitor.tsx │ │ ├── pages/ │ │ │ ├── 20-days-of-egghead/ │ │ │ │ └── course-grid.tsx │ │ │ ├── confirm/ │ │ │ │ └── membership/ │ │ │ │ ├── index.tsx │ │ │ │ └── membership.stories.mdx │ │ │ ├── courses/ │ │ │ │ ├── dialog-button.tsx │ │ │ │ ├── instructor-profile.tsx │ │ │ │ ├── learner-ratings.tsx │ │ │ │ ├── membership-dialog-button.tsx │ │ │ │ ├── play-icon.tsx │ │ │ │ └── user-rating/ │ │ │ │ └── user-rating.tsx │ │ │ ├── email-confirmation.tsx │ │ │ ├── home/ │ │ │ │ ├── cta.tsx │ │ │ │ ├── egghead-for-teams-cta.tsx │ │ │ │ ├── first-hit-card.tsx │ │ │ │ ├── hits.tsx │ │ │ │ ├── in-progress-section/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── jumbotron.tsx │ │ │ │ ├── search.tsx │ │ │ │ ├── the-feed.tsx │ │ │ │ ├── topics.tsx │ │ │ │ └── video-card/ │ │ │ │ └── index.tsx │ │ │ ├── invoice/ │ │ │ │ ├── index.tsx │ │ │ │ ├── invoice.stories.mdx │ │ │ │ └── mock-transaction.ts │ │ │ ├── landing/ │ │ │ │ ├── article/ │ │ │ │ │ └── index.mdx │ │ │ │ ├── browse/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── create-account/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── footer/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── header/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── join/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── membership-benefits/ │ │ │ │ │ └── index.tsx │ │ │ │ └── tech-logos/ │ │ │ │ └── index.tsx │ │ │ ├── lessons/ │ │ │ │ ├── code-link.tsx │ │ │ │ ├── collection-lessons-list.test.ts │ │ │ │ ├── collection-lessons-list.tsx │ │ │ │ ├── comments/ │ │ │ │ │ ├── comment/ │ │ │ │ │ │ ├── comment.stories.mdx │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── comment-field/ │ │ │ │ │ │ ├── comment-field.stories.mdx │ │ │ │ │ │ └── index.tsx │ │ │ │ │ └── comments/ │ │ │ │ │ ├── comments.stories.mdx │ │ │ │ │ └── index.tsx │ │ │ │ ├── course.tsx │ │ │ │ ├── lesson/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── lesson-info.tsx │ │ │ │ ├── next-up-list.tsx │ │ │ │ ├── overlay/ │ │ │ │ │ ├── anon-user-overlay.tsx │ │ │ │ │ ├── confirm-membership.tsx │ │ │ │ │ ├── email-capture-cta-overlay.tsx │ │ │ │ │ ├── go-pro-cta-overlay.tsx │ │ │ │ │ ├── rate-course-overlay/ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── rate-course-overlay.stories.mdx │ │ │ │ │ ├── recommend-next-step-overlay/ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ ├── lesson-01.js │ │ │ │ │ │ └── recommend-next-step-overlay.stories.mdx │ │ │ │ │ ├── small-parity-coupon-message.tsx │ │ │ │ │ ├── watch-full-course-cta-overlay.tsx │ │ │ │ │ ├── watch-next-lesson-cta-overlay.tsx │ │ │ │ │ └── wrapper.tsx │ │ │ │ ├── overlays.tsx │ │ │ │ ├── playback-speed-select.tsx │ │ │ │ ├── special-lessons.ts │ │ │ │ ├── tags.tsx │ │ │ │ ├── theater-mode-toggle.tsx │ │ │ │ └── transcript.tsx │ │ │ ├── level-up/ │ │ │ │ └── email-entry-form.tsx │ │ │ ├── own-your-online-presence/ │ │ │ │ └── email-entry-form.tsx │ │ │ ├── user/ │ │ │ │ ├── components/ │ │ │ │ │ ├── avatar-form.tsx │ │ │ │ │ ├── bookmarks-list.tsx │ │ │ │ │ ├── completed-courses.tsx │ │ │ │ │ ├── continue-learning.tsx │ │ │ │ │ ├── delete-account.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── learner-stats.tsx │ │ │ │ │ ├── request-email-change-form.tsx │ │ │ │ │ ├── request-name-change-form.tsx │ │ │ │ │ ├── subscription-details.tsx │ │ │ │ │ ├── user-layout.tsx │ │ │ │ │ └── widget-wrapper.tsx │ │ │ │ ├── index.tsx │ │ │ │ └── tabs-content/ │ │ │ │ ├── activity-tab-content.tsx │ │ │ │ ├── bookmarks-tab-content.tsx │ │ │ │ ├── instructor-tab-content.tsx │ │ │ │ └── profile-tab-content.tsx │ │ │ └── users/ │ │ │ └── dashboard/ │ │ │ ├── achievements/ │ │ │ │ ├── achievements.stories.mdx │ │ │ │ └── index.tsx │ │ │ └── activity/ │ │ │ ├── activity.stories.mdx │ │ │ ├── continue-watching-section.tsx │ │ │ ├── in-progress-resource.tsx │ │ │ └── recently-watched-section.tsx │ │ ├── player/ │ │ │ ├── autoplay-control.tsx │ │ │ ├── download-control.tsx │ │ │ ├── player-sidebar.test.ts │ │ │ └── player-sidebar.tsx │ │ ├── podcasts/ │ │ │ ├── card/ │ │ │ │ ├── card.stories.mdx │ │ │ │ └── card.tsx │ │ │ ├── more/ │ │ │ │ ├── more.stories.mdx │ │ │ │ └── more.tsx │ │ │ └── podcast/ │ │ │ ├── podcast.stories.mdx │ │ │ └── podcast.tsx │ │ ├── posts/ │ │ │ ├── ai-dev-essentials-list.tsx │ │ │ ├── claude-code-cta-overlay.tsx │ │ │ ├── course-lesson-cta.tsx │ │ │ ├── icons/ │ │ │ │ └── github-icon.tsx │ │ │ ├── instructor-profile.tsx │ │ │ ├── podcast-links.tsx │ │ │ ├── post-player.tsx │ │ │ ├── powered-by-mux.tsx │ │ │ ├── tag-list.tsx │ │ │ └── video-player-overlay.tsx │ │ ├── pricing/ │ │ │ ├── countdown/ │ │ │ │ └── index.tsx │ │ │ ├── lifetime/ │ │ │ │ ├── active-sale.tsx │ │ │ │ ├── body-copy-full.tsx │ │ │ │ ├── body-copy-member.tsx │ │ │ │ ├── lifetime-pricing-widget.tsx │ │ │ │ └── upcoming-sale.tsx │ │ │ ├── parity-coupon-message.tsx │ │ │ ├── powered-by-stripe.tsx │ │ │ ├── pricing-widget/ │ │ │ │ └── index.tsx │ │ │ ├── select-plan/ │ │ │ │ └── index.tsx │ │ │ ├── select-plan-new/ │ │ │ │ ├── assets/ │ │ │ │ │ ├── best-value-stamp.tsx │ │ │ │ │ └── colored-background.tsx │ │ │ │ └── index.tsx │ │ │ ├── stepper/ │ │ │ │ └── index.tsx │ │ │ └── testimonials/ │ │ │ ├── data.ts │ │ │ ├── index.tsx │ │ │ └── testimonials.stories.mdx │ │ ├── pro-member-features.tsx │ │ ├── route-loading-indicator.tsx │ │ ├── safe-image.tsx │ │ ├── scrimba-resource.tsx │ │ ├── search/ │ │ │ ├── components/ │ │ │ │ ├── callout.tsx │ │ │ │ ├── card.tsx │ │ │ │ ├── cta-card.tsx │ │ │ │ ├── hit/ │ │ │ │ │ ├── hit.stories.mdx │ │ │ │ │ └── index.tsx │ │ │ │ ├── no-search-results.tsx │ │ │ │ ├── preset-options.tsx │ │ │ │ ├── resource.tsx │ │ │ │ └── topic.tsx │ │ │ ├── curated/ │ │ │ │ ├── [slug]/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── angularjs/ │ │ │ │ │ ├── angularjs-page-data.ts │ │ │ │ │ ├── angularjs-page.stories.mdx │ │ │ │ │ └── index.tsx │ │ │ │ ├── aws/ │ │ │ │ │ ├── aws-page-data.ts │ │ │ │ │ ├── aws-page.stories.mdx │ │ │ │ │ └── index.tsx │ │ │ │ ├── css/ │ │ │ │ │ ├── css-page-data.ts │ │ │ │ │ ├── css-page.stories.mdx │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── sanity-loading-data.tsx │ │ │ │ ├── curated-essential.tsx │ │ │ │ ├── default-cta.tsx │ │ │ │ ├── docker/ │ │ │ │ │ ├── docker-page-data.ts │ │ │ │ │ └── index.tsx │ │ │ │ ├── gatsby/ │ │ │ │ │ ├── gatsby-page-data.ts │ │ │ │ │ └── index.tsx │ │ │ │ ├── graphql/ │ │ │ │ │ ├── graphql-page-data.ts │ │ │ │ │ ├── graphql-page.stories.mdx │ │ │ │ │ └── index.tsx │ │ │ │ ├── index.tsx │ │ │ │ ├── javascript/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── javascript-page-data.ts │ │ │ │ │ └── javascript-page.stories.mdx │ │ │ │ ├── next/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── next-page.stories.mdx │ │ │ │ ├── node/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── node-page-data.ts │ │ │ │ │ └── node-page.stories.mdx │ │ │ │ ├── react/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── react-page-data.ts │ │ │ │ │ └── react-page.stories.mdx │ │ │ │ ├── remix/ │ │ │ │ │ └── index.tsx │ │ │ │ └── typescript/ │ │ │ │ ├── index.tsx │ │ │ │ ├── typescript-page-data.ts │ │ │ │ └── typescript-page.stories.mdx │ │ │ ├── generic-topic.tsx │ │ │ ├── hits.tsx │ │ │ ├── index.tsx │ │ │ ├── instructors/ │ │ │ │ ├── alex-reardon/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── chris-achard/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── chris-biscardi/ │ │ │ │ │ ├── chris-biscardi-page-data.ts │ │ │ │ │ └── index.tsx │ │ │ │ ├── christian-nwamba/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── colby-fayock/ │ │ │ │ │ ├── colby-fayock-page.stories.mdx │ │ │ │ │ └── index.tsx │ │ │ │ ├── dan-abramov/ │ │ │ │ │ ├── dan-abramov-page-data.ts │ │ │ │ │ ├── dan-abramov-page.stories.mdx │ │ │ │ │ └── index.tsx │ │ │ │ ├── filip-hric/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── flavio-corpa/ │ │ │ │ │ ├── flavio-corpa-page-data.ts │ │ │ │ │ └── index.tsx │ │ │ │ ├── hiroko-nishimura/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── index.tsx │ │ │ │ ├── instructor-essential.tsx │ │ │ │ ├── jamund-ferguson/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── john-lindquist/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── john-lindquist-page-data.ts │ │ │ │ │ └── script-kit-cta.tsx │ │ │ │ ├── kadi-kraman/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── kamran-ahmed/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── kent-c-dodds/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── kevin-cunningham/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── kristian-freeman/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── kyle-shevlin/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── laurie-barth/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── laurie-barth-page-data.ts │ │ │ │ ├── lazar-nikolov/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── matias-hernandez/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── resource-cta.tsx │ │ │ │ ├── ryan-chenkie/ │ │ │ │ │ └── index.tsx │ │ │ │ └── stephanie-eckles/ │ │ │ │ └── index.tsx │ │ │ ├── pagination.tsx │ │ │ ├── refinement-list.tsx │ │ │ ├── search-box.tsx │ │ │ └── stats.tsx │ │ ├── share-bluesky.tsx │ │ ├── share.tsx │ │ ├── spinner/ │ │ │ ├── index.tsx │ │ │ └── spinner.stories.mdx │ │ ├── survey/ │ │ │ ├── data/ │ │ │ │ └── post-purchase-survey-data.ts │ │ │ ├── header-button-survey.tsx │ │ │ ├── level-up-cta.tsx │ │ │ ├── online-presence-cta.tsx │ │ │ ├── portfolio-foundations.tsx │ │ │ ├── post-purchase.tsx │ │ │ ├── project-club.tsx │ │ │ ├── questions/ │ │ │ │ ├── multi-line.tsx │ │ │ │ └── multiple-choice-question.tsx │ │ │ ├── survey-reducer.test.js │ │ │ ├── survey-reducer.ts │ │ │ └── survey.tsx │ │ ├── tag-image.tsx │ │ ├── talks/ │ │ │ ├── page-seo.tsx │ │ │ ├── talk-player.css │ │ │ └── talk-player.tsx │ │ ├── team/ │ │ │ ├── account-ownership-transfer.tsx │ │ │ ├── billing-section.tsx │ │ │ ├── copy-to-clipboard.tsx │ │ │ ├── member-table.tsx │ │ │ ├── remove-member-confirm-dialog.tsx │ │ │ ├── team-name.tsx │ │ │ └── transfer-ownership-confirm-dialog.tsx │ │ ├── tips/ │ │ │ ├── related-tips.tsx │ │ │ ├── styles.css │ │ │ ├── tip-card.tsx │ │ │ ├── tip-player.tsx │ │ │ ├── tip-teaser.tsx │ │ │ ├── tip-template.tsx │ │ │ ├── tip-uploader.tsx │ │ │ └── ui/ │ │ │ ├── card.tsx │ │ │ └── markdown-codeblock.tsx │ │ ├── tweet-resource.tsx │ │ ├── ui/ │ │ │ ├── code-block-with-copy.tsx │ │ │ └── switch.tsx │ │ ├── upload/ │ │ │ ├── modern-react-s3-uploader.tsx │ │ │ ├── s3upload.js │ │ │ └── video-uploader.tsx │ │ ├── users/ │ │ │ ├── request-email-change-form.tsx │ │ │ ├── saml-sign-in-form.tsx │ │ │ └── subscription-details.tsx │ │ ├── video/ │ │ │ └── video-transcript.tsx │ │ ├── workshop/ │ │ │ ├── claude-code/ │ │ │ │ ├── Hero.tsx │ │ │ │ ├── SignUpForm.tsx │ │ │ │ ├── active-sale-with-ppp-mock.tsx │ │ │ │ ├── active-sale.stories.mdx │ │ │ │ ├── active-sale.stories.tsx │ │ │ │ ├── active-sale.tsx │ │ │ │ ├── contact-form.tsx │ │ │ │ ├── cta-section.tsx │ │ │ │ ├── hero-logo.tsx │ │ │ │ ├── instructor-terminal.tsx │ │ │ │ ├── ppp-demo.stories.tsx │ │ │ │ ├── ppp-pricing-demo.tsx │ │ │ │ └── workshop-history.tsx │ │ │ ├── cursor/ │ │ │ │ ├── Conclusion.tsx │ │ │ │ ├── Features.tsx │ │ │ │ ├── Hero.tsx │ │ │ │ ├── SignUpForm.tsx │ │ │ │ ├── TestimonialBar.tsx │ │ │ │ ├── WorkshopStructure.tsx │ │ │ │ ├── active-sale.tsx │ │ │ │ ├── team/ │ │ │ │ │ ├── contact-form.tsx │ │ │ │ │ ├── hero.tsx │ │ │ │ │ ├── workshop-audience.tsx │ │ │ │ │ ├── workshop-benefits.tsx │ │ │ │ │ ├── workshop-content.tsx │ │ │ │ │ └── workshop-value.tsx │ │ │ │ └── ui/ │ │ │ │ ├── button.tsx │ │ │ │ ├── input.tsx │ │ │ │ └── utils.ts │ │ │ ├── shared/ │ │ │ │ ├── Instructor.tsx │ │ │ │ ├── animations.ts │ │ │ │ ├── cta-section.tsx │ │ │ │ ├── invoices/ │ │ │ │ │ ├── invoice-card.tsx │ │ │ │ │ ├── invoice-custom-text.tsx │ │ │ │ │ ├── invoice-print-button.tsx │ │ │ │ │ ├── invoice-teaser.tsx │ │ │ │ │ └── types.ts │ │ │ │ ├── parity-coupon-message.tsx │ │ │ │ ├── styles.css │ │ │ │ ├── testimonial.tsx │ │ │ │ └── time-and-location.tsx │ │ │ └── workshop-cta.tsx │ │ ├── workshop-transactions/ │ │ │ └── index.tsx │ │ └── write-for-egghead/ │ │ └── topic-list.tsx │ ├── config.ts │ ├── context/ │ │ └── viewer-context.tsx │ ├── data/ │ │ ├── courseDependencies.ts │ │ ├── courseDependenciesData.js │ │ ├── hot-content-slugs.json │ │ ├── hot-lesson-paths.json │ │ ├── hot-search-paths.json │ │ ├── podcast-archive.json │ │ ├── sorting-hat.ts │ │ └── test-survey.ts │ ├── db/ │ │ └── index.ts │ ├── emails/ │ │ ├── basic-email.tsx │ │ ├── lifetime-promo-email.tsx │ │ └── specific-product-email.tsx │ ├── hooks/ │ │ ├── mux/ │ │ │ ├── get-next-section.ts │ │ │ ├── use-global-player-shortcut.ts │ │ │ ├── use-mux-player.tsx │ │ │ ├── use-next-lesson.ts │ │ │ ├── use-player-prefs.ts │ │ │ └── use-video-player-overlay.tsx │ │ ├── next-data-sections.tsx │ │ ├── use-account.ts │ │ ├── use-affiliate-assigner.tsx │ │ ├── use-cio.tsx │ │ ├── use-commerce-machine.ts │ │ ├── use-convertkit-form.ts │ │ ├── use-copy-as-prompt.ts │ │ ├── use-egghead-schedule.tsx │ │ ├── use-enhanced-transcript.ts │ │ ├── use-experience-api.tsx │ │ ├── use-file-upload-reducer.tsx │ │ ├── use-identity-required.tsx │ │ ├── use-last-resource.tsx │ │ ├── use-lesson.tsx │ │ ├── use-load-topic-data.ts │ │ ├── use-logrocket.tsx │ │ ├── use-mux-player.tsx │ │ ├── use-next-up-data.tsx │ │ ├── use-purchase-and-play.ts │ │ ├── use-question.ts │ │ ├── use-share-course-review.tsx │ │ ├── use-token-signer.tsx │ │ └── use-video-resource.tsx │ ├── icons/ │ │ └── index.tsx │ ├── inngest/ │ │ ├── events/ │ │ │ ├── course-unpublished-event.ts │ │ │ ├── deepgram-webhook.ts │ │ │ ├── guide-published.ts │ │ │ ├── identify-customer-io.ts │ │ │ ├── index-lessons-forever-event.ts │ │ │ ├── lifetime-purchase.ts │ │ │ ├── mux-add-srt-to-asset.ts │ │ │ ├── mux-webhook.ts │ │ │ ├── received-transloadit-notification.ts │ │ │ ├── sanity/ │ │ │ │ └── webhooks/ │ │ │ │ └── lesson/ │ │ │ │ └── created.ts │ │ │ ├── sanity-course-document-created.ts │ │ │ ├── sanity-post.ts │ │ │ ├── send-feedback-email.ts │ │ │ ├── send-slack-message.ts │ │ │ ├── specific-product-purchase.ts │ │ │ ├── stripe-webhook.ts │ │ │ ├── tips.ts │ │ │ ├── transcript-requested.ts │ │ │ ├── verified-transloadit-notification.ts │ │ │ ├── video-uploaded.ts │ │ │ └── workshop-quote-request.ts │ │ ├── functions/ │ │ │ ├── create-course/ │ │ │ │ ├── index.ts │ │ │ │ └── utils/ │ │ │ │ ├── addLessonsToCourse.ts │ │ │ │ ├── createCourseInRails.ts │ │ │ │ ├── createEggAxios.ts │ │ │ │ ├── saveCourseDataToSanity.ts │ │ │ │ ├── updateOwnerToInstructor.ts │ │ │ │ └── upsertCourseToTypesense.ts │ │ │ ├── create-lesson.ts │ │ │ ├── handle-transloadit-notification.ts │ │ │ ├── identify-customer-io.ts │ │ │ ├── index-lessons.ts │ │ │ ├── lifetime-purchase.ts │ │ │ ├── mux/ │ │ │ │ ├── add-srt-to-mux-asset.ts │ │ │ │ └── mux-webhooks-handlers.ts │ │ │ ├── send-feedback-email.ts │ │ │ ├── send-slack-message.ts │ │ │ ├── send-specific-product-email.ts │ │ │ ├── send-workshop-quote-email.ts │ │ │ ├── stripe-webhook-handlers.ts │ │ │ ├── tip-video-uploaded.ts │ │ │ ├── transcript-ready.ts │ │ │ ├── typesense/ │ │ │ │ ├── delete-document.ts │ │ │ │ └── upsert-guide-to-typesense.ts │ │ │ └── video-uploaded.ts │ │ ├── inngest.config.ts │ │ ├── inngest.server.ts │ │ └── utils/ │ │ ├── lifetime-helpers.ts │ │ ├── specific-product-helpers.ts │ │ ├── stripe-helpers.ts │ │ └── stripe-webhook-utils.ts │ ├── layouts/ │ │ ├── fancy-guide.tsx │ │ ├── index.tsx │ │ └── ultimate-guide.tsx │ ├── lib/ │ │ ├── __tests__/ │ │ │ ├── course-builder-db.test.ts │ │ │ ├── course-resources.integration.test.ts │ │ │ ├── course-slugs.test.ts │ │ │ ├── email-change-requests.test.ts │ │ │ ├── format-content-as-prompt.test.ts │ │ │ ├── get-course-builder-metadata.test.ts │ │ │ ├── get-post.test.ts │ │ │ ├── load-lesson.integration.test.ts │ │ │ ├── markdown-dependency-compat.test.ts │ │ │ ├── playlists.integration.test.ts │ │ │ ├── podcasts.test.ts │ │ │ └── search-url-builder.test.ts │ │ ├── accounts.ts │ │ ├── ai-dev-essentials.ts │ │ ├── collections.ts │ │ ├── config.ts │ │ ├── contacts.ts │ │ ├── course-builder-db.ts │ │ ├── course-builder.ts │ │ ├── course-card.ts │ │ ├── course-resources.ts │ │ ├── course-slugs.ts │ │ ├── courses/ │ │ │ ├── get-latest-courses.ts │ │ │ ├── types.ts │ │ │ └── utils.ts │ │ ├── courses-query.ts │ │ ├── courses.ts │ │ ├── current-user.ts │ │ ├── customer-io.ts │ │ ├── customer.ts │ │ ├── db.ts │ │ ├── debug-logger.ts │ │ ├── deepgram-order-transcript.ts │ │ ├── deepgram-results-processor.ts │ │ ├── email-change-requests.ts │ │ ├── feature-flags.ts │ │ ├── format-content-as-prompt.ts │ │ ├── get-course-builder-metadata.ts │ │ ├── get-mux-options.ts │ │ ├── gifts.ts │ │ ├── guides-from-course-builder.ts │ │ ├── hot-content-slugs.ts │ │ ├── hot-lesson-paths.ts │ │ ├── hot-search-paths.ts │ │ ├── instructor-feed.ts │ │ ├── instructor-slug-aliases.ts │ │ ├── instructors.ts │ │ ├── jumbotron.ts │ │ ├── lesson-comments.ts │ │ ├── lessons.ts │ │ ├── likes.ts │ │ ├── load-course-builder-metadata-wrapper.ts │ │ ├── load-guide-wrapper.ts │ │ ├── logging.ts │ │ ├── mux.ts │ │ ├── name-to-slug.ts │ │ ├── playlists.ts │ │ ├── podcasts.ts │ │ ├── posthog-client.ts │ │ ├── posts/ │ │ │ ├── get-course.ts │ │ │ ├── get-post.ts │ │ │ ├── get-tags.ts │ │ │ └── utils.ts │ │ ├── posts-query.ts │ │ ├── prices.ts │ │ ├── progress.ts │ │ ├── ratings.ts │ │ ├── sale.ts │ │ ├── sanity-allowlist.ts │ │ ├── search-url-builder.ts │ │ ├── search-url-state.ts │ │ ├── search.ts │ │ ├── series-ranker.ts │ │ ├── slack.ts │ │ ├── srt-processor.ts │ │ ├── subscriptions.ts │ │ ├── tags.ts │ │ ├── teams.ts │ │ ├── tips.ts │ │ ├── upstash-redis.ts │ │ ├── users.ts │ │ ├── video-resources.ts │ │ └── viewer.ts │ ├── machines/ │ │ ├── __tests__/ │ │ │ ├── auth-token-polling-machine.test.ts │ │ │ └── commerce-machine.test.ts │ │ ├── auth-token-polling-machine.ts │ │ ├── commerce-machine.ts │ │ ├── confirmation-dialog-machine.ts │ │ ├── draft-course-machine.ts │ │ ├── lesson-machine.ts │ │ ├── request-email-change-machine.ts │ │ └── strong-confirmation-dialog-machine.ts │ ├── markdown/ │ │ ├── mdx-components.tsx │ │ ├── mdx.tsx │ │ ├── serialize-mdx.ts │ │ ├── shiki-remote-plugin.ts │ │ └── transcript-components.tsx │ ├── middleware.ts │ ├── module-builder/ │ │ ├── cloudinary-video-uploader.ts │ │ ├── create-tip-form.tsx │ │ ├── edit-tip-form.tsx │ │ ├── get-unique-filename.ts │ │ ├── upload-file.ts │ │ ├── use-file-change.ts │ │ └── video-uploader.tsx │ ├── next-seo.json │ ├── pages/ │ │ ├── 20-days.tsx │ │ ├── 404.tsx │ │ ├── 500.tsx │ │ ├── [post].tsx │ │ ├── _app.tsx │ │ ├── _document.tsx │ │ ├── _error.tsx │ │ ├── account-ownership-transfer/ │ │ │ └── [guid].tsx │ │ ├── answer/ │ │ │ └── online-presence.tsx │ │ ├── api/ │ │ │ ├── aws/ │ │ │ │ └── sign-s3.ts │ │ │ ├── cio/ │ │ │ │ └── identify/ │ │ │ │ └── [id].ts │ │ │ ├── cio-subscriber.ts │ │ │ ├── cors.ts │ │ │ ├── courses/ │ │ │ │ └── [slug]/ │ │ │ │ └── authed-bits.ts │ │ │ ├── discord.ts │ │ │ ├── newsletter/ │ │ │ │ └── subscribe.ts │ │ │ ├── og/ │ │ │ │ └── og-default.tsx │ │ │ ├── progress.ts │ │ │ ├── sanity/ │ │ │ │ └── lessons/ │ │ │ │ └── create.ts │ │ │ ├── schedule.ts │ │ │ ├── stripe/ │ │ │ │ ├── billing/ │ │ │ │ │ └── session.ts │ │ │ │ ├── checkout/ │ │ │ │ │ └── session.ts │ │ │ │ ├── transaction.ts │ │ │ │ └── webhook.ts │ │ │ ├── timeout.ts │ │ │ ├── topic.tsx │ │ │ ├── users/ │ │ │ │ ├── check-pro-status.ts │ │ │ │ ├── current.test.ts │ │ │ │ └── current.ts │ │ │ └── webhooks/ │ │ │ └── sanity/ │ │ │ └── videoResource/ │ │ │ ├── created.ts │ │ │ └── updated.ts │ │ ├── ask.tsx │ │ ├── blank.tsx │ │ ├── bookmarks/ │ │ │ └── index.tsx │ │ ├── case-studies/ │ │ │ ├── [slug].tsx │ │ │ └── index.tsx │ │ ├── clubs/ │ │ │ └── portfolio-project.mdx │ │ ├── code-of-conduct.mdx │ │ ├── collections/ │ │ │ └── [slug].tsx │ │ ├── confirm/ │ │ │ ├── forever.tsx │ │ │ └── membership.tsx │ │ ├── confirm.tsx │ │ ├── confirmed.tsx │ │ ├── courses/ │ │ │ ├── [course]/ │ │ │ │ └── index.tsx │ │ │ └── index.tsx │ │ ├── developer-portfolio-foundations/ │ │ │ ├── [slug].tsx │ │ │ └── index.mdx │ │ ├── discord/ │ │ │ ├── callback.tsx │ │ │ └── index.tsx │ │ ├── egghead-for-teams.tsx │ │ ├── email-change-request/ │ │ │ └── [token].tsx │ │ ├── faq.mdx │ │ ├── forever/ │ │ │ ├── email/ │ │ │ │ └── index.tsx │ │ │ └── index.tsx │ │ ├── gifts/ │ │ │ └── claim/ │ │ │ └── [guid].tsx │ │ ├── guides/ │ │ │ ├── [slug].tsx │ │ │ └── index.tsx │ │ ├── i/ │ │ │ └── [slug]/ │ │ │ ├── atom.xml.tsx │ │ │ ├── feed.json.tsx │ │ │ └── rss.xml.tsx │ │ ├── instructor/ │ │ │ └── index.tsx │ │ ├── invoices/ │ │ │ ├── [stripeTransactionId].tsx │ │ │ └── index.tsx │ │ ├── learn/ │ │ │ ├── 30x500/ │ │ │ │ ├── index.mdx │ │ │ │ └── sales-safari/ │ │ │ │ └── index.mdx │ │ │ ├── [slug].tsx │ │ │ ├── developer-portfolio/ │ │ │ │ └── index.tsx │ │ │ ├── digital-gardening/ │ │ │ │ └── index.tsx │ │ │ ├── javascript/ │ │ │ │ ├── es6.mdx │ │ │ │ ├── index.mdx │ │ │ │ ├── interact-DOM/ │ │ │ │ │ └── index.mdx │ │ │ │ ├── javascript-introduction/ │ │ │ │ │ └── index.mdx │ │ │ │ └── the-dom/ │ │ │ │ ├── DOMScroller.js │ │ │ │ ├── NodesScroller.js │ │ │ │ └── index.mdx │ │ │ ├── react/ │ │ │ │ ├── beginners/ │ │ │ │ │ ├── index.mdx │ │ │ │ │ ├── js-before-react.mdx │ │ │ │ │ ├── wtf-is-jsx.mdx │ │ │ │ │ └── wtf-is-react.mdx │ │ │ │ ├── index.mdx │ │ │ │ └── toolkit-or-framework.mdx │ │ │ └── state-management/ │ │ │ └── index.tsx │ │ ├── lessons/ │ │ │ └── [slug].tsx │ │ ├── level-up/ │ │ │ └── index.mdx │ │ ├── login.tsx │ │ ├── logout.tsx │ │ ├── newsletters/ │ │ │ └── ai-dev-essentials.tsx │ │ ├── own-your-online-presence/ │ │ │ ├── [slug].tsx │ │ │ └── index.mdx │ │ ├── playlists/ │ │ │ └── [slug].tsx │ │ ├── podcasts/ │ │ │ └── [slug].tsx │ │ ├── portfolios/ │ │ │ ├── [slug].tsx │ │ │ └── index.tsx │ │ ├── pricing/ │ │ │ ├── email/ │ │ │ │ └── index.tsx │ │ │ └── index.tsx │ │ ├── privacy.mdx │ │ ├── projects/ │ │ │ ├── build-a-developer-blog-with-gatsby/ │ │ │ │ └── index.tsx │ │ │ ├── build-modern-layouts-with-css-grid/ │ │ │ │ └── index.tsx │ │ │ ├── create-an-ecommerce-store-with-next-js-and-stripe-checkout/ │ │ │ │ └── index.tsx │ │ │ ├── introduction-to-cloudflare-workers/ │ │ │ │ └── index.tsx │ │ │ └── the-beginner-s-guide-to-vue-3/ │ │ │ └── index.tsx │ │ ├── q/ │ │ │ └── [[...all]].tsx │ │ ├── redirect.tsx │ │ ├── server-sitemap.xml/ │ │ │ └── index.tsx │ │ ├── signup/ │ │ │ ├── [topic].tsx │ │ │ └── index.tsx │ │ ├── site-directory/ │ │ │ ├── [tag].tsx │ │ │ ├── index.tsx │ │ │ └── tags.json │ │ ├── talks/ │ │ │ ├── [slug].tsx │ │ │ └── index.tsx │ │ ├── team/ │ │ │ └── index.tsx │ │ ├── team-invite/ │ │ │ └── [token].tsx │ │ ├── tipz/ │ │ │ └── index.tsx │ │ ├── topics.tsx │ │ ├── unsubscribed.tsx │ │ ├── upload/ │ │ │ └── index.tsx │ │ ├── workshop/ │ │ │ ├── claude-code/ │ │ │ │ ├── boss.tsx │ │ │ │ ├── index.tsx │ │ │ │ └── invoice/ │ │ │ │ └── [merchantChargeId].tsx │ │ │ ├── cursor/ │ │ │ │ ├── index.tsx │ │ │ │ ├── invoice/ │ │ │ │ │ └── [merchantChargeId].tsx │ │ │ │ └── team/ │ │ │ │ └── index.tsx │ │ │ └── email/ │ │ │ └── index.tsx │ │ └── write-for-egghead/ │ │ └── index.mdx │ ├── player/ │ │ ├── context.tsx │ │ ├── hls-source.tsx │ │ ├── index.ts │ │ ├── player.tsx │ │ └── selectors.ts │ ├── schemas/ │ │ ├── collection.ts │ │ ├── exercise.ts │ │ ├── guide.ts │ │ ├── lesson.ts │ │ ├── list.ts │ │ ├── module.ts │ │ ├── post.ts │ │ ├── resource.ts │ │ ├── section.ts │ │ ├── subscriber.ts │ │ ├── testimonial.ts │ │ └── video-resource.ts │ ├── server/ │ │ ├── __tests__/ │ │ │ ├── ability.test.ts │ │ │ ├── process-customer-cookies.test.ts │ │ │ └── with-header-banner-props.test.ts │ │ ├── ability.ts │ │ ├── content-query-canonicalization.ts │ │ ├── customer-io-cookies.ts │ │ ├── egghead-user-cookies.ts │ │ ├── get-middleware-response.ts │ │ ├── header-banners.ts │ │ ├── nxtp-query.ts │ │ ├── prisma.ts │ │ ├── process-customer-cookies.ts │ │ ├── rewrite-next-response-to-path.ts │ │ ├── routers/ │ │ │ ├── _app.ts │ │ │ ├── course.ts │ │ │ ├── customer-io.ts │ │ │ ├── feature-flag.ts │ │ │ ├── instructor.ts │ │ │ ├── lesson.ts │ │ │ ├── likes.ts │ │ │ ├── progress.ts │ │ │ ├── stripe.ts │ │ │ ├── subscription-detail.ts │ │ │ ├── tips.ts │ │ │ ├── topics.ts │ │ │ └── user.ts │ │ ├── search-query-canonicalization.ts │ │ ├── transformer.ts │ │ ├── trpc.ts │ │ └── with-header-banner-props.ts │ ├── spinner.tsx │ ├── stories/ │ │ ├── Button.jsx │ │ ├── Button.stories.js │ │ ├── Configure.mdx │ │ ├── Header.jsx │ │ ├── Header.stories.js │ │ ├── Page.jsx │ │ ├── Page.stories.js │ │ ├── assets/ │ │ │ └── avif-test-image.avif │ │ ├── button.css │ │ ├── header.css │ │ └── page.css │ ├── styles/ │ │ ├── cueplayer.css │ │ ├── icons.css │ │ ├── index.css │ │ └── material-theme-dark.json │ ├── types.ts │ ├── ui/ │ │ ├── alert.tsx │ │ ├── button.tsx │ │ ├── card.tsx │ │ ├── form.tsx │ │ ├── index.tsx │ │ ├── input.tsx │ │ ├── label.tsx │ │ ├── progress.tsx │ │ ├── select.tsx │ │ ├── skeleton.tsx │ │ ├── textarea.tsx │ │ └── utils.ts │ └── utils/ │ ├── __tests__/ │ │ ├── auth.test.ts │ │ ├── compacted-merge.test.ts │ │ ├── configured-graphql-client.test.ts │ │ ├── lesson-metadata.test.ts │ │ ├── typesense-host.test.ts │ │ └── with-timeout.test.ts │ ├── affiliate-token.ts │ ├── analytics/ │ │ ├── __tests__/ │ │ │ └── ai-dev-essentials.test.ts │ │ ├── ai-dev-essentials.ts │ │ ├── events.ts │ │ ├── identify.ts │ │ ├── index.ts │ │ └── track.ts │ ├── auth.ts │ ├── axios-request-id.ts │ ├── breakpoints.ts │ ├── cio/ │ │ ├── cio-identify.ts │ │ ├── get-cio-id-from-cookie.ts │ │ ├── report-cio-api-error.ts │ │ └── subscriber-attributes.ts │ ├── code.ts │ ├── compacted-merge.ts │ ├── configured-axios.ts │ ├── configured-graphql-client.ts │ ├── configured-libhoney.ts │ ├── convert-undefined-values-to-null.ts │ ├── cookies.ts │ ├── email-is-valid.ts │ ├── fetcher.ts │ ├── format-duration.ts │ ├── get-access-token-from-cookie.ts │ ├── honeycomb-tracer.ts │ ├── is-browser.ts │ ├── is-member.ts │ ├── lesson-metadata.ts │ ├── make-store.tsx │ ├── noop.ts │ ├── parse-header-cookie.ts │ ├── parse-server-cookie.ts │ ├── preprocess-mdx.ts │ ├── prettify-url.ts │ ├── query-params-present.ts │ ├── recur.tsx │ ├── remember-email.ts │ ├── request-contact-guid.ts │ ├── request-id.ts │ ├── request-signin-email.ts │ ├── sanity-client.ts │ ├── sanity-server.ts │ ├── sanity.fetch.only.server.ts │ ├── search/ │ │ └── topic-extractor.ts │ ├── send-an-email.ts │ ├── sleep.ts │ ├── srt-to-webvtt.js │ ├── stripe-customer.ts │ ├── stripe.ts │ ├── structured-log.ts │ ├── test/ │ │ └── simulated-clock.ts │ ├── time-utils.ts │ ├── tracing-js/ │ │ └── dist/ │ │ ├── src/ │ │ │ ├── deterministic-sampler.d.ts │ │ │ ├── deterministic-sampler.js │ │ │ ├── generate-id.d.ts │ │ │ ├── generate-id.js │ │ │ ├── headers.d.ts │ │ │ ├── headers.js │ │ │ ├── index.d.ts │ │ │ ├── index.js │ │ │ ├── setup-fetch.d.ts │ │ │ ├── setup-fetch.js │ │ │ ├── setup-http.d.ts │ │ │ ├── setup-http.js │ │ │ ├── shared.d.ts │ │ │ ├── shared.js │ │ │ ├── span-context.d.ts │ │ │ ├── span-context.js │ │ │ ├── span.d.ts │ │ │ ├── span.js │ │ │ ├── tags.d.ts │ │ │ ├── tags.js │ │ │ ├── tracer.d.ts │ │ │ └── tracer.js │ │ └── types/ │ │ └── libhoney.d.ts │ ├── typesense-host.ts │ ├── typesense.ts │ ├── video/ │ │ ├── default-handle-continue.ts │ │ └── handle-play-from-beginning.ts │ ├── with-timeout.ts │ └── workshop.ts ├── studio/ │ ├── .gitignore │ ├── .node-version │ ├── README.md │ ├── deskStructure.ts │ ├── package.json │ ├── plugins/ │ │ └── .gitkeep │ ├── resolvePreviewUrl.js │ ├── resolveProductionUrl.js │ ├── sanity.cli.ts │ ├── sanity.config.tsx │ ├── sanity.json.template │ ├── schemas/ │ │ ├── components/ │ │ │ ├── path-input.module.css │ │ │ ├── path-input.tsx │ │ │ └── portable-text-editor-components.tsx │ │ ├── documents/ │ │ │ ├── bigIdea.tsx │ │ │ ├── caseStudy.tsx │ │ │ ├── category.ts │ │ │ ├── collaborator.tsx │ │ │ ├── course.ts │ │ │ ├── email-address.ts │ │ │ ├── email-broadcast.ts │ │ │ ├── email-template.ts │ │ │ ├── essentialQuestion.ts │ │ │ ├── lesson.ts │ │ │ ├── person.tsx │ │ │ ├── podcastEpisode.ts │ │ │ ├── podcastSeason.ts │ │ │ ├── post.ts │ │ │ ├── resource.tsx │ │ │ ├── section.ts │ │ │ ├── software-library.tsx │ │ │ ├── tip.ts │ │ │ └── videoResource.ts │ │ ├── objects/ │ │ │ ├── author-reference.jsx │ │ │ ├── blockContent.js │ │ │ ├── blockText.js │ │ │ ├── body-portable-text.js │ │ │ ├── cta.js │ │ │ ├── email-send-at.ts │ │ │ ├── excerpt-portable-text.js │ │ │ ├── image-url.jsx │ │ │ ├── link.js │ │ │ ├── main-image.js │ │ │ ├── markdownText.js │ │ │ ├── muxAsset.js │ │ │ ├── production-process-state.js │ │ │ ├── scrimba-resource.js │ │ │ ├── seo.js │ │ │ ├── string-list.js │ │ │ └── versioned-software-library.jsx │ │ ├── plugs/ │ │ │ └── ctaPlug.js │ │ └── schema.js │ ├── set_sanity_env │ ├── src/ │ │ ├── components/ │ │ │ └── logo.tsx │ │ └── structure/ │ │ ├── blog.js │ │ ├── caseStudies.js │ │ ├── courses.js │ │ ├── feature.js │ │ ├── lessons.js │ │ ├── pages.js │ │ ├── portfolio.js │ │ ├── resources-courses.js │ │ ├── resources.js │ │ ├── tips.js │ │ └── videos.js │ ├── static/ │ │ └── .gitkeep │ ├── tsconfig.json │ └── webhook_projections/ │ └── courseCreate.groq ├── tags-sitemap.js ├── tailwind.config.js ├── test-copy-button.js ├── tsconfig.json └── vercel.json