Copy disabled (too large)
Download .txt
Showing preview only (24,330K chars total). Download the full file to get everything.
Repository: kamranahmedse/developer-roadmap
Branch: master
Commit: a24c842dc985
Files: 11470
Total size: 20.4 MB
Directory structure:
gitextract__yy4215q/
├── .cursor/
│ └── rules/
│ ├── content-migration.mdc
│ └── gh-cli.mdc
├── .github/
│ ├── FUNDING.yml
│ ├── ISSUE_TEMPLATE/
│ │ ├── 01-suggest-changes.yml
│ │ ├── 02-bug-report.yml
│ │ ├── 03-feature-suggestion.yml
│ │ ├── 04-roadmap-contribution.yml
│ │ ├── 05-something-else.yml
│ │ └── config.yml
│ └── workflows/
│ ├── aws-costs.yml
│ ├── cleanup-orphaned-content.yml
│ ├── close-feedback-pr.yml
│ ├── cloudfront-api-cache.yml
│ ├── cloudfront-fe-cache.yml
│ ├── deployment.yml
│ ├── label-issue.yml
│ ├── sync-content-to-repo.yml
│ ├── sync-repo-to-database.yml
│ └── upgrade-dependencies.yml
├── .gitignore
├── .npmrc
├── .prettierignore
├── .prettierrc.cjs
├── .vscode/
│ ├── extensions.json
│ ├── launch.json
│ └── settings.json
├── astro.config.mjs
├── code_of_conduct.md
├── contributing.md
├── license
├── package.json
├── packages/
│ └── .gitkeep
├── playwright.config.ts
├── pnpm-workspace.yaml
├── public/
│ └── manifest/
│ └── manifest.json
├── readme.md
├── scripts/
│ ├── assign-label-types.cjs
│ ├── best-practice-content.cjs
│ ├── best-practice-dirs.cjs
│ ├── cleanup-orphaned-content.ts
│ ├── close-issues.sh
│ ├── compress-images.ts
│ ├── compressed-images.json
│ ├── create-roadmap-labels.sh
│ ├── editor-roadmap-assets.ts
│ ├── editor-roadmap-content-json.ts
│ ├── editor-roadmap-content.ts
│ ├── editor-roadmap-dirs.ts
│ ├── extract-guide-images.cjs
│ ├── gemini-roadmap-content.ts
│ ├── generate-og-images.mjs
│ ├── generate-renderer.sh
│ ├── label-issues.sh
│ ├── migrate-content-repo-to-database.ts
│ ├── migrate-editor-roadmap.ts
│ ├── official-roadmap-assets.ts
│ ├── page-data-agg.cjs
│ ├── readme.md
│ ├── refresh-assets.ts
│ ├── rename-content.ts
│ ├── roadmap-content.cjs
│ ├── roadmap-dirs.cjs
│ ├── roadmap-links.cjs
│ ├── roadmap-tree-content.js
│ ├── sync-content-to-repo.ts
│ ├── sync-repo-to-database.ts
│ ├── sync-roadmap-to-database.ts
│ ├── update-sponsors.cjs
│ └── warm-urls.sh
├── sitemap.mjs
├── src/
│ ├── api/
│ │ ├── ai-roadmap.ts
│ │ ├── api.ts
│ │ ├── leaderboard.ts
│ │ ├── project.ts
│ │ ├── roadmap.ts
│ │ └── user.ts
│ ├── components/
│ │ ├── AIChat/
│ │ │ ├── AIChat.css
│ │ │ ├── AIChat.tsx
│ │ │ ├── AIChatCouse.tsx
│ │ │ ├── ChatHistory.tsx
│ │ │ ├── PersonalizedResponseForm.tsx
│ │ │ ├── QuickActionButton.tsx
│ │ │ ├── QuickHelpPrompts.tsx
│ │ │ └── UploadResumeModal.tsx
│ │ ├── AIChatHistory/
│ │ │ ├── AIChatHistory.tsx
│ │ │ ├── AIChatLayout.tsx
│ │ │ ├── ChatHistoryAction.tsx
│ │ │ ├── ChatHistoryError.tsx
│ │ │ ├── ChatHistoryGroup.tsx
│ │ │ ├── ChatHistoryItem.tsx
│ │ │ ├── ListChatHistory.tsx
│ │ │ ├── ListChatHistorySkeleton.tsx
│ │ │ └── SearchAIChatHistory.tsx
│ │ ├── AIGuide/
│ │ │ ├── AIGuideActions.tsx
│ │ │ ├── AIGuideCard.tsx
│ │ │ └── AILibraryLayout.tsx
│ │ ├── AIQuiz/
│ │ │ ├── AIMCQQuestion.tsx
│ │ │ ├── AIOpenEndedQuestion.tsx
│ │ │ ├── AIQuiz.tsx
│ │ │ ├── AIQuizActions.tsx
│ │ │ ├── AIQuizCard.tsx
│ │ │ ├── AIQuizContent.tsx
│ │ │ ├── AIQuizGenerator.tsx
│ │ │ ├── AIQuizLayout.tsx
│ │ │ ├── AIQuizResultStrip.tsx
│ │ │ ├── AIQuizResults.tsx
│ │ │ ├── CircularProgress.tsx
│ │ │ ├── GenerateAIQuiz.tsx
│ │ │ ├── QuizTopNavigation.tsx
│ │ │ └── UserQuizzesList.tsx
│ │ ├── AIRoadmap/
│ │ │ ├── AIRoadmap.css
│ │ │ ├── AIRoadmap.tsx
│ │ │ ├── AIRoadmapActions.tsx
│ │ │ ├── AIRoadmapCard.tsx
│ │ │ ├── AIRoadmapChat.tsx
│ │ │ ├── AIRoadmapContent.tsx
│ │ │ ├── AIRoadmapRegenerate.tsx
│ │ │ ├── GenerateAIRoadmap.tsx
│ │ │ └── UserRoadmapsList.tsx
│ │ ├── AITutor/
│ │ │ ├── AIExploreCourseListing.tsx
│ │ │ ├── AIFeaturedCoursesListing.tsx
│ │ │ ├── AILoadingState.tsx
│ │ │ ├── AITutorHeader.tsx
│ │ │ ├── AITutorLayout.tsx
│ │ │ ├── AITutorLimits.tsx
│ │ │ ├── AITutorSidebar.tsx
│ │ │ ├── AITutorSidebarProps.tsx
│ │ │ ├── AITutorTallMessage.tsx
│ │ │ ├── BaseDropdown.tsx
│ │ │ ├── DifficultyDropdown.tsx
│ │ │ ├── LoginToView.tsx
│ │ │ ├── NatureDropdown.tsx
│ │ │ ├── UpgradeSidebarCard.tsx
│ │ │ └── UserDropdown.tsx
│ │ ├── AIUsageWarning/
│ │ │ └── AIUsageWarning.tsx
│ │ ├── AccountSidebar/
│ │ │ └── AccountSidebarUpgrade.tsx
│ │ ├── AccountSidebar.astro
│ │ ├── AccountStreak/
│ │ │ ├── AccountStreak.tsx
│ │ │ ├── AccountStreakHeatmap.css
│ │ │ ├── InviteFriends.tsx
│ │ │ └── StreakDay.tsx
│ │ ├── AccountTerms.tsx
│ │ ├── Activity/
│ │ │ ├── ActivityStream.tsx
│ │ │ ├── ActivityTopicTitles.tsx
│ │ │ ├── ActivityTopicsModal.tsx
│ │ │ ├── EmptyStream.tsx
│ │ │ ├── ProjectProgress.tsx
│ │ │ ├── ProjectProgressActions.tsx
│ │ │ ├── ProjectStatus.tsx
│ │ │ ├── ResourceProgress.tsx
│ │ │ └── ResourceProgressActions.tsx
│ │ ├── AddTeamRoadmap.tsx
│ │ ├── AdvertiseForm.tsx
│ │ ├── Analytics/
│ │ │ ├── Analytics.astro
│ │ │ ├── Bluconic.astro
│ │ │ ├── Clarity.astro
│ │ │ ├── GoogleAd.astro
│ │ │ ├── GoogleAdSlot.astro
│ │ │ ├── Hubspot.astro
│ │ │ ├── LinkedIn.astro
│ │ │ ├── OneTrust.astro
│ │ │ ├── RedditPixel.astro
│ │ │ └── analytics.ts
│ │ ├── AppChecklist.tsx
│ │ ├── AstroIcon.astro
│ │ ├── AuthenticationFlow/
│ │ │ ├── AuthenticationForm.tsx
│ │ │ ├── CourseLoginPopup.tsx
│ │ │ ├── Divider.astro
│ │ │ ├── EmailLoginForm.tsx
│ │ │ ├── EmailSignupForm.tsx
│ │ │ ├── ForgotPasswordForm.tsx
│ │ │ ├── GitHubButton.tsx
│ │ │ ├── GoogleButton.tsx
│ │ │ ├── LinkedInButton.tsx
│ │ │ ├── LoginPopup.astro
│ │ │ ├── ResetPasswordForm.tsx
│ │ │ ├── TriggerVerifyAccount.tsx
│ │ │ ├── TriggerVerifyEmail.tsx
│ │ │ └── VerificationEmailMessage.tsx
│ │ ├── Authenticator/
│ │ │ ├── Authenticator.astro
│ │ │ └── authenticator.ts
│ │ ├── Badge.tsx
│ │ ├── Befriend.tsx
│ │ ├── BestPracticeHeader.astro
│ │ ├── BestPracticeHint.astro
│ │ ├── Billing/
│ │ │ ├── BillingPage.tsx
│ │ │ ├── BillingWarning.tsx
│ │ │ ├── CheckSubscriptionVerification.tsx
│ │ │ ├── EmptyBillingScreen.tsx
│ │ │ ├── GlobalUpgradeModal.tsx
│ │ │ ├── UpdatePlanConfirmation.tsx
│ │ │ ├── UpgradeAccountModal.tsx
│ │ │ └── VerifyUpgrade.tsx
│ │ ├── Changelog/
│ │ │ ├── ChangelogItem.astro
│ │ │ └── ChangelogLaunch.astro
│ │ ├── ChangelogBanner.astro
│ │ ├── ChangelogImages.tsx
│ │ ├── ChatEditor/
│ │ │ ├── ChatEditor.css
│ │ │ ├── ChatEditor.tsx
│ │ │ └── VariableExtension/
│ │ │ ├── VariableExtension.tsx
│ │ │ └── VariableSuggestion.tsx
│ │ ├── ChatMessages/
│ │ │ ├── AIChat.css
│ │ │ ├── RoadmapChatIntroMessage.tsx
│ │ │ ├── RoadmapChatMessage.tsx
│ │ │ ├── RoadmapChatMessages.tsx
│ │ │ ├── RoadmapRecommendations.tsx
│ │ │ ├── RoadmapTopicList.tsx
│ │ │ ├── ShareResourceLink.tsx
│ │ │ ├── TopicChatMessage.tsx
│ │ │ ├── TopicChatMessages.tsx
│ │ │ ├── UserPrgressActionList.tsx
│ │ │ └── UserProgressList.tsx
│ │ ├── CommandMenu/
│ │ │ └── CommandMenu.tsx
│ │ ├── Confetti.tsx
│ │ ├── ContentGenerator/
│ │ │ ├── ContentGenerator.tsx
│ │ │ ├── FormatItem.tsx
│ │ │ └── QuestionAnswerChat.tsx
│ │ ├── CookieSettingsButton.tsx
│ │ ├── CreateTeam/
│ │ │ ├── ContentConfirmationModal.tsx
│ │ │ ├── CreateTeamForm.tsx
│ │ │ ├── NextButton.tsx
│ │ │ ├── RoadmapSelector.tsx
│ │ │ ├── RoleDropdown.tsx
│ │ │ ├── SelectRoadmapModal.tsx
│ │ │ ├── SelectRoadmapModalItem.tsx
│ │ │ ├── Step0.tsx
│ │ │ ├── Step1.tsx
│ │ │ ├── Step2.tsx
│ │ │ ├── Step3.tsx
│ │ │ ├── Step4.tsx
│ │ │ └── UpdateTeamResourceModal.tsx
│ │ ├── CustomRoadmap/
│ │ │ ├── CreateRoadmap/
│ │ │ │ ├── CreateRoadmapButton.tsx
│ │ │ │ └── CreateRoadmapModal.tsx
│ │ │ ├── CustomRoadmap.tsx
│ │ │ ├── CustomRoadmapAlert.tsx
│ │ │ ├── CustomRoadmapRatings.tsx
│ │ │ ├── CustomRoadmapRatingsModal.tsx
│ │ │ ├── EmbedRoadmapModal.tsx
│ │ │ ├── EmptyRoadmap.tsx
│ │ │ ├── FlowRoadmapRenderer.tsx
│ │ │ ├── ListRoadmapRatings.tsx
│ │ │ ├── PersonalRoadmapActionDropdown.tsx
│ │ │ ├── PersonalRoadmapList.tsx
│ │ │ ├── RateRoadmapForm.tsx
│ │ │ ├── ResourceProgressStats.tsx
│ │ │ ├── RestrictedPage.tsx
│ │ │ ├── RoadmapActionButton.tsx
│ │ │ ├── RoadmapHeader.tsx
│ │ │ ├── RoadmapHint.tsx
│ │ │ ├── RoadmapListPage.tsx
│ │ │ ├── ShareRoadmapModal.tsx
│ │ │ ├── SharedRoadmapList.tsx
│ │ │ ├── Showcase/
│ │ │ │ ├── ShowcaseAlert.tsx
│ │ │ │ ├── ShowcaseStatus.tsx
│ │ │ │ └── SubmitShowcaseWarning.tsx
│ │ │ └── SkeletonRoadmapHeader.tsx
│ │ ├── DailyDevIcon.tsx
│ │ ├── Dashboard/
│ │ │ ├── DashboardAiRoadmaps.tsx
│ │ │ ├── DashboardBookmarkCard.tsx
│ │ │ ├── DashboardCardLink.tsx
│ │ │ ├── DashboardCustomProgressCard.tsx
│ │ │ ├── DashboardPage.tsx
│ │ │ ├── DashboardProgressCard.tsx
│ │ │ ├── DashboardProjectCard.tsx
│ │ │ ├── DashboardTabButton.tsx
│ │ │ ├── DashboardTeamRoadmaps.tsx
│ │ │ ├── EmptyStackMessage.tsx
│ │ │ ├── ListDashboardCustomProgress.tsx
│ │ │ ├── LoadingProgress.tsx
│ │ │ ├── PersonalDashboard.tsx
│ │ │ ├── ProgressStack.tsx
│ │ │ ├── RecommendedRoadmaps.tsx
│ │ │ └── TeamDashboard.tsx
│ │ ├── DeleteTeamPopup.tsx
│ │ ├── DiscoverRoadmaps/
│ │ │ ├── DiscoverError.tsx
│ │ │ ├── DiscoverRoadmapSorting.tsx
│ │ │ ├── DiscoverRoadmaps.tsx
│ │ │ ├── EmptyDiscoverRoadmaps.tsx
│ │ │ └── SearchRoadmap.tsx
│ │ ├── DownloadRoadmapButton.tsx
│ │ ├── DropdownMenu.tsx
│ │ ├── EditorRoadmap/
│ │ │ ├── EditorRoadmap.tsx
│ │ │ ├── EditorRoadmapRenderer.css
│ │ │ └── EditorRoadmapRenderer.tsx
│ │ ├── ExploreAIRoadmap/
│ │ │ ├── AIRoadmapsList.tsx
│ │ │ ├── EmptyRoadmaps.tsx
│ │ │ ├── ExploreAIRoadmap.tsx
│ │ │ ├── ExploreAISearch.tsx
│ │ │ ├── ExploreAISorting.tsx
│ │ │ └── LoadingRoadmaps.tsx
│ │ ├── FAQs/
│ │ │ ├── FAQs.tsx
│ │ │ └── Question.tsx
│ │ ├── FeatureAnnouncement.tsx
│ │ ├── FeaturedGuides/
│ │ │ ├── FeaturedGuideList.tsx
│ │ │ └── GuideListItem.tsx
│ │ ├── FeaturedItems/
│ │ │ ├── FavoriteIcon.tsx
│ │ │ ├── FeaturedItem.astro
│ │ │ ├── FeaturedItems.astro
│ │ │ └── MarkFavorite.tsx
│ │ ├── FeaturedVideos/
│ │ │ ├── FeaturedVideoList.tsx
│ │ │ └── VideoListItem.tsx
│ │ ├── Feedback/
│ │ │ └── SubmitFeedbackPopup.tsx
│ │ ├── Footer.astro
│ │ ├── FrameRenderer/
│ │ │ ├── FrameRenderer.astro
│ │ │ ├── FrameRenderer.css
│ │ │ ├── ProgressNudge.tsx
│ │ │ ├── RoadmapFloatingChat.tsx
│ │ │ └── renderer.ts
│ │ ├── Friends/
│ │ │ └── SidebarFriendsCounter.tsx
│ │ ├── GenerateCourse/
│ │ │ ├── AICourse.tsx
│ │ │ ├── AICourseActions.tsx
│ │ │ ├── AICourseCard.tsx
│ │ │ ├── AICourseContent.tsx
│ │ │ ├── AICourseFooter.tsx
│ │ │ ├── AICourseLesson.tsx
│ │ │ ├── AICourseLessonChat.css
│ │ │ ├── AICourseLessonChat.tsx
│ │ │ ├── AICourseLimit.tsx
│ │ │ ├── AICourseOutlineHeader.tsx
│ │ │ ├── AICourseOutlineView.tsx
│ │ │ ├── AICourseRoadmapView.tsx
│ │ │ ├── AICourseSearch.tsx
│ │ │ ├── AICourseSidebarModuleList.tsx
│ │ │ ├── AILimitsPopup.tsx
│ │ │ ├── AIRoadmapViewSwitch.tsx
│ │ │ ├── CircularProgress.tsx
│ │ │ ├── FineTuneCourse.tsx
│ │ │ ├── ForkCourseAlert.tsx
│ │ │ ├── ForkCourseConfirmation.tsx
│ │ │ ├── GenerateAICourse.tsx
│ │ │ ├── GetAICourse.tsx
│ │ │ ├── ModifyCoursePrompt.tsx
│ │ │ ├── RegenerateLesson.tsx
│ │ │ ├── RegenerateOutline.tsx
│ │ │ ├── Resizeable.tsx
│ │ │ ├── TestMyKnowledgeAction.tsx
│ │ │ └── UserCoursesList.tsx
│ │ ├── GenerateGuide/
│ │ │ ├── AIGuide.tsx
│ │ │ ├── AIGuideChat.tsx
│ │ │ ├── AIGuideContent.css
│ │ │ ├── AIGuideContent.tsx
│ │ │ ├── AIGuideRegenerate.tsx
│ │ │ ├── GenerateAIGuide.tsx
│ │ │ ├── GetAIGuide.tsx
│ │ │ ├── UpdatePreferences.tsx
│ │ │ └── UserGuidesList.tsx
│ │ ├── GenerateRoadmap/
│ │ │ ├── AIRoadmapAlert.tsx
│ │ │ ├── AITermSuggestionInput.tsx
│ │ │ ├── GenerateRoadmap.css
│ │ │ ├── GenerateRoadmap.tsx
│ │ │ ├── RoadmapSearch.tsx
│ │ │ └── RoadmapTopicDetail.tsx
│ │ ├── GetStarted/
│ │ │ ├── RoadmapCard.tsx
│ │ │ ├── RoadmapMultiCard.tsx
│ │ │ ├── RoleRoadmaps.tsx
│ │ │ ├── SectionBadge.tsx
│ │ │ └── TipItem.tsx
│ │ ├── Global/
│ │ │ ├── CodeBlock.tsx
│ │ │ └── Markdown.tsx
│ │ ├── GridItem.astro
│ │ ├── Guide/
│ │ │ ├── GuideContent.tsx
│ │ │ └── RelatedGuides.tsx
│ │ ├── HeroSection/
│ │ │ ├── EmptyProgress.tsx
│ │ │ ├── FavoriteRoadmaps.tsx
│ │ │ ├── HeroItemsGroup.tsx
│ │ │ ├── HeroProject.tsx
│ │ │ ├── HeroRoadmap.tsx
│ │ │ ├── HeroSection.astro
│ │ │ └── HeroTitle.tsx
│ │ ├── Leaderboard/
│ │ │ ├── ErrorPage.tsx
│ │ │ └── LeaderboardPage.tsx
│ │ ├── Library/
│ │ │ └── LibraryTab.tsx
│ │ ├── Loader.astro
│ │ ├── LoadingChip.tsx
│ │ ├── MarkdownFile.astro
│ │ ├── Modal.tsx
│ │ ├── Navigation/
│ │ │ ├── AccountDropdown.astro
│ │ │ ├── AccountDropdown.tsx
│ │ │ ├── AccountDropdownList.tsx
│ │ │ ├── DropdownTeamList.tsx
│ │ │ ├── Navigation.astro
│ │ │ ├── NewIndicator.astro
│ │ │ ├── NotificationIndicator.tsx
│ │ │ ├── OnboardingModal.tsx
│ │ │ └── navigation.ts
│ │ ├── NavigationDropdown.tsx
│ │ ├── NavigationDropdownMenu.tsx
│ │ ├── OnboardingNudge.tsx
│ │ ├── OpenSourceBanner.astro
│ │ ├── OpenSourceStat.astro
│ │ ├── PageProgress.tsx
│ │ ├── PageSponsor.tsx
│ │ ├── PageVisit/
│ │ │ └── PageVisit.tsx
│ │ ├── Pagination/
│ │ │ └── Pagination.tsx
│ │ ├── PersonalizedRoadmap/
│ │ │ ├── PersonalizedRoadmap.tsx
│ │ │ ├── PersonalizedRoadmapModal.tsx
│ │ │ └── PersonalizedRoadmapSwitcher.tsx
│ │ ├── Popover.tsx
│ │ ├── Popup/
│ │ │ ├── Popup.astro
│ │ │ └── popup.js
│ │ ├── Premium/
│ │ │ ├── CredibilityStats.tsx
│ │ │ ├── FeatureCard.tsx
│ │ │ ├── PremiumPage.tsx
│ │ │ ├── StarRating.tsx
│ │ │ ├── StatsItem.tsx
│ │ │ ├── Testimonial.tsx
│ │ │ ├── constants.ts
│ │ │ └── index.ts
│ │ ├── ProgressHelpPopup.astro
│ │ ├── Projects/
│ │ │ ├── CompleteProjectConfirmation.tsx
│ │ │ ├── EmptyProjects.tsx
│ │ │ ├── EmptySolutions.tsx
│ │ │ ├── LeavingRoadmapWarningModal.tsx
│ │ │ ├── ListProjectSolutions.tsx
│ │ │ ├── LoadingSolutions.tsx
│ │ │ ├── ProjectCard.tsx
│ │ │ ├── ProjectContent.tsx
│ │ │ ├── ProjectSolutionModal.tsx
│ │ │ ├── ProjectSolutionRow.tsx
│ │ │ ├── ProjectTabs.tsx
│ │ │ ├── ProjectsList.tsx
│ │ │ ├── ProjectsPage.tsx
│ │ │ ├── ProjectsPageHeader.tsx
│ │ │ ├── SelectLanguages.tsx
│ │ │ ├── SortProjects.tsx
│ │ │ ├── StartProjectConfirmation.tsx
│ │ │ ├── StartProjectModal.tsx
│ │ │ ├── StatusStepper/
│ │ │ │ ├── MilestoneStep.tsx
│ │ │ │ ├── ProjectStepper.tsx
│ │ │ │ ├── ProjectTrackingActions.tsx
│ │ │ │ ├── StepperAction.tsx
│ │ │ │ └── StepperStepSeparator.tsx
│ │ │ ├── SubmissionRequirement.tsx
│ │ │ ├── SubmitProjectModal.tsx
│ │ │ ├── SubmitSuccessModal.tsx
│ │ │ └── VoteButton.tsx
│ │ ├── Questions/
│ │ │ ├── PrismAtom.css
│ │ │ ├── QuestionCard.tsx
│ │ │ ├── QuestionFinished.tsx
│ │ │ ├── QuestionLoader.tsx
│ │ │ ├── QuestionsList.tsx
│ │ │ └── QuestionsProgress.tsx
│ │ ├── Rating/
│ │ │ └── Rating.tsx
│ │ ├── ReactIcons/
│ │ │ ├── AITutorLogo.tsx
│ │ │ ├── AddedUserIcon.tsx
│ │ │ ├── AppleCalendarIcon.tsx
│ │ │ ├── BestPracticesIcon.tsx
│ │ │ ├── BuildingIcon.tsx
│ │ │ ├── CheckIcon.tsx
│ │ │ ├── ChevronDownIcon.tsx
│ │ │ ├── ClipboardIcon.tsx
│ │ │ ├── CloseIcon.tsx
│ │ │ ├── CogIcon.tsx
│ │ │ ├── DeleteUserIcon.tsx
│ │ │ ├── DropdownIcon.tsx
│ │ │ ├── ErrorIcon.tsx
│ │ │ ├── ErrorIcon2.tsx
│ │ │ ├── FacebookIcon.tsx
│ │ │ ├── FileIcon.tsx
│ │ │ ├── GitHubIcon.tsx
│ │ │ ├── GoogleCalendarIcon.tsx
│ │ │ ├── GoogleIcon.tsx
│ │ │ ├── GroupIcon.tsx
│ │ │ ├── GuideIcon.tsx
│ │ │ ├── HackerNewsIcon.tsx
│ │ │ ├── HomeIcon.tsx
│ │ │ ├── InfoIcon.tsx
│ │ │ ├── LinkedInIcon.tsx
│ │ │ ├── MoreVerticalIcon.tsx
│ │ │ ├── OutlookCalendarIcon.tsx
│ │ │ ├── RedditIcon.tsx
│ │ │ ├── RoadmapIcon.tsx
│ │ │ ├── RoadmapLogo.tsx
│ │ │ ├── SecondPlaceMedalEmoji.tsx
│ │ │ ├── ShareIcon.tsx
│ │ │ ├── Spinner.tsx
│ │ │ ├── StopIcon.tsx
│ │ │ ├── TeamProgressIcon.tsx
│ │ │ ├── ThirdPlaceMedalEmoji.tsx
│ │ │ ├── TrashIcon.tsx
│ │ │ ├── TrophyEmoji.tsx
│ │ │ ├── TwitterIcon.tsx
│ │ │ ├── UserIcon.tsx
│ │ │ ├── UsersIcon.tsx
│ │ │ ├── VerifyLetterIcon.tsx
│ │ │ ├── VideoIcon.tsx
│ │ │ └── WarningIcon.tsx
│ │ ├── RelatedRoadmaps.astro
│ │ ├── ResourceProgressStats.astro
│ │ ├── RespondInviteForm.tsx
│ │ ├── RoadCard/
│ │ │ └── Editor.tsx
│ │ ├── RoadmapAIChat/
│ │ │ ├── AIChatActionButtons.tsx
│ │ │ ├── ChatRoadmapRenderer.css
│ │ │ ├── ChatRoadmapRenderer.tsx
│ │ │ ├── RoadmapAIChat.css
│ │ │ ├── RoadmapAIChat.tsx
│ │ │ ├── RoadmapAIChatCard.tsx
│ │ │ ├── RoadmapAIChatHeader.tsx
│ │ │ ├── RoadmapChatListing.tsx
│ │ │ ├── RoadmapRecommendations.tsx
│ │ │ ├── RoadmapTopicList.tsx
│ │ │ ├── ShareResourceLink.tsx
│ │ │ ├── TopicResourcesModal.tsx
│ │ │ ├── TutorIntroMessage.tsx
│ │ │ ├── UserProgressActionList.tsx
│ │ │ └── UserProgressList.tsx
│ │ ├── RoadmapAIChatHistory/
│ │ │ └── RoadmapAIChatHistory.tsx
│ │ ├── RoadmapAlert.tsx
│ │ ├── RoadmapBanner.astro
│ │ ├── RoadmapHeader.astro
│ │ ├── RoadmapHint.astro
│ │ ├── RoadmapNote.astro
│ │ ├── RoadmapTitleQuestion.tsx
│ │ ├── Roadmaps/
│ │ │ ├── CategoryFilterButton.tsx
│ │ │ ├── RoadmapCard.tsx
│ │ │ ├── RoadmapFeedbackAlert.astro
│ │ │ ├── RoadmapsPage.tsx
│ │ │ └── RoadmapsPageHeader.tsx
│ │ ├── SQLCourse/
│ │ │ ├── AccountButton.tsx
│ │ │ ├── AuthorCredentials.tsx
│ │ │ ├── AuthorQuoteMessage.tsx
│ │ │ ├── BuyButton.tsx
│ │ │ ├── ChapterRow.tsx
│ │ │ ├── CourseAnnouncement.tsx
│ │ │ ├── CourseAuthor.tsx
│ │ │ ├── CourseFeature.tsx
│ │ │ ├── FAQSection.tsx
│ │ │ ├── FloatingPurchase.tsx
│ │ │ ├── PlatformDemo.tsx
│ │ │ ├── ReviewsSection.tsx
│ │ │ ├── SQLCoursePage.tsx
│ │ │ ├── SectionHeader.tsx
│ │ │ └── Spotlight.tsx
│ │ ├── SQLCourseVariant/
│ │ │ ├── AuthorCredentials.tsx
│ │ │ ├── BuyButton.tsx
│ │ │ ├── ChapterRow.tsx
│ │ │ ├── CourseDiscountBanner.tsx
│ │ │ ├── CourseFeatures.tsx
│ │ │ ├── FAQSection.tsx
│ │ │ ├── MeetYourInstructor.tsx
│ │ │ ├── PlatformDemo.tsx
│ │ │ ├── PurchaseBanner.tsx
│ │ │ ├── ReviewCarousel.tsx
│ │ │ ├── RoadmapDetailsPopover.tsx
│ │ │ ├── SQLCourseVariantPage.tsx
│ │ │ └── SectionHeader.tsx
│ │ ├── Schedule/
│ │ │ ├── ScheduleButton.tsx
│ │ │ └── ScheduleEventModal.tsx
│ │ ├── SearchSelector.tsx
│ │ ├── Select.tsx
│ │ ├── SelectNative.tsx
│ │ ├── ShareIcons/
│ │ │ └── ShareIcons.tsx
│ │ ├── ShareOptions/
│ │ │ ├── ShareFriendList.tsx
│ │ │ ├── ShareOptionsModal.tsx
│ │ │ ├── ShareOptionsTab.tsx
│ │ │ ├── ShareSuccess.tsx
│ │ │ ├── ShareTeamMemberList.tsx
│ │ │ ├── TransferToTeamList.tsx
│ │ │ └── UserItem.tsx
│ │ ├── ShareRoadmapButton.tsx
│ │ ├── SimplePageHeader.astro
│ │ ├── Stepper.tsx
│ │ ├── TabLink.tsx
│ │ ├── TableOfContent/
│ │ │ └── TableOfContent.tsx
│ │ ├── TeamActivity/
│ │ │ ├── TeamActivityItem.tsx
│ │ │ ├── TeamActivityPage.tsx
│ │ │ ├── TeamActivityTopicsModal.tsx
│ │ │ └── TeamEmptyStream.tsx
│ │ ├── TeamAnnouncement.tsx
│ │ ├── TeamDropdown/
│ │ │ └── TeamDropdown.tsx
│ │ ├── TeamMarketing/
│ │ │ ├── TeamDemo.tsx
│ │ │ ├── TeamHeroBanner.tsx
│ │ │ ├── TeamPricing.tsx
│ │ │ └── TeamTools.tsx
│ │ ├── TeamMembers/
│ │ │ └── InviteMemberPopup.tsx
│ │ ├── TeamProgress/
│ │ │ ├── GroupRoadmapItem.tsx
│ │ │ ├── MemberCustomProgressModal.tsx
│ │ │ ├── MemberProgressItem.tsx
│ │ │ ├── MemberProgressModal.tsx
│ │ │ ├── MemberProgressModalHeader.tsx
│ │ │ └── TeamProgressPage.tsx
│ │ ├── TeamRoadmaps/
│ │ │ └── PickRoadmapOptionModal.tsx
│ │ ├── TeamSidebar.tsx
│ │ ├── TeamsList.tsx
│ │ ├── ThankYou/
│ │ │ └── ThankYouPage.tsx
│ │ ├── Toast.tsx
│ │ ├── Tooltip.tsx
│ │ ├── TopNavDropdowns/
│ │ │ ├── AIDropdownMenu.tsx
│ │ │ ├── RoadmapDropdownMenu.tsx
│ │ │ └── UpgradeProButton.tsx
│ │ ├── TopicDetail/
│ │ │ ├── ContributionForm.tsx
│ │ │ ├── CreateCourseModal.tsx
│ │ │ ├── PaidResourceDisclaimer.tsx
│ │ │ ├── PredefinedActionGroup.tsx
│ │ │ ├── PredefinedActions.tsx
│ │ │ ├── ResourceListSeparator.tsx
│ │ │ ├── TopicDetail.tsx
│ │ │ ├── TopicDetailAI.tsx
│ │ │ ├── TopicDetailLink.tsx
│ │ │ ├── TopicDetailsTabs.tsx
│ │ │ └── TopicProgressButton.tsx
│ │ ├── UpcomingForm.astro
│ │ ├── UserPersona/
│ │ │ ├── ChatPersona.tsx
│ │ │ ├── UpdatePersonaModal.tsx
│ │ │ └── UserPersonaForm.tsx
│ │ ├── UserProgress/
│ │ │ ├── ModalLoader.tsx
│ │ │ ├── ProgressShareButton.tsx
│ │ │ ├── UserCustomProgressModal.tsx
│ │ │ ├── UserProgressModal.tsx
│ │ │ └── UserProgressModalHeader.tsx
│ │ ├── UserPublicProfile/
│ │ │ ├── PrivateProfileBanner.tsx
│ │ │ ├── UserProfileRoadmap.tsx
│ │ │ ├── UserProfileRoadmapRenderer.tsx
│ │ │ ├── UserPublicActivityHeatmap.tsx
│ │ │ ├── UserPublicProfileHeader.tsx
│ │ │ ├── UserPublicProfilePage.tsx
│ │ │ ├── UserPublicProgressStats.tsx
│ │ │ ├── UserPublicProgresses.tsx
│ │ │ └── UserPublicProjects.tsx
│ │ ├── VideoHeader.astro
│ │ ├── VideoModal.tsx
│ │ ├── YouTubeAlert.astro
│ │ ├── YouTubeBanner.astro
│ │ └── courses/
│ │ ├── CourseStep.astro
│ │ └── Milestone.astro
│ ├── data/
│ │ ├── authors/
│ │ │ ├── ebrahim-bharmal.md
│ │ │ ├── ekene.md
│ │ │ ├── fernando.md
│ │ │ ├── jesse-li.md
│ │ │ ├── kamran.md
│ │ │ ├── peter-thaleikis.md
│ │ │ └── william.md
│ │ ├── best-practices/
│ │ │ ├── api-security/
│ │ │ │ ├── api-security.json
│ │ │ │ ├── api-security.md
│ │ │ │ └── content/
│ │ │ │ ├── api-gateway.md
│ │ │ │ ├── authentication-mechanisms.md
│ │ │ │ ├── authorization-header.md
│ │ │ │ ├── avoid-http-blocking.md
│ │ │ │ ├── avoid-logging-sensitive-data.md
│ │ │ │ ├── avoid-personal-id-urls.md
│ │ │ │ ├── avoid-sensitive-data.md
│ │ │ │ ├── cdn-for-file-uploads.md
│ │ │ │ ├── centralized-logins.md
│ │ │ │ ├── check-dependencies.md
│ │ │ │ ├── code-review-process.md
│ │ │ │ ├── csp-header.md
│ │ │ │ ├── debug-mode-off.md
│ │ │ │ ├── directory-listings.md
│ │ │ │ ├── disable-entity-expansion.md
│ │ │ │ ├── disable-entity-parsing-xml.md
│ │ │ │ ├── endpoint-authentication.md
│ │ │ │ ├── force-content-type.md
│ │ │ │ ├── good-jwt-secret.md
│ │ │ │ ├── hsts-header.md
│ │ │ │ ├── index.md
│ │ │ │ ├── jwt-algorithm.md
│ │ │ │ ├── jwt-payload.md
│ │ │ │ ├── max-retry-jail.md
│ │ │ │ ├── monitor-everything.md
│ │ │ │ ├── no-sniff-header.md
│ │ │ │ ├── non-executable-stacks.md
│ │ │ │ ├── oauth-redirect-ui.md
│ │ │ │ ├── oauth-state.md
│ │ │ │ ├── oauth-validate-scope.md
│ │ │ │ ├── only-server-side-encryption.md
│ │ │ │ ├── payload-size.md
│ │ │ │ ├── prefer-uuid.md
│ │ │ │ ├── proper-http-methods.md
│ │ │ │ ├── proper-response-code.md
│ │ │ │ ├── recommended-resources.md
│ │ │ │ ├── remove-fingerprint-header.md
│ │ │ │ ├── response-type-token.md
│ │ │ │ ├── restrict-private-apis.md
│ │ │ │ ├── rollback-deployments.md
│ │ │ │ ├── run-security-analysis.md
│ │ │ │ ├── sensitive-data-encryption.md
│ │ │ │ ├── set-alerts.md
│ │ │ │ ├── throttle-requests.md
│ │ │ │ ├── token-expiry.md
│ │ │ │ ├── unit-integration-tests.md
│ │ │ │ ├── use-https.md
│ │ │ │ ├── use-ids-ips-system.md
│ │ │ │ ├── use-standard-authentication.md
│ │ │ │ ├── validate-content-type.md
│ │ │ │ ├── validate-user-input.md
│ │ │ │ └── x-frame-options-deny.md
│ │ │ ├── aws/
│ │ │ │ ├── aws.json
│ │ │ │ ├── aws.md
│ │ │ │ └── content/
│ │ │ │ ├── alerts-as-notifications.md
│ │ │ │ ├── app-changes-for-aws.md
│ │ │ │ ├── application-state.md
│ │ │ │ ├── automate-everything.md
│ │ │ │ ├── avoid-fs-mounts.md
│ │ │ │ ├── avoid-multiple-scaling-triggers.md
│ │ │ │ ├── avoid-server-eips.md
│ │ │ │ ├── aws-naming-convention.md
│ │ │ │ ├── aws-right-choice.md
│ │ │ │ ├── beware-aws-limits.md
│ │ │ │ ├── billing-alerts.md
│ │ │ │ ├── bucket-names-ssl.md
│ │ │ │ ├── cloudfront-in-front-of-s3.md
│ │ │ │ ├── cloudtrail.md
│ │ │ │ ├── cloudwatch-cli-tools.md
│ │ │ │ ├── cloudwatch-custom-metrics.md
│ │ │ │ ├── cloudwatch-detailed-monitoring.md
│ │ │ │ ├── cloudwatch-free-metrics.md
│ │ │ │ ├── configuration-endpoints.md
│ │ │ │ ├── configured-azs-only.md
│ │ │ │ ├── disable-ssh-access.md
│ │ │ │ ├── ec2-roles.md
│ │ │ │ ├── elb-healthchecks.md
│ │ │ │ ├── failover-event-subscription.md
│ │ │ │ ├── group-permissions.md
│ │ │ │ ├── index.md
│ │ │ │ ├── key-management-strategy.md
│ │ │ │ ├── lock-security-groups.md
│ │ │ │ ├── logs-information.md
│ │ │ │ ├── multi-factor-auth-iam.md
│ │ │ │ ├── pre-warm-elb.md
│ │ │ │ ├── random-strings-keys.md
│ │ │ │ ├── redundant-across-azs.md
│ │ │ │ ├── release-eips.md
│ │ │ │ ├── reserved-instances.md
│ │ │ │ ├── s3-hive-results.md
│ │ │ │ ├── scale-down-events.md
│ │ │ │ ├── scale-horizontally.md
│ │ │ │ ├── security-audit.md
│ │ │ │ ├── service-over-servers.md
│ │ │ │ ├── tag-everything.md
│ │ │ │ ├── terminate-ssl.md
│ │ │ │ ├── termination-protection.md
│ │ │ │ ├── tools-for-logs.md
│ │ │ │ ├── use-alias-records.md
│ │ │ │ ├── use-iam-acount.md
│ │ │ │ ├── use-iam-roles.md
│ │ │ │ ├── use-official-sdks.md
│ │ │ │ ├── use-vpc.md
│ │ │ │ └── user-multiple-api-keys.md
│ │ │ ├── backend-performance/
│ │ │ │ ├── backend-performance.json
│ │ │ │ ├── backend-performance.md
│ │ │ │ └── content/
│ │ │ │ ├── architectural-styles.md
│ │ │ │ ├── async-logging.md
│ │ │ │ ├── authentication-authorization.md
│ │ │ │ ├── cache-invalidation.md
│ │ │ │ ├── caching-locations.md
│ │ │ │ ├── caching-strategies.md
│ │ │ │ ├── cdns.md
│ │ │ │ ├── cleanup-data.md
│ │ │ │ ├── compiled-languages.md
│ │ │ │ ├── connection-pool-settings.md
│ │ │ │ ├── connection-pooling.md
│ │ │ │ ├── connection-timeouts.md
│ │ │ │ ├── critical-paths.md
│ │ │ │ ├── db-indexes.md
│ │ │ │ ├── denormalize.md
│ │ │ │ ├── enable-compression.md
│ │ │ │ ├── implement-pagination.md
│ │ │ │ ├── index.md
│ │ │ │ ├── join-operations.md
│ │ │ │ ├── keep-alive.md
│ │ │ │ ├── lazy-eager.md
│ │ │ │ ├── load-balancing.md
│ │ │ │ ├── message-brokers.md
│ │ │ │ ├── monitoring-logging.md
│ │ │ │ ├── network-latency.md
│ │ │ │ ├── offload-heavy.md
│ │ │ │ ├── optimize-algorithms.md
│ │ │ │ ├── orm-queries.md
│ │ │ │ ├── pagination-large-data.md
│ │ │ │ ├── perf-testing.md
│ │ │ │ ├── prefetch-preload.md
│ │ │ │ ├── profile-code.md
│ │ │ │ ├── profiling-tools.md
│ │ │ │ ├── prometheus-graphana.md
│ │ │ │ ├── reasonable-payload.md
│ │ │ │ ├── regular-audits.md
│ │ │ │ ├── replication.md
│ │ │ │ ├── request-throttling.md
│ │ │ │ ├── scaling-strategies.md
│ │ │ │ ├── select-star.md
│ │ │ │ ├── similar-requests.md
│ │ │ │ ├── slow-logging.md
│ │ │ │ ├── streaming-large.md
│ │ │ │ ├── unnecessary-computation.md
│ │ │ │ ├── up-to-date.md
│ │ │ │ ├── use-db-sharding.md
│ │ │ │ └── utilize-caching.md
│ │ │ ├── code-review/
│ │ │ │ ├── code-review.json
│ │ │ │ ├── code-review.md
│ │ │ │ └── content/
│ │ │ │ ├── address-author-concerns.md
│ │ │ │ ├── address-feedback-received.md
│ │ │ │ ├── adequate-review-time.md
│ │ │ │ ├── adhere-guidelines.md
│ │ │ │ ├── architecture-understanding.md
│ │ │ │ ├── author-feedback-welcomed.md
│ │ │ │ ├── celebrate-success.md
│ │ │ │ ├── change-functioning.md
│ │ │ │ ├── changes-ready.md
│ │ │ │ ├── clear-feedback.md
│ │ │ │ ├── code-guide-best-practices-adherence.md
│ │ │ │ ├── code-review-purpose.md
│ │ │ │ ├── collaborate-reviewer-author.md
│ │ │ │ ├── complex-tasks-breakage.md
│ │ │ │ ├── conflict-resolution.md
│ │ │ │ ├── consistency-everywhere.md
│ │ │ │ ├── continuous-improvement-over-perfection.md
│ │ │ │ ├── cross-functional-knowledge.md
│ │ │ │ ├── definition-of-done.md
│ │ │ │ ├── determine-review-level.md
│ │ │ │ ├── document-new-feature.md
│ │ │ │ ├── document-process.md
│ │ │ │ ├── encourage-participation.md
│ │ │ │ ├── failing-text-bug.md
│ │ │ │ ├── follow-guidelines.md
│ │ │ │ ├── impact-of-change.md
│ │ │ │ ├── implement-changes-explanations.md
│ │ │ │ ├── index.md
│ │ │ │ ├── knowledge-sharing.md
│ │ │ │ ├── learn-context-reqs.md
│ │ │ │ ├── list-review-risks-issues.md
│ │ │ │ ├── merge-approved-code.md
│ │ │ │ ├── monitor-performance.md
│ │ │ │ ├── monitor-reviews.md
│ │ │ │ ├── nitpick-comments.md
│ │ │ │ ├── no-one-way-process.md
│ │ │ │ ├── note-questions-for-review.md
│ │ │ │ ├── open-mind-author.md
│ │ │ │ ├── open-mind-reviewer.md
│ │ │ │ ├── pair-programming-reviews.md
│ │ │ │ ├── positive-feedback-criticism.md
│ │ │ │ ├── potential-issues-review.md
│ │ │ │ ├── potential-issues-reviewer.md
│ │ │ │ ├── prepare-list.md
│ │ │ │ ├── prioritize-feedback.md
│ │ │ │ ├── professional-feedback.md
│ │ │ │ ├── proper-description-pr.md
│ │ │ │ ├── quality-code-overall.md
│ │ │ │ ├── re-run-tests-verify.md
│ │ │ │ ├── recognition-rewards.md
│ │ │ │ ├── resolve-conflicts-timely.md
│ │ │ │ ├── review-docs-design.md
│ │ │ │ ├── review-docs-updated.md
│ │ │ │ ├── review-tests.md
│ │ │ │ ├── review-updated-code.md
│ │ │ │ ├── run-tests-ensure-passing.md
│ │ │ │ ├── seek-feedback.md
│ │ │ │ ├── seek-team-members-feedback.md
│ │ │ │ ├── self-review.md
│ │ │ │ ├── set-clear-expectations.md
│ │ │ │ ├── short-term-long-term-considerations.md
│ │ │ │ ├── style-guide-preferences.md
│ │ │ │ ├── submit-re-review.md
│ │ │ │ ├── team-wide-style-followed.md
│ │ │ │ ├── tested-in-dev.md
│ │ │ │ ├── trends-issues-finding.md
│ │ │ │ ├── update-docs-changes.md
│ │ │ │ ├── update-review-changes-docs.md
│ │ │ │ ├── use-automation.md
│ │ │ │ ├── verify-changes-addressed.md
│ │ │ │ └── write-automated-tests.md
│ │ │ └── frontend-performance/
│ │ │ ├── content/
│ │ │ │ ├── analyse-stylesheets-complexity.md
│ │ │ │ ├── analyze-js-for-perf-issues.md
│ │ │ │ ├── avoid-404-files.md
│ │ │ │ ├── avoid-base64-images.md
│ │ │ │ ├── avoid-inline-css.md
│ │ │ │ ├── avoid-multiple-inline-js-snippets.md
│ │ │ │ ├── bundlephobia.md
│ │ │ │ ├── check-dependency-size.md
│ │ │ │ ├── choose-image-format-approprietly.md
│ │ │ │ ├── chrome-dev-tools.md
│ │ │ │ ├── compress-your-images.md
│ │ │ │ ├── concatenate-css-single-file.md
│ │ │ │ ├── cookie-size-less-4096-bytes.md
│ │ │ │ ├── enable-compression.md
│ │ │ │ ├── framework-guides.md
│ │ │ │ ├── index.md
│ │ │ │ ├── inline-critical-css.md
│ │ │ │ ├── keep-cookie-count-below-20.md
│ │ │ │ ├── keep-dependencies-up-to-date.md
│ │ │ │ ├── keep-ttfb-less-1-3s.md
│ │ │ │ ├── keep-web-font-under-300k.md
│ │ │ │ ├── lighthouse.md
│ │ │ │ ├── load-offscreen-images-lazily.md
│ │ │ │ ├── make-css-files-non-blocking.md
│ │ │ │ ├── minify-css.md
│ │ │ │ ├── minify-html.md
│ │ │ │ ├── minify-your-javascript.md
│ │ │ │ ├── minimize-http-requests.md
│ │ │ │ ├── minimize-iframe-count.md
│ │ │ │ ├── page-load-time-below-3s.md
│ │ │ │ ├── page-speed-insights.md
│ │ │ │ ├── page-weight-below-1500.md
│ │ │ │ ├── pre-load-urls-where-possible.md
│ │ │ │ ├── prefer-vector-images.md
│ │ │ │ ├── prevent-flash-text.md
│ │ │ │ ├── recommended-guides.md
│ │ │ │ ├── remove-unused-css.md
│ │ │ │ ├── serve-exact-size-images.md
│ │ │ │ ├── set-width-height-images.md
│ │ │ │ ├── squoosh-ap.md
│ │ │ │ ├── use-cdn.md
│ │ │ │ ├── use-http-cache-headers.md
│ │ │ │ ├── use-https-on-your-website.md
│ │ │ │ ├── use-non-blocking-javascript.md
│ │ │ │ ├── use-preconnect-to-load-fonts.md
│ │ │ │ ├── use-same-protocol.md
│ │ │ │ ├── use-service-workers-for-caching.md
│ │ │ │ ├── use-woff2-font-format.md
│ │ │ │ └── web-page-test.md
│ │ │ ├── frontend-performance.json
│ │ │ └── frontend-performance.md
│ │ ├── projects/
│ │ │ ├── accessible-form-ui.md
│ │ │ ├── accordion.md
│ │ │ ├── age-calculator.md
│ │ │ ├── automated-backups.md
│ │ │ ├── basic-dns.md
│ │ │ ├── basic-dockerfile.md
│ │ │ ├── basic-html-website.md
│ │ │ ├── bastion-host.md
│ │ │ ├── blogging-platform-api.md
│ │ │ ├── blue-green-deployment.md
│ │ │ ├── broadcast-server.md
│ │ │ ├── caching-server.md
│ │ │ ├── changelog-component.md
│ │ │ ├── configuration-management.md
│ │ │ ├── cookie-consent.md
│ │ │ ├── custom-dropdown.md
│ │ │ ├── database-backup-utility.md
│ │ │ ├── datepicker-ui.md
│ │ │ ├── dockerized-service-deployment.md
│ │ │ ├── dummy-systemd-service.md
│ │ │ ├── ec2-instance.md
│ │ │ ├── ecommerce-api.md
│ │ │ ├── expense-tracker-api.md
│ │ │ ├── expense-tracker.md
│ │ │ ├── file-integrity-checker.md
│ │ │ ├── fitness-workout-tracker.md
│ │ │ ├── flash-cards.md
│ │ │ ├── github-actions-deployment-workflow.md
│ │ │ ├── github-random-repo.md
│ │ │ ├── github-user-activity.md
│ │ │ ├── iac-digitalocean.md
│ │ │ ├── image-grid.md
│ │ │ ├── image-processing-service.md
│ │ │ ├── log-archive-tool.md
│ │ │ ├── markdown-note-taking-app.md
│ │ │ ├── monitoring.md
│ │ │ ├── movie-reservation-system.md
│ │ │ ├── multi-container-service.md
│ │ │ ├── multiservice-docker.md
│ │ │ ├── nginx-log-analyser.md
│ │ │ ├── nodejs-service-deployment.md
│ │ │ ├── number-guessing-game.md
│ │ │ ├── personal-blog.md
│ │ │ ├── pomodoro-timer.md
│ │ │ ├── portfolio-website.md
│ │ │ ├── quiz-app.md
│ │ │ ├── realtime-leaderboard-system.md
│ │ │ ├── reddit-client.md
│ │ │ ├── restricted-textarea.md
│ │ │ ├── scalable-ecommerce-platform.md
│ │ │ ├── server-stats.md
│ │ │ ├── service-discovery.md
│ │ │ ├── simple-monitoring-dashboard.md
│ │ │ ├── simple-tabs.md
│ │ │ ├── single-page-cv.md
│ │ │ ├── ssh-remote-server-setup.md
│ │ │ ├── static-site-server.md
│ │ │ ├── stories-feature.md
│ │ │ ├── task-tracker-js.md
│ │ │ ├── task-tracker.md
│ │ │ ├── temperature-converter.md
│ │ │ ├── testimonial-cards.md
│ │ │ ├── tmdb-cli.md
│ │ │ ├── todo-list-api.md
│ │ │ ├── tooltip-ui.md
│ │ │ ├── unit-converter.md
│ │ │ ├── url-shortening-service.md
│ │ │ ├── weather-api-wrapper-service.md
│ │ │ └── weather-app.md
│ │ ├── question-groups/
│ │ │ ├── backend/
│ │ │ │ ├── backend.md
│ │ │ │ └── content/
│ │ │ │ ├── anomaly-detection.md
│ │ │ │ ├── api-dependencies.md
│ │ │ │ ├── api-endpoint.md
│ │ │ │ ├── api-tests.md
│ │ │ │ ├── api-versioning.md
│ │ │ │ ├── batch-processing.md
│ │ │ │ ├── benefits-drawbacks-microservices.md
│ │ │ │ ├── bg-tasks.md
│ │ │ │ ├── blue-green-deployment.md
│ │ │ │ ├── cache-eviction.md
│ │ │ │ ├── cap-theorem.md
│ │ │ │ ├── ci-cd.md
│ │ │ │ ├── containerization.md
│ │ │ │ ├── correlation-ids.md
│ │ │ │ ├── data-encryption.md
│ │ │ │ ├── db-connections.md
│ │ │ │ ├── deadlock-db-transaction.md
│ │ │ │ ├── debugging-backend.md
│ │ │ │ ├── decompose-microservices.md
│ │ │ │ ├── distributed-caching.md
│ │ │ │ ├── eventual-consistency.md
│ │ │ │ ├── fault-tolerance.md
│ │ │ │ ├── file-uploads.md
│ │ │ │ ├── fulltext-search.md
│ │ │ │ ├── gdpr-compliance.md
│ │ │ │ ├── high-available-storage.md
│ │ │ │ ├── http-request-response-cycle.md
│ │ │ │ ├── idempotency.md
│ │ │ │ ├── instrument-monitor.md
│ │ │ │ ├── iot-streams.md
│ │ │ │ ├── load-balanced-session.md
│ │ │ │ ├── load-testing-api.md
│ │ │ │ ├── long-running.md
│ │ │ │ ├── maintainable-code.md
│ │ │ │ ├── message-queue.md
│ │ │ │ ├── optimistic-vs-pessimistic.md
│ │ │ │ ├── protect-sql-injection.md
│ │ │ │ ├── rate-limiting.md
│ │ │ │ ├── realtime-data-sync.md
│ │ │ │ ├── rest-core-principles.md
│ │ │ │ ├── reverse-proxy.md
│ │ │ │ ├── scale-backend.md
│ │ │ │ ├── schema-migrations.md
│ │ │ │ ├── secure-api.md
│ │ │ │ ├── secure-interservice.md
│ │ │ │ ├── session-management.md
│ │ │ │ ├── sql-vs-nosql.md
│ │ │ │ ├── sso.md
│ │ │ │ ├── statelessness-http.md
│ │ │ │ └── webhooks.md
│ │ │ ├── data-analyst/
│ │ │ │ ├── content/
│ │ │ │ │ ├── advanced-data-integration.md
│ │ │ │ │ ├── advanced-data-wrangling.md
│ │ │ │ │ ├── advanced-missing-data.md
│ │ │ │ │ ├── advanced-multivariate.md
│ │ │ │ │ ├── advanced-profiling.md
│ │ │ │ │ ├── analysis-types.md
│ │ │ │ │ ├── analytics-types.md
│ │ │ │ │ ├── clustering-analysis.md
│ │ │ │ │ ├── combined-analysis.md
│ │ │ │ │ ├── data-aggregation.md
│ │ │ │ │ ├── data-analysis-process.md
│ │ │ │ │ ├── data-analyst-role.md
│ │ │ │ │ ├── data-challenges.md
│ │ │ │ │ ├── data-cleaning.md
│ │ │ │ │ ├── data-formats.md
│ │ │ │ │ ├── data-integrity-strategies.md
│ │ │ │ │ ├── data-mining.md
│ │ │ │ │ ├── data-modeling-experience.md
│ │ │ │ │ ├── data-modeling.md
│ │ │ │ │ ├── data-profiling.md
│ │ │ │ │ ├── data-quality.md
│ │ │ │ │ ├── data-storage-approaches.md
│ │ │ │ │ ├── data-transformation-process.md
│ │ │ │ │ ├── data-types.md
│ │ │ │ │ ├── data-validation.md
│ │ │ │ │ ├── data-visualization.md
│ │ │ │ │ ├── data-wrangling.md
│ │ │ │ │ ├── descriptive-analysis.md
│ │ │ │ │ ├── duplicate-data.md
│ │ │ │ │ ├── excel-tools.md
│ │ │ │ │ ├── excel-usage.md
│ │ │ │ │ ├── exploratory-data-analysis.md
│ │ │ │ │ ├── hypothesis-testing.md
│ │ │ │ │ ├── large-dataset-modification.md
│ │ │ │ │ ├── missing-data.md
│ │ │ │ │ ├── mixed-data-regression.md
│ │ │ │ │ ├── pca-analysis.md
│ │ │ │ │ ├── pca-scenario.md
│ │ │ │ │ ├── probability-distributions.md
│ │ │ │ │ ├── profiling-methods.md
│ │ │ │ │ ├── record-modification.md
│ │ │ │ │ ├── regression-analysis.md
│ │ │ │ │ ├── regression-comparison.md
│ │ │ │ │ ├── sales-clustering.md
│ │ │ │ │ ├── statistical-hypothesis.md
│ │ │ │ │ ├── statistical-models.md
│ │ │ │ │ ├── stats-viz-integration.md
│ │ │ │ │ ├── unstructured-data-aggregation.md
│ │ │ │ │ ├── visualization-decisions.md
│ │ │ │ │ └── visualization-eda.md
│ │ │ │ └── data-analyst.md
│ │ │ ├── data-science/
│ │ │ │ ├── content/
│ │ │ │ │ ├── accuracy-from-confusion-matrix.md
│ │ │ │ │ ├── apply-vs-map-pandas.md
│ │ │ │ │ ├── bagging-vs-boosting.md
│ │ │ │ │ ├── batch-vs-online-learning.md
│ │ │ │ │ ├── bias-variance-tradeoff.md
│ │ │ │ │ ├── categorical-vs-continuous-variables.md
│ │ │ │ │ ├── central-limit-theorem.md
│ │ │ │ │ ├── combining-data-from-multiple-sources.md
│ │ │ │ │ ├── confidence-intervals.md
│ │ │ │ │ ├── confusion-matrix.md
│ │ │ │ │ ├── correlation-vs-causation.md
│ │ │ │ │ ├── cross-validation.md
│ │ │ │ │ ├── decision-trees.md
│ │ │ │ │ ├── deep-learning-vs-traditional-ml.md
│ │ │ │ │ ├── detect-concept-drift.md
│ │ │ │ │ ├── ensure-fairness-remove-bias.md
│ │ │ │ │ ├── evaluate-dataset-usefulness.md
│ │ │ │ │ ├── evaluate-medical-classification-model.md
│ │ │ │ │ ├── evaluation-metrics.md
│ │ │ │ │ ├── false-positive-vs-negative.md
│ │ │ │ │ ├── feature-selection.md
│ │ │ │ │ ├── fine-tuning-vs-more-data.md
│ │ │ │ │ ├── group-aggregate-data-python.md
│ │ │ │ │ ├── handling-missing-data.md
│ │ │ │ │ ├── handling-null-values-pandas.md
│ │ │ │ │ ├── imbalanced-data.md
│ │ │ │ │ ├── investigate-traffic-drop.md
│ │ │ │ │ ├── kmeans-clustering-python.md
│ │ │ │ │ ├── knn-vs-kmeans.md
│ │ │ │ │ ├── lindeberg-feller-clt.md
│ │ │ │ │ ├── linear-regression.md
│ │ │ │ │ ├── linear-vs-logistic-regression.md
│ │ │ │ │ ├── logistic-regression.md
│ │ │ │ │ ├── long-format-vs-wide-format.md
│ │ │ │ │ ├── long-tail-distribution.md
│ │ │ │ │ ├── measure-product-launch-success.md
│ │ │ │ │ ├── merge-overlapping-intervals.md
│ │ │ │ │ ├── model-accuracy-business-impact.md
│ │ │ │ │ ├── monitor-model-performance.md
│ │ │ │ │ ├── multicollinearity.md
│ │ │ │ │ ├── null-hypothesis.md
│ │ │ │ │ ├── overfitting-prevention.md
│ │ │ │ │ ├── p-value-interpretation.md
│ │ │ │ │ ├── probability-distributions.md
│ │ │ │ │ ├── random-forest-vs-decision-tree.md
│ │ │ │ │ ├── rank-sql-sequence.md
│ │ │ │ │ ├── real-time-median.md
│ │ │ │ │ ├── regularization.md
│ │ │ │ │ ├── remove-duplicates-dataframe.md
│ │ │ │ │ ├── right-vs-left-join.md
│ │ │ │ │ ├── rmse-mse-linear-regression.md
│ │ │ │ │ ├── role-of-statistics.md
│ │ │ │ │ ├── sql-joining-orders-customers.md
│ │ │ │ │ ├── sql-second-highest-salary.md
│ │ │ │ │ ├── sql-top-customers-last-quarter.md
│ │ │ │ │ ├── sql-top-customers-revenue.md
│ │ │ │ │ ├── support-vectors-svm.md
│ │ │ │ │ ├── t-test-vs-z-test.md
│ │ │ │ │ ├── type-i-vs-type-ii-errors.md
│ │ │ │ │ ├── types-of-machine-learning.md
│ │ │ │ │ ├── univariate-bivariate-multivariate.md
│ │ │ │ │ ├── variance-in-data-science.md
│ │ │ │ │ └── wide-to-long-format.md
│ │ │ │ └── data-science.md
│ │ │ ├── devops/
│ │ │ │ ├── content/
│ │ │ │ │ ├── ansible-benefits.md
│ │ │ │ │ ├── auto-scaling.md
│ │ │ │ │ ├── blue-green-deployment.md
│ │ │ │ │ ├── build-pipelines.md
│ │ │ │ │ ├── canary-release.md
│ │ │ │ │ ├── cicd-setup.md
│ │ │ │ │ ├── cluster-health.md
│ │ │ │ │ ├── common-iac-tools.md
│ │ │ │ │ ├── container-consistency.md
│ │ │ │ │ ├── container-vs-vm.md
│ │ │ │ │ ├── continuous-monitoring.md
│ │ │ │ │ ├── data-migration.md
│ │ │ │ │ ├── devsecops.md
│ │ │ │ │ ├── docker-compose.md
│ │ │ │ │ ├── explain-ci-vs-cd.md
│ │ │ │ │ ├── health-monitor.md
│ │ │ │ │ ├── high-availability.md
│ │ │ │ │ ├── iac-concept.md
│ │ │ │ │ ├── implement-logging.md
│ │ │ │ │ ├── kubernetes-components.md
│ │ │ │ │ ├── kubernetes-operators.md
│ │ │ │ │ ├── load-balancer.md
│ │ │ │ │ ├── microservice-challenges.md
│ │ │ │ │ ├── microservice-vs-monolithic.md
│ │ │ │ │ ├── migrate-environment.md
│ │ │ │ │ ├── multi-cloud-kubernetes.md
│ │ │ │ │ ├── multi-cloud.md
│ │ │ │ │ ├── network-configuration.md
│ │ │ │ │ ├── optimize-cicd.md
│ │ │ │ │ ├── orchestration.md
│ │ │ │ │ ├── popular-cicd-tools.md
│ │ │ │ │ ├── purpose-of-cm.md
│ │ │ │ │ ├── reverse-proxy.md
│ │ │ │ │ ├── role-of-devops.md
│ │ │ │ │ ├── scaling-differences.md
│ │ │ │ │ ├── secret-management.md
│ │ │ │ │ ├── serverless-computing.md
│ │ │ │ │ ├── stateful-applications.md
│ │ │ │ │ ├── what-is-devops.md
│ │ │ │ │ ├── what-is-docker.md
│ │ │ │ │ ├── what-is-gitops.md
│ │ │ │ │ ├── what-is-helm-chart.md
│ │ │ │ │ ├── what-is-iac.md
│ │ │ │ │ ├── what-is-kubernetes.md
│ │ │ │ │ ├── what-is-prometheus.md
│ │ │ │ │ ├── what-is-rollback.md
│ │ │ │ │ ├── what-is-service-mesh.md
│ │ │ │ │ ├── what-is-shift-left.md
│ │ │ │ │ ├── what-is-version-control.md
│ │ │ │ │ └── zero-downtime.md
│ │ │ │ └── devops.md
│ │ │ ├── frontend/
│ │ │ │ ├── content/
│ │ │ │ │ ├── async-ops-js.md
│ │ │ │ │ ├── block-inline-elems.md
│ │ │ │ │ ├── box-model.md
│ │ │ │ │ ├── browser-render.md
│ │ │ │ │ ├── client-storage.md
│ │ │ │ │ ├── closures.md
│ │ │ │ │ ├── critical-css.md
│ │ │ │ │ ├── csp.md
│ │ │ │ │ ├── css-grid.md
│ │ │ │ │ ├── css-specificity.md
│ │ │ │ │ ├── css-variables.md
│ │ │ │ │ ├── dom.md
│ │ │ │ │ ├── em-vs-rem.md
│ │ │ │ │ ├── event-delegation.md
│ │ │ │ │ ├── event-listeners.md
│ │ │ │ │ ├── event-loop-js.md
│ │ │ │ │ ├── flexbox-layout.md
│ │ │ │ │ ├── id-vs-class.md
│ │ │ │ │ ├── improve-web-perf.md
│ │ │ │ │ ├── js-promises.md
│ │ │ │ │ ├── media-queries.md
│ │ │ │ │ ├── null-vs-undefined.md
│ │ │ │ │ ├── optimize-assets.md
│ │ │ │ │ ├── same-origin-policy.md
│ │ │ │ │ ├── seo-best-practices.md
│ │ │ │ │ ├── service-workers.md
│ │ │ │ │ ├── ssr-when.md
│ │ │ │ │ ├── state-mgmt-spa.md
│ │ │ │ │ ├── tree-shaking.md
│ │ │ │ │ └── vdom.md
│ │ │ │ └── frontend.md
│ │ │ ├── full-stack/
│ │ │ │ ├── content/
│ │ │ │ │ ├── api-security.md
│ │ │ │ │ ├── async-javascript.md
│ │ │ │ │ ├── backend-caching.md
│ │ │ │ │ ├── build-tools.md
│ │ │ │ │ ├── cicd-pipelines.md
│ │ │ │ │ ├── client-server-programming.md
│ │ │ │ │ ├── cloud-deployment.md
│ │ │ │ │ ├── code-splitting.md
│ │ │ │ │ ├── common-challenges.md
│ │ │ │ │ ├── cors-handling.md
│ │ │ │ │ ├── css-selectors.md
│ │ │ │ │ ├── database-migrations.md
│ │ │ │ │ ├── database-relationships.md
│ │ │ │ │ ├── div-span-purpose.md
│ │ │ │ │ ├── docker-role.md
│ │ │ │ │ ├── environment-variables.md
│ │ │ │ │ ├── event-driven-architecture.md
│ │ │ │ │ ├── flexbox-vs-grid.md
│ │ │ │ │ ├── full-stack-debugging.md
│ │ │ │ │ ├── full-stack-development.md
│ │ │ │ │ ├── full-stack-end.md
│ │ │ │ │ ├── get-post-difference.md
│ │ │ │ │ ├── graphql-vs-rest.md
│ │ │ │ │ ├── high-availability.md
│ │ │ │ │ ├── html-css-js-purpose.md
│ │ │ │ │ ├── include-css.md
│ │ │ │ │ ├── internationalization.md
│ │ │ │ │ ├── js-dom-manipulation.md
│ │ │ │ │ ├── js-equality-operators.md
│ │ │ │ │ ├── memory-leaks.md
│ │ │ │ │ ├── microservices.md
│ │ │ │ │ ├── mvc-architecture.md
│ │ │ │ │ ├── nodejs-database-crud.md
│ │ │ │ │ ├── nodejs-middleware.md
│ │ │ │ │ ├── package-json-purpose.md
│ │ │ │ │ ├── performance-monitoring.md
│ │ │ │ │ ├── postman-testing.md
│ │ │ │ │ ├── react-hooks.md
│ │ │ │ │ ├── react-performance.md
│ │ │ │ │ ├── react-seo.md
│ │ │ │ │ ├── react-ssr.md
│ │ │ │ │ ├── react-state-management.md
│ │ │ │ │ ├── real-time-updates.md
│ │ │ │ │ ├── relational-vs-nosql.md
│ │ │ │ │ ├── responsive-design.md
│ │ │ │ │ ├── rest-api.md
│ │ │ │ │ ├── rest-pagination.md
│ │ │ │ │ ├── security-vulnerabilities.md
│ │ │ │ │ ├── user-authentication.md
│ │ │ │ │ ├── version-control.md
│ │ │ │ │ └── websockets.md
│ │ │ │ └── full-stack.md
│ │ │ ├── golang/
│ │ │ │ ├── content/
│ │ │ │ │ ├── basic-data-types.md
│ │ │ │ │ ├── channels-communication.md
│ │ │ │ │ ├── code-analysis.md
│ │ │ │ │ ├── code-reusability.md
│ │ │ │ │ ├── composite-data-types.md
│ │ │ │ │ ├── concurrency-management.md
│ │ │ │ │ ├── concurrency-model.md
│ │ │ │ │ ├── custom-error-types.md
│ │ │ │ │ ├── data-type-conversion.md
│ │ │ │ │ ├── dependency-comparison.md
│ │ │ │ │ ├── dependency-integration.md
│ │ │ │ │ ├── dependency-management.md
│ │ │ │ │ ├── dependency-version-control.md
│ │ │ │ │ ├── efficient-memory-management.md
│ │ │ │ │ ├── error-handling-comparison.md
│ │ │ │ │ ├── error-handling.md
│ │ │ │ │ ├── function-calls.md
│ │ │ │ │ ├── function-execution.md
│ │ │ │ │ ├── function-interaction.md
│ │ │ │ │ ├── garbage-collection-effects.md
│ │ │ │ │ ├── global-variable-implications.md
│ │ │ │ │ ├── global-variables.md
│ │ │ │ │ ├── golang-intro.md
│ │ │ │ │ ├── goroutine-scheduling.md
│ │ │ │ │ ├── json-processing.md
│ │ │ │ │ ├── low-level-pointers.md
│ │ │ │ │ ├── maps-usage.md
│ │ │ │ │ ├── memory-allocation-gc.md
│ │ │ │ │ ├── memory-allocation.md
│ │ │ │ │ ├── memory-leak-prevention.md
│ │ │ │ │ ├── memory-leak-strategies.md
│ │ │ │ │ ├── memory-management.md
│ │ │ │ │ ├── method-overloading.md
│ │ │ │ │ ├── method-signatures.md
│ │ │ │ │ ├── multiple-return-values.md
│ │ │ │ │ ├── package-main.md
│ │ │ │ │ ├── pointer-variables.md
│ │ │ │ │ ├── pointers-detail.md
│ │ │ │ │ ├── polymorphism.md
│ │ │ │ │ ├── reserved-keywords.md
│ │ │ │ │ ├── runtime-impact.md
│ │ │ │ │ ├── string-literals.md
│ │ │ │ │ ├── struct-pointers.md
│ │ │ │ │ ├── structs.md
│ │ │ │ │ ├── testing-package.md
│ │ │ │ │ ├── type-conversion-importance.md
│ │ │ │ │ ├── type-conversion.md
│ │ │ │ │ ├── unit-testing.md
│ │ │ │ │ ├── value-reference-types.md
│ │ │ │ │ └── variable-declaration.md
│ │ │ │ └── golang.md
│ │ │ ├── javascript/
│ │ │ │ ├── content/
│ │ │ │ │ ├── add-method-to-object.md
│ │ │ │ │ ├── add-remove-array-items.md
│ │ │ │ │ ├── adding-javascript-to-html.md
│ │ │ │ │ ├── addition-operator-result.md
│ │ │ │ │ ├── array-loop.md
│ │ │ │ │ ├── array-methods.md
│ │ │ │ │ ├── arrays-creation.md
│ │ │ │ │ ├── arrow-functions.md
│ │ │ │ │ ├── asynchronous-javascript.md
│ │ │ │ │ ├── bom.md
│ │ │ │ │ ├── callback-higher-order-functions.md
│ │ │ │ │ ├── check-object-property.md
│ │ │ │ │ ├── clear-array.md
│ │ │ │ │ ├── constructor-function.md
│ │ │ │ │ ├── css-selectors-javascript.md
│ │ │ │ │ ├── destructuring.md
│ │ │ │ │ ├── dom.md
│ │ │ │ │ ├── equality-operators.md
│ │ │ │ │ ├── error-monitoring.md
│ │ │ │ │ ├── even-odd-check.md
│ │ │ │ │ ├── function-declarations-expressions.md
│ │ │ │ │ ├── function-scope.md
│ │ │ │ │ ├── global-local-scope.md
│ │ │ │ │ ├── global-object.md
│ │ │ │ │ ├── hoisting.md
│ │ │ │ │ ├── iife.md
│ │ │ │ │ ├── imports-exports.md
│ │ │ │ │ ├── innerhtml-vs-innertext.md
│ │ │ │ │ ├── isnan-function.md
│ │ │ │ │ ├── java-vs-javascript.md
│ │ │ │ │ ├── javascript-data-types.md
│ │ │ │ │ ├── javascript-ending.md
│ │ │ │ │ ├── javascript-frameworks.md
│ │ │ │ │ ├── logical-error.md
│ │ │ │ │ ├── object-create.md
│ │ │ │ │ ├── prototype-inheritance.md
│ │ │ │ │ ├── recursive-function.md
│ │ │ │ │ ├── reference-vs-syntax-error.md
│ │ │ │ │ ├── remove-duplicates.md
│ │ │ │ │ ├── rest-parameter.md
│ │ │ │ │ ├── reverse-string-function.md
│ │ │ │ │ ├── spread-array-output.md
│ │ │ │ │ ├── spread-operator-objects.md
│ │ │ │ │ ├── strict-mode.md
│ │ │ │ │ ├── substring-check.md
│ │ │ │ │ ├── this-keyword.md
│ │ │ │ │ ├── undefined-vs-null.md
│ │ │ │ │ ├── variable-declaration.md
│ │ │ │ │ ├── variable-naming-conventions.md
│ │ │ │ │ └── window-vs-document.md
│ │ │ │ └── javascript.md
│ │ │ ├── nodejs/
│ │ │ │ ├── content/
│ │ │ │ │ ├── async-patterns.md
│ │ │ │ │ ├── cluster-vs-worker-threads.md
│ │ │ │ │ ├── commonjs-vs-esm.md
│ │ │ │ │ ├── error-handling.md
│ │ │ │ │ ├── event-loop-working.md
│ │ │ │ │ ├── exit-codes.md
│ │ │ │ │ ├── input-from-command-line.md
│ │ │ │ │ ├── memory-leak-debugging.md
│ │ │ │ │ ├── middleware-pattern.md
│ │ │ │ │ ├── npm-package-security.md
│ │ │ │ │ ├── order-priority.md
│ │ │ │ │ ├── performance-optimization.md
│ │ │ │ │ ├── process-argv.md
│ │ │ │ │ ├── process-cwd-vs-dirname.md
│ │ │ │ │ ├── security-best-practices.md
│ │ │ │ │ ├── streams-and-buffers.md
│ │ │ │ │ ├── testing-async-code.md
│ │ │ │ │ └── web-server.md
│ │ │ │ └── nodejs.md
│ │ │ ├── react/
│ │ │ │ ├── content/
│ │ │ │ │ ├── component-lifecycle.md
│ │ │ │ │ ├── controlled-vs-uncontrolled.md
│ │ │ │ │ ├── create-portal.md
│ │ │ │ │ ├── custom-hook.md
│ │ │ │ │ ├── error-boundaries.md
│ │ │ │ │ ├── flush-sync.md
│ │ │ │ │ ├── investigate-slow-app.md
│ │ │ │ │ ├── lazy-loading.md
│ │ │ │ │ ├── pure-components.md
│ │ │ │ │ ├── re-renders.md
│ │ │ │ │ ├── ref-forwarding.md
│ │ │ │ │ ├── render-list.md
│ │ │ │ │ ├── strict-mode.md
│ │ │ │ │ ├── suspense.md
│ │ │ │ │ ├── synthetic-events.md
│ │ │ │ │ ├── use-transition.md
│ │ │ │ │ └── virtual-dom.md
│ │ │ │ └── react.md
│ │ │ ├── sql/
│ │ │ │ ├── content/
│ │ │ │ │ ├── appointments-no-treatment.md
│ │ │ │ │ ├── average-treatment-cost.md
│ │ │ │ │ ├── clustered-vs-nonclustered-indexes.md
│ │ │ │ │ ├── correlated-subquery.md
│ │ │ │ │ ├── database-normalization.md
│ │ │ │ │ ├── database-transactions.md
│ │ │ │ │ ├── doctor-most-patients.md
│ │ │ │ │ ├── find-duplicates.md
│ │ │ │ │ ├── foreign-key.md
│ │ │ │ │ ├── most-common-diagnosis.md
│ │ │ │ │ ├── patients-multiple-appointments.md
│ │ │ │ │ ├── patients-no-recent-visits.md
│ │ │ │ │ ├── patients-registration-query.md
│ │ │ │ │ ├── primary-key.md
│ │ │ │ │ ├── query-optimization.md
│ │ │ │ │ ├── ranking-functions.md
│ │ │ │ │ ├── revenue-last-month.md
│ │ │ │ │ ├── sql-constraints.md
│ │ │ │ │ ├── sql-dialects.md
│ │ │ │ │ ├── sql-ending.md
│ │ │ │ │ ├── sql-index.md
│ │ │ │ │ ├── sql-injection-prevention.md
│ │ │ │ │ ├── sql-joins.md
│ │ │ │ │ ├── sql-pagination.md
│ │ │ │ │ ├── sql-subsets.md
│ │ │ │ │ ├── sql-view.md
│ │ │ │ │ ├── sql-vs-other-languages.md
│ │ │ │ │ ├── stored-procedures.md
│ │ │ │ │ ├── subquery-usage.md
│ │ │ │ │ ├── union-vs-union-all.md
│ │ │ │ │ └── where-vs-having.md
│ │ │ │ └── sql.md
│ │ │ └── sql-queries/
│ │ │ ├── content/
│ │ │ │ ├── avoid-select-star.md
│ │ │ │ ├── correlated-subquery.md
│ │ │ │ ├── count-star-vs-count-column.md
│ │ │ │ ├── count-users-by-country.md
│ │ │ │ ├── detect-date-gaps.md
│ │ │ │ ├── employees-above-average-salary.md
│ │ │ │ ├── exists-vs-in.md
│ │ │ │ ├── find-duplicates.md
│ │ │ │ ├── foreign-key.md
│ │ │ │ ├── group-by-mistakes.md
│ │ │ │ ├── group-by-without-aggregate.md
│ │ │ │ ├── group-by-work.md
│ │ │ │ ├── indexes-usefulness.md
│ │ │ │ ├── inner-join-vs-left-join.md
│ │ │ │ ├── lag-lead-functions.md
│ │ │ │ ├── missing-indexes-impact.md
│ │ │ │ ├── nested-subqueries.md
│ │ │ │ ├── not-in-null-issues.md
│ │ │ │ ├── ntile-function.md
│ │ │ │ ├── optimize-slow-queries.md
│ │ │ │ ├── primary-key.md
│ │ │ │ ├── rank-dense-rank-row-number.md
│ │ │ │ ├── running-total.md
│ │ │ │ ├── sargable-query.md
│ │ │ │ ├── second-highest-salary.md
│ │ │ │ ├── select-non-grouped-column.md
│ │ │ │ ├── sql-queries-ending.md
│ │ │ │ ├── subquery-vs-join.md
│ │ │ │ ├── union-vs-union-all.md
│ │ │ │ ├── where-vs-having.md
│ │ │ │ └── window-function.md
│ │ │ └── sql-queries.md
│ │ ├── roadmaps/
│ │ │ ├── ai-agents/
│ │ │ │ ├── ai-agents.json
│ │ │ │ ├── ai-agents.md
│ │ │ │ ├── content/
│ │ │ │ │ ├── acting--tool-invocation@sHYd4KsKlmw5Im3nQ19W8.md
│ │ │ │ │ ├── agent-loop@Eih4eybuYB3C2So8K0AT3.md
│ │ │ │ │ ├── anthropic-tool-use@1EZFbDHA5J5_5BPMLMxXb.md
│ │ │ │ │ ├── api-requests@52qxjZILV-X1isup6dazC.md
│ │ │ │ │ ├── autogen@7YtnQ9-KIvGPSpDzEDexl.md
│ │ │ │ │ ├── basic-backend-development@VPI89s-m885r2YrXjYxdd.md
│ │ │ │ │ ├── be-specific-in-what-you-want@qFKFM2qNPEN7EoD0V-1SM.md
│ │ │ │ │ ├── bias--toxicity-guardrails@EyLo2j8IQsIK91SKaXkmK.md
│ │ │ │ │ ├── chain-of-thought-cot@qwdh5pkBbrF8LKPxbZp4F.md
│ │ │ │ │ ├── closed-weight-models@tJYmEDDwK0LtEux-kwp9B.md
│ │ │ │ │ ├── code-execution--repl@mS0EVCkWuPN_GkVPng4A2.md
│ │ │ │ │ ├── code-generation@PK8w31GlvtmAuU92sHaqr.md
│ │ │ │ │ ├── context-windows@dyn1LSioema-Bf9lLTgUZ.md
│ │ │ │ │ ├── creating-mcp-servers@1NXIN-Hbjl5rPy_mqxQYW.md
│ │ │ │ │ ├── crewai@uFPJqgU4qGvZyxTv-osZA.md
│ │ │ │ │ ├── dag-agents@Ep8RoZSy_Iq_zWXlGQLZo.md
│ │ │ │ │ ├── data-analysis@wKYEaPWNsR30TIpHaxSsq.md
│ │ │ │ │ ├── data-privacy--pii-redaction@rdlYBJNNyZUshzsJawME4.md
│ │ │ │ │ ├── database-queries@sV1BnA2-qBnXoKpUn-8Ub.md
│ │ │ │ │ ├── deepeval@0924QUH1wV7Mp-Xu0FAhF.md
│ │ │ │ │ ├── email--slack--sms@qaNr5I-NQPnfrRH7ynGTl.md
│ │ │ │ │ ├── embeddings-and-vector-search@UIm54UmICKgep6s8Itcyv.md
│ │ │ │ │ ├── episodic-vs-semantic-memory@EfCCNqLMJpWKKtamUa5gK.md
│ │ │ │ │ ├── file-system-access@BoJqZvdGam4cd6G6yK2IV.md
│ │ │ │ │ ├── fine-tuning-vs-prompt-engineering@5OW_6o286mj470ElFyJ_5.md
│ │ │ │ │ ├── forgetting--aging-strategies@m-97m7SI0XpBnhEE8-_1S.md
│ │ │ │ │ ├── frequency-penalty@z_N-Y0zGkv8_qHPuVtimL.md
│ │ │ │ │ ├── gemini-function-calling@_iIsBJTVS6OBf_dsdmbVO.md
│ │ │ │ │ ├── git-and-terminal-usage@McREk2zHOlIrqbGSKbX-J.md
│ │ │ │ │ ├── haystack@XS-FsvtrXGZ8DPrwOsnlI.md
│ │ │ │ │ ├── helicone@MLxP5N0Vrmwh-kyvNeGXn.md
│ │ │ │ │ ├── human-in-the-loop-evaluation@rHxdxN97ZcU7MPl8L1jzN.md
│ │ │ │ │ ├── integration-testing-for-flows@P9-SiIda3TSjHsfkI5OUV.md
│ │ │ │ │ ├── iterate-and-test-your-prompts@noTuUFnHSBzn7GKG9UZEi.md
│ │ │ │ │ ├── langchain@Ka6VpCEnqABvwiF9vba7t.md
│ │ │ │ │ ├── langfuse@UoIheaJlShiceafrWALEH.md
│ │ │ │ │ ├── langsmith@SS8mGqf9wfrNqenIWvN8Z.md
│ │ │ │ │ ├── langsmith@xp7TCTRE9HP60_rGzTUF6.md
│ │ │ │ │ ├── llamaindex@iEHF-Jm3ck-Iu85EbCoDi.md
│ │ │ │ │ ├── llm-native-function-calling@aafZxtjxiwzJH1lwHBODi.md
│ │ │ │ │ ├── local-desktop@iBtJp24F_kJE3YlBsW60s.md
│ │ │ │ │ ├── long-term-memory@Ue633fz6Xu2wa2-KOAtdP.md
│ │ │ │ │ ├── manual-from-scratch@US6T5dXM8IY9V2qZnTOFW.md
│ │ │ │ │ ├── max-length@Bn_BkthrVX_vOuwQzvPZa.md
│ │ │ │ │ ├── mcp-client@CGVstUxVXLJcYZrwk3iNQ.md
│ │ │ │ │ ├── mcp-hosts@9FryAIrWRHh8YlzKX3et5.md
│ │ │ │ │ ├── mcp-servers@yv_-87FVM7WKn5iv6LW9q.md
│ │ │ │ │ ├── metrics-to-track@v8qLnyFRnEumodBYxQSXQ.md
│ │ │ │ │ ├── model-context-protocol-mcp@1B0IqRNYdtbHDi1jHSXuI.md
│ │ │ │ │ ├── npc--game-ai@ok8vN7VtCgyef5x6aoQaL.md
│ │ │ │ │ ├── observation--reflection@ZJTrun3jK3zBGOTm1jdMI.md
│ │ │ │ │ ├── open-weight-models@DSJAhQhc1dQmBHQ8ZkTau.md
│ │ │ │ │ ├── openai-assistant-api@37GBFVZ2J2d5r8bd1ViHq.md
│ │ │ │ │ ├── openai-functions-calling@AQtxTTxmBpfl8BMgJbGzc.md
│ │ │ │ │ ├── openllmetry@7UqPXUzqKYXklnB3x-tsv.md
│ │ │ │ │ ├── perception--user-input@LU76AhCYDjxdBhpMQ4eMU.md
│ │ │ │ │ ├── personal-assistant@PPdAutqJF5G60Eg9lYBND.md
│ │ │ │ │ ├── planner-executor@6YLCMWzystao6byCYCTPO.md
│ │ │ │ │ ├── presence-penalty@Vd8ycw8pW-ZKvg5WYFtoh.md
│ │ │ │ │ ├── pricing-of-common-models@B8dzg61TGaknuruBgkEJd.md
│ │ │ │ │ ├── prompt-injection--jailbreaks@SU2RuicMUo8tiAsQtDI1k.md
│ │ │ │ │ ├── provide-additional-context@6I42CoeWX-kkFXTKAY7rw.md
│ │ │ │ │ ├── rag-agent@cW8O4vLLKEG-Q0dE8E5Zp.md
│ │ │ │ │ ├── rag-and-vector-databases@wkS4yOJ3JdZQE_yBID8K7.md
│ │ │ │ │ ├── ragas@YzEDtGEaMaMWVt0W03HRt.md
│ │ │ │ │ ├── react-reason--act@53xDks6JQ33fHMa3XcuCd.md
│ │ │ │ │ ├── reason-and-plan@ycPRgRYR4lEBQr_xxHKnM.md
│ │ │ │ │ ├── reasoning-vs-standard-models@N3yZfUxphxjiupqGpyaS9.md
│ │ │ │ │ ├── remote--cloud@dHNMX3_t1KSDdAWqgdJXv.md
│ │ │ │ │ ├── rest-api-knowledge@QtTwecLdvQa8pgELJ6i80.md
│ │ │ │ │ ├── safety--red-team-testing@63nsfJFO1BwjLX_ZVaPFC.md
│ │ │ │ │ ├── short-term--memory@M3U6RfIqaiut2nuOibY8W.md
│ │ │ │ │ ├── smol-depot@eWxQiBrxIUG2JNcrdfIHS.md
│ │ │ │ │ ├── specify-length-format-etc@wwHHlEoPAx0TLxbtY6nMA.md
│ │ │ │ │ ├── stopping-criteria@K0G-Lw069jXUJwZqHtybd.md
│ │ │ │ │ ├── streamed-vs-unstreamed-responses@i2NE6haX9-7mdoV5LQ3Ah.md
│ │ │ │ │ ├── structured-logging--tracing@zs6LM8WEnb0ERWpiaQCgc.md
│ │ │ │ │ ├── summarization--compression@jTDC19BTWCqxqMizrIJHr.md
│ │ │ │ │ ├── temperature@L1zL1GzqjSAjF06pIIXhy.md
│ │ │ │ │ ├── token-based-pricing@1fiWPBV99E2YncqdCgUw2.md
│ │ │ │ │ ├── tokenization@GAjuWyJl9CI1nqXBp6XCf.md
│ │ │ │ │ ├── tool-definition@qakbxB8xe7Y8gejC5cZnK.md
│ │ │ │ │ ├── tool-sandboxing--permissioning@UVzLGXG6K7HQVHmw8ZAv2.md
│ │ │ │ │ ├── top-p@icbp1NjurQfdM0dHnz6v2.md
│ │ │ │ │ ├── transformer-models-and-llms@ZF5_5Y5zqa75Ov22JACX6.md
│ │ │ │ │ ├── tree-of-thought@Nmy1PoB32DcWZnPM8l8jT.md
│ │ │ │ │ ├── tree-of-thought@hj1adjkG9nalXKZ-Youn0.md
│ │ │ │ │ ├── understand-the-basics-of-rag@qwVQOwBTLA2yUgRISzC8k.md
│ │ │ │ │ ├── unit-testing-for-individual-tools@qo_O4YAe4-MTP_ZJoXJHR.md
│ │ │ │ │ ├── use-examples-in-your-prompt@yulzE4ZNLhXOgHhG7BtZQ.md
│ │ │ │ │ ├── use-relevant-technical-terms@sUwdtOX550tSdceaeFPmF.md
│ │ │ │ │ ├── user-profile-storage@QJqXHV8VHPTnfYfmKPzW7.md
│ │ │ │ │ ├── web-scraping--crawling@5oLc-235bvKhApxzYFkEc.md
│ │ │ │ │ ├── web-search@kBtqT8AduLoYDWopj-V9_.md
│ │ │ │ │ ├── what-are-ai-agents@aFZAm44nP5NefX_9TpT0A.md
│ │ │ │ │ ├── what-are-tools@2zsOUWJQ8e7wnoHmq1icG.md
│ │ │ │ │ ├── what-is-agent-memory@TBH_DZTAfR8Daoh-njNFC.md
│ │ │ │ │ └── what-is-prompt-engineering@Y8EqzFx3qxtrSh7bWbbV8.md
│ │ │ │ └── faqs.astro
│ │ │ ├── ai-data-scientist/
│ │ │ │ ├── ai-data-scientist.json
│ │ │ │ ├── ai-data-scientist.md
│ │ │ │ ├── content/
│ │ │ │ │ ├── ab-testing@mJq9b50MJM9o9dLhx40iN.md
│ │ │ │ │ ├── classic-ml-sup-unsup-advanced-ml-ensembles-nns@FdBih8tlGPPy97YWq463y.md
│ │ │ │ │ ├── coding@XLDWuSt4tI4gnmqMFdpmy.md
│ │ │ │ │ ├── data-structures-and-algorithms-python@StBCykpzpM4g9PRFeSNXa.md
│ │ │ │ │ ├── data-understanding-data-analysis-and-visualization@JaN8YhMeN3whAe2TCXvw9.md
│ │ │ │ │ ├── deep-learning@cjvVLN0XjrKPn6o20oMmc.md
│ │ │ │ │ ├── deployment-models-cicd@uPzzUpI0--7OWDfNeBIjt.md
│ │ │ │ │ ├── differential-calculus@mwPJh33MEUQ4Co_LiVEOb.md
│ │ │ │ │ ├── econometrics@Gd2egqKZPnbPW1W2jw4j8.md
│ │ │ │ │ ├── exploratory-data-analysis@l1027SBZxTHKzqWw98Ee-.md
│ │ │ │ │ ├── fully-connected-cnn-rnn-lstm-transformers-tl@eOFoGKveaHaBm_6ppJUtA.md
│ │ │ │ │ ├── hypothesis-testing@XJXIkWVDIrPJ-bVIvX0ZO.md
│ │ │ │ │ ├── increasing-test-sensitivity@v68nwX914qCwHDSwY_ZhG.md
│ │ │ │ │ ├── index.md
│ │ │ │ │ ├── learn-python-programming-language@MVrAqizgkoAs2aghN8TgV.md
│ │ │ │ │ ├── learn-sql@Im0tXXn3GC-FUq2aMHgwm.md
│ │ │ │ │ ├── linear-algebra-calculus-mathematical-analysis@gWMvD83hVXeTmCuHGIiOL.md
│ │ │ │ │ ├── machine-learning@kBdt_t2SvVsY3blfubWIz.md
│ │ │ │ │ ├── mathematics@aStaDENn5PhEa-cFvNzXa.md
│ │ │ │ │ ├── mlops@Qa85hEVe2kz62k9Pj4QCA.md
│ │ │ │ │ ├── pre-requisites-of-econometrics@y6xXsc-uSAmRDnNuyhqH2.md
│ │ │ │ │ ├── probability-and-sampling@jxJtwbiCvxHqmkWkE7zdx.md
│ │ │ │ │ ├── ratio-metrics@n2JFGwFxTuOviW6kHO1Uv.md
│ │ │ │ │ ├── regression-timeseries-fitting-distributions@h19k9Fn5XPh3_pKEC8Ftp.md
│ │ │ │ │ ├── statistics-clt@Y9YJdARIRqqCBCy3GVYdA.md
│ │ │ │ │ └── statistics@4WZL_fzJ3cZdWLLDoWN8D.md
│ │ │ │ ├── faqs.astro
│ │ │ │ └── mapping.json
│ │ │ ├── ai-engineer/
│ │ │ │ ├── ai-engineer.json
│ │ │ │ ├── ai-engineer.md
│ │ │ │ ├── content/
│ │ │ │ │ ├── adding-end-user-ids-in-prompts@4Q5x2VCXedAWISBXUIyin.md
│ │ │ │ │ ├── agents-usecases@778HsQzTuJ_3c9OSn5DmH.md
│ │ │ │ │ ├── ai-agents@4_ap0rD9Gl6Ep_4jMfPpG.md
│ │ │ │ │ ├── ai-agents@Uffu609uQbIzDl88Ddccv.md
│ │ │ │ │ ├── ai-engineer-vs-ml-engineer@jSZ1LhPdhlkW-9QJhIvFs.md
│ │ │ │ │ ├── ai-safety-and-ethics@8ndKHDJgL_gYwaXC7XMer.md
│ │ │ │ │ ├── ai-vs-agi@5QdihE1lLpMc3DFrGy46M.md
│ │ │ │ │ ├── anomaly-detection@AglWJ7gb9rTT2rMkstxtk.md
│ │ │ │ │ ├── anthropic-claude@hy6EyKiNxk1x84J63dhez.md
│ │ │ │ │ ├── audio-processing@mxQYB820447DC6kogyZIL.md
│ │ │ │ │ ├── bias-and-fairness@lhIU0ulpvDAn1Xc3ooYz_.md
│ │ │ │ │ ├── building-an-mcp-client@0Rk0rCbmRFJT2GKwUibQS.md
│ │ │ │ │ ├── building-an-mcp-server@oLGfKjcqBzJ3vd6Cg-T1B.md
│ │ │ │ │ ├── choosing-the-right-model@zeWoTtAFEpVXDQzWNsha4.md
│ │ │ │ │ ├── chroma@dSd2C9lNl-ymmCRT9_ZC3.md
│ │ │ │ │ ├── chunking@mX987wiZF7p3V_gExrPeX.md
│ │ │ │ │ ├── claude-agent-sdk@xXLyuUNrKEc32XLQxMjgT.md
│ │ │ │ │ ├── claude-code@wr5ddjutC-fX_ixysTHaT.md
│ │ │ │ │ ├── claude-messages-api@nxwMVla0-PNG8nlocKK5v.md
│ │ │ │ │ ├── closed-vs-open-source-models@RBwGsq9DngUsl8PrrCbqx.md
│ │ │ │ │ ├── codex@XY2l96sry3WyLzzo3KUeU.md
│ │ │ │ │ ├── cohere@a7qsvoauFe5u953I699ps.md
│ │ │ │ │ ├── cohere@y0qD5Kb4Pf-ymIwW-tvhX.md
│ │ │ │ │ ├── conducting-adversarial-testing@Pt-AJmSJrOxKvolb5_HEv.md
│ │ │ │ │ ├── connect-to-local-server@H-G93SsEgsA_NGL_v4hPv.md
│ │ │ │ │ ├── connect-to-remote-server@2t4uINxmzfx8FUF-_i_2B.md
│ │ │ │ │ ├── constraining-outputs-and-inputs@ONLDyczNacGVZGojYyJrU.md
│ │ │ │ │ ├── constrains@PT3uDiUjiKhO8laOkCmgP.md
│ │ │ │ │ ├── content-moderation-apis@ljZLa3yjQpegiZWwtnn_q.md
│ │ │ │ │ ├── context-compaction@9XCxilAQ7FRet7lHQr1gE.md
│ │ │ │ │ ├── context-engineering@kCiHNaZ9CgnS9uksIQ_SY.md
│ │ │ │ │ ├── context-isolation@9JwWIK0Z2MK8-6EQQJsCO.md
│ │ │ │ │ ├── context@9oUpeEnaMWctQLTobbmY7.md
│ │ │ │ │ ├── context@vvpYkmycH0_W030E-L12f.md
│ │ │ │ │ ├── cot@nyBgEHvUhwF-NANMwkRJW.md
│ │ │ │ │ ├── cursor@MWhoqhNnBaoeCdN_8i15k.md
│ │ │ │ │ ├── dall-e-api@LKFwwjtcawJ4Z12X102Cb.md
│ │ │ │ │ ├── data-classification@06Xta-OqSci05nV2QMFdF.md
│ │ │ │ │ ├── data-layer@Z0920V57_ziDhXbQJMN9O.md
│ │ │ │ │ ├── deepseek@UGYYh2W1XnnbgYNY8L8Hb.md
│ │ │ │ │ ├── development-tools@NYge7PNtfI-y6QWefXJ4d.md
│ │ │ │ │ ├── embedding-models@fr0UOXlVVctkk1K84Z8Of.md
│ │ │ │ │ ├── embedding@grTcbzT7jKk_sIUwOTZTD.md
│ │ │ │ │ ├── embeddings@XyEp6jnBSpCxMGwALnYfT.md
│ │ │ │ │ ├── external-memory@KWjD4xEPhOOYS51dvRLd2.md
│ │ │ │ │ ├── faiss@JurLbOO1Z8r6C3yUqRNwf.md
│ │ │ │ │ ├── few-shot@DZPM9zjCbYYWBPLmQImxQ.md
│ │ │ │ │ ├── fine-tuning@zTvsCNS3ucsZmvy1tHyeI.md
│ │ │ │ │ ├── function-calling@wFfjHkGLrcCyLyXV4BiFM.md
│ │ │ │ │ ├── gemini-embedding@4GArjDYipit4SLqKZAWDf.md
│ │ │ │ │ ├── gemini@hzeEo8COf2l07iu5EdlFo.md
│ │ │ │ │ ├── gemma2@MNtaY1_kOJHeoWuM-abb4.md
│ │ │ │ │ ├── generation@2jJnS9vRYhaS69d6OxrMh.md
│ │ │ │ │ ├── google-adk@mbp2NoL-VZ5hZIIblNBXt.md
│ │ │ │ │ ├── google-gemini-api@TsG_I7FL-cOCSw8gvZH3r.md
│ │ │ │ │ ├── google-gemini@oe8E6ZIQWuYvHVbYJHUc1.md
│ │ │ │ │ ├── haystack@ebXXEhNRROjbbof-Gym4p.md
│ │ │ │ │ ├── how-llms-work@zdeuA4GbdBl2DwKgiOA4G.md
│ │ │ │ │ ├── hugging-face-hub@YLOdOvLXa5Fa7_mmuvKEi.md
│ │ │ │ │ ├── hugging-face-inference-sdk@3kRTzlLNBnXdTsAEXVu_M.md
│ │ │ │ │ ├── hugging-face-models@EIDbwbdolR_qsNKVDla6V.md
│ │ │ │ │ ├── hugging-face-tasks@YKIPOiSj_FNtg0h8uaSMq.md
│ │ │ │ │ ├── hugging-face@v99C5Bml2a6148LCJ9gy9.md
│ │ │ │ │ ├── image-generation@49BWxYVFpIgZCCqsikH7l.md
│ │ │ │ │ ├── image-understanding@fzVq4hGoa2gdbIzoyY1Zp.md
│ │ │ │ │ ├── impact-on-product-development@qJVgKe9uBvXc-YPfvX_Y7.md
│ │ │ │ │ ├── indexing-embeddings@5TQnO9B4_LTHwqjI7iHB1.md
│ │ │ │ │ ├── inference@4NtUD9V64gkp8SFudj_ai.md
│ │ │ │ │ ├── input-format@LCHse57rXf3sl8ml1ow0T.md
│ │ │ │ │ ├── introduction@_hYN0gEi9BL24nptEtXWU.md
│ │ │ │ │ ├── jina@apVYIV4EyejPft25oAvdI.md
│ │ │ │ │ ├── know-your-customers--usecases@t1SObMWkDZ1cKqNNlcd9L.md
│ │ │ │ │ ├── lancedb@rjaCNT3Li45kwu2gXckke.md
│ │ │ │ │ ├── langchain-for-multimodal-apps@j9zD3pHysB1CBhLfLjhpD.md
│ │ │ │ │ ├── langchain@jM-Jbo0wUilhVY830hetJ.md
│ │ │ │ │ ├── large-language-model-llm@wf2BSyUekr1S1q6l8kyq6.md
│ │ │ │ │ ├── llama-index@JT4mBXOjvvrUnynA7yrqt.md
│ │ │ │ │ ├── llamaindex-for-multimodal-apps@akQTCKuPRRelj2GORqvsh.md
│ │ │ │ │ ├── lm-studio@a_3SabylVqzzOyw3tZN5f.md
│ │ │ │ │ ├── manual-implementation@6xaRB34_g0HGt-y1dGYXR.md
│ │ │ │ │ ├── mcp-client@po0fIZYaFhRbNlza7sB37.md
│ │ │ │ │ ├── mcp-host@MabZ9jOrSj539C5qZrVBd.md
│ │ │ │ │ ├── mcp-server@8Xkd88EjX3GE_9DWQhr7G.md
│ │ │ │ │ ├── meta-llama@OkYO-aSPiuVYuLXHswBCn.md
│ │ │ │ │ ├── mistral@n-Ud2dXkqIzK37jlKItN4.md
│ │ │ │ │ ├── model-context-protocol-mcp@AeHkNU-uJ_gBdo5-xdpEu.md
│ │ │ │ │ ├── models-on-hugging-face@dLEg4IA3F5jgc44Bst9if.md
│ │ │ │ │ ├── mongodb-atlas@j6bkm0VUgLkHdMDDJFiMC.md
│ │ │ │ │ ├── multi-agents@kG1bkF2oY21CJOm9zhdpn.md
│ │ │ │ │ ├── multimodal-ai-usecases@sGR9qcro68KrzM8qWxcH8.md
│ │ │ │ │ ├── multimodal-ai@W7cKPt_UxcUgwp8J6hS4p.md
│ │ │ │ │ ├── nanobanana-api@6y73FLjshnqxV8BTGUeiu.md
│ │ │ │ │ ├── ollama@rTT2UnvqFO3GH6ThPLEjO.md
│ │ │ │ │ ├── open-ai-embeddings-api@l6priWeJhbdUD5tJ7uHyG.md
│ │ │ │ │ ├── openai-agentkit@Sm0Ne5Nx72hcZCdAcC0C2.md
│ │ │ │ │ ├── openai-compatible-apis@vnXtUupJUlyU_uCbZBbnk.md
│ │ │ │ │ ├── openai-gpt-o-series@3PQVZbcr4neNMRr6CuNzS.md
│ │ │ │ │ ├── openai-response-api@ro3vY_sp6xMQ-hfzO-rc1.md
│ │ │ │ │ ├── openai-response-api@xXLyuUNrKEc32XLQxMjgT.md
│ │ │ │ │ ├── openai-vision-api@CRrqa-dBw1LlOwVbrZhjK.md
│ │ │ │ │ ├── openrouter@1GlpMjmdAWor0X_BnISGg.md
│ │ │ │ │ ├── performing-similarity-search@ZcbRPtgaptqKqWBgRrEBU.md
│ │ │ │ │ ├── pinecone@_Cf7S1DCvX7p1_3-tP3C3.md
│ │ │ │ │ ├── pre-trained-models@d7fzv_ft12EopsQdmEsel.md
│ │ │ │ │ ├── prompt-caching@bqqY0gsZkBpcHMZw1hcZ5.md
│ │ │ │ │ ├── prompt-engineering@VjXmSCdzi2ACv-W85Sy9D.md
│ │ │ │ │ ├── prompt-injection-attacks@cUyLT6ctYQ1pgmodCKREq.md
│ │ │ │ │ ├── prompt-vs-context-engineering@ozrR8IvjNFbHd44kZrExX.md
│ │ │ │ │ ├── purpose-and-functionality@WcjX6p-V-Rdd77EL8Ega9.md
│ │ │ │ │ ├── qdrant@DwOAL5mOBgBiw-EQpAzQl.md
│ │ │ │ │ ├── qwen@c0RPhpD00VIUgF4HJgN2T.md
│ │ │ │ │ ├── rag-and-dynamic-filters@LnQ2AatMWpExUHcZhDIPd.md
│ │ │ │ │ ├── rag-usecases@GCn4LGNEtPI0NWYAZCRE-.md
│ │ │ │ │ ├── rag-vs-fine-tuning@qlBEXrbV88e_wAGRwO9hW.md
│ │ │ │ │ ├── rag@IX1BJWGwGmB4L063g0Frf.md
│ │ │ │ │ ├── ragflow@d0ontCII8KI8wfP-8Y45R.md
│ │ │ │ │ ├── react-prompting@voDKcKvXtyLzeZdx2g3Qn.md
│ │ │ │ │ ├── react@Waox7xR_yUeSnOtQFzU4c.md
│ │ │ │ │ ├── recommendation-systems@HQe9GKy3p0kTUPxojIfSF.md
│ │ │ │ │ ├── repetition-penalties@0_pa739kMPWHfuSQV-VO7.md
│ │ │ │ │ ├── replit@Ubk4GN0Z4XlDJ3EbRXdxg.md
│ │ │ │ │ ├── retrieval-process@OCGCzHQM2LQyUWmiqe6E0.md
│ │ │ │ │ ├── robust-prompt-engineering@qmx6OHqx4_0JXVIv8dASp.md
│ │ │ │ │ ├── role--behavior@N3TzWYxU0jgv1l99Ts58n.md
│ │ │ │ │ ├── roles-and-responsiblities@K9EiuFgPBFgeRxY4wxAmb.md
│ │ │ │ │ ├── sampling-parameters@LbB2PeytxRSuU07Bk0KlJ.md
│ │ │ │ │ ├── security-and-privacy-concerns@sWBT-j2cRuFqRFYtV_5TK.md
│ │ │ │ │ ├── self-hosted-models@_qqITQ8O0Q0RWUeZsUXnY.md
│ │ │ │ │ ├── semantic-search@eMfcyBxnMY_l_5-8eg6sD.md
│ │ │ │ │ ├── sentence-transformers@ZV_V6sqOnRodgaw4mzokC.md
│ │ │ │ │ ├── speech-to-text@jQX10XKd_QM5wdQweEkVJ.md
│ │ │ │ │ ├── streaming-responses@MUDBYjR7uCUZQ-kQxi2K_.md
│ │ │ │ │ ├── structured-output@zqhmLzHsmDlrTFVHzhq6-.md
│ │ │ │ │ ├── supabase@9kT7EEQsbeD2WDdN9ADx7.md
│ │ │ │ │ ├── system-prompting@S46Vaq8hYq6Ee1Id_-fSQ.md
│ │ │ │ │ ├── temperature@_bPTciEA1GT1JwfXim19z.md
│ │ │ │ │ ├── text-to-speech@GCERpLz5BcRtWPpv-asUz.md
│ │ │ │ │ ├── tokens@2WbVpRLqwi3Oeqk1JPui4.md
│ │ │ │ │ ├── tools--function-calling@eOqCBgBTKM8CmY3nsWjre.md
│ │ │ │ │ ├── top-k@qzvp6YxWDiGakA2mtspfh.md
│ │ │ │ │ ├── top-p@FjV3oD7G2Ocq5HhUC17iH.md
│ │ │ │ │ ├── training@xostGgoaYkqMO28iN2gx8.md
│ │ │ │ │ ├── transformersjs@bGLrbpxKgENe2xS1eQtdh.md
│ │ │ │ │ ├── transport-layer@o4gHDZ5p9lyeHuCAPvAKz.md
│ │ │ │ │ ├── type-of-models@2X0NDcq2ojBJ0RxY_U6bl.md
│ │ │ │ │ ├── using-sdks-directly@WZVW8FQu6LyspSKm1C_sl.md
│ │ │ │ │ ├── vector-database@zZA1FBhf1y4kCoUZ-hM4H.md
│ │ │ │ │ ├── vector-databases@tt9u3oFlsjEMfPyojuqpc.md
│ │ │ │ │ ├── vector-dbs@dzPKW_fn82lY1OOVrggk3.md
│ │ │ │ │ ├── vertex-ai-agent-builder@AxzTGDCC2Ftp4G66U4Uqr.md
│ │ │ │ │ ├── video-understanding@TxaZCtTCTUfwCxAJ2pmND.md
│ │ │ │ │ ├── weaviate@VgUnrZGKVjAAO4n_llq5-.md
│ │ │ │ │ ├── what-are-embeddings@--ig0Ume_BnXb9K2U7HJN.md
│ │ │ │ │ ├── what-are-rags@lVhWhZGR558O-ljHobxIi.md
│ │ │ │ │ ├── what-is-an-ai-engineer@GN6SnI7RXIeW8JeD-qORW.md
│ │ │ │ │ ├── whisper-api@OTBd6cPUayKaAM-fLWdSt.md
│ │ │ │ │ ├── windsurf@Xsl8mx6J182TxPPtNP471.md
│ │ │ │ │ └── zero-shot@15XOFdVp0IC-kLYPXUJWh.md
│ │ │ │ └── faqs.astro
│ │ │ ├── ai-product-builder/
│ │ │ │ └── content/
│ │ │ │ ├── 1-prototyping@ZGqeasMGuEiZvrdyjSNuM.md
│ │ │ │ ├── 2-generation@DCcj2_9a7aYi6qCnI4TMV.md
│ │ │ │ ├── 3-refinement@S9fE9eG1YWSfVRi8h13U1.md
│ │ │ │ ├── 4-collaboration@rcR8DMzELUnmJ7I_pwWpI.md
│ │ │ │ ├── 5-deployment@t03SkyX28SacfP_DpmHUf.md
│ │ │ │ ├── ai-product-creation-cycle@COeXWV8fCTHXPZnErXcGZ.md
│ │ │ │ ├── app-anatomy@ncU03bZztHwt9VrQbEZ15.md
│ │ │ │ ├── aws@-MWVEd4dEfGcwBTxKh9WM.md
│ │ │ │ ├── azure-devops@DAEMRai6FpPrmRkmKTOhV.md
│ │ │ │ ├── azure@UoZoN-nN8eTnI-J5ma-oq.md
│ │ │ │ ├── base44@kufoDIjMsRnb93I6Y_hN7.md
│ │ │ │ ├── bit-cloud@AlE1rcdp-5RVihRMpshnh.md
│ │ │ │ ├── bolt@YZi89ogkfzKIivbdFmcP_.md
│ │ │ │ ├── browsers--devtools@iRey4hwJCIraoNsIZELZv.md
│ │ │ │ ├── choose-a-prototype-tool@mQzAgHoM3DS_zn2zr2FXg.md
│ │ │ │ ├── claude-code@Fa06GTSwYb9x0QuGsp8et.md
│ │ │ │ ├── claude-code@G86QePmTB5LX4_dMkVgoK.md
│ │ │ │ ├── cloudflare@Q6PzFpT_4kElowvvB2u_v.md
│ │ │ │ ├── codex@S7uHXLcxvtegkI1kirVS9.md
│ │ │ │ ├── codex@xCoG801UzwsRaK0xmI9_B.md
│ │ │ │ ├── copilot@6HLxaflojoF0-cuIuPDeG.md
│ │ │ │ ├── cursor@BEw1Iowb0KMiChtDGvKep.md
│ │ │ │ ├── definition--scope@4dxljr8BtYkJDXbLeE0gW.md
│ │ │ │ ├── digitalocean@ZxLukZLdGXGvV4MRHmoGh.md
│ │ │ │ ├── e2e-testing@MB_6yVmgPZugbjxGzoq09.md
│ │ │ │ ├── feature-scoping@5qljkbrUWUAn-5Ng2AiaJ.md
│ │ │ │ ├── feedback--validation@ZQ-kWlp5v9fimgHmG5hlR.md
│ │ │ │ ├── gcp@6hl4_ft8onzq80v_nD8Q4.md
│ │ │ │ ├── gemini-cli@vGtnZaa5vH02cTgkVG6A-.md
│ │ │ │ ├── github@OFscURhjqJfh8qA3SKSfh.md
│ │ │ │ ├── gitlab@f_d4JlYSbP9BHuCR0kBpP.md
│ │ │ │ ├── hope-ai@8ePFxmPv_Vm7SKoleM1tT.md
│ │ │ │ ├── html--css--javascript@Cem2u4lHoA8KW-0GqVzcw.md
│ │ │ │ ├── integration-testing@MXPA6I8K1_aKKQpgk2EcW.md
│ │ │ │ ├── lovable@T-NUiQvT8dKmg6UDGVSt_.md
│ │ │ │ ├── mongodb--atlas@gwHXA4WBrZN0VeAx5NKz7.md
│ │ │ │ ├── new-feature--structural-change@HZHzCLbK-oQh7gSokxHWq.md
│ │ │ │ ├── nodejs@d_2Uq2_Befe1tqM8_Y8lq.md
│ │ │ │ ├── postgresql--mysql@kfl0oJKi1OusryrSqO2jn.md
│ │ │ │ ├── problem-definition@kxDCkO0aZLY4_hd4_ykH6.md
│ │ │ │ ├── railway@Sv7QfwPKaTsviScn2axhk.md
│ │ │ │ ├── react@aHQ8f3ulEeUxTYCifzcPq.md
│ │ │ │ ├── render@OBGQ-1bjYBdYi-_oFpmj8.md
│ │ │ │ ├── replit@Gf1egAjfyQyAJ4I-aT_Ip.md
│ │ │ │ ├── supabase@p4Ku5RT5uOVYPuduqz80M.md
│ │ │ │ ├── targeted-change@ydzaN2EHBVAavHS3iPQ40.md
│ │ │ │ ├── tech-stack--constraints@tN2X9NW0PhcP21OptheoD.md
│ │ │ │ ├── unit-testing@VxqhYHA9YpWx70GIhKghY.md
│ │ │ │ ├── user-testing@aRA5S0Mmmhx9F0nhD3Wcp.md
│ │ │ │ ├── v0@xKBoLYQgpLDmOtDweVHei.md
│ │ │ │ └── vercel@wUg8ypt4aWXgMYGiaIdgy.md
│ │ │ ├── ai-red-teaming/
│ │ │ │ ├── ai-red-teaming.json
│ │ │ │ ├── ai-red-teaming.md
│ │ │ │ ├── content/
│ │ │ │ │ ├── advanced-techniques@soC-kcem1ISbnCQMa6BIB.md
│ │ │ │ │ ├── adversarial-examples@xjlttOti-_laPRn8a2fVy.md
│ │ │ │ │ ├── adversarial-training@2Y0ZO-etpv3XIvunDLu-W.md
│ │ │ │ │ ├── agentic-ai-security@FVsKivsJrIb82B0lpPmgw.md
│ │ │ │ │ ├── ai-security-fundamentals@R9DQNc0AyAQ2HLpP4HOk6.md
│ │ │ │ │ ├── api-protection@Tszl26iNBnQBdBEWOueDA.md
│ │ │ │ │ ├── authentication@J7gjlt2MBx7lOkOnfGvPF.md
│ │ │ │ │ ├── authentication@JQ3bR8odXJfd-1RCEf3-Q.md
│ │ │ │ │ ├── automated-vs-manual@LVdYN9hyCyNPYn2Lz1y9b.md
│ │ │ │ │ ├── benchmark-datasets@et1Xrr8ez-fmB0mAq8W_a.md
│ │ │ │ │ ├── black-box-testing@0bApnJTt-Z2IUf0X3OCYf.md
│ │ │ │ │ ├── code-injection@vhBu5x8INTtqvx6vcYAhE.md
│ │ │ │ │ ├── conferences@LuKnmd9nSz9yLbTU_5Yp2.md
│ │ │ │ │ ├── confidentiality-integrity-availability@WZkIHZkV2qDYbYF9KBBRi.md
│ │ │ │ │ ├── continuous-monitoring@7Km0mFpHguHYPs5UhHTsM.md
│ │ │ │ │ ├── continuous-testing@65Lo60JQS5YlvvQ6KevXt.md
│ │ │ │ │ ├── countermeasures@G1u_Kq4NeUsGX2qnUTuJU.md
│ │ │ │ │ ├── ctf-challenges@2Imb64Px3ZQcBpSQjdc_G.md
│ │ │ │ │ ├── custom-testing-scripts@C1zO2xC0AqyV53p2YEPWg.md
│ │ │ │ │ ├── data-poisoning@nD0_64ELEeJSN-0aZiR7i.md
│ │ │ │ │ ├── direct@5zHow4KZVpfhch5Aabeft.md
│ │ │ │ │ ├── emerging-threats@-G8v_CNa8wO_g-46_RFQo.md
│ │ │ │ │ ├── ethical-considerations@1gyuEV519LjN-KpROoVwv.md
│ │ │ │ │ ├── forums@Smncq-n1OlnLAY27AFQOO.md
│ │ │ │ │ ├── generative-models@3XJ-g0KvHP75U18mxCqgw.md
│ │ │ │ │ ├── grey-box-testing@ZVNAMCP68XKRXVxF2-hBc.md
│ │ │ │ │ ├── indirect@3_gJRtJSdm2iAfkwmcv0e.md
│ │ │ │ │ ├── industry-credentials@HHjsFR6wRDqUd66PMDE_7.md
│ │ │ │ │ ├── industry-standards@WePO66_4-gNcSdE00WKmw.md
│ │ │ │ │ ├── infrastructure-security@nhUKKWyBH80nyKfGT8ErC.md
│ │ │ │ │ ├── insecure-deserialization@aKzai0A8J55-OBXTnQih1.md
│ │ │ │ │ ├── introduction@HFJIYcI16OMyM77fAw9af.md
│ │ │ │ │ ├── jailbreak-techniques@Ds8pqn4y9Npo7z6ubunvc.md
│ │ │ │ │ ├── lab-environments@MmwwRK4I9aRH_ha7duPqf.md
│ │ │ │ │ ├── large-language-models@8K-wCn2cLc7Vs_V4sC3sE.md
│ │ │ │ │ ├── llm-security-testing@xJYTRbPxMn0Xs5ea0Ygn6.md
│ │ │ │ │ ├── model-inversion@iE5PcswBHnu_EBFIacib0.md
│ │ │ │ │ ├── model-vulnerabilities@uBXrri2bXVsNiM8fIHHOv.md
│ │ │ │ │ ├── model-weight-stealing@QFzLx5nc4rCCD8WVc20mo.md
│ │ │ │ │ ├── monitoring-solutions@59lkLcoqV4gq7f8Zm0X2p.md
│ │ │ │ │ ├── neural-networks@RuKzVhd1nZphCrlW1wZGL.md
│ │ │ │ │ ├── prompt-engineering@gx4KaFqKgJX9n9_ZGMqlZ.md
│ │ │ │ │ ├── prompt-hacking@1Xr7mxVekeAHzTL7G4eAZ.md
│ │ │ │ │ ├── prompt-injection@XOrAPDRhBvde9R-znEipH.md
│ │ │ │ │ ├── red-team-simulations@DpYsL0du37n40toH33fIr.md
│ │ │ │ │ ├── reinforcement-learning@Xqzc4mOKsVzwaUxLGjHya.md
│ │ │ │ │ ├── remote-code-execution@kgDsDlBk8W2aM6LyWpFY8.md
│ │ │ │ │ ├── reporting-tools@BLnfNlA0C4yzy1dvifjwx.md
│ │ │ │ │ ├── research-groups@ZlR03pM-sqVFZNhD1gMSJ.md
│ │ │ │ │ ├── research-opportunities@VmaIHVsCpq2um_0cA33V3.md
│ │ │ │ │ ├── responsible-disclosure@KAcCZ3zcv25R6HwzAsfUG.md
│ │ │ │ │ ├── risk-management@MupRvk_8Io2Hn7yEvU663.md
│ │ │ │ │ ├── robust-model-design@6gEHMhh6BGJI-ZYN27YPW.md
│ │ │ │ │ ├── role-of-red-teams@Irkc9DgBfqSn72WaJqXEt.md
│ │ │ │ │ ├── safety-filter-bypasses@j7uLLpt8MkZ1rqM7UBPW4.md
│ │ │ │ │ ├── specialized-courses@s1xKK8HL5-QGZpcutiuvj.md
│ │ │ │ │ ├── supervised-learning@NvOJIv36Utpm7_kOZyr79.md
│ │ │ │ │ ├── testing-platforms@c8n8FcYKDOgPLQvV9xF5J.md
│ │ │ │ │ ├── threat-modeling@RDOaTBWP3aIJPUp_kcafm.md
│ │ │ │ │ ├── unauthorized-access@DQeOavZCoXpF3k_qRDABs.md
│ │ │ │ │ ├── unsupervised-learning@ZC0yKsu-CJC-LZKKo2pLD.md
│ │ │ │ │ ├── vulnerability-assessment@887lc3tWCRH-sOHSxWgWJ.md
│ │ │ │ │ ├── white-box-testing@Mrk_js5UVn4dRDw-Yco3Y.md
│ │ │ │ │ └── why-red-team-ai-systems@fNTb9y3zs1HPYclAmu_Wv.md
│ │ │ │ └── faqs.astro
│ │ │ ├── android/
│ │ │ │ ├── android.json
│ │ │ │ ├── android.md
│ │ │ │ ├── content/
│ │ │ │ │ ├── activity-lifecycle@FVg438cVBBzqJFkGWVbQM.md
│ │ │ │ │ ├── activity@nwuVlPmzwJ17mtVQ8Hi9w.md
│ │ │ │ │ ├── animations@Xn1VQ-xOT67ZfJJTM4r1p.md
│ │ │ │ │ ├── apollo-android@ww0fTbdXwVr-QIOClU7ng.md
│ │ │ │ │ ├── app-components@5Li8J5iR_ZuyIlxX0LYei.md
│ │ │ │ │ ├── app-shortcuts@xV475jHTlLuHtpHZeXb7P.md
│ │ │ │ │ ├── asynchronism@cFYZ2C7yNnY6NHKUNP2Z4.md
│ │ │ │ │ ├── authentication@Xv0es_z64vh-QzivMeAT3.md
│ │ │ │ │ ├── basics-of-kotlin@jl1FsQ5-WGKeFyaILNt_p.md
│ │ │ │ │ ├── basics-of-oop@j69erqfosSZMDlmKcnnn0.md
│ │ │ │ │ ├── bitbucket@5LFZdUiFYYU_1sYsouyan.md
│ │ │ │ │ ├── bottom-sheet@Z4Tbd5ClnqCXGPGG09F-G.md
│ │ │ │ │ ├── broadcast-receiver@tFuAToid1Fkmu96BDtW7K.md
│ │ │ │ │ ├── builder-pattern@784fiIdKrQDlIm3VIiJQN.md
│ │ │ │ │ ├── buttons@WhfzFOUpm0DFEj7Oeq21R.md
│ │ │ │ │ ├── chucker@7RKN1FNtRE_BE6QeAQrKb.md
│ │ │ │ │ ├── cloud-messaging@e3vHFaFFMV7kI9q6yf5e9.md
│ │ │ │ │ ├── common-services@ZEdn2yy-IwHN3kOYr2ZbC.md
│ │ │ │ │ ├── constraint@3fFNMhQIuuh-NRzSXYpXO.md
│ │ │ │ │ ├── content-provider@nkcdjrswv0WCzUs48BAt9.md
│ │ │ │ │ ├── coroutines@i_cKmTnGAYw8xpHwZHjAd.md
│ │ │ │ │ ├── crashlytics@xB4evbD07n1VrHOIpowV4.md
│ │ │ │ │ ├── create-a-basic-hello-world-app@5m_7DvInF8C_4Ml1xVI6L.md
│ │ │ │ │ ├── dagger@CK7Ce632fdTgxeFsRUVvd.md
│ │ │ │ │ ├── data-structures-and-algorithms@cNeT1dJDfgn0ndPzSxhSL.md
│ │ │ │ │ ├── datastore@GWq3s1iTxQOp1BstHscJ9.md
│ │ │ │ │ ├── debugging@6KbSUAoT_jTudFoIbwMpA.md
│ │ │ │ │ ├── dependency-injection@qtXM9K7wyjOFuEMlZrB3C.md
│ │ │ │ │ ├── design--architecture@jePGzTejFe4ryA5qFFmjl.md
│ │ │ │ │ ├── detekt@RUvuCp_JK5MQQT13SSHUV.md
│ │ │ │ │ ├── development-ide@ZRGsokU313Ky-anWbWK6q.md
│ │ │ │ │ ├── dialogs@Mtx0bY0drmaTw8sCM5YTl.md
│ │ │ │ │ ├── distribution@kc6buUsLAeZeUb4Tk0apM.md
│ │ │ │ │ ├── drawer@amTxz7mS98lkhOrNMJXG_.md
│ │ │ │ │ ├── edittext@boMz0HZlMAsLdCZlpUo-H.md
│ │ │ │ │ ├── espresso@-ONSC-ImGSELbamKmjIlH.md
│ │ │ │ │ ├── explicit-intents@TmIeCF3xVCe5Sy3ITmM31.md
│ │ │ │ │ ├── factory-pattern@DeOxj6RzQBYfEWV-M1Ybm.md
│ │ │ │ │ ├── file-system@A4kdaj6AFueUgPI7hwKi5.md
│ │ │ │ │ ├── firebase-distribution@T7q_quNaIAuGi96OdnDT1.md
│ │ │ │ │ ├── firestore@3EEfKAd-ppIQpdQSEhbA1.md
│ │ │ │ │ ├── flow@W-WTIiQml8dLK6i_V69JK.md
│ │ │ │ │ ├── fragments@2iDJrxjXOt7o2fPp2HfRl.md
│ │ │ │ │ ├── frame@Dp2DOX10u2xJUjB8Okhzh.md
│ │ │ │ │ ├── git@rqSZ2ATeHbOdIQE9Jlb0B.md
│ │ │ │ │ ├── github@H-2eb8fLwz8IKYXbeSVKK.md
│ │ │ │ │ ├── gitlab@Q47BtQphp59NkkZoeNXmP.md
│ │ │ │ │ ├── google-admob@D4ZXQOKJkyFYNZIy-MJ9Y.md
│ │ │ │ │ ├── google-maps@S5FVF9rMgVSSDKXJW2GYb.md
│ │ │ │ │ ├── google-play-services@m5rumeynEbS8T27pelr0-.md
│ │ │ │ │ ├── google-playstore@HgRdgi2Hu4C8YLG5PXfoo.md
│ │ │ │ │ ├── hilt@ooo_k2k_vUBR_jQ7Ke6Et.md
│ │ │ │ │ ├── imageview@A4rtNULX_MoV93IH1Lgqw.md
│ │ │ │ │ ├── implicit-intents@gGdz3j33x0gfrFDp_rw8Z.md
│ │ │ │ │ ├── intent-filters@b-sfh6NoS-APqaNKm5L5S.md
│ │ │ │ │ ├── intent@hv_9imIQpthxEaMLXEUHI.md
│ │ │ │ │ ├── interface--navigation@4_e76QafrB419S2INOeKd.md
│ │ │ │ │ ├── java@RBABbkzD_uNFwEO-hssZO.md
│ │ │ │ │ ├── jetpack-benchmark@ACUJlDDR0jqEohsFzWEoQ.md
│ │ │ │ │ ├── jetpack-compose@60Vm-77rseUqpMiFvp-dA.md
│ │ │ │ │ ├── junit@gvGAwjk_nhEgxzZ_c3f6b.md
│ │ │ │ │ ├── kodein@dc7k50PjCYZcElHhCk66p.md
│ │ │ │ │ ├── koin@UMqZ-jmXKDXKuu8bzqDH_.md
│ │ │ │ │ ├── kotlin@qIzUv8-GgQnkqChEdgD50.md
│ │ │ │ │ ├── ktlint@zMbXQH17Q52opdbitPzj7.md
│ │ │ │ │ ├── leak-canary@3i4g9ZWgLxKb2UMgRJi4Q.md
│ │ │ │ │ ├── linear@U8iMGGOd2EgPxSuwSG39Z.md
│ │ │ │ │ ├── linting@77F9F3oI5CPgwgM_hxWfa.md
│ │ │ │ │ ├── listview@EzLjX4iRT7AxkAOsJYnSU.md
│ │ │ │ │ ├── livedata@TiokceMGU9caqiR0lbFYL.md
│ │ │ │ │ ├── mvc@w1A6wPKSd3Yh2luuHV-aE.md
│ │ │ │ │ ├── mvi@Bz-BkfzsDHAbAw3HD7WCd.md
│ │ │ │ │ ├── mvp@aF_xFIqTjQbENtC7pkXvJ.md
│ │ │ │ │ ├── mvvm@pSU-NZtjBh-u0WKTYfjk_.md
│ │ │ │ │ ├── navigation-components@o5rzmnaQeiSh9ocvfJPpK.md
│ │ │ │ │ ├── network@Yb6aKJMMCxU1QVltWg3Dr.md
│ │ │ │ │ ├── observer-pattern@N_auRfGKkeIIc-qiHLkR_.md
│ │ │ │ │ ├── okhttp@5pVuwOItAhUxxJX8ysAsn.md
│ │ │ │ │ ├── pick-a-language@Suws-7f_6Z1ChpfcnxX2M.md
│ │ │ │ │ ├── recyclerview@xIvplWfe-uDr9iHjPT1Mx.md
│ │ │ │ │ ├── recycleview@xIvplWfe-uDr9iHjPT1Mx.md
│ │ │ │ │ ├── relative@yE0qAQZiEC9R8WvCdskpr.md
│ │ │ │ │ ├── remote-config@1Tz-Shj_Tuz2U8llEAcLr.md
│ │ │ │ │ ├── repository-pattern@ZF5XgO7I_J9928bD3CVXo.md
│ │ │ │ │ ├── retro@dDMRYiqrKyOBnRRQc8zsp.md
│ │ │ │ │ ├── room-database@Bfg4So5RlI09zFNcburJd.md
│ │ │ │ │ ├── rxjava@xk0vnWr7uESdzYRxwFjoK.md
│ │ │ │ │ ├── rxjava@zXsNEyRbb8UpEOAUv6FpY.md
│ │ │ │ │ ├── rxkotlin@4h37WBpYxRRyw9oH8ge7o.md
│ │ │ │ │ ├── rxkotlin@7rbsp1o5bzIJP11BRIoeG.md
│ │ │ │ │ ├── security@j5qmSMOdhpGZo1XOUVx1k.md
│ │ │ │ │ ├── services@PcHmU1c9hqKyzSjwlRPHk.md
│ │ │ │ │ ├── shared-preferences@PKql1HY0PLMfp50FRELXL.md
│ │ │ │ │ ├── signed-apk@_FSlD_qTz5Xo0x3pB6sZI.md
│ │ │ │ │ ├── state-changes@oUjetA2eduvQIeLcQlLcu.md
│ │ │ │ │ ├── storage@0fNQWRxst8xRstIfPaPO6.md
│ │ │ │ │ ├── tabs@pEBpXv3Jf1AzBNHlvVrG8.md
│ │ │ │ │ ├── tasks--backstack@-O-G9bg36ut8NnZcdOaop.md
│ │ │ │ │ ├── testing@ZOQm5OlzCA-h_yxywwDrW.md
│ │ │ │ │ ├── textview@znvZp24L-PcQwkSObtixs.md
│ │ │ │ │ ├── the-fundamentals@HlUUGj3dOZ68t4gIjerXh.md
│ │ │ │ │ ├── threads@BeGrA5BDBMZP1Jy7n-wl-.md
│ │ │ │ │ ├── timber@VFOD4JrV8kZ2583G3oT95.md
│ │ │ │ │ ├── toast@BVgO9n7tGlVdiS72-hFSd.md
│ │ │ │ │ ├── version-control@5s1CqsYCOXjNroDHaGKGa.md
│ │ │ │ │ ├── what-is-and-how-to-use-gradle@FVxNjbDBxgf6vkZWw1Awt.md
│ │ │ │ │ └── workmanager@OAb_JD64uGm2tPoue7w6t.md
│ │ │ │ ├── faqs.astro
│ │ │ │ └── migration-mapping.json
│ │ │ ├── angular/
│ │ │ │ ├── angular.json
│ │ │ │ ├── angular.md
│ │ │ │ ├── content/
│ │ │ │ │ ├── accessibility@VNG9DdXlS6R1OJ6Lrn4Lt.md
│ │ │ │ │ ├── analogjs@kauQofxCmpktXPcnzid17.md
│ │ │ │ │ ├── angular-and-history@hpShWwL0M57ZAzqkB4I8t.md
│ │ │ │ │ ├── angular-architecture@DE3cMpeRYuUPw2ADtfS-3.md
│ │ │ │ │ ├── angular-cli@4YSk6I63Ew--zoXC3xmrC.md
│ │ │ │ │ ├── animation@rYJq59Q0YdfK6n3x740Em.md
│ │ │ │ │ ├── aot-compilation@MwtM1UAIfj4FJ-Y4CKDsP.md
│ │ │ │ │ ├── attribute-binding@FgsSyM6To7irpbivtOLEE.md
│ │ │ │ │ ├── attribute-directives@xvwby0FTdIolRrV2j88fY.md
│ │ │ │ │ ├── attributes@0FvH7KPs9ag02QkD1HEJ-.md
│ │ │ │ │ ├── build-environments@Ax-s_xw3FO3Ocv-AnLbQD.md
│ │ │ │ │ ├── case@cHC2MH50CbUSMRZV4QGJI.md
│ │ │ │ │ ├── change-detection@_-mTs_FMeob-ZGK-bb3j-.md
│ │ │ │ │ ├── changedetection@uYHy2yhtTm6fQkKpYx3lU.md
│ │ │ │ │ ├── cli-builders@TeWEy9I-hU6SH02Sy2S2S.md
│ │ │ │ │ ├── code-coverage@bqA2bxPcZrqQ-6QE-YDK1.md
│ │ │ │ │ ├── combination@IgUHqfVhiGpwxT9tY8O88.md
│ │ │ │ │ ├── common-pipes@i2taHzQ5KLHjkkpbH4Ytd.md
│ │ │ │ │ ├── communication@19c7D-fWIJ3vYFT6h8ZfN.md
│ │ │ │ │ ├── complex-sequences@Unjknmb4b2LY-nUVvvF7_.md
│ │ │ │ │ ├── component-anatomy@Mp056kNnwsRWeEXuhGPy-.md
│ │ │ │ │ ├── component-bindings@cXVy1lx2XqY_j8gxz-y60.md
│ │ │ │ │ ├── component-lifecycle@nCpfj_35ZvW-NTygg06XZ.md
│ │ │ │ │ ├── component-templates@0dYWO_Zvh9J5_6cRjRjvI.md
│ │ │ │ │ ├── components@kGnKzCkQCNFEdgCBRtNuW.md
│ │ │ │ │ ├── configuration@dbAS-hN1hoCsNJhkxXcGq.md
│ │ │ │ │ ├── containers@0s-QhN5aZh2F3tLJFKEyR.md
│ │ │ │ │ ├── contentchild@oQl9etjoHiU2JgxieUOEH.md
│ │ │ │ │ ├── control-flow@VzvB_bads057YtG4ST4a2.md
│ │ │ │ │ ├── control-value-accessor@m5dgKgUR3ZqI9sBAzToev.md
│ │ │ │ │ ├── creating-components@ex8FOKrUlbu4MuEq2czyW.md
│ │ │ │ │ ├── creating-libraries@A1mYMg7cbcj6p_VkDf-Tz.md
│ │ │ │ │ ├── creating-modules@9YhTXybJw2gszlqFeBtW3.md
│ │ │ │ │ ├── cross-site-request-forgery@Z1DZBbFI4oU6-KQg3wqMm.md
│ │ │ │ │ ├── cross-site-script-inclusion@zd7YJGlcMFNFbsKUiW_XC.md
│ │ │ │ │ ├── cross-site-scripting@umUX4Hxk7srHlFR_Un-u7.md
│ │ │ │ │ ├── custom-directives@7GUvTMVzfdVEDBOz-tHUT.md
│ │ │ │ │ ├── custom-pipes@BOYXGfULJRiP-XOo_lNX3.md
│ │ │ │ │ ├── custom-validators@kxRtLsB3y_th8j-HjmJgK.md
│ │ │ │ │ ├── data-binding@5vZkiH7HDwONIABLfNJ06.md
│ │ │ │ │ ├── debugging-tests@f5v74Uw54LsB4FgdN6eCd.md
│ │ │ │ │ ├── default@h4MMn0_qUN3YXEdMUJOyd.md
│ │ │ │ │ ├── defer@ONy-0olujU_FGZM7Wvfr2.md
│ │ │ │ │ ├── deferrable-views@CYjsXIOWtP5DJmYS-qR-s.md
│ │ │ │ │ ├── dependencies@5b590c7s-2XJ0rgdCYxLa.md
│ │ │ │ │ ├── dependency-injection@8u9uHCRt9RU57erBy79PP.md
│ │ │ │ │ ├── deployment@1fVi9AK6aLjt5QgAFbnGX.md
│ │ │ │ │ ├── developer-tools@EbJib-XfZFF9bpCtL3aBs.md
│ │ │ │ │ ├── devtools@T3MmS3bvMMgCUbOk3ktU7.md
│ │ │ │ │ ├── directives@kGzlumFdZFxTRZ3HnCGFO.md
│ │ │ │ │ ├── dynamic-components@tC5ETtOuuUcybj1jI4CuG.md
│ │ │ │ │ ├── dynamic-forms@CpufN6DAOj5UNab9vnH0k.md
│ │ │ │ │ ├── elf@rgPUcSKxG9DvXicLfC2Ay.md
│ │ │ │ │ ├── else-if@ys5untkSppGMFK-VsfuRt.md
│ │ │ │ │ ├── else@ORdPDad4HWJAfcZuS-7yM.md
│ │ │ │ │ ├── encapsulation@ctigvSYeFa77y3v7m11gk.md
│ │ │ │ │ ├── end-to-end-testing@yhNGhduk__ow8VTLc6inZ.md
│ │ │ │ │ ├── enforce-trusted-types@5h7U0spwEUhB-hbjSlaeB.md
│ │ │ │ │ ├── event-binding@bKnpirSvex4oE4lAjiSSV.md
│ │ │ │ │ ├── feature-modules@w_BazXvINFyxDCHmlznfy.md
│ │ │ │ │ ├── filtering@nxUbl0eu3LsSL-Z8X6nP5.md
│ │ │ │ │ ├── for@2kYS9w1UzQFZ1zhf01m9L.md
│ │ │ │ │ ├── forms@Q36LQds8k_cSjijvXyWOM.md
│ │ │ │ │ ├── guards@PmC4zeaLpa5LoL4FhYXcG.md
│ │ │ │ │ ├── http-client@8UY0HAvjY7bdbFpt-MM1u.md
│ │ │ │ │ ├── http-vulnerabilities@xH3RHPhsaqD9zIMms5OmX.md
│ │ │ │ │ ├── httpclient-csrf@m2aw8vb4rz4IjshpoMyNx.md
│ │ │ │ │ ├── hydration@NY_MfBNgNmloiRGcIvfJ1.md
│ │ │ │ │ ├── if@U1Zy2T-2ki9pDkXn9hn-I.md
│ │ │ │ │ ├── image-optimization@1WIKjn3nxYDMIhBL17aYQ.md
│ │ │ │ │ ├── imports@ghbrJhuGvscnNGCtVLh5_.md
│ │ │ │ │ ├── input--output@VsU6713jeIjAOEZnF6gWx.md
│ │ │ │ │ ├── inputs-as-signals@LcJyAfv9hjyUNXUVyPRP4.md
│ │ │ │ │ ├── internationalization@Xxyx3uzy5TpNhgR1IysMN.md
│ │ │ │ │ ├── interpolation@XHpfHRIlFh19FJIE07u7i.md
│ │ │ │ │ ├── introduction-to-angular@KDd40JOAvZ8O1mfhTYB3K.md
│ │ │ │ │ ├── language-service@ql7SyxrRmjpiXJ9hQeWPq.md
│ │ │ │ │ ├── lazy-loading-modules@bLERvEERmNI5AgxtEYokZ.md
│ │ │ │ │ ├── lazy-loading@ewbDdPYv2SJl_jW3RVHQs.md
│ │ │ │ │ ├── let@AwOM0ucg6W7TohdUd7KWT.md
│ │ │ │ │ ├── libraries@cl89U8atD6gw5rMGUm4Ix.md
│ │ │ │ │ ├── link-identification@5-RCB8AiDbkdIFYNXKWge.md
│ │ │ │ │ ├── local-setup@FVH0lnbIZ2m5EfF2EJ2DW.md
│ │ │ │ │ ├── locales-by-id@dVKl3Z2Rnf6IB064v19Mi.md
│ │ │ │ │ ├── localize-package@W8OwpEw00xn0GxidlJjdc.md
│ │ │ │ │ ├── making-requests@HjGAv3aV-p4ijYJ8XYIw3.md
│ │ │ │ │ ├── metadata@Szgr8dnZNi-z5i6raIJzW.md
│ │ │ │ │ ├── model-inputs@IeU6ClS_yp6BYKdkQOJVf.md
│ │ │ │ │ ├── module-architecture@BCq5sgWQLiw0f7u7ZSAd2.md
│ │ │ │ │ ├── modules@b_kdNS9PDupcUftslkf9i.md
│ │ │ │ │ ├── multiple-locales@9ISvaaJ815_cr_KW9vQhT.md
│ │ │ │ │ ├── ngrx@ir94IdkF1tVAA8ZTD9r0N.md
│ │ │ │ │ ├── ngxs@N9ZCPgFnFIUv4jMv1w5qK.md
│ │ │ │ │ ├── observable-lifecycle@b06Y5YrqBbHhWkK6Ws_1c.md
│ │ │ │ │ ├── observable-pattern@krXA6ua7E3m4IIpFkgQZe.md
│ │ │ │ │ ├── operators@ihsjIcF0tkhjs56458teE.md
│ │ │ │ │ ├── parent-child-interaction@TDyFjKrIZJnCjEZsojPNQ.md
│ │ │ │ │ ├── performance@STEHxJpwBZxFdQl0zUKxo.md
│ │ │ │ │ ├── pipes-precedence@nZxZnzbQg9dz-SI65UHq9.md
│ │ │ │ │ ├── pipes@j99WQxuTzGeBBVoReDp_y.md
│ │ │ │ │ ├── property-binding@TJOZfHtsLfwA0CZ2bd1b2.md
│ │ │ │ │ ├── provider@dOMvz__EQjO-3p-Nzm-7P.md
│ │ │ │ │ ├── queries-as-signals@9HS9C3yq9EUcUy0ZUZk_H.md
│ │ │ │ │ ├── rate-limiting@bJbbayFQ9WSJT9-qy0H5l.md
│ │ │ │ │ ├── reactive-forms@1d3Y4HVnqom8UOok-7EEf.md
│ │ │ │ │ ├── reusable-animations@M1CU2Yq6dLp4yOuGV0fhF.md
│ │ │ │ │ ├── route-transitions@x91jWP81oCTeVEwzX8FbK.md
│ │ │ │ │ ├── router-events@YF_sG292HqawIX0siWhrv.md
│ │ │ │ │ ├── router-links@8lFyuSx4MUcYRY2L8bZrq.md
│ │ │ │ │ ├── router-outlets@1ZwdEL0Gx30Vv_Av3ZTGG.md
│ │ │ │ │ ├── routing@8i_JD1P4gIhY1rdldwLC2.md
│ │ │ │ │ ├── routing@a74v78SvGtWduZpXs7wSq.md
│ │ │ │ │ ├── rxjs-basics@lfp7PIjwITU5gBITQdirD.md
│ │ │ │ │ ├── rxjs-interop@KAdtebWvgvMifIwd52yc4.md
│ │ │ │ │ ├── rxjs-vs-promises@e1ZmmxPZuogCNgtbPPWmd.md
│ │ │ │ │ ├── sanitization@cgI9oeUHufA-ky_W1zENe.md
│ │ │ │ │ ├── schematics@Uvr0pRk_fOzwRwqn0dQ6N.md
│ │ │ │ │ ├── security@mm6c7GLQEwoQdAHdAYzGh.md
│ │ │ │ │ ├── selector@cDN0PGo-zkcLmttxCiAI-.md
│ │ │ │ │ ├── services---remote-data@CpsoIVoCKaZnM_-BbXbCh.md
│ │ │ │ │ ├── services-with-dependencies@TGRZBizDy83JKg_MhnRdX.md
│ │ │ │ │ ├── setting-up-a-new-project@EbFRcy4s6yzzIApBqU77Y.md
│ │ │ │ │ ├── setting-up-the-client@AKPhbg10xXjccO7UBh5eJ.md
│ │ │ │ │ ├── signals@u1TG8i145o0RKhOR_5epf.md
│ │ │ │ │ ├── slow-computations@yxUtSBzJPRcS-IuPsyp-W.md
│ │ │ │ │ ├── ssg@b-0yQ74zHtAxI9aRLBohc.md
│ │ │ │ │ ├── ssr@jfHaS8TqE4tcAo59K8Nkn.md
│ │ │ │ │ ├── standalone@RcNHEh6kmbBK1PICbhAwr.md
│ │ │ │ │ ├── state-management@Mqe_s-nwBqAL6X7OGRHEN.md
│ │ │ │ │ ├── structural-directives@xk3v8p6vf8ntGj5c-IU4U.md
│ │ │ │ │ ├── styles@4XJKEmSrQfPxggHlAP30w.md
│ │ │ │ │ ├── switch@nZuim4Fjq6jYOXcRTAEay.md
│ │ │ │ │ ├── template-driven-forms@uDx4lPavwsJFBMzdQ70CS.md
│ │ │ │ │ ├── template-ref-vars@nyDry6ZWyEUuTq4pw-lU3.md
│ │ │ │ │ ├── template-statements@t2YOeMONlcnKBrVAo0JDc.md
│ │ │ │ │ ├── template-syntax@VsC7UmE_AumsBP8fC6to1.md
│ │ │ │ │ ├── template@-gUpm3OLUJl9iAyx6fmHN.md
│ │ │ │ │ ├── templates@6fhe9xAi_RSVfa-KKbcbV.md
│ │ │ │ │ ├── testing-directives@SGqb5k6OmWit8PA6ZT3js.md
│ │ │ │ │ ├── testing-pipes@rH13NBFG02hnn5eABSNCY.md
│ │ │ │ │ ├── testing-requests@4xt0m5jkUqB4Z-krcFBuL.md
│ │ │ │ │ ├── testing-services@HU1eTYB321C93qh_U7ioF.md
│ │ │ │ │ ├── testing@lLa-OnHV6GzkNFZu29BIT.md
│ │ │ │ │ ├── transformation@kdMJHljMzGA3oRlh8Zvos.md
│ │ │ │ │ ├── transitions--triggers@Iv2d4sgODqMPzA9gH6RAw.md
│ │ │ │ │ ├── translation-files@jL5amGV1BAX_V5cyTIH7d.md
│ │ │ │ │ ├── trusting-safe-values@XoYSuv1salCCHoI1cJkxv.md
│ │ │ │ │ ├── two-way-binding@2UH79nCjgtY1Qz1YjUJYL.md
│ │ │ │ │ ├── typed-forms@XC_K1Wahl2ySqOXoym4YU.md
│ │ │ │ │ ├── ui-components@CZ1YRyai8Ds-ry4A8jVbr.md
│ │ │ │ │ ├── understand-binding@WH5wlyOtrqFHBJx7RFJwS.md
│ │ │ │ │ ├── using-libraries@YHV5oFwLwphXf1wJTDZuG.md
│ │ │ │ │ ├── viewchild@v0XaLNZ-YrRqP-xv8wS43.md
│ │ │ │ │ ├── viewprovider@doHDoAgp7T59KGSXPpQzZ.md
│ │ │ │ │ ├── writing-interceptors@xG7iSVOGcbxJbNv3xbNfc.md
│ │ │ │ │ ├── xsrf-protection@ni00edsphJd7uBLCn7-Vw.md
│ │ │ │ │ ├── zone-pollution@pRSR5PEbkJXAJ1LPyK-EE.md
│ │ │ │ │ ├── zoneless-applications@1x5pT607aKE-S-NCWB810.md
│ │ │ │ │ └── zones@m4WBnx_9h01Jl6Q1sxi4Y.md
│ │ │ │ ├── faqs.astro
│ │ │ │ └── migration-mapping.json
│ │ │ ├── api-design/
│ │ │ │ ├── api-design.json
│ │ │ │ ├── api-design.md
│ │ │ │ ├── content/
│ │ │ │ │ ├── abac@dZTe_kxIUQsc9N3w920aR.md
│ │ │ │ │ ├── api-documentation-tools@5R9yKfN1vItuv__HgCwP7.md
│ │ │ │ │ ├── api-gateways@MJeUD4fOHaJu1oxk4uQ-x.md
│ │ │ │ │ ├── api-integration-patterns@R3aRhqCslwhegMfHtxg5z.md
│ │ │ │ │ ├── api-keys--management@tzUJwXu_scwQHnPPT0oY-.md
│ │ │ │ │ ├── api-lifecycle-management@At5exN7ZAx2IzY3cTCzHm.md
│ │ │ │ │ ├── api-performance@d9ZXdU73jiCdeNHQv1_DH.md
│ │ │ │ │ ├── api-security@qIJ6dUppjAjOTA8eQbp0n.md
│ │ │ │ │ ├── api-testing@Wpk4TvxcZOJgAoXjrOsZF.md
│ │ │ │ │ ├── attribute-based-access-control-abac@dZTe_kxIUQsc9N3w920aR.md
│ │ │ │ │ ├── authentication-methods@cQnQ9v3mH27MGNwetz3JW.md
│ │ │ │ │ ├── authorization-methods@nHbn8_sMY7J8o6ckbD-ER.md
│ │ │ │ │ ├── basic-auth@0FzHERK5AeYL5wv1FBJbH.md
│ │ │ │ │ ├── basics-of-dns@v4nJYD9yiIEUviLPhVTCD.md
│ │ │ │ │ ├── batch-processing@X68HXAAV-nKo-V4Fu1o72.md
│ │ │ │ │ ├── best-practices@q1yaf-RbHIQsOqfzjn4k4.md
│ │ │ │ │ ├── building-json--restful-apis@awdoiCHz7Yc3kYac_iy-a.md
│ │ │ │ │ ├── caching-strategies@PrvRCR4HCdGar0vcUbG_a.md
│ │ │ │ │ ├── ccpa@a-_iIE7UdoXzD00fD9MxN.md
│ │ │ │ │ ├── common-vulnerabilities@G70wvcOM1Isrx5ZBvS2xP.md
│ │ │ │ │ ├── content-negotiation@TX_hg7EobNJhmWKsMCaT1.md
│ │ │ │ │ ├── contract-testing@NqeBglhzukVMMEF9p2CXc.md
│ │ │ │ │ ├── cookies@UFuX8wcxZQ7dvaQF_2Yp8.md
│ │ │ │ │ ├── cors@GRlsBogOlOwuqhMMPyHN3.md
│ │ │ │ │ ├── dac@_BXgYUlaYfpYrryXTw5n2.md
│ │ │ │ │ ├── different-api-styles@o8i093VQv-T5Qf1yGqU0R.md
│ │ │ │ │ ├── error-handling--retries@XD1vDtrRQFbLyKJaD1AlA.md
│ │ │ │ │ ├── error-handling@8tELdagrOaGCf3nMVs8t3.md
│ │ │ │ │ ├── event-driven-architecture@oMfOBkVsgiLvFLicOUdx6.md
│ │ │ │ │ ├── functional-testing@6lm3wy9WTAERTqXCn6pFt.md
│ │ │ │ │ ├── gdpr@vZxdswGLHCPi5GSuXEcHJ.md
│ │ │ │ │ ├── graphql-apis@MKVcPM2EzAr2_Ieyp9Fu3.md
│ │ │ │ │ ├── grpc-apis@1DrqtOwxCuFtWQXQ6ZALp.md
│ │ │ │ │ ├── handling-crud-operations@zXxEiM5HeOn7W-Vue0tQf.md
│ │ │ │ │ ├── hateoas@LByD1vhzunhY1uY1YGZHP.md
│ │ │ │ │ ├── hipaa@W4WwTmgZGnWmiYsB0ezml.md
│ │ │ │ │ ├── http-caching@qAolZHf_jp8hCdtqHZwC8.md
│ │ │ │ │ ├── http-headers@rE-0yibRH6B2UBKp351cf.md
│ │ │ │ │ ├── http-methods@rADHM-6NAxEjzmgiHefDX.md
│ │ │ │ │ ├── http-status-codes@7szYyzLifKsepNU0c2KnN.md
│ │ │ │ │ ├── http-versions@ACALE93mL4gnX5ThRIdRp.md
│ │ │ │ │ ├── http@2HdKzAIQi15pr3YHHrbPp.md
│ │ │ │ │ ├── idempotency@20KEgZH6cu_UokqWpV-9I.md
│ │ │ │ │ ├── integration-testing@qZELS5vw2feS7QfyD7spX.md
│ │ │ │ │ ├── jwt@tWg68AHLIr1gIZA1za3jp.md
│ │ │ │ │ ├── kafka@boYX1QcJullypfX4sevdy.md
│ │ │ │ │ ├── learn-the-basics@duKkpzPjUU_-8kyJGHqRX.md
│ │ │ │ │ ├── load-balancing@p5wsniYnOS7cbHd92RxGk.md
│ │ │ │ │ ├── load-testing@7JNEx_cbqnAx3esvwZMOd.md
│ │ │ │ │ ├── mac@tl1wXmOaj_zHL2o38VygO.md
│ │ │ │ │ ├── messaging-queues@IkPZel5zxXWIx90Qx7fZI.md
│ │ │ │ │ ├── microservices-architecture@PPeBbooE121zrgNwpVTiA.md
│ │ │ │ │ ├── mocking-apis@bEVCT5QGY3uw0kIfAELKh.md
│ │ │ │ │ ├── oauth-20@TLuNtQ6HKYQXmglyVk8-t.md
│ │ │ │ │ ├── pagination@pgJDzP3pJjhjr5wTRtPJO.md
│ │ │ │ │ ├── pbac@nJWtUyn9bljh3T-q_adJK.md
│ │ │ │ │ ├── pci-dss@J0enF8UTVzY3H4n3pbPIF.md
│ │ │ │ │ ├── performance-metrics@nQpczZUcn-TvrfT80dv0Q.md
│ │ │ │ │ ├── performance-testing@DQcAV59vr1-ZRnMfbLXpu.md
│ │ │ │ │ ├── pii@mXCKtLUvwVJkHrpHzOecq.md
│ │ │ │ │ ├── postman@KQAus72RGqx5f-3-YeJby.md
│ │ │ │ │ ├── profiling-and-monitoring@-qdwBg7HvwlbLy3IKCRij.md
│ │ │ │ │ ├── rabbit-mq@H22jAI2W5QLL-b1rq-c56.md
│ │ │ │ │ ├── rate-limiting--throttling@tPVtRV818D8zAAuNbqPNa.md
│ │ │ │ │ ├── rate-limiting@O7wjldZ3yTA2s_F-UnJw_.md
│ │ │ │ │ ├── rbac@wFsbmMi5Ey9UyDADdbdPW.md
│ │ │ │ │ ├── readmecom@LxWHkhlikUaMT2G8YmVDQ.md
│ │ │ │ │ ├── real-time-apis@JE12g5cqnwmgeTle14Vxw.md
│ │ │ │ │ ├── rebac@CCcY8UsGdd2pdBYHt9L4o.md
│ │ │ │ │ ├── rest-principles@9WI_z34jIFXwoUQuChyRU.md
│ │ │ │ │ ├── restful-apis@BvwdASMvuNQ9DNgzdSZ4o.md
│ │ │ │ │ ├── rfc-7807----problem-details-for-apis@5CxU3inGcSHp-TDg3BQiY.md
│ │ │ │ │ ├── role-based-access-control-rbac@wFsbmMi5Ey9UyDADdbdPW.md
│ │ │ │ │ ├── server-sent-events@iNsXTtcIHsI_i-mCfjGYn.md
│ │ │ │ │ ├── session-based-auth@eQWoy4CpYP3TJL2bbhPB_.md
│ │ │ │ │ ├── simple-json-apis@TVR-SkErlOHbDKLBGfxep.md
│ │ │ │ │ ├── soap-apis@Wwd-0PjrtViMFWxRGaQey.md
│ │ │ │ │ ├── standards-and-compliance@yvdfoly5WHHTq2Puss355.md
│ │ │ │ │ ├── stoplight@OpS2NX1lPTOtfjV1wKtC4.md
│ │ │ │ │ ├── swagger--open-api@5RY7AlfRQydjxWK65Z4cv.md
│ │ │ │ │ ├── synchronous-vs-asynchronous-apis@--mmTKhG58_elbUqyn90G.md
│ │ │ │ │ ├── token-based-auth@QTH7sy9uQZWl6ieBz7erY.md
│ │ │ │ │ ├── understand-tcp--ip@KG3wO86F8Of27fU7QRcsn.md
│ │ │ │ │ ├── unit-testing@JvmW78cDm84GNhq8VEYZp.md
│ │ │ │ │ ├── uri-design@b3qRTLwCC_9uDoPGrd9Bu.md
│ │ │ │ │ ├── url-query--path-parameters@P-rGIk50Bg7nFmWieAW07.md
│ │ │ │ │ ├── versioning-strategies@itILK2SXvLvAjk1Kul7EK.md
│ │ │ │ │ ├── web-sockets@UQ8N7gcVpRLAYXgUNHBt5.md
│ │ │ │ │ ├── webhooks-vs-polling@75NVxS0iwoQXxOHCkWQxH.md
│ │ │ │ │ └── what-are-apis@r8M3quACGO2piu0u_R4hO.md
│ │ │ │ └── faqs.astro
│ │ │ ├── aspnet-core/
│ │ │ │ ├── aspnet-core.json
│ │ │ │ ├── aspnet-core.md
│ │ │ │ ├── content/
│ │ │ │ │ ├── activemq@sNYYEBMHV_NO_NToP51VY.md
│ │ │ │ │ ├── api-clients-and-communication@GLkDH0X0uy8_1DIdCzbUD.md
│ │ │ │ │ ├── app-settings-and-configs@EJxliq-HPVp00CVsFc6kf.md
│ │ │ │ │ ├── aspnet-core-basics@v2ZTCQQFQPoJNhOVGMG2g.md
│ │ │ │ │ ├── autofac@gbpSbjF12dBE1Tb3PX8Bz.md
│ │ │ │ │ ├── autofixture@K49M_7gSpfJuZaE6WaHxQ.md
│ │ │ │ │ ├── automapper@GPmlueMnuLCUW_t4jvGhc.md
│ │ │ │ │ ├── azure-pipelines@_-GQNpsb7KZw76hNNOq3h.md
│ │ │ │ │ ├── azure-service-bus@gBuaVZfqJ0-g21sKohQtx.md
│ │ │ │ │ ├── benchmarknet@9LEVN-uVEwxJooEiB9ApK.md
│ │ │ │ │ ├── blazor@4iD_hDtgJ15IlJGxiO-E8.md
│ │ │ │ │ ├── bogus@QERTjawqCCCkHfR44Ca0s.md
│ │ │ │ │ ├── c@fxANnSiTb2VzA9u-YeBL1.md
│ │ │ │ │ ├── caching@7Nth4LOrM_KirhvjDGkgS.md
│ │ │ │ │ ├── cassandra@U_-Gt5csu_hihl7ybFY-B.md
│ │ │ │ │ ├── change-tracker-api@wfEOvAkGXkTZGdGX341D4.md
│ │ │ │ │ ├── ci--cd@KIFmahcNiSo2NGoLtAyRR.md
│ │ │ │ │ ├── circle-ci@KyGjXgG6JFo42qOV0wqfB.md
│ │ │ │ │ ├── cloud@LrjmJs6_rXUkc2A7fEq24.md
│ │ │ │ │ ├── code-first--migrations@ZPeebwJ3OBuywEgLLgQTG.md
│ │ │ │ │ ├── constraints@1-XdtrGPbUoxpu9ZcQlBA.md
│ │ │ │ │ ├── coravel@p3bZnKIyRgLmB764Kkhju.md
│ │ │ │ │ ├── cosmos-db@KrkV1w9b_Nwm6pe9diDRS.md
│ │ │ │ │ ├── couchdb@vHcwt6ARi5YR3v-eDDjfl.md
│ │ │ │ │ ├── cypress@f2UP2jDnDr7XEFIdAtBhH.md
│ │ │ │ │ ├── dapper@UkWc41r0bZ1lptjse3As6.md
│ │ │ │ │ ├── dapr@IHY9uL3dzYmf2D2wWgIh-.md
│ │ │ │ │ ├── data-structures-and-algorithms@RAX2xN37taw9cqA3pnORh.md
│ │ │ │ │ ├── database-design-basics@zlAcgLKxGF_TyrcJIk4X7.md
│ │ │ │ │ ├── database-fundamentals@tnKUdsgp6bnFtQTexEmfy.md
│ │ │ │ │ ├── databases@Ujzn_dILCA7xoupnz398l.md
│ │ │ │ │ ├── dependency-injection@IejHMMVKwA0sIInla4FjX.md
│ │ │ │ │ ├── di-containers@iM760f8Ys66-VSkMiZfIX.md
│ │ │ │ │ ├── distributed-cache@SiG0FWWznjDg-2mIWlchy.md
│ │ │ │ │ ├── distributed-lock@T2FsSndxzSuKTFdjoyPi-.md
│ │ │ │ │ ├── docker@rmRESzLiZNWdBFXLrwQFJ.md
│ │ │ │ │ ├── dynamo-db@1Om9aQDZmnj_DN10ogwDL.md
│ │ │ │ │ ├── easynetq@X6iSHoHnFFMaGb6YPQFhl.md
│ │ │ │ │ ├── elastic-search@mK9OAwjReZoQZr1WSLRKJ.md
│ │ │ │ │ ├── entity-framework-2nd-level-cache@FV4GsPjUyAc99DnIwkkCC.md
│ │ │ │ │ ├── entity-framework-core@ET74_7ieahNaGdPT11_NI.md
│ │ │ │ │ ├── fakeiteasy@diRJ_F6kx42Ucs0fxidtZ.md
│ │ │ │ │ ├── filters-and-attributes@U3HXmNq6x2YA3BwZsOTbe.md
│ │ │ │ │ ├── fluentvalidation@sa0zXd8lpNs_SFQ2y-PY4.md
│ │ │ │ │ ├── fluid@ZaOhWWDgVxrn0hbesJ7xT.md
│ │ │ │ │ ├── framework-basics@eGVaAz3VhGu3cXBNxTAWd.md
│ │ │ │ │ ├── frameworks@1YL7aXluINOO15W3waaiD.md
│ │ │ │ │ ├── general-development-skills@NEnna_8DstfYH4T9qrP3-.md
│ │ │ │ │ ├── git---version-control@OtdCmkj0SvrGwCUSfm96C.md
│ │ │ │ │ ├── github-actions@0-PLMXGlRyRzTk-EjXMs2.md
│ │ │ │ │ ├── github-gitlab-bitbucket@KAZF-mIg-FlfMonfdOLhb.md
│ │ │ │ │ ├── gitlab-cicd@8Y73Ae32eo6_ye7dw5QRQ.md
│ │ │ │ │ ├── graphql-net@Efxu9gDodODMTKJbWcXzB.md
│ │ │ │ │ ├── graphql@BdTQ5ZMNDNZvkAUoCfL5H.md
│ │ │ │ │ ├── gridlify@w5RnrhsP4p-AdSOLYVAY9.md
│ │ │ │ │ ├── grpc@x3SJlLc19DNJ-PyDOOj_G.md
│ │ │ │ │ ├── hangfire@QiQsx1udyKcPJ-lZjRQVy.md
│ │ │ │ │ ├── hotchocolate@XMrQx9JH0eSQJpMzhvy0F.md
│ │ │ │ │ ├── http--https-protocol@YI3cAezupWNntFw4B6elY.md
│ │ │ │ │ ├── kafka@L8RkeMYm0WGNeLLcHKF1R.md
│ │ │ │ │ ├── kubernetes@02rtFStTeIm8prNskxaUN.md
│ │ │ │ │ ├── lazy-eager-explicit-loading@9AMotSwdEbB8uOg80SykE.md
│ │ │ │ │ ├── learn-the-basics-of-c@NvODRFR0DLINB0RlPSsvt.md
│ │ │ │ │ ├── life-cycles@Tjaczp2E-cCn0qSv89xgo.md
│ │ │ │ │ ├── light-bdd@aWRv5sU9dksgcpE9RGJb1.md
│ │ │ │ │ ├── litedb@3gcXaOnHL4v5OoStrTWNV.md
│ │ │ │ │ ├── log-frameworks@fQ3w8REYWzQfeJ0nPyq6W.md
│ │ │ │ │ ├── manual-mapping@oMMBzRrHkUymxAR4oqr75.md
│ │ │ │ │ ├── mapperly@x0OopRTwIvoWgT8qi0CE9.md
│ │ │ │ │ ├── mariadb@Gs8XcsTo11MeCsiSGpjkU.md
│ │ │ │ │ ├── marten@ipb6proIZKG-_vCOMAiBu.md
│ │ │ │ │ ├── mass-transit@SQKIUa_UsJ4cls-Vs9yHU.md
│ │ │ │ │ ├── mediatr@cc0UNQwbDlySue-CvpChR.md
│ │ │ │ │ ├── memcached@u2pc3ZkL0EumAsbM12D5y.md
│ │ │ │ │ ├── memory-cache@8CRsr7UZszjc_fZ-4ZmIx.md
│ │ │ │ │ ├── microservices@37c2eCvRdebztkbc5AjYp.md
│ │ │ │ │ ├── microsoftextensions@J9XdYLo7qJiBoL8p3c68P.md
│ │ │ │ │ ├── middlewares@dG--AAcZZdltYCeg6zCz2.md
│ │ │ │ │ ├── minimal-apis@ipABerBcM9zCte9pYaIse.md
│ │ │ │ │ ├── mongodb@-wYRa8qSuKVKo_yOTKV67.md
│ │ │ │ │ ├── moq@eyOXWb1kL80Wqiwc2WHd_.md
│ │ │ │ │ ├── mstest@236VJJjMvqHfSj-MHSDPV.md
│ │ │ │ │ ├── mvc@D3aQw0-pk3ycO-n10HBaA.md
│ │ │ │ │ ├── mysql@WsGwg4qdlu_vBsFEpmBvU.md
│ │ │ │ │ ├── native-background-service@uP1nqbmFmZL_wA2DoqP8C.md
│ │ │ │ │ ├── net-aspire@HqhqqiA5X00Xl1RnZgrNJ.md
│ │ │ │ │ ├── net-aspire@Ohc0xzI6qX4hOFVNfRj1F.md
│ │ │ │ │ ├── net-cli@6HJQ1Evgah0Pki04Z2hQt.md
│ │ │ │ │ ├── net-maui@olqSPUU3RoxhQ6exfMzeN.md
│ │ │ │ │ ├── net@3GGvuxdfuDwLpNX_gtjCK.md
│ │ │ │ │ ├── netmq@8d4f7_3VO03vy7YDWwPI9.md
│ │ │ │ │ ├── nhibernate@z24IJndpQYTl1PhiUI2mx.md
│ │ │ │ │ ├── nlog@ykF2bB_68AhCOzeQ_QSW1.md
│ │ │ │ │ ├── nosql@WUis4K9vduriYdVkKvM9r.md
│ │ │ │ │ ├── nservicebus@vf8W1FLhcb3awx4JBaY5r.md
│ │ │ │ │ ├── nsubstitute@iZCxinqlVefBk5-ICqt4v.md
│ │ │ │ │ ├── nuke@EsC1JwFOMOlQVelpmxISh.md
│ │ │ │ │ ├── nunit@qHYBlBCvCGUZGh6gyEI63.md
│ │ │ │ │ ├── object-mapping@9ECykIIvXlDblbFbRVcJS.md
│ │ │ │ │ ├── object-relational-mapping@POQPoN98eqOH2873ZI6Hm.md
│ │ │ │ │ ├── ocelot@2k-rGuhYTTAR9XN3aDAnW.md
│ │ │ │ │ ├── odata@YojZ5fpzw-5WgoqqkO6wl.md
│ │ │ │ │ ├── orleans@XKsLqDDco5OXKURCcWAmv.md
│ │ │ │ │ ├── playwright@AtyL0ij8FeJCBmqG2YvTO.md
│ │ │ │ │ ├── polly@gQhiEpvx__70N1WbEHGYJ.md
│ │ │ │ │ ├── postgresql@An9TLvo-I6NtC8wFU3bh4.md
│ │ │ │ │ ├── puppeteer@UCpoLiQJ4LeniI9x3uGcY.md
│ │ │ │ │ ├── quartz@zOWlPXIl4XPs_0pA8-yi5.md
│ │ │ │ │ ├── rabbitmq@KqvBn2_wvYhFdv0dBZMC9.md
│ │ │ │ │ ├── razor-components@vePinRjDfSGULKw0LE9K-.md
│ │ │ │ │ ├── razor-pages@qpVxwuyA2oE06MZLtEdP1.md
│ │ │ │ │ ├── razor@nUE2-egUMNFQoPVrVRFPl.md
│ │ │ │ │ ├── real-time-communication@9Vv3OxafB6BlHhi1ZkeVO.md
│ │ │ │ │ ├── redis@Ts0gJ4DdwFp48LGr4YSvM.md
│ │ │ │ │ ├── relational@FnRxRY3uDZdTve1w-nBfc.md
│ │ │ │ │ ├── repodb@tYDVcnG0oUF3R8DwASvAh.md
│ │ │ │ │ ├── respawn@TCswZHviRiu6SIOwUisu8.md
│ │ │ │ │ ├── rest@KJCtxH3mYsZq3hfBZ6cJF.md
│ │ │ │ │ ├── rest@dZ9fYWMBa1OemTmLOI8_q.md
│ │ │ │ │ ├── scalar@Zb4Gugxf7d6MoeEcfngrV.md
│ │ │ │ │ ├── scoped@M3BW_63MFQyD8NE68dazD.md
│ │ │ │ │ ├── scriban@dWB5OCvWVYkD30Op_dMwy.md
│ │ │ │ │ ├── scrutor@f212ztDU_kb7gO71Nn76L.md
│ │ │ │ │ ├── search-engines@6p5atMYw3b3bXkQuXZsDV.md
│ │ │ │ │ ├── serilog@xL0s4-HfRxNy2ru0jiIWR.md
│ │ │ │ │ ├── shouldly@zhn-VLGPfV6FZT2OMl6zf.md
│ │ │ │ │ ├── signalr-core@8dvd4M0TKNyQR8dEolGNT.md
│ │ │ │ │ ├── singleton@y9bDrCjkDbxSIrEEtu_Mi.md
│ │ │ │ │ ├── solr@2sY_p_8cOOBmZtDHO2Cmy.md
│ │ │ │ │ ├── specflow@9WZmjiFowydYrkHQ2xeNm.md
│ │ │ │ │ ├── sphinx@Ye9WHfwZa-Fc2YDaTCmU1.md
│ │ │ │ │ ├── sql-basics@aOJMVrTcA_I2y_QHzj7aM.md
│ │ │ │ │ ├── sql-server@HQHSzsqBGSVYNLQ9o5EI-.md
│ │ │ │ │ ├── steeltoe@s8evqe2MireS1UhxoXrd1.md
│ │ │ │ │ ├── stored-procedures@ZiK-c9zNbi5RZkKUi44wP.md
│ │ │ │ │ ├── stylecop-rules@R7Qk5hsEIl9dspQXdaJAJ.md
│ │ │ │ │ ├── task-scheduling@s57tKy1rajlJbKFDVXLqs.md
│ │ │ │ │ ├── template-engines@C85aJvrzj6rP2Hmfj9uPB.md
│ │ │ │ │ ├── test-containers@8eW5BaOjJbnQ7uk4zMOiU.md
│ │ │ │ │ ├── testing@XofWWhlU_vWCG5oXVMZze.md
│ │ │ │ │ ├── transient@-N0XM0-VtCZ6QMo2YyMD-.md
│ │ │ │ │ ├── triggers@2f_CJMnXwPxjMEwm5P_QJ.md
│ │ │ │ │ ├── web-sockets@tBl8neu3tJd5GPwGfJbjZ.md
│ │ │ │ │ ├── webapplicationfactory@Xx5G09n4WWnnydCgxnL0A.md
│ │ │ │ │ ├── xunit@R8C6s53RYjkRVma0nCJpy.md
│ │ │ │ │ └── yarp@2axfolu26P8XwxMxgMaS3.md
│ │ │ │ ├── faqs.astro
│ │ │ │ └── migration-mapping.json
│ │ │ ├── aws/
│ │ │ │ ├── aws.json
│ │ │ │ ├── aws.md
│ │ │ │ ├── content/
│ │ │ │ │ ├── amis@AfagmWcllSi81D2XIQz0V.md
│ │ │ │ │ ├── api-gateway@T0dvezPWX6rAiKweT0TkG.md
│ │ │ │ │ ├── assuming-roles@0IMdO7g_5El1elvDXJJ_0.md
│ │ │ │ │ ├── auto-scaling-groups@gBKHVG7FvlCEgINKmw00s.md
│ │ │ │ │ ├── auto-scaling@dOAZG-NbjWiVdPKYEhWxj.md
│ │ │ │ │ ├── aws-global-infrastructure@z9R1BWUGalmnw0E7QqiW6.md
│ │ │ │ │ ├── backup--restore@NWvasq-AcwxmOKZPDv3ue.md
│ │ │ │ │ ├── backup--restore@tBKc7tHOiJaTmwEl3q--Y.md
│ │ │ │ │ ├── bucket--object-lifecycle@8i6zpjkMC_Pg-tDNmrx4n.md
│ │ │ │ │ ├── buckets--objects@rTgjDj5HqbjRpcJ7PR-EC.md
│ │ │ │ │ ├── capacity-settings@KtXww9J0znwzTwL7GKfaY.md
│ │ │ │ │ ├── cidr-blocks@2hFBv2fhKDYBN-9ITs82J.md
│ │ │ │ │ ├── cloudfront@zFgnu2fL0EUKIMz9tVH1j.md
│ │ │ │ │ ├── cloudwatch@VAYxwJH10PFjGS8poKd9-.md
│ │ │ │ │ ├── clusters--ecs-container-agents@PphzNicIJawVElmY5rn8f.md
│ │ │ │ │ ├── cold-start-and-limitations@EuOv19jDSj56Cy7PqvtNv.md
│ │ │ │ │ ├── configuration-sets@4svXYQYmqjUZU39z8OyhD.md
│ │ │ │ │ ├── cpu-credits@_U2bKjxIrAAk7TMrPttpb.md
│ │ │ │ │ ├── creating--invoking-functions@SdCNevKjyhFcreMSWY6BT.md
│ │ │ │ │ ├── custom-runtimes@KWjIAakMIlxn_jso22h0M.md
│ │ │ │ │ ├── data-modeling@aU1lv80xXNkQTD41Qfln5.md
│ │ │ │ │ ├── db-instances@l9oq3LiEd8ZrPtupPk-Fn.md
│ │ │ │ │ ├── dedicated-ip@pnX1dfkjS8woWc4KGXlh_.md
│ │ │ │ │ ├── distributions@fAK7GRKunmoidlD32OBma.md
│ │ │ │ │ ├── dkim-setup@zwVd1vNm1ks6MdHZoi-5W.md
│ │ │ │ │ ├── dynamodb-local@yauCWo1VoG-X483-4mfdn.md
│ │ │ │ │ ├── dynamodb@wGb0TEDnSe_bmv9Krx4qB.md
│ │ │ │ │ ├── ec2@cL7vis8H5L2vv6LqJ5wvC.md
│ │ │ │ │ ├── ecr@_c_Wq84yIu4ac7e0RzDtC.md
│ │ │ │ │ ├── ecs@EqUT0wpdPRDGtGAZ7nneY.md
│ │ │ │ │ ├── eks@kvHzEDZQV72AUjqisg8PB.md
│ │ │ │ │ ├── elastic-ip@DCvkZSp25pjaimG0THLTu.md
│ │ │ │ │ ├── elastic-load-balancers@YAZPKMbmrxYNqF6alXMyL.md
│ │ │ │ │ ├── elasticache@9TcYdsdmvKWWHoyE6uNbC.md
│ │ │ │ │ ├── event-bridge--scheduled-execution@0CUfDEMwCwSHVdqkP8lOG.md
│ │ │ │ │ ├── events@tHQ6NRVDPCPEOmzgjQDLX.md
│ │ │ │ │ ├── fargate@OI8y54RhFpfS_l1L9VTZe.md
│ │ │ │ │ ├── feedback-handling@0NWTFssjg9SbDXQRkN5kF.md
│ │ │ │ │ ├── general-purpose@uo5HIyePegnJooortvWLu.md
│ │ │ │ │ ├── glacier@IikKYP58sT2H1lM8glm-g.md
│ │ │ │ │ ├── health-checks@LXG_znJ3XzPAlDxUH2-Xp.md
│ │ │ │ │ ├── hosted-zones@z-o-2cGYSM6KW_CNJyw3p.md
│ │ │ │ │ ├── iaas-vs-paas-vs-saas@i4ijY3T5gLgNz0XqRipXe.md
│ │ │ │ │ ├── iam@xmKeB4hEi2DunmhAsvS1X.md
│ │ │ │ │ ├── identity-based@cwGuOrmbSTcSoH80skLTk.md
│ │ │ │ │ ├── identity-verification@bTCVHXPG-LtaaFmgiB2SL.md
│ │ │ │ │ ├── instance-profiles@i7X1GfOx5AZYFskepW4Zr.md
│ │ │ │ │ ├── instance-types@VHD2ISW9WoSWjp8Hh6Zft.md
│ │ │ │ │ ├── internet-gateway@Le8yOJzpzxH1xgd7XEU2B.md
│ │ │ │ │ ├── introduction-to-aws@Dg1v9TV-wGSNLPfAals_y.md
│ │ │ │ │ ├── introduction@Py9nst2FDJ1_hoXeX_qSF.md
│ │ │ │ │ ├── invalidations@hRXbAADgRTXEFwbBXeNu7.md
│ │ │ │ │ ├── keypairs@wFT-fddGn__DRoqG0joFk.md
│ │ │ │ │ ├── lambda@741vsAPTXJLVUlazFg0q4.md
│ │ │ │ │ ├── lambdaedge@5SF5nO94NFDkHY8UJoeAY.md
│ │ │ │ │ ├── launch-config--autoscaling-groups@1r2FL3OEOh0S9ee0OVnrN.md
│ │ │ │ │ ├── launch-templates@K0GCk5_HDvP0_ZqsUc3tG.md
│ │ │ │ │ ├── layers@CL93C0NGFQmScVnftnRtO.md
│ │ │ │ │ ├── limits@0ctJa-V6aenimSr5h303J.md
│ │ │ │ │ ├── logs@oC6KIjWAXw0hLl4FwkB9F.md
│ │ │ │ │ ├── magnetic@y0CoNcEFHyz350f7pNddt.md
│ │ │ │ │ ├── metrics@2vQPmVNk1QpMM-15RKG8b.md
│ │ │ │ │ ├── nat-gateway@6D-gs32jrCyvMVhr9PSAY.md
│ │ │ │ │ ├── policies@dO9ZfUyNia7L_fCh4d0n7.md
│ │ │ │ │ ├── policies@eQAn3e-k9WNufPqOnwY_K.md
│ │ │ │ │ ├── primary-keys--secondary-indexes@oWtWgaFznTPJhQIyfIIQf.md
│ │ │ │ │ ├── private-subnet@ymuURDwW8JG3NSIXcl0FL.md
│ │ │ │ │ ├── provisioned-iops@3l1ji4JToj277vpgONmLw.md
│ │ │ │ │ ├── public-subnet@ABCH1rATHmecyWHyK3n-m.md
│ │ │ │ │ ├── public-vs-private-vs-hybrid-cloud@3hatcMVLDbMuz73uTx-9P.md
│ │ │ │ │ ├── purchasing-options@8v9T6Y6JC7qaqIgkbT-nr.md
│ │ │ │ │ ├── quotas@PYgs4niQRlLKCBMfM4qf9.md
│ │ │ │ │ ├── rds@fkMF-2PQZ00UdwxhQt1ds.md
│ │ │ │ │ ├── resource-based@v_YmmlOk-DkzJ8mI5Ftgr.md
│ │ │ │ │ ├── roles@7nI202hX41mI5ms9LZonh.md
│ │ │ │ │ ├── route-tables@FCdOnwQubhOnCFFnF8uJN.md
│ │ │ │ │ ├── route53@f89qL7Cg9R_LTxBEG4jUK.md
│ │ │ │ │ ├── routing-policies@IQhPG1La7dZeSXnX23D1n.md
│ │ │ │ │ ├── s3-ia@JlkLNQ8wRzGkjaootNKOD.md
│ │ │ │ │ ├── s3@PN3xAYfQ-_QgZCRCnsEca.md
│ │ │ │ │ ├── sandbox--sending-limits@kG7tlZjv_hJbHGooBkxS0.md
│ │ │ │ │ ├── scaling-policies@fRBaiw8Qx8kapzCphmM4v.md
│ │ │ │ │ ├── security-groups@Cd9gdbkCFdrTLrnJMy5F3.md
│ │ │ │ │ ├── sender-reputation@Vo_PBfB7LxYL27nBBVoVp.md
│ │ │ │ │ ├── services@zSiSbIdBgFLBBAnp4I9vX.md
│ │ │ │ │ ├── ses@-bwXo6xvF1yzyWEm5oZhJ.md
│ │ │ │ │ ├── shared-responsibility-model@0flGtxZmxQKxO3c3sguwp.md
│ │ │ │ │ ├── standard@Ll5FPCtkpYq_niJd7WoTC.md
│ │ │ │ │ ├── storage--volumes@A0u7CJwj5ULAMiAm12vZI.md
│ │ │ │ │ ├── storage-types@PJaAqax4fABnkObY5UwNp.md
│ │ │ │ │ ├── storage-types@Xs057ESpvxXg2r_rDQnOa.md
│ │ │ │ │ ├── streams@0C3GCGdSXozJK2MNeWerg.md
│ │ │ │ │ ├── subnets@Y64TE0U20kllmykjdfhHp.md
│ │ │ │ │ ├── tables--items--attributes@DN_iuLo9gYDqU8JleE1WJ.md
│ │ │ │ │ ├── tasks@1lHXxpoF11yE3rfoQCbTG.md
│ │ │ │ │ ├── user-data-scripts@ZKjjgXZ89zV2atWcSal-s.md
│ │ │ │ │ ├── users--user-groups@Nn2zawk6A31NwZa40jOhX.md
│ │ │ │ │ ├── versioning--aliases@75ZjuGozDfoZPLj32P2t2.md
│ │ │ │ │ ├── vpc@Sv2aT8eI1RvJhvoKVYQEX.md
│ │ │ │ │ ├── well-architected-framework@eKuC7VmkGVYFnbC2Rvn8D.md
│ │ │ │ │ └── what-is-cloud-computing@74JxgfJ_1qmVNZ_QRp9Ne.md
│ │ │ │ ├── faqs.astro
│ │ │ │ └── migration-mapping.json
│ │ │ ├── backend/
│ │ │ │ ├── backend-beginner.json
│ │ │ │ ├── backend.json
│ │ │ │ ├── backend.md
│ │ │ │ ├── content/
│ │ │ │ │ ├── acid@qSAdfaGUfn8mtmDjHJi3z.md
│ │ │ │ │ ├── agents@w1D3-bSg93ndKK9XJTu7z.md
│ │ │ │ │ ├── ai-assisted-coding@fA3yi9puMbTFmbPpo6OjN.md
│ │ │ │ │ ├── ai-vs-traditional-coding@IZKl6PxbvgNkryAkdy3-p.md
│ │ │ │ │ ├── ai-vs-traditional-techniques@IZKl6PxbvgNkryAkdy3-p.md
│ │ │ │ │ ├── anthropic@Lw2nR7x8PYgq1P5CxPAxi.md
│ │ │ │ │ ├── antigravity@E7-LveK7jO2npxVTLUDfw.md
│ │ │ │ │ ├── apache@jjjonHTHHo-NiAf6p9xPv.md
│ │ │ │ │ ├── applications@Nx7mjvYgqLpmJ0_iSx5of.md
│ │ │ │ │ ├── architectural-patterns@tHiUpG9LN35E5RaHddMv5.md
│ │ │ │ │ ├── authentication@PY9G7KQy8bF6eIdr1ydHf.md
│ │ │ │ │ ├── aws-neptune@5xy66yQrz1P1w7n6PcAFq.md
│ │ │ │ │ ├── backpressure@JansCqGDyXecQkD1K7E7e.md
│ │ │ │ │ ├── base@QZwTLOvjUTaSb_9deuxsR.md
│ │ │ │ │ ├── basic-authentication@yRiJgjjv2s1uV9vgo3n8m.md
│ │ │ │ │ ├── bcrypt@dlG1bVkDmjI3PEGpkm1xH.md
│ │ │ │ │ ├── bitbucket@Ry_5Y-BK7HrkIc6X0JG1m.md
│ │ │ │ │ ├── browsers-and-how-they-work@P82WFaTPgQEPNp5IIuZ1Y.md
│ │ │ │ │ ├── building-for-scale@SHmbcMRsc3SygEDksJQBD.md
│ │ │ │ │ ├── c@rImbMHLLfJwjf3l25vBkc.md
│ │ │ │ │ ├── caching@ELj8af7Mi38kUbaPJfCUR.md
│ │ │ │ │ ├── caching@uPjCrDGA2MHylWXbZvMBM.md
│ │ │ │ │ ├── caddy@Op-PSPNoyj6Ss9CS09AXh.md
│ │ │ │ │ ├── cap-theorem@LAdKDJ4LcMaDWqslMvE8X.md
│ │ │ │ │ ├── cassandra@gT6-z2vhdIQDzmR2K1g1U.md
│ │ │ │ │ ├── cassandra@zsiZLWJ2bMvrjuHch5fX_.md
│ │ │ │ │ ├── cdn@Nq2BO53bHJdFT1rGZPjYx.md
│ │ │ │ │ ├── ci--cd@mGfD7HfuP184lFkXZzGjG.md
│ │ │ │ │ ├── circuit-breaker@spkiQTPvXY4qrhhVUkoPV.md
│ │ │ │ │ ├── claude-code@RcC1fVuePQZ59AsJfeTdR.md
│ │ │ │ │ ├── clickhouse@ZyGLSvx17p7QmYDy1LFbM.md
│ │ │ │ │ ├── client-side@KWTbEVX_WxS8jmSaAX3Fe.md
│ │ │ │ │ ├── code-reviews@0TMdly8yiqnNR8sx36iqc.md
│ │ │ │ │ ├── containerization-vs-virtualization@SGVwJme-jT_pbOTvems0v.md
│ │ │ │ │ ├── cookie-based-auth@ffzsh8_5yRq85trFt9Xhk.md
│ │ │ │ │ ├── copilot@HQrxxDxKN8gizvXRU5psW.md
│ │ │ │ │ ├── cors@LU6WUbkWKbPM1rb2_gEqa.md
│ │ │ │ │ ├── couchdb@qOlNzZ7U8LhIGukb67n7U.md
│ │ │ │ │ ├── cqrs@u8IRw5PuXGUcmxA0YYXgx.md
│ │ │ │ │ ├── csp@HgQBde1zLUFtlwB66PR6_.md
│ │ │ │ │ ├── css@utA1W2O6pzoV_LbtDE5DN.md
│ │ │ │ │ ├── cursor@CKlkVK_7GZ7xzIUHJqZr8.md
│ │ │ │ │ ├── data-replication@wrl7HHWXOaxoKVlNZxZ6d.md
│ │ │ │ │ ├── database-indexes@y-xkHFE9YzhNIX3EiWspL.md
│ │ │ │ │ ├── design-and-development-principles@9Fpoor-Os_9lvrwu5Zjh-.md
│ │ │ │ │ ├── dgraph@GKrcTsUi5XWj_pP1TOK0S.md
│ │ │ │ │ ├── dns-and-how-it-works@hkxw9jPGYphmjhTjw8766.md
│ │ │ │ │ ├── documentation-generation@q7NpwqQXUp4wt2to-yFiP.md
│ │ │ │ │ ├── domain-driven-design@BvHi5obg0L1JDZFKBzx9t.md
│ │ │ │ │ ├── dynamodb@dwfEHInbX2eFiafM-nRMX.md
│ │ │ │ │ ├── elasticsearch@NulaE1isWqn-feYHg4YQT.md
│ │ │ │ │ ├── embeddings@Ofv__kXuBk-Vv2jVhaFss.md
│ │ │ │ │ ├── event-sourcing@wqE-mkxvehOzOv8UyE39p.md
│ │ │ │ │ ├── failure-modes@GwApfL4Yx-b5Y8dB9Vy__.md
│ │ │ │ │ ├── firebase@RyJFLLGieJ8Xjt-DlIayM.md
│ │ │ │ │ ├── frontend-basics@oyg5g4-cY5EBEUgVkjnL3.md
│ │ │ │ │ ├── function-calling@Uve-UObgOBfrd-cLayVWe.md
│ │ │ │ │ ├── functional-testing@NAGisfq2CgeK3SsuRjnMw.md
│ │ │ │ │ ├── gemini@Bic4PHhz-YqzPWRimJO83.md
│ │ │ │ │ ├── git@_I1E__wCIVrhjMk6IMieE.md
│ │ │ │ │ ├── github@ptD8EVqwFUYr4W5A_tABY.md
│ │ │ │ │ ├── gitlab@Wcp-VDdFHipwa7hNAp1z_.md
│ │ │ │ │ ├── go@BdXbcz4-ar3XOX0wIKzBp.md
│ │ │ │ │ ├── gof-design-patterns@6XIWO0MoE-ySl4qh_ihXa.md
│ │ │ │ │ ├── graceful-degradation@G9AI_i3MkUE1BsO3_-PH7.md
│ │ │ │ │ ├── graphql@zp3bq38tMnutT2N0tktOW.md
│ │ │ │ │ ├── grpc@J-TOE2lT4At1mSdNoxPS1.md
│ │ │ │ │ ├── hateoas@dLY0KafPstajCcSbslC4M.md
│ │ │ │ │ ├── how-does-the-internet-work@yCnn-NfSxIybUQ2iTuUGq.md
│ │ │ │ │ ├── how-llms-work@tUNP5VRKvrPcufPDPPEo8.md
│ │ │ │ │ ├── html@9-pCsW650T1mfj5dmRB9L.md
│ │ │ │ │ ├── http-caching@KWTbEVX_WxS8jmSaAX3Fe.md
│ │ │ │ │ ├── https@x-WBJjBd8u93ym5gtxGsR.md
│ │ │ │ │ ├── influx-db@XbM4TDImSH-56NsITjyHK.md
│ │ │ │ │ ├── instrumentation@4X-sbqpP0NDhM99bKdqIa.md
│ │ │ │ │ ├── integration-patterns@iatQ3RCxESHt1CwN3PSfx.md
│ │ │ │ │ ├── integration-testing@381Kw1IMRv7CJp-Uf--qd.md
│ │ │ │ │ ├── internet@SiYUdtYMDImRPmV2_XPkH.md
│ │ │ │ │ ├── introduction@SiYUdtYMDImRPmV2_XPkH.md
│ │ │ │ │ ├── java@ANeSwxJDJyQ-49pO2-CCI.md
│ │ │ │ │ ├── javascript@8-lO-v6jCYYoklEJXULxN.md
│ │ │ │ │ ├── javascript@An2lMuJEkkpL0cfw4RrSl.md
│ │ │ │ │ ├── json-apis@sNceS4MpSIjRkWhNDmrFg.md
│ │ │ │ │ ├── jwt@UxS_mzVUjLigEwKrXnEeB.md
│ │ │ │ │ ├── kafka@VoYSis1F1ZfTxMlQlXQKB.md
│ │ │ │ │ ├── learn-about-apis@EwvLPSI6AlZ4TnNIJTZA4.md
│ │ │ │ │ ├── learn-about-web-servers@fekyMpEnaGqjh1Cu4Nyc4.md
│ │ │ │ │ ├── learn-the-basics@UTupdqjOyLh7-56_0SXJ8.md
│ │ │ │ │ ├── loadshifting@HoQdX7a4SnkFRU4RPQ-D5.md
│ │ │ │ │ ├── long--short-polling@osvajAJlwGI3XnX0fE-kA.md
│ │ │ │ │ ├── long-polling@osvajAJlwGI3XnX0fE-kA.md
│ │ │ │ │ ├── lxc@31ZlpfIPr9-5vYZqvjUeL.md
│ │ │ │ │ ├── mariadb@tD3i-8gBpMKCHB-ITyDiU.md
│ │ │ │ │ ├── mcp@mHnI19RgZ57XDEIDaHxD0.md
│ │ │ │ │ ├── md5@jWwA6yX4Zjx-r_KpDaD3c.md
│ │ │ │ │ ├── memcached@xPvVwGQw28uMeLYIWn8yn.md
│ │ │ │ │ ├── message-brokers@nJ5FpFgGCRaALcWmAKBKT.md
│ │ │ │ │ ├── microservices@K55h3aqOGe6-hgVhiFisT.md
│ │ │ │ │ ├── migration-strategies@f7iWBkC0X7yyCoP_YubVd.md
│ │ │ │ │ ├── migrations@MOLAXgs0CMCT7o84L0EaK.md
│ │ │ │ │ ├── migrations@MOLAXgs0CMCT7o84L0EaK.md.md
│ │ │ │ │ ├── mongodb@28U6q_X-NTYf7OSKHjoWH.md
│ │ │ │ │ ├── monitoring@QvMEEsXh0-rzn5hDGcmEv.md
│ │ │ │ │ ├── monolith@Ke522R-4k6TDeiDRyZbbU.md
│ │ │ │ │ ├── monolithic-apps@Ke522R-4k6TDeiDRyZbbU.md
│ │ │ │ │ ├── more-about-databases@LJt27onEOeIBomiEMTyKd.md
│ │ │ │ │ ├── ms-iis@0NJDgfe6eMa7qPUOI6Eya.md
│ │ │ │ │ ├── ms-sql@dEsTje8kfHwWjCI3zcgLC.md
│ │ │ │ │ ├── mysql@VPxOdjJtKAqmM5V0LR5OC.md
│ │ │ │ │ ├── n1-problem@bQnOAu863hsHdyNMNyJop.md
│ │ │ │ │ ├── neo4j@BTNJfWemFKEeNeTyENXui.md
│ │ │ │ │ ├── nginx@z5AdThp9ByulmM9uekgm-.md
│ │ │ │ │ ├── normalization@Ge2SnKBrQQrU-oGLz6TmT.md
│ │ │ │ │ ├── nosql-databases@F8frGuv1dunOdcVJ_IiGs.md
│ │ │ │ │ ├── oauth@vp-muizdICcmU0gN8zmkS.md
│ │ │ │ │ ├── observability@Z01E67D6KjrShvQCHjGR7.md
│ │ │ │ │ ├── open-api-specs@9cD5ag1L0GqHx4_zxc5JX.md
│ │ │ │ │ ├── openai@-ye5ZtYFDoYGpj-UJaBP8.md
│ │ │ │ │ ├── openid@z3EJBpgGm0_Uj3ymhypbX.md
│ │ │ │ │ ├── oracle@h1SAjQltHtztSt8QmRgab.md
│ │ │ │ │ ├── orms@Z7jp_Juj5PffSxV7UZcBb.md
│ │ │ │ │ ├── owasp-risks@AAgciyxuDvS2B_c6FRMvT.md
│ │ │ │ │ ├── php@l9Wrq_Ad9-Ju4NIB0m5Ha.md
│ │ │ │ │ ├── pick-a-backend-language@2f0ZO6GJElfZ2Eis28Hzg.md
│ │ │ │ │ ├── pick-a-language@2f0ZO6GJElfZ2Eis28Hzg.md
│ │ │ │ │ ├── postgresql@FihTrMO56kj9jT8O_pO2T.md
│ │ │ │ │ ├── profiling-perfor@SYXJhanu0lFmGj2m2XXhS.md
│ │ │ │ │ ├── profiling-performance@SYXJhanu0lFmGj2m2XXhS.md
│ │ │ │ │ ├── prompting-techniques@xL8d-uHMpJKwUvT8z-Jia.md
│ │ │ │ │ ├── python@J_sVHsD72Yzyqb9KCIvAY.md
│ │ │ │ │ ├── rabbitmq@GPFRMcY1DEtRgnaZwJ3vW.md
│ │ │ │ │ ├── rags@6PCOCzCbx7jo9wO2Hl2gy.md
│ │ │ │ │ ├── real-time-data@5XGvep2qoti31bsyqNzrU.md
│ │ │ │ │ ├── redis@M0iaSSdVPWaCUpyTG50Vf.md
│ │ │ │ │ ├── redis@g8GjkJAhvnSxXTZks0V1g.md
│ │ │ │ │ ├── refactoring@EYT2rTLZ8tUW2u8DOnAWF.md
│ │ │ │ │ ├── relational-databases@r45b461NxLN6wBODJ5CNP.md
│ │ │ │ │ ├── repo-hosting-services@NvUcSDWBhzJZ31nzT4UlE.md
│ │ │ │ │ ├── rest@lfNFDZZNdrB0lbEaMtU71.md
│ │ │ │ │ ├── rethinkdb@5T0ljwlHL0545ICCeehcQ.md
│ │ │ │ │ ├── ruby@SlH0Rl07yURDko2nDPfFy.md
│ │ │ │ │ ├── rust@CWwh2abwqx4hAxpAGvhIx.md
│ │ │ │ │ ├── saml@UCHtaePVxS-0kpqlYxbfC.md
│ │ │ │ │ ├── scaling-databases@95d9itpUZ4s9roZN8kG9x.md
│ │ │ │ │ ├── scrypt@kGTALrvCpxyVCXHRmkI7s.md
│ │ │ │ │ ├── scylladb@aArZ3gKwObzafCkTOd-Hj.md
│ │ │ │ │ ├── search-engines@gKTSe9yQFVbPVlLzWB0hC.md
│ │ │ │ │ ├── server-security@TZ0BWOENPv6pQm8qYB8Ow.md
│ │ │ │ │ ├── server-sent-events@RUSdlokJUcEYbCvq5FJBJ.md
│ │ │ │ │ ├── server-side@z1-eP4sV75GBEIdM4NvL9.md
│ │ │ │ │ ├── serverless@nkmIv3dNwre4yrULMgTh3.md
│ │ │ │ │ ├── service-mesh@n14b7sfTOwsjKTpFC9EZ2.md
│ │ │ │ │ ├── sha@JVN38r5jENoteia3YeIQ3.md
│ │ │ │ │ ├── sharding-strategies@zWstl08R4uzqve4BdYurp.md
│ │ │ │ │ ├── short-polling@Tt7yr-ChHncJG0Ge1f0Xk.md
│ │ │ │ │ ├── skills@IWubGe3oquSj882QVnhLU.md
│ │ │ │ │ ├── soa@tObmzWpjsJtK4GWhx6pwB.md
│ │ │ │ │ ├── soap@sSNf93azjuyMzQqIHE0Rh.md
│ │ │ │ │ ├── solr@iN_1EuIwCx_7lRBw1Io4U.md
│ │ │ │ │ ├── sqlite@kdulE3Z_BdbtRmq6T2KmR.md
│ │ │ │ │ ├── ssltls@0v3OsaghJEGHeXX0c5kqn.md
│ │ │ │ │ ├── streaming@9f-aWi3_7USy4XpNzrTL6.md
│ │ │ │ │ ├── structured-outputs@GMxPmyatxYmIPRFHfRAnr.md
│ │ │ │ │ ├── telemetry@neVRtPjIHP_VG7lHwfah0.md
│ │ │ │ │ ├── test-driven-development@I-PUAE2AzbEaUkW9vMaUM.md
│ │ │ │ │ ├── testing@STQQbPa7PE3gbjMdL6P-t.md
│ │ │ │ │ ├── throttling@qAu-Y4KI2Z_y-EqiG86cR.md
│ │ │ │ │ ├── timescale@WiAK70I0z-_bzbWNwiHUd.md
│ │ │ │ │ ├── timescaledb@WiAK70I0z-_bzbWNwiHUd.md
│ │ │ │ │ ├── token-authentication@0rGj7FThLJZouSQUhnqGW.md
│ │ │ │ │ ├── transactions@rq_y_OBMD9AH_4aoecvAi.md
│ │ │ │ │ ├── twelve-factor-apps@8DmabQJXlrT__COZrDVTV.md
│ │ │ │ │ ├── types-of-scaling@osQlGGy38xMcKLtgZtWaZ.md
│ │ │ │ │ ├── unit-testing@3OYm6b9f6WOrKi4KTOZYK.md
│ │ │ │ │ ├── vectors@yKNdBbahm_h81xdMDT-qx.md
│ │ │ │ │ ├── version-control-systems@ezdqQW9wTUw93F6kjOzku.md
│ │ │ │ │ ├── web-security@RBrIP5KbVQ2F0ly7kMfTo.md
│ │ │ │ │ ├── web-servers@fekyMpEnaGqjh1Cu4Nyc4.md
│ │ │ │ │ ├── websockets@sVuIdAe08IWJVqAt4z-ag.md
│ │ │ │ │ ├── what-is-domain-name@ZhSuu2VArnzPDp6dPQQSC.md
│ │ │ │ │ ├── what-is-hosting@aqMaEY8gkKMikiqleV5EP.md
│ │ │ │ │ └── what-is-http@R12sArWVpbIs_PHxBqVaR.md
│ │ │ │ ├── faqs.astro
│ │ │ │ └── migration-mapping.json
│ │ │ ├── backend-beginner/
│ │ │ │ └── content/
│ │ │ │ ├── acid@qSAdfaGUfn8mtmDjHJi3z.md
│ │ │ │ ├── authentication@PY9G7KQy8bF6eIdr1ydHf.md
│ │ │ │ ├── caching@ELj8af7Mi38kUbaPJfCUR.md
│ │ │ │ ├── functional-testing@NAGisfq2CgeK3SsuRjnMw.md
│ │ │ │ ├── git@_I1E__wCIVrhjMk6IMieE.md
│ │ │ │ ├── github@ptD8EVqwFUYr4W5A_tABY.md
│ │ │ │ ├── go@BdXbcz4-ar3XOX0wIKzBp.md
│ │ │ │ ├── index.md
│ │ │ │ ├── integration-testing@381Kw1IMRv7CJp-Uf--qd.md
│ │ │ │ ├── javascript@8-lO-v6jCYYoklEJXULxN.md
│ │ │ │ ├── json-apis@sNceS4MpSIjRkWhNDmrFg.md
│ │ │ │ ├── jwt@UxS_mzVUjLigEwKrXnEeB.md
│ │ │ │ ├── learn-about-apis@EwvLPSI6AlZ4TnNIJTZA4.md
│ │ │ │ ├── more-about-databases@LJt27onEOeIBomiEMTyKd.md
│ │ │ │ ├── n1-problem@bQnOAu863hsHdyNMNyJop.md
│ │ │ │ ├── orms@Z7jp_Juj5PffSxV7UZcBb.md
│ │ │ │ ├── pick-a-language@2f0ZO6GJElfZ2Eis28Hzg.md
│ │ │ │ ├── postgresql@FihTrMO56kj9jT8O_pO2T.md
│ │ │ │ ├── python@J_sVHsD72Yzyqb9KCIvAY.md
│ │ │ │ ├── redis@g8GjkJAhvnSxXTZks0V1g.md
│ │ │ │ ├── relational-databases@r45b461NxLN6wBODJ5CNP.md
│ │ │ │ ├── repo-hosting-services@NvUcSDWBhzJZ31nzT4UlE.md
│ │ │ │ ├── rest@lfNFDZZNdrB0lbEaMtU71.md
│ │ │ │ ├── testing@STQQbPa7PE3gbjMdL6P-t.md
│ │ │ │ ├── transactions@rq_y_OBMD9AH_4aoecvAi.md
│ │ │ │ ├── unit-testing@3OYm6b9f6WOrKi4KTOZYK.md
│ │ │ │ └── version-control-systems@ezdqQW9wTUw93F6kjOzku.md
│ │ │ ├── bi-analyst/
│ │ │ │ ├── bi-analyst.json
│ │ │ │ ├── bi-analyst.md
│ │ │ │ ├── content/
│ │ │ │ │ ├── ab-testing@qKlo90-Cy8t_off5Qv8-6.md
│ │ │ │ │ ├── accesibility@BiyrAHB34evej_0cnDzOa.md
│ │ │ │ │ ├── accessibility@wtEzdO_ZNu9jHJrFS3CrG.md
│ │ │ │ │ ├── accuracy@M1H3Fh09v8udCJIPSJPic.md
│ │ │ │ │ ├── advanced-queries@-gbb16Wl--Rjx5aoM0krL.md
│ │ │ │ │ ├── airflow@qnUHw2f2VmTPU3-NMnoLl.md
│ │ │ │ │ ├── algorithmic-bias@_uLtsnyNNNRcz5A29Zpjl.md
│ │ │ │ │ ├── analog-vs-digital-data@kb216tShKrRPWv7mE9sVa.md
│ │ │ │ │ ├── apis@xQDGmVwUkrmGdviOdG8Hu.md
│ │ │ │ │ ├── barplot@BUizLtQ7vpdyBRjS8KyIl.md
│ │ │ │ │ ├── basic-machine-learning@ZGazuCNruu09bd7C-aSFC.md
│ │ │ │ │ ├── basic-queries@TuBJ2yUz1c5KMRGVHdvU5.md
│ │ │ │ │ ├── beyond-linear-regression@_QyIZ2_vH3e3yic5NTuak.md
│ │ │ │ │ ├── bi-analyst-vs-other-roles@JFNCITtE1YtcYmLfGfF5T.md
│ │ │ │ │ ├── bi-communities@X8U-NQD0rYqFr_xgDWL2s.md
│ │ │ │ │ ├── bi-competitions@aTGsJj7Ntv5BWIzjaqvu_.md
│ │ │ │ │ ├── bi-platforms@kpRqKLtAd3IO3nbs8Yxrh.md
│ │ │ │ │ ├── bias-recognition@9aNVqEyygNGeicdce5X8b.md
│ │ │ │ │ ├── building-your-portfolio@UIdwl_KLELI8xL2VxYJmX.md
│ │ │ │ │ ├── business-acumen@OmhvVSTtzH5sxOIZRVYfQ.md
│ │ │ │ │ ├── calculated-fields--measures@fFzCnLfZ_vSbhQjdAKLlJ.md
│ │ │ │ │ ├── categorical-vs-numerical@yXz6MkU3-HnlkmRmYh-Ev.md
│ │ │ │ │ ├── ccpa@IwnXDA-f3FHK4EEeFuToC.md
│ │ │ │ │ ├── central-tendency@F-fC2JWOuEeDbOHH1O6EB.md
│ │ │ │ │ ├── certifications@hqpFbDhAvyT9_4hcoSLhC.md
│ │ │ │ │ ├── change-management@vDQF2oaybSewNu3EMs6zG.md
│ │ │ │ │ ├── chart-categories@GVgfPajmSqIgFZ6u2I1tK.md
│ │ │ │ │ ├── cloud-bi-ecosystem@zGU6DyEm6xEYf1_73cbjL.md
│ │ │ │ │ ├── cloud-computing-basics@_KYKLd-RNhVy-Sn1A-G5j.md
│ │ │ │ │ ├── cloud-data-warehouses@D94743lQ1fAerVSpJWXfP.md
│ │ │ │ │ ├── cloud@WXk0-vebMUQC25he2lmbh.md
│ │ │ │ │ ├── clv@OqHNW0PzIRsw7IBgh5U5Q.md
│ │ │ │ │ ├── coherence@4U66ZrBZqg7-ckOTmxAQj.md
│ │ │ │ │ ├── cohort-analysis@R2zg0Ql-RsnIkV5Gmc1vN.md
│ │ │ │ │ ├── color-theory@SJGEkoTSPK2ck4IvaK6Gz.md
│ │ │ │ │ ├── communication--storytelling@TBcLXYtKs7_j_h_m2pAyh.md
│ │ │ │ │ ├── compliance-reporting@j-GXKpMnsVuUUUdRxAXLe.md
│ │ │ │ │ ├── compliance-reporting@omvGuhou7_63k-Fwcc7Mu.md
│ │ │ │ │ ├── conferences--webinars@UDF8wyYT8127wfFHcq37P.md
│ │ │ │ │ ├── confidence-intervals@xgP3zIiSEr9dtYcCQikPb.md
│ │ │ │ │ ├── correlation-analysis@ASHk2LOjlhwpwpWSRs_Bi.md
│ │ │ │ │ ├── correlation-vs-causation@JXYmXAYuA-zxrkl4PRLQd.md
│ │ │ │ │ ├── critical-thinking@NFKiPXrkjRre1yUZc27gl.md
│ │ │ │ │ ├── csv@LcLfC6BiOxJAkk2p424wL.md
│ │ │ │ │ ├── dashboard-design@KXhNou5nlekbSTfLYPs_8.md
│ │ │ │ │ ├── dashboard-design@qvPTiDbsY5ol_K-BNLmzk.md
│ │ │ │ │ ├── data-architectures@Zxuvc9F3bINLTdfbsx_S_.md
│ │ │ │ │ ├── data-cleaning@Vo7LJ_W-DBvxvVrnz33BM.md
│ │ │ │ │ ├── data-formats@GsZWvJPNzN6XLDp2G1db4.md
│ │ │ │ │ ├── data-lake@iqpVtvoebAaoB_Dj9-gdw.md
│ │ │ │ │ ├── data-lineage@F21ypKzpziLCXkiKG1S5Z.md
│ │ │ │ │ ├── data-mart@5x4NfuP6dAgjISlB-esIW.md
│ │ │ │ │ ├── data-modeling-for-bi@Dk31XtS7wWRzO31sdsEDo.md
│ │ │ │ │ ├── data-pipeline-design@yvSf7sGEd7QiaVoetalHc.md
│ │ │ │ │ ├── data-quality@bGCMAgaenZ0t3WeO5joyP.md
│ │ │ │ │ ├── data-sources@VUgxDDkoxkOcLxqpTDXzt.md
│ │ │ │ │ ├── data-transformation-techniques@hrkMVMYWCedRxhNd2N9wE.md
│ │ │ │ │ ├── data-warehouse@wJiKBbTMLhIzelUtKn7jl.md
│ │ │ │ │ ├── databases@g44bQY90HOeI_dZ8gK2Uj.md
│ │ │ │ │ ├── dbt@-KzusmyDQ1NgqOADpqmEX.md
│ │ │ │ │ ├── descriptive-analysis@vTW3jSZ1bvc0OrP_bl22t.md
│ │ │ │ │ ├── descriptive-statistics@xc1hm_XTyiMUVtWiTKXWG.md
│ │ │ │ │ ├── design-principles@EDQjtoTd01ftwXxYkV9it.md
│ │ │ │ │ ├── diagnostic-analysis@m5aC9aNy9mwLXz0xXBp40.md
│ │ │ │ │ ├── discrete-vs-continuous@YSxvg2HrfGoGtpkwY0kGc.md
│ │ │ │ │ ├── dispersion@1D98k1HNCaaiaI20euVwA.md
│ │ │ │ │ ├── distribution@JSqwWsfojjZTe8ynmA7fc.md
│ │ │ │ │ ├── dplyr@ZAhjB_ghHukD4RPAtNDxh.md
│ │ │ │ │ ├── duplicates@xjgqmJmetKpWXSWZHPwaL.md
│ │ │ │ │ ├── end-to-end-analytics-project@3xDVJwdl3uu5EcjlZ1ytA.md
│ │ │ │ │ ├── ethical-data-use@Vb06K0D2vWAlSe95QJrth.md
│ │ │ │ │ ├── etl-basics@Du4GD-6pxbWYl4uSJRnOE.md
│ │ │ │ │ ├── etl-tools@lAK9QVs97hL3ysjz2blp8.md
│ │ │ │ │ ├── excel@9BWyA0b4WrmQetSMph_mY.md
│ │ │ │ │ ├── excel@Dh62zxyyUHh0galD472p8.md
│ │ │ │ │ ├── excel@LLK3_hudKDX5d-fd98vlx.md
│ │ │ │ │ ├── exploratory-data-analysis-eda@ETT9eATuyLHQe2jPqaF5I.md
│ │ │ │ │ ├── fact-vs-dimension-tables@hcbS18cpVxd55hVlUeLLT.md
│ │ │ │ │ ├── finance@cxTriSZvrmXP4axKynIZW.md
│ │ │ │ │ ├── finance@xftv5BiyoVrFjpSN0tjsw.md
│ │ │ │ │ ├── financial-performance@1T2PyytlmndHreWgueD55.md
│ │ │ │ │ ├── forecasting@ExHCSUDxDBwsJtTelvxjP.md
│ │ │ │ │ ├── fraud-detection@aJLGan5dkMefvkspFlcYo.md
│ │ │ │ │ ├── gdpr@CWf_vL78f8-mSUQbPnU8e.md
│ │ │ │ │ ├── healthcare@VpGVezYr9O6puhAF12PN2.md
│ │ │ │ │ ├── heatmap@SNkYi2VZsCRG31v63v8_x.md
│ │ │ │ │ ├── histogram@wqLcUFVsLa_l9yQIee9MG.md
│ │ │ │ │ ├── hospital-efficiency@ku3m0ZmNg23F0Z5CEb4JI.md
│ │ │ │ │ ├── hr@KeGCHoJRHp-mBX-P5to4Y.md
│ │ │ │ │ ├── hypothesis-testing@6xfQic8dMwUsMQa7VtS8_.md
│ │ │ │ │ ├── inferential-statistics@7DNtRMBZ_F0K1FQk-UCM4.md
│ │ │ │ │ ├── interpretability@uP8MWZqM9Z0i3eDF4Ldxv.md
│ │ │ │ │ ├── interview-preparation@4XM5ikPiHVehEtT4AB-Ea.md
│ │ │ │ │ ├── introduction@PxOEfMSQYA2jy3zrMZXjZ.md
│ │ │ │ │ ├── inventory-optimization@LkbB0rpS3Du2K7_ogoc34.md
│ │ │ │ │ ├── iot@GrwdQldCWu2zWAaNj6LFk.md
│ │ │ │ │ ├── iqr@LEHK7ohKIzKhlGebd0k_j.md
│ │ │ │ │ ├── job-preparation@TojDB4o0i2rs7Qcb10k1r.md
│ │ │ │ │ ├── json@p21d2mEUnTQgWhKFTGS9F.md
│ │ │ │ │ ├── key-business-functions@PkzUqwT21Owk_TfepFPDm.md
│ │ │ │ │ ├── kurtosis@jvU1iu2M_y1IH62oUpAeU.md
│ │ │ │ │ ├── linear-regression@4-fpZx8p5iSNI3n4Qtacl.md
│ │ │ │ │ ├── lineplot@BVDaFmDat48nN3hj5NE71.md
│ │ │ │ │ ├── looker@f4MDT1RUfaICAWzyG2E6T.md
│ │ │ │ │ ├── manufacturing@zEGmDHaFa-F81tWqa3i9E.md
│ │ │ │ │ ├── map@7_5PBCrsukv81mm7yTpDf.md
│ │ │ │ │ ├── marketing-campaigns@0qRm81lJX_Eb6aJkJMjeL.md
│ │ │ │ │ ├── marketing@s-wUPMaagyRupT2RdfHks.md
│ │ │ │ │ ├── mean@S4XEOd2-PHIHOiiGgKVLJ.md
│ │ │ │ │ ├── median@mfLRVcxvAjqmSG-KBpJ4J.md
│ │ │ │ │ ├── metrics-and-kpis@c0ywBrs9u7MciWAXSgVVg.md
│ │ │ │ │ ├── misleading-charts@qGVDuU9RA9Y5g5vlPd-xq.md
│ │ │ │ │ ├── missing-values@fhreEuoT8ZBRwJqbSGrEZ.md
│ │ │ │ │ ├── mitigation-strategies@5MUwKGfSTKlam8KCG0A1U.md
│ │ │ │ │ ├── mobile-apps@1cC6LKxcncaKg4Jm53pUy.md
│ │ │ │ │ ├── mobile-responsiveness@7t0WfLLqrD5VJQwIAmXMo.md
│ │ │ │ │ ├── mode@DQtznxvW5x4s-zGLpUpNY.md
│ │ │ │ │ ├── mysql@eqnAEp2VT7FD2VDy5WVDP.md
│ │ │ │ │ ├── networking@Q98GaitxocEha4zZ9d254.md
│ │ │ │ │ ├── normalization-vs-denormalization@Prfa0LUmgxcp52IEObFom.md
│ │ │ │ │ ├── open-source-projects@YovS5Dbcr6g_8PMr8jp5t.md
│ │ │ │ │ ├── operational-bi@GN6SnI7RXIeW8JeD-qORW.md
│ │ │ │ │ ├── operations@dJZqe47kzRqYIG-4AZTlz.md
│ │ │ │ │ ├── oracle@uoQS4g-c6QndacUeiaWrq.md
│ │ │ │ │ ├── other-formats@k80q5FPNiIUdxn5A8R3Hu.md
│ │ │ │ │ ├── outliers@OqolfBQRQvwg6PI_t8Mrt.md
│ │ │ │ │ ├── p-value@rkEdx_mZBoDjMhiluJl7O.md
│ │ │ │ │ ├── pandas@25f76eB9-vy3Usta-Pbsi.md
│ │ │ │ │ ├── patient-management@LI09SvvUUCQxLZZee_j0n.md
│ │ │ │ │ ├── performance@y9Fnjnbiqt7WkrhjPITpW.md
│ │ │ │ │ ├── popular-databases@gJBaVERU3prru-qRksxN4.md
│ │ │ │ │ ├── population--sample@7VDxA9bQ1P1fym4eQVKkN.md
│ │ │ │ │ ├── portfolio-presentation@qsCWo1CmR4mvy7E7qlPv5.md
│ │ │ │ │ ├── postgresql@nhl9FM79femgqENNR0HbE.md
│ │ │ │ │ ├── power-bi@eqGsO6ZGk2jdG0z9-cHzz.md
│ │ │ │ │ ├── predictive-analysis@4zpVE3R0lLyWpHePdBVpl.md
│ │ │ │ │ ├── predictive-maintenance@yimCxOdNtyGcbd6ZxHsBQ.md
│ │ │ │ │ ├── prescriptive-analysis@NnbtaO2MiqsHeJ-ds0Q5m.md
│ │ │ │ │ ├── presentation-design@9G-pI5NsRCq4p0FLfaMR_.md
│ │ │ │ │ ├── privacy@fuxGZx3WGjP2TzzVV29ux.md
│ │ │ │ │ ├── production-efficiency@L50rpcgGjsQU3S0zRn6xh.md
│ │ │ │ │ ├── professional-development@tUxwKTml2Go8zR9tR3cjn.md
│ │ │ │ │ ├── programming-languages@KSxjcWV6C325kZITzAhWs.md
│ │ │ │ │ ├── project-management@r8NoX426-ngu6ZQZe06oK.md
│ │ │ │ │ ├── providers-aws-gcp-azure@Z4pAe4FpnCkUJt8RuOhC6.md
│ │ │ │ │ ├── public-health@Cydlrtg_FClBUkjezqGie.md
│ │ │ │ │ ├── python@vQQSYPpcGO7ri0RFSWi0h.md
│ │ │ │ │ ├── qlik@GoMIAQwusbT7fqJ-VnCrq.md
│ │ │ │ │ ├── quality-control@Xe9zK8xhkkr4fsh3HOzAY.md
│ │ │ │ │ ├── r@0OTmTRHlR3ImNU0zyLt8G.md
│ │ │ │ │ ├── range@jll2iRbjdx7iiNwY13KYD.md
│ │ │ │ │ ├── regression-analysis@m9ejACzRBJza0v-fpdfkn.md
│ │ │ │ │ ├── reinforcement-learning@KFONHuJNnCuSOH7-8Ndvm.md
│ │ │ │ │ ├── relevance@UhcniUDKmi7KNuXlolf5O.md
│ │ │ │ │ ├── responsibilities@Q-GmBJiRdBS_xLeOjef2R.md
│ │ │ │ │ ├── resume-optimization@m9EwcekZ_l0XHiKeQ8emr.md
│ │ │ │ │ ├── retail--e-commerce@7LbhfkmS7oFoSF1k5ZR1U.md
│ │ │ │ │ ├── risk-analytics@JHGV0V78GXubiSY9P3nTw.md
│ │ │ │ │ ├── salary-negotiation-strategies@k3F9Tdqo3XYgMLOKGjpxA.md
│ │ │ │ │ ├── sales-performance@VPu8vn7-baZQ5ORJ6ViW0.md
│ │ │ │ │ ├── scatterplot@hCSZo7jT9arBLUbtCVFfD.md
│ │ │ │ │ ├── seasonality@moWrEfuKE06QwbznsH3V-.md
│ │ │ │ │ ├── semistructured@qHcRrxenhogymMQ6EPiMa.md
│ │ │ │ │ ├── skewness@X0DBG0mEWk25PEbLHhs7v.md
│ │ │ │ │ ├── skills@iRgtog5A13CTNDxnbGN9x.md
│ │ │ │ │ ├── soft-skills@mi88uLdJBXaxJ2yVOSqqo.md
│ │ │ │ │ ├── sql-fundamentals@s8LZgRwrlm1V4meGM7gj0.md
│ │ │ │ │ ├── sql@_iV_5O5Rq07P9qRGrraTM.md
│ │ │ │ │ ├── sqlite@lrksz861rE5m2XzOQPwgh.md
│ │ │ │ │ ├── stakeholder-identification@e3SdmNpVcvy3k_-JIO6OK.md
│ │ │ │ │ ├── stakeholder-management@r-m88g8xrUnuEpV2lHJfN.md
│ │ │ │ │ ├── standardisation@TCYG6vmFqq1zAPNQWoOH8.md
│ │ │ │ │ ├── star-vs-snowflake-schema@iYe42G31fhkAO0MBaHutF.md
│ │ │ │ │ ├── statistical-tests@01k_mfsp0eW6TX9yp8PDE.md
│ │ │ │ │ ├── std@vqtzg9bydAqHMwZhPHo1a.md
│ │ │ │ │ ├── storytelling-framework@t_J0MZTMWMnrImGHjXYov.md
│ │ │ │ │ ├── strategic-bi@3BxbkrBp8veZj38zdwN8s.md
│ │ │ │ │ ├── structured@jnIn3_2fI2k97oALPZkt7.md
│ │ │ │ │ ├── supervised-learning@eZN_ty8VDX9mi5KtCWTFL.md
│ │ │ │ │ ├── supply-chain-analytics@7jrzQogTOc6lHXfpYLCsx.md
│ │ │ │ │ ├── supply-chain-optimization@-hNguvT6SQCqAgVpoQByr.md
│ │ │ │ │ ├── tableau@WzPj94lYxQCjFx5YW4X9x.md
│ │ │ │ │ ├── tactical-bi@jJukG4XxfFcID_VlQKqe-.md
│ │ │ │ │ ├── time-series-analysis@yseEaLsEzIcqJ0YIoGujl.md
│ │ │ │ │ ├── timeliness@5USjYdAVJs0gSXxE1j8Xu.md
│ │ │ │ │ ├── trends@On6kznZxLTCpBPskdZtgT.md
│ │ │ │ │ ├── types-of-bi-operations@LjeipkY01Hlkp22kmlAMh.md
│ │ │ │ │ ├── types-of-data-analysis@3DVF8zo-_WM_9GTuzQFO8.md
│ │ │ │ │ ├── types-of-data@H1s1PQj8CHQ_VBQIy1VtJ.md
│ │ │ │ │ ├── types-of-errors@SosOXxErMn0t2KCoHoxvS.md
│ │ │ │ │ ├── unstructured@DJKXgelIxuahxJiqvwP6I.md
│ │ │ │ │ ├── unsupervised-learning@6l_tHC1R5zgABHMc_G6RD.md
│ │ │ │ │ ├── variables-and-data-types@HM1w6JJquaV6Vq4mjxM7p.md
│ │ │ │ │ ├── variance@ZmSwDn0sP7HvLKYVzRwPJ.md
│ │ │ │ │ ├── visualization-best-practices@eKBORkRU6HCH-D4GWHyKR.md
│ │ │ │ │ ├── visualization-fundamentals@sltVKaKKjmzu17jDv9OFF.md
│ │ │ │ │ ├── web@xQLsuJ3uohVzOxGfFLyFw.md
│ │ │ │ │ ├── what-is-bi@jVXwlHRGgVpcoWCYzSB5W.md
│ │ │ │ │ ├── what-is-data@g5j_mbjx2yZUIK5lfN3eT.md
│ │ │ │ │ ├── why-bi-matters@NX-YaB_FVjoHYsR6z9QIL.md
│ │ │ │ │ ├── window-functions@1toMuRZResgse1AtwEck6.md
│ │ │ │ │ ├── writing-executive-summaries@Slg3fXGPTa-Z4sdZY86XK.md
│ │ │ │ │ └── xml@ytgK7van84j5DsfD0JyZ3.md
│ │ │ │ └── faqs.astro
│ │ │ ├── blockchain/
│ │ │ │ ├── blockchain.json
│ │ │ │ ├── blockchain.md
│ │ │ │ ├── content/
│ │ │ │ │ ├── alchemy@lOoubzXNILBk18jGsc-JX.md
│ │ │ │ │ ├── angular@UY_vAsixTyocvo8zvAF4b.md
│ │ │ │ │ ├── applicability@aATSuiqPG-yctr3ChEBa_.md
│ │ │ │ │ ├── applications-and-uses@WD2JH4X4tEE4J0W0XFQ_4.md
│ │ │ │ │ ├── arbitrum@A_yVDg-6b42ynmh71jk1V.md
│ │ │ │ │ ├── arbitrum@ixTIn2Uhs-i5-UPt9jKAa.md
│ │ │ │ │ ├── architecture@B6GGTUbzEaIz5yu32WrAq.md
│ │ │ │ │ ├── avalanche@txQ9U1wcnZkQVh6B49krk.md
│ │ │ │ │ ├── base@ixTIn2Uhs-i5-UPt9jKAa.md
│ │ │ │ │ ├── basic-blockchain-knowledge@MvpHHpbS-EksUfuOKILOq.md
│ │ │ │ │ ├── basic-blockchain-operations@9z0Fqn1qqN8eo6s7_kwcb.md
│ │ │ │ │ ├── besu@Gnnp5qrFmuSVtaq31rvMX.md
│ │ │ │ │ ├── bft@Bj3T_4lfr0Yianuwr3pDN.md
│ │ │ │ │ ├── binance-smart-chain@sJj-6wG5KjjzYYia_eo63.md
│ │ │ │ │ ├── bitbucket@TMPB62h9LGIA0pMmjfUun.md
│ │ │ │ │ ├── bitcoin@tmI1PrE4fInrGB3-jMrFW.md
│ │ │ │ │ ├── blockchain-forking@L08v-78UsEhcg-mZtMVuk.md
│ │ │ │ │ ├── blockchain-interoperability@nNPa6jKRUaitmHwBip_LE.md
│ │ │ │ │ ├── blockchain-networks@nuq_juiBSecI7PwERR_4R.md
│ │ │ │ │ ├── blockchain-structure@Atv-4Q7edtvfySs_XhgEq.md
│ │ │ │ │ ├── blockchains@EQgb4LqXnyq3gOX7Fb85s.md
│ │ │ │ │ ├── bnb-chain@sJj-6wG5KjjzYYia_eo63.md
│ │ │ │ │ ├── brownie@Q64AbQlvYPiqJl8BtoJj9.md
│ │ │ │ │ ├── building-for-scale@bTdRKEiIUmu1pnp8UbJK9.md
│ │ │ │ │ ├── cardano@IzBZnvl8lqVKsog-IGwtV.md
│ │ │ │ │ ├── chainlink@omQOhNfMO09pBc7oy76Wo.md
│ │ │ │ │ ├── client-libraries@vZiDpX9pEB9gfueSKZiQL.md
│ │ │ │ │ ├── client-nodes@CoYEwHNNmrQ0i0sSQTcB7.md
│ │ │ │ │ ├── code-coverage@4V-dj9x9hSAAGCxpBWsbE.md
│ │ │ │ │ ├── common-threat-vectors@GxD-KybtmkwT3wqDzIfHp.md
│ │ │ │ │ ├── consensus-protocols@_BkpK9qgp9up8nXNH7q4m.md
│ │ │ │ │ ├── crypto-faucets@S68IUKs0k_FFHEH97xxs7.md
│ │ │ │ │ ├── crypto-wallets@SM8Wt3iNM_nncLj69KCuy.md
│ │ │ │ │ ├── cryptocurrencies@s1QqQc0We5yQaNF3Ogt4k.md
│ │ │ │ │ ├── cryptography--hashing@e_I-4Q6_qIW09Hcn-pgKm.md
│ │ │ │ │ ├── cryptography@e_I-4Q6_qIW09Hcn-pgKm.md
│ │ │ │ │ ├── cryptowallets@FSThY0R1OAZCIL98W3AMj.md
│ │ │ │ │ ├── daos@RsoOgixZlyQU6h7nIaY9J.md
│ │ │ │ │ ├── dapps---decentralized-applications@SXXvFtf_7Rx64cHSEWxMS.md
│ │ │ │ │ ├── dapps@oczIhxMB7WOhcAocIa2Ew.md
│ │ │ │ │ ├── decentralization-vs-trust@E9HR_voxQ2a2tvWUuva_p.md
│ │ │ │ │ ├── decentralization@H9jvIlxX6P-C_cgPfZop4.md
│ │ │ │ │ ├── decentralized-storage@tvk1Wh04BcFbAAwYWMx27.md
│ │ │ │ │ ├── defi@1AhombZUkZN6Ra5fysSpg.md
│ │ │ │ │ ├── deployment@7goaYnedUlfgfl5qApoO2.md
│ │ │ │ │ ├── deployment@cW3_Ki9Bx7fYluDLKKKgl.md
│ │ │ │ │ ├── diligent-fuzzing@twR3UdzUNSztjpwbAUT4F.md
│ │ │ │ │ ├── echidna@U4H62lVac8wIgxNJ3N3ga.md
│ │ │ │ │ ├── environmental-considerations@-dIX_3qo97B418_BmJ5wP.md
│ │ │ │ │ ├── erc-tokens@bjUuL7WALETzgFxL6-ivU.md
│ │ │ │ │ ├── ethereum-20@9uz6LBQwYpOid61LrK5dl.md
│ │ │ │ │ ├── ethereum@JLXIbP-y8C2YktIk3R12m.md
│ │ │ │ │ ├── ethersjs@i-ltfXPTCu3WaBo-xaN05.md
│ │ │ │ │ ├── everscale@YC385OLECWjpZjVeWKksO.md
│ │ │ │ │ ├── evm-based@tSJyp46rkJcOtDqVpJX1s.md
│ │ │ │ │ ├── fantom@trcGwYcFW5LQUUrAcbUf_.md
│ │ │ │ │ ├── foundry@F1EUAxODBJ3GEoh7cqM-K.md
│ │ │ │ │ ├── frontend-frameworks@YR-U2njkUrEMO0JxCU1PH.md
│ │ │ │ │ ├── fuzz-testing--static-analysis@wypJdjTW4jHm9FCqv7Lhb.md
│ │ │ │ │ ├── general-blockchain-knowledge@bA4V_9AbV3uQi3qrtLWk0.md
│ │ │ │ │ ├── geth@DBRaXtwvdq2UGE8rVCmI1.md
│ │ │ │ │ ├── git@gpS5CckcQZX3TMFQ2jtIL.md
│ │ │ │ │ ├── github@GOgeaQoRvqg-7mAfL_A8t.md
│ │ │ │ │ ├── gitlab@CWqwv4asouS-dssAwIdxv.md
│ │ │ │ │ ├── gnosis-chain@UQ9AejYV6_Sk6ZJkXYWf7.md
│ │ │ │ │ ├── go@jxlQ1ibcCv6ZlcEvobZ_G.md
│ │ │ │ │ ├── gosh@5MGtl00EEZdSnJdrNYPJ7.md
│ │ │ │ │ ├── hardhat@l110d4NqTQt9lfEoxqXMX.md
│ │ │ │ │ ├── huobi-eco-chain@PkRAYBZQAUAHxWEeCCX4U.md
│ │ │ │ │ ├── hybrid-smart-contracts@JbgBwG6KmeTdyle9U6WAv.md
│ │ │ │ │ ├── ides@lXukWXEatsF87EWFSYyOO.md
│ │ │ │ │ ├── infura@hJmNuEMHaMSM0QQlABFRS.md
│ │ │ │ │ ├── insurance@uMXcKCUoUN8-Hq_IOBRCp.md
│ │ │ │ │ ├── integration-tests@QNfnbUGkT3N-pj5epnHcM.md
│ │ │ │ │ ├── introduction@MvpHHpbS-EksUfuOKILOq.md
│ │ │ │ │ ├── javascript@fF06XiQV4CPEJnt_ESOvv.md
│ │ │ │ │ ├── l2-blockchains@i_Dw3kUZ7qKPG-tk-sFPf.md
│ │ │ │ │ ├── maintenance@XvVpnlYhT_yOsvjAvwZpr.md
│ │ │ │ │ ├── management-platforms@fbESHQGYqxKRi-5DW8TY3.md
│ │ │ │ │ ├── manticore@twR3UdzUNSztjpwbAUT4F.md
│ │ │ │ │ ├── mining--incentive-models@B7niNXMOTbHn_1ixKQ8ri.md
│ │ │ │ │ ├── mining-and-incentive-models@B7niNXMOTbHn_1ixKQ8ri.md
│ │ │ │ │ ├── monitoring@H3jNM_0sJrB7ZbYzrVhF7.md
│ │ │ │ │ ├── moonbeam--moonriver@Ib9STGxQa8yeoB-GFeGDE.md
│ │ │ │ │ ├── moonbeam--moonriver@VVbvueVMJKLUoJYhbJB1z.md
│ │ │ │ │ ├── moralis@RFgetmTvKvpV2PG6Vfev7.md
│ │ │ │ │ ├── moralis@pJhR9OQo8YFQmAZXQbikJ.md
│ │ │ │ │ ├── mythx@XIgczUc3yKo6kw-_3gskC.md
│ │ │ │ │ ├── nethermind@xtYwg0WAcE8Ea9VgC2RSc.md
│ │ │ │ │ ├── nfts@e4OHLOfa_AqEShpMQe6Dx.md
│ │ │ │ │ ├── node-as-a-service@dDPhMNPpl3rZh3EgXy13P.md
│ │ │ │ │ ├── on-chain-scaling@1bUD9-vFo-tsHiB1a06tO.md
│ │ │ │ │ ├── openzeppelin@qox-x_q-Q7aWcNFWD7RkT.md
│ │ │ │ │ ├── optimism@EK5TqRRn15ExsGc4gfMLu.md
│ │ │ │ │ ├── optimistic-rollups--fraud-proofs@ti6-LSK52dTCLVdxArp9q.md
│ │ │ │ │ ├── oracle-networks@CzfsAQIk3zIsDaDAorG9K.md
│ │ │ │ │ ├── oracles@sK8G-41D3EfYNSLFJ3XYf.md
│ │ │ │ │ ├── payments@vTGSDThkDDHvCanNlgP07.md
│ │ │ │ │ ├── plasma@dMesiPUPBegYQ7hgeMMJK.md
│ │ │ │ │ ├── poh@-bul5ZMIcZf8RNd4kV54s.md
│ │ │ │ │ ├── pokt-network@pJhR9OQo8YFQmAZXQbikJ.md
│ │ │ │ │ ├── polygon@JNilHFQnnVDOz-Gz6eNo5.md
│ │ │ │ │ ├── pos@WNPNoDZ57M2QHEIIU-Bpa.md
│ │ │ │ │ ├── pow@XbO1CKYZ6OVqVjtrcHKq2.md
│ │ │ │ │ ├── practices@UOF7Ep97i1l3Own6YEWlq.md
│ │ │ │ │ ├── python@pVG7bGqVGCeSBlZxRNHJs.md
│ │ │ │ │ ├── quicknode@FGih8w9We52PHpBnnGO6H.md
│ │ │ │ │ ├── react@0DUYS40_-BTpk2rLQ1a0e.md
│ │ │ │ │ ├── remix@lXukWXEatsF87EWFSYyOO.md
│ │ │ │ │ ├── repo-hosting-services@oSK3MRQD_4j1gGDORN7RO.md
│ │ │ │ │ ├── rust@Larbhjzi-MnPQKH1Pzn2R.md
│ │ │ │ │ ├── security@PBTrg9ivOpw9uNTVisIpx.md
│ │ │ │ │ ├── security@snQA5_4H2dDkT1pENgaYD.md
│ │ │ │ │ ├── sidechains@lSQA3CfQBugEBhAh2yxro.md
│ │ │ │ │ ├── slither@YA3-7EZBRW-T-8HuVI7lk.md
│ │ │ │ │ ├── smart-contract-frameworks@KRtEN0845lV5e85SOi6oZ.md
│ │ │ │ │ ├── smart-contracts@BV6lEwCAKaYxSPWD0LV_d.md
│ │ │ │ │ ├── solana@JYHK95Xr0R1MVCda1Epl6.md
│ │ │ │ │ ├── solidity@chaIKoE1uE8rpZLkDSfV-.md
│ │ │ │ │ ├── source-of-randomness-attacks@f60P5RNNdgCbrhDDzkY25.md
│ │ │ │ │ ├── starknet@Ib9STGxQa8yeoB-GFeGDE.md
│ │ │ │ │ ├── state--payment-channels@5T5c3SrFfMZLEKAzxJ-_S.md
│ │ │ │ │ ├── storage@zvUCR0KeigEi9beqFpwny.md
│ │ │ │ │ ├── substrate@E4uuJZFZz-M1vlpZmdJTO.md
│ │ │ │ │ ├── supporting-languages@NK02dunI3i6C6z7krENCC.md
│ │ │ │ │ ├── testing@-7Bq2ktD0nt7of9liuCDL.md
│ │ │ │ │ ├── ton@4tAyunbYVwlbzybuVq7fr.md
│ │ │ │ │ ├── ton@ug4FB4RXItHU0ADnisvve.md
│ │ │ │ │ ├── tools@n3pipnNb76aaQeUwrDLk_.md
│ │ │ │ │ ├── truffle@Vl9XHtc22HnqaCnF9yJv9.md
│ │ │ │ │ ├── tvm-based@hlcavpstLnXkJcjccQUL8.md
│ │ │ │ │ ├── tvm-based@miBEG3x_foKYxwfX4Tr4f.md
│ │ │ │ │ ├── types-of-blockchains@EQgb4LqXnyq3gOX7Fb85s.md
│ │ │ │ │ ├── understanding-blockchain@bA4V_9AbV3uQi3qrtLWk0.md
│ │ │ │ │ ├── unit-tests@IXs4nUzy_A5vBjI_44kaT.md
│ │ │ │ │ ├── upgrades@OotJnHgm622NQJc2WRI7c.md
│ │ │ │ │ ├── utxo-based@C-SpX4Rzk5Um2F_X5ZdBr.md
│ │ │ │ │ ├── validium@chmxDwNVOefp98IbjEgNl.md
│ │ │ │ │ ├── venom@3HCpgWWPIkhK3gPRJuJQf.md
│ │ │ │ │ ├── version-control-systems@Fs9rcEh_f9fJ2tF-bkAUE.md
│ │ │ │ │ ├── vs-code@J4ev2h5cipcwh3OcuBdMU.md
│ │ │ │ │ ├── vue@Ke97bMHGfb-8hB_xSwMbk.md
│ │ │ │ │ ├── vyper@jgHa_LeCac0pl6dSADizF.md
│ │ │ │ │ ├── web3js@jwuMeo9TwaQviGIMO13Jf.md
│ │ │ │ │ ├── what-is-blockchain@edO8iEehsZtYavlsEKhOy.md
│ │ │ │ │ ├── why-it-matters@Nc9AH6L7EqeQxh0m6Hddz.md
│ │ │ │ │ ├── why-it-matters@ecT4W5z8Vq9pXjnuhMdpl.md
│ │ │ │ │ └── zk-rollups--zero-knowledge-proof@PykoX4j5Q3eJWIpUoczjM.md
│ │ │ │ ├── faqs.astro
│ │ │ │ └── migration-mapping.json
│ │ │ ├── claude-code/
│ │ │ │ └── content/
│ │ │ │ ├── @La3uarrUxC5oTszf4oaWr.md
│ │ │ │ ├── @N6z45nuFeUqRB2f-8b_Ku.md
│ │ │ │ ├── @PYjuzInrTOWebl-OyYfMa.md
│ │ │ │ ├── add-dir@FgQXBQ6oJ5sfW_ar0u6ez.md
│ │ │ │ ├── agent-team@fI90DtG5CoZbDyJUqLGoy.md
│ │ │ │ ├── agents@sx2GRmZbQEYxeb05HpHQH.md
│ │ │ │ ├── api-usage@N6dDyEXIUJUA3-o1J9K_n.md
│ │ │ │ ├── be-mindful-of-extensions@__3S2Z00hK_g_GQJxv_21.md
│ │ │ │ ├── claude---add-dir@FgQXBQ6oJ5sfW_ar0u6ez.md
│ │ │ │ ├── claude--c@XlCA3rx2C7wx_EcTYtr9_.md
│ │ │ │ ├── claude--p@2PKH3Ru9XgCz1MO75pDVr.md
│ │ │ │ ├── claude--r@zUxO8udwPhYK6J_3wAs2Z.md
│ │ │ │ ├── claude-cli@3r-vFlVAEirxD1gaFOO4H.md
│ │ │ │ ├── claude-code-security@KgXvbrUuYyiBn52QCRoLl.md
│ │ │ │ ├── claude-query@zSpldCAVxYoRpHDIR2oVa.md
│ │ │ │ ├── claude-workflow@_iAIq8mwW0cIGbvrfmSJ5.md
│ │ │ │ ├── claude@lcnfnGocMZIWDQqrmdCWL.md
│ │ │ │ ├── claudemd@T6PklJYVOrmcAgNcCFhKt.md
│ │ │ │ ├── claudemd@TCWd5vobMAhP7I97Q1rTq.md
│ │ │ │ ├── clear@N4YM2lqDcic5AiYgv0eRZ.md
│ │ │ │ ├── code-intelligence@qg6ZTF0LCz5zo5G1a3BEf.md
│ │ │ │ ├── common-usecases@rGtz0Nw4BgOrdm3WUmjwZ.md
│ │ │ │ ├── community-tools@e12uqC2SEzaMfmBbz7VZf.md
│ │ │ │ ├── compact@65s0P7d39fFR2yhy4JKEZ.md
│ │ │ │ ├── config@UOSXh1o8bRY8Wcm6uYIgR.md
│ │ │ │ ├── connecting-tools-with-mcp@OBtJvLaEV3giUhvGFofKv.md
│ │ │ │ ├── context@6UHAXR4praMqGiEUgWAt8.md
│ │ │ │ ├── context@C5tCsAJQxq2d-fOrjjloB.md
│ │ │ │ ├── cost@vw9cc6_33nHnNPNyhLo_d.md
│ │ │ │ ├── creating-skills@6WsAQV_e_2XJKl2KlN2dl.md
│ │ │ │ ├── creating-subagents@HnrD1-Wc39ZRH5R6bptqX.md
│ │ │ │ ├── ctrlc@dD0TlpfC4GzYWINplekKw.md
│ │ │ │ ├── ctrlr@R7YJyNd0taUVJvXDPHBn5.md
│ │ │ │ ├── customize-status-line@xEu9-kBz5SbM3Mrrwu446.md
│ │ │ │ ├── desktop-app@rIG8F-Rc-fMeXZ5n0UTwi.md
│ │ │ │ ├── doctor@IzHlnmGAqG1lpwuX1Oh4p.md
│ │ │ │ ├── editor-extensions@ONhEanq8I2RE-Jc_YY3Wa.md
│ │ │ │ ├── esc--esc@8xqKBvdDfTLeZXeGeqQZr.md
│ │ │ │ ├── esc@2pu6b0Z5BQAz44Hx69Pzk.md
│ │ │ │ ├── exit@MjZUaSJLSU5nDMgDJaWUh.md
│ │ │ │ ├── export@eLlCNxa6bqQW0JsHxIdOa.md
│ │ │ │ ├── git-worktrees@wxkAkdKFTwbNJEfwA9tGl.md
│ │ │ │ ├── haiku@y_euG-Rzj-OmCZhvMXegc.md
│ │ │ │ ├── headless-mode@FP6Lc-zqmP8yzBytuSsUc.md
│ │ │ │ ├── help@I4i_fKzuBy5pTC0JXyEl-.md
│ │ │ │ ├── hook-events--matchers@nq8aLrgh7qNQnwZbS7d9Z.md
│ │ │ │ ├── hook-inputs--outputs@Gwsh4g1SxI2hJcS84p9it.md
│ │ │ │ ├── hook-types@uC2PkMsCK-vaBo5Ygha2P.md
│ │ │ │ ├── hooks@801KNtjf61FTiLS1yrDSB.md
│ │ │ │ ├── hooks@OTpU2G6mnbkFhthKAkxlM.md
│ │ │ │ ├── hooks@qPH0w52-8MvzZdFdsNMap.md
│ │ │ │ ├── how-to-structure@7ZD0nOke-7vqaibxBx24Y.md
│ │ │ │ ├── init@oucDNnTIc8gv3dlEibDB2.md
│ │ │ │ ├── introduction@RqfeqVMhTSdC4w4GcsETP.md
│ │ │ │ ├── locations@Ho_DTKqMZnx_nlxjWfrW2.md
│ │ │ │ ├── manage-context@8fXu3OX3xfwr3NTAIHU0z.md
│ │ │ │ ├── manage-sessions@rlj-GMcqgdKM5_7rs7yz9.md
│ │ │ │ ├── mcp@8Nd9CdGb1_Jl4YLBvew4z.md
│ │ │ │ ├── mcp@Lyl4h5cvdY1YVpzBo_LEB.md
│ │ │ │ ├── memory@l7ECu0Q5bW9_OgVH7Ih4S.md
│ │ │ │ ├── model-configuration@Tq83zphFUA1J8spMEyN8H.md
│ │ │ │ ├── model@NMBBRdBWwCphjwQuFAp9W.md
│ │ │ │ ├── models@RHWW3QOFWRMqlaovGOLEO.md
│ │ │ │ ├── modes@gcZCpCWHvIo5Ox0vVkdgV.md
│ │ │ │ ├── opus@TWN08Vx7aBK-mvOSQuFfu.md
│ │ │ │ ├── opusplan@aHi-EWuBbn1xvK5osHOUM.md
│ │ │ │ ├── output-styles@i3K2_8VcOGGSPdj1Jb4Im.md
│ │ │ │ ├── permission-modes@y8VCGx-h97udP-dRzsSAI.md
│ │ │ │ ├── permissions@8rKpgtmO92EUFAKlWVuO5.md
│ │ │ │ ├── plan-mode@Dutj1C19nrbonQ7OpqBnv.md
│ │ │ │ ├── plan@3ZYaw7kTiErPiLVwMf3J8.md
│ │ │ │ ├── plugins@oV7YG_TnJ4ZyVVjqRwPkR.md
│ │ │ │ ├── plugins@wd9T37TIM_1JU4o_2Fb0h.md
│ │ │ │ ├── posttooluse@TBrr5EscwLZu7cOJoWbPy.md
│ │ │ │ ├── pretooluse@FWf5hyCRo9UQ2QPalLVYn.md
│ │ │ │ ├── prompt-caching@Dam_IG339RrYZXjXq3T8_.md
│ │ │ │ ├── reduce-token-usage@Dam_IG339RrYZXjXq3T8_.md
│ │ │ │ ├── resume@0HKJlqhoSCMNKf1lRIEy1.md
│ │ │ │ ├── rewind@-K5K7yT97VRC7u0IOzJyT.md
│ │ │ │ ├── rewind@cW0a112UVj2M3wBDA8UDj.md
│ │ │ │ ├── scaling-claude@ip2bq52qRah-7db6dORO8.md
│ │ │ │ ├── security-best-practices@WVrC8-nf8xn1jckCHO3h4.md
│ │ │ │ ├── sessionend@x5U0F5WWAqnNCC8f-qjr7.md
│ │ │ │ ├── sessionstart@cMGYb_X1UK8sWI6brFj9S.md
│ │ │ │ ├── setting-up-claude@XApGUujmnvp2VYUyEj1Kc.md
│ │ │ │ ├── shifttab@gpg2cfEUUKI5J9FMxn5QD.md
│ │ │ │ ├── skill-best-practices@5uIBv9rk7Wzc_bXny0B27.md
│ │ │ │ ├── skill-scope@5uIBv9rk7Wzc_bXny0B27.md
│ │ │ │ ├── skills-for-mcp@U22jPxfQWbu7-54OcsqkV.md
│ │ │ │ ├── skills@OJIfG7DRO4jgQEcberkNx.md
│ │ │ │ ├── skills@iVa6piQwdPHIDkSRX8OSy.md
│ │ │ │ ├── slash-commands@JeotqE91kV1n-YRoXN9gX.md
│ │ │ │ ├── sonnet@nDodLa7_UEeOmx6iM0Xp5.md
│ │ │ │ ├── status@PS0GH8e9sW9N4s3UeHhjH.md
│ │ │ │ ├── stop@v-gjhrW3oVZTe3EpUCjhY.md
│ │ │ │ ├── subagents@EsbasCHDQOBZcBfHIrTbE.md
│ │ │ │ ├── subagents@wFxYfNu7LtzV72a224WTZ.md
│ │ │ │ ├── subscription@_Un0jTJaFs5Pdn1DFGl61.md
│ │ │ │ ├── thinking-modes--effort@cdO7pKphZq1qvCeynxGKo.md
│ │ │ │ ├── tools@vB1d1mbiPJK3a1LbYZkH9.md
│ │ │ │ ├── understand-claude-pricing@SCbZprU9r8BIX4BoyjYPE.md
│ │ │ │ ├── usage-best-practices@svhWAC463Y9CUkFb524Fd.md
│ │ │ │ ├── usage@CPJulmusiWq3JQ6MmEJ0I.md
│ │ │ │ ├── use-compact-and-clear@YjRDJcSK_h82DooDWY2k4.md
│ │ │ │ ├── use-compact-regularly@YjRDJcSK_h82DooDWY2k4.md
│ │ │ │ ├── use-subagents-and-hooks@-P9o-aiDM7CDtLimppkjM.md
│ │ │ │ ├── userpromptsubmit@Zrqdx4Z8uAS5yhI65Xh6z.md
│ │ │ │ ├── using-claude-code@29xiIXYlB0bjXKA794qap.md
│ │ │ │ ├── ways-to-use-claude@thR8GUbuAkEL4sb4m3llJ.md
│ │ │ │ ├── what-is-a-coding-agent@LGxnQkrbwVu9z1PFB12P3.md
│ │ │ │ ├── what-is-agentic-loop@uOowDiCXVKyMFrZO1pnXv.md
│ │ │ │ └── what-is-vibe-coding@SKkeuO_5B18AbxlNGeazN.md
│ │ │ ├── cloudflare/
│ │ │ │ ├── cloudflare.json
│ │ │ │ ├── cloudflare.md
│ │ │ │ ├── content/
│ │ │ │ │ ├── ai-gateway@vu8yJsS1WccsdcEVUqwNd.md
│ │ │ │ │ ├── ai-model-integration@QxPoNHsL-Pj_z3aU6qEP4.md
│ │ │ │ │ ├── ai-powered-search@Ep9_oV_YnkbH1gHM-n3gO.md
│ │ │ │ │ ├── any-frontend-framework@zSwio18XdBfqwSneAx_AP.md
│ │ │ │ │ ├── asset-management@3jU5753Uza2aS-gZo7w4k.md
│ │ │ │ │ ├── background-jobs@qgvDGyLjc6lMmVPjHozFM.md
│ │ │ │ │ ├── basic-command-line-knowledge@q9oQTt_NqhdWvJfA5XH1V.md
│ │ │ │ │ ├── bindings@9ef2VPCru8lCmRxxGe-Eo.md
│ │ │ │ │ ├── bot-management@So-cKAVfbgsw2zzFREu7Q.md
│ │ │ │ │ ├── browser-rendering@qkFRW_tJB8_1IYpYskQ5M.md
│ │ │ │ │ ├── bucket-lifecycle@YvgmmF9sWfURgijFV7E31.md
│ │ │ │ │ ├── bucket-operations@UNE6XK4su5r2jcxhY7hOG.md
│ │ │ │ │ ├── bulk-operations@i64-aCpZHygq76fBU6eXD.md
│ │ │ │ │ ├── cache-api@ui3pUfsGMxv4WRzHkgbF0.md
│ │ │ │ │ ├── caching-patterns@OgW-iIrJZ5-sOWKnFpIZd.md
│ │ │ │ │ ├── caching-strategies@uBjcQ9PJUfwzu5N_2CNjN.md
│ │ │ │ │ ├── calls@vHQdMgaL2EEr2o_eJmOuV.md
│ │ │ │ │ ├── cicd-pipelines@8Y6TIYoWIXrxtmzDVdS0b.md
│ │ │ │ │ ├── coordination@RYm0oBFCxm-S-aCwZ21p6.md
│ │ │ │ │ ├── d1@mKN0Ta3zSk7PCm_uHYKFN.md
│ │ │ │ │ ├── dead-letter-queues@Grl59SjY31Q3sgf9uX-xf.md
│ │ │ │ │ ├── debugging-techniques@TmQC7fTL6b9EsBDYibv4g.md
│ │ │ │ │ ├── development-tools@gsCRhwwjXuyueaYHSPOVZ.md
│ │ │ │ │ ├── devtools-integration@uoaOrypiMkyoikXvTHeVS.md
│ │ │ │ │ ├── devtools@G6YQZUQh_x8Qxm1oBseLQ.md
│ │ │ │ │ ├── drizzle@MpWO1sroeF106SEMU1V1a.md
│ │ │ │ │ ├── durable-objects@G-xBbtaniYFRE9Dgs18px.md
│ │ │ │ │ ├── edge-computing-fundamentals@aGWLomYHGkIfn7GFc0_Yl.md
│ │ │ │ │ ├── edge-ssltls@sXBxaQtwJ-luGVXdqVXk1.md
│ │ │ │ │ ├── email-workers@z-1Ye5hcNdr9r6Gwdw7mv.md
│ │ │ │ │ ├── event-driven-architectures@Z9Yywlf7rXFBtxTq5B2Y5.md
│ │ │ │ │ ├── external-api-integration@4g5w6IAdzefdlRTxbRbdS.md
│ │ │ │ │ ├── fetch-api-and-runtime-apis@_2UnRlbUplHvs5-Stj4O4.md
│ │ │ │ │ ├── filtering@kdIfqTCcOSvV4KDpjr7nu.md
│ │ │ │ │ ├── git-basics@C08pIguX1N45Iw0kh0Fvu.md
│ │ │ │ │ ├── hono@-8MsWNvuqwQCbLpOx_kov.md
│ │ │ │ │ ├── html-rewriting@INiqdtppBmCthOEXuHb-V.md
│ │ │ │ │ ├── http-and-web-protocols@9iSdASlRxyod9YwZ2IUry.md
│ │ │ │ │ ├── image-processing@S7laV14zsx31O0Tsj2SRL.md
│ │ │ │ │ ├── images@8bOWuopxHtBWUSFaVT54P.md
│ │ │ │ │ ├── integration--workflows@wvurOKbemF4Tt2WZcmqDL.md
│ │ │ │ │ ├── inter-worker-communication@jYAUIKozuhsNK5LbkeAJ6.md
│ │ │ │ │ ├── isolates-architecture@uNinrB9wm5ahjGXu5fc0g.md
│ │ │ │ │ ├── itty-router@15jl6CSCkqnh_eFfysLDM.md
│ │ │ │ │ ├── javascript-fundamentals@PcYnYAAkKMbzoiCnBfjqO.md
│ │ │ │ │ ├── key-value-operations@EBTHbXOOZiqrcYJvKhcWV.md
│ │ │ │ │ ├── large-file-handling@BPahk1qH9Hk11tsE2hw3A.md
│ │ │ │ │ ├── live-streaming@RiQSPAV9uRFgwQFJckTFV.md
│ │ │ │ │ ├── logging-and-monitoring@aKEH4ZxI6J1nwjp_AgH5r.md
│ │ │ │ │ ├── message-processing@EFA8m0EdhygxcBWzwmbnT.md
│ │ │ │ │ ├── metadata-handling@sQlRIYLnZcugATgpogJmw.md
│ │ │ │ │ ├── middleware-patterns@aStbAF4zraqhJ-N3RH4ha.md
│ │ │ │ │ ├── migrations@M8rSSVFUHixgWZRfaBPHb.md
│ │ │ │ │ ├── miniflare@o4sBgniPmLqwej6TlIPcl.md
│ │ │ │ │ ├── miniflare@vZHBp4S6WaS5sa5rfUOk-.md
│ │ │ │ │ ├── monitoring-tools@Cy2T8978yUAPGol-yzxv_.md
│ │ │ │ │ ├── nodejs-and-npm@dSBYTGGkol3MAXyg7G7_J.md
│ │ │ │ │ ├── object-storage@K9iW2H6riKwddWmpWJFJw.md
│ │ │ │ │ ├── pages-functions@SaHqm7T4FFVrsgyfImo66.md
│ │ │ │ │ ├── persistence@36w4Q73XkCwo5Cva0XsF8.md
│ │ │ │ │ ├── prisma@h3MHLZZwkYqqb5PSfMhpB.md
│ │ │ │ │ ├── processing@6bNUqx5f_w5NuDL25BABN.md
│ │ │ │ │ ├── query-optimization@65xDESm6jbHWkVO4NgHqx.md
│ │ │ │ │ ├── queues@zyRgTtlng6idboSgL9YTt.md
│ │ │ │ │ ├── r2-storage@gxLUlXGuaY5Q-0xmBgQwz.md
│ │ │ │ │ ├── rate-limiting@JP5U6c2fZjtkU-Xzwtapx.md
│ │ │ │ │ ├── rate-limiting@MInAsLLJtIq6WQDSj5yGH.md
│ │ │ │ │ ├── requestresponse-handling@HNEXPU6r_T7UYvwLv2wnt.md
│ │ │ │ │ ├── routing@-lsYPD6JueIV94RybGH_Y.md
│ │ │ │ │ ├── schema-management@PnhP47woPJb_JnLpMMiTw.md
│ │ │ │ │ ├── security--performance@76xovsBrKOnlRBVjsqNq1.md
│ │ │ │ │ ├── service-bindings@JfpVexcbuWCx_R3EjFmbo.md
│ │ │ │ │ ├── service-bindings@WZSi9inWPhqZQvDN-C8BV.md
│ │ │ │ │ ├── similarity-search@pg3GtykCegK411DYDN8sN.md
│ │ │ │ │ ├── speech-rcognition@HJbJ8OxjJzznYwLlIOSO2.md
│ │ │ │ │ ├── state-management@EQjhRlM7zpANNWkypScIl.md
│ │ │ │ │ ├── stream@LoT3NtpNj9uAgQRV-MD_E.md
│ │ │ │ │ ├── testing-frameworks@jyWxaMx7_nojt5HsyAv7K.md
│ │ │ │ │ ├── text-generation@zMwmoCUp9429_aXU-Bz4H.md
│ │ │ │ │ ├── transactional-operations@rxxibrJUo1rQ3XCuUIP59.md
│ │ │ │ │ ├── tunnels@8WZpSKBHCeYfTEL9tBNKr.md
│ │ │ │ │ ├── typescript-fundamentals@zR84MFLL6y0dygz9hXXPA.md
│ │ │ │ │ ├── understand-serverless-architecture@Isl5anwDvb1MacA-JH4ej.md
│ │ │ │ │ ├── vector-embeddings@UIWaR1ZdjSm0UAS69Kz_5.md
│ │ │ │ │ ├── vectorize@NWGVtH1vxQuO4lly0Omuy.md
│ │ │ │ │ ├── video-delivery@zQp7XfDKWJgMf2LexRJhN.md
│ │ │ │ │ ├── video-processing@3B6Z7F0D3Sf8ZBlV3kkGx.md
│ │ │ │ │ ├── web-security-headers@KWix4jeNUKJ07Iu95Mqj_.md
│ │ │ │ │ ├── webhook-handling@uOUjI6CPrhZIlz6mRCtOW.md
│ │ │ │ │ ├── workers-ai@a0S0_JLwLLNGLUAHrqG4P.md
│ │ │ │ │ ├── workers-kv@1dGFfQauOgHP7T4ReMpCU.md
│ │ │ │ │ ├── workers-lifecycle@i6L9FI6fBDXr0XtMrc_uR.md
│ │ │ │ │ ├── workers-runtime-environment@TB6vGzDgGZ9yAd9MGR7vw.md
│ │ │ │ │ ├── workers-security-model@8IF7jftushwZrn7JXpC_v.md
│ │ │ │ │ ├── workflows@rAl7zXcODiqIpS__3qf1A.md
│ │ │ │ │ ├── wrangler@Tzx93tvoGrc9_fKQqkorN.md
│ │ │ │ │ └── wrangler@n0vIbHmUZHrF4WjEhYdb8.md
│ │ │ │ └── faqs.astro
│ │ │ ├── code-review/
│ │ │ │ ├── code-review.json
│ │ │ │ ├── code-review.md
│ │ │ │ ├── content/
│ │ │ │ │ ├── api-semantics.md
│ │ │ │ │ ├── code-style.md
│ │ │ │ │ ├── documentation.md
│ │ │ │ │ ├── implementation-semantics.md
│ │ │ │ │ ├── index.md
│ │ │ │ │ └── tests.md
│ │ │ │ └── faqs.astro
│ │ │ ├── computer-science/
│ │ │ │ ├── computer-science.json
│ │ │ │ ├── computer-science.md
│ │ │ │ ├── content/
│ │ │ │ │ ├── 2-3-4-trees@IaPd_zuLbiOCwoSHQLoIG.md
│ │ │ │ │ ├── 2-3-search-trees@3jiV9R82qxpqIGfpEq_wK.md
│ │ │ │ │ ├── a-algorithm@Yrk2PLUa-_FAPlhCkMl3e.md
│ │ │ │ │ ├── acid-model@W5B-v-BFcCRmuN0L1m6PI.md
│ │ │ │ │ ├── activity-diagrams@ptfRNiU0mC0Q5SLA_FWZu.md
│ │ │ │ │ ├── adjacency-list@rTnKJcPniUtqvfOyC88N0.md
│ │ │ │ │ ├── adjacency-matrix@HZ1kk0TQ13FLC9t13BZl5.md
│ │ │ │ │ ├── architectural-patterns@BGhJNtszbYJtKyhqr2jax.md
│ │ │ │ │ ├── architectural-styles@X1wv7xV69IEzepg8bF8oZ.md
│ │ │ │ │ ├── array@TwW6SO2IXqkxJXVjLzdwU.md
│ │ │ │ │ ├── ascii@hmwsNp60alS43kJg4A_Og.md
│ │ │ │ │ ├── asymptotic-notation@UpBrpmrUwYUB9eesNxCq5.md
│ │ │ │ │ ├── avl-trees@OUistS7H7hQQxVV-lOg39.md
│ │ │ │ │ ├── b-tree@s0Pi6CemUUsmZSEu2j2gH.md
│ │ │ │ │ ├── balanced-search-trees@7DF3UhefOSqqTuccH8c8X.md
│ │ │ │ │ ├── balanced-tree@ZaWGLvZyu4sIPn-zwVISN.md
│ │ │ │ │ ├── base@q3nRhTYS5wg9tYnQe2sCF.md
│ │ │ │ │ ├── basic-math-skills@cdNi0EYrQ5nsgNxFVnXL8.md
│ │ │ │ │ ├── bellman-fords-algorithm@eY4nK2lPYsrR-a_8y2sao.md
│ │ │ │ │ ├── big-endian@U8AgY6I-62mN5Ohg9MsG6.md
│ │ │ │ │ ├── big-o@c-NrTtJuNihbHzyPEOKTW.md
│ │ │ │ │ ├── big-omega@X33735aeAVSlJ6yv9GS-h.md
│ │ │ │ │ ├── big-theta@ThLpVZQIJ4diY5m0dik8m.md
│ │ │ │ │ ├── binary-search-tree@et7l85gnxjvzD2tDyHT_T.md
│ │ │ │ │ ├── binary-search@8kTg4O9MrTHRUrp6U-ctA.md
│ │ │ │ │ ├── binary-tree@G9dnegZ6zNvxrCZ3O_b_z.md
│ │ │ │ │ ├── bitwise-operators@hTPLcuOW7eEE5oYhNfmOG.md
│ │ │ │ │ ├── boyer-moore@p6qub32jcaGloHXUDUrlG.md
│ │ │ │ │ ├── breadth-first-search@Ke_ch4fnuKIiGAXUM_LPP.md
│ │ │ │ │ ├── breadth-first-search@vcV6TEM_PqXxtThdfMKGw.md
│ │ │ │ │ ├── brute-force-search@g3b0kt1fCAjjYyS2WelWi.md
│ │ │ │ │ ├── bubble-sort@4wGBYFZpcdTt97WTbSazx.md
│ │ │ │ │ ├── c@1kQJs-3Aw8Bi7d_Xh67zS.md
│ │ │ │ │ ├── c@jHKCLfLml8oZyj4829gx0.md
│ │ │ │ │ ├── c@n4IsklfYJXFIyF1rGWuEa.md
│ │ │ │ │ ├── caching@4u5w9QCptLWuY9O7_UU8V.md
│ │ │ │ │ ├── cap-theorem@GZI8EsEqiMJX3fSbO_E-7.md
│ │ │ │ │ ├── cap-theorem@uqfeiQ9K--QkGNwks4kjk.md
│ │ │ │ │ ├── cdn@r8V9bZpc98SrLvXc070bZ.md
│ │ │ │ │ ├── character-encodings@DtG9EJonWi4_2oQ4fWOKY.md
│ │ │ │ │ ├── class-diagrams@FZ8znJSz8PvQlnEyRLXmQ.md
│ │ │ │ │ ├── cloud-design-patterns@YMO9oD_sbzyDZPNU2xZwe.md
│ │ │ │ │ ├── clustering@wAsZ-M5N9ERufQnBaXbAE.md
│ │ │ │ │ ├── co-np@pLBfkzi0qfgVRqi_4AmMI.md
│ │ │ │ │ ├── combinatorics@lWnAY0DgrUOmT6yqnxeBN.md
│ │ │ │ │ ├── common-algorithms@7a6-AnBI-3tAU1dkOvPkx.md
│ │ │ │ │ ├── common-uml-diagrams@DMuMsEowpevTCALtziwTB.md
│ │ │ │ │ ├── complete-binary-tree@Jx1WWCjm8jkfAGtHv15n1.md
│ │ │ │ │ ├── complexity-classes@YLCmZvoLkhOk9wlgYW2Ms.md
│ │ │ │ │ ├── concurrency-in-multiple-cores@xUo5Ox_HTgGyeQMDIkVyK.md
│ │ │ │ │ ├── constant@3F_QBv_sU39ehOxpurF88.md
│ │ │ │ │ ├── cpu-cache@DjTQjMbika4_yTzrBpcmB.md
│ │ │ │ │ ├── cpu-interrupts@cpQvB0qMDL3-NWret7oeA.md
│ │ │ │ │ ├── data-structures@NM7q5REW1sJgMhxJhPpLT.md
│ │ │ │ │ ├── database-federation@3r21avMlo0xFB9i7PHccX.md
│ │ │ │ │ ├── databases@zvlTQ0A-My4QDrslp_lru.md
│ │ │ │ │ ├── dcl@4bUmfuP2qgcli8I2Vm9zh.md
│ │ │ │ │ ├── ddl@ii1vF74u3yrFNlw_21b3B.md
│ │ │ │ │ ├── dependency-injection@J7DKRklMtJ94Y-18Jo50r.md
│ │ │ │ │ ├── depth-first-search@Yf5gOIe7oiL19MjEVcpdw.md
│ │ │ │ │ ├── depth-first-search@chzP5_t2gMi6MstxEzCi5.md
│ │ │ │ │ ├── design-patterns@-De1hU2ONGwhQmUpsyrCO.md
│ │ │ │ │ ├── dijkstras-algorithm@l3X9UrEYTWs5kBXI1NNCf.md
│ │ │ │ │ ├── dijkstras-algorithm@oJstm-8c-4seWbIWcNgDv.md
│ │ │ │ │ ├── directed-graph@6Jy8SXHuYA08h9iLjKFWR.md
│ │ │ │ │ ├── dml@tcQSH-eAvJUZuePTDjAIb.md
│ │ │ │ │ ├── dns@fYjoXB4rnkM5gg46sqVz5.md
│ │ │ │ │ ├── dql@05lkb3B86Won7Rkf-8DeD.md
│ │ │ │ │ ├── endianess@vjMqqFsTxSjaiYxmliwLi.md
│ │ │ │ │ ├── entity-relationship-model@XnxxEmr2TyW2kOpB4gtR5.md
│ │ │ │ │ ├── exponential@5mMLr6tWbiSZuox1lx0_B.md
│ │ │ │ │ ├── factorial@m0umGQNdvg95UiNpQZsQN.md
│ │ │ │ │ ├── finding-hamiltonian-paths@aBjBHpq_OajgQjxdCobXD.md
│ │ │ │ │ ├── floating-point-math@-bawIWfrYuAxy8cP-AGFS.md
│ │ │ │ │ ├── ford-fulkerson-algorithm@Hqw2eGtgfbVggqXBnIOdI.md
│ │ │ │ │ ├── full-binary-tree@Q8ZJNeTbc22Q08Mra-McY.md
│ │ │ │ │ ├── go@mWW88VnkqWgDz02qw5zU-.md
│ │ │ │ │ ├── gof-design-patterns@iPN9mSyFwYZER5HSkj6oL.md
│ │ │ │ │ ├── graph@vQm046o6ozcvLoqg9L6eL.md
│ │ │ │ │ ├── graphql@DeE_dZecLmKCjePovTfFS.md
│ │ │ │ │ ├── grpc@M4vdwAbjLPrLjWUsG_P1I.md
│ │ │ │ │ ├── hash-table@G2dN2FO0SN_I-5AhO_EUk.md
│ │ │ │ │ ├── hashing--encryption--encoding@7r7o8pYhFHVAJIv0wNT6X.md
│ │ │ │ │ ├── hashing-algorithms@EX_e4B6G07zTb4JjJ7482.md
│ │ │ │ │ ├── heap-sort@CovrRsBY-sYW_xSegcN6N.md
│ │ │ │ │ ├── heap@pw3ZCC3HKU7D5SQwte4vE.md
│ │ │ │ │ ├── horizontal-vs-vertical-scaling@-34WGppX6QC5fkCvfCghp.md
│ │ │ │ │ ├── how-computers-calculate@GDLKJkKgB-i7n0YcV2NDa.md
│ │ │ │ │ ├── how-computers-work@-emdKpD5uRNuvem5rbFXJ.md
│ │ │ │ │ ├── how-cpu-executes-programs@1eglba39q426Nh0E0qcdj.md
│ │ │ │ │ ├── http@2tUwl-br-SRuwADSzmQag.md
│ │ │ │ │ ├── huffman-coding@QrcijPiVT3bgqfkF-6ssi.md
│ │ │ │ │ ├── in-order-traversal@KTrgf14Q6rg2f0v4dqq2s.md
│ │ │ │ │ ├── indexes@BEbsUA39kZ5itqCwD585f.md
│ │ │ │ │ ├── insertion-sort@ujDCW6zZE8dV_fpNf-oIl.md
│ │ │ │ │ ├── instructions-and-programs@AxiGqbteK7ZSXEUt_zckH.md
│ │ │ │ │ ├── java@1lQSUFrrIGq19nUnM92-I.md
│ │ │ │ │ ├── k-ary--m-ary-tree@UOYeM-hqIKCrB9hGez4Q_.md
│ │ │ │ │ ├── k-d-trees@C1eNsPjiQo8INbvL2Lt7L.md
│ │ │ │ │ ├── knapsack-problem@yHeCRPhfAOWiggZeUHPU9.md
│ │ │ │ │ ├── knuth-morris-pratt@8abFKMfaV9H8F38I0DcMT.md
│ │ │ │ │ ├── kruskals-algorithm@Wqhg7E-lOz1oNcRXjUej8.md
│ │ │ │ │ ├── lfu-cache@n11ujPI3of-52l2KW2CDQ.md
│ │ │ │ │ ├── linear-search@XwyqBK9rgP1MMcJrdIzm5.md
│ │ │ │ │ ├── linear@jymhjv8GiFALQpox6aZeu.md
│ │ │ │ │ ├── linked-list@gr8BK6vq4AVwp_aUozZmf.md
│ │ │ │ │ ├── little-endian@rD_5n5bjiNMVC0cPhEVyG.md
│ │ │ │ │ ├── load-balancing@xDiS0HmrEoPjkQg9x2O3o.md
│ │ │ │ │ ├── lock--mutex--semaphore@O6-vG3FuoYet4D0hbiyrv.md
│ │ │ │ │ ├── locking@_sm63rZNKoibVndeNgOpW.md
│ │ │ │ │ ├── logarithmic@nnlMNkQn1HU4U9yPbV9kQ.md
│ │ │ │ │ ├── long-polling@XeJi6TwpI5Uaszj00Uv_2.md
│ │ │ │ │ ├── longest-path-problem@4QVVYjDODMWsjnrE-4UBs.md
│ │ │ │ │ ├── lru-cache@cEsboPT8nLvo0Zt0_oBq6.md
│ │ │ │ │ ├── maze-solving-problem@nODFT-i2YsxUVsgwWkIWn.md
│ │ │ │ │ ├── memory-management@jVsZFTzyrYEDyR8LiBQL0.md
│ │ │ │ │ ├── merge-sort@Bh-whDbcCjl3m6mRm9w02.md
│ │ │ │ │ ├── mfu-cache@hna0HLu0l4NTNNpyGqlW5.md
│ │ │ │ │ ├── networking@zG5t3HqbZnh9CGRqp1Sb-.md
│ │ │ │ │ ├── non-tail-recursion@iLEOuQgUgU5Jc38iXDpp5.md
│ │ │ │ │ ├── normalization--denormalization@Rw7QjLC8hLtXSwmU_9kHC.md
│ │ │ │ │ ├── np-complete@Lwkz7qozXRlVNA20zJbSw.md
│ │ │ │ │ ├── np-hard@mJJ8DGUpBuHEJ7I6UTy1T.md
│ │ │ │ │ ├── np@ewXUHpOnjm8YrLhce1dAQ.md
│ │ │ │ │ ├── null-object-pattern@PpFQ0zmObZLvmBvqhTEMz.md
│ │ │ │ │ ├── osi-model@pZ5x_zDYGzW9VxYycyXtN.md
│ │ │ │ │ ├── owasp-top-10@3rPSp135TdSCyvXzEzn4p.md
│ │ │ │ │ ├── p--np@0btHNkzWL1w_-pUgU_k2y.md
│ │ │ │ │ ├── p@3aM17dPKNi8tRJsW8lesI.md
│ │ │ │ │ ├── pacelc@g6HeyLptaAYx9QBKuHQyM.md
│ │ │ │ │ ├── pick-a-language@tU4Umtnfu01t9gLlnlK6b.md
│ │ │ │ │ ├── polynomial@sVFvpsAO1_ZH9aliEj9aF.md
│ │ │ │ │ ├── post-order-traversal@4_oGXwjzSY5cX9n7L4iAA.md
│ │ │ │ │ ├── pre-order-traversal@psTN5N66xoFHFopgd5faW.md
│ │ │ │ │ ├── prims-algorithm@znpFIKwMJlepKJ8dH3kvC.md
│ │ │ │ │ ├── probability@HZ3_xyphbjhBPwwQo_rHH.md
│ │ │ │ │ ├── process-forking@RbdT5MOE4L-E7PPWKRITX.md
│ │ │ │ │ ├── processes-and-threads@ETEUA7jaEGyOEX8tAVNWs.md
│ │ │ │ │ ├── processes-vs-threads@IEX6v_MYpE5Ylk_28K2ZU.md
│ │ │ │ │ ├── proxy@qLLJ_ehC8tSRfXsorYMQz.md
│ │ │ │ │ ├── public-key-cryptography@bDZ34BPm3lX06ERSE10cY.md
│ │ │ │ │ ├── python@RlKZzs44biQPgxD0tK1qx.md
│ │ │ │ │ ├── queue@JI990pDX2jjNe6IH_Y_t0.md
│ │ │ │ │ ├── queues@LCPEzpyAuHY3ggN3nYrNN.md
│ │ │ │ │ ├── quick-sort@be0Q8GW9ZX1JbPrBvbMji.md
│ │ │ │ │ ├── rabin-karp-algorithm@l5--4opvZoc_seVn__5R3.md
│ │ │ │ │ ├── red--black-trees@eOL0_SzxBn7_xhNcBDi2D.md
│ │ │ │ │ ├── registers-and-ram@U3379F4AO1KSmGtVmPr27.md
│ │ │ │ │ ├── replication@WUEmEtlszbISSIWDKpvg6.md
│ │ │ │ │ ├── rest@Kvz3Sn7L8CxP5ZXO1hlcU.md
│ │ │ │ │ ├── robin-karp@Km5LvcJpyntrW2iA8h5e3.md
│ │ │ │ │ ├── rust@1bDjg-KBDKRmE6f1MWY8l.md
│ │ │ │ │ ├── scheduling-algorithms@Ge2nagN86ofa2y-yYR1lv.md
│ │ │ │ │ ├── search-pattern-in-text@L4M5yFRKKR2axKXGcIA7d.md
│ │ │ │ │ ├── security@JnJbJtsqKbVETY2vdLqCO.md
│ │ │ │ │ ├── selection-sort@rOsHFXQm5jNz0RyZQ5ZGs.md
│ │ │ │ │ ├── sequence-diagrams@gaUT5K2xS-WQMrIA0Bkb_.md
│ │ │ │ │ ├── sharding@3K65efPag2076dy-MeTg4.md
│ │ │ │ │ ├── short-polling@gGmNJ8dK28iqrlQHPz6md.md
│ │ │ │ │ ├── skip-lists@K96ggeWqd5OwoNnkL04pc.md
│ │ │ │ │ ├── small-o@2cg5PogENPhiYFXQnV9xC.md
│ │ │ │ │ ├── small-omega@dUBRG_5aUYlICsjPbRlTf.md
│ │ │ │ │ ├── sockets@u-c-UFegRb7xqsmvj9gVb.md
│ │ │ │ │ ├── solving-n-queen-problem@HlAmTY1udqDT2mTfBU9P-.md
│ │ │ │ │ ├── spanning-tree@L4xtWOdqGUf4SbJkoOsNM.md
│ │ │ │ │ ├── sql-vs-nosql-databases@nprZscHdC_RdRIcGeGyVk.md
│ │ │ │ │ ├── sse@JckRqZA8C6IqQLPpTCgf4.md
│ │ │ │ │ ├── stack@hJB5gO9tosRlC4UmdSNzl.md
│ │ │ │ │ ├── statemachine-diagrams@X0CKM9LaJUrgI5gIdqFvU.md
│ │ │ │ │ ├── stored-procedures@FjhZGhzJjYyDn0PShKmpX.md
│ │ │ │ │ ├── string-search--manipulations@NUWk-7IXmMU-4TT-oS8fF.md
│ │ │ │ │ ├── substring-search@E9hf1ux1KKGHvvAShm67w.md
│ │ │ │ │ ├── suffix-arrays@Ld1TUNS8713coMNvwhNIJ.md
│ │ │ │ │ ├── system-design@w-fvEiSJysywR3AOAB0ve.md
│ │ │ │ │ ├── tail-recursion@0_qNhprnXU3i8koW3XTdD.md
│ │ │ │ │ ├── tcpip-model@Fed5y1D95WPpqoVg7kmob.md
│ │ │ │ │ ├── the-knights-tour-problem@NcKW_3vJWL_rVlDBB_Qjs.md
│ │ │ │ │ ├── tls--https@3pu2bGhoCLFIs6kNanwtz.md
│ │ │ │ │ ├── transactions@KhvYJtSCUBOpEZXjHpQde.md
│ │ │ │ │ ├── travelling-salesman-problem@ZG-hWjVoS3p9XfrtBL0sD.md
│ │ │ │ │ ├── tree@_eWqiWUmOj0zUo_Ix3j1O.md
│ │ │ │ │ ├── trees@IaPd_zuLbiOCwoSHQLoIG.md
│ │ │ │ │ ├── tries@4qUVacMEz3XFiL_dMre6P.md
│ │ │ │ │ ├── type-object-pattern@_2Jddpz_cdwyeIgrg5qt_.md
│ │ │ │ │ ├── unbalanced-tree@w4sxmZR1BjX6wlrZmuOlf.md
│ │ │ │ │ ├── undirected-graph@QGx8it2N_85PiPVjpTGK_.md
│ │ │ │ │ ├── unicode@04hpfxI2x958tQI-0clsp.md
│ │ │ │ │ ├── usecase-diagrams@dVvYbrcaxHLpvtX6HbS7g.md
│ │ │ │ │ ├── views@lOj_ReWI1kQ3WajJZYOWU.md
│ │ │ │ │ └── web-sockets@bVjI14VismTHNCyA0mEBP.md
│ │ │ │ ├── faqs.astro
│ │ │ │ └── migration-mapping.json
│ │ │ ├── cpp/
│ │ │ │ ├── content/
│ │ │ │ │ ├── access-violations@y4-P4UNC--rE1vni8HdTn.md
│ │ │ │ │ ├── algorithms@whyj6Z4RXFsVQYRfYYn7B.md
│ │ │ │ │ ├── argument-dependent-lookup-adl@YSWN7nS8vA9nMldSUrZRT.md
│ │ │ │ │ ├── arithmetic-operators@8aOSpZLWwZv_BEYiurhyR.md
│ │ │ │ │ ├── auto-automatic-type-deduction@CG01PTVgHtjfKvsJkJLGl.md
│ │ │ │ │ ├── basic-operations@kl2JI_Wl47c5r8SYzxvCq.md
│ │ │ │ │ ├── bitwise-operators@zE4iPSq2KsrDSByQ0sGK_.md
│ │ │ │ │ ├── boost@1d7h5P1Q0RVHryKPVogQy.md
│ │ │ │ │ ├── build-systems@jVXFCo6puMxJ_ifn_uwim.md
│ │ │ │ │ ├── c-0x@PPg0V5EzGBeJsysg1215V.md
│ │ │ │ │ ├── c-11--14@T6rCTv9Dxkm-tEA-l9XEv.md
│ │ │ │ │ ├── c-17@R2-qWGUxsTOeSHRuUzhd2.md
│ │ │ │ │ ├── c-20@o3no4a5_iMFzEAGs56-BJ.md
│ │ │ │ │ ├── c-23@sxbbKtg7kMNbkx7fXhjR9.md
│ │ │ │ │ ├── c-vs-c@2Ag0t3LPryTF8khHLRfy-.md
│ │ │ │ │ ├── catch2@s13jQuaC6gw0Lab3Cbyy6.md
│ │ │ │ │ ├── cmake@ysnXvSHGBMMozBJyXpHl5.md
│ │ │ │ │ ├── code-editors--ides@ew0AfyadpXPRO0ZY3Z19k.md
│ │ │ │ │ ├── compiler-stages@DVckzBUMgk_lWThVkLyAT.md
│ │ │ │ │ ├── compilers-and-features@hSG6Aux39X0cXi6ADy2al.md
│ │ │ │ │ ├── compilers@FTMHsUiE8isD_OVZr62Xc.md
│ │ │ │ │ ├── conan@ky_UqizToTZHC_b77qFi2.md
│ │ │ │ │ ├── const_cast@5g22glc97siQOcTkHbwan.md
│ │ │ │ │ ├── containers@1pydf-SR0QUfVNuBEyvzc.md
│ │ │ │ │ ├── control-flow--statements@s5Gs4yF9TPh-psYmtPzks.md
│ │ │ │ │ ├── copy-and-swap@lxAzI42jQdaofzQ5MXebG.md
│ │ │ │ │ ├── copy-on-write@O2Du5gHHxFxAI2u5uO8wu.md
│ │ │ │ │ ├── crtp@ttt-yeIi4BPWrgvW324W7.md
│ │ │ │ │ ├── data-types@MwznA4qfpNlv6sqSNjPZi.md
│ │ │ │ │ ├── date--time@yGvE6eHKlPMBB6rde0llR.md
│ │ │ │ │ ├── debuggers@qmHs6_BzND_xpMmls5YUH.md
│ │ │ │ │ ├── debugging-symbols@sR_FxGZHoMCV9Iv7z2_SX.md
│ │ │ │ │ ├── diamond-inheritance@ofwdZm05AUqCIWmfgGHk8.md
│ │ │ │ │ ├── dynamic-polymorphism@7h1VivjCPDwriL7FirtFv.md
│ │ │ │ │ ├── dynamic-typing@i0EAFEUB-F0wBJWOtrl1A.md
│ │ │ │ │ ├── dynamic_cast@4BdFcuQ5KNW94cu2jz-vE.md
│ │ │ │ │ ├── erase-remove@YvmjrZSAOmjhVPo05MJqN.md
│ │ │ │ │ ├── exception-handling@B2SGBENzUMl0SAjG4j91V.md
│ │ │ │ │ ├── exceptions@NJud5SXBAUZ6Sr78kZ7jx.md
│ │ │ │ │ ├── exit-codes@oWygnpwHq2poXQMTTSCpl.md
│ │ │ │ │ ├── fmt@1CqQgmHDeo1HlPdpUJS7H.md
│ │ │ │ │ ├── for--while--do-while-loops@_IP_e1K9LhNHilYTDh7L5.md
│ │ │ │ │ ├── forward-declaration@ZHjU60uzJTezADRhDTESG.md
│ │ │ │ │ ├── full-template-specialization@6hTcmJwNnQstbWWzNCfTe.md
│ │ │ │ │ ├── function-overloading@sgfqb22sdN4VRJYkhAVaf.md
│ │ │ │ │ ├── functions@oYi3YOc1GC2Nfp71VOkJt.md
│ │ │ │ │ ├── gdb@BmWsoL9c_Aag5nVlMsKm2.md
│ │ │ │ │ ├── grpc@621J9W4xCofumNZGo4TZT.md
│ │ │ │ │ ├── gtest--gmock@MrAM-viRaF8DSxB6sVdD9.md
│ │ │ │ │ ├── headers--cpp-files@CK7yf8Bo7kfbV6x2tZTrh.md
│ │ │ │ │ ├── idioms@fb3bnfKXjSIjPAk4b95lg.md
│ │ │ │ │ ├── if-else--switch--goto@bjpFWxiCKGz28E-ukhZBp.md
│ │ │ │ │ ├── installing-c@0J_ltQEJh2g28OE2ZEYJj.md
│ │ │ │ │ ├── introduction-to-language@NvODRFR0DLINB0RlPSsvt.md
│ │ │ │ │ ├── iostream@VeVxZ230xkesQsIDig8zQ.md
│ │ │ │ │ ├── iterators@Ebu8gzbyyXEeJryeE0SpG.md
│ │ │ │ │ ├── lambdas@xjiFBVe-VGqCqWfkPVGKf.md
│ │ │ │ │ ├── language-concepts@-6fwJQOfsorgHkoQGp4T3.md
│ │ │ │ │ ├── language-tools@Kb2Pbz0Sq7YlO1vCwYxnX.md
│ │ │ │ │ ├── library-inclusion@5mNqH_AEiLxUmgurNW1Fq.md
│ │ │ │ │ ├── licensing@sLVs95EOeHZldoKY0L_dH.md
│ │ │ │ │ ├── lifetime-of-objects@9aA_-IfQ9WmbPgwic0mFN.md
│ │ │ │ │ ├── logical-operators@Y9gq8WkDA_XGe68JkY2UZ.md
│ │ │ │ │ ├── macros@zKdlfZTRHwjtmRUGW9z9-.md
│ │ │ │ │ ├── makefile@t6rZLH7l8JQm99ax_fEJ9.md
│ │ │ │ │ ├── memory-leakage@6w0WExQ4lGIGgok6Thq0s.md
│ │ │ │ │ ├── memory-model@mSFwsTYvmg-GwG4_DEIEf.md
│ │ │ │ │ ├── multiple-inheritance@WjHpueZDK-d3oDNMVZi9w.md
│ │ │ │ │ ├── multithreading@OXQUPqxzs1-giAACwl3X1.md
│ │ │ │ │ ├── name-mangling@Lt7ss59KZw9Jwqj234jm2.md
│ │ │ │ │ ├── namespaces@iIdC7V8sojwyEqK1xMuHn.md
│ │ │ │ │ ├── newdelete-operators@Gld0nRs0sM8kRe8XmYolu.md
│ │ │ │ │ ├── newest@sxbbKtg7kMNbkx7fXhjR9.md
│ │ │ │ │ ├── ninja@HkUCD5A_M9bJxJRElkK0x.md
│ │ │ │ │ ├── non-copyable--non-moveable@xjUaIp8gGxkN-cp8emJ2M.md
│ │ │ │ │ ├── nuget@g0s0F4mLV16eNvMBflN2e.md
│ │ │ │ │ ├── object-oriented-programming@b3-QYKNcW3LYCNOza3Olf.md
│ │ │ │ │ ├── opencl@GGZJaYpRENaqloJzt0VtY.md
│ │ │ │ │ ├── opencv@Eq3TKSFJ2F2mrTHAaU2J4.md
│ │ │ │ │ ├── operator-overloading@llCBeut_uc9IAe2oi4KZ9.md
│ │ │ │ │ ├── orbit-profiler@O0lVEMTAV1pq9sYCKQvh_.md
│ │ │ │ │ ├── package-managers@h29eJG1hWHa7vMhSqtfV2.md
│ │ │ │ │ ├── partial-template-specialization@1NYJtbdcdOB4-vIrnq4yX.md
│ │ │ │ │ ├── pimpl@MEoWt8NKjPLVTeGgYf3cR.md
│ │ │ │ │ ├── poco@nOkniNXfXwPPlOEJHJoGl.md
│ │ │ │ │ ├── pointers-and-references@DWw8NxkLpIpiOSUaZZ1oA.md
│ │ │ │ │ ├── protobuf@jpMCIWQko7p3ndezYHL4D.md
│ │ │ │ │ ├── pybind11@tEkvlJPAkD5fji-MMODL7.md
│ │ │ │ │ ├── pytorch-c@88pr5aN7cctZfDVVo-2ns.md
│ │ │ │ │ ├── qt@gAZ9Dqgj1_UkaLzVgzx1t.md
│ │ │ │ │ ├── raii@OmHDlLxCnH8RDdu5vx9fl.md
│ │ │ │ │ ├── ranges_v3@et-dXKPYuyVW6eV2K3CM8.md
│ │ │ │ │ ├── raw-pointers@uEGEmbxegATIrvGfobJb9.md
│ │ │ │ │ ├── references@uUzRKa9wGzdUwwmAg3FWr.md
│ │ │ │ │ ├── reinterpret_cast@ZMyFDJrpCauGrY5NZkOwg.md
│ │ │ │ │ ├── rtti@r0yD1gfn03wTpEBi6zNsu.md
│ │ │ │ │ ├── rule-of-zero-five-three@7sdEzZCIoarzznwO4XcCv.md
│ │ │ │ │ ├── running-your-first-program@SEq0D2Zg5WTsIDtd1hW9f.md
│ │ │ │ │ ├── scope@dKCYmxDNZubCVcR5rf8b-.md
│ │ │ │ │ ├── setting-up-your-environment@Zc_TTzmM36yWsu3GvOy9x.md
│ │ │ │ │ ├── sfinae@3C5UfejDX-1Z8ZF6C53xD.md
│ │ │ │ │ ├── shared_ptr@b5jZIZD_U_CPg-_bdndjz.md
│ │ │ │ │ ├── smart-pointers@ulvwm4rRPgkpgaqGgyH5a.md
│ │ │ │ │ ├── spack@3ehBc2sKVlPj7dn4RVZCH.md
│ │ │ │ │ ├── spdlog@q64qFxoCrR38RPsN2lC8x.md
│ │ │ │ │ ├── standard-library--stl@DHdNBP7_ixjr6h-dIQ7g6.md
│ │ │ │ │ ├── standards@vvE1aUsWbF1OFcmMUHbJa.md
│ │ │ │ │ ├── static-polymorphism@obZIxRp0eMWdG7gplNIBc.md
│ │ │ │ │ ├── static-typing@f1djN0GxoeVPr_0cl6vMq.md
│ │ │ │ │ ├── static_cast@_XB2Imyf23-6AOeoNLhYQ.md
│ │ │ │ │ ├── structures-and-classes@CMlWNQwpywNhO9B6Yj6Me.md
│ │ │ │ │ ├── structuring-codebase@Zw2AOTK5uc9BoKEpY7W1C.md
│ │ │ │ │ ├── template-specialization@sObOuccY0PDeGG-9GrFDF.md
│ │ │ │ │ ├── templates@-6AOrbuOE7DJCmxlcgCay.md
│ │ │ │ │ ├── tensorflow@j_eNHhs0J08Dt7HVbo4Q2.md
│ │ │ │ │ ├── type-casting@PiMhw1oP9-NZEa6I9u4lX.md
│ │ │ │ │ ├── type-traits@WptReUOwVth3C9-AVmMHF.md
│ │ │ │ │ ├── undefined-behavior-ub@IDOlquv6jlfecwQoBwkGZ.md
│ │ │ │ │ ├── understanding-debugger-messages@VtPb8-AJKzhTB0QbMtoU4.md
│ │ │ │ │ ├── unique_ptr@k9c5seRkhgm_yHPpiz2X0.md
│ │ │ │ │ ├── variadic-templates@w4EIf58KP-Pq-yc0HlGxc.md
│ │ │ │ │ ├── vcpkg@PKG5pACLfRS2ogfzBX47_.md
│ │ │ │ │ ├── virtual-methods@hNBErGNiegLsUJn_vgcOR.md
│ │ │ │ │ ├── virtual-tables@s99ImazcwCgAESxZd8ksa.md
│ │ │ │ │ ├── weak_ptr@vUwSS-uX36OWZouO0wOcy.md
│ │ │ │ │ ├── what-is-c@x_28LiDVshqWns_aIBsdx.md
│ │ │ │ │ ├── why-use-c@tl6VCQ5IEGDVyFcgj7jDm.md
│ │ │ │ │ ├── windbg@y8VCbGDUco9bzGRfIBD8R.md
│ │ │ │ │ └── working-with-libraries@4kkX5g_-plX9zVqr0ZoiR.md
│ │ │ │ ├── cpp.json
│ │ │ │ ├── cpp.md
│ │ │ │ ├── faqs.astro
│ │ │ │ └── migration-mapping.json
│ │ │ ├── css/
│ │ │ │ ├── content/
│ │ │ │ │ ├── absolute-vs-relative@l7bBJLtKWkrzSfSPkZlBI.md
│ │ │ │ │ ├── absolute@7LhPT3h-BEdHSF2iOevVl.md
│ │ │ │ │ ├── accessibility@LDIZoK-XgmwqPdLH01vC5.md
│ │ │ │ │ ├── attribute-selectors@m6KQMN1XWo4uWqs2F3KXH.md
│ │ │ │ │ ├── background-attachment@6i0Zl05VMzUsh47cuUH4-.md
│ │ │ │ │ ├── background-color@ATd9RE303X79aAmqvwS08.md
│ │ │ │ │ ├── background-gradient@_9QA5_mLJ8_eiQN0ucIkQ.md
│ │ │ │ │ ├── background-image@d-rp-EHKyHnzuIHWHOc7C.md
│ │ │ │ │ ├── background-position@BBpeQcb7Y21C7-r3PFIMW.md
│ │ │ │ │ ├── background@RqyaHX4Krk9e-6Eq9FHnS.md
│
================================================
FILE CONTENTS
================================================
================================================
FILE: .cursor/rules/content-migration.mdc
================================================
---
description: When user requests migrating old roadmap content to new folder from content-old to content folder
globs:
alwaysApply: false
---
# Content Migration Rule
## Rule Name: content-migration
## Description
This rule provides a complete process for migrating roadmap content from old structure to new structure using migration mapping files.
## When to Use
Use this rule when you need to:
- Migrate content from content-old directories to content directories
- Use a migration-mapping.json file to map topic paths to content IDs
- Populate empty content files with existing content from legacy structure
## Process
### 1. Prerequisites Check
- Verify the roadmap directory has a `migration-mapping.json` file
- Confirm `content-old/` directory exists with source content
- Confirm `content/` directory exists with target files
### 2. Migration Script Creation
Create a Node.js script with the following functionality:
```javascript
const fs = require('fs');
const path = require('path');
// Load the migration mapping
const migrationMapping = JSON.parse(fs.readFileSync('migration-mapping.json', 'utf8'));
// Function to find old content file based on topic path
function findOldContentFile(topicPath) {
const parts = topicPath.split(':');
if (parts.length === 1) {
// Top level file like "introduction"
return path.join('content-old', parts[0], 'index.md');
} else if (parts.length === 2) {
// Like "introduction:what-is-rust"
const [folder, filename] = parts;
return path.join('content-old', folder, `${filename}.md`);
} else if (parts.length === 3) {
// Like "language-basics:syntax:variables"
const [folder, subfolder, filename] = parts;
return path.join('content-old', folder, subfolder, `${filename}.md`);
}
return null;
}
// Function to find new content file based on content ID
function findNewContentFile(contentId) {
const contentDir = 'content';
const files = fs.readdirSync(contentDir);
// Find file that ends with the content ID
const matchingFile = files.find(file => file.includes(`@${contentId}.md`));
if (matchingFile) {
return path.join(contentDir, matchingFile);
}
return null;
}
// Process each mapping
console.log('Starting content migration...\n');
let migratedCount = 0;
let skippedCount = 0;
for (const [topicPath, contentId] of Object.entries(migrationMapping)) {
const oldFilePath = findOldContentFile(topicPath);
const newFilePath = findNewContentFile(contentId);
if (!oldFilePath) {
console.log(`❌ Could not determine old file path for: ${topicPath}`);
skippedCount++;
continue;
}
if (!newFilePath) {
console.log(`❌ Could not find new file for content ID: ${contentId} (topic: ${topicPath})`);
skippedCount++;
continue;
}
if (!fs.existsSync(oldFilePath)) {
console.log(`❌ Old file does not exist: ${oldFilePath} (topic: ${topicPath})`);
skippedCount++;
continue;
}
try {
// Read old content
const oldContent = fs.readFileSync(oldFilePath, 'utf8');
// Write to new file
fs.writeFileSync(newFilePath, oldContent);
console.log(`✅ Migrated: ${topicPath} -> ${path.basename(newFilePath)}`);
migratedCount++;
} catch (error) {
console.log(`❌ Error migrating ${topicPath}: ${error.message}`);
skippedCount++;
}
}
console.log(`\n📊 Migration complete:`);
console.log(` Migrated: ${migratedCount} files`);
console.log(` Skipped: ${skippedCount} files`);
console.log(` Total: ${Object.keys(migrationMapping).length} mappings`);
```
### 3. Execution Steps
1. Navigate to the roadmap directory (e.g., `src/data/roadmaps/[roadmap-name]`)
2. Create the migration script as `migrate_content.cjs`
3. Run: `node migrate_content.cjs`
4. Review the migration results
5. Clean up the temporary script file
### 4. Validation
After migration:
- Verify a few migrated files have proper content (not just titles)
- Check that the content structure matches the old content
- Ensure proper markdown formatting is preserved
## File Structure Expected
```
roadmap-directory/
├── migration-mapping.json
├── content/
│ ├── file1@contentId1.md
│ ├── file2@contentId2.md
│ └── ...
└── content-old/
├── section1/
│ ├── index.md
│ ├── topic1.md
│ └── subsection1/
│ └── subtopic1.md
└── section2/
└── ...
```
## Notes
- The migration mapping uses colons (`:`) to separate nested paths
- Content files in the new structure use the pattern `filename@contentId.md`
- The script handles 1-3 levels of nesting in the old structure
- Always create the script with `.cjs` extension to avoid ES module issues
================================================
FILE: .cursor/rules/gh-cli.mdc
================================================
---
description: GitHub pull requests
globs:
alwaysApply: false
---
# gh cli
Work seamlessly with GitHub from the command line.
USAGE
gh <command> <subcommand> [flags]
CORE COMMANDS
auth: Authenticate gh and git with GitHub
browse: Open repositories, issues, pull requests, and more in the browser
codespace: Connect to and manage codespaces
gist: Manage gists
issue: Manage issues
org: Manage organizations
pr: Manage pull requests
project: Work with GitHub Projects.
release: Manage releases
repo: Manage repositories
GITHUB ACTIONS COMMANDS
cache: Manage GitHub Actions caches
run: View details about workflow runs
workflow: View details about GitHub Actions workflows
ALIAS COMMANDS
co: Alias for "pr checkout"
ADDITIONAL COMMANDS
alias: Create command shortcuts
api: Make an authenticated GitHub API request
attestation: Work with artifact attestations
completion: Generate shell completion scripts
config: Manage configuration for gh
extension: Manage gh extensions
gpg-key: Manage GPG keys
label: Manage labels
preview: Execute previews for gh features
ruleset: View info about repo rulesets
search: Search for repositories, issues, and pull requests
secret: Manage GitHub secrets
ssh-key: Manage SSH keys
status: Print information about relevant issues, pull requests, and notifications across repositories
variable: Manage GitHub Actions variables
HELP TOPICS
accessibility: Learn about GitHub CLI's accessibility experiences
actions: Learn about working with GitHub Actions
environment: Environment variables that can be used with gh
exit-codes: Exit codes used by gh
formatting: Formatting options for JSON data exported from gh
mintty: Information about using gh with MinTTY
reference: A comprehensive reference of all gh commands
FLAGS
--help Show help for command
--version Show gh version
EXAMPLES
$ gh issue create
$ gh repo clone cli/cli
$ gh pr checkout 321
LEARN MORE
Use `gh <command> <subcommand> --help` for more information about a command.
Read the manual at https://cli.github.com/manual
Learn about exit codes using `gh help exit-codes`
Learn about accessibility experiences using `gh help accessibility`
## gh pr
Work with GitHub pull requests.
USAGE
gh pr <command> [flags]
GENERAL COMMANDS
create: Create a pull request
list: List pull requests in a repository
status: Show status of relevant pull requests
TARGETED COMMANDS
checkout: Check out a pull request in git
checks: Show CI status for a single pull request
close: Close a pull request
comment: Add a comment to a pull request
diff: View changes in a pull request
edit: Edit a pull request
lock: Lock pull request conversation
merge: Merge a pull request
ready: Mark a pull request as ready for review
reopen: Reopen a pull request
review: Add a review to a pull request
unlock: Unlock pull request conversation
update-branch: Update a pull request branch
view: View a pull request
FLAGS
-R, --repo [HOST/]OWNER/REPO Select another repository using the [HOST/]OWNER/REPO format
INHERITED FLAGS
--help Show help for command
ARGUMENTS
A pull request can be supplied as argument in any of the following formats:
- by number, e.g. "123";
- by URL, e.g. "https://github.com/OWNER/REPO/pull/123"; or
- by the name of its head branch, e.g. "patch-1" or "OWNER:patch-1".
EXAMPLES
$ gh pr checkout 353
$ gh pr create --fill
$ gh pr view --web
LEARN MORE
Use `gh <command> <subcommand> --help` for more information about a command.
Read the manual at https://cli.github.com/manual
Learn about exit codes using `gh help exit-codes`
Learn about accessibility experiences using `gh help accessibility`
## gh pr list
List pull requests in a GitHub repository. By default, this only lists open PRs.
The search query syntax is documented here:
<https://docs.github.com/en/search-github/searching-on-github/searching-issues-and-pull-requests>
For more information about output formatting flags, see `gh help formatting`.
USAGE
gh pr list [flags]
ALIASES
gh pr ls
FLAGS
--app string Filter by GitHub App author
-a, --assignee string Filter by assignee
-A, --author string Filter by author
-B, --base string Filter by base branch
-d, --draft Filter by draft state
-H, --head string Filter by head branch ("<owner>:<branch>" syntax not supported)
-q, --jq expression Filter JSON output using a jq expression
--json fields Output JSON with the specified fields
-l, --label strings Filter by label
-L, --limit int Maximum number of items to fetch (default 30)
-S, --search query Search pull requests with query
-s, --state string Filter by state: {open|closed|merged|all} (default "open")
-t, --template string Format JSON output using a Go template; see "gh help formatting"
-w, --web List pull requests in the web browser
INHERITED FLAGS
--help Show help for command
-R, --repo [HOST/]OWNER/REPO Select another repository using the [HOST/]OWNER/REPO format
JSON FIELDS
additions, assignees, author, autoMergeRequest, baseRefName, baseRefOid, body,
changedFiles, closed, closedAt, closingIssuesReferences, comments, commits,
createdAt, deletions, files, fullDatabaseId, headRefName, headRefOid,
headRepository, headRepositoryOwner, id, isCrossRepository, isDraft, labels,
latestReviews, maintainerCanModify, mergeCommit, mergeStateStatus, mergeable,
mergedAt, mergedBy, milestone, number, potentialMergeCommit, projectCards,
projectItems, reactionGroups, reviewDecision, reviewRequests, reviews, state,
statusCheckRollup, title, updatedAt, url
EXAMPLES
# List PRs authored by you
$ gh pr list --author "@me"
# List PRs with a specific head branch name
$ gh pr list --head "typo"
# List only PRs with all of the given labels
$ gh pr list --label bug --label "priority 1"
# Filter PRs using search syntax
$ gh pr list --search "status:success review:required"
# Find a PR that introduced a given commit
$ gh pr list --search "<SHA>" --state merged
LEARN MORE
Use `gh <command> <subcommand> --help` for more information about a command.
Read the manual at https://cli.github.com/manual
Learn about exit codes using `gh help exit-codes`
Learn about accessibility experiences using `gh help accessibility`
## gh pr diff
View changes in a pull request.
Without an argument, the pull request that belongs to the current branch
is selected.
With `--web` flag, open the pull request diff in a web browser instead.
USAGE
gh pr diff [<number> | <url> | <branch>] [flags]
FLAGS
--color string Use color in diff output: {always|never|auto} (default "auto")
--name-only Display only names of changed files
--patch Display diff in patch format
-w, --web Open the pull request diff in the browser
INHERITED FLAGS
--help Show help for command
-R, --repo [HOST/]OWNER/REPO Select another repository using the [HOST/]OWNER/REPO format
LEARN MORE
Use `gh <command> <subcommand> --help` for more information about a command.
Read the manual at https://cli.github.com/manual
Learn about exit codes using `gh help exit-codes`
Learn about accessibility experiences using `gh help accessibility`
## gh pr merge
Merge a pull request on GitHub.
Without an argument, the pull request that belongs to the current branch
is selected.
When targeting a branch that requires a merge queue, no merge strategy is required.
If required checks have not yet passed, auto-merge will be enabled.
If required checks have passed, the pull request will be added to the merge queue.
To bypass a merge queue and merge directly, pass the `--admin` flag.
USAGE
gh pr merge [<number> | <url> | <branch>] [flags]
FLAGS
--admin Use administrator privileges to merge a pull request that does not meet requirements
-A, --author-email text Email text for merge commit author
--auto Automatically merge only after necessary requirements are met
-b, --body text Body text for the merge commit
-F, --body-file file Read body text from file (use "-" to read from standard input)
-d, --delete-branch Delete the local and remote branch after merge
--disable-auto Disable auto-merge for this pull request
--match-head-commit SHA Commit SHA that the pull request head must match to allow merge
-m, --merge Merge the commits with the base branch
-r, --rebase Rebase the commits onto the base branch
-s, --squash Squash the commits into one commit and merge it into the base branch
-t, --subject text Subject text for the merge commit
INHERITED FLAGS
--help Show help for command
-R, --repo [HOST/]OWNER/REPO Select another repository using the [HOST/]OWNER/REPO format
LEARN MORE
Use `gh <command> <subcommand> --help` for more information about a command.
Read the manual at https://cli.github.com/manual
Learn about exit codes using `gh help exit-codes`
Learn about accessibility experiences using `gh help accessibility`
## gh pr review
Add a review to a pull request.
Without an argument, the pull request that belongs to the current branch is reviewed.
USAGE
gh pr review [<number> | <url> | <branch>] [flags]
FLAGS
-a, --approve Approve pull request
-b, --body string Specify the body of a review
-F, --body-file file Read body text from file (use "-" to read from standard input)
-c, --comment Comment on a pull request
-r, --request-changes Request changes on a pull request
INHERITED FLAGS
--help Show help for command
-R, --repo [HOST/]OWNER/REPO Select another repository using the [HOST/]OWNER/REPO format
EXAMPLES
# Approve the pull request of the current branch
$ gh pr review --approve
# Leave a review comment for the current branch
$ gh pr review --comment -b "interesting"
# Add a review for a specific pull request
$ gh pr review 123
# Request changes on a specific pull request
$ gh pr review 123 -r -b "needs more ASCII art"
LEARN MORE
Use `gh <command> <subcommand> --help` for more information about a command.
Read the manual at https://cli.github.com/manual
Learn about exit codes using `gh help exit-codes`
Learn about accessibility experiences using `gh help accessibility`
## gh pr checkout
Check out a pull request in git
USAGE
gh pr checkout [<number> | <url> | <branch>] [flags]
FLAGS
-b, --branch string Local branch name to use (default [the name of the head branch])
--detach Checkout PR with a detached HEAD
-f, --force Reset the existing local branch to the latest state of the pull request
--recurse-submodules Update all submodules after checkout
INHERITED FLAGS
--help Show help for command
-R, --repo [HOST/]OWNER/REPO Select another repository using the [HOST/]OWNER/REPO format
EXAMPLES
# Interactively select a PR from the 10 most recent to check out
$ gh pr checkout
# Checkout a specific PR
$ gh pr checkout 32
$ gh pr checkout https://github.com/OWNER/REPO/pull/32
$ gh pr checkout feature
LEARN MORE
Use `gh <command> <subcommand> --help` for more information about a command.
Read the manual at https://cli.github.com/manual
Learn about exit codes using `gh help exit-codes`
Learn about accessibility experiences using `gh help accessibility`
## gh pr close
Close a pull request
USAGE
gh pr close {<number> | <url> | <branch>} [flags]
FLAGS
-c, --comment string Leave a closing comment
-d, --delete-branch Delete the local and remote branch after close
INHERITED FLAGS
--help Show help for command
-R, --repo [HOST/]OWNER/REPO Select another repository using the [HOST/]OWNER/REPO format
LEARN MORE
Use `gh <command> <subcommand> --help` for more information about a command.
Read the manual at https://cli.github.com/manual
Learn about exit codes using `gh help exit-codes`
Learn about accessibility experiences using `gh help accessibility`
## gh pr comment
Add a comment to a GitHub pull request.
Without the body text supplied through flags, the command will interactively
prompt for the comment text.
USAGE
gh pr comment [<number> | <url> | <branch>] [flags]
FLAGS
-b, --body text The comment body text
-F, --body-file file Read body text from file (use "-" to read from standard input)
--create-if-none Create a new comment if no comments are found. Can be used only with --edit-last
--delete-last Delete the last comment of the current user
--edit-last Edit the last comment of the current user
-e, --editor Skip prompts and open the text editor to write the body in
-w, --web Open the web browser to write the comment
--yes Skip the delete confirmation prompt when --delete-last is provided
INHERITED FLAGS
--help Show help for command
-R, --repo [HOST/]OWNER/REPO Select another repository using the [HOST/]OWNER/REPO format
EXAMPLES
$ gh pr comment 13 --body "Hi from GitHub CLI"
LEARN MORE
Use `gh <command> <subcommand> --help` for more information about a command.
Read the manual at https://cli.github.com/manual
Learn about exit codes using `gh help exit-codes`
Learn about accessibility experiences using `gh help accessibility`
================================================
FILE: .github/FUNDING.yml
================================================
# These are supported funding model platforms
github: kamranahmedse
================================================
FILE: .github/ISSUE_TEMPLATE/01-suggest-changes.yml
================================================
name: "✍️ Missing or Deprecated Roadmap Topics"
description: Help us improve the roadmaps by suggesting changes
labels: [topic-change]
assignees: []
body:
- type: markdown
attributes:
value: |
Thanks for taking the time to help us improve the roadmaps with your suggestions.
- type: input
id: url
attributes:
label: Roadmap URL
description: Please provide the URL of the roadmap you are suggesting changes to.
placeholder: https://roadmap.sh
validations:
required: true
- type: textarea
id: roadmap-suggestions
attributes:
label: Suggestions
description: What changes would you like to suggest?
placeholder: Enter your suggestions here.
validations:
required: true
================================================
FILE: .github/ISSUE_TEMPLATE/02-bug-report.yml
================================================
name: "🐛 Bug Report"
description: Report an issue or possible bug
labels: [bug]
assignees: []
body:
- type: input
id: url
attributes:
label: What is the URL where the issue is happening
placeholder: https://roadmap.sh
validations:
required: true
- type: dropdown
id: browsers
attributes:
label: What browsers are you seeing the problem on?
multiple: true
options:
- Firefox
- Chrome
- Safari
- Microsoft Edge
- Other
- type: textarea
id: bug-description
attributes:
label: Describe the Bug
description: A clear and concise description of what the bug is.
validations:
required: true
- type: textarea
id: logs
attributes:
label: Output from browser console (if any)
description: Please copy and paste any relevant log output.
- type: checkboxes
id: will-pr
attributes:
label: Participation
options:
- label: I am willing to submit a pull request for this issue.
required: false
================================================
FILE: .github/ISSUE_TEMPLATE/03-feature-suggestion.yml
================================================
name: "✨ Feature Suggestion"
description: Is there a feature you'd like to see on Roadmap.sh? Let us know!
labels: [feature request]
assignees: []
body:
- type: textarea
id: feature-description
attributes:
label: Feature Description
description: Please provide a detailed description of the feature you are suggesting and how it would help you/others.
validations:
required: true
================================================
FILE: .github/ISSUE_TEMPLATE/04-roadmap-contribution.yml
================================================
name: "🙏 Submit a Roadmap"
description: Help us launch a new roadmap with your expertise.
labels: [roadmap contribution]
assignees: []
body:
- type: markdown
attributes:
value: |
Thanks for taking the time to submit a roadmap! Please fill out the information below and we'll get back to you as soon as we can.
- type: input
id: roadmap-title
attributes:
label: What is the title of the roadmap you are submitting?
placeholder: e.g. Roadmap to learn Data Science
validations:
required: true
- type: textarea
id: roadmap-description
attributes:
label: Roadmap Link
description: Please create the roadmap [using our roadmap editor](https://twitter.com/kamrify/status/1708293162693767426) and submit the roadmap link.
placeholder: |
https://roadmap.sh/xyz
validations:
required: true
================================================
FILE: .github/ISSUE_TEMPLATE/05-something-else.yml
================================================
name: "🤷♂️ Something else"
description: If none of the above templates fit your needs, please use this template to submit your issue.
labels: []
assignees: []
body:
- type: textarea
id: issue-description
attributes:
label: Detailed Description
description: Please provide a detailed description of the issue.
validations:
required: true
================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: false
contact_links:
- name: ✋ Roadmap Request
url: https://roadmap.sh/discord
about: Please do not open issues with roadmap requests, hop onto the discord server for that.
- name: 📝 Typo or Grammatical Mistake
url: https://github.com/kamranahmedse/developer-roadmap/tree/master/src/data
about: Please submit a pull request instead of reporting it as an issue.
- name: 💬 Chat on Discord
url: https://roadmap.sh/discord
about: Join the community on our Discord server.
- name: 🤝 Guidance
url: https://roadmap.sh/discord
about: Join the community in our Discord server.
================================================
FILE: .github/workflows/aws-costs.yml
================================================
name: Sends Daily AWS Costs to Slack
on:
# Allow manual Run
workflow_dispatch:
# Run at 7:00 UTC every day
schedule:
- cron: "0 7 * * *"
jobs:
aws_costs:
runs-on: ubuntu-latest
steps:
- name: Get Costs
env:
AWS_KEY: ${{ secrets.COST_AWS_ACCESS_KEY }}
AWS_SECRET: ${{ secrets.COST_AWS_SECRET_KEY }}
AWS_REGION: ${{ secrets.COST_AWS_REGION }}
SLACK_CHANNEL: ${{ secrets.SLACK_COST_CHANNEL }}
SLACK_TOKEN: ${{ secrets.SLACK_TOKEN }}
run: |
npm install -g aws-cost-cli
aws-cost -k $AWS_KEY -s $AWS_SECRET -r $AWS_REGION -S $SLACK_TOKEN -C $SLACK_CHANNEL
================================================
FILE: .github/workflows/cleanup-orphaned-content.yml
================================================
name: Cleanup Orphaned Content
on:
workflow_dispatch:
inputs:
roadmap_slug:
description: "The ID of the roadmap to clean up"
required: true
jobs:
cleanup-content:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup pnpm@v9
uses: pnpm/action-setup@v4
with:
version: 9
run_install: false
- name: Setup Node.js Version 20 (LTS)
uses: actions/setup-node@v4
with:
node-version: 20
cache: 'pnpm'
- name: Install Dependencies and Run Cleanup
run: |
echo "Installing Dependencies"
pnpm install
echo "Running Orphaned Content Cleanup"
npm run cleanup:orphaned-content -- --roadmap-slug=${{ inputs.roadmap_slug }}
- name: Read cleanup summary
id: read-summary
run: |
if [ -f .cleanup-summary.md ]; then
{
echo 'summary<<EOF'
cat .cleanup-summary.md
echo 'EOF'
} >> $GITHUB_OUTPUT
fi
- name: Check for changes
id: verify-changed-files
run: |
if [ -n "$(git status --porcelain)" ]; then
echo "changed=true" >> $GITHUB_OUTPUT
else
echo "changed=false" >> $GITHUB_OUTPUT
fi
- name: Delete summary file
if: steps.verify-changed-files.outputs.changed == 'true'
run: rm -f .cleanup-summary.md
- name: Create PR
if: steps.verify-changed-files.outputs.changed == 'true'
uses: peter-evans/create-pull-request@v7
with:
delete-branch: false
branch: "chore/cleanup-orphaned-content-${{ inputs.roadmap_slug }}"
base: "master"
labels: |
automated pr
reviewers: jcanalesluna,kamranahmedse
commit-message: "chore: cleanup orphaned content files"
title: "chore: cleanup orphaned content - ${{ inputs.roadmap_slug }}"
body: |
${{ steps.read-summary.outputs.summary }}
> [!IMPORTANT]
> This PR removes orphaned/duplicate content files for: ${{ inputs.roadmap_slug }}
>
> Commit: ${{ github.sha }}
> Workflow Path: ${{ github.workflow_ref }}
**Please review the changes and merge the PR if everything looks correct.**
================================================
FILE: .github/workflows/close-feedback-pr.yml
================================================
name: Close PRs with Feedback
on:
workflow_dispatch:
schedule:
- cron: '0 0 * * *'
jobs:
close-pr:
runs-on: ubuntu-latest
steps:
- name: Close PR if it has label "feedback left" and no changes in 7 days
uses: actions/github-script@v3
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
const { data: pullRequests } = await github.pulls.list({
owner: context.repo.owner,
repo: context.repo.repo,
state: 'open',
base: 'master',
});
for (const pullRequest of pullRequests) {
const { data: labels } = await github.issues.listLabelsOnIssue({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: pullRequest.number,
});
const feedbackLabel = labels.find((label) => label.name === 'feedback left');
if (feedbackLabel) {
const lastUpdated = new Date(pullRequest.updated_at);
const sevenDaysAgo = new Date();
sevenDaysAgo.setDate(sevenDaysAgo.getDate() - 7);
if (lastUpdated < sevenDaysAgo) {
await github.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: pullRequest.number,
body: 'Closing this PR because there has been no activity for the past 7 days. Feel free to reopen if you have any feedback.',
});
await github.pulls.update({
owner: context.repo.owner,
repo: context.repo.repo,
pull_number: pullRequest.number,
state: 'closed',
});
}
}
}
================================================
FILE: .github/workflows/cloudfront-api-cache.yml
================================================
name: Clears API Cloudfront Cache
on:
workflow_dispatch:
jobs:
cloudfront_api_cache:
runs-on: ubuntu-latest
steps:
- name: Clear Cloudfront Caching
run: |
curl -L \
-X POST \
-H "Accept: application/vnd.github+json" \
-H "Authorization: Bearer ${{ secrets.GH_PAT }}" \
-H "X-GitHub-Api-Version: 2022-11-28" \
https://api.github.com/repos/roadmapsh/infra-ansible/actions/workflows/playbook.yml/dispatches \
-d '{ "ref":"master", "inputs": { "playbook": "roadmap_web.yml", "tags": "cloudfront-api", "is_verbose": false } }'
================================================
FILE: .github/workflows/cloudfront-fe-cache.yml
================================================
name: Clears Frontend Cloudfront Cache
on:
workflow_dispatch:
jobs:
cloudfront_fe_cache:
runs-on: ubuntu-latest
steps:
- name: Clear Cloudfront Caching
run: |
curl -L \
-X POST \
-H "Accept: application/vnd.github+json" \
-H "Authorization: Bearer ${{ secrets.GH_PAT }}" \
-H "X-GitHub-Api-Version: 2022-11-28" \
https://api.github.com/repos/roadmapsh/infra-ansible/actions/workflows/playbook.yml/dispatches \
-d '{ "ref":"master", "inputs": { "playbook": "roadmap_web.yml", "tags": "cloudfront,cloudfront-course", "is_verbose": false } }'
================================================
FILE: .github/workflows/deployment.yml
================================================
name: Deploy to EC2
on:
workflow_dispatch:
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout Repository
uses: actions/checkout@v4
with:
fetch-depth: 2
- uses: actions/setup-node@v4
with:
node-version: 20
- uses: pnpm/action-setup@v4.0.0
with:
version: 9
# -------------------
# Setup configuration
# -------------------
- name: Prepare configuration files
run: |
git clone https://${{ secrets.GH_PAT }}@github.com/roadmapsh/infra-config.git configuration --depth 1
- name: Copy configuration files
run: |
cp configuration/dist/github/developer-roadmap.env .env
# -----------------
# Prepare the Build
# -----------------
- name: Install Dependencies
run: |
pnpm install
- name: Generate Production Build
run: |
git clone https://${{ secrets.GH_PAT }}@github.com/roadmapsh/web-draw.git .temp/web-draw --depth 1
npm run generate-renderer
npm run compress:images
npm run build
# --------------------
# Deploy to EC2
# --------------------
- uses: webfactory/ssh-agent@v0.7.0
with:
ssh-private-key: ${{ secrets.EC2_PRIVATE_KEY }}
- name: Deploy Application to EC2
run: |
rsync -apvz --delete --no-times --exclude "configuration" -e "ssh -o StrictHostKeyChecking=no" -p ./ ${{ secrets.EC2_USERNAME }}@${{ secrets.EC2_HOST }}:/var/www/roadmap.sh/
- name: Restart PM2
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.EC2_HOST }}
username: ${{ secrets.EC2_USERNAME }}
key: ${{ secrets.EC2_PRIVATE_KEY }}
script: |
cd /var/www/roadmap.sh
sudo pm2 restart web-roadmap
# ----------------------
# Clear cloudfront cache
# ----------------------
- name: Clear Cloudfront Caching
run: |
curl -L \
-X POST \
-H "Accept: application/vnd.github+json" \
-H "Authorization: Bearer ${{ secrets.GH_PAT }}" \
-H "X-GitHub-Api-Version: 2022-11-28" \
https://api.github.com/repos/roadmapsh/infra-ansible/actions/workflows/playbook.yml/dispatches \
-d '{ "ref":"master", "inputs": { "playbook": "roadmap_web.yml", "tags": "cloudfront", "is_verbose": false } }'
================================================
FILE: .github/workflows/label-issue.yml
================================================
name: Label Issue
on:
issues:
types: [ opened, edited ]
jobs:
label-topic-change-issue:
runs-on: ubuntu-latest
steps:
- name: Add Labels To Issue
uses: actions/github-script@v7
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
const issue = context.payload.issue;
const roadmapUrl = issue.body.match(/https?:\/\/roadmap.sh\/[^ ]+/);
// if the issue is labeled as a topic-change, add the roadmap slug as a label
if (issue.labels.some(label => label.name === 'topic-change')) {
if (roadmapUrl) {
const roadmapSlug = new URL(roadmapUrl[0]).pathname.replace(/\//, '');
github.rest.issues.addLabels({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: issue.number,
labels: [roadmapSlug]
});
}
// Close the issue if it has no roadmap URL
if (!roadmapUrl) {
github.rest.issues.update({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: issue.number,
state: 'closed'
});
}
}
================================================
FILE: .github/workflows/sync-content-to-repo.yml
================================================
name: Sync Content to Repo
on:
workflow_dispatch:
inputs:
roadmap_slug:
description: "The ID of the roadmap to sync"
required: true
default: "__default__"
jobs:
sync-content:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup pnpm@v9
uses: pnpm/action-setup@v4
with:
version: 9
run_install: false
- name: Setup Node.js Version 20 (LTS)
uses: actions/setup-node@v4
with:
node-version: 20
cache: 'pnpm'
- name: Install Dependencies and Sync Content
run: |
echo "Installing Dependencies"
pnpm install
echo "Syncing Content to Repo"
npm run sync:content-to-repo -- --roadmap-slug=${{ inputs.roadmap_slug }} --secret=${{ secrets.GH_SYNC_SECRET }}
- name: Check for changes
id: verify-changed-files
run: |
if [ -n "$(git status --porcelain)" ]; then
echo "changed=true" >> $GITHUB_OUTPUT
else
echo "changed=false" >> $GITHUB_OUTPUT
fi
- name: Create PR
if: steps.verify-changed-files.outputs.changed == 'true'
uses: peter-evans/create-pull-request@v7
with:
delete-branch: false
branch: "chore/sync-content-to-repo-${{ inputs.roadmap_slug }}"
base: "master"
labels: |
automated pr
reviewers: jcanalesluna,kamranahmedse
commit-message: "chore: sync content to repo"
title: "chore: sync content to repository - ${{ inputs.roadmap_slug }}"
body: |
## Sync Content to Repo
> [!IMPORTANT]
> This PR Syncs the Content to the Repo for the Roadmap: ${{ inputs.roadmap_slug }}
>
> Commit: ${{ github.sha }}
> Workflow Path: ${{ github.workflow_ref }}
**Please Review the Changes and Merge the PR if everything is fine.**
================================================
FILE: .github/workflows/sync-repo-to-database.yml
================================================
name: Sync Repo to Database
on:
workflow_dispatch:
inputs:
roadmap_slug:
description: "The slug of the roadmap to sync (e.g., frontend, backend)"
required: true
jobs:
sync-roadmap:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup pnpm@v9
uses: pnpm/action-setup@v4
with:
version: 9
run_install: false
- name: Setup Node.js Version 20 (LTS)
uses: actions/setup-node@v4
with:
node-version: 20
cache: 'pnpm'
- name: Get all roadmap files
id: roadmap-files
run: |
ROADMAP_DIR="src/data/roadmaps/${{ inputs.roadmap_slug }}"
if [ ! -d "$ROADMAP_DIR" ]; then
echo "Error: Roadmap directory '$ROADMAP_DIR' does not exist"
exit 1
fi
echo "Getting all files in $ROADMAP_DIR"
ALL_FILES=$(find "$ROADMAP_DIR" -type f | tr '\n' ',')
echo "Files to sync:"
echo "$ALL_FILES"
echo "files=$ALL_FILES" >> $GITHUB_OUTPUT
- name: Install Dependencies
run: |
echo "Installing Dependencies"
pnpm install
- name: Run sync script
run: |
echo "Running sync script for roadmap: ${{ inputs.roadmap_slug }}"
echo "Files: ${{ steps.roadmap-files.outputs.files }}"
npm run sync:repo-to-database -- --files="${{ steps.roadmap-files.outputs.files }}" --secret=${{ secrets.GH_SYNC_SECRET }}
================================================
FILE: .github/workflows/upgrade-dependencies.yml
================================================
name: Upgrade Dependencies
on:
workflow_dispatch:
schedule:
- cron: '0 0 * * 0'
jobs:
upgrade-deps:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Node.js Version 20 (LTS)
uses: actions/setup-node@v4
with:
node-version: 20
- name: Setup pnpm@v9
uses: pnpm/action-setup@v4
with:
version: 9
- name: Install & Upgrade Dependencies
run: |
pnpm install
npm run upgrade
pnpm install --lockfile-only
- name: Create Pull Request
uses: peter-evans/create-pull-request@v7
with:
delete-branch: false
branch: "update-deps"
base: "master"
labels: |
dependencies
automated pr
reviewers: kamranahmedse
commit-message: "chore: update dependencies to latest"
title: "Upgrade Dependencies To Latest - Automated"
body: |
## Updated all Dependencies to Latest Versions.
> [!IMPORTANT]
> This PR Upgrades the Dependencies to the their latest versions.
>
> Commit: ${{ github.sha }}
> Workflow Path: ${{ github.workflow_ref }}
**Please Review the Changes and Merge the PR if everything is fine.**
================================================
FILE: .gitignore
================================================
.idea
.temp
.astro
# build output
dist/
.output/
# dependencies
node_modules/
scripts/developer-roadmap
# logs
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
# environment variables
.env
.env.production
# macOS-specific files
.DS_Store
/test-results/
/playwright-report/
/playwright/.cache/
tests-examples
*.csveditor/
packages/editor
================================================
FILE: .npmrc
================================================
auto-install-peers=true
strict-peer-dependencies=false
================================================
FILE: .prettierignore
================================================
app-dist
dist
.idea
.github
public
node_modules
pnpm-lock.yaml
================================================
FILE: .prettierrc.cjs
================================================
module.exports = {
semi: true,
singleQuote: true,
overrides: [
{
files: '*.astro',
options: {
parser: 'astro',
singleQuote: true,
jsxSingleQuote: true,
},
},
],
plugins: [
require.resolve('prettier-plugin-astro'),
'prettier-plugin-tailwindcss',
],
};
================================================
FILE: .vscode/extensions.json
================================================
{
"recommendations": ["astro-build.astro-vscode"],
"unwantedRecommendations": []
}
================================================
FILE: .vscode/launch.json
================================================
{
"version": "0.2.0",
"configurations": [
{
"command": "./node_modules/.bin/astro dev",
"name": "Development server",
"request": "launch",
"type": "node-terminal"
}
]
}
================================================
FILE: .vscode/settings.json
================================================
{
"prettier.documentSelectors": ["**/*.astro"],
"[astro]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"tailwindCSS.experimental.classRegex": [
["\\b\\w+[cC]lassName\\s*=\\s*[\"']([^\"']*)[\"']"],
["\\b\\w+[cC]lassName\\s*=\\s*`([^`]*)`"],
["[\\w]+[cC]lassName[\"']?\\s*:\\s*[\"']([^\"']*)[\"']"],
["[\\w]+[cC]lassName[\"']?\\s*:\\s*`([^`]*)`"],
["cva\\(((?:[^()]|\\([^()]*\\))*)\\)", "[\"'`]([^\"'`]*).*?[\"'`]"],
["cx\\(((?:[^()]|\\([^()]*\\))*)\\)", "(?:'|\"|`)([^']*)(?:'|\"|`)"]
]
}
================================================
FILE: astro.config.mjs
================================================
// https://astro.build/config
import sitemap from '@astrojs/sitemap';
import node from '@astrojs/node';
import { defineConfig } from 'astro/config';
import rehypeExternalLinks from 'rehype-external-links';
import { serializeSitemap, shouldIndexPage } from './sitemap.mjs';
import tailwindcss from '@tailwindcss/vite';
import react from '@astrojs/react';
// https://astro.build/config
export default defineConfig({
site: 'https://roadmap.sh/',
redirects: {
'/devops/devops-engineer': {
status: 301,
destination: '/devops',
},
'/ai-tutor': {
status: 301,
destination: '/ai',
},
'/best-practices': {
status: 301,
destination: '/roadmaps',
},
'/best-practices/aws': {
status: 301,
destination: '/aws-best-practices',
},
'/best-practices/backend-performance': {
status: 301,
destination: '/backend-performance-best-practices',
},
'/best-practices/frontend-performance': {
status: 301,
destination: '/frontend-performance-best-practices',
},
'/best-practices/api-security': {
status: 301,
destination: '/api-security-best-practices',
},
'/best-practices/code-review': {
status: 301,
destination: '/code-review-best-practices',
},
},
markdown: {
shikiConfig: {
theme: 'dracula',
},
rehypePlugins: [
[
rehypeExternalLinks,
{
target: '_blank',
rel: function (element) {
const href = element.properties.href;
const whiteListedStarts = [
'/',
'#',
'mailto:',
'https://github.com/kamranahmedse',
'https://thenewstack.io',
'https://kamranahmed.info',
'https://roadmap.sh',
];
if (whiteListedStarts.some((start) => href.startsWith(start))) {
return [];
}
return 'noopener noreferrer nofollow';
},
},
],
],
},
output: 'server',
adapter: node({
mode: 'standalone',
}),
trailingSlash: 'never',
integrations: [
sitemap({
filter: shouldIndexPage,
serialize: serializeSitemap,
}),
react(),
],
vite: {
plugins: [tailwindcss()],
ssr: {
noExternal: [/^@roadmapsh\/editor.*$/],
},
server: {
allowedHosts: ['roadmap.sh', 'port3k.kamranahmed.info'],
},
},
});
================================================
FILE: code_of_conduct.md
================================================
# Code of Conduct
## Our Pledge
In the interest of fostering an open and welcoming environment, we as
contributors and maintainers pledge to make participation in our project and
our community a harassment-free experience for everyone, regardless of age, body
size, disability, ethnicity, sex characteristics, gender identity and expression,
level of experience, education, socio-economic status, nationality, personal
appearance, race, religion, or sexual identity and orientation.
## Our Standards
Examples of behavior that contributes to creating a positive environment
include:
- Using welcoming and inclusive language
- Being respectful of differing viewpoints and experiences
- Gracefully accepting constructive criticism
- Focusing on what is best for the community
- Showing empathy towards other community members
Examples of unacceptable behavior by participants include:
- The use of sexualized language or imagery and unwelcome sexual attention or
advances
- Trolling, insulting/derogatory comments, and personal or political attacks
- Public or private harassment
- Publishing others' private information, such as a physical or electronic
address, without explicit permission
- Other conduct which could reasonably be considered inappropriate in a
professional setting
## Our Responsibilities
Project maintainers are responsible for clarifying the standards of acceptable
behavior and are expected to take appropriate and fair corrective action in
response to any instances of unacceptable behavior.
Project maintainers have the right and responsibility to remove, edit, or
reject comments, commits, code, wiki edits, issues, and other contributions
that are not aligned to this Code of Conduct, or to ban temporarily or
permanently any contributor for other behaviors that they deem inappropriate,
threatening, offensive, or harmful.
## Scope
This Code of Conduct applies within all project spaces, and it also applies when
an individual is representing the project or its community in public spaces.
Examples of representing a project or community include using an official
project e-mail address, posting via an official social media account, or acting
as an appointed representative at an online or offline event. Representation of
a project may be further defined and clarified by project maintainers.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported by contacting the project team at <kamranahmed.se@gmail.com>. All
complaints will be reviewed and investigated and will result in a response that
is deemed necessary and appropriate to the circumstances. The project team is
obligated to maintain confidentiality with regard to the reporter of an incident.
Further details of specific enforcement policies may be posted separately.
Project maintainers who do not follow or enforce the Code of Conduct in good
faith may face temporary or permanent repercussions as determined by other
members of the project's leadership.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
[homepage]: https://www.contributor-covenant.org
For answers to common questions about this code of conduct, see
https://www.contributor-covenant.org/faq
================================================
FILE: contributing.md
================================================
# ✨ Contribution Guidelines ✨
First of all, thank you for considering to contribute. Please look at the details below:
- [New Roadmaps](#new-roadmaps)
- [Existing Roadmaps](#existing-roadmaps)
- [Adding Projects](#adding-projects)
- [Adding Content](#adding-content)
- [How To Structure Content](#how-to-structure-content)
- [Guidelines](#guidelines)
- [Good vs. Not So Good Contributions](#good-vs-not-so-good-contributions)
- [Local Development](#local-development)
## New Roadmaps
For new roadmaps, you can either:
- Submit a roadmap by providing [a textual roadmap similar to this roadmap](https://gist.github.com/kamranahmedse/98758d2c73799b3a6ce17385e4c548a5) in an [issue](https://github.com/kamranahmedse/developer-roadmap/issues).
- Create an interactive roadmap yourself using [our roadmap editor](https://draw.roadmap.sh/) & submit the link to that roadmap in an [issue](https://github.com/kamranahmedse/developer-roadmap/issues).
## Existing Roadmaps
For the existing roadmaps, please follow the details listed for the nature of contribution:
- **Fixing Typos** — Make your changes in the [roadmap markdown file](https://github.com/kamranahmedse/developer-roadmap/tree/master/src/data/roadmaps) and submit a [PR](https://github.com/kamranahmedse/developer-roadmap/pulls).
- **Adding/Removing Nodes and Modifying Node Titles** — Please open an [issue](https://github.com/kamranahmedse/developer-roadmap/issues) with your suggestion.
**Note:** Please note that our goal is **not to have the biggest list of items**. Our goal is to list items or skills most relevant today.
## Adding Projects
If you have a project idea that you think we should add to the roadmap, feel free to open an issue with as many details about the project as possible and the roadmap you think it should be added to.
The detailed format for the issue should be as follows:
```md
## What is this project about?
(Add an introduction to the project.)
## Skills this Project Covers
(Comma separated list of skills, e.g. Programming Knowledge, Database, etc.)
## Requirements
( Detailed list of requirements, i.e. input, output, hints to help build this, etc.)
```
Have a look at this project to get an idea of [what we are looking for](https://roadmap.sh/projects/github-user-activity).
## Adding Content
Find [the content directory inside the relevant roadmap](https://github.com/kamranahmedse/developer-roadmap/tree/master/src/data/roadmaps). Please keep the following guidelines in mind when submitting content:
- Content must be in English.
- Maximum of 8 links per topic.
- **No GeeksforGeeks links** — Links to geeksforgeeks.org are not accepted.
- Follow the below style guide for content.
Please note that we are intentionally keeping the content under the topic popup concise. You MUST always aim to explain the topic simply in a **single paragraph** or so and provide external resources where users can learn more about the topic.
### How To Structure Content
Please adhere to the following style when adding content to a topic:
```md
# Topic Title
(Content)
Visit the following resources to learn more:
- [@type@Title/Description of Link](Link)
```
`@type@` must be one of the following and describe the type of content you are adding:
- `@official@`
- `@opensource@`
- `@article@`
- `@course@`
- `@podcast@`
- `@video@`
- `@book@`
It's important to add a valid type, this will help us categorize the content and display it properly on the roadmap. The order of the links based on type is same as above.
## Guidelines
- <p><strong>Please don't use the project for self-promotion!</strong><br/>
We believe this project is a valuable asset to the developer community, and it includes numerous helpful resources. We kindly ask you to avoid submitting pull requests for the sole purpose of self-promotion. We appreciate contributions that genuinely add value, such as guides from maintainers of well-known frameworks, and will consider accepting these even if they're self authored. Thank you for your understanding and cooperation!
- <p><strong>Adding everything available out there is not the goal!</strong><br/>
The roadmaps represent the skillset most valuable today, i.e., if you were to enter any of the listed fields today, what would you learn? There might be things that are of-course being used today, but prioritize the things that are most in demand today, e.g., agree that lots of people are using angular.js today, but you wouldn't want to learn that instead of React, Angular, or Vue. Use your critical thinking to filter out non-essential stuff. Give honest arguments for why the resource should be included.</p>
- <p><strong>Do not add things you have not evaluated personally!</strong><br/>
Use your critical thinking to filter out non-essential stuff. Give honest arguments for why the resource should be included. Have you read this book? Can you give a short article?</p>
- <p><strong>Create a Single PR for Content Additions</strong></p>
If you are planning to contribute by adding content to the roadmaps, I recommend you to clone the repository, add content to the [content directory of the roadmap](./src/data/roadmaps/) and create a single PR to make it easier for me to review and merge the PR.
- <p><strong>Write meaningful commit messages</strong><br/>
Meaningful commit messages help speed up the review process as well as help other contributors gain a good overview of the repositories commit history without having to dive into every commit.
</p>
- <p><strong>Look at the existing issues/pull requests before opening new ones</strong></p>
## Good vs. Not So Good Contributions
<strong>Good</strong>
- New Roadmaps.
- Engaging and fresh content links.
- Typos and grammatical fixes.
- Enhanced Existing Content.
- Content copy in topics that do not have any (or minimal copy exists).
<strong>Not So Good</strong>
- Adding whitespace that doesn't add to the readability of the content.
- Rewriting content in a way that doesn't add any value.
- Non-English content.
- PR's that don't follow our style guide, have no description, and a default title.
- Links to your own blog articles.
## Local Development
For local development, you can use the following commands:
```bash
git clone git@github.com:kamranahmedse/developer-roadmap.git --depth 1
cd developer-roadmap
pnpm add @roadmapsh/editor@npm:@roadmapsh/dummy-editor -w
pnpm install
```
Run the development server with:
```bash
pnpm dev
```
***
Have a look at the [License](./license) file.
================================================
FILE: license
================================================
Everything including text and images in this project are protected by the copyright laws.
You are allowed to use this material for personal use but are not allowed to use it for
any other purpose including publishing the images, the project files or the content in
the images in any form either digital, non-digital, textual, graphical or written formats.
You are allowed to share the links to the repository or the website roadmap.sh but not
the content for any sort of usage that involves the content of this repository taken out
of the repository and be shared from any other medium including but not limited to blog
posts, articles, newsletters, you must get prior consent from the understated. These
conditions do not apply to the readonly GitHub forks created using the Fork button on
GitHub with the whole purpose of contributing to the project.
Copyright © 2017 - Present. Kamran Ahmed <kamranahmed.se@gmail.com>
================================================
FILE: package.json
================================================
{
"name": "roadmap.sh",
"type": "module",
"version": "1.0.0",
"private": true,
"scripts": {
"dev": "astro dev --port 3000",
"start": "astro dev",
"build": "astro build",
"preview": "astro preview",
"format": "prettier --write .",
"gh-labels": "./scripts/create-roadmap-labels.sh",
"astro": "astro",
"deploy": "NODE_DEBUG=gh-pages gh-pages -d dist -t",
"upgrade": "ncu -u",
"roadmap-links": "node scripts/roadmap-links.cjs",
"roadmap-dirs": "node scripts/roadmap-dirs.cjs",
"roadmap-assets": "tsx scripts/editor-roadmap-assets.ts",
"refresh-assets": "tsx scripts/refresh-assets.ts",
"editor-roadmap-dirs": "tsx scripts/editor-roadmap-dirs.ts",
"editor-roadmap-content": "tsx scripts/editor-roadmap-content.ts",
"roadmap-content": "node scripts/roadmap-content.cjs",
"generate-renderer": "sh scripts/generate-renderer.sh",
"generate-renderer-dummy": "sh scripts/generate-renderer-dummy.sh",
"best-practice-dirs": "node scripts/best-practice-dirs.cjs",
"best-practice-content": "node scripts/best-practice-content.cjs",
"generate:og": "node ./scripts/generate-og-images.mjs",
"warm:urls": "sh ./scripts/warm-urls.sh https://roadmap.sh/sitemap-0.xml",
"compress:images": "tsx ./scripts/compress-images.ts",
"generate:roadmap-content-json": "tsx ./scripts/editor-roadmap-content-json.ts",
"migrate:editor-roadmaps": "tsx ./scripts/migrate-editor-roadmap.ts",
"sync:content-to-repo": "tsx ./scripts/sync-content-to-repo.ts",
"sync:repo-to-database": "tsx ./scripts/sync-repo-to-database.ts",
"sync:roadmap": "tsx ./scripts/sync-roadmap-to-database.ts",
"migrate:content-repo-to-database": "tsx ./scripts/migrate-content-repo-to-database.ts",
"cleanup:orphaned-content": "tsx ./scripts/cleanup-orphaned-content.ts",
"official:roadmap-assets": "tsx ./scripts/official-roadmap-assets.ts",
"test:e2e": "playwright test"
},
"dependencies": {
"@ai-sdk/react": "2.0.0-beta.34",
"@astrojs/node": "^9.2.1",
"@astrojs/react": "^4.2.7",
"@astrojs/sitemap": "^3.4.0",
"@fingerprintjs/fingerprintjs": "^4.6.2",
"@microsoft/clarity": "^1.0.0",
"@nanostores/react": "^1.0.0",
"@napi-rs/image": "^1.9.2",
"@radix-ui/react-dropdown-menu": "^2.1.15",
"@radix-ui/react-popover": "^1.1.14",
"@resvg/resvg-js": "^2.6.2",
"@roadmapsh/editor": "workspace:*",
"@shikijs/transformers": "^3.9.2",
"@tailwindcss/vite": "^4.1.7",
"@tanstack/react-query": "^5.76.1",
"@tiptap/core": "^2.12.0",
"@tiptap/extension-document": "^2.12.0",
"@tiptap/extension-paragraph": "^2.12.0",
"@tiptap/extension-placeholder": "^2.12.0",
"@tiptap/extension-text": "^2.12.0",
"@tiptap/pm": "^2.12.0",
"@tiptap/react": "^2.12.0",
"@tiptap/suggestion": "^2.12.0",
"@types/react": "^19.1.4",
"@types/react-dom": "^19.1.5",
"astro": "^5.7.13",
"clsx": "^2.1.1",
"dayjs": "^1.11.13",
"dom-to-image": "^2.6.0",
"dracula-prism": "^2.1.16",
"gray-matter": "^4.0.3",
"htm": "^3.1.1",
"image-size": "^2.0.2",
"jose": "^6.0.11",
"js-cookie": "^3.0.5",
"katex": "^0.16.22",
"lucide-react": "^0.511.0",
"luxon": "^3.6.1",
"markdown-it-async": "^2.2.0",
"nanoid": "^5.1.5",
"nanostores": "^1.0.1",
"node-html-parser": "^7.0.1",
"npm-check-updates": "^18.0.1",
"playwright": "^1.52.0",
"prismjs": "^1.30.0",
"radix-ui": "^1.4.2",
"react": "^19.1.0",
"react-calendar-heatmap": "^1.10.0",
"react-confetti": "^6.4.0",
"react-dom": "^19.1.0",
"react-dropzone": "^14.3.8",
"react-markdown": "^10.1.0",
"react-resizable-panels": "^3.0.2",
"react-textarea-autosize": "^8.5.9",
"react-tooltip": "^5.28.1",
"rehype-external-links": "^3.0.0",
"rehype-katex": "^7.0.1",
"remark-gfm": "^4.0.1",
"remark-math": "^6.0.0",
"remark-parse": "^11.0.0",
"roadmap-renderer": "^1.0.7",
"sanitize-html": "^2.17.0",
"satori": "^0.13.1",
"satori-html": "^0.3.2",
"sharp": "^0.34.1",
"shiki": "^3.4.2",
"slugify": "^1.6.6",
"tailwind-merge": "^3.3.0",
"tailwindcss": "^4.1.7",
"tippy.js": "^6.3.7",
"tiptap-markdown": "^0.8.10",
"turndown": "^7.2.0",
"unified": "^11.0.5",
"zod": "^4.0.17",
"zustand": "^5.0.4"
},
"devDependencies": {
"@ai-sdk/google": "^1.2.18",
"@playwright/test": "^1.52.0",
"@tailwindcss/typography": "^0.5.16",
"@types/dom-to-image": "^2.6.7",
"@types/js-cookie": "^3.0.6",
"@types/luxon": "^3.6.2",
"@types/markdown-it": "^14.1.2",
"@types/prismjs": "^1.26.5",
"@types/react-calendar-heatmap": "^1.9.0",
"@types/react-slick": "^0.23.13",
"@types/sanitize-html": "^2.16.0",
"@types/turndown": "^5.0.5",
"ai": "5.0.0-beta.34",
"csv-parser": "^3.2.0",
"gh-pages": "^6.3.0",
"js-yaml": "^4.1.0",
"markdown-it": "^14.1.0",
"openai": "^4.100.0",
"prettier": "^3.5.3",
"prettier-plugin-astro": "^0.14.1",
"prettier-plugin-tailwindcss": "^0.6.11",
"tailwind-scrollbar": "^4.0.2",
"tsx": "^4.19.4"
}
}
================================================
FILE: packages/.gitkeep
================================================
================================================
FILE: playwright.config.ts
================================================
import type { PlaywrightTestConfig } from '@playwright/test';
import { devices } from '@playwright/test';
/**
* Read environment variables from file.
* https://github.com/motdotla/dotenv
*/
// require('dotenv').config();
/**
* See https://playwright.dev/docs/test-configuration.
*/
const config: PlaywrightTestConfig = {
testDir: './tests',
/* Maximum time one test can run for. */
timeout: 30 * 1000,
expect: {
/**
* Maximum time expect() should wait for the condition to be met.
* For example in `await expect(locator).toHaveText();`
*/
timeout: 5000,
},
/* Run tests in files in parallel */
fullyParallel: true,
/* Fail the build on CI if you accidentally left test.only in the source code. */
forbidOnly: !!process.env.CI,
/* Retry on CI only */
retries: process.env.CI ? 2 : 0,
/* Opt out of parallel tests on CI. */
workers: process.env.CI ? 1 : undefined,
/* Reporter to use. See https://playwright.dev/docs/test-reporters */
reporter: 'html',
/* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */
use: {
/* Maximum time each action such as `click()` can take. Defaults to 0 (no limit). */
actionTimeout: 0,
/* Base URL to use in actions like `await page.goto('/')`. */
baseURL: 'http://localhost:3000',
/* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */
trace: 'on-first-retry',
},
/* Configure projects for major browsers */
projects: [
{
name: 'chromium',
use: {
...devices['Desktop Chrome'],
},
},
// {
// name: 'firefox',
// use: {
// ...devices['Desktop Firefox'],
// },
// },
// {
// name: 'webkit',
// use: {
// ...devices['Desktop Safari'],
// },
// },
/* Test against mobile viewports. */
// {
// name: 'Mobile Chrome',
// use: {
// ...devices['Pixel 5'],
// },
// },
// {
// name: 'Mobile Safari',
// use: {
// ...devices['iPhone 12'],
// },
// },
/* Test against branded browsers. */
// {
// name: 'Microsoft Edge',
// use: {
// channel: 'msedge',
// },
// },
// {
// name: 'Google Chrome',
// use: {
// channel: 'chrome',
// },
// },
],
/* Folder for test artifacts such as screenshots, videos, traces, etc. */
// outputDir: 'test-results/',
/* Run your local dev server before starting the tests */
webServer: {
command: 'npm run dev',
url: 'http://localhost:3000',
reuseExistingServer: !process.env.CI,
},
};
export default config;
================================================
FILE: pnpm-workspace.yaml
================================================
packages:
- packages/*
================================================
FILE: public/manifest/manifest.json
================================================
{
"dir": "ltr",
"lang": "en",
"name": "Roadmap",
"scope": "/",
"display": "standalone",
"start_url": "https://roadmap.sh/",
"short_name": "Roadmap",
"theme_color": "#EDD07E",
"description": "Roadmaps to becoming a Modern Developer – roadmap.sh",
"orientation": "any",
"background_color": "#101010",
"related_applications": [],
"prefer_related_applications": false,
"icons": [
{
"src": "/manifest/icon152.png",
"sizes": "152x152",
"type": "image/png"
},
{
"src": "/manifest/icon196.png",
"sizes": "196x196",
"type": "image/png"
}
]
}
================================================
FILE: readme.md
================================================
<p align="center">
<a href="https://roadmap.sh/"><img src="public/img/brand.png" height="128"></a>
<h2 align="center"><a href="https://roadmap.sh">roadmap.sh</a></h2>
<p align="center">Community driven roadmaps, articles and resources for developers<p>
<p align="center">
<a href="https://roadmap.sh/roadmaps">
<img src="https://img.shields.io/badge/%E2%9C%A8-Roadmaps%20-0a0a0a.svg?style=flat&colorA=0a0a0a" alt="roadmaps" />
</a>
<a href="https://roadmap.sh/best-practices">
<img src="https://img.shields.io/badge/%E2%9C%A8-Best%20Practices-0a0a0a.svg?style=flat&colorA=0a0a0a" alt="best practices" />
</a>
<a href="https://roadmap.sh/questions">
<img src="https://img.shields.io/badge/%E2%9C%A8-Questions-0a0a0a.svg?style=flat&colorA=0a0a0a" alt="videos" />
</a>
<a href="https://www.youtube.com/channel/UCA0H2KIWgWTwpTFjSxp0now?sub_confirmation=1">
<img src="https://img.shields.io/badge/%E2%9C%A8-YouTube%20Channel-0a0a0a.svg?style=flat&colorA=0a0a0a" alt="roadmaps" />
</a>
</p>
</p>
<br>

Roadmaps are now interactive, you can click the nodes to read more about the topics.
### [View all Roadmaps](https://roadmap.sh) · [Best Practices](https://roadmap.sh/best-practices) · [Questions](https://roadmap.sh/questions)

Here is the list of available roadmaps with more being actively worked upon.
> Have a look at the [get started](https://roadmap.sh/get-started) page that might help you pick up a path.
- [Frontend Roadmap](https://roadmap.sh/frontend) / [Frontend Beginner Roadmap](https://roadmap.sh/frontend?r=frontend-beginner)
- [Backend Roadmap](https://roadmap.sh/backend) / [Backend Beginner Roadmap](https://roadmap.sh/backend?r=backend-beginner)
- [DevOps Roadmap](https://roadmap.sh/devops) / [DevOps Beginner Roadmap](https://roadmap.sh/devops?r=devops-beginner)
- [DevSecOps Roadmap](https://roadmap.sh/devsecops)
- [Full Stack Roadmap](https://roadmap.sh/full-stack)
- [HTML Roadmap](https://roadmap.sh/html)
- [CSS Roadmap](https://roadmap.sh/css)
- [JavaScript Roadmap](https://roadmap.sh/javascript)
- [TypeScript Roadmap](https://roadmap.sh/typescript)
- [Git and GitHub](https://roadmap.sh/git-github) / [Git and GitHub Beginner](https://roadmap.sh/git-github?r=git-github-beginner)
- [API Design Roadmap](https://roadmap.sh/api-design)
- [Computer Science Roadmap](https://roadmap.sh/computer-science)
- [Data Structures and Algorithms Roadmap](https://roadmap.sh/datastructures-and-algorithms)
- [AI and Data Scientist Roadmap](https://roadmap.sh/ai-data-scientist)
- [AI Engineer Roadmap](https://roadmap.sh/ai-engineer)
- [AWS Roadmap](https://roadmap.sh/aws)
- [Cloudflare Roadmap](https://roadmap.sh/cloudflare)
- [Linux Roadmap](https://roadmap.sh/linux)
- [Terraform Roadmap](https://roadmap.sh/terraform)
- [Data Analyst Roadmap](https://roadmap.sh/data-analyst)
- [BI Analyst Roadmap](https://roadmap.sh/bi-analyst)
- [Data Engineer Roadmap](https://roadmap.sh/data-engineer)
- [Machine Learning Roadmap](https://roadmap.sh/machine-learning)
- [MLOps Roadmap](https://roadmap.sh/mlops)
- [Product Manager Roadmap](https://roadmap.sh/product-manager)
- [Engineering Manager Roadmap](https://roadmap.sh/engineering-manager)
- [QA Roadmap](https://roadmap.sh/qa)
- [Python Roadmap](https://roadmap.sh/python)
- [Django Roadmap](https://roadmap.sh/django)
- [Software Architect Roadmap](https://roadmap.sh/software-architect)
- [Game Developer Roadmap](https://roadmap.sh/game-developer) / [Server Side Game Developer](https://roadmap.sh/server-side-game-developer)
- [Software Design and Architecture Roadmap](https://roadmap.sh/software-design-architecture)
- [C++ Roadmap](https://roadmap.sh/cpp)
- [React Roadmap](https://roadmap.sh/react)
- [Next.js Roadmap](https://roadmap.sh/nextjs)
- [React Native Roadmap](https://roadmap.sh/react-native)
- [Vue Roadmap](https://roadmap.sh/vue)
- [Angular Roadmap](https://roadmap.sh/angular)
- [Node.js Roadmap](https://roadmap.sh/nodejs)
- [PHP Roadmap](https://roadmap.sh/php)
- [WordPress Roadmap](https://roadmap.sh/wordpress)
- [Laravel Roadmap](https://roadmap.sh/laravel)
- [GraphQL Roadmap](https://roadmap.sh/graphql)
- [Android Roadmap](https://roadmap.sh/android)
- [iOS Roadmap](https://roadmap.sh/ios)
- [Swift/Swift UI Roadmap](https://roadmap.sh/swift-ui)
- [Flutter Roadmap](https://roadmap.sh/flutter)
- [Go Roadmap](https://roadmap.sh/golang)
- [Rust Roadmap](https://roadmap.sh/rust)
- [Java Roadmap](https://roadmap.sh/java)
- [Kotlin Roadmap](https://roadmap.sh/kotlin)
- [Spring Boot Roadmap](https://roadmap.sh/spring-boot)
- [Design System Roadmap](https://roadmap.sh/design-system)
- [PostgreSQL Roadmap](https://roadmap.sh/postgresql-dba)
- [ElasticSearch Roadmap](https://roadmap.sh/elasticsearch)
- [SQL Roadmap](https://roadmap.sh/sql)
- [Redis Roadmap](https://roadmap.sh/redis)
- [Blockchain Roadmap](https://roadmap.sh/blockchain)
- [ASP.NET Core Roadmap](https://roadmap.sh/aspnet-core)
- [System Design Roadmap](https://roadmap.sh/system-design)
- [Kubernetes Roadmap](https://roadmap.sh/kubernetes)
- [Cyber Security Roadmap](https://roadmap.sh/cyber-security)
- [MongoDB Roadmap](https://roadmap.sh/mongodb)
- [UX Design Roadmap](https://roadmap.sh/ux-design)
- [Docker Roadmap](https://roadmap.sh/docker)
- [Prompt Engineering Roadmap](https://roadmap.sh/prompt-engineering)
- [Technical Writer Roadmap](https://roadmap.sh/technical-writer)
- [DevRel Engineer Roadmap](https://roadmap.sh/devrel)
- [AI Red Teaming Roadmap](https://roadmap.sh/ai-red-teaming)
- [AI Agents Roadmap](https://roadmap.sh/ai-agents)
- [Bash/Shell Roadmap](https://roadmap.sh/shell-bash)
There are also interactive best practices:
- [Backend Performance Best Practices](https://roadmap.sh/best-practices/backend-performance)
- [Frontend Performance Best Practices](https://roadmap.sh/best-practices/frontend-performance)
- [Code Review Best Practices](https://roadmap.sh/best-practices/code-review)
- [API Security Best Practices](https://roadmap.sh/best-practices/api-security)
- [AWS Best Practices](https://roadmap.sh/best-practices/aws)
..and questions to help you test, rate and improve your knowledge
- [JavaScript Questions](https://roadmap.sh/questions/javascript)
- [Node.js Questions](https://roadmap.sh/questions/nodejs)
- [React Questions](https://roadmap.sh/questions/react)
- [Backend Questions](https://roadmap.sh/questions/backend)
- [Frontend Questions](https://roadmap.sh/questions/frontend)

## Share with the community
Please consider sharing a post about [roadmap.sh](https://roadmap.sh) and the value it provides. It really does help!
[](https://reddit.com/submit?url=https://roadmap.sh&title=Interactive%20roadmaps,%20guides%20and%20other%20educational%20content%20for%20Developers)
[](https://news.ycombinator.com/submitlink?u=https://roadmap.sh)
[](https://twitter.com/share?url=https://roadmap.sh&text=Interactive%20roadmaps,%20guides%20and%20other%20educational%20content%20for%20Developers)
[](https://www.facebook.com/sharer/sharer.php?u=https://roadmap.sh)
[](https://www.linkedin.com/shareArticle?url=https://roadmap.sh&title=Interactive%20roadmaps,%20guides%20and%20other%20educational%20content%20for%20Developers)
## Development
Clone the repository, install the dependencies and start the application
```bash
git clone git@github.com:kamranahmedse/developer-roadmap.git --depth 1
cd developer-roadmap
pnpm add @roadmapsh/editor@npm:@roadmapsh/dummy-editor -w
pnpm install
```
Run the development server with:
```bash
pnpm dev
```
> Make sure to rename `.env.example` to `.env` before running the app.
## Contribution
> Have a look at [contribution docs](./contributing.md) for how to update any of the roadmaps
- Add content to roadmaps
- Add new roadmaps
- Suggest changes to existing roadmaps
- Discuss ideas in issues
- Spread the word
## Thanks to all contributors ❤
<a href = "https://github.com/kamranahmedse/developer-roadmap/graphs/contributors">
<img src = "https://contrib.rocks/image?repo=kamranahmedse/developer-roadmap"/>
</a>
## License
Have a look at the [license file](./license) for details
================================================
FILE: scripts/assign-label-types.cjs
================================================
const fs = require('node:fs');
const path = require('node:path');
const allRoadmapDirs = fs.readdirSync(
path.join(__dirname, '../src/data/roadmaps'),
);
allRoadmapDirs.forEach((roadmapId) => {
const roadmapDir = path.join(
__dirname,
`../src/data/roadmaps/${roadmapId}/content`,
);
function getHostNameWithoutTld(hostname) {
const parts = hostname.split('.');
return parts.slice(0, parts.length - 1).join('.');
}
function isOfficialWebsite(hostname, fileName, roadmapId) {
fileName = fileName.replace('/index.md', '').replace('.md', '');
const parts = fileName.split('/');
const lastPart = parts[parts.length - 1];
const normalizedFilename = lastPart.replace(/\d+/g, '').replace(/-/g, '');
const normalizedHostname = getHostNameWithoutTld(hostname);
if (normalizedFilename === normalizedHostname) {
return true;
}
if (normalizedFilename.includes(normalizedHostname)) {
return true;
}
return !!roadmapId.includes(normalizedHostname);
}
// websites are educational websites that are of following types:
// - @official@
// - @article@
// - @course@
// - @opensource@
// - @podcast@
// - @video@
// - @website@
// content is only educational websites
function getTypeFromHostname(hostname, fileName, roadmapId) {
hostname = hostname.replace('www.', '');
const videoHostnames = ['youtube.com', 'vimeo.com', 'youtu.be'];
const courseHostnames = ['coursera.org', 'udemy.com', 'edx.org'];
const podcastHostnames = ['spotify.com', 'apple.com'];
const opensourceHostnames = ['github.com', 'gitlab.com'];
const articleHostnames = [
'neilpatel.com',
'learningseo.io',
'htmlreference.io',
'docs.gitlab.com',
'docs.github.com',
'skills.github.com',
'cloudflare.com',
'w3schools.com',
'medium.com',
'dev.to',
'web.dev',
'css-tricks.com',
'developer.mozilla.org',
'smashingmagazine.com',
'freecodecamp.org',
'cs.fyi',
'thenewstack.io',
'html5rocks.com',
'html.com',
'javascript.info',
'css-tricks.com',
'developer.apple.com',
];
if (articleHostnames.includes(hostname)) {
return 'article';
}
if (videoHostnames.includes(hostname)) {
return 'video';
}
if (courseHostnames.includes(hostname)) {
return 'course';
}
if (podcastHostnames.includes(hostname)) {
return 'podcast';
}
if (opensourceHostnames.includes(hostname)) {
return 'opensource';
}
if (hostname === 'roadmap.sh') {
return 'roadmap.sh';
}
if (isOfficialWebsite(hostname, fileName, roadmapId)) {
return 'official';
}
return 'article';
}
function readNestedMarkdownFiles(dir, files = []) {
const dirEnts = fs.readdirSync(dir, { withFileTypes: true });
for (const dirent of dirEnts) {
const fullPath = path.join(dir, dirent.name);
if (dirent.isDirectory()) {
readNestedMarkdownFiles(fullPath, files);
} else {
if (path.extname(fullPath) === '.md') {
files.push(fullPath);
}
}
}
return files;
}
const files = readNestedMarkdownFiles(roadmapDir);
// for each of the files, assign the type of link to the beginning of each markdown link
// i.e. - [@article@abc](xyz) where @article@ is the type of link. Possible types:
// - @official@
// - @opensource@
// - @article@
// - @course@
// - @opensource@
// - @podcast@
// - @video@
files.forEach((file) => {
const content = fs.readFileSync(file, 'utf-8');
const lines = content.split('\n');
const newContent = lines
.map((line) => {
if (line.startsWith('- [') && !line.startsWith('- [@')) {
const type = line.match(/@(\w+)@/);
if (type) {
return line;
}
let urlMatches = line.match(/\((https?:\/\/[^)]+)\)/);
let fullUrl = urlMatches?.[1];
if (!fullUrl) {
// is it slashed URL i.e. - [abc](/xyz)
fullUrl = line.match(/\((\/[^)]+)\)/)?.[1];
if (fullUrl) {
fullUrl = `https://roadmap.sh${fullUrl}`;
}
if (!fullUrl) {
console.error('Invalid URL found in:', file);
return line;
}
}
const url = new URL(fullUrl);
const hostname = url.hostname;
let urlType = getTypeFromHostname(hostname, file, roadmapId);
const linkText = line.match(/\[([^\]]+)\]/)[1];
if (
linkText.toLowerCase().startsWith('visit dedicated') &&
linkText.toLowerCase().endsWith('roadmap')
) {
urlType = 'roadmap';
}
return line.replace('- [', `- [@${urlType}@`).replace('](', '](');
}
return line;
})
.join('\n');
fs.writeFileSync(file, newContent);
});
});
================================================
FILE: scripts/best-practice-content.cjs
================================================
const fs = require('fs');
const path = require('path');
const OPEN_AI_API_KEY = process.env.OPEN_AI_API_KEY;
const ALL_BEST_PRACTICES_DIR = path.join(
__dirname,
'../src/data/best-practices',
);
const bestPracticeId = process.argv[2];
const bestPracticeTitle = bestPracticeId.replace(/-/g, ' ');
const allowedBestPracticeIds = fs.readdirSync(ALL_BEST_PRACTICES_DIR);
if (!bestPracticeId) {
console.error('bestPracticeId is required');
process.exit(1);
}
if (!allowedBestPracticeIds.includes(bestPracticeId)) {
console.error(`Invalid bestPractice key ${bestPracticeId}`);
console.error(`Allowed keys are ${allowedBestPracticeIds.join(', ')}`);
process.exit(1);
}
const BEST_PRACTICE_CONTENT_DIR = path.join(
ALL_BEST_PRACTICES_DIR,
bestPracticeId,
'content',
);
const OpenAI = require('openai');
const openai = new OpenAI({
apiKey: OPEN_AI_API_KEY,
});
function getFilesInFolder(folderPath, fileList = {}) {
const files = fs.readdirSync(folderPath);
files.forEach((file) => {
const filePath = path.join(folderPath, file);
const stats = fs.statSync(filePath);
if (stats.isDirectory()) {
getFilesInFolder(filePath, fileList);
} else if (stats.isFile()) {
const fileUrl = filePath
.replace(BEST_PRACTICE_CONTENT_DIR, '') // Remove the content folder
.replace(/\/\d+-/g, '/') // Remove ordering info `/101-ecosystem`
.replace(/\/index\.md$/, '') // Make the `/index.md` to become the parent folder only
.replace(/\.md$/, ''); // Remove `.md` from the end of file
fileList[fileUrl] = filePath;
}
});
return fileList;
}
function writeTopicContent(topicTitle) {
let prompt = `I will give you a topic and you need to write a brief paragraph with examples (if possible) about why it is important for the "${bestPracticeTitle}". Just reply to the question without adding any other information about the prompt and use simple language. Also do not start your sentences with "XYZ is important because..". Your format should be as follows:
# (Put a heading for the topic)
(Write a brief paragraph about why it is important for the "${bestPracticeTitle})
First topic is: ${topicTitle}`;
console.log(`Generating '${topicTitle}'...`);
return new Promise((resolve, reject) => {
openai.chat.completions
.create({
model: 'gpt-4',
messages: [
{
role: 'user',
content: prompt,
},
],
})
.then((response) => {
const article = response.choices[0].message.content;
resolve(article);
})
.catch((err) => {
reject(err);
});
});
}
async function writeFileForGroup(group, topicUrlToPathMapping) {
const topicId = group?.properties?.controlName;
const topicTitle = group?.children?.controls?.control
?.filter((control) => control?.typeID === 'Label')
.map((control) => control?.properties?.text)
.join(' ')
.toLowerCase();
const currTopicUrl = `/${topicId}`;
if (currTopicUrl.startsWith('/check:')) {
return;
}
const contentFilePath = topicUrlToPathMapping[currTopicUrl];
if (!contentFilePath) {
console.log(`Missing file for: ${currTopicUrl}`);
return;
}
const currentFileContent = fs.readFileSync(contentFilePath, 'utf8');
const isFileEmpty = currentFileContent.replace(/^#.+/, ``).trim() === '';
if (!isFileEmpty) {
console.log(`Ignoring ${topicId}. Not empty.`);
return;
}
let newFileContent = `# ${topicTitle}`;
if (!OPEN_AI_API_KEY) {
console.log(`Writing ${topicId}..`);
fs.writeFileSync(contentFilePath, newFileContent, 'utf8');
return;
}
if (!topicTitle) {
console.log(`Skipping ${topicId}. No title.`);
return;
}
const topicContent = await writeTopicContent(topicTitle);
newFileContent = `${topicContent}`;
console.log(`Writing ${topicId}..`);
fs.writeFileSync(contentFilePath, newFileContent, 'utf8');
// console.log(currentFileContent);
// console.log(currTopicUrl);
// console.log(topicTitle);
// console.log(topicUrlToPathMapping[currTopicUrl]);
}
async function run() {
const topicUrlToPathMapping = getFilesInFolder(BEST_PRACTICE_CONTENT_DIR);
const bestPracticeJson = require(
path.join(ALL_BEST_PRACTICES_DIR, `${bestPracticeId}/${bestPracticeId}`),
);
const groups = bestPracticeJson?.mockup?.controls?.control?.filter(
(control) =>
control.typeID === '__group__' &&
!control.properties?.controlName?.startsWith('ext_link'),
);
if (!OPEN_AI_API_KEY) {
console.log('----------------------------------------');
console.log('OPEN_AI_API_KEY not found. Skipping openai api calls...');
console.log('----------------------------------------');
}
const writePromises = [];
for (let group of groups) {
writePromises.push(writeFileForGroup(group, topicUrlToPathMapping));
}
console.log('Waiting for all files to be written...');
await Promise.all(writePromises);
}
run()
.then(() => {
console.log('Done');
})
.catch((err) => {
console.error(err);
process.exit(1);
});
================================================
FILE: scripts/best-practice-dirs.cjs
================================================
const fs = require('fs');
const path = require('path');
const CONTENT_DIR = path.join(__dirname, '../content');
// Directory containing the best-practices
const BEST_PRACTICE_CONTENT_DIR = path.join(
__dirname,
'../src/data/best-practices',
);
const bestPracticeId = process.argv[2];
const allowedBestPracticeId = fs.readdirSync(BEST_PRACTICE_CONTENT_DIR);
if (!bestPracticeId) {
console.error('bestPractice is required');
process.exit(1);
}
if (!allowedBestPracticeId.includes(bestPracticeId)) {
console.error(`Invalid best practice key ${bestPracticeId}`);
console.error(`Allowed keys are ${allowedBestPracticeId.join(', ')}`);
process.exit(1);
}
// Directory holding the best parctice content files
const bestPracticeDirName = fs
.readdirSync(BEST_PRACTICE_CONTENT_DIR)
.find((dirName) => dirName.replace(/\d+-/, '') === bestPracticeId);
if (!bestPracticeDirName) {
console.error('Best practice directory not found');
process.exit(1);
}
const bestPracticeDirPath = path.join(
BEST_PRACTICE_CONTENT_DIR,
bestPracticeDirName,
);
const bestPracticeContentDirPath = path.join(
BEST_PRACTICE_CONTENT_DIR,
bestPracticeDirName,
'content',
);
// If best practice content already exists do not proceed as it would override the files
if (fs.existsSync(bestPracticeContentDirPath)) {
console.error(
`Best Practice content already exists @ ${bestPracticeContentDirPath}`,
);
process.exit(1);
}
function prepareDirTree(control, dirTree) {
// Directories are only created for groups
if (control.typeID !== '__group__') {
return;
}
// e.g. 104-testing-your-apps:other-options
const controlName = control?.properties?.controlName || '';
// No directory for a group without control name
if (
!controlName ||
controlName.startsWith('check:') ||
controlName.startsWith('ext_link:')
) {
return;
}
// e.g. ['testing-your-apps', 'other-options']
const dirParts = controlName.split(':');
// Nest the dir path in the dirTree
let currDirTree = dirTree;
dirParts.forEach((dirPart) => {
currDirTree[dirPart] = currDirTree[dirPart] || {};
currDirTree = currDirTree[dirPart];
});
const childrenControls = control.children.controls.control;
// No more children
if (childrenControls.length) {
childrenControls.forEach((childControl) => {
prepareDirTree(childControl, dirTree);
});
}
return { dirTree };
}
const bestPractice = require(
path.join(
__dirname,
`../src/data/best-practices/${bestPracticeId}/${bestPracticeId}`,
),
);
const controls = bestPractice.mockup.controls.control;
// Prepare the dir tree that we will be creating
const dirTree = {};
controls.forEach((control) => {
prepareDirTree(control, dirTree);
});
/**
* @param parentDir Parent directory in which directory is to be created
* @param dirTree Nested dir tree to be created
* @param filePaths The mapping from groupName to file path
*/
function createDirTree(parentDir, dirTree, filePaths = {}) {
const childrenDirNames = Object.keys(dirTree);
const hasChildren = childrenDirNames.length !== 0;
// @todo write test for this, yolo for now
const groupName = parentDir
.replace(bestPracticeContentDirPath, '') // Remove base dir path
.replace(/(^\/)|(\/$)/g, '') // Remove trailing slashes
.replaceAll('/', ':') // Replace slashes with `:`
.replace(/:\d+-/, ':');
const humanizedGroupName = groupName
.split(':')
.pop()
?.replaceAll('-', ' ')
.replace(/^\w/, ($0) => $0.toUpperCase());
// If no children, create a file for this under the parent directory
if (!hasChildren) {
let fileName = `${parentDir}.md`;
fs.writeFileSync(fileName, `# ${humanizedGroupName}`);
filePaths[groupName || 'home'] = fileName.replace(CONTENT_DIR, '');
return filePaths;
}
// There *are* children, so create the parent as a directory
// and create `index.md` as the content file for this
fs.mkdirSync(parentDir);
let readmeFilePath = path.join(parentDir, 'index.md');
fs.writeFileSync(readmeFilePath, `# ${humanizedGroupName}`);
filePaths[groupName || 'home'] = readmeFilePath.replace(CONTENT_DIR, '');
// For each of the directory names, create a
// directory inside the given directory
childrenDirNames.forEach((dirName) => {
createDirTree(path.join(parentDir, dirName), dirTree[dirName], filePaths);
});
return filePaths;
}
// Create directories and get back the paths for created directories
createDirTree(bestPracticeContentDirPath, dirTree);
console.log('Created best practice content directory structure');
================================================
FILE: scripts/cleanup-orphaned-content.ts
================================================
import type { Node } from '@roadmapsh/editor';
import matter from 'gray-matter';
import fs from 'node:fs/promises';
import path from 'node:path';
import { fileURLToPath } from 'node:url';
import { slugify } from '../src/lib/slugger';
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
const ROADMAP_CONTENT_DIR = path.join(__dirname, '../src/data/roadmaps');
const args = process.argv.slice(2);
const roadmapSlug = args?.[0]?.replace('--roadmap-slug=', '');
if (!roadmapSlug) {
console.error('Usage: tsx scripts/cleanup-orphaned-content.ts --roadmap-slug=<slug|__all__>');
process.exit(1);
}
interface OrphanEntry {
file: string;
reason: string;
duplicateOf: string;
action: 'deleted' | 'renamed';
renamedTo?: string;
}
async function fetchRoadmapJson(slug: string): Promise<{ nodes: Node[] }> {
try {
const response = await fetch(
`https://roadmap.sh/api/v1-official-roadmap/${slug}`,
);
if (!response.ok) {
throw new Error(`HTTP ${response.status}`);
}
const data = await response.json();
if (data.error) {
throw new Error(data.error);
}
return data;
} catch (err) {
console.log(` API fetch failed for ${slug}, falling back to local JSON`);
const localPath = path.join(ROADMAP_CONTENT_DIR, slug, `${slug}.json`);
const raw = await fs.readFile(localPath, 'utf-8');
return JSON.parse(raw);
}
}
async function isEditorRoadmap(slug: string): Promise<boolean> {
const mdPath = path.join(ROADMAP_CONTENT_DIR, slug, `${slug}.md`);
try {
const raw = await fs.readFile(mdPath, 'utf-8');
const { data } = matter(raw);
return data.renderer === 'editor';
} catch {
return false;
}
}
async function getEditorRoadmapSlugs(): Promise<string[]> {
const allDirs = await fs.readdir(ROADMAP_CONTENT_DIR);
const results: string[] = [];
for (const dir of allDirs) {
const stat = await fs.stat(path.join(ROADMAP_CONTENT_DIR, dir)).catch(() => null);
if (!stat?.isDirectory()) {
continue;
}
if (await isEditorRoadmap(dir)) {
results.push(dir);
}
}
return results;
}
function parseContentFilename(filename: string): { slug: string; nodeId: string } | null {
const match = filename.match(/^(.+)@([^.]+)\.md$/);
if (!match) {
return null;
}
return { slug: match[1], nodeId: match[2] };
}
async function cleanupRoadmap(slug: string): Promise<OrphanEntry[]> {
console.log(`\nProcessing: ${slug}`);
const contentDir = path.join(ROADMAP_CONTENT_DIR, slug, 'content');
const stat = await fs.stat(contentDir).catch(() => null);
if (!stat?.isDirectory()) {
console.log(` No content directory found, skipping`);
return [];
}
const roadmapData = await fetchRoadmapJson(slug);
if (!roadmapData?.nodes) {
console.log(` No nodes found in roadmap JSON, skipping`);
return [];
}
const topicNodes = roadmapData.nodes.filter(
(node) =>
node?.type &&
['topic', 'subtopic'].includes(node.type) &&
node.data?.label,
);
const validNodeIds = new Set<string>();
const nodeIdToExpectedSlug = new Map<string, string>();
for (const node of topicNodes) {
validNodeIds.add(node.id);
nodeIdToExpectedSlug.set(node.id, slugify(node.data.label as string));
}
const files = await fs.readdir(contentDir);
const orphans: OrphanEntry[] = [];
const validFilesBySlug = new Map<string, string>();
for (const file of files) {
const parsed = parseContentFilename(file);
if (!parsed) {
continue;
}
if (validNodeIds.has(parsed.nodeId) && nodeIdToExpectedSlug.get(parsed.nodeId) === parsed.slug) {
validFilesBySlug.set(parsed.slug, file);
}
}
for (const file of files) {
const parsed = parseContentFilename(file);
if (!parsed) {
continue;
}
const { slug: fileSlug, nodeId } = parsed;
if (validNodeIds.has(nodeId)) {
const expectedSlug = nodeIdToExpectedSlug.get(nodeId)!;
if (fileSlug === expectedSlug) {
continue;
}
const correctFile = `${expectedSlug}@${nodeId}.md`;
const correctFileExists = files.includes(correctFile);
if (correctFileExists) {
orphans.push({
file,
reason: 'Same nodeId, old slug',
duplicateOf: correctFile,
action: 'deleted',
});
} else {
orphans.push({
file,
reason: 'Same nodeId, old slug',
duplicateOf: correctFile,
action: 'renamed',
renamedTo: correctFile,
});
}
continue;
}
const validFile = validFilesBySlug.get(fileSlug);
if (validFile) {
orphans.push({
file,
reason: 'Same slug, old nodeId',
duplicateOf: validFile,
action: 'deleted',
});
} else {
orphans.push({
file,
reason: 'Topic removed from roadmap',
duplicateOf: 'N/A',
action: 'deleted',
});
}
}
for (const orphan of orphans) {
const filePath = path.join(contentDir, orphan.file);
if (orphan.action === 'renamed') {
const newPath = path.join(contentDir, orphan.renamedTo!);
await fs.rename(filePath, newPath);
console.log(` Renamed: ${orphan.file} -> ${orphan.renamedTo} (${orphan.reason})`);
} else {
await fs.unlink(filePath);
console.log(` Deleted: ${orphan.file} (${orphan.reason})`);
}
}
if (orphans.length === 0) {
console.log(` No orphans found`);
}
return orphans;
}
async function main() {
const slugs =
roadmapSlug === '__all__'
? await getEditorRoadmapSlugs()
: [roadmapSlug];
if (roadmapSlug !== '__all__') {
if (!(await isEditorRoadmap(roadmapSlug))) {
console.error(`${roadmapSlug} is not an editor-rendered roadmap`);
process.exit(1);
}
}
console.log(`Processing ${slugs.length} roadmap(s)...`);
const allOrphans = new Map<string, OrphanEntry[]>();
let totalOrphans = 0;
for (const slug of slugs) {
const orphans = await cleanupRoadmap(slug);
if (orphans.length > 0) {
allOrphans.set(slug, orphans);
totalOrphans += orphans.length;
}
}
const roadmapsAffected = allOrphans.size;
let summary = `## Orphaned Content Cleanup\n\n`;
summary += `Cleaned up **${totalOrphans}** orphaned content file(s) across **${roadmapsAffected}** roadmap(s).\n\n`;
for (const [slug, orphans] of allOrphans) {
summary += `### ${slug}\n\n`;
summary += `| File | Action | Reason | Duplicate Of |\n`;
summary += `|---|---|---|---|\n`;
for (const orphan of orphans) {
const action = orphan.action === 'renamed' ? `Renamed to \`${orphan.renamedTo}\`` : 'Deleted';
const dupOf = orphan.duplicateOf === 'N/A' ? 'N/A' : `\`${orphan.duplicateOf}\``;
summary += `| \`${orphan.file}\` | ${action} | ${orphan.reason} | ${dupOf} |\n`;
}
summary += `\n`;
}
const summaryPath = path.join(__dirname, '..', '.cleanup-summary.md');
await fs.writeFile(summaryPath, summary);
console.log(`\nSummary written to .cleanup-summary.md`);
console.log(`Total: ${totalOrphans} orphaned file(s) cleaned up across ${roadmapsAffected} roadmap(s)`);
}
main().catch((err) => {
console.error(err);
process.exit(1);
});
================================================
FILE: scripts/close-issues.sh
================================================
#!/usr/bin/env bash
# Fetch issues JSON data and parse it properly
issues=$(gh issue list --repo kamranahmedse/developer-roadmap --search "sort:created-asc" --state open --limit 500 --json number,title,createdAt,updatedAt,state,url,comments,reactionGroups,body | jq -c '.[]')
# Loop through the issues and delete the ones created in 2022 and not updated in the past year
while IFS= read -r issue; do
created_at=$(echo "$issue" | jq -r '.createdAt')
updated_at=$(echo "$issue" | jq -r '.updatedAt')
issue_number=$(echo "$issue" | jq -r '.number')
issue_title=$(echo "$issue" | jq -r '.title')
reaction_groups=$(echo "$issue" | jq -r '.reactionGroups')
has_reactions=$(echo "$issue" | jq -r '.reactionGroups | length')
comment_count=$(echo "$issue" | jq -r '.comments | length')
body_characters=$(echo "$issue" | jq -r '.body | length')
# if has empty body
if [[ "$created_at" == 2024-01* ]]; then
comment="Hey there!
Looks like this issue has been hanging around for a bit without much action. Our roadmaps have evolved quite a bit since then, and a bunch of older issues aren't really applicable anymore. So, we're tidying things up by closing out the older ones to keep our issue tracker nice and organized for future feedback.
If you still think this problem needs addressing, don't hesitate to reopen the issue. We're here to help!
Thanks a bunch!"
gh issue comment "$issue_number" --body "$comment"
gh issue close "$issue_number"
fi
done <<< "$issues"
================================================
FILE: scripts/compress-images.ts
================================================
import fs from 'node:fs/promises';
import path from 'node:path';
import { fileURLToPath } from 'node:url';
import sharp from 'sharp';
// ERROR: `__dirname` is not defined in ES module scope
// https://iamwebwiz.medium.com/how-to-fix-dirname-is-not-defined-in-es-module-scope-34d94a86694d
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
const allowedFileExtensions = [
'.avif',
'.gif',
'.heif',
'.jpeg',
'.png',
'.raw',
'.tiff',
'.webp',
] as const;
type AllowedFileExtension = (typeof allowedFileExtensions)[number];
const publicDir = path.join(__dirname, '../public');
const cacheFile = path.join(__dirname, '/compressed-images.json');
const KB_IN_BYTES = 1024;
const COMPRESS_CONFIG = {
avif: {
chromaSubsampling: '4:4:4',
effort: 9.0,
},
gif: {
effort: 10.0,
},
jpeg: {
chromaSubsampling: '4:4:4',
mozjpeg: true,
trellisQuantisation: true,
overshootDeringing: true,
optimiseScans: true,
},
png: {
compressionLevel: 9.0,
palette: true,
},
raw: {},
tiff: {
compression: 'lzw',
},
webp: {
effort: 6.0,
},
};
(async () => {
let cache: string[] = [];
const isCacheFileExists = await fs
.access(cacheFile)
.then(() => true)
.catch(() => false);
if (isCacheFileExists) {
const cacheFileContent = await fs.readFile(cacheFile, 'utf8');
cache = JSON.parse(cacheFileContent);
}
const images = await recursiveGetImages(publicDir);
for (const image of images) {
const extname = path.extname(image).toLowerCase() as AllowedFileExtension;
if (
!allowedFileExtensions.includes(extname) ||
image.includes('node_modules') ||
image.includes('.astro') ||
image.includes('.vscode') ||
image.includes('.git')
) {
continue;
}
const stats = await fs.stat(image);
const relativeImagePath = path.relative(path.join(__dirname, '..'), image);
if (cache.includes(relativeImagePath)) {
continue;
}
const prevSize = stats.size / KB_IN_BYTES;
let imageBuffer: Buffer | undefined;
switch (extname) {
case '.avif':
imageBuffer = await sharp(image).avif(COMPRESS_CONFIG.avif).toBuffer();
break;
case '.heif':
imageBuffer = await sharp(image).heif().toBuffer();
break;
case '.jpeg':
imageBuffer = await sharp(image).jpeg(COMPRESS_CONFIG.jpeg).toBuffer();
break;
case '.png':
imageBuffer = await sharp(image).png(COMPRESS_CONFIG.png).toBuffer();
break;
case '.raw':
imageBuffer = await sharp(image).raw().toBuffer();
break;
case '.tiff':
imageBuffer = await sharp(image).tiff(COMPRESS_CONFIG.tiff).toBuffer();
break;
case '.webp':
imageBuffer = await sharp(image).webp(COMPRESS_CONFIG.webp).toBuffer();
break;
case '.gif':
continue;
}
if (!imageBuffer) {
console.error(`❌ ${image} Compressing failed!`);
continue;
}
const newSize = imageBuffer.length / KB_IN_BYTES;
const diff = prevSize - newSize;
if (diff <= 0) {
console.log(`📦 Skipped ${relativeImagePath}`);
continue;
}
const diffPercent = ((diff / prevSize) * 100).toFixed(2);
console.log(
`📦 Reduced ${prevSize.toFixed(2)}KB → ${newSize.toFixed(2)}KB (${diff.toFixed(2)}KB, ${diffPercent}%) for ${relativeImagePath}`,
);
await fs.writeFile(image, imageBuffer);
cache.push(relativeImagePath);
// So that we don't lose the cache if the script crashes
await fs.writeFile(cacheFile, JSON.stringify(cache, null, 2), 'utf8');
}
await fs.writeFile(cacheFile, JSON.stringify(cache, null, 2), 'utf8');
})();
async function recursiveGetImages(dir: string): Promise<string[]> {
const subdirs = await fs.readdir(dir, { withFileTypes: true });
const files = await Promise.all(
subdirs.map((dirent) => {
const res = path.resolve(dir, dirent.name);
return dirent.isDirectory() ? recursiveGetImages(res) : res;
}),
);
return Array.prototype.concat(...files);
}
================================================
FILE: scripts/compressed-images.json
================================================
[
"public/authors/dmytrobol.png",
"public/authors/ebrahimbharmal007.png",
"public/authors/jesse.png",
"public/authors/peter-thaleikis.png",
"public/best-practices/api-security.png",
"public/best-practices/aws.png",
"public/best-practices/backend-performance.png",
"public/best-practices/frontend-performance.png",
"public/guides/asymptotic-notation.png",
"public/guides/avoid-render-blocking-javascript-with-async-defer.png",
"public/guides/backend-languages/back-vs-front.png",
"public/guides/backend-languages/backend-roadmap-part.png",
"public/guides/backend-languages/javascript-interest.png",
"public/guides/backend-languages/pypl-go-index.png",
"public/guides/bash-vs-shell.jpeg",
"public/guides/basic-authentication/chrome-basic-auth.png",
"public/guides/basic-authentication/safari-basic-auth.png",
"public/guides/basic-authentication.png",
"public/guides/big-o-notation.png",
"public/guides/character-encodings.png",
"public/guides/ci-cd.png",
"public/guides/dhcp.png",
"public/guides/jwt-authentication.png",
"public/guides/llms.png",
"public/guides/project-history.png",
"public/guides/proxy/forward-proxy.png",
"public/guides/proxy/proxy-example.png",
"public/guides/proxy/reverse-proxy.png",
"public/guides/random-numbers.png",
"public/guides/session-authentication.png",
"public/guides/sli-slo-sla.jpeg",
"public/guides/ssl-tls-https-ssh.png",
"public/guides/token-authentication.png",
"public/guides/torrent-client/download.png",
"public/guides/torrent-client/pipelining.png",
"public/guides/unfamiliar-codebase.png",
"public/guides/web-vitals.png",
"public/img/brand.png",
"public/img/default-avatar.png",
"public/img/features/in-progress.png",
"public/img/icons8-wand.gif",
"public/img/partners/ambassador-graphic-1.png",
"public/img/partners/ambassador-graphic-2.png",
"public/img/partners/apollo-workshop.png",
"public/img/partners/graphql-summit.png",
"public/img/partners/nginx.png",
"public/img/roadmap-editor.jpeg",
"public/img/system-design.png",
"public/img/team-promo/contact.png",
"public/img/team-promo/documentation.png",
"public/img/team-promo/growth-plans.png",
"public/img/team-promo/hero-img.png",
"public/img/team-promo/hero.png",
"public/img/team-promo/invite-members.png",
"public/img/team-promo/many-roadmaps.png",
"public/img/team-promo/onboarding.png",
"public/img/team-promo/our-roadmaps.png",
"public/img/team-promo/progress-tracking.png",
"public/img/team-promo/roadmap-editor.png",
"public/img/team-promo/sharing-settings.png",
"public/img/team-promo/skill-gap.png",
"public/img/team-promo/team-dashboard.png",
"public/img/team-promo/team-insights.png",
"public/img/team-promo/update-progress.png",
"public/manifest/apple-touch-icon.png",
"public/manifest/icon152.png",
"public/manifest/icon196.png",
"public/manifest/icon32.png",
"public/og-images/best-practices/api-security.png",
"public/og-images/best-practices/aws.png",
"public/og-images/best-practices/backend-performance.png",
"public/og-images/best-practices/code-review.png",
"public/og-images/best-practices/frontend-performance.png",
"public/og-images/guides/asymptotic-notation.png",
"public/og-images/guides/avoid-render-blocking-javascript-with-async-defer.png",
"public/og-images/guides/backend-developer-skills.png",
"public/og-images/guides/backend-developer-tools.png",
"public/og-images/guides/backend-languages.png",
"public/og-images/guides/basic-authentication.png",
"public/og-images/guides/basics-of-authentication.png",
"public/og-images/guides/big-o-notation.png",
"public/og-images/guides/character-encodings.png",
"public/og-images/guides/ci-cd.png",
"public/og-images/guides/consistency-patterns-in-distributed-systems.png",
"public/og-images/guides/design-patterns-for-humans.png",
"public/og-images/guides/dhcp-in-one-picture.png",
"public/og-images/guides/dns-in-one-picture.png",
"public/og-images/guides/free-resources-to-learn-llms.png",
"public/og-images/guides/history-of-javascript.png",
"public/og-images/guides/how-to-setup-a-jump-server.png",
"public/og-images/guides/http-basic-authentication.png",
"public/og-images/guides/http-caching.png",
"public/og-images/guides/introduction-to-llms.png",
"public/og-images/guides/journey-to-http2.png",
"public/og-images/guides/jwt-authentication.png",
"public/og-images/guides/levels-of-seniority.png",
"public/og-images/guides/oauth.png",
"public/og-images/guides/proxy-servers.png",
"public/og-images/guides/random-numbers.png",
"public/og-images/guides/scaling-databases.png",
"public/og-images/guides/session-authentication.png",
"public/og-images/guides/session-based-authentication.png",
"public/og-images/guides/setup-and-auto-renew-ssl-certificates.png",
"public/og-images/guides/single-command-database-setup.png",
"public/og-images/guides/ssl-tls-https-ssh.png",
"public/og-images/guides/sso.png",
"public/og-images/guides/token-authentication.png",
"public/og-images/guides/torrent-client.png",
"public/og-images/guides/unfamiliar-codebase.png",
"public/og-images/guides/what-are-web-vitals.png",
"public/og-images/guides/what-is-internet.png",
"public/og-images/guides/what-is-sli-slo-sla.png",
"public/og-images/guides/why-build-it-and-they-will-come-wont-work-anymore.png",
"public/og-images/roadmaps/android.png",
"public/og-images/roadmaps/angular.png",
"public/og-images/roadmaps/aspnet-core.png",
"public/og-images/roadmaps/aws.png",
"public/og-images/roadmaps/backend.png",
"public/og-images/roadmaps/blockchain.png",
"public/og-images/roadmaps/code-review.png",
"public/og-images/roadmaps/computer-science.png",
"public/og-images/roadmaps/cpp.png",
"public/og-images/roadmaps/cyber-security.png",
"public/og-images/roadmaps/data-analyst.png",
"public/og-images/roadmaps/datastructures-and-algorithms.png",
"public/og-images/roadmaps/design-system.png",
"public/og-images/roadmaps/devops.png",
"public/og-images/roadmaps/docker.png",
"public/og-images/roadmaps/flutter.png",
"public/og-images/roadmaps/frontend.png",
"public/og-images/roadmaps/full-stack.png",
"public/og-images/roadmaps/game-developer.png",
"public/og-images/roadmaps/golang.png",
"public/og-images/roadmaps/graphql.png",
"public/og-images/roadmaps/java.png",
"public/og-images/roadmaps/javascript.png",
"public/og-images/roadmaps/kubernetes.png",
"public/og-images/roadmaps/mlops.png",
"public/og-images/roadmaps/mongodb.png",
"public/og-images/roadmaps/nodejs.png",
"public/og-images/roadmaps/postgresql-dba.png",
"public/og-images/roadmaps/prompt-engineering.png",
"public/og-images/roadmaps/python.png",
"public/og-images/roadmaps/qa.png",
"public/og-images/roadmaps/react-native.png",
"public/og-images/roadmaps/react.png",
"public/og-images/roadmaps/rust.png",
"public/og-images/roadmaps/server-side-game-developer.png",
"public/og-images/roadmaps/software-architect.png",
"public/og-images/roadmaps/software-design-architecture.png",
"public/og-images/roadmaps/spring-boot.png",
"public/og-images/roadmaps/sql.png",
"public/og-images/roadmaps/system-design.png",
"public/og-images/roadmaps/technical-writer.png",
"public/og-images/roadmaps/typescript.png",
"public/og-images/roadmaps/ux-design.png",
"public/og-images/roadmaps/vue.png",
"public/og-images/sql-roadmap.png",
"public/roadmaps/android.png",
"public/roadmaps/aspnet-core.png",
"public/roadmaps/aws.png",
"public/roadmaps/backend.png",
"public/roadmaps/blockchain.png",
"public/roadmaps/computer-science.png",
"public/roadmaps/cpp.png",
"public/roadmaps/cyber-security.png",
"public/roadmaps/data-analyst.png",
"public/roadmaps/design-system.png",
"public/roadmaps/devops.png",
"public/roadmaps/docker.png",
"public/roadmaps/flutter.png",
"public/roadmaps/frontend.png",
"public/roadmaps/full-stack.png",
"public/roadmaps/game-developer.png",
"public/roadmaps/graphql.png",
"public/roadmaps/intro.png",
"public/roadmaps/java.png",
"public/roadmaps/javascript.png",
"public/roadmaps/kubernetes.png",
"public/roadmaps/mlops.png",
"public/roadmaps/mongodb.png",
"public/roadmaps/nodejs.png",
"public/roadmaps/python.png",
"public/roadmaps/qa.png",
"public/roadmaps/react.png",
"public/roadmaps/rust.png",
"public/roadmaps/software-architect.png",
"public/roadmaps/software-design-architecture.png",
"public/roadmaps/sql.png",
"public/roadmaps/technical-writer.png",
"public/roadmaps/typescript.png",
"public/roadmaps/ux-design.png",
"public/roadmaps/vue.png",
"public/og-images/roadmaps/ai-data-scientist.png",
"public/og-images/roadmaps/linux.png",
"public/roadmaps/ai-data-scientist.png",
"public/roadmaps/linux.png"
]
================================================
FILE: scripts/create-roadmap-labels.sh
================================================
#!/usr/bin/env bash
# get all the folder names inside src/data/roadmaps
roadmap_ids=$(ls src/data/roadmaps)
# create a label for each roadmap name on github issues using gh cli
for roadmap_id in $roadmap_ids
do
random_color=$(openssl rand -hex 3)
gh label create "$roadmap_id" --color $random_color --description "Roadmap: $roadmap_id"
done
================================================
FILE: scripts/editor-roadmap-assets.ts
================================================
import playwright from 'playwright';
// Usage: tsx ./scripts/editor-roadmap-dirs.ts <roadmapId>
const roadmapId = process.argv[2];
if (!roadmapId) {
console.error('Roadmap Id is required');
process.exit(1);
}
// Fetch roadmap data from API
const apiUrl = `https://roadmap.sh/api/v1-official-roadmap/${roadmapId}`;
console.log(`Fetching roadmap data from ${apiUrl}`);
let roadmapData: any;
try {
const response = await fetch(apiUrl);
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
roadmapData = await response.json();
} catch (error) {
console.error(`Failed to fetch roadmap data: ${error}`);
process.exit(1);
}
// Check if dimensions exist in the API response
if (!roadmapData.dimensions) {
console.error('Invalid roadmap data: missing dimensions');
process.exit(1);
}
console.log(`Launching chromium`);
const browser = await playwright.chromium.launch();
const context = await browser.newContext();
const page = await context.newPage();
const pageUrl = `http://localhost:3000/${roadmapId}/svg`;
console.log(`Opening page ${pageUrl}`);
await page.goto(pageUrl);
await page.waitForSelector('#resource-svg-wrap');
await page.waitForTimeout(5000);
console.log(`Generating PDF ${pageUrl}`);
await page.pdf({
path: `./public/pdfs/roadmaps/${roadmapId}.pdf`,
margin: { top: 0, right: 0, bottom: 0, left: 0 },
height: roadmapData.dimensions?.height || 2000,
width: roadmapData.dimensions?.width || 968,
});
// @todo generate png from the pdf
console.log(`Generating png ${pageUrl}`);
await page.locator('#resource-svg-wrap>svg').screenshot({
path: `./public/roadmaps/${roadmapId}.png`,
type: 'png',
scale: 'device',
});
await browser.close();
================================================
FILE: scripts/editor-roadmap-content-json.ts
================================================
import type { Node } from '@roadmapsh/editor';
import matter from 'gray-matter';
import { HTMLElement, parse } from 'node-html-parser';
import fs from 'node:fs/promises';
import path from 'node:path';
import { fileURLToPath } from 'node:url';
import { htmlToMarkdown } from '../src/lib/html';
import { markdownToHtml } from '../src/lib/markdown';
import type { RoadmapFrontmatter } from '../src/lib/roadmap';
import { slugify } from '../src/lib/slugger';
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
export const allowedLinkTypes = [
'video',
'article',
'opensource',
'course',
'website',
'podcast',
] as const;
export async function fetchRoadmapJson(roadmapId: string) {
const response = await fetch(
`https://roadmap.sh/api/v1-official-roadmap/${roadmapId}`,
);
if (!response.ok) {
throw new Error(`Failed to fetch roadmap json: ${response.statusText}`);
}
const data = await response.json();
if (data.error) {
throw new Error(`Failed to fetch roadmap json: ${data.error}`);
}
return data;
}
// Directory containing the roadmaps
const ROADMAP_CONTENT_DIR = path.join(__dirname, '../src/data/roadmaps');
const allRoadmaps = await fs.readdir(ROADMAP_CONTENT_DIR);
const editorRoadmapIds = new Set<string>();
for (const roadmapId of allRoadmaps) {
const roadmapFrontmatterDir = path.join(
ROADMAP_CONTENT_DIR,
roadmapId,
`${roadmapId}.md`,
);
const roadmapFrontmatterRaw = await fs.readFile(
roadmapFrontmatterDir,
'utf-8',
);
const { data } = matter(roadmapFrontmatterRaw);
const roadmapFrontmatter = data as RoadmapFrontmatter;
if (roadmapFrontmatter.renderer === 'editor') {
editorRoadmapIds.add(roadmapId);
}
}
const publicRoadmapsContentDir = path.join('./public', 'roadmap-content');
const stats = await fs.stat(publicRoadmapsContentDir).catch(() => null);
if (!stats || !stats.isDirectory()) {
await fs.mkdir(publicRoadmapsContentDir, { recursive: true });
}
for (const roadmapId of editorRoadmapIds) {
console.log(`🚀 Starting ${roadmapId}`);
const data = await fetchRoadmapJson(roadmapId).catch((error) => {
console.error(error);
return null;
});
if (!data) {
console.error(`Failed to fetch roadmap json: ${roadmapId}`);
continue;
}
let { nodes } = data as {
nodes: Node[];
};
nodes = nodes.filter(
(node) =>
node?.type &&
['topic', 'subtopic', 'todo'].includes(node.type) &&
node.data?.label,
);
const roadmapContentDir = path.join(
ROADMAP_CONTENT_DIR,
roadmapId,
'content',
);
const stats = await fs.stat(roadmapContentDir).catch(() => null);
if (!stats || !stats.isDirectory()) {
await fs.mkdir(roadmapContentDir, { recursive: true });
}
const roadmapContentFiles = await fs.readdir(roadmapContentDir, {
recursive: true,
});
const contentMap: Record<
string,
{
title: string;
description: string;
links: {
title: string;
url: string;
type: string;
}[];
}
> = {};
for (const node of nodes) {
const nodeDirPatternWithoutExt = `${slugify(node?.data?.label as string)}@${node.id}`;
const nodeDirPattern = `${nodeDirPatternWithoutExt}.md`;
if (!roadmapContentFiles.includes(nodeDirPattern)) {
contentMap[nodeDirPattern] = {
title: node?.data?.label as string,
description: '',
links: [],
};
continue;
}
const content = await fs.readFile(
path.join(roadmapContentDir, nodeDirPattern),
'utf-8',
);
const html = markdownToHtml(content, false);
const rootHtml = parse(html);
let ulWithLinks: HTMLElement | undefined;
rootHtml.querySelectorAll('ul').forEach((ul) => {
const listWithJustLinks = Array.from(ul.querySelectorAll('li')).filter(
(li) => {
const link = li.querySelector('a');
return link && link.textContent?.trim() === li.textContent?.trim();
},
);
if (listWithJustLinks.length > 0) {
ulWithLinks = ul;
}
});
const listLinks =
ulWithLinks !== undefined
? Array.from(ulWithLinks.querySelectorAll('li > a'))
.map((link) => {
const typePattern = /@([a-z.]+)@/;
let linkText = link.textContent || '';
const linkHref = link.getAttribute('href') || '';
let linkType = linkText.match(typePattern)?.[1] || 'article';
linkType = allowedLinkTypes.includes(linkType as any)
? linkType
: 'article';
linkText = linkText.replace(typePattern, '');
return {
title: linkText,
url: linkHref,
type: linkType,
};
})
.sort((a, b) => {
const order = [
'official',
'opensource',
'article',
'video',
'feed',
];
return order.indexOf(a.type) - order.indexOf(b.type);
})
: [];
const title = rootHtml.querySelector('h1');
ulWithLinks?.remove();
title?.remove();
const htmlStringWithoutLinks = rootHtml.toString();
const description = htmlToMarkdown(htmlStringWithoutLinks);
contentMap[node.id] = {
title: node.data.label as string,
description,
links: listLinks,
};
}
await fs.writeFile(
path.join(publicRoadmapsContentDir, `${roadmapId}.json`),
JSON.stringify(contentMap, null, 2),
);
console.log(`✅ Finished ${roadmapId}`);
console.log('-'.repeat(20));
}
================================================
FILE: scripts/editor-roadmap-content.ts
================================================
import fs from 'node:fs/promises';
import path from 'node:path';
import { fileURLToPath } from 'node:url';
import type { Edge, Node } from '@roadmapsh/editor';
import matter from 'gray-matter';
import type { RoadmapFrontmatter } from '../src/lib/roadmap';
import { slugify } from '../src/lib/slugger';
import OpenAI from 'openai';
import { runPromisesInBatchSequentially } from '../src/lib/promise';
import { httpGet } from '../src/lib/http';
// ERROR: `__dirname` is not defined in ES module scope
// https://iamwebwiz.medium.com/how-to-fix-dirname-is-not-defined-in-es-module-scope-34d94a86694d
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
// Usage: tsx ./scripts/editor-roadmap-content.ts <roadmapId>
const OPEN_AI_API_KEY = process.env.OPEN_AI_API_KEY;
console.log('OPEN_AI_API_KEY:', OPEN_AI_API_KEY);
const ROADMAP_CONTENT_DIR = path.join(__dirname, '../src/data/roadmaps');
const roadmapId = process.argv[2];
const allowedRoadmapIds = await fs.readdir(ROADMAP_CONTENT_DIR);
if (!roadmapId) {
console.error('Roadmap Id is required');
process.exit(1);
}
if (!allowedRoadmapIds.includes(roadmapId)) {
console.error(`Invalid roadmap key ${roadmapId}`);
console.error(`Allowed keys are ${allowedRoadmapIds.join(', ')}`);
process.exit(1);
}
const roadmapFrontmatterDir = path.join(
ROADMAP_CONTENT_DIR,
roadmapId,
`${roadmapId}.md`,
);
const roadmapFrontmatterRaw = await fs.readFile(roadmapFrontmatterDir, 'utf-8');
const { data } = matter(roadmapFrontmatterRaw);
const roadmapFrontmatter = data as RoadmapFrontmatter;
if (!roadmapFrontmatter) {
console.error('Invalid roadmap frontmatter');
process.exit(1);
}
if (roadmapFrontmatter.renderer !== 'editor') {
console.error('Only Editor Rendered Roadmaps are allowed');
process.exit(1);
}
const { response: roadmapContent, error } = await httpGet(
`${import.meta.env.PUBLIC_API_URL}/v1-official-roadmap/${roadmapId}`,
);
if (error) {
console.error(error);
process.exit(1);
}
let { nodes, edges } = roadmapContent as {
nodes: Node[];
edges: Edge[];
};
const enrichedNodes = nodes
.filter(
(node) =>
node?.type &&
['topic', 'subtopic'].includes(node.type) &&
node.data?.label,
)
.map((node) => {
// Because we only need the parent id and title for subtopics
if (node.type !== 'subtopic') {
return node;
}
const parentNodeId =
edges.find((edge) => edge.target === node.id)?.source || '';
const parentNode = nodes.find((n) => n.id === parentNodeId);
return {
...node,
parentId: parentNodeId,
parentTitle: parentNode?.data?.label || '',
};
}) as (Node & { parentId?: string; parentTitle?: string })[];
const roadmapContentDir = path.join(ROADMAP_CONTENT_DIR, roadmapId, 'content');
const stats = await fs.stat(roadmapContentDir).catch(() => null);
if (!stats || !stats.isDirectory()) {
await fs.mkdir(roadmapContentDir, { recursive: true });
}
let openai: OpenAI | undefined;
if (OPEN_AI_API_KEY) {
openai = new OpenAI({
apiKey: OPEN_AI_API_KEY,
});
}
function writeTopicContent(
roadmapTitle: string,
childTopic: string,
parentTopic?: string,
) {
let prompt = `I will give you a topic and you need to write a brief introduction for that with regards to "${roadmapTitle}". Your format should be as follows and be in strictly markdown format:
# (Put a heading for the topic without adding parent "Subtopic in Topic" or "Topic in Roadmap" or "Subtopic under XYZ" etc.)
(Briefly explain the topic in one paragraph using simple english with regards to "${roadmapTitle}". Don't start with explaining how important the topic is with regard to "${roadmapTitle}". Don't say something along the lines of "XYZ plays a crucial role in ${roadmapTitle}". Don't include anything saying "In the context of ${roadmapTitle}". Instead, start with a simple explanation of the topic itself. For example, if the topic is "React", you can start with "React is a JavaScript library for building user interfaces." and then you can explain how it is used in "${roadmapTitle}".)
`;
if (!parentTopic) {
prompt += `First topic is: ${childTopic}`;
} else {
prompt += `First topic is: ${childTopic} under ${parentTopic}`;
}
return new Promise((resolve, reject) => {
openai?.chat.completions
.create({
model: 'gpt-4',
messages: [
{
role: 'user',
content: prompt,
},
],
})
.then((response) => {
const article = response.choices[0].message.content;
resolve(article);
})
.catch((err) => {
reject(err);
});
});
}
async function writeNodeContent(node: Node & { parentTitle?: string }) {
const nodeDirPattern = `${slugify(node?.data?.label as string)}@${node.id}.md`;
if (!roadmapContentFiles.includes(nodeDirPattern)) {
console.log(`Missing file for: ${nodeDirPattern}`);
return;
}
const nodeDir = path.join(roadmapContentDir, nodeDirPattern);
const nodeContent = await fs.readFile(nodeDir, 'utf-8');
const isFileEmpty = !nodeContent.replace(`# ${node.data.label}`, '').trim();
if (!isFileEmpty) {
console.log(`❌ Ignoring ${nodeDirPattern}. Not empty.`);
return;
}
const topic = node.data.label as string;
const parentTopic = node.parentTitle;
console.log(`⏳ Generating content for ${topic}...`);
let newContentFile = '';
if (OPEN_AI_API_KEY) {
newContentFile = (await writeTopicContent(
roadmapFrontmatter.title,
topic,
parentTopic,
)) as string;
} else {
newContentFile = `# ${topic}`;
}
await fs.writeFile(nodeDir, newContentFile, 'utf-8');
console.log(`✅ Content generated for ${topic}`);
}
let roadmapContentFiles = await fs.readdir(roadmapContentDir, {
recursive: true,
});
if (!OPEN_AI_API_KEY) {
console.log('----------------------------------------');
console.log('OPEN_AI_API_KEY not found. Skipping openai api calls...');
console.log('----------------------------------------');
}
const promises = enrichedNodes.map((node) => () => writeNodeContent(node));
await runPromisesInBatchSequentially(promises, 20);
console.log('✅ All content generated');
================================================
FILE: scripts/editor-roadmap-dirs.ts
================================================
import type { Node } from '@roadmapsh/editor';
import matter from 'gray-matter';
import fs from 'node:fs/promises';
import path from 'node:path';
import { fileURLToPath } from 'node:url';
import type { RoadmapFrontmatter } from '../src/lib/roadmap';
import { slugify } from '../src/lib/slugger';
// ERROR: `__dirname` is not defined in ES module scope
// https://iamwebwiz.medium.com/how-to-fix-dirname-is-not-defined-in-es-module-scope-34d94a86694d
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
// Usage: tsx ./scripts/editor-roadmap-dirs.ts <roadmapId>
// Directory containing the roadmaps
const ROADMAP_CONTENT_DIR = path.join(__dirname, '../src/data/roadmaps');
const roadmapId = process.argv[2];
const allowedRoadmapIds = await fs.readdir(ROADMAP_CONTENT_DIR);
if (!roadmapId) {
console.error('Roadmap Id is required');
process.exit(1);
}
if (!allowedRoadmapIds.includes(roadmapId)) {
console.error(`Invalid roadmap key ${roadmapId}`);
console.error(`Allowed keys are ${allowedRoadmapIds.join(', ')}`);
process.exit(1);
}
const roadmapFrontmatterDir = path.join(
ROADMAP_CONTENT_DIR,
roadmapId,
`${roadmapId}.md`,
);
const roadmapFrontmatterRaw = await fs.readFile(roadmapFrontmatterDir, 'utf-8');
const { data } = matter(roadmapFrontmatterRaw);
const roadmapFrontmatter = data as RoadmapFrontmatter;
if (!roadmapFrontmatter) {
console.error('Invalid roadmap frontmatter');
process.exit(1);
}
if (roadmapFrontmatter.renderer !== 'editor') {
console.error('Only Editor Rendered Roadmaps are allowed');
process.exit(1);
}
export async function fetchRoadmapJson(roadmapId: string) {
const response = await fetch(
`https://roadmap.sh/api/v1-official-roadmap/${roadmapId}`,
);
if (!response.ok) {
throw new Error(`Failed to fetch roadmap json: ${response.statusText}`);
}
const data = await response.json();
if (data.error) {
throw new Error(`Failed to fetch roadmap json: ${data.error}`);
}
return data;
}
const roadmapContent = await fetchRoadmapJson(roadmapId);
if (!roadmapContent) {
console.error(`Failed to fetch roadmap json: ${roadmapId}`);
process.exit(1);
}
let { nodes } = roadmapContent as {
nodes: Node[];
};
nodes = nodes.filter(
(node) =>
node?.type && ['topic', 'subtopic'].includes(node.type) && node.data?.label,
);
const roadmapContentDir = path.join(ROADMAP_CONTENT_DIR, roadmapId, 'content');
const stats = await fs.stat(roadmapContentDir).catch(() => null);
if (!stats || !stats.isDirectory()) {
await fs.mkdir(roadmapContentDir, { recursive: true });
}
const roadmapContentFiles = await fs.readdir(roadmapContentDir, {
recursive: true,
});
nodes.forEach(async (node, index) => {
const nodeDirPattern = `${slugify(node.data.label as string)}@${node.id}.md`;
if (roadmapContentFiles.includes(nodeDirPattern)) {
console.log(`Skipping ${nodeDirPattern}`);
return;
}
await fs.writeFile(
path.join(roadmapContentDir, nodeDirPattern),
`# ${node.data.label}`,
);
});
================================================
FILE: scripts/extract-guide-images.cjs
================================================
// get all the base64 encoded images and save them to a file from the given markdown file
const fs = require('fs');
const path = require('path');
const matter = require('gray-matter');
const guidePath = path.join(process.cwd(), 'src/data/guides');
const tempDir = path.join(process.cwd(), '.temp');
const guideId = process.argv[2];
if (!guideId) {
console.error('Guide ID is required');
process.exit(1);
}
const guideContent = fs.readFileSync(
path.join(guidePath, `${guideId}.md`),
'utf8',
);
// Create temp directory if it doesn't exist
const guideTempDir = path.join(tempDir, guideId);
if (!fs.existsSync(guideTempDir)) {
fs.mkdirSync(guideTempDir, { recursive: true });
}
const { data, content } = matter(guideContent);
// Find all base64 image references in the content
const images = content.match(/\[(.+?)\]:\s+?<data:image\/([^;]+);base64,([^\s]+)/g);
if (images) {
images.forEach((image) => {
const imageName = image.match(/\[(.+?)\]/)[1];
const imageExtension = image.match(/<data:image\/([^;]+);base64/)[1];
const imageData = image.match(/base64,([^\s]+)/)[1];
// Write file using Buffer to properly decode base64
fs.writeFileSync(
path.join(guideTempDir, `${imageName}.${imageExtension}`),
Buffer.from(imageData, 'base64')
);
});
}
================================================
FILE: scripts/gemini-roadmap-content.ts
================================================
import fs from 'node:fs/promises';
import path from 'node:path';
import { fileURLToPath } from 'node:url';
import type { Edge, Node } from 'reactflow';
import matter from 'gray-matter';
import type { RoadmapFrontmatter } from '../src/lib/roadmap';
import { slugify } from '../src/lib/slugger';
import { runPromisesInBatchSequentially } from '../src/lib/promise';
import { createGoogleGenerativeAI } from '@ai-sdk/google';
import { generateText } from 'ai';
// ERROR: `__dirname` is not defined in ES module scope
// https://iamwebwiz.medium.com/how-to-fix-dirname-is-not-defined-in-es-module-scope-34d94a86694d
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
// Usage: tsx ./scripts/editor-roadmap-content.ts <roadmapId>
const GEMINI_API_KEY = process.env.GEMINI_API_KEY;
console.log('GEMINI_API_KEY:', GEMINI_API_KEY);
const ROADMAP_CONTENT_DIR = path.join(__dirname, '../src/data/roadmaps');
const roadmapId = process.argv[2];
const google = createGoogleGenerativeAI({
apiKey: process.env.GEMINI_API_KEY,
});
const allowedRoadmapIds = await fs.readdir(ROADMAP_CONTENT_DIR);
if (!roadmapId) {
console.error('Roadmap Id is required');
process.exit(1);
}
if (!allowedRoadmapIds.includes(roadmapId)) {
console.error(`Invalid roadmap key ${roadmapId}`);
console.error(`Allowed keys are ${allowedRoadmapIds.join(', ')}`);
process.exit(1);
}
const roadmapFrontmatterDir = path.join(
ROADMAP_CONTENT_DIR,
roadmapId,
`${roadmapId}.md`,
);
const roadmapFrontmatterRaw = await fs.readFile(roadmapFrontmatterDir, 'utf-8');
const { data } = matter(roadmapFrontmatterRaw);
const roadmapFrontmatter = data as RoadmapFrontmatter;
if (!roadmapFrontmatter) {
console.error('Invalid roadmap frontmatter');
process.exit(1);
}
if (roadmapFrontmatter.renderer !== 'editor') {
console.error('Only Editor Rendered Roadmaps are allowed');
process.exit(1);
}
const roadmapDir = path.join(
ROADMAP_CONTENT_DIR,
roadmapId,
`${roadmapId}.json`,
);
const roadmapContent = await fs.readFile(roadmapDir, 'utf-8');
let { nodes, edges } = JSON.parse(roadmapContent) as {
nodes: Node[];
edges: Edge[];
};
const enrichedNodes = nodes
.filter(
(node) =>
node?.type &&
['topic', 'subtopic'].includes(node.type) &&
node.data?.label,
)
.map((node) => {
// Because we only need the parent id and title for subtopics
if (node.type !== 'subtopic') {
return node;
}
const parentNodeId =
edges.find((edge) => edge.target === node.id)?.source || '';
const parentNode = nodes.find((n) => n.id === parentNodeId);
return {
...node,
parentId: parentNodeId,
parentTitle: parentNode?.data?.label || '',
};
}) as (Node & { parentId?: string; parentTitle?: string })[];
const roadmapContentDir = path.join(ROADMAP_CONTENT_DIR, roadmapId, 'content');
const stats = await fs.stat(roadmapContentDir).catch(() => null);
if (!stats || !stats.isDirectory()) {
await fs.mkdir(roadmapContentDir, { recursive: true });
}
function writeTopicContent(
roadmapTitle: string,
childTopic: string,
parentTopic?: string,
) {
const updatedTitle = roadmapTitle.replace('Roadmap', '').trim().replace('Developer', '');
let prompt = `I will give you a topic and you need to write a brief introduction for that in "${roadmapTitle}". Your format should be as follows and be in strictly markdown format:
# (Put a heading for the topic without adding parent "Subtopic in Topic" or "Topic in Roadmap" or "Subtopic under XYZ" etc.)
(Briefly explain the topic in one paragraph using simple english. Don't start with explaining how important the topic is with regard to "${roadmapTitle}". Don't say something along the lines of "XYZ plays a crucial role in ${roadmapTitle}". Don't include anything saying "In the context of ${roadmapTitle}". Instead, start with a simple explanation of the topic itself. For example, if the topic is "React", you can start with "React is a JavaScript library for building user interfaces."".)
`;
if (!parentTopic) {
prompt += `First topic is: ${childTopic}`;
} else {
prompt += `First topic is: "${parentTopic} > ${childTopic}"`;
}
return new Promise((resolve, reject) => {
generateText({
model: google('gemini-2.0-flash'),
prompt: prompt,
providerOptions: {
}
})
.then((response) => {
const article = response.text;
resolve(article);
})
.catch((err) => {
reject(err);
});
});
}
async function writeNodeContent(node: Node & { parentTitle?: string }) {
const nodeDirPattern = `${slugify(node.data.label)}@${node.id}.md`;
if (!roadmapContentFiles.includes(nodeDirPattern)) {
console.log(`Missing file for: ${nodeDirPattern}`);
return;
}
const nodeDir = path.join(roadmapContentDir, nodeDirPattern);
const nodeContent = await fs.readFile(nodeDir, 'utf-8');
const isFileEmpty = !nodeContent.replace(`# ${node.data.label}`, '').trim();
if (!isFileEmpty) {
console.log(`❌ Ignoring ${nodeDirPattern}. Not empty.`);
return;
}
const topic = node.data.label;
const parentTopic = node.parentTitle;
console.log(`⏳ Generating content for ${topic}...`);
let newContentFile = '';
if (GEMINI_API_KEY) {
newContentFile = (await writeTopicContent(
roadmapFrontmatter.title,
topic,
parentTopic,
)) as string;
} else {
newContentFile = `# ${topic}`;
}
await fs.writeFile(nodeDir, newContentFile, 'utf-8');
console.log(`✅ Content generated for ${topic}`);
}
let roadmapContentFiles = await fs.readdir(roadmapContentDir, {
recursive: true,
});
if (!GEMINI_API_KEY) {
console.log('----------------------------------------');
console.log('GEMINI_API_KEY not found. Skipping gemini api calls...');
console.log('----------------------------------------');
}
const promises = enrichedNodes.map((node) => () => writeNodeContent(node));
await runPromisesInBatchSequentially(promises, 20);
console.log('✅ All content generated');
================================================
FILE: scripts/generate-og-images.mjs
================================================
import path from 'node:path';
import fs from 'node:fs/promises';
import matter from 'gray-matter';
import { html } from 'satori-html';
import satori from 'satori';
import sharp from 'sharp';
import imageSize from 'image-size';
import { Resvg } from '@resvg/resvg-js';
const ALL_ROADMAP_DIR = path.join(process.cwd(), '/src/data/roadmaps');
const ALL_BEST_PRACTICE_DIR = path.join(
process.cwd(),
'/src/data/best-practices',
);
const ALL_GUIDE_DIR = path.join(process.cwd(), '/src/data/guides');
const ALl_AUTHOR_DIR = path.join(process.cwd(), '/src/data/authors');
const ALL_ROADMAP_IMAGE_DIR = path.join(process.cwd(), '/public/roadmaps');
const ALL_BEST_PRACTICE_IMAGE_DIR = path.join(
process.cwd(),
'/public/best-practices',
);
const ALL_AUTHOR_IMAGE_DIR = path.join(process.cwd(), '/public');
const alreadyGeneratedImages = await fs.readdir(
path.join(process.cwd(), '/public/og-images'),
{
recursive: true,
},
);
async function getAllRoadmaps() {
const allRoadmapDirNames = await fs.readdir(ALL_ROADMAP_DIR);
const allRoadmapFrontmatter = await Promise.all(
allRoadmapDirNames.map(async (roadmapDirName) => {
const roadmapDirPath = path.join(
ALL_ROADMAP_DIR,
roadmapDirName,
`${roadmapDirName}.md`,
);
const markdown = await fs.readFile(roadmapDirPath, 'utf8');
const { data } = matter(markdown);
return {
id: roadmapDirName,
title: data?.briefTitle,
description: data?.briefDescription,
};
}),
);
return allRoadmapFrontmatter;
}
async function getAllBestPractices() {
const allBestPracticeDirNames = await fs.readdir(ALL_BEST_PRACTICE_DIR);
const allBestPracticeFrontmatter = await Promise.all(
allBestPracticeDirNames.map(async (bestPracticeDirName) => {
const bestPracticeDirPath = path.join(
ALL_BEST_PRACTICE_DIR,
bestPracticeDirName,
`${bestPracticeDirName}.md`,
);
const markdown = await fs.readFile(bestPracticeDirPath, 'utf8');
const { data } = matter(markdown);
return {
id: bestPracticeDirName,
title: data?.briefTitle,
description: data?.briefDescription,
};
}),
);
return allBestPracticeFrontmatter;
}
async function getAllGuides() {
const allGuideDirNames = await fs.readdir(ALL_GUIDE_DIR);
const allGuideFrontmatter = await Promise.all(
allGuideDirNames.map(async (guideDirName) => {
const guideDirPath = path.join(ALL_GUIDE_DIR, guideDirName);
const markdown = await fs.readFile(guideDirPath, 'utf8');
const { data } = matter(markdown);
return {
id: guideDirName?.replace('.md', ''),
title: data?.title,
description: data?.description,
authorId: data?.authorId,
};
}),
);
return allGuideFrontmatter;
}
async function getAllAuthors() {
const allAuthorDirNames = await fs.readdir(ALl_AUTHOR_DIR);
const allAuthorFrontmatter = await Promise.all(
allAuthorDirNames.map(async (authorDirName) => {
const authorDirPath = path.join(ALl_AUTHOR_DIR, authorDirName);
const markdown = await fs.readFile(authorDirPath, 'utf8');
const { data } = matter(markdown);
return {
id: authorDirName?.replace('.md', ''),
name: data?.name,
imageUrl: data?.imageUrl,
};
}),
);
return allAuthorFrontmatter;
}
async function getAllRoadmapImageIds() {
const allRoadmapImageDirNames = await fs.readdir(ALL_ROADMAP_IMAGE_DIR);
return allRoadmapImageDirNames?.reduce((acc, image) => {
acc[image.replace(/(\.[^.]*)$/, '')] = image;
return acc;
}, {});
}
async function getAllBestPracticeImageIds() {
const allBestPracticeImageDirNames = await fs.readdir(
ALL_BEST_PRACTICE_IMAGE_DIR,
);
return allBestPracticeImageDirNames?.reduce((acc, image) => {
acc[image.replace(/(\.[^.]*)$/, '')] = image;
return acc;
}, {});
}
async function generateResourceOpenGraph() {
const allRoadmaps = (await getAllRoadmaps()).filter(
(roadmap) => !alreadyGeneratedImages.includes(`roadmaps/${roadmap.id}.png`),
);
const allBestPractices = (await getAllBestPractices()).filter(
(bestPractice) =>
!alreadyGeneratedImages.includes(`best-practices/${bestPractice.id}.png`),
);
const allRoadmapImageIds = await getAllRoadmapImageIds();
const allBestPracticeImageIds = await getAllBestPracticeImageIds();
const resources = [];
allRoadmaps.forEach((roadmap) => {
const hasImage = allRoadmapImageIds?.[roadmap.id];
resources.push({
type: 'roadmaps',
id: roadmap.id,
title: roadmap.title,
description: roadmap.description,
image: hasImage
? path.join(ALL_ROADMAP_IMAGE_DIR, allRoadmapImageIds[roadmap.id])
: null,
});
});
allBestPractices.forEach((bestPractice) => {
const hasImage = allBestPracticeImageIds?.[bestPractice.id];
resources.push({
type: 'best-practices',
id: bestPractice.id,
title: bestPractice.title,
description: bestPractice.description,
image: hasImage
? path.join(
ALL_BEST_PRACTICE_IMAGE_DIR,
allBestPracticeImageIds[bestPractice.id],
)
: null,
});
});
for (const resource of resources) {
if (!resource.image) {
let template = getRoadmapDefaultTemplate(resource);
if (
hasSpecialCharacters(resource.title) ||
hasSpecialCharacters(resource.description)
) {
// For some reason special characters are not being rendered properly
// https://github.com/natemoo-re/satori-html/issues/20
// So we need to unescape the html
template = JSON.parse(unescapeHtml(JSON.stringify(template)));
}
await generateOpenGraph(
template,
resource.type,
resource.id + '.png',
'resvg',
);
} else {
const image = await fs.readFile(resource.image);
const dimensions = imageSize(image);
const widthRatio = 1200 / dimensions.width;
let width = dimensions.width * widthRatio * 0.85;
let height = dimensions.height * widthRatio * 0.85;
let template = getRoadmapImageTemplate({
...resource,
image: `data:image/${dimensions.type};base64,${image.toString('base64')}`,
width,
height,
});
if (
hasSpecialCharacters(resource.title) ||
hasSpecialCharacters(resource.description)
) {
// For some reason special characters are not being rendered properly
// https://github.com/natemoo-re/satori-html/issues/20
// So we need to unescape the html
template = JSON.parse(unescapeHtml(JSON.stringify(template)));
}
await generateOpenGraph(template, resource.type, resource.id + '.png');
}
}
}
async function generateGuideOpenGraph() {
const allGuides = (await getAllGuides()).filter(
(guide) => !alreadyGeneratedImages.includes(`guides/${guide.id}.png`),
);
const allAuthors = await getAllAuthors();
for (const guide of allGuides) {
const author = allAuthors.find((author) => author.id === guide.authorId);
const image =
author?.imageUrl || 'https://roadmap.sh/img/default-avatar.png';
const isExternalImage = image?.startsWith('http');
let authorImageExtension = '';
let authorAvatar;
if (!isExternalImage) {
authorAvatar = await fs.readFile(path.join(ALL_AUTHOR_IMAGE_DIR, image));
authorImageExtension = image?.split('.')[1];
}
let template = getGuideTemplate({
...guide,
authorName: author.name,
authorAvatar: isExternalImage
? image
: `data:image/${authorImageExtension};base64,${authorAvatar.toString('base64')}`,
});
if (
hasSpecialCharacters(guide.title) ||
hasSpecialCharacters(guide.description)
) {
// For some reason special characters are not being rendered properly
// https://github.com/natemoo-re/satori-html/issues/20
// So we need to unescape the html
template = JSON.parse(unescapeHtml(JSON.stringify(template)));
}
await generateOpenGraph(template, 'guides', guide.id + '.png');
}
}
async function generateOpenGraph(
htmlString,
type,
fileName,
renderer = 'sharp',
) {
console.log('Started 🚀', `${type}/${fileName}`);
const svg = await satori(htmlString, {
width: 1200,
height: 630,
fonts: [
{
name: 'balsamiq',
data: await fs.readFile(
path.join(process.cwd(), '/public/fonts/BalsamiqSans-Regular.ttf'),
),
weight: 400,
style: 'normal',
},
],
});
await fs.mkdir(path.join(process.cwd(), '/public/og-images/' + type), {
recursive: true,
});
// It will be used to generate the default image
// for some reasone sharp is not working with this
// FIXME: Investigate why sharp is not working with this
if (renderer === 'resvg') {
const resvg = new Resvg(svg, {
fitTo: {
mode: 'width',
value: 2500,
},
});
const pngData = resvg.render();
const pngBuffer = pngData.asPng();
await fs.writeFile(
path.join(process.cwd(), '/public/og-images/' + `${type}/${fileName}`),
pngBuffer,
);
} else {
await sharp(Buffer.from(svg), { density: 150 })
.png()
.toFile(
path.join(process.cwd(), '/public/og-images/' + `${type}/${fileName}`),
);
}
console.log('Completed ✅', `${type}/${fileName}`);
}
await generateResourceOpenGraph();
await generateGuideOpenGraph();
function getRoadmapDefaultTemplate({ title, description }) {
return html`<div tw="bg-white relative flex flex-col h-full w-full">
<div
tw="absolute flex top-[90px] left-0 w-full h-px bg-black opacity-5"
></div>
<div tw="absolute flex top-0 left-0 w-full h-[18px] bg-black"></div>
<div tw="absolute flex bottom-0 left-0 w-full h-[18px] bg-black"></div>
<div
tw="absolute flex bottom-[90px] left-0 w-full h-px bg-black opacity-5"
></div>
<div
tw="absolute flex top-0 left-[90px] h-full w-px bg-black opacity-5"
></div>
<div
tw="absolute flex top-0 right-[90px] h-full w-px bg-black opacity-5"
></div>
<div tw="flex flex-col px-[100px] py-[90px] h-full">
<div tw="flex justify-between flex-col p-[30px] h-full">
<div tw="flex flex-col">
<div tw="text-[70px] leading-[70px] tracking-tight">${title}</div>
<div
tw="mt-[16px] text-[30px] leading-[36px] tracking-tight opacity-80"
>
${description}
</div>
</div>
<div tw="flex flex-col">
<div tw="flex items-center mt-2.5">
<div
tw="flex items-center justify-center w-[40px] h-[40px] mr-[24px]"
>
<svg
width="46"
height="27"
viewBox="0 0 46 27"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M43.354 0.9C42.184 0.9 41.2371 1.84684 41.2371 3.01686C41.2371 3.30867 41.3062 3.57708 41.4117 3.82435L33.4085 15.0163C33.38 15.0161 33.3514 15.0167 33.3248 15.0172C33.3051 15.0176 33.2864 15.018 33.2697 15.018C32.8703 15.018 32.484 15.1223 32.161 15.3186L25.2976 11.9024C25.1995 10.8219 24.2903 9.97585 23.1854 9.97585C22.0154 9.97585 21.0686 10.9227 21.0686 12.0927C21.0686 12.1865 21.0799 12.2794 21.0925 12.3656L13.8077 18.1561C13.5852 18.0783 13.3472 18.0433 13.1011 18.0433C12.0622 18.0433 11.2066 18.7882 11.0265 19.7732L4.26122 22.5041C3.91213 22.2447 3.48642 22.077 3.01686 22.077C1.84684 22.077 0.9 23.0238 0.9 24.1938C0.9 25.3639 1.84684 26.3107 3.01686 26.3107C4.06426 26.3107 4.92372 25.5497 5.0923 24.5492L11.8566 21.8497C12.2057 22.1092 12.6315 22.277 13.1011 22.277C14.2711 22.277 15.218 21.3301 15.218 20.1601C15.218 20.0663 15.2067 19.9735 15.194 19.8873L22.4789 14.0968C22.7013 14.1746 22.9393 14.2096 23.1854 14.2096C23.5848 14.2096 23.9711 14.1053 24.2941 13.909L31.1575 17.3252C31.2556 18.4057 32.1649 19.2517 33.2697 19.2517C34.4397 19.2517 35.3866 18.3049 35.3866 17.1348C35.3866 16.843 35.3175 16.5746 35.2119 16.3273L43.2151 5.13536C43.2437 5.13561 43.2723 5.13503 43.2989 5.13449C43.3186 5.13409 43.3373 5.13371 43.354 5.13371C44.524 5.13371 45.4708 4.18687 45.4708 3.01686C45.4708 1.84684 44.524 0.9 43.354 0.9Z"
fill="black"
stroke="black"
stroke-width="0.2"
/>
</svg>
</div>
<div tw="text-[30px] flex leading-[30px]">
7th most starred GitHub project
</div>
</div>
<div tw="flex items-center mt-2.5">
<div
tw="flex items-center justify-center w-[40px] h-[40px] mr-[24px]"
>
<svg
width="40"
height="27"
viewBox="0 0 40 27"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M24.8419 21.5546V23.347H37.3473V22.3072C37.3473 21.803 37.1644 21.3086 36.7814 20.9808C35.797 20.1382 34.0544 19.1021 31.4735 19.1021C28.1305 19.1021 25.8107 20.618 24.8419 21.5546ZM22.7297 19.8874C23.9917 18.5206 27.0669 16.4008 31.4735 16.4008C35.9173 16.4008 38.5374 18.7892 39.5092 19.9307C39.8516 20.3328 40 20.825 40 21.2875V26.0483H31.0946H22.1892V21.2978C22.1892 20.8197 22.349 20.2997 22.7297 19.8874Z"
fill="black"
/>
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M3.30026 21.0084C2.86588 21.3329 2.65267 21.8607 2.65267 22.4029V23.347H15.1581V21.5229C14.3747 20.6776 12.4668 19.1021 9.28433 19.1021C6.53917 19.1021 4.48401 20.1243 3.30026 21.0084ZM0.540477 19.8874C1.80253 18.5206 4.87765 16.4008 9.28433 16.4008C13.7281 16.4008 16.3482 18.7892 17.32 19.9307C17.6624 20.3328 17.8108 20.825 17.8108 21.2875V26.0483H8.90538H0V21.2978C0 20.8197 0.15977 20.2997 0.540477 19.8874Z"
fill="black"
/>
<rect
x="10.6122"
y="16.4008"
width="17.3655"
height="7.718"
fill="white"
/>
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M11.8062 19.6515C11.3801 19.9868 11.1665 20.5126 11.1665 21.0548V22.5365H27.4235V20.9495C27.4235 20.4454 27.2397 19.9534 26.8651 19.616C25.6227 18.4973 23.3035 17.0182 19.7876 17.0182C16.0572 17.0182 13.307 18.4702 11.8062 19.6515ZM8.42064 18.0391C10.0613 16.2623 14.059 13.5065 19.7876 13.5065C25.5645 13.5065 28.9707 16.6115 30.2341 18.0954C30.6791 18.6181 30.872 19.258 30.872 19.8592V26.0482H19.295H7.71802V19.8727C7.71802 19.2511 7.92572 18.5751 8.42064 18.0391Z"
fill="black"
/>
<circle
cx="20.2598"
cy="5.7885"
r="4.0385"
stroke="black"
stroke-width="3.5"
/>
<circle
cx="31.8367"
cy="9.64748"
r="3.07375"
stroke="black"
stroke-width="3.5"
/>
<circle
cx="8.68276"
cy="9.64748"
r="3.07375"
stroke="black"
stroke-width="3.5"
/>
</svg>
</div>
<div tw="text-[30px] flex leading-[30px]">
Created and maintained by community
</div>
</div>
<div tw="flex items-center mt-2.5">
<div
tw="flex items-center justify-center w-[40px] h-[40px] mr-[24px]"
>
<svg
width="38"
height="38"
viewBox="0 0 38 38"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M19 33.155C21.375 33.155 23.3541 34.8334 25.3333 34.8334C30.0833 34.8334 34.8333 22.1667 34.8333 15.485C34.7793 13.4342 33.9169 11.4878 32.434 10.0701C30.951 8.65243 28.9678 7.87839 26.9166 7.9167C23.4016 7.9167 20.5833 10.1967 19 11.0834C17.4166 10.1967 14.5983 7.9167 11.0833 7.9167C9.0309 7.8742 7.04532 8.64686 5.56147 10.0654C4.07761 11.484 3.21646 13.4328 3.16663 15.485C3.16663 22.1667 7.91663 34.8334 12.6666 34.8334C14.6458 34.8334 16.625 33.155 19 33.155Z"
stroke="black"
stroke-width="3.5"
stroke-linecap="round"
stroke-linejoin="round"
/>
<path
d="M15.8334 3.16699C17.4167 3.95866 19 6.33366 19 11.0837"
stroke="black"
stroke-width="3.5"
stroke-linecap="round"
stroke-linejoin="round"
/>
</svg>
</div>
<div tw="text-[30px] flex leading-[30px]">Up-to-date roadmap</div>
</div>
</div>
</div>
</div>
</div> `;
}
function getRoadmapImageTemplate({ title, description, image, height, width }) {
return html`<div tw="bg-white relative flex flex-col h-full w-full">
<div tw="flex flex-col px-[90px] pt-[90px]">
<div tw="flex flex-col pb-0">
<div tw="text-[70px] leading-[70px] tracking-tight">
${title?.replace('&', `{"&"}`)}
</div>
<div
tw="mt-[16px] text-[30px] leading-[36px] tracking-tight opacity-80"
>
${description}
</div>
</div>
</div>
<img
src="${image}"
width="${width}"
height="${height}"
tw="mx-auto mt-[36px]"
/>
</div> `;
}
function getGuideTemplate({ title, description, authorName, authorAvatar }) {
return html`<div tw="bg-white relative flex flex-col h-full w-full">
<div
tw="absolute flex top-[90px] left-0 w-full h-px bg-black opacity-5"
></div>
<div tw="absolute flex top-0 left-0 w-full h-[18px] bg-black"></div>
<div tw="absolute flex bottom-0 left-0 w-full h-[18px] bg-black"></div>
<div
tw="absolute flex bottom-[90px] left-0 w-full h-px bg-black opacity-5"
></div>
<div
tw="absolute flex top-0 left-[90px] h-full w-px bg-black opacity-5"
></div>
<div
tw="absolute flex top-0 right-[90px] h-full w-px bg-black opacity-5"
></div>
<div tw="flex flex-col px-[100px] py-[90px] h-full">
<div tw="flex justify-center flex-col p-[30px] h-full">
<div tw="flex flex-col">
<div tw="flex items-center">
<img
src="${authorAvatar}"
width="30"
height="30"
tw="rounded-full"
/>
<div tw="text-[20px] leading-[20px] tracking-tight ml-3">
${authorName}
</div>
</div>
<div tw="mt-6 text-[48px] leading-tight tracking-tight">${title}</div>
<div tw="mt-3 text-[24px] leading-[30px] tracking-tight opacity-80">
${description}
</div>
</div>
</div>
</div>
</div> `;
}
function unescapeHtml(html) {
return html
.replace(/&/g, '&')
.replace(/</g, '<')
.replace(/>/g, '>')
.replace(/"/g, '"')
.replace(/'/g, "'");
}
function hasSpecialCharacters(str) {
return /[&<>"]/.test(str);
}
================================================
FILE: scripts/generate-renderer.sh
================================================
#!/usr/bin/env bash
set -e
# Remove old editor
rm -rf editor
if [ ! -d ".temp/web-draw" ]; then
git clone ssh://git@github.com/roadmapsh/web-draw.git .temp/web-draw --depth 1
fi
# Make dir
mkdir -p packages/editor
mkdir -p packages/editor/dist
# Copy the editor dist, package.json
cp -rf .temp/web-draw/packages/editor/dist packages/editor
cp -rf .temp/web-draw/packages/editor/package.json packages/editor
# Remove temp directory
rm -rf .temp
# Reinstall so that the editor which was setup gets used
rm -rf node_modules
pnpm install
================================================
FILE: scripts/label-issues.sh
================================================
#!/usr/bin/env bash
# Fetch issues JSON data and parse it properly
issues=$(gh issue list --repo kamranahmedse/developer-roadmap --search "sort:created-asc" --state open --limit 500 --json number,title,createdAt,updatedAt,state,url,comments,reactionGroups,body | jq -c '.[]')
# checks the body of issue, identifies the slug from the roadmap URLs
# and labels the issue with the corresponding slug
while IFS= read -r issue; do
created_at=$(echo "$issue" | jq -r '.createdAt')
updated_at=$(echo "$issue" | jq -r '.updatedAt')
issue_number=$(echo "$issue" | jq -r '.number')
issue_title=$(echo "$issue" | jq -r '.title')
reaction_groups=$(echo "$issue" | jq -r '.reactionGroups')
has_reactions=$(echo "$issue" | jq -r '.reactionGroups | length')
comment_count=$(echo "$issue" | jq -r '.comments | length')
body_characters=$(echo "$issue" | jq -r '.body | length')
# If the issue has no body, then skip it
if [ "$body_characters" -eq 0 ]; then
continue
fi
# Extract the roadmap URLs from the issue body
roadmap_urls=$(echo "$issue" | jq -r '.body' | grep -o 'https://roadmap\.sh/[^ ]*')
# If no roadmap URLs found, then skip it
if [ -z "$roadmap_urls" ]; then
continue
fi
# URL is like https://roadmap.sh/frontend
# Extract the slug from the URL
slug_of_first_url=$(echo "$roadmap_urls" | head -n 1 | sed 's/https:\/\/roadmap\.sh\///')
if [ -z "$slug_of_first_url" ]; then
continue
fi
# Label the issue with the slug
gh issue edit "$issue_number" --add-label "$slug_of_first_url"
done <<< "$issues"
================================================
FILE: scripts/migrate-content-repo-to-database.ts
================================================
import fs from 'node:fs/promises';
import path from 'node:path';
import { fileURLToPath } from 'node:url';
import type { OfficialRoadmapDocument } from '../src/queries/official-roadmap';
import { parse } from 'node-html-parser';
import { markdownToHtml } from '../src/lib/markdown';
import { htmlToMarkdown } from '../src/lib/html';
import matter from 'gray-matter';
import type { RoadmapFrontmatter } from '../src/lib/roadmap';
import {
allowedOfficialRoadmapTopicResourceType,
type AllowedOfficialRoadmapTopicResourceType,
type SyncToDatabaseTopicContent,
} from '../src/queries/official-roadmap-topic';
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
const args = process.argv.slice(2);
const secret = args
.find((arg) => arg.startsWith('--secret='))
?.replace('--secret=', '');
if (!secret) {
throw new Error('Secret is required');
}
let roadmapJsonCache: Map<string, OfficialRoadmapDocument> = new Map();
export async function fetchRoadmapJson(
roadmapId: string,
): Promise<OfficialRoadmapDocument> {
if (roadmapJsonCache.has(roadmapId)) {
return roadmapJsonCache.get(roadmapId)!;
}
const response = await fetch(
`https://roadmap.sh/api/v1-official-roadmap/${roadmapId}`,
);
if (!response.ok) {
throw new Error(
`Failed to fetch roadmap json: ${response.statusText} for ${roadmapId}`,
);
}
const data = await response.json();
if (data.error) {
throw new Error(
`Failed to fetch roadmap json: ${data.error} for ${roadmapId}`,
);
}
roadmapJsonCache.set(roadmapId, data);
return data;
}
export async function syncContentToDatabase(
topics: SyncToDatabaseTopicContent[],
) {
const response = await fetch(
`https://roadmap.sh/api/v1-sync-official-roadmap-topics`,
{
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
topics,
secret,
}),
},
);
if (!response.ok) {
const error = await response.json();
throw new Error(
`Failed to sync content to database: ${response.statusText} ${JSON.stringify(error, null, 2)}`,
);
}
return response.json();
}
// Directory containing the roadmaps
const ROADMAP_CONTENT_DIR = path.join(__dirname, '../src/data/roadmaps');
const allRoadmaps = await fs.readdir(ROADMAP_CONTENT_DIR);
const editorRoadmapIds = new Set<string>();
for (const roadmapId of allRoadmaps) {
const roadmapFrontmatterDir = path.join(
ROADMAP_CONTENT_DIR,
roadmapId,
`${roadmapId}.md`,
);
const roadmapFrontmatterRaw = await fs.readFile(
roadmapFrontmatterDir,
'utf-8',
);
const { data } = matter(roadmapFrontmatterRaw);
const roadmapFrontmatter = data as RoadmapFrontmatter;
if (roadmapFrontmatter.renderer === 'editor') {
editorRoadmapIds.add(roadmapId);
}
}
for (const roadmapId of editorRoadmapIds) {
try {
const roadmap = await fetchRoadmapJson(roadmapId);
const files = await fs.readdir(
path.join(ROADMAP_CONTENT_DIR, roadmapId, 'content'),
);
console.log(`🚀 Starting ${files.length} files for ${roadmapId}`);
const topics: SyncToDatabaseTopicContent[] = [];
for (const file of files) {
const isContentFile = file.endsWith('.md');
if (!isContentFile) {
console.log(`🚨 Skipping ${file} because it is not a content file`);
continue;
}
const nodeSlug = file.replace('.md', '');
if (!nodeSlug) {
console.error(`🚨 Node id is required: ${file}`);
continue;
}
const nodeId = nodeSlug.split('@')?.[1];
if (!nodeId) {
console.error(`🚨 Node id is required: ${file}`);
continue;
}
const node = roadmap.nodes.find((node) => node.id === nodeId);
if (!node) {
console.error(`🚨 Node not found: ${file}`);
continue;
}
const filePath = path.join(
ROADMAP_CONTENT_DIR,
roadmapId,
'content',
`${nodeSlug}.md`,
);
const fileExists = await fs
.stat(filePath)
.then(() => true)
.catch(() => false);
if (!fileExists) {
console.log(`🚨 File not found: ${filePath}`);
continue;
}
const content = await fs.readFile(filePath, 'utf8');
const html = markdownToHtml(content, false);
const rootHtml = parse(html);
let ulWithLinks: HTMLElement | undefined;
rootHtml.querySelectorAll('ul').forEach((ul) => {
const listWithJustLinks = Array.from(ul.querySelectorAll('li')).filter(
(li) => {
const link = li.querySelector('a');
return link && link.textContent?.trim() === li.textContent?.trim();
},
);
if (listWithJustLinks.length > 0) {
// @ts-expect-error - TODO: fix this
ulWithLinks = ul;
}
});
const listLinks: SyncToDatabaseTopicContent['resources'] =
ulWithLinks !== undefined
? Array.from(ulWithLinks.querySelectorAll('li > a'))
.map((link) => {
const typePattern = /@([a-z.]+)@/;
let linkText = link.textContent || '';
const linkHref = link.getAttribute('href') || '';
let linkType = linkText.match(typePattern)?.[1] || 'article';
linkType = allowedOfficialRoadmapTopicResourceType.includes(
linkType as any,
)
? linkType
: 'article';
linkText = linkText.replace(typePattern, '');
if (!linkText || !linkHref) {
return null;
}
return {
title: linkText,
url: linkHref,
type: linkType as AllowedOfficialRoadmapTopicResourceType,
};
})
.filter((link) => link !== null)
.sort((a, b) => {
const order = [
'official',
'opensource',
'article',
'video',
'feed',
];
return order.indexOf(a!.type) - order.indexOf(b!.type);
})
: [];
const title = rootHtml.querySelector('h1');
ulWithLinks?.remove();
title?.remove();
const allParagraphs = rootHtml.querySelectorAll('p');
if (listLinks.length > 0 && allParagraphs.length > 0) {
// to remove the view more see more from the description
const lastParagraph = allParagraphs[allParagraphs.length - 1];
lastParagraph?.remove();
}
const htmlStringWithoutLinks = rootHtml.toString();
const description = htmlToMarkdown(htmlStringWithoutLinks);
const updatedDescription =
`# ${title?.textContent}\n\n${description}`.trim();
const label = node?.data?.label as string;
if (!label) {
console.error(`🚨 Label is required: ${file}`);
continue;
}
topics.push({
roadmapSlug: roadmapId,
nodeId,
description: updatedDescription,
resources: listLinks,
});
}
await syncContentToDatabase(topics);
console.log(
`✅ Synced ${topics.length} topics to database for ${roadmapId}`,
);
} catch (error) {
console.error(error);
process.exit(1);
}
}
================================================
FILE: scripts/migrate-editor-roadmap.ts
================================================
import fs from 'node:fs/promises';
import path from 'node:path';
import { fileURLToPath } from 'node:url';
import type { Node } from '@roadmapsh/editor';
import matter from 'gray-matter';
import type { RoadmapFrontmatter } from '../src/lib/roadmap';
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
// Directory containing the roadmaps
const ROADMAP_CONTENT_DIR = path.join(__dirname, '../src/data/roadmaps');
const allRoadmaps = await fs.readdir(ROADMAP_CONTENT_DIR);
const editorRoadmapIds = new Set<string>();
for (const roadmapId of allRoadmaps) {
const roadmapFrontmatterDir = path.join(
ROADMAP_CONTENT_DIR,
roadmapId,
`${roadmapId}.md`,
);
const roadmapFrontmatterRaw = await fs.readFile(
roadmapFrontmatterDir,
'utf-8',
);
const { data } = matter(roadmapFrontmatterRaw);
const roadmapFrontmatter = data as RoadmapFrontmatter;
if (roadmapFrontmatter.renderer === 'editor') {
editorRoadmapIds.add(roadmapId);
}
}
for (const roadmapId of editorRoadmapIds) {
const roadmapJSONDir = path.join(
ROADMAP_CONTENT_DIR,
roadmapId,
`${roadmapId}.json`,
);
const roadmapJSONRaw = await fs.readFile(roadmapJSONDir, 'utf-8');
const roadmapJSON = JSON.parse(roadmapJSONRaw);
const roadmapNodes = roadmapJSON.nodes as Node[];
const updatedNodes = roadmapNodes.map((node) => {
const width = +(node?.width || node?.style?.width || 0);
const height = +(node?.height || node?.style?.height || 0);
const ADDITIONAL_WIDTH = 1;
// adding one `1px` in width to avoid the node to be cut in half
// this is a quick fix to avoid the issue
if (node?.style?.width) {
node.style.width = width + ADDITIONAL_WIDTH;
}
if (node?.width) {
node.width = width + ADDITIONAL_WIDTH;
}
return {
...node,
measured: {
width: width + ADDITIONAL_WIDTH,
height,
},
};
});
const updatedRoadmapJSON = {
...roadmapJSON,
nodes: updatedNodes,
};
const updatedRoadmapJSONString = JSON.stringify(updatedRoadmapJSON, null, 2);
await fs.writeFile(roadmapJSONDir, updatedRoadmapJSONString, 'utf-8');
}
================================================
FILE: scripts/official-roadmap-assets.ts
================================================
import playwright from 'playwright';
import type { OfficialRoadmapDocument } from '../src/queries/official-roadmap';
async function listAllRoadmaps(): Promise<OfficialRoadmapDocument[]> {
const response = await fetch(
'https://roadmap.sh/api/v1-list-official-roadmaps',
);
const mainRoadmaps = await response.json();
const beginnerResponse = await fetch(
'https://roadmap.sh/api/v1-list-official-beginner-roadmaps',
);
const beginnerRoadmaps = await beginnerResponse.json();
const data = [...mainRoadmaps, ...beginnerRoadmaps];
return data;
}
// Usage: tsx ./scripts/official-roadmap-assets.ts <roadmapSlug>
const roadmapSlug = process.argv?.[2];
const allRoadmaps = await listAllRoadmaps();
const allowedRoadmapSlugs = allRoadmaps.map((roadmap) => roadmap.slug);
const roadmapSlugs = roadmapSlug ? [roadmapSlug] : allowedRoadmapSlugs;
console.log(`Launching chromium`);
const browser = await playwright.chromium.launch();
for (const roadmapSlug of roadmapSlugs) {
const roadmap = allRoadmaps.find((roadmap) => roadmap.slug === roadmapSlug);
if (!roadmap) {
console.error(`Roadmap ${roadmapSlug} not found`);
continue;
}
const context = await browser.newContext();
const page = await context.newPage();
const pageUrl = `http://roadmap.sh/${roadmapSlug}/svg`;
console.log(`Opening page ${pageUrl}`);
await page.goto(pageUrl);
await page.waitForSelector('#resource-svg-wrap');
await page.waitForTimeout(5000);
console.log(`Generating PDF ${pageUrl}`);
await page.pdf({
path: `./public/pdfs/roadmaps/${roadmapSlug}.pdf`,
margin: { top: 0, right: 0, bottom: 0, left: 0 },
height: roadmap?.dimensions?.height || 2000,
width: roadmap?.dimensions?.width || 968,
});
console.log(`Generating png ${pageUrl}`);
await page.locator('#resource-svg-wrap>svg').screenshot({
path: `./public/roadmaps/${roadmapSlug}.png`,
type: 'png',
scale: 'device',
});
}
console.log(`Closing browser`);
await browser.close();
================================================
FILE: scripts/page-data-agg.cjs
================================================
const csv = require('csv-parser');
const fs = require('fs');
const path = require('path');
const csvFilePath = path.join(__dirname, '../data.csv');
const results = {};
const pageSummary = {};
fs.createReadStream(csvFilePath)
.pipe(
csv({
separator: ',',
mapHeaders: ({ header, index }) =>
header.toLowerCase().replace(/ /g, '_'),
mapValues: ({ header, index, value }) => {
if (header === 'page') {
return (
value
.replace(/"/g, '')
.replace(/'/g, '')
.replace(/`/g, '')
.replace(/\?r=/g, '#r#')
.replace(/\?.+?$/g, '')
.replace(/#r#/g, '?r=')
.replace(/\/$/g, '') || '/'
);
}
if (header !== 'month_of_year') {
return parseInt(value, 10);
}
return value;
},
})
)
.on('data', (data) => {
const { page, month_of_year, unique_pageviews, users } = data;
const pageData = results[page] || {};
const existingPageMonthData = pageData[month_of_year] || {};
const existingViews = existingPageMonthData.views || 0;
const existingUsers = existingPageMonthData.users || 0;
const newViews = existingViews + unique_pageviews;
const newUsers = existingUsers + users;
pageData[month_of_year] = {
views: newViews,
users: newUsers,
};
results[page] = pageData;
pageSummary[page] = pageSummary[page] || { views: 0, users: 0 };
pageSummary[page].views += unique_pageviews;
pageSummary[page].users += users;
})
.on('end', () => {
const csvHeader = [
'Page',
'Jan 2022',
'Feb 2022',
'Mar 2022',
'Apr 2022',
'May 2022',
'Jun 2022',
'Jul 2022',
'Aug 2022',
'Sep 2022',
'Oct 2022',
'Nov 2022',
'Dec 2022',
'Jan 2023',
'Feb 2023',
'Mar 2023',
'Apr 2023',
'May 2023',
'Jun 2023',
'Jul 2023',
'Aug 2023',
'Sep 2023',
'Oct 2023',
'Nov 2023',
'Dec 2023',
];
const csvRows = Object.keys(pageSummary)
.filter(pageUrl => pageSummary[pageUrl].views > 10)
.filter(pageUrl => !['/upcoming', '/pdfs', '/signup', '/login', '/@'].includes(pageUrl))
.sort((pageA, pageB) => {
const aViews = pageSummary[pageA].views;
const bViews = pageSummary[pageB].views;
return bViews - aViews;
})
.map((pageUrl) => {
const rawPageResult = results[pageUrl];
const pageResultCsvRow = [];
csvHeader.forEach((csvHeaderItem) => {
if (csvHeaderItem === 'Page') {
pageResultCsvRow.push(pageUrl);
return;
}
const csvHeaderItemAlt = csvHeaderItem
.replace(/ /g, '_')
.toLowerCase();
const result = rawPageResult[csvHeaderItem || csvHeaderItemAlt] || {};
const views = result.views || 0;
const users = result.users || 0;
pageResultCsvRow.push(users);
});
return pageResultCsvRow;
});
const finalCsvRows = [csvHeader, ...csvRows];
const csvRowStrings = finalCsvRows.map((row) => {
return row.join(',');
});
const csvString = csvRowStrings.join('\n');
fs.writeFileSync(path.join(__dirname, '../data-agg.csv'), csvString);
});
================================================
FILE: scripts/readme.md
================================================
## CLI Tools
> A bunch of CLI scripts to make the development easier
## `roadmap-links.cjs`
Generates a list of all the resources links in any roadmap file.
## `compress-jsons.cjs`
Compresses all the JSON files in the `public/jsons` folder
## `update-sponsors.cjs`
Updates the sponsor ads on each roadmap page with the latest sponsor information in the Excel sheet.
## `roadmap-content.cjs`
Currently, for any new roadmaps that we add, we do create the interactive roadmap but we end up leaving the content empty in the roadmap till we get time to fill it up manually.
This script populates all the content files with some minimal content from OpenAI so that the users visiting the website have something to read in the interactive roadmap till we get time to fill it up manually.
## `roadmap-dirs.cjs`
This command is used to create the content folders and files for the interactivity of the roadmap. You can use the below command to generate the roadmap skeletons inside a roadmap directory:
```bash
npm run roadmap-dirs [frontend|backend|devops|...]
```
For the content skeleton to be generated, we should have proper grouping, and the group names in the project files. You can follow the steps listed below in order to add the meta information to the roadmap.
- Remove all the groups from the roadmaps through the project editor. Select all and press `cmd+shift+g`
- Identify the boxes that should be clickable and group them together with `cmd+shift+g`
- Assign the name to the groups.
- Group names have the format of `[sort]-[slug]` e.g. `100-internet`. Each group name should start with a number starting from 100 which helps with sorting of the directories and the files. Groups at the same level have the sequential sorting information.
- Each groups children have a separate group and have the name similar to `[sort]-[parent-slug]:[child-slug]` where sort refers to the sorting of the `child-slug` and not the parent. Also parent-slug does not need to have the sorting information as a part of slug e.g. if parent was `100-internet` the children would be `100-internet:how-does-the-internet-work`, `101-internet:what-is-http`, `102-internet:browsers`.
================================================
FILE: scripts/refresh-assets.ts
================================================
#!/usr/bin/env tsx
import { execSync } from 'child_process';
import * as fs from 'fs';
import * as path from 'path';
const roadmapsDir = path.join(process.cwd(), 'src/data/roadmaps');
const roadmapIds = fs.readdirSync(roadmapsDir)
.filter(item => {
const fullPath = path.join(roadmapsDir, item);
return fs.statSync(fullPath).isDirectory();
});
console.log(`Found ${roadmapIds.length} roadmaps to process...`);
const promises = roadmapIds.map(roadmapId => {
return new Promise((resolve, reject) => {
console.log(`Processing: ${roadmapId}`);
try {
execSync(`npm run roadmap-assets ${roadmapId}`, {
stdio: 'inherit',
cwd: process.cwd()
});
console.log(`✓ Completed: ${roadmapId}`);
resolve(roadmapId);
} catch (error) {
console.error(`✗ Failed: ${roadmapId}`, error);
reject(error);
}
});
});
Promise.allSettled(promises).then(results => {
const successful = results.filter(r => r.status === 'fulfilled').length;
const failed = results.filter(r => r.status === 'rejected').length;
console.log(`\n=== Summary ===`);
console.log(`✓ Successful: ${successful}/${roadmapIds.length}`);
if (failed > 0) {
console.log(`✗ Failed: ${failed}/${roadmapIds.length}`);
}
});
================================================
FILE: scripts/rename-content.ts
================================================
import fs from 'fs';
import path from 'path';
const roadmapDirs = fs.readdirSync(
path.join(__dirname, '..', 'src', 'data', 'roadmaps'),
);
roadmapDirs.forEach((roadmapDir) => {
const roadmapDirPath = path.join(
__dirname,
'..',
'src',
'data',
'roadmaps',
roadmapDir,
'content',
);
const roadmapDirContent = fs.readdirSync(roadmapDirPath);
roadmapDirContent.forEach((content) => {
const contentPath = path.join(roadmapDirPath, content);
const contentStats = fs.statSync(contentPath);
const oldName = path.basename(contentPath);
const newName = oldName.replace(/^(\d+)-/, '');
fs.renameSync(contentPath, path.join(roadmapDirPath, newName));
if (contentStats.isDirectory()) {
const contentDirContent = fs.readdirSync(contentPath);
contentDirContent.forEach((contentDir) => {
const contentDirPath = path.join(contentPath, contentDir);
const contentDirStats = fs.statSync(contentDirPath);
const oldName = path.basename(contentDirPath);
const newName = oldName.replace(/^(\d+)-/, '');
fs.renameSync(contentDirPath, path.join(contentPath, newName));
if (contentDirStats.isDirectory()) {
const contentDirContent = fs.readdirSync(contentDirPath);
contentDirContent.forEach((contentDir) => {
const contentDirPath2 = path.join(contentDirPath, contentDir);
const contentDirStats2 = fs.statSync(contentDirPath2);
const oldName2 = path.basename(contentDirPath2);
const newName2 = oldName2.replace(/^(\d+)-/, '');
fs.renameSync(contentDirPath2, path.join(contentDirPath, newName2));
});
}
});
}
});
});
================================================
FILE: scripts/roadmap-content.cjs
================================================
const fs = require('fs');
const path = require('path');
const OPEN_AI_API_KEY = process.env.OPEN_AI_API_KEY;
const ALL_ROADMAPS_DIR = path.join(__dirname, '../src/data/roadmaps');
const roadmapId = process.argv[2];
const allowedRoadmapIds = fs.readdirSync(ALL_ROADMAPS_DIR);
if (!roadmapId) {
console.error('roadmapId is required');
process.exit(1);
}
if (!allowedRoadmapIds.includes(roadmapId)) {
console.error(`Invalid roadmap key ${roadmapId}`);
console.error(`Allowed keys are ${allowedRoadmapIds.join(', ')}`);
process.exit(1);
}
const ROADMAP_CONTENT_DIR = path.join(ALL_ROADMAPS_DIR, roadmapId, 'content');
const OpenAI = require('openai');
const openai = new OpenAI({
apiKey: OPEN_AI_API_KEY,
});
function getFilesInFolder(folderPath, fileList = {}) {
const files = fs.readdirSync(folderPath);
files.forEach((file) => {
const filePath = path.join(folderPath, file);
const stats = fs.statSync(filePath);
if (stats.isDirectory()) {
getFilesInFolder(filePath, fileList);
} else if (stats.isFile()) {
const fileUrl = filePath
.replace(ROADMAP_CONTENT_DIR, '') // Remove the content folder
.replace(/\/\d+-/g, '/') // Remove ordering info `/101-ecosystem`
.replace(/\/index\.md$/, '') // Make the `/index.md` to become the parent folder only
.replace(/\.md$/, ''); // Remove `.md` from the end of file
fileList[fileUrl] = filePath;
}
});
return fileList;
}
/**
* Write the topic content for the given topic
* @param currTopicUrl
* @returns {Promise<string>}
*/
function writeTopicContent(currTopicUrl) {
const [parentTopic, childTopic] = currTopicUrl
.replace(/^\d+-/g, '/')
.replace(/:/g, '/')
.replace(/^\//, '')
.split('/')
.slice(-2)
.map((topic) => topic.replace(/-/g, ' '));
const roadmapTitle = roadmapId.replace(/-/g, ' ');
let prompt = `I will give you a topic and you need to write a brief introduction for that with regards to "${roadmapTitle}". Your format should be as follows and be in strictly markdown format:
# (Put a heading for the topic without adding parent "Subtopic in Topic" or "Topic in Roadmap" etc.)
(Write me a brief introduction for the topic with regards to "${roadmapTitle}")
(add any code snippets ONLY if necessary and makes sense)
`;
if (!childTopic) {
prompt += `First topic is: ${parentTopic}`;
} else {
prompt += `First topic is: ${childTopic} under ${parentTopic}`;
}
console.log(`Generating '${childTopic || parentTopic}'...`);
return new Promise((resolve, reject) => {
openai.chat.completions
.create({
model: 'gpt-4',
messages: [
{
role: 'user',
content: prompt,
},
],
})
.then((response) => {
const article = response.choices[0].message.content;
resolve(article);
})
.catch((err) => {
reject(err);
});
});
}
async function writeFileForGroup(group, topicUrlToPathMapping) {
const topicId = group?.properties?.controlName;
const topicTitle = group?.children?.controls?.control?.find(
(control) => control?.typeID === 'Label',
)?.properties?.text;
const currTopicUrl = topicId?.replace(/^\d+-/g, '/')?.replace(/:/g, '/');
if (!currTopicUrl) {
return;
}
const contentFilePath = topicUrlToPathMapping[currTopicUrl];
if (!contentFilePath) {
console.log(`Missing file for: ${currTopicUrl}`);
return;
}
const currentFileContent = fs.readFileSync(contentFilePath, 'utf8');
const isFileEmpty = currentFileContent.replace(/^#.+/, ``).trim() === '';
if (!isFileEmpty) {
console.log(`Ignoring ${topicId}. Not empty.`);
return;
}
let newFileContent = `# ${topicTitle}`;
if (!OPEN_AI_API_KEY) {
console.log(`Writing ${topicId}..`);
fs.writeFileSync(contentFilePath, newFileContent, 'utf8');
return;
}
const topicContent = await writeTopicContent(currTopicUrl);
console.log(`Writing ${topicId}..`);
fs.writeFileSync(contentFilePath, topicContent, 'utf8');
// console.log(currentFileContent);
// console.log(currTopicUrl);
// console.log(topicTitle);
// console.log(topicUrlToPathMapping[currTopicUrl]);
}
async function run() {
const topicUrlToPathMapping = getFilesInFolder(ROADMAP_CONTENT_DIR);
const roadmapJson = require(
path.join(ALL_ROADMAPS_DIR, `${roadmapId}/${roadmapId}`),
);
const groups = roadmapJson?.mockup?.controls?.control?.filter(
(control) =>
control.typeID === '__group__' &&
!control.properties?.controlName?.startsWith('ext_link'),
);
if (!OPEN_AI_API_KEY) {
console.log('----------------------------------------');
console.log('OPEN_AI_API_KEY not found. Skipping openai api calls...');
console.log('----------------------------------------');
}
const writePromises = [];
for (let group of groups) {
writePromises.push(writeFileForGroup(group, topicUrlToPathMapping));
}
console.log('Waiting for all files to be written...');
await Promise.all(writePromises);
}
run()
.then(() => {
console.log('Done');
})
.catch((err) => {
console.error(err);
process.exit(1);
});
================================================
FILE: scripts/roadmap-dirs.cjs
================================================
const fs = require('fs');
const path = require('path');
const CONTENT_DIR = path.join(__dirname, '../content');
// Directory containing the roadmaps
const ROADMAP_CONTENT_DIR = path.join(__dirname, '../src/data/roadmaps');
const roadmapId = process.argv[2];
const allowedRoadmapIds = fs.readdirSync(ROADMAP_CONTENT_DIR);
if (!roadmapId) {
console.error('roadmapId is required');
process.exit(1);
}
if (!allowedRoadmapIds.includes(roadmapId)) {
console.error(`Invalid roadmap key ${roadmapId}`);
console.error(`Allowed keys are ${allowedRoadmapIds.join(', ')}`);
process.exit(1);
}
// Directory holding the roadmap content files
const roadmapDirName = fs
.readdirSync(ROADMAP_CONTENT_DIR)
.find((dirName) => dirName.replace(/\d+-/, '') === roadmapId);
if (!roadmapDirName) {
console.error('Roadmap directory not found');
process.exit(1);
}
const roadmapDirPath = path.join(ROADMAP_CONTENT_DIR, roadmapDirName);
const roadmapContentDirPath = path.join(
ROADMAP_CONTENT_DIR,
roadmapDirName,
'content'
);
// If roadmap content already exists do not proceed as it would override the files
if (fs.existsSync(roadmapContentDirPath)) {
console.error(`Roadmap content already exists @ ${roadmapContentDirPath}`);
process.exit(1);
}
function prepareDirTree(control, dirTree, dirSortOrders) {
// Directories are only created for groups
if (control.typeID !== '__group__') {
return;
}
// e.g. 104-testing-your-apps:other-options
const controlName = control?.properties?.controlName || '';
// e.g. 104
const sortOrder = controlName.match(/^\d+/)?.[0];
// No directory for a group without control name
if (!controlName || (!sortOrder && !controlName.startsWith('check:'))) {
return;
}
// e.g. testing-your-apps:other-options
const controlNameWithoutSortOrder = controlName.replace(/^\d+-/, '').replace(/^check:/, '');
// e.g. ['testing-your-apps', 'other-options']
const dirParts = controlNameWithoutSortOrder.split(':');
// Nest the dir path in the dirTree
let currDirTree = dirTree;
dirParts.forEach((dirPart) => {
currDirTree[dirPart] = currDirTree[dirPart] || {};
currDirTree = currDirTree[dirPart];
});
dirSortOrders[controlNameWithoutSortOrder] = Number(sortOrder);
const childrenControls = control.children.controls.control;
// No more children
if (childrenControls.length) {
childrenControls.forEach((childControl) => {
prepareDirTree(childControl, dirTree, dirSortOrders);
});
}
return { dirTree, dirSortOrders };
}
const roadmap = require(path.join(
__dirname,
`../src/data/roadmaps/${roadmapId}/${roadmapId}`
));
const controls = roadmap.mockup.controls.control;
// Prepare the dir tree that we will be creating and also calculate the sort orders
const dirTree = {};
const dirSortOrders = {};
controls.forEach((control) => {
prepareDirTree(control, dirTree, dirSortOrders);
});
/**
* @param parentDir Parent directory in which directory is to be created
* @param dirTree Nested dir tree to be created
* @param sortOrders Mapping from groupName to sort order
* @param filePaths The mapping from groupName to file path
*/
function createDirTree(parentDir, dirTree, sortOrders, filePaths = {}) {
const childrenDirNames = Object.keys(dirTree);
const hasChildren = childrenDirNames.length !== 0;
// @todo write test for this, yolo for now
const groupName = parentDir
.replace(roadmapContentDirPath, '') // Remove base dir path
.replace(/(^\/)|(\/$)/g, '') // Remove trailing slashes
.replace(/(^\d+?-)/g, '') // Remove sorting information
.replaceAll('/', ':') // Replace slashes with `:`
.replace(/:\d+-/, ':');
const humanizedGroupName = groupName
.split(':')
.pop()
?.replaceAll('-', ' ')
.replace(/^\w/, ($0) => $0.toUpperCase());
const sortOrder = sortOrders[groupName] || '';
// Attach sorting information to dirname
// e.g. /roadmaps/100-frontend/content/internet
// ———> /roadmaps/100-frontend/content/103-internet
if (sortOrder) {
parentDir = parentDir.replace(/(.+?)([^\/]+)?$/, `$1${sortOrder}-$2`);
}
// If no children, create a file for this under the parent directory
if (!hasChildren) {
let fileName = `${parentDir}.md`;
fs.writeFileSync(fileName, `# ${humanizedGroupName}`);
filePaths[groupName || 'home'] = fileName.replace(CONTENT_DIR, '');
return filePaths;
}
// There *are* children, so create the parent as a directory
// and create `index.md` as the content file for this
fs.mkdirSync(parentDir);
let readmeFilePath = path.join(parentDir, 'index.md');
fs.writeFileSync(readmeFilePath, `# ${humanizedGroupName}`);
filePaths[groupName || 'home'] = readmeFilePath.replace(CONTENT_DIR, '');
// For each of the directory names, create a
// directory inside the given directory
childrenDirNames.forEach((dirName) => {
createDirTree(
path.join(parentDir, dirName),
dirTree[dirName],
dirSortOrders,
filePaths
);
});
return filePaths;
}
// Create directories and get back the paths for created directories
createDirTree(roadmapContentDirPath, dirTree, dirSortOrders);
console.log('Created roadmap content directory structure');
================================================
FILE: scripts/roadmap-links.cjs
================================================
const fs = require('fs');
const path = require('path');
const roadmapId = process.argv[2];
if (!roadmapId) {
console.error('Error: roadmapId is required');
}
const fullPath = path.join(__dirname, `../src/data/roadmaps/${roadmapId}`);
if (!fs.existsSync(fullPath)) {
console.error(`Error: path not found: ${fullPath}!`);
process.exit(1);
}
function readFiles(folderPath) {
const stats = fs.lstatSync(folderPath);
if (stats.isFile()) {
return [folderPath];
}
const folderContent = fs.readdirSync(folderPath);
let files = [];
for (const file of folderContent) {
const filePath = path.join(folderPath, file);
files = [...files, ...readFiles(filePath)];
}
return files;
}
const files = readFiles(fullPath);
let allLinks = [];
files.forEach((file) => {
const fileContent = fs.readFileSync(file, 'utf-8');
const matches = [...fileContent.matchAll(/\[[^\]]+]\((https?:\/\/[^)]+)\)/g)];
allLinks = [...allLinks, ...matches.map((match) => match[1])];
});
allLinks.map((link) => console.log(link));
================================================
FILE: scripts/roadmap-tree-content.js
================================================
import OpenAI from 'openai';
import path from 'path';
import fs from 'fs';
import { fileURLToPath } from 'url';
import { dirname } from 'path';
const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);
/**
* @typedef {Object} Node
* @property {string} id - The unique identifier for the node
* @property {string} text - The text content of the node
*/
const roadmapId = 'ai-agents';
/** @type {Node[]} */
const nodes = [
{
id: 'ZF5_5Y5zqa75Ov22JACX6',
text: 'AI Agents > Transformer Models and LLMs',
},
{
id: 'GAjuWyJl9CI1nqXBp6XCf',
text: 'AI Agents > LLM Fundamentals > Model Mechanis > Tokenization',
},
{
id: 'dyn1LSioema-Bf9lLTgUZ',
text: 'AI Agents > LLM Fundamentals > Model Mechanis > Context Windows',
},
{
id: '1fiWPBV99E2YncqdCgUw2',
text: 'AI Agents > LLM Fundamentals > Model Mechanis > Token Based Pricing',
},
{
id: 'L1zL1GzqjSAjF06pIIXhy',
text: 'AI Agents > LLM Fundamentals > Generation Controls > Temperature',
},
{
id: 'icbp1NjurQfdM0dHnz6v2',
text: 'AI Agents > LLM Fundamentals > Generation Controls > Top-p',
},
{
id: 'z_N-Y0zGkv8_qHPuVtimL',
text: 'AI Agents > LLM Fundamentals > Generation Controls > Frequency Penalty',
},
{
id: 'Vd8ycw8pW-ZKvg5WYFtoh',
text: 'AI Agents > LLM Fundamentals > Generation Controls > Presence Penalty',
},
{
id: 'K0G-Lw069jXUJwZqHtybd',
text: 'AI Agents > LLM Fundamentals > Generation Controls > Stopping Criteria',
},
{
id: 'Bn_BkthrVX_vOuwQzvPZa',
text: 'AI Agents > LLM Fundamentals > Generation Controls > Max Length',
},
{
id: 'DSJAhQhc1dQmBHQ8ZkTau',
text: 'AI Agents > Model Families and Licences > Open Weight Models',
},
{
id: 'tJYmEDDwK0LtEux-kwp9B',
text: 'AI Agents > Model Families and Licences > Closed Weight Models',
},
{
id: 'i2NE6haX9-7mdoV5LQ3Ah',
text: 'AI Agents > Understand the Basics > Streamed vs Unstreamed Responses',
},
{
id: 'N3yZfUxphxjiupqGpyaS9',
text: 'AI Agents > Understand the Basics > Reasoning vs Standard Models',
},
{
id: '5OW_6o286mj470ElFyJ_5',
text: 'AI Agents > Understand the Basics > Fine-tuning vs Prompt Engineering',
},
{
id: 'UIm54UmICKgep6s8Itcyv',
text: 'AI Agents > Understand the Basics > Embeddings and Vector Search',
},
{
id: 'qwVQOwBTLA2yUgRISzC8k',
text: 'AI Agents > Understand the Basics > Understand the Basics of RAG',
},
{
id: 'B8dzg61TGaknuruBgkEJd',
text: 'AI Agents > Understand the Basics > Pricing of Common Models',
},
{
id: 'aFZAm44nP5NefX_9TpT0A',
text: 'AI Agents > AI Agents 101 > What are AI Agents?',
},
{
id: '2zsOUWJQ8e7wnoHmq1icG',
text: 'AI Agents > AI Agents 101 > What are Tools?',
},
{
id: 'Eih4eybuYB3C2So8K0AT3',
text: 'AI Agents > AI Agents 101 > Agent Loop',
},
{
id: 'LU76AhCYDjxdBhpMQ4eMU',
text: 'AI Agents > AI Agents 101 > Agent Loop > Perception / User Input',
},
{
id: 'ycPRgRYR4lEBQr_xxHKnM',
text: 'AI Agents > AI Agents 101 > Agent Loop > Reason and Plan',
},
{
id: 'sHYd4KsKlmw5Im3nQ19W8',
text: 'AI Agents > AI Agents 101 > Agent Loop > Acting / Tool Invocation',
},
{
id: 'ZJTrun3jK3zBGOTm1jdMI',
text: 'AI Agents > AI Agents 101 > Agent Loop > Observation & Reflection',
},
{
id: 'PPdAutqJF5G60Eg9lYBND',
text: 'AI Agents > AI Agents 101 > Example Usecases > Personal assistant',
},
{
id: 'PK8w31GlvtmAuU92sHaqr',
text: 'AI Agents > AI Agents 101 > Example Usecases > Code generation',
},
{
id: 'wKYEaPWNsR30TIpHaxSsq',
text: 'AI Agents > AI Agents 101 > Example Usecases > Data analysis',
},
{
id: '5oLc-235bvKhApxzYFkEc',
text: 'AI Agents > AI Agents 101 > Example Usecases > Web Scraping / Crawling',
},
{
id: 'ok8vN7VtCgyef5x6aoQaL',
text: 'AI Agents > AI Agents 101 > Example Usecases > NPC / Game AI',
},
{
id: 'Y8EqzFx3qxtrSh7bWbbV8',
text: 'AI Agents > Prompt Engineering > What is Prompt Engineering',
},
{
id: 'qFKFM2qNPEN7EoD0V-1SM',
text: 'AI Agents > Prompt Engineering > Writing Good Prompts > Be specific in what you want',
},
{
id: '6I42CoeWX-kkFXTKAY7rw',
text: 'AI Agents > Prompt Engineering > Writing Good Prompts > Provide additional context',
},
{
id: 'sUwdtOX550tSdceaeFPmF',
text: 'AI Agents > Prompt Engineering > Writing Good Prompts > Use relevant technical terms',
},
{
id: 'yulzE4ZNLhXOgHhG7BtZQ',
text: 'AI Agents > Prompt Engineering > Writing Good Prompts > Use Examples in your Prompt',
},
{
id: 'noTuUFnHSBzn7GKG9UZEi',
text: 'AI Agents > Prompt Engineering > Writing Good Prompts > Iterate and Test your Prompts',
},
{
id: 'wwHHlEoPAx0TLxbtY6nMA',
text: 'AI Agents > Prompt Engineering > Writing Good Prompts > Specify Length, format etc',
},
{
id: 'qakbxB8xe7Y8gejC5cZnK',
text: 'AI Agents > AI Agents 101 > Tools / Actions > Tool Definition',
},
{
id: 'kBtqT8AduLoYDWopj-V9_',
text: 'AI Agents > Tools / Actions > Examples of Tools > Web Search',
},
{
id: 'mS0EVCkWuPN_GkVPng4A2',
text: 'AI Agents > Tools / Actions > Examples of Tools > Code Execution / REPL',
},
{
id: 'sV1BnA2-qBnXoKpUn-8Ub',
text: 'AI Agents > Tools / Actions > Examples of Tools > Database Queries',
},
{
id: '52qxjZILV-X1isup6dazC',
text: 'AI Agents > Tools / Actions > Examples of Tools > API Requests > Tools / Actions > Examples of Tools > API Requests',
},
{
id: 'qaNr5I-NQPnfrRH7ynGTl',
text: 'AI Agents > Tools / Actions > Examples of Tools > Email / Slack / SMS',
},
{
id: 'BoJqZvdGam4cd6G6yK2IV',
text: 'AI Agents > Tools / Actions > Examples of Tools > File System Access',
},
{
id: '1B0IqRNYdtbHDi1jHSXuI',
text: 'AI Agents > Model Context Protocol (MCP)',
},
{
id: '9FryAIrWRHh8YlzKX3et5',
text: 'AI Agents > Model Context Protocol (MCP) > Core Components > MCP Hosts',
},
{
id: 'CGVstUxVXLJcYZrwk3iNQ',
text: 'AI Agents > Model Context Protocol (MCP) > Core Components > MCP Client',
},
{
id: 'yv_-87FVM7WKn5iv6LW9q',
text: 'AI Agents > Model Context Protocol (MCP) > Core Components > MCP Servers',
},
{
id: '1NXIN-Hbjl5rPy_mqxQYW',
text: 'AI Agents > Model Context Protocol (MCP) > Creating MCP Servers',
},
{
id: 'iBtJp24F_kJE3YlBsW60s',
text: 'AI Agents > Model Context Protocol (MCP) > Creating MCP Servers > Deployment Modes > Local Desktop',
},
{
id: 'dHNMX3_t1KSDdAWqgdJXv',
text: 'AI Agents > Model Context Protocol (MCP) > Creating MCP Servers > Deployment Modes > Remote / Cloud',
},
{
id: 'TBH_DZTAfR8Daoh-njNFC',
text: 'AI Agents > Agent Memory > What is Agent Memory?',
},
{
id: 'M3U6RfIqaiut2nuOibY8W',
text:
Showing preview only (865K chars total). Download the full file or copy to clipboard to get everything.
gitextract__yy4215q/ ├── .cursor/ │ └── rules/ │ ├── content-migration.mdc │ └── gh-cli.mdc ├── .github/ │ ├── FUNDING.yml │ ├── ISSUE_TEMPLATE/ │ │ ├── 01-suggest-changes.yml │ │ ├── 02-bug-report.yml │ │ ├── 03-feature-suggestion.yml │ │ ├── 04-roadmap-contribution.yml │ │ ├── 05-something-else.yml │ │ └── config.yml │ └── workflows/ │ ├── aws-costs.yml │ ├── cleanup-orphaned-content.yml │ ├── close-feedback-pr.yml │ ├── cloudfront-api-cache.yml │ ├── cloudfront-fe-cache.yml │ ├── deployment.yml │ ├── label-issue.yml │ ├── sync-content-to-repo.yml │ ├── sync-repo-to-database.yml │ └── upgrade-dependencies.yml ├── .gitignore ├── .npmrc ├── .prettierignore ├── .prettierrc.cjs ├── .vscode/ │ ├── extensions.json │ ├── launch.json │ └── settings.json ├── astro.config.mjs ├── code_of_conduct.md ├── contributing.md ├── license ├── package.json ├── packages/ │ └── .gitkeep ├── playwright.config.ts ├── pnpm-workspace.yaml ├── public/ │ └── manifest/ │ └── manifest.json ├── readme.md ├── scripts/ │ ├── assign-label-types.cjs │ ├── best-practice-content.cjs │ ├── best-practice-dirs.cjs │ ├── cleanup-orphaned-content.ts │ ├── close-issues.sh │ ├── compress-images.ts │ ├── compressed-images.json │ ├── create-roadmap-labels.sh │ ├── editor-roadmap-assets.ts │ ├── editor-roadmap-content-json.ts │ ├── editor-roadmap-content.ts │ ├── editor-roadmap-dirs.ts │ ├── extract-guide-images.cjs │ ├── gemini-roadmap-content.ts │ ├── generate-og-images.mjs │ ├── generate-renderer.sh │ ├── label-issues.sh │ ├── migrate-content-repo-to-database.ts │ ├── migrate-editor-roadmap.ts │ ├── official-roadmap-assets.ts │ ├── page-data-agg.cjs │ ├── readme.md │ ├── refresh-assets.ts │ ├── rename-content.ts │ ├── roadmap-content.cjs │ ├── roadmap-dirs.cjs │ ├── roadmap-links.cjs │ ├── roadmap-tree-content.js │ ├── sync-content-to-repo.ts │ ├── sync-repo-to-database.ts │ ├── sync-roadmap-to-database.ts │ ├── update-sponsors.cjs │ └── warm-urls.sh ├── sitemap.mjs ├── src/ │ ├── api/ │ │ ├── ai-roadmap.ts │ │ ├── api.ts │ │ ├── leaderboard.ts │ │ ├── project.ts │ │ ├── roadmap.ts │ │ └── user.ts │ ├── components/ │ │ ├── AIChat/ │ │ │ ├── AIChat.css │ │ │ ├── AIChat.tsx │ │ │ ├── AIChatCouse.tsx │ │ │ ├── ChatHistory.tsx │ │ │ ├── PersonalizedResponseForm.tsx │ │ │ ├── QuickActionButton.tsx │ │ │ ├── QuickHelpPrompts.tsx │ │ │ └── UploadResumeModal.tsx │ │ ├── AIChatHistory/ │ │ │ ├── AIChatHistory.tsx │ │ │ ├── AIChatLayout.tsx │ │ │ ├── ChatHistoryAction.tsx │ │ │ ├── ChatHistoryError.tsx │ │ │ ├── ChatHistoryGroup.tsx │ │ │ ├── ChatHistoryItem.tsx │ │ │ ├── ListChatHistory.tsx │ │ │ ├── ListChatHistorySkeleton.tsx │ │ │ └── SearchAIChatHistory.tsx │ │ ├── AIGuide/ │ │ │ ├── AIGuideActions.tsx │ │ │ ├── AIGuideCard.tsx │ │ │ └── AILibraryLayout.tsx │ │ ├── AIQuiz/ │ │ │ ├── AIMCQQuestion.tsx │ │ │ ├── AIOpenEndedQuestion.tsx │ │ │ ├── AIQuiz.tsx │ │ │ ├── AIQuizActions.tsx │ │ │ ├── AIQuizCard.tsx │ │ │ ├── AIQuizContent.tsx │ │ │ ├── AIQuizGenerator.tsx │ │ │ ├── AIQuizLayout.tsx │ │ │ ├── AIQuizResultStrip.tsx │ │ │ ├── AIQuizResults.tsx │ │ │ ├── CircularProgress.tsx │ │ │ ├── GenerateAIQuiz.tsx │ │ │ ├── QuizTopNavigation.tsx │ │ │ └── UserQuizzesList.tsx │ │ ├── AIRoadmap/ │ │ │ ├── AIRoadmap.css │ │ │ ├── AIRoadmap.tsx │ │ │ ├── AIRoadmapActions.tsx │ │ │ ├── AIRoadmapCard.tsx │ │ │ ├── AIRoadmapChat.tsx │ │ │ ├── AIRoadmapContent.tsx │ │ │ ├── AIRoadmapRegenerate.tsx │ │ │ ├── GenerateAIRoadmap.tsx │ │ │ └── UserRoadmapsList.tsx │ │ ├── AITutor/ │ │ │ ├── AIExploreCourseListing.tsx │ │ │ ├── AIFeaturedCoursesListing.tsx │ │ │ ├── AILoadingState.tsx │ │ │ ├── AITutorHeader.tsx │ │ │ ├── AITutorLayout.tsx │ │ │ ├── AITutorLimits.tsx │ │ │ ├── AITutorSidebar.tsx │ │ │ ├── AITutorSidebarProps.tsx │ │ │ ├── AITutorTallMessage.tsx │ │ │ ├── BaseDropdown.tsx │ │ │ ├── DifficultyDropdown.tsx │ │ │ ├── LoginToView.tsx │ │ │ ├── NatureDropdown.tsx │ │ │ ├── UpgradeSidebarCard.tsx │ │ │ └── UserDropdown.tsx │ │ ├── AIUsageWarning/ │ │ │ └── AIUsageWarning.tsx │ │ ├── AccountSidebar/ │ │ │ └── AccountSidebarUpgrade.tsx │ │ ├── AccountSidebar.astro │ │ ├── AccountStreak/ │ │ │ ├── AccountStreak.tsx │ │ │ ├── AccountStreakHeatmap.css │ │ │ ├── InviteFriends.tsx │ │ │ └── StreakDay.tsx │ │ ├── AccountTerms.tsx │ │ ├── Activity/ │ │ │ ├── ActivityStream.tsx │ │ │ ├── ActivityTopicTitles.tsx │ │ │ ├── ActivityTopicsModal.tsx │ │ │ ├── EmptyStream.tsx │ │ │ ├── ProjectProgress.tsx │ │ │ ├── ProjectProgressActions.tsx │ │ │ ├── ProjectStatus.tsx │ │ │ ├── ResourceProgress.tsx │ │ │ └── ResourceProgressActions.tsx │ │ ├── AddTeamRoadmap.tsx │ │ ├── AdvertiseForm.tsx │ │ ├── Analytics/ │ │ │ ├── Analytics.astro │ │ │ ├── Bluconic.astro │ │ │ ├── Clarity.astro │ │ │ ├── GoogleAd.astro │ │ │ ├── GoogleAdSlot.astro │ │ │ ├── Hubspot.astro │ │ │ ├── LinkedIn.astro │ │ │ ├── OneTrust.astro │ │ │ ├── RedditPixel.astro │ │ │ └── analytics.ts │ │ ├── AppChecklist.tsx │ │ ├── AstroIcon.astro │ │ ├── AuthenticationFlow/ │ │ │ ├── AuthenticationForm.tsx │ │ │ ├── CourseLoginPopup.tsx │ │ │ ├── Divider.astro │ │ │ ├── EmailLoginForm.tsx │ │ │ ├── EmailSignupForm.tsx │ │ │ ├── ForgotPasswordForm.tsx │ │ │ ├── GitHubButton.tsx │ │ │ ├── GoogleButton.tsx │ │ │ ├── LinkedInButton.tsx │ │ │ ├── LoginPopup.astro │ │ │ ├── ResetPasswordForm.tsx │ │ │ ├── TriggerVerifyAccount.tsx │ │ │ ├── TriggerVerifyEmail.tsx │ │ │ └── VerificationEmailMessage.tsx │ │ ├── Authenticator/ │ │ │ ├── Authenticator.astro │ │ │ └── authenticator.ts │ │ ├── Badge.tsx │ │ ├── Befriend.tsx │ │ ├── BestPracticeHeader.astro │ │ ├── BestPracticeHint.astro │ │ ├── Billing/ │ │ │ ├── BillingPage.tsx │ │ │ ├── BillingWarning.tsx │ │ │ ├── CheckSubscriptionVerification.tsx │ │ │ ├── EmptyBillingScreen.tsx │ │ │ ├── GlobalUpgradeModal.tsx │ │ │ ├── UpdatePlanConfirmation.tsx │ │ │ ├── UpgradeAccountModal.tsx │ │ │ └── VerifyUpgrade.tsx │ │ ├── Changelog/ │ │ │ ├── ChangelogItem.astro │ │ │ └── ChangelogLaunch.astro │ │ ├── ChangelogBanner.astro │ │ ├── ChangelogImages.tsx │ │ ├── ChatEditor/ │ │ │ ├── ChatEditor.css │ │ │ ├── ChatEditor.tsx │ │ │ └── VariableExtension/ │ │ │ ├── VariableExtension.tsx │ │ │ └── VariableSuggestion.tsx │ │ ├── ChatMessages/ │ │ │ ├── AIChat.css │ │ │ ├── RoadmapChatIntroMessage.tsx │ │ │ ├── RoadmapChatMessage.tsx │ │ │ ├── RoadmapChatMessages.tsx │ │ │ ├── RoadmapRecommendations.tsx │ │ │ ├── RoadmapTopicList.tsx │ │ │ ├── ShareResourceLink.tsx │ │ │ ├── TopicChatMessage.tsx │ │ │ ├── TopicChatMessages.tsx │ │ │ ├── UserPrgressActionList.tsx │ │ │ └── UserProgressList.tsx │ │ ├── CommandMenu/ │ │ │ └── CommandMenu.tsx │ │ ├── Confetti.tsx │ │ ├── ContentGenerator/ │ │ │ ├── ContentGenerator.tsx │ │ │ ├── FormatItem.tsx │ │ │ └── QuestionAnswerChat.tsx │ │ ├── CookieSettingsButton.tsx │ │ ├── CreateTeam/ │ │ │ ├── ContentConfirmationModal.tsx │ │ │ ├── CreateTeamForm.tsx │ │ │ ├── NextButton.tsx │ │ │ ├── RoadmapSelector.tsx │ │ │ ├── RoleDropdown.tsx │ │ │ ├── SelectRoadmapModal.tsx │ │ │ ├── SelectRoadmapModalItem.tsx │ │ │ ├── Step0.tsx │ │ │ ├── Step1.tsx │ │ │ ├── Step2.tsx │ │ │ ├── Step3.tsx │ │ │ ├── Step4.tsx │ │ │ └── UpdateTeamResourceModal.tsx │ │ ├── CustomRoadmap/ │ │ │ ├── CreateRoadmap/ │ │ │ │ ├── CreateRoadmapButton.tsx │ │ │ │ └── CreateRoadmapModal.tsx │ │ │ ├── CustomRoadmap.tsx │ │ │ ├── CustomRoadmapAlert.tsx │ │ │ ├── CustomRoadmapRatings.tsx │ │ │ ├── CustomRoadmapRatingsModal.tsx │ │ │ ├── EmbedRoadmapModal.tsx │ │ │ ├── EmptyRoadmap.tsx │ │ │ ├── FlowRoadmapRenderer.tsx │ │ │ ├── ListRoadmapRatings.tsx │ │ │ ├── PersonalRoadmapActionDropdown.tsx │ │ │ ├── PersonalRoadmapList.tsx │ │ │ ├── RateRoadmapForm.tsx │ │ │ ├── ResourceProgressStats.tsx │ │ │ ├── RestrictedPage.tsx │ │ │ ├── RoadmapActionButton.tsx │ │ │ ├── RoadmapHeader.tsx │ │ │ ├── RoadmapHint.tsx │ │ │ ├── RoadmapListPage.tsx │ │ │ ├── ShareRoadmapModal.tsx │ │ │ ├── SharedRoadmapList.tsx │ │ │ ├── Showcase/ │ │ │ │ ├── ShowcaseAlert.tsx │ │ │ │ ├── ShowcaseStatus.tsx │ │ │ │ └── SubmitShowcaseWarning.tsx │ │ │ └── SkeletonRoadmapHeader.tsx │ │ ├── DailyDevIcon.tsx │ │ ├── Dashboard/ │ │ │ ├── DashboardAiRoadmaps.tsx │ │ │ ├── DashboardBookmarkCard.tsx │ │ │ ├── DashboardCardLink.tsx │ │ │ ├── DashboardCustomProgressCard.tsx │ │ │ ├── DashboardPage.tsx │ │ │ ├── DashboardProgressCard.tsx │ │ │ ├── DashboardProjectCard.tsx │ │ │ ├── DashboardTabButton.tsx │ │ │ ├── DashboardTeamRoadmaps.tsx │ │ │ ├── EmptyStackMessage.tsx │ │ │ ├── ListDashboardCustomProgress.tsx │ │ │ ├── LoadingProgress.tsx │ │ │ ├── PersonalDashboard.tsx │ │ │ ├── ProgressStack.tsx │ │ │ ├── RecommendedRoadmaps.tsx │ │ │ └── TeamDashboard.tsx │ │ ├── DeleteTeamPopup.tsx │ │ ├── DiscoverRoadmaps/ │ │ │ ├── DiscoverError.tsx │ │ │ ├── DiscoverRoadmapSorting.tsx │ │ │ ├── DiscoverRoadmaps.tsx │ │ │ ├── EmptyDiscoverRoadmaps.tsx │ │ │ └── SearchRoadmap.tsx │ │ ├── DownloadRoadmapButton.tsx │ │ ├── DropdownMenu.tsx │ │ ├── EditorRoadmap/ │ │ │ ├── EditorRoadmap.tsx │ │ │ ├── EditorRoadmapRenderer.css │ │ │ └── EditorRoadmapRenderer.tsx │ │ ├── ExploreAIRoadmap/ │ │ │ ├── AIRoadmapsList.tsx │ │ │ ├── EmptyRoadmaps.tsx │ │ │ ├── ExploreAIRoadmap.tsx │ │ │ ├── ExploreAISearch.tsx │ │ │ ├── ExploreAISorting.tsx │ │ │ └── LoadingRoadmaps.tsx │ │ ├── FAQs/ │ │ │ ├── FAQs.tsx │ │ │ └── Question.tsx │ │ ├── FeatureAnnouncement.tsx │ │ ├── FeaturedGuides/ │ │ │ ├── FeaturedGuideList.tsx │ │ │ └── GuideListItem.tsx │ │ ├── FeaturedItems/ │ │ │ ├── FavoriteIcon.tsx │ │ │ ├── FeaturedItem.astro │ │ │ ├── FeaturedItems.astro │ │ │ └── MarkFavorite.tsx │ │ ├── FeaturedVideos/ │ │ │ ├── FeaturedVideoList.tsx │ │ │ └── VideoListItem.tsx │ │ ├── Feedback/ │ │ │ └── SubmitFeedbackPopup.tsx │ │ ├── Footer.astro │ │ ├── FrameRenderer/ │ │ │ ├── FrameRenderer.astro │ │ │ ├── FrameRenderer.css │ │ │ ├── ProgressNudge.tsx │ │ │ ├── RoadmapFloatingChat.tsx │ │ │ └── renderer.ts │ │ ├── Friends/ │ │ │ └── SidebarFriendsCounter.tsx │ │ ├── GenerateCourse/ │ │ │ ├── AICourse.tsx │ │ │ ├── AICourseActions.tsx │ │ │ ├── AICourseCard.tsx │ │ │ ├── AICourseContent.tsx │ │ │ ├── AICourseFooter.tsx │ │ │ ├── AICourseLesson.tsx │ │ │ ├── AICourseLessonChat.css │ │ │ ├── AICourseLessonChat.tsx │ │ │ ├── AICourseLimit.tsx │ │ │ ├── AICourseOutlineHeader.tsx │ │ │ ├── AICourseOutlineView.tsx │ │ │ ├── AICourseRoadmapView.tsx │ │ │ ├── AICourseSearch.tsx │ │ │ ├── AICourseSidebarModuleList.tsx │ │ │ ├── AILimitsPopup.tsx │ │ │ ├── AIRoadmapViewSwitch.tsx │ │ │ ├── CircularProgress.tsx │ │ │ ├── FineTuneCourse.tsx │ │ │ ├── ForkCourseAlert.tsx │ │ │ ├── ForkCourseConfirmation.tsx │ │ │ ├── GenerateAICourse.tsx │ │ │ ├── GetAICourse.tsx │ │ │ ├── ModifyCoursePrompt.tsx │ │ │ ├── RegenerateLesson.tsx │ │ │ ├── RegenerateOutline.tsx │ │ │ ├── Resizeable.tsx │ │ │ ├── TestMyKnowledgeAction.tsx │ │ │ └── UserCoursesList.tsx │ │ ├── GenerateGuide/ │ │ │ ├── AIGuide.tsx │ │ │ ├── AIGuideChat.tsx │ │ │ ├── AIGuideContent.css │ │ │ ├── AIGuideContent.tsx │ │ │ ├── AIGuideRegenerate.tsx │ │ │ ├── GenerateAIGuide.tsx │ │ │ ├── GetAIGuide.tsx │ │ │ ├── UpdatePreferences.tsx │ │ │ └── UserGuidesList.tsx │ │ ├── GenerateRoadmap/ │ │ │ ├── AIRoadmapAlert.tsx │ │ │ ├── AITermSuggestionInput.tsx │ │ │ ├── GenerateRoadmap.css │ │ │ ├── GenerateRoadmap.tsx │ │ │ ├── RoadmapSearch.tsx │ │ │ └── RoadmapTopicDetail.tsx │ │ ├── GetStarted/ │ │ │ ├── RoadmapCard.tsx │ │ │ ├── RoadmapMultiCard.tsx │ │ │ ├── RoleRoadmaps.tsx │ │ │ ├── SectionBadge.tsx │ │ │ └── TipItem.tsx │ │ ├── Global/ │ │ │ ├── CodeBlock.tsx │ │ │ └── Markdown.tsx │ │ ├── GridItem.astro │ │ ├── Guide/ │ │ │ ├── GuideContent.tsx │ │ │ └── RelatedGuides.tsx │ │ ├── HeroSection/ │ │ │ ├── EmptyProgress.tsx │ │ │ ├── FavoriteRoadmaps.tsx │ │ │ ├── HeroItemsGroup.tsx │ │ │ ├── HeroProject.tsx │ │ │ ├── HeroRoadmap.tsx │ │ │ ├── HeroSection.astro │ │ │ └── HeroTitle.tsx │ │ ├── Leaderboard/ │ │ │ ├── ErrorPage.tsx │ │ │ └── LeaderboardPage.tsx │ │ ├── Library/ │ │ │ └── LibraryTab.tsx │ │ ├── Loader.astro │ │ ├── LoadingChip.tsx │ │ ├── MarkdownFile.astro │ │ ├── Modal.tsx │ │ ├── Navigation/ │ │ │ ├── AccountDropdown.astro │ │ │ ├── AccountDropdown.tsx │ │ │ ├── AccountDropdownList.tsx │ │ │ ├── DropdownTeamList.tsx │ │ │ ├── Navigation.astro │ │ │ ├── NewIndicator.astro │ │ │ ├── NotificationIndicator.tsx │ │ │ ├── OnboardingModal.tsx │ │ │ └── navigation.ts │ │ ├── NavigationDropdown.tsx │ │ ├── NavigationDropdownMenu.tsx │ │ ├── OnboardingNudge.tsx │ │ ├── OpenSourceBanner.astro │ │ ├── OpenSourceStat.astro │ │ ├── PageProgress.tsx │ │ ├── PageSponsor.tsx │ │ ├── PageVisit/ │ │ │ └── PageVisit.tsx │ │ ├── Pagination/ │ │ │ └── Pagination.tsx │ │ ├── PersonalizedRoadmap/ │ │ │ ├── PersonalizedRoadmap.tsx │ │ │ ├── PersonalizedRoadmapModal.tsx │ │ │ └── PersonalizedRoadmapSwitcher.tsx │ │ ├── Popover.tsx │ │ ├── Popup/ │ │ │ ├── Popup.astro │ │ │ └── popup.js │ │ ├── Premium/ │ │ │ ├── CredibilityStats.tsx │ │ │ ├── FeatureCard.tsx │ │ │ ├── PremiumPage.tsx │ │ │ ├── StarRating.tsx │ │ │ ├── StatsItem.tsx │ │ │ ├── Testimonial.tsx │ │ │ ├── constants.ts │ │ │ └── index.ts │ │ ├── ProgressHelpPopup.astro │ │ ├── Projects/ │ │ │ ├── CompleteProjectConfirmation.tsx │ │ │ ├── EmptyProjects.tsx │ │ │ ├── EmptySolutions.tsx │ │ │ ├── LeavingRoadmapWarningModal.tsx │ │ │ ├── ListProjectSolutions.tsx │ │ │ ├── LoadingSolutions.tsx │ │ │ ├── ProjectCard.tsx │ │ │ ├── ProjectContent.tsx │ │ │ ├── ProjectSolutionModal.tsx │ │ │ ├── ProjectSolutionRow.tsx │ │ │ ├── ProjectTabs.tsx │ │ │ ├── ProjectsList.tsx │ │ │ ├── ProjectsPage.tsx │ │ │ ├── ProjectsPageHeader.tsx │ │ │ ├── SelectLanguages.tsx │ │ │ ├── SortProjects.tsx │ │ │ ├── StartProjectConfirmation.tsx │ │ │ ├── StartProjectModal.tsx │ │ │ ├── StatusStepper/ │ │ │ │ ├── MilestoneStep.tsx │ │ │ │ ├── ProjectStepper.tsx │ │ │ │ ├── ProjectTrackingActions.tsx │ │ │ │ ├── StepperAction.tsx │ │ │ │ └── StepperStepSeparator.tsx │ │ │ ├── SubmissionRequirement.tsx │ │ │ ├── SubmitProjectModal.tsx │ │ │ ├── SubmitSuccessModal.tsx │ │ │ └── VoteButton.tsx │ │ ├── Questions/ │ │ │ ├── PrismAtom.css │ │ │ ├── QuestionCard.tsx │ │ │ ├── QuestionFinished.tsx │ │ │ ├── QuestionLoader.tsx │ │ │ ├── QuestionsList.tsx │ │ │ └── QuestionsProgress.tsx │ │ ├── Rating/ │ │ │ └── Rating.tsx │ │ ├── ReactIcons/ │ │ │ ├── AITutorLogo.tsx │ │ │ ├── AddedUserIcon.tsx │ │ │ ├── AppleCalendarIcon.tsx │ │ │ ├── BestPracticesIcon.tsx │ │ │ ├── BuildingIcon.tsx │ │ │ ├── CheckIcon.tsx │ │ │ ├── ChevronDownIcon.tsx │ │ │ ├── ClipboardIcon.tsx │ │ │ ├── CloseIcon.tsx │ │ │ ├── CogIcon.tsx │ │ │ ├── DeleteUserIcon.tsx │ │ │ ├── DropdownIcon.tsx │ │ │ ├── ErrorIcon.tsx │ │ │ ├── ErrorIcon2.tsx │ │ │ ├── FacebookIcon.tsx │ │ │ ├── FileIcon.tsx │ │ │ ├── GitHubIcon.tsx │ │ │ ├── GoogleCalendarIcon.tsx │ │ │ ├── GoogleIcon.tsx │ │ │ ├── GroupIcon.tsx │ │ │ ├── GuideIcon.tsx │ │ │ ├── HackerNewsIcon.tsx │ │ │ ├── HomeIcon.tsx │ │ │ ├── InfoIcon.tsx │ │ │ ├── LinkedInIcon.tsx │ │ │ ├── MoreVerticalIcon.tsx │ │ │ ├── OutlookCalendarIcon.tsx │ │ │ ├── RedditIcon.tsx │ │ │ ├── RoadmapIcon.tsx │ │ │ ├── RoadmapLogo.tsx │ │ │ ├── SecondPlaceMedalEmoji.tsx │ │ │ ├── ShareIcon.tsx │ │ │ ├── Spinner.tsx │ │ │ ├── StopIcon.tsx │ │ │ ├── TeamProgressIcon.tsx │ │ │ ├── ThirdPlaceMedalEmoji.tsx │ │ │ ├── TrashIcon.tsx │ │ │ ├── TrophyEmoji.tsx │ │ │ ├── TwitterIcon.tsx │ │ │ ├── UserIcon.tsx │ │ │ ├── UsersIcon.tsx │ │ │ ├── VerifyLetterIcon.tsx │ │ │ ├── VideoIcon.tsx │ │ │ └── WarningIcon.tsx │ │ ├── RelatedRoadmaps.astro │ │ ├── ResourceProgressStats.astro │ │ ├── RespondInviteForm.tsx │ │ ├── RoadCard/ │ │ │ └── Editor.tsx │ │ ├── RoadmapAIChat/ │ │ │ ├── AIChatActionButtons.tsx │ │ │ ├── ChatRoadmapRenderer.css │ │ │ ├── ChatRoadmapRenderer.tsx │ │ │ ├── RoadmapAIChat.css │ │ │ ├── RoadmapAIChat.tsx │ │ │ ├── RoadmapAIChatCard.tsx │ │ │ ├── RoadmapAIChatHeader.tsx │ │ │ ├── RoadmapChatListing.tsx │ │ │ ├── RoadmapRecommendations.tsx │ │ │ ├── RoadmapTopicList.tsx │ │ │ ├── ShareResourceLink.tsx │ │ │ ├── TopicResourcesModal.tsx │ │ │ ├── TutorIntroMessage.tsx │ │ │ ├── UserProgressActionList.tsx │ │ │ └── UserProgressList.tsx │ │ ├── RoadmapAIChatHistory/ │ │ │ └── RoadmapAIChatHistory.tsx │ │ ├── RoadmapAlert.tsx │ │ ├── RoadmapBanner.astro │ │ ├── RoadmapHeader.astro │ │ ├── RoadmapHint.astro │ │ ├── RoadmapNote.astro │ │ ├── RoadmapTitleQuestion.tsx │ │ ├── Roadmaps/ │ │ │ ├── CategoryFilterButton.tsx │ │ │ ├── RoadmapCard.tsx │ │ │ ├── RoadmapFeedbackAlert.astro │ │ │ ├── RoadmapsPage.tsx │ │ │ └── RoadmapsPageHeader.tsx │ │ ├── SQLCourse/ │ │ │ ├── AccountButton.tsx │ │ │ ├── AuthorCredentials.tsx │ │ │ ├── AuthorQuoteMessage.tsx │ │ │ ├── BuyButton.tsx │ │ │ ├── ChapterRow.tsx │ │ │ ├── CourseAnnouncement.tsx │ │ │ ├── CourseAuthor.tsx │ │ │ ├── CourseFeature.tsx │ │ │ ├── FAQSection.tsx │ │ │ ├── FloatingPurchase.tsx │ │ │ ├── PlatformDemo.tsx │ │ │ ├── ReviewsSection.tsx │ │ │ ├── SQLCoursePage.tsx │ │ │ ├── SectionHeader.tsx │ │ │ └── Spotlight.tsx │ │ ├── SQLCourseVariant/ │ │ │ ├── AuthorCredentials.tsx │ │ │ ├── BuyButton.tsx │ │ │ ├── ChapterRow.tsx │ │ │ ├── CourseDiscountBanner.tsx │ │ │ ├── CourseFeatures.tsx │ │ │ ├── FAQSection.tsx │ │ │ ├── MeetYourInstructor.tsx │ │ │ ├── PlatformDemo.tsx │ │ │ ├── PurchaseBanner.tsx │ │ │ ├── ReviewCarousel.tsx │ │ │ ├── RoadmapDetailsPopover.tsx │ │ │ ├── SQLCourseVariantPage.tsx │ │ │ └── SectionHeader.tsx │ │ ├── Schedule/ │ │ │ ├── ScheduleButton.tsx │ │ │ └── ScheduleEventModal.tsx │ │ ├── SearchSelector.tsx │ │ ├── Select.tsx │ │ ├── SelectNative.tsx │ │ ├── ShareIcons/ │ │ │ └── ShareIcons.tsx │ │ ├── ShareOptions/ │ │ │ ├── ShareFriendList.tsx │ │ │ ├── ShareOptionsModal.tsx │ │ │ ├── ShareOptionsTab.tsx │ │ │ ├── ShareSuccess.tsx │ │ │ ├── ShareTeamMemberList.tsx │ │ │ ├── TransferToTeamList.tsx │ │ │ └── UserItem.tsx │ │ ├── ShareRoadmapButton.tsx │ │ ├── SimplePageHeader.astro │ │ ├── Stepper.tsx │ │ ├── TabLink.tsx │ │ ├── TableOfContent/ │ │ │ └── TableOfContent.tsx │ │ ├── TeamActivity/ │ │ │ ├── TeamActivityItem.tsx │ │ │ ├── TeamActivityPage.tsx │ │ │ ├── TeamActivityTopicsModal.tsx │ │ │ └── TeamEmptyStream.tsx │ │ ├── TeamAnnouncement.tsx │ │ ├── TeamDropdown/ │ │ │ └── TeamDropdown.tsx │ │ ├── TeamMarketing/ │ │ │ ├── TeamDemo.tsx │ │ │ ├── TeamHeroBanner.tsx │ │ │ ├── TeamPricing.tsx │ │ │ └── TeamTools.tsx │ │ ├── TeamMembers/ │ │ │ └── InviteMemberPopup.tsx │ │ ├── TeamProgress/ │ │ │ ├── GroupRoadmapItem.tsx │ │ │ ├── MemberCustomProgressModal.tsx │ │ │ ├── MemberProgressItem.tsx │ │ │ ├── MemberProgressModal.tsx │ │ │ ├── MemberProgressModalHeader.tsx │ │ │ └── TeamProgressPage.tsx │ │ ├── TeamRoadmaps/ │ │ │ └── PickRoadmapOptionModal.tsx │ │ ├── TeamSidebar.tsx │ │ ├── TeamsList.tsx │ │ ├── ThankYou/ │ │ │ └── ThankYouPage.tsx │ │ ├── Toast.tsx │ │ ├── Tooltip.tsx │ │ ├── TopNavDropdowns/ │ │ │ ├── AIDropdownMenu.tsx │ │ │ ├── RoadmapDropdownMenu.tsx │ │ │ └── UpgradeProButton.tsx │ │ ├── TopicDetail/ │ │ │ ├── ContributionForm.tsx │ │ │ ├── CreateCourseModal.tsx │ │ │ ├── PaidResourceDisclaimer.tsx │ │ │ ├── PredefinedActionGroup.tsx │ │ │ ├── PredefinedActions.tsx │ │ │ ├── ResourceListSeparator.tsx │ │ │ ├── TopicDetail.tsx │ │ │ ├── TopicDetailAI.tsx │ │ │ ├── TopicDetailLink.tsx │ │ │ ├── TopicDetailsTabs.tsx │ │ │ └── TopicProgressButton.tsx │ │ ├── UpcomingForm.astro │ │ ├── UserPersona/ │ │ │ ├── ChatPersona.tsx │ │ │ ├── UpdatePersonaModal.tsx │ │ │ └── UserPersonaForm.tsx │ │ ├── UserProgress/ │ │ │ ├── ModalLoader.tsx │ │ │ ├── ProgressShareButton.tsx │ │ │ ├── UserCustomProgressModal.tsx │ │ │ ├── UserProgressModal.tsx │ │ │ └── UserProgressModalHeader.tsx │ │ ├── UserPublicProfile/ │ │ │ ├── PrivateProfileBanner.tsx │ │ │ ├── UserProfileRoadmap.tsx │ │ │ ├── UserProfileRoadmapRenderer.tsx │ │ │ ├── UserPublicActivityHeatmap.tsx │ │ │ ├── UserPublicProfileHeader.tsx │ │ │ ├── UserPublicProfilePage.tsx │ │ │ ├── UserPublicProgressStats.tsx │ │ │ ├── UserPublicProgresses.tsx │ │ │ └── UserPublicProjects.tsx │ │ ├── VideoHeader.astro │ │ ├── VideoModal.tsx │ │ ├── YouTubeAlert.astro │ │ ├── YouTubeBanner.astro │ │ └── courses/ │ │ ├── CourseStep.astro │ │ └── Milestone.astro │ ├── data/ │ │ ├── authors/ │ │ │ ├── ebrahim-bharmal.md │ │ │ ├── ekene.md │ │ │ ├── fernando.md │ │ │ ├── jesse-li.md │ │ │ ├── kamran.md │ │ │ ├── peter-thaleikis.md │ │ │ └── william.md │ │ ├── best-practices/ │ │ │ ├── api-security/ │ │ │ │ ├── api-security.json │ │ │ │ ├── api-security.md │ │ │ │ └── content/ │ │ │ │ ├── api-gateway.md │ │ │ │ ├── authentication-mechanisms.md │ │ │ │ ├── authorization-header.md │ │ │ │ ├── avoid-http-blocking.md │ │ │ │ ├── avoid-logging-sensitive-data.md │ │ │ │ ├── avoid-personal-id-urls.md │ │ │ │ ├── avoid-sensitive-data.md │ │ │ │ ├── cdn-for-file-uploads.md │ │ │ │ ├── centralized-logins.md │ │ │ │ ├── check-dependencies.md │ │ │ │ ├── code-review-process.md │ │ │ │ ├── csp-header.md │ │ │ │ ├── debug-mode-off.md │ │ │ │ ├── directory-listings.md │ │ │ │ ├── disable-entity-expansion.md │ │ │ │ ├── disable-entity-parsing-xml.md │ │ │ │ ├── endpoint-authentication.md │ │ │ │ ├── force-content-type.md │ │ │ │ ├── good-jwt-secret.md │ │ │ │ ├── hsts-header.md │ │ │ │ ├── index.md │ │ │ │ ├── jwt-algorithm.md │ │ │ │ ├── jwt-payload.md │ │ │ │ ├── max-retry-jail.md │ │ │ │ ├── monitor-everything.md │ │ │ │ ├── no-sniff-header.md │ │ │ │ ├── non-executable-stacks.md │ │ │ │ ├── oauth-redirect-ui.md │ │ │ │ ├── oauth-state.md │ │ │ │ ├── oauth-validate-scope.md │ │ │ │ ├── only-server-side-encryption.md │ │ │ │ ├── payload-size.md │ │ │ │ ├── prefer-uuid.md │ │ │ │ ├── proper-http-methods.md │ │ │ │ ├── proper-response-code.md │ │ │ │ ├── recommended-resources.md │ │ │ │ ├── remove-fingerprint-header.md │ │ │ │ ├── response-type-token.md │ │ │ │ ├── restrict-private-apis.md │ │ │ │ ├── rollback-deployments.md │ │ │ │ ├── run-security-analysis.md │ │ │ │ ├── sensitive-data-encryption.md │ │ │ │ ├── set-alerts.md │ │ │ │ ├── throttle-requests.md │ │ │ │ ├── token-expiry.md │ │ │ │ ├── unit-integration-tests.md │ │ │ │ ├── use-https.md │ │ │ │ ├── use-ids-ips-system.md │ │ │ │ ├── use-standard-authentication.md │ │ │ │ ├── validate-content-type.md │ │ │ │ ├── validate-user-input.md │ │ │ │ └── x-frame-options-deny.md │ │ │ ├── aws/ │ │ │ │ ├── aws.json │ │ │ │ ├── aws.md │ │ │ │ └── content/ │ │ │ │ ├── alerts-as-notifications.md │ │ │ │ ├── app-changes-for-aws.md │ │ │ │ ├── application-state.md │ │ │ │ ├── automate-everything.md │ │ │ │ ├── avoid-fs-mounts.md │ │ │ │ ├── avoid-multiple-scaling-triggers.md │ │ │ │ ├── avoid-server-eips.md │ │ │ │ ├── aws-naming-convention.md │ │ │ │ ├── aws-right-choice.md │ │ │ │ ├── beware-aws-limits.md │ │ │ │ ├── billing-alerts.md │ │ │ │ ├── bucket-names-ssl.md │ │ │ │ ├── cloudfront-in-front-of-s3.md │ │ │ │ ├── cloudtrail.md │ │ │ │ ├── cloudwatch-cli-tools.md │ │ │ │ ├── cloudwatch-custom-metrics.md │ │ │ │ ├── cloudwatch-detailed-monitoring.md │ │ │ │ ├── cloudwatch-free-metrics.md │ │ │ │ ├── configuration-endpoints.md │ │ │ │ ├── configured-azs-only.md │ │ │ │ ├── disable-ssh-access.md │ │ │ │ ├── ec2-roles.md │ │ │ │ ├── elb-healthchecks.md │ │ │ │ ├── failover-event-subscription.md │ │ │ │ ├── group-permissions.md │ │ │ │ ├── index.md │ │ │ │ ├── key-management-strategy.md │ │ │ │ ├── lock-security-groups.md │ │ │ │ ├── logs-information.md │ │ │ │ ├── multi-factor-auth-iam.md │ │ │ │ ├── pre-warm-elb.md │ │ │ │ ├── random-strings-keys.md │ │ │ │ ├── redundant-across-azs.md │ │ │ │ ├── release-eips.md │ │ │ │ ├── reserved-instances.md │ │ │ │ ├── s3-hive-results.md │ │ │ │ ├── scale-down-events.md │ │ │ │ ├── scale-horizontally.md │ │ │ │ ├── security-audit.md │ │ │ │ ├── service-over-servers.md │ │ │ │ ├── tag-everything.md │ │ │ │ ├── terminate-ssl.md │ │ │ │ ├── termination-protection.md │ │ │ │ ├── tools-for-logs.md │ │ │ │ ├── use-alias-records.md │ │ │ │ ├── use-iam-acount.md │ │ │ │ ├── use-iam-roles.md │ │ │ │ ├── use-official-sdks.md │ │ │ │ ├── use-vpc.md │ │ │ │ └── user-multiple-api-keys.md │ │ │ ├── backend-performance/ │ │ │ │ ├── backend-performance.json │ │ │ │ ├── backend-performance.md │ │ │ │ └── content/ │ │ │ │ ├── architectural-styles.md │ │ │ │ ├── async-logging.md │ │ │ │ ├── authentication-authorization.md │ │ │ │ ├── cache-invalidation.md │ │ │ │ ├── caching-locations.md │ │ │ │ ├── caching-strategies.md │ │ │ │ ├── cdns.md │ │ │ │ ├── cleanup-data.md │ │ │ │ ├── compiled-languages.md │ │ │ │ ├── connection-pool-settings.md │ │ │ │ ├── connection-pooling.md │ │ │ │ ├── connection-timeouts.md │ │ │ │ ├── critical-paths.md │ │ │ │ ├── db-indexes.md │ │ │ │ ├── denormalize.md │ │ │ │ ├── enable-compression.md │ │ │ │ ├── implement-pagination.md │ │ │ │ ├── index.md │ │ │ │ ├── join-operations.md │ │ │ │ ├── keep-alive.md │ │ │ │ ├── lazy-eager.md │ │ │ │ ├── load-balancing.md │ │ │ │ ├── message-brokers.md │ │ │ │ ├── monitoring-logging.md │ │ │ │ ├── network-latency.md │ │ │ │ ├── offload-heavy.md │ │ │ │ ├── optimize-algorithms.md │ │ │ │ ├── orm-queries.md │ │ │ │ ├── pagination-large-data.md │ │ │ │ ├── perf-testing.md │ │ │ │ ├── prefetch-preload.md │ │ │ │ ├── profile-code.md │ │ │ │ ├── profiling-tools.md │ │ │ │ ├── prometheus-graphana.md │ │ │ │ ├── reasonable-payload.md │ │ │ │ ├── regular-audits.md │ │ │ │ ├── replication.md │ │ │ │ ├── request-throttling.md │ │ │ │ ├── scaling-strategies.md │ │ │ │ ├── select-star.md │ │ │ │ ├── similar-requests.md │ │ │ │ ├── slow-logging.md │ │ │ │ ├── streaming-large.md │ │ │ │ ├── unnecessary-computation.md │ │ │ │ ├── up-to-date.md │ │ │ │ ├── use-db-sharding.md │ │ │ │ └── utilize-caching.md │ │ │ ├── code-review/ │ │ │ │ ├── code-review.json │ │ │ │ ├── code-review.md │ │ │ │ └── content/ │ │ │ │ ├── address-author-concerns.md │ │ │ │ ├── address-feedback-received.md │ │ │ │ ├── adequate-review-time.md │ │ │ │ ├── adhere-guidelines.md │ │ │ │ ├── architecture-understanding.md │ │ │ │ ├── author-feedback-welcomed.md │ │ │ │ ├── celebrate-success.md │ │ │ │ ├── change-functioning.md │ │ │ │ ├── changes-ready.md │ │ │ │ ├── clear-feedback.md │ │ │ │ ├── code-guide-best-practices-adherence.md │ │ │ │ ├── code-review-purpose.md │ │ │ │ ├── collaborate-reviewer-author.md │ │ │ │ ├── complex-tasks-breakage.md │ │ │ │ ├── conflict-resolution.md │ │ │ │ ├── consistency-everywhere.md │ │ │ │ ├── continuous-improvement-over-perfection.md │ │ │ │ ├── cross-functional-knowledge.md │ │ │ │ ├── definition-of-done.md │ │ │ │ ├── determine-review-level.md │ │ │ │ ├── document-new-feature.md │ │ │ │ ├── document-process.md │ │ │ │ ├── encourage-participation.md │ │ │ │ ├── failing-text-bug.md │ │ │ │ ├── follow-guidelines.md │ │ │ │ ├── impact-of-change.md │ │ │ │ ├── implement-changes-explanations.md │ │ │ │ ├── index.md │ │ │ │ ├── knowledge-sharing.md │ │ │ │ ├── learn-context-reqs.md │ │ │ │ ├── list-review-risks-issues.md │ │ │ │ ├── merge-approved-code.md │ │ │ │ ├── monitor-performance.md │ │ │ │ ├── monitor-reviews.md │ │ │ │ ├── nitpick-comments.md │ │ │ │ ├── no-one-way-process.md │ │ │ │ ├── note-questions-for-review.md │ │ │ │ ├── open-mind-author.md │ │ │ │ ├── open-mind-reviewer.md │ │ │ │ ├── pair-programming-reviews.md │ │ │ │ ├── positive-feedback-criticism.md │ │ │ │ ├── potential-issues-review.md │ │ │ │ ├── potential-issues-reviewer.md │ │ │ │ ├── prepare-list.md │ │ │ │ ├── prioritize-feedback.md │ │ │ │ ├── professional-feedback.md │ │ │ │ ├── proper-description-pr.md │ │ │ │ ├── quality-code-overall.md │ │ │ │ ├── re-run-tests-verify.md │ │ │ │ ├── recognition-rewards.md │ │ │ │ ├── resolve-conflicts-timely.md │ │ │ │ ├── review-docs-design.md │ │ │ │ ├── review-docs-updated.md │ │ │ │ ├── review-tests.md │ │ │ │ ├── review-updated-code.md │ │ │ │ ├── run-tests-ensure-passing.md │ │ │ │ ├── seek-feedback.md │ │ │ │ ├── seek-team-members-feedback.md │ │ │ │ ├── self-review.md │ │ │ │ ├── set-clear-expectations.md │ │ │ │ ├── short-term-long-term-considerations.md │ │ │ │ ├── style-guide-preferences.md │ │ │ │ ├── submit-re-review.md │ │ │ │ ├── team-wide-style-followed.md │ │ │ │ ├── tested-in-dev.md │ │ │ │ ├── trends-issues-finding.md │ │ │ │ ├── update-docs-changes.md │ │ │ │ ├── update-review-changes-docs.md │ │ │ │ ├── use-automation.md │ │ │ │ ├── verify-changes-addressed.md │ │ │ │ └── write-automated-tests.md │ │ │ └── frontend-performance/ │ │ │ ├── content/ │ │ │ │ ├── analyse-stylesheets-complexity.md │ │ │ │ ├── analyze-js-for-perf-issues.md │ │ │ │ ├── avoid-404-files.md │ │ │ │ ├── avoid-base64-images.md │ │ │ │ ├── avoid-inline-css.md │ │ │ │ ├── avoid-multiple-inline-js-snippets.md │ │ │ │ ├── bundlephobia.md │ │ │ │ ├── check-dependency-size.md │ │ │ │ ├── choose-image-format-approprietly.md │ │ │ │ ├── chrome-dev-tools.md │ │ │ │ ├── compress-your-images.md │ │ │ │ ├── concatenate-css-single-file.md │ │ │ │ ├── cookie-size-less-4096-bytes.md │ │ │ │ ├── enable-compression.md │ │ │ │ ├── framework-guides.md │ │ │ │ ├── index.md │ │ │ │ ├── inline-critical-css.md │ │ │ │ ├── keep-cookie-count-below-20.md │ │ │ │ ├── keep-dependencies-up-to-date.md │ │ │ │ ├── keep-ttfb-less-1-3s.md │ │ │ │ ├── keep-web-font-under-300k.md │ │ │ │ ├── lighthouse.md │ │ │ │ ├── load-offscreen-images-lazily.md │ │ │ │ ├── make-css-files-non-blocking.md │ │ │ │ ├── minify-css.md │ │ │ │ ├── minify-html.md │ │ │ │ ├── minify-your-javascript.md │ │ │ │ ├── minimize-http-requests.md │ │ │ │ ├── minimize-iframe-count.md │ │ │ │ ├── page-load-time-below-3s.md │ │ │ │ ├── page-speed-insights.md │ │ │ │ ├── page-weight-below-1500.md │ │ │ │ ├── pre-load-urls-where-possible.md │ │ │ │ ├── prefer-vector-images.md │ │ │ │ ├── prevent-flash-text.md │ │ │ │ ├── recommended-guides.md │ │ │ │ ├── remove-unused-css.md │ │ │ │ ├── serve-exact-size-images.md │ │ │ │ ├── set-width-height-images.md │ │ │ │ ├── squoosh-ap.md │ │ │ │ ├── use-cdn.md │ │ │ │ ├── use-http-cache-headers.md │ │ │ │ ├── use-https-on-your-website.md │ │ │ │ ├── use-non-blocking-javascript.md │ │ │ │ ├── use-preconnect-to-load-fonts.md │ │ │ │ ├── use-same-protocol.md │ │ │ │ ├── use-service-workers-for-caching.md │ │ │ │ ├── use-woff2-font-format.md │ │ │ │ └── web-page-test.md │ │ │ ├── frontend-performance.json │ │ │ └── frontend-performance.md │ │ ├── projects/ │ │ │ ├── accessible-form-ui.md │ │ │ ├── accordion.md │ │ │ ├── age-calculator.md │ │ │ ├── automated-backups.md │ │ │ ├── basic-dns.md │ │ │ ├── basic-dockerfile.md │ │ │ ├── basic-html-website.md │ │ │ ├── bastion-host.md │ │ │ ├── blogging-platform-api.md │ │ │ ├── blue-green-deployment.md │ │ │ ├── broadcast-server.md │ │ │ ├── caching-server.md │ │ │ ├── changelog-component.md │ │ │ ├── configuration-management.md │ │ │ ├── cookie-consent.md │ │ │ ├── custom-dropdown.md │ │ │ ├── database-backup-utility.md │ │ │ ├── datepicker-ui.md │ │ │ ├── dockerized-service-deployment.md │ │ │ ├── dummy-systemd-service.md │ │ │ ├── ec2-instance.md │ │ │ ├── ecommerce-api.md │ │ │ ├── expense-tracker-api.md │ │ │ ├── expense-tracker.md │ │ │ ├── file-integrity-checker.md │ │ │ ├── fitness-workout-tracker.md │ │ │ ├── flash-cards.md │ │ │ ├── github-actions-deployment-workflow.md │ │ │ ├── github-random-repo.md │ │ │ ├── github-user-activity.md │ │ │ ├── iac-digitalocean.md │ │ │ ├── image-grid.md │ │ │ ├── image-processing-service.md │ │ │ ├── log-archive-tool.md │ │ │ ├── markdown-note-taking-app.md │ │ │ ├── monitoring.md │ │ │ ├── movie-reservation-system.md │ │ │ ├── multi-container-service.md │ │ │ ├── multiservice-docker.md │ │ │ ├── nginx-log-analyser.md │ │ │ ├── nodejs-service-deployment.md │ │ │ ├── number-guessing-game.md │ │ │ ├── personal-blog.md │ │ │ ├── pomodoro-timer.md │ │ │ ├── portfolio-website.md │ │ │ ├── quiz-app.md │ │ │ ├── realtime-leaderboard-system.md │ │ │ ├── reddit-client.md │ │ │ ├── restricted-textarea.md │ │ │ ├── scalable-ecommerce-platform.md │ │ │ ├── server-stats.md │ │ │ ├── service-discovery.md │ │ │ ├── simple-monitoring-dashboard.md │ │ │ ├── simple-tabs.md │ │ │ ├── single-page-cv.md │ │ │ ├── ssh-remote-server-setup.md │ │ │ ├── static-site-server.md │ │ │ ├── stories-feature.md │ │ │ ├── task-tracker-js.md │ │ │ ├── task-tracker.md │ │ │ ├── temperature-converter.md │ │ │ ├── testimonial-cards.md │ │ │ ├── tmdb-cli.md │ │ │ ├── todo-list-api.md │ │ │ ├── tooltip-ui.md │ │ │ ├── unit-converter.md │ │ │ ├── url-shortening-service.md │ │ │ ├── weather-api-wrapper-service.md │ │ │ └── weather-app.md │ │ ├── question-groups/ │ │ │ ├── backend/ │ │ │ │ ├── backend.md │ │ │ │ └── content/ │ │ │ │ ├── anomaly-detection.md │ │ │ │ ├── api-dependencies.md │ │ │ │ ├── api-endpoint.md │ │ │ │ ├── api-tests.md │ │ │ │ ├── api-versioning.md │ │ │ │ ├── batch-processing.md │ │ │ │ ├── benefits-drawbacks-microservices.md │ │ │ │ ├── bg-tasks.md │ │ │ │ ├── blue-green-deployment.md │ │ │ │ ├── cache-eviction.md │ │ │ │ ├── cap-theorem.md │ │ │ │ ├── ci-cd.md │ │ │ │ ├── containerization.md │ │ │ │ ├── correlation-ids.md │ │ │ │ ├── data-encryption.md │ │ │ │ ├── db-connections.md │ │ │ │ ├── deadlock-db-transaction.md │ │ │ │ ├── debugging-backend.md │ │ │ │ ├── decompose-microservices.md │ │ │ │ ├── distributed-caching.md │ │ │ │ ├── eventual-consistency.md │ │ │ │ ├── fault-tolerance.md │ │ │ │ ├── file-uploads.md │ │ │ │ ├── fulltext-search.md │ │ │ │ ├── gdpr-compliance.md │ │ │ │ ├── high-available-storage.md │ │ │ │ ├── http-request-response-cycle.md │ │ │ │ ├── idempotency.md │ │ │ │ ├── instrument-monitor.md │ │ │ │ ├── iot-streams.md │ │ │ │ ├── load-balanced-session.md │ │ │ │ ├── load-testing-api.md │ │ │ │ ├── long-running.md │ │ │ │ ├── maintainable-code.md │ │ │ │ ├── message-queue.md │ │ │ │ ├── optimistic-vs-pessimistic.md │ │ │ │ ├── protect-sql-injection.md │ │ │ │ ├── rate-limiting.md │ │ │ │ ├── realtime-data-sync.md │ │ │ │ ├── rest-core-principles.md │ │ │ │ ├── reverse-proxy.md │ │ │ │ ├── scale-backend.md │ │ │ │ ├── schema-migrations.md │ │ │ │ ├── secure-api.md │ │ │ │ ├── secure-interservice.md │ │ │ │ ├── session-management.md │ │ │ │ ├── sql-vs-nosql.md │ │ │ │ ├── sso.md │ │ │ │ ├── statelessness-http.md │ │ │ │ └── webhooks.md │ │ │ ├── data-analyst/ │ │ │ │ ├── content/ │ │ │ │ │ ├── advanced-data-integration.md │ │ │ │ │ ├── advanced-data-wrangling.md │ │ │ │ │ ├── advanced-missing-data.md │ │ │ │ │ ├── advanced-multivariate.md │ │ │ │ │ ├── advanced-profiling.md │ │ │ │ │ ├── analysis-types.md │ │ │ │ │ ├── analytics-types.md │ │ │ │ │ ├── clustering-analysis.md │ │ │ │ │ ├── combined-analysis.md │ │ │ │ │ ├── data-aggregation.md │ │ │ │ │ ├── data-analysis-process.md │ │ │ │ │ ├── data-analyst-role.md │ │ │ │ │ ├── data-challenges.md │ │ │ │ │ ├── data-cleaning.md │ │ │ │ │ ├── data-formats.md │ │ │ │ │ ├── data-integrity-strategies.md │ │ │ │ │ ├── data-mining.md │ │ │ │ │ ├── data-modeling-experience.md │ │ │ │ │ ├── data-modeling.md │ │ │ │ │ ├── data-profiling.md │ │ │ │ │ ├── data-quality.md │ │ │ │ │ ├── data-storage-approaches.md │ │ │ │ │ ├── data-transformation-process.md │ │ │ │ │ ├── data-types.md │ │ │ │ │ ├── data-validation.md │ │ │ │ │ ├── data-visualization.md │ │ │ │ │ ├── data-wrangling.md │ │ │ │ │ ├── descriptive-analysis.md │ │ │ │ │ ├── duplicate-data.md │ │ │ │ │ ├── excel-tools.md │ │ │ │ │ ├── excel-usage.md │ │ │ │ │ ├── exploratory-data-analysis.md │ │ │ │ │ ├── hypothesis-testing.md │ │ │ │ │ ├── large-dataset-modification.md │ │ │ │ │ ├── missing-data.md │ │ │ │ │ ├── mixed-data-regression.md │ │ │ │ │ ├── pca-analysis.md │ │ │ │ │ ├── pca-scenario.md │ │ │ │ │ ├── probability-distributions.md │ │ │ │ │ ├── profiling-methods.md │ │ │ │ │ ├── record-modification.md │ │ │ │ │ ├── regression-analysis.md │ │ │ │ │ ├── regression-comparison.md │ │ │ │ │ ├── sales-clustering.md │ │ │ │ │ ├── statistical-hypothesis.md │ │ │ │ │ ├── statistical-models.md │ │ │ │ │ ├── stats-viz-integration.md │ │ │ │ │ ├── unstructured-data-aggregation.md │ │ │ │ │ ├── visualization-decisions.md │ │ │ │ │ └── visualization-eda.md │ │ │ │ └── data-analyst.md │ │ │ ├── data-science/ │ │ │ │ ├── content/ │ │ │ │ │ ├── accuracy-from-confusion-matrix.md │ │ │ │ │ ├── apply-vs-map-pandas.md │ │ │ │ │ ├── bagging-vs-boosting.md │ │ │ │ │ ├── batch-vs-online-learning.md │ │ │ │ │ ├── bias-variance-tradeoff.md │ │ │ │ │ ├── categorical-vs-continuous-variables.md │ │ │ │ │ ├── central-limit-theorem.md │ │ │ │ │ ├── combining-data-from-multiple-sources.md │ │ │ │ │ ├── confidence-intervals.md │ │ │ │ │ ├── confusion-matrix.md │ │ │ │ │ ├── correlation-vs-causation.md │ │ │ │ │ ├── cross-validation.md │ │ │ │ │ ├── decision-trees.md │ │ │ │ │ ├── deep-learning-vs-traditional-ml.md │ │ │ │ │ ├── detect-concept-drift.md │ │ │ │ │ ├── ensure-fairness-remove-bias.md │ │ │ │ │ ├── evaluate-dataset-usefulness.md │ │ │ │ │ ├── evaluate-medical-classification-model.md │ │ │ │ │ ├── evaluation-metrics.md │ │ │ │ │ ├── false-positive-vs-negative.md │ │ │ │ │ ├── feature-selection.md │ │ │ │ │ ├── fine-tuning-vs-more-data.md │ │ │ │ │ ├── group-aggregate-data-python.md │ │ │ │ │ ├── handling-missing-data.md │ │ │ │ │ ├── handling-null-values-pandas.md │ │ │ │ │ ├── imbalanced-data.md │ │ │ │ │ ├── investigate-traffic-drop.md │ │ │ │ │ ├── kmeans-clustering-python.md │ │ │ │ │ ├── knn-vs-kmeans.md │ │ │ │ │ ├── lindeberg-feller-clt.md │ │ │ │ │ ├── linear-regression.md │ │ │ │ │ ├── linear-vs-logistic-regression.md │ │ │ │ │ ├── logistic-regression.md │ │ │ │ │ ├── long-format-vs-wide-format.md │ │ │ │ │ ├── long-tail-distribution.md │ │ │ │ │ ├── measure-product-launch-success.md │ │ │ │ │ ├── merge-overlapping-intervals.md │ │ │ │ │ ├── model-accuracy-business-impact.md │ │ │ │ │ ├── monitor-model-performance.md │ │ │ │ │ ├── multicollinearity.md │ │ │ │ │ ├── null-hypothesis.md │ │ │ │ │ ├── overfitting-prevention.md │ │ │ │ │ ├── p-value-interpretation.md │ │ │ │ │ ├── probability-distributions.md │ │ │ │ │ ├── random-forest-vs-decision-tree.md │ │ │ │ │ ├── rank-sql-sequence.md │ │ │ │ │ ├── real-time-median.md │ │ │ │ │ ├── regularization.md │ │ │ │ │ ├── remove-duplicates-dataframe.md │ │ │ │ │ ├── right-vs-left-join.md │ │ │ │ │ ├── rmse-mse-linear-regression.md │ │ │ │ │ ├── role-of-statistics.md │ │ │ │ │ ├── sql-joining-orders-customers.md │ │ │ │ │ ├── sql-second-highest-salary.md │ │ │ │ │ ├── sql-top-customers-last-quarter.md │ │ │ │ │ ├── sql-top-customers-revenue.md │ │ │ │ │ ├── support-vectors-svm.md │ │ │ │ │ ├── t-test-vs-z-test.md │ │ │ │ │ ├── type-i-vs-type-ii-errors.md │ │ │ │ │ ├── types-of-machine-learning.md │ │ │ │ │ ├── univariate-bivariate-multivariate.md │ │ │ │ │ ├── variance-in-data-science.md │ │ │ │ │ └── wide-to-long-format.md │ │ │ │ └── data-science.md │ │ │ ├── devops/ │ │ │ │ ├── content/ │ │ │ │ │ ├── ansible-benefits.md │ │ │ │ │ ├── auto-scaling.md │ │ │ │ │ ├── blue-green-deployment.md │ │ │ │ │ ├── build-pipelines.md │ │ │ │ │ ├── canary-release.md │ │ │ │ │ ├── cicd-setup.md │ │ │ │ │ ├── cluster-health.md │ │ │ │ │ ├── common-iac-tools.md │ │ │ │ │ ├── container-consistency.md │ │ │ │ │ ├── container-vs-vm.md │ │ │ │ │ ├── continuous-monitoring.md │ │ │ │ │ ├── data-migration.md │ │ │ │ │ ├── devsecops.md │ │ │ │ │ ├── docker-compose.md │ │ │ │ │ ├── explain-ci-vs-cd.md │ │ │ │ │ ├── health-monitor.md │ │ │ │ │ ├── high-availability.md │ │ │ │ │ ├── iac-concept.md │ │ │ │ │ ├── implement-logging.md │ │ │ │ │ ├── kubernetes-components.md │ │ │ │ │ ├── kubernetes-operators.md │ │ │ │ │ ├── load-balancer.md │ │ │ │ │ ├── microservice-challenges.md │ │ │ │ │ ├── microservice-vs-monolithic.md │ │ │ │ │ ├── migrate-environment.md │ │ │ │ │ ├── multi-cloud-kubernetes.md │ │ │ │ │ ├── multi-cloud.md │ │ │ │ │ ├── network-configuration.md │ │ │ │ │ ├── optimize-cicd.md │ │ │ │ │ ├── orchestration.md │ │ │ │ │ ├── popular-cicd-tools.md │ │ │ │ │ ├── purpose-of-cm.md │ │ │ │ │ ├── reverse-proxy.md │ │ │ │ │ ├── role-of-devops.md │ │ │ │ │ ├── scaling-differences.md │ │ │ │ │ ├── secret-management.md │ │ │ │ │ ├── serverless-computing.md │ │ │ │ │ ├── stateful-applications.md │ │ │ │ │ ├── what-is-devops.md │ │ │ │ │ ├── what-is-docker.md │ │ │ │ │ ├── what-is-gitops.md │ │ │ │ │ ├── what-is-helm-chart.md │ │ │ │ │ ├── what-is-iac.md │ │ │ │ │ ├── what-is-kubernetes.md │ │ │ │ │ ├── what-is-prometheus.md │ │ │ │ │ ├── what-is-rollback.md │ │ │ │ │ ├── what-is-service-mesh.md │ │ │ │ │ ├── what-is-shift-left.md │ │ │ │ │ ├── what-is-version-control.md │ │ │ │ │ └── zero-downtime.md │ │ │ │ └── devops.md │ │ │ ├── frontend/ │ │ │ │ ├── content/ │ │ │ │ │ ├── async-ops-js.md │ │ │ │ │ ├── block-inline-elems.md │ │ │ │ │ ├── box-model.md │ │ │ │ │ ├── browser-render.md │ │ │ │ │ ├── client-storage.md │ │ │ │ │ ├── closures.md │ │ │ │ │ ├── critical-css.md │ │ │ │ │ ├── csp.md │ │ │ │ │ ├── css-grid.md │ │ │ │ │ ├── css-specificity.md │ │ │ │ │ ├── css-variables.md │ │ │ │ │ ├── dom.md │ │ │ │ │ ├── em-vs-rem.md │ │ │ │ │ ├── event-delegation.md │ │ │ │ │ ├── event-listeners.md │ │ │ │ │ ├── event-loop-js.md │ │ │ │ │ ├── flexbox-layout.md │ │ │ │ │ ├── id-vs-class.md │ │ │ │ │ ├── improve-web-perf.md │ │ │ │ │ ├── js-promises.md │ │ │ │ │ ├── media-queries.md │ │ │ │ │ ├── null-vs-undefined.md │ │ │ │ │ ├── optimize-assets.md │ │ │ │ │ ├── same-origin-policy.md │ │ │ │ │ ├── seo-best-practices.md │ │ │ │ │ ├── service-workers.md │ │ │ │ │ ├── ssr-when.md │ │ │ │ │ ├── state-mgmt-spa.md │ │ │ │ │ ├── tree-shaking.md │ │ │ │ │ └── vdom.md │ │ │ │ └── frontend.md │ │ │ ├── full-stack/ │ │ │ │ ├── content/ │ │ │ │ │ ├── api-security.md │ │ │ │ │ ├── async-javascript.md │ │ │ │ │ ├── backend-caching.md │ │ │ │ │ ├── build-tools.md │ │ │ │ │ ├── cicd-pipelines.md │ │ │ │ │ ├── client-server-programming.md │ │ │ │ │ ├── cloud-deployment.md │ │ │ │ │ ├── code-splitting.md │ │ │ │ │ ├── common-challenges.md │ │ │ │ │ ├── cors-handling.md │ │ │ │ │ ├── css-selectors.md │ │ │ │ │ ├── database-migrations.md │ │ │ │ │ ├── database-relationships.md │ │ │ │ │ ├── div-span-purpose.md │ │ │ │ │ ├── docker-role.md │ │ │ │ │ ├── environment-variables.md │ │ │ │ │ ├── event-driven-architecture.md │ │ │ │ │ ├── flexbox-vs-grid.md │ │ │ │ │ ├── full-stack-debugging.md │ │ │ │ │ ├── full-stack-development.md │ │ │ │ │ ├── full-stack-end.md │ │ │ │ │ ├── get-post-difference.md │ │ │ │ │ ├── graphql-vs-rest.md │ │ │ │ │ ├── high-availability.md │ │ │ │ │ ├── html-css-js-purpose.md │ │ │ │ │ ├── include-css.md │ │ │ │ │ ├── internationalization.md │ │ │ │ │ ├── js-dom-manipulation.md │ │ │ │ │ ├── js-equality-operators.md │ │ │ │ │ ├── memory-leaks.md │ │ │ │ │ ├── microservices.md │ │ │ │ │ ├── mvc-architecture.md │ │ │ │ │ ├── nodejs-database-crud.md │ │ │ │ │ ├── nodejs-middleware.md │ │ │ │ │ ├── package-json-purpose.md │ │ │ │ │ ├── performance-monitoring.md │ │ │ │ │ ├── postman-testing.md │ │ │ │ │ ├── react-hooks.md │ │ │ │ │ ├── react-performance.md │ │ │ │ │ ├── react-seo.md │ │ │ │ │ ├── react-ssr.md │ │ │ │ │ ├── react-state-management.md │ │ │ │ │ ├── real-time-updates.md │ │ │ │ │ ├── relational-vs-nosql.md │ │ │ │ │ ├── responsive-design.md │ │ │ │ │ ├── rest-api.md │ │ │ │ │ ├── rest-pagination.md │ │ │ │ │ ├── security-vulnerabilities.md │ │ │ │ │ ├── user-authentication.md │ │ │ │ │ ├── version-control.md │ │ │ │ │ └── websockets.md │ │ │ │ └── full-stack.md │ │ │ ├── golang/ │ │ │ │ ├── content/ │ │ │ │ │ ├── basic-data-types.md │ │ │ │ │ ├── channels-communication.md │ │ │ │ │ ├── code-analysis.md │ │ │ │ │ ├── code-reusability.md │ │ │ │ │ ├── composite-data-types.md │ │ │ │ │ ├── concurrency-management.md │ │ │ │ │ ├── concurrency-model.md │ │ │ │ │ ├── custom-error-types.md │ │ │ │ │ ├── data-type-conversion.md │ │ │ │ │ ├── dependency-comparison.md │ │ │ │ │ ├── dependency-integration.md │ │ │ │ │ ├── dependency-management.md │ │ │ │ │ ├── dependency-version-control.md │ │ │ │ │ ├── efficient-memory-management.md │ │ │ │ │ ├── error-handling-comparison.md │ │ │ │ │ ├── error-handling.md │ │ │ │ │ ├── function-calls.md │ │ │ │ │ ├── function-execution.md │ │ │ │ │ ├── function-interaction.md │ │ │ │ │ ├── garbage-collection-effects.md │ │ │ │ │ ├── global-variable-implications.md │ │ │ │ │ ├── global-variables.md │ │ │ │ │ ├── golang-intro.md │ │ │ │ │ ├── goroutine-scheduling.md │ │ │ │ │ ├── json-processing.md │ │ │ │ │ ├── low-level-pointers.md │ │ │ │ │ ├── maps-usage.md │ │ │ │ │ ├── memory-allocation-gc.md │ │ │ │ │ ├── memory-allocation.md │ │ │ │ │ ├── memory-leak-prevention.md │ │ │ │ │ ├── memory-leak-strategies.md │ │ │ │ │ ├── memory-management.md │ │ │ │ │ ├── method-overloading.md │ │ │ │ │ ├── method-signatures.md │ │ │ │ │ ├── multiple-return-values.md │ │ │ │ │ ├── package-main.md │ │ │ │ │ ├── pointer-variables.md │ │ │ │ │ ├── pointers-detail.md │ │ │ │ │ ├── polymorphism.md │ │ │ │ │ ├── reserved-keywords.md │ │ │ │ │ ├── runtime-impact.md │ │ │ │ │ ├── string-literals.md │ │ │ │ │ ├── struct-pointers.md │ │ │ │ │ ├── structs.md │ │ │ │ │ ├── testing-package.md │ │ │ │ │ ├── type-conversion-importance.md │ │ │ │ │ ├── type-conversion.md │ │ │ │ │ ├── unit-testing.md │ │ │ │ │ ├── value-reference-types.md │ │ │ │ │ └── variable-declaration.md │ │ │ │ └── golang.md │ │ │ ├── javascript/ │ │ │ │ ├── content/ │ │ │ │ │ ├── add-method-to-object.md │ │ │ │ │ ├── add-remove-array-items.md │ │ │ │ │ ├── adding-javascript-to-html.md │ │ │ │ │ ├── addition-operator-result.md │ │ │ │ │ ├── array-loop.md │ │ │ │ │ ├── array-methods.md │ │ │ │ │ ├── arrays-creation.md │ │ │ │ │ ├── arrow-functions.md │ │ │ │ │ ├── asynchronous-javascript.md │ │ │ │ │ ├── bom.md │ │ │ │ │ ├── callback-higher-order-functions.md │ │ │ │ │ ├── check-object-property.md │ │ │ │ │ ├── clear-array.md │ │ │ │ │ ├── constructor-function.md │ │ │ │ │ ├── css-selectors-javascript.md │ │ │ │ │ ├── destructuring.md │ │ │ │ │ ├── dom.md │ │ │ │ │ ├── equality-operators.md │ │ │ │ │ ├── error-monitoring.md │ │ │ │ │ ├── even-odd-check.md │ │ │ │ │ ├── function-declarations-expressions.md │ │ │ │ │ ├── function-scope.md │ │ │ │ │ ├── global-local-scope.md │ │ │ │ │ ├── global-object.md │ │ │ │ │ ├── hoisting.md │ │ │ │ │ ├── iife.md │ │ │ │ │ ├── imports-exports.md │ │ │ │ │ ├── innerhtml-vs-innertext.md │ │ │ │ │ ├── isnan-function.md │ │ │ │ │ ├── java-vs-javascript.md │ │ │ │ │ ├── javascript-data-types.md │ │ │ │ │ ├── javascript-ending.md │ │ │ │ │ ├── javascript-frameworks.md │ │ │ │ │ ├── logical-error.md │ │ │ │ │ ├── object-create.md │ │ │ │ │ ├── prototype-inheritance.md │ │ │ │ │ ├── recursive-function.md │ │ │ │ │ ├── reference-vs-syntax-error.md │ │ │ │ │ ├── remove-duplicates.md │ │ │ │ │ ├── rest-parameter.md │ │ │ │ │ ├── reverse-string-function.md │ │ │ │ │ ├── spread-array-output.md │ │ │ │ │ ├── spread-operator-objects.md │ │ │ │ │ ├── strict-mode.md │ │ │ │ │ ├── substring-check.md │ │ │ │ │ ├── this-keyword.md │ │ │ │ │ ├── undefined-vs-null.md │ │ │ │ │ ├── variable-declaration.md │ │ │ │ │ ├── variable-naming-conventions.md │ │ │ │ │ └── window-vs-document.md │ │ │ │ └── javascript.md │ │ │ ├── nodejs/ │ │ │ │ ├── content/ │ │ │ │ │ ├── async-patterns.md │ │ │ │ │ ├── cluster-vs-worker-threads.md │ │ │ │ │ ├── commonjs-vs-esm.md │ │ │ │ │ ├── error-handling.md │ │ │ │ │ ├── event-loop-working.md │ │ │ │ │ ├── exit-codes.md │ │ │ │ │ ├── input-from-command-line.md │ │ │ │ │ ├── memory-leak-debugging.md │ │ │ │ │ ├── middleware-pattern.md │ │ │ │ │ ├── npm-package-security.md │ │ │ │ │ ├── order-priority.md │ │ │ │ │ ├── performance-optimization.md │ │ │ │ │ ├── process-argv.md │ │ │ │ │ ├── process-cwd-vs-dirname.md │ │ │ │ │ ├── security-best-practices.md │ │ │ │ │ ├── streams-and-buffers.md │ │ │ │ │ ├── testing-async-code.md │ │ │ │ │ └── web-server.md │ │ │ │ └── nodejs.md │ │ │ ├── react/ │ │ │ │ ├── content/ │ │ │ │ │ ├── component-lifecycle.md │ │ │ │ │ ├── controlled-vs-uncontrolled.md │ │ │ │ │ ├── create-portal.md │ │ │ │ │ ├── custom-hook.md │ │ │ │ │ ├── error-boundaries.md │ │ │ │ │ ├── flush-sync.md │ │ │ │ │ ├── investigate-slow-app.md │ │ │ │ │ ├── lazy-loading.md │ │ │ │ │ ├── pure-components.md │ │ │ │ │ ├── re-renders.md │ │ │ │ │ ├── ref-forwarding.md │ │ │ │ │ ├── render-list.md │ │ │ │ │ ├── strict-mode.md │ │ │ │ │ ├── suspense.md │ │ │ │ │ ├── synthetic-events.md │ │ │ │ │ ├── use-transition.md │ │ │ │ │ └── virtual-dom.md │ │ │ │ └── react.md │ │ │ ├── sql/ │ │ │ │ ├── content/ │ │ │ │ │ ├── appointments-no-treatment.md │ │ │ │ │ ├── average-treatment-cost.md │ │ │ │ │ ├── clustered-vs-nonclustered-indexes.md │ │ │ │ │ ├── correlated-subquery.md │ │ │ │ │ ├── database-normalization.md │ │ │ │ │ ├── database-transactions.md │ │ │ │ │ ├── doctor-most-patients.md │ │ │ │ │ ├── find-duplicates.md │ │ │ │ │ ├── foreign-key.md │ │ │ │ │ ├── most-common-diagnosis.md │ │ │ │ │ ├── patients-multiple-appointments.md │ │ │ │ │ ├── patients-no-recent-visits.md │ │ │ │ │ ├── patients-registration-query.md │ │ │ │ │ ├── primary-key.md │ │ │ │ │ ├── query-optimization.md │ │ │ │ │ ├── ranking-functions.md │ │ │ │ │ ├── revenue-last-month.md │ │ │ │ │ ├── sql-constraints.md │ │ │ │ │ ├── sql-dialects.md │ │ │ │ │ ├── sql-ending.md │ │ │ │ │ ├── sql-index.md │ │ │ │ │ ├── sql-injection-prevention.md │ │ │ │ │ ├── sql-joins.md │ │ │ │ │ ├── sql-pagination.md │ │ │ │ │ ├── sql-subsets.md │ │ │ │ │ ├── sql-view.md │ │ │ │ │ ├── sql-vs-other-languages.md │ │ │ │ │ ├── stored-procedures.md │ │ │ │ │ ├── subquery-usage.md │ │ │ │ │ ├── union-vs-union-all.md │ │ │ │ │ └── where-vs-having.md │ │ │ │ └── sql.md │ │ │ └── sql-queries/ │ │ │ ├── content/ │ │ │ │ ├── avoid-select-star.md │ │ │ │ ├── correlated-subquery.md │ │ │ │ ├── count-star-vs-count-column.md │ │ │ │ ├── count-users-by-country.md │ │ │ │ ├── detect-date-gaps.md │ │ │ │ ├── employees-above-average-salary.md │ │ │ │ ├── exists-vs-in.md │ │ │ │ ├── find-duplicates.md │ │ │ │ ├── foreign-key.md │ │ │ │ ├── group-by-mistakes.md │ │ │ │ ├── group-by-without-aggregate.md │ │ │ │ ├── group-by-work.md │ │ │ │ ├── indexes-usefulness.md │ │ │ │ ├── inner-join-vs-left-join.md │ │ │ │ ├── lag-lead-functions.md │ │ │ │ ├── missing-indexes-impact.md │ │ │ │ ├── nested-subqueries.md │ │ │ │ ├── not-in-null-issues.md │ │ │ │ ├── ntile-function.md │ │ │ │ ├── optimize-slow-queries.md │ │ │ │ ├── primary-key.md │ │ │ │ ├── rank-dense-rank-row-number.md │ │ │ │ ├── running-total.md │ │ │ │ ├── sargable-query.md │ │ │ │ ├── second-highest-salary.md │ │ │ │ ├── select-non-grouped-column.md │ │ │ │ ├── sql-queries-ending.md │ │ │ │ ├── subquery-vs-join.md │ │ │ │ ├── union-vs-union-all.md │ │ │ │ ├── where-vs-having.md │ │ │ │ └── window-function.md │ │ │ └── sql-queries.md │ │ ├── roadmaps/ │ │ │ ├── ai-agents/ │ │ │ │ ├── ai-agents.json │ │ │ │ ├── ai-agents.md │ │ │ │ ├── content/ │ │ │ │ │ ├── acting--tool-invocation@sHYd4KsKlmw5Im3nQ19W8.md │ │ │ │ │ ├── agent-loop@Eih4eybuYB3C2So8K0AT3.md │ │ │ │ │ ├── anthropic-tool-use@1EZFbDHA5J5_5BPMLMxXb.md │ │ │ │ │ ├── api-requests@52qxjZILV-X1isup6dazC.md │ │ │ │ │ ├── autogen@7YtnQ9-KIvGPSpDzEDexl.md │ │ │ │ │ ├── basic-backend-development@VPI89s-m885r2YrXjYxdd.md │ │ │ │ │ ├── be-specific-in-what-you-want@qFKFM2qNPEN7EoD0V-1SM.md │ │ │ │ │ ├── bias--toxicity-guardrails@EyLo2j8IQsIK91SKaXkmK.md │ │ │ │ │ ├── chain-of-thought-cot@qwdh5pkBbrF8LKPxbZp4F.md │ │ │ │ │ ├── closed-weight-models@tJYmEDDwK0LtEux-kwp9B.md │ │ │ │ │ ├── code-execution--repl@mS0EVCkWuPN_GkVPng4A2.md │ │ │ │ │ ├── code-generation@PK8w31GlvtmAuU92sHaqr.md │ │ │ │ │ ├── context-windows@dyn1LSioema-Bf9lLTgUZ.md │ │ │ │ │ ├── creating-mcp-servers@1NXIN-Hbjl5rPy_mqxQYW.md │ │ │ │ │ ├── crewai@uFPJqgU4qGvZyxTv-osZA.md │ │ │ │ │ ├── dag-agents@Ep8RoZSy_Iq_zWXlGQLZo.md │ │ │ │ │ ├── data-analysis@wKYEaPWNsR30TIpHaxSsq.md │ │ │ │ │ ├── data-privacy--pii-redaction@rdlYBJNNyZUshzsJawME4.md │ │ │ │ │ ├── database-queries@sV1BnA2-qBnXoKpUn-8Ub.md │ │ │ │ │ ├── deepeval@0924QUH1wV7Mp-Xu0FAhF.md │ │ │ │ │ ├── email--slack--sms@qaNr5I-NQPnfrRH7ynGTl.md │ │ │ │ │ ├── embeddings-and-vector-search@UIm54UmICKgep6s8Itcyv.md │ │ │ │ │ ├── episodic-vs-semantic-memory@EfCCNqLMJpWKKtamUa5gK.md │ │ │ │ │ ├── file-system-access@BoJqZvdGam4cd6G6yK2IV.md │ │ │ │ │ ├── fine-tuning-vs-prompt-engineering@5OW_6o286mj470ElFyJ_5.md │ │ │ │ │ ├── forgetting--aging-strategies@m-97m7SI0XpBnhEE8-_1S.md │ │ │ │ │ ├── frequency-penalty@z_N-Y0zGkv8_qHPuVtimL.md │ │ │ │ │ ├── gemini-function-calling@_iIsBJTVS6OBf_dsdmbVO.md │ │ │ │ │ ├── git-and-terminal-usage@McREk2zHOlIrqbGSKbX-J.md │ │ │ │ │ ├── haystack@XS-FsvtrXGZ8DPrwOsnlI.md │ │ │ │ │ ├── helicone@MLxP5N0Vrmwh-kyvNeGXn.md │ │ │ │ │ ├── human-in-the-loop-evaluation@rHxdxN97ZcU7MPl8L1jzN.md │ │ │ │ │ ├── integration-testing-for-flows@P9-SiIda3TSjHsfkI5OUV.md │ │ │ │ │ ├── iterate-and-test-your-prompts@noTuUFnHSBzn7GKG9UZEi.md │ │ │ │ │ ├── langchain@Ka6VpCEnqABvwiF9vba7t.md │ │ │ │ │ ├── langfuse@UoIheaJlShiceafrWALEH.md │ │ │ │ │ ├── langsmith@SS8mGqf9wfrNqenIWvN8Z.md │ │ │ │ │ ├── langsmith@xp7TCTRE9HP60_rGzTUF6.md │ │ │ │ │ ├── llamaindex@iEHF-Jm3ck-Iu85EbCoDi.md │ │ │ │ │ ├── llm-native-function-calling@aafZxtjxiwzJH1lwHBODi.md │ │ │ │ │ ├── local-desktop@iBtJp24F_kJE3YlBsW60s.md │ │ │ │ │ ├── long-term-memory@Ue633fz6Xu2wa2-KOAtdP.md │ │ │ │ │ ├── manual-from-scratch@US6T5dXM8IY9V2qZnTOFW.md │ │ │ │ │ ├── max-length@Bn_BkthrVX_vOuwQzvPZa.md │ │ │ │ │ ├── mcp-client@CGVstUxVXLJcYZrwk3iNQ.md │ │ │ │ │ ├── mcp-hosts@9FryAIrWRHh8YlzKX3et5.md │ │ │ │ │ ├── mcp-servers@yv_-87FVM7WKn5iv6LW9q.md │ │ │ │ │ ├── metrics-to-track@v8qLnyFRnEumodBYxQSXQ.md │ │ │ │ │ ├── model-context-protocol-mcp@1B0IqRNYdtbHDi1jHSXuI.md │ │ │ │ │ ├── npc--game-ai@ok8vN7VtCgyef5x6aoQaL.md │ │ │ │ │ ├── observation--reflection@ZJTrun3jK3zBGOTm1jdMI.md │ │ │ │ │ ├── open-weight-models@DSJAhQhc1dQmBHQ8ZkTau.md │ │ │ │ │ ├── openai-assistant-api@37GBFVZ2J2d5r8bd1ViHq.md │ │ │ │ │ ├── openai-functions-calling@AQtxTTxmBpfl8BMgJbGzc.md │ │ │ │ │ ├── openllmetry@7UqPXUzqKYXklnB3x-tsv.md │ │ │ │ │ ├── perception--user-input@LU76AhCYDjxdBhpMQ4eMU.md │ │ │ │ │ ├── personal-assistant@PPdAutqJF5G60Eg9lYBND.md │ │ │ │ │ ├── planner-executor@6YLCMWzystao6byCYCTPO.md │ │ │ │ │ ├── presence-penalty@Vd8ycw8pW-ZKvg5WYFtoh.md │ │ │ │ │ ├── pricing-of-common-models@B8dzg61TGaknuruBgkEJd.md │ │ │ │ │ ├── prompt-injection--jailbreaks@SU2RuicMUo8tiAsQtDI1k.md │ │ │ │ │ ├── provide-additional-context@6I42CoeWX-kkFXTKAY7rw.md │ │ │ │ │ ├── rag-agent@cW8O4vLLKEG-Q0dE8E5Zp.md │ │ │ │ │ ├── rag-and-vector-databases@wkS4yOJ3JdZQE_yBID8K7.md │ │ │ │ │ ├── ragas@YzEDtGEaMaMWVt0W03HRt.md │ │ │ │ │ ├── react-reason--act@53xDks6JQ33fHMa3XcuCd.md │ │ │ │ │ ├── reason-and-plan@ycPRgRYR4lEBQr_xxHKnM.md │ │ │ │ │ ├── reasoning-vs-standard-models@N3yZfUxphxjiupqGpyaS9.md │ │ │ │ │ ├── remote--cloud@dHNMX3_t1KSDdAWqgdJXv.md │ │ │ │ │ ├── rest-api-knowledge@QtTwecLdvQa8pgELJ6i80.md │ │ │ │ │ ├── safety--red-team-testing@63nsfJFO1BwjLX_ZVaPFC.md │ │ │ │ │ ├── short-term--memory@M3U6RfIqaiut2nuOibY8W.md │ │ │ │ │ ├── smol-depot@eWxQiBrxIUG2JNcrdfIHS.md │ │ │ │ │ ├── specify-length-format-etc@wwHHlEoPAx0TLxbtY6nMA.md │ │ │ │ │ ├── stopping-criteria@K0G-Lw069jXUJwZqHtybd.md │ │ │ │ │ ├── streamed-vs-unstreamed-responses@i2NE6haX9-7mdoV5LQ3Ah.md │ │ │ │ │ ├── structured-logging--tracing@zs6LM8WEnb0ERWpiaQCgc.md │ │ │ │ │ ├── summarization--compression@jTDC19BTWCqxqMizrIJHr.md │ │ │ │ │ ├── temperature@L1zL1GzqjSAjF06pIIXhy.md │ │ │ │ │ ├── token-based-pricing@1fiWPBV99E2YncqdCgUw2.md │ │ │ │ │ ├── tokenization@GAjuWyJl9CI1nqXBp6XCf.md │ │ │ │ │ ├── tool-definition@qakbxB8xe7Y8gejC5cZnK.md │ │ │ │ │ ├── tool-sandboxing--permissioning@UVzLGXG6K7HQVHmw8ZAv2.md │ │ │ │ │ ├── top-p@icbp1NjurQfdM0dHnz6v2.md │ │ │ │ │ ├── transformer-models-and-llms@ZF5_5Y5zqa75Ov22JACX6.md │ │ │ │ │ ├── tree-of-thought@Nmy1PoB32DcWZnPM8l8jT.md │ │ │ │ │ ├── tree-of-thought@hj1adjkG9nalXKZ-Youn0.md │ │ │ │ │ ├── understand-the-basics-of-rag@qwVQOwBTLA2yUgRISzC8k.md │ │ │ │ │ ├── unit-testing-for-individual-tools@qo_O4YAe4-MTP_ZJoXJHR.md │ │ │ │ │ ├── use-examples-in-your-prompt@yulzE4ZNLhXOgHhG7BtZQ.md │ │ │ │ │ ├── use-relevant-technical-terms@sUwdtOX550tSdceaeFPmF.md │ │ │ │ │ ├── user-profile-storage@QJqXHV8VHPTnfYfmKPzW7.md │ │ │ │ │ ├── web-scraping--crawling@5oLc-235bvKhApxzYFkEc.md │ │ │ │ │ ├── web-search@kBtqT8AduLoYDWopj-V9_.md │ │ │ │ │ ├── what-are-ai-agents@aFZAm44nP5NefX_9TpT0A.md │ │ │ │ │ ├── what-are-tools@2zsOUWJQ8e7wnoHmq1icG.md │ │ │ │ │ ├── what-is-agent-memory@TBH_DZTAfR8Daoh-njNFC.md │ │ │ │ │ └── what-is-prompt-engineering@Y8EqzFx3qxtrSh7bWbbV8.md │ │ │ │ └── faqs.astro │ │ │ ├── ai-data-scientist/ │ │ │ │ ├── ai-data-scientist.json │ │ │ │ ├── ai-data-scientist.md │ │ │ │ ├── content/ │ │ │ │ │ ├── ab-testing@mJq9b50MJM9o9dLhx40iN.md │ │ │ │ │ ├── classic-ml-sup-unsup-advanced-ml-ensembles-nns@FdBih8tlGPPy97YWq463y.md │ │ │ │ │ ├── coding@XLDWuSt4tI4gnmqMFdpmy.md │ │ │ │ │ ├── data-structures-and-algorithms-python@StBCykpzpM4g9PRFeSNXa.md │ │ │ │ │ ├── data-understanding-data-analysis-and-visualization@JaN8YhMeN3whAe2TCXvw9.md │ │ │ │ │ ├── deep-learning@cjvVLN0XjrKPn6o20oMmc.md │ │ │ │ │ ├── deployment-models-cicd@uPzzUpI0--7OWDfNeBIjt.md │ │ │ │ │ ├── differential-calculus@mwPJh33MEUQ4Co_LiVEOb.md │ │ │ │ │ ├── econometrics@Gd2egqKZPnbPW1W2jw4j8.md │ │ │ │ │ ├── exploratory-data-analysis@l1027SBZxTHKzqWw98Ee-.md │ │ │ │ │ ├── fully-connected-cnn-rnn-lstm-transformers-tl@eOFoGKveaHaBm_6ppJUtA.md │ │ │ │ │ ├── hypothesis-testing@XJXIkWVDIrPJ-bVIvX0ZO.md │ │ │ │ │ ├── increasing-test-sensitivity@v68nwX914qCwHDSwY_ZhG.md │ │ │ │ │ ├── index.md │ │ │ │ │ ├── learn-python-programming-language@MVrAqizgkoAs2aghN8TgV.md │ │ │ │ │ ├── learn-sql@Im0tXXn3GC-FUq2aMHgwm.md │ │ │ │ │ ├── linear-algebra-calculus-mathematical-analysis@gWMvD83hVXeTmCuHGIiOL.md │ │ │ │ │ ├── machine-learning@kBdt_t2SvVsY3blfubWIz.md │ │ │ │ │ ├── mathematics@aStaDENn5PhEa-cFvNzXa.md │ │ │ │ │ ├── mlops@Qa85hEVe2kz62k9Pj4QCA.md │ │ │ │ │ ├── pre-requisites-of-econometrics@y6xXsc-uSAmRDnNuyhqH2.md │ │ │ │ │ ├── probability-and-sampling@jxJtwbiCvxHqmkWkE7zdx.md │ │ │ │ │ ├── ratio-metrics@n2JFGwFxTuOviW6kHO1Uv.md │ │ │ │ │ ├── regression-timeseries-fitting-distributions@h19k9Fn5XPh3_pKEC8Ftp.md │ │ │ │ │ ├── statistics-clt@Y9YJdARIRqqCBCy3GVYdA.md │ │ │ │ │ └── statistics@4WZL_fzJ3cZdWLLDoWN8D.md │ │ │ │ ├── faqs.astro │ │ │ │ └── mapping.json │ │ │ ├── ai-engineer/ │ │ │ │ ├── ai-engineer.json │ │ │ │ ├── ai-engineer.md │ │ │ │ ├── content/ │ │ │ │ │ ├── adding-end-user-ids-in-prompts@4Q5x2VCXedAWISBXUIyin.md │ │ │ │ │ ├── agents-usecases@778HsQzTuJ_3c9OSn5DmH.md │ │ │ │ │ ├── ai-agents@4_ap0rD9Gl6Ep_4jMfPpG.md │ │ │ │ │ ├── ai-agents@Uffu609uQbIzDl88Ddccv.md │ │ │ │ │ ├── ai-engineer-vs-ml-engineer@jSZ1LhPdhlkW-9QJhIvFs.md │ │ │ │ │ ├── ai-safety-and-ethics@8ndKHDJgL_gYwaXC7XMer.md │ │ │ │ │ ├── ai-vs-agi@5QdihE1lLpMc3DFrGy46M.md │ │ │ │ │ ├── anomaly-detection@AglWJ7gb9rTT2rMkstxtk.md │ │ │ │ │ ├── anthropic-claude@hy6EyKiNxk1x84J63dhez.md │ │ │ │ │ ├── audio-processing@mxQYB820447DC6kogyZIL.md │ │ │ │ │ ├── bias-and-fairness@lhIU0ulpvDAn1Xc3ooYz_.md │ │ │ │ │ ├── building-an-mcp-client@0Rk0rCbmRFJT2GKwUibQS.md │ │ │ │ │ ├── building-an-mcp-server@oLGfKjcqBzJ3vd6Cg-T1B.md │ │ │ │ │ ├── choosing-the-right-model@zeWoTtAFEpVXDQzWNsha4.md │ │ │ │ │ ├── chroma@dSd2C9lNl-ymmCRT9_ZC3.md │ │ │ │ │ ├── chunking@mX987wiZF7p3V_gExrPeX.md │ │ │ │ │ ├── claude-agent-sdk@xXLyuUNrKEc32XLQxMjgT.md │ │ │ │ │ ├── claude-code@wr5ddjutC-fX_ixysTHaT.md │ │ │ │ │ ├── claude-messages-api@nxwMVla0-PNG8nlocKK5v.md │ │ │ │ │ ├── closed-vs-open-source-models@RBwGsq9DngUsl8PrrCbqx.md │ │ │ │ │ ├── codex@XY2l96sry3WyLzzo3KUeU.md │ │ │ │ │ ├── cohere@a7qsvoauFe5u953I699ps.md │ │ │ │ │ ├── cohere@y0qD5Kb4Pf-ymIwW-tvhX.md │ │ │ │ │ ├── conducting-adversarial-testing@Pt-AJmSJrOxKvolb5_HEv.md │ │ │ │ │ ├── connect-to-local-server@H-G93SsEgsA_NGL_v4hPv.md │ │ │ │ │ ├── connect-to-remote-server@2t4uINxmzfx8FUF-_i_2B.md │ │ │ │ │ ├── constraining-outputs-and-inputs@ONLDyczNacGVZGojYyJrU.md │ │ │ │ │ ├── constrains@PT3uDiUjiKhO8laOkCmgP.md │ │ │ │ │ ├── content-moderation-apis@ljZLa3yjQpegiZWwtnn_q.md │ │ │ │ │ ├── context-compaction@9XCxilAQ7FRet7lHQr1gE.md │ │ │ │ │ ├── context-engineering@kCiHNaZ9CgnS9uksIQ_SY.md │ │ │ │ │ ├── context-isolation@9JwWIK0Z2MK8-6EQQJsCO.md │ │ │ │ │ ├── context@9oUpeEnaMWctQLTobbmY7.md │ │ │ │ │ ├── context@vvpYkmycH0_W030E-L12f.md │ │ │ │ │ ├── cot@nyBgEHvUhwF-NANMwkRJW.md │ │ │ │ │ ├── cursor@MWhoqhNnBaoeCdN_8i15k.md │ │ │ │ │ ├── dall-e-api@LKFwwjtcawJ4Z12X102Cb.md │ │ │ │ │ ├── data-classification@06Xta-OqSci05nV2QMFdF.md │ │ │ │ │ ├── data-layer@Z0920V57_ziDhXbQJMN9O.md │ │ │ │ │ ├── deepseek@UGYYh2W1XnnbgYNY8L8Hb.md │ │ │ │ │ ├── development-tools@NYge7PNtfI-y6QWefXJ4d.md │ │ │ │ │ ├── embedding-models@fr0UOXlVVctkk1K84Z8Of.md │ │ │ │ │ ├── embedding@grTcbzT7jKk_sIUwOTZTD.md │ │ │ │ │ ├── embeddings@XyEp6jnBSpCxMGwALnYfT.md │ │ │ │ │ ├── external-memory@KWjD4xEPhOOYS51dvRLd2.md │ │ │ │ │ ├── faiss@JurLbOO1Z8r6C3yUqRNwf.md │ │ │ │ │ ├── few-shot@DZPM9zjCbYYWBPLmQImxQ.md │ │ │ │ │ ├── fine-tuning@zTvsCNS3ucsZmvy1tHyeI.md │ │ │ │ │ ├── function-calling@wFfjHkGLrcCyLyXV4BiFM.md │ │ │ │ │ ├── gemini-embedding@4GArjDYipit4SLqKZAWDf.md │ │ │ │ │ ├── gemini@hzeEo8COf2l07iu5EdlFo.md │ │ │ │ │ ├── gemma2@MNtaY1_kOJHeoWuM-abb4.md │ │ │ │ │ ├── generation@2jJnS9vRYhaS69d6OxrMh.md │ │ │ │ │ ├── google-adk@mbp2NoL-VZ5hZIIblNBXt.md │ │ │ │ │ ├── google-gemini-api@TsG_I7FL-cOCSw8gvZH3r.md │ │ │ │ │ ├── google-gemini@oe8E6ZIQWuYvHVbYJHUc1.md │ │ │ │ │ ├── haystack@ebXXEhNRROjbbof-Gym4p.md │ │ │ │ │ ├── how-llms-work@zdeuA4GbdBl2DwKgiOA4G.md │ │ │ │ │ ├── hugging-face-hub@YLOdOvLXa5Fa7_mmuvKEi.md │ │ │ │ │ ├── hugging-face-inference-sdk@3kRTzlLNBnXdTsAEXVu_M.md │ │ │ │ │ ├── hugging-face-models@EIDbwbdolR_qsNKVDla6V.md │ │ │ │ │ ├── hugging-face-tasks@YKIPOiSj_FNtg0h8uaSMq.md │ │ │ │ │ ├── hugging-face@v99C5Bml2a6148LCJ9gy9.md │ │ │ │ │ ├── image-generation@49BWxYVFpIgZCCqsikH7l.md │ │ │ │ │ ├── image-understanding@fzVq4hGoa2gdbIzoyY1Zp.md │ │ │ │ │ ├── impact-on-product-development@qJVgKe9uBvXc-YPfvX_Y7.md │ │ │ │ │ ├── indexing-embeddings@5TQnO9B4_LTHwqjI7iHB1.md │ │ │ │ │ ├── inference@4NtUD9V64gkp8SFudj_ai.md │ │ │ │ │ ├── input-format@LCHse57rXf3sl8ml1ow0T.md │ │ │ │ │ ├── introduction@_hYN0gEi9BL24nptEtXWU.md │ │ │ │ │ ├── jina@apVYIV4EyejPft25oAvdI.md │ │ │ │ │ ├── know-your-customers--usecases@t1SObMWkDZ1cKqNNlcd9L.md │ │ │ │ │ ├── lancedb@rjaCNT3Li45kwu2gXckke.md │ │ │ │ │ ├── langchain-for-multimodal-apps@j9zD3pHysB1CBhLfLjhpD.md │ │ │ │ │ ├── langchain@jM-Jbo0wUilhVY830hetJ.md │ │ │ │ │ ├── large-language-model-llm@wf2BSyUekr1S1q6l8kyq6.md │ │ │ │ │ ├── llama-index@JT4mBXOjvvrUnynA7yrqt.md │ │ │ │ │ ├── llamaindex-for-multimodal-apps@akQTCKuPRRelj2GORqvsh.md │ │ │ │ │ ├── lm-studio@a_3SabylVqzzOyw3tZN5f.md │ │ │ │ │ ├── manual-implementation@6xaRB34_g0HGt-y1dGYXR.md │ │ │ │ │ ├── mcp-client@po0fIZYaFhRbNlza7sB37.md │ │ │ │ │ ├── mcp-host@MabZ9jOrSj539C5qZrVBd.md │ │ │ │ │ ├── mcp-server@8Xkd88EjX3GE_9DWQhr7G.md │ │ │ │ │ ├── meta-llama@OkYO-aSPiuVYuLXHswBCn.md │ │ │ │ │ ├── mistral@n-Ud2dXkqIzK37jlKItN4.md │ │ │ │ │ ├── model-context-protocol-mcp@AeHkNU-uJ_gBdo5-xdpEu.md │ │ │ │ │ ├── models-on-hugging-face@dLEg4IA3F5jgc44Bst9if.md │ │ │ │ │ ├── mongodb-atlas@j6bkm0VUgLkHdMDDJFiMC.md │ │ │ │ │ ├── multi-agents@kG1bkF2oY21CJOm9zhdpn.md │ │ │ │ │ ├── multimodal-ai-usecases@sGR9qcro68KrzM8qWxcH8.md │ │ │ │ │ ├── multimodal-ai@W7cKPt_UxcUgwp8J6hS4p.md │ │ │ │ │ ├── nanobanana-api@6y73FLjshnqxV8BTGUeiu.md │ │ │ │ │ ├── ollama@rTT2UnvqFO3GH6ThPLEjO.md │ │ │ │ │ ├── open-ai-embeddings-api@l6priWeJhbdUD5tJ7uHyG.md │ │ │ │ │ ├── openai-agentkit@Sm0Ne5Nx72hcZCdAcC0C2.md │ │ │ │ │ ├── openai-compatible-apis@vnXtUupJUlyU_uCbZBbnk.md │ │ │ │ │ ├── openai-gpt-o-series@3PQVZbcr4neNMRr6CuNzS.md │ │ │ │ │ ├── openai-response-api@ro3vY_sp6xMQ-hfzO-rc1.md │ │ │ │ │ ├── openai-response-api@xXLyuUNrKEc32XLQxMjgT.md │ │ │ │ │ ├── openai-vision-api@CRrqa-dBw1LlOwVbrZhjK.md │ │ │ │ │ ├── openrouter@1GlpMjmdAWor0X_BnISGg.md │ │ │ │ │ ├── performing-similarity-search@ZcbRPtgaptqKqWBgRrEBU.md │ │ │ │ │ ├── pinecone@_Cf7S1DCvX7p1_3-tP3C3.md │ │ │ │ │ ├── pre-trained-models@d7fzv_ft12EopsQdmEsel.md │ │ │ │ │ ├── prompt-caching@bqqY0gsZkBpcHMZw1hcZ5.md │ │ │ │ │ ├── prompt-engineering@VjXmSCdzi2ACv-W85Sy9D.md │ │ │ │ │ ├── prompt-injection-attacks@cUyLT6ctYQ1pgmodCKREq.md │ │ │ │ │ ├── prompt-vs-context-engineering@ozrR8IvjNFbHd44kZrExX.md │ │ │ │ │ ├── purpose-and-functionality@WcjX6p-V-Rdd77EL8Ega9.md │ │ │ │ │ ├── qdrant@DwOAL5mOBgBiw-EQpAzQl.md │ │ │ │ │ ├── qwen@c0RPhpD00VIUgF4HJgN2T.md │ │ │ │ │ ├── rag-and-dynamic-filters@LnQ2AatMWpExUHcZhDIPd.md │ │ │ │ │ ├── rag-usecases@GCn4LGNEtPI0NWYAZCRE-.md │ │ │ │ │ ├── rag-vs-fine-tuning@qlBEXrbV88e_wAGRwO9hW.md │ │ │ │ │ ├── rag@IX1BJWGwGmB4L063g0Frf.md │ │ │ │ │ ├── ragflow@d0ontCII8KI8wfP-8Y45R.md │ │ │ │ │ ├── react-prompting@voDKcKvXtyLzeZdx2g3Qn.md │ │ │ │ │ ├── react@Waox7xR_yUeSnOtQFzU4c.md │ │ │ │ │ ├── recommendation-systems@HQe9GKy3p0kTUPxojIfSF.md │ │ │ │ │ ├── repetition-penalties@0_pa739kMPWHfuSQV-VO7.md │ │ │ │ │ ├── replit@Ubk4GN0Z4XlDJ3EbRXdxg.md │ │ │ │ │ ├── retrieval-process@OCGCzHQM2LQyUWmiqe6E0.md │ │ │ │ │ ├── robust-prompt-engineering@qmx6OHqx4_0JXVIv8dASp.md │ │ │ │ │ ├── role--behavior@N3TzWYxU0jgv1l99Ts58n.md │ │ │ │ │ ├── roles-and-responsiblities@K9EiuFgPBFgeRxY4wxAmb.md │ │ │ │ │ ├── sampling-parameters@LbB2PeytxRSuU07Bk0KlJ.md │ │ │ │ │ ├── security-and-privacy-concerns@sWBT-j2cRuFqRFYtV_5TK.md │ │ │ │ │ ├── self-hosted-models@_qqITQ8O0Q0RWUeZsUXnY.md │ │ │ │ │ ├── semantic-search@eMfcyBxnMY_l_5-8eg6sD.md │ │ │ │ │ ├── sentence-transformers@ZV_V6sqOnRodgaw4mzokC.md │ │ │ │ │ ├── speech-to-text@jQX10XKd_QM5wdQweEkVJ.md │ │ │ │ │ ├── streaming-responses@MUDBYjR7uCUZQ-kQxi2K_.md │ │ │ │ │ ├── structured-output@zqhmLzHsmDlrTFVHzhq6-.md │ │ │ │ │ ├── supabase@9kT7EEQsbeD2WDdN9ADx7.md │ │ │ │ │ ├── system-prompting@S46Vaq8hYq6Ee1Id_-fSQ.md │ │ │ │ │ ├── temperature@_bPTciEA1GT1JwfXim19z.md │ │ │ │ │ ├── text-to-speech@GCERpLz5BcRtWPpv-asUz.md │ │ │ │ │ ├── tokens@2WbVpRLqwi3Oeqk1JPui4.md │ │ │ │ │ ├── tools--function-calling@eOqCBgBTKM8CmY3nsWjre.md │ │ │ │ │ ├── top-k@qzvp6YxWDiGakA2mtspfh.md │ │ │ │ │ ├── top-p@FjV3oD7G2Ocq5HhUC17iH.md │ │ │ │ │ ├── training@xostGgoaYkqMO28iN2gx8.md │ │ │ │ │ ├── transformersjs@bGLrbpxKgENe2xS1eQtdh.md │ │ │ │ │ ├── transport-layer@o4gHDZ5p9lyeHuCAPvAKz.md │ │ │ │ │ ├── type-of-models@2X0NDcq2ojBJ0RxY_U6bl.md │ │ │ │ │ ├── using-sdks-directly@WZVW8FQu6LyspSKm1C_sl.md │ │ │ │ │ ├── vector-database@zZA1FBhf1y4kCoUZ-hM4H.md │ │ │ │ │ ├── vector-databases@tt9u3oFlsjEMfPyojuqpc.md │ │ │ │ │ ├── vector-dbs@dzPKW_fn82lY1OOVrggk3.md │ │ │ │ │ ├── vertex-ai-agent-builder@AxzTGDCC2Ftp4G66U4Uqr.md │ │ │ │ │ ├── video-understanding@TxaZCtTCTUfwCxAJ2pmND.md │ │ │ │ │ ├── weaviate@VgUnrZGKVjAAO4n_llq5-.md │ │ │ │ │ ├── what-are-embeddings@--ig0Ume_BnXb9K2U7HJN.md │ │ │ │ │ ├── what-are-rags@lVhWhZGR558O-ljHobxIi.md │ │ │ │ │ ├── what-is-an-ai-engineer@GN6SnI7RXIeW8JeD-qORW.md │ │ │ │ │ ├── whisper-api@OTBd6cPUayKaAM-fLWdSt.md │ │ │ │ │ ├── windsurf@Xsl8mx6J182TxPPtNP471.md │ │ │ │ │ └── zero-shot@15XOFdVp0IC-kLYPXUJWh.md │ │ │ │ └── faqs.astro │ │ │ ├── ai-product-builder/ │ │ │ │ └── content/ │ │ │ │ ├── 1-prototyping@ZGqeasMGuEiZvrdyjSNuM.md │ │ │ │ ├── 2-generation@DCcj2_9a7aYi6qCnI4TMV.md │ │ │ │ ├── 3-refinement@S9fE9eG1YWSfVRi8h13U1.md │ │ │ │ ├── 4-collaboration@rcR8DMzELUnmJ7I_pwWpI.md │ │ │ │ ├── 5-deployment@t03SkyX28SacfP_DpmHUf.md │ │ │ │ ├── ai-product-creation-cycle@COeXWV8fCTHXPZnErXcGZ.md │ │ │ │ ├── app-anatomy@ncU03bZztHwt9VrQbEZ15.md │ │ │ │ ├── aws@-MWVEd4dEfGcwBTxKh9WM.md │ │ │ │ ├── azure-devops@DAEMRai6FpPrmRkmKTOhV.md │ │ │ │ ├── azure@UoZoN-nN8eTnI-J5ma-oq.md │ │ │ │ ├── base44@kufoDIjMsRnb93I6Y_hN7.md │ │ │ │ ├── bit-cloud@AlE1rcdp-5RVihRMpshnh.md │ │ │ │ ├── bolt@YZi89ogkfzKIivbdFmcP_.md │ │ │ │ ├── browsers--devtools@iRey4hwJCIraoNsIZELZv.md │ │ │ │ ├── choose-a-prototype-tool@mQzAgHoM3DS_zn2zr2FXg.md │ │ │ │ ├── claude-code@Fa06GTSwYb9x0QuGsp8et.md │ │ │ │ ├── claude-code@G86QePmTB5LX4_dMkVgoK.md │ │ │ │ ├── cloudflare@Q6PzFpT_4kElowvvB2u_v.md │ │ │ │ ├── codex@S7uHXLcxvtegkI1kirVS9.md │ │ │ │ ├── codex@xCoG801UzwsRaK0xmI9_B.md │ │ │ │ ├── copilot@6HLxaflojoF0-cuIuPDeG.md │ │ │ │ ├── cursor@BEw1Iowb0KMiChtDGvKep.md │ │ │ │ ├── definition--scope@4dxljr8BtYkJDXbLeE0gW.md │ │ │ │ ├── digitalocean@ZxLukZLdGXGvV4MRHmoGh.md │ │ │ │ ├── e2e-testing@MB_6yVmgPZugbjxGzoq09.md │ │ │ │ ├── feature-scoping@5qljkbrUWUAn-5Ng2AiaJ.md │ │ │ │ ├── feedback--validation@ZQ-kWlp5v9fimgHmG5hlR.md │ │ │ │ ├── gcp@6hl4_ft8onzq80v_nD8Q4.md │ │ │ │ ├── gemini-cli@vGtnZaa5vH02cTgkVG6A-.md │ │ │ │ ├── github@OFscURhjqJfh8qA3SKSfh.md │ │ │ │ ├── gitlab@f_d4JlYSbP9BHuCR0kBpP.md │ │ │ │ ├── hope-ai@8ePFxmPv_Vm7SKoleM1tT.md │ │ │ │ ├── html--css--javascript@Cem2u4lHoA8KW-0GqVzcw.md │ │ │ │ ├── integration-testing@MXPA6I8K1_aKKQpgk2EcW.md │ │ │ │ ├── lovable@T-NUiQvT8dKmg6UDGVSt_.md │ │ │ │ ├── mongodb--atlas@gwHXA4WBrZN0VeAx5NKz7.md │ │ │ │ ├── new-feature--structural-change@HZHzCLbK-oQh7gSokxHWq.md │ │ │ │ ├── nodejs@d_2Uq2_Befe1tqM8_Y8lq.md │ │ │ │ ├── postgresql--mysql@kfl0oJKi1OusryrSqO2jn.md │ │ │ │ ├── problem-definition@kxDCkO0aZLY4_hd4_ykH6.md │ │ │ │ ├── railway@Sv7QfwPKaTsviScn2axhk.md │ │ │ │ ├── react@aHQ8f3ulEeUxTYCifzcPq.md │ │ │ │ ├── render@OBGQ-1bjYBdYi-_oFpmj8.md │ │ │ │ ├── replit@Gf1egAjfyQyAJ4I-aT_Ip.md │ │ │ │ ├── supabase@p4Ku5RT5uOVYPuduqz80M.md │ │ │ │ ├── targeted-change@ydzaN2EHBVAavHS3iPQ40.md │ │ │ │ ├── tech-stack--constraints@tN2X9NW0PhcP21OptheoD.md │ │ │ │ ├── unit-testing@VxqhYHA9YpWx70GIhKghY.md │ │ │ │ ├── user-testing@aRA5S0Mmmhx9F0nhD3Wcp.md │ │ │ │ ├── v0@xKBoLYQgpLDmOtDweVHei.md │ │ │ │ └── vercel@wUg8ypt4aWXgMYGiaIdgy.md │ │ │ ├── ai-red-teaming/ │ │ │ │ ├── ai-red-teaming.json │ │ │ │ ├── ai-red-teaming.md │ │ │ │ ├── content/ │ │ │ │ │ ├── advanced-techniques@soC-kcem1ISbnCQMa6BIB.md │ │ │ │ │ ├── adversarial-examples@xjlttOti-_laPRn8a2fVy.md │ │ │ │ │ ├── adversarial-training@2Y0ZO-etpv3XIvunDLu-W.md │ │ │ │ │ ├── agentic-ai-security@FVsKivsJrIb82B0lpPmgw.md │ │ │ │ │ ├── ai-security-fundamentals@R9DQNc0AyAQ2HLpP4HOk6.md │ │ │ │ │ ├── api-protection@Tszl26iNBnQBdBEWOueDA.md │ │ │ │ │ ├── authentication@J7gjlt2MBx7lOkOnfGvPF.md │ │ │ │ │ ├── authentication@JQ3bR8odXJfd-1RCEf3-Q.md │ │ │ │ │ ├── automated-vs-manual@LVdYN9hyCyNPYn2Lz1y9b.md │ │ │ │ │ ├── benchmark-datasets@et1Xrr8ez-fmB0mAq8W_a.md │ │ │ │ │ ├── black-box-testing@0bApnJTt-Z2IUf0X3OCYf.md │ │ │ │ │ ├── code-injection@vhBu5x8INTtqvx6vcYAhE.md │ │ │ │ │ ├── conferences@LuKnmd9nSz9yLbTU_5Yp2.md │ │ │ │ │ ├── confidentiality-integrity-availability@WZkIHZkV2qDYbYF9KBBRi.md │ │ │ │ │ ├── continuous-monitoring@7Km0mFpHguHYPs5UhHTsM.md │ │ │ │ │ ├── continuous-testing@65Lo60JQS5YlvvQ6KevXt.md │ │ │ │ │ ├── countermeasures@G1u_Kq4NeUsGX2qnUTuJU.md │ │ │ │ │ ├── ctf-challenges@2Imb64Px3ZQcBpSQjdc_G.md │ │ │ │ │ ├── custom-testing-scripts@C1zO2xC0AqyV53p2YEPWg.md │ │ │ │ │ ├── data-poisoning@nD0_64ELEeJSN-0aZiR7i.md │ │ │ │ │ ├── direct@5zHow4KZVpfhch5Aabeft.md │ │ │ │ │ ├── emerging-threats@-G8v_CNa8wO_g-46_RFQo.md │ │ │ │ │ ├── ethical-considerations@1gyuEV519LjN-KpROoVwv.md │ │ │ │ │ ├── forums@Smncq-n1OlnLAY27AFQOO.md │ │ │ │ │ ├── generative-models@3XJ-g0KvHP75U18mxCqgw.md │ │ │ │ │ ├── grey-box-testing@ZVNAMCP68XKRXVxF2-hBc.md │ │ │ │ │ ├── indirect@3_gJRtJSdm2iAfkwmcv0e.md │ │ │ │ │ ├── industry-credentials@HHjsFR6wRDqUd66PMDE_7.md │ │ │ │ │ ├── industry-standards@WePO66_4-gNcSdE00WKmw.md │ │ │ │ │ ├── infrastructure-security@nhUKKWyBH80nyKfGT8ErC.md │ │ │ │ │ ├── insecure-deserialization@aKzai0A8J55-OBXTnQih1.md │ │ │ │ │ ├── introduction@HFJIYcI16OMyM77fAw9af.md │ │ │ │ │ ├── jailbreak-techniques@Ds8pqn4y9Npo7z6ubunvc.md │ │ │ │ │ ├── lab-environments@MmwwRK4I9aRH_ha7duPqf.md │ │ │ │ │ ├── large-language-models@8K-wCn2cLc7Vs_V4sC3sE.md │ │ │ │ │ ├── llm-security-testing@xJYTRbPxMn0Xs5ea0Ygn6.md │ │ │ │ │ ├── model-inversion@iE5PcswBHnu_EBFIacib0.md │ │ │ │ │ ├── model-vulnerabilities@uBXrri2bXVsNiM8fIHHOv.md │ │ │ │ │ ├── model-weight-stealing@QFzLx5nc4rCCD8WVc20mo.md │ │ │ │ │ ├── monitoring-solutions@59lkLcoqV4gq7f8Zm0X2p.md │ │ │ │ │ ├── neural-networks@RuKzVhd1nZphCrlW1wZGL.md │ │ │ │ │ ├── prompt-engineering@gx4KaFqKgJX9n9_ZGMqlZ.md │ │ │ │ │ ├── prompt-hacking@1Xr7mxVekeAHzTL7G4eAZ.md │ │ │ │ │ ├── prompt-injection@XOrAPDRhBvde9R-znEipH.md │ │ │ │ │ ├── red-team-simulations@DpYsL0du37n40toH33fIr.md │ │ │ │ │ ├── reinforcement-learning@Xqzc4mOKsVzwaUxLGjHya.md │ │ │ │ │ ├── remote-code-execution@kgDsDlBk8W2aM6LyWpFY8.md │ │ │ │ │ ├── reporting-tools@BLnfNlA0C4yzy1dvifjwx.md │ │ │ │ │ ├── research-groups@ZlR03pM-sqVFZNhD1gMSJ.md │ │ │ │ │ ├── research-opportunities@VmaIHVsCpq2um_0cA33V3.md │ │ │ │ │ ├── responsible-disclosure@KAcCZ3zcv25R6HwzAsfUG.md │ │ │ │ │ ├── risk-management@MupRvk_8Io2Hn7yEvU663.md │ │ │ │ │ ├── robust-model-design@6gEHMhh6BGJI-ZYN27YPW.md │ │ │ │ │ ├── role-of-red-teams@Irkc9DgBfqSn72WaJqXEt.md │ │ │ │ │ ├── safety-filter-bypasses@j7uLLpt8MkZ1rqM7UBPW4.md │ │ │ │ │ ├── specialized-courses@s1xKK8HL5-QGZpcutiuvj.md │ │ │ │ │ ├── supervised-learning@NvOJIv36Utpm7_kOZyr79.md │ │ │ │ │ ├── testing-platforms@c8n8FcYKDOgPLQvV9xF5J.md │ │ │ │ │ ├── threat-modeling@RDOaTBWP3aIJPUp_kcafm.md │ │ │ │ │ ├── unauthorized-access@DQeOavZCoXpF3k_qRDABs.md │ │ │ │ │ ├── unsupervised-learning@ZC0yKsu-CJC-LZKKo2pLD.md │ │ │ │ │ ├── vulnerability-assessment@887lc3tWCRH-sOHSxWgWJ.md │ │ │ │ │ ├── white-box-testing@Mrk_js5UVn4dRDw-Yco3Y.md │ │ │ │ │ └── why-red-team-ai-systems@fNTb9y3zs1HPYclAmu_Wv.md │ │ │ │ └── faqs.astro │ │ │ ├── android/ │ │ │ │ ├── android.json │ │ │ │ ├── android.md │ │ │ │ ├── content/ │ │ │ │ │ ├── activity-lifecycle@FVg438cVBBzqJFkGWVbQM.md │ │ │ │ │ ├── activity@nwuVlPmzwJ17mtVQ8Hi9w.md │ │ │ │ │ ├── animations@Xn1VQ-xOT67ZfJJTM4r1p.md │ │ │ │ │ ├── apollo-android@ww0fTbdXwVr-QIOClU7ng.md │ │ │ │ │ ├── app-components@5Li8J5iR_ZuyIlxX0LYei.md │ │ │ │ │ ├── app-shortcuts@xV475jHTlLuHtpHZeXb7P.md │ │ │ │ │ ├── asynchronism@cFYZ2C7yNnY6NHKUNP2Z4.md │ │ │ │ │ ├── authentication@Xv0es_z64vh-QzivMeAT3.md │ │ │ │ │ ├── basics-of-kotlin@jl1FsQ5-WGKeFyaILNt_p.md │ │ │ │ │ ├── basics-of-oop@j69erqfosSZMDlmKcnnn0.md │ │ │ │ │ ├── bitbucket@5LFZdUiFYYU_1sYsouyan.md │ │ │ │ │ ├── bottom-sheet@Z4Tbd5ClnqCXGPGG09F-G.md │ │ │ │ │ ├── broadcast-receiver@tFuAToid1Fkmu96BDtW7K.md │ │ │ │ │ ├── builder-pattern@784fiIdKrQDlIm3VIiJQN.md │ │ │ │ │ ├── buttons@WhfzFOUpm0DFEj7Oeq21R.md │ │ │ │ │ ├── chucker@7RKN1FNtRE_BE6QeAQrKb.md │ │ │ │ │ ├── cloud-messaging@e3vHFaFFMV7kI9q6yf5e9.md │ │ │ │ │ ├── common-services@ZEdn2yy-IwHN3kOYr2ZbC.md │ │ │ │ │ ├── constraint@3fFNMhQIuuh-NRzSXYpXO.md │ │ │ │ │ ├── content-provider@nkcdjrswv0WCzUs48BAt9.md │ │ │ │ │ ├── coroutines@i_cKmTnGAYw8xpHwZHjAd.md │ │ │ │ │ ├── crashlytics@xB4evbD07n1VrHOIpowV4.md │ │ │ │ │ ├── create-a-basic-hello-world-app@5m_7DvInF8C_4Ml1xVI6L.md │ │ │ │ │ ├── dagger@CK7Ce632fdTgxeFsRUVvd.md │ │ │ │ │ ├── data-structures-and-algorithms@cNeT1dJDfgn0ndPzSxhSL.md │ │ │ │ │ ├── datastore@GWq3s1iTxQOp1BstHscJ9.md │ │ │ │ │ ├── debugging@6KbSUAoT_jTudFoIbwMpA.md │ │ │ │ │ ├── dependency-injection@qtXM9K7wyjOFuEMlZrB3C.md │ │ │ │ │ ├── design--architecture@jePGzTejFe4ryA5qFFmjl.md │ │ │ │ │ ├── detekt@RUvuCp_JK5MQQT13SSHUV.md │ │ │ │ │ ├── development-ide@ZRGsokU313Ky-anWbWK6q.md │ │ │ │ │ ├── dialogs@Mtx0bY0drmaTw8sCM5YTl.md │ │ │ │ │ ├── distribution@kc6buUsLAeZeUb4Tk0apM.md │ │ │ │ │ ├── drawer@amTxz7mS98lkhOrNMJXG_.md │ │ │ │ │ ├── edittext@boMz0HZlMAsLdCZlpUo-H.md │ │ │ │ │ ├── espresso@-ONSC-ImGSELbamKmjIlH.md │ │ │ │ │ ├── explicit-intents@TmIeCF3xVCe5Sy3ITmM31.md │ │ │ │ │ ├── factory-pattern@DeOxj6RzQBYfEWV-M1Ybm.md │ │ │ │ │ ├── file-system@A4kdaj6AFueUgPI7hwKi5.md │ │ │ │ │ ├── firebase-distribution@T7q_quNaIAuGi96OdnDT1.md │ │ │ │ │ ├── firestore@3EEfKAd-ppIQpdQSEhbA1.md │ │ │ │ │ ├── flow@W-WTIiQml8dLK6i_V69JK.md │ │ │ │ │ ├── fragments@2iDJrxjXOt7o2fPp2HfRl.md │ │ │ │ │ ├── frame@Dp2DOX10u2xJUjB8Okhzh.md │ │ │ │ │ ├── git@rqSZ2ATeHbOdIQE9Jlb0B.md │ │ │ │ │ ├── github@H-2eb8fLwz8IKYXbeSVKK.md │ │ │ │ │ ├── gitlab@Q47BtQphp59NkkZoeNXmP.md │ │ │ │ │ ├── google-admob@D4ZXQOKJkyFYNZIy-MJ9Y.md │ │ │ │ │ ├── google-maps@S5FVF9rMgVSSDKXJW2GYb.md │ │ │ │ │ ├── google-play-services@m5rumeynEbS8T27pelr0-.md │ │ │ │ │ ├── google-playstore@HgRdgi2Hu4C8YLG5PXfoo.md │ │ │ │ │ ├── hilt@ooo_k2k_vUBR_jQ7Ke6Et.md │ │ │ │ │ ├── imageview@A4rtNULX_MoV93IH1Lgqw.md │ │ │ │ │ ├── implicit-intents@gGdz3j33x0gfrFDp_rw8Z.md │ │ │ │ │ ├── intent-filters@b-sfh6NoS-APqaNKm5L5S.md │ │ │ │ │ ├── intent@hv_9imIQpthxEaMLXEUHI.md │ │ │ │ │ ├── interface--navigation@4_e76QafrB419S2INOeKd.md │ │ │ │ │ ├── java@RBABbkzD_uNFwEO-hssZO.md │ │ │ │ │ ├── jetpack-benchmark@ACUJlDDR0jqEohsFzWEoQ.md │ │ │ │ │ ├── jetpack-compose@60Vm-77rseUqpMiFvp-dA.md │ │ │ │ │ ├── junit@gvGAwjk_nhEgxzZ_c3f6b.md │ │ │ │ │ ├── kodein@dc7k50PjCYZcElHhCk66p.md │ │ │ │ │ ├── koin@UMqZ-jmXKDXKuu8bzqDH_.md │ │ │ │ │ ├── kotlin@qIzUv8-GgQnkqChEdgD50.md │ │ │ │ │ ├── ktlint@zMbXQH17Q52opdbitPzj7.md │ │ │ │ │ ├── leak-canary@3i4g9ZWgLxKb2UMgRJi4Q.md │ │ │ │ │ ├── linear@U8iMGGOd2EgPxSuwSG39Z.md │ │ │ │ │ ├── linting@77F9F3oI5CPgwgM_hxWfa.md │ │ │ │ │ ├── listview@EzLjX4iRT7AxkAOsJYnSU.md │ │ │ │ │ ├── livedata@TiokceMGU9caqiR0lbFYL.md │ │ │ │ │ ├── mvc@w1A6wPKSd3Yh2luuHV-aE.md │ │ │ │ │ ├── mvi@Bz-BkfzsDHAbAw3HD7WCd.md │ │ │ │ │ ├── mvp@aF_xFIqTjQbENtC7pkXvJ.md │ │ │ │ │ ├── mvvm@pSU-NZtjBh-u0WKTYfjk_.md │ │ │ │ │ ├── navigation-components@o5rzmnaQeiSh9ocvfJPpK.md │ │ │ │ │ ├── network@Yb6aKJMMCxU1QVltWg3Dr.md │ │ │ │ │ ├── observer-pattern@N_auRfGKkeIIc-qiHLkR_.md │ │ │ │ │ ├── okhttp@5pVuwOItAhUxxJX8ysAsn.md │ │ │ │ │ ├── pick-a-language@Suws-7f_6Z1ChpfcnxX2M.md │ │ │ │ │ ├── recyclerview@xIvplWfe-uDr9iHjPT1Mx.md │ │ │ │ │ ├── recycleview@xIvplWfe-uDr9iHjPT1Mx.md │ │ │ │ │ ├── relative@yE0qAQZiEC9R8WvCdskpr.md │ │ │ │ │ ├── remote-config@1Tz-Shj_Tuz2U8llEAcLr.md │ │ │ │ │ ├── repository-pattern@ZF5XgO7I_J9928bD3CVXo.md │ │ │ │ │ ├── retro@dDMRYiqrKyOBnRRQc8zsp.md │ │ │ │ │ ├── room-database@Bfg4So5RlI09zFNcburJd.md │ │ │ │ │ ├── rxjava@xk0vnWr7uESdzYRxwFjoK.md │ │ │ │ │ ├── rxjava@zXsNEyRbb8UpEOAUv6FpY.md │ │ │ │ │ ├── rxkotlin@4h37WBpYxRRyw9oH8ge7o.md │ │ │ │ │ ├── rxkotlin@7rbsp1o5bzIJP11BRIoeG.md │ │ │ │ │ ├── security@j5qmSMOdhpGZo1XOUVx1k.md │ │ │ │ │ ├── services@PcHmU1c9hqKyzSjwlRPHk.md │ │ │ │ │ ├── shared-preferences@PKql1HY0PLMfp50FRELXL.md │ │ │ │ │ ├── signed-apk@_FSlD_qTz5Xo0x3pB6sZI.md │ │ │ │ │ ├── state-changes@oUjetA2eduvQIeLcQlLcu.md │ │ │ │ │ ├── storage@0fNQWRxst8xRstIfPaPO6.md │ │ │ │ │ ├── tabs@pEBpXv3Jf1AzBNHlvVrG8.md │ │ │ │ │ ├── tasks--backstack@-O-G9bg36ut8NnZcdOaop.md │ │ │ │ │ ├── testing@ZOQm5OlzCA-h_yxywwDrW.md │ │ │ │ │ ├── textview@znvZp24L-PcQwkSObtixs.md │ │ │ │ │ ├── the-fundamentals@HlUUGj3dOZ68t4gIjerXh.md │ │ │ │ │ ├── threads@BeGrA5BDBMZP1Jy7n-wl-.md │ │ │ │ │ ├── timber@VFOD4JrV8kZ2583G3oT95.md │ │ │ │ │ ├── toast@BVgO9n7tGlVdiS72-hFSd.md │ │ │ │ │ ├── version-control@5s1CqsYCOXjNroDHaGKGa.md │ │ │ │ │ ├── what-is-and-how-to-use-gradle@FVxNjbDBxgf6vkZWw1Awt.md │ │ │ │ │ └── workmanager@OAb_JD64uGm2tPoue7w6t.md │ │ │ │ ├── faqs.astro │ │ │ │ └── migration-mapping.json │ │ │ ├── angular/ │ │ │ │ ├── angular.json │ │ │ │ ├── angular.md │ │ │ │ ├── content/ │ │ │ │ │ ├── accessibility@VNG9DdXlS6R1OJ6Lrn4Lt.md │ │ │ │ │ ├── analogjs@kauQofxCmpktXPcnzid17.md │ │ │ │ │ ├── angular-and-history@hpShWwL0M57ZAzqkB4I8t.md │ │ │ │ │ ├── angular-architecture@DE3cMpeRYuUPw2ADtfS-3.md │ │ │ │ │ ├── angular-cli@4YSk6I63Ew--zoXC3xmrC.md │ │ │ │ │ ├── animation@rYJq59Q0YdfK6n3x740Em.md │ │ │ │ │ ├── aot-compilation@MwtM1UAIfj4FJ-Y4CKDsP.md │ │ │ │ │ ├── attribute-binding@FgsSyM6To7irpbivtOLEE.md │ │ │ │ │ ├── attribute-directives@xvwby0FTdIolRrV2j88fY.md │ │ │ │ │ ├── attributes@0FvH7KPs9ag02QkD1HEJ-.md │ │ │ │ │ ├── build-environments@Ax-s_xw3FO3Ocv-AnLbQD.md │ │ │ │ │ ├── case@cHC2MH50CbUSMRZV4QGJI.md │ │ │ │ │ ├── change-detection@_-mTs_FMeob-ZGK-bb3j-.md │ │ │ │ │ ├── changedetection@uYHy2yhtTm6fQkKpYx3lU.md │ │ │ │ │ ├── cli-builders@TeWEy9I-hU6SH02Sy2S2S.md │ │ │ │ │ ├── code-coverage@bqA2bxPcZrqQ-6QE-YDK1.md │ │ │ │ │ ├── combination@IgUHqfVhiGpwxT9tY8O88.md │ │ │ │ │ ├── common-pipes@i2taHzQ5KLHjkkpbH4Ytd.md │ │ │ │ │ ├── communication@19c7D-fWIJ3vYFT6h8ZfN.md │ │ │ │ │ ├── complex-sequences@Unjknmb4b2LY-nUVvvF7_.md │ │ │ │ │ ├── component-anatomy@Mp056kNnwsRWeEXuhGPy-.md │ │ │ │ │ ├── component-bindings@cXVy1lx2XqY_j8gxz-y60.md │ │ │ │ │ ├── component-lifecycle@nCpfj_35ZvW-NTygg06XZ.md │ │ │ │ │ ├── component-templates@0dYWO_Zvh9J5_6cRjRjvI.md │ │ │ │ │ ├── components@kGnKzCkQCNFEdgCBRtNuW.md │ │ │ │ │ ├── configuration@dbAS-hN1hoCsNJhkxXcGq.md │ │ │ │ │ ├── containers@0s-QhN5aZh2F3tLJFKEyR.md │ │ │ │ │ ├── contentchild@oQl9etjoHiU2JgxieUOEH.md │ │ │ │ │ ├── control-flow@VzvB_bads057YtG4ST4a2.md │ │ │ │ │ ├── control-value-accessor@m5dgKgUR3ZqI9sBAzToev.md │ │ │ │ │ ├── creating-components@ex8FOKrUlbu4MuEq2czyW.md │ │ │ │ │ ├── creating-libraries@A1mYMg7cbcj6p_VkDf-Tz.md │ │ │ │ │ ├── creating-modules@9YhTXybJw2gszlqFeBtW3.md │ │ │ │ │ ├── cross-site-request-forgery@Z1DZBbFI4oU6-KQg3wqMm.md │ │ │ │ │ ├── cross-site-script-inclusion@zd7YJGlcMFNFbsKUiW_XC.md │ │ │ │ │ ├── cross-site-scripting@umUX4Hxk7srHlFR_Un-u7.md │ │ │ │ │ ├── custom-directives@7GUvTMVzfdVEDBOz-tHUT.md │ │ │ │ │ ├── custom-pipes@BOYXGfULJRiP-XOo_lNX3.md │ │ │ │ │ ├── custom-validators@kxRtLsB3y_th8j-HjmJgK.md │ │ │ │ │ ├── data-binding@5vZkiH7HDwONIABLfNJ06.md │ │ │ │ │ ├── debugging-tests@f5v74Uw54LsB4FgdN6eCd.md │ │ │ │ │ ├── default@h4MMn0_qUN3YXEdMUJOyd.md │ │ │ │ │ ├── defer@ONy-0olujU_FGZM7Wvfr2.md │ │ │ │ │ ├── deferrable-views@CYjsXIOWtP5DJmYS-qR-s.md │ │ │ │ │ ├── dependencies@5b590c7s-2XJ0rgdCYxLa.md │ │ │ │ │ ├── dependency-injection@8u9uHCRt9RU57erBy79PP.md │ │ │ │ │ ├── deployment@1fVi9AK6aLjt5QgAFbnGX.md │ │ │ │ │ ├── developer-tools@EbJib-XfZFF9bpCtL3aBs.md │ │ │ │ │ ├── devtools@T3MmS3bvMMgCUbOk3ktU7.md │ │ │ │ │ ├── directives@kGzlumFdZFxTRZ3HnCGFO.md │ │ │ │ │ ├── dynamic-components@tC5ETtOuuUcybj1jI4CuG.md │ │ │ │ │ ├── dynamic-forms@CpufN6DAOj5UNab9vnH0k.md │ │ │ │ │ ├── elf@rgPUcSKxG9DvXicLfC2Ay.md │ │ │ │ │ ├── else-if@ys5untkSppGMFK-VsfuRt.md │ │ │ │ │ ├── else@ORdPDad4HWJAfcZuS-7yM.md │ │ │ │ │ ├── encapsulation@ctigvSYeFa77y3v7m11gk.md │ │ │ │ │ ├── end-to-end-testing@yhNGhduk__ow8VTLc6inZ.md │ │ │ │ │ ├── enforce-trusted-types@5h7U0spwEUhB-hbjSlaeB.md │ │ │ │ │ ├── event-binding@bKnpirSvex4oE4lAjiSSV.md │ │ │ │ │ ├── feature-modules@w_BazXvINFyxDCHmlznfy.md │ │ │ │ │ ├── filtering@nxUbl0eu3LsSL-Z8X6nP5.md │ │ │ │ │ ├── for@2kYS9w1UzQFZ1zhf01m9L.md │ │ │ │ │ ├── forms@Q36LQds8k_cSjijvXyWOM.md │ │ │ │ │ ├── guards@PmC4zeaLpa5LoL4FhYXcG.md │ │ │ │ │ ├── http-client@8UY0HAvjY7bdbFpt-MM1u.md │ │ │ │ │ ├── http-vulnerabilities@xH3RHPhsaqD9zIMms5OmX.md │ │ │ │ │ ├── httpclient-csrf@m2aw8vb4rz4IjshpoMyNx.md │ │ │ │ │ ├── hydration@NY_MfBNgNmloiRGcIvfJ1.md │ │ │ │ │ ├── if@U1Zy2T-2ki9pDkXn9hn-I.md │ │ │ │ │ ├── image-optimization@1WIKjn3nxYDMIhBL17aYQ.md │ │ │ │ │ ├── imports@ghbrJhuGvscnNGCtVLh5_.md │ │ │ │ │ ├── input--output@VsU6713jeIjAOEZnF6gWx.md │ │ │ │ │ ├── inputs-as-signals@LcJyAfv9hjyUNXUVyPRP4.md │ │ │ │ │ ├── internationalization@Xxyx3uzy5TpNhgR1IysMN.md │ │ │ │ │ ├── interpolation@XHpfHRIlFh19FJIE07u7i.md │ │ │ │ │ ├── introduction-to-angular@KDd40JOAvZ8O1mfhTYB3K.md │ │ │ │ │ ├── language-service@ql7SyxrRmjpiXJ9hQeWPq.md │ │ │ │ │ ├── lazy-loading-modules@bLERvEERmNI5AgxtEYokZ.md │ │ │ │ │ ├── lazy-loading@ewbDdPYv2SJl_jW3RVHQs.md │ │ │ │ │ ├── let@AwOM0ucg6W7TohdUd7KWT.md │ │ │ │ │ ├── libraries@cl89U8atD6gw5rMGUm4Ix.md │ │ │ │ │ ├── link-identification@5-RCB8AiDbkdIFYNXKWge.md │ │ │ │ │ ├── local-setup@FVH0lnbIZ2m5EfF2EJ2DW.md │ │ │ │ │ ├── locales-by-id@dVKl3Z2Rnf6IB064v19Mi.md │ │ │ │ │ ├── localize-package@W8OwpEw00xn0GxidlJjdc.md │ │ │ │ │ ├── making-requests@HjGAv3aV-p4ijYJ8XYIw3.md │ │ │ │ │ ├── metadata@Szgr8dnZNi-z5i6raIJzW.md │ │ │ │ │ ├── model-inputs@IeU6ClS_yp6BYKdkQOJVf.md │ │ │ │ │ ├── module-architecture@BCq5sgWQLiw0f7u7ZSAd2.md │ │ │ │ │ ├── modules@b_kdNS9PDupcUftslkf9i.md │ │ │ │ │ ├── multiple-locales@9ISvaaJ815_cr_KW9vQhT.md │ │ │ │ │ ├── ngrx@ir94IdkF1tVAA8ZTD9r0N.md │ │ │ │ │ ├── ngxs@N9ZCPgFnFIUv4jMv1w5qK.md │ │ │ │ │ ├── observable-lifecycle@b06Y5YrqBbHhWkK6Ws_1c.md │ │ │ │ │ ├── observable-pattern@krXA6ua7E3m4IIpFkgQZe.md │ │ │ │ │ ├── operators@ihsjIcF0tkhjs56458teE.md │ │ │ │ │ ├── parent-child-interaction@TDyFjKrIZJnCjEZsojPNQ.md │ │ │ │ │ ├── performance@STEHxJpwBZxFdQl0zUKxo.md │ │ │ │ │ ├── pipes-precedence@nZxZnzbQg9dz-SI65UHq9.md │ │ │ │ │ ├── pipes@j99WQxuTzGeBBVoReDp_y.md │ │ │ │ │ ├── property-binding@TJOZfHtsLfwA0CZ2bd1b2.md │ │ │ │ │ ├── provider@dOMvz__EQjO-3p-Nzm-7P.md │ │ │ │ │ ├── queries-as-signals@9HS9C3yq9EUcUy0ZUZk_H.md │ │ │ │ │ ├── rate-limiting@bJbbayFQ9WSJT9-qy0H5l.md │ │ │ │ │ ├── reactive-forms@1d3Y4HVnqom8UOok-7EEf.md │ │ │ │ │ ├── reusable-animations@M1CU2Yq6dLp4yOuGV0fhF.md │ │ │ │ │ ├── route-transitions@x91jWP81oCTeVEwzX8FbK.md │ │ │ │ │ ├── router-events@YF_sG292HqawIX0siWhrv.md │ │ │ │ │ ├── router-links@8lFyuSx4MUcYRY2L8bZrq.md │ │ │ │ │ ├── router-outlets@1ZwdEL0Gx30Vv_Av3ZTGG.md │ │ │ │ │ ├── routing@8i_JD1P4gIhY1rdldwLC2.md │ │ │ │ │ ├── routing@a74v78SvGtWduZpXs7wSq.md │ │ │ │ │ ├── rxjs-basics@lfp7PIjwITU5gBITQdirD.md │ │ │ │ │ ├── rxjs-interop@KAdtebWvgvMifIwd52yc4.md │ │ │ │ │ ├── rxjs-vs-promises@e1ZmmxPZuogCNgtbPPWmd.md │ │ │ │ │ ├── sanitization@cgI9oeUHufA-ky_W1zENe.md │ │ │ │ │ ├── schematics@Uvr0pRk_fOzwRwqn0dQ6N.md │ │ │ │ │ ├── security@mm6c7GLQEwoQdAHdAYzGh.md │ │ │ │ │ ├── selector@cDN0PGo-zkcLmttxCiAI-.md │ │ │ │ │ ├── services---remote-data@CpsoIVoCKaZnM_-BbXbCh.md │ │ │ │ │ ├── services-with-dependencies@TGRZBizDy83JKg_MhnRdX.md │ │ │ │ │ ├── setting-up-a-new-project@EbFRcy4s6yzzIApBqU77Y.md │ │ │ │ │ ├── setting-up-the-client@AKPhbg10xXjccO7UBh5eJ.md │ │ │ │ │ ├── signals@u1TG8i145o0RKhOR_5epf.md │ │ │ │ │ ├── slow-computations@yxUtSBzJPRcS-IuPsyp-W.md │ │ │ │ │ ├── ssg@b-0yQ74zHtAxI9aRLBohc.md │ │ │ │ │ ├── ssr@jfHaS8TqE4tcAo59K8Nkn.md │ │ │ │ │ ├── standalone@RcNHEh6kmbBK1PICbhAwr.md │ │ │ │ │ ├── state-management@Mqe_s-nwBqAL6X7OGRHEN.md │ │ │ │ │ ├── structural-directives@xk3v8p6vf8ntGj5c-IU4U.md │ │ │ │ │ ├── styles@4XJKEmSrQfPxggHlAP30w.md │ │ │ │ │ ├── switch@nZuim4Fjq6jYOXcRTAEay.md │ │ │ │ │ ├── template-driven-forms@uDx4lPavwsJFBMzdQ70CS.md │ │ │ │ │ ├── template-ref-vars@nyDry6ZWyEUuTq4pw-lU3.md │ │ │ │ │ ├── template-statements@t2YOeMONlcnKBrVAo0JDc.md │ │ │ │ │ ├── template-syntax@VsC7UmE_AumsBP8fC6to1.md │ │ │ │ │ ├── template@-gUpm3OLUJl9iAyx6fmHN.md │ │ │ │ │ ├── templates@6fhe9xAi_RSVfa-KKbcbV.md │ │ │ │ │ ├── testing-directives@SGqb5k6OmWit8PA6ZT3js.md │ │ │ │ │ ├── testing-pipes@rH13NBFG02hnn5eABSNCY.md │ │ │ │ │ ├── testing-requests@4xt0m5jkUqB4Z-krcFBuL.md │ │ │ │ │ ├── testing-services@HU1eTYB321C93qh_U7ioF.md │ │ │ │ │ ├── testing@lLa-OnHV6GzkNFZu29BIT.md │ │ │ │ │ ├── transformation@kdMJHljMzGA3oRlh8Zvos.md │ │ │ │ │ ├── transitions--triggers@Iv2d4sgODqMPzA9gH6RAw.md │ │ │ │ │ ├── translation-files@jL5amGV1BAX_V5cyTIH7d.md │ │ │ │ │ ├── trusting-safe-values@XoYSuv1salCCHoI1cJkxv.md │ │ │ │ │ ├── two-way-binding@2UH79nCjgtY1Qz1YjUJYL.md │ │ │ │ │ ├── typed-forms@XC_K1Wahl2ySqOXoym4YU.md │ │ │ │ │ ├── ui-components@CZ1YRyai8Ds-ry4A8jVbr.md │ │ │ │ │ ├── understand-binding@WH5wlyOtrqFHBJx7RFJwS.md │ │ │ │ │ ├── using-libraries@YHV5oFwLwphXf1wJTDZuG.md │ │ │ │ │ ├── viewchild@v0XaLNZ-YrRqP-xv8wS43.md │ │ │ │ │ ├── viewprovider@doHDoAgp7T59KGSXPpQzZ.md │ │ │ │ │ ├── writing-interceptors@xG7iSVOGcbxJbNv3xbNfc.md │ │ │ │ │ ├── xsrf-protection@ni00edsphJd7uBLCn7-Vw.md │ │ │ │ │ ├── zone-pollution@pRSR5PEbkJXAJ1LPyK-EE.md │ │ │ │ │ ├── zoneless-applications@1x5pT607aKE-S-NCWB810.md │ │ │ │ │ └── zones@m4WBnx_9h01Jl6Q1sxi4Y.md │ │ │ │ ├── faqs.astro │ │ │ │ └── migration-mapping.json │ │ │ ├── api-design/ │ │ │ │ ├── api-design.json │ │ │ │ ├── api-design.md │ │ │ │ ├── content/ │ │ │ │ │ ├── abac@dZTe_kxIUQsc9N3w920aR.md │ │ │ │ │ ├── api-documentation-tools@5R9yKfN1vItuv__HgCwP7.md │ │ │ │ │ ├── api-gateways@MJeUD4fOHaJu1oxk4uQ-x.md │ │ │ │ │ ├── api-integration-patterns@R3aRhqCslwhegMfHtxg5z.md │ │ │ │ │ ├── api-keys--management@tzUJwXu_scwQHnPPT0oY-.md │ │ │ │ │ ├── api-lifecycle-management@At5exN7ZAx2IzY3cTCzHm.md │ │ │ │ │ ├── api-performance@d9ZXdU73jiCdeNHQv1_DH.md │ │ │ │ │ ├── api-security@qIJ6dUppjAjOTA8eQbp0n.md │ │ │ │ │ ├── api-testing@Wpk4TvxcZOJgAoXjrOsZF.md │ │ │ │ │ ├── attribute-based-access-control-abac@dZTe_kxIUQsc9N3w920aR.md │ │ │ │ │ ├── authentication-methods@cQnQ9v3mH27MGNwetz3JW.md │ │ │ │ │ ├── authorization-methods@nHbn8_sMY7J8o6ckbD-ER.md │ │ │ │ │ ├── basic-auth@0FzHERK5AeYL5wv1FBJbH.md │ │ │ │ │ ├── basics-of-dns@v4nJYD9yiIEUviLPhVTCD.md │ │ │ │ │ ├── batch-processing@X68HXAAV-nKo-V4Fu1o72.md │ │ │ │ │ ├── best-practices@q1yaf-RbHIQsOqfzjn4k4.md │ │ │ │ │ ├── building-json--restful-apis@awdoiCHz7Yc3kYac_iy-a.md │ │ │ │ │ ├── caching-strategies@PrvRCR4HCdGar0vcUbG_a.md │ │ │ │ │ ├── ccpa@a-_iIE7UdoXzD00fD9MxN.md │ │ │ │ │ ├── common-vulnerabilities@G70wvcOM1Isrx5ZBvS2xP.md │ │ │ │ │ ├── content-negotiation@TX_hg7EobNJhmWKsMCaT1.md │ │ │ │ │ ├── contract-testing@NqeBglhzukVMMEF9p2CXc.md │ │ │ │ │ ├── cookies@UFuX8wcxZQ7dvaQF_2Yp8.md │ │ │ │ │ ├── cors@GRlsBogOlOwuqhMMPyHN3.md │ │ │ │ │ ├── dac@_BXgYUlaYfpYrryXTw5n2.md │ │ │ │ │ ├── different-api-styles@o8i093VQv-T5Qf1yGqU0R.md │ │ │ │ │ ├── error-handling--retries@XD1vDtrRQFbLyKJaD1AlA.md │ │ │ │ │ ├── error-handling@8tELdagrOaGCf3nMVs8t3.md │ │ │ │ │ ├── event-driven-architecture@oMfOBkVsgiLvFLicOUdx6.md │ │ │ │ │ ├── functional-testing@6lm3wy9WTAERTqXCn6pFt.md │ │ │ │ │ ├── gdpr@vZxdswGLHCPi5GSuXEcHJ.md │ │ │ │ │ ├── graphql-apis@MKVcPM2EzAr2_Ieyp9Fu3.md │ │ │ │ │ ├── grpc-apis@1DrqtOwxCuFtWQXQ6ZALp.md │ │ │ │ │ ├── handling-crud-operations@zXxEiM5HeOn7W-Vue0tQf.md │ │ │ │ │ ├── hateoas@LByD1vhzunhY1uY1YGZHP.md │ │ │ │ │ ├── hipaa@W4WwTmgZGnWmiYsB0ezml.md │ │ │ │ │ ├── http-caching@qAolZHf_jp8hCdtqHZwC8.md │ │ │ │ │ ├── http-headers@rE-0yibRH6B2UBKp351cf.md │ │ │ │ │ ├── http-methods@rADHM-6NAxEjzmgiHefDX.md │ │ │ │ │ ├── http-status-codes@7szYyzLifKsepNU0c2KnN.md │ │ │ │ │ ├── http-versions@ACALE93mL4gnX5ThRIdRp.md │ │ │ │ │ ├── http@2HdKzAIQi15pr3YHHrbPp.md │ │ │ │ │ ├── idempotency@20KEgZH6cu_UokqWpV-9I.md │ │ │ │ │ ├── integration-testing@qZELS5vw2feS7QfyD7spX.md │ │ │ │ │ ├── jwt@tWg68AHLIr1gIZA1za3jp.md │ │ │ │ │ ├── kafka@boYX1QcJullypfX4sevdy.md │ │ │ │ │ ├── learn-the-basics@duKkpzPjUU_-8kyJGHqRX.md │ │ │ │ │ ├── load-balancing@p5wsniYnOS7cbHd92RxGk.md │ │ │ │ │ ├── load-testing@7JNEx_cbqnAx3esvwZMOd.md │ │ │ │ │ ├── mac@tl1wXmOaj_zHL2o38VygO.md │ │ │ │ │ ├── messaging-queues@IkPZel5zxXWIx90Qx7fZI.md │ │ │ │ │ ├── microservices-architecture@PPeBbooE121zrgNwpVTiA.md │ │ │ │ │ ├── mocking-apis@bEVCT5QGY3uw0kIfAELKh.md │ │ │ │ │ ├── oauth-20@TLuNtQ6HKYQXmglyVk8-t.md │ │ │ │ │ ├── pagination@pgJDzP3pJjhjr5wTRtPJO.md │ │ │ │ │ ├── pbac@nJWtUyn9bljh3T-q_adJK.md │ │ │ │ │ ├── pci-dss@J0enF8UTVzY3H4n3pbPIF.md │ │ │ │ │ ├── performance-metrics@nQpczZUcn-TvrfT80dv0Q.md │ │ │ │ │ ├── performance-testing@DQcAV59vr1-ZRnMfbLXpu.md │ │ │ │ │ ├── pii@mXCKtLUvwVJkHrpHzOecq.md │ │ │ │ │ ├── postman@KQAus72RGqx5f-3-YeJby.md │ │ │ │ │ ├── profiling-and-monitoring@-qdwBg7HvwlbLy3IKCRij.md │ │ │ │ │ ├── rabbit-mq@H22jAI2W5QLL-b1rq-c56.md │ │ │ │ │ ├── rate-limiting--throttling@tPVtRV818D8zAAuNbqPNa.md │ │ │ │ │ ├── rate-limiting@O7wjldZ3yTA2s_F-UnJw_.md │ │ │ │ │ ├── rbac@wFsbmMi5Ey9UyDADdbdPW.md │ │ │ │ │ ├── readmecom@LxWHkhlikUaMT2G8YmVDQ.md │ │ │ │ │ ├── real-time-apis@JE12g5cqnwmgeTle14Vxw.md │ │ │ │ │ ├── rebac@CCcY8UsGdd2pdBYHt9L4o.md │ │ │ │ │ ├── rest-principles@9WI_z34jIFXwoUQuChyRU.md │ │ │ │ │ ├── restful-apis@BvwdASMvuNQ9DNgzdSZ4o.md │ │ │ │ │ ├── rfc-7807----problem-details-for-apis@5CxU3inGcSHp-TDg3BQiY.md │ │ │ │ │ ├── role-based-access-control-rbac@wFsbmMi5Ey9UyDADdbdPW.md │ │ │ │ │ ├── server-sent-events@iNsXTtcIHsI_i-mCfjGYn.md │ │ │ │ │ ├── session-based-auth@eQWoy4CpYP3TJL2bbhPB_.md │ │ │ │ │ ├── simple-json-apis@TVR-SkErlOHbDKLBGfxep.md │ │ │ │ │ ├── soap-apis@Wwd-0PjrtViMFWxRGaQey.md │ │ │ │ │ ├── standards-and-compliance@yvdfoly5WHHTq2Puss355.md │ │ │ │ │ ├── stoplight@OpS2NX1lPTOtfjV1wKtC4.md │ │ │ │ │ ├── swagger--open-api@5RY7AlfRQydjxWK65Z4cv.md │ │ │ │ │ ├── synchronous-vs-asynchronous-apis@--mmTKhG58_elbUqyn90G.md │ │ │ │ │ ├── token-based-auth@QTH7sy9uQZWl6ieBz7erY.md │ │ │ │ │ ├── understand-tcp--ip@KG3wO86F8Of27fU7QRcsn.md │ │ │ │ │ ├── unit-testing@JvmW78cDm84GNhq8VEYZp.md │ │ │ │ │ ├── uri-design@b3qRTLwCC_9uDoPGrd9Bu.md │ │ │ │ │ ├── url-query--path-parameters@P-rGIk50Bg7nFmWieAW07.md │ │ │ │ │ ├── versioning-strategies@itILK2SXvLvAjk1Kul7EK.md │ │ │ │ │ ├── web-sockets@UQ8N7gcVpRLAYXgUNHBt5.md │ │ │ │ │ ├── webhooks-vs-polling@75NVxS0iwoQXxOHCkWQxH.md │ │ │ │ │ └── what-are-apis@r8M3quACGO2piu0u_R4hO.md │ │ │ │ └── faqs.astro │ │ │ ├── aspnet-core/ │ │ │ │ ├── aspnet-core.json │ │ │ │ ├── aspnet-core.md │ │ │ │ ├── content/ │ │ │ │ │ ├── activemq@sNYYEBMHV_NO_NToP51VY.md │ │ │ │ │ ├── api-clients-and-communication@GLkDH0X0uy8_1DIdCzbUD.md │ │ │ │ │ ├── app-settings-and-configs@EJxliq-HPVp00CVsFc6kf.md │ │ │ │ │ ├── aspnet-core-basics@v2ZTCQQFQPoJNhOVGMG2g.md │ │ │ │ │ ├── autofac@gbpSbjF12dBE1Tb3PX8Bz.md │ │ │ │ │ ├── autofixture@K49M_7gSpfJuZaE6WaHxQ.md │ │ │ │ │ ├── automapper@GPmlueMnuLCUW_t4jvGhc.md │ │ │ │ │ ├── azure-pipelines@_-GQNpsb7KZw76hNNOq3h.md │ │ │ │ │ ├── azure-service-bus@gBuaVZfqJ0-g21sKohQtx.md │ │ │ │ │ ├── benchmarknet@9LEVN-uVEwxJooEiB9ApK.md │ │ │ │ │ ├── blazor@4iD_hDtgJ15IlJGxiO-E8.md │ │ │ │ │ ├── bogus@QERTjawqCCCkHfR44Ca0s.md │ │ │ │ │ ├── c@fxANnSiTb2VzA9u-YeBL1.md │ │ │ │ │ ├── caching@7Nth4LOrM_KirhvjDGkgS.md │ │ │ │ │ ├── cassandra@U_-Gt5csu_hihl7ybFY-B.md │ │ │ │ │ ├── change-tracker-api@wfEOvAkGXkTZGdGX341D4.md │ │ │ │ │ ├── ci--cd@KIFmahcNiSo2NGoLtAyRR.md │ │ │ │ │ ├── circle-ci@KyGjXgG6JFo42qOV0wqfB.md │ │ │ │ │ ├── cloud@LrjmJs6_rXUkc2A7fEq24.md │ │ │ │ │ ├── code-first--migrations@ZPeebwJ3OBuywEgLLgQTG.md │ │ │ │ │ ├── constraints@1-XdtrGPbUoxpu9ZcQlBA.md │ │ │ │ │ ├── coravel@p3bZnKIyRgLmB764Kkhju.md │ │ │ │ │ ├── cosmos-db@KrkV1w9b_Nwm6pe9diDRS.md │ │ │ │ │ ├── couchdb@vHcwt6ARi5YR3v-eDDjfl.md │ │ │ │ │ ├── cypress@f2UP2jDnDr7XEFIdAtBhH.md │ │ │ │ │ ├── dapper@UkWc41r0bZ1lptjse3As6.md │ │ │ │ │ ├── dapr@IHY9uL3dzYmf2D2wWgIh-.md │ │ │ │ │ ├── data-structures-and-algorithms@RAX2xN37taw9cqA3pnORh.md │ │ │ │ │ ├── database-design-basics@zlAcgLKxGF_TyrcJIk4X7.md │ │ │ │ │ ├── database-fundamentals@tnKUdsgp6bnFtQTexEmfy.md │ │ │ │ │ ├── databases@Ujzn_dILCA7xoupnz398l.md │ │ │ │ │ ├── dependency-injection@IejHMMVKwA0sIInla4FjX.md │ │ │ │ │ ├── di-containers@iM760f8Ys66-VSkMiZfIX.md │ │ │ │ │ ├── distributed-cache@SiG0FWWznjDg-2mIWlchy.md │ │ │ │ │ ├── distributed-lock@T2FsSndxzSuKTFdjoyPi-.md │ │ │ │ │ ├── docker@rmRESzLiZNWdBFXLrwQFJ.md │ │ │ │ │ ├── dynamo-db@1Om9aQDZmnj_DN10ogwDL.md │ │ │ │ │ ├── easynetq@X6iSHoHnFFMaGb6YPQFhl.md │ │ │ │ │ ├── elastic-search@mK9OAwjReZoQZr1WSLRKJ.md │ │ │ │ │ ├── entity-framework-2nd-level-cache@FV4GsPjUyAc99DnIwkkCC.md │ │ │ │ │ ├── entity-framework-core@ET74_7ieahNaGdPT11_NI.md │ │ │ │ │ ├── fakeiteasy@diRJ_F6kx42Ucs0fxidtZ.md │ │ │ │ │ ├── filters-and-attributes@U3HXmNq6x2YA3BwZsOTbe.md │ │ │ │ │ ├── fluentvalidation@sa0zXd8lpNs_SFQ2y-PY4.md │ │ │ │ │ ├── fluid@ZaOhWWDgVxrn0hbesJ7xT.md │ │ │ │ │ ├── framework-basics@eGVaAz3VhGu3cXBNxTAWd.md │ │ │ │ │ ├── frameworks@1YL7aXluINOO15W3waaiD.md │ │ │ │ │ ├── general-development-skills@NEnna_8DstfYH4T9qrP3-.md │ │ │ │ │ ├── git---version-control@OtdCmkj0SvrGwCUSfm96C.md │ │ │ │ │ ├── github-actions@0-PLMXGlRyRzTk-EjXMs2.md │ │ │ │ │ ├── github-gitlab-bitbucket@KAZF-mIg-FlfMonfdOLhb.md │ │ │ │ │ ├── gitlab-cicd@8Y73Ae32eo6_ye7dw5QRQ.md │ │ │ │ │ ├── graphql-net@Efxu9gDodODMTKJbWcXzB.md │ │ │ │ │ ├── graphql@BdTQ5ZMNDNZvkAUoCfL5H.md │ │ │ │ │ ├── gridlify@w5RnrhsP4p-AdSOLYVAY9.md │ │ │ │ │ ├── grpc@x3SJlLc19DNJ-PyDOOj_G.md │ │ │ │ │ ├── hangfire@QiQsx1udyKcPJ-lZjRQVy.md │ │ │ │ │ ├── hotchocolate@XMrQx9JH0eSQJpMzhvy0F.md │ │ │ │ │ ├── http--https-protocol@YI3cAezupWNntFw4B6elY.md │ │ │ │ │ ├── kafka@L8RkeMYm0WGNeLLcHKF1R.md │ │ │ │ │ ├── kubernetes@02rtFStTeIm8prNskxaUN.md │ │ │ │ │ ├── lazy-eager-explicit-loading@9AMotSwdEbB8uOg80SykE.md │ │ │ │ │ ├── learn-the-basics-of-c@NvODRFR0DLINB0RlPSsvt.md │ │ │ │ │ ├── life-cycles@Tjaczp2E-cCn0qSv89xgo.md │ │ │ │ │ ├── light-bdd@aWRv5sU9dksgcpE9RGJb1.md │ │ │ │ │ ├── litedb@3gcXaOnHL4v5OoStrTWNV.md │ │ │ │ │ ├── log-frameworks@fQ3w8REYWzQfeJ0nPyq6W.md │ │ │ │ │ ├── manual-mapping@oMMBzRrHkUymxAR4oqr75.md │ │ │ │ │ ├── mapperly@x0OopRTwIvoWgT8qi0CE9.md │ │ │ │ │ ├── mariadb@Gs8XcsTo11MeCsiSGpjkU.md │ │ │ │ │ ├── marten@ipb6proIZKG-_vCOMAiBu.md │ │ │ │ │ ├── mass-transit@SQKIUa_UsJ4cls-Vs9yHU.md │ │ │ │ │ ├── mediatr@cc0UNQwbDlySue-CvpChR.md │ │ │ │ │ ├── memcached@u2pc3ZkL0EumAsbM12D5y.md │ │ │ │ │ ├── memory-cache@8CRsr7UZszjc_fZ-4ZmIx.md │ │ │ │ │ ├── microservices@37c2eCvRdebztkbc5AjYp.md │ │ │ │ │ ├── microsoftextensions@J9XdYLo7qJiBoL8p3c68P.md │ │ │ │ │ ├── middlewares@dG--AAcZZdltYCeg6zCz2.md │ │ │ │ │ ├── minimal-apis@ipABerBcM9zCte9pYaIse.md │ │ │ │ │ ├── mongodb@-wYRa8qSuKVKo_yOTKV67.md │ │ │ │ │ ├── moq@eyOXWb1kL80Wqiwc2WHd_.md │ │ │ │ │ ├── mstest@236VJJjMvqHfSj-MHSDPV.md │ │ │ │ │ ├── mvc@D3aQw0-pk3ycO-n10HBaA.md │ │ │ │ │ ├── mysql@WsGwg4qdlu_vBsFEpmBvU.md │ │ │ │ │ ├── native-background-service@uP1nqbmFmZL_wA2DoqP8C.md │ │ │ │ │ ├── net-aspire@HqhqqiA5X00Xl1RnZgrNJ.md │ │ │ │ │ ├── net-aspire@Ohc0xzI6qX4hOFVNfRj1F.md │ │ │ │ │ ├── net-cli@6HJQ1Evgah0Pki04Z2hQt.md │ │ │ │ │ ├── net-maui@olqSPUU3RoxhQ6exfMzeN.md │ │ │ │ │ ├── net@3GGvuxdfuDwLpNX_gtjCK.md │ │ │ │ │ ├── netmq@8d4f7_3VO03vy7YDWwPI9.md │ │ │ │ │ ├── nhibernate@z24IJndpQYTl1PhiUI2mx.md │ │ │ │ │ ├── nlog@ykF2bB_68AhCOzeQ_QSW1.md │ │ │ │ │ ├── nosql@WUis4K9vduriYdVkKvM9r.md │ │ │ │ │ ├── nservicebus@vf8W1FLhcb3awx4JBaY5r.md │ │ │ │ │ ├── nsubstitute@iZCxinqlVefBk5-ICqt4v.md │ │ │ │ │ ├── nuke@EsC1JwFOMOlQVelpmxISh.md │ │ │ │ │ ├── nunit@qHYBlBCvCGUZGh6gyEI63.md │ │ │ │ │ ├── object-mapping@9ECykIIvXlDblbFbRVcJS.md │ │ │ │ │ ├── object-relational-mapping@POQPoN98eqOH2873ZI6Hm.md │ │ │ │ │ ├── ocelot@2k-rGuhYTTAR9XN3aDAnW.md │ │ │ │ │ ├── odata@YojZ5fpzw-5WgoqqkO6wl.md │ │ │ │ │ ├── orleans@XKsLqDDco5OXKURCcWAmv.md │ │ │ │ │ ├── playwright@AtyL0ij8FeJCBmqG2YvTO.md │ │ │ │ │ ├── polly@gQhiEpvx__70N1WbEHGYJ.md │ │ │ │ │ ├── postgresql@An9TLvo-I6NtC8wFU3bh4.md │ │ │ │ │ ├── puppeteer@UCpoLiQJ4LeniI9x3uGcY.md │ │ │ │ │ ├── quartz@zOWlPXIl4XPs_0pA8-yi5.md │ │ │ │ │ ├── rabbitmq@KqvBn2_wvYhFdv0dBZMC9.md │ │ │ │ │ ├── razor-components@vePinRjDfSGULKw0LE9K-.md │ │ │ │ │ ├── razor-pages@qpVxwuyA2oE06MZLtEdP1.md │ │ │ │ │ ├── razor@nUE2-egUMNFQoPVrVRFPl.md │ │ │ │ │ ├── real-time-communication@9Vv3OxafB6BlHhi1ZkeVO.md │ │ │ │ │ ├── redis@Ts0gJ4DdwFp48LGr4YSvM.md │ │ │ │ │ ├── relational@FnRxRY3uDZdTve1w-nBfc.md │ │ │ │ │ ├── repodb@tYDVcnG0oUF3R8DwASvAh.md │ │ │ │ │ ├── respawn@TCswZHviRiu6SIOwUisu8.md │ │ │ │ │ ├── rest@KJCtxH3mYsZq3hfBZ6cJF.md │ │ │ │ │ ├── rest@dZ9fYWMBa1OemTmLOI8_q.md │ │ │ │ │ ├── scalar@Zb4Gugxf7d6MoeEcfngrV.md │ │ │ │ │ ├── scoped@M3BW_63MFQyD8NE68dazD.md │ │ │ │ │ ├── scriban@dWB5OCvWVYkD30Op_dMwy.md │ │ │ │ │ ├── scrutor@f212ztDU_kb7gO71Nn76L.md │ │ │ │ │ ├── search-engines@6p5atMYw3b3bXkQuXZsDV.md │ │ │ │ │ ├── serilog@xL0s4-HfRxNy2ru0jiIWR.md │ │ │ │ │ ├── shouldly@zhn-VLGPfV6FZT2OMl6zf.md │ │ │ │ │ ├── signalr-core@8dvd4M0TKNyQR8dEolGNT.md │ │ │ │ │ ├── singleton@y9bDrCjkDbxSIrEEtu_Mi.md │ │ │ │ │ ├── solr@2sY_p_8cOOBmZtDHO2Cmy.md │ │ │ │ │ ├── specflow@9WZmjiFowydYrkHQ2xeNm.md │ │ │ │ │ ├── sphinx@Ye9WHfwZa-Fc2YDaTCmU1.md │ │ │ │ │ ├── sql-basics@aOJMVrTcA_I2y_QHzj7aM.md │ │ │ │ │ ├── sql-server@HQHSzsqBGSVYNLQ9o5EI-.md │ │ │ │ │ ├── steeltoe@s8evqe2MireS1UhxoXrd1.md │ │ │ │ │ ├── stored-procedures@ZiK-c9zNbi5RZkKUi44wP.md │ │ │ │ │ ├── stylecop-rules@R7Qk5hsEIl9dspQXdaJAJ.md │ │ │ │ │ ├── task-scheduling@s57tKy1rajlJbKFDVXLqs.md │ │ │ │ │ ├── template-engines@C85aJvrzj6rP2Hmfj9uPB.md │ │ │ │ │ ├── test-containers@8eW5BaOjJbnQ7uk4zMOiU.md │ │ │ │ │ ├── testing@XofWWhlU_vWCG5oXVMZze.md │ │ │ │ │ ├── transient@-N0XM0-VtCZ6QMo2YyMD-.md │ │ │ │ │ ├── triggers@2f_CJMnXwPxjMEwm5P_QJ.md │ │ │ │ │ ├── web-sockets@tBl8neu3tJd5GPwGfJbjZ.md │ │ │ │ │ ├── webapplicationfactory@Xx5G09n4WWnnydCgxnL0A.md │ │ │ │ │ ├── xunit@R8C6s53RYjkRVma0nCJpy.md │ │ │ │ │ └── yarp@2axfolu26P8XwxMxgMaS3.md │ │ │ │ ├── faqs.astro │ │ │ │ └── migration-mapping.json │ │ │ ├── aws/ │ │ │ │ ├── aws.json │ │ │ │ ├── aws.md │ │ │ │ ├── content/ │ │ │ │ │ ├── amis@AfagmWcllSi81D2XIQz0V.md │ │ │ │ │ ├── api-gateway@T0dvezPWX6rAiKweT0TkG.md │ │ │ │ │ ├── assuming-roles@0IMdO7g_5El1elvDXJJ_0.md │ │ │ │ │ ├── auto-scaling-groups@gBKHVG7FvlCEgINKmw00s.md │ │ │ │ │ ├── auto-scaling@dOAZG-NbjWiVdPKYEhWxj.md │ │ │ │ │ ├── aws-global-infrastructure@z9R1BWUGalmnw0E7QqiW6.md │ │ │ │ │ ├── backup--restore@NWvasq-AcwxmOKZPDv3ue.md │ │ │ │ │ ├── backup--restore@tBKc7tHOiJaTmwEl3q--Y.md │ │ │ │ │ ├── bucket--object-lifecycle@8i6zpjkMC_Pg-tDNmrx4n.md │ │ │ │ │ ├── buckets--objects@rTgjDj5HqbjRpcJ7PR-EC.md │ │ │ │ │ ├── capacity-settings@KtXww9J0znwzTwL7GKfaY.md │ │ │ │ │ ├── cidr-blocks@2hFBv2fhKDYBN-9ITs82J.md │ │ │ │ │ ├── cloudfront@zFgnu2fL0EUKIMz9tVH1j.md │ │ │ │ │ ├── cloudwatch@VAYxwJH10PFjGS8poKd9-.md │ │ │ │ │ ├── clusters--ecs-container-agents@PphzNicIJawVElmY5rn8f.md │ │ │ │ │ ├── cold-start-and-limitations@EuOv19jDSj56Cy7PqvtNv.md │ │ │ │ │ ├── configuration-sets@4svXYQYmqjUZU39z8OyhD.md │ │ │ │ │ ├── cpu-credits@_U2bKjxIrAAk7TMrPttpb.md │ │ │ │ │ ├── creating--invoking-functions@SdCNevKjyhFcreMSWY6BT.md │ │ │ │ │ ├── custom-runtimes@KWjIAakMIlxn_jso22h0M.md │ │ │ │ │ ├── data-modeling@aU1lv80xXNkQTD41Qfln5.md │ │ │ │ │ ├── db-instances@l9oq3LiEd8ZrPtupPk-Fn.md │ │ │ │ │ ├── dedicated-ip@pnX1dfkjS8woWc4KGXlh_.md │ │ │ │ │ ├── distributions@fAK7GRKunmoidlD32OBma.md │ │ │ │ │ ├── dkim-setup@zwVd1vNm1ks6MdHZoi-5W.md │ │ │ │ │ ├── dynamodb-local@yauCWo1VoG-X483-4mfdn.md │ │ │ │ │ ├── dynamodb@wGb0TEDnSe_bmv9Krx4qB.md │ │ │ │ │ ├── ec2@cL7vis8H5L2vv6LqJ5wvC.md │ │ │ │ │ ├── ecr@_c_Wq84yIu4ac7e0RzDtC.md │ │ │ │ │ ├── ecs@EqUT0wpdPRDGtGAZ7nneY.md │ │ │ │ │ ├── eks@kvHzEDZQV72AUjqisg8PB.md │ │ │ │ │ ├── elastic-ip@DCvkZSp25pjaimG0THLTu.md │ │ │ │ │ ├── elastic-load-balancers@YAZPKMbmrxYNqF6alXMyL.md │ │ │ │ │ ├── elasticache@9TcYdsdmvKWWHoyE6uNbC.md │ │ │ │ │ ├── event-bridge--scheduled-execution@0CUfDEMwCwSHVdqkP8lOG.md │ │ │ │ │ ├── events@tHQ6NRVDPCPEOmzgjQDLX.md │ │ │ │ │ ├── fargate@OI8y54RhFpfS_l1L9VTZe.md │ │ │ │ │ ├── feedback-handling@0NWTFssjg9SbDXQRkN5kF.md │ │ │ │ │ ├── general-purpose@uo5HIyePegnJooortvWLu.md │ │ │ │ │ ├── glacier@IikKYP58sT2H1lM8glm-g.md │ │ │ │ │ ├── health-checks@LXG_znJ3XzPAlDxUH2-Xp.md │ │ │ │ │ ├── hosted-zones@z-o-2cGYSM6KW_CNJyw3p.md │ │ │ │ │ ├── iaas-vs-paas-vs-saas@i4ijY3T5gLgNz0XqRipXe.md │ │ │ │ │ ├── iam@xmKeB4hEi2DunmhAsvS1X.md │ │ │ │ │ ├── identity-based@cwGuOrmbSTcSoH80skLTk.md │ │ │ │ │ ├── identity-verification@bTCVHXPG-LtaaFmgiB2SL.md │ │ │ │ │ ├── instance-profiles@i7X1GfOx5AZYFskepW4Zr.md │ │ │ │ │ ├── instance-types@VHD2ISW9WoSWjp8Hh6Zft.md │ │ │ │ │ ├── internet-gateway@Le8yOJzpzxH1xgd7XEU2B.md │ │ │ │ │ ├── introduction-to-aws@Dg1v9TV-wGSNLPfAals_y.md │ │ │ │ │ ├── introduction@Py9nst2FDJ1_hoXeX_qSF.md │ │ │ │ │ ├── invalidations@hRXbAADgRTXEFwbBXeNu7.md │ │ │ │ │ ├── keypairs@wFT-fddGn__DRoqG0joFk.md │ │ │ │ │ ├── lambda@741vsAPTXJLVUlazFg0q4.md │ │ │ │ │ ├── lambdaedge@5SF5nO94NFDkHY8UJoeAY.md │ │ │ │ │ ├── launch-config--autoscaling-groups@1r2FL3OEOh0S9ee0OVnrN.md │ │ │ │ │ ├── launch-templates@K0GCk5_HDvP0_ZqsUc3tG.md │ │ │ │ │ ├── layers@CL93C0NGFQmScVnftnRtO.md │ │ │ │ │ ├── limits@0ctJa-V6aenimSr5h303J.md │ │ │ │ │ ├── logs@oC6KIjWAXw0hLl4FwkB9F.md │ │ │ │ │ ├── magnetic@y0CoNcEFHyz350f7pNddt.md │ │ │ │ │ ├── metrics@2vQPmVNk1QpMM-15RKG8b.md │ │ │ │ │ ├── nat-gateway@6D-gs32jrCyvMVhr9PSAY.md │ │ │ │ │ ├── policies@dO9ZfUyNia7L_fCh4d0n7.md │ │ │ │ │ ├── policies@eQAn3e-k9WNufPqOnwY_K.md │ │ │ │ │ ├── primary-keys--secondary-indexes@oWtWgaFznTPJhQIyfIIQf.md │ │ │ │ │ ├── private-subnet@ymuURDwW8JG3NSIXcl0FL.md │ │ │ │ │ ├── provisioned-iops@3l1ji4JToj277vpgONmLw.md │ │ │ │ │ ├── public-subnet@ABCH1rATHmecyWHyK3n-m.md │ │ │ │ │ ├── public-vs-private-vs-hybrid-cloud@3hatcMVLDbMuz73uTx-9P.md │ │ │ │ │ ├── purchasing-options@8v9T6Y6JC7qaqIgkbT-nr.md │ │ │ │ │ ├── quotas@PYgs4niQRlLKCBMfM4qf9.md │ │ │ │ │ ├── rds@fkMF-2PQZ00UdwxhQt1ds.md │ │ │ │ │ ├── resource-based@v_YmmlOk-DkzJ8mI5Ftgr.md │ │ │ │ │ ├── roles@7nI202hX41mI5ms9LZonh.md │ │ │ │ │ ├── route-tables@FCdOnwQubhOnCFFnF8uJN.md │ │ │ │ │ ├── route53@f89qL7Cg9R_LTxBEG4jUK.md │ │ │ │ │ ├── routing-policies@IQhPG1La7dZeSXnX23D1n.md │ │ │ │ │ ├── s3-ia@JlkLNQ8wRzGkjaootNKOD.md │ │ │ │ │ ├── s3@PN3xAYfQ-_QgZCRCnsEca.md │ │ │ │ │ ├── sandbox--sending-limits@kG7tlZjv_hJbHGooBkxS0.md │ │ │ │ │ ├── scaling-policies@fRBaiw8Qx8kapzCphmM4v.md │ │ │ │ │ ├── security-groups@Cd9gdbkCFdrTLrnJMy5F3.md │ │ │ │ │ ├── sender-reputation@Vo_PBfB7LxYL27nBBVoVp.md │ │ │ │ │ ├── services@zSiSbIdBgFLBBAnp4I9vX.md │ │ │ │ │ ├── ses@-bwXo6xvF1yzyWEm5oZhJ.md │ │ │ │ │ ├── shared-responsibility-model@0flGtxZmxQKxO3c3sguwp.md │ │ │ │ │ ├── standard@Ll5FPCtkpYq_niJd7WoTC.md │ │ │ │ │ ├── storage--volumes@A0u7CJwj5ULAMiAm12vZI.md │ │ │ │ │ ├── storage-types@PJaAqax4fABnkObY5UwNp.md │ │ │ │ │ ├── storage-types@Xs057ESpvxXg2r_rDQnOa.md │ │ │ │ │ ├── streams@0C3GCGdSXozJK2MNeWerg.md │ │ │ │ │ ├── subnets@Y64TE0U20kllmykjdfhHp.md │ │ │ │ │ ├── tables--items--attributes@DN_iuLo9gYDqU8JleE1WJ.md │ │ │ │ │ ├── tasks@1lHXxpoF11yE3rfoQCbTG.md │ │ │ │ │ ├── user-data-scripts@ZKjjgXZ89zV2atWcSal-s.md │ │ │ │ │ ├── users--user-groups@Nn2zawk6A31NwZa40jOhX.md │ │ │ │ │ ├── versioning--aliases@75ZjuGozDfoZPLj32P2t2.md │ │ │ │ │ ├── vpc@Sv2aT8eI1RvJhvoKVYQEX.md │ │ │ │ │ ├── well-architected-framework@eKuC7VmkGVYFnbC2Rvn8D.md │ │ │ │ │ └── what-is-cloud-computing@74JxgfJ_1qmVNZ_QRp9Ne.md │ │ │ │ ├── faqs.astro │ │ │ │ └── migration-mapping.json │ │ │ ├── backend/ │ │ │ │ ├── backend-beginner.json │ │ │ │ ├── backend.json │ │ │ │ ├── backend.md │ │ │ │ ├── content/ │ │ │ │ │ ├── acid@qSAdfaGUfn8mtmDjHJi3z.md │ │ │ │ │ ├── agents@w1D3-bSg93ndKK9XJTu7z.md │ │ │ │ │ ├── ai-assisted-coding@fA3yi9puMbTFmbPpo6OjN.md │ │ │ │ │ ├── ai-vs-traditional-coding@IZKl6PxbvgNkryAkdy3-p.md │ │ │ │ │ ├── ai-vs-traditional-techniques@IZKl6PxbvgNkryAkdy3-p.md │ │ │ │ │ ├── anthropic@Lw2nR7x8PYgq1P5CxPAxi.md │ │ │ │ │ ├── antigravity@E7-LveK7jO2npxVTLUDfw.md │ │ │ │ │ ├── apache@jjjonHTHHo-NiAf6p9xPv.md │ │ │ │ │ ├── applications@Nx7mjvYgqLpmJ0_iSx5of.md │ │ │ │ │ ├── architectural-patterns@tHiUpG9LN35E5RaHddMv5.md │ │ │ │ │ ├── authentication@PY9G7KQy8bF6eIdr1ydHf.md │ │ │ │ │ ├── aws-neptune@5xy66yQrz1P1w7n6PcAFq.md │ │ │ │ │ ├── backpressure@JansCqGDyXecQkD1K7E7e.md │ │ │ │ │ ├── base@QZwTLOvjUTaSb_9deuxsR.md │ │ │ │ │ ├── basic-authentication@yRiJgjjv2s1uV9vgo3n8m.md │ │ │ │ │ ├── bcrypt@dlG1bVkDmjI3PEGpkm1xH.md │ │ │ │ │ ├── bitbucket@Ry_5Y-BK7HrkIc6X0JG1m.md │ │ │ │ │ ├── browsers-and-how-they-work@P82WFaTPgQEPNp5IIuZ1Y.md │ │ │ │ │ ├── building-for-scale@SHmbcMRsc3SygEDksJQBD.md │ │ │ │ │ ├── c@rImbMHLLfJwjf3l25vBkc.md │ │ │ │ │ ├── caching@ELj8af7Mi38kUbaPJfCUR.md │ │ │ │ │ ├── caching@uPjCrDGA2MHylWXbZvMBM.md │ │ │ │ │ ├── caddy@Op-PSPNoyj6Ss9CS09AXh.md │ │ │ │ │ ├── cap-theorem@LAdKDJ4LcMaDWqslMvE8X.md │ │ │ │ │ ├── cassandra@gT6-z2vhdIQDzmR2K1g1U.md │ │ │ │ │ ├── cassandra@zsiZLWJ2bMvrjuHch5fX_.md │ │ │ │ │ ├── cdn@Nq2BO53bHJdFT1rGZPjYx.md │ │ │ │ │ ├── ci--cd@mGfD7HfuP184lFkXZzGjG.md │ │ │ │ │ ├── circuit-breaker@spkiQTPvXY4qrhhVUkoPV.md │ │ │ │ │ ├── claude-code@RcC1fVuePQZ59AsJfeTdR.md │ │ │ │ │ ├── clickhouse@ZyGLSvx17p7QmYDy1LFbM.md │ │ │ │ │ ├── client-side@KWTbEVX_WxS8jmSaAX3Fe.md │ │ │ │ │ ├── code-reviews@0TMdly8yiqnNR8sx36iqc.md │ │ │ │ │ ├── containerization-vs-virtualization@SGVwJme-jT_pbOTvems0v.md │ │ │ │ │ ├── cookie-based-auth@ffzsh8_5yRq85trFt9Xhk.md │ │ │ │ │ ├── copilot@HQrxxDxKN8gizvXRU5psW.md │ │ │ │ │ ├── cors@LU6WUbkWKbPM1rb2_gEqa.md │ │ │ │ │ ├── couchdb@qOlNzZ7U8LhIGukb67n7U.md │ │ │ │ │ ├── cqrs@u8IRw5PuXGUcmxA0YYXgx.md │ │ │ │ │ ├── csp@HgQBde1zLUFtlwB66PR6_.md │ │ │ │ │ ├── css@utA1W2O6pzoV_LbtDE5DN.md │ │ │ │ │ ├── cursor@CKlkVK_7GZ7xzIUHJqZr8.md │ │ │ │ │ ├── data-replication@wrl7HHWXOaxoKVlNZxZ6d.md │ │ │ │ │ ├── database-indexes@y-xkHFE9YzhNIX3EiWspL.md │ │ │ │ │ ├── design-and-development-principles@9Fpoor-Os_9lvrwu5Zjh-.md │ │ │ │ │ ├── dgraph@GKrcTsUi5XWj_pP1TOK0S.md │ │ │ │ │ ├── dns-and-how-it-works@hkxw9jPGYphmjhTjw8766.md │ │ │ │ │ ├── documentation-generation@q7NpwqQXUp4wt2to-yFiP.md │ │ │ │ │ ├── domain-driven-design@BvHi5obg0L1JDZFKBzx9t.md │ │ │ │ │ ├── dynamodb@dwfEHInbX2eFiafM-nRMX.md │ │ │ │ │ ├── elasticsearch@NulaE1isWqn-feYHg4YQT.md │ │ │ │ │ ├── embeddings@Ofv__kXuBk-Vv2jVhaFss.md │ │ │ │ │ ├── event-sourcing@wqE-mkxvehOzOv8UyE39p.md │ │ │ │ │ ├── failure-modes@GwApfL4Yx-b5Y8dB9Vy__.md │ │ │ │ │ ├── firebase@RyJFLLGieJ8Xjt-DlIayM.md │ │ │ │ │ ├── frontend-basics@oyg5g4-cY5EBEUgVkjnL3.md │ │ │ │ │ ├── function-calling@Uve-UObgOBfrd-cLayVWe.md │ │ │ │ │ ├── functional-testing@NAGisfq2CgeK3SsuRjnMw.md │ │ │ │ │ ├── gemini@Bic4PHhz-YqzPWRimJO83.md │ │ │ │ │ ├── git@_I1E__wCIVrhjMk6IMieE.md │ │ │ │ │ ├── github@ptD8EVqwFUYr4W5A_tABY.md │ │ │ │ │ ├── gitlab@Wcp-VDdFHipwa7hNAp1z_.md │ │ │ │ │ ├── go@BdXbcz4-ar3XOX0wIKzBp.md │ │ │ │ │ ├── gof-design-patterns@6XIWO0MoE-ySl4qh_ihXa.md │ │ │ │ │ ├── graceful-degradation@G9AI_i3MkUE1BsO3_-PH7.md │ │ │ │ │ ├── graphql@zp3bq38tMnutT2N0tktOW.md │ │ │ │ │ ├── grpc@J-TOE2lT4At1mSdNoxPS1.md │ │ │ │ │ ├── hateoas@dLY0KafPstajCcSbslC4M.md │ │ │ │ │ ├── how-does-the-internet-work@yCnn-NfSxIybUQ2iTuUGq.md │ │ │ │ │ ├── how-llms-work@tUNP5VRKvrPcufPDPPEo8.md │ │ │ │ │ ├── html@9-pCsW650T1mfj5dmRB9L.md │ │ │ │ │ ├── http-caching@KWTbEVX_WxS8jmSaAX3Fe.md │ │ │ │ │ ├── https@x-WBJjBd8u93ym5gtxGsR.md │ │ │ │ │ ├── influx-db@XbM4TDImSH-56NsITjyHK.md │ │ │ │ │ ├── instrumentation@4X-sbqpP0NDhM99bKdqIa.md │ │ │ │ │ ├── integration-patterns@iatQ3RCxESHt1CwN3PSfx.md │ │ │ │ │ ├── integration-testing@381Kw1IMRv7CJp-Uf--qd.md │ │ │ │ │ ├── internet@SiYUdtYMDImRPmV2_XPkH.md │ │ │ │ │ ├── introduction@SiYUdtYMDImRPmV2_XPkH.md │ │ │ │ │ ├── java@ANeSwxJDJyQ-49pO2-CCI.md │ │ │ │ │ ├── javascript@8-lO-v6jCYYoklEJXULxN.md │ │ │ │ │ ├── javascript@An2lMuJEkkpL0cfw4RrSl.md │ │ │ │ │ ├── json-apis@sNceS4MpSIjRkWhNDmrFg.md │ │ │ │ │ ├── jwt@UxS_mzVUjLigEwKrXnEeB.md │ │ │ │ │ ├── kafka@VoYSis1F1ZfTxMlQlXQKB.md │ │ │ │ │ ├── learn-about-apis@EwvLPSI6AlZ4TnNIJTZA4.md │ │ │ │ │ ├── learn-about-web-servers@fekyMpEnaGqjh1Cu4Nyc4.md │ │ │ │ │ ├── learn-the-basics@UTupdqjOyLh7-56_0SXJ8.md │ │ │ │ │ ├── loadshifting@HoQdX7a4SnkFRU4RPQ-D5.md │ │ │ │ │ ├── long--short-polling@osvajAJlwGI3XnX0fE-kA.md │ │ │ │ │ ├── long-polling@osvajAJlwGI3XnX0fE-kA.md │ │ │ │ │ ├── lxc@31ZlpfIPr9-5vYZqvjUeL.md │ │ │ │ │ ├── mariadb@tD3i-8gBpMKCHB-ITyDiU.md │ │ │ │ │ ├── mcp@mHnI19RgZ57XDEIDaHxD0.md │ │ │ │ │ ├── md5@jWwA6yX4Zjx-r_KpDaD3c.md │ │ │ │ │ ├── memcached@xPvVwGQw28uMeLYIWn8yn.md │ │ │ │ │ ├── message-brokers@nJ5FpFgGCRaALcWmAKBKT.md │ │ │ │ │ ├── microservices@K55h3aqOGe6-hgVhiFisT.md │ │ │ │ │ ├── migration-strategies@f7iWBkC0X7yyCoP_YubVd.md │ │ │ │ │ ├── migrations@MOLAXgs0CMCT7o84L0EaK.md │ │ │ │ │ ├── migrations@MOLAXgs0CMCT7o84L0EaK.md.md │ │ │ │ │ ├── mongodb@28U6q_X-NTYf7OSKHjoWH.md │ │ │ │ │ ├── monitoring@QvMEEsXh0-rzn5hDGcmEv.md │ │ │ │ │ ├── monolith@Ke522R-4k6TDeiDRyZbbU.md │ │ │ │ │ ├── monolithic-apps@Ke522R-4k6TDeiDRyZbbU.md │ │ │ │ │ ├── more-about-databases@LJt27onEOeIBomiEMTyKd.md │ │ │ │ │ ├── ms-iis@0NJDgfe6eMa7qPUOI6Eya.md │ │ │ │ │ ├── ms-sql@dEsTje8kfHwWjCI3zcgLC.md │ │ │ │ │ ├── mysql@VPxOdjJtKAqmM5V0LR5OC.md │ │ │ │ │ ├── n1-problem@bQnOAu863hsHdyNMNyJop.md │ │ │ │ │ ├── neo4j@BTNJfWemFKEeNeTyENXui.md │ │ │ │ │ ├── nginx@z5AdThp9ByulmM9uekgm-.md │ │ │ │ │ ├── normalization@Ge2SnKBrQQrU-oGLz6TmT.md │ │ │ │ │ ├── nosql-databases@F8frGuv1dunOdcVJ_IiGs.md │ │ │ │ │ ├── oauth@vp-muizdICcmU0gN8zmkS.md │ │ │ │ │ ├── observability@Z01E67D6KjrShvQCHjGR7.md │ │ │ │ │ ├── open-api-specs@9cD5ag1L0GqHx4_zxc5JX.md │ │ │ │ │ ├── openai@-ye5ZtYFDoYGpj-UJaBP8.md │ │ │ │ │ ├── openid@z3EJBpgGm0_Uj3ymhypbX.md │ │ │ │ │ ├── oracle@h1SAjQltHtztSt8QmRgab.md │ │ │ │ │ ├── orms@Z7jp_Juj5PffSxV7UZcBb.md │ │ │ │ │ ├── owasp-risks@AAgciyxuDvS2B_c6FRMvT.md │ │ │ │ │ ├── php@l9Wrq_Ad9-Ju4NIB0m5Ha.md │ │ │ │ │ ├── pick-a-backend-language@2f0ZO6GJElfZ2Eis28Hzg.md │ │ │ │ │ ├── pick-a-language@2f0ZO6GJElfZ2Eis28Hzg.md │ │ │ │ │ ├── postgresql@FihTrMO56kj9jT8O_pO2T.md │ │ │ │ │ ├── profiling-perfor@SYXJhanu0lFmGj2m2XXhS.md │ │ │ │ │ ├── profiling-performance@SYXJhanu0lFmGj2m2XXhS.md │ │ │ │ │ ├── prompting-techniques@xL8d-uHMpJKwUvT8z-Jia.md │ │ │ │ │ ├── python@J_sVHsD72Yzyqb9KCIvAY.md │ │ │ │ │ ├── rabbitmq@GPFRMcY1DEtRgnaZwJ3vW.md │ │ │ │ │ ├── rags@6PCOCzCbx7jo9wO2Hl2gy.md │ │ │ │ │ ├── real-time-data@5XGvep2qoti31bsyqNzrU.md │ │ │ │ │ ├── redis@M0iaSSdVPWaCUpyTG50Vf.md │ │ │ │ │ ├── redis@g8GjkJAhvnSxXTZks0V1g.md │ │ │ │ │ ├── refactoring@EYT2rTLZ8tUW2u8DOnAWF.md │ │ │ │ │ ├── relational-databases@r45b461NxLN6wBODJ5CNP.md │ │ │ │ │ ├── repo-hosting-services@NvUcSDWBhzJZ31nzT4UlE.md │ │ │ │ │ ├── rest@lfNFDZZNdrB0lbEaMtU71.md │ │ │ │ │ ├── rethinkdb@5T0ljwlHL0545ICCeehcQ.md │ │ │ │ │ ├── ruby@SlH0Rl07yURDko2nDPfFy.md │ │ │ │ │ ├── rust@CWwh2abwqx4hAxpAGvhIx.md │ │ │ │ │ ├── saml@UCHtaePVxS-0kpqlYxbfC.md │ │ │ │ │ ├── scaling-databases@95d9itpUZ4s9roZN8kG9x.md │ │ │ │ │ ├── scrypt@kGTALrvCpxyVCXHRmkI7s.md │ │ │ │ │ ├── scylladb@aArZ3gKwObzafCkTOd-Hj.md │ │ │ │ │ ├── search-engines@gKTSe9yQFVbPVlLzWB0hC.md │ │ │ │ │ ├── server-security@TZ0BWOENPv6pQm8qYB8Ow.md │ │ │ │ │ ├── server-sent-events@RUSdlokJUcEYbCvq5FJBJ.md │ │ │ │ │ ├── server-side@z1-eP4sV75GBEIdM4NvL9.md │ │ │ │ │ ├── serverless@nkmIv3dNwre4yrULMgTh3.md │ │ │ │ │ ├── service-mesh@n14b7sfTOwsjKTpFC9EZ2.md │ │ │ │ │ ├── sha@JVN38r5jENoteia3YeIQ3.md │ │ │ │ │ ├── sharding-strategies@zWstl08R4uzqve4BdYurp.md │ │ │ │ │ ├── short-polling@Tt7yr-ChHncJG0Ge1f0Xk.md │ │ │ │ │ ├── skills@IWubGe3oquSj882QVnhLU.md │ │ │ │ │ ├── soa@tObmzWpjsJtK4GWhx6pwB.md │ │ │ │ │ ├── soap@sSNf93azjuyMzQqIHE0Rh.md │ │ │ │ │ ├── solr@iN_1EuIwCx_7lRBw1Io4U.md │ │ │ │ │ ├── sqlite@kdulE3Z_BdbtRmq6T2KmR.md │ │ │ │ │ ├── ssltls@0v3OsaghJEGHeXX0c5kqn.md │ │ │ │ │ ├── streaming@9f-aWi3_7USy4XpNzrTL6.md │ │ │ │ │ ├── structured-outputs@GMxPmyatxYmIPRFHfRAnr.md │ │ │ │ │ ├── telemetry@neVRtPjIHP_VG7lHwfah0.md │ │ │ │ │ ├── test-driven-development@I-PUAE2AzbEaUkW9vMaUM.md │ │ │ │ │ ├── testing@STQQbPa7PE3gbjMdL6P-t.md │ │ │ │ │ ├── throttling@qAu-Y4KI2Z_y-EqiG86cR.md │ │ │ │ │ ├── timescale@WiAK70I0z-_bzbWNwiHUd.md │ │ │ │ │ ├── timescaledb@WiAK70I0z-_bzbWNwiHUd.md │ │ │ │ │ ├── token-authentication@0rGj7FThLJZouSQUhnqGW.md │ │ │ │ │ ├── transactions@rq_y_OBMD9AH_4aoecvAi.md │ │ │ │ │ ├── twelve-factor-apps@8DmabQJXlrT__COZrDVTV.md │ │ │ │ │ ├── types-of-scaling@osQlGGy38xMcKLtgZtWaZ.md │ │ │ │ │ ├── unit-testing@3OYm6b9f6WOrKi4KTOZYK.md │ │ │ │ │ ├── vectors@yKNdBbahm_h81xdMDT-qx.md │ │ │ │ │ ├── version-control-systems@ezdqQW9wTUw93F6kjOzku.md │ │ │ │ │ ├── web-security@RBrIP5KbVQ2F0ly7kMfTo.md │ │ │ │ │ ├── web-servers@fekyMpEnaGqjh1Cu4Nyc4.md │ │ │ │ │ ├── websockets@sVuIdAe08IWJVqAt4z-ag.md │ │ │ │ │ ├── what-is-domain-name@ZhSuu2VArnzPDp6dPQQSC.md │ │ │ │ │ ├── what-is-hosting@aqMaEY8gkKMikiqleV5EP.md │ │ │ │ │ └── what-is-http@R12sArWVpbIs_PHxBqVaR.md │ │ │ │ ├── faqs.astro │ │ │ │ └── migration-mapping.json │ │ │ ├── backend-beginner/ │ │ │ │ └── content/ │ │ │ │ ├── acid@qSAdfaGUfn8mtmDjHJi3z.md │ │ │ │ ├── authentication@PY9G7KQy8bF6eIdr1ydHf.md │ │ │ │ ├── caching@ELj8af7Mi38kUbaPJfCUR.md │ │ │ │ ├── functional-testing@NAGisfq2CgeK3SsuRjnMw.md │ │ │ │ ├── git@_I1E__wCIVrhjMk6IMieE.md │ │ │ │ ├── github@ptD8EVqwFUYr4W5A_tABY.md │ │ │ │ ├── go@BdXbcz4-ar3XOX0wIKzBp.md │ │ │ │ ├── index.md │ │ │ │ ├── integration-testing@381Kw1IMRv7CJp-Uf--qd.md │ │ │ │ ├── javascript@8-lO-v6jCYYoklEJXULxN.md │ │ │ │ ├── json-apis@sNceS4MpSIjRkWhNDmrFg.md │ │ │ │ ├── jwt@UxS_mzVUjLigEwKrXnEeB.md │ │ │ │ ├── learn-about-apis@EwvLPSI6AlZ4TnNIJTZA4.md │ │ │ │ ├── more-about-databases@LJt27onEOeIBomiEMTyKd.md │ │ │ │ ├── n1-problem@bQnOAu863hsHdyNMNyJop.md │ │ │ │ ├── orms@Z7jp_Juj5PffSxV7UZcBb.md │ │ │ │ ├── pick-a-language@2f0ZO6GJElfZ2Eis28Hzg.md │ │ │ │ ├── postgresql@FihTrMO56kj9jT8O_pO2T.md │ │ │ │ ├── python@J_sVHsD72Yzyqb9KCIvAY.md │ │ │ │ ├── redis@g8GjkJAhvnSxXTZks0V1g.md │ │ │ │ ├── relational-databases@r45b461NxLN6wBODJ5CNP.md │ │ │ │ ├── repo-hosting-services@NvUcSDWBhzJZ31nzT4UlE.md │ │ │ │ ├── rest@lfNFDZZNdrB0lbEaMtU71.md │ │ │ │ ├── testing@STQQbPa7PE3gbjMdL6P-t.md │ │ │ │ ├── transactions@rq_y_OBMD9AH_4aoecvAi.md │ │ │ │ ├── unit-testing@3OYm6b9f6WOrKi4KTOZYK.md │ │ │ │ └── version-control-systems@ezdqQW9wTUw93F6kjOzku.md │ │ │ ├── bi-analyst/ │ │ │ │ ├── bi-analyst.json │ │ │ │ ├── bi-analyst.md │ │ │ │ ├── content/ │ │ │ │ │ ├── ab-testing@qKlo90-Cy8t_off5Qv8-6.md │ │ │ │ │ ├── accesibility@BiyrAHB34evej_0cnDzOa.md │ │ │ │ │ ├── accessibility@wtEzdO_ZNu9jHJrFS3CrG.md │ │ │ │ │ ├── accuracy@M1H3Fh09v8udCJIPSJPic.md │ │ │ │ │ ├── advanced-queries@-gbb16Wl--Rjx5aoM0krL.md │ │ │ │ │ ├── airflow@qnUHw2f2VmTPU3-NMnoLl.md │ │ │ │ │ ├── algorithmic-bias@_uLtsnyNNNRcz5A29Zpjl.md │ │ │ │ │ ├── analog-vs-digital-data@kb216tShKrRPWv7mE9sVa.md │ │ │ │ │ ├── apis@xQDGmVwUkrmGdviOdG8Hu.md │ │ │ │ │ ├── barplot@BUizLtQ7vpdyBRjS8KyIl.md │ │ │ │ │ ├── basic-machine-learning@ZGazuCNruu09bd7C-aSFC.md │ │ │ │ │ ├── basic-queries@TuBJ2yUz1c5KMRGVHdvU5.md │ │ │ │ │ ├── beyond-linear-regression@_QyIZ2_vH3e3yic5NTuak.md │ │ │ │ │ ├── bi-analyst-vs-other-roles@JFNCITtE1YtcYmLfGfF5T.md │ │ │ │ │ ├── bi-communities@X8U-NQD0rYqFr_xgDWL2s.md │ │ │ │ │ ├── bi-competitions@aTGsJj7Ntv5BWIzjaqvu_.md │ │ │ │ │ ├── bi-platforms@kpRqKLtAd3IO3nbs8Yxrh.md │ │ │ │ │ ├── bias-recognition@9aNVqEyygNGeicdce5X8b.md │ │ │ │ │ ├── building-your-portfolio@UIdwl_KLELI8xL2VxYJmX.md │ │ │ │ │ ├── business-acumen@OmhvVSTtzH5sxOIZRVYfQ.md │ │ │ │ │ ├── calculated-fields--measures@fFzCnLfZ_vSbhQjdAKLlJ.md │ │ │ │ │ ├── categorical-vs-numerical@yXz6MkU3-HnlkmRmYh-Ev.md │ │ │ │ │ ├── ccpa@IwnXDA-f3FHK4EEeFuToC.md │ │ │ │ │ ├── central-tendency@F-fC2JWOuEeDbOHH1O6EB.md │ │ │ │ │ ├── certifications@hqpFbDhAvyT9_4hcoSLhC.md │ │ │ │ │ ├── change-management@vDQF2oaybSewNu3EMs6zG.md │ │ │ │ │ ├── chart-categories@GVgfPajmSqIgFZ6u2I1tK.md │ │ │ │ │ ├── cloud-bi-ecosystem@zGU6DyEm6xEYf1_73cbjL.md │ │ │ │ │ ├── cloud-computing-basics@_KYKLd-RNhVy-Sn1A-G5j.md │ │ │ │ │ ├── cloud-data-warehouses@D94743lQ1fAerVSpJWXfP.md │ │ │ │ │ ├── cloud@WXk0-vebMUQC25he2lmbh.md │ │ │ │ │ ├── clv@OqHNW0PzIRsw7IBgh5U5Q.md │ │ │ │ │ ├── coherence@4U66ZrBZqg7-ckOTmxAQj.md │ │ │ │ │ ├── cohort-analysis@R2zg0Ql-RsnIkV5Gmc1vN.md │ │ │ │ │ ├── color-theory@SJGEkoTSPK2ck4IvaK6Gz.md │ │ │ │ │ ├── communication--storytelling@TBcLXYtKs7_j_h_m2pAyh.md │ │ │ │ │ ├── compliance-reporting@j-GXKpMnsVuUUUdRxAXLe.md │ │ │ │ │ ├── compliance-reporting@omvGuhou7_63k-Fwcc7Mu.md │ │ │ │ │ ├── conferences--webinars@UDF8wyYT8127wfFHcq37P.md │ │ │ │ │ ├── confidence-intervals@xgP3zIiSEr9dtYcCQikPb.md │ │ │ │ │ ├── correlation-analysis@ASHk2LOjlhwpwpWSRs_Bi.md │ │ │ │ │ ├── correlation-vs-causation@JXYmXAYuA-zxrkl4PRLQd.md │ │ │ │ │ ├── critical-thinking@NFKiPXrkjRre1yUZc27gl.md │ │ │ │ │ ├── csv@LcLfC6BiOxJAkk2p424wL.md │ │ │ │ │ ├── dashboard-design@KXhNou5nlekbSTfLYPs_8.md │ │ │ │ │ ├── dashboard-design@qvPTiDbsY5ol_K-BNLmzk.md │ │ │ │ │ ├── data-architectures@Zxuvc9F3bINLTdfbsx_S_.md │ │ │ │ │ ├── data-cleaning@Vo7LJ_W-DBvxvVrnz33BM.md │ │ │ │ │ ├── data-formats@GsZWvJPNzN6XLDp2G1db4.md │ │ │ │ │ ├── data-lake@iqpVtvoebAaoB_Dj9-gdw.md │ │ │ │ │ ├── data-lineage@F21ypKzpziLCXkiKG1S5Z.md │ │ │ │ │ ├── data-mart@5x4NfuP6dAgjISlB-esIW.md │ │ │ │ │ ├── data-modeling-for-bi@Dk31XtS7wWRzO31sdsEDo.md │ │ │ │ │ ├── data-pipeline-design@yvSf7sGEd7QiaVoetalHc.md │ │ │ │ │ ├── data-quality@bGCMAgaenZ0t3WeO5joyP.md │ │ │ │ │ ├── data-sources@VUgxDDkoxkOcLxqpTDXzt.md │ │ │ │ │ ├── data-transformation-techniques@hrkMVMYWCedRxhNd2N9wE.md │ │ │ │ │ ├── data-warehouse@wJiKBbTMLhIzelUtKn7jl.md │ │ │ │ │ ├── databases@g44bQY90HOeI_dZ8gK2Uj.md │ │ │ │ │ ├── dbt@-KzusmyDQ1NgqOADpqmEX.md │ │ │ │ │ ├── descriptive-analysis@vTW3jSZ1bvc0OrP_bl22t.md │ │ │ │ │ ├── descriptive-statistics@xc1hm_XTyiMUVtWiTKXWG.md │ │ │ │ │ ├── design-principles@EDQjtoTd01ftwXxYkV9it.md │ │ │ │ │ ├── diagnostic-analysis@m5aC9aNy9mwLXz0xXBp40.md │ │ │ │ │ ├── discrete-vs-continuous@YSxvg2HrfGoGtpkwY0kGc.md │ │ │ │ │ ├── dispersion@1D98k1HNCaaiaI20euVwA.md │ │ │ │ │ ├── distribution@JSqwWsfojjZTe8ynmA7fc.md │ │ │ │ │ ├── dplyr@ZAhjB_ghHukD4RPAtNDxh.md │ │ │ │ │ ├── duplicates@xjgqmJmetKpWXSWZHPwaL.md │ │ │ │ │ ├── end-to-end-analytics-project@3xDVJwdl3uu5EcjlZ1ytA.md │ │ │ │ │ ├── ethical-data-use@Vb06K0D2vWAlSe95QJrth.md │ │ │ │ │ ├── etl-basics@Du4GD-6pxbWYl4uSJRnOE.md │ │ │ │ │ ├── etl-tools@lAK9QVs97hL3ysjz2blp8.md │ │ │ │ │ ├── excel@9BWyA0b4WrmQetSMph_mY.md │ │ │ │ │ ├── excel@Dh62zxyyUHh0galD472p8.md │ │ │ │ │ ├── excel@LLK3_hudKDX5d-fd98vlx.md │ │ │ │ │ ├── exploratory-data-analysis-eda@ETT9eATuyLHQe2jPqaF5I.md │ │ │ │ │ ├── fact-vs-dimension-tables@hcbS18cpVxd55hVlUeLLT.md │ │ │ │ │ ├── finance@cxTriSZvrmXP4axKynIZW.md │ │ │ │ │ ├── finance@xftv5BiyoVrFjpSN0tjsw.md │ │ │ │ │ ├── financial-performance@1T2PyytlmndHreWgueD55.md │ │ │ │ │ ├── forecasting@ExHCSUDxDBwsJtTelvxjP.md │ │ │ │ │ ├── fraud-detection@aJLGan5dkMefvkspFlcYo.md │ │ │ │ │ ├── gdpr@CWf_vL78f8-mSUQbPnU8e.md │ │ │ │ │ ├── healthcare@VpGVezYr9O6puhAF12PN2.md │ │ │ │ │ ├── heatmap@SNkYi2VZsCRG31v63v8_x.md │ │ │ │ │ ├── histogram@wqLcUFVsLa_l9yQIee9MG.md │ │ │ │ │ ├── hospital-efficiency@ku3m0ZmNg23F0Z5CEb4JI.md │ │ │ │ │ ├── hr@KeGCHoJRHp-mBX-P5to4Y.md │ │ │ │ │ ├── hypothesis-testing@6xfQic8dMwUsMQa7VtS8_.md │ │ │ │ │ ├── inferential-statistics@7DNtRMBZ_F0K1FQk-UCM4.md │ │ │ │ │ ├── interpretability@uP8MWZqM9Z0i3eDF4Ldxv.md │ │ │ │ │ ├── interview-preparation@4XM5ikPiHVehEtT4AB-Ea.md │ │ │ │ │ ├── introduction@PxOEfMSQYA2jy3zrMZXjZ.md │ │ │ │ │ ├── inventory-optimization@LkbB0rpS3Du2K7_ogoc34.md │ │ │ │ │ ├── iot@GrwdQldCWu2zWAaNj6LFk.md │ │ │ │ │ ├── iqr@LEHK7ohKIzKhlGebd0k_j.md │ │ │ │ │ ├── job-preparation@TojDB4o0i2rs7Qcb10k1r.md │ │ │ │ │ ├── json@p21d2mEUnTQgWhKFTGS9F.md │ │ │ │ │ ├── key-business-functions@PkzUqwT21Owk_TfepFPDm.md │ │ │ │ │ ├── kurtosis@jvU1iu2M_y1IH62oUpAeU.md │ │ │ │ │ ├── linear-regression@4-fpZx8p5iSNI3n4Qtacl.md │ │ │ │ │ ├── lineplot@BVDaFmDat48nN3hj5NE71.md │ │ │ │ │ ├── looker@f4MDT1RUfaICAWzyG2E6T.md │ │ │ │ │ ├── manufacturing@zEGmDHaFa-F81tWqa3i9E.md │ │ │ │ │ ├── map@7_5PBCrsukv81mm7yTpDf.md │ │ │ │ │ ├── marketing-campaigns@0qRm81lJX_Eb6aJkJMjeL.md │ │ │ │ │ ├── marketing@s-wUPMaagyRupT2RdfHks.md │ │ │ │ │ ├── mean@S4XEOd2-PHIHOiiGgKVLJ.md │ │ │ │ │ ├── median@mfLRVcxvAjqmSG-KBpJ4J.md │ │ │ │ │ ├── metrics-and-kpis@c0ywBrs9u7MciWAXSgVVg.md │ │ │ │ │ ├── misleading-charts@qGVDuU9RA9Y5g5vlPd-xq.md │ │ │ │ │ ├── missing-values@fhreEuoT8ZBRwJqbSGrEZ.md │ │ │ │ │ ├── mitigation-strategies@5MUwKGfSTKlam8KCG0A1U.md │ │ │ │ │ ├── mobile-apps@1cC6LKxcncaKg4Jm53pUy.md │ │ │ │ │ ├── mobile-responsiveness@7t0WfLLqrD5VJQwIAmXMo.md │ │ │ │ │ ├── mode@DQtznxvW5x4s-zGLpUpNY.md │ │ │ │ │ ├── mysql@eqnAEp2VT7FD2VDy5WVDP.md │ │ │ │ │ ├── networking@Q98GaitxocEha4zZ9d254.md │ │ │ │ │ ├── normalization-vs-denormalization@Prfa0LUmgxcp52IEObFom.md │ │ │ │ │ ├── open-source-projects@YovS5Dbcr6g_8PMr8jp5t.md │ │ │ │ │ ├── operational-bi@GN6SnI7RXIeW8JeD-qORW.md │ │ │ │ │ ├── operations@dJZqe47kzRqYIG-4AZTlz.md │ │ │ │ │ ├── oracle@uoQS4g-c6QndacUeiaWrq.md │ │ │ │ │ ├── other-formats@k80q5FPNiIUdxn5A8R3Hu.md │ │ │ │ │ ├── outliers@OqolfBQRQvwg6PI_t8Mrt.md │ │ │ │ │ ├── p-value@rkEdx_mZBoDjMhiluJl7O.md │ │ │ │ │ ├── pandas@25f76eB9-vy3Usta-Pbsi.md │ │ │ │ │ ├── patient-management@LI09SvvUUCQxLZZee_j0n.md │ │ │ │ │ ├── performance@y9Fnjnbiqt7WkrhjPITpW.md │ │ │ │ │ ├── popular-databases@gJBaVERU3prru-qRksxN4.md │ │ │ │ │ ├── population--sample@7VDxA9bQ1P1fym4eQVKkN.md │ │ │ │ │ ├── portfolio-presentation@qsCWo1CmR4mvy7E7qlPv5.md │ │ │ │ │ ├── postgresql@nhl9FM79femgqENNR0HbE.md │ │ │ │ │ ├── power-bi@eqGsO6ZGk2jdG0z9-cHzz.md │ │ │ │ │ ├── predictive-analysis@4zpVE3R0lLyWpHePdBVpl.md │ │ │ │ │ ├── predictive-maintenance@yimCxOdNtyGcbd6ZxHsBQ.md │ │ │ │ │ ├── prescriptive-analysis@NnbtaO2MiqsHeJ-ds0Q5m.md │ │ │ │ │ ├── presentation-design@9G-pI5NsRCq4p0FLfaMR_.md │ │ │ │ │ ├── privacy@fuxGZx3WGjP2TzzVV29ux.md │ │ │ │ │ ├── production-efficiency@L50rpcgGjsQU3S0zRn6xh.md │ │ │ │ │ ├── professional-development@tUxwKTml2Go8zR9tR3cjn.md │ │ │ │ │ ├── programming-languages@KSxjcWV6C325kZITzAhWs.md │ │ │ │ │ ├── project-management@r8NoX426-ngu6ZQZe06oK.md │ │ │ │ │ ├── providers-aws-gcp-azure@Z4pAe4FpnCkUJt8RuOhC6.md │ │ │ │ │ ├── public-health@Cydlrtg_FClBUkjezqGie.md │ │ │ │ │ ├── python@vQQSYPpcGO7ri0RFSWi0h.md │ │ │ │ │ ├── qlik@GoMIAQwusbT7fqJ-VnCrq.md │ │ │ │ │ ├── quality-control@Xe9zK8xhkkr4fsh3HOzAY.md │ │ │ │ │ ├── r@0OTmTRHlR3ImNU0zyLt8G.md │ │ │ │ │ ├── range@jll2iRbjdx7iiNwY13KYD.md │ │ │ │ │ ├── regression-analysis@m9ejACzRBJza0v-fpdfkn.md │ │ │ │ │ ├── reinforcement-learning@KFONHuJNnCuSOH7-8Ndvm.md │ │ │ │ │ ├── relevance@UhcniUDKmi7KNuXlolf5O.md │ │ │ │ │ ├── responsibilities@Q-GmBJiRdBS_xLeOjef2R.md │ │ │ │ │ ├── resume-optimization@m9EwcekZ_l0XHiKeQ8emr.md │ │ │ │ │ ├── retail--e-commerce@7LbhfkmS7oFoSF1k5ZR1U.md │ │ │ │ │ ├── risk-analytics@JHGV0V78GXubiSY9P3nTw.md │ │ │ │ │ ├── salary-negotiation-strategies@k3F9Tdqo3XYgMLOKGjpxA.md │ │ │ │ │ ├── sales-performance@VPu8vn7-baZQ5ORJ6ViW0.md │ │ │ │ │ ├── scatterplot@hCSZo7jT9arBLUbtCVFfD.md │ │ │ │ │ ├── seasonality@moWrEfuKE06QwbznsH3V-.md │ │ │ │ │ ├── semistructured@qHcRrxenhogymMQ6EPiMa.md │ │ │ │ │ ├── skewness@X0DBG0mEWk25PEbLHhs7v.md │ │ │ │ │ ├── skills@iRgtog5A13CTNDxnbGN9x.md │ │ │ │ │ ├── soft-skills@mi88uLdJBXaxJ2yVOSqqo.md │ │ │ │ │ ├── sql-fundamentals@s8LZgRwrlm1V4meGM7gj0.md │ │ │ │ │ ├── sql@_iV_5O5Rq07P9qRGrraTM.md │ │ │ │ │ ├── sqlite@lrksz861rE5m2XzOQPwgh.md │ │ │ │ │ ├── stakeholder-identification@e3SdmNpVcvy3k_-JIO6OK.md │ │ │ │ │ ├── stakeholder-management@r-m88g8xrUnuEpV2lHJfN.md │ │ │ │ │ ├── standardisation@TCYG6vmFqq1zAPNQWoOH8.md │ │ │ │ │ ├── star-vs-snowflake-schema@iYe42G31fhkAO0MBaHutF.md │ │ │ │ │ ├── statistical-tests@01k_mfsp0eW6TX9yp8PDE.md │ │ │ │ │ ├── std@vqtzg9bydAqHMwZhPHo1a.md │ │ │ │ │ ├── storytelling-framework@t_J0MZTMWMnrImGHjXYov.md │ │ │ │ │ ├── strategic-bi@3BxbkrBp8veZj38zdwN8s.md │ │ │ │ │ ├── structured@jnIn3_2fI2k97oALPZkt7.md │ │ │ │ │ ├── supervised-learning@eZN_ty8VDX9mi5KtCWTFL.md │ │ │ │ │ ├── supply-chain-analytics@7jrzQogTOc6lHXfpYLCsx.md │ │ │ │ │ ├── supply-chain-optimization@-hNguvT6SQCqAgVpoQByr.md │ │ │ │ │ ├── tableau@WzPj94lYxQCjFx5YW4X9x.md │ │ │ │ │ ├── tactical-bi@jJukG4XxfFcID_VlQKqe-.md │ │ │ │ │ ├── time-series-analysis@yseEaLsEzIcqJ0YIoGujl.md │ │ │ │ │ ├── timeliness@5USjYdAVJs0gSXxE1j8Xu.md │ │ │ │ │ ├── trends@On6kznZxLTCpBPskdZtgT.md │ │ │ │ │ ├── types-of-bi-operations@LjeipkY01Hlkp22kmlAMh.md │ │ │ │ │ ├── types-of-data-analysis@3DVF8zo-_WM_9GTuzQFO8.md │ │ │ │ │ ├── types-of-data@H1s1PQj8CHQ_VBQIy1VtJ.md │ │ │ │ │ ├── types-of-errors@SosOXxErMn0t2KCoHoxvS.md │ │ │ │ │ ├── unstructured@DJKXgelIxuahxJiqvwP6I.md │ │ │ │ │ ├── unsupervised-learning@6l_tHC1R5zgABHMc_G6RD.md │ │ │ │ │ ├── variables-and-data-types@HM1w6JJquaV6Vq4mjxM7p.md │ │ │ │ │ ├── variance@ZmSwDn0sP7HvLKYVzRwPJ.md │ │ │ │ │ ├── visualization-best-practices@eKBORkRU6HCH-D4GWHyKR.md │ │ │ │ │ ├── visualization-fundamentals@sltVKaKKjmzu17jDv9OFF.md │ │ │ │ │ ├── web@xQLsuJ3uohVzOxGfFLyFw.md │ │ │ │ │ ├── what-is-bi@jVXwlHRGgVpcoWCYzSB5W.md │ │ │ │ │ ├── what-is-data@g5j_mbjx2yZUIK5lfN3eT.md │ │ │ │ │ ├── why-bi-matters@NX-YaB_FVjoHYsR6z9QIL.md │ │ │ │ │ ├── window-functions@1toMuRZResgse1AtwEck6.md │ │ │ │ │ ├── writing-executive-summaries@Slg3fXGPTa-Z4sdZY86XK.md │ │ │ │ │ └── xml@ytgK7van84j5DsfD0JyZ3.md │ │ │ │ └── faqs.astro │ │ │ ├── blockchain/ │ │ │ │ ├── blockchain.json │ │ │ │ ├── blockchain.md │ │ │ │ ├── content/ │ │ │ │ │ ├── alchemy@lOoubzXNILBk18jGsc-JX.md │ │ │ │ │ ├── angular@UY_vAsixTyocvo8zvAF4b.md │ │ │ │ │ ├── applicability@aATSuiqPG-yctr3ChEBa_.md │ │ │ │ │ ├── applications-and-uses@WD2JH4X4tEE4J0W0XFQ_4.md │ │ │ │ │ ├── arbitrum@A_yVDg-6b42ynmh71jk1V.md │ │ │ │ │ ├── arbitrum@ixTIn2Uhs-i5-UPt9jKAa.md │ │ │ │ │ ├── architecture@B6GGTUbzEaIz5yu32WrAq.md │ │ │ │ │ ├── avalanche@txQ9U1wcnZkQVh6B49krk.md │ │ │ │ │ ├── base@ixTIn2Uhs-i5-UPt9jKAa.md │ │ │ │ │ ├── basic-blockchain-knowledge@MvpHHpbS-EksUfuOKILOq.md │ │ │ │ │ ├── basic-blockchain-operations@9z0Fqn1qqN8eo6s7_kwcb.md │ │ │ │ │ ├── besu@Gnnp5qrFmuSVtaq31rvMX.md │ │ │ │ │ ├── bft@Bj3T_4lfr0Yianuwr3pDN.md │ │ │ │ │ ├── binance-smart-chain@sJj-6wG5KjjzYYia_eo63.md │ │ │ │ │ ├── bitbucket@TMPB62h9LGIA0pMmjfUun.md │ │ │ │ │ ├── bitcoin@tmI1PrE4fInrGB3-jMrFW.md │ │ │ │ │ ├── blockchain-forking@L08v-78UsEhcg-mZtMVuk.md │ │ │ │ │ ├── blockchain-interoperability@nNPa6jKRUaitmHwBip_LE.md │ │ │ │ │ ├── blockchain-networks@nuq_juiBSecI7PwERR_4R.md │ │ │ │ │ ├── blockchain-structure@Atv-4Q7edtvfySs_XhgEq.md │ │ │ │ │ ├── blockchains@EQgb4LqXnyq3gOX7Fb85s.md │ │ │ │ │ ├── bnb-chain@sJj-6wG5KjjzYYia_eo63.md │ │ │ │ │ ├── brownie@Q64AbQlvYPiqJl8BtoJj9.md │ │ │ │ │ ├── building-for-scale@bTdRKEiIUmu1pnp8UbJK9.md │ │ │ │ │ ├── cardano@IzBZnvl8lqVKsog-IGwtV.md │ │ │ │ │ ├── chainlink@omQOhNfMO09pBc7oy76Wo.md │ │ │ │ │ ├── client-libraries@vZiDpX9pEB9gfueSKZiQL.md │ │ │ │ │ ├── client-nodes@CoYEwHNNmrQ0i0sSQTcB7.md │ │ │ │ │ ├── code-coverage@4V-dj9x9hSAAGCxpBWsbE.md │ │ │ │ │ ├── common-threat-vectors@GxD-KybtmkwT3wqDzIfHp.md │ │ │ │ │ ├── consensus-protocols@_BkpK9qgp9up8nXNH7q4m.md │ │ │ │ │ ├── crypto-faucets@S68IUKs0k_FFHEH97xxs7.md │ │ │ │ │ ├── crypto-wallets@SM8Wt3iNM_nncLj69KCuy.md │ │ │ │ │ ├── cryptocurrencies@s1QqQc0We5yQaNF3Ogt4k.md │ │ │ │ │ ├── cryptography--hashing@e_I-4Q6_qIW09Hcn-pgKm.md │ │ │ │ │ ├── cryptography@e_I-4Q6_qIW09Hcn-pgKm.md │ │ │ │ │ ├── cryptowallets@FSThY0R1OAZCIL98W3AMj.md │ │ │ │ │ ├── daos@RsoOgixZlyQU6h7nIaY9J.md │ │ │ │ │ ├── dapps---decentralized-applications@SXXvFtf_7Rx64cHSEWxMS.md │ │ │ │ │ ├── dapps@oczIhxMB7WOhcAocIa2Ew.md │ │ │ │ │ ├── decentralization-vs-trust@E9HR_voxQ2a2tvWUuva_p.md │ │ │ │ │ ├── decentralization@H9jvIlxX6P-C_cgPfZop4.md │ │ │ │ │ ├── decentralized-storage@tvk1Wh04BcFbAAwYWMx27.md │ │ │ │ │ ├── defi@1AhombZUkZN6Ra5fysSpg.md │ │ │ │ │ ├── deployment@7goaYnedUlfgfl5qApoO2.md │ │ │ │ │ ├── deployment@cW3_Ki9Bx7fYluDLKKKgl.md │ │ │ │ │ ├── diligent-fuzzing@twR3UdzUNSztjpwbAUT4F.md │ │ │ │ │ ├── echidna@U4H62lVac8wIgxNJ3N3ga.md │ │ │ │ │ ├── environmental-considerations@-dIX_3qo97B418_BmJ5wP.md │ │ │ │ │ ├── erc-tokens@bjUuL7WALETzgFxL6-ivU.md │ │ │ │ │ ├── ethereum-20@9uz6LBQwYpOid61LrK5dl.md │ │ │ │ │ ├── ethereum@JLXIbP-y8C2YktIk3R12m.md │ │ │ │ │ ├── ethersjs@i-ltfXPTCu3WaBo-xaN05.md │ │ │ │ │ ├── everscale@YC385OLECWjpZjVeWKksO.md │ │ │ │ │ ├── evm-based@tSJyp46rkJcOtDqVpJX1s.md │ │ │ │ │ ├── fantom@trcGwYcFW5LQUUrAcbUf_.md │ │ │ │ │ ├── foundry@F1EUAxODBJ3GEoh7cqM-K.md │ │ │ │ │ ├── frontend-frameworks@YR-U2njkUrEMO0JxCU1PH.md │ │ │ │ │ ├── fuzz-testing--static-analysis@wypJdjTW4jHm9FCqv7Lhb.md │ │ │ │ │ ├── general-blockchain-knowledge@bA4V_9AbV3uQi3qrtLWk0.md │ │ │ │ │ ├── geth@DBRaXtwvdq2UGE8rVCmI1.md │ │ │ │ │ ├── git@gpS5CckcQZX3TMFQ2jtIL.md │ │ │ │ │ ├── github@GOgeaQoRvqg-7mAfL_A8t.md │ │ │ │ │ ├── gitlab@CWqwv4asouS-dssAwIdxv.md │ │ │ │ │ ├── gnosis-chain@UQ9AejYV6_Sk6ZJkXYWf7.md │ │ │ │ │ ├── go@jxlQ1ibcCv6ZlcEvobZ_G.md │ │ │ │ │ ├── gosh@5MGtl00EEZdSnJdrNYPJ7.md │ │ │ │ │ ├── hardhat@l110d4NqTQt9lfEoxqXMX.md │ │ │ │ │ ├── huobi-eco-chain@PkRAYBZQAUAHxWEeCCX4U.md │ │ │ │ │ ├── hybrid-smart-contracts@JbgBwG6KmeTdyle9U6WAv.md │ │ │ │ │ ├── ides@lXukWXEatsF87EWFSYyOO.md │ │ │ │ │ ├── infura@hJmNuEMHaMSM0QQlABFRS.md │ │ │ │ │ ├── insurance@uMXcKCUoUN8-Hq_IOBRCp.md │ │ │ │ │ ├── integration-tests@QNfnbUGkT3N-pj5epnHcM.md │ │ │ │ │ ├── introduction@MvpHHpbS-EksUfuOKILOq.md │ │ │ │ │ ├── javascript@fF06XiQV4CPEJnt_ESOvv.md │ │ │ │ │ ├── l2-blockchains@i_Dw3kUZ7qKPG-tk-sFPf.md │ │ │ │ │ ├── maintenance@XvVpnlYhT_yOsvjAvwZpr.md │ │ │ │ │ ├── management-platforms@fbESHQGYqxKRi-5DW8TY3.md │ │ │ │ │ ├── manticore@twR3UdzUNSztjpwbAUT4F.md │ │ │ │ │ ├── mining--incentive-models@B7niNXMOTbHn_1ixKQ8ri.md │ │ │ │ │ ├── mining-and-incentive-models@B7niNXMOTbHn_1ixKQ8ri.md │ │ │ │ │ ├── monitoring@H3jNM_0sJrB7ZbYzrVhF7.md │ │ │ │ │ ├── moonbeam--moonriver@Ib9STGxQa8yeoB-GFeGDE.md │ │ │ │ │ ├── moonbeam--moonriver@VVbvueVMJKLUoJYhbJB1z.md │ │ │ │ │ ├── moralis@RFgetmTvKvpV2PG6Vfev7.md │ │ │ │ │ ├── moralis@pJhR9OQo8YFQmAZXQbikJ.md │ │ │ │ │ ├── mythx@XIgczUc3yKo6kw-_3gskC.md │ │ │ │ │ ├── nethermind@xtYwg0WAcE8Ea9VgC2RSc.md │ │ │ │ │ ├── nfts@e4OHLOfa_AqEShpMQe6Dx.md │ │ │ │ │ ├── node-as-a-service@dDPhMNPpl3rZh3EgXy13P.md │ │ │ │ │ ├── on-chain-scaling@1bUD9-vFo-tsHiB1a06tO.md │ │ │ │ │ ├── openzeppelin@qox-x_q-Q7aWcNFWD7RkT.md │ │ │ │ │ ├── optimism@EK5TqRRn15ExsGc4gfMLu.md │ │ │ │ │ ├── optimistic-rollups--fraud-proofs@ti6-LSK52dTCLVdxArp9q.md │ │ │ │ │ ├── oracle-networks@CzfsAQIk3zIsDaDAorG9K.md │ │ │ │ │ ├── oracles@sK8G-41D3EfYNSLFJ3XYf.md │ │ │ │ │ ├── payments@vTGSDThkDDHvCanNlgP07.md │ │ │ │ │ ├── plasma@dMesiPUPBegYQ7hgeMMJK.md │ │ │ │ │ ├── poh@-bul5ZMIcZf8RNd4kV54s.md │ │ │ │ │ ├── pokt-network@pJhR9OQo8YFQmAZXQbikJ.md │ │ │ │ │ ├── polygon@JNilHFQnnVDOz-Gz6eNo5.md │ │ │ │ │ ├── pos@WNPNoDZ57M2QHEIIU-Bpa.md │ │ │ │ │ ├── pow@XbO1CKYZ6OVqVjtrcHKq2.md │ │ │ │ │ ├── practices@UOF7Ep97i1l3Own6YEWlq.md │ │ │ │ │ ├── python@pVG7bGqVGCeSBlZxRNHJs.md │ │ │ │ │ ├── quicknode@FGih8w9We52PHpBnnGO6H.md │ │ │ │ │ ├── react@0DUYS40_-BTpk2rLQ1a0e.md │ │ │ │ │ ├── remix@lXukWXEatsF87EWFSYyOO.md │ │ │ │ │ ├── repo-hosting-services@oSK3MRQD_4j1gGDORN7RO.md │ │ │ │ │ ├── rust@Larbhjzi-MnPQKH1Pzn2R.md │ │ │ │ │ ├── security@PBTrg9ivOpw9uNTVisIpx.md │ │ │ │ │ ├── security@snQA5_4H2dDkT1pENgaYD.md │ │ │ │ │ ├── sidechains@lSQA3CfQBugEBhAh2yxro.md │ │ │ │ │ ├── slither@YA3-7EZBRW-T-8HuVI7lk.md │ │ │ │ │ ├── smart-contract-frameworks@KRtEN0845lV5e85SOi6oZ.md │ │ │ │ │ ├── smart-contracts@BV6lEwCAKaYxSPWD0LV_d.md │ │ │ │ │ ├── solana@JYHK95Xr0R1MVCda1Epl6.md │ │ │ │ │ ├── solidity@chaIKoE1uE8rpZLkDSfV-.md │ │ │ │ │ ├── source-of-randomness-attacks@f60P5RNNdgCbrhDDzkY25.md │ │ │ │ │ ├── starknet@Ib9STGxQa8yeoB-GFeGDE.md │ │ │ │ │ ├── state--payment-channels@5T5c3SrFfMZLEKAzxJ-_S.md │ │ │ │ │ ├── storage@zvUCR0KeigEi9beqFpwny.md │ │ │ │ │ ├── substrate@E4uuJZFZz-M1vlpZmdJTO.md │ │ │ │ │ ├── supporting-languages@NK02dunI3i6C6z7krENCC.md │ │ │ │ │ ├── testing@-7Bq2ktD0nt7of9liuCDL.md │ │ │ │ │ ├── ton@4tAyunbYVwlbzybuVq7fr.md │ │ │ │ │ ├── ton@ug4FB4RXItHU0ADnisvve.md │ │ │ │ │ ├── tools@n3pipnNb76aaQeUwrDLk_.md │ │ │ │ │ ├── truffle@Vl9XHtc22HnqaCnF9yJv9.md │ │ │ │ │ ├── tvm-based@hlcavpstLnXkJcjccQUL8.md │ │ │ │ │ ├── tvm-based@miBEG3x_foKYxwfX4Tr4f.md │ │ │ │ │ ├── types-of-blockchains@EQgb4LqXnyq3gOX7Fb85s.md │ │ │ │ │ ├── understanding-blockchain@bA4V_9AbV3uQi3qrtLWk0.md │ │ │ │ │ ├── unit-tests@IXs4nUzy_A5vBjI_44kaT.md │ │ │ │ │ ├── upgrades@OotJnHgm622NQJc2WRI7c.md │ │ │ │ │ ├── utxo-based@C-SpX4Rzk5Um2F_X5ZdBr.md │ │ │ │ │ ├── validium@chmxDwNVOefp98IbjEgNl.md │ │ │ │ │ ├── venom@3HCpgWWPIkhK3gPRJuJQf.md │ │ │ │ │ ├── version-control-systems@Fs9rcEh_f9fJ2tF-bkAUE.md │ │ │ │ │ ├── vs-code@J4ev2h5cipcwh3OcuBdMU.md │ │ │ │ │ ├── vue@Ke97bMHGfb-8hB_xSwMbk.md │ │ │ │ │ ├── vyper@jgHa_LeCac0pl6dSADizF.md │ │ │ │ │ ├── web3js@jwuMeo9TwaQviGIMO13Jf.md │ │ │ │ │ ├── what-is-blockchain@edO8iEehsZtYavlsEKhOy.md │ │ │ │ │ ├── why-it-matters@Nc9AH6L7EqeQxh0m6Hddz.md │ │ │ │ │ ├── why-it-matters@ecT4W5z8Vq9pXjnuhMdpl.md │ │ │ │ │ └── zk-rollups--zero-knowledge-proof@PykoX4j5Q3eJWIpUoczjM.md │ │ │ │ ├── faqs.astro │ │ │ │ └── migration-mapping.json │ │ │ ├── claude-code/ │ │ │ │ └── content/ │ │ │ │ ├── @La3uarrUxC5oTszf4oaWr.md │ │ │ │ ├── @N6z45nuFeUqRB2f-8b_Ku.md │ │ │ │ ├── @PYjuzInrTOWebl-OyYfMa.md │ │ │ │ ├── add-dir@FgQXBQ6oJ5sfW_ar0u6ez.md │ │ │ │ ├── agent-team@fI90DtG5CoZbDyJUqLGoy.md │ │ │ │ ├── agents@sx2GRmZbQEYxeb05HpHQH.md │ │ │ │ ├── api-usage@N6dDyEXIUJUA3-o1J9K_n.md │ │ │ │ ├── be-mindful-of-extensions@__3S2Z00hK_g_GQJxv_21.md │ │ │ │ ├── claude---add-dir@FgQXBQ6oJ5sfW_ar0u6ez.md │ │ │ │ ├── claude--c@XlCA3rx2C7wx_EcTYtr9_.md │ │ │ │ ├── claude--p@2PKH3Ru9XgCz1MO75pDVr.md │ │ │ │ ├── claude--r@zUxO8udwPhYK6J_3wAs2Z.md │ │ │ │ ├── claude-cli@3r-vFlVAEirxD1gaFOO4H.md │ │ │ │ ├── claude-code-security@KgXvbrUuYyiBn52QCRoLl.md │ │ │ │ ├── claude-query@zSpldCAVxYoRpHDIR2oVa.md │ │ │ │ ├── claude-workflow@_iAIq8mwW0cIGbvrfmSJ5.md │ │ │ │ ├── claude@lcnfnGocMZIWDQqrmdCWL.md │ │ │ │ ├── claudemd@T6PklJYVOrmcAgNcCFhKt.md │ │ │ │ ├── claudemd@TCWd5vobMAhP7I97Q1rTq.md │ │ │ │ ├── clear@N4YM2lqDcic5AiYgv0eRZ.md │ │ │ │ ├── code-intelligence@qg6ZTF0LCz5zo5G1a3BEf.md │ │ │ │ ├── common-usecases@rGtz0Nw4BgOrdm3WUmjwZ.md │ │ │ │ ├── community-tools@e12uqC2SEzaMfmBbz7VZf.md │ │ │ │ ├── compact@65s0P7d39fFR2yhy4JKEZ.md │ │ │ │ ├── config@UOSXh1o8bRY8Wcm6uYIgR.md │ │ │ │ ├── connecting-tools-with-mcp@OBtJvLaEV3giUhvGFofKv.md │ │ │ │ ├── context@6UHAXR4praMqGiEUgWAt8.md │ │ │ │ ├── context@C5tCsAJQxq2d-fOrjjloB.md │ │ │ │ ├── cost@vw9cc6_33nHnNPNyhLo_d.md │ │ │ │ ├── creating-skills@6WsAQV_e_2XJKl2KlN2dl.md │ │ │ │ ├── creating-subagents@HnrD1-Wc39ZRH5R6bptqX.md │ │ │ │ ├── ctrlc@dD0TlpfC4GzYWINplekKw.md │ │ │ │ ├── ctrlr@R7YJyNd0taUVJvXDPHBn5.md │ │ │ │ ├── customize-status-line@xEu9-kBz5SbM3Mrrwu446.md │ │ │ │ ├── desktop-app@rIG8F-Rc-fMeXZ5n0UTwi.md │ │ │ │ ├── doctor@IzHlnmGAqG1lpwuX1Oh4p.md │ │ │ │ ├── editor-extensions@ONhEanq8I2RE-Jc_YY3Wa.md │ │ │ │ ├── esc--esc@8xqKBvdDfTLeZXeGeqQZr.md │ │ │ │ ├── esc@2pu6b0Z5BQAz44Hx69Pzk.md │ │ │ │ ├── exit@MjZUaSJLSU5nDMgDJaWUh.md │ │ │ │ ├── export@eLlCNxa6bqQW0JsHxIdOa.md │ │ │ │ ├── git-worktrees@wxkAkdKFTwbNJEfwA9tGl.md │ │ │ │ ├── haiku@y_euG-Rzj-OmCZhvMXegc.md │ │ │ │ ├── headless-mode@FP6Lc-zqmP8yzBytuSsUc.md │ │ │ │ ├── help@I4i_fKzuBy5pTC0JXyEl-.md │ │ │ │ ├── hook-events--matchers@nq8aLrgh7qNQnwZbS7d9Z.md │ │ │ │ ├── hook-inputs--outputs@Gwsh4g1SxI2hJcS84p9it.md │ │ │ │ ├── hook-types@uC2PkMsCK-vaBo5Ygha2P.md │ │ │ │ ├── hooks@801KNtjf61FTiLS1yrDSB.md │ │ │ │ ├── hooks@OTpU2G6mnbkFhthKAkxlM.md │ │ │ │ ├── hooks@qPH0w52-8MvzZdFdsNMap.md │ │ │ │ ├── how-to-structure@7ZD0nOke-7vqaibxBx24Y.md │ │ │ │ ├── init@oucDNnTIc8gv3dlEibDB2.md │ │ │ │ ├── introduction@RqfeqVMhTSdC4w4GcsETP.md │ │ │ │ ├── locations@Ho_DTKqMZnx_nlxjWfrW2.md │ │ │ │ ├── manage-context@8fXu3OX3xfwr3NTAIHU0z.md │ │ │ │ ├── manage-sessions@rlj-GMcqgdKM5_7rs7yz9.md │ │ │ │ ├── mcp@8Nd9CdGb1_Jl4YLBvew4z.md │ │ │ │ ├── mcp@Lyl4h5cvdY1YVpzBo_LEB.md │ │ │ │ ├── memory@l7ECu0Q5bW9_OgVH7Ih4S.md │ │ │ │ ├── model-configuration@Tq83zphFUA1J8spMEyN8H.md │ │ │ │ ├── model@NMBBRdBWwCphjwQuFAp9W.md │ │ │ │ ├── models@RHWW3QOFWRMqlaovGOLEO.md │ │ │ │ ├── modes@gcZCpCWHvIo5Ox0vVkdgV.md │ │ │ │ ├── opus@TWN08Vx7aBK-mvOSQuFfu.md │ │ │ │ ├── opusplan@aHi-EWuBbn1xvK5osHOUM.md │ │ │ │ ├── output-styles@i3K2_8VcOGGSPdj1Jb4Im.md │ │ │ │ ├── permission-modes@y8VCGx-h97udP-dRzsSAI.md │ │ │ │ ├── permissions@8rKpgtmO92EUFAKlWVuO5.md │ │ │ │ ├── plan-mode@Dutj1C19nrbonQ7OpqBnv.md │ │ │ │ ├── plan@3ZYaw7kTiErPiLVwMf3J8.md │ │ │ │ ├── plugins@oV7YG_TnJ4ZyVVjqRwPkR.md │ │ │ │ ├── plugins@wd9T37TIM_1JU4o_2Fb0h.md │ │ │ │ ├── posttooluse@TBrr5EscwLZu7cOJoWbPy.md │ │ │ │ ├── pretooluse@FWf5hyCRo9UQ2QPalLVYn.md │ │ │ │ ├── prompt-caching@Dam_IG339RrYZXjXq3T8_.md │ │ │ │ ├── reduce-token-usage@Dam_IG339RrYZXjXq3T8_.md │ │ │ │ ├── resume@0HKJlqhoSCMNKf1lRIEy1.md │ │ │ │ ├── rewind@-K5K7yT97VRC7u0IOzJyT.md │ │ │ │ ├── rewind@cW0a112UVj2M3wBDA8UDj.md │ │ │ │ ├── scaling-claude@ip2bq52qRah-7db6dORO8.md │ │ │ │ ├── security-best-practices@WVrC8-nf8xn1jckCHO3h4.md │ │ │ │ ├── sessionend@x5U0F5WWAqnNCC8f-qjr7.md │ │ │ │ ├── sessionstart@cMGYb_X1UK8sWI6brFj9S.md │ │ │ │ ├── setting-up-claude@XApGUujmnvp2VYUyEj1Kc.md │ │ │ │ ├── shifttab@gpg2cfEUUKI5J9FMxn5QD.md │ │ │ │ ├── skill-best-practices@5uIBv9rk7Wzc_bXny0B27.md │ │ │ │ ├── skill-scope@5uIBv9rk7Wzc_bXny0B27.md │ │ │ │ ├── skills-for-mcp@U22jPxfQWbu7-54OcsqkV.md │ │ │ │ ├── skills@OJIfG7DRO4jgQEcberkNx.md │ │ │ │ ├── skills@iVa6piQwdPHIDkSRX8OSy.md │ │ │ │ ├── slash-commands@JeotqE91kV1n-YRoXN9gX.md │ │ │ │ ├── sonnet@nDodLa7_UEeOmx6iM0Xp5.md │ │ │ │ ├── status@PS0GH8e9sW9N4s3UeHhjH.md │ │ │ │ ├── stop@v-gjhrW3oVZTe3EpUCjhY.md │ │ │ │ ├── subagents@EsbasCHDQOBZcBfHIrTbE.md │ │ │ │ ├── subagents@wFxYfNu7LtzV72a224WTZ.md │ │ │ │ ├── subscription@_Un0jTJaFs5Pdn1DFGl61.md │ │ │ │ ├── thinking-modes--effort@cdO7pKphZq1qvCeynxGKo.md │ │ │ │ ├── tools@vB1d1mbiPJK3a1LbYZkH9.md │ │ │ │ ├── understand-claude-pricing@SCbZprU9r8BIX4BoyjYPE.md │ │ │ │ ├── usage-best-practices@svhWAC463Y9CUkFb524Fd.md │ │ │ │ ├── usage@CPJulmusiWq3JQ6MmEJ0I.md │ │ │ │ ├── use-compact-and-clear@YjRDJcSK_h82DooDWY2k4.md │ │ │ │ ├── use-compact-regularly@YjRDJcSK_h82DooDWY2k4.md │ │ │ │ ├── use-subagents-and-hooks@-P9o-aiDM7CDtLimppkjM.md │ │ │ │ ├── userpromptsubmit@Zrqdx4Z8uAS5yhI65Xh6z.md │ │ │ │ ├── using-claude-code@29xiIXYlB0bjXKA794qap.md │ │ │ │ ├── ways-to-use-claude@thR8GUbuAkEL4sb4m3llJ.md │ │ │ │ ├── what-is-a-coding-agent@LGxnQkrbwVu9z1PFB12P3.md │ │ │ │ ├── what-is-agentic-loop@uOowDiCXVKyMFrZO1pnXv.md │ │ │ │ └── what-is-vibe-coding@SKkeuO_5B18AbxlNGeazN.md │ │ │ ├── cloudflare/ │ │ │ │ ├── cloudflare.json │ │ │ │ ├── cloudflare.md │ │ │ │ ├── content/ │ │ │ │ │ ├── ai-gateway@vu8yJsS1WccsdcEVUqwNd.md │ │ │ │ │ ├── ai-model-integration@QxPoNHsL-Pj_z3aU6qEP4.md │ │ │ │ │ ├── ai-powered-search@Ep9_oV_YnkbH1gHM-n3gO.md │ │ │ │ │ ├── any-frontend-framework@zSwio18XdBfqwSneAx_AP.md │ │ │ │ │ ├── asset-management@3jU5753Uza2aS-gZo7w4k.md │ │ │ │ │ ├── background-jobs@qgvDGyLjc6lMmVPjHozFM.md │ │ │ │ │ ├── basic-command-line-knowledge@q9oQTt_NqhdWvJfA5XH1V.md │ │ │ │ │ ├── bindings@9ef2VPCru8lCmRxxGe-Eo.md │ │ │ │ │ ├── bot-management@So-cKAVfbgsw2zzFREu7Q.md │ │ │ │ │ ├── browser-rendering@qkFRW_tJB8_1IYpYskQ5M.md │ │ │ │ │ ├── bucket-lifecycle@YvgmmF9sWfURgijFV7E31.md │ │ │ │ │ ├── bucket-operations@UNE6XK4su5r2jcxhY7hOG.md │ │ │ │ │ ├── bulk-operations@i64-aCpZHygq76fBU6eXD.md │ │ │ │ │ ├── cache-api@ui3pUfsGMxv4WRzHkgbF0.md │ │ │ │ │ ├── caching-patterns@OgW-iIrJZ5-sOWKnFpIZd.md │ │ │ │ │ ├── caching-strategies@uBjcQ9PJUfwzu5N_2CNjN.md │ │ │ │ │ ├── calls@vHQdMgaL2EEr2o_eJmOuV.md │ │ │ │ │ ├── cicd-pipelines@8Y6TIYoWIXrxtmzDVdS0b.md │ │ │ │ │ ├── coordination@RYm0oBFCxm-S-aCwZ21p6.md │ │ │ │ │ ├── d1@mKN0Ta3zSk7PCm_uHYKFN.md │ │ │ │ │ ├── dead-letter-queues@Grl59SjY31Q3sgf9uX-xf.md │ │ │ │ │ ├── debugging-techniques@TmQC7fTL6b9EsBDYibv4g.md │ │ │ │ │ ├── development-tools@gsCRhwwjXuyueaYHSPOVZ.md │ │ │ │ │ ├── devtools-integration@uoaOrypiMkyoikXvTHeVS.md │ │ │ │ │ ├── devtools@G6YQZUQh_x8Qxm1oBseLQ.md │ │ │ │ │ ├── drizzle@MpWO1sroeF106SEMU1V1a.md │ │ │ │ │ ├── durable-objects@G-xBbtaniYFRE9Dgs18px.md │ │ │ │ │ ├── edge-computing-fundamentals@aGWLomYHGkIfn7GFc0_Yl.md │ │ │ │ │ ├── edge-ssltls@sXBxaQtwJ-luGVXdqVXk1.md │ │ │ │ │ ├── email-workers@z-1Ye5hcNdr9r6Gwdw7mv.md │ │ │ │ │ ├── event-driven-architectures@Z9Yywlf7rXFBtxTq5B2Y5.md │ │ │ │ │ ├── external-api-integration@4g5w6IAdzefdlRTxbRbdS.md │ │ │ │ │ ├── fetch-api-and-runtime-apis@_2UnRlbUplHvs5-Stj4O4.md │ │ │ │ │ ├── filtering@kdIfqTCcOSvV4KDpjr7nu.md │ │ │ │ │ ├── git-basics@C08pIguX1N45Iw0kh0Fvu.md │ │ │ │ │ ├── hono@-8MsWNvuqwQCbLpOx_kov.md │ │ │ │ │ ├── html-rewriting@INiqdtppBmCthOEXuHb-V.md │ │ │ │ │ ├── http-and-web-protocols@9iSdASlRxyod9YwZ2IUry.md │ │ │ │ │ ├── image-processing@S7laV14zsx31O0Tsj2SRL.md │ │ │ │ │ ├── images@8bOWuopxHtBWUSFaVT54P.md │ │ │ │ │ ├── integration--workflows@wvurOKbemF4Tt2WZcmqDL.md │ │ │ │ │ ├── inter-worker-communication@jYAUIKozuhsNK5LbkeAJ6.md │ │ │ │ │ ├── isolates-architecture@uNinrB9wm5ahjGXu5fc0g.md │ │ │ │ │ ├── itty-router@15jl6CSCkqnh_eFfysLDM.md │ │ │ │ │ ├── javascript-fundamentals@PcYnYAAkKMbzoiCnBfjqO.md │ │ │ │ │ ├── key-value-operations@EBTHbXOOZiqrcYJvKhcWV.md │ │ │ │ │ ├── large-file-handling@BPahk1qH9Hk11tsE2hw3A.md │ │ │ │ │ ├── live-streaming@RiQSPAV9uRFgwQFJckTFV.md │ │ │ │ │ ├── logging-and-monitoring@aKEH4ZxI6J1nwjp_AgH5r.md │ │ │ │ │ ├── message-processing@EFA8m0EdhygxcBWzwmbnT.md │ │ │ │ │ ├── metadata-handling@sQlRIYLnZcugATgpogJmw.md │ │ │ │ │ ├── middleware-patterns@aStbAF4zraqhJ-N3RH4ha.md │ │ │ │ │ ├── migrations@M8rSSVFUHixgWZRfaBPHb.md │ │ │ │ │ ├── miniflare@o4sBgniPmLqwej6TlIPcl.md │ │ │ │ │ ├── miniflare@vZHBp4S6WaS5sa5rfUOk-.md │ │ │ │ │ ├── monitoring-tools@Cy2T8978yUAPGol-yzxv_.md │ │ │ │ │ ├── nodejs-and-npm@dSBYTGGkol3MAXyg7G7_J.md │ │ │ │ │ ├── object-storage@K9iW2H6riKwddWmpWJFJw.md │ │ │ │ │ ├── pages-functions@SaHqm7T4FFVrsgyfImo66.md │ │ │ │ │ ├── persistence@36w4Q73XkCwo5Cva0XsF8.md │ │ │ │ │ ├── prisma@h3MHLZZwkYqqb5PSfMhpB.md │ │ │ │ │ ├── processing@6bNUqx5f_w5NuDL25BABN.md │ │ │ │ │ ├── query-optimization@65xDESm6jbHWkVO4NgHqx.md │ │ │ │ │ ├── queues@zyRgTtlng6idboSgL9YTt.md │ │ │ │ │ ├── r2-storage@gxLUlXGuaY5Q-0xmBgQwz.md │ │ │ │ │ ├── rate-limiting@JP5U6c2fZjtkU-Xzwtapx.md │ │ │ │ │ ├── rate-limiting@MInAsLLJtIq6WQDSj5yGH.md │ │ │ │ │ ├── requestresponse-handling@HNEXPU6r_T7UYvwLv2wnt.md │ │ │ │ │ ├── routing@-lsYPD6JueIV94RybGH_Y.md │ │ │ │ │ ├── schema-management@PnhP47woPJb_JnLpMMiTw.md │ │ │ │ │ ├── security--performance@76xovsBrKOnlRBVjsqNq1.md │ │ │ │ │ ├── service-bindings@JfpVexcbuWCx_R3EjFmbo.md │ │ │ │ │ ├── service-bindings@WZSi9inWPhqZQvDN-C8BV.md │ │ │ │ │ ├── similarity-search@pg3GtykCegK411DYDN8sN.md │ │ │ │ │ ├── speech-rcognition@HJbJ8OxjJzznYwLlIOSO2.md │ │ │ │ │ ├── state-management@EQjhRlM7zpANNWkypScIl.md │ │ │ │ │ ├── stream@LoT3NtpNj9uAgQRV-MD_E.md │ │ │ │ │ ├── testing-frameworks@jyWxaMx7_nojt5HsyAv7K.md │ │ │ │ │ ├── text-generation@zMwmoCUp9429_aXU-Bz4H.md │ │ │ │ │ ├── transactional-operations@rxxibrJUo1rQ3XCuUIP59.md │ │ │ │ │ ├── tunnels@8WZpSKBHCeYfTEL9tBNKr.md │ │ │ │ │ ├── typescript-fundamentals@zR84MFLL6y0dygz9hXXPA.md │ │ │ │ │ ├── understand-serverless-architecture@Isl5anwDvb1MacA-JH4ej.md │ │ │ │ │ ├── vector-embeddings@UIWaR1ZdjSm0UAS69Kz_5.md │ │ │ │ │ ├── vectorize@NWGVtH1vxQuO4lly0Omuy.md │ │ │ │ │ ├── video-delivery@zQp7XfDKWJgMf2LexRJhN.md │ │ │ │ │ ├── video-processing@3B6Z7F0D3Sf8ZBlV3kkGx.md │ │ │ │ │ ├── web-security-headers@KWix4jeNUKJ07Iu95Mqj_.md │ │ │ │ │ ├── webhook-handling@uOUjI6CPrhZIlz6mRCtOW.md │ │ │ │ │ ├── workers-ai@a0S0_JLwLLNGLUAHrqG4P.md │ │ │ │ │ ├── workers-kv@1dGFfQauOgHP7T4ReMpCU.md │ │ │ │ │ ├── workers-lifecycle@i6L9FI6fBDXr0XtMrc_uR.md │ │ │ │ │ ├── workers-runtime-environment@TB6vGzDgGZ9yAd9MGR7vw.md │ │ │ │ │ ├── workers-security-model@8IF7jftushwZrn7JXpC_v.md │ │ │ │ │ ├── workflows@rAl7zXcODiqIpS__3qf1A.md │ │ │ │ │ ├── wrangler@Tzx93tvoGrc9_fKQqkorN.md │ │ │ │ │ └── wrangler@n0vIbHmUZHrF4WjEhYdb8.md │ │ │ │ └── faqs.astro │ │ │ ├── code-review/ │ │ │ │ ├── code-review.json │ │ │ │ ├── code-review.md │ │ │ │ ├── content/ │ │ │ │ │ ├── api-semantics.md │ │ │ │ │ ├── code-style.md │ │ │ │ │ ├── documentation.md │ │ │ │ │ ├── implementation-semantics.md │ │ │ │ │ ├── index.md │ │ │ │ │ └── tests.md │ │ │ │ └── faqs.astro │ │ │ ├── computer-science/ │ │ │ │ ├── computer-science.json │ │ │ │ ├── computer-science.md │ │ │ │ ├── content/ │ │ │ │ │ ├── 2-3-4-trees@IaPd_zuLbiOCwoSHQLoIG.md │ │ │ │ │ ├── 2-3-search-trees@3jiV9R82qxpqIGfpEq_wK.md │ │ │ │ │ ├── a-algorithm@Yrk2PLUa-_FAPlhCkMl3e.md │ │ │ │ │ ├── acid-model@W5B-v-BFcCRmuN0L1m6PI.md │ │ │ │ │ ├── activity-diagrams@ptfRNiU0mC0Q5SLA_FWZu.md │ │ │ │ │ ├── adjacency-list@rTnKJcPniUtqvfOyC88N0.md │ │ │ │ │ ├── adjacency-matrix@HZ1kk0TQ13FLC9t13BZl5.md │ │ │ │ │ ├── architectural-patterns@BGhJNtszbYJtKyhqr2jax.md │ │ │ │ │ ├── architectural-styles@X1wv7xV69IEzepg8bF8oZ.md │ │ │ │ │ ├── array@TwW6SO2IXqkxJXVjLzdwU.md │ │ │ │ │ ├── ascii@hmwsNp60alS43kJg4A_Og.md │ │ │ │ │ ├── asymptotic-notation@UpBrpmrUwYUB9eesNxCq5.md │ │ │ │ │ ├── avl-trees@OUistS7H7hQQxVV-lOg39.md │ │ │ │ │ ├── b-tree@s0Pi6CemUUsmZSEu2j2gH.md │ │ │ │ │ ├── balanced-search-trees@7DF3UhefOSqqTuccH8c8X.md │ │ │ │ │ ├── balanced-tree@ZaWGLvZyu4sIPn-zwVISN.md │ │ │ │ │ ├── base@q3nRhTYS5wg9tYnQe2sCF.md │ │ │ │ │ ├── basic-math-skills@cdNi0EYrQ5nsgNxFVnXL8.md │ │ │ │ │ ├── bellman-fords-algorithm@eY4nK2lPYsrR-a_8y2sao.md │ │ │ │ │ ├── big-endian@U8AgY6I-62mN5Ohg9MsG6.md │ │ │ │ │ ├── big-o@c-NrTtJuNihbHzyPEOKTW.md │ │ │ │ │ ├── big-omega@X33735aeAVSlJ6yv9GS-h.md │ │ │ │ │ ├── big-theta@ThLpVZQIJ4diY5m0dik8m.md │ │ │ │ │ ├── binary-search-tree@et7l85gnxjvzD2tDyHT_T.md │ │ │ │ │ ├── binary-search@8kTg4O9MrTHRUrp6U-ctA.md │ │ │ │ │ ├── binary-tree@G9dnegZ6zNvxrCZ3O_b_z.md │ │ │ │ │ ├── bitwise-operators@hTPLcuOW7eEE5oYhNfmOG.md │ │ │ │ │ ├── boyer-moore@p6qub32jcaGloHXUDUrlG.md │ │ │ │ │ ├── breadth-first-search@Ke_ch4fnuKIiGAXUM_LPP.md │ │ │ │ │ ├── breadth-first-search@vcV6TEM_PqXxtThdfMKGw.md │ │ │ │ │ ├── brute-force-search@g3b0kt1fCAjjYyS2WelWi.md │ │ │ │ │ ├── bubble-sort@4wGBYFZpcdTt97WTbSazx.md │ │ │ │ │ ├── c@1kQJs-3Aw8Bi7d_Xh67zS.md │ │ │ │ │ ├── c@jHKCLfLml8oZyj4829gx0.md │ │ │ │ │ ├── c@n4IsklfYJXFIyF1rGWuEa.md │ │ │ │ │ ├── caching@4u5w9QCptLWuY9O7_UU8V.md │ │ │ │ │ ├── cap-theorem@GZI8EsEqiMJX3fSbO_E-7.md │ │ │ │ │ ├── cap-theorem@uqfeiQ9K--QkGNwks4kjk.md │ │ │ │ │ ├── cdn@r8V9bZpc98SrLvXc070bZ.md │ │ │ │ │ ├── character-encodings@DtG9EJonWi4_2oQ4fWOKY.md │ │ │ │ │ ├── class-diagrams@FZ8znJSz8PvQlnEyRLXmQ.md │ │ │ │ │ ├── cloud-design-patterns@YMO9oD_sbzyDZPNU2xZwe.md │ │ │ │ │ ├── clustering@wAsZ-M5N9ERufQnBaXbAE.md │ │ │ │ │ ├── co-np@pLBfkzi0qfgVRqi_4AmMI.md │ │ │ │ │ ├── combinatorics@lWnAY0DgrUOmT6yqnxeBN.md │ │ │ │ │ ├── common-algorithms@7a6-AnBI-3tAU1dkOvPkx.md │ │ │ │ │ ├── common-uml-diagrams@DMuMsEowpevTCALtziwTB.md │ │ │ │ │ ├── complete-binary-tree@Jx1WWCjm8jkfAGtHv15n1.md │ │ │ │ │ ├── complexity-classes@YLCmZvoLkhOk9wlgYW2Ms.md │ │ │ │ │ ├── concurrency-in-multiple-cores@xUo5Ox_HTgGyeQMDIkVyK.md │ │ │ │ │ ├── constant@3F_QBv_sU39ehOxpurF88.md │ │ │ │ │ ├── cpu-cache@DjTQjMbika4_yTzrBpcmB.md │ │ │ │ │ ├── cpu-interrupts@cpQvB0qMDL3-NWret7oeA.md │ │ │ │ │ ├── data-structures@NM7q5REW1sJgMhxJhPpLT.md │ │ │ │ │ ├── database-federation@3r21avMlo0xFB9i7PHccX.md │ │ │ │ │ ├── databases@zvlTQ0A-My4QDrslp_lru.md │ │ │ │ │ ├── dcl@4bUmfuP2qgcli8I2Vm9zh.md │ │ │ │ │ ├── ddl@ii1vF74u3yrFNlw_21b3B.md │ │ │ │ │ ├── dependency-injection@J7DKRklMtJ94Y-18Jo50r.md │ │ │ │ │ ├── depth-first-search@Yf5gOIe7oiL19MjEVcpdw.md │ │ │ │ │ ├── depth-first-search@chzP5_t2gMi6MstxEzCi5.md │ │ │ │ │ ├── design-patterns@-De1hU2ONGwhQmUpsyrCO.md │ │ │ │ │ ├── dijkstras-algorithm@l3X9UrEYTWs5kBXI1NNCf.md │ │ │ │ │ ├── dijkstras-algorithm@oJstm-8c-4seWbIWcNgDv.md │ │ │ │ │ ├── directed-graph@6Jy8SXHuYA08h9iLjKFWR.md │ │ │ │ │ ├── dml@tcQSH-eAvJUZuePTDjAIb.md │ │ │ │ │ ├── dns@fYjoXB4rnkM5gg46sqVz5.md │ │ │ │ │ ├── dql@05lkb3B86Won7Rkf-8DeD.md │ │ │ │ │ ├── endianess@vjMqqFsTxSjaiYxmliwLi.md │ │ │ │ │ ├── entity-relationship-model@XnxxEmr2TyW2kOpB4gtR5.md │ │ │ │ │ ├── exponential@5mMLr6tWbiSZuox1lx0_B.md │ │ │ │ │ ├── factorial@m0umGQNdvg95UiNpQZsQN.md │ │ │ │ │ ├── finding-hamiltonian-paths@aBjBHpq_OajgQjxdCobXD.md │ │ │ │ │ ├── floating-point-math@-bawIWfrYuAxy8cP-AGFS.md │ │ │ │ │ ├── ford-fulkerson-algorithm@Hqw2eGtgfbVggqXBnIOdI.md │ │ │ │ │ ├── full-binary-tree@Q8ZJNeTbc22Q08Mra-McY.md │ │ │ │ │ ├── go@mWW88VnkqWgDz02qw5zU-.md │ │ │ │ │ ├── gof-design-patterns@iPN9mSyFwYZER5HSkj6oL.md │ │ │ │ │ ├── graph@vQm046o6ozcvLoqg9L6eL.md │ │ │ │ │ ├── graphql@DeE_dZecLmKCjePovTfFS.md │ │ │ │ │ ├── grpc@M4vdwAbjLPrLjWUsG_P1I.md │ │ │ │ │ ├── hash-table@G2dN2FO0SN_I-5AhO_EUk.md │ │ │ │ │ ├── hashing--encryption--encoding@7r7o8pYhFHVAJIv0wNT6X.md │ │ │ │ │ ├── hashing-algorithms@EX_e4B6G07zTb4JjJ7482.md │ │ │ │ │ ├── heap-sort@CovrRsBY-sYW_xSegcN6N.md │ │ │ │ │ ├── heap@pw3ZCC3HKU7D5SQwte4vE.md │ │ │ │ │ ├── horizontal-vs-vertical-scaling@-34WGppX6QC5fkCvfCghp.md │ │ │ │ │ ├── how-computers-calculate@GDLKJkKgB-i7n0YcV2NDa.md │ │ │ │ │ ├── how-computers-work@-emdKpD5uRNuvem5rbFXJ.md │ │ │ │ │ ├── how-cpu-executes-programs@1eglba39q426Nh0E0qcdj.md │ │ │ │ │ ├── http@2tUwl-br-SRuwADSzmQag.md │ │ │ │ │ ├── huffman-coding@QrcijPiVT3bgqfkF-6ssi.md │ │ │ │ │ ├── in-order-traversal@KTrgf14Q6rg2f0v4dqq2s.md │ │ │ │ │ ├── indexes@BEbsUA39kZ5itqCwD585f.md │ │ │ │ │ ├── insertion-sort@ujDCW6zZE8dV_fpNf-oIl.md │ │ │ │ │ ├── instructions-and-programs@AxiGqbteK7ZSXEUt_zckH.md │ │ │ │ │ ├── java@1lQSUFrrIGq19nUnM92-I.md │ │ │ │ │ ├── k-ary--m-ary-tree@UOYeM-hqIKCrB9hGez4Q_.md │ │ │ │ │ ├── k-d-trees@C1eNsPjiQo8INbvL2Lt7L.md │ │ │ │ │ ├── knapsack-problem@yHeCRPhfAOWiggZeUHPU9.md │ │ │ │ │ ├── knuth-morris-pratt@8abFKMfaV9H8F38I0DcMT.md │ │ │ │ │ ├── kruskals-algorithm@Wqhg7E-lOz1oNcRXjUej8.md │ │ │ │ │ ├── lfu-cache@n11ujPI3of-52l2KW2CDQ.md │ │ │ │ │ ├── linear-search@XwyqBK9rgP1MMcJrdIzm5.md │ │ │ │ │ ├── linear@jymhjv8GiFALQpox6aZeu.md │ │ │ │ │ ├── linked-list@gr8BK6vq4AVwp_aUozZmf.md │ │ │ │ │ ├── little-endian@rD_5n5bjiNMVC0cPhEVyG.md │ │ │ │ │ ├── load-balancing@xDiS0HmrEoPjkQg9x2O3o.md │ │ │ │ │ ├── lock--mutex--semaphore@O6-vG3FuoYet4D0hbiyrv.md │ │ │ │ │ ├── locking@_sm63rZNKoibVndeNgOpW.md │ │ │ │ │ ├── logarithmic@nnlMNkQn1HU4U9yPbV9kQ.md │ │ │ │ │ ├── long-polling@XeJi6TwpI5Uaszj00Uv_2.md │ │ │ │ │ ├── longest-path-problem@4QVVYjDODMWsjnrE-4UBs.md │ │ │ │ │ ├── lru-cache@cEsboPT8nLvo0Zt0_oBq6.md │ │ │ │ │ ├── maze-solving-problem@nODFT-i2YsxUVsgwWkIWn.md │ │ │ │ │ ├── memory-management@jVsZFTzyrYEDyR8LiBQL0.md │ │ │ │ │ ├── merge-sort@Bh-whDbcCjl3m6mRm9w02.md │ │ │ │ │ ├── mfu-cache@hna0HLu0l4NTNNpyGqlW5.md │ │ │ │ │ ├── networking@zG5t3HqbZnh9CGRqp1Sb-.md │ │ │ │ │ ├── non-tail-recursion@iLEOuQgUgU5Jc38iXDpp5.md │ │ │ │ │ ├── normalization--denormalization@Rw7QjLC8hLtXSwmU_9kHC.md │ │ │ │ │ ├── np-complete@Lwkz7qozXRlVNA20zJbSw.md │ │ │ │ │ ├── np-hard@mJJ8DGUpBuHEJ7I6UTy1T.md │ │ │ │ │ ├── np@ewXUHpOnjm8YrLhce1dAQ.md │ │ │ │ │ ├── null-object-pattern@PpFQ0zmObZLvmBvqhTEMz.md │ │ │ │ │ ├── osi-model@pZ5x_zDYGzW9VxYycyXtN.md │ │ │ │ │ ├── owasp-top-10@3rPSp135TdSCyvXzEzn4p.md │ │ │ │ │ ├── p--np@0btHNkzWL1w_-pUgU_k2y.md │ │ │ │ │ ├── p@3aM17dPKNi8tRJsW8lesI.md │ │ │ │ │ ├── pacelc@g6HeyLptaAYx9QBKuHQyM.md │ │ │ │ │ ├── pick-a-language@tU4Umtnfu01t9gLlnlK6b.md │ │ │ │ │ ├── polynomial@sVFvpsAO1_ZH9aliEj9aF.md │ │ │ │ │ ├── post-order-traversal@4_oGXwjzSY5cX9n7L4iAA.md │ │ │ │ │ ├── pre-order-traversal@psTN5N66xoFHFopgd5faW.md │ │ │ │ │ ├── prims-algorithm@znpFIKwMJlepKJ8dH3kvC.md │ │ │ │ │ ├── probability@HZ3_xyphbjhBPwwQo_rHH.md │ │ │ │ │ ├── process-forking@RbdT5MOE4L-E7PPWKRITX.md │ │ │ │ │ ├── processes-and-threads@ETEUA7jaEGyOEX8tAVNWs.md │ │ │ │ │ ├── processes-vs-threads@IEX6v_MYpE5Ylk_28K2ZU.md │ │ │ │ │ ├── proxy@qLLJ_ehC8tSRfXsorYMQz.md │ │ │ │ │ ├── public-key-cryptography@bDZ34BPm3lX06ERSE10cY.md │ │ │ │ │ ├── python@RlKZzs44biQPgxD0tK1qx.md │ │ │ │ │ ├── queue@JI990pDX2jjNe6IH_Y_t0.md │ │ │ │ │ ├── queues@LCPEzpyAuHY3ggN3nYrNN.md │ │ │ │ │ ├── quick-sort@be0Q8GW9ZX1JbPrBvbMji.md │ │ │ │ │ ├── rabin-karp-algorithm@l5--4opvZoc_seVn__5R3.md │ │ │ │ │ ├── red--black-trees@eOL0_SzxBn7_xhNcBDi2D.md │ │ │ │ │ ├── registers-and-ram@U3379F4AO1KSmGtVmPr27.md │ │ │ │ │ ├── replication@WUEmEtlszbISSIWDKpvg6.md │ │ │ │ │ ├── rest@Kvz3Sn7L8CxP5ZXO1hlcU.md │ │ │ │ │ ├── robin-karp@Km5LvcJpyntrW2iA8h5e3.md │ │ │ │ │ ├── rust@1bDjg-KBDKRmE6f1MWY8l.md │ │ │ │ │ ├── scheduling-algorithms@Ge2nagN86ofa2y-yYR1lv.md │ │ │ │ │ ├── search-pattern-in-text@L4M5yFRKKR2axKXGcIA7d.md │ │ │ │ │ ├── security@JnJbJtsqKbVETY2vdLqCO.md │ │ │ │ │ ├── selection-sort@rOsHFXQm5jNz0RyZQ5ZGs.md │ │ │ │ │ ├── sequence-diagrams@gaUT5K2xS-WQMrIA0Bkb_.md │ │ │ │ │ ├── sharding@3K65efPag2076dy-MeTg4.md │ │ │ │ │ ├── short-polling@gGmNJ8dK28iqrlQHPz6md.md │ │ │ │ │ ├── skip-lists@K96ggeWqd5OwoNnkL04pc.md │ │ │ │ │ ├── small-o@2cg5PogENPhiYFXQnV9xC.md │ │ │ │ │ ├── small-omega@dUBRG_5aUYlICsjPbRlTf.md │ │ │ │ │ ├── sockets@u-c-UFegRb7xqsmvj9gVb.md │ │ │ │ │ ├── solving-n-queen-problem@HlAmTY1udqDT2mTfBU9P-.md │ │ │ │ │ ├── spanning-tree@L4xtWOdqGUf4SbJkoOsNM.md │ │ │ │ │ ├── sql-vs-nosql-databases@nprZscHdC_RdRIcGeGyVk.md │ │ │ │ │ ├── sse@JckRqZA8C6IqQLPpTCgf4.md │ │ │ │ │ ├── stack@hJB5gO9tosRlC4UmdSNzl.md │ │ │ │ │ ├── statemachine-diagrams@X0CKM9LaJUrgI5gIdqFvU.md │ │ │ │ │ ├── stored-procedures@FjhZGhzJjYyDn0PShKmpX.md │ │ │ │ │ ├── string-search--manipulations@NUWk-7IXmMU-4TT-oS8fF.md │ │ │ │ │ ├── substring-search@E9hf1ux1KKGHvvAShm67w.md │ │ │ │ │ ├── suffix-arrays@Ld1TUNS8713coMNvwhNIJ.md │ │ │ │ │ ├── system-design@w-fvEiSJysywR3AOAB0ve.md │ │ │ │ │ ├── tail-recursion@0_qNhprnXU3i8koW3XTdD.md │ │ │ │ │ ├── tcpip-model@Fed5y1D95WPpqoVg7kmob.md │ │ │ │ │ ├── the-knights-tour-problem@NcKW_3vJWL_rVlDBB_Qjs.md │ │ │ │ │ ├── tls--https@3pu2bGhoCLFIs6kNanwtz.md │ │ │ │ │ ├── transactions@KhvYJtSCUBOpEZXjHpQde.md │ │ │ │ │ ├── travelling-salesman-problem@ZG-hWjVoS3p9XfrtBL0sD.md │ │ │ │ │ ├── tree@_eWqiWUmOj0zUo_Ix3j1O.md │ │ │ │ │ ├── trees@IaPd_zuLbiOCwoSHQLoIG.md │ │ │ │ │ ├── tries@4qUVacMEz3XFiL_dMre6P.md │ │ │ │ │ ├── type-object-pattern@_2Jddpz_cdwyeIgrg5qt_.md │ │ │ │ │ ├── unbalanced-tree@w4sxmZR1BjX6wlrZmuOlf.md │ │ │ │ │ ├── undirected-graph@QGx8it2N_85PiPVjpTGK_.md │ │ │ │ │ ├── unicode@04hpfxI2x958tQI-0clsp.md │ │ │ │ │ ├── usecase-diagrams@dVvYbrcaxHLpvtX6HbS7g.md │ │ │ │ │ ├── views@lOj_ReWI1kQ3WajJZYOWU.md │ │ │ │ │ └── web-sockets@bVjI14VismTHNCyA0mEBP.md │ │ │ │ ├── faqs.astro │ │ │ │ └── migration-mapping.json │ │ │ ├── cpp/ │ │ │ │ ├── content/ │ │ │ │ │ ├── access-violations@y4-P4UNC--rE1vni8HdTn.md │ │ │ │ │ ├── algorithms@whyj6Z4RXFsVQYRfYYn7B.md │ │ │ │ │ ├── argument-dependent-lookup-adl@YSWN7nS8vA9nMldSUrZRT.md │ │ │ │ │ ├── arithmetic-operators@8aOSpZLWwZv_BEYiurhyR.md │ │ │ │ │ ├── auto-automatic-type-deduction@CG01PTVgHtjfKvsJkJLGl.md │ │ │ │ │ ├── basic-operations@kl2JI_Wl47c5r8SYzxvCq.md │ │ │ │ │ ├── bitwise-operators@zE4iPSq2KsrDSByQ0sGK_.md │ │ │ │ │ ├── boost@1d7h5P1Q0RVHryKPVogQy.md │ │ │ │ │ ├── build-systems@jVXFCo6puMxJ_ifn_uwim.md │ │ │ │ │ ├── c-0x@PPg0V5EzGBeJsysg1215V.md │ │ │ │ │ ├── c-11--14@T6rCTv9Dxkm-tEA-l9XEv.md │ │ │ │ │ ├── c-17@R2-qWGUxsTOeSHRuUzhd2.md │ │ │ │ │ ├── c-20@o3no4a5_iMFzEAGs56-BJ.md │ │ │ │ │ ├── c-23@sxbbKtg7kMNbkx7fXhjR9.md │ │ │ │ │ ├── c-vs-c@2Ag0t3LPryTF8khHLRfy-.md │ │ │ │ │ ├── catch2@s13jQuaC6gw0Lab3Cbyy6.md │ │ │ │ │ ├── cmake@ysnXvSHGBMMozBJyXpHl5.md │ │ │ │ │ ├── code-editors--ides@ew0AfyadpXPRO0ZY3Z19k.md │ │ │ │ │ ├── compiler-stages@DVckzBUMgk_lWThVkLyAT.md │ │ │ │ │ ├── compilers-and-features@hSG6Aux39X0cXi6ADy2al.md │ │ │ │ │ ├── compilers@FTMHsUiE8isD_OVZr62Xc.md │ │ │ │ │ ├── conan@ky_UqizToTZHC_b77qFi2.md │ │ │ │ │ ├── const_cast@5g22glc97siQOcTkHbwan.md │ │ │ │ │ ├── containers@1pydf-SR0QUfVNuBEyvzc.md │ │ │ │ │ ├── control-flow--statements@s5Gs4yF9TPh-psYmtPzks.md │ │ │ │ │ ├── copy-and-swap@lxAzI42jQdaofzQ5MXebG.md │ │ │ │ │ ├── copy-on-write@O2Du5gHHxFxAI2u5uO8wu.md │ │ │ │ │ ├── crtp@ttt-yeIi4BPWrgvW324W7.md │ │ │ │ │ ├── data-types@MwznA4qfpNlv6sqSNjPZi.md │ │ │ │ │ ├── date--time@yGvE6eHKlPMBB6rde0llR.md │ │ │ │ │ ├── debuggers@qmHs6_BzND_xpMmls5YUH.md │ │ │ │ │ ├── debugging-symbols@sR_FxGZHoMCV9Iv7z2_SX.md │ │ │ │ │ ├── diamond-inheritance@ofwdZm05AUqCIWmfgGHk8.md │ │ │ │ │ ├── dynamic-polymorphism@7h1VivjCPDwriL7FirtFv.md │ │ │ │ │ ├── dynamic-typing@i0EAFEUB-F0wBJWOtrl1A.md │ │ │ │ │ ├── dynamic_cast@4BdFcuQ5KNW94cu2jz-vE.md │ │ │ │ │ ├── erase-remove@YvmjrZSAOmjhVPo05MJqN.md │ │ │ │ │ ├── exception-handling@B2SGBENzUMl0SAjG4j91V.md │ │ │ │ │ ├── exceptions@NJud5SXBAUZ6Sr78kZ7jx.md │ │ │ │ │ ├── exit-codes@oWygnpwHq2poXQMTTSCpl.md │ │ │ │ │ ├── fmt@1CqQgmHDeo1HlPdpUJS7H.md │ │ │ │ │ ├── for--while--do-while-loops@_IP_e1K9LhNHilYTDh7L5.md │ │ │ │ │ ├── forward-declaration@ZHjU60uzJTezADRhDTESG.md │ │ │ │ │ ├── full-template-specialization@6hTcmJwNnQstbWWzNCfTe.md │ │ │ │ │ ├── function-overloading@sgfqb22sdN4VRJYkhAVaf.md │ │ │ │ │ ├── functions@oYi3YOc1GC2Nfp71VOkJt.md │ │ │ │ │ ├── gdb@BmWsoL9c_Aag5nVlMsKm2.md │ │ │ │ │ ├── grpc@621J9W4xCofumNZGo4TZT.md │ │ │ │ │ ├── gtest--gmock@MrAM-viRaF8DSxB6sVdD9.md │ │ │ │ │ ├── headers--cpp-files@CK7yf8Bo7kfbV6x2tZTrh.md │ │ │ │ │ ├── idioms@fb3bnfKXjSIjPAk4b95lg.md │ │ │ │ │ ├── if-else--switch--goto@bjpFWxiCKGz28E-ukhZBp.md │ │ │ │ │ ├── installing-c@0J_ltQEJh2g28OE2ZEYJj.md │ │ │ │ │ ├── introduction-to-language@NvODRFR0DLINB0RlPSsvt.md │ │ │ │ │ ├── iostream@VeVxZ230xkesQsIDig8zQ.md │ │ │ │ │ ├── iterators@Ebu8gzbyyXEeJryeE0SpG.md │ │ │ │ │ ├── lambdas@xjiFBVe-VGqCqWfkPVGKf.md │ │ │ │ │ ├── language-concepts@-6fwJQOfsorgHkoQGp4T3.md │ │ │ │ │ ├── language-tools@Kb2Pbz0Sq7YlO1vCwYxnX.md │ │ │ │ │ ├── library-inclusion@5mNqH_AEiLxUmgurNW1Fq.md │ │ │ │ │ ├── licensing@sLVs95EOeHZldoKY0L_dH.md │ │ │ │ │ ├── lifetime-of-objects@9aA_-IfQ9WmbPgwic0mFN.md │ │ │ │ │ ├── logical-operators@Y9gq8WkDA_XGe68JkY2UZ.md │ │ │ │ │ ├── macros@zKdlfZTRHwjtmRUGW9z9-.md │ │ │ │ │ ├── makefile@t6rZLH7l8JQm99ax_fEJ9.md │ │ │ │ │ ├── memory-leakage@6w0WExQ4lGIGgok6Thq0s.md │ │ │ │ │ ├── memory-model@mSFwsTYvmg-GwG4_DEIEf.md │ │ │ │ │ ├── multiple-inheritance@WjHpueZDK-d3oDNMVZi9w.md │ │ │ │ │ ├── multithreading@OXQUPqxzs1-giAACwl3X1.md │ │ │ │ │ ├── name-mangling@Lt7ss59KZw9Jwqj234jm2.md │ │ │ │ │ ├── namespaces@iIdC7V8sojwyEqK1xMuHn.md │ │ │ │ │ ├── newdelete-operators@Gld0nRs0sM8kRe8XmYolu.md │ │ │ │ │ ├── newest@sxbbKtg7kMNbkx7fXhjR9.md │ │ │ │ │ ├── ninja@HkUCD5A_M9bJxJRElkK0x.md │ │ │ │ │ ├── non-copyable--non-moveable@xjUaIp8gGxkN-cp8emJ2M.md │ │ │ │ │ ├── nuget@g0s0F4mLV16eNvMBflN2e.md │ │ │ │ │ ├── object-oriented-programming@b3-QYKNcW3LYCNOza3Olf.md │ │ │ │ │ ├── opencl@GGZJaYpRENaqloJzt0VtY.md │ │ │ │ │ ├── opencv@Eq3TKSFJ2F2mrTHAaU2J4.md │ │ │ │ │ ├── operator-overloading@llCBeut_uc9IAe2oi4KZ9.md │ │ │ │ │ ├── orbit-profiler@O0lVEMTAV1pq9sYCKQvh_.md │ │ │ │ │ ├── package-managers@h29eJG1hWHa7vMhSqtfV2.md │ │ │ │ │ ├── partial-template-specialization@1NYJtbdcdOB4-vIrnq4yX.md │ │ │ │ │ ├── pimpl@MEoWt8NKjPLVTeGgYf3cR.md │ │ │ │ │ ├── poco@nOkniNXfXwPPlOEJHJoGl.md │ │ │ │ │ ├── pointers-and-references@DWw8NxkLpIpiOSUaZZ1oA.md │ │ │ │ │ ├── protobuf@jpMCIWQko7p3ndezYHL4D.md │ │ │ │ │ ├── pybind11@tEkvlJPAkD5fji-MMODL7.md │ │ │ │ │ ├── pytorch-c@88pr5aN7cctZfDVVo-2ns.md │ │ │ │ │ ├── qt@gAZ9Dqgj1_UkaLzVgzx1t.md │ │ │ │ │ ├── raii@OmHDlLxCnH8RDdu5vx9fl.md │ │ │ │ │ ├── ranges_v3@et-dXKPYuyVW6eV2K3CM8.md │ │ │ │ │ ├── raw-pointers@uEGEmbxegATIrvGfobJb9.md │ │ │ │ │ ├── references@uUzRKa9wGzdUwwmAg3FWr.md │ │ │ │ │ ├── reinterpret_cast@ZMyFDJrpCauGrY5NZkOwg.md │ │ │ │ │ ├── rtti@r0yD1gfn03wTpEBi6zNsu.md │ │ │ │ │ ├── rule-of-zero-five-three@7sdEzZCIoarzznwO4XcCv.md │ │ │ │ │ ├── running-your-first-program@SEq0D2Zg5WTsIDtd1hW9f.md │ │ │ │ │ ├── scope@dKCYmxDNZubCVcR5rf8b-.md │ │ │ │ │ ├── setting-up-your-environment@Zc_TTzmM36yWsu3GvOy9x.md │ │ │ │ │ ├── sfinae@3C5UfejDX-1Z8ZF6C53xD.md │ │ │ │ │ ├── shared_ptr@b5jZIZD_U_CPg-_bdndjz.md │ │ │ │ │ ├── smart-pointers@ulvwm4rRPgkpgaqGgyH5a.md │ │ │ │ │ ├── spack@3ehBc2sKVlPj7dn4RVZCH.md │ │ │ │ │ ├── spdlog@q64qFxoCrR38RPsN2lC8x.md │ │ │ │ │ ├── standard-library--stl@DHdNBP7_ixjr6h-dIQ7g6.md │ │ │ │ │ ├── standards@vvE1aUsWbF1OFcmMUHbJa.md │ │ │ │ │ ├── static-polymorphism@obZIxRp0eMWdG7gplNIBc.md │ │ │ │ │ ├── static-typing@f1djN0GxoeVPr_0cl6vMq.md │ │ │ │ │ ├── static_cast@_XB2Imyf23-6AOeoNLhYQ.md │ │ │ │ │ ├── structures-and-classes@CMlWNQwpywNhO9B6Yj6Me.md │ │ │ │ │ ├── structuring-codebase@Zw2AOTK5uc9BoKEpY7W1C.md │ │ │ │ │ ├── template-specialization@sObOuccY0PDeGG-9GrFDF.md │ │ │ │ │ ├── templates@-6AOrbuOE7DJCmxlcgCay.md │ │ │ │ │ ├── tensorflow@j_eNHhs0J08Dt7HVbo4Q2.md │ │ │ │ │ ├── type-casting@PiMhw1oP9-NZEa6I9u4lX.md │ │ │ │ │ ├── type-traits@WptReUOwVth3C9-AVmMHF.md │ │ │ │ │ ├── undefined-behavior-ub@IDOlquv6jlfecwQoBwkGZ.md │ │ │ │ │ ├── understanding-debugger-messages@VtPb8-AJKzhTB0QbMtoU4.md │ │ │ │ │ ├── unique_ptr@k9c5seRkhgm_yHPpiz2X0.md │ │ │ │ │ ├── variadic-templates@w4EIf58KP-Pq-yc0HlGxc.md │ │ │ │ │ ├── vcpkg@PKG5pACLfRS2ogfzBX47_.md │ │ │ │ │ ├── virtual-methods@hNBErGNiegLsUJn_vgcOR.md │ │ │ │ │ ├── virtual-tables@s99ImazcwCgAESxZd8ksa.md │ │ │ │ │ ├── weak_ptr@vUwSS-uX36OWZouO0wOcy.md │ │ │ │ │ ├── what-is-c@x_28LiDVshqWns_aIBsdx.md │ │ │ │ │ ├── why-use-c@tl6VCQ5IEGDVyFcgj7jDm.md │ │ │ │ │ ├── windbg@y8VCbGDUco9bzGRfIBD8R.md │ │ │ │ │ └── working-with-libraries@4kkX5g_-plX9zVqr0ZoiR.md │ │ │ │ ├── cpp.json │ │ │ │ ├── cpp.md │ │ │ │ ├── faqs.astro │ │ │ │ └── migration-mapping.json │ │ │ ├── css/ │ │ │ │ ├── content/ │ │ │ │ │ ├── absolute-vs-relative@l7bBJLtKWkrzSfSPkZlBI.md │ │ │ │ │ ├── absolute@7LhPT3h-BEdHSF2iOevVl.md │ │ │ │ │ ├── accessibility@LDIZoK-XgmwqPdLH01vC5.md │ │ │ │ │ ├── attribute-selectors@m6KQMN1XWo4uWqs2F3KXH.md │ │ │ │ │ ├── background-attachment@6i0Zl05VMzUsh47cuUH4-.md │ │ │ │ │ ├── background-color@ATd9RE303X79aAmqvwS08.md │ │ │ │ │ ├── background-gradient@_9QA5_mLJ8_eiQN0ucIkQ.md │ │ │ │ │ ├── background-image@d-rp-EHKyHnzuIHWHOc7C.md │ │ │ │ │ ├── background-position@BBpeQcb7Y21C7-r3PFIMW.md │ │ │ │ │ ├── background@RqyaHX4Krk9e-6Eq9FHnS.md │ │ │ │ │ ├── bem@r28JBMZLEqZMDm-tVDYZk.md │ │ │ │ │ ├── block@uhHBvhgHjmIZDeOEPi_pZ.md │ │ │ │ │ ├── border@
SYMBOL INDEX (1833 symbols across 610 files)
FILE: scripts/assign-label-types.cjs
function getHostNameWithoutTld (line 14) | function getHostNameWithoutTld(hostname) {
function isOfficialWebsite (line 19) | function isOfficialWebsite(hostname, fileName, roadmapId) {
function getTypeFromHostname (line 48) | function getTypeFromHostname(hostname, fileName, roadmapId) {
function readNestedMarkdownFiles (line 111) | function readNestedMarkdownFiles(dir, files = []) {
FILE: scripts/best-practice-content.cjs
constant OPEN_AI_API_KEY (line 4) | const OPEN_AI_API_KEY = process.env.OPEN_AI_API_KEY;
constant ALL_BEST_PRACTICES_DIR (line 5) | const ALL_BEST_PRACTICES_DIR = path.join(
constant BEST_PRACTICE_CONTENT_DIR (line 25) | const BEST_PRACTICE_CONTENT_DIR = path.join(
function getFilesInFolder (line 36) | function getFilesInFolder(folderPath, fileList = {}) {
function writeTopicContent (line 59) | function writeTopicContent(topicTitle) {
function writeFileForGroup (line 92) | async function writeFileForGroup(group, topicUrlToPathMapping) {
function run (line 146) | async function run() {
FILE: scripts/best-practice-dirs.cjs
constant CONTENT_DIR (line 4) | const CONTENT_DIR = path.join(__dirname, '../content');
constant BEST_PRACTICE_CONTENT_DIR (line 6) | const BEST_PRACTICE_CONTENT_DIR = path.join(
function prepareDirTree (line 52) | function prepareDirTree(control, dirTree) {
function createDirTree (line 111) | function createDirTree(parentDir, dirTree, filePaths = {}) {
FILE: scripts/cleanup-orphaned-content.ts
constant ROADMAP_CONTENT_DIR (line 11) | const ROADMAP_CONTENT_DIR = path.join(__dirname, '../src/data/roadmaps');
type OrphanEntry (line 21) | interface OrphanEntry {
function fetchRoadmapJson (line 29) | async function fetchRoadmapJson(slug: string): Promise<{ nodes: Node[] }> {
function isEditorRoadmap (line 53) | async function isEditorRoadmap(slug: string): Promise<boolean> {
function getEditorRoadmapSlugs (line 64) | async function getEditorRoadmapSlugs(): Promise<string[]> {
function parseContentFilename (line 81) | function parseContentFilename(filename: string): { slug: string; nodeId:...
function cleanupRoadmap (line 89) | async function cleanupRoadmap(slug: string): Promise<OrphanEntry[]> {
function main (line 207) | async function main() {
FILE: scripts/compress-images.ts
type AllowedFileExtension (line 21) | type AllowedFileExtension = (typeof allowedFileExtensions)[number];
constant KB_IN_BYTES (line 26) | const KB_IN_BYTES = 1024;
constant COMPRESS_CONFIG (line 27) | const COMPRESS_CONFIG = {
function recursiveGetImages (line 142) | async function recursiveGetImages(dir: string): Promise<string[]> {
FILE: scripts/editor-roadmap-content-json.ts
function fetchRoadmapJson (line 24) | async function fetchRoadmapJson(roadmapId: string) {
constant ROADMAP_CONTENT_DIR (line 42) | const ROADMAP_CONTENT_DIR = path.join(__dirname, '../src/data/roadmaps');
FILE: scripts/editor-roadmap-content.ts
constant OPEN_AI_API_KEY (line 18) | const OPEN_AI_API_KEY = process.env.OPEN_AI_API_KEY;
constant ROADMAP_CONTENT_DIR (line 20) | const ROADMAP_CONTENT_DIR = path.join(__dirname, '../src/data/roadmaps');
function writeTopicContent (line 104) | function writeTopicContent(
function writeNodeContent (line 144) | async function writeNodeContent(node: Node & { parentTitle?: string }) {
FILE: scripts/editor-roadmap-dirs.ts
constant ROADMAP_CONTENT_DIR (line 17) | const ROADMAP_CONTENT_DIR = path.join(__dirname, '../src/data/roadmaps');
function fetchRoadmapJson (line 51) | async function fetchRoadmapJson(roadmapId: string) {
FILE: scripts/gemini-roadmap-content.ts
constant GEMINI_API_KEY (line 19) | const GEMINI_API_KEY = process.env.GEMINI_API_KEY;
constant ROADMAP_CONTENT_DIR (line 21) | const ROADMAP_CONTENT_DIR = path.join(__dirname, '../src/data/roadmaps');
function writeTopicContent (line 99) | function writeTopicContent(
function writeNodeContent (line 136) | async function writeNodeContent(node: Node & { parentTitle?: string }) {
FILE: scripts/generate-og-images.mjs
constant ALL_ROADMAP_DIR (line 10) | const ALL_ROADMAP_DIR = path.join(process.cwd(), '/src/data/roadmaps');
constant ALL_BEST_PRACTICE_DIR (line 11) | const ALL_BEST_PRACTICE_DIR = path.join(
constant ALL_GUIDE_DIR (line 15) | const ALL_GUIDE_DIR = path.join(process.cwd(), '/src/data/guides');
constant ALL_ROADMAP_IMAGE_DIR (line 17) | const ALL_ROADMAP_IMAGE_DIR = path.join(process.cwd(), '/public/roadmaps');
constant ALL_BEST_PRACTICE_IMAGE_DIR (line 18) | const ALL_BEST_PRACTICE_IMAGE_DIR = path.join(
constant ALL_AUTHOR_IMAGE_DIR (line 22) | const ALL_AUTHOR_IMAGE_DIR = path.join(process.cwd(), '/public');
function getAllRoadmaps (line 31) | async function getAllRoadmaps() {
function getAllBestPractices (line 56) | async function getAllBestPractices() {
function getAllGuides (line 81) | async function getAllGuides() {
function getAllAuthors (line 103) | async function getAllAuthors() {
function getAllRoadmapImageIds (line 124) | async function getAllRoadmapImageIds() {
function getAllBestPracticeImageIds (line 133) | async function getAllBestPracticeImageIds() {
function generateResourceOpenGraph (line 144) | async function generateResourceOpenGraph() {
function generateGuideOpenGraph (line 233) | async function generateGuideOpenGraph() {
function generateOpenGraph (line 271) | async function generateOpenGraph(
function getRoadmapDefaultTemplate (line 326) | function getRoadmapDefaultTemplate({ title, description }) {
function getRoadmapImageTemplate (line 476) | function getRoadmapImageTemplate({ title, description, image, height, wi...
function getGuideTemplate (line 500) | function getGuideTemplate({ title, description, authorName, authorAvatar...
function unescapeHtml (line 541) | function unescapeHtml(html) {
function hasSpecialCharacters (line 550) | function hasSpecialCharacters(str) {
FILE: scripts/migrate-content-repo-to-database.ts
function fetchRoadmapJson (line 28) | async function fetchRoadmapJson(
function syncContentToDatabase (line 56) | async function syncContentToDatabase(
constant ROADMAP_CONTENT_DIR (line 84) | const ROADMAP_CONTENT_DIR = path.join(__dirname, '../src/data/roadmaps');
FILE: scripts/migrate-editor-roadmap.ts
constant ROADMAP_CONTENT_DIR (line 12) | const ROADMAP_CONTENT_DIR = path.join(__dirname, '../src/data/roadmaps');
FILE: scripts/official-roadmap-assets.ts
function listAllRoadmaps (line 4) | async function listAllRoadmaps(): Promise<OfficialRoadmapDocument[]> {
FILE: scripts/roadmap-content.cjs
constant OPEN_AI_API_KEY (line 4) | const OPEN_AI_API_KEY = process.env.OPEN_AI_API_KEY;
constant ALL_ROADMAPS_DIR (line 5) | const ALL_ROADMAPS_DIR = path.join(__dirname, '../src/data/roadmaps');
constant ROADMAP_CONTENT_DIR (line 21) | const ROADMAP_CONTENT_DIR = path.join(ALL_ROADMAPS_DIR, roadmapId, 'cont...
function getFilesInFolder (line 28) | function getFilesInFolder(folderPath, fileList = {}) {
function writeTopicContent (line 56) | function writeTopicContent(currTopicUrl) {
function writeFileForGroup (line 107) | async function writeFileForGroup(group, topicUrlToPathMapping) {
function run (line 152) | async function run() {
FILE: scripts/roadmap-dirs.cjs
constant CONTENT_DIR (line 4) | const CONTENT_DIR = path.join(__dirname, '../content');
constant ROADMAP_CONTENT_DIR (line 6) | const ROADMAP_CONTENT_DIR = path.join(__dirname, '../src/data/roadmaps');
function prepareDirTree (line 44) | function prepareDirTree(control, dirTree, dirSortOrders) {
function createDirTree (line 106) | function createDirTree(parentDir, dirTree, sortOrders, filePaths = {}) {
FILE: scripts/roadmap-links.cjs
function readFiles (line 15) | function readFiles(folderPath) {
FILE: scripts/roadmap-tree-content.js
constant OPENAI_API_KEY (line 406) | const OPENAI_API_KEY = process.env.OPENAI_API_KEY;
FILE: scripts/sync-content-to-repo.ts
function roadmapTopics (line 24) | async function roadmapTopics(
function fetchRoadmapJson (line 42) | async function fetchRoadmapJson(
constant ROADMAP_CONTENT_DIR (line 62) | const ROADMAP_CONTENT_DIR = path.join(
function prepareTopicContent (line 104) | function prepareTopicContent(topic: OfficialRoadmapTopicContentDocument) {
FILE: scripts/sync-repo-to-database.ts
function fetchRoadmapJson (line 30) | async function fetchRoadmapJson(
function syncContentToDatabase (line 63) | async function syncContentToDatabase(
constant ROADMAP_CONTENT_DIR (line 109) | const ROADMAP_CONTENT_DIR = path.join(__dirname, '../src/data/roadmaps');
FILE: scripts/sync-roadmap-to-database.ts
function getAllFiles (line 38) | function getAllFiles(dir: string): string[] {
FILE: scripts/update-sponsors.cjs
function removeAllSponsors (line 16) | function removeAllSponsors(baseContentDir) {
function addPageSponsor (line 51) | function addPageSponsor({
FILE: sitemap.mjs
function getRoadmapIds (line 4) | async function getRoadmapIds() {
function getBestPracticesIds (line 8) | async function getBestPracticesIds() {
function shouldIndexPage (line 12) | function shouldIndexPage(pageUrl) {
function serializeSitemap (line 22) | async function serializeSitemap(item) {
FILE: src/api/ai-roadmap.ts
type GetAIRoadmapBySlugResponse (line 4) | type GetAIRoadmapBySlugResponse = {
function aiRoadmapApi (line 12) | function aiRoadmapApi(context: APIContext) {
type AICourseDocument (line 22) | interface AICourseDocument {
FILE: src/api/api.ts
type HttpOptionsType (line 4) | type HttpOptionsType = RequestInit | { headers: Record<string, any> };
type AppResponse (line 6) | type AppResponse = Record<string, any>;
type FetchError (line 8) | type FetchError = {
type AppError (line 13) | type AppError = {
type ApiReturn (line 19) | type ApiReturn<ResponseType, ErrorType> = {
function api (line 24) | function api(context: APIContext) {
FILE: src/api/leaderboard.ts
type LeaderboardUserDetails (line 4) | type LeaderboardUserDetails = {
type ListLeaderboardStatsResponse (line 11) | type ListLeaderboardStatsResponse = {
function leaderboardApi (line 29) | function leaderboardApi(context: APIContext) {
FILE: src/api/project.ts
function projectApi (line 4) | function projectApi(context: APIContext) {
FILE: src/api/roadmap.ts
type ListShowcaseRoadmapResponse (line 6) | type ListShowcaseRoadmapResponse = {
function roadmapApi (line 25) | function roadmapApi(context: APIContext) {
type ProjectPageType (line 42) | type ProjectPageType = {
function getProjectList (line 48) | async function getProjectList() {
FILE: src/api/user.ts
type AllowedRoadmapVisibility (line 7) | type AllowedRoadmapVisibility =
type AllowedCustomRoadmapVisibility (line 15) | type AllowedCustomRoadmapVisibility =
type AllowedProfileVisibility (line 19) | type AllowedProfileVisibility =
type AllowedOnboardingStatus (line 23) | type AllowedOnboardingStatus = (typeof allowedOnboardingStatus)[number];
type UserDocument (line 25) | interface UserDocument {
type UserActivityCount (line 80) | type UserActivityCount = {
type ProgressResponse (line 85) | type ProgressResponse = {
type GetPublicProfileResponse (line 97) | type GetPublicProfileResponse = Omit<
type GetUserProfileRoadmapResponse (line 107) | type GetUserProfileRoadmapResponse = {
function userApi (line 119) | function userApi(context: APIContext) {
FILE: src/components/AIChat/AIChat.tsx
type AIChatProps (line 49) | type AIChatProps = {
function AIChat (line 56) | function AIChat(props: AIChatProps) {
FILE: src/components/AIChat/AIChatCouse.tsx
type AIChatCourseType (line 3) | type AIChatCourseType = {
function parseAIChatCourse (line 8) | function parseAIChatCourse(content: string): AIChatCourseType | null {
type AIChatCourseProps (line 24) | type AIChatCourseProps = {
function AIChatCourse (line 28) | function AIChatCourse(props: AIChatCourseProps) {
FILE: src/components/AIChat/ChatHistory.tsx
type ChatHistoryProps (line 14) | type ChatHistoryProps = {
type AIChatCardProps (line 74) | type AIChatCardProps = RoadmapAIChatHistoryType & {
type ActionButtonProps (line 149) | type ActionButtonProps = {
function ActionButton (line 155) | function ActionButton(props: ActionButtonProps) {
FILE: src/components/AIChat/PersonalizedResponseForm.tsx
type ChatPreferencesFormData (line 15) | type ChatPreferencesFormData = {
type PersonalizedResponseFormProps (line 22) | type PersonalizedResponseFormProps = {
FILE: src/components/AIChat/QuickActionButton.tsx
type QuickActionButtonProps (line 4) | type QuickActionButtonProps = {
function QuickActionButton (line 12) | function QuickActionButton(props: QuickActionButtonProps) {
FILE: src/components/AIChat/QuickHelpPrompts.tsx
type QuickHelpPromptsProps (line 4) | type QuickHelpPromptsProps = {
function QuickHelpPrompts (line 8) | function QuickHelpPrompts(props: QuickHelpPromptsProps) {
FILE: src/components/AIChat/UploadResumeModal.tsx
type OnDrop (line 21) | type OnDrop<T extends File = File> = (
type UploadResumeModalProps (line 27) | type UploadResumeModalProps = {
function UploadResumeModal (line 34) | function UploadResumeModal(props: UploadResumeModalProps) {
FILE: src/components/AIChatHistory/AIChatHistory.tsx
type AIChatHistoryProps (line 14) | type AIChatHistoryProps = {
function AIChatHistory (line 18) | function AIChatHistory(props: AIChatHistoryProps) {
FILE: src/components/AIChatHistory/AIChatLayout.tsx
type AIChatLayoutProps (line 5) | type AIChatLayoutProps = {
function AIChatLayout (line 9) | function AIChatLayout(props: AIChatLayoutProps) {
FILE: src/components/AIChatHistory/ChatHistoryAction.tsx
type ChatHistoryActionProps (line 15) | type ChatHistoryActionProps = {
function ChatHistoryAction (line 20) | function ChatHistoryAction(props: ChatHistoryActionProps) {
FILE: src/components/AIChatHistory/ChatHistoryError.tsx
type ChatHistoryErrorProps (line 4) | type ChatHistoryErrorProps = {
function ChatHistoryError (line 9) | function ChatHistoryError(props: ChatHistoryErrorProps) {
FILE: src/components/AIChatHistory/ChatHistoryGroup.tsx
type ChatHistoryGroupProps (line 4) | type ChatHistoryGroupProps = {
function ChatHistoryGroup (line 12) | function ChatHistoryGroup(props: ChatHistoryGroupProps) {
FILE: src/components/AIChatHistory/ChatHistoryItem.tsx
type ChatHistoryItemProps (line 5) | type ChatHistoryItemProps = {
function ChatHistoryItem (line 12) | function ChatHistoryItem(props: ChatHistoryItemProps) {
FILE: src/components/AIChatHistory/ListChatHistory.tsx
type ListChatHistoryProps (line 22) | type ListChatHistoryProps = {
function ListChatHistory (line 30) | function ListChatHistory(props: ListChatHistoryProps) {
type UpgradeToProMessageProps (line 241) | type UpgradeToProMessageProps = {
function UpgradeToProMessage (line 247) | function UpgradeToProMessage(props: UpgradeToProMessageProps) {
FILE: src/components/AIChatHistory/ListChatHistorySkeleton.tsx
function ListChatHistorySkeleton (line 1) | function ListChatHistorySkeleton() {
FILE: src/components/AIChatHistory/SearchAIChatHistory.tsx
type SearchAIChatHistoryProps (line 6) | type SearchAIChatHistoryProps = {
function SearchAIChatHistory (line 13) | function SearchAIChatHistory(props: SearchAIChatHistoryProps) {
FILE: src/components/AIGuide/AIGuideActions.tsx
type AIGuideActionsType (line 10) | type AIGuideActionsType = {
function AIGuideActions (line 15) | function AIGuideActions(props: AIGuideActionsType) {
FILE: src/components/AIGuide/AIGuideCard.tsx
type AIGuideCardProps (line 4) | type AIGuideCardProps = {
function AIGuideCard (line 11) | function AIGuideCard(props: AIGuideCardProps) {
FILE: src/components/AIGuide/AILibraryLayout.tsx
type AILibraryLayoutProps (line 7) | type AILibraryLayoutProps = {
function AILibraryLayout (line 12) | function AILibraryLayout(props: AILibraryLayoutProps) {
FILE: src/components/AIQuiz/AIMCQQuestion.tsx
type AIMCQQuestionProps (line 16) | type AIMCQQuestionProps = {
function AIMCQQuestion (line 28) | function AIMCQQuestion(props: AIMCQQuestionProps) {
type QuestionTitleProps (line 193) | type QuestionTitleProps = {
function QuestionTitle (line 197) | function QuestionTitle(props: QuestionTitleProps) {
type QuestionExplanationProps (line 210) | type QuestionExplanationProps = {
function QuestionExplanation (line 216) | function QuestionExplanation(props: QuestionExplanationProps) {
FILE: src/components/AIQuiz/AIOpenEndedQuestion.tsx
type VerifyQuizAnswerResponse (line 8) | type VerifyQuizAnswerResponse = {
type AIOpenEndedQuestionProps (line 13) | type AIOpenEndedQuestionProps = {
function AIOpenEndedQuestion (line 30) | function AIOpenEndedQuestion(props: AIOpenEndedQuestionProps) {
FILE: src/components/AIQuiz/AIQuiz.tsx
type AIQuizProps (line 14) | type AIQuizProps = {
function AIQuiz (line 18) | function AIQuiz(props: AIQuizProps) {
FILE: src/components/AIQuiz/AIQuizActions.tsx
type AIQuizActionsType (line 10) | type AIQuizActionsType = {
function AIQuizActions (line 15) | function AIQuizActions(props: AIQuizActionsType) {
FILE: src/components/AIQuiz/AIQuizCard.tsx
type AIQuizCardProps (line 7) | type AIQuizCardProps = {
function AIQuizCard (line 13) | function AIQuizCard(props: AIQuizCardProps) {
FILE: src/components/AIQuiz/AIQuizContent.tsx
type AIQuizResultFeedbackBody (line 15) | type AIQuizResultFeedbackBody = {
type AIQuizResultFeedbackQuery (line 19) | type AIQuizResultFeedbackQuery = {};
type AIQuizResultFeedbackResponse (line 21) | type AIQuizResultFeedbackResponse = {
type QuestionState (line 27) | type QuestionState = {
constant DEFAULT_QUESTION_STATE (line 35) | const DEFAULT_QUESTION_STATE: QuestionState = {
type QuizStatus (line 43) | type QuizStatus = 'answering' | 'submitted' | 'reviewing';
type AIQuizContentProps (line 45) | type AIQuizContentProps = {
function AIQuizContent (line 52) | function AIQuizContent(props: AIQuizContentProps) {
FILE: src/components/AIQuiz/AIQuizGenerator.tsx
type AllowedFormat (line 31) | type AllowedFormat = (typeof allowedFormats)[number];
function AIQuizGenerator (line 33) | function AIQuizGenerator() {
FILE: src/components/AIQuiz/AIQuizLayout.tsx
type AIQuizLayoutProps (line 3) | type AIQuizLayoutProps = {
function AIQuizLayout (line 7) | function AIQuizLayout(props: AIQuizLayoutProps) {
FILE: src/components/AIQuiz/AIQuizResultStrip.tsx
type AIQuizResultStripProps (line 10) | type AIQuizResultStripProps = {
function AIQuizResultStrip (line 17) | function AIQuizResultStrip(props: AIQuizResultStripProps) {
type QuizStateButtonProps (line 48) | type QuizStateButtonProps = {
function QuizStateButton (line 57) | function QuizStateButton(props: QuizStateButtonProps) {
FILE: src/components/AIQuiz/AIQuizResults.tsx
type AIQuizResultsProps (line 22) | type AIQuizResultsProps = {
function AIQuizResults (line 33) | function AIQuizResults(props: AIQuizResultsProps) {
type StatRowProps (line 268) | type StatRowProps = {
function StatRow (line 276) | function StatRow(props: StatRowProps) {
type ActionButtonProps (line 316) | type ActionButtonProps = {
function ActionButton (line 323) | function ActionButton(props: ActionButtonProps) {
type ActionLinkProps (line 342) | type ActionLinkProps = {
function ActionLink (line 349) | function ActionLink(props: ActionLinkProps) {
type ResultCardProps (line 378) | type ResultCardProps = {
function ResultCard (line 385) | function ResultCard(props: ResultCardProps) {
type ResultActionProps (line 402) | type ResultActionProps = {
function ResultAction (line 409) | function ResultAction(props: ResultActionProps) {
type ResourceCardProps (line 426) | type ResourceCardProps = {
function ResourceCard (line 433) | function ResourceCard(props: ResourceCardProps) {
FILE: src/components/AIQuiz/CircularProgress.tsx
type CircularProgressProps (line 3) | type CircularProgressProps = {
function CircularProgress (line 9) | function CircularProgress(props: CircularProgressProps) {
FILE: src/components/AIQuiz/GenerateAIQuiz.tsx
type GenerateAIQuizProps (line 20) | type GenerateAIQuizProps = {
function GenerateAIQuiz (line 24) | function GenerateAIQuiz(props: GenerateAIQuizProps) {
FILE: src/components/AIQuiz/QuizTopNavigation.tsx
type QuizTopNavigationProps (line 9) | type QuizTopNavigationProps = {
function QuizTopNavigation (line 19) | function QuizTopNavigation(props: QuizTopNavigationProps) {
type NavigationButtonProps (line 88) | type NavigationButtonProps = {
function NavigationButton (line 94) | function NavigationButton(props: NavigationButtonProps) {
FILE: src/components/AIQuiz/UserQuizzesList.tsx
function UserQuizzesList (line 21) | function UserQuizzesList() {
FILE: src/components/AIRoadmap/AIRoadmap.tsx
type AIRoadmapChatActions (line 20) | type AIRoadmapChatActions = {
type AIRoadmapProps (line 24) | type AIRoadmapProps = {
function AIRoadmap (line 28) | function AIRoadmap(props: AIRoadmapProps) {
FILE: src/components/AIRoadmap/AIRoadmapActions.tsx
type AIRoadmapActionsType (line 10) | type AIRoadmapActionsType = {
function AIRoadmapActions (line 15) | function AIRoadmapActions(props: AIRoadmapActionsType) {
FILE: src/components/AIRoadmap/AIRoadmapCard.tsx
type AIRoadmapCardProps (line 7) | type AIRoadmapCardProps = {
function AIRoadmapCard (line 13) | function AIRoadmapCard(props: AIRoadmapCardProps) {
FILE: src/components/AIRoadmap/AIRoadmapChat.tsx
type AIRoadmapChatProps (line 37) | type AIRoadmapChatProps = {
function AIRoadmapChat (line 44) | function AIRoadmapChat(props: AIRoadmapChatProps) {
FILE: src/components/AIRoadmap/AIRoadmapContent.tsx
type RoadmapNodeDetails (line 6) | type RoadmapNodeDetails = {
function getNodeDetails (line 15) | function getNodeDetails(
type AIRoadmapContentProps (line 37) | type AIRoadmapContentProps = {
function AIRoadmapContent (line 46) | function AIRoadmapContent(props: AIRoadmapContentProps) {
FILE: src/components/AIRoadmap/AIRoadmapRegenerate.tsx
type AIRoadmapRegenerateProps (line 26) | type AIRoadmapRegenerateProps = {
function AIRoadmapRegenerate (line 31) | function AIRoadmapRegenerate(props: AIRoadmapRegenerateProps) {
type ActionButtonProps (line 273) | type ActionButtonProps = {
function ActionButton (line 280) | function ActionButton(props: ActionButtonProps) {
FILE: src/components/AIRoadmap/GenerateAIRoadmap.tsx
type GenerateAIRoadmapProps (line 15) | type GenerateAIRoadmapProps = {
function GenerateAIRoadmap (line 19) | function GenerateAIRoadmap(props: GenerateAIRoadmapProps) {
FILE: src/components/AIRoadmap/UserRoadmapsList.tsx
function UserRoadmapsList (line 21) | function UserRoadmapsList() {
FILE: src/components/AITutor/AIExploreCourseListing.tsx
function AIExploreCourseListing (line 18) | function AIExploreCourseListing() {
FILE: src/components/AITutor/AIFeaturedCoursesListing.tsx
function AIFeaturedCoursesListing (line 18) | function AIFeaturedCoursesListing() {
FILE: src/components/AITutor/AILoadingState.tsx
type AILoadingStateProps (line 3) | type AILoadingStateProps = {
function AILoadingState (line 8) | function AILoadingState(props: AILoadingStateProps) {
FILE: src/components/AITutor/AITutorHeader.tsx
type AITutorHeaderProps (line 7) | type AITutorHeaderProps = {
function AITutorHeader (line 14) | function AITutorHeader(props: AITutorHeaderProps) {
FILE: src/components/AITutor/AITutorLayout.tsx
type AITutorLayoutProps (line 7) | type AITutorLayoutProps = {
function AITutorLayout (line 14) | function AITutorLayout(props: AITutorLayoutProps) {
FILE: src/components/AITutor/AITutorLimits.tsx
type AITutorLimitsProps (line 4) | type AITutorLimitsProps = {
function AITutorLimits (line 12) | function AITutorLimits(props: AITutorLimitsProps) {
FILE: src/components/AITutor/AITutorSidebar.tsx
type AITutorSidebarProps (line 28) | type AITutorSidebarProps = {
type AITutorTab (line 99) | type AITutorTab = (typeof sidebarItems)[number]['key'];
function AITutorSidebar (line 101) | function AITutorSidebar(props: AITutorSidebarProps) {
type SidebarItem (line 235) | type SidebarItem = {
type ChildItem (line 248) | type ChildItem = {
type AITutorSidebarItemProps (line 255) | type AITutorSidebarItemProps = {
function AITutorSidebarItem (line 266) | function AITutorSidebarItem(props: AITutorSidebarItemProps) {
FILE: src/components/AITutor/AITutorTallMessage.tsx
type AITutorTallMessageProps (line 3) | type AITutorTallMessageProps = {
function AITutorTallMessage (line 11) | function AITutorTallMessage(props: AITutorTallMessageProps) {
FILE: src/components/AITutor/BaseDropdown.tsx
type BaseDropdownProps (line 6) | type BaseDropdownProps<T extends string> = {
function BaseDropdown (line 13) | function BaseDropdown<T extends string>(props: BaseDropdownProps<T>) {
FILE: src/components/AITutor/DifficultyDropdown.tsx
type DifficultyDropdownProps (line 7) | type DifficultyDropdownProps = {
function DifficultyDropdown (line 12) | function DifficultyDropdown(props: DifficultyDropdownProps) {
FILE: src/components/AITutor/LoginToView.tsx
type LoginToViewProps (line 6) | type LoginToViewProps = {
function LoginToView (line 10) | function LoginToView(props: LoginToViewProps) {
FILE: src/components/AITutor/NatureDropdown.tsx
type NatureType (line 5) | type NatureType = (typeof natureTypes)[number];
type NatureDropdownProps (line 12) | type NatureDropdownProps = {
function NatureDropdown (line 17) | function NatureDropdown(props: NatureDropdownProps) {
FILE: src/components/AITutor/UpgradeSidebarCard.tsx
type UpgradeSidebarCardProps (line 8) | type UpgradeSidebarCardProps = {
function UpgradeSidebarCard (line 18) | function UpgradeSidebarCard(props: UpgradeSidebarCardProps) {
FILE: src/components/AITutor/UserDropdown.tsx
type UserDropdownProps (line 22) | type UserDropdownProps = {};
function UserDropdown (line 24) | function UserDropdown(props: UserDropdownProps) {
FILE: src/components/AIUsageWarning/AIUsageWarning.tsx
type AIUsageWarningProps (line 3) | type AIUsageWarningProps = {
function AIUsageWarning (line 12) | function AIUsageWarning(props: AIUsageWarningProps) {
FILE: src/components/AccountSidebar/AccountSidebarUpgrade.tsx
function AccountSidebarUpgrade (line 8) | function AccountSidebarUpgrade() {
FILE: src/components/AccountStreak/AccountStreak.tsx
type AccountStreakProps (line 17) | type AccountStreakProps = {};
function AccountStreak (line 19) | function AccountStreak(props: AccountStreakProps) {
FILE: src/components/AccountStreak/InviteFriends.tsx
type InviteFriendsProps (line 7) | type InviteFriendsProps = {
function InviteFriends (line 11) | function InviteFriends(props: InviteFriendsProps) {
FILE: src/components/AccountStreak/StreakDay.tsx
type StreakDayProps (line 5) | type StreakDayProps = {
function StreakDay (line 15) | function StreakDay(props: StreakDayProps) {
FILE: src/components/AccountTerms.tsx
function AccountTerms (line 1) | function AccountTerms() {
FILE: src/components/Activity/ActivityStream.tsx
type AllowedActivityActionType (line 15) | type AllowedActivityActionType =
type UserStreamActivity (line 18) | type UserStreamActivity = {
type ActivityStreamProps (line 31) | type ActivityStreamProps = {
function ActivityStream (line 41) | function ActivityStream(props: ActivityStreamProps) {
FILE: src/components/Activity/ActivityTopicTitles.tsx
type ActivityTopicTitlesProps (line 4) | type ActivityTopicTitlesProps = {
function ActivityTopicTitles (line 10) | function ActivityTopicTitles(props: ActivityTopicTitlesProps) {
FILE: src/components/Activity/ActivityTopicsModal.tsx
type ActivityTopicDetailsProps (line 9) | type ActivityTopicDetailsProps = {
function ActivityTopicsModal (line 20) | function ActivityTopicsModal(props: ActivityTopicDetailsProps) {
FILE: src/components/Activity/EmptyStream.tsx
function EmptyStream (line 3) | function EmptyStream() {
FILE: src/components/Activity/ProjectProgress.tsx
type ProjectProgressType (line 8) | type ProjectProgressType = {
function ProjectProgress (line 16) | function ProjectProgress(props: ProjectProgressType) {
FILE: src/components/Activity/ProjectProgressActions.tsx
type ProjectProgressActionsType (line 10) | type ProjectProgressActionsType = {
function ProjectProgressActions (line 15) | function ProjectProgressActions(props: ProjectProgressActionsType) {
FILE: src/components/Activity/ProjectStatus.tsx
type ProjectStatusType (line 5) | type ProjectStatusType = {
function ProjectStatus (line 11) | function ProjectStatus(props: ProjectStatusType) {
FILE: src/components/Activity/ResourceProgress.tsx
type ResourceProgressType (line 6) | type ResourceProgressType = {
function ResourceProgress (line 23) | function ResourceProgress(props: ResourceProgressType) {
FILE: src/components/Activity/ResourceProgressActions.tsx
type ResourceProgressActionsType (line 10) | type ResourceProgressActionsType = {
function ResourceProgressActions (line 19) | function ResourceProgressActions(props: ResourceProgressActionsType) {
FILE: src/components/AddTeamRoadmap.tsx
type AddTeamRoadmapProps (line 10) | type AddTeamRoadmapProps = {
function AddTeamRoadmap (line 19) | function AddTeamRoadmap(props: AddTeamRoadmapProps) {
FILE: src/components/AdvertiseForm.tsx
type InputProps (line 6) | type InputProps = {
function Input (line 18) | function Input(props: InputProps) {
function AdvertiseForm (line 59) | function AdvertiseForm() {
FILE: src/components/Analytics/analytics.ts
type Window (line 5) | interface Window {
FILE: src/components/AppChecklist.tsx
function AppChecklist (line 3) | function AppChecklist() {
FILE: src/components/AuthenticationFlow/AuthenticationForm.tsx
type AuthenticationFormProps (line 8) | type AuthenticationFormProps = {
function AuthenticationForm (line 12) | function AuthenticationForm(props: AuthenticationFormProps) {
FILE: src/components/AuthenticationFlow/CourseLoginPopup.tsx
type CourseLoginPopupProps (line 9) | type CourseLoginPopupProps = {
constant CHECKOUT_AFTER_LOGIN_KEY (line 14) | const CHECKOUT_AFTER_LOGIN_KEY = 'checkoutAfterLogin';
constant SAMPLE_AFTER_LOGIN_KEY (line 15) | const SAMPLE_AFTER_LOGIN_KEY = 'sampleAfterLogin';
function CourseLoginPopup (line 17) | function CourseLoginPopup(props: CourseLoginPopupProps) {
FILE: src/components/AuthenticationFlow/EmailLoginForm.tsx
type EmailLoginFormProps (line 10) | type EmailLoginFormProps = {
function EmailLoginForm (line 15) | function EmailLoginForm(props: EmailLoginFormProps) {
FILE: src/components/AuthenticationFlow/EmailSignupForm.tsx
type EmailSignupFormProps (line 11) | type EmailSignupFormProps = {
function EmailSignupForm (line 16) | function EmailSignupForm(props: EmailSignupFormProps) {
FILE: src/components/AuthenticationFlow/ForgotPasswordForm.tsx
function ForgotPasswordForm (line 4) | function ForgotPasswordForm() {
FILE: src/components/AuthenticationFlow/GitHubButton.tsx
type GitHubButtonProps (line 14) | type GitHubButtonProps = {
constant GITHUB_REDIRECT_AT (line 20) | const GITHUB_REDIRECT_AT = 'githubRedirectAt';
constant GITHUB_LAST_PAGE (line 21) | const GITHUB_LAST_PAGE = 'githubLastPage';
function GitHubButton (line 23) | function GitHubButton(props: GitHubButtonProps) {
FILE: src/components/AuthenticationFlow/GoogleButton.tsx
type GoogleButtonProps (line 11) | type GoogleButtonProps = {
constant GOOGLE_REDIRECT_AT (line 17) | const GOOGLE_REDIRECT_AT = 'googleRedirectAt';
constant GOOGLE_LAST_PAGE (line 18) | const GOOGLE_LAST_PAGE = 'googleLastPage';
function GoogleButton (line 20) | function GoogleButton(props: GoogleButtonProps) {
FILE: src/components/AuthenticationFlow/LinkedInButton.tsx
type LinkedInButtonProps (line 14) | type LinkedInButtonProps = {
constant LINKEDIN_REDIRECT_AT (line 20) | const LINKEDIN_REDIRECT_AT = 'linkedInRedirectAt';
constant LINKEDIN_LAST_PAGE (line 21) | const LINKEDIN_LAST_PAGE = 'linkedInLastPage';
function LinkedInButton (line 23) | function LinkedInButton(props: LinkedInButtonProps) {
FILE: src/components/AuthenticationFlow/ResetPasswordForm.tsx
function ResetPasswordForm (line 6) | function ResetPasswordForm() {
FILE: src/components/AuthenticationFlow/TriggerVerifyAccount.tsx
function TriggerVerifyAccount (line 13) | function TriggerVerifyAccount() {
FILE: src/components/AuthenticationFlow/TriggerVerifyEmail.tsx
function TriggerVerifyEmail (line 9) | function TriggerVerifyEmail() {
FILE: src/components/AuthenticationFlow/VerificationEmailMessage.tsx
function VerificationEmailMessage (line 5) | function VerificationEmailMessage() {
FILE: src/components/Authenticator/authenticator.ts
function easeInElement (line 5) | function easeInElement(el: Element) {
function showHideAuthElements (line 13) | function showHideAuthElements(hideOrShow: 'hide' | 'show' = 'hide') {
function showHideGuestElements (line 23) | function showHideGuestElements(hideOrShow: 'hide' | 'show' = 'hide') {
function handleGuest (line 34) | function handleGuest() {
function handleAuthenticated (line 66) | function handleAuthenticated() {
function handleAuthRequired (line 88) | function handleAuthRequired() {
FILE: src/components/Badge.tsx
type BadgeProps (line 1) | type BadgeProps = {
function Badge (line 6) | function Badge(type: BadgeProps) {
FILE: src/components/Befriend.tsx
type FriendshipStatus (line 15) | type FriendshipStatus =
type UserResponse (line 23) | type UserResponse = {
function Befriend (line 31) | function Befriend() {
FILE: src/components/Billing/BillingPage.tsx
type CreateCustomerPortalBody (line 27) | type CreateCustomerPortalBody = {};
type CreateCustomerPortalResponse (line 29) | type CreateCustomerPortalResponse = {
function BillingPage (line 33) | function BillingPage() {
FILE: src/components/Billing/BillingWarning.tsx
type BillingWarningProps (line 3) | type BillingWarningProps = {
function BillingWarning (line 11) | function BillingWarning(props: BillingWarningProps) {
FILE: src/components/Billing/CheckSubscriptionVerification.tsx
function CheckSubscriptionVerification (line 5) | function CheckSubscriptionVerification() {
FILE: src/components/Billing/EmptyBillingScreen.tsx
type EmptyBillingScreenProps (line 10) | type EmptyBillingScreenProps = {
function EmptyBillingScreen (line 37) | function EmptyBillingScreen(props: EmptyBillingScreenProps) {
FILE: src/components/Billing/GlobalUpgradeModal.tsx
function GlobalUpgradeModal (line 8) | function GlobalUpgradeModal() {
FILE: src/components/Billing/UpdatePlanConfirmation.tsx
type UpdatePlanBody (line 10) | type UpdatePlanBody = {
type UpdatePlanResponse (line 14) | type UpdatePlanResponse = {
type UpdatePlanConfirmationProps (line 18) | type UpdatePlanConfirmationProps = {
function UpdatePlanConfirmation (line 24) | function UpdatePlanConfirmation(props: UpdatePlanConfirmationProps) {
FILE: src/components/Billing/UpgradeAccountModal.tsx
type Perk (line 25) | type Perk = {
constant PREMIUM_PERKS (line 32) | const PREMIUM_PERKS: Perk[] = [
type CreateSubscriptionCheckoutSessionBody (line 56) | type CreateSubscriptionCheckoutSessionBody = {
type CreateSubscriptionCheckoutSessionResponse (line 62) | type CreateSubscriptionCheckoutSessionResponse = {
type UpgradeAccountModalProps (line 66) | type UpgradeAccountModalProps = {
function UpgradeAccountModal (line 72) | function UpgradeAccountModal(props: UpgradeAccountModalProps) {
FILE: src/components/Billing/VerifyUpgrade.tsx
type VerifyUpgradeProps (line 9) | type VerifyUpgradeProps = {
function VerifyUpgrade (line 13) | function VerifyUpgrade(props: VerifyUpgradeProps) {
FILE: src/components/ChangelogImages.tsx
type ChangelogImagesProps (line 5) | interface ChangelogImagesProps {
FILE: src/components/ChatEditor/ChatEditor.tsx
type ChatEditorProps (line 35) | type ChatEditorProps = {
function ChatEditor (line 41) | function ChatEditor(props: ChatEditorProps) {
FILE: src/components/ChatEditor/VariableExtension/VariableExtension.tsx
type VariableNodeAttrs (line 7) | interface VariableNodeAttrs {
type VariableOptions (line 20) | type VariableOptions<
type VariableType (line 79) | type VariableType = {
type VariableStorage (line 84) | type VariableStorage = {
method addStorage (line 99) | addStorage() {
method addOptions (line 105) | addOptions() {
method addAttributes (line 171) | addAttributes() {
method parseHTML (line 203) | parseHTML() {
method renderHTML (line 211) | renderHTML({ node, HTMLAttributes }) {
method renderText (line 255) | renderText({ node }) {
method addKeyboardShortcuts (line 271) | addKeyboardShortcuts() {
method addProseMirrorPlugins (line 303) | addProseMirrorPlugins() {
FILE: src/components/ChatEditor/VariableExtension/VariableSuggestion.tsx
type VariableListProps (line 16) | type VariableListProps = {
function variableSuggestion (line 108) | function variableSuggestion(): Omit<SuggestionOptions, 'editor'> {
FILE: src/components/ChatMessages/RoadmapChatIntroMessage.tsx
type RoadmapChatIntroMessageProps (line 5) | type RoadmapChatIntroMessageProps = {
function RoadmapChatIntroMessage (line 9) | function RoadmapChatIntroMessage(props: RoadmapChatIntroMessageProps) {
FILE: src/components/ChatMessages/RoadmapChatMessage.tsx
type RoadmapMessageProps (line 18) | type RoadmapMessageProps = {
function RoadmapChatMessage (line 26) | function RoadmapChatMessage(props: RoadmapMessageProps) {
FILE: src/components/ChatMessages/RoadmapChatMessages.tsx
type MessagesProps (line 6) | type MessagesProps = {
function _RoadmapChatMessages (line 15) | function _RoadmapChatMessages(props: MessagesProps) {
FILE: src/components/ChatMessages/RoadmapRecommendations.tsx
type RoadmapSlugListType (line 7) | type RoadmapSlugListType = {
function parseRoadmapSlugList (line 11) | function parseRoadmapSlugList(content: string): RoadmapSlugListType[] {
type RoadmapRecommendationsProps (line 37) | type RoadmapRecommendationsProps = {
function RoadmapRecommendations (line 41) | function RoadmapRecommendations(props: RoadmapRecommendationsProps) {
FILE: src/components/ChatMessages/RoadmapTopicList.tsx
type TopicListType (line 7) | type TopicListType = {
function parseTopicList (line 11) | function parseTopicList(content: string): TopicListType[] {
type RoadmapTopicListProps (line 35) | type RoadmapTopicListProps = {
function RoadmapTopicList (line 41) | function RoadmapTopicList(props: RoadmapTopicListProps) {
FILE: src/components/ChatMessages/ShareResourceLink.tsx
type ShareResourceLinkProps (line 7) | type ShareResourceLinkProps = {
function ShareResourceLink (line 11) | function ShareResourceLink(props: ShareResourceLinkProps) {
FILE: src/components/ChatMessages/TopicChatMessage.tsx
type TopicChatMessageProps (line 7) | type TopicChatMessageProps = {
function TopicChatMessage (line 11) | function TopicChatMessage(props: TopicChatMessageProps) {
FILE: src/components/ChatMessages/TopicChatMessages.tsx
type TopicChatMessagesProps (line 5) | type TopicChatMessagesProps = {
function TopicChatMessages (line 10) | function TopicChatMessages(props: TopicChatMessagesProps) {
FILE: src/components/ChatMessages/UserPrgressActionList.tsx
type UpdateUserProgress (line 17) | type UpdateUserProgress = {
function parseUserProgress (line 22) | function parseUserProgress(content: string): UpdateUserProgress[] {
type BulkUpdateResourceProgressBody (line 53) | type BulkUpdateResourceProgressBody = {
type BulkUpdateResourceProgressResponse (line 60) | type BulkUpdateResourceProgressResponse = {
type UserProgressActionListProps (line 66) | type UserProgressActionListProps = {
function UserProgressActionList (line 72) | function UserProgressActionList(props: UserProgressActionListProps) {
type ProgressItemProps (line 212) | type ProgressItemProps = {
function ProgressItem (line 222) | function ProgressItem(props: ProgressItemProps) {
FILE: src/components/ChatMessages/UserProgressList.tsx
type RoadmapChatUserProgressListProps (line 6) | type RoadmapChatUserProgressListProps = {
function RoadmapChatUserProgressList (line 10) | function RoadmapChatUserProgressList(
FILE: src/components/CommandMenu/CommandMenu.tsx
type PageType (line 23) | type PageType = {
function shouldShowPage (line 104) | function shouldShowPage(page: PageType) {
function CommandMenu (line 110) | function CommandMenu() {
FILE: src/components/Confetti.tsx
type ConfettiPosition (line 4) | type ConfettiPosition = {
type ConfettiProps (line 11) | type ConfettiProps = {
function Confetti (line 17) | function Confetti(props: ConfettiProps) {
FILE: src/components/ContentGenerator/ContentGenerator.tsx
type AllowedFormat (line 32) | type AllowedFormat = (typeof allowedFormats)[number];
function ContentGenerator (line 34) | function ContentGenerator() {
FILE: src/components/ContentGenerator/FormatItem.tsx
type FormatItemProps (line 4) | type FormatItemProps = {
function FormatItem (line 11) | function FormatItem(props: FormatItemProps) {
FILE: src/components/ContentGenerator/QuestionAnswerChat.tsx
type QuestionAnswerChatMessage (line 15) | type QuestionAnswerChatMessage =
type QuestionAnswerChatProps (line 23) | type QuestionAnswerChatProps = {
function QuestionAnswerChat (line 38) | function QuestionAnswerChat(props: QuestionAnswerChatProps) {
type QuestionAnswerChatMessageProps (line 294) | type QuestionAnswerChatMessageProps = {
function QuestionAnswerChatMessage (line 303) | function QuestionAnswerChatMessage(props: QuestionAnswerChatMessageProps) {
FILE: src/components/CookieSettingsButton.tsx
function CookieSettingsButton (line 4) | function CookieSettingsButton() {
FILE: src/components/CreateTeam/ContentConfirmationModal.tsx
type ContentConfirmationModalProps (line 3) | type ContentConfirmationModalProps = {
function ContentConfirmationModal (line 8) | function ContentConfirmationModal(props: ContentConfirmationModalProps) {
FILE: src/components/CreateTeam/CreateTeamForm.tsx
type TeamDocument (line 14) | interface TeamDocument {
function CreateTeamForm (line 32) | function CreateTeamForm() {
FILE: src/components/CreateTeam/NextButton.tsx
type NextButtonProps (line 3) | type NextButtonProps = {
function NextButton (line 12) | function NextButton(props: NextButtonProps) {
FILE: src/components/CreateTeam/RoadmapSelector.tsx
type TeamResourceConfig (line 16) | type TeamResourceConfig = {
type RoadmapSelectorProps (line 31) | type RoadmapSelectorProps = {
function RoadmapSelector (line 37) | function RoadmapSelector(props: RoadmapSelectorProps) {
FILE: src/components/CreateTeam/RoleDropdown.tsx
type AllowedRoles (line 23) | type AllowedRoles = (typeof allowedRoles)[number]['value'];
type RoleDropdownProps (line 25) | type RoleDropdownProps = {
function RoleDropdown (line 31) | function RoleDropdown(props: RoleDropdownProps) {
FILE: src/components/CreateTeam/SelectRoadmapModal.tsx
type SelectRoadmapModalProps (line 9) | type SelectRoadmapModalProps = {
function SelectRoadmapModal (line 18) | function SelectRoadmapModal(props: SelectRoadmapModalProps) {
FILE: src/components/CreateTeam/SelectRoadmapModalItem.tsx
type SelectRoadmapModalItemProps (line 3) | type SelectRoadmapModalItemProps = {
function SelectRoadmapModalItem (line 9) | function SelectRoadmapModalItem(props: SelectRoadmapModalItemProps) {
FILE: src/components/CreateTeam/Step0.tsx
type ValidTeamType (line 25) | type ValidTeamType = (typeof validTeamTypes)[number]['value'];
type Step0Props (line 27) | type Step0Props = {
function Step0 (line 34) | function Step0(props: Step0Props) {
FILE: src/components/CreateTeam/Step1.tsx
type ValidTeamSize (line 19) | type ValidTeamSize = (typeof validTeamSizes)[number];
type Step1Props (line 21) | type Step1Props = {
function Step1 (line 28) | function Step1(props: Step1Props) {
FILE: src/components/CreateTeam/Step2.tsx
type Step2Props (line 4) | type Step2Props = {
function Step2 (line 12) | function Step2(props: Step2Props) {
FILE: src/components/CreateTeam/Step3.tsx
type Step3Props (line 8) | type Step3Props = {
type InviteType (line 14) | type InviteType = {
function generateId (line 20) | function generateId() {
function Step3 (line 24) | function Step3(props: Step3Props) {
FILE: src/components/CreateTeam/Step4.tsx
type Step4Props (line 4) | type Step4Props = {
function Step4 (line 8) | function Step4({ team }: Step4Props) {
FILE: src/components/CreateTeam/UpdateTeamResourceModal.tsx
type ProgressMapProps (line 13) | type ProgressMapProps = {
function UpdateTeamResourceModal (line 22) | function UpdateTeamResourceModal(props: ProgressMapProps) {
FILE: src/components/CustomRoadmap/CreateRoadmap/CreateRoadmapButton.tsx
type CreateRoadmapButtonProps (line 11) | type CreateRoadmapButtonProps = {
function CreateRoadmapButton (line 18) | function CreateRoadmapButton(props: CreateRoadmapButtonProps) {
FILE: src/components/CustomRoadmap/CreateRoadmap/CreateRoadmapModal.tsx
type AllowedRoadmapVisibility (line 20) | type AllowedRoadmapVisibility =
type AllowedCustomRoadmapType (line 23) | type AllowedCustomRoadmapType =
type AllowedShowcaseStatus (line 32) | type AllowedShowcaseStatus = (typeof allowedShowcaseStatus)[number];
type RoadmapDocument (line 34) | interface RoadmapDocument {
type CreateRoadmapModalProps (line 79) | interface CreateRoadmapModalProps {
function CreateRoadmapModal (line 86) | function CreateRoadmapModal(props: CreateRoadmapModalProps) {
FILE: src/components/CustomRoadmap/CustomRoadmap.tsx
type AllowedLinkTypes (line 27) | type AllowedLinkTypes = (typeof allowedLinkTypes)[number];
type RoadmapContentDocument (line 29) | interface RoadmapContentDocument {
type CreatorType (line 43) | type CreatorType = {
type GetRoadmapResponse (line 49) | type GetRoadmapResponse = RoadmapDocument & {
function hideRoadmapLoader (line 56) | function hideRoadmapLoader() {
type CustomRoadmapProps (line 65) | type CustomRoadmapProps = {
function CustomRoadmap (line 70) | function CustomRoadmap(props: CustomRoadmapProps) {
FILE: src/components/CustomRoadmap/CustomRoadmapAlert.tsx
function CustomRoadmapAlert (line 15) | function CustomRoadmapAlert() {
FILE: src/components/CustomRoadmap/CustomRoadmapRatings.tsx
type CustomRoadmapRatingsProps (line 9) | type CustomRoadmapRatingsProps = {
function CustomRoadmapRatings (line 16) | function CustomRoadmapRatings(props: CustomRoadmapRatingsProps) {
FILE: src/components/CustomRoadmap/CustomRoadmapRatingsModal.tsx
type ActiveTab (line 7) | type ActiveTab = 'ratings' | 'feedback';
type CustomRoadmapRatingsModalProps (line 9) | type CustomRoadmapRatingsModalProps = {
function CustomRoadmapRatingsModal (line 16) | function CustomRoadmapRatingsModal(
FILE: src/components/CustomRoadmap/EmbedRoadmapModal.tsx
type ShareRoadmapModalProps (line 10) | type ShareRoadmapModalProps = {
function EmbedRoadmapModal (line 14) | function EmbedRoadmapModal(props: ShareRoadmapModalProps) {
FILE: src/components/CustomRoadmap/EmptyRoadmap.tsx
type EmptyRoadmapProps (line 4) | type EmptyRoadmapProps = {
function EmptyRoadmap (line 10) | function EmptyRoadmap(props: EmptyRoadmapProps) {
FILE: src/components/CustomRoadmap/FlowRoadmapRenderer.tsx
type FlowRoadmapRendererProps (line 18) | type FlowRoadmapRendererProps = {
function FlowRoadmapRenderer (line 25) | function FlowRoadmapRenderer(props: FlowRoadmapRendererProps) {
FILE: src/components/CustomRoadmap/ListRoadmapRatings.tsx
type RoadmapRatingDocument (line 13) | interface RoadmapRatingDocument {
type ListRoadmapRatingsResponse (line 24) | type ListRoadmapRatingsResponse = {
type ListRoadmapRatingsProps (line 35) | type ListRoadmapRatingsProps = {
function ListRoadmapRatings (line 40) | function ListRoadmapRatings(props: ListRoadmapRatingsProps) {
FILE: src/components/CustomRoadmap/PersonalRoadmapActionDropdown.tsx
type PersonalRoadmapActionDropdownProps (line 6) | type PersonalRoadmapActionDropdownProps = {
function PersonalRoadmapActionDropdown (line 12) | function PersonalRoadmapActionDropdown(
FILE: src/components/CustomRoadmap/PersonalRoadmapList.tsx
type PersonalRoadmapListType (line 23) | type PersonalRoadmapListType = {
function PersonalRoadmapList (line 31) | function PersonalRoadmapList(props: PersonalRoadmapListType) {
type CustomRoadmapItemProps (line 146) | type CustomRoadmapItemProps = {
function CustomRoadmapItem (line 154) | function CustomRoadmapItem(props: CustomRoadmapItemProps) {
type VisibilityLabelProps (line 218) | type VisibilityLabelProps = {
function VisibilityBadge (line 248) | function VisibilityBadge(props: VisibilityLabelProps) {
FILE: src/components/CustomRoadmap/RateRoadmapForm.tsx
type GetMyRoadmapRatingResponse (line 13) | type GetMyRoadmapRatingResponse = {
type RateRoadmapFormProps (line 19) | type RateRoadmapFormProps = {
function RateRoadmapForm (line 25) | function RateRoadmapForm(props: RateRoadmapFormProps) {
FILE: src/components/CustomRoadmap/ResourceProgressStats.tsx
type ResourceProgressStatsProps (line 9) | type ResourceProgressStatsProps = {
function ResourceProgressStats (line 15) | function ResourceProgressStats(props: ResourceProgressStatsProps) {
FILE: src/components/CustomRoadmap/RestrictedPage.tsx
type RestrictedPageProps (line 4) | type RestrictedPageProps = {
function RestrictedPage (line 8) | function RestrictedPage(props: RestrictedPageProps) {
type ErrorMessageProps (line 30) | type ErrorMessageProps = {
function ErrorMessage (line 36) | function ErrorMessage(props: ErrorMessageProps) {
FILE: src/components/CustomRoadmap/RoadmapActionButton.tsx
type RoadmapActionButtonProps (line 5) | type RoadmapActionButtonProps = {
function RoadmapActionButton (line 11) | function RoadmapActionButton(props: RoadmapActionButtonProps) {
FILE: src/components/CustomRoadmap/RoadmapHeader.tsx
type RoadmapHeaderProps (line 17) | type RoadmapHeaderProps = {};
function RoadmapHeader (line 19) | function RoadmapHeader(props: RoadmapHeaderProps) {
FILE: src/components/CustomRoadmap/RoadmapHint.tsx
type RoadmapHintProps (line 4) | type RoadmapHintProps = {
function RoadmapHint (line 9) | function RoadmapHint(props: RoadmapHintProps) {
FILE: src/components/CustomRoadmap/RoadmapListPage.tsx
type FriendUserType (line 15) | type FriendUserType = {
type GetRoadmapListResponse (line 22) | type GetRoadmapListResponse = {
type TabType (line 32) | type TabType = {
constant MAX_ROADMAP_LIMIT (line 42) | const MAX_ROADMAP_LIMIT = 3;
function RoadmapListPage (line 44) | function RoadmapListPage() {
FILE: src/components/CustomRoadmap/ShareRoadmapModal.tsx
type ShareRoadmapModalProps (line 13) | type ShareRoadmapModalProps = {
function ShareRoadmapModal (line 39) | function ShareRoadmapModal(props: ShareRoadmapModalProps) {
FILE: src/components/CustomRoadmap/SharedRoadmapList.tsx
type GroupByCreator (line 5) | type GroupByCreator = {
type SharedRoadmapListProps (line 10) | type SharedRoadmapListProps = {
function SharedRoadmapList (line 14) | function SharedRoadmapList(props: SharedRoadmapListProps) {
FILE: src/components/CustomRoadmap/Showcase/ShowcaseAlert.tsx
type ShowcaseAlertProps (line 7) | type ShowcaseAlertProps = {
function ShowcaseAlert (line 11) | function ShowcaseAlert(props: ShowcaseAlertProps) {
FILE: src/components/CustomRoadmap/Showcase/ShowcaseStatus.tsx
type ShowcaseStatusProps (line 6) | type ShowcaseStatusProps = {
function ShowcaseStatus (line 10) | function ShowcaseStatus(props: ShowcaseStatusProps) {
FILE: src/components/CustomRoadmap/Showcase/SubmitShowcaseWarning.tsx
type SubmitShowcaseWarningProps (line 10) | type SubmitShowcaseWarningProps = {
function SubmitShowcaseWarning (line 14) | function SubmitShowcaseWarning(props: SubmitShowcaseWarningProps) {
FILE: src/components/CustomRoadmap/SkeletonRoadmapHeader.tsx
function SkeletonRoadmapHeader (line 1) | function SkeletonRoadmapHeader() {
FILE: src/components/DailyDevIcon.tsx
function DailyDevIcon (line 3) | function DailyDevIcon(props: SVGProps<SVGSVGElement>) {
FILE: src/components/Dashboard/DashboardAiRoadmaps.tsx
type DashboardAiRoadmapsProps (line 6) | type DashboardAiRoadmapsProps = {
function DashboardAiRoadmaps (line 15) | function DashboardAiRoadmaps(props: DashboardAiRoadmapsProps) {
type CustomProgressCardSkeletonProps (line 75) | type CustomProgressCardSkeletonProps = {};
function RoadmapCardSkeleton (line 77) | function RoadmapCardSkeleton(props: CustomProgressCardSkeletonProps) {
FILE: src/components/Dashboard/DashboardBookmarkCard.tsx
type DashboardBookmarkCardProps (line 4) | type DashboardBookmarkCardProps = {
function DashboardBookmarkCard (line 8) | function DashboardBookmarkCard(props: DashboardBookmarkCardProps) {
FILE: src/components/Dashboard/DashboardCardLink.tsx
type DashboardCardLinkProps (line 4) | type DashboardCardLinkProps = {
function DashboardCardLink (line 12) | function DashboardCardLink(props: DashboardCardLinkProps) {
FILE: src/components/Dashboard/DashboardCustomProgressCard.tsx
type DashboardCustomProgressCardProps (line 5) | type DashboardCustomProgressCardProps = {
function DashboardCustomProgressCard (line 9) | function DashboardCustomProgressCard(props: DashboardCustomProgressCardP...
FILE: src/components/Dashboard/DashboardPage.tsx
type DashboardPageProps (line 17) | type DashboardPageProps = {
function DashboardPage (line 27) | function DashboardPage(props: DashboardPageProps) {
FILE: src/components/Dashboard/DashboardProgressCard.tsx
type DashboardProgressCardProps (line 4) | type DashboardProgressCardProps = {
function DashboardProgressCard (line 8) | function DashboardProgressCard(props: DashboardProgressCardProps) {
FILE: src/components/Dashboard/DashboardProjectCard.tsx
type DashboardProjectCardProps (line 6) | type DashboardProjectCardProps = {
function DashboardProjectCard (line 12) | function DashboardProjectCard(props: DashboardProjectCardProps) {
FILE: src/components/Dashboard/DashboardTabButton.tsx
type DashboardTabProps (line 4) | type DashboardTabProps = {
function DashboardTabButton (line 14) | function DashboardTabButton(props: DashboardTabProps) {
FILE: src/components/Dashboard/DashboardTeamRoadmaps.tsx
type DashboardTeamRoadmapsProps (line 18) | type DashboardTeamRoadmapsProps = {
function DashboardTeamRoadmaps (line 31) | function DashboardTeamRoadmaps(props: DashboardTeamRoadmapsProps) {
FILE: src/components/Dashboard/EmptyStackMessage.tsx
type EmptyStackMessageProps (line 3) | type EmptyStackMessageProps = {
function EmptyStackMessage (line 12) | function EmptyStackMessage(props: EmptyStackMessageProps) {
FILE: src/components/Dashboard/ListDashboardCustomProgress.tsx
type ListDashboardCustomProgressProps (line 10) | type ListDashboardCustomProgressProps = {
function ListDashboardCustomProgress (line 17) | function ListDashboardCustomProgress(
type CustomProgressCardSkeletonProps (line 114) | type CustomProgressCardSkeletonProps = {};
function CustomProgressCardSkeleton (line 116) | function CustomProgressCardSkeleton(
FILE: src/components/Dashboard/LoadingProgress.tsx
type LoadingProgressProps (line 1) | type LoadingProgressProps = {};
function LoadingProgress (line 3) | function LoadingProgress(props: LoadingProgressProps) {
FILE: src/components/Dashboard/PersonalDashboard.tsx
type UserDashboardResponse (line 40) | type UserDashboardResponse = {
type BuiltInRoadmap (line 52) | type BuiltInRoadmap = {
type PersonalDashboardProps (line 64) | type PersonalDashboardProps = {
type DashboardStatItemProps (line 73) | type DashboardStatItemProps = {
function UpgradeAccountButton (line 77) | function UpgradeAccountButton(props: DashboardStatItemProps) {
type ProfileButtonProps (line 111) | type ProfileButtonProps = {
function PersonalProfileButton (line 118) | function PersonalProfileButton(props: ProfileButtonProps) {
type DashboardStatsProps (line 164) | type DashboardStatsProps = {
function DashboardStats (line 171) | function DashboardStats(props: DashboardStatsProps) {
function PersonalDashboard (line 191) | function PersonalDashboard(props: PersonalDashboardProps) {
FILE: src/components/Dashboard/ProgressStack.tsx
type ProgressStackProps (line 19) | type ProgressStackProps = {
constant MAX_PROGRESS_TO_SHOW (line 29) | const MAX_PROGRESS_TO_SHOW = 11;
constant MAX_PROJECTS_TO_SHOW (line 30) | const MAX_PROJECTS_TO_SHOW = 8;
type ProgressLaneProps (line 32) | type ProgressLaneProps = {
function ProgressLane (line 49) | function ProgressLane(props: ProgressLaneProps) {
function ProgressStack (line 128) | function ProgressStack(props: ProgressStackProps) {
type ShowAllButtonProps (line 303) | type ShowAllButtonProps = {
function ShowAllButton (line 311) | function ShowAllButton(props: ShowAllButtonProps) {
type CardSkeletonProps (line 327) | type CardSkeletonProps = {
function CardSkeleton (line 331) | function CardSkeleton(props: CardSkeletonProps) {
type StatsCardProps (line 344) | type StatsCardProps = {
function StatsCard (line 350) | function StatsCard(props: StatsCardProps) {
FILE: src/components/Dashboard/RecommendedRoadmaps.tsx
type RecommendedRoadmapsProps (line 5) | type RecommendedRoadmapsProps = {
function RecommendedRoadmaps (line 10) | function RecommendedRoadmaps(props: RecommendedRoadmapsProps) {
type RecommendedRoadmapCardProps (line 49) | type RecommendedRoadmapCardProps = {
function RecommendedRoadmapCard (line 53) | function RecommendedRoadmapCard(props: RecommendedRoadmapCardProps) {
function RecommendedCardSkeleton (line 68) | function RecommendedCardSkeleton() {
FILE: src/components/Dashboard/TeamDashboard.tsx
type TeamDashboardProps (line 14) | type TeamDashboardProps = {
function TeamDashboard (line 20) | function TeamDashboard(props: TeamDashboardProps) {
type TeamMemberLoadingProps (line 176) | type TeamMemberLoadingProps = {
function TeamMemberLoading (line 180) | function TeamMemberLoading(props: TeamMemberLoadingProps) {
FILE: src/components/DeleteTeamPopup.tsx
type DeleteTeamPopupProps (line 9) | type DeleteTeamPopupProps = {
function DeleteTeamPopup (line 13) | function DeleteTeamPopup(props: DeleteTeamPopupProps) {
FILE: src/components/DiscoverRoadmaps/DiscoverError.tsx
type DiscoverErrorProps (line 3) | type DiscoverErrorProps = {
function DiscoverError (line 7) | function DiscoverError(props: DiscoverErrorProps) {
FILE: src/components/DiscoverRoadmaps/DiscoverRoadmapSorting.tsx
type DiscoverRoadmapSortingProps (line 25) | type DiscoverRoadmapSortingProps = {
function DiscoverRoadmapSorting (line 30) | function DiscoverRoadmapSorting(props: DiscoverRoadmapSortingProps) {
FILE: src/components/DiscoverRoadmaps/DiscoverRoadmaps.tsx
type DiscoverRoadmapsProps (line 16) | type DiscoverRoadmapsProps = {};
type SortByValues (line 18) | type SortByValues = 'rating' | '-rating' | 'createdAt' | '-createdAt';
type QueryParams (line 20) | type QueryParams = {
type PageState (line 26) | type PageState = {
function DiscoverRoadmaps (line 32) | function DiscoverRoadmaps(props: DiscoverRoadmapsProps) {
FILE: src/components/DiscoverRoadmaps/EmptyDiscoverRoadmaps.tsx
function EmptyDiscoverRoadmaps (line 5) | function EmptyDiscoverRoadmaps() {
FILE: src/components/DiscoverRoadmaps/SearchRoadmap.tsx
type SearchRoadmapProps (line 6) | type SearchRoadmapProps = {
function SearchRoadmap (line 13) | function SearchRoadmap(props: SearchRoadmapProps) {
FILE: src/components/DownloadRoadmapButton.tsx
type DownloadRoadmapButtonProps (line 7) | type DownloadRoadmapButtonProps = {
function DownloadRoadmapButton (line 11) | function DownloadRoadmapButton(props: DownloadRoadmapButtonProps) {
FILE: src/components/EditorRoadmap/EditorRoadmap.tsx
type EditorRoadmapProps (line 15) | type EditorRoadmapProps = {
function EditorRoadmap (line 25) | function EditorRoadmap(props: EditorRoadmapProps) {
FILE: src/components/EditorRoadmap/EditorRoadmapRenderer.tsx
type RoadmapRendererProps (line 24) | type RoadmapRendererProps = {
type RoadmapNodeDetails (line 34) | type RoadmapNodeDetails = {
function getNodeDetails (line 41) | function getNodeDetails(svgElement: SVGElement): RoadmapNodeDetails | nu...
function EditorRoadmapRenderer (line 66) | function EditorRoadmapRenderer(props: RoadmapRendererProps) {
FILE: src/components/ExploreAIRoadmap/AIRoadmapsList.tsx
type ExploreRoadmapsResponse (line 5) | type ExploreRoadmapsResponse = {
type AIRoadmapsListProps (line 13) | type AIRoadmapsListProps = {
function AIRoadmapsList (line 17) | function AIRoadmapsList(props: AIRoadmapsListProps) {
FILE: src/components/ExploreAIRoadmap/EmptyRoadmaps.tsx
function EmptyRoadmaps (line 3) | function EmptyRoadmaps() {
FILE: src/components/ExploreAIRoadmap/ExploreAIRoadmap.tsx
type AIRoadmapDocument (line 17) | interface AIRoadmapDocument {
type ExploreRoadmapsResponse (line 28) | type ExploreRoadmapsResponse = {
type QueryParams (line 36) | type QueryParams = {
type PageState (line 42) | type PageState = {
function ExploreAIRoadmap (line 48) | function ExploreAIRoadmap() {
FILE: src/components/ExploreAIRoadmap/ExploreAISearch.tsx
type ExploreAISearchProps (line 6) | type ExploreAISearchProps = {
function ExploreAISearch (line 13) | function ExploreAISearch(props: ExploreAISearchProps) {
FILE: src/components/ExploreAIRoadmap/ExploreAISorting.tsx
type SortByValues (line 5) | type SortByValues = 'viewCount' | 'createdAt' | '-createdAt';
type ExploreAISortingProps (line 21) | type ExploreAISortingProps = {
function ExploreAISorting (line 26) | function ExploreAISorting(props: ExploreAISortingProps) {
FILE: src/components/ExploreAIRoadmap/LoadingRoadmaps.tsx
function LoadingRoadmaps (line 1) | function LoadingRoadmaps() {
FILE: src/components/FAQs/FAQs.tsx
type FAQsProps (line 6) | type FAQsProps = {
function FAQs (line 10) | function FAQs(props: FAQsProps) {
FILE: src/components/FAQs/Question.tsx
type QuestionProps (line 4) | type QuestionProps = {
function Question (line 11) | function Question(props: QuestionProps) {
FILE: src/components/FeatureAnnouncement.tsx
type FeatureAnnouncementProps (line 6) | type FeatureAnnouncementProps = {};
function FeatureAnnouncement (line 8) | function FeatureAnnouncement(props: FeatureAnnouncementProps) {
FILE: src/components/FeaturedGuides/FeaturedGuideList.tsx
type FeaturedGuidesProps (line 4) | interface FeaturedGuidesProps {
function FeaturedGuideList (line 10) | function FeaturedGuideList(props: FeaturedGuidesProps) {
FILE: src/components/FeaturedGuides/GuideListItem.tsx
type GuideListItemProps (line 7) | interface GuideListItemProps {
function GuideListItem (line 11) | function GuideListItem(props: GuideListItemProps) {
FILE: src/components/FeaturedItems/FavoriteIcon.tsx
type FavoriteIconProps (line 1) | type FavoriteIconProps = {
function FavoriteIcon (line 5) | function FavoriteIcon(props: FavoriteIconProps) {
FILE: src/components/FeaturedItems/MarkFavorite.tsx
type MarkFavoriteType (line 12) | type MarkFavoriteType = {
function MarkFavorite (line 19) | function MarkFavorite({
FILE: src/components/FeaturedVideos/FeaturedVideoList.tsx
type FeaturedVideoListProps (line 4) | interface FeaturedVideoListProps {
function FeaturedVideoList (line 9) | function FeaturedVideoList(props: FeaturedVideoListProps) {
FILE: src/components/FeaturedVideos/VideoListItem.tsx
type VideoListItemProps (line 3) | interface VideoListItemProps {
function VideoListItem (line 7) | function VideoListItem(props: VideoListItemProps) {
FILE: src/components/Feedback/SubmitFeedbackPopup.tsx
type SubmitFeedbackPopupProps (line 9) | type SubmitFeedbackPopupProps = {
function SubmitFeedbackPopup (line 13) | function SubmitFeedbackPopup(props: SubmitFeedbackPopupProps) {
FILE: src/components/FrameRenderer/ProgressNudge.tsx
type ProgressNudgeProps (line 8) | type ProgressNudgeProps = {
function ProgressNudge (line 13) | function ProgressNudge(props: ProgressNudgeProps) {
FILE: src/components/FrameRenderer/RoadmapFloatingChat.tsx
type ChatHeaderButtonProps (line 43) | type ChatHeaderButtonProps = {
function ChatHeaderButton (line 52) | function ChatHeaderButton(props: ChatHeaderButtonProps) {
type UpgradeMessageProps (line 91) | type UpgradeMessageProps = {
function UpgradeMessage (line 95) | function UpgradeMessage(props: UpgradeMessageProps) {
type UsageButtonProps (line 121) | type UsageButtonProps = {
function UsageButton (line 126) | function UsageButton(props: UsageButtonProps) {
type RoadmapChatProps (line 157) | type RoadmapChatProps = {
function RoadmapFloatingChat (line 161) | function RoadmapFloatingChat(props: RoadmapChatProps) {
FILE: src/components/FrameRenderer/renderer.ts
class Renderer (line 18) | class Renderer {
method constructor (line 27) | constructor() {
method loaderEl (line 46) | get loaderEl() {
method containerEl (line 50) | get containerEl() {
method prepareConfig (line 54) | prepareConfig() {
method jsonToSvg (line 69) | jsonToSvg(jsonUrl: string): Promise<void> | null {
method onDOMLoaded (line 115) | onDOMLoaded() {
method switchRoadmap (line 134) | switchRoadmap(newJsonUrl: string) {
method updateTopicStatus (line 145) | updateTopicStatus(topicId: string, newStatus: ResourceProgressType) {
method handleSvgRightClick (line 179) | handleSvgRightClick(e: any) {
method handleSvgClick (line 205) | handleSvgClick(e: any) {
method init (line 293) | init() {
FILE: src/components/Friends/SidebarFriendsCounter.tsx
type GetFriendCountsResponse (line 4) | type GetFriendCountsResponse = {
function SidebarFriendsCounter (line 12) | function SidebarFriendsCounter() {
FILE: src/components/GenerateCourse/AICourse.tsx
type DifficultyLevel (line 23) | type DifficultyLevel = (typeof difficultyLevels)[number];
type AICourseProps (line 25) | type AICourseProps = {};
function AICourse (line 27) | function AICourse(props: AICourseProps) {
FILE: src/components/GenerateCourse/AICourseActions.tsx
type AICourseActionsType (line 10) | type AICourseActionsType = {
function AICourseActions (line 15) | function AICourseActions(props: AICourseActionsType) {
FILE: src/components/GenerateCourse/AICourseCard.tsx
type AICourseCardProps (line 8) | type AICourseCardProps = {
function AICourseCard (line 15) | function AICourseCard(props: AICourseCardProps) {
FILE: src/components/GenerateCourse/AICourseContent.tsx
type AICourseContentProps (line 30) | type AICourseContentProps = {
type AICourseViewMode (line 39) | type AICourseViewMode = 'module' | 'outline' | 'roadmap';
function AICourseContent (line 41) | function AICourseContent(props: AICourseContentProps) {
FILE: src/components/GenerateCourse/AICourseFooter.tsx
type AICourseFooterProps (line 3) | type AICourseFooterProps = {
function AICourseFooter (line 6) | function AICourseFooter(props: AICourseFooterProps) {
FILE: src/components/GenerateCourse/AICourseLesson.tsx
function getQuestionsFromResult (line 43) | function getQuestionsFromResult(result: string) {
type AICourseLessonProps (line 55) | type AICourseLessonProps = {
function AICourseLesson (line 79) | function AICourseLesson(props: AICourseLessonProps) {
FILE: src/components/GenerateCourse/AICourseLessonChat.tsx
type AllowedAIChatRole (line 40) | type AllowedAIChatRole = 'user' | 'assistant';
type AIChatHistoryType (line 41) | type AIChatHistoryType = {
type AICourseLessonChatProps (line 48) | type AICourseLessonChatProps = {
function AICourseLessonChat (line 67) | function AICourseLessonChat(props: AICourseLessonChatProps) {
type AIChatCardProps (line 397) | type AIChatCardProps = {
function AIChatCard (line 403) | function AIChatCard(props: AIChatCardProps) {
type CapabilityCardProps (line 445) | type CapabilityCardProps = {
function CapabilityCard (line 452) | function CapabilityCard({
FILE: src/components/GenerateCourse/AICourseLimit.tsx
type AICourseLimitProps (line 9) | type AICourseLimitProps = {
function AICourseLimit (line 14) | function AICourseLimit(props: AICourseLimitProps) {
FILE: src/components/GenerateCourse/AICourseOutlineHeader.tsx
type AICourseOutlineHeaderProps (line 7) | type AICourseOutlineHeaderProps = {
function AICourseOutlineHeader (line 18) | function AICourseOutlineHeader(props: AICourseOutlineHeaderProps) {
FILE: src/components/GenerateCourse/AICourseOutlineView.tsx
type AICourseOutlineViewProps (line 10) | type AICourseOutlineViewProps = {
function AICourseOutlineView (line 25) | function AICourseOutlineView(props: AICourseOutlineViewProps) {
FILE: src/components/GenerateCourse/AICourseRoadmapView.tsx
type AICourseRoadmapViewProps (line 30) | type AICourseRoadmapViewProps = {
function AICourseRoadmapView (line 46) | function AICourseRoadmapView(props: AICourseRoadmapViewProps) {
FILE: src/components/GenerateCourse/AICourseSearch.tsx
type AICourseSearchProps (line 5) | type AICourseSearchProps = {
function AICourseSearch (line 12) | function AICourseSearch(props: AICourseSearchProps) {
FILE: src/components/GenerateCourse/AICourseSidebarModuleList.tsx
type AICourseModuleListProps (line 10) | type AICourseModuleListProps = {
function AICourseSidebarModuleList (line 29) | function AICourseSidebarModuleList(props: AICourseModuleListProps) {
FILE: src/components/GenerateCourse/AILimitsPopup.tsx
type AILimitsPopupProps (line 9) | type AILimitsPopupProps = {
function AILimitsPopup (line 14) | function AILimitsPopup(props: AILimitsPopupProps) {
FILE: src/components/GenerateCourse/AIRoadmapViewSwitch.tsx
type AIRoadmapViewSwitchProps (line 5) | type AIRoadmapViewSwitchProps = {
function AIRoadmapViewSwitch (line 12) | function AIRoadmapViewSwitch(props: AIRoadmapViewSwitchProps) {
type SwitchButtonProps (line 42) | type SwitchButtonProps = {
function SwitchButton (line 51) | function SwitchButton(props: SwitchButtonProps) {
FILE: src/components/GenerateCourse/CircularProgress.tsx
function ChapterNumberSkeleton (line 3) | function ChapterNumberSkeleton() {
type CircularProgressProps (line 9) | type CircularProgressProps = {
function CircularProgress (line 17) | function CircularProgress(props: CircularProgressProps) {
FILE: src/components/GenerateCourse/FineTuneCourse.tsx
type QuestionProps (line 4) | type QuestionProps = {
function Question (line 12) | function Question(props: QuestionProps) {
type FineTuneCourseProps (line 37) | type FineTuneCourseProps = {
function FineTuneCourse (line 49) | function FineTuneCourse(props: FineTuneCourseProps) {
FILE: src/components/GenerateCourse/ForkCourseAlert.tsx
type ForkCourseAlertProps (line 5) | type ForkCourseAlertProps = {
function ForkCourseAlert (line 11) | function ForkCourseAlert(props: ForkCourseAlertProps) {
FILE: src/components/GenerateCourse/ForkCourseConfirmation.tsx
type ForkAICourseParams (line 10) | type ForkAICourseParams = {
type ForkAICourseBody (line 14) | type ForkAICourseBody = {};
type ForkAICourseQuery (line 16) | type ForkAICourseQuery = {};
type ForkAICourseResponse (line 18) | type ForkAICourseResponse = AICourseDocument;
type ForkCourseConfirmationProps (line 20) | type ForkCourseConfirmationProps = {
function ForkCourseConfirmation (line 25) | function ForkCourseConfirmation(props: ForkCourseConfirmationProps) {
FILE: src/components/GenerateCourse/GenerateAICourse.tsx
type GenerateAICourseProps (line 15) | type GenerateAICourseProps = {};
function GenerateAICourse (line 17) | function GenerateAICourse(props: GenerateAICourseProps) {
FILE: src/components/GenerateCourse/GetAICourse.tsx
type GetAICourseProps (line 9) | type GetAICourseProps = {
function GetAICourse (line 13) | function GetAICourse(props: GetAICourseProps) {
FILE: src/components/GenerateCourse/ModifyCoursePrompt.tsx
type ModifyCoursePromptProps (line 4) | type ModifyCoursePromptProps = {
function ModifyCoursePrompt (line 11) | function ModifyCoursePrompt(props: ModifyCoursePromptProps) {
FILE: src/components/GenerateCourse/RegenerateLesson.tsx
type RegenerateLessonProps (line 10) | type RegenerateLessonProps = {
function RegenerateLesson (line 16) | function RegenerateLesson(props: RegenerateLessonProps) {
FILE: src/components/GenerateCourse/RegenerateOutline.tsx
type RegenerateOutlineProps (line 14) | type RegenerateOutlineProps = {
function RegenerateOutline (line 21) | function RegenerateOutline(props: RegenerateOutlineProps) {
FILE: src/components/GenerateCourse/TestMyKnowledgeAction.tsx
type TestMyKnowledgeActionProps (line 20) | type TestMyKnowledgeActionProps = {
function TestMyKnowledgeAction (line 26) | function TestMyKnowledgeAction(props: TestMyKnowledgeActionProps) {
type ListQuestionsProps (line 165) | type ListQuestionsProps = {
function ListQuestions (line 171) | function ListQuestions(props: ListQuestionsProps) {
type QuizItemProps (line 278) | type QuizItemProps = {
function QuizItem (line 295) | function QuizItem(props: QuizItemProps) {
type QuizOptionStatus (line 435) | type QuizOptionStatus = 'default' | 'selected' | 'wrong' | 'correct';
type QuizOptionProps (line 437) | type QuizOptionProps = {
function QuizOption (line 444) | function QuizOption(props: QuizOptionProps) {
FILE: src/components/GenerateCourse/UserCoursesList.tsx
function UserCoursesList (line 21) | function UserCoursesList() {
FILE: src/components/GenerateGuide/AIGuide.tsx
type AIGuideProps (line 23) | type AIGuideProps = {
function AIGuide (line 27) | function AIGuide(props: AIGuideProps) {
type ListSuggestionsProps (line 193) | type ListSuggestionsProps = {
function ListSuggestions (line 201) | function ListSuggestions(props: ListSuggestionsProps) {
FILE: src/components/GenerateGuide/AIGuideChat.tsx
type AIGuideChatProps (line 32) | type AIGuideChatProps = {
function AIGuideChat (line 40) | function AIGuideChat(props: AIGuideChatProps) {
FILE: src/components/GenerateGuide/AIGuideContent.tsx
type AIGuideContentProps (line 7) | type AIGuideContentProps = {
function AIGuideContent (line 14) | function AIGuideContent(props: AIGuideContentProps) {
FILE: src/components/GenerateGuide/AIGuideRegenerate.tsx
type AIGuideRegenerateProps (line 17) | type AIGuideRegenerateProps = {
function AIGuideRegenerate (line 22) | function AIGuideRegenerate(props: AIGuideRegenerateProps) {
FILE: src/components/GenerateGuide/GenerateAIGuide.tsx
type GenerateAIGuideProps (line 17) | type GenerateAIGuideProps = {
function GenerateAIGuide (line 21) | function GenerateAIGuide(props: GenerateAIGuideProps) {
FILE: src/components/GenerateGuide/GetAIGuide.tsx
type GetAIGuideProps (line 7) | type GetAIGuideProps = {
function GetAIGuide (line 11) | function GetAIGuide(props: GetAIGuideProps) {
FILE: src/components/GenerateGuide/UpdatePreferences.tsx
type UpdatePreferencesProps (line 9) | type UpdatePreferencesProps = {
function UpdatePreferences (line 20) | function UpdatePreferences(props: UpdatePreferencesProps) {
FILE: src/components/GenerateGuide/UserGuidesList.tsx
function UserGuidesList (line 21) | function UserGuidesList() {
FILE: src/components/GenerateRoadmap/AIRoadmapAlert.tsx
type AIRoadmapAlertProps (line 4) | type AIRoadmapAlertProps = {
function AIRoadmapAlert (line 8) | function AIRoadmapAlert(props: AIRoadmapAlertProps) {
FILE: src/components/GenerateRoadmap/AITermSuggestionInput.tsx
type GetTopAIRoadmapTermResponse (line 16) | type GetTopAIRoadmapTermResponse = {
type AITermSuggestionInputProps (line 23) | type AITermSuggestionInputProps = {
function AITermSuggestionInput (line 35) | function AITermSuggestionInput(props: AITermSuggestionInputProps) {
FILE: src/components/GenerateRoadmap/GenerateRoadmap.tsx
type GetAIRoadmapLimitResponse (line 42) | type GetAIRoadmapLimitResponse = {
constant ROADMAP_ID_REGEX (line 49) | const ROADMAP_ID_REGEX = new RegExp('@ROADMAPID:(\\w+)@');
constant ROADMAP_SLUG_REGEX (line 50) | const ROADMAP_SLUG_REGEX = new RegExp(/@ROADMAPSLUG:([\w-]+)@/);
type RoadmapNodeDetails (line 52) | type RoadmapNodeDetails = {
function getNodeDetails (line 61) | function getNodeDetails(
type GetAIRoadmapResponse (line 83) | type GetAIRoadmapResponse = {
type GenerateRoadmapProps (line 90) | type GenerateRoadmapProps = {
function GenerateRoadmap (line 96) | function GenerateRoadmap(props: GenerateRoadmapProps) {
FILE: src/components/GenerateRoadmap/RoadmapSearch.tsx
type RoadmapSearchProps (line 11) | type RoadmapSearchProps = {
function RoadmapSearch (line 22) | function RoadmapSearch(props: RoadmapSearchProps) {
FILE: src/components/GenerateRoadmap/RoadmapTopicDetail.tsx
type RoadmapTopicDetailProps (line 14) | type RoadmapTopicDetailProps = RoadmapNodeDetails & {
function RoadmapTopicDetail (line 23) | function RoadmapTopicDetail(props: RoadmapTopicDetailProps) {
FILE: src/components/GetStarted/RoadmapCard.tsx
type RoadmapCardProps (line 3) | type RoadmapCardProps = {
function RoadmapCard (line 11) | function RoadmapCard(props: RoadmapCardProps) {
FILE: src/components/GetStarted/RoadmapMultiCard.tsx
type RoadmapMultiCardProps (line 3) | type RoadmapMultiCardProps = {
function RoadmapMultiCard (line 15) | function RoadmapMultiCard(props: RoadmapMultiCardProps) {
FILE: src/components/GetStarted/RoleRoadmaps.tsx
type RoleRoadmapsProps (line 4) | type RoleRoadmapsProps = {
function RoleRoadmaps (line 11) | function RoleRoadmaps(props: RoleRoadmapsProps) {
FILE: src/components/GetStarted/SectionBadge.tsx
type SectionBadgeProps (line 1) | type SectionBadgeProps = {
function SectionBadge (line 4) | function SectionBadge(props: SectionBadgeProps) {
FILE: src/components/GetStarted/TipItem.tsx
type TipItemProps (line 3) | type TipItemProps = {
function TipItem (line 7) | function TipItem(props: TipItemProps) {
FILE: src/components/Global/CodeBlock.tsx
function highlight (line 32) | function highlight(html: string, language?: BundledLanguage) {
type CodeBlockFallbackProps (line 56) | type CodeBlockFallbackProps = HTMLAttributes<HTMLDivElement>;
type CodeBlockItemProps (line 75) | type CodeBlockItemProps = HTMLAttributes<HTMLDivElement> & {
type CodeBlockContentProps (line 94) | type CodeBlockContentProps = HTMLAttributes<HTMLDivElement> & {
type CodeBlockHeaderProps (line 126) | type CodeBlockHeaderProps = HTMLAttributes<HTMLDivElement> & {
function CodeBlockHeader (line 131) | function CodeBlockHeader(props: CodeBlockHeaderProps) {
FILE: src/components/Global/Markdown.tsx
function getLanguage (line 16) | function getLanguage(children: React.ReactNode) {
type MarkdownProps (line 71) | type MarkdownProps = {
function _Markdown (line 76) | function _Markdown(props: MarkdownProps) {
FILE: src/components/Guide/GuideContent.tsx
type GuideContentProps (line 7) | type GuideContentProps = {
function GuideContent (line 11) | function GuideContent(props: GuideContentProps) {
FILE: src/components/Guide/RelatedGuides.tsx
type RelatedGuidesProps (line 6) | type RelatedGuidesProps = {
function RelatedGuides (line 11) | function RelatedGuides(props: RelatedGuidesProps) {
FILE: src/components/HeroSection/EmptyProgress.tsx
type EmptyProgressProps (line 4) | type EmptyProgressProps = {
function EmptyProgress (line 9) | function EmptyProgress(props: EmptyProgressProps) {
FILE: src/components/HeroSection/FavoriteRoadmaps.tsx
type AIRoadmapType (line 19) | type AIRoadmapType = {
type FavoriteRoadmapsProps (line 25) | type FavoriteRoadmapsProps = {
function FavoriteRoadmaps (line 34) | function FavoriteRoadmaps(props: FavoriteRoadmapsProps) {
FILE: src/components/HeroSection/HeroItemsGroup.tsx
type HeroItemsGroupProps (line 5) | type HeroItemsGroupProps = {
function HeroItemsGroup (line 16) | function HeroItemsGroup(props: HeroItemsGroupProps) {
FILE: src/components/HeroSection/HeroProject.tsx
type HeroProjectProps (line 6) | type HeroProjectProps = {
function HeroProject (line 12) | function HeroProject({ project }: HeroProjectProps) {
FILE: src/components/HeroSection/HeroRoadmap.tsx
type ProgressRoadmapProps (line 5) | type ProgressRoadmapProps = {
function HeroRoadmap (line 19) | function HeroRoadmap(props: ProgressRoadmapProps) {
FILE: src/components/HeroSection/HeroTitle.tsx
type HeroTitleProps (line 6) | type HeroTitleProps = {
function HeroTitle (line 17) | function HeroTitle(props: HeroTitleProps) {
FILE: src/components/Leaderboard/ErrorPage.tsx
type ErrorPageProps (line 4) | type ErrorPageProps = {
function ErrorPage (line 8) | function ErrorPage(props: ErrorPageProps) {
FILE: src/components/Leaderboard/LeaderboardPage.tsx
type LeaderboardPageProps (line 12) | type LeaderboardPageProps = {
function LeaderboardPage (line 16) | function LeaderboardPage(props: LeaderboardPageProps) {
type LeaderboardLaneProps (line 97) | type LeaderboardLaneProps = {
function LeaderboardLane (line 108) | function LeaderboardLane(props: LeaderboardLaneProps) {
FILE: src/components/Library/LibraryTab.tsx
type LibraryTabsProps (line 10) | type LibraryTabsProps = {
function LibraryTabs (line 14) | function LibraryTabs(props: LibraryTabsProps) {
type LibraryTabButtonProps (line 47) | type LibraryTabButtonProps = {
function LibraryTabButton (line 54) | function LibraryTabButton(props: LibraryTabButtonProps) {
FILE: src/components/LoadingChip.tsx
type LoadingChipProps (line 3) | type LoadingChipProps = {
function LoadingChip (line 7) | function LoadingChip(props: LoadingChipProps) {
FILE: src/components/Modal.tsx
type ModalProps (line 7) | type ModalProps = {
function Modal (line 16) | function Modal(props: ModalProps) {
FILE: src/components/Navigation/AccountDropdown.tsx
type OnboardingConfig (line 15) | type OnboardingConfig = Pick<
function AccountDropdown (line 20) | function AccountDropdown() {
FILE: src/components/Navigation/AccountDropdownList.tsx
type AccountDropdownListProps (line 15) | type AccountDropdownListProps = {
function AccountDropdownList (line 25) | function AccountDropdownList(props: AccountDropdownListProps) {
FILE: src/components/Navigation/DropdownTeamList.tsx
type DropdownTeamListProps (line 10) | type DropdownTeamListProps = {
function DropdownTeamList (line 14) | function DropdownTeamList(props: DropdownTeamListProps) {
FILE: src/components/Navigation/NotificationIndicator.tsx
type NotificationIndicatorProps (line 3) | type NotificationIndicatorProps = {
function NotificationIndicator (line 6) | function NotificationIndicator(props: NotificationIndicatorProps) {
FILE: src/components/Navigation/OnboardingModal.tsx
type Task (line 13) | type Task = {
type OnboardingModalProps (line 23) | type OnboardingModalProps = {
function OnboardingModal (line 29) | function OnboardingModal(props: OnboardingModalProps) {
FILE: src/components/Navigation/navigation.ts
function bindEvents (line 3) | function bindEvents() {
FILE: src/components/NavigationDropdown.tsx
function NavigationDropdown (line 63) | function NavigationDropdown() {
FILE: src/components/NavigationDropdownMenu.tsx
type DropdownLink (line 6) | interface DropdownLink {
type NavigationDropdownMenuProps (line 16) | interface NavigationDropdownMenuProps {
function NavigationDropdownMenu (line 24) | function NavigationDropdownMenu(props: NavigationDropdownMenuProps) {
FILE: src/components/OnboardingNudge.tsx
type OnboardingNudgeProps (line 8) | type OnboardingNudgeProps = {
constant NUDGE_ONBOARDING_KEY (line 12) | const NUDGE_ONBOARDING_KEY = 'should_nudge_onboarding';
function OnboardingNudge (line 14) | function OnboardingNudge(props: OnboardingNudgeProps) {
FILE: src/components/PageProgress.tsx
type Props (line 6) | interface Props {
function PageProgress (line 10) | function PageProgress(props: Props) {
FILE: src/components/PageSponsor.tsx
type PageSponsorType (line 11) | type PageSponsorType = {
type V1GetSponsorResponse (line 21) | type V1GetSponsorResponse = {
type PageSponsorProps (line 27) | type PageSponsorProps = {
constant CLOSE_SPONSOR_KEY (line 31) | const CLOSE_SPONSOR_KEY = 'sponsorClosed';
function markSponsorHidden (line 33) | function markSponsorHidden(sponsorId: string) {
function isSponsorMarkedHidden (line 43) | function isSponsorMarkedHidden(sponsorId: string) {
function PageSponsor (line 47) | function PageSponsor(props: PageSponsorProps) {
FILE: src/components/PageVisit/PageVisit.tsx
type PageVisitProps (line 7) | type PageVisitProps = {
function PageVisit (line 12) | function PageVisit(props: PageVisitProps) {
FILE: src/components/Pagination/Pagination.tsx
type PaginationProps (line 6) | type PaginationProps = {
function Pagination (line 17) | function Pagination(props: PaginationProps) {
FILE: src/components/PersonalizedRoadmap/PersonalizedRoadmap.tsx
type PersonalizedRoadmapProps (line 21) | type PersonalizedRoadmapProps = {
function PersonalizedRoadmap (line 25) | function PersonalizedRoadmap(props: PersonalizedRoadmapProps) {
FILE: src/components/PersonalizedRoadmap/PersonalizedRoadmapModal.tsx
type PersonalizedRoadmapModalProps (line 9) | type PersonalizedRoadmapModalProps = {
function PersonalizedRoadmapModal (line 16) | function PersonalizedRoadmapModal(props: PersonalizedRoadmapModalProps) {
FILE: src/components/PersonalizedRoadmap/PersonalizedRoadmapSwitcher.tsx
type PersonalizedRoadmapSwitcherProps (line 5) | type PersonalizedRoadmapSwitcherProps = {
function PersonalizedRoadmapSwitcher (line 13) | function PersonalizedRoadmapSwitcher(
FILE: src/components/Popup/popup.js
class Popup (line 1) | class Popup {
method constructor (line 2) | constructor() {
method triggerPopup (line 13) | triggerPopup(e) {
method handleClosePopup (line 31) | handleClosePopup(e) {
method handleKeydown (line 47) | handleKeydown(e) {
method onDOMLoaded (line 59) | onDOMLoaded() {
method init (line 65) | init() {
FILE: src/components/Premium/CredibilityStats.tsx
type CredibilityItemProps (line 10) | interface CredibilityItemProps {
function CredibilityItem (line 18) | function CredibilityItem(props: CredibilityItemProps) {
function CredibilityStats (line 37) | function CredibilityStats() {
FILE: src/components/Premium/FeatureCard.tsx
type FeatureCardProps (line 4) | interface FeatureCardProps {
function FeatureCard (line 14) | function FeatureCard(props: FeatureCardProps) {
FILE: src/components/Premium/PremiumPage.tsx
function PremiumPage (line 31) | function PremiumPage() {
FILE: src/components/Premium/StarRating.tsx
function StarRating (line 3) | function StarRating() {
FILE: src/components/Premium/StatsItem.tsx
type StatsItemProps (line 3) | interface StatsItemProps {
function StatsItem (line 8) | function StatsItem(props: StatsItemProps) {
FILE: src/components/Premium/Testimonial.tsx
type TestimonialProps (line 3) | interface TestimonialProps {
function Testimonial (line 9) | function Testimonial({ name, role, content }: TestimonialProps) {
FILE: src/components/Projects/CompleteProjectConfirmation.tsx
type CompleteProjectConfirmationProps (line 9) | type CompleteProjectConfirmationProps = {
function CompleteProjectConfirmation (line 14) | function CompleteProjectConfirmation(
FILE: src/components/Projects/EmptyProjects.tsx
function EmptyProjects (line 7) | function EmptyProjects() {
FILE: src/components/Projects/EmptySolutions.tsx
type EmptySolutionsProps (line 3) | type EmptySolutionsProps = {
function EmptySolutions (line 7) | function EmptySolutions(props: EmptySolutionsProps) {
FILE: src/components/Projects/LeavingRoadmapWarningModal.tsx
type LeavingRoadmapWarningModalProps (line 5) | type LeavingRoadmapWarningModalProps = {
function LeavingRoadmapWarningModal (line 10) | function LeavingRoadmapWarningModal(
FILE: src/components/Projects/ListProjectSolutions.tsx
type ProjectStatusDocument (line 17) | interface ProjectStatusDocument {
type AllowedVoteType (line 37) | type AllowedVoteType = (typeof allowedVoteType)[number];
type ListProjectSolutionsResponse (line 39) | type ListProjectSolutionsResponse = {
type QueryParams (line 54) | type QueryParams = {
type PageState (line 60) | type PageState = {
type ListProjectSolutionsProps (line 66) | type ListProjectSolutionsProps = {
function ListProjectSolutions (line 71) | function ListProjectSolutions(props: ListProjectSolutionsProps) {
FILE: src/components/Projects/LoadingSolutions.tsx
function LoadingSolutions (line 3) | function LoadingSolutions() {
FILE: src/components/Projects/ProjectCard.tsx
type ProjectCardProps (line 7) | type ProjectCardProps = {
function ProjectCard (line 19) | function ProjectCard(props: ProjectCardProps) {
FILE: src/components/Projects/ProjectContent.tsx
type ProjectContentProps (line 4) | type ProjectContentProps = {
function ProjectContent (line 8) | function ProjectContent(props: ProjectContentProps) {
FILE: src/components/Projects/ProjectSolutionModal.tsx
type UserProjectSolutionResponse (line 16) | type UserProjectSolutionResponse = {
type ProjectSolutionModalProps (line 34) | type ProjectSolutionModalProps = {
function ProjectSolutionModal (line 40) | function ProjectSolutionModal(props: ProjectSolutionModalProps) {
FILE: src/components/Projects/ProjectSolutionRow.tsx
type ProjectSolutionRowProps (line 34) | type ProjectSolutionRowProps = {
function ProjectSolutionRow (line 49) | function ProjectSolutionRow(props: ProjectSolutionRowProps) {
FILE: src/components/Projects/ProjectTabs.tsx
type AllowedProjectTab (line 5) | type AllowedProjectTab = (typeof allowedProjectTabs)[number];
type TabButtonProps (line 7) | type TabButtonProps = {
function TabButton (line 15) | function TabButton(props: TabButtonProps) {
type ProjectTabsProps (line 37) | type ProjectTabsProps = {
function ProjectTabs (line 44) | function ProjectTabs(props: ProjectTabsProps) {
FILE: src/components/Projects/ProjectsList.tsx
type DifficultyButtonProps (line 19) | type DifficultyButtonProps = {
function DifficultyButton (line 25) | function DifficultyButton(props: DifficultyButtonProps) {
type ListProjectStatusesResponse (line 44) | type ListProjectStatusesResponse = Record<
type ProjectsListProps (line 49) | type ProjectsListProps = {
function ProjectsList (line 54) | function ProjectsList(props: ProjectsListProps) {
FILE: src/components/Projects/ProjectsPage.tsx
type ProjectGroup (line 16) | type ProjectGroup = {
type ProjectsPageProps (line 22) | type ProjectsPageProps = {
function ProjectsPage (line 27) | function ProjectsPage(props: ProjectsPageProps) {
FILE: src/components/Projects/ProjectsPageHeader.tsx
function ProjectsPageHeader (line 4) | function ProjectsPageHeader() {
FILE: src/components/Projects/SelectLanguages.tsx
type SelectLanguagesProps (line 7) | type SelectLanguagesProps = {
function SelectLanguages (line 13) | function SelectLanguages(props: SelectLanguagesProps) {
FILE: src/components/Projects/SortProjects.tsx
type SortOption (line 5) | type SortOption = {
type SortProjectsProps (line 16) | type SortProjectsProps = {
function SortProjects (line 21) | function SortProjects(props: SortProjectsProps) {
FILE: src/components/Projects/StartProjectConfirmation.tsx
type StartProjectConfirmationProps (line 9) | type StartProjectConfirmationProps = {
function StartProjectConfirmation (line 14) | function StartProjectConfirmation(props: StartProjectConfirmationProps) {
FILE: src/components/Projects/StartProjectModal.tsx
type StartProjectModalProps (line 10) | type StartProjectModalProps = {
function StartProjectModal (line 17) | function StartProjectModal(props: StartProjectModalProps) {
FILE: src/components/Projects/StatusStepper/MilestoneStep.tsx
type MilestoneStepProps (line 3) | type MilestoneStepProps = {
function MilestoneStep (line 10) | function MilestoneStep(props: MilestoneStepProps) {
FILE: src/components/Projects/StatusStepper/ProjectStepper.tsx
type ProjectStatusResponse (line 18) | type ProjectStatusResponse = {
type ProjectStepperProps (line 29) | type ProjectStepperProps = {
function ProjectStepper (line 33) | function ProjectStepper(props: ProjectStepperProps) {
FILE: src/components/Projects/StatusStepper/ProjectTrackingActions.tsx
type ProjectTrackingActionsProps (line 13) | type ProjectTrackingActionsProps = {
function ProjectTrackingActions (line 17) | function ProjectTrackingActions(props: ProjectTrackingActionsProps) {
FILE: src/components/Projects/StatusStepper/StepperAction.tsx
type StepperActionProps (line 3) | type StepperActionProps = {
function StepperAction (line 12) | function StepperAction(props: StepperActionProps) {
FILE: src/components/Projects/StatusStepper/StepperStepSeparator.tsx
type StepperStepSeparatorProps (line 3) | type StepperStepSeparatorProps = {
function StepperStepSeparator (line 7) | function StepperStepSeparator(props: StepperStepSeparatorProps) {
FILE: src/components/Projects/SubmissionRequirement.tsx
type SubmissionRequirementProps (line 6) | type SubmissionRequirementProps = {
function SubmissionRequirement (line 12) | function SubmissionRequirement(props: SubmissionRequirementProps) {
FILE: src/components/Projects/SubmitProjectModal.tsx
type SubmitProjectResponse (line 11) | type SubmitProjectResponse = {
type GitHubApiLanguagesResponse (line 16) | type GitHubApiLanguagesResponse = Record<string, number>;
type VerificationChecksType (line 18) | type VerificationChecksType = {
type SubmitProjectModalProps (line 24) | type SubmitProjectModalProps = {
function SubmitProjectModal (line 31) | function SubmitProjectModal(props: SubmitProjectModalProps) {
FILE: src/components/Projects/SubmitSuccessModal.tsx
type SubmitSuccessModalProps (line 8) | type SubmitSuccessModalProps = {
function SubmitSuccessModal (line 13) | function SubmitSuccessModal(props: SubmitSuccessModalProps) {
FILE: src/components/Projects/VoteButton.tsx
type VoteButtonProps (line 4) | type VoteButtonProps = {
function VoteButton (line 11) | function VoteButton(props: VoteButtonProps) {
FILE: src/components/Questions/QuestionCard.tsx
type QuestionCardProps (line 5) | type QuestionCardProps = {
function QuestionCard (line 9) | function QuestionCard(props: QuestionCardProps) {
FILE: src/components/Questions/QuestionFinished.tsx
type ProgressStatButtonProps (line 11) | type ProgressStatButtonProps = {
function ProgressStatLabel (line 18) | function ProgressStatLabel(props: ProgressStatButtonProps) {
type QuestionFinishedProps (line 32) | type QuestionFinishedProps = {
function QuestionFinished (line 40) | function QuestionFinished(props: QuestionFinishedProps) {
FILE: src/components/Questions/QuestionLoader.tsx
function QuestionLoader (line 3) | function QuestionLoader() {
FILE: src/components/Questions/QuestionsList.tsx
type UserQuestionProgress (line 10) | type UserQuestionProgress = {
type QuestionProgressType (line 16) | type QuestionProgressType = keyof UserQuestionProgress;
type QuestionsListProps (line 18) | type QuestionsListProps = {
function QuestionsList (line 23) | function QuestionsList(props: QuestionsListProps) {
FILE: src/components/Questions/QuestionsProgress.tsx
type QuestionsProgressProps (line 10) | type QuestionsProgressProps = {
function QuestionsProgress (line 21) | function QuestionsProgress(props: QuestionsProgressProps) {
FILE: src/components/Rating/Rating.tsx
type RatingProps (line 5) | type RatingProps = {
function Rating (line 14) | function Rating(props: RatingProps) {
type RatingStarProps (line 66) | type RatingStarProps = {
function RatingStar (line 73) | function RatingStar(props: RatingStarProps) {
FILE: src/components/ReactIcons/AITutorLogo.tsx
type AITutorLogoProps (line 3) | type AITutorLogoProps = SVGProps<SVGSVGElement>;
function AITutorLogo (line 5) | function AITutorLogo(props: AITutorLogoProps) {
FILE: src/components/ReactIcons/AddedUserIcon.tsx
type CheckIconProps (line 1) | type CheckIconProps = {
function AddedUserIcon (line 5) | function AddedUserIcon(props: CheckIconProps) {
FILE: src/components/ReactIcons/AppleCalendarIcon.tsx
function AppleCalendarIcon (line 3) | function AppleCalendarIcon(props: SVGProps<SVGSVGElement>) {
FILE: src/components/ReactIcons/BestPracticesIcon.tsx
type BestPracticesIconProps (line 1) | type BestPracticesIconProps = {
function BestPracticesIcon (line 4) | function BestPracticesIcon(props: BestPracticesIconProps) {
FILE: src/components/ReactIcons/BuildingIcon.tsx
type BuildingIconProps (line 1) | type BuildingIconProps = {
function BuildingIcon (line 4) | function BuildingIcon(props: BuildingIconProps) {
FILE: src/components/ReactIcons/CheckIcon.tsx
type CheckIconProps (line 1) | type CheckIconProps = {
function CheckIcon (line 5) | function CheckIcon(props: CheckIconProps) {
FILE: src/components/ReactIcons/ChevronDownIcon.tsx
type ChevronDownIconProps (line 1) | type ChevronDownIconProps = {
function ChevronDownIcon (line 5) | function ChevronDownIcon(props: ChevronDownIconProps) {
FILE: src/components/ReactIcons/ClipboardIcon.tsx
type ClipboardIconProps (line 1) | type ClipboardIconProps = {
function ClipboardIcon (line 4) | function ClipboardIcon(props: ClipboardIconProps) {
FILE: src/components/ReactIcons/CloseIcon.tsx
type CloseIconProps (line 1) | type CloseIconProps = {
function CloseIcon (line 5) | function CloseIcon(props: CloseIconProps) {
FILE: src/components/ReactIcons/CogIcon.tsx
type CogIconProps (line 1) | type CogIconProps = {
function CogIcon (line 4) | function CogIcon(props: CogIconProps) {
FILE: src/components/ReactIcons/DeleteUserIcon.tsx
type CheckIconProps (line 1) | type CheckIconProps = {
function DeleteUserIcon (line 5) | function DeleteUserIcon(props: CheckIconProps) {
FILE: src/components/ReactIcons/DropdownIcon.tsx
type DropdownIconProps (line 3) | type DropdownIconProps = {
function DropdownIcon (line 7) | function DropdownIcon(props: DropdownIconProps) {
FILE: src/components/ReactIcons/ErrorIcon.tsx
type ErrorIconProps (line 1) | type ErrorIconProps = {
function ErrorIcon (line 5) | function ErrorIcon(props: ErrorIconProps) {
FILE: src/components/ReactIcons/ErrorIcon2.tsx
type ErrorIcon2Props (line 1) | type ErrorIcon2Props = {
function ErrorIcon2 (line 5) | function ErrorIcon2(props: ErrorIcon2Props) {
FILE: src/components/ReactIcons/FacebookIcon.tsx
type FacebookIconProps (line 1) | interface FacebookIconProps {
function FacebookIcon (line 5) | function FacebookIcon(props: FacebookIconProps) {
FILE: src/components/ReactIcons/FileIcon.tsx
function FileIcon (line 3) | function FileIcon(props: SVGProps<SVGSVGElement>) {
FILE: src/components/ReactIcons/GitHubIcon.tsx
type GitHubIconProps (line 1) | type GitHubIconProps = {
function GitHubIcon (line 4) | function GitHubIcon(props: GitHubIconProps) {
FILE: src/components/ReactIcons/GoogleCalendarIcon.tsx
function GoogleCalendarIcon (line 3) | function GoogleCalendarIcon(props: SVGProps<SVGSVGElement>) {
FILE: src/components/ReactIcons/GoogleIcon.tsx
type GoogleIconProps (line 1) | type GoogleIconProps = {
function GoogleIcon (line 4) | function GoogleIcon(props: GoogleIconProps) {
FILE: src/components/ReactIcons/GroupIcon.tsx
type GroupIconProps (line 1) | type GroupIconProps = {
function GroupIcon (line 4) | function GroupIcon(props: GroupIconProps) {
FILE: src/components/ReactIcons/GuideIcon.tsx
type GuideIconProps (line 1) | type GuideIconProps = {
function GuideIcon (line 4) | function GuideIcon(props: GuideIconProps) {
FILE: src/components/ReactIcons/HackerNewsIcon.tsx
type HackerNewsIconProps (line 3) | interface HackerNewsIconProps {
function HackerNewsIcon (line 7) | function HackerNewsIcon(props: HackerNewsIconProps) {
FILE: src/components/ReactIcons/HomeIcon.tsx
type HomeIconProps (line 1) | type HomeIconProps = {
function HomeIcon (line 4) | function HomeIcon(props: HomeIconProps) {
FILE: src/components/ReactIcons/InfoIcon.tsx
type InfoIconProps (line 1) | type InfoIconProps = {
function InfoIcon (line 5) | function InfoIcon(props: InfoIconProps) {
FILE: src/components/ReactIcons/LinkedInIcon.tsx
type LinkedInIconProps (line 1) | interface LinkedInIconProps {
function LinkedInIcon (line 5) | function LinkedInIcon(props: LinkedInIconProps) {
FILE: src/components/ReactIcons/MoreVerticalIcon.tsx
type MoreVerticalIconProps (line 1) | type MoreVerticalIconProps = {
function MoreVerticalIcon (line 5) | function MoreVerticalIcon(props: MoreVerticalIconProps) {
FILE: src/components/ReactIcons/OutlookCalendarIcon.tsx
function OutlookCalendarIcon (line 3) | function OutlookCalendarIcon(props: SVGProps<SVGSVGElement>) {
FILE: src/components/ReactIcons/RedditIcon.tsx
type RedditIconProps (line 3) | interface RedditIconProps {
function RedditIcon (line 7) | function RedditIcon(props: RedditIconProps) {
FILE: src/components/ReactIcons/RoadmapIcon.tsx
type RoadmapIconProps (line 1) | type RoadmapIconProps = {
function RoadmapIcon (line 4) | function RoadmapIcon(props: RoadmapIconProps) {
FILE: src/components/ReactIcons/RoadmapLogo.tsx
type RoadmapLogoIconProps (line 3) | type RoadmapLogoIconProps = SVGProps<SVGSVGElement> & {
function RoadmapLogoIcon (line 7) | function RoadmapLogoIcon(props: RoadmapLogoIconProps) {
FILE: src/components/ReactIcons/SecondPlaceMedalEmoji.tsx
function SecondPlaceMedalEmoji (line 4) | function SecondPlaceMedalEmoji(props: SVGProps<SVGSVGElement>) {
FILE: src/components/ReactIcons/ShareIcon.tsx
type ShareIconProps (line 3) | type ShareIconProps = SVGAttributes<SVGSVGElement>;
function ShareIcon (line 5) | function ShareIcon(props: ShareIconProps) {
FILE: src/components/ReactIcons/Spinner.tsx
type SpinnerProps (line 1) | type SpinnerProps = {
function Spinner (line 8) | function Spinner({
FILE: src/components/ReactIcons/StopIcon.tsx
type CheckIconProps (line 1) | type CheckIconProps = {
function StopIcon (line 5) | function StopIcon(props: CheckIconProps) {
FILE: src/components/ReactIcons/TeamProgressIcon.tsx
type TeamProgressIconProps (line 1) | type TeamProgressIconProps = {
function TeamProgressIcon (line 4) | function TeamProgressIcon(props: TeamProgressIconProps) {
FILE: src/components/ReactIcons/ThirdPlaceMedalEmoji.tsx
function ThirdPlaceMedalEmoji (line 4) | function ThirdPlaceMedalEmoji(props: SVGProps<SVGSVGElement>) {
FILE: src/components/ReactIcons/TrashIcon.tsx
type TrashIconProps (line 1) | type TrashIconProps = {
function TrashIcon (line 4) | function TrashIcon(props: TrashIconProps) {
FILE: src/components/ReactIcons/TrophyEmoji.tsx
function TrophyEmoji (line 4) | function TrophyEmoji(props: SVGProps<SVGSVGElement>) {
FILE: src/components/ReactIcons/TwitterIcon.tsx
type TwitterIconProps (line 1) | interface TwitterIconProps {
function TwitterIcon (line 6) | function TwitterIcon(props: TwitterIconProps) {
FILE: src/components/ReactIcons/UserIcon.tsx
type UserIconProps (line 1) | type UserIconProps = {
function UserIcon (line 4) | function UserIcon(props: UserIconProps) {
FILE: src/components/ReactIcons/UsersIcon.tsx
type UsersIconProps (line 1) | type UsersIconProps = {
function UsersIcon (line 4) | function UsersIcon(props: UsersIconProps) {
FILE: src/components/ReactIcons/VerifyLetterIcon.tsx
type VerifyLetterIconProps (line 1) | type VerifyLetterIconProps = {
function VerifyLetterIcon (line 5) | function VerifyLetterIcon(props: VerifyLetterIconProps) {
FILE: src/components/ReactIcons/VideoIcon.tsx
type VideoIconProps (line 1) | type VideoIconProps = {
function VideoIcon (line 5) | function VideoIcon(props: VideoIconProps) {
FILE: src/components/ReactIcons/WarningIcon.tsx
type WarningIconProps (line 1) | type WarningIconProps = {
function WarningIcon (line 5) | function WarningIcon(props: WarningIconProps) {
FILE: src/components/RespondInviteForm.tsx
type InvitationResponse (line 13) | type InvitationResponse = {
function RespondInviteForm (line 27) | function RespondInviteForm() {
FILE: src/components/RoadCard/Editor.tsx
type EditorProps (line 4) | type EditorProps = {
function Editor (line 10) | function Editor(props: EditorProps) {
FILE: src/components/RoadmapAIChat/AIChatActionButtons.tsx
type AIChatActionButtonProps (line 3) | type AIChatActionButtonProps = {
function AIChatActionButton (line 9) | function AIChatActionButton(props: AIChatActionButtonProps) {
type AIChatActionButtonsProps (line 23) | type AIChatActionButtonsProps = {
function AIChatActionButtons (line 30) | function AIChatActionButtons(props: AIChatActionButtonsProps) {
FILE: src/components/RoadmapAIChat/ChatRoadmapRenderer.tsx
type RoadmapNodeDetails (line 24) | type RoadmapNodeDetails = {
function getNodeDetails (line 31) | function getNodeDetails(svgElement: SVGElement): RoadmapNodeDetails | nu...
type ChatRoadmapRendererProps (line 56) | type ChatRoadmapRendererProps = {
function ChatRoadmapRenderer (line 64) | function ChatRoadmapRenderer(props: ChatRoadmapRendererProps) {
FILE: src/components/RoadmapAIChat/RoadmapAIChat.tsx
type RoadmapAIChatTab (line 60) | type RoadmapAIChatTab = 'chat' | 'topic';
type RoadmapAIChatProps (line 62) | type RoadmapAIChatProps = {
function RoadmapAIChat (line 66) | function RoadmapAIChat(props: RoadmapAIChatProps) {
function isEmptyContent (line 582) | function isEmptyContent(content: JSONContent) {
type LoaderProps (line 599) | type LoaderProps = {
function Loader (line 603) | function Loader(props: LoaderProps) {
FILE: src/components/RoadmapAIChat/RoadmapAIChatCard.tsx
type RoadmapAIChatCardProps (line 5) | type RoadmapAIChatCardProps = RoadmapAIChatHistoryType & {
function RoadmapAIChatCard (line 9) | function RoadmapAIChatCard(props: RoadmapAIChatCardProps) {
FILE: src/components/RoadmapAIChat/RoadmapAIChatHeader.tsx
type TabButtonProps (line 15) | type TabButtonProps = {
function TabButton (line 24) | function TabButton(props: TabButtonProps) {
type RoadmapAIChatHeaderProps (line 55) | type RoadmapAIChatHeaderProps = {
function RoadmapAIChatHeader (line 75) | function RoadmapAIChatHeader(props: RoadmapAIChatHeaderProps) {
FILE: src/components/RoadmapAIChat/RoadmapChatListing.tsx
type RoadmapChatListingItem (line 4) | type RoadmapChatListingItem = {
type RoadmapChatListingProps (line 11) | type RoadmapChatListingProps = {
function RoadmapChatListing (line 16) | function RoadmapChatListing(props: RoadmapChatListingProps) {
FILE: src/components/RoadmapAIChat/RoadmapRecommendations.tsx
type RoadmapSlugListType (line 7) | type RoadmapSlugListType = {
function parseRoadmapSlugList (line 11) | function parseRoadmapSlugList(content: string): RoadmapSlugListType[] {
type RoadmapRecommendationsProps (line 37) | type RoadmapRecommendationsProps = {
function RoadmapRecommendations (line 41) | function RoadmapRecommendations(props: RoadmapRecommendationsProps) {
FILE: src/components/RoadmapAIChat/RoadmapTopicList.tsx
type TopicListType (line 7) | type TopicListType = {
function parseTopicList (line 11) | function parseTopicList(content: string): TopicListType[] {
type RoadmapTopicListProps (line 35) | type RoadmapTopicListProps = {
function RoadmapTopicList (line 41) | function RoadmapTopicList(props: RoadmapTopicListProps) {
FILE: src/components/RoadmapAIChat/ShareResourceLink.tsx
type ShareResourceLinkProps (line 7) | type ShareResourceLinkProps = {
function ShareResourceLink (line 11) | function ShareResourceLink(props: ShareResourceLinkProps) {
FILE: src/components/RoadmapAIChat/TopicResourcesModal.tsx
type TopicResourcesModalProps (line 12) | type TopicResourcesModalProps = {
function TopicResourcesModal (line 18) | function TopicResourcesModal(props: TopicResourcesModalProps) {
FILE: src/components/RoadmapAIChat/TutorIntroMessage.tsx
type TutorIntroMessageProps (line 3) | type TutorIntroMessageProps = {
function TutorIntroMessage (line 7) | function TutorIntroMessage(props: TutorIntroMessageProps) {
FILE: src/components/RoadmapAIChat/UserProgressActionList.tsx
type UpdateUserProgress (line 16) | type UpdateUserProgress = {
function parseUserProgress (line 21) | function parseUserProgress(content: string): UpdateUserProgress[] {
type BulkUpdateResourceProgressBody (line 52) | type BulkUpdateResourceProgressBody = {
type BulkUpdateResourceProgressResponse (line 59) | type BulkUpdateResourceProgressResponse = {
type UserProgressActionListProps (line 65) | type UserProgressActionListProps = {
function UserProgressActionList (line 71) | function UserProgressActionList(props: UserProgressActionListProps) {
type ProgressItemProps (line 216) | type ProgressItemProps = {
function ProgressItem (line 226) | function ProgressItem(props: ProgressItemProps) {
FILE: src/components/RoadmapAIChat/UserProgressList.tsx
type UserProgressListProps (line 6) | type UserProgressListProps = {
function UserProgressList (line 11) | function UserProgressList(props: UserProgressListProps) {
FILE: src/components/RoadmapAIChatHistory/RoadmapAIChatHistory.tsx
type RoadmapAIChatHistoryProps (line 15) | type RoadmapAIChatHistoryProps = {
function RoadmapAIChatHistory (line 24) | function RoadmapAIChatHistory(props: RoadmapAIChatHistoryProps) {
FILE: src/components/RoadmapAlert.tsx
type RoadmapAlertProps (line 10) | type RoadmapAlertProps = {
function RoadmapAlert (line 18) | function RoadmapAlert(props: RoadmapAlertProps) {
FILE: src/components/RoadmapTitleQuestion.tsx
type RoadmapTitleQuestionProps (line 16) | type RoadmapTitleQuestionProps = {
function RoadmapTitleQuestion (line 22) | function RoadmapTitleQuestion(props: RoadmapTitleQuestionProps) {
FILE: src/components/Roadmaps/CategoryFilterButton.tsx
type CategoryFilterButtonProps (line 3) | type CategoryFilterButtonProps = {
function CategoryFilterButton (line 9) | function CategoryFilterButton(props: CategoryFilterButtonProps) {
FILE: src/components/Roadmaps/RoadmapCard.tsx
type RoadmapCardProps (line 5) | type RoadmapCardProps = {
function RoadmapCard (line 9) | function RoadmapCard(props: RoadmapCardProps) {
FILE: src/components/Roadmaps/RoadmapsPage.tsx
type UserProgressResponse (line 15) | type UserProgressResponse = {
type AllowGroupNames (line 51) | type AllowGroupNames = (typeof groupNames)[number];
type GroupType (line 53) | type GroupType = {
function RoadmapsPage (line 608) | function RoadmapsPage() {
FILE: src/components/Roadmaps/RoadmapsPageHeader.tsx
function RoadmapsPageHeader (line 4) | function RoadmapsPageHeader() {
FILE: src/components/SQLCourse/AccountButton.tsx
function AccountButton (line 11) | function AccountButton() {
FILE: src/components/SQLCourse/AuthorCredentials.tsx
function AuthorCredentials (line 2) | function AuthorCredentials() {
FILE: src/components/SQLCourse/AuthorQuoteMessage.tsx
function AuthorQuoteMessage (line 3) | function AuthorQuoteMessage() {
FILE: src/components/SQLCourse/BuyButton.tsx
constant SQL_COURSE_SLUG (line 26) | const SQL_COURSE_SLUG = 'sql';
type CreateCheckoutSessionBody (line 28) | type CreateCheckoutSessionBody = {
type CreateCheckoutSessionResponse (line 34) | type CreateCheckoutSessionResponse = {
type BuyButtonProps (line 38) | type BuyButtonProps = {
function BuyButton (line 42) | function BuyButton(props: BuyButtonProps) {
FILE: src/components/SQLCourse/ChapterRow.tsx
type ChapterRowProps (line 5) | type ChapterRowProps = {
function ChapterRow (line 17) | function ChapterRow(props: ChapterRowProps) {
FILE: src/components/SQLCourse/CourseAnnouncement.tsx
constant HIDE_ANNOUNCEMENT_END_KEY (line 5) | const HIDE_ANNOUNCEMENT_END_KEY = '__course_announcement_closed_at__';
function CourseAnnouncement (line 7) | function CourseAnnouncement() {
FILE: src/components/SQLCourse/CourseAuthor.tsx
function CourseAuthor (line 1) | function CourseAuthor() {
FILE: src/components/SQLCourse/CourseFeature.tsx
type CourseFeatureProps (line 5) | type CourseFeatureProps = {
function CourseFeature (line 12) | function CourseFeature(props: CourseFeatureProps) {
FILE: src/components/SQLCourse/FAQSection.tsx
type FAQItem (line 5) | type FAQItem = {
function FAQRow (line 10) | function FAQRow({ question, answer }: FAQItem) {
function FAQSection (line 35) | function FAQSection() {
FILE: src/components/SQLCourse/FloatingPurchase.tsx
function FloatingPurchase (line 6) | function FloatingPurchase() {
FILE: src/components/SQLCourse/PlatformDemo.tsx
function PlatformDemo (line 6) | function PlatformDemo() {
FILE: src/components/SQLCourse/ReviewsSection.tsx
type Review (line 6) | type Review = {
function ReviewsSection (line 16) | function ReviewsSection() {
FILE: src/components/SQLCourse/SQLCoursePage.tsx
type ChapterData (line 32) | type ChapterData = {
function SQLCoursePage (line 244) | function SQLCoursePage() {
FILE: src/components/SQLCourse/SectionHeader.tsx
type SectionHeaderProps (line 3) | type SectionHeaderProps = {
function SectionHeader (line 9) | function SectionHeader(props: SectionHeaderProps) {
FILE: src/components/SQLCourse/Spotlight.tsx
type SpotlightProps (line 3) | type SpotlightProps = {
function Spotlight (line 8) | function Spotlight(props: SpotlightProps) {
FILE: src/components/SQLCourseVariant/AuthorCredentials.tsx
function AuthorCredentials (line 5) | function AuthorCredentials() {
FILE: src/components/SQLCourseVariant/BuyButton.tsx
constant SQL_COURSE_SLUG (line 26) | const SQL_COURSE_SLUG = 'sql';
type CreateCheckoutSessionBody (line 28) | type CreateCheckoutSessionBody = {
type CreateCheckoutSessionResponse (line 34) | type CreateCheckoutSessionResponse = {
type BuyButtonProps (line 38) | type BuyButtonProps = {
function BuyButton (line 43) | function BuyButton(props: BuyButtonProps) {
FILE: src/components/SQLCourseVariant/ChapterRow.tsx
type ChapterRowProps (line 5) | type ChapterRowProps = {
function ChapterRow (line 17) | function ChapterRow(props: ChapterRowProps) {
FILE: src/components/SQLCourseVariant/CourseDiscountBanner.tsx
function CourseDiscountBanner (line 13) | function CourseDiscountBanner() {
FILE: src/components/SQLCourseVariant/CourseFeatures.tsx
type Feature (line 15) | type Feature = {
function CourseFeatures (line 22) | function CourseFeatures() {
type CourseFeatureProps (line 97) | type CourseFeatureProps = Feature & {
function CourseFeature (line 102) | function CourseFeature(props: CourseFeatureProps) {
FILE: src/components/SQLCourseVariant/FAQSection.tsx
type FAQItem (line 5) | type FAQItem = {
function FAQRow (line 10) | function FAQRow({ question, answer }: FAQItem) {
function FAQSection (line 37) | function FAQSection() {
FILE: src/components/SQLCourseVariant/MeetYourInstructor.tsx
function MeetYourInstructor (line 4) | function MeetYourInstructor() {
FILE: src/components/SQLCourseVariant/PlatformDemo.tsx
function PlatformDemo (line 5) | function PlatformDemo() {
FILE: src/components/SQLCourseVariant/PurchaseBanner.tsx
function PurchaseBanner (line 7) | function PurchaseBanner() {
FILE: src/components/SQLCourseVariant/ReviewCarousel.tsx
type Review (line 12) | type Review = {
function ReviewCarousel (line 24) | function ReviewCarousel() {
type NavigateButtonProps (line 296) | type NavigateButtonProps = {
function NavigateButton (line 301) | function NavigateButton(props: NavigateButtonProps) {
FILE: src/components/SQLCourseVariant/RoadmapDetailsPopover.tsx
function RoadmapDetailsPopover (line 4) | function RoadmapDetailsPopover() {
FILE: src/components/SQLCourseVariant/SQLCourseVariantPage.tsx
function SQLCourseVariantPage (line 21) | function SQLCourseVariantPage() {
FILE: src/components/SQLCourseVariant/SectionHeader.tsx
type SectionHeaderProps (line 3) | type SectionHeaderProps = {
function SectionHeader (line 9) | function SectionHeader(props: SectionHeaderProps) {
FILE: src/components/Schedule/ScheduleButton.tsx
type ScheduleButtonProps (line 7) | type ScheduleButtonProps = {
function ScheduleButton (line 13) | function ScheduleButton(props: ScheduleButtonProps) {
FILE: src/components/Schedule/ScheduleEventModal.tsx
function generateRoadmapIcsFile (line 10) | function generateRoadmapIcsFile(
type ScheduleEventModalProps (line 47) | type ScheduleEventModalProps = {
function ScheduleEventModal (line 52) | function ScheduleEventModal(props: ScheduleEventModalProps) {
type SVGIcon (line 261) | type SVGIcon = (props: SVGProps<SVGSVGElement>) => ReactNode;
type CalendarButtonProps (line 263) | type CalendarButtonProps = {
function CalendarButton (line 270) | function CalendarButton(props: CalendarButtonProps) {
type CalendarStepsProps (line 289) | type CalendarStepsProps = {
function CalendarSteps (line 297) | function CalendarSteps(props: CalendarStepsProps) {
FILE: src/components/SearchSelector.tsx
type OptionType (line 3) | type OptionType = {
function SearchSelector (line 8) | function SearchSelector({
FILE: src/components/Select.tsx
function Select (line 6) | function Select({
function SelectGroup (line 12) | function SelectGroup({
function SelectValue (line 18) | function SelectValue({
function SelectTrigger (line 24) | function SelectTrigger({
function SelectContent (line 50) | function SelectContent({
function SelectLabel (line 85) | function SelectLabel({
function SelectItem (line 98) | function SelectItem({
function SelectSeparator (line 122) | function SelectSeparator({
function SelectScrollUpButton (line 138) | function SelectScrollUpButton({
function SelectScrollDownButton (line 156) | function SelectScrollDownButton({
FILE: src/components/SelectNative.tsx
function SelectNative (line 6) | function SelectNative(props: React.ComponentProps<'select'>) {
FILE: src/components/ShareIcons/ShareIcons.tsx
type ShareIconsProps (line 8) | type ShareIconsProps = {
function ShareIcons (line 15) | function ShareIcons(props: ShareIconsProps) {
FILE: src/components/ShareOptions/ShareFriendList.tsx
type FriendshipStatus (line 10) | type FriendshipStatus =
type FriendResourceProgress (line 18) | type FriendResourceProgress = {
type ListFriendsResponse (line 29) | type ListFriendsResponse = {
type ShareFriendListProps (line 39) | type ShareFriendListProps = {
function ShareFriendList (line 46) | function ShareFriendList(props: ShareFriendListProps) {
FILE: src/components/ShareOptions/ShareOptionsModal.tsx
type OnShareSettingsUpdate (line 18) | type OnShareSettingsUpdate = (options: {
type ShareOptionsModalProps (line 25) | type ShareOptionsModalProps = {
function ShareOptionsModal (line 39) | function ShareOptionsModal(props: ShareOptionsModalProps) {
function UpdateAction (line 367) | function UpdateAction(props: {
type DiscoveryCheckboxProps (line 390) | type DiscoveryCheckboxProps = {
function DiscoveryCheckbox (line 395) | function DiscoveryCheckbox(props: DiscoveryCheckboxProps) {
FILE: src/components/ShareOptions/ShareOptionsTab.tsx
type ShareOptionTabsProps (line 46) | type ShareOptionTabsProps = {
function ShareOptionTabs (line 58) | function ShareOptionTabs(props: ShareOptionTabsProps) {
type OptionTabProps (line 116) | type OptionTabProps = {
function OptionTab (line 124) | function OptionTab(props: OptionTabProps) {
FILE: src/components/ShareOptions/ShareSuccess.tsx
type ShareSuccessProps (line 6) | type ShareSuccessProps = {
function ShareSuccess (line 15) | function ShareSuccess(props: ShareSuccessProps) {
FILE: src/components/ShareOptions/ShareTeamMemberList.tsx
type AllowedMemberRoles (line 10) | type AllowedMemberRoles = (typeof allowedRoles)[number];
type AllowedMemberStatus (line 11) | type AllowedMemberStatus = (typeof allowedStatus)[number];
type TeamMemberDocument (line 13) | interface TeamMemberDocument {
type TeamMemberList (line 28) | interface TeamMemberList extends TeamMemberDocument {
type ShareTeamMemberListProps (line 34) | type ShareTeamMemberListProps = {
function ShareTeamMemberList (line 45) | function ShareTeamMemberList(props: ShareTeamMemberListProps) {
FILE: src/components/ShareOptions/TransferToTeamList.tsx
type TransferToTeamListProps (line 8) | type TransferToTeamListProps = {
function TransferToTeamList (line 21) | function TransferToTeamList(props: TransferToTeamListProps) {
FILE: src/components/ShareOptions/UserItem.tsx
type UserItemProps (line 3) | type UserItemProps = {
function UserItem (line 13) | function UserItem(props: UserItemProps) {
FILE: src/components/ShareRoadmapButton.tsx
type ShareRoadmapButtonProps (line 9) | type ShareRoadmapButtonProps = {
function ShareRoadmapButton (line 16) | function ShareRoadmapButton(props: ShareRoadmapButtonProps) {
FILE: src/components/Stepper.tsx
type StepperStep (line 4) | type StepperStep = {
type StepperProps (line 9) | type StepperProps = {
function Stepper (line 15) | function Stepper(props: StepperProps) {
FILE: src/components/TabLink.tsx
type TabLinkProps (line 4) | type TabLinkProps = {
function TabLink (line 16) | function TabLink(props: TabLinkProps) {
FILE: src/components/TableOfContent/TableOfContent.tsx
type TableOfContentProps (line 6) | type TableOfContentProps = {
function TableOfContent (line 10) | function TableOfContent(props: TableOfContentProps) {
FILE: src/components/TeamActivity/TeamActivityItem.tsx
type TeamActivityItemProps (line 10) | type TeamActivityItemProps = {
function TeamActivityItem (line 23) | function TeamActivityItem(props: TeamActivityItemProps) {
FILE: src/components/TeamActivity/TeamActivityPage.tsx
type TeamStreamActivity (line 19) | type TeamStreamActivity = {
type TeamActivityStreamDocument (line 32) | interface TeamActivityStreamDocument {
type GetTeamActivityResponse (line 41) | type GetTeamActivityResponse = {
type TeamActivityPageProps (line 58) | type TeamActivityPageProps = {
function TeamActivityPage (line 63) | function TeamActivityPage(props: TeamActivityPageProps) {
FILE: src/components/TeamActivity/TeamActivityTopicsModal.tsx
type TeamActivityTopicsModalProps (line 8) | type TeamActivityTopicsModalProps = {
function TeamActivityTopicsModal (line 13) | function TeamActivityTopicsModal(props: TeamActivityTopicsModalProps) {
FILE: src/components/TeamActivity/TeamEmptyStream.tsx
type TeamActivityItemProps (line 3) | type TeamActivityItemProps = {
function TeamEmptyStream (line 7) | function TeamEmptyStream(props: TeamActivityItemProps) {
FILE: src/components/TeamAnnouncement.tsx
type TeamAnnouncementProps (line 1) | type TeamAnnouncementProps = {};
function TeamAnnouncement (line 3) | function TeamAnnouncement(props: TeamAnnouncementProps) {
FILE: src/components/TeamDropdown/TeamDropdown.tsx
type AllowedMemberStatus (line 15) | type AllowedMemberStatus = (typeof allowedStatus)[number];
type UserTeamItem (line 17) | type UserTeamItem = {
type TeamListResponse (line 29) | type TeamListResponse = UserTeamItem[];
function TeamDropdown (line 31) | function TeamDropdown() {
FILE: src/components/TeamMarketing/TeamDemo.tsx
function TeamDemo (line 56) | function TeamDemo() {
FILE: src/components/TeamMarketing/TeamHeroBanner.tsx
function fireTeamCreationClick (line 12) | function fireTeamCreationClick() {
function TeamHeroBanner (line 20) | function TeamHeroBanner() {
FILE: src/components/TeamMarketing/TeamPricing.tsx
function TeamPricing (line 8) | function TeamPricing() {
FILE: src/components/TeamMarketing/TeamTools.tsx
function TeamTools (line 36) | function TeamTools() {
FILE: src/components/TeamMembers/InviteMemberPopup.tsx
type InviteMemberPopupProps (line 7) | type InviteMemberPopupProps = {
function InviteMemberPopup (line 13) | function InviteMemberPopup(props: InviteMemberPopupProps) {
FILE: src/components/TeamProgress/GroupRoadmapItem.tsx
type GroupRoadmapItemProps (line 7) | type GroupRoadmapItemProps = {
function GroupRoadmapItem (line 12) | function GroupRoadmapItem(props: GroupRoadmapItemProps) {
FILE: src/components/TeamProgress/MemberCustomProgressModal.tsx
type ProgressMapProps (line 29) | type ProgressMapProps = {
type MemberProgressResponse (line 39) | type MemberProgressResponse = {
function MemberCustomProgressModal (line 46) | function MemberCustomProgressModal(props: ProgressMapProps) {
FILE: src/components/TeamProgress/MemberProgressItem.tsx
type MemberProgressItemProps (line 7) | type MemberProgressItemProps = {
function MemberProgressItem (line 16) | function MemberProgressItem(props: MemberProgressItemProps) {
FILE: src/components/TeamProgress/MemberProgressModal.tsx
type ProgressMapProps (line 26) | type ProgressMapProps = {
type MemberProgressResponse (line 36) | type MemberProgressResponse = {
function MemberProgressModal (line 43) | function MemberProgressModal(props: ProgressMapProps) {
FILE: src/components/TeamProgress/MemberProgressModalHeader.tsx
type MemberProgressModalHeaderProps (line 4) | type MemberProgressModalHeaderProps = {
function MemberProgressModalHeader (line 13) | function MemberProgressModalHeader(
FILE: src/components/TeamProgress/TeamProgressPage.tsx
type UserProgress (line 14) | type UserProgress = {
type TeamMember (line 29) | type TeamMember = {
type GroupByRoadmap (line 39) | type GroupByRoadmap = {
function TeamProgressPage (line 56) | function TeamProgressPage() {
FILE: src/components/TeamRoadmaps/PickRoadmapOptionModal.tsx
type PickRoadmapOptionModalProps (line 4) | type PickRoadmapOptionModalProps = {
function PickRoadmapOptionModal (line 10) | function PickRoadmapOptionModal(props: PickRoadmapOptionModalProps) {
FILE: src/components/TeamSidebar.tsx
type TeamSidebarProps (line 15) | type TeamSidebarProps = {
function TeamSidebar (line 20) | function TeamSidebar({ activePageId, children }: TeamSidebarProps) {
FILE: src/components/TeamsList.tsx
function TeamsList (line 8) | function TeamsList() {
FILE: src/components/ThankYou/ThankYouPage.tsx
function ThankYouPage (line 7) | function ThankYouPage() {
FILE: src/components/Toast.tsx
function Toaster (line 17) | function Toaster(props: Props) {
FILE: src/components/Tooltip.tsx
type TooltipProps (line 4) | type TooltipProps = {
function Tooltip (line 22) | function Tooltip(props: TooltipProps) {
FILE: src/components/TopNavDropdowns/AIDropdownMenu.tsx
function AIDropdownMenu (line 38) | function AIDropdownMenu() {
FILE: src/components/TopNavDropdowns/RoadmapDropdownMenu.tsx
function RoadmapDropdownMenu (line 35) | function RoadmapDropdownMenu() {
FILE: src/components/TopNavDropdowns/UpgradeProButton.tsx
function UpgradeProButton (line 5) | function UpgradeProButton() {
FILE: src/components/TopicDetail/ContributionForm.tsx
type ContributionInputProps (line 5) | type ContributionInputProps = {
function ContributionInput (line 16) | function ContributionInput(props: ContributionInputProps) {
type ContributionFormProps (line 111) | type ContributionFormProps = {
function ContributionForm (line 118) | function ContributionForm(props: ContributionFormProps) {
FILE: src/components/TopicDetail/CreateCourseModal.tsx
type CreateCourseModalProps (line 5) | type CreateCourseModalProps = {
function CreateCourseModal (line 9) | function CreateCourseModal(props: CreateCourseModalProps) {
FILE: src/components/TopicDetail/PaidResourceDisclaimer.tsx
type PaidResourceDisclaimerProps (line 4) | type PaidResourceDisclaimerProps = {
function PaidResourceDisclaimer (line 8) | function PaidResourceDisclaimer(props: PaidResourceDisclaimerProps) {
FILE: src/components/TopicDetail/PredefinedActionGroup.tsx
type PredefinedActionGroupProps (line 9) | type PredefinedActionGroupProps = {
function PredefinedActionGroup (line 16) | function PredefinedActionGroup(props: PredefinedActionGroupProps) {
FILE: src/components/TopicDetail/PredefinedActions.tsx
type PredefinedActionType (line 15) | type PredefinedActionType = {
type PredefinedActionsProps (line 83) | type PredefinedActionsProps = {
function PredefinedActions (line 87) | function PredefinedActions(props: PredefinedActionsProps) {
type PredefinedActionButtonProps (line 120) | type PredefinedActionButtonProps = {
function PredefinedActionButton (line 128) | function PredefinedActionButton(props: PredefinedActionButtonProps) {
FILE: src/components/TopicDetail/ResourceListSeparator.tsx
type ResourceSeparatorProps (line 4) | type ResourceSeparatorProps = {
function ResourceListSeparator (line 11) | function ResourceListSeparator(props: ResourceSeparatorProps) {
FILE: src/components/TopicDetail/TopicDetail.tsx
type PaidResourceType (line 57) | type PaidResourceType = {
constant CLOSE_TOPIC_DETAIL_EVENT (line 67) | const CLOSE_TOPIC_DETAIL_EVENT = 'close-topic-detail';
function fetchRoadmapPaidResources (line 77) | async function fetchRoadmapPaidResources(roadmapId: string) {
constant PAID_RESOURCE_DISCLAIMER_HIDDEN (line 96) | const PAID_RESOURCE_DISCLAIMER_HIDDEN = 'paid-resource-disclaimer-hidden';
type TopicDetailProps (line 98) | type TopicDetailProps = {
function TopicDetail (line 118) | function TopicDetail(props: TopicDetailProps) {
FILE: src/components/TopicDetail/TopicDetailAI.tsx
type TopicDetailAIProps (line 35) | type TopicDetailAIProps = {
function TopicDetailAI (line 53) | function TopicDetailAI(props: TopicDetailAIProps) {
FILE: src/components/TopicDetail/TopicDetailLink.tsx
type TopicLinkBadgeProps (line 21) | type TopicLinkBadgeProps = {
function TopicLinkBadge (line 28) | function TopicLinkBadge(props: TopicLinkBadgeProps) {
type TopicDetailLinkProps (line 49) | type TopicDetailLinkProps = {
function TopicDetailLink (line 57) | function TopicDetailLink(props: TopicDetailLinkProps) {
FILE: src/components/TopicDetail/TopicDetailsTabs.tsx
type AllowedTopicDetailsTabs (line 3) | type AllowedTopicDetailsTabs = 'content' | 'ai';
type TopicDetailsTabsProps (line 5) | type TopicDetailsTabsProps = {
function TopicDetailsTabs (line 11) | function TopicDetailsTabs(props: TopicDetailsTabsProps) {
type TopicDetailsTabProps (line 34) | type TopicDetailsTabProps = {
function TopicDetailsTab (line 43) | function TopicDetailsTab(props: TopicDetailsTabProps) {
FILE: src/components/TopicDetail/TopicProgressButton.tsx
type TopicProgressButtonProps (line 30) | type TopicProgressButtonProps = {
type ProgressDropdownItemProps (line 39) | type ProgressDropdownItemProps = {
function ProgressDropdownItem (line 46) | function ProgressDropdownItem(props: ProgressDropdownItemProps) {
function TopicProgressButton (line 65) | function TopicProgressButton(props: TopicProgressButtonProps) {
FILE: src/components/UserPersona/ChatPersona.tsx
type ChatPersonaProps (line 9) | type ChatPersonaProps = {
function ChatPersona (line 13) | function ChatPersona(props: ChatPersonaProps) {
FILE: src/components/UserPersona/UpdatePersonaModal.tsx
type UpdatePersonaModalProps (line 13) | type UpdatePersonaModalProps = {
function UpdatePersonaModal (line 18) | function UpdatePersonaModal(props: UpdatePersonaModalProps) {
FILE: src/components/UserPersona/UserPersonaForm.tsx
type UserPersonaFormData (line 6) | type UserPersonaFormData = {
type UserPersonaFormProps (line 13) | type UserPersonaFormProps = {
function UserPersonaForm (line 23) | function UserPersonaForm(props: UserPersonaFormProps) {
FILE: src/components/UserProgress/ModalLoader.tsx
type ModalLoaderProps (line 4) | type ModalLoaderProps = {
function ModalLoader (line 10) | function ModalLoader(props: ModalLoaderProps) {
FILE: src/components/UserProgress/ProgressShareButton.tsx
type ProgressShareButtonProps (line 8) | type ProgressShareButtonProps = {
function ProgressShareButton (line 16) | function ProgressShareButton(props: ProgressShareButtonProps) {
FILE: src/components/UserProgress/UserCustomProgressModal.tsx
type ProgressMapProps (line 15) | type ProgressMapProps = {
type UserProgressResponse (line 23) | type UserProgressResponse = {
function UserCustomProgressModal (line 36) | function UserCustomProgressModal(props: ProgressMapProps) {
FILE: src/components/UserProgress/UserProgressModal.tsx
type ProgressMapProps (line 17) | type ProgressMapProps = {
type UserProgressResponse (line 26) | type UserProgressResponse = {
function UserProgressModal (line 39) | function UserProgressModal(props: ProgressMapProps) {
FILE: src/components/UserProgress/UserProgressModalHeader.tsx
type UserProgressModalHeaderProps (line 3) | type UserProgressModalHeaderProps = {
function UserProgressModalHeader (line 8) | function UserProgressModalHeader(props: UserProgressModalHeaderProps) {
FILE: src/components/UserPublicProfile/PrivateProfileBanner.tsx
type PrivateProfileBannerProps (line 4) | type PrivateProfileBannerProps = Pick<
function PrivateProfileBanner (line 9) | function PrivateProfileBanner(props: PrivateProfileBannerProps) {
FILE: src/components/UserPublicProfile/UserProfileRoadmap.tsx
type UserProfileRoadmapProps (line 9) | type UserProfileRoadmapProps = GetUserProfileRoadmapResponse &
function UserProfileRoadmap (line 17) | function UserProfileRoadmap(props: UserProfileRoadmapProps) {
FILE: src/components/UserPublicProfile/UserProfileRoadmapRenderer.tsx
type UserProfileRoadmapRendererProps (line 14) | type UserProfileRoadmapRendererProps = GetUserProfileRoadmapResponse & {
function UserProfileRoadmapRenderer (line 19) | function UserProfileRoadmapRenderer(
FILE: src/components/UserPublicProfile/UserPublicActivityHeatmap.tsx
type UserActivityHeatmapProps (line 9) | type UserActivityHeatmapProps = {
function UserActivityHeatmap (line 22) | function UserActivityHeatmap(props: UserActivityHeatmapProps) {
FILE: src/components/UserPublicProfile/UserPublicProfileHeader.tsx
type UserPublicProfileHeaderProps (line 12) | type UserPublicProfileHeaderProps = {
function UserPublicProfileHeader (line 16) | function UserPublicProfileHeader(props: UserPublicProfileHeaderProps) {
type UserLinkProps (line 70) | type UserLinkProps = {
function UserLink (line 75) | function UserLink(props: UserLinkProps) {
FILE: src/components/UserPublicProfile/UserPublicProfilePage.tsx
type UserPublicProfilePageProps (line 9) | type UserPublicProfilePageProps = GetPublicProfileResponse & {
function UserPublicProfilePage (line 13) | function UserPublicProfilePage(props: UserPublicProfilePageProps) {
FILE: src/components/UserPublicProfile/UserPublicProgressStats.tsx
type UserPublicProgressStats (line 4) | type UserPublicProgressStats = {
function UserPublicProgressStats (line 20) | function UserPublicProgressStats(props: UserPublicProgressStats) {
FILE: src/components/UserPublicProfile/UserPublicProgresses.tsx
type UserPublicProgressesProps (line 4) | type UserPublicProgressesProps = {
function UserPublicProgresses (line 11) | function UserPublicProgresses(props: UserPublicProgressesProps) {
FILE: src/components/UserPublicProfile/UserPublicProjects.tsx
type UserPublicProjectsProps (line 5) | type UserPublicProjectsProps = {
function UserPublicProjects (line 11) | function UserPublicProjects(props: UserPublicProjectsProps) {
FILE: src/components/VideoModal.tsx
type VideoModalProps (line 3) | type VideoModalProps = {
function VideoModal (line 9) | function VideoModal(props: VideoModalProps) {
FILE: src/env.d.ts
type ImportMetaEnv (line 4) | interface ImportMetaEnv {
type ImportMeta (line 13) | interface ImportMeta {
FILE: src/helper/download-image.ts
type DownloadImageProps (line 1) | type DownloadImageProps = {
function downloadImage (line 8) | async function downloadImage({
function downloadGeneratedRoadmapImage (line 38) | async function downloadGeneratedRoadmapImage(
FILE: src/helper/generate-ai-course.ts
type GenerateCourseOptions (line 10) | type GenerateCourseOptions = {
function generateCourse (line 25) | async function generateCourse(options: GenerateCourseOptions) {
FILE: src/helper/generate-ai-guide.ts
type GuideDetails (line 7) | type GuideDetails = {
type GenerateGuideOptions (line 14) | type GenerateGuideOptions = {
function generateGuide (line 31) | async function generateGuide(options: GenerateGuideOptions) {
FILE: src/helper/grouping.ts
function groupChatHistory (line 4) | function groupChatHistory(chatHistories: ChatHistoryWithoutMessages[]) {
FILE: src/helper/shuffle.ts
function shuffle (line 1) | function shuffle<T = any>(array: T[]): T[] {
FILE: src/hooks/use-ai-chat-scroll.tsx
type UseAIChatScrollProps (line 4) | type UseAIChatScrollProps = {
function useAIChatScroll (line 9) | function useAIChatScroll(props: UseAIChatScrollProps) {
FILE: src/hooks/use-auth.ts
function useAuth (line 4) | function useAuth() {
FILE: src/hooks/use-chat.ts
type ChatMessage (line 7) | type ChatMessage = {
type UseChatOptions (line 13) | type UseChatOptions = {
function useChat (line 21) | function useChat(options: UseChatOptions) {
FILE: src/hooks/use-client-mount.ts
function useClientMount (line 3) | function useClientMount() {
FILE: src/hooks/use-completion.ts
type CompleteOptions (line 6) | type CompleteOptions = {
type CompletionStatus (line 11) | type CompletionStatus = 'idle' | 'loading' | 'streaming' | 'success' | '...
type CompletionContext (line 13) | type CompletionContext = {
type CompletionParams (line 17) | type CompletionParams<D extends Record<string, unknown>> = {
function useCompletion (line 31) | function useCompletion<
FILE: src/hooks/use-copy-text.ts
function useCopyText (line 3) | function useCopyText() {
FILE: src/hooks/use-custom-roadmap.ts
type UseCustomRoadmapOptions (line 6) | type UseCustomRoadmapOptions = {
function useCustomRoadmap (line 12) | function useCustomRoadmap(options: UseCustomRoadmapOptions) {
FILE: src/hooks/use-debounce.ts
function useDebounceValue (line 3) | function useDebounceValue<T>(value: T, delay: number): T {
FILE: src/hooks/use-is-mounted.ts
function useIsMounted (line 3) | function useIsMounted() {
FILE: src/hooks/use-is-thinking.ts
function useIsThinking (line 4) | function useIsThinking(messages: UIMessage[], status: ChatStatus) {
FILE: src/hooks/use-keydown.ts
function useKeydown (line 3) | function useKeydown(keyName: string, callback: any, deps: any[] = []) {
FILE: src/hooks/use-load-topic.ts
type CallbackType (line 4) | type CallbackType = (data: {
function useLoadTopic (line 11) | function useLoadTopic(callback: CallbackType) {
FILE: src/hooks/use-outside-click.ts
function useOutsideClick (line 3) | function useOutsideClick(ref: any, callback: any) {
FILE: src/hooks/use-pagination.ts
function usePagination (line 3) | function usePagination(
FILE: src/hooks/use-params.ts
function useParams (line 3) | function useParams<T = Record<string, any>>(): T {
FILE: src/hooks/use-personalized-roadmap.ts
type PersonalizedRoadmapResponse (line 6) | type PersonalizedRoadmapResponse = {
type UsePersonalizedRoadmapOptions (line 11) | type UsePersonalizedRoadmapOptions = {
function usePersonalizedRoadmap (line 19) | function usePersonalizedRoadmap(options: UsePersonalizedRoadmapOptions) {
function parsePersonalizedRoadmapResponse (line 129) | function parsePersonalizedRoadmapResponse(
FILE: src/hooks/use-roadmap-ai-chat.tsx
type RoadmapAIChatRendererOptions (line 21) | type RoadmapAIChatRendererOptions = {
function roadmapAIChatRenderer (line 27) | function roadmapAIChatRenderer(
type RoadmapAIChatHistoryType (line 61) | type RoadmapAIChatHistoryType = {
type Options (line 70) | type Options = {
function useRoadmapAIChat (line 79) | function useRoadmapAIChat(options: Options) {
function htmlFromTiptapJSON (line 318) | function htmlFromTiptapJSON(json: JSONContent): string {
FILE: src/hooks/use-scroll-position.ts
function useScrollPosition (line 3) | function useScrollPosition() {
FILE: src/hooks/use-sticky-stuck.tsx
function useStickyStuck (line 5) | function useStickyStuck<T extends HTMLElement>(
FILE: src/hooks/use-team-id.ts
function useTeamId (line 3) | function useTeamId() {
FILE: src/hooks/use-toast.ts
function useToast (line 3) | function useToast() {
FILE: src/hooks/use-toggle-topic.ts
type CallbackType (line 4) | type CallbackType = (data: {
function useToggleTopic (line 10) | function useToggleTopic(callback: CallbackType) {
FILE: src/hooks/use-verify-answer.ts
type VerifyAnswerResponse (line 7) | type VerifyAnswerResponse = {
type UseVerifyAnswerOptions (line 12) | type UseVerifyAnswerOptions = {
function useVerifyAnswer (line 21) | function useVerifyAnswer(options: UseVerifyAnswerOptions) {
function parseVerifyAIQuizAnswerResponse (line 122) | function parseVerifyAIQuizAnswerResponse(
FILE: src/lib/ai-questions.ts
function storeQuestionAnswerChatMessages (line 3) | function storeQuestionAnswerChatMessages(
function getQuestionAnswerChatMessages (line 14) | function getQuestionAnswerChatMessages(sessionId: string) {
function getLastMessagesSessionId (line 23) | function getLastMessagesSessionId() {
function clearQuestionAnswerChatMessages (line 27) | function clearQuestionAnswerChatMessages() {
FILE: src/lib/ai.ts
constant IS_KEY_ONLY_ROADMAP_GENERATION (line 7) | const IS_KEY_ONLY_ROADMAP_GENERATION = false;
type Lesson (line 9) | type Lesson = string;
type Module (line 11) | type Module = {
type AiCourse (line 16) | type AiCourse = {
function generateAiCourseStructure (line 22) | function generateAiCourseStructure(data: string): AiCourse {
type CourseFineTuneData (line 62) | type CourseFineTuneData = {
function storeFineTuneData (line 68) | function storeFineTuneData(meta: CourseFineTuneData) {
function getCourseFineTuneData (line 77) | function getCourseFineTuneData(
function getLastSessionId (line 88) | function getLastSessionId(): string | null {
function clearFineTuneData (line 92) | function clearFineTuneData() {
constant NEW_LINE (line 101) | const NEW_LINE = '\n'.charCodeAt(0);
function readAIRoadmapStream (line 103) | async function readAIRoadmapStream(
function readAIRoadmapContentStream (line 145) | async function readAIRoadmapContentStream(
function readStream (line 175) | async function readStream(
type Question (line 215) | type Question = {
function generateAiCourseLessonQuestions (line 225) | function generateAiCourseLessonQuestions(
type SubTopic (line 271) | type SubTopic = {
type Topic (line 277) | type Topic = {
type Label (line 284) | type Label = {
type Title (line 290) | type Title = {
type ResultItem (line 296) | type ResultItem = Title | Topic | Label;
function generateAICourseRoadmapStructure (line 298) | function generateAICourseRoadmapStructure(
type ChatUIMessage (line 361) | type ChatUIMessage = UIMessage<
function fetchWithAuthHandling (line 383) | async function fetchWithAuthHandling(
FILE: src/lib/auth.ts
constant REDIRECT_PAGE_AFTER_AUTH (line 3) | const REDIRECT_PAGE_AFTER_AUTH = 'redirect_page_after_auth';
function logout (line 5) | function logout() {
FILE: src/lib/author.ts
type AuthorFrontmatter (line 3) | interface AuthorFrontmatter {
type AuthorFileType (line 18) | type AuthorFileType = MarkdownFileType<AuthorFrontmatter> & {
function authorPathToId (line 22) | function authorPathToId(filePath: string): string {
function getAuthorIds (line 33) | async function getAuthorIds() {
function getAllAuthors (line 44) | async function getAllAuthors(): Promise<AuthorFileType[]> {
function getAuthorById (line 58) | async function getAuthorById(id: string): Promise<AuthorFileType> {
FILE: src/lib/best-practice-topic.ts
function generateTopicUrl (line 9) | function generateTopicUrl(filePath: string) {
type BestPracticeTopicFileType (line 18) | interface BestPracticeTopicFileType {
function getAllBestPracticeTopicFiles (line 30) | async function getAllBestPracticeTopicFiles(): Promise<
FILE: src/lib/best-practice.ts
type BestPracticeFrontmatter (line 3) | interface BestPracticeFrontmatter {
type BestPracticeFileType (line 31) | type BestPracticeFileType = MarkdownFileType<BestPracticeFrontmatter> & {
function bestPracticePathToId (line 35) | function bestPracticePathToId(filePath: string): string {
function getBestPracticeIds (line 46) | async function getBestPracticeIds() {
function getAllBestPractices (line 62) | async function getAllBestPractices(): Promise<BestPracticeFileType[]> {
function getBestPracticeById (line 88) | async function getBestPracticeById(
FILE: src/lib/browser.ts
function urlToId (line 1) | function urlToId(url: string) {
constant LAST_PATH_KEY (line 13) | const LAST_PATH_KEY = 'lastPage';
function storePathAsLastPath (line 15) | function storePathAsLastPath() {
function getLastPath (line 44) | function getLastPath() {
type UtmParams (line 52) | type UtmParams = Partial<{
function getUrlUtmParams (line 60) | function getUrlUtmParams(): UtmParams {
function triggerUtmRegistration (line 85) | function triggerUtmRegistration() {
function getStoredUtmParams (line 100) | function getStoredUtmParams(): UtmParams {
function getUrlParams (line 113) | function getUrlParams() {
function parseUrl (line 127) | function parseUrl(url: string) {
function deleteUrlParam (line 142) | function deleteUrlParam(key: string) {
function setUrlParams (line 156) | function setUrlParams(params: Record<string, string>) {
function getGclid (line 180) | function getGclid(): string | undefined {
function generateSessionId (line 196) | function generateSessionId(): string {
function getPageTrackingData (line 211) | function getPageTrackingData() {
FILE: src/lib/chat.ts
constant CHAT_RESPONSE_PREFIX (line 1) | const CHAT_RESPONSE_PREFIX = {
constant NEWLINE (line 6) | const NEWLINE = '\n'.charCodeAt(0);
function concatChunks (line 8) | function concatChunks(chunks: Uint8Array[], totalLength: number) {
function readChatStream (line 21) | async function readChatStream(
FILE: src/lib/classname.ts
function cn (line 4) | function cn(...inputs: ClassValue[]) {
FILE: src/lib/date.ts
function getRelativeTimeString (line 3) | function getRelativeTimeString(
function formatMonthDate (line 55) | function formatMonthDate(date: string): string {
function formatActivityDate (line 62) | function formatActivityDate(date: string): string {
function getCurrentPeriod (line 69) | function getCurrentPeriod() {
FILE: src/lib/discord.ts
function getDiscordInfo (line 8) | async function getDiscordInfo(): Promise<{
FILE: src/lib/dom.ts
function replaceChildren (line 1) | function replaceChildren(parentNode: Element, newChild: Element) {
function lockBodyScroll (line 10) | function lockBodyScroll(shouldLock: boolean) {
FILE: src/lib/file.ts
type MarkdownFileType (line 1) | interface MarkdownFileType<T = Record<string, string>> {
FILE: src/lib/github.ts
function countStars (line 8) | async function countStars(
function getFormattedStars (line 28) | async function getFormattedStars(
function getRepositoryRank (line 39) | async function getRepositoryRank(
function getOrdinalSuffix (line 63) | function getOrdinalSuffix(rank: number): string {
function getTopGitHubLanguages (line 81) | function getTopGitHubLanguages(languages: Record<string, number>) {
FILE: src/lib/guide-renderer.tsx
type HeadingType (line 12) | type HeadingType = {
type HeadingGroupType (line 18) | type HeadingGroupType = HeadingType & { children: HeadingType[] };
type QuestionType (line 20) | type QuestionType = {
type MarkType (line 27) | interface MarkType {
type GuideRendererOptions (line 33) | type GuideRendererOptions = {};
class GuideRenderer (line 35) | class GuideRenderer {
method render (line 38) | render(content: JSONContent) {
method tableOfContents (line 54) | tableOfContents(node: JSONContent) {
method headlines (line 130) | headlines(node: JSONContent) {
method getText (line 164) | private getText(node: JSONContent): string {
method content (line 178) | private content(node: JSONContent): JSX.Element[] {
method renderNode (line 195) | private renderNode(node: JSONContent): JSX.Element | null {
method renderMark (line 208) | private renderMark(node: JSONContent): JSX.Element {
method paragraph (line 232) | private paragraph(node: JSONContent): JSX.Element {
method text (line 245) | private text(node: JSONContent): JSX.Element {
method bold (line 254) | private bold(_: MarkType, text: JSX.Element): JSX.Element {
method italic (line 258) | private italic(_: MarkType, text: JSX.Element): JSX.Element {
method underline (line 262) | private underline(_: MarkType, text: JSX.Element): JSX.Element {
method strike (line 266) | private strike(_: MarkType, text: JSX.Element): JSX.Element {
method textStyle (line 270) | private textStyle(mark: MarkType, text: JSX.Element): JSX.Element {
method link (line 285) | private link(mark: MarkType, text: JSX.Element): JSX.Element {
method heading (line 301) | private heading(node: JSONContent): JSX.Element {
method horizontalRule (line 324) | private horizontalRule(_: JSONContent): JSX.Element {
method orderedList (line 328) | private orderedList(node: JSONContent): JSX.Element {
method bulletList (line 332) | private bulletList(node: JSONContent): JSX.Element {
method listItem (line 336) | private listItem(node: JSONContent): JSX.Element {
method hardBreak (line 340) | private hardBreak(_: JSONContent): JSX.Element {
method image (line 344) | private image(node: JSONContent): JSX.Element {
method code (line 351) | private code(_: MarkType, text: JSX.Element): JSX.Element {
method codeBlock (line 355) | private codeBlock(node: JSONContent): JSX.Element {
method blockquote (line 370) | private blockquote(node: JSONContent): JSX.Element {
method questions (line 374) | questions(node: JSONContent) {
method qaSection (line 418) | private qaSection(node: JSONContent): JSX.Element {
method table (line 481) | private table(node: JSONContent): JSX.Element {
method tableRow (line 504) | private tableRow(node: JSONContent): JSX.Element {
method tableHeader (line 508) | private tableHeader(node: JSONContent): JSX.Element {
method tableCell (line 512) | private tableCell(node: JSONContent): JSX.Element {
FILE: src/lib/guide.ts
type GuideFrontmatter (line 5) | interface GuideFrontmatter {
type GuideFileType (line 29) | type GuideFileType = MarkdownFileType<GuideFrontmatter> & {
function guidePathToId (line 41) | function guidePathToId(filePath: string): string {
function getGuidesByAuthor (line 47) | async function getGuidesByAuthor(
function getAllGuides (line 59) | async function getAllGuides(): Promise<GuideFileType[]> {
function getGuideById (line 119) | async function getGuideById(
type HeadingType (line 127) | type HeadingType = ReturnType<MarkdownFileType['getHeadings']>[number];
type HeadingGroupType (line 128) | type HeadingGroupType = HeadingType & { children: HeadingType[] };
constant NUMBERED_LIST_REGEX (line 130) | const NUMBERED_LIST_REGEX = /^\d+\.\s+?/;
function getGuideTableOfContent (line 132) | function getGuideTableOfContent(headings: HeadingType[]) {
FILE: src/lib/html.ts
function htmlToMarkdown (line 4) | function htmlToMarkdown(html: string) {
FILE: src/lib/http.ts
type HttpOptionsType (line 5) | type HttpOptionsType = RequestInit | { headers: Record<string, any> };
type AppResponse (line 7) | type AppResponse = Record<string, any>;
type FetchError (line 9) | type FetchError = {
type AppError (line 14) | type AppError = {
type ApiReturn (line 20) | type ApiReturn<ResponseType, ErrorType> = {
function httpCall (line 31) | async function httpCall<
function httpPost (line 95) | async function httpPost<
function httpGet (line 110) | async function httpGet<ResponseType = AppResponse, ErrorType = AppError>(
function httpPatch (line 125) | async function httpPatch<
function httpPut (line 140) | async function httpPut<ResponseType = AppResponse, ErrorType = AppError>(
function httpDelete (line 152) | async function httpDelete<
FILE: src/lib/image.ts
function getLocalImageDimensions (line 4) | async function getLocalImageDimensions(path: string) {
FILE: src/lib/is-mobile.ts
function isAndroid (line 1) | function isAndroid(): boolean {
function isSmallIOS (line 7) | function isSmallIOS(): boolean {
function isLargeIOS (line 13) | function isLargeIOS(): boolean {
function isIOS (line 21) | function isIOS(): boolean {
function isMobile (line 25) | function isMobile(): boolean {
function isMobileScreen (line 29) | function isMobileScreen(): boolean {
type TailwindScreenDimensions (line 35) | type TailwindScreenDimensions = 'sm' | 'md' | 'lg' | 'xl' | '2xl';
function getTailwindScreenDimension (line 37) | function getTailwindScreenDimension(): TailwindScreenDimensions {
FILE: src/lib/jsonld-schema.ts
type ArticleSchemaProps (line 4) | type ArticleSchemaProps = {
function generateArticleSchema (line 13) | function generateArticleSchema(article: ArticleSchemaProps) {
function generateFAQSchema (line 45) | function generateFAQSchema(faqs: OfficialRoadmapQuestion[]) {
FILE: src/lib/jwt.ts
constant TOKEN_COOKIE_NAME (line 5) | const TOKEN_COOKIE_NAME = '__roadmapsh_jt__';
constant FIRST_LOGIN_PARAM (line 6) | const FIRST_LOGIN_PARAM = 'fl' as const;
constant COURSE_PURCHASE_PARAM (line 7) | const COURSE_PURCHASE_PARAM = 't';
constant COURSE_PURCHASE_SUCCESS_PARAM (line 8) | const COURSE_PURCHASE_SUCCESS_PARAM = 'success';
type TokenPayload (line 10) | type TokenPayload = {
function decodeToken (line 18) | function decodeToken(token: string): TokenPayload {
function isLoggedIn (line 24) | function isLoggedIn() {
function getUser (line 30) | function getUser() {
function setAuthToken (line 40) | function setAuthToken(token: string) {
function removeAuthToken (line 51) | function removeAuthToken() {
function visitAIRoadmap (line 58) | function visitAIRoadmap(roadmapId: string) {
constant AI_REFERRAL_COOKIE_NAME (line 73) | const AI_REFERRAL_COOKIE_NAME = 'referral_code';
function setAIReferralCode (line 75) | function setAIReferralCode(code: string) {
function removeAIReferralCode (line 90) | function removeAIReferralCode() {
function setViewSponsorCookie (line 97) | function setViewSponsorCookie(sponsorId: string) {
FILE: src/lib/markdown-renderer.tsx
type MarkdownRendererOptions (line 3) | type MarkdownRendererOptions = {
class MarkdownRenderer (line 7) | class MarkdownRenderer {
method render (line 10) | render(content: JSONContent, options: MarkdownRendererOptions = {}): s...
method renderNode (line 17) | private renderNode(node: JSONContent): string {
method getText (line 29) | private getText(node: JSONContent): string {
method content (line 36) | private content(node: JSONContent): string {
method renderMark (line 40) | private renderMark(node: JSONContent): string {
method paragraph (line 59) | private paragraph(node: JSONContent): string {
method text (line 63) | private text(node: JSONContent): string {
method heading (line 67) | private heading(node: JSONContent): string {
method bulletList (line 73) | private bulletList(node: JSONContent): string {
method orderedList (line 79) | private orderedList(node: JSONContent): string {
method listItem (line 85) | private listItem(node: JSONContent): string {
method blockquote (line 89) | private blockquote(node: JSONContent): string {
method codeBlock (line 96) | private codeBlock(node: JSONContent): string {
method horizontalRule (line 102) | private horizontalRule(): string {
method image (line 106) | private image(node: JSONContent): string {
method table (line 111) | private table(node: JSONContent): string {
method tableRow (line 116) | private tableRow(node: JSONContent): string {
method tableHeader (line 120) | private tableHeader(node: JSONContent): string {
method tableCell (line 124) | private tableCell(node: JSONContent): string {
function renderMarkdownFromJson (line 129) | function renderMarkdownFromJson(
FILE: src/lib/markdown.ts
function replaceVariables (line 6) | function replaceVariables(
function markdownToHtml (line 25) | function markdownToHtml(markdown: string, isInline = true): string {
function sanitizeMarkdown (line 41) | function sanitizeMarkdown(markdown: string) {
method highlight (line 49) | async highlight(code, lang, attrs) {
function markdownToHtmlWithHighlighting (line 64) | async function markdownToHtmlWithHighlighting(markdown: string) {
FILE: src/lib/message-part.ts
type MessagePart (line 3) | type MessagePart = {
type MessagePartRendererProps (line 10) | type MessagePartRendererProps = {
type MessagePartRenderer (line 14) | type MessagePartRenderer = (props: MessagePartRendererProps) => any;
function parseMessageParts (line 16) | function parseMessageParts(
FILE: src/lib/number.ts
function formatCommaNumber (line 5) | function formatCommaNumber(number: number): string {
function decimalIfNeeded (line 9) | function decimalIfNeeded(number: number): string {
function humanizeNumber (line 13) | function humanizeNumber(number: number): string {
function getPercentage (line 25) | function getPercentage(portion: number, total: number): number {
FILE: src/lib/open-graph.ts
type RoadmapOpenGraphQuery (line 1) | type RoadmapOpenGraphQuery = {
function getOpenGraphImageUrl (line 6) | function getOpenGraphImageUrl(
function getDefaultOpenGraphImageBuffer (line 24) | async function getDefaultOpenGraphImageBuffer() {
function getResourceOpenGraph (line 29) | async function getResourceOpenGraph(
FILE: src/lib/path.ts
function joinPath (line 1) | function joinPath(...parts: string[]) {
FILE: src/lib/popup.ts
function showLoginPopup (line 1) | function showLoginPopup() {
FILE: src/lib/promise.ts
type PromiseInput (line 1) | type PromiseInput<T> = Array<Promise<T> | (() => Promise<T>)>;
function runPromisesInBatchSequentially (line 12) | async function runPromisesInBatchSequentially<T>(
FILE: src/lib/query-http.ts
type HttpOptionsType (line 5) | type HttpOptionsType = RequestInit;
type AppResponse (line 7) | type AppResponse = Record<string, any>;
class FetchError (line 9) | class FetchError extends Error {
method constructor (line 13) | constructor(status: number, message: string) {
method isFetchError (line 19) | static isFetchError(error: any): error is FetchError {
type AppError (line 24) | type AppError = {
type ApiReturn (line 30) | type ApiReturn<ResponseType> = ResponseType;
function httpCall (line 38) | async function httpCall<ResponseType = AppResponse>(
function httpPost (line 117) | async function httpPost<ResponseType = AppResponse>(
function httpGet (line 129) | async function httpGet<ResponseType = AppResponse>(
function httpPatch (line 144) | async function httpPatch<ResponseType = AppResponse>(
function httpPut (line 156) | async function httpPut<ResponseType = AppResponse>(
function httpDelete (line 168) | async function httpDelete<ResponseType = AppResponse>(
FILE: src/lib/question-group.ts
type RawQuestionGroupFrontmatter (line 6) | interface RawQuestionGroupFrontmatter {
type RawQuestionGroupFileType (line 35) | type RawQuestionGroupFileType =
type QuestionType (line 40) | type QuestionType = {
type QuestionGroupType (line 48) | type QuestionGroupType = RawQuestionGroupFileType & {
function getAllQuestionGroups (line 61) | async function getAllQuestionGroups(): Promise<QuestionGroupType[]> {
function getQuestionGroupById (line 162) | async function getQuestionGroupById(id: string) {
function getQuestionGroupsByIds (line 168) | async function getQuestionGroupsByIds(
FILE: src/lib/render-chat-message.tsx
type MessagePart (line 5) | type MessagePart = {
type MessagePartRendererProps (line 11) | type MessagePartRendererProps = {
type MessagePartRenderer (line 16) | type MessagePartRenderer = (
type MessagePartRendererOptions (line 20) | type MessagePartRendererOptions = {
function parseMessageParts (line 24) | async function parseMessageParts(
function renderMessage (line 152) | async function renderMessage(
FILE: src/lib/resource-progress.ts
type ResourceType (line 10) | type ResourceType = 'roadmap' | 'best-practice';
type ResourceProgressType (line 11) | type ResourceProgressType =
type TopicMeta (line 18) | type TopicMeta = {
function isTopicDone (line 24) | async function isTopicDone(topic: TopicMeta): Promise<boolean> {
function getTopicStatus (line 32) | async function getTopicStatus(
function updateResourceProgress (line 53) | async function updateResourceProgress(
function clearMigratedRoadmapProgress (line 102) | function clearMigratedRoadmapProgress(
function getResourceProgress (line 176) | async function getResourceProgress(
function topicSelectorAll (line 243) | function topicSelectorAll(
function renderTopicProgress (line 279) | function renderTopicProgress(
function clearResourceProgress (line 309) | function clearResourceProgress() {
function renderResourceProgress (line 322) | async function renderResourceProgress(
function getMatchingElements (line 355) | function getMatchingElements(
function refreshProgressCounters (line 368) | function refreshProgressCounters() {
FILE: src/lib/road-card.ts
function getRoadCard (line 1) | async function getRoadCard(
FILE: src/lib/roadmap.ts
type AllowedRoadmapRenderer (line 5) | type AllowedRoadmapRenderer = 'balsamiq' | 'editor';
type RoadmapFrontmatter (line 7) | interface RoadmapFrontmatter {
function getResourceMeta (line 67) | async function getResourceMeta(
FILE: src/lib/slugger.ts
function slugify (line 2) | function slugify(value: string): string {
FILE: src/lib/stream.ts
constant CHAT_RESPONSE_PREFIX (line 1) | const CHAT_RESPONSE_PREFIX = {
constant NEWLINE (line 6) | const NEWLINE = '\n'.charCodeAt(0);
function concatChunks (line 8) | function concatChunks(chunks: Uint8Array[], totalLength: number) {
type CompletionTextPart (line 21) | type CompletionTextPart = {
type CompletionDetailsPart (line 26) | type CompletionDetailsPart<D extends Record<string, unknown>> = {
type CompletionPart (line 31) | type CompletionPart<
function readDataStream (line 35) | async function readDataStream<D extends Record<string, unknown>>(
FILE: src/lib/video.ts
type VideoFrontmatter (line 5) | interface VideoFrontmatter {
type VideoFileType (line 23) | type VideoFileType = MarkdownFileType<VideoFrontmatter> & {
function videoPathToId (line 34) | function videoPathToId(filePath: string): string {
function getVideosByAuthor (line 40) | async function getVideosByAuthor(
function getAllVideos (line 52) | async function getAllVideos(): Promise<VideoFileType[]> {
function getVideoById (line 75) | async function getVideoById(id: string): Promise<VideoFileType> {
FILE: src/pages/best-practices/[bestPracticeId].json.ts
function getStaticPaths (line 5) | async function getStaticPaths() {
FILE: src/pages/card/[version]/[userId].ts
type Params (line 7) | type Params = {
FILE: src/pages/og/best-practice/[slug].ts
type Params (line 10) | type Params = {
FILE: src/pages/og/guide/[slug].ts
type Params (line 10) | type Params = {
FILE: src/pages/og/roadmap/[slug].ts
type Params (line 11) | type Params = {
FILE: src/pages/og/user/[username].ts
type Params (line 7) | type Params = {
FILE: src/pages/pages.json.ts
function GET (line 14) | async function GET() {
FILE: src/pages/v1-health.ts
function GET (line 5) | async function GET() {
FILE: src/pages/v1-stats.json.ts
function GET (line 5) | async function GET() {
FILE: src/queries/ai-course.ts
type AICourseProgressDocument (line 6) | interface AICourseProgressDocument {
type AICourseModule (line 15) | type AICourseModule = {
type GetAICourseParams (line 20) | type GetAICourseParams = {
type AICourseDocument (line 24) | interface AICourseDocument {
type GetAICourseResponse (line 39) | type GetAICourseResponse = AICourseDocument;
function getAiCourseOptions (line 41) | function getAiCourseOptions(params: GetAICourseParams) {
type GetAICourseLimitResponse (line 54) | type GetAICourseLimitResponse = {
function aiLimitOptions (line 75) | function aiLimitOptions() {
type ListUserAiCoursesQuery (line 87) | type ListUserAiCoursesQuery = {
type AICourseWithLessonCount (line 93) | type AICourseWithLessonCount = AICourseDocument & {
type ListUserAiCoursesResponse (line 97) | type ListUserAiCoursesResponse = {
function listUserAiCoursesOptions (line 105) | function listUserAiCoursesOptions(
type ListFeaturedAiCoursesParams (line 124) | type ListFeaturedAiCoursesParams = {};
type ListFeaturedAiCoursesQuery (line 126) | type ListFeaturedAiCoursesQuery = {
type ListFeaturedAiCoursesResponse (line 131) | type ListFeaturedAiCoursesResponse = {
function listFeaturedAiCoursesOptions (line 139) | function listFeaturedAiCoursesOptions(
type ListExploreAiCoursesParams (line 156) | type ListExploreAiCoursesParams = {};
type ListExploreAiCoursesQuery (line 158) | type ListExploreAiCoursesQuery = {
type ListExploreAiCoursesResponse (line 164) | type ListExploreAiCoursesResponse = {
function listExploreAiCoursesOptions (line 172) | function listExploreAiCoursesOptions(
FILE: src/queries/ai-guide.ts
type AIGuideDocument (line 10) | interface AIGuideDocument {
type GetAIGuideResponse (line 35) | type GetAIGuideResponse = AIGuideDocument;
function getAiGuideOptions (line 37) | function getAiGuideOptions(guideSlug?: string) {
type AIGuideSuggestionsResponse (line 54) | type AIGuideSuggestionsResponse = {
function aiGuideSuggestionsOptions (line 60) | function aiGuideSuggestionsOptions(guideSlug?: string) {
type ListUserAIGuidesQuery (line 73) | type ListUserAIGuidesQuery = {
type ListUserAIGuidesResponse (line 79) | type ListUserAIGuidesResponse = {
function listUserAIGuidesOptions (line 90) | function listUserAIGuidesOptions(
FILE: src/queries/ai-quiz.ts
type QuizDetails (line 10) | type QuizDetails = {
type GenerateAIQuizOptions (line 17) | type GenerateAIQuizOptions = {
function generateAIQuiz (line 34) | async function generateAIQuiz(options: GenerateAIQuizOptions) {
type QuizQuestion (line 136) | type QuizQuestion = {
function generateAiQuizQuestions (line 148) | function generateAiQuizQuestions(questionData: string): QuizQuestion[] {
type AIQuizDocument (line 240) | interface AIQuizDocument {
type GetAIQuizResponse (line 263) | type GetAIQuizResponse = AIQuizDocument & {
function aiQuizOptions (line 267) | function aiQuizOptions(quizSlug?: string) {
type ListUserAiQuizzesQuery (line 284) | type ListUserAiQuizzesQuery = {
type ListUserAiQuizzesResponse (line 290) | type ListUserAiQuizzesResponse = {
function listUserAiQuizzesOptions (line 298) | function listUserAiQuizzesOptions(
FILE: src/queries/ai-roadmap.ts
type AIRoadmapDocument (line 11) | interface AIRoadmapDocument {
type AIRoadmapResponse (line 29) | type AIRoadmapResponse = AIRoadmapDocument & {
function aiRoadmapOptions (line 33) | function aiRoadmapOptions(roadmapSlug?: string) {
type RoadmapDetails (line 59) | type RoadmapDetails = {
type GenerateAIRoadmapOptions (line 66) | type GenerateAIRoadmapOptions = {
function generateAIRoadmap (line 82) | async function generateAIRoadmap(options: GenerateAIRoadmapOptions) {
type ListUserAiRoadmapsQuery (line 188) | type ListUserAiRoadmapsQuery = {
type ListUserAiRoadmapsResponse (line 194) | type ListUserAiRoadmapsResponse = {
function listUserAiRoadmapsOptions (line 202) | function listUserAiRoadmapsOptions(
FILE: src/queries/billing.ts
type AllowedSubscriptionStatus (line 17) | type AllowedSubscriptionStatus =
constant USER_SUBSCRIPTION_PLAN_PRICES (line 20) | const USER_SUBSCRIPTION_PLAN_PRICES = [
type AllowedSubscriptionInterval (line 35) | type AllowedSubscriptionInterval =
type BillingDetailsResponse (line 38) | type BillingDetailsResponse = {
function billingDetailsOptions (line 47) | function billingDetailsOptions() {
function useIsPaidUser (line 57) | function useIsPaidUser() {
type CoursePriceParams (line 76) | type CoursePriceParams = {
type CoursePriceResponse (line 80) | type CoursePriceResponse = {
function coursePriceOptions (line 88) | function coursePriceOptions(params: CoursePriceParams) {
FILE: src/queries/changelog.ts
type ChangelogImage (line 3) | interface ChangelogImage {
type ChangelogDocument (line 8) | interface ChangelogDocument {
type ListChangelogQuery (line 18) | type ListChangelogQuery = {
function listChangelog (line 22) | async function listChangelog(query: ListChangelogQuery = {}) {
FILE: src/queries/chat-history.ts
type ChatHistoryMessage (line 18) | type ChatHistoryMessage = {
type ChatHistoryDocument (line 25) | interface ChatHistoryDocument {
function chatHistoryOptions (line 37) | function chatHistoryOptions(chatHistoryId?: string) {
type ListChatHistoryQuery (line 55) | type ListChatHistoryQuery = {
type ChatHistoryWithoutMessages (line 62) | type ChatHistoryWithoutMessages = Omit<ChatHistoryDocument, 'messages'>;
type ListChatHistoryResponse (line 64) | type ListChatHistoryResponse = {
function listChatHistoryOptions (line 72) | function listChatHistoryOptions(
FILE: src/queries/course-progress.ts
type CourseProgressDocument (line 5) | interface CourseProgressDocument {
type CourseProgressResponse (line 25) | type CourseProgressResponse = Pick<
function courseProgressOptions (line 30) | function courseProgressOptions(courseSlug: string) {
FILE: src/queries/official-guide.ts
type AllowedOfficialGuideStatus (line 4) | type AllowedOfficialGuideStatus =
type OfficialGuideDocument (line 7) | interface OfficialGuideDocument {
type ListOfficialGuidesQuery (line 33) | type ListOfficialGuidesQuery = {
function listOfficialGuides (line 38) | async function listOfficialGuides(query: ListOfficialGuidesQuery = {}) {
type OfficialAuthorDocument (line 60) | interface OfficialAuthorDocument {
type GuideWithAuthor (line 77) | type GuideWithAuthor = OfficialGuideDocument & {
type OfficialGuideResponse (line 85) | type OfficialGuideResponse = GuideWithAuthor;
function getOfficialGuide (line 87) | async function getOfficialGuide(slug: string, roadmapId?: string) {
function listOfficialAuthors (line 106) | async function listOfficialAuthors() {
function getOfficialGuideHref (line 122) | function getOfficialGuideHref(slug: string, roadmapId?: string) {
FILE: src/queries/official-project.ts
type AllowedOfficialProjectDifficulty (line 9) | type AllowedOfficialProjectDifficulty =
type AllowedOfficialProjectStatus (line 13) | type AllowedOfficialProjectStatus =
type OfficialProjectDocument (line 16) | interface OfficialProjectDocument {
function officialProjectDetails (line 44) | async function officialProjectDetails(projectSlug: string) {
type ListOfficialProjectsQuery (line 60) | type ListOfficialProjectsQuery = {
function listOfficialProjects (line 64) | async function listOfficialProjects(
function isNewProject (line 83) | function isNewProject(createdAt: Date) {
function getRoadmapsProjects (line 91) | async function getRoadmapsProjects(): Promise<
FILE: src/queries/official-roadmap-topic.ts
type AllowedOfficialRoadmapTopicResourceType (line 14) | type AllowedOfficialRoadmapTopicResourceType =
type OfficialRoadmapTopicResource (line 17) | type OfficialRoadmapTopicResource = {
type OfficialRoadmapTopicContentDocument (line 24) | interface OfficialRoadmapTopicContentDocument {
type GetOfficialRoadmapTopicOptions (line 34) | type GetOfficialRoadmapTopicOptions = {
type SyncToDatabaseTopicContent (line 39) | type SyncToDatabaseTopicContent = Omit<
function getOfficialRoadmapTopic (line 46) | async function getOfficialRoadmapTopic(
function prepareOfficialRoadmapTopicContent (line 66) | function prepareOfficialRoadmapTopicContent(
FILE: src/queries/official-roadmap.ts
type AllowedOfficialRoadmapType (line 6) | type AllowedOfficialRoadmapType =
type AllowedOfficialRoadmapQuestionType (line 10) | type AllowedOfficialRoadmapQuestionType =
type OfficialRoadmapQuestion (line 13) | type OfficialRoadmapQuestion = {
type OfficialRoadmapCourse (line 21) | type OfficialRoadmapCourse = {
type OfficialRoadmapDocument (line 34) | interface OfficialRoadmapDocument {
type OfficialRoadmapWithCourses (line 80) | type OfficialRoadmapWithCourses = Omit<
function officialRoadmapOptions (line 87) | function officialRoadmapOptions(slug: string) {
function officialRoadmapDetails (line 98) | async function officialRoadmapDetails(roadmapSlug: string) {
function listOfficialRoadmaps (line 114) | async function listOfficialRoadmaps() {
function listOfficialBeginnerRoadmaps (line 130) | async function listOfficialBeginnerRoadmaps() {
function isNewRoadmap (line 146) | function isNewRoadmap(createdAt: Date) {
FILE: src/queries/project.ts
type ProjectStatusResponse (line 5) | type ProjectStatusResponse = {
function projectStatusOptions (line 16) | function projectStatusOptions(projectId: string) {
FILE: src/queries/resource-progress.ts
type GetUserResourceProgressResponse (line 5) | type GetUserResourceProgressResponse = {
function userResourceProgressOptions (line 17) | function userResourceProgressOptions(
FILE: src/queries/roadmap-questions.ts
type RoadmapQuestionsResponse (line 4) | interface RoadmapQuestionsResponse {
function roadmapQuestionsOptions (line 8) | function roadmapQuestionsOptions(roadmapId: string) {
FILE: src/queries/roadmap-tree.ts
type RoadmapTreeDocument (line 4) | interface RoadmapTreeDocument {
function roadmapTreeMappingOptions (line 18) | function roadmapTreeMappingOptions(roadmapId: string) {
FILE: src/queries/roadmap.ts
type RoadmapJSON (line 6) | type RoadmapJSON = {
function roadmapJSONOptions (line 17) | function roadmapJSONOptions(roadmapId: string) {
type AllowedRoadmapRenderer (line 48) | type AllowedRoadmapRenderer = (typeof allowedRoadmapRenderer)[number];
type PagesJSON (line 50) | type PagesJSON = {
function listBuiltInRoadmaps (line 60) | function listBuiltInRoadmaps() {
function roadmapDetailsOptions (line 80) | function roadmapDetailsOptions(roadmapId: string) {
type AllowedLinkTypes (line 110) | type AllowedLinkTypes = (typeof allowedLinkTypes)[number];
function roadmapContentOptions (line 112) | function roadmapContentOptions(roadmapId: string) {
FILE: src/queries/user-ai-session.ts
type AIQuestionSuggestionsQuery (line 4) | type AIQuestionSuggestionsQuery = {
type AIQuestionSuggestionsResponse (line 10) | type AIQuestionSuggestionsResponse = {
function aiQuestionSuggestionsOptions (line 17) | function aiQuestionSuggestionsOptions(
FILE: src/queries/user-persona.ts
type UserPersonaDocument (line 5) | interface UserPersonaDocument {
type UserPersonaResponse (line 27) | type UserPersonaResponse = UserPersonaDocument['roadmaps'][number] | null;
function userRoadmapPersonaOptions (line 29) | function userRoadmapPersonaOptions(roadmapId: string) {
function userPersonaOptions (line 42) | function userPersonaOptions() {
FILE: src/queries/user-resume.ts
type UserResumeDocument (line 5) | interface UserResumeDocument {
function userResumeOptions (line 19) | function userResumeOptions() {
FILE: src/stores/streak.ts
type StreakResponse (line 3) | type StreakResponse = {
FILE: src/stores/subscription.ts
function showUpgradeModal (line 5) | function showUpgradeModal() {
function hideUpgradeModal (line 9) | function hideUpgradeModal() {
FILE: src/stores/toast.ts
type ToastType (line 3) | type ToastType = 'success' | 'error' | 'info' | 'warning' | 'loading';
type ToastMessage (line 4) | type ToastMessage = {
Copy disabled (too large)
Download .json
Condensed preview — 11470 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (24,095K chars).
[
{
"path": ".cursor/rules/content-migration.mdc",
"chars": 4668,
"preview": "---\ndescription: When user requests migrating old roadmap content to new folder from content-old to content folder\nglobs"
},
{
"path": ".cursor/rules/gh-cli.mdc",
"chars": 14130,
"preview": "---\ndescription: GitHub pull requests\nglobs: \nalwaysApply: false\n---\n# gh cli\n\nWork seamlessly with GitHub from the comm"
},
{
"path": ".github/FUNDING.yml",
"chars": 68,
"preview": "# These are supported funding model platforms\ngithub: kamranahmedse\n"
},
{
"path": ".github/ISSUE_TEMPLATE/01-suggest-changes.yml",
"chars": 763,
"preview": "name: \"✍️ Missing or Deprecated Roadmap Topics\"\ndescription: Help us improve the roadmaps by suggesting changes\nlabel"
},
{
"path": ".github/ISSUE_TEMPLATE/02-bug-report.yml",
"chars": 1075,
"preview": "name: \"🐛 Bug Report\"\ndescription: Report an issue or possible bug\nlabels: [bug]\nassignees: []\nbody:\n - type: input\n "
},
{
"path": ".github/ISSUE_TEMPLATE/03-feature-suggestion.yml",
"chars": 414,
"preview": "name: \"✨ Feature Suggestion\"\ndescription: Is there a feature you'd like to see on Roadmap.sh? Let us know!\nlabels: [f"
},
{
"path": ".github/ISSUE_TEMPLATE/04-roadmap-contribution.yml",
"chars": 883,
"preview": "name: \"🙏 Submit a Roadmap\"\ndescription: Help us launch a new roadmap with your expertise.\nlabels: [roadmap contributi"
},
{
"path": ".github/ISSUE_TEMPLATE/05-something-else.yml",
"chars": 372,
"preview": "name: \"🤷♂️ Something else\"\ndescription: If none of the above templates fit your needs, please use this template to s"
},
{
"path": ".github/ISSUE_TEMPLATE/config.yml",
"chars": 642,
"preview": "blank_issues_enabled: false\ncontact_links:\n - name: ✋ Roadmap Request\n url: https://roadmap.sh/discord\n about:"
},
{
"path": ".github/workflows/aws-costs.yml",
"chars": 664,
"preview": "name: Sends Daily AWS Costs to Slack\non:\n # Allow manual Run\n workflow_dispatch:\n # Run at 7:00 UTC every day\n sched"
},
{
"path": ".github/workflows/cleanup-orphaned-content.yml",
"chars": 2412,
"preview": "name: Cleanup Orphaned Content\n\non:\n workflow_dispatch:\n inputs:\n roadmap_slug:\n description: \"The ID of"
},
{
"path": ".github/workflows/close-feedback-pr.yml",
"chars": 1892,
"preview": "name: Close PRs with Feedback\non:\n workflow_dispatch:\n schedule:\n - cron: '0 0 * * *'\njobs:\n close-pr:\n runs-on"
},
{
"path": ".github/workflows/cloudfront-api-cache.yml",
"chars": 630,
"preview": "name: Clears API Cloudfront Cache\non:\n workflow_dispatch:\njobs:\n cloudfront_api_cache:\n runs-on: ubuntu-latest\n "
},
{
"path": ".github/workflows/cloudfront-fe-cache.yml",
"chars": 648,
"preview": "name: Clears Frontend Cloudfront Cache\non:\n workflow_dispatch:\njobs:\n cloudfront_fe_cache:\n runs-on: ubuntu-latest\n"
},
{
"path": ".github/workflows/deployment.yml",
"chars": 2481,
"preview": "name: Deploy to EC2\n\non:\n workflow_dispatch:\n\njobs:\n deploy:\n runs-on: ubuntu-latest\n steps:\n - name: Check"
},
{
"path": ".github/workflows/label-issue.yml",
"chars": 1336,
"preview": "name: Label Issue\n\non:\n issues:\n types: [ opened, edited ]\n \njobs:\n label-topic-change-issue:\n runs-on: ubuntu-"
},
{
"path": ".github/workflows/sync-content-to-repo.yml",
"chars": 2026,
"preview": "name: Sync Content to Repo\n\non:\n workflow_dispatch:\n inputs:\n roadmap_slug:\n description: \"The ID of the"
},
{
"path": ".github/workflows/sync-repo-to-database.yml",
"chars": 1526,
"preview": "name: Sync Repo to Database\n\non:\n workflow_dispatch:\n inputs:\n roadmap_slug:\n description: \"The slug of "
},
{
"path": ".github/workflows/upgrade-dependencies.yml",
"chars": 1349,
"preview": "name: Upgrade Dependencies\n\non:\n workflow_dispatch:\n schedule:\n - cron: '0 0 * * 0'\n\njobs:\n upgrade-deps:\n runs"
},
{
"path": ".gitignore",
"chars": 358,
"preview": ".idea\n.temp\n.astro\n\n# build output\ndist/\n.output/\n\n# dependencies\nnode_modules/\n\nscripts/developer-roadmap\n\n# logs\nnpm-d"
},
{
"path": ".npmrc",
"chars": 54,
"preview": "auto-install-peers=true\nstrict-peer-dependencies=false"
},
{
"path": ".prettierignore",
"chars": 63,
"preview": "app-dist\ndist\n.idea\n.github\npublic\nnode_modules\npnpm-lock.yaml\n"
},
{
"path": ".prettierrc.cjs",
"chars": 321,
"preview": "module.exports = {\n semi: true,\n singleQuote: true,\n overrides: [\n {\n files: '*.astro',\n options: {\n "
},
{
"path": ".vscode/extensions.json",
"chars": 87,
"preview": "{\n \"recommendations\": [\"astro-build.astro-vscode\"],\n \"unwantedRecommendations\": []\n}\n"
},
{
"path": ".vscode/launch.json",
"chars": 207,
"preview": "{\n \"version\": \"0.2.0\",\n \"configurations\": [\n {\n \"command\": \"./node_modules/.bin/astro dev\",\n \"name\": \"Dev"
},
{
"path": ".vscode/settings.json",
"chars": 539,
"preview": "{\n \"prettier.documentSelectors\": [\"**/*.astro\"],\n \"[astro]\": {\n \"editor.defaultFormatter\": \"esbenp.prettier-vscode\""
},
{
"path": "astro.config.mjs",
"chars": 2454,
"preview": "// https://astro.build/config\nimport sitemap from '@astrojs/sitemap';\nimport node from '@astrojs/node';\nimport { defineC"
},
{
"path": "code_of_conduct.md",
"chars": 3354,
"preview": "# Code of Conduct\n\n## Our Pledge\n\nIn the interest of fostering an open and welcoming environment, we as\ncontributors and"
},
{
"path": "contributing.md",
"chars": 6531,
"preview": "# ✨ Contribution Guidelines ✨\n\nFirst of all, thank you for considering to contribute. Please look at the details below:\n"
},
{
"path": "license",
"chars": 922,
"preview": "Everything including text and images in this project are protected by the copyright laws.\nYou are allowed to use this ma"
},
{
"path": "package.json",
"chars": 5163,
"preview": "{\n \"name\": \"roadmap.sh\",\n \"type\": \"module\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"scripts\": {\n \"dev\": \"astro "
},
{
"path": "packages/.gitkeep",
"chars": 0,
"preview": ""
},
{
"path": "playwright.config.ts",
"chars": 2723,
"preview": "import type { PlaywrightTestConfig } from '@playwright/test';\nimport { devices } from '@playwright/test';\n\n/**\n * Read e"
},
{
"path": "pnpm-workspace.yaml",
"chars": 25,
"preview": "packages:\n - packages/*\n"
},
{
"path": "public/manifest/manifest.json",
"chars": 615,
"preview": "{\n \"dir\": \"ltr\",\n \"lang\": \"en\",\n \"name\": \"Roadmap\",\n \"scope\": \"/\",\n \"display\": \"standalone\",\n \"start_url\": \"https:"
},
{
"path": "readme.md",
"chars": 8728,
"preview": "<p align=\"center\">\n <a href=\"https://roadmap.sh/\"><img src=\"public/img/brand.png\" height=\"128\"></a>\n <h2 align=\"center"
},
{
"path": "scripts/assign-label-types.cjs",
"chars": 4981,
"preview": "const fs = require('node:fs');\nconst path = require('node:path');\n\nconst allRoadmapDirs = fs.readdirSync(\n path.join(__"
},
{
"path": "scripts/best-practice-content.cjs",
"chars": 5111,
"preview": "const fs = require('fs');\nconst path = require('path');\n\nconst OPEN_AI_API_KEY = process.env.OPEN_AI_API_KEY;\nconst ALL_"
},
{
"path": "scripts/best-practice-dirs.cjs",
"chars": 4594,
"preview": "const fs = require('fs');\nconst path = require('path');\n\nconst CONTENT_DIR = path.join(__dirname, '../content');\n// Dire"
},
{
"path": "scripts/cleanup-orphaned-content.ts",
"chars": 7294,
"preview": "import type { Node } from '@roadmapsh/editor';\nimport matter from 'gray-matter';\nimport fs from 'node:fs/promises';\nimpo"
},
{
"path": "scripts/close-issues.sh",
"chars": 1526,
"preview": "#!/usr/bin/env bash\n\n# Fetch issues JSON data and parse it properly\nissues=$(gh issue list --repo kamranahmedse/develope"
},
{
"path": "scripts/compress-images.ts",
"chars": 4128,
"preview": "import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport sharp "
},
{
"path": "scripts/compressed-images.json",
"chars": 8843,
"preview": "[\n \"public/authors/dmytrobol.png\",\n \"public/authors/ebrahimbharmal007.png\",\n \"public/authors/jesse.png\",\n \"public/au"
},
{
"path": "scripts/create-roadmap-labels.sh",
"chars": 346,
"preview": "#!/usr/bin/env bash\n\n# get all the folder names inside src/data/roadmaps\nroadmap_ids=$(ls src/data/roadmaps)\n\n# create a"
},
{
"path": "scripts/editor-roadmap-assets.ts",
"chars": 1718,
"preview": "import playwright from 'playwright';\n\n// Usage: tsx ./scripts/editor-roadmap-dirs.ts <roadmapId>\n\nconst roadmapId = proc"
},
{
"path": "scripts/editor-roadmap-content-json.ts",
"chars": 5679,
"preview": "import type { Node } from '@roadmapsh/editor';\nimport matter from 'gray-matter';\nimport { HTMLElement, parse } from 'nod"
},
{
"path": "scripts/editor-roadmap-content.ts",
"chars": 6225,
"preview": "import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport type {"
},
{
"path": "scripts/editor-roadmap-dirs.ts",
"chars": 3044,
"preview": "import type { Node } from '@roadmapsh/editor';\nimport matter from 'gray-matter';\nimport fs from 'node:fs/promises';\nimpo"
},
{
"path": "scripts/extract-guide-images.cjs",
"chars": 1303,
"preview": "// get all the base64 encoded images and save them to a file from the given markdown file\n\nconst fs = require('fs');\ncon"
},
{
"path": "scripts/gemini-roadmap-content.ts",
"chars": 6046,
"preview": "import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport type {"
},
{
"path": "scripts/generate-og-images.mjs",
"chars": 19696,
"preview": "import path from 'node:path';\nimport fs from 'node:fs/promises';\nimport matter from 'gray-matter';\nimport { html } from "
},
{
"path": "scripts/generate-renderer.sh",
"chars": 543,
"preview": "#!/usr/bin/env bash\n\nset -e\n\n# Remove old editor\nrm -rf editor\n\nif [ ! -d \".temp/web-draw\" ]; then\n git clone ssh://git"
},
{
"path": "scripts/label-issues.sh",
"chars": 1619,
"preview": "#!/usr/bin/env bash\n\n# Fetch issues JSON data and parse it properly\nissues=$(gh issue list --repo kamranahmedse/develope"
},
{
"path": "scripts/migrate-content-repo-to-database.ts",
"chars": 7412,
"preview": "import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport type {"
},
{
"path": "scripts/migrate-editor-roadmap.ts",
"chars": 2184,
"preview": "import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport type {"
},
{
"path": "scripts/official-roadmap-assets.ts",
"chars": 2000,
"preview": "import playwright from 'playwright';\nimport type { OfficialRoadmapDocument } from '../src/queries/official-roadmap';\n\nas"
},
{
"path": "scripts/page-data-agg.cjs",
"chars": 3382,
"preview": "const csv = require('csv-parser');\nconst fs = require('fs');\nconst path = require('path');\n\nconst csvFilePath = path.joi"
},
{
"path": "scripts/readme.md",
"chars": 2183,
"preview": "## CLI Tools\n\n> A bunch of CLI scripts to make the development easier\n\n## `roadmap-links.cjs`\n\nGenerates a list of all t"
},
{
"path": "scripts/refresh-assets.ts",
"chars": 1271,
"preview": "#!/usr/bin/env tsx\n\nimport { execSync } from 'child_process';\nimport * as fs from 'fs';\nimport * as path from 'path';\n\nc"
},
{
"path": "scripts/rename-content.ts",
"chars": 1741,
"preview": "import fs from 'fs';\nimport path from 'path';\n\nconst roadmapDirs = fs.readdirSync(\n path.join(__dirname, '..', 'src', '"
},
{
"path": "scripts/roadmap-content.cjs",
"chars": 5196,
"preview": "const fs = require('fs');\nconst path = require('path');\n\nconst OPEN_AI_API_KEY = process.env.OPEN_AI_API_KEY;\nconst ALL_"
},
{
"path": "scripts/roadmap-dirs.cjs",
"chars": 5220,
"preview": "const fs = require('fs');\nconst path = require('path');\n\nconst CONTENT_DIR = path.join(__dirname, '../content');\n// Dire"
},
{
"path": "scripts/roadmap-links.cjs",
"chars": 1040,
"preview": "const fs = require('fs');\nconst path = require('path');\n\nconst roadmapId = process.argv[2];\nif (!roadmapId) {\n console."
},
{
"path": "scripts/roadmap-tree-content.js",
"chars": 16029,
"preview": "import OpenAI from 'openai';\nimport path from 'path';\nimport fs from 'fs';\nimport { fileURLToPath } from 'url';\nimport {"
},
{
"path": "scripts/sync-content-to-repo.ts",
"chars": 3245,
"preview": "import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { slug"
},
{
"path": "scripts/sync-repo-to-database.ts",
"chars": 7263,
"preview": "import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport type {"
},
{
"path": "scripts/sync-roadmap-to-database.ts",
"chars": 2293,
"preview": "import { execSync } from 'node:child_process';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { fileURLT"
},
{
"path": "scripts/update-sponsors.cjs",
"chars": 4498,
"preview": "const path = require('path');\nconst fs = require('fs');\nconst yaml = require('js-yaml');\n\nconst apiKey = process.env.SPO"
},
{
"path": "scripts/warm-urls.sh",
"chars": 1158,
"preview": "#!/usr/bin/env bash\n\n# Usage: warm-urls.sh <sitemap-url>\n# Example: warm-urls.sh https://www.example.com/sitemap.xml\n\n# "
},
{
"path": "sitemap.mjs",
"chars": 1568,
"preview": "import path from 'node:path';\nimport fs from 'node:fs/promises';\n\nasync function getRoadmapIds() {\n return fs.readdir(p"
},
{
"path": "src/api/ai-roadmap.ts",
"chars": 731,
"preview": "import { type APIContext } from 'astro';\nimport { api } from './api.ts';\n\nexport type GetAIRoadmapBySlugResponse = {\n i"
},
{
"path": "src/api/api.ts",
"chars": 4084,
"preview": "import { TOKEN_COOKIE_NAME } from '../lib/jwt.ts';\nimport type { APIContext } from 'astro';\n\ntype HttpOptionsType = Requ"
},
{
"path": "src/api/leaderboard.ts",
"chars": 896,
"preview": "import { type APIContext } from 'astro';\nimport { api } from './api.ts';\n\nexport type LeaderboardUserDetails = {\n id: s"
},
{
"path": "src/api/project.ts",
"chars": 397,
"preview": "import { type APIContext } from 'astro';\nimport { api } from './api.ts';\n\nexport function projectApi(context: APIContext"
},
{
"path": "src/api/roadmap.ts",
"chars": 1758,
"preview": "import { type APIContext } from 'astro';\nimport { api } from './api.ts';\nimport type { RoadmapDocument } from '../compon"
},
{
"path": "src/api/user.ts",
"chars": 3809,
"preview": "import { type APIContext } from 'astro';\nimport { api } from './api.ts';\nimport type { ResourceType } from '../lib/resou"
},
{
"path": "src/components/AIChat/AIChat.css",
"chars": 3999,
"preview": ".ai-chat .prose ul li > code,\n.ai-chat .prose ol li > code,\n.ai-chat p code,\n.ai-chat a > code,\n.ai-chat strong > code,\n"
},
{
"path": "src/components/AIChat/AIChat.tsx",
"chars": 16611,
"preview": "import './AIChat.css';\nimport {\n ArrowDownIcon,\n FileUpIcon,\n LockIcon,\n PersonStandingIcon,\n SendIcon,\n TrashIcon"
},
{
"path": "src/components/AIChat/AIChatCouse.tsx",
"chars": 1489,
"preview": "import { Book } from 'lucide-react';\n\ntype AIChatCourseType = {\n keyword: string;\n difficulty: string;\n};\n\nfunction pa"
},
{
"path": "src/components/AIChat/ChatHistory.tsx",
"chars": 4359,
"preview": "import { Fragment, memo } from 'react';\nimport { cn } from '../../lib/classname';\nimport {\n CopyIcon,\n CheckIcon,\n Tr"
},
{
"path": "src/components/AIChat/PersonalizedResponseForm.tsx",
"chars": 8322,
"preview": "import { Loader2Icon } from 'lucide-react';\nimport { MessageCircle } from 'lucide-react';\nimport { memo, useId, useRef, "
},
{
"path": "src/components/AIChat/QuickActionButton.tsx",
"chars": 965,
"preview": "import { Loader2Icon, type LucideIcon } from 'lucide-react';\nimport { cn } from '../../lib/classname';\n\ntype QuickAction"
},
{
"path": "src/components/AIChat/QuickHelpPrompts.tsx",
"chars": 2661,
"preview": "import { useState } from 'react';\nimport { cn } from '../../lib/classname';\n\ntype QuickHelpPromptsProps = {\n onQuestion"
},
{
"path": "src/components/AIChat/UploadResumeModal.tsx",
"chars": 7419,
"preview": "import { useCallback, useState, type FormEvent } from 'react';\nimport { Modal } from '../Modal';\nimport {\n useDropzone,"
},
{
"path": "src/components/AIChatHistory/AIChatHistory.tsx",
"chars": 5196,
"preview": "import { useQuery } from '@tanstack/react-query';\nimport { queryClient } from '../../stores/query-client';\nimport { chat"
},
{
"path": "src/components/AIChatHistory/AIChatLayout.tsx",
"chars": 610,
"preview": "import { AITutorLayout } from '../AITutor/AITutorLayout';\nimport { CheckSubscriptionVerification } from '../Billing/Chec"
},
{
"path": "src/components/AIChatHistory/ChatHistoryAction.tsx",
"chars": 3829,
"preview": "import { EllipsisVerticalIcon, Loader2Icon, Trash2Icon } from 'lucide-react';\nimport {\n DropdownMenu,\n DropdownMenuCon"
},
{
"path": "src/components/AIChatHistory/ChatHistoryError.tsx",
"chars": 710,
"preview": "import { AlertCircleIcon } from 'lucide-react';\nimport { cn } from '../../lib/classname';\n\ntype ChatHistoryErrorProps = "
},
{
"path": "src/components/AIChatHistory/ChatHistoryGroup.tsx",
"chars": 1088,
"preview": "import type { ChatHistoryWithoutMessages } from '../../queries/chat-history';\nimport { ChatHistoryItem } from './ChatHis"
},
{
"path": "src/components/AIChatHistory/ChatHistoryItem.tsx",
"chars": 1068,
"preview": "import { cn } from '../../lib/classname';\nimport type { ChatHistoryDocument } from '../../queries/chat-history';\nimport "
},
{
"path": "src/components/AIChatHistory/ListChatHistory.tsx",
"chars": 9077,
"preview": "import { useInfiniteQuery } from '@tanstack/react-query';\nimport { listChatHistoryOptions } from '../../queries/chat-his"
},
{
"path": "src/components/AIChatHistory/ListChatHistorySkeleton.tsx",
"chars": 1155,
"preview": "export function ListChatHistorySkeleton() {\n return (\n <>\n <div>\n <div className=\"mb-4 flex items-center"
},
{
"path": "src/components/AIChatHistory/SearchAIChatHistory.tsx",
"chars": 1984,
"preview": "import { useEffect, useState } from 'react';\nimport { useDebounceValue } from '../../hooks/use-debounce';\nimport { Loade"
},
{
"path": "src/components/AIGuide/AIGuideActions.tsx",
"chars": 3828,
"preview": "import { ArrowUpRightIcon, MoreVertical, Play, Trash2 } from 'lucide-react';\nimport { useRef, useState } from 'react';\ni"
},
{
"path": "src/components/AIGuide/AIGuideCard.tsx",
"chars": 1554,
"preview": "import type { ListUserAIGuidesResponse } from '../../queries/ai-guide';\nimport { AIGuideActions } from './AIGuideActions"
},
{
"path": "src/components/AIGuide/AILibraryLayout.tsx",
"chars": 1113,
"preview": "import { useState } from 'react';\nimport { AITutorHeader } from '../AITutor/AITutorHeader';\nimport { AITutorLayout } fro"
},
{
"path": "src/components/AIQuiz/AIMCQQuestion.tsx",
"chars": 9844,
"preview": "import type { QuizQuestion } from '../../queries/ai-quiz';\nimport { cn } from '../../lib/classname';\nimport {\n CheckIco"
},
{
"path": "src/components/AIQuiz/AIOpenEndedQuestion.tsx",
"chars": 4359,
"preview": "import { type QuizQuestion } from '../../queries/ai-quiz';\nimport { cn } from '../../lib/classname';\nimport { Loader2Ico"
},
{
"path": "src/components/AIQuiz/AIQuiz.tsx",
"chars": 2832,
"preview": "import { useQuery } from '@tanstack/react-query';\nimport { useState } from 'react';\nimport { queryClient } from '../../s"
},
{
"path": "src/components/AIQuiz/AIQuizActions.tsx",
"chars": 3782,
"preview": "import { MoreVertical, Play, Trash2 } from 'lucide-react';\nimport { useRef, useState } from 'react';\nimport { useOutside"
},
{
"path": "src/components/AIQuiz/AIQuizCard.tsx",
"chars": 1963,
"preview": "import { CalendarIcon, ClipboardCheck } from 'lucide-react';\nimport { cn } from '../../lib/classname';\nimport { getRelat"
},
{
"path": "src/components/AIQuiz/AIQuizContent.tsx",
"chars": 10469,
"preview": "import { useState } from 'react';\nimport type { QuizQuestion } from '../../queries/ai-quiz';\nimport { AIMCQQuestion } fr"
},
{
"path": "src/components/AIQuiz/AIQuizGenerator.tsx",
"chars": 8800,
"preview": "import {\n FileTextIcon,\n ListIcon,\n ListTodoIcon,\n SparklesIcon,\n type LucideIcon,\n} from 'lucide-react';\nimport { "
},
{
"path": "src/components/AIQuiz/AIQuizLayout.tsx",
"chars": 462,
"preview": "import { AITutorLayout } from '../AITutor/AITutorLayout';\n\ntype AIQuizLayoutProps = {\n children: React.ReactNode;\n};\n\ne"
},
{
"path": "src/components/AIQuiz/AIQuizResultStrip.tsx",
"chars": 3251,
"preview": "import { cn } from '../../lib/classname';\nimport {\n ArrowRightIcon,\n CheckIcon,\n CircleAlertIcon,\n Minus, XIcon\n} fr"
},
{
"path": "src/components/AIQuiz/AIQuizResults.tsx",
"chars": 13793,
"preview": "import {\n RotateCcw,\n BarChart3,\n Zap,\n Check,\n X,\n Minus,\n BookOpenIcon,\n FileTextIcon,\n} from 'lucide-react';\n"
},
{
"path": "src/components/AIQuiz/CircularProgress.tsx",
"chars": 1956,
"preview": "import { cn } from '../../lib/classname';\n\ntype CircularProgressProps = {\n accuracy: number;\n color: 'emerald' | 'gree"
},
{
"path": "src/components/AIQuiz/GenerateAIQuiz.tsx",
"chars": 4841,
"preview": "import { useEffect, useRef, useState } from 'react';\nimport { getUrlParams } from '../../lib/browser';\nimport { isLogged"
},
{
"path": "src/components/AIQuiz/QuizTopNavigation.tsx",
"chars": 3171,
"preview": "import {\n ChevronLeftIcon,\n ChevronRightIcon,\n Loader2Icon,\n type LucideIcon,\n} from 'lucide-react';\nimport { cn } f"
},
{
"path": "src/components/AIQuiz/UserQuizzesList.tsx",
"chars": 5182,
"preview": "import { useQuery } from '@tanstack/react-query';\nimport { BookOpen, Loader2 } from 'lucide-react';\nimport { useEffect, "
},
{
"path": "src/components/AIRoadmap/AIRoadmap.css",
"chars": 1055,
"preview": "@font-face {\n font-family: 'balsamiq';\n src: url('/fonts/balsamiq.woff2');\n}\n\nsvg text tspan {\n -webkit-font-smoothin"
},
{
"path": "src/components/AIRoadmap/AIRoadmap.tsx",
"chars": 5195,
"preview": "import './AIRoadmap.css';\n\nimport { useQuery } from '@tanstack/react-query';\nimport { useCallback, useRef, useState } fr"
},
{
"path": "src/components/AIRoadmap/AIRoadmapActions.tsx",
"chars": 3830,
"preview": "import { MoreVertical, Play, Trash2 } from 'lucide-react';\nimport { useRef, useState } from 'react';\nimport { useOutside"
},
{
"path": "src/components/AIRoadmap/AIRoadmapCard.tsx",
"chars": 1709,
"preview": "import { CalendarIcon } from 'lucide-react';\nimport { getRelativeTimeString } from '../../lib/date';\nimport { cn } from "
},
{
"path": "src/components/AIRoadmap/AIRoadmapChat.tsx",
"chars": 11954,
"preview": "import {\n useCallback,\n useEffect,\n useImperativeHandle,\n useLayoutEffect,\n useRef,\n useState,\n type RefObject,\n}"
},
{
"path": "src/components/AIRoadmap/AIRoadmapContent.tsx",
"chars": 3095,
"preview": "import { cn } from '../../lib/classname';\nimport { AIRoadmapRegenerate } from './AIRoadmapRegenerate';\nimport { LoadingC"
},
{
"path": "src/components/AIRoadmap/AIRoadmapRegenerate.tsx",
"chars": 8724,
"preview": "import {\n Loader2Icon,\n PenSquare,\n RefreshCcw,\n SaveIcon,\n SettingsIcon,\n type LucideIcon,\n} from 'lucide-react';"
},
{
"path": "src/components/AIRoadmap/GenerateAIRoadmap.tsx",
"chars": 4468,
"preview": "import { useEffect, useRef, useState } from 'react';\nimport { getUrlParams } from '../../lib/browser';\nimport { isLogged"
},
{
"path": "src/components/AIRoadmap/UserRoadmapsList.tsx",
"chars": 5305,
"preview": "import { useQuery } from '@tanstack/react-query';\nimport { BookOpen, Loader2 } from 'lucide-react';\nimport { useEffect, "
},
{
"path": "src/components/AITutor/AIExploreCourseListing.tsx",
"chars": 5008,
"preview": "import { useQuery } from '@tanstack/react-query';\nimport { useEffect, useState } from 'react';\nimport { AICourseCard } f"
},
{
"path": "src/components/AITutor/AIFeaturedCoursesListing.tsx",
"chars": 4159,
"preview": "import { useQuery } from '@tanstack/react-query';\nimport {\n listFeaturedAiCoursesOptions,\n type ListUserAiCoursesQuery"
},
{
"path": "src/components/AITutor/AILoadingState.tsx",
"chars": 860,
"preview": "import { Loader2 } from 'lucide-react';\n\ntype AILoadingStateProps = {\n title: string;\n subtitle?: string;\n};\n\nexport f"
},
{
"path": "src/components/AITutor/AITutorHeader.tsx",
"chars": 1533,
"preview": "import { useQuery } from '@tanstack/react-query';\nimport { aiLimitOptions } from '../../queries/ai-course';\nimport { que"
},
{
"path": "src/components/AITutor/AITutorLayout.tsx",
"chars": 1676,
"preview": "import { Menu } from 'lucide-react';\nimport { useState } from 'react';\nimport { AITutorSidebar, type AITutorTab } from '"
},
{
"path": "src/components/AITutor/AITutorLimits.tsx",
"chars": 1209,
"preview": "import { Gift } from 'lucide-react';\nimport { cn } from '../../lib/classname';\n\ntype AITutorLimitsProps = {\n used: numb"
},
{
"path": "src/components/AITutor/AITutorSidebar.tsx",
"chars": 8479,
"preview": "import { useQuery } from '@tanstack/react-query';\nimport {\n BookOpen,\n ChevronDown,\n ChevronRight,\n Compass,\n FileT"
},
{
"path": "src/components/AITutor/AITutorSidebarProps.tsx",
"chars": 406,
"preview": "import { Zap } from 'lucide-react';\n\n<li>\n <div className=\"mx-4 mt-4 rounded-lg bg-amber-50 p-3\">\n <div className=\"f"
},
{
"path": "src/components/AITutor/AITutorTallMessage.tsx",
"chars": 974,
"preview": "import { type LucideIcon } from 'lucide-react';\n\ntype AITutorTallMessageProps = {\n title: string;\n subtitle?: string;\n"
},
{
"path": "src/components/AITutor/BaseDropdown.tsx",
"chars": 2359,
"preview": "import { ChevronDown } from 'lucide-react';\nimport { useState, useRef, useEffect } from 'react';\nimport { cn } from '../"
},
{
"path": "src/components/AITutor/DifficultyDropdown.tsx",
"chars": 480,
"preview": "import { BaseDropdown } from './BaseDropdown';\nimport {\n difficultyLevels,\n type DifficultyLevel,\n} from '../Gener"
},
{
"path": "src/components/AITutor/LoginToView.tsx",
"chars": 1253,
"preview": "import { LockIcon } from 'lucide-react';\n\nimport { showLoginPopup } from '../../lib/popup';\nimport { cn } from '../../li"
},
{
"path": "src/components/AITutor/NatureDropdown.tsx",
"chars": 629,
"preview": "import { BaseDropdown } from './BaseDropdown';\nimport { BookOpen, FileText } from 'lucide-react';\n\nexport const natureTy"
},
{
"path": "src/components/AITutor/UpgradeSidebarCard.tsx",
"chars": 2186,
"preview": "import { useQuery } from '@tanstack/react-query';\nimport { Zap } from 'lucide-react';\nimport { queryClient } from '../.."
},
{
"path": "src/components/AITutor/UserDropdown.tsx",
"chars": 4313,
"preview": "import {\n ChevronDown,\n CreditCardIcon,\n LogInIcon,\n LogOutIcon,\n Settings,\n User2,\n} from 'lucide-react';\nimport "
},
{
"path": "src/components/AIUsageWarning/AIUsageWarning.tsx",
"chars": 1347,
"preview": "import { isLoggedIn } from '../../lib/jwt';\n\ntype AIUsageWarningProps = {\n type: 'course' | 'guide' | 'roadmap' | 'quiz"
},
{
"path": "src/components/AccountSidebar/AccountSidebarUpgrade.tsx",
"chars": 1110,
"preview": "import { useIsMounted } from '../../hooks/use-is-mounted';\nimport { isLoggedIn } from '../../lib/jwt';\nimport { useIsPai"
},
{
"path": "src/components/AccountSidebar.astro",
"chars": 6088,
"preview": "---\nimport AstroIcon from './AstroIcon.astro';\nimport { TeamDropdown } from './TeamDropdown/TeamDropdown';\nimport { Side"
},
{
"path": "src/components/AccountStreak/AccountStreak.tsx",
"chars": 6550,
"preview": "import { useEffect, useRef, useState } from 'react';\nimport { isLoggedIn } from '../../lib/jwt';\nimport { httpGet } from"
},
{
"path": "src/components/AccountStreak/AccountStreakHeatmap.css",
"chars": 152,
"preview": ".react-calendar-heatmap text {\n fill: rgb(148, 163, 184) !important;\n}\n\n.react-calendar-heatmap rect:hover {\n stroke: "
},
{
"path": "src/components/AccountStreak/InviteFriends.tsx",
"chars": 2959,
"preview": "import { Copy, Heart } from 'lucide-react';\nimport { useAuth } from '../../hooks/use-auth';\nimport { useCopyText } from "
},
{
"path": "src/components/AccountStreak/StreakDay.tsx",
"chars": 1440,
"preview": "import type { ReactNode } from 'react';\nimport { cn } from '../../lib/classname';\nimport { ChevronDown } from 'lucide-re"
},
{
"path": "src/components/AccountTerms.tsx",
"chars": 579,
"preview": "export function AccountTerms() {\n return (\n <div className=\"mt-3 text-left text-xs leading-normal text-gray-500\">\n "
},
{
"path": "src/components/Activity/ActivityStream.tsx",
"chars": 6454,
"preview": "import { useState } from 'react';\nimport { getRelativeTimeString } from '../../lib/date';\nimport type { ResourceType } f"
},
{
"path": "src/components/Activity/ActivityTopicTitles.tsx",
"chars": 1200,
"preview": "import { useState } from 'react';\nimport { cn } from '../../lib/classname';\n\ntype ActivityTopicTitlesProps = {\n topicTi"
},
{
"path": "src/components/Activity/ActivityTopicsModal.tsx",
"chars": 2731,
"preview": "import { useEffect, useState } from 'react';\nimport type { ResourceType } from '../../lib/resource-progress';\nimport typ"
},
{
"path": "src/components/Activity/EmptyStream.tsx",
"chars": 525,
"preview": "import { List } from 'lucide-react';\n\nexport function EmptyStream() {\n return (\n <div className=\"rounded-md\">\n "
},
{
"path": "src/components/Activity/ProjectProgress.tsx",
"chars": 1778,
"preview": "import { getUser } from '../../lib/jwt';\nimport { ProjectProgressActions } from './ProjectProgressActions';\nimport { cn "
},
{
"path": "src/components/Activity/ProjectProgressActions.tsx",
"chars": 2182,
"preview": "import { MoreVertical, X } from 'lucide-react';\nimport { useRef, useState } from 'react';\nimport { useOutsideClick } fro"
},
{
"path": "src/components/Activity/ProjectStatus.tsx",
"chars": 709,
"preview": "import { CircleDashed } from 'lucide-react';\nimport type { ProjectStatusDocument } from '../Projects/ListProjectSolution"
},
{
"path": "src/components/Activity/ResourceProgress.tsx",
"chars": 2699,
"preview": "import { getUser } from '../../lib/jwt';\nimport { ResourceProgressActions } from './ResourceProgressActions';\nimport { c"
},
{
"path": "src/components/Activity/ResourceProgressActions.tsx",
"chars": 4164,
"preview": "import { MoreVertical, X } from 'lucide-react';\nimport { useRef, useState } from 'react';\nimport { useOutsideClick } fro"
},
{
"path": "src/components/AddTeamRoadmap.tsx",
"chars": 5945,
"preview": "import { useRef, useState } from 'react';\nimport { useOutsideClick } from '../hooks/use-outside-click';\nimport { type Op"
},
{
"path": "src/components/AdvertiseForm.tsx",
"chars": 6491,
"preview": "import React, { useState } from 'react';\nimport { CheckIcon } from './ReactIcons/CheckIcon.tsx';\nimport { pageProgressMe"
},
{
"path": "src/components/Analytics/Analytics.astro",
"chars": 342,
"preview": "---\n---\n\n<script src='./analytics.ts'></script>\n<script async src=\"https://www.googletagmanager.com/gtag/js?id=G-EZHDT2S"
},
{
"path": "src/components/Analytics/Bluconic.astro",
"chars": 70,
"preview": "<script async defer src='https://b174.roadmap.sh/script.js'></script>\n"
},
{
"path": "src/components/Analytics/Clarity.astro",
"chars": 417,
"preview": "<script type='text/javascript' is:inline>\n (function (c, l, a, r, i, t, y) {\n c[a] =\n c[a] ||\n function ()"
},
{
"path": "src/components/Analytics/GoogleAd.astro",
"chars": 3554,
"preview": "<script async src='https://securepubads.g.doubleclick.net/tag/js/gpt.js'\n></script>\n<script async>\n const ignoredPages "
},
{
"path": "src/components/Analytics/GoogleAdSlot.astro",
"chars": 1524,
"preview": "<div\n id='div-gpt-ad-1742391132948-0'\n class='gam-slot fixed bottom-4 right-4 z-50 h-[160px] w-[350px] cursor-pointer "
},
{
"path": "src/components/Analytics/Hubspot.astro",
"chars": 146,
"preview": "<script\n type='text/javascript'\n id='hs-script-loader'\n async\n defer\n src='//js.hs-scripts.com/46095657.js?business"
},
{
"path": "src/components/Analytics/LinkedIn.astro",
"chars": 835,
"preview": "---\n// LinkedIn Analytics component\n---\n\n<script type=\"text/javascript\">\n _linkedin_partner_id = \"8596409\";\n window._l"
},
{
"path": "src/components/Analytics/OneTrust.astro",
"chars": 379,
"preview": "<!-- OneTrust Cookies Consent Notice start for roadmap.sh -->\n<script\n src='https://cdn.cookielaw.org/scripttemplates/o"
},
{
"path": "src/components/Analytics/RedditPixel.astro",
"chars": 563,
"preview": "<script is:inline>\n // @ts-nocheck\n !(function (w, d) {\n if (!w.rdt) {\n var p = (w.rdt = function () {\n "
},
{
"path": "src/components/Analytics/analytics.ts",
"chars": 2738,
"preview": "import { httpPost } from '../../lib/query-http';\nimport { getPageTrackingData } from '../../lib/browser';\n\ndeclare globa"
},
{
"path": "src/components/AppChecklist.tsx",
"chars": 469,
"preview": "import { PartyPopper } from 'lucide-react';\n\nexport function AppChecklist() {\n return (\n <div className=\"fixed botto"
},
{
"path": "src/components/AstroIcon.astro",
"chars": 813,
"preview": "---\nimport { parse } from 'node-html-parser';\n\nexport interface Props {\n icon: string;\n class?: string;\n}\n\nasync funct"
},
{
"path": "src/components/AuthenticationFlow/AuthenticationForm.tsx",
"chars": 1303,
"preview": "import { useState } from 'react';\nimport { GitHubButton } from './GitHubButton';\nimport { GoogleButton } from './GoogleB"
},
{
"path": "src/components/AuthenticationFlow/CourseLoginPopup.tsx",
"chars": 4635,
"preview": "import { useEffect, useState } from 'react';\nimport { Modal } from '../Modal';\nimport { GitHubButton } from './GitHubBut"
},
{
"path": "src/components/AuthenticationFlow/Divider.astro",
"chars": 179,
"preview": "<div class='flex w-full items-center gap-2 py-6 text-sm text-slate-600'>\n <div class='h-px w-full bg-slate-200'></div>\n"
},
{
"path": "src/components/AuthenticationFlow/EmailLoginForm.tsx",
"chars": 3865,
"preview": "import type { FormEvent } from 'react';\nimport { useId, useState } from 'react';\nimport { httpPost } from '../../lib/htt"
},
{
"path": "src/components/AuthenticationFlow/EmailSignupForm.tsx",
"chars": 3834,
"preview": "import { type FormEvent, useEffect, useState } from 'react';\nimport { httpPost } from '../../lib/http';\nimport {\n delet"
},
{
"path": "src/components/AuthenticationFlow/ForgotPasswordForm.tsx",
"chars": 1958,
"preview": "import { type FormEvent, useState } from 'react';\nimport { httpPost } from '../../lib/http';\n\nexport function ForgotPass"
},
{
"path": "src/components/AuthenticationFlow/GitHubButton.tsx",
"chars": 5571,
"preview": "import { useEffect, useState } from 'react';\nimport { GitHubIcon } from '../ReactIcons/GitHubIcon.tsx';\nimport {\n FIRST"
},
{
"path": "src/components/AuthenticationFlow/GoogleButton.tsx",
"chars": 5756,
"preview": "import { useEffect, useState } from 'react';\nimport { FIRST_LOGIN_PARAM, setAuthToken } from '../../lib/jwt';\nimport { h"
},
{
"path": "src/components/AuthenticationFlow/LinkedInButton.tsx",
"chars": 5824,
"preview": "import { useEffect, useState } from 'react';\nimport {\n FIRST_LOGIN_PARAM,\n COURSE_PURCHASE_PARAM,\n setAuthToken,\n} fr"
},
{
"path": "src/components/AuthenticationFlow/LoginPopup.astro",
"chars": 794,
"preview": "---\nimport Popup from '../Popup/Popup.astro';\nimport { AccountTerms } from '../AccountTerms';\nimport { AuthenticationFor"
},
{
"path": "src/components/AuthenticationFlow/ResetPasswordForm.tsx",
"chars": 3073,
"preview": "import { type FormEvent, useEffect, useState } from 'react';\nimport { httpPost } from '../../lib/http';\nimport Cookies f"
},
{
"path": "src/components/AuthenticationFlow/TriggerVerifyAccount.tsx",
"chars": 2321,
"preview": "import { useEffect, useState } from 'react';\nimport Cookies from 'js-cookie';\nimport { httpPost } from '../../lib/http';"
},
{
"path": "src/components/AuthenticationFlow/TriggerVerifyEmail.tsx",
"chars": 2606,
"preview": "import { useEffect, useState } from 'react';\nimport { httpPatch } from '../../lib/http';\nimport { setAuthToken } from '."
},
{
"path": "src/components/AuthenticationFlow/VerificationEmailMessage.tsx",
"chars": 2516,
"preview": "import { useEffect, useState } from 'react';\nimport { httpPost } from '../../lib/http';\nimport { VerifyLetterIcon } from"
},
{
"path": "src/components/Authenticator/Authenticator.astro",
"chars": 52,
"preview": "---\n---\n\n<script src='./authenticator.ts'></script>\n"
},
{
"path": "src/components/Authenticator/authenticator.ts",
"chars": 2769,
"preview": "import Cookies from 'js-cookie';\nimport { TOKEN_COOKIE_NAME } from '../../lib/jwt';\nimport { REDIRECT_PAGE_AFTER_AUTH } "
},
{
"path": "src/components/Badge.tsx",
"chars": 811,
"preview": "type BadgeProps = {\n variant: 'blue' | 'green' | 'red' | 'yellow' | 'grey' | 'white';\n text: string;\n};\n\nexport functi"
},
{
"path": "src/components/Befriend.tsx",
"chars": 12544,
"preview": "import { useEffect, useState } from 'react';\nimport { httpDelete, httpGet, httpPost } from '../lib/http';\nimport { pageP"
},
{
"path": "src/components/BestPracticeHeader.astro",
"chars": 3349,
"preview": "---\nimport Icon from './AstroIcon.astro';\nimport LoginPopup from './AuthenticationFlow/LoginPopup.astro';\nimport BestPra"
},
{
"path": "src/components/BestPracticeHint.astro",
"chars": 337,
"preview": "---\nimport ResourceProgressStats from './ResourceProgressStats.astro';\nexport interface Props {\n bestPracticeId: string"
},
{
"path": "src/components/Billing/BillingPage.tsx",
"chars": 9181,
"preview": "import { useEffect, useState } from 'react';\nimport { pageProgressMessage } from '../../stores/page';\nimport { useToast "
},
{
"path": "src/components/Billing/BillingWarning.tsx",
"chars": 971,
"preview": "import { AlertTriangle, type LucideIcon } from 'lucide-react';\n\nexport type BillingWarningProps = {\n icon?: LucideIcon;"
},
{
"path": "src/components/Billing/CheckSubscriptionVerification.tsx",
"chars": 500,
"preview": "import { useEffect, useState } from 'react';\nimport { getUrlParams } from '../../lib/browser';\nimport { VerifyUpgrade } "
},
{
"path": "src/components/Billing/EmptyBillingScreen.tsx",
"chars": 1676,
"preview": "import {\n CreditCard,\n Ellipsis,\n HeartHandshake,\n MessageCircleIcon,\n SparklesIcon,\n Zap,\n} from 'lucide-react';\n"
},
{
"path": "src/components/Billing/GlobalUpgradeModal.tsx",
"chars": 388,
"preview": "import { useStore } from '@nanostores/react';\nimport {\n hideUpgradeModal,\n isUpgradeModalOpen,\n} from '../../store"
},
{
"path": "src/components/Billing/UpdatePlanConfirmation.tsx",
"chars": 2799,
"preview": "import { useMutation } from '@tanstack/react-query';\nimport type { USER_SUBSCRIPTION_PLAN_PRICES } from '../../queries/b"
},
{
"path": "src/components/Billing/UpgradeAccountModal.tsx",
"chars": 11595,
"preview": "import { useMutation, useQuery } from '@tanstack/react-query';\nimport type { LucideIcon } from 'lucide-react';\nimport {\n"
},
{
"path": "src/components/Billing/VerifyUpgrade.tsx",
"chars": 3116,
"preview": "import { useEffect } from 'react';\nimport { Loader2, CheckCircle } from 'lucide-react';\nimport { useQuery } from '@tanst"
},
{
"path": "src/components/Changelog/ChangelogItem.astro",
"chars": 1450,
"preview": "---\nimport { DateTime } from 'luxon';\nimport ChangelogImages from '../ChangelogImages';\nimport type { ChangelogDocument "
},
{
"path": "src/components/Changelog/ChangelogLaunch.astro",
"chars": 1052,
"preview": "---\nimport { DateTime } from 'luxon';\n\nconst formattedDate = DateTime.fromISO('2024-09-13').toFormat('dd LLL, yyyy');\n--"
},
{
"path": "src/components/ChangelogBanner.astro",
"chars": 2699,
"preview": "---\nimport { listChangelog } from '../queries/changelog';\nimport { DateTime } from 'luxon';\nimport AstroIcon from './Ast"
},
{
"path": "src/components/ChangelogImages.tsx",
"chars": 3672,
"preview": "import { ChevronLeft, ChevronRight } from 'lucide-react';\nimport React, { useState, useEffect, useCallback } from 'react"
},
{
"path": "src/components/ChatEditor/ChatEditor.css",
"chars": 527,
"preview": ".chat-editor .tiptap p.is-editor-empty:first-child::before {\n color: #adb5bd;\n content: attr(data-placeholder);\n floa"
},
{
"path": "src/components/ChatEditor/ChatEditor.tsx",
"chars": 3352,
"preview": "import './ChatEditor.css';\n\nimport {\n Editor,\n EditorContent,\n useEditor,\n type JSONContent,\n} from '@tiptap/react';"
},
{
"path": "src/components/ChatEditor/VariableExtension/VariableExtension.tsx",
"chars": 7835,
"preview": "import { mergeAttributes, Node } from '@tiptap/core';\nimport { type DOMOutputSpec, Node as ProseMirrorNode } from '@tipt"
}
]
// ... and 11270 more files (download for full content)
About this extraction
This page contains the full source code of the kamranahmedse/developer-roadmap GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 11470 files (20.4 MB), approximately 6.2M tokens, and a symbol index with 1833 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.