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 │ │ │ │ │ ├── bem@r28JBMZLEqZMDm-tVDYZk.md │ │ │ │ │ ├── block@uhHBvhgHjmIZDeOEPi_pZ.md │ │ │ │ │ ├── border@tOADYKk7o5cFaMLKxdiYa.md │ │ │ │ │ ├── box-model@AJR5CRYOedHzJ20hROIjo.md │ │ │ │ │ ├── box-shadows@jPSQNDH4UpmVoLEf6RIjy.md │ │ │ │ │ ├── cascading-order@Y4ODIPSKsWg0k1K5rHVh7.md │ │ │ │ │ ├── child@UojAVB7wZgGhLd9r8ZVYF.md │ │ │ │ │ ├── class@p3niPUep5J2h4x0tv4CLM.md │ │ │ │ │ ├── color@lo6OuD5hsZ7_r01jp-u0U.md │ │ │ │ │ ├── combinator-selectors@8xpK4SVUDvxil_hR-LaJ4.md │ │ │ │ │ ├── comments@UKUulhLMTcmwi-jDDoGTp.md │ │ │ │ │ ├── container-queries@IkN7i3ERk_lTOD0mBj3JO.md │ │ │ │ │ ├── css-basics@hq4lsadaQAmTD6vBdmJ_W.md │ │ │ │ │ ├── css-functions@I1wmKcLyjQUiJXPtsGye7.md │ │ │ │ │ ├── css-in-js@UInkC4leVjIsSXPN1y62W.md │ │ │ │ │ ├── css-modules@DjeaAmUlNtNV3f8W0-dKf.md │ │ │ │ │ ├── css-specificity@iLVla2ZPA3WlWFmP2sc6H.md │ │ │ │ │ ├── css-units@ffhmG-be4Ct09eOxwzU9y.md │ │ │ │ │ ├── css-variables@WGR5E9CXsZCxIhwZyCSKq.md │ │ │ │ │ ├── css@9ZUXy6s9IAIEM5GHk_bXR.md │ │ │ │ │ ├── declaration@GULUvSWLu8sPRuH0Xnbi5.md │ │ │ │ │ ├── descendant@HB0GXMRA87a-NWv6JXxWg.md │ │ │ │ │ ├── direction@ZyqKZMIkQ22ysFqmhL3ZN.md │ │ │ │ │ ├── display@SSAhePvKuRJU4TQw5NuVZ.md │ │ │ │ │ ├── element@FKQcANNYYf-kYQj-kyKL_.md │ │ │ │ │ ├── external-css@kis-VQIdFVywHhBPr8tLY.md │ │ │ │ │ ├── fixed@eL0kdDRPnwpCU_FWKDPkD.md │ │ │ │ │ ├── flexbox@Xa8oKhrZ2Y_Fsx3PjdMrt.md │ │ │ │ │ ├── floating-elements@-uEIqIN1xxqlQzOmVgVUc.md │ │ │ │ │ ├── flow-layout@U34z2pZgkH8NqiXMr5iuI.md │ │ │ │ │ ├── font-families@LZZheBKkxXSVwyW4hSCw5.md │ │ │ │ │ ├── font-shorthand@KZ-B_6zH3gkJhFFL_yRSm.md │ │ │ │ │ ├── font-size@X2aBWF0Dl88M-dULDSL9J.md │ │ │ │ │ ├── font-style@Ha84l1MXtbuSrUeQxRq7g.md │ │ │ │ │ ├── font-variant@mGYDsQ1QzimmO3U1CnJUu.md │ │ │ │ │ ├── font-weight@jV9oHJdtocQzzALylaFnA.md │ │ │ │ │ ├── frontend-development@zW49OvVO-kLh0M4JCE4_w.md │ │ │ │ │ ├── google-fonts@1-agoKIdWelaazIOe3haM.md │ │ │ │ │ ├── grid@6nemkEmghB_0SWBOHyI7a.md │ │ │ │ │ ├── grouping@TSItk9mQJphdRID9mgGwU.md │ │ │ │ │ ├── hex@ZlU2dJj5myMd3hOc4ycOi.md │ │ │ │ │ ├── hsl@GA3Rqg75oRZgFYi2ZzLH6.md │ │ │ │ │ ├── html@6OjCZPf10yJqNIdFkI4l-.md │ │ │ │ │ ├── id@U6dcnopmzzsppCQ9uy8E-.md │ │ │ │ │ ├── images-and-filters@kcfgt2pu3MCsgki391tpa.md │ │ │ │ │ ├── inline-block@cQ4FdKzwvMu5FD0Xk-U73.md │ │ │ │ │ ├── inline-css@B0JUjbCN35MMGtFb5sCyB.md │ │ │ │ │ ├── inline@Jipq1yvlLNL0TbsVImCDk.md │ │ │ │ │ ├── internal-css@gARjh5W-R_93_WeS8xxwe.md │ │ │ │ │ ├── introduction@eR9zEKc2xQtOPNjOgke4_.md │ │ │ │ │ ├── javascript@J1RsZPDKX-ocDvTh-Bg7N.md │ │ │ │ │ ├── keyframe-animations@qmKXfmheAvlap45aFrP9m.md │ │ │ │ │ ├── line-height@aB04IOoWwIxm7BvwfgTYj.md │ │ │ │ │ ├── lists@XuySIveFuvA_FvqDnNPRL.md │ │ │ │ │ ├── margin@e_m7y5YYPLFbVtoG79DBb.md │ │ │ │ │ ├── media-queries@1-VTjOseACNKca6TU07aM.md │ │ │ │ │ ├── multicolumn-layout@KoJ7syHd7Y3gyWW93dRnQ.md │ │ │ │ │ ├── named-colors@9vVxubL4bB3FPQOPoM0TV.md │ │ │ │ │ ├── next-sibling@qvOddcSKg21RJBG5XTGfU.md │ │ │ │ │ ├── none@doVYds82d5w1hIc33hkMq.md │ │ │ │ │ ├── opacity@gm7kRAgfG3FKJqZhZ3Noj.md │ │ │ │ │ ├── outline@EirP1Bs-FGEtPxuY2k7wF.md │ │ │ │ │ ├── padding@qJ3bBc7pNgZQU5I31kqKA.md │ │ │ │ │ ├── performance@-dPxULwMhdnnBoX3givbd.md │ │ │ │ │ ├── position@un_IujSN8vtDM40OOJC1n.md │ │ │ │ │ ├── postcss@EOGYRC1TiXOwrR1pjW6Ky.md │ │ │ │ │ ├── properties--values@awMTGfeQlXQNILvEO8nOJ.md │ │ │ │ │ ├── pseudo-classes@_KdEkwm0GmKHcahivCubL.md │ │ │ │ │ ├── pseudo-elements@yj2GTGrlDHp9gNd3C476k.md │ │ │ │ │ ├── relative@Hp51JS9rwAMdWhYnex5NB.md │ │ │ │ │ ├── responsive-typography@9XDJcFh7V-7ppAEP_8hJl.md │ │ │ │ │ ├── rgb@74sme3agcXP7TRSGjYcWG.md │ │ │ │ │ ├── rgba-hsla@wgopn2aZpRKXKw3PSCvWQ.md │ │ │ │ │ ├── rules@obhoMq0OIyEolhppby1XM.md │ │ │ │ │ ├── sass@1bCeydLILdEKV9NJe83gK.md │ │ │ │ │ ├── selector@v5fDxilI3q2vvt_B4Mxer.md │ │ │ │ │ ├── simple-selectors@BaIUVApePcGNdYabadnbz.md │ │ │ │ │ ├── static@qaZfDil0Slda9t-RN0KWH.md │ │ │ │ │ ├── sticky@mJifV0kjJTwkllmZVSqec.md │ │ │ │ │ ├── subsequent-sibling@_dWrjp_fK4gmGwiWrgBbb.md │ │ │ │ │ ├── tables@Q-6tdHPE-xpPGIG8J_Wz7.md │ │ │ │ │ ├── text-alignment@SABFbvM47j1cYCyeNfMZR.md │ │ │ │ │ ├── text-decoration@AUzbo8UwpL-XxvhMCvtoe.md │ │ │ │ │ ├── text-shadows@Mq4Oo9cCWqkPGHkgpNRTz.md │ │ │ │ │ ├── text-spacing@U3oH6TFRezkciuROAU0wd.md │ │ │ │ │ ├── text-styling@vo34F_AHkMlyq6uNRPk-1.md │ │ │ │ │ ├── text-transform@v0IUvnrLv3OiBQ-NkM9Lv.md │ │ │ │ │ ├── transforms@ZwlCU9jE9YBcEOBo0vFqq.md │ │ │ │ │ ├── transitions@SNcVcjcvtph3W7KTx1N-v.md │ │ │ │ │ ├── units-with-functions@yRqSmhRwvZXbNXuCNYCzo.md │ │ │ │ │ ├── universal@4LjxorN5jQnm9ZWKPk-pu.md │ │ │ │ │ ├── visibility@sO-XiY9yJZMedzyR_7Gdq.md │ │ │ │ │ ├── width--height@quGp1pgbrEH37WA5URb_g.md │ │ │ │ │ └── z-index--stacking-context@xep8iF-7XOYLY2xeblM-A.md │ │ │ │ └── css.md │ │ │ ├── cyber-security/ │ │ │ │ ├── content/ │ │ │ │ │ ├── acl@35oCRzhzpVfitQPL4K9KC.md │ │ │ │ │ ├── acls@8JM95sonFUhZCdaynUA_M.md │ │ │ │ │ ├── antimalware@9QtY1hMJ7NKLFztYK-mHY.md │ │ │ │ │ ├── antivirus@3140n5prZYySsuBHjqGOJ.md │ │ │ │ │ ├── anyrun@GZHFR43UzN0WIIxGKZOdX.md │ │ │ │ │ ├── apt@l0BvDtwWoRSEjm6O0WDPy.md │ │ │ │ │ ├── arp@M52V7hmG4ORf4TIVw3W3J.md │ │ │ │ │ ├── arp@fzdZF-nzIL69kaA7kwOCn.md │ │ │ │ │ ├── arp@hkO3Ga6KctKODr4gos6qX.md │ │ │ │ │ ├── attck@auR7fNyd77W2UA-PjXeJS.md │ │ │ │ │ ├── authentication-vs-authorization@WG7DdsxESm31VcLFfkVTz.md │ │ │ │ │ ├── autopsy@bIwpjIoxSUZloxDuQNpMu.md │ │ │ │ │ ├── aws@0LztOTc3NG3OujCVwlcVU.md │ │ │ │ │ ├── azure@GklBi7Qx1akN_cS9UMrha.md │ │ │ │ │ ├── bash@tao0Bb_JR0Ubl62HO8plp.md │ │ │ │ │ ├── basics-and-concepts-of-threat-hunting@_x3BgX93N-Pt1_JK7wk0p.md │ │ │ │ │ ├── basics-of-computer-networking@T0aU8ZQGShmF9uXhWY4sD.md │ │ │ │ │ ├── basics-of-ids-and-ips@FJsEBOFexbDyAj86XWBCc.md │ │ │ │ │ ├── basics-of-nas-and-san@umbMBQ0yYmB5PgWfY6zfO.md │ │ │ │ │ ├── basics-of-reverse-engineering@uoGA4T_-c-2ip_zfEUcJJ.md │ │ │ │ │ ├── basics-of-subnetting@E8Z7qFFW-I9ivr0HzoXCq.md │ │ │ │ │ ├── basics-of-threat-intel-osint@wN5x5pY53B8d0yopa1z8F.md │ │ │ │ │ ├── basics-of-vulnerability-management@lcxAXtO6LoGd85nOFnLo8.md │ │ │ │ │ ├── blue--red--purple-teams@7tDxTcKJNAUxbHLPCnPFO.md │ │ │ │ │ ├── bluetooth@DbWf5LdqiByPiJa4xHtl_.md │ │ │ │ │ ├── box@4Man3Bd-ySLFlAdxbLOHw.md │ │ │ │ │ ├── brute-force-vs-password-spray@Q0i-plPQkb_NIvOQBVaDd.md │ │ │ │ │ ├── buffer-overflow@n8ZOZxNhlnw7DpzoXe_f_.md │ │ │ │ │ ├── bus@0DWh4WmLK_ENDuqQmQcu4.md │ │ │ │ │ ├── c@8jj9hpe9jQIgCc8Txyw3O.md │ │ │ │ │ ├── cat@D2ptX6ja_HvFEafMIzWOy.md │ │ │ │ │ ├── ccna@4RD22UZATfL8dc71YkJwQ.md │ │ │ │ │ ├── ceh@AAo7DXB7hyBzO6p05gx1i.md │ │ │ │ │ ├── certificates@WXRaVCYwuGQsjJ5wyvbea.md │ │ │ │ │ ├── cidr@PPIH1oHW4_ZDyD3U3shDg.md │ │ │ │ │ ├── cis@sSihnptkoEqUsHjDpckhG.md │ │ │ │ │ ├── cisa@lqFp4VLY_S-5tAbhNQTew.md │ │ │ │ │ ├── cism@s86x24SHPEbbOB9lYNU-w.md │ │ │ │ │ ├── cissp@BqvijNoRzSGYLCMP-6hhr.md │ │ │ │ │ ├── cloud-skills-and-knowledge@vVaBQ5VtsE_ZeXbCOF8ux.md │ │ │ │ │ ├── common-commands@WDrSO7wBNn-2jB8mcyT7j.md │ │ │ │ │ ├── common-ports-and-their-uses@0tx2QYDYXhm85iYrCWd9U.md │ │ │ │ │ ├── common-protocols-and-their-uses@ViF-mpR17MB3_KJ1rV8mS.md │ │ │ │ │ ├── compliance@05Gbgy6aawYlYIx38u8DE.md │ │ │ │ │ ├── comptia-a@lbAgU5lR1O7L_5mCbNz_D.md │ │ │ │ │ ├── comptia-linux@p34Qwlj2sjwEPR2ay1WOK.md │ │ │ │ │ ├── comptia-network@4RGbNOfMPDbBcvUFWTTCV.md │ │ │ │ │ ├── comptia-security@AxeDcKK3cUtEojtHQPBw7.md │ │ │ │ │ ├── computer-hardware-components@Ih0YZt8u9vDwYo8y1t41n.md │ │ │ │ │ ├── connection-types-and-their-function@F1QVCEmGkgvz-_H5lTxY2.md │ │ │ │ │ ├── containment@l7WnKuR2HTD4Vf9U2TxkK.md │ │ │ │ │ ├── core-concepts-of-zero-trust@HavEL0u65ZxHt92TfbLzk.md │ │ │ │ │ ├── crest@rA1skdztev3-8VmAtIlmr.md │ │ │ │ │ ├── csf@HjfgaSEZjW9BOXy_Ixzkk.md │ │ │ │ │ ├── csrf@pK2iRArULlK-B3iSVo4-n.md │ │ │ │ │ ├── curl@W7iQUCjODGYgE4PjC5TZI.md │ │ │ │ │ ├── cyber-kill-chain@H38Vb7xvuBJXVzgPBdRdT.md │ │ │ │ │ ├── dd@9xbU_hrEOUtMm-Q09Fe6t.md │ │ │ │ │ ├── deauth-attack@LfWJJaT3fv0p6fUeS8b84.md │ │ │ │ │ ├── default-gateway@5rKaFtjYx0n2iF8uTLs8X.md │ │ │ │ │ ├── dhcp@R5HEeh6jwpQDo27rz1KSH.md │ │ │ │ │ ├── dhcp@T4312p70FqRBkzVfWKMaR.md │ │ │ │ │ ├── diamond-model@AY-hoPGnAZSd1ExaYX8LR.md │ │ │ │ │ ├── different-versions-and-differences@yXOGqlufAZ69uiBzKFfh6.md │ │ │ │ │ ├── dig@D2YYv1iTRGken75sHO0Gt.md │ │ │ │ │ ├── dig@XyaWZZ45axJMKXoWwsyFj.md │ │ │ │ │ ├── directory-traversal@L0ROYh2DNlkybNDO2ezJY.md │ │ │ │ │ ├── dlp@iolsTC-63d_1wzKGul-cT.md │ │ │ │ │ ├── dmz@gfpvDQz61I3zTB7tGu7vp.md │ │ │ │ │ ├── dns-poisoning@urtsyYWViEzbqYLoNfQAh.md │ │ │ │ │ ├── dns@ORIdKG8H97VkBUYpiDtXf.md │ │ │ │ │ ├── dns@r1IKvhpwg2umazLGlQZL1.md │ │ │ │ │ ├── dnssec@LLGXONul7JfZGUahnK0AZ.md │ │ │ │ │ ├── dos-vs-ddos@IF5H0ZJ72XnqXti3jRWYF.md │ │ │ │ │ ├── drive-by-attack@cO70zHvHgBAH29khF-hBW.md │ │ │ │ │ ├── dropbox@9OastXVfiG1YRMm68ecnn.md │ │ │ │ │ ├── dumpster-diving@Iu0Qtk13RjrhHpSlm0uyh.md │ │ │ │ │ ├── eap-vs-peap@1jwtExZzR9ABKvD_S9zFG.md │ │ │ │ │ ├── edr@QvHWrmMzO8IvNQ234E_wf.md │ │ │ │ │ ├── endpoint-security@LEgJtu1GZKOtoAXyOGWLE.md │ │ │ │ │ ├── eradication@N17xAIo7sgbB0nrIDMWju.md │ │ │ │ │ ├── esxi@BisNooct1vJDKaBKsGR7_.md │ │ │ │ │ ├── event-logs@KbFwL--xF-eYjGy8PZdrM.md │ │ │ │ │ ├── evil-twin@O1fY2n40yjZtJUEeoItKr.md │ │ │ │ │ ├── false-negative--false-positive@XwRCZf-yHJsXVjaRfb3R4.md │ │ │ │ │ ├── firewall--nextgen-firewall@tWDo5R3KU5KOjDdtv801x.md │ │ │ │ │ ├── firewall-logs@np0PwKy-EvIa_f_LC6Eem.md │ │ │ │ │ ├── ftk-imager@_jJhL1RtaqHJmlcWrd-Ak.md │ │ │ │ │ ├── ftp-vs-sftp@9Z6HPHPj4escSVDWftFEx.md │ │ │ │ │ ├── ftp@ftYYMxRpVer-jgSswHLNa.md │ │ │ │ │ ├── fundamental-it-skills@oimYzZYFXKjgvc7D4c-2u.md │ │ │ │ │ ├── gcp@tOLA5QPKi6LHl1ljsOMwX.md │ │ │ │ │ ├── giac@ZiUT-lyIBfHTzG-dwSy96.md │ │ │ │ │ ├── go@jehVvdz8BnruKjqHMKu5v.md │ │ │ │ │ ├── google-drive@fTZ4PqH-AMhYA_65w4wFO.md │ │ │ │ │ ├── google-suite@IOK_FluAv34j3Tj_NvwdO.md │ │ │ │ │ ├── gpen@t4h9rEKWz5Us0qJKXhxlX.md │ │ │ │ │ ├── grep@Dfz-6aug0juUpMmOJLCJ9.md │ │ │ │ │ ├── group-policy@FxuMJmDoDkIsPFp2iocFg.md │ │ │ │ │ ├── gsec@nlmATCTgHoIoMcEOW8bUW.md │ │ │ │ │ ├── gtfobins@Jd9t8e9r29dHRsN40dDOk.md │ │ │ │ │ ├── guestos@LocGETHz6ANYinNd5ZLsS.md │ │ │ │ │ ├── gwapt@rwniCTWfYpKP5gi02Pa9f.md │ │ │ │ │ ├── hackthebox@wkuE_cChPZT2MHyGjUuU4.md │ │ │ │ │ ├── hashing@0UZmAECMnfioi-VeXcvg8.md │ │ │ │ │ ├── head@VNmrb5Dm4UKUgL8JBfhnE.md │ │ │ │ │ ├── hips@l5EnhOCnkN-RKvgrS9ylH.md │ │ │ │ │ ├── honeypots@bj5YX8zhlam0yoNckL8e4.md │ │ │ │ │ ├── host-based-firewall@jWl1VWkZn3n1G2eHq6EnX.md │ │ │ │ │ ├── hostos@p7w3C94xjLwSMm5qA8XlL.md │ │ │ │ │ ├── hping@Cclbt4bNfkHwFwZOvJuLK.md │ │ │ │ │ ├── hr@05tH6WhToC615JTFN-TPc.md │ │ │ │ │ ├── http--https@3Awm221OJHxXNLiL9yxfd.md │ │ │ │ │ ├── hybrid@ywRlTuTfh5-NHnv4ZyW1t.md │ │ │ │ │ ├── hypervisor@CIoLaRv5I3sCr9tBnZHEi.md │ │ │ │ │ ├── iaas@1nPifNUm-udLChIqLC_uK.md │ │ │ │ │ ├── icloud@E7yfALgu9E2auOYDOTmex.md │ │ │ │ │ ├── icloud@Wqy6ki13hP5c0VhGYEhHj.md │ │ │ │ │ ├── identification@XsRoldaBXUSiGbvY1TjQd.md │ │ │ │ │ ├── impersonation@ZEgxmvjWPp5NofLFz_FTJ.md │ │ │ │ │ ├── infrared@KsZ63c3KQLLn373c5CZnp.md │ │ │ │ │ ├── installation-and-configuration@02aaEP9E5tlefeGBxf_Rj.md │ │ │ │ │ ├── installing-software-and-applications@Ot3LGpM-CT_nKsNqIKIye.md │ │ │ │ │ ├── ip@FdoqB2---uDAyz6xZjk_u.md │ │ │ │ │ ├── ipam@hN8p5YBcSaPm-byQUIz8L.md │ │ │ │ │ ├── ipconfig@IXNGFF4sOFbQ_aND-ELK0.md │ │ │ │ │ ├── ipconfig@u-6xuZUyOrogh1bU4cwER.md │ │ │ │ │ ├── ipsec@gNFVtBxSYP5Uw3o3tlJ0M.md │ │ │ │ │ ├── iptables@jr8JlyqmN3p7Ol3_kD9AH.md │ │ │ │ │ ├── iso@oRssaVG-K-JwlL6TAHhXw.md │ │ │ │ │ ├── javascript@2SThr6mHpX6rpW-gmsqxG.md │ │ │ │ │ ├── joe-sandbox@h__KxKa0Q74_egY7GOe-L.md │ │ │ │ │ ├── jump-server@UF3BV1sEEOrqh5ilnfM1B.md │ │ │ │ │ ├── kali-linux@w6wXkoLrv0_d-Ah0txUHd.md │ │ │ │ │ ├── kerberos@lG6afUOx3jSQFxbH92otL.md │ │ │ │ │ ├── key-exchange@rmR6HJqEhHDgX55Xy5BAW.md │ │ │ │ │ ├── kill-chain@7Bmp4x6gbvWMuVDdGRUGj.md │ │ │ │ │ ├── known-vs-unknown@HPlPGKs7NLqmBidHJkOZg.md │ │ │ │ │ ├── lan@xWxusBtMEWnd-6n7oqjHz.md │ │ │ │ │ ├── ldap@lV3swvD6QGLmD9iVfbKIF.md │ │ │ │ │ ├── ldaps@z_fDvTgKw51Uepo6eMQd9.md │ │ │ │ │ ├── learn-how-malware-works-and-types@v7CD_sHqLWbm9ibXXESIK.md │ │ │ │ │ ├── legal@C5bCIdPi0gGkY_r4qqoXZ.md │ │ │ │ │ ├── lessons-learned@ErRol7AT02HTn3umsPD_0.md │ │ │ │ │ ├── linux@4frVcjYI1VlVU9hQgpwcT.md │ │ │ │ │ ├── local-auth@vYvFuz7lAJXZ1vK_4999a.md │ │ │ │ │ ├── localhost@0TWwox-4pSwuXojI8ixFO.md │ │ │ │ │ ├── lolbas@10qbxX8DCrfyH7tgYexxQ.md │ │ │ │ │ ├── loopback@W_oloLu2Euz5zRSy7v_T8.md │ │ │ │ │ ├── mac-based@OAukNfV5T0KTnIF9jKYRF.md │ │ │ │ │ ├── macos@dztwr-DSckggQbcNIi4_2.md │ │ │ │ │ ├── man@LrwTMH_1fTd8iB9wJg-0t.md │ │ │ │ │ ├── management@s9tHpzYRj2HCImwQhnjFM.md │ │ │ │ │ ├── memdump@wspNQPmqWRjKoFm6x_bVw.md │ │ │ │ │ ├── memory-leak@nOND14t7ISgSH3zNpV3F8.md │ │ │ │ │ ├── mesh@PYeF15e7iVB9seFrrO7W6.md │ │ │ │ │ ├── mfa--2fa@pnfVrOjDeG1uYAeqHxhJP.md │ │ │ │ │ ├── mitm@ODlVT6MhV-RVUbRMG0mHi.md │ │ │ │ │ ├── ms-office-suite@-5haJATqlmj0SFSFAqN6A.md │ │ │ │ │ ├── nac-based@6oAzYfwsHQYNVbi7c2Tly.md │ │ │ │ │ ├── nat@Kkd3f_0OYNCdpDgrJ-_Ju.md │ │ │ │ │ ├── navigating-using-gui-and-cli@MGitS_eJBoY99zOR-W3F4.md │ │ │ │ │ ├── netflow@xXz-SwvXA2cLfdCd-hLtW.md │ │ │ │ │ ├── netstat@2M3PRbGzo14agbEPe32ww.md │ │ │ │ │ ├── networking-knowledge@gSLr-Lc119eX9Ig-kDzJ2.md │ │ │ │ │ ├── nfc@hwAUFLYpc_ftCfXq95dey.md │ │ │ │ │ ├── nids@LIPtxl_oKZRcbvXT4EdNf.md │ │ │ │ │ ├── nips@7w9qj16OD4pUzq-ItdxeK.md │ │ │ │ │ ├── nist@SOkJUTd1NUKSwYMIprv4m.md │ │ │ │ │ ├── nmap@Hoou7kWyfB2wx_yFHug_H.md │ │ │ │ │ ├── nmap@xqwIEyGfdZFxk6QqbPswe.md │ │ │ │ │ ├── nslookup@OUarb1oS1-PX_3OXNR0rV.md │ │ │ │ │ ├── nslookup@tk4iG5i1Ml9w9KRO1tGJU.md │ │ │ │ │ ├── ntp@tf0TymdPHbplDHvuVIIh4.md │ │ │ │ │ ├── obfuscation@kxlg6rpfqqoBfmMMg3EkJ.md │ │ │ │ │ ├── onedrive@MWqnhDKm9jXvDDjkeVNxm.md │ │ │ │ │ ├── operating-system-hardening@_S25EOGS3P8647zLM5i-g.md │ │ │ │ │ ├── operating-systems@UY6xdt_V3YMkZxZ1hZLvW.md │ │ │ │ │ ├── os-independent-troubleshooting@pJUhQin--BGMuXHPwx3JJ.md │ │ │ │ │ ├── oscp@SwVGVP2bbCFs2uNg9Qtxb.md │ │ │ │ │ ├── paas@PQ_np6O-4PK2V-r5lywQg.md │ │ │ │ │ ├── packet-captures@TIxEkfBrN6EXQ3IKP1B7u.md │ │ │ │ │ ├── packet-sniffers@k6UX0BJho5arjGD2RWPgH.md │ │ │ │ │ ├── parrotos@zR6djXnfTSFVEfvJonQjf.md │ │ │ │ │ ├── pass-the-hash@sMuKqf27y4iG0GrCdF5DN.md │ │ │ │ │ ├── patching@e-MDyUR3GEv-e4Qsx_5vV.md │ │ │ │ │ ├── penetration-testing-rules-of-engagement@NkAAQikwH-A6vrF8fWpuB.md │ │ │ │ │ ├── performing-crud-on-files@zRXyoJMap9irOYo3AdHE8.md │ │ │ │ │ ├── perimiter-vs-dmz-vs-segmentation@PUgPgpKio4Npzs86qEXa7.md │ │ │ │ │ ├── phishing@7obusm5UtHwWMcMMEB3lt.md │ │ │ │ │ ├── picoctf@pou5xHwnz9Zsy5J6lNlKq.md │ │ │ │ │ ├── ping@GuuY-Q6FZzfspB3wrH64r.md │ │ │ │ │ ├── ping@yfTpp-ePuDB931FnvNB-Y.md │ │ │ │ │ ├── pki@fxyJxrf3mnFTa3wXk1MCW.md │ │ │ │ │ ├── port-blocking@W7bcydXdwlubXF2PHKOuq.md │ │ │ │ │ ├── port-scanners@iJRQHzh5HXADuWpCouwxv.md │ │ │ │ │ ├── power-shell@paY9x2VJA98FNGBFGRXp2.md │ │ │ │ │ ├── preparation@w6V4JOtXKCMPAkKIQxvMg.md │ │ │ │ │ ├── private-vs-public-keys@7svh9qaaPp0Hz23yinIye.md │ │ │ │ │ ├── private@ecpMKP1cQXXsfKETDUrSf.md │ │ │ │ │ ├── privilege-escalation@cvI8-sxY5i8lpelW9iY_5.md │ │ │ │ │ ├── programming-skills@_RnuQ7952N8GWZfPD60sJ.md │ │ │ │ │ ├── protocol-analyzers@K05mEAsjImyPge0hDtsU0.md │ │ │ │ │ ├── proxmox@jqX1A5hFF3Qznqup4lfiF.md │ │ │ │ │ ├── public-vs-private-ip-addresses@2nQfhnvBjJg1uDZ28aE4v.md │ │ │ │ │ ├── public@ZDj7KBuyZsKyEMZViMoXW.md │ │ │ │ │ ├── python@XiHvGy--OkPFfJeKA6-LP.md │ │ │ │ │ ├── radius@tH3RLnJseqOzRIbZMklHD.md │ │ │ │ │ ├── rdp@Ia6M1FKPNpqLDiWx7CwDh.md │ │ │ │ │ ├── reconnaissance@UU_inxa8Y2lLP2BRhdLDT.md │ │ │ │ │ ├── recovery@vFjbZAJq8OfLb3_tsc7oT.md │ │ │ │ │ ├── replay-attack@mIX8PsIGuwgPCGQZ6ok2H.md │ │ │ │ │ ├── ring@9vEUVJ8NTh0wKyIE6-diY.md │ │ │ │ │ ├── rmf@fjEdufrZAfW4Rl6yDU8Hk.md │ │ │ │ │ ├── rogue-access-point@Ee7LfbhwJbiWjJ3b_bbni.md │ │ │ │ │ ├── roles-of-compliance-and-auditors@kqT0FRLt9Ak9P8PhHldO-.md │ │ │ │ │ ├── route@xFuWk7M-Vctk_xb7bHbWs.md │ │ │ │ │ ├── router@lwSFIbIX-xOZ0QK2sGFb1.md │ │ │ │ │ ├── s3@2jsTgT7k8MeaDtx6RJhOP.md │ │ │ │ │ ├── saas@sVw5KVNxPEatBRKb2ZbS_.md │ │ │ │ │ ├── salting@jqWhR6oTyX6yolUBv71VC.md │ │ │ │ │ ├── sandboxing@SLKwuLHHpC7D1FqrpPRAe.md │ │ │ │ │ ├── sans-holiday-hack-challenge@WCeJrvWl837m1BIjuA1Mu.md │ │ │ │ │ ├── security-skills-and-knowledge@_hYN0gEi9BL24nptEtXWU.md │ │ │ │ │ ├── sftp@YEy6o-clTBKZp1yOkLwNb.md │ │ │ │ │ ├── shoulder-surfing@FD0bkmxNpPXiUB_NevEUf.md │ │ │ │ │ ├── siem@c2kY3wZVFKZYxMARhLIwO.md │ │ │ │ │ ├── sinkholes@oFgyQYL3Ws-l7B5AF-bTR.md │ │ │ │ │ ├── smime@9rmDvycXFcsGOq3v-_ziD.md │ │ │ │ │ ├── smishing@d4U6Jq-CUB1nNN2OCFoum.md │ │ │ │ │ ├── soar@i0ulrA-GJrNhIVmzdWDrn.md │ │ │ │ │ ├── social-engineering@O1VceThdxRlgQ6DcGyY7Y.md │ │ │ │ │ ├── spam-vs-spim@cbEMUyg_btIPjdx-XqIM5.md │ │ │ │ │ ├── spoofing@LteSouUtAj3JWWOzcjQPl.md │ │ │ │ │ ├── sql-injection@P-Am25WJV8cFd_KsX7cdj.md │ │ │ │ │ ├── srtp@_9lQSG6fn69Yd9rs1pQdL.md │ │ │ │ │ ├── ssh@8Mog890Lj-gVBpWa05EzT.md │ │ │ │ │ ├── ssl--tls@LKK1A5-xawA7yCIAWHS8P.md │ │ │ │ │ ├── ssl-and-tls-basics@dJ0NUsODFhk52W2zZxoPh.md │ │ │ │ │ ├── ssl-vs-tls@6ILPXeUDDmmYRiA_gNTSr.md │ │ │ │ │ ├── sso@xL32OqDKm6O043TYgVV1r.md │ │ │ │ │ ├── stakeholders@lv6fI3WeJawuCbwKtMRIh.md │ │ │ │ │ ├── star@P0ZhAXd_H-mTOMr13Ag31.md │ │ │ │ │ ├── subnet-mask@f-v8qtweWXFY_Ryo3oYUF.md │ │ │ │ │ ├── switch@r9byGV8XuBPzoqj5ZPf2W.md │ │ │ │ │ ├── syslogs@7oFwRkmoZom8exMDtMslX.md │ │ │ │ │ ├── tail@762Wf_Eh-3zq69CZZiIjR.md │ │ │ │ │ ├── tailgating@o-keJgF9hmifQ_hUD91iN.md │ │ │ │ │ ├── tcpdump@y8GaUNpaCT1Ai88wPOk6d.md │ │ │ │ │ ├── tracert@cSz9Qx3PGwmhq3SSKYKfg.md │ │ │ │ │ ├── tracert@jJtS0mgCYc0wbjuXssDRO.md │ │ │ │ │ ├── troubleshooting@xeRWOX1fWQDLNLWMAFTEe.md │ │ │ │ │ ├── true-negative--true-positive@M6uwyD4ibguxytf1od-og.md │ │ │ │ │ ├── tryhackme@kht-L7_v-DbglMYUHuchp.md │ │ │ │ │ ├── typo-squatting@0LeDwj_tMaXjQBBOUJ5CL.md │ │ │ │ │ ├── understand-backups-and-resiliency@9asy3STW4oTYYHcUazaRj.md │ │ │ │ │ ├── understand-basics-of-forensics@7KLGFfco-hw7a62kXtS3d.md │ │ │ │ │ ├── understand-basics-of-popular-suites@_7RjH4Goi0x6Noy6za0rP.md │ │ │ │ │ ├── understand-cia-triad@uz6ELaLEu9U4fHVfnQiOa.md │ │ │ │ │ ├── understand-common-exploit-frameworks@Lg7mz4zeCToEzZBFxYuaU.md │ │ │ │ │ ├── understand-common-hacking-tools@rzY_QsvnC1shDTPQ-til0.md │ │ │ │ │ ├── understand-concept-of-defense-in-depth@Rae-f9DHDZuwIwW6eRtKF.md │ │ │ │ │ ├── understand-concept-of-isolation@aDF7ZcOX9uR8l0W4aqhYn.md │ │ │ │ │ ├── understand-concept-of-runbooks@Ec6EairjFJLCHc7b-1xxe.md │ │ │ │ │ ├── understand-handshakes@zQx_VUS1zRmF4zCGjJD5-.md │ │ │ │ │ ├── understand-permissions@bTfL7cPOmBBFl-eHxUJI6.md │ │ │ │ │ ├── understand-the-basics-and-general-flow-of-deploying-in-the-cloud@XL3FVeGFDhAl_gSol6Tjt.md │ │ │ │ │ ├── understand-the-concept-of-infrastructure-as-code@RJctUpvlUJGAdwBNtDSXw.md │ │ │ │ │ ├── understand-the-concept-of-security-in-the-cloud@ThLsXkqLw--uddHz0spCH.md │ │ │ │ │ ├── understand-the-concept-of-serverless@-83ltMEl3le3yD68OFnTM.md │ │ │ │ │ ├── understand-the-definition-of-risk@ggAja18sBUUdCfVsT0vCv.md │ │ │ │ │ ├── understand-the-differences-between-cloud-and-on-premises@KGjYM4Onr5GQf1Yv9IabI.md │ │ │ │ │ ├── understand-the-osi-model@OXUd1UPPsBhNoUGLKZJGV.md │ │ │ │ │ ├── urlscan@lMiW2q-b72KUl-2S7M6Vb.md │ │ │ │ │ ├── urlvoid@lFt1k1Q-NlWWqyDA3gWD1.md │ │ │ │ │ ├── virtualbox@vGVFhZXYOZOy4qFpLLbxp.md │ │ │ │ │ ├── virustotal@rxzcAzHjzIc9lkWSw0fef.md │ │ │ │ │ ├── vlan-hopping@u4hySof6if5hiONSaW-Uf.md │ │ │ │ │ ├── vlan@d5Cv3EXf6OXW19yPJ4x6e.md │ │ │ │ │ ├── vm@251sxqoHggQ4sZ676iX5w.md │ │ │ │ │ ├── vm@ZTC5bLWEIQcdmowc7sk_E.md │ │ │ │ │ ├── vmware@AjywuCZdBi9atGUbetlUL.md │ │ │ │ │ ├── vpn@gTozEpxJeG1NTkVBHH-05.md │ │ │ │ │ ├── vulnhub@W94wY_otBuvVW_-EFlKA6.md │ │ │ │ │ ├── wadcoms@Rnpx7VkhrBkSQTni6UuTR.md │ │ │ │ │ ├── wan@vCkTJMkDXcQmwsmeNUAX5.md │ │ │ │ │ ├── watering-hole-attack@dcvuKHq0nHgHLcLwtl4IJ.md │ │ │ │ │ ├── web-based-attacks-and-owasp10@fyOYVqiBqyKC4aqc6-y0q.md │ │ │ │ │ ├── whaling@KSwl6sX2W47vUmytpm8LH.md │ │ │ │ │ ├── whishing@M65fCl72qlF0VTbGNT6du.md │ │ │ │ │ ├── whois@-RnlvUltJ9IDtH0HEnMbN.md │ │ │ │ │ ├── wifi@fUBNKHNPXbemRYrnzH3VT.md │ │ │ │ │ ├── windows@BNUKEQ4YpZmIhSPQdkHgU.md │ │ │ │ │ ├── winhex@gNan93Mg9Ym2AF3Q2gqoi.md │ │ │ │ │ ├── wireshark@Sm9bxKUElINHND8FdZ5f2.md │ │ │ │ │ ├── wlan@QCVYF1rmPsMVtklBNDNaB.md │ │ │ │ │ ├── wpa-vs-wpa2-vs-wpa3-vs-wep@MBnDE0VyVh2u2p-r90jVk.md │ │ │ │ │ ├── wps@HSCGbM2-aTnJWUX6jGaDP.md │ │ │ │ │ ├── xss@2jo1r9O_rCnDwRv1_4Wo-.md │ │ │ │ │ ├── zero-day@v9njgIxZyabJZ5iND3JGc.md │ │ │ │ │ └── zero-day@zqRaMmqcLfx400kJ-h0LO.md │ │ │ │ ├── cyber-security.json │ │ │ │ ├── cyber-security.md │ │ │ │ ├── faqs.astro │ │ │ │ └── migration-mapping.json │ │ │ ├── data-analyst/ │ │ │ │ ├── content/ │ │ │ │ │ ├── analysis--reporting-with-excel@sgXIjVTbwdwdYoaxN3XBM.md │ │ │ │ │ ├── apis@4DFcXSSHxg5wv0uXLIRij.md │ │ │ │ │ ├── average@FDYunL9KJkR_tHEcUV2iC.md │ │ │ │ │ ├── average@yn1sstYMO9du3rpfQqNs9.md │ │ │ │ │ ├── bar-charts@EVk1H-QLtTlpG7lVEenDt.md │ │ │ │ │ ├── big-data-concepts@m1IfG2sEedUxMXrv_B8GW.md │ │ │ │ │ ├── big-data-technologies@_aUQZWUhFRvNu0MZ8CPit.md │ │ │ │ │ ├── central-tendency@BJTVa4ur_bJB7mMtD2-hQ.md │ │ │ │ │ ├── charting@Vk3JErqxpnPY44iyfkLMl.md │ │ │ │ │ ├── cleanup@nC7tViln4UyQFYP_-fyjB.md │ │ │ │ │ ├── cnns@XlCv2OirEfuBFa4ranyyE.md │ │ │ │ │ ├── collection@mDUSpexdq3ITV6qokwSJl.md │ │ │ │ │ ├── concat@SIiIfcy-jeiRoDlxw385V.md │ │ │ │ │ ├── correlation-analysis@murioZ0NdrTix_lqSGz-8.md │ │ │ │ │ ├── count@uAdxP1ZkgzcU8JcWjvw6d.md │ │ │ │ │ ├── csv-files@iWOK0mRY-hAGxMnHYJ0tt.md │ │ │ │ │ ├── data-cleanup@E6cpb6kvluJM8OGuDcFBT.md │ │ │ │ │ ├── data-collection@_sjXCLHHTbZromJYn6fnu.md │ │ │ │ │ ├── data-manipulation-libraries@M1QtGTLyygIjePoCfvjve.md │ │ │ │ │ ├── data-storage-solutions@iTmtpXe7dR4XKslgpsk2q.md │ │ │ │ │ ├── data-transformation@t_BRtEharsrOZxoyX0OzV.md │ │ │ │ │ ├── data-visualisation-libraries@l1SnPc4EMqGdaIAhIQfrT.md │ │ │ │ │ ├── data-visualisation@2g19zjEASJw2ve57hxpr0.md │ │ │ │ │ ├── databases@tYPeLCxbqvMFlTkCGjdHg.md │ │ │ │ │ ├── datedif@yBlJrNo9eO470dLp6OaQZ.md │ │ │ │ │ ├── decision-trees@vHDm_9Lh4EqvXNYSOBaqZ.md │ │ │ │ │ ├── deep-learning-optional@SiYUdtYMDImRPmV2_XPkH.md │ │ │ │ │ ├── descriptive-analysis@il6KQXVPGBza5libN38ib.md │ │ │ │ │ ├── descriptive-analytics@hWDh0ooidbqZb000ENVok.md │ │ │ │ │ ├── diagnostic-analytics@j7DA2J3speSaBsZAV4M0v.md │ │ │ │ │ ├── dispersion@2ldO-_ZnIg364Eo8Jyfgr.md │ │ │ │ │ ├── distribution-space@Fyqg3MRcwY7g-Q3gjiqwK.md │ │ │ │ │ ├── dplyr@v8TfY-b4W5ygOv7r-syHq.md │ │ │ │ │ ├── dplyr@y__UHXe2DD-IB7bvMF1-X.md │ │ │ │ │ ├── exploration@XFnw4_dQYSzm96-srWa7X.md │ │ │ │ │ ├── finding-outliers@-rQ8h_6NFxEOhxXgo7LHo.md │ │ │ │ │ ├── funnel-charts@muFy-C2agCX9vR_NU7UZF.md │ │ │ │ │ ├── ggplot2@E0hIgQEeZlEidr4HtUFrL.md │ │ │ │ │ ├── ggplot2@n3M49lgNPn28hm7kzki-a.md │ │ │ │ │ ├── hadoop@wECWIRMlWNoTxz5eKwaSf.md │ │ │ │ │ ├── handling-missing-data@X9WmfHOks82BIAzs6abqO.md │ │ │ │ │ ├── heatmap@G8resQXEVEHCaQfDlt3nj.md │ │ │ │ │ ├── histograms@FEyBFZLaGJqTC-IUEcOVS.md │ │ │ │ │ ├── hypothesis-testing@Xygwu0m5TeYT6S_8FKKXh.md │ │ │ │ │ ├── if@wME4MSldOWlMB54ekpReS.md │ │ │ │ │ ├── image-recognition@bHPJ6yOHtUq5EjJBSrJUE.md │ │ │ │ │ ├── introduction@3xp2fogAVmwXQhdzhZDWR.md │ │ │ │ │ ├── k-means-clustering@h2xF5bZeUByDgsAi4dga2.md │ │ │ │ │ ├── key-concepts-of-data@R12sArWVpbIs_PHxBqVaR.md │ │ │ │ │ ├── knn@SStzU_iXSvI_9QWbvGNou.md │ │ │ │ │ ├── kurtosis@PqGO8AU1zE2ZdtqrIrOkZ.md │ │ │ │ │ ├── learn-a-programming-lang@i2uEcaO4bJhcZ5ayRs2CQ.md │ │ │ │ │ ├── line-chart@v9T0DX56jFNhUz9nzubzS.md │ │ │ │ │ ├── logistic-regression@ofOQKAIu4rezWmgZeE-KT.md │ │ │ │ │ ├── machine-learning@U55hwR0HRCIz2cveVR8FZ.md │ │ │ │ │ ├── machine-learning@f4GuzeokP9w_gwtOquP0g.md │ │ │ │ │ ├── mapreduce@eAM9orCNwzqh34uvGBVm8.md │ │ │ │ │ ├── matplotlib@tvDdXwaRPsUSTqJGaLS3P.md │ │ │ │ │ ├── matplotlib@uGkXxdMXUMY-3fQFS1jK8.md │ │ │ │ │ ├── mean@923KGEUG9ofBm7dYkkrxz.md │ │ │ │ │ ├── median@qdXoikVh2xkJkOQNKcyvb.md │ │ │ │ │ ├── min--max@F3-cr5onkWqKKPRdxu8lV.md │ │ │ │ │ ├── mode@fY8zVG2tVbmtx5OhY7hj-.md │ │ │ │ │ ├── model-evaluation-techniques@7ikA373qH88HBx5irCgIH.md │ │ │ │ │ ├── mpi@fqCAH4Enc4AAJHoSkk2Pe.md │ │ │ │ │ ├── naive-byes@zbUw5PyVsdccbgDTRHg7d.md │ │ │ │ │ ├── natural-language-processing@DFv-eiYDicF4cA4jgVk9_.md │ │ │ │ │ ├── neural-networks@gGHsKcS92StK5FolzmVvm.md │ │ │ │ │ ├── pandas@8OXmF2Gn6TYJotBRvDjqA.md │ │ │ │ │ ├── pandas@TucngXKNptbeo3PtdJHX8.md │ │ │ │ │ ├── parallel-processing@Fwwve0j-KDfc605IIgmil.md │ │ │ │ │ ├── pie-charts@K9xwm_Vpdup9ujYqlD9F3.md │ │ │ │ │ ├── pivot-tables@2DDJUFr0AJTVR2Whj8zub.md │ │ │ │ │ ├── power-bi@SJLeose5vZU8w_18C8_t0.md │ │ │ │ │ ├── predictive-analytics@3WZORRCwme3HsaKew23Z5.md │ │ │ │ │ ├── prescriptive-analytics@DFMR-0MbmVCCrJu0I9JWG.md │ │ │ │ │ ├── pytorch@LJSqfz6aYJbCe_bK8EWI1.md │ │ │ │ │ ├── r@g_EBQizZsIe-vn8ir6FTv.md │ │ │ │ │ ├── range@tSxtyJhL5wjU0XJcjsJmm.md │ │ │ │ │ ├── regression@lTycWscyFPi-BtkNg9cdm.md │ │ │ │ │ ├── reinforcement-learning@XdBwqLoYYiLJNlWPBEDUj.md │ │ │ │ │ ├── removing-duplicates@Xltm7B-8TZ1-igLjVJXoR.md │ │ │ │ │ ├── replace--substitute@dke_pySrqYZZ7K3rprnIT.md │ │ │ │ │ ├── rnn@Gocm98_tRg5BGxKcP-7zg.md │ │ │ │ │ ├── scatter-plot@A5YQv7D4qRcskdZ64XldH.md │ │ │ │ │ ├── seaborn@-cJb8gEBvdVFf7FlgG3Ud.md │ │ │ │ │ ├── skewness@VfcCRRqwLxkYpIX0ZKNNX.md │ │ │ │ │ ├── spark@vaiigToDh4522rtWamuSM.md │ │ │ │ │ ├── stacked-charts@329BrtmXjXNLfi1SFfdeo.md │ │ │ │ │ ├── standard-deviation@MXIP8ekH4YtczODKM_G_l.md │ │ │ │ │ ├── statistical-analysis@2pUq-7hu5EjGpowz98YoV.md │ │ │ │ │ ├── statistical-analysis@TeewVruErSsD4VLXcaDxp.md │ │ │ │ │ ├── sum@_FO80Cm2iAD_bThmnsEgp.md │ │ │ │ │ ├── supervised-learning@FIYCkGXofKMsXmsqHSMh9.md │ │ │ │ │ ├── tableau@Sz2Y8HLbSmDjSKAJztDql.md │ │ │ │ │ ├── tensorflow@FJ4Sx477FWxyDsQr0R8rl.md │ │ │ │ │ ├── trim@D5Q6o6ydr1j51kB0ASFPE.md │ │ │ │ │ ├── types-of-data-analytics@Lsapbmg-eMIYJAHpV97nO.md │ │ │ │ │ ├── unsupervised-learning@FntL9E2yVAYwIrlANDNKE.md │ │ │ │ │ ├── upper--lower--proper@YReKRRgE_2dWfGGdBQqbf.md │ │ │ │ │ ├── variance@ict4JkoVM-AzPbp9bDztg.md │ │ │ │ │ ├── visualisation@jowh4CFLQiFzKaaElyCuQ.md │ │ │ │ │ ├── visualizing-distributions@mCUW07rx74_dUNi7OGVlj.md │ │ │ │ │ ├── vlookup--hlookup@9sIP-jpNjtA1JPCBjTf-H.md │ │ │ │ │ ├── web-scraping@qQ64ZhSlbbWu9pP8KTE67.md │ │ │ │ │ └── what-is-data-analytics@yCnn-NfSxIybUQ2iTuUGq.md │ │ │ │ ├── data-analyst.json │ │ │ │ ├── data-analyst.md │ │ │ │ ├── faqs.astro │ │ │ │ └── migration-mapping.json │ │ │ ├── data-engineer/ │ │ │ │ ├── content/ │ │ │ │ │ ├── ab-testing@5qe0q_llTzzNVudbONMYo.md │ │ │ │ │ ├── amazon-ec2--compute@AHLsBfPfBJOhLlJ-64GcK.md │ │ │ │ │ ├── amazon-rds-database@GtFk7phYGfXUhxanicYNQ.md │ │ │ │ │ ├── amazon-rds-database@nD36-PXHzOXePM7j9u_O_.md │ │ │ │ │ ├── amazon-redshift@omrg8QcYmTdQLBKV47b7o.md │ │ │ │ │ ├── apache-airflow@vfO5Dz6ppsNtbGiQwpUs7.md │ │ │ │ │ ├── apache-hadoop-yarn@pjm_qShAiFk3JsX4Z2d8G.md │ │ │ │ │ ├── apache-kafka@fTpx6m8U0506ZLCdDU5OG.md │ │ │ │ │ ├── apache-spark@qHMtJFYcGmESiz_VwRwiI.md │ │ │ │ │ ├── apis@cxTriSZvrmXP4axKynIZW.md │ │ │ │ │ ├── argocd@PUzHbjwntTSj1REL_dAov.md │ │ │ │ │ ├── async-vs-sync-communication@VefHaP7rIOcZVFzglyn66.md │ │ │ │ │ ├── aurora-db@YZ4G1-6VJ7VdsphdcBTf9.md │ │ │ │ │ ├── authentication-vs-authorization@HDVhttLNMLmIAVEOBCOQ3.md │ │ │ │ │ ├── aws-cdk@OKJ3HTfreitk2JdrfeLIK.md │ │ │ │ │ ├── aws-eks@eVqcYI2Sy2Dldl3SfxB2C.md │ │ │ │ │ ├── aws-sns@uFeiTRobSymkvCinhwmZV.md │ │ │ │ │ ├── aws-sqs@uIU5Yncp6hGDcNO1fpjUS.md │ │ │ │ │ ├── azure-blob-storage@gzbEGCUwMsD1gL4nW668g.md │ │ │ │ │ ├── azure-sql-database@iIZ3g70KRwEJCBNaONd2d.md │ │ │ │ │ ├── azure-virtual-machines@-yi-xk-kv0njW9GdytiAQ.md │ │ │ │ │ ├── batch@f-a3Hy1ldnvSv8W2mFiJK.md │ │ │ │ │ ├── best-practices@yyJJGinOv3M21MFuqJs0j.md │ │ │ │ │ ├── big-data-tools@03BHmPhYkZrJwRvQdmxxr.md │ │ │ │ │ ├── bigtable@ltZftFsiOo12AkQ-04N3B.md │ │ │ │ │ ├── business-intelligence@zA5QqqBMsqymdiPGFdUnt.md │ │ │ │ │ ├── cap-theorem@AslPFjoakcC44CmPB5nuw.md │ │ │ │ │ ├── cassandra@QYR8ESN7xhi4ZxcoiZbgn.md │ │ │ │ │ ├── census@vZGDtlyt_yj4szcPTw3cv.md │ │ │ │ │ ├── choosing-the-right-technologies@_MpdVlvvkrsgzigYMZ_P8.md │ │ │ │ │ ├── cicd@k2SJ4ELGa4B2ZERDAk1uj.md │ │ │ │ │ ├── circle-ci@CewITBPtfVs32LD5Acb2E.md │ │ │ │ │ ├── cloud-architectures@YLfyb_ycgz1hu0yW8SPNE.md │ │ │ │ │ ├── cloud-computing@lDeSL9qvgQgyAMcWXF7Fr.md │ │ │ │ │ ├── cloud-sql-database@9-wQWQIdAxQmMaJC9ojPg.md │ │ │ │ │ ├── cluster-computing-basics@hB0y8A2U3owpAbTUb7LN5.md │ │ │ │ │ ├── cluster-management-tools@wpZfbIFtfiUSLMASk4t7f.md │ │ │ │ │ ├── column@fBD6ZQoMac8w4kMJw_Jrd.md │ │ │ │ │ ├── compute-engine-compute@-cU86vJWJmlmPHXDCo31o.md │ │ │ │ │ ├── containers--orchestration@eTHitN2erd6z8-MZiXE9s.md │ │ │ │ │ ├── cosmosdb@goL_GqVVTVxXQMGBw992b.md │ │ │ │ │ ├── couchdb@-IesOBWPSIlbgvTjBqHcb.md │ │ │ │ │ ├── data-analytics@V30v5RLQrWSMBUIsZQG1o.md │ │ │ │ │ ├── data-collection-considerations@wDDWQgMVBYK4WcmHq_d6l.md │ │ │ │ │ ├── data-engineering-lifecycle@Ouph2bHeLQsrHl45ar4Cs.md │ │ │ │ │ ├── data-engineering-lifecycle@w3cfuNC-IdUKA7CEXs0fT.md │ │ │ │ │ ├── data-engineering-vs-data-science@jJukG4XxfFcID_VlQKqe-.md │ │ │ │ │ ├── data-fabric@-x3QLMYhC67VJQ6EW6BrJ.md │ │ │ │ │ ├── data-factory-etl@BNGdJSmrNE90rwPa4JoWj.md │ │ │ │ │ ├── data-generation@AWf1y87pd1JFW71cZ_iE1.md │ │ │ │ │ ├── data-hub@OiWleAdMbPtisrJpk2eSJ.md │ │ │ │ │ ├── data-ingestion@CvCOkyWcgzaUJec_v5F4L.md │ │ │ │ │ ├── data-interoperability@ghAbtfB5KtbboNjijL1Zf.md │ │ │ │ │ ├── data-lake@y0Lxz_wVyQ6lr1hvCsufa.md │ │ │ │ │ ├── data-lineage@pKewO7Ef3GBXL4MDK62QG.md │ │ │ │ │ ├── data-mart@c6Pf3kFcC4iV4a7mPc-WH.md │ │ │ │ │ ├── data-masking@2Wu1Ufm2l1nrytz1mAxmJ.md │ │ │ │ │ ├── data-mesh@D7qtosIbsQuIY3OWl_Hwc.md │ │ │ │ │ ├── data-modelling-techniques@SlQHO8n97F7-_fc6EUXlj.md │ │ │ │ │ ├── data-normalization@kVPEoUX-ZAGwstieD20Qa.md │ │ │ │ │ ├── data-obfuscation@rUiYUV4ps6NYYYRwUnjuM.md │ │ │ │ │ ├── data-pipelines@fqTPu70MJyXBmqYUgCJ_r.md │ │ │ │ │ ├── data-quality@cStrYgFZA2NuYq8TdWWP_.md │ │ │ │ │ ├── data-quality@iuNP6W0A2GLTE2PK5y68u.md │ │ │ │ │ ├── data-serving@RspQLpkICyHUmthLlxQ84.md │ │ │ │ │ ├── data-storage@wydtifF3ZhMWCbVt8Hd2t.md │ │ │ │ │ ├── data-structures-and-algorithms@fqmn6DPOA5MH7UWYv6ayn.md │ │ │ │ │ ├── data-warehouse@ArOoKuf9scAURs8NRjAru.md │ │ │ │ │ ├── data-warehousing-architectures@J854xPM1X0BWlhtJw7Hs_.md │ │ │ │ │ ├── database-fundamentals@g4UC0go7OPCJYJlac9w-i.md │ │ │ │ │ ├── database@qRHeaD2udDaItAxmiIiUg.md │ │ │ │ │ ├── databricks-delta-lake@fhfyoWekmYvEs-jdP2mJo.md │ │ │ │ │ ├── datadog@Zoa4JEGrSKjVwUNer4Go1.md │ │ │ │ │ ├── dataflow@YWgVUyIvBRW8eTVR5y73P.md │ │ │ │ │ ├── dbt@SgYLIkMtLVPlw8Qo5j0Fb.md │ │ │ │ │ ├── declarative-vs-imperative@GyC2JctG-Gi0R_qx1lTeg.md │ │ │ │ │ ├── distributed-file-systems@1LLF4466grFDlT9p_WLsi.md │ │ │ │ │ ├── distributed-systems-basics@c1dadtQgbqXwcsQhI6de0.md │ │ │ │ │ ├── docker@OQ3RqVgWEMxpAtrrjOG5U.md │ │ │ │ │ ├── document@sGkAOVl3C-xIIAdtDH9jq.md │ │ │ │ │ ├── dynamodb@BDfpCDOxXZ-Tp0Abj_CVW.md │ │ │ │ │ ├── ecpa@g1VwuSupohuDAT2O4hTXx.md │ │ │ │ │ ├── elasticsearch@_F53cV3ln2yu0ics5BFfx.md │ │ │ │ │ ├── encryption@2PqRgrYuJi_pPhOS0AkoP.md │ │ │ │ │ ├── end-to-end-testing@mC9sWeC_wYHeJJHJAvxpI.md │ │ │ │ │ ├── environmental-management@WUfJCLTajyLNK19gAAvoW.md │ │ │ │ │ ├── etl-vs-reverse-etl@LMFREK9dH_7qzx_s2xCjI.md │ │ │ │ │ ├── eu-ai-act@tdqhFFvQ2dQVeQh1qTHjV.md │ │ │ │ │ ├── extract-data@nShDMih1HmubBczxu4cfU.md │ │ │ │ │ ├── functional-testing@E4ND5XaMDGDLtlV7wTzi6.md │ │ │ │ │ ├── gdpr@MuPHohc7mJzcH5QdJ-K46.md │ │ │ │ │ ├── git-and-github@02TADW_PPVtTU_rWV3jf1.md │ │ │ │ │ ├── github-actions@N8vpCfSdZCADwO_qceWBK.md │ │ │ │ │ ├── gitlab-ci@IYIO4S3DO5xkLD__XT5Dp.md │ │ │ │ │ ├── glue-etl@nD36-PXHzOXePM7j9u_O_.md │ │ │ │ │ ├── go@4z2i5NXTo9h3YY0kJvRrz.md │ │ │ │ │ ├── google-bigquery@Je2in1n8bMaknyeH79Zbv.md │ │ │ │ │ ├── google-cloud-gke@8qEgXYZEbDWC73SQSflDY.md │ │ │ │ │ ├── google-cloud-storage@2lqvArZdwRX0t3P3yovEH.md │ │ │ │ │ ├── google-deployment--mgr@1A98uTo8l_GQSrFxu5N2X.md │ │ │ │ │ ├── graph@W6RnhoD7fW2xzVwnyJEDr.md │ │ │ │ │ ├── hbase@Uho9OOWSG0bUpyH4P6hKk.md │ │ │ │ │ ├── hdfs@0pH2U4GOj8zK3lgkh_r5M.md │ │ │ │ │ ├── hdfs@9lSjQBM2hWrkujxZjhQHE.md │ │ │ │ │ ├── hightouch@8NTe5-XQ5tKAWUyg1rnzb.md │ │ │ │ │ ├── horizontal-vs-vertical-scaling@k_XSLLwb0Jk0Dd1sw-MpR.md │ │ │ │ │ ├── hybrid@4fugNG5sEDl0kgmN3Mezk.md │ │ │ │ │ ├── idempotency@9xoBZgKT9uAGsjc1soelY.md │ │ │ │ │ ├── indexing@ilbFKqhfYyykjJ7cOngwx.md │ │ │ │ │ ├── infrastructure-as-code---iac@jgz7L8OSuqRNcf9buuMTj.md │ │ │ │ │ ├── integration-testing@NIG53tyoEiLtwf6LvBZId.md │ │ │ │ │ ├── introduction@WSYIFni7G2C9Jr0pwuami.md │ │ │ │ │ ├── iot@KeGCHoJRHp-mBX-P5to4Y.md │ │ │ │ │ ├── java@LZ4t8CoCjGWMzE0hScTGZ.md │ │ │ │ │ ├── job-scheduling@ccc6_SzDwXpCL1WbFuPNA.md │ │ │ │ │ ├── key-value@fSlBjoNVKstJjWO7rS69V.md │ │ │ │ │ ├── kubernetes@I_IueX1DFp-LmBwr1-suX.md │ │ │ │ │ ├── kubernetes@kcgDW6AFW7WXzXMTPE6J-.md │ │ │ │ │ ├── learn-sql@2rRVWPON-o3MvpgZmrU_A.md │ │ │ │ │ ├── linux-basics@FXQ_QsljK59zDULLgTqCB.md │ │ │ │ │ ├── load-data@y5Aaxe-P68HC5kNsIi88q.md │ │ │ │ │ ├── load-testing@qoMRpAITA7R_KOrwGDPAb.md │ │ │ │ │ ├── logs@s-wUPMaagyRupT2RdfHks.md │ │ │ │ │ ├── looker@fY0eZzz0aTXm2lelk8l3g.md │ │ │ │ │ ├── luigi@_IiKTZDF_b57l79X6lsq6.md │ │ │ │ │ ├── machine-learning@S8XMtFKWlnUqADElFp0Zw.md │ │ │ │ │ ├── mapreduce@__tWu5uZYnmnuR-qO9SOR.md │ │ │ │ │ ├── mariadb@p7S_6O9Qq722r-F4bl6G3.md │ │ │ │ │ ├── memcached@KYUh29Ok1aeOviboGDS_i.md │ │ │ │ │ ├── messages-vs-streams@IZvL-1Xi0R9IuwJ30FDm4.md │ │ │ │ │ ├── messaging-systems@dAvizeYvv92KMeAvSDmey.md │ │ │ │ │ ├── metadata-first-architecture@14CycunRC1p2qTRn-ncoy.md │ │ │ │ │ ├── metadata-management@a5gzM8msXibxD58eVDkM-.md │ │ │ │ │ ├── microsoft-power-bi@6Nr5FAGT_oOPZwZWdv7hl.md │ │ │ │ │ ├── mlops@VQv-c7buU2l-IDzRZBMRo.md │ │ │ │ │ ├── mobile-apps@dJZqe47kzRqYIG-4AZTlz.md │ │ │ │ │ ├── mongodb@04V0Bcgjusfqdw0b-Aw4W.md │ │ │ │ │ ├── monitoring@dk5FQl7Pk3-O5eF7dKwmp.md │ │ │ │ │ ├── ms-sql@YxnIQh6Y5ic795-YsajB8.md │ │ │ │ │ ├── mysql@_bFj6rbLuqeQB5MjJZpd6.md │ │ │ │ │ ├── neo4j@TG63YRbSKL1F9vlUVF1VY.md │ │ │ │ │ ├── neptune@atAK4zGXIbxZvfBTzFEIe.md │ │ │ │ │ ├── networking-fundamentals@cgkzFMmQils2sYj4NW8VW.md │ │ │ │ │ ├── new-relic@r1KmASWAa_MOqQOC9gvvF.md │ │ │ │ │ ├── nosql-databsases@uZYQ8tqTriXt_JIOjcM9_.md │ │ │ │ │ ├── oltp-vs-olap@-VQQmIUGesnrT1N6kH5et.md │ │ │ │ │ ├── onehouse@senZEYC9k-C_C4EAYDNeU.md │ │ │ │ │ ├── opentofu@WdlC0HhJ5YESfjXmdMnLU.md │ │ │ │ │ ├── oracle@PJcxM60h85Po0AAkSj7nr.md │ │ │ │ │ ├── perfect@TAh4__7U58J7fduU9a1Ol.md │ │ │ │ │ ├── postgresql@__JFgwxeDLvz8p7DAJnsc.md │ │ │ │ │ ├── programming-skills@_2Ofq3Df-VRXDgKyveZ0U.md │ │ │ │ │ ├── prometheus@3QsgoKKxAoyj2LWJ8ad-7.md │ │ │ │ │ ├── python@ILs5azr4L_uLK0CDFKVaz.md │ │ │ │ │ ├── rabbitmq@ERcgPTACqYo9BXoRdLjbd.md │ │ │ │ │ ├── realtime@oqxNr0Lj34mgRi5Z5wJt_.md │ │ │ │ │ ├── redis@dW_eC4vR8BrvKG9wxmEBc.md │ │ │ │ │ ├── relational-databases@cslVSSKBMO7I6CpO7vG1H.md │ │ │ │ │ ├── reusability@Rzk6HlMosx3FN_JD5kELZ.md │ │ │ │ │ ├── reverse-etl-usecases@mBOGrJIUaatBe2PnJM2NK.md │ │ │ │ │ ├── reverse-etl@JpuiYsipNWBcrjmn2ji6b.md │ │ │ │ │ ├── s3-storage@tbut25IZI2aU7TkI9fFYV.md │ │ │ │ │ ├── scala@WHJXJ5ukJd-tK_3LFLJBg.md │ │ │ │ │ ├── segment@8vqjI-uFwJIr_TBEVyM_3.md │ │ │ │ │ ├── sentry@i54fx-NV6nWzQVCdi0aKL.md │ │ │ │ │ ├── serverless-options@ZnGX8pg4GagdSalg_P0oq.md │ │ │ │ │ ├── skills-and-responsibilities@3BxbkrBp8veZj38zdwN8s.md │ │ │ │ │ ├── slowly-changing-dimension---scd@5KgPfywItqLFQRnIZldZH.md │ │ │ │ │ ├── smoke-testing@woa5K4Dt9L6aBzlJMNS31.md │ │ │ │ │ ├── snowflake@Pf0_CBGkmSEfWDQ2_iFXr.md │ │ │ │ │ ├── snowflake@W3l1_66fsIqR3MqgBJUmU.md │ │ │ │ │ ├── sources-of-data@zGKTlMUzhrbVbqpLZBsMZ.md │ │ │ │ │ ├── star-vs-snowflake-schema@OfH_UXnxvGQgwlNQwOEfS.md │ │ │ │ │ ├── streaming@wwPO5Uc6qnwYgibrbPn7y.md │ │ │ │ │ ├── streamlit@FfU6Vwf0PXva91FoqxFgp.md │ │ │ │ │ ├── tableu@gqEAOwHFrQiYSejNUdV7-.md │ │ │ │ │ ├── terraform@N-xRhdOTHijAymcTWPXPJ.md │ │ │ │ │ ├── testing@DZoxLu-j1vq5leoXLRZqt.md │ │ │ │ │ ├── tokenization@ZAKo9Svb8TQ6KkmOnfB5x.md │ │ │ │ │ ├── transactions@1BJGXWax6CONuFkaYR4Jm.md │ │ │ │ │ ├── transform-data@TjsxMNyWO3YGwg6zEIid4.md │ │ │ │ │ ├── types-of-data-ingestion@GN1Xh3kA25ge-wTbdiSio.md │ │ │ │ │ ├── unit-testing@8dXD4ddR_USEbAJhUMcB6.md │ │ │ │ │ ├── what-and-why-use-them@1qju7UlcMo2Ebp4a3BGxH.md │ │ │ │ │ ├── what-is-cluster-computing@Ad10evrGQuYRl5GaMhQwu.md │ │ │ │ │ ├── what-is-data-engineering@WB2PRVI9C6RIbJ6l9zdbd.md │ │ │ │ │ ├── what-is-data-warehouse@dc3lJI27hJ3zZ45UCVqM1.md │ │ │ │ │ └── yarn@KcW4z48pk2x6IjQhZs_Ub.md │ │ │ │ ├── data-engineer.json │ │ │ │ ├── data-engineer.md │ │ │ │ └── faqs.astro │ │ │ ├── datastructures-and-algorithms/ │ │ │ │ ├── content/ │ │ │ │ │ ├── 2-3-trees@o0fNAhJ1LsCdmGzY2ni_x.md │ │ │ │ │ ├── a-algorithm@AabJqPUwFVBVS02YPDPvL.md │ │ │ │ │ ├── advanced-data-structures@KnyUHDvpDTUO0EkAs9pT8.md │ │ │ │ │ ├── algorithmic-complexity@VotdHk0_bI3CeoIf-KoKu.md │ │ │ │ │ ├── array@lxY3ErxJ_D3zkSAXIBUpv.md │ │ │ │ │ ├── asymptotic-notation@v0LrabYYOKzV4oCXOK2Rs.md │ │ │ │ │ ├── avl-trees@5MCgKpylPzDZaGBEUU51r.md │ │ │ │ │ ├── b-trees@2F6BcbAzICynOK3oEj-Is.md │ │ │ │ │ ├── backtracking@mKoC5o__gLSTjAlq8iXkV.md │ │ │ │ │ ├── basic-data-structures@iTlpa9A7h33FkUAv0UaVZ.md │ │ │ │ │ ├── bb-trees@2G6vn7K11_mPQQ7_IXJ96.md │ │ │ │ │ ├── bellman-ford-algoritm@7CgGwdwHnOmISmEPtJegN.md │ │ │ │ │ ├── big--notation@CkUi93TvTkEm2_isHNvqr.md │ │ │ │ │ ├── big--notation@Ex6tzu6gwrarWm1CNFufO.md │ │ │ │ │ ├── big-o-notation@oylTfop_JDPHJ3jYuA2Nq.md │ │ │ │ │ ├── binary-search-trees@UYm7unZfXd9Ge5EYV4odb.md │ │ │ │ │ ├── binary-search@Wt74MRKaZcs8lYvfqjffT.md │ │ │ │ │ ├── binary-trees@RPU5CGp2Li5lk0UB-zNHT.md │ │ │ │ │ ├── breadth-first-search@c7LdXJPv-5M-NPKSCXYuB.md │ │ │ │ │ ├── breadth-first-search@pfg-qclOpvlsGMdlZ1aoj.md │ │ │ │ │ ├── brute-force@5T2y6Iqi-I_zOtLkeSPzY.md │ │ │ │ │ ├── bubble-sort@zUDKCJCQHLW4c_6A349R3.md │ │ │ │ │ ├── c@BZvNEZjCNuHPg5SkX90bt.md │ │ │ │ │ ├── c@IWmq4UFB5j6O3UJfarh1u.md │ │ │ │ │ ├── common-runtimes@nqnO1Wz3gYIMR98_BnF2V.md │ │ │ │ │ ├── complex-data-structures@kSpgFuAHyzySWlGBLOHZR.md │ │ │ │ │ ├── constant@_bpV8MkVOY8ZatTXYaEE4.md │ │ │ │ │ ├── control-structures@G74Xp8_EMZO2oEzNTRAli.md │ │ │ │ │ ├── cyclic-sort@L1FIJAluyxG6CGaVLM20O.md │ │ │ │ │ ├── depth-first-search@NrPO7vF8Z1WzmA9Ca3Y_E.md │ │ │ │ │ ├── depth-first-search@gR8KcOIADUxS8hdiEaGZy.md │ │ │ │ │ ├── dijkstras-algorithm@87UugvReiywF0E7Acos9U.md │ │ │ │ │ ├── directed-graph@XVw2_dL3uN0SOWmjH1Uao.md │ │ │ │ │ ├── disjoint-set-union-find@La8XAT0BWvqRCrvQxtZIp.md │ │ │ │ │ ├── divide-and-conquer@xchWhsizaKgYuHPC4Tz9H.md │ │ │ │ │ ├── dynamic-programming@jKAZNybU9cxufNBdFsqsP.md │ │ │ │ │ ├── edabit@8-7phxPp1D1mv2yubpLBo.md │ │ │ │ │ ├── exponential@xqzaYJBvlsNtT6qZ59ktv.md │ │ │ │ │ ├── factorial@wclY3cmt1fBNYjLsmijdW.md │ │ │ │ │ ├── fast-and-slow-pointers@J_No8GTa92DcwPtua30wL.md │ │ │ │ │ ├── fenwick-trees@V9SWO58kaMsU1NT7q26WG.md │ │ │ │ │ ├── functions@Cu08m5JOfvrPUDGony144.md │ │ │ │ │ ├── go@OkdM_PJge70j5tsjT2Esl.md │ │ │ │ │ ├── graph-data-structures@j_r1tB16bA7R3yDAWN7Oj.md │ │ │ │ │ ├── greedy-algorithms@qUlqyTjk3XKF9DEm6Lsgb.md │ │ │ │ │ ├── hash-tables@kSy-8ubESdmIX4Fyl8TSu.md │ │ │ │ │ ├── heap-sort@yMv9Oa3hsgT8Adx6m_rdL.md │ │ │ │ │ ├── heap@R3Coq0TG1_cSOXzXWgpuI.md │ │ │ │ │ ├── how-to-calculate-complexity@HosRc0hczubBHrWxCzEJj.md │ │ │ │ │ ├── in-order-traversal@iCA7UKZih4ItDmDNEC8Q-.md │ │ │ │ │ ├── indexing@Ar7GEGfI9O_dLPbIEVhF_.md │ │ │ │ │ ├── insertion-sort@liJfTV5ajAFZcfwBdVGpU.md │ │ │ │ │ ├── isam@uxErZ4gLeKqwhrUG88InQ.md │ │ │ │ │ ├── island-traversal@q9qLI6HzOJ0vYaIVrZ5CU.md │ │ │ │ │ ├── java@gjZZOwmYkXQHPfg9Ynz80.md │ │ │ │ │ ├── javascript@HVD9G3JlLBsAg111vQILj.md │ │ │ │ │ ├── kruskals-algorithm@F3bPbwIdCNMzL7QXEYJK3.md │ │ │ │ │ ├── kth-element@JcchUF_U99zkFpXp3VT2R.md │ │ │ │ │ ├── language-syntax@kE6qddRhO8C5ur3JbeuhF.md │ │ │ │ │ ├── leetcode@waM_j5mbe_XoA7h8u4vFN.md │ │ │ │ │ ├── linear-search@AtX-PeI8nY4-5bA-xLla0.md │ │ │ │ │ ├── linear@4noav5w_8GrMTXN1Lxm5h.md │ │ │ │ │ ├── linear@HOpL-4jYhOe0LNrrkPrET.md │ │ │ │ │ ├── linked-lists@bRu9u8pEAQ1TmKygjIjyI.md │ │ │ │ │ ├── logarithmic@Cnceet0yroFHzn8npAir8.md │ │ │ │ │ ├── merge-intervals@S2mBvlFTd673XcXxisD5P.md │ │ │ │ │ ├── merge-sort@k0UBAj3hOYab4mUziOYyW.md │ │ │ │ │ ├── minimum-spanning-tree@Ktqau1VkVrnnVYByqcacM.md │ │ │ │ │ ├── multi-threaded@gaaRAL3HR48Qj9rz1CkDU.md │ │ │ │ │ ├── oop-basics@QFR1FMOf2OV3n3jcDnOCP.md │ │ │ │ │ ├── pick-a-language@Z4uVzAoNzcAkyjd-lp3_M.md │ │ │ │ │ ├── platforms-to-practice@VMV4F-SPKWn9CtpHXEjeN.md │ │ │ │ │ ├── polynomial@QKhmM_IG1FkBudfdrf1aT.md │ │ │ │ │ ├── post-order-traversal@j6_DyKiyG1wBuygQkxWB7.md │ │ │ │ │ ├── pre-order-traversal@BMEoO65zsX51H4Js1gcWI.md │ │ │ │ │ ├── prims-algorithm@yEWnYjW0ZLVhsLc9rH4ae.md │ │ │ │ │ ├── problem-solving-techniques@Y1Uz6XRbR1YqFtO4akiPA.md │ │ │ │ │ ├── programming-fundamentals@ebQdTOAOV54WBToHmFtBk.md │ │ │ │ │ ├── pseudo-code@tvy3Vic8Vp-Ie2x_OyZ5b.md │ │ │ │ │ ├── python@XyRCXhZjQFcDNaUSNNQV-.md │ │ │ │ │ ├── queues@v0phjC75jhmE1z-f9ZMck.md │ │ │ │ │ ├── quick-sort@LgEV0Wm4avrOqR8bV5GXW.md │ │ │ │ │ ├── randomised-algorithms@RiS8KZs3YBE6mKWPHszMp.md │ │ │ │ │ ├── recursion@4ZAzcwP0oPGZ9Rw042V8-.md │ │ │ │ │ ├── ruby@9h1mz0xAUvPrnRm9VndJF.md │ │ │ │ │ ├── rust@acgRMEuL4ZGGRHpZ7kXSo.md │ │ │ │ │ ├── search-algorithms@LW5HZMca4lvhbbA8KYaOa.md │ │ │ │ │ ├── search-algorithms@YJsAQWJpLwVN6oCxNwNAn.md │ │ │ │ │ ├── search-algorithms@z_Cf_alLAYSCyYtNviRcO.md │ │ │ │ │ ├── segment-trees@iFNS3x9wVRIjpixct6H7x.md │ │ │ │ │ ├── selection-sort@SMgBHvqXLD6Cgr2nix4wR.md │ │ │ │ │ ├── shortest-path-algorithms@N-qvYirxpORcaTslvlOL0.md │ │ │ │ │ ├── skip-list@TQu-OBpvR-aQfMByUcwyM.md │ │ │ │ │ ├── sliding-window-technique@gbHVR-ojRxv9I0E5eSlWy.md │ │ │ │ │ ├── sorting-algorithms@WzFkdkcbL8ea9DBkjfSwa.md │ │ │ │ │ ├── stacks@jvKRykGNy140FlquF2fcK.md │ │ │ │ │ ├── suffix-trees-and-arrays@zprVkxpojaxNo0LQar3Ex.md │ │ │ │ │ ├── time-vs-space-complexity@unaYmPzK761Eh_iZMLeRC.md │ │ │ │ │ ├── tree-based@ZXUfeyfC5oSKkGktXuK8t.md │ │ │ │ │ ├── tree-data-structures@r2Jagzbx0qOG-VtxBY-mz.md │ │ │ │ │ ├── tree-traversal@2Od5lNc6fCM6Gyj_axj4n.md │ │ │ │ │ ├── trie@zy3wpb1MjizfUfx9_rZy2.md │ │ │ │ │ ├── two-heaps@MGb8ufztTK75aXAyEAuaf.md │ │ │ │ │ ├── two-pointer-technique@itvhUXbe9dr9JN5ga2jYy.md │ │ │ │ │ ├── undirected-graph@VnKm_j7McUW9Lo0iKyPUp.md │ │ │ │ │ ├── what-are-data-structures@jvWuYXWRtt_ePawc4q1Tg.md │ │ │ │ │ └── why-are-data-structures-important@8_GkF9zhRL8tvT2qu-bGj.md │ │ │ │ ├── datastructures-and-algorithms.json │ │ │ │ ├── datastructures-and-algorithms.md │ │ │ │ ├── faqs.astro │ │ │ │ └── migration-mapping.json │ │ │ ├── design-system/ │ │ │ │ ├── content/ │ │ │ │ │ ├── ab-tests--experiments@ILRDAnpfGHCZq-FBlbfDO.md │ │ │ │ │ ├── accessibility-testing@yhP8EhyCWWRBLkYPyOFeg.md │ │ │ │ │ ├── accessibility@DhrnZwQODG0P7D-27_3ec.md │ │ │ │ │ ├── accessibility@aLtOGjNFxaRzg0PI-ed99.md │ │ │ │ │ ├── accessibility@fW0cEy2SB0HDbiF7QA7Ev.md │ │ │ │ │ ├── avatar@_dIMuXWI73ogboGjnLIpT.md │ │ │ │ │ ├── avatar@h3TZY1yBkzLYUK6W7K7xs.md │ │ │ │ │ ├── badge@LNsXQI8sE_5kzSD_iMLJA.md │ │ │ │ │ ├── badges@UG4AIgJBfZpuhia4Y1K5v.md │ │ │ │ │ ├── banner@kkqRIgdXWaJbX9CjLpwha.md │ │ │ │ │ ├── banners@5DUobzueMZbScyTZTHpCS.md │ │ │ │ │ ├── breakpoints@djwnJq9Y_Hx1Ynw01wr_u.md │ │ │ │ │ ├── button@LWihkf4q5UawjLd84KQxN.md │ │ │ │ │ ├── buttons@s6oqvHgwK4Cwyx-JENBbY.md │ │ │ │ │ ├── card@rZ7d1C9swiqlRTbdJLZ0R.md │ │ │ │ │ ├── cards@yLLAUGbGUHBTEDkZNK0fm.md │ │ │ │ │ ├── carousel@yWEXfjzuzk99dxjZlG4Cq.md │ │ │ │ │ ├── code-style@zEqFAuH9zmKTLwwgx54pW.md │ │ │ │ │ ├── color@2prUeRYbSJTYjo2quJIKs.md │ │ │ │ │ ├── commit-guidelines@IVYe8oh1IWbUbxMZRxVQA.md │ │ │ │ │ ├── communication-channel@LWrrKrhwXfMDKgbFW5DuO.md │ │ │ │ │ ├── community-meetings@eG8ranXuINtcqWfeMH5GW.md │ │ │ │ │ ├── component-analytics@G8dOkM_4hP7wPF3QJ8y4g.md │ │ │ │ │ ├── component-catalog@VeLiPzbGr22_Mh_8T2Gnf.md │ │ │ │ │ ├── component-library@vJ4WytrzY7j10mo8S3O1u.md │ │ │ │ │ ├── component@97cpJyKBKNAq1P_pQZH-t.md │ │ │ │ │ ├── contribution-guidelines@TiCNCRpMPgZUhn7JdaIZA.md │ │ │ │ │ ├── contribution-guidelines@xJ1LAAhiZvbZOLRVc1HZa.md │ │ │ │ │ ├── creating-core-components@Hw_LQInG6OtSwDXch3Lvg.md │ │ │ │ │ ├── creating-core-components@jggrr5nZOe6FY3ZrZJTOw.md │ │ │ │ │ ├── creating-design-language@JnaNZ9MfMrXQrjW2wABzB.md │ │ │ │ │ ├── dark-mode@kxUnqpydDwB73IwrCPZM0.md │ │ │ │ │ ├── defining-design-tokens@a53cl6ZKvYXxG25Ii2_zu.md │ │ │ │ │ ├── design-editor@ccpT9MPFbc3Ewjm1tFMsZ.md │ │ │ │ │ ├── design-language@fPUuXrlchna3K00KcY4O6.md │ │ │ │ │ ├── design-principles@1RJrMVJf_3clM7E5OML-f.md │ │ │ │ │ ├── design-system-examples@hauTvrBOAHgrUnO_m_kDM.md │ │ │ │ │ ├── design-system-vs-component-library@J5mU0v491qrm-mr1W3Msd.md │ │ │ │ │ ├── documentation@-b4GjLpL_ppDMJSiChTef.md │ │ │ │ │ ├── documentation@k1Lwk_b6cLIeyQwc4RUh1.md │ │ │ │ │ ├── dropdown@MtBSvKoyjdLd6DIdolLRi.md │ │ │ │ │ ├── dropdowns@hzVwLVzAij6TgPTcNHyhv.md │ │ │ │ │ ├── existing-design-analysis@8eWhvW2zDIxMGHaXl0Y9i.md │ │ │ │ │ ├── faqs@cpAeotBxN8BCsU9RqTEue.md │ │ │ │ │ ├── file-formats@-6LPUMRm-SqvRVEWPDFl8.md │ │ │ │ │ ├── forms@5LCMzBnnS206t5EtgaUx8.md │ │ │ │ │ ├── functional-colors@__Pv19gRr2SFknVnfm0Mr.md │ │ │ │ │ ├── governance@kifE3JE2immnU1O3-toZf.md │ │ │ │ │ ├── grid-relation@6Hmj_TeQ563jshqAAl__I.md │ │ │ │ │ ├── grid-relation@Zl7MVllzJgObruYtlibKf.md │ │ │ │ │ ├── grid@8f2V-rM7soorTTvNo5Vcx.md │ │ │ │ │ ├── guidelines@Jab5LO0mGhTy1cU61Catu.md │ │ │ │ │ ├── guidelines@XDfxs5cgjSuTEprZi2Z5b.md │ │ │ │ │ ├── guidelines@eTxhpC3AQIMcUax6WFU9U.md │ │ │ │ │ ├── guidelines@mlBzJ2YvBr9QuOthKdj0p.md │ │ │ │ │ ├── icon@bzY_iXRnotct_WnNRTlbd.md │ │ │ │ │ ├── icons@aak3227IDDJMh0MquQX6m.md │ │ │ │ │ ├── identify-existing-design-process@CnsDoZ3gIaPeNbwHuZXYJ.md │ │ │ │ │ ├── input-checkbox@F5_sxUnnGEdgF6BkA5T5x.md │ │ │ │ │ ├── input-radio@rN-_plAA5FkcQl03wsL18.md │ │ │ │ │ ├── input-switch@NISeaJUlDtQ0kSuyxmrOT.md │ │ │ │ │ ├── input-text@hjiJJg4KNr8lyktFQd868.md │ │ │ │ │ ├── keywords@HDf2L4F1f8uUGpVaf7Y7z.md │ │ │ │ │ ├── list@2T7tiM3Ew3H1U5iJR2TDb.md │ │ │ │ │ ├── loading-indicator@JhnHOMIlU6mQcwvIpErUY.md │ │ │ │ │ ├── logging@xYqDmDpjwkShtL86nt-vY.md │ │ │ │ │ ├── making-a-design-system@dUaoMARPabiD4DRqdkaer.md │ │ │ │ │ ├── making-it-from-existing-design@z5gBy7BjlBKwbYbxXtoDA.md │ │ │ │ │ ├── making-it-from-scratch@-9I3fTpnQlmcZmIIuQiPe.md │ │ │ │ │ ├── microcopy-guidelines@bD-DjUbAA6l2eK1R9ITcK.md │ │ │ │ │ ├── milestones@ruPXxVwmD9vSlS7rBZmA-.md │ │ │ │ │ ├── modal@IjNitkG25vNo30rB4ckNV.md │ │ │ │ │ ├── monochrome-version@Wn8CylBz-hyl9-iXcUVTO.md │ │ │ │ │ ├── naming@wiclAEEYioRgLmXFcKQ4E.md │ │ │ │ │ ├── need-of-design-system@2rlmLn_yQQV-7DpX1qT98.md │ │ │ │ │ ├── open-hours@YWoPoO9IW3vLZyxLL2fnT.md │ │ │ │ │ ├── other@Ia1gYzepJOTvTro961eSj.md │ │ │ │ │ ├── pattern@7xPT8rUX3hjSWbxH_FfQs.md │ │ │ │ │ ├── performance@wFL9axjaPcVvI8XWduxgz.md │ │ │ │ │ ├── performing-a-visual-audit@NKm-gXbt5Y7dDwKVkPHjX.md │ │ │ │ │ ├── pilot@4dzoZmkNHPedgLqLy93t8.md │ │ │ │ │ ├── placement--clearance-guidance@7n61402xwhIgJ7dPHg8q7.md │ │ │ │ │ ├── placement-guidance@7n61402xwhIgJ7dPHg8q7.md │ │ │ │ │ ├── plugins@uO-2O0Jwh_DxrMAB9wxp1.md │ │ │ │ │ ├── pr-templates@wd9ZHZmqV7wbLN-9V4EQy.md │ │ │ │ │ ├── project-management@JfXwzkN29UGz17FYHHE3A.md │ │ │ │ │ ├── readability@L2NHddsv5RGR_BW0I3f4T.md │ │ │ │ │ ├── regional-requirements@pRJ9wEPNfFx_6EYB501vk.md │ │ │ │ │ ├── release-strategy@CfWCQNaCJGL-egRhFhc4B.md │ │ │ │ │ ├── reserved-icons@Y0KxHVrcNGHDao-38Oz3w.md │ │ │ │ │ ├── responsiveness@8YVCtgYRHR3VcpUJXMVwP.md │ │ │ │ │ ├── roadmap@gMrX5600JqFDplriq-eU3.md │ │ │ │ │ ├── select@n1nUkMqGtPobZPJHCvPsk.md │ │ │ │ │ ├── semantic-versioning@ZLt1yJqinC8OSpqucC2dV.md │ │ │ │ │ ├── service-and-health-metrics@5znnOkpf9G9tdiMWB6Rut.md │ │ │ │ │ ├── sizes@w3LS85eFerscaxb2Xp-dP.md │ │ │ │ │ ├── sizing@78RsPhsWpl00AbkwKXUxL.md │ │ │ │ │ ├── small-use-guidance@FA3JsZgNhKrgNHVtVreol.md │ │ │ │ │ ├── spaces@GtLYBPJjdZwG0qgA7erk7.md │ │ │ │ │ ├── spacking@dXaYOwTAnYSlipNEBSV9l.md │ │ │ │ │ ├── stakeholders-involved-in-building@_3_tFOpQisx6DSP4Yc2E2.md │ │ │ │ │ ├── style@SPK1i0XuHpNEWyi1iIxrV.md │ │ │ │ │ ├── tabs@1vYR1EMyZhJA-znxnFBBb.md │ │ │ │ │ ├── terminology@Zspu1SsuTE34PVmYePcs4.md │ │ │ │ │ ├── terminology@de0TKvmFTDmKGZc5X7iFq.md │ │ │ │ │ ├── textarea@iusI39fxcu2rbMXiosaM6.md │ │ │ │ │ ├── ticketing@i39J0fk4DaPeNFIMbH0ap.md │ │ │ │ │ ├── toast@-T7uL6a3lJ5-IIcDaG6IN.md │ │ │ │ │ ├── token@jETJVuS_EczJiQASLqaQr.md │ │ │ │ │ ├── tone-of-voice@fnlVIgsmyxj2UVCCjM-8g.md │ │ │ │ │ ├── tooling-analytics@qiJGYYWL4naJX-MgZA9Ms.md │ │ │ │ │ ├── tooling@jggrr5nZOe6FY3ZrZJTOw.md │ │ │ │ │ ├── tooltip@2oCAzsk_y2Y2oHUi467dp.md │ │ │ │ │ ├── typography@ODQ8zrHc2rsc8PN-APKvz.md │ │ │ │ │ ├── ui-kit@lUObv2N7eH3Jdnwwd5vmI.md │ │ │ │ │ ├── understand-he-basics@uvnV1IjE8RV-FKDxHntUU.md │ │ │ │ │ ├── unit-testing@y8No8I0MltA91j4Q2toT0.md │ │ │ │ │ ├── units@wQbMhC7q3qdKYf_pX5qL4.md │ │ │ │ │ ├── usage-guidance@RmSFwKqL9yXXxGKZusKWX.md │ │ │ │ │ ├── user-onboarding@PlW8mHnOTyYnbtl0zUSG9.md │ │ │ │ │ ├── version-control@CYY6nbQiC2pu5ATWmO6wA.md │ │ │ │ │ ├── vision@cMfsRtvzvDZZJ0TqeUOxm.md │ │ │ │ │ ├── visual-forms@-MrrapoyFWKhSeE2PZ9mb.md │ │ │ │ │ ├── what-is-a-design-system@4PrkkoZ5fY-oow0O-bVhu.md │ │ │ │ │ ├── what-is-atomic-design@6r9XbwlBtHmJrhviG2cTD.md │ │ │ │ │ └── writing-guidelines@toyNbBB5tbyiJZkzuklIv.md │ │ │ │ ├── design-system.json │ │ │ │ ├── design-system.md │ │ │ │ ├── faqs.astro │ │ │ │ └── migration-mapping.json │ │ │ ├── devops/ │ │ │ │ ├── content/ │ │ │ │ │ ├── alibaba-cloud@YUJf-6ccHvYjL_RzufQ-G.md │ │ │ │ │ ├── ansible@h9vVPOmdUSeEGVQQaSTH5.md │ │ │ │ │ ├── apache@0_GMTcMeZv3A8dYkHRoW7.md │ │ │ │ │ ├── application-monitoring@wNguM6-YEznduz3MgBCYo.md │ │ │ │ │ ├── argocd@i-DLwNXdCUUug6lfjkPSy.md │ │ │ │ │ ├── artifact-management@zuBAjrqQPjj-0DHGjCaqT.md │ │ │ │ │ ├── artifactory@C_sFyIsIIpriZlovvcbSE.md │ │ │ │ │ ├── availability@JCe3fcOf-sokTJURyX1oI.md │ │ │ │ │ ├── aws-cdk@XA__697KgofsH28coQ-ma.md │ │ │ │ │ ├── aws-ecs--fargate@FE2h-uQy6qli3rKERci1j.md │ │ │ │ │ ├── aws-lambda@UfQrIJ-uMNJt9H_VM_Q5q.md │ │ │ │ │ ├── aws@1ieK6B_oqW8qOC6bdmiJe.md │ │ │ │ │ ├── azure-functions@mlrlf2McMI7IBhyEdq0Nf.md │ │ │ │ │ ├── azure@ctor79Vd7EXDMdrLyUcu_.md │ │ │ │ │ ├── bash@syBIAL1mHbJLnTBoSxXI7.md │ │ │ │ │ ├── bitbucket@Z7SsBWgluZWr9iWb2e9XO.md │ │ │ │ │ ├── caching-server@R4XSY4TSjU1M7cW66zUqJ.md │ │ │ │ │ ├── caddy@54UZNO2q8M5FiA_XbcU_D.md │ │ │ │ │ ├── chef@kv508kxzUj_CjZRb-TeRv.md │ │ │ │ │ ├── ci--cd-tools@aQJaouIaxIJChM-40M3HQ.md │ │ │ │ │ ├── circle-ci@1-JneOQeGhox-CKrdiquq.md │ │ │ │ │ ├── cloud-design-patterns@Qc0MGR5bMG9eeM5Zb9PMk.md │ │ │ │ │ ├── cloud-providers@2Wd9SlWGg6QtxgiUVLyZL.md │ │ │ │ │ ├── cloud-smith@vsmE6EpCc2DFGk1YTbkHS.md │ │ │ │ │ ├── cloud-specific-tools@yQ4d2uiROZYr950cjYnQE.md │ │ │ │ │ ├── cloudflare@l8VAewSEXzoyqYFhoplJj.md │ │ │ │ │ ├── cloudformation@TgBb4aL_9UkyU36CN4qvS.md │ │ │ │ │ ├── configuration-management@V9sOxlNOyRp0Mghl7zudv.md │ │ │ │ │ ├── consul@OXOTm3nz6o44p50qd0brN.md │ │ │ │ │ ├── contabo@eJZdjheptmiwKsVokt7Io.md │ │ │ │ │ ├── container-orchestration@Yq8kVoRf20aL_o4VZU5--.md │ │ │ │ │ ├── containers@CQhUflAcv1lhBnmDY0gaz.md │ │ │ │ │ ├── data-management@5FN7iva4DW_lv-r1tijd8.md │ │ │ │ │ ├── datadog@BHny2Emf96suhAlltiEro.md │ │ │ │ │ ├── datadog@bujq_C-ejtpmk-ICALByy.md │ │ │ │ │ ├── design-and-implementation@1_NRXjckZ0F8EtEmgixqz.md │ │ │ │ │ ├── digital-ocean@-h-kNVDNzZYnQAR_4lfXc.md │ │ │ │ │ ├── dmarc@5vUKHuItQfkarp7LtACvX.md │ │ │ │ │ ├── dns@Vu955vdsYerCG8G6suqml.md │ │ │ │ │ ├── docker-swarm@VD24HC9qJOC42lbpJ-swC.md │ │ │ │ │ ├── docker@P0acFNZ413MSKElHqCxr3.md │ │ │ │ │ ├── domain-keys@RYCD78msIR2BPJoIP71aj.md │ │ │ │ │ ├── drone@TsXFx1wWikVBVoFUUDAMx.md │ │ │ │ │ ├── elastic-stack@K_qLhK2kKN_uCq7iVjqph.md │ │ │ │ │ ├── envoy@epLLYArR16HlhAS4c33b4.md │ │ │ │ │ ├── firewall@f3tM2uo6LLSOmyeFfLc7h.md │ │ │ │ │ ├── fluxcd@6gVV_JUgKgwJb4C8tHZn7.md │ │ │ │ │ ├── forward-proxy@F93XnRj0BLswJkzyRggLS.md │ │ │ │ │ ├── freebsd@PiPHFimToormOPl1EtEe8.md │ │ │ │ │ ├── ftp--sftp@RDLmML_HS2c8J4D_U_KYe.md │ │ │ │ │ ├── gcp-functions@JXsctlXUUS1ie8nNEgIk9.md │ │ │ │ │ ├── git@uyDm1SpOQdpHjq9zBAdck.md │ │ │ │ │ ├── github-actions@JnWVCS1HbAyfCJzGt-WOH.md │ │ │ │ │ ├── github@ot9I_IHdnq2yAMffrSrbN.md │ │ │ │ │ ├── gitlab-ci@2KjSLLVTvl2G2KValw7S7.md │ │ │ │ │ ├── gitlab@oQIB0KE0BibjIYmxrpPZS.md │ │ │ │ │ ├── gitops@-INN1qTMLimrZgaSPCcHj.md │ │ │ │ │ ├── gke--eks--aks@XbrWlTyH4z8crSHkki2lp.md │ │ │ │ │ ├── go@npnMwSDEK2aLGgnuZZ4dO.md │ │ │ │ │ ├── google-cloud@zYrOxFQkl3KSe67fh3smD.md │ │ │ │ │ ├── grafana@niA_96yR7uQ0sc6S_OStf.md │ │ │ │ │ ├── graylog@s_kss4FJ2KyZRdcKNHK2v.md │ │ │ │ │ ├── heroku@FaPf567JGRAg1MBlFj9Tk.md │ │ │ │ │ ├── hetzner@I327qPYGMcdayRR5WT0Ek.md │ │ │ │ │ ├── http@ke-8MeuLx7AS2XjSsPhxe.md │ │ │ │ │ ├── https@AJO3jtHvIICj8YKaSXl0U.md │ │ │ │ │ ├── iis@5iJOE1QxMvf8BQ_8ssiI8.md │ │ │ │ │ ├── imap@WMuXqa4b5wyRuYAQKQJRj.md │ │ │ │ │ ├── infrastructure-monitoring@qqRLeTpuoW64H9LvY0U_w.md │ │ │ │ │ ├── istio@XsSnqW6k2IzvmrMmJeU6a.md │ │ │ │ │ ├── jaeger@8rd7T5ahK2I_zh5co-IF-.md │ │ │ │ │ ├── javascript--nodejs@QCdemtWa2mE78poNXeqzr.md │ │ │ │ │ ├── jenkins@dUapFp3f0Rum-rf_Vk_b-.md │ │ │ │ │ ├── kubernetes@hIBeTUiAI3zwUY6NgAO-A.md │ │ │ │ │ ├── learn-a-programming-language@v5FGKQc-_7NYEsWjmTEuq.md │ │ │ │ │ ├── linkerd@hhoSe4q1u850PgK62Ubau.md │ │ │ │ │ ├── load-balancer@i8Sd9maB_BeFurULrHXNq.md │ │ │ │ │ ├── logs-management@gaoZjOYmU0J5aM6vtLNvN.md │ │ │ │ │ ├── loki@w2eCgBC-ydMHSxh7LMti8.md │ │ │ │ │ ├── lxc@qYRJYIZsmf-inMqKECRkI.md │ │ │ │ │ ├── management-and-monitoring@8kby89epyullS9W7uKDrs.md │ │ │ │ │ ├── netbsd@haiYSwNt3rjiiwCDszPk1.md │ │ │ │ │ ├── netlify@hCKODV2b_l2uPit0YeP1M.md │ │ │ │ │ ├── networking--protocols@w5d24Sf8GDkLDLGUPxzS9.md │ │ │ │ │ ├── networking-tools@OaqKLZe-XnngcDhDzCtRt.md │ │ │ │ │ ├── new-relic@pk76Us6z8LoX3f0mhnCyR.md │ │ │ │ │ ├── nexus@ootuLJfRXarVvm3J1Ir11.md │ │ │ │ │ ├── nginx@ukOrSeyK1ElOt9tTjCkfO.md │ │ │ │ │ ├── octopus-deploy@TsXFx1wWikVBVoFUUDAMx.md │ │ │ │ │ ├── openbsd@97cJYKqv7CPPUXkKNwM4x.md │ │ │ │ │ ├── opentelemetry@K81bmtgnB1gfhYdi3TB5a.md │ │ │ │ │ ├── operating-system@qe84v529VbCyydl0BKFk2.md │ │ │ │ │ ├── osi-model@QZ7bkY-MaEgxYoPDP3nma.md │ │ │ │ │ ├── papertrail@cjjMZdyLgakyVkImVQTza.md │ │ │ │ │ ├── performance-monitoring@gIEQDgKOsoEnSv8mpEzGH.md │ │ │ │ │ ├── pop3s@fzO6xVTBxliu24f3W5zaU.md │ │ │ │ │ ├── power-shell@z6IBekR8Xl-6f8WEb05Nw.md │ │ │ │ │ ├── process-monitoring@x-JWvG1iw86ULL9KrQmRu.md │ │ │ │ │ ├── programming-language@v5FGKQc-_7NYEsWjmTEuq.md │ │ │ │ │ ├── prometheus@NiVvRbCOCDpVvif48poCo.md │ │ │ │ │ ├── prometheus@eOyu4wmKOrcMlhD8pUGGh.md │ │ │ │ │ ├── provisioning@1oYvpFG8LKT1JD6a_9J0m.md │ │ │ │ │ ├── pulumi@O0xZ3dy2zIDbOetVrgna6.md │ │ │ │ │ ├── puppet@yP1y8U3eblpzbaLiCGliU.md │ │ │ │ │ ├── python@TwVfCYMS9jSaJ6UyYmC-K.md │ │ │ │ │ ├── reverse-proxy@eGF7iyigl57myx2ejpmNC.md │ │ │ │ │ ├── rhel--derivatives@7mS6Y_BOAHNgM3OjyFtZ9.md │ │ │ │ │ ├── ruby@PuXAPYA0bsMgwcnlwJxQn.md │ │ │ │ │ ├── rust@eL62bKAoJCMsu7zPlgyhy.md │ │ │ │ │ ├── sealed-secrets@ZWq23Q9ZNxLNti68oltxA.md │ │ │ │ │ ├── secret-management@hcrPpjFxPi_iLiMdLKJrO.md │ │ │ │ │ ├── serverless@9p_ufPj6QH9gHbWBQUmGw.md │ │ │ │ │ ├── service-mesh@EeWsihH9ehbFKebYoB5i9.md │ │ │ │ │ ├── smtp@zJy9dOynWgLTDKI1iBluG.md │ │ │ │ │ ├── sops@GHQWHLxsO40kJ6z_YCinJ.md │ │ │ │ │ ├── spf@ewcJfnDFKXN8I5TLpXEaB.md │ │ │ │ │ ├── splunk@dZID_Y_uRTF8JlfDCqeqs.md │ │ │ │ │ ├── ssh@wcIRMLVm3SdEJWF9RPfn7.md │ │ │ │ │ ├── ssl--tls@0o6ejhfpmO4S8A6djVWva.md │ │ │ │ │ ├── suse-linux@zhNUK953p6tjREndk3yQZ.md │ │ │ │ │ ├── teamcity@L000AbzF3oLcn4B1eUIYX.md │ │ │ │ │ ├── terminal-knowledge@wjJPzrFJBNYOD3SJLzW2M.md │ │ │ │ │ ├── terraform@nUBGf1rp9GK_pbagWCP9g.md │ │ │ │ │ ├── text-manipulation@cUifrP7v55psTb20IZndf.md │ │ │ │ │ ├── tomcat@dF3otkMMN09tgCzci8Jyv.md │ │ │ │ │ ├── travis-ci@-pGF3soruWWxwE4LxE5Vk.md │ │ │ │ │ ├── ubuntu--debian@cTqVab0VbVcn3W7i0wBrX.md │ │ │ │ │ ├── vault@tZzvs80KzqT8aDvEyjack.md │ │ │ │ │ ├── vcs-hosting@h10BH3OybHcIN2iDTSGkn.md │ │ │ │ │ ├── vercel@LZDRgDxEZ3klp2PrrJFBX.md │ │ │ │ │ ├── version-control-systems@LvhFmlxz5uIy7k_nzx2Bv.md │ │ │ │ │ ├── vim--nano---emacs@Jt8BmtLUH6fHT2pGKoJs3.md │ │ │ │ │ ├── what-is-and-how-to-setup-x@jCWrnQNgjHKyhzd9dwOHz.md │ │ │ │ │ ├── white--grey-listing@E-lSLGzgOPrz-25ER2Hk7.md │ │ │ │ │ ├── windows@UOQimp7QkM3sxmFvk5d3i.md │ │ │ │ │ └── zabbix@W9sKEoDlR8LzocQkqSv82.md │ │ │ │ ├── devops-beginner.json │ │ │ │ ├── devops.json │ │ │ │ ├── devops.md │ │ │ │ ├── faqs.astro │ │ │ │ └── migration-mapping.json │ │ │ ├── devops-beginner/ │ │ │ │ └── content/ │ │ │ │ ├── ansible@h9vVPOmdUSeEGVQQaSTH5.md │ │ │ │ ├── aws@1ieK6B_oqW8qOC6bdmiJe.md │ │ │ │ ├── docker@P0acFNZ413MSKElHqCxr3.md │ │ │ │ ├── dummy │ │ │ │ ├── git@uyDm1SpOQdpHjq9zBAdck.md │ │ │ │ ├── github-actions@JnWVCS1HbAyfCJzGt-WOH.md │ │ │ │ ├── github@ot9I_IHdnq2yAMffrSrbN.md │ │ │ │ ├── go@npnMwSDEK2aLGgnuZZ4dO.md │ │ │ │ ├── networking--protocols@w5d24Sf8GDkLDLGUPxzS9.md │ │ │ │ ├── nginx@ukOrSeyK1ElOt9tTjCkfO.md │ │ │ │ ├── operating-system@qe84v529VbCyydl0BKFk2.md │ │ │ │ ├── programming-language@v5FGKQc-_7NYEsWjmTEuq.md │ │ │ │ ├── python@TwVfCYMS9jSaJ6UyYmC-K.md │ │ │ │ └── terraform@nUBGf1rp9GK_pbagWCP9g.md │ │ │ ├── devrel/ │ │ │ │ ├── content/ │ │ │ │ │ ├── active-listening@UdUDngq425NYSvIuOd7St.md │ │ │ │ │ ├── advocacy@7MCmY1bABGPfmzjErADvg.md │ │ │ │ │ ├── analytics-and-optimization@lG1FH7Q-YX5pG-7mMtbSR.md │ │ │ │ │ ├── animations--graphics@D7_iNPEKxFv0gw-fsNNrZ.md │ │ │ │ │ ├── animations--graphics@OUWVqJImrmsZpAtRrUYNH.md │ │ │ │ │ ├── anticipate-questions@jyScVS-sYMcZcH3hOwbMK.md │ │ │ │ │ ├── api-references@7IJO_jDpZUdlr_n5rBJ6O.md │ │ │ │ │ ├── apis--sdks@sUEZHmKxtjO9gXKJoOdbF.md │ │ │ │ │ ├── audio@7y4vHk_jgNTW6Q1WoqYDc.md │ │ │ │ │ ├── basic-programming-skills@aSYXa25_0O2qQl1O-N3xl.md │ │ │ │ │ ├── be-concise@rhs6QwxZ7PZthLfi38FJn.md │ │ │ │ │ ├── blog-posts@c0w241EL0Kh4ek76IgsEs.md │ │ │ │ │ ├── blogging@B1IdobUaGeBLI2CgsFg8H.md │ │ │ │ │ ├── building-a-community@GvmXdWiwITgWzx_f5_ick.md │ │ │ │ │ ├── building-a-personal-brand@HN2gNsYYRLVOOdy_r8FKJ.md │ │ │ │ │ ├── building-sdks@h6R3Vyq0U8t8WL3G5xC2l.md │ │ │ │ │ ├── code-of-conduct@er9ukuBvY-F4F8S1qbbjU.md │ │ │ │ │ ├── code-samples@pGJrCyYhLLGUnv6LxpYUe.md │ │ │ │ │ ├── collaborations@w1ZooDCDOkbL1EAa5Hx3d.md │ │ │ │ │ ├── community-engagement@yJygbi8cnp3oz2EFl2MR0.md │ │ │ │ │ ├── community-growth@afR1VviBs2w0k8UmP38vn.md │ │ │ │ │ ├── community-guidelines@4ZvzY_xGO5BZOmfqj0TTq.md │ │ │ │ │ ├── community-management@-6cf3RT4-cbwvLYIkCosF.md │ │ │ │ │ ├── community-support@1NFcpGzCJylRPbFYdD9bB.md │ │ │ │ │ ├── conference-speaking@ue0NaNnNpF7UhvJ8j0Yuo.md │ │ │ │ │ ├── conflict-resolution@8ls5kQvDgvwLbIrwYg1OL.md │ │ │ │ │ ├── consistent-posting@l2P44pL9eF8xarBwC_CVO.md │ │ │ │ │ ├── content-creation@_3ZnPUl4kzzuM0bKQ8IAq.md │ │ │ │ │ ├── content-performance@yhDBZfUAjumFHpUZtmLg3.md │ │ │ │ │ ├── content-strategy@TGXPxTFv9EhsfS5uWR5gS.md │ │ │ │ │ ├── continuous-learning@bwwk6ESNyEJa3fCAIKPwh.md │ │ │ │ │ ├── contrast-principle@LixiZj3-QcmQgGAqaaDr6.md │ │ │ │ │ ├── creating-brand-voice@ZWkpgvXIzjN3_fOyhVEv0.md │ │ │ │ │ ├── cross-promotion@nlzI2fG3SwC5Q42qXcXPX.md │ │ │ │ │ ├── data-driven-strategy-shift@46iMfYgC7fCZLCy-qzl1B.md │ │ │ │ │ ├── data-visualization@0dRnUlgze87eq2FVU_mWp.md │ │ │ │ │ ├── developer-experience@No-UnhdGmtLW9uFGLy-ca.md │ │ │ │ │ ├── developer-journey@BooGiYTMoS0N5eobwjPHY.md │ │ │ │ │ ├── developer-marketing@UhMk8g5MMhvi3kWLLI6B1.md │ │ │ │ │ ├── developer-satisfaction@AwMwMU9hg_gCKPP4tykHb.md │ │ │ │ │ ├── documentation@g3M6nfLr0DMcn-NCFF7nZ.md │ │ │ │ │ ├── editing@6zK9EJDKBC89UArY7sfgs.md │ │ │ │ │ ├── education@EjqJkyojhO7f1uFHIoyGY.md │ │ │ │ │ ├── encouraging-participation@6yLt4Ia52Jke9i5kJQvAC.md │ │ │ │ │ ├── engagement-rates@RXj0yB7KsIOM5whwtyBBU.md │ │ │ │ │ ├── engaging-audience@iKYmUvWFT_C0wnO0iB6gM.md │ │ │ │ │ ├── engaging-content@WIH216mHg2OiSebzQYI-f.md │ │ │ │ │ ├── event-management@usorG1GkkvGAZ0h_AGHVk.md │ │ │ │ │ ├── event-participation@C2w8R4tNy2lOhhWU9l32s.md │ │ │ │ │ ├── example-apps@mWcMSKnUQamUykBxND-Ju.md │ │ │ │ │ ├── execution@1m1keusP-PTjEwy0dCJJL.md │ │ │ │ │ ├── facebook@ZMManUnO-9EQqi-xmLt5r.md │ │ │ │ │ ├── faqs@4GCQ3stXxW1HrlAVC0qDl.md │ │ │ │ │ ├── feedback-collection@oWXfov-mOF47d7Vffyp3t.md │ │ │ │ │ ├── feedback-loop@IxRvVvX9Fax08YUbVob4s.md │ │ │ │ │ ├── forums@oGTIvAY3zYgoiC63FQRSd.md │ │ │ │ │ ├── git@a-i1mgF3VAxbbpA1gMWyK.md │ │ │ │ │ ├── github@8O1AgUKXe35kdiYD02dyt.md │ │ │ │ │ ├── google-analytics@8xrhjG9qmbsoBC3F8zS-b.md │ │ │ │ │ ├── guest-blogging@2QiQW9tygpeaES8Wp1Kw6.md │ │ │ │ │ ├── handling-qa@Xf-Lxi1cKReo4yDLylBbL.md │ │ │ │ │ ├── handouts@tbIAEStaoVWnEWbdk7EGc.md │ │ │ │ │ ├── history-and-evolution@KP28dl1I9hxM130gIPxSZ.md │ │ │ │ │ ├── identifying-audience@UKi3waPx2pozvZf2aQ52s.md │ │ │ │ │ ├── ides@KdFYmj36M2jrGfsYkukpo.md │ │ │ │ │ ├── importance-of-devrel@N9HXTCQq2wfC-QurSofE_.md │ │ │ │ │ ├── initial-outreach@hPJM4QXxeqTxPlvJ2_D3_.md │ │ │ │ │ ├── insights--recommendations@mh1BZDVkc-VwA8aQAmDhO.md │ │ │ │ │ ├── instagram@UAkGV9_I6qiKZMr1aqQCm.md │ │ │ │ │ ├── issue-tracking@j6tr3mAaKqTuEFTRSCsrK.md │ │ │ │ │ ├── issues--pull-requests@vCoEJyS4qMWTTiL17PmWr.md │ │ │ │ │ ├── jetbrains-ides@NCnKS435DCl-8vilr1_XE.md │ │ │ │ │ ├── key-metrics@DCj1teu8Hp82EKnakFRPn.md │ │ │ │ │ ├── labelling-and-cleanup@x3qTqhR1uA5CXqULIJqL8.md │ │ │ │ │ ├── linkedin@6UR59TigEZ0NaixbaUIqn.md │ │ │ │ │ ├── live-streaming@iPaFjacZ7hSWriSEqUmHc.md │ │ │ │ │ ├── managing-difficult-questions@VSOdD9KKF_Qz8nbRdHNo3.md │ │ │ │ │ ├── managing-discussions@J2WunUJBzYw_D5cQH_pnH.md │ │ │ │ │ ├── media-appearances@QrDqUGWC2t9r6p4aR8I5g.md │ │ │ │ │ ├── meetups@HIIqlnZ4Vad_1o4F0lkv-.md │ │ │ │ │ ├── milestones--releases@v_lDqjtxjRK67GsbtxXgT.md │ │ │ │ │ ├── mind-mapping@uwvvWmcZnFqLoHRDFXFyW.md │ │ │ │ │ ├── moderation@d_dKF87OnRWoWj3Bf1uFf.md │ │ │ │ │ ├── networking-strategies@4ygpqUK70hI5r1AmmfMZq.md │ │ │ │ │ ├── networking@SJf9e7SQnzYVHoRWl0i6P.md │ │ │ │ │ ├── office-hours@weyCcboaekqf5NuVAOxfU.md │ │ │ │ │ ├── online-communities@gvMbo22eRxqOzszc_w4Gz.md │ │ │ │ │ ├── online-communities@lMbj0WdoEia_tdpO5rXph.md │ │ │ │ │ ├── open-source@NhQUDVA9q1hnV44EKapbU.md │ │ │ │ │ ├── pechakucha@_FZNqUKgPkzbgOPoiSLSU.md │ │ │ │ │ ├── planning@RQk3uOikjQYRyTu7vuAG7.md │ │ │ │ │ ├── platform-selection@WItTQ1QboHoRkqeHJzCM9.md │ │ │ │ │ ├── platform-specific-analytics@AL3-UzREwTpsADTU0YtRW.md │ │ │ │ │ ├── post-event-followup@kmcOYDvu1vq7AQPllZvv0.md │ │ │ │ │ ├── presentation-techniques@PFjF2PnYpSbvd24jb_D2G.md │ │ │ │ │ ├── promotion@C9--J8gGZENQKn-QcZK4M.md │ │ │ │ │ ├── public-backlog@7ZFTmlQHYQKNjKprwV8zk.md │ │ │ │ │ ├── public-speaking@LRZ8yxTfEGCXsYp4N1_uD.md │ │ │ │ │ ├── publishing@I7RBMfoD30OstVLeTrMs9.md │ │ │ │ │ ├── recognition-programs@Nta8pUncwNQxJlqF6h1AT.md │ │ │ │ │ ├── recording@_QHUpFW4kZ5SBaP7stXY2.md │ │ │ │ │ ├── regular-reports@U2QKCu6TvDuxSNRfdM74n.md │ │ │ │ │ ├── repetition--reinforcement@2iRt9E42i_ej4woKCW_s2.md │ │ │ │ │ ├── reporting@N1uh7dVKfSPT7w0MlKzWO.md │ │ │ │ │ ├── rules-and-policies@8I59U-nnkhQv8ldRuqQlb.md │ │ │ │ │ ├── rules-of-three@vH_ECVYSQ3Fg-DASO1EgK.md │ │ │ │ │ ├── sample-projects@xy9Kqtwrh5IhYHaqEhvl_.md │ │ │ │ │ ├── scripting@rLDRkUht9K1m4noMAIgKU.md │ │ │ │ │ ├── seo-basics@zVBy8o66FdZueg-2v3gaw.md │ │ │ │ │ ├── social-media-analytics@x8RIrK2VB-LBFbt6hAcQb.md │ │ │ │ │ ├── social-media@71BBFjaON1NJi4rOHKW6K.md │ │ │ │ │ ├── social-media@urbtoZtuJryK-6TJ3lmRN.md │ │ │ │ │ ├── storytelling@Y0GUZynSXjITDOA-TP6LH.md │ │ │ │ │ ├── streamyard@meZDgDJMy4aH5VqS-NJL4.md │ │ │ │ │ ├── support@LwNa3u9Lf88ju5w7CvSN5.md │ │ │ │ │ ├── surveys@_Qe_0RksYpX7Spzgc6Fw3.md │ │ │ │ │ ├── technical-documentation@X0xUzEP0S6SyspvqyoDDk.md │ │ │ │ │ ├── technical-setup@8aiLVG4clveX1Luiehvxr.md │ │ │ │ │ ├── the-hook@VTGsmk3p4RVXiNhDmx2l8.md │ │ │ │ │ ├── thought-leadership@wcfrXA9zWZ4Taey7mR2yG.md │ │ │ │ │ ├── tools@psk3bo-nSskboAoVTjlpz.md │ │ │ │ │ ├── topic-selection@uzMfR6Yd9Jvjn8i5RpC1Q.md │ │ │ │ │ ├── tracking-engagement@NWxAxiDgvlGpvqdkzqnOH.md │ │ │ │ │ ├── tutorials@6ubk20TBIL3_VrrRMe8tO.md │ │ │ │ │ ├── twitch@QlWam-kHv8G_-yx3ClP9s.md │ │ │ │ │ ├── understanding-apis@7Q6_tdRaeb8BgreG8Mw-a.md │ │ │ │ │ ├── use-case-based@omnUSgUHZg2DmnOUJ0Xo1.md │ │ │ │ │ ├── user-guides@RLf08xKMjlt6S9-MFiTo-.md │ │ │ │ │ ├── version-control@x6KFf4akYuUYkNhrUwj1r.md │ │ │ │ │ ├── video-production@bRzzc137OlmivEGdhv5Ew.md │ │ │ │ │ ├── video-production@pEMNcm_wJNmOkWm57L1pA.md │ │ │ │ │ ├── video@tRywPj_2VyjSLjxYJtYZd.md │ │ │ │ │ ├── visualization@SNhrYZsmyDHN_JWh0eZy2.md │ │ │ │ │ ├── vs-code@j5nNSYI8s-cH8EA6G1EWY.md │ │ │ │ │ ├── webinars@1fc0iWwOkheUJ7d0np86L.md │ │ │ │ │ ├── what-is-devrel@SiYUdtYMDImRPmV2_XPkH.md │ │ │ │ │ ├── writing-documentation@pqp9FLRJRDDEnni72KHmv.md │ │ │ │ │ ├── writing-process@l6-mzgDTXg2EPkyZyZ6TC.md │ │ │ │ │ ├── writing-skills@0ntOE6PSdMl_EXB9gdgIv.md │ │ │ │ │ ├── x@6BqkO4XOspJg0-9GNLtUp.md │ │ │ │ │ ├── x@Mdp4bBlhVbGohJkVlsDar.md │ │ │ │ │ └── youtube@OY5rn3XTbmz4LzSLRcNmw.md │ │ │ │ ├── devrel.json │ │ │ │ ├── devrel.md │ │ │ │ └── faqs.astro │ │ │ ├── devsecops/ │ │ │ │ ├── content/ │ │ │ │ │ ├── acls@lLWQhvzXn3EpeCf9Mhgyj.md │ │ │ │ │ ├── alert-types@-j1PH9_z-Eq3jxX6e8VmQ.md │ │ │ │ │ ├── asymmetric@hz0WFG5ksaBFMpq7ypLgF.md │ │ │ │ │ ├── attack-surface-mapping@JztcgG94qZ5trdhfDcRa6.md │ │ │ │ │ ├── audit--compliance-mapping@04_UcLELHkqjBCwliCw7H.md │ │ │ │ │ ├── authentication@iiOWJ7KXyHp_ovVWNmDoc.md │ │ │ │ │ ├── authorization@DYmh1MkmAuXUJOFqnFzWc.md │ │ │ │ │ ├── automated-patching@HahTEhITEAGaoys1psZqV.md │ │ │ │ │ ├── bash@r3XBfcNtxSraF11YK_5d5.md │ │ │ │ │ ├── bcrypt@TqmbGC_Q_b3BkU7UkvE-S.md │ │ │ │ │ ├── build-pipeline-hardening@nkPrYgpM5Mn6C_9u9yAyQ.md │ │ │ │ │ ├── burp-suite@uAUg6mDDDq7ZyR0IEDxg5.md │ │ │ │ │ ├── certificate-lifecycle@quUzTCnBnmJoSmIPBGjxk.md │ │ │ │ │ ├── cia-triad@k7AtVkkVavHjCVo1hqCc0.md │ │ │ │ │ ├── cloud-security@ou2-KKBNyOxH_IW9s3eE9.md │ │ │ │ │ ├── container-security@EnDqfr07RzNZmPIth6wSq.md │ │ │ │ │ ├── containment@CUjGVwPvQytVYqy2zEPuw.md │ │ │ │ │ ├── cryptographic-hashing@EqfPoveYajk61VH-ii_uE.md │ │ │ │ │ ├── cspm@eTOjfNSzlvbWsyX5an_5w.md │ │ │ │ │ ├── ddos-miligation-strategy@ltpquwL_YEvbgMZ2OyNS4.md │ │ │ │ │ ├── defense-in-depth-concepts@a4dYHrx1KzhKRtarZT1iy.md │ │ │ │ │ ├── dependency-risk-management@AAd_X7gI-WA7Jh9FKsuE_.md │ │ │ │ │ ├── devsecops-vs-devops@SJa6UcRcgT08lF8Phnh0X.md │ │ │ │ │ ├── dns@TnDsOr1iJX3hY7vJRpp7S.md │ │ │ │ │ ├── docker@-OWtiqx4YbcOVhtYU0D69.md │ │ │ │ │ ├── edr-strategy@A67WShi92I-TX0iK7Fv0L.md │ │ │ │ │ ├── encryption@0ey7Spq4DoZ-AfXOsMtag.md │ │ │ │ │ ├── endpoint-detection@E2jGo4HeKaeuXYa9-f-vy.md │ │ │ │ │ ├── enterprise-operations@68qVLExPlVrKJweTjd_S5.md │ │ │ │ │ ├── firewalls@LV_uiNRdUi9OrmxQCdeGw.md │ │ │ │ │ ├── forensics@h_kjdN5uGNKLtJ3puQ9RH.md │ │ │ │ │ ├── go@UcBt4BsvLDlsnVy3KKJ1y.md │ │ │ │ │ ├── http@WamX-UieM8NxhK6P_bDCB.md │ │ │ │ │ ├── iam@-RORxEsNvIPSlnM2TWB3j.md │ │ │ │ │ ├── iam@JDglIowCyRjSoqCcNfkZr.md │ │ │ │ │ ├── identity-basics@iONpD135a4kd3zR5ufoTx.md │ │ │ │ │ ├── ids@L3Mu6rCIu58VyhtxeyLXq.md │ │ │ │ │ ├── image-scanning@bPmjX9IPL9Da0XUApY5UF.md │ │ │ │ │ ├── incident-response@V5eQcby9FNcGv68KPj5rH.md │ │ │ │ │ ├── input-validation-patterns@lq4nTMBniaxxwPvH5M77Z.md │ │ │ │ │ ├── introduction@-X3GTFpg3kzm0cELAngjb.md │ │ │ │ │ ├── ips@PYH_nc4bktIJoCJA6OC5E.md │ │ │ │ │ ├── ir-lifecycle@X-pvSQnfB2W4992_3eOEy.md │ │ │ │ │ ├── iso-27001@JBNiSzYD8DSnKfHoKRjMg.md │ │ │ │ │ ├── javascript--nodejs@BeUiBY18JHqCKVNtYAHH3.md │ │ │ │ │ ├── key-management-service@l76yFl4lSXnxg5DBbnnID.md │ │ │ │ │ ├── kubernetes@YveqgdX6eNRFC1zU_q7r1.md │ │ │ │ │ ├── large-scale-identity-strategy@XRnxOPVChkGLQSXX-kUmi.md │ │ │ │ │ ├── learn-a-programming-language@v5FGKQc-_7NYEsWjmTEuq.md │ │ │ │ │ ├── least-privilege@rK-RToN5JRcclYl23TyYz.md │ │ │ │ │ ├── log-analysis@_Kr2_N8021tsZfa0wZ3Vu.md │ │ │ │ │ ├── monitoring@MMTCo21ap15MrPV64vKka.md │ │ │ │ │ ├── multi-region-security-planning@eALB73XbtnFF3-PYcLcZq.md │ │ │ │ │ ├── nessus@EqbzAy56Tu8asKNFzuti_.md │ │ │ │ │ ├── network-segmentation@Cr0VAtdu0ZYPOkUU_7vjR.md │ │ │ │ │ ├── networking-basics@84HlHz8bHCDtAPGpq7LpX.md │ │ │ │ │ ├── nist@yMb0-A55r1KEsLntOmp5F.md │ │ │ │ │ ├── nmap-basics@JyXv5vPHCjSBc0J-PpUEV.md │ │ │ │ │ ├── nmap@0Tci_Ks8jXisin90VqB_D.md │ │ │ │ │ ├── openvas@mIcs0fp3T9IwwAvgYyKnY.md │ │ │ │ │ ├── owasp-top-10@igGASa7AknApWtq57v2Qx.md │ │ │ │ │ ├── pasta@6A_3p3CzwxFVjJaXahEVr.md │ │ │ │ │ ├── pki-design-and-failover@nEYMyTKfRDqA2Uc1tCwxv.md │ │ │ │ │ ├── powershell@91lxZEOZ6KF3tY9id2Au8.md │ │ │ │ │ ├── python@txcfATz3k89CedFrSZMWj.md │ │ │ │ │ ├── qualys@Pkud7rAzdV5asF5aGAq7z.md │ │ │ │ │ ├── response-strategy@6Q2VIdeSuBZzo7c1qnYLG.md │ │ │ │ │ ├── risk-quantification@V97S_0PrVw3jjHnmcxDgJ.md │ │ │ │ │ ├── role-based-access@9Tea1ge_l1fls0fyPxMPG.md │ │ │ │ │ ├── root-cause-analysis@VyzLkdcLgxfSSFuUS0xO_.md │ │ │ │ │ ├── ruby@nKthK-OsFO0TGwptD-Dme.md │ │ │ │ │ ├── rust@V_-gY34XcyIqPcLKtDJZr.md │ │ │ │ │ ├── sboms@MF8AYjKun5SHtumTyuurJ.md │ │ │ │ │ ├── scripting-knowledge@wjJPzrFJBNYOD3SJLzW2M.md │ │ │ │ │ ├── secure-api-design@aMu0e6xQ3Rak44F_I7Ish.md │ │ │ │ │ ├── secure-coding@iHd6XNAUGXn3_d-I_YtTM.md │ │ │ │ │ ├── secure-network-zoning@ixiKWBp8m4tP55dBYFzRL.md │ │ │ │ │ ├── sha-256@LKMBv-M9k71yrR2WzN4bK.md │ │ │ │ │ ├── siem@hnroE_riXvw6BqYdirWBX.md │ │ │ │ │ ├── soar-automation@rXS1CIZHu7TA_o7L-vMtV.md │ │ │ │ │ ├── soar-concepts@O0aVW37VhZInw9Z9Mghcg.md │ │ │ │ │ ├── soc-2@VmDslOmZANHpHmAInFa_j.md │ │ │ │ │ ├── sql-injection-prevention@VPBQh3CSsNA-esuvEHT3X.md │ │ │ │ │ ├── stride@EZZsZHxu7__yM2l9tr95-.md │ │ │ │ │ ├── supply-chain-security@qKHb2e9g_Xuo-nHepICTR.md │ │ │ │ │ ├── symmetric@mT1cKWZcKXwvopW6BeX-A.md │ │ │ │ │ ├── threat-modeling-workflows@qfhpMprVX562UuktYN9BZ.md │ │ │ │ │ ├── threat-modeling@XA7JUF00B1locP0xY3T95.md │ │ │ │ │ ├── tls@FvU310TuexCsp8QkvxJib.md │ │ │ │ │ ├── vim--nano--emacs@7MavDAydyrt0tOJ6a6xRQ.md │ │ │ │ │ ├── vlans@GPVN-nDitsY1bF_3huqnh.md │ │ │ │ │ ├── wireshark-basics@iHhitN8zToXm4nK1m0OeR.md │ │ │ │ │ ├── xss-prevention@ph7rFQFJffi_di133vm3Z.md │ │ │ │ │ └── zero-trust-concepts@3UAH70FkQlv5_VbYon4U9.md │ │ │ │ └── devsecops.md │ │ │ ├── django/ │ │ │ │ ├── content/ │ │ │ │ │ ├── admin-customization@KHoau3Pz7o951L8Ivryk0.md │ │ │ │ │ ├── adminpy@tffzsnhXGpN8-CPLgmdxn.md │ │ │ │ │ ├── aggregations@9PRY8NUilH2xITVyhpQSy.md │ │ │ │ │ ├── asynchronous-django@8AuyffbXskd8jltqyJVer.md │ │ │ │ │ ├── authentication@k2P3gilbLJ7tjbLhBym_m.md │ │ │ │ │ ├── authorization@8-LeguN1r6pLVGvBbwzPZ.md │ │ │ │ │ ├── background-tasks@x19j7d1jd_uFhy85w71i0.md │ │ │ │ │ ├── built-in-user-model@SEEiAOOxLGUaZi3wYncUm.md │ │ │ │ │ ├── caching@UDpTybashBHcy2S-oooww.md │ │ │ │ │ ├── class-based-views@49YSIjTsb6Lnv39AukGrD.md │ │ │ │ │ ├── comments@TXhI0IHDH6a4_vNyCDEYH.md │ │ │ │ │ ├── create-update-delete@_2hoRFibz8dYBPhHJX8NW.md │ │ │ │ │ ├── createview@osfekQvv2IjQir8xG7Jqn.md │ │ │ │ │ ├── csrf@_JaSWTa-VufNB0-6NH5KL.md │ │ │ │ │ ├── custom-fields@7dV6o6DnKkv6TX7KCbnzC.md │ │ │ │ │ ├── custom-user-model@F0OPk3bIoeXhIRthKg9MD.md │ │ │ │ │ ├── customization@oCxrIu2UfV6loYn8ncaLu.md │ │ │ │ │ ├── customizing-views@eQaN3y7cQgOcQ1BstNV-4.md │ │ │ │ │ ├── debug_toolbar@OSkwgXDOhm6oyk_VlUbUc.md │ │ │ │ │ ├── debugging@x45F-FdQOch35hZqNMfIn.md │ │ │ │ │ ├── deleteview@RpvuHOwFN03aeY3hvt1N0.md │ │ │ │ │ ├── deployment@jnR93iiFLqqpahhqq4w8-.md │ │ │ │ │ ├── detailview@D8vZfjzzt3gPda-6iF5Y4.md │ │ │ │ │ ├── django--rest-framework@ultPpF8Lpqry-SdAbNCB1.md │ │ │ │ │ ├── django-admin@Voo8COgeTLD-607m793gh.md │ │ │ │ │ ├── django-allauth@YKyWtsxm1HcVsA56iyEOJ.md │ │ │ │ │ ├── django-for-frontend@vbLOUveBUO9BYzOhHwhod.md │ │ │ │ │ ├── django-forms@jhMYTiVacTLeatfAjAnPJ.md │ │ │ │ │ ├── django-ninja@B86paKhwiZsM5XP-V-AE8.md │ │ │ │ │ ├── django-orm@GQqNJQ3FkO-kBM8WYVBmn.md │ │ │ │ │ ├── django-shell@R4-oE2zFnwxvF05u5DYV4.md │ │ │ │ │ ├── django-test-framework@HD_-WR69-8f7uhiS0YwYP.md │ │ │ │ │ ├── django_silk@i8me37ZwzObjy1-JbrRjf.md │ │ │ │ │ ├── dtl-syntax@yla_7mhlkfxvI_YZ5Zikm.md │ │ │ │ │ ├── error-pages@mxo_Wwx0To8CaOxBMSQyI.md │ │ │ │ │ ├── field-options@j4P7KBtfwdGSX0ga0BgpV.md │ │ │ │ │ ├── fields-types@CX-9Ii3e9rrokUTF0_hI5.md │ │ │ │ │ ├── filtering--lookups@LDajzTC8AKD-13JVtL0Tk.md │ │ │ │ │ ├── filters--custom-filters@jhZsz4yMcYHgWsigQ4nzU.md │ │ │ │ │ ├── filters@jPhWe3MfOLbisxNCaivmz.md │ │ │ │ │ ├── fixtures@3CnuISrkDffQgys-x0AP4.md │ │ │ │ │ ├── for@Ta2kZmFI4sguQDb1gKJLh.md │ │ │ │ │ ├── form-validation@-HGUhMNlPlbwuKMDX1e18.md │ │ │ │ │ ├── formatters@rvnqGZxTu3YMH4HQwJ61i.md │ │ │ │ │ ├── function-based-views@3k2Fo1-qldnE38HLtAtvv.md │ │ │ │ │ ├── generic-views@-JKD1SRtFWt3b99aPbfx7.md │ │ │ │ │ ├── grouping-urls@yA2qE3CeQx6goxKAavwjH.md │ │ │ │ │ ├── handlers@IO9J54i7gSyunGRtIYJra.md │ │ │ │ │ ├── how-the-web-works@Xrcl09I9ZShOwhAWynsO6.md │ │ │ │ │ ├── if@9sR_5U94v5qZdEiwngo67.md │ │ │ │ │ ├── installing--django@GB1fgFjrGS-ZM8QTJinOr.md │ │ │ │ │ ├── introduction@m7fQLURtbiz4BM2UcZPeS.md │ │ │ │ │ ├── listview@mLMh30_UjacqqNRyKRCiP.md │ │ │ │ │ ├── localization@waLyhhzu4JkMnhnVdP9xf.md │ │ │ │ │ ├── loggers@zoFHTdr2iBTGdHbmv_9LI.md │ │ │ │ │ ├── logging@SxATl4QiM9iA1_qaUNJXx.md │ │ │ │ │ ├── managepy@wwKzZhC3xPQ-oymwjW5Yn.md │ │ │ │ │ ├── mariadb@udVG-R6R2UHnvTsXO80xQ.md │ │ │ │ │ ├── media@GA1Zn14Q2EvDmo452V8OO.md │ │ │ │ │ ├── message-framework@AztOoGUtPW_6jP6NqJ5T-.md │ │ │ │ │ ├── middelware@IsZm5SZWJ0CTjxCOKZnn-.md │ │ │ │ │ ├── middleware@IsZm5SZWJ0CTjxCOKZnn-.md │ │ │ │ │ ├── migrations@lUlJdqmd7YRpyRCfgT_EK.md │ │ │ │ │ ├── migrations@tCK6V3T4oGy9O8Wur2k9d.md │ │ │ │ │ ├── model-forms@HjcEX3u5iRSlq69U-pSEs.md │ │ │ │ │ ├── model-inheritance@SWNGsyrpP7XghRa_zKQbb.md │ │ │ │ │ ├── model-methods@NV1l8YU9CHw_I8NhhN0hO.md │ │ │ │ │ ├── model-relationships@D7wMA3PYw1RYMz9lXGsgW.md │ │ │ │ │ ├── models@iY7yJ9NN77F6wvlgD4zKG.md │ │ │ │ │ ├── modelspy@WYPjCQcccmwcjnxM_5VkU.md │ │ │ │ │ ├── mysql@pnyNAPLViP4LBGvkVbZ5s.md │ │ │ │ │ ├── named-urls@3qImaY9Hs3Cvatw1X96Ns.md │ │ │ │ │ ├── pagination@-ZFQ0QzqqBIuSQK9CwLg4.md │ │ │ │ │ ├── path-converters@NB50RuNBT5Oja2Ry6p892.md │ │ │ │ │ ├── pdb-ipdb@WRHWs75DbhuiVZm1XMe7z.md │ │ │ │ │ ├── postgresql@ykgvgR6YE_-V1LAtr0DvU.md │ │ │ │ │ ├── production-checklist@PsDSs7qC_M3l-Ang1wTZe.md │ │ │ │ │ ├── projects--apps@d0JBAP2Sot-u4diwqDYIq.md │ │ │ │ │ ├── protecting-views@HuciFgMerqPADqEaaIwdd.md │ │ │ │ │ ├── pytest@K2dNQ69laFT853CFniJrZ.md │ │ │ │ │ ├── query-optimization@u2bq7WaT2aSbrSaa0yB86.md │ │ │ │ │ ├── querying-data@8ud6LNbixJEP1It9AUMB7.md │ │ │ │ │ ├── raw-sql@7rCNwoQW2lI7xxMUP_ESa.md │ │ │ │ │ ├── regex-paths@DbJ1BIOoerkCH4P95Z7wD.md │ │ │ │ │ ├── reguex-paths@DbJ1BIOoerkCH4P95Z7wD.md │ │ │ │ │ ├── rendering-templates@zcfaGdMJEUAl5F9GhieaU.md │ │ │ │ │ ├── request-reponse-flow@ftFF3oFfqpKvjQhXk3bWw.md │ │ │ │ │ ├── reverse-url@KlEgfzfkPu0O43tJIsU3H.md │ │ │ │ │ ├── routers@1p5abgLJ31IRTUiFwbeSa.md │ │ │ │ │ ├── routing-middleware@kVhW3uJawiK1waW-2Gk7F.md │ │ │ │ │ ├── running-your-project@QJJh0Dl4IT_I3_eACrStj.md │ │ │ │ │ ├── ruouting-middleware@kVhW3uJawiK1waW-2Gk7F.md │ │ │ │ │ ├── serializers@aJ0jM_zjUJkt0wVfJQYt7.md │ │ │ │ │ ├── setting-up-the-database@yRaVL7FoWcHb2A8uz5TV8.md │ │ │ │ │ ├── settingspy@_RRCcJpO33XAgdsBzJdY9.md │ │ │ │ │ ├── signals@gPy4yi6smV4gcRj_WCqYR.md │ │ │ │ │ ├── sqlite@o6qNq8D_gwC5UrkKjz57o.md │ │ │ │ │ ├── static-files@MJIQZoLMiURPrhqMUddG7.md │ │ │ │ │ ├── static@k7aMrFNIY11_bD_XwVLv7.md │ │ │ │ │ ├── tags--custom-tags@W2v9_4sn5aoZjxMKOQTcw.md │ │ │ │ │ ├── template-inheritance@4j0fCRER1a_c7FY06Q68h.md │ │ │ │ │ ├── templates@YLvdL6lwZk2vlMK7QaTk7.md │ │ │ │ │ ├── templates@v5skymtqU7PmMuBsl-1rX.md │ │ │ │ │ ├── testspy@g-KGkdGeCJQe6NMe82gR8.md │ │ │ │ │ ├── the-mcv-model@CXrUh4hBN7fhXShUhtO5n.md │ │ │ │ │ ├── the-mvc-model@CXrUh4hBN7fhXShUhtO5n.md │ │ │ │ │ ├── transactions@OoboX9UxuQ0pgjwQZmjIV.md │ │ │ │ │ ├── unittest--testcase@iKzWEV8ymBEh_J2ppKZjF.md │ │ │ │ │ ├── updateview@vS0Y5DmrAEwoQ9gblM-8Q.md │ │ │ │ │ ├── url-patterns@ThYltfCyVKkKL_6jY2g-d.md │ │ │ │ │ ├── urlspy@6y3ZnxclaV6JVGhUkQMtB.md │ │ │ │ │ ├── urlspy@b9VXaPBraxAakcwHkyRYu.md │ │ │ │ │ ├── users--permissions@hxVeLMj_jQYPNqMPcT8FW.md │ │ │ │ │ ├── variables@wxkaVWdZGcAZVxbfOJvZE.md │ │ │ │ │ ├── views--viewsets@MY9L0_kzjrbda43d-Ey-H.md │ │ │ │ │ ├── views@04iZjMANQFOjASGRz9Maw.md │ │ │ │ │ ├── viewspy@e-5mm0hv-sgG4lfDcISQ6.md │ │ │ │ │ ├── virtual-envs@1JeM23O8r_WnIdmgrgZ_7.md │ │ │ │ │ ├── whitenoise@oUjfjCRymVJs4HzmMeks5.md │ │ │ │ │ └── why-use-web-frameworks@xdxitF1Foo6W9Pj6-2Be1.md │ │ │ │ └── django.md │ │ │ ├── docker/ │ │ │ │ ├── content/ │ │ │ │ │ ├── application-architecture@EqYWfBL5l5OOquok_OvOW.md │ │ │ │ │ ├── bare-metal-vs-vms-vs-containers@3hatcMVLDbMuz73uTx-9P.md │ │ │ │ │ ├── basics-of-docker@kIqx7Inf50mE9W0juwNBz.md │ │ │ │ │ ├── bind-mounts@wZcCW1ojGzUakHCv2AaI1.md │ │ │ │ │ ├── building-container-images@5OEfBQaYNOCi999x6QUqW.md │ │ │ │ │ ├── cgroups@fRl4EfNwlBiidzn3IV34-.md │ │ │ │ │ ├── command-line-utilities@YzpB7rgSR4ueQRLa0bRWa.md │ │ │ │ │ ├── container-registries@3VKPiMfbGBxv9m_SljIQV.md │ │ │ │ │ ├── container-security@78YFahP3Fg-c27reLkuK4.md │ │ │ │ │ ├── containers@jhwe-xfVc-C7qy8YuS5dZ.md │ │ │ │ │ ├── continuous-integration@oyqw4tr-taZcxt5kREh1g.md │ │ │ │ │ ├── data-persistence@uUPYXmwu27SBPqKZx6U_q.md │ │ │ │ │ ├── databases@jKSE_wKYf4P9wnSh_LkMi.md │ │ │ │ │ ├── debuggers@LiAV9crrTHhLqeZhD25a2.md │ │ │ │ │ ├── deploying-containers@qXOGqORi3EdqwsP9Uhi9m.md │ │ │ │ │ ├── developer-experience@hHXTth0ZP8O-iMGR9xfu9.md │ │ │ │ │ ├── docker-and-oci@43drPbTwPqJQPyzwYUdBT.md │ │ │ │ │ ├── docker-cli@b-LwyYiegbF0jIrn7HYRv.md │ │ │ │ │ ├── docker-compose@jjA9E0J8N2frfeJCNtA1m.md │ │ │ │ │ ├── docker-desktop-winmaclinux@NCdsPRhJy7UtQFNLo1J1f.md │ │ │ │ │ ├── docker-engine--linux@0NKqLUWtJMlXn-m6wpA6f.md │ │ │ │ │ ├── docker-run@6eu5NRA1sJuaHTlHtNurc.md │ │ │ │ │ ├── docker-swarm@ks6PFN-0Z9zH7gtWaWgxz.md │ │ │ │ │ ├── dockerfiles@yGRQcx64S-yBGEoOeMc55.md │ │ │ │ │ ├── dockerhub@rxVR62_yXIjc-L4GFSV6u.md │ │ │ │ │ ├── efficient-layer-caching@frshJqVMP8D7o_7tMZMPI.md │ │ │ │ │ ├── ephemeral-container-filesystem@086zZYjtzdCaDHm-MkSqg.md │ │ │ │ │ ├── hot-reloading@4p5d3rzCHy4vjg2PRX-2k.md │ │ │ │ │ ├── image-security@M5UG-ZcyhBPbksZd0ZdNt.md │ │ │ │ │ ├── image-size-and-security@-8wAzF6_3gruiM3VYMvB0.md │ │ │ │ │ ├── image-tagging-best-practices@Vs4WQwgJFhA63U9Gf2ym0.md │ │ │ │ │ ├── images@3Nsg-F3wMKEzEsXw1MBZv.md │ │ │ │ │ ├── installation--setup@01nDXqxVdMv4SeXc0nYHH.md │ │ │ │ │ ├── interactive-test-environments@HlTxLqKNFMhghtKF6AcWu.md │ │ │ │ │ ├── introduction@Py9nst2FDJ1_hoXeX_qSF.md │ │ │ │ │ ├── kubernetes@RqXpX2XabtHYVjgg1EZR_.md │ │ │ │ │ ├── namespaces@BvV8VCX39wRB-g8WvGF1g.md │ │ │ │ │ ├── networks@w5QjzvOaciK2rotOkjvjQ.md │ │ │ │ │ ├── nomad@r1eJZDZYouUjnGwAtRbyU.md │ │ │ │ │ ├── others-ghcr-ecr-gcr-acr-etc@fh5aERX7c-lY9FPsmftoF.md │ │ │ │ │ ├── paas-options@PP_RRBo_pThe2mgf6xzMP.md │ │ │ │ │ ├── package-managers@mw-weCutd2ECKlx2DE_ZJ.md │ │ │ │ │ ├── programming-languages@XxT9UUjbKW1ARyERSLH_W.md │ │ │ │ │ ├── running-containers@z2eeBXPzo-diQ67Fcfyhc.md │ │ │ │ │ ├── runtime-configuration-options@mAaEz-bwB5DLaBbOSYGMn.md │ │ │ │ │ ├── runtime-security@vYug8kcwrMoWf8ft4UDNI.md │ │ │ │ │ ├── shell-commands@W5kX5jn49hghRgkEw6_S3.md │ │ │ │ │ ├── shell-scripting@InlMtuaUJ9EXO-OD9x1jj.md │ │ │ │ │ ├── tests@Kmyo1_Mor9WHLkRhNShRZ.md │ │ │ │ │ ├── underlying-technologies@jrH1qE6EnFXL4fTyYU8gR.md │ │ │ │ │ ├── union-filesystems@vEUfw_vobshuZI0-q8RZo.md │ │ │ │ │ ├── users--groups-permissions@uKjB2qntFTpPuYUT9sdxd.md │ │ │ │ │ ├── using-3rd-party-container-images@LShK3-1EGGuXnEvdScFR7.md │ │ │ │ │ ├── volume-mounts@woemCQmWTR-hIoWAci3d5.md │ │ │ │ │ ├── volumes@eHtVLB6v3h7hatJb-9cZK.md │ │ │ │ │ ├── what-are-containers@74JxgfJ_1qmVNZ_QRp9Ne.md │ │ │ │ │ └── why-do-we-need-containers@i4ijY3T5gLgNz0XqRipXe.md │ │ │ │ ├── docker.json │ │ │ │ ├── docker.md │ │ │ │ ├── faqs.astro │ │ │ │ └── migration-mapping.json │ │ │ ├── elasticsearch/ │ │ │ │ ├── content/ │ │ │ │ │ ├── api-keys@6LJ8UCBA9jj4ENk1iLwC6.md │ │ │ │ │ ├── authentication@b4PSjo2xVnkih7e9XlnQs.md │ │ │ │ │ ├── autoscaling@pBQsOfU5JlCMTSdKVU0C2.md │ │ │ │ │ ├── avg--sum--min--max@Avit-NGMkIA9JwJ7OUiNZ.md │ │ │ │ │ ├── bm25-algorithm@MqoJJv_aZCdCLHLpebrPA.md │ │ │ │ │ ├── boolean@8bNqL02B9VFraXaRDaxDq.md │ │ │ │ │ ├── boosting-queries@ebU65cyHH2TVGrQOHjILk.md │ │ │ │ │ ├── bulk-index@3VH_cfXDDZbYma-DL14Fe.md │ │ │ │ │ ├── bulk-index@s1Finic6tTeSbgXt1nz30.md │ │ │ │ │ ├── cardinality@vrj87U2jNHEQhUlUKvm0z.md │ │ │ │ │ ├── cat-api@IbkvRfpVm1iNSU9jH0MLO.md │ │ │ │ │ ├── cluster-monitoring@TqamknoJp5OQnvqpQpJHx.md │ │ │ │ │ ├── cluster-system@UVFo66FzwLOPFjafCMQg2.md │ │ │ │ │ ├── controlling-search-results@QzkAFCH4nGZbVudp_bSh_.md │ │ │ │ │ ├── coordinating-nodes@eIGt2YQdHRssD_7TncWdf.md │ │ │ │ │ ├── create-index@raYmik0mnI2_gu2dpWKzF.md │ │ │ │ │ ├── cross-cluster-replication@NFUpYASxryl5ne1jHfj-E.md │ │ │ │ │ ├── custom-analyzers@Y-4FlvsZPCP1WISOvcPMW.md │ │ │ │ │ ├── data-nodes@0t2kxHBbL6kXn3C1sgGEE.md │ │ │ │ │ ├── data-tiers@e7jEDWLZ6q6S0csClOD27.md │ │ │ │ │ ├── data-types@OfsRHpwJClzwPPRe9hai2.md │ │ │ │ │ ├── dates@YHLYayCH8beVSkDF_U5_F.md │ │ │ │ │ ├── delete-by-query@FYdnnc9kgkWYQAtJjBgTC.md │ │ │ │ │ ├── delete-documents@d5KjotJsfYrE5YH7a48XI.md │ │ │ │ │ ├── delete-index@FGz2puNUy_cGRwE3Jfylq.md │ │ │ │ │ ├── doc-values@rkL_k2nxymtgPW8xf_04k.md │ │ │ │ │ ├── document-row@tX_HGYnsoeipj4xu04wnX.md │ │ │ │ │ ├── dynamic@_SuYA1C-g5XOmhCAjXhXi.md │ │ │ │ │ ├── elastic-cloud@TACmPj5o4tdyTkLXqSQFb.md │ │ │ │ │ ├── elasticsearch-usecases@0-SJLGkO8Ek7hyC6wWHKv.md │ │ │ │ │ ├── eql@R2G2jlvGl6rJkqphwHYGP.md │ │ │ │ │ ├── esql@bw5Rt_AxLRVB6KnetVWU9.md │ │ │ │ │ ├── exists-query@Eu76k_9GC5DNqWMKTogV4.md │ │ │ │ │ ├── explicit@4f09QKfGI-GaxYw0ngdiS.md │ │ │ │ │ ├── fielddata@bNnGloEN5OED8M-WyChK6.md │ │ │ │ │ ├── filter-aggregations@BzIj7Cc9oC4WsUeU9b4Ae.md │ │ │ │ │ ├── filter@Kzuy0BM4Dme2nFanEdWGC.md │ │ │ │ │ ├── filter@irtX2t6kTUp5lDHd0AVUF.md │ │ │ │ │ ├── flattened@MSHYpBQEgv-ukJvvuHE1B.md │ │ │ │ │ ├── function-score-query@pzRBfcevVXXWf6QfvGIvs.md │ │ │ │ │ ├── geo-points@d_VHRn6rWUEFfI6KVrcoS.md │ │ │ │ │ ├── get-document@raSeqTXjH4aCFHuoqmrcJ.md │ │ │ │ │ ├── highlighting@vaah2ESUA7oJW4-hHaWrm.md │ │ │ │ │ ├── histogram@RDygFr1w9yR6mU3hSG8Vj.md │ │ │ │ │ ├── how-search-works@fuQ4okG1z02lMx8Gkw43M.md │ │ │ │ │ ├── hybrid-search@cWzmbSIsiw7809rmFA4DV.md │ │ │ │ │ ├── id-primary-key@1Qps2Z_Cp5ZrYkq5FXwDO.md │ │ │ │ │ ├── id-query@SmaMEuknItGuLiBv9PwIk.md │ │ │ │ │ ├── ilm@DMXH8GoYf2qVDbLg7b2hm.md │ │ │ │ │ ├── index-database@ECrKSI6rUU_N5fd3NFgch.md │ │ │ │ │ ├── index-document@amdn_KmQmPJgBf-kDzC3E.md │ │ │ │ │ ├── introduction@rWriosjh7LzGZbj8k_wih.md │ │ │ │ │ ├── json@ppgShbqhYsD6maDw3Dgcx.md │ │ │ │ │ ├── keyword@DZ_FX0ansCsXDN7J6u7_m.md │ │ │ │ │ ├── kibana-console@ST0yxc527eb2vRrSvTWAd.md │ │ │ │ │ ├── kql@Ad5Ck2ZdLN3iphqRmFMIF.md │ │ │ │ │ ├── latest@aX6S8p760HI7U9POwTJ1e.md │ │ │ │ │ ├── leaf-vs-compound-queries@xpxl2b_9DUXCT4bpyGete.md │ │ │ │ │ ├── lucene@jWST5oXpmJVhjXKucbUu5.md │ │ │ │ │ ├── mapping-explosion@X_6Cyj7QIls5FK1gmvi4e.md │ │ │ │ │ ├── mappings@2ZJCuKPy1VnJzTI0CkgeI.md │ │ │ │ │ ├── master-elegible-nodes@Mc96iYA5dzWQJ0Kz8mgZC.md │ │ │ │ │ ├── match-phrase-query@OBSm1fxTj1HhuqN2FACQb.md │ │ │ │ │ ├── match-query@hwZQg4HXZeQRX5ty47U9h.md │ │ │ │ │ ├── must@f63E0rn-Ayz_AAUQM-o-N.md │ │ │ │ │ ├── must_not@gYMl1QixMYQ6-6zCNhyEG.md │ │ │ │ │ ├── nested-aggregations@NRMC5M3ZFHwHZLpPPPo5v.md │ │ │ │ │ ├── nested@vgXst45dhcu2w29Wm8Xwp.md │ │ │ │ │ ├── node-instance@XjeQ-O1XA9q2wCIyzXLHg.md │ │ │ │ │ ├── numeric@_L1JMJIEJQ3VzQc0LfhfF.md │ │ │ │ │ ├── object@RHUajAEJqQy9lnKUv-yiF.md │ │ │ │ │ ├── optimizing-bulk-indexing@Vv7YmE4OqTsn2WWHS6bQW.md │ │ │ │ │ ├── pagination@-GcXnJzacIDHkoZFzmoq0.md │ │ │ │ │ ├── pipeline-aggregations@ngYPDkTwj1e4HTFYJZ8ru.md │ │ │ │ │ ├── pivot@MSPIbD2eaqpgjbdXRh3Tg.md │ │ │ │ │ ├── prefix-query@dFKT1qTnnJwAreg9E0GsF.md │ │ │ │ │ ├── primary-shards@nkqoh4_V4VRyETqN0ci1R.md │ │ │ │ │ ├── query-dsl@4-hkqr1z0p56K0HzbifEs.md │ │ │ │ │ ├── query@GUxc44CiMH8DAaHEB8H1I.md │ │ │ │ │ ├── range--date-range@yVjpNuTx5StM7g0Jojmc2.md │ │ │ │ │ ├── range-query@h0u093c6Ccx9SllBehnYt.md │ │ │ │ │ ├── reindex-api@s1Finic6tTeSbgXt1nz30.md │ │ │ │ │ ├── replica-shards@ANeRCig1fihD5-4a7l9lz.md │ │ │ │ │ ├── rest-api-basics@ciLSkWlj0_WzCUydb9Cdz.md │ │ │ │ │ ├── roles--users@xv_a_A4QJuM3Af_My0VXj.md │ │ │ │ │ ├── rollover-policies@-jlIcMsKptM9AoST6mCOh.md │ │ │ │ │ ├── running-with-docker@hMmoVhZnoE0CdY-C135DW.md │ │ │ │ │ ├── search-analyzer@txSx-r5A7erBVXOI18R4f.md │ │ │ │ │ ├── search-engines-vs-relational-dbs@rWyeaFLWQdykUQMOn8t9k.md │ │ │ │ │ ├── segment-merging@v2h-DzgtEFgE5Bu4dpOTE.md │ │ │ │ │ ├── semantic-search@ZEM809HNlJtNQCfFmoFdi.md │ │ │ │ │ ├── should@QukRBV4aCfUtUE7L-qriv.md │ │ │ │ │ ├── slm@ghPkYADvzyvPZbzt5Fnmz.md │ │ │ │ │ ├── snapshots--restore@mw08QuJPgFHssk5Ur8PRY.md │ │ │ │ │ ├── sorting@lSYyRKgtY7PEk4ESy3uRK.md │ │ │ │ │ ├── source-filtering@b9XUvx-4qAMwghgy-LVat.md │ │ │ │ │ ├── sql@Hg5LjcPxxBJyFcfhbrE_o.md │ │ │ │ │ ├── standard-analyzer@XDzjBGYxgiGOiNB_JBTRd.md │ │ │ │ │ ├── stats--extended-stats@qCdD7orsutXfMeLSbyyWd.md │ │ │ │ │ ├── synonyms-graph@8FtfvlvLXXlOX-D6EDvFj.md │ │ │ │ │ ├── term-query@TIOwE5LY6D4y6DwYEsZXC.md │ │ │ │ │ ├── terms@yx5BiPNalUkKBH7bhwbEi.md │ │ │ │ │ ├── text@Fmxstc6ZjXnMLpnWkZGOA.md │ │ │ │ │ ├── the-analyze-api@59-tr4ff4QmFFJCN_Vcfh.md │ │ │ │ │ ├── the-elk-stack@lmc1Eu4oacxPT778aGya5.md │ │ │ │ │ ├── the-inverted-index@jx0CS3mRr5MB95cTRQMtv.md │ │ │ │ │ ├── the-split-brain-problem@Q6djSLPsTlIBfXFOsael7.md │ │ │ │ │ ├── transform-api@C3JSN-6jRikQjxifLu9Vk.md │ │ │ │ │ ├── understanding-similarity@c9rILhjxosufXg4-_ffVi.md │ │ │ │ │ ├── update-by-query@q-u0rz7mc0ohFUYkXjeD6.md │ │ │ │ │ ├── update-document@5HcPuuPpsNudiuzpAFU8z.md │ │ │ │ │ ├── value-count@q8SWm-tJ9c7uIY6wxzQdI.md │ │ │ │ │ ├── vector-search@MH1AKsuv654fdXX6hVhtv.md │ │ │ │ │ └── wildcard-query@KtRZM5xTa4rHE7JnTAwAD.md │ │ │ │ └── elasticsearch.md │ │ │ ├── engineering-manager/ │ │ │ │ ├── content/ │ │ │ │ │ ├── agile-methodologies@n9gvPHn4c1U-l6v-W9v6r.md │ │ │ │ │ ├── api-strategy@ukmMMWacekcejEiEKCLzh.md │ │ │ │ │ ├── architectural-decision-making@FtWNnOE3zObmjS-Og26M3.md │ │ │ │ │ ├── architecture-documentation@gHhNi32MSBmqk-oKOy-uj.md │ │ │ │ │ ├── best-practices@4-MCXFOkMGcN369OPG-vw.md │ │ │ │ │ ├── bias-recognition--mitigation@g9FvFKC715tZL2ZGlPl3N.md │ │ │ │ │ ├── blameless-post-mortems@fYkKo8D35AHd8agr3YrIP.md │ │ │ │ │ ├── board-presentations@5MM1ccB1pmQcd3Uyjmbr7.md │ │ │ │ │ ├── brown-bags@S8-nwYKlG7YHL2dWwR303.md │ │ │ │ │ ├── budget-planning@oqjr26B27SHSYVQ4IFnA1.md │ │ │ │ │ ├── budget-requests@pLUOU2AmAJ9aJAmIlVD7D.md │ │ │ │ │ ├── build-vs-buy-evaluation@H0aav5qKDNiNegJOGP2rx.md │ │ │ │ │ ├── business-case-development@vhOHvfF_lfQrrOK6sGLTY.md │ │ │ │ │ ├── business-continuity@FwK-B7jRbBXVnuY9JxI1w.md │ │ │ │ │ ├── business-continuity@v6N7BH0B55gX0oNXb55D7.md │ │ │ │ │ ├── career-development-planning@fhFSR_N4ZDTHINEinubHG.md │ │ │ │ │ ├── change-management@tt02qGHSn4fPbpboZ1Ni_.md │ │ │ │ │ ├── change-strategy@1__zRE1iu1FDX9ynpWSBS.md │ │ │ │ │ ├── cicd-implementation@gAEmpSMvNyjmTa5q9oZSg.md │ │ │ │ │ ├── code-review-best-practices@40yK6XzI8lSxdiAXxtF75.md │ │ │ │ │ ├── communication-planning@Mxi4g_PzT0oYc3NgR0UVg.md │ │ │ │ │ ├── company-culture@KA0y6KdVTjJFeX3frHUNo.md │ │ │ │ │ ├── competitive-analysis@76GjwwEYaEX_kh02OSpdr.md │ │ │ │ │ ├── competitive-analysis@TQY4hjo56rDdlbzjs_-nl.md │ │ │ │ │ ├── conflict-resolution@QA5CR5f0geC_RQc_SOK-N.md │ │ │ │ │ ├── contingency-planning@2RwpGPegD2GyiiV6SVbbM.md │ │ │ │ │ ├── contingency-planning@mIUx8zAHWyPWPGvxuTK4y.md │ │ │ │ │ ├── cost-optimization@rbhZJZtRV1ZZ5QaYW77ry.md │ │ │ │ │ ├── cross-department-collaboration@Hb_rZe4k37Rr0enSh7woV.md │ │ │ │ │ ├── cross-functional-collaboration@ZyNbSBd8plAZ5lt5OEUYu.md │ │ │ │ │ ├── culture-evolution@y7YHIz7OI4sNfC_nhfLcu.md │ │ │ │ │ ├── customer-feedback-integration@QEViLNgG4Uv9Q9PWig0u3.md │ │ │ │ │ ├── customer-success-alignment@A-Aa7VdDAYfaMUZD_cWwP.md │ │ │ │ │ ├── decision-records@dTjp_rEl1ITZjvELqVtfv.md │ │ │ │ │ ├── defining-and-enforcing-values@ZuZuzwy-Frsn_PFJZVuAQ.md │ │ │ │ │ ├── delegation@bx2SMhR58ud45se5dK7qS.md │ │ │ │ │ ├── dependency-management@hH-UDVFlgKoMJcI1ssDFv.md │ │ │ │ │ ├── development--release-workflow@bpJPDbifPwS4ScOoATlEI.md │ │ │ │ │ ├── disaster-recovery@KOTzJ8e7mc0wmF46vrj3I.md │ │ │ │ │ ├── disaster-recovery@nnoVA8W70hrNDxN3XQCVL.md │ │ │ │ │ ├── em-vs-tech-lead-vs-ic@oKbeLp4YB8rI1Q3vi0EnG.md │ │ │ │ │ ├── emergency-protocols@Xaeb67Nqdi0kwvehQUYeJ.md │ │ │ │ │ ├── emotional-intelligence@h7gEQNbGiabDA1q1Bk_IB.md │ │ │ │ │ ├── executive-summaries@CHothgVl8ulFthwS7uKqK.md │ │ │ │ │ ├── external-collaboration@Jctp5tPCK_vY35_bh7QFk.md │ │ │ │ │ ├── feature-prioritization@2QwMcO27H3ygtLlWVplxr.md │ │ │ │ │ ├── feedback-delivery@Az9GgkLFoat2t_sYRUBv5.md │ │ │ │ │ ├── hiring-and-recruitment@3na5mBIPl5f6mjEzkgD_C.md │ │ │ │ │ ├── impact-assessment@oGmtkOGVgA4huGJqkBEfj.md │ │ │ │ │ ├── incident-management@o1xPrfg8iNWQpD12xsbQJ.md │ │ │ │ │ ├── inclusive-environment-creation@6iM0n4faMNhk4mezS9AcG.md │ │ │ │ │ ├── innovation-fostering@njqjYPMQK3nGYtqHzUylo.md │ │ │ │ │ ├── integration-management@f3P0fF4UzgVQZuMVTVmP1.md │ │ │ │ │ ├── knowledge-bases@7t9jmv3_lRCEG5y5DA8bF.md │ │ │ │ │ ├── knowledge-sharing-practices@74-7hDXaBVXYo6LJdgac_.md │ │ │ │ │ ├── kpi-definition@Wd8FCEaGZBTvsD-k4t0r4.md │ │ │ │ │ ├── learning-culture-development@aeD-kBZEr1NHFtAD8yHI_.md │ │ │ │ │ ├── legacy-system-retirement@9mNLfntu1TPjcX3RoUeMq.md │ │ │ │ │ ├── legacy-system-retirement@QUxpEK8smXRBs2gMdDInB.md │ │ │ │ │ ├── lessons-learned@HUQ_-vU2pdBPyF0mBocHz.md │ │ │ │ │ ├── market-awareness@P2gIOt-i0sQEOMBo-XjZO.md │ │ │ │ │ ├── mentoring-and-coaching@0ULnfq0ZFJXgoLbKM1gxC.md │ │ │ │ │ ├── mentoring-programs@g6K9fxWdRQT5h_u4Y_bkq.md │ │ │ │ │ ├── migration-planning@QMAIEkVFHrrP6lUWvd0S8.md │ │ │ │ │ ├── milestone-management@PXobPGPgCX3_55w4UtxT9.md │ │ │ │ │ ├── one-on-one-meetings@b3qoH_LuW-Gz4N8WdGnZs.md │ │ │ │ │ ├── organization-structure@mjMRNhPkeb4lEZXBb8Iot.md │ │ │ │ │ ├── people@aSZ2uVCmpAdEPjJt6VKG4.md │ │ │ │ │ ├── performance-evaluations@eJzYnoB6sArLjXRm51cM4.md │ │ │ │ │ ├── politics-navigation@Zoz01JcNU69gr95IcWhYM.md │ │ │ │ │ ├── post-incident-analysis@8zyK34SwHry2lrWchw0KZ.md │ │ │ │ │ ├── process-changes@ev9ZKygqETctLMSt1GAFU.md │ │ │ │ │ ├── process-documentation@Kwy9O1z2hpeE0Sb3qtxEg.md │ │ │ │ │ ├── process@iZFn0FaRdrGv_-_8zii_-.md │ │ │ │ │ ├── product-strategy-alignment@nC5dfGlxbLoXUAp2u-6Gl.md │ │ │ │ │ ├── product@p9ecMvHCqjmvxf67di7pY.md │ │ │ │ │ ├── production-issues-management@kQG_wk66-51dA4Ly9ivjM.md │ │ │ │ │ ├── production-issues-management@tmY4Ktu6luFg5wKylJW76.md │ │ │ │ │ ├── project-postmortems@g9WWa50V8ZbhIJgBRx0Nd.md │ │ │ │ │ ├── project-tracking@SuT6q5lMMSyVkadlQp7iU.md │ │ │ │ │ ├── quality-metrics@ZWWsuFm_G4kvvl_cv8l_t.md │ │ │ │ │ ├── recognition-programs@Vb3A4a-UpGTAEs-dVI66s.md │ │ │ │ │ ├── release-management@-Qc6E3gkUUonfzifYqeJJ.md │ │ │ │ │ ├── reorganizations@5_CE3p5jMA1uEqFNfp7Kh.md │ │ │ │ │ ├── resistance-management@vfp6VmWnhpre_eDORg7ht.md │ │ │ │ │ ├── resource-allocation@4v5yLKYVcMh0s7SQuf__C.md │ │ │ │ │ ├── resource-forecasting@iwwxnSVvCmZ57stXwzk8G.md │ │ │ │ │ ├── responsibility-shifts@eIlW4mZKNQfBsTDmZf7ex.md │ │ │ │ │ ├── risk-management@mgw6M8I9qy1EoJpJV-gy1.md │ │ │ │ │ ├── roi-analysis@XinUWPahOdufmLYcEwMj_.md │ │ │ │ │ ├── role-transitions@FayHWdUHHYFFBwnXx37Gk.md │ │ │ │ │ ├── scaling-infrastructure@EyoVFmqOJbH1sAPHLISFt.md │ │ │ │ │ ├── scope-management@C-lJJSjT8Cxw_UT3ocFsO.md │ │ │ │ │ ├── security--best-practices@sQCLhk__jvbityuuLlxiW.md │ │ │ │ │ ├── security-incident-handling@FNp4-RgPvfC76pJKjX56a.md │ │ │ │ │ ├── security-incident-handling@QFhhOgwz_bgZgOfKFg5XA.md │ │ │ │ │ ├── service-recovery@2fHcb1dAnf34APCAAlwnR.md │ │ │ │ │ ├── social-connections@LE3ykySYFL23KvuwxeBaR.md │ │ │ │ │ ├── software-engineering-background@fBENrXdMhoGYgL_d96tgo.md │ │ │ │ │ ├── sprint-planning@7BcToTqL78QmG4qb43X5Q.md │ │ │ │ │ ├── stakeholder-communication@irEwTIubCjORnlH27QpEo.md │ │ │ │ │ ├── stakeholder-management@34uOnta7dKOyZL0et_RC8.md │ │ │ │ │ ├── stakeholder-management@TVqVlJqegLZRSkwNoHbBf.md │ │ │ │ │ ├── status-reporting@gqKEgKjEu5sOf5Gl-HS-j.md │ │ │ │ │ ├── strategic-proposals@uBrsV_EocAkRWEqJYjoZn.md │ │ │ │ │ ├── system-design-and-architecture@iX4HPgoiEbc_gze1A01n4.md │ │ │ │ │ ├── system-monitoring--performance@pduPcv2QPpVmVvDdK4CPi.md │ │ │ │ │ ├── team-health-metrics@KPDHk7tl_BnIj_obnq3Kl.md │ │ │ │ │ ├── team-meetings@e0ZuiCoS8sJ0XB1lNiz7_.md │ │ │ │ │ ├── team-mergers@ph0U4l2alVJ8lUJ96q7co.md │ │ │ │ │ ├── team-motivation@U_oOnDXkCE387r9olvMZB.md │ │ │ │ │ ├── team-structure-and-design@tPDmXXjvFI_8-MTo_dEUw.md │ │ │ │ │ ├── team-traditions-and-rituals@8Nro6PTkEkNugYBjQfJ6O.md │ │ │ │ │ ├── tech-talks@2LO0iWf-y3l4rA1n_oG1g.md │ │ │ │ │ ├── technical-customer-support@V5s2i-L2tsZFNxMLN_e_U.md │ │ │ │ │ ├── technical-debt-and-management@EY6Hk5wPd9Y_VA1UROk44.md │ │ │ │ │ ├── technical-documentation@_2xnTKt5yi__jj_WgcLa7.md │ │ │ │ │ ├── technical-excellence-mindset@Cq0OFaWqSRathZO-bxBrP.md │ │ │ │ │ ├── technical-partnerships@tCT2syTMyEHCspDLXxk6R.md │ │ │ │ │ ├── technical-risk-assessment@d7zMBhMFgY9MwmKC9CVVh.md │ │ │ │ │ ├── technical-roadmapping@ikCJ8Ybu2AD1w5VuPNVAO.md │ │ │ │ │ ├── technical-standards-setting@C2YsaZ32An_UXV8lB7opm.md │ │ │ │ │ ├── technology-adoption@jerPoyfCcwZbNuE_cl1hq.md │ │ │ │ │ ├── technology-partnerships@xMN575nnnQJeHe2oJYw17.md │ │ │ │ │ ├── testing-strategies@q5SJyM1d8cQzzAcR-kotB.md │ │ │ │ │ ├── timeline-estimation@QWO5QFS7kXwfu3aa8IiRt.md │ │ │ │ │ ├── tool-transitions@f-52wRfPRrA9iniOMYQB7.md │ │ │ │ │ ├── trust--influence-building@7PBmYoSmIgZT21a2Ip3_S.md │ │ │ │ │ ├── velocity-tracking@idd92ZTBVUzptBl5jRdc3.md │ │ │ │ │ ├── vendor-management@Imgt669vbUT_Iec2o4Gvt.md │ │ │ │ │ ├── vendor-relationships@WYoqfmk5ejB2UOiYXh4Zi.md │ │ │ │ │ ├── vision-alignment@QssXmeifoI3dtu-eXp8PK.md │ │ │ │ │ ├── war-room-management@LQ3YfAgJ4UaDgtnN-cMht.md │ │ │ │ │ └── what-is-engineering-management@_hYN0gEi9BL24nptEtXWU.md │ │ │ │ ├── engineering-manager.json │ │ │ │ ├── engineering-manager.md │ │ │ │ └── faqs.astro │ │ │ ├── flutter/ │ │ │ │ ├── content/ │ │ │ │ │ ├── 3-trees@24xYv3joKX1roqRGfBXmr.md │ │ │ │ │ ├── advanced-dart@bvojoCWJRSB6pdBFM1SbY.md │ │ │ │ │ ├── analytics@s5OVzjQp6k7rSphhv3hZE.md │ │ │ │ │ ├── android-studio@QHPiMRg4IJXDErrEYamrJ.md │ │ │ │ │ ├── animated-builder@M6iJ0VZWB8mreItlxvvqI.md │ │ │ │ │ ├── animated-widget@yRY8MJuXxhDV6Hd-hTMRu.md │ │ │ │ │ ├── animation-controller@eXaP_U-EzptBuOp5R0KK3.md │ │ │ │ │ ├── animations@KLoL-055KShGrQ-NQosy8.md │ │ │ │ │ ├── app-store@JHkdIQRgf1bbL-HASvGi0.md │ │ │ │ │ ├── appstore@JHkdIQRgf1bbL-HASvGi0.md │ │ │ │ │ ├── async--await@_guWOSGfTpErGkzs69g1R.md │ │ │ │ │ ├── authentication@lCVoKYJlQEYE2viAuThk7.md │ │ │ │ │ ├── basics-of-dart@AubSeLi2nwNTUA-L3Kfn4.md │ │ │ │ │ ├── bdd@0fpwuPTW94iyNlsjXcPOO.md │ │ │ │ │ ├── bitrise@1xTlq-0MaHN15KZid31Dk.md │ │ │ │ │ ├── bloc@ZfkaTipYJ1jLY-RC3mdmt.md │ │ │ │ │ ├── built-in-types@TT6HoilzgmS8CAPiTTKZ0.md │ │ │ │ │ ├── changenotifier@VRWeqMV7qOdPzM5RfgpGF.md │ │ │ │ │ ├── ci--cd@ekKzwQCMOYJLVN5KAK-ew.md │ │ │ │ │ ├── cloud-functions@bVeHBEoR_4kfPsEHmVYbp.md │ │ │ │ │ ├── codemagic@DcSBkhcOG55_dNaLF1FWA.md │ │ │ │ │ ├── collections@Nx6YqH-MiqX-UFMQNqeEp.md │ │ │ │ │ ├── control-flow-statements@keS-4La_a227quDYYbOJT.md │ │ │ │ │ ├── core-libraries@nQio4JabDrFCmScx59Qit.md │ │ │ │ │ ├── cupertino-widgets@L8oUQA4OAINr-WshHaOPZ.md │ │ │ │ │ ├── curved-animation@F1kbyjRR2uHRbTe90LTFP.md │ │ │ │ │ ├── dart-pad@vR38pAZOfI55R7N7NLY5N.md │ │ │ │ │ ├── dependency-injection@fhPl9rycPa1r10fuEuNhi.md │ │ │ │ │ ├── deployment@mdSWrWi-1n_YlY5iTJwZp.md │ │ │ │ │ ├── design-patterns@MLdt_37kpF2eV0oy56GZF.md │ │ │ │ │ ├── design-principles@drwRSEnl1-ziCvxWJZMJ2.md │ │ │ │ │ ├── dev-tools@Jti4RmGDn7jVaHOxtTwPc.md │ │ │ │ │ ├── development-environment@HCJXVgnglYuRhK0zl3iPG.md │ │ │ │ │ ├── fast-lane@hd4O2UPI9bZiyGuCMA-J4.md │ │ │ │ │ ├── firebase-analytics@g2qXhkk6oGaBJy8Y2JOwW.md │ │ │ │ │ ├── firebase-app-dist@akQ7SEHiZm9pZK49rsbO2.md │ │ │ │ │ ├── firebase@EVd1rLBHjKbtgkIE7InS7.md │ │ │ │ │ ├── firestore@cMfsRtvzvDZZJ0TqeUOxm.md │ │ │ │ │ ├── flutter-cli@FrbleiQ4BbIEbR4_v9o8N.md │ │ │ │ │ ├── flutter-inspector@ehlGkYI3dqzu3B1pkhg9t.md │ │ │ │ │ ├── flutter-internals@dgdv8sDKkgQ365mR0kBR3.md │ │ │ │ │ ├── flutter-outline@wisXrfrmnZYB3hs5f3_VS.md │ │ │ │ │ ├── flutter-pub--dart-pub@9xZlW6S-5-uDNWb7qzBmG.md │ │ │ │ │ ├── fonts@cXsIM4rZsBChVdrm8poOp.md │ │ │ │ │ ├── functional-programming@x5q_bWpxmpJFK8eaWZxuY.md │ │ │ │ │ ├── functions@Pek6vOO-qKCetTznCGv6f.md │ │ │ │ │ ├── futures@I1cqvOsVD7-86VPnrdTAv.md │ │ │ │ │ ├── fvm@m92WPPeZUIeD8IgunLXe2.md │ │ │ │ │ ├── getx@nK_ZKTfNc8P-RJoz5jY32.md │ │ │ │ │ ├── git@yQyIPT09n62f1v8JbkoYJ.md │ │ │ │ │ ├── github-actions@8rCjcuZNL9kicMBXiL46l.md │ │ │ │ │ ├── github@V0R4VyQ64Bwwj6O8XbZyF.md │ │ │ │ │ ├── google-analytics@3IQRLoW9OEf0121-w4o5m.md │ │ │ │ │ ├── graphql@Ym-8x_FNrs1C-Ki3aykIW.md │ │ │ │ │ ├── guidelines--protocols@BjE4Qvjpi0i_s4Oib9765.md │ │ │ │ │ ├── hero@5WPok-30ubqU8uox7XiSf.md │ │ │ │ │ ├── images@7v3VFKGaRFjm87319gBpw.md │ │ │ │ │ ├── immutability@lHzW9dyF1u3qmjfdb3vHe.md │ │ │ │ │ ├── inherited-widgets@DKt8U-iZcrXU5gWGRONqZ.md │ │ │ │ │ ├── integration-testing@2RqGKWi13TLleTT7KpdZV.md │ │ │ │ │ ├── intellij-idea@lkABkFigkVzl1x4_8xEZz.md │ │ │ │ │ ├── isolates@t_75W0nyd0UBytwvJAQ1x.md │ │ │ │ │ ├── json-serialize--deserialize@TMHrKxnciIpd8F1WLjray.md │ │ │ │ │ ├── lambdas@tMeuk-nsFMx3kVS7Yn4T0.md │ │ │ │ │ ├── lists@C4wC3_wqNGl8umJ050-hJ.md │ │ │ │ │ ├── material-widgets@DrQqq-C8XdiXVXBMLS4Wy.md │ │ │ │ │ ├── memory-allocation@ZsruX7gozx2-0cQNIkZ6o.md │ │ │ │ │ ├── mix-panel@RQMRtlRxvp0CZJzCjRtPu.md │ │ │ │ │ ├── oop@1-dfwbhXgeRT3VVq3RSRv.md │ │ │ │ │ ├── opacity@aet6mLBkB1BtxI8e7x-h3.md │ │ │ │ │ ├── operators@Q2S4__BB30KljB7SlquJx.md │ │ │ │ │ ├── other-file-types@WnG31VsKQRlxGX85qNIum.md │ │ │ │ │ ├── package-managers@med4T8PVkxIo465VuKDEj.md │ │ │ │ │ ├── playstore@wF8Iy7V-f52qQxOsAJobz.md │ │ │ │ │ ├── provider@MfqUMirRIEiM7pr5NiGF_.md │ │ │ │ │ ├── pubdev@lXruqvSShlQrdVEo_xPm1.md │ │ │ │ │ ├── push-notifications@YzJrDGmfS0vbWjnPnSFVo.md │ │ │ │ │ ├── reactive-programming@wbush8eQsi9aDSRobGAyG.md │ │ │ │ │ ├── redux@DoqnE2Iy3lKzEm88qjKI-.md │ │ │ │ │ ├── remote-cnofig@4ZbGj54WR5iuk0V8X_cpL.md │ │ │ │ │ ├── remote-config@4ZbGj54WR5iuk0V8X_cpL.md │ │ │ │ │ ├── render-objects@9ytV8xPq60z7doFG07PHi.md │ │ │ │ │ ├── repo-hosting-services@qGN95GG0Q3dur72GS3EDX.md │ │ │ │ │ ├── responsive-widgets@lCpJQ8GZp5KhpGO4Sttgu.md │ │ │ │ │ ├── restful-apis@soi3pRxOp6A4ZmGZPQCn3.md │ │ │ │ │ ├── riverpod@KWT-Lu-HCeA3GdZawD0a7.md │ │ │ │ │ ├── rxdart@ozQQKmfO_Ir9aJIMBvijK.md │ │ │ │ │ ├── segment@PQ7o9Jw9SBEhHl8cc_46x.md │ │ │ │ │ ├── shared-preferences@Fdv7Nu26Egtl9tklKn5-8.md │ │ │ │ │ ├── solid-principles@VKqo4dAcy-JiZo7Lw5jeg.md │ │ │ │ │ ├── sqlite@NPaqiuUpzQbrsXA5XNI7U.md │ │ │ │ │ ├── state-management@bYJ0G-g4R5faoJfFjRQW7.md │ │ │ │ │ ├── stateful-widgets@07tpSQeeMLKggWwdUXAej.md │ │ │ │ │ ├── stateless-widgets@e-m4iKuK6NqFaQLE5viNI.md │ │ │ │ │ ├── storage@P_wptV7oenaYwef1QhKhu.md │ │ │ │ │ ├── storage@x4B0gmCo5sXFHYs3CYsOn.md │ │ │ │ │ ├── streams@fIOq8ZumOrAo5uz4nbq2k.md │ │ │ │ │ ├── styled-widgets@wBSdmrVPv3Zuys3X8VvBm.md │ │ │ │ │ ├── tdd@JbM-Hbf2ShUQt268ZMeZA.md │ │ │ │ │ ├── testing@zGkDu5j8ln8U9kZgz3TDJ.md │ │ │ │ │ ├── unit-testing@BCsv2fKHVxaB22RJJJPWM.md │ │ │ │ │ ├── valuenotifier@aRmdyC2pzmR9r1ybU2CTP.md │ │ │ │ │ ├── variables@P-SbMLN-AaNMss_7X0_5N.md │ │ │ │ │ ├── version-control-systems@2nz5JoAPsZftFNLypr3Is.md │ │ │ │ │ ├── vs-code@HMDsgljLshA63XX-hhAxV.md │ │ │ │ │ ├── web-sockets@SUFuHR-r6NfAzIICXGHkK.md │ │ │ │ │ ├── widget-testing@9hNfDtZK7_b9qUOXlFGFZ.md │ │ │ │ │ ├── widgets@dy2Jep9hIIECaLutx-3K0.md │ │ │ │ │ ├── working-with-apis@9Az7tmevGI6bVqCTvVL50.md │ │ │ │ │ └── working-with-assets@z50iixpcCMe9sTh-gwTI3.md │ │ │ │ ├── content-old/ │ │ │ │ │ ├── advanced-dart/ │ │ │ │ │ │ ├── async-await.md │ │ │ │ │ │ ├── collections.md │ │ │ │ │ │ ├── core-libraries.md │ │ │ │ │ │ ├── functional-programming.md │ │ │ │ │ │ ├── futures.md │ │ │ │ │ │ ├── index.md │ │ │ │ │ │ ├── isolates.md │ │ │ │ │ │ ├── lambdas.md │ │ │ │ │ │ ├── lists.md │ │ │ │ │ │ └── streams.md │ │ │ │ │ ├── analytics/ │ │ │ │ │ │ ├── firebase-analytics.md │ │ │ │ │ │ ├── google-analytics.md │ │ │ │ │ │ ├── index.md │ │ │ │ │ │ ├── mix-panel.md │ │ │ │ │ │ └── segment.md │ │ │ │ │ ├── animations/ │ │ │ │ │ │ ├── animated-builder.md │ │ │ │ │ │ ├── animated-widget.md │ │ │ │ │ │ ├── animation-controller.md │ │ │ │ │ │ ├── curved-animations.md │ │ │ │ │ │ ├── hero.md │ │ │ │ │ │ ├── index.md │ │ │ │ │ │ └── opacity.md │ │ │ │ │ ├── ci-cd/ │ │ │ │ │ │ ├── bitrise.md │ │ │ │ │ │ ├── codemagic.md │ │ │ │ │ │ ├── fast-lane.md │ │ │ │ │ │ ├── firebase-app-distribution.md │ │ │ │ │ │ ├── github-actions.md │ │ │ │ │ │ └── index.md │ │ │ │ │ ├── dart-basics/ │ │ │ │ │ │ ├── built-in-types.md │ │ │ │ │ │ ├── control-flow-statements.md │ │ │ │ │ │ ├── dart-pad.md │ │ │ │ │ │ ├── functions.md │ │ │ │ │ │ ├── index.md │ │ │ │ │ │ ├── operators.md │ │ │ │ │ │ └── variables.md │ │ │ │ │ ├── deployment/ │ │ │ │ │ │ ├── appstore.md │ │ │ │ │ │ ├── guidelines-and-protocols.md │ │ │ │ │ │ ├── index.md │ │ │ │ │ │ └── playstore.md │ │ │ │ │ ├── design-principles/ │ │ │ │ │ │ ├── dependency-injection.md │ │ │ │ │ │ ├── design-patterns.md │ │ │ │ │ │ ├── index.md │ │ │ │ │ │ ├── oop.md │ │ │ │ │ │ └── solid-principles.md │ │ │ │ │ ├── dev-tools/ │ │ │ │ │ │ ├── flutter-inspector.md │ │ │ │ │ │ ├── flutter-outline.md │ │ │ │ │ │ ├── index.md │ │ │ │ │ │ └── memory-allocation.md │ │ │ │ │ ├── flutter-internals/ │ │ │ │ │ │ ├── 3-trees.md │ │ │ │ │ │ ├── immutability.md │ │ │ │ │ │ ├── index.md │ │ │ │ │ │ └── render-objects.md │ │ │ │ │ ├── package-manager/ │ │ │ │ │ │ ├── flutter-pub-dart-pub.md │ │ │ │ │ │ ├── index.md │ │ │ │ │ │ └── pub-dev.md │ │ │ │ │ ├── reactive-programming/ │ │ │ │ │ │ ├── index.md │ │ │ │ │ │ └── rxdart.md │ │ │ │ │ ├── repo-hosting-services/ │ │ │ │ │ │ ├── github.md │ │ │ │ │ │ └── index.md │ │ │ │ │ ├── setup-development-environment/ │ │ │ │ │ │ ├── flutter-cli.md │ │ │ │ │ │ ├── fvm.md │ │ │ │ │ │ ├── ides/ │ │ │ │ │ │ │ ├── android-studio.md │ │ │ │ │ │ │ ├── index.md │ │ │ │ │ │ │ ├── intellij-idea.md │ │ │ │ │ │ │ └── vs-code.md │ │ │ │ │ │ └── index.md │ │ │ │ │ ├── state-management/ │ │ │ │ │ │ ├── bloc.md │ │ │ │ │ │ ├── change-notifier.md │ │ │ │ │ │ ├── get-x.md │ │ │ │ │ │ ├── index.md │ │ │ │ │ │ ├── provider.md │ │ │ │ │ │ ├── redux.md │ │ │ │ │ │ ├── riverpod.md │ │ │ │ │ │ ├── value-notifier.md │ │ │ │ │ │ └── velocity-x.md │ │ │ │ │ ├── storage/ │ │ │ │ │ │ ├── firebase/ │ │ │ │ │ │ │ ├── authentication.md │ │ │ │ │ │ │ ├── cloud-functions.md │ │ │ │ │ │ │ ├── firestore.md │ │ │ │ │ │ │ ├── index.md │ │ │ │ │ │ │ ├── push-notifications.md │ │ │ │ │ │ │ ├── remote-config.md │ │ │ │ │ │ │ └── storage.md │ │ │ │ │ │ ├── index.md │ │ │ │ │ │ ├── shared-preferences.md │ │ │ │ │ │ └── sqlite.md │ │ │ │ │ ├── testing/ │ │ │ │ │ │ ├── bdd.md │ │ │ │ │ │ ├── index.md │ │ │ │ │ │ ├── integration-testing.md │ │ │ │ │ │ ├── tdd.md │ │ │ │ │ │ ├── unit-testing.md │ │ │ │ │ │ └── widget-testing.md │ │ │ │ │ ├── version-control-systems/ │ │ │ │ │ │ ├── git.md │ │ │ │ │ │ └── index.md │ │ │ │ │ ├── widgets/ │ │ │ │ │ │ ├── index.md │ │ │ │ │ │ ├── inherited-widgets.md │ │ │ │ │ │ ├── responsive-widgets.md │ │ │ │ │ │ ├── stateful-widgets.md │ │ │ │ │ │ ├── stateless-widgets.md │ │ │ │ │ │ └── styled-widgets/ │ │ │ │ │ │ ├── cupertino-widgets.md │ │ │ │ │ │ ├── index.md │ │ │ │ │ │ └── material-widgets.md │ │ │ │ │ ├── working-with-apis/ │ │ │ │ │ │ ├── graphql.md │ │ │ │ │ │ ├── index.md │ │ │ │ │ │ ├── json.md │ │ │ │ │ │ ├── restful-apis.md │ │ │ │ │ │ └── web-sockets.md │ │ │ │ │ └── working-with-assets/ │ │ │ │ │ ├── fonts.md │ │ │ │ │ ├── images.md │ │ │ │ │ ├── index.md │ │ │ │ │ └── other-file-types.md │ │ │ │ ├── faqs.astro │ │ │ │ ├── flutter.json │ │ │ │ ├── flutter.md │ │ │ │ └── migration-mapping.json │ │ │ ├── frontend/ │ │ │ │ ├── content/ │ │ │ │ │ ├── accessibility@e-k6EhoxYG9h0x6vWOrDh.md │ │ │ │ │ ├── accessibility@iJIqi7ngpGHWAqtgdjgxB.md │ │ │ │ │ ├── agents@e4j6u0e_WqK1vfrUwJJ4M.md │ │ │ │ │ ├── ai-assisted-coding@ipcNHz8KbfpE57kNP15hP.md │ │ │ │ │ ├── ai-vs-traditional-coding@IZKl6PxbvgNkryAkdy3-p.md │ │ │ │ │ ├── ai-vs-traditional-techniques@IZKl6PxbvgNkryAkdy3-p.md │ │ │ │ │ ├── angular@-bHFIiXnoUQSov64WI9yo.md │ │ │ │ │ ├── angular@k6rp6Ua9qUEW_DA_fOg5u.md │ │ │ │ │ ├── anthropic@Lw2nR7x8PYgq1P5CxPAxi.md │ │ │ │ │ ├── antigravity@E7-LveK7jO2npxVTLUDfw.md │ │ │ │ │ ├── apollo@5eUbDdOTOfaOhUlZAmmXW.md │ │ │ │ │ ├── applications@Nx7mjvYgqLpmJ0_iSx5of.md │ │ │ │ │ ├── astro@iUxXq7beg55y76dkwhM13.md │ │ │ │ │ ├── astro@wA2fSYsbBYU02VJXAvUz8.md │ │ │ │ │ ├── auth-strategies@U5mD5FmVx7VWeKxDpQxB5.md │ │ │ │ │ ├── authentication-strategies@U5mD5FmVx7VWeKxDpQxB5.md │ │ │ │ │ ├── bem@dRDmS072xeNLX7p_X565w.md │ │ │ │ │ ├── biome@UvCVChB6NZ_yUg0RdIJ2o.md │ │ │ │ │ ├── bitbucket@DILBiQp7WWgSZ5hhtDW6A.md │ │ │ │ │ ├── browsers-and-how-they-work@P82WFaTPgQEPNp5IIuZ1Y.md │ │ │ │ │ ├── build-tools@i9z0stM4uKu27Cz6NIgNX.md │ │ │ │ │ ├── bun@j2H1qGosbveayviOCVkUs.md │ │ │ │ │ ├── cache-control@tWDmeXItfQDxB8Jij_V4L.md │ │ │ │ │ ├── claude-code@RcC1fVuePQZ59AsJfeTdR.md │ │ │ │ │ ├── cloudflare@_Uh-UFNe2wP2TV0x2lKY_.md │ │ │ │ │ ├── code-reviews@0TMdly8yiqnNR8sx36iqc.md │ │ │ │ │ ├── content-security-policy@rmcm0CZbtNVC9LZ14-H6h.md │ │ │ │ │ ├── copilot@HQrxxDxKN8gizvXRU5psW.md │ │ │ │ │ ├── cors@AfH2zCbqzw0Nisg1yyISS.md │ │ │ │ │ ├── credentials@opu2bAsmdWHqWqtsCscLC.md │ │ │ │ │ ├── csp@rmcm0CZbtNVC9LZ14-H6h.md │ │ │ │ │ ├── css-architecture@nPg_YWpMJtlhU2t2UD_6B.md │ │ │ │ │ ├── css-frameworks@XDTD8el6OwuQ55wC-X4iV.md │ │ │ │ │ ├── css-preprocessors@UTW1pP59dUehuf0zeHXqL.md │ │ │ │ │ ├── css@ZhJhf1M2OphYbEmduFq-9.md │ │ │ │ │ ├── cursor@CKlkVK_7GZ7xzIUHJqZr8.md │ │ │ │ │ ├── custom-elements@VxiQPgcYDFAT6WgSRWpIA.md │ │ │ │ │ ├── cypress@DaynCz5RR26gjT6N6gTDL.md │ │ │ │ │ ├── deployment@A1ZUy16cVRYqmHxoCtUb0.md │ │ │ │ │ ├── design-systems@ap4h4v5Sr4jBH3GwWSH8x.md │ │ │ │ │ ├── desktop-apps@KMA7NkxFbPoUDtFnGBFnj.md │ │ │ │ │ ├── device-orientation@Fd0hQh1DleM0gMzCpGou4.md │ │ │ │ │ ├── devtools-usage@JWU9jc12_ewaIKt3qWLcp.md │ │ │ │ │ ├── dns-and-how-it-works@hkxw9jPGYphmjhTjw8766.md │ │ │ │ │ ├── docs-generation@q7NpwqQXUp4wt2to-yFiP.md │ │ │ │ │ ├── documentation-generation@q7NpwqQXUp4wt2to-yFiP.md │ │ │ │ │ ├── electron@mQHpSyMR4Rra4mqAslgiS.md │ │ │ │ │ ├── eleventy@io0RHJWIcVxDhcYkV9d38.md │ │ │ │ │ ├── esbuild@4W7UXfdKIUsm1bUrjdTVT.md │ │ │ │ │ ├── eslint@NFjsI712_qP0IOmjuqXar.md │ │ │ │ │ ├── fetch-api--ajax-xhr@A4brX0efjZ0FFPTB4r6U0.md │ │ │ │ │ ├── flutter@2MRvAK9G9RGM_auWytcKh.md │ │ │ │ │ ├── flutter@dIQXjFEUAJAGxxfAYceHU.md │ │ │ │ │ ├── forms-and-validations@V5zucKEHnIPPjwHqsMPHF.md │ │ │ │ │ ├── gemini@Bic4PHhz-YqzPWRimJO83.md │ │ │ │ │ ├── git@R_I4SGYqLk5zze5I1zS_E.md │ │ │ │ │ ├── github-pages@vpzh9bNXCxgdDFQLsot2_.md │ │ │ │ │ ├── github@qmTVMJDsEhNIkiwE_UTYu.md │ │ │ │ │ ├── gitlab@zIoSJMX3cuzCgDYHjgbEh.md │ │ │ │ │ ├── graphql@L7AllJfKvClaam3y-u6DP.md │ │ │ │ │ ├── how-does-the-internet-work@yCnn-NfSxIybUQ2iTuUGq.md │ │ │ │ │ ├── how-llms-work@yKNdBbahm_h81xdMDT-qx.md │ │ │ │ │ ├── html-templates@Hk8AVonOd693_y1sykPqd.md │ │ │ │ │ ├── html@yWG2VUkaF5IJVVut6AiSy.md │ │ │ │ │ ├── https@uum7vOhOUR38vLuGZy8Oa.md │ │ │ │ │ ├── implementing-ai@MdYPIf_9ezbIp6Dm5Fyme.md │ │ │ │ │ ├── internet@VlNNwIEDWqQXtqkHWJYzC.md │ │ │ │ │ ├── ionic@xmRv6-L45m5MDpHmdHFCL.md │ │ │ │ │ ├── javascript@ODcfFEorkfJNupoQygM53.md │ │ │ │ │ ├── jest@g5itUjgRXd9vs9ujHezFl.md │ │ │ │ │ ├── learn-a-framework@eXezX7CVNyC1RuyU_I4yP.md │ │ │ │ │ ├── learn-dom-manipulation@0MAogsAID9R04R5TTO2Qa.md │ │ │ │ │ ├── learn-the-basics@PCirR2QiFYO89Fm-Ev3o1.md │ │ │ │ │ ├── learn-the-basics@UTupdqjOyLh7-56_0SXJ8.md │ │ │ │ │ ├── learn-the-basics@YFjzPKWDwzrgk2HUX952L.md │ │ │ │ │ ├── learn-the-basics@wQSjQqwKHfn5RGPk34BWI.md │ │ │ │ │ ├── lighthouse@dz7_QXoO7X0WmS5xuAhhJ.md │ │ │ │ │ ├── linters--formatters@9VcGfDBBD8YcKatj4VcH1.md │ │ │ │ │ ├── linters-and-formatters@9VcGfDBBD8YcKatj4VcH1.md │ │ │ │ │ ├── location@YbGGYoKJEx29PlvopUBiM.md │ │ │ │ │ ├── making-layouts@dXeYVMXv-3MRQ1ovOUuJW.md │ │ │ │ │ ├── mcp@XFy2gj7DmXeaCoc6MZo_j.md │ │ │ │ │ ├── mobile-apps@VOGKiG2EZVfCBAaa7Df0W.md │ │ │ │ │ ├── module-bundlers@hkSc_1x09m7-7BO7WzlDT.md │ │ │ │ │ ├── netlify@o8GstE5gxcGByh-D7lwqT.md │ │ │ │ │ ├── nextjs@V70884VcuXkfrfHyLGtUg.md │ │ │ │ │ ├── nextjs@zNFYAJaSq0YZXL5Rpx1NX.md │ │ │ │ │ ├── notifications@6AlcArOiJMhHXguAosDzn.md │ │ │ │ │ ├── npm@ib_FHinhrw8VuSet-xMF7.md │ │ │ │ │ ├── nuxtjs@BBsXxkbbEG-gnbM1xXKrj.md │ │ │ │ │ ├── nuxtjs@XWJxV42Dpu2D3xDK10Pn3.md │ │ │ │ │ ├── openai@-ye5ZtYFDoYGpj-UJaBP8.md │ │ │ │ │ ├── owasp-risks@JanR7I_lNnUCXhCMGLdn-.md │ │ │ │ │ ├── owasp-security-risks@JanR7I_lNnUCXhCMGLdn-.md │ │ │ │ │ ├── package-managers@IqvS1V-98cxko3e9sBQgP.md │ │ │ │ │ ├── parcel@NS-hwaWa5ebSmNNRoxFDp.md │ │ │ │ │ ├── payments@MAM1nuVk-h4AvTUk4nvmj.md │ │ │ │ │ ├── performance-metrics@X0Y3-IpPiFUCsNDK4RFxw.md │ │ │ │ │ ├── performance@6d8cjWZ4BuUjwT0seiuzJ.md │ │ │ │ │ ├── pick-a-framework@eXezX7CVNyC1RuyU_I4yP.md │ │ │ │ │ ├── playwright@jramLk8FGuaEH4YpHIyZT.md │ │ │ │ │ ├── pnpm@SLxA5qJFp_28TRzr1BjxZ.md │ │ │ │ │ ├── postcss@9WlPENh9g1xOv-zA64Tfg.md │ │ │ │ │ ├── prettier@zbkpu_gvQ4mgCiZKzS1xv.md │ │ │ │ │ ├── prompting-techniques@Gv_g4gK6pZK6l_0xAn34X.md │ │ │ │ │ ├── prpl-pattern@-DsETM9xLgHyGZthptj1Y.md │ │ │ │ │ ├── pwas@PoM77O2OtxPELxfrW1wtl.md │ │ │ │ │ ├── qwik@N5DCb6bDfgUnSdHPLYY4g.md │ │ │ │ │ ├── rail-model@xD5WfEP7Ez0oi3890UgmH.md │ │ │ │ │ ├── railway@PJRsqg5Vx9gQTodxaeZfz.md │ │ │ │ │ ├── react-native@dsTegXTyupjS8iU6I7Xiv.md │ │ │ │ │ ├── react-router@KJRkrFZIihCUBrOf579EU.md │ │ │ │ │ ├── react@SGDf_rbfmFSHlxI-Czzlz.md │ │ │ │ │ ├── react@tG5v3O4lNIFc2uCnacPak.md │ │ │ │ │ ├── refactoring@EYT2rTLZ8tUW2u8DOnAWF.md │ │ │ │ │ ├── relay-modern@0moPO23ol33WsjVXSpTGf.md │ │ │ │ │ ├── render@wfGz8pshGQARZ7qStGoSD.md │ │ │ │ │ ├── responsive-design@TKtWmArHn7elXRJdG6lDQ.md │ │ │ │ │ ├── rolldown@hE-DbpBpYrfB8tmBEjTnG.md │ │ │ │ │ ├── rollup@sCjErk7rfWAUvhl8Kfm3n.md │ │ │ │ │ ├── sass@kukEE5rMSPa4NeNjx21kt.md │ │ │ │ │ ├── seo-basics@mH_qff8R7R6eLQ1tPHLgG.md │ │ │ │ │ ├── server-sent-events@doPe92aUpo-8KWhi45lWK.md │ │ │ │ │ ├── service-workers@66ya3WdtlkjQyBTc3Lein.md │ │ │ │ │ ├── service-workers@TldWoXiqKxM4X3JONKAR7.md │ │ │ │ │ ├── shadow-dom@-SpsNeOZBkQfDA-rwzgPg.md │ │ │ │ │ ├── skills@xL8d-uHMpJKwUvT8z-Jia.md │ │ │ │ │ ├── solid-js@DxOSKnqAjZOPP-dq_U7oP.md │ │ │ │ │ ├── ssg@n0q32YhWEIAUwbGXexoqV.md │ │ │ │ │ ├── ssr@Cxspmb14_0i1tfw-ZLxEu.md │ │ │ │ │ ├── static-site-generators@n0q32YhWEIAUwbGXexoqV.md │ │ │ │ │ ├── storage@raoa-75p_DyBAycvy3yVv.md │ │ │ │ │ ├── streamed-responses@FyNXhHq1VIASNq-LI7JIu.md │ │ │ │ │ ├── svelte-kit@P4st_telfCwKLSAU2WsQP.md │ │ │ │ │ ├── svelte@OL8I6nOZ8hGGWmtxg_Mv8.md │ │ │ │ │ ├── svelte@ZR-qZ2Lcbu3FtqaMd3wM4.md │ │ │ │ │ ├── swc@h26uS3muFCabe6ekElZcI.md │ │ │ │ │ ├── tailwind@eghnfG4p7i-EDWfp3CQXC.md │ │ │ │ │ ├── tanstack-start@f9zlP6lGhfe6HBHVYiySu.md │ │ │ │ │ ├── tauri@GJctl0tVXe4B70s35RkLT.md │ │ │ │ │ ├── testing@igg4_hb3XE3vuvY8ufV-4.md │ │ │ │ │ ├── type-checkers@NQ95TJCe3E1IwEuBa__D6.md │ │ │ │ │ ├── type-checkers@hwPOGT0-duy3KfI8QaEwF.md │ │ │ │ │ ├── typescript@0asdhvwBH3gn-ercktV7A.md │ │ │ │ │ ├── using-devtools@3_sJHKTogkDoCjR518-OL.md │ │ │ │ │ ├── using-lighthouse@RIhHMHLsLLPhNl05Q9aBf.md │ │ │ │ │ ├── vcs-hosting@MXnFhZlNB1zTsBFDyni9H.md │ │ │ │ │ ├── vercel@kPJ0jZo5AbOzvZgv0zwp0.md │ │ │ │ │ ├── version-control-systems@NIY7c4TQEEHx0hATu-k5C.md │ │ │ │ │ ├── version-control@NIY7c4TQEEHx0hATu-k5C.md │ │ │ │ │ ├── vite@0Awx3zEI5_gYEIrD7IVX6.md │ │ │ │ │ ├── vitest@hVQ89f6G0LXEgHIOKHDYq.md │ │ │ │ │ ├── vuejs@3TE_iYvbklXK0be-5f2M7.md │ │ │ │ │ ├── vuejs@ERAdwL1G9M1bnx-fOm5ZA.md │ │ │ │ │ ├── vuepress@CMrss8E2W0eA6DVEqtPjT.md │ │ │ │ │ ├── web-apis@3HgiMfqihjWceSxd6ei8s.md │ │ │ │ │ ├── web-components@ruoFa3M4bUE3Dg6GXSiUI.md │ │ │ │ │ ├── web-security-basics@RDWbG3Iui6IPgp0shvXtg.md │ │ │ │ │ ├── web-security@RDWbG3Iui6IPgp0shvXtg.md │ │ │ │ │ ├── web-sockets@NDJR8UCoa31v45TBFP7we.md │ │ │ │ │ ├── webpack@twufEtHgxcRUWAUQ9bXus.md │ │ │ │ │ ├── what-is-domain-name@ZhSuu2VArnzPDp6dPQQSC.md │ │ │ │ │ ├── what-is-hosting@aqMaEY8gkKMikiqleV5EP.md │ │ │ │ │ ├── what-is-http@R12sArWVpbIs_PHxBqVaR.md │ │ │ │ │ ├── writing-css@XDTD8el6OwuQ55wC-X4iV.md │ │ │ │ │ ├── writing-semantic-html@z8-556o-PaHXjlytrawaF.md │ │ │ │ │ └── yarn@yrq3nOwFREzl-9EKnpU-e.md │ │ │ │ ├── faqs.astro │ │ │ │ ├── frontend-beginner.json │ │ │ │ ├── frontend.json │ │ │ │ ├── frontend.md │ │ │ │ └── migration-mapping.json │ │ │ ├── frontend-beginner/ │ │ │ │ └── content/ │ │ │ │ ├── css@ZhJhf1M2OphYbEmduFq-9.md │ │ │ │ ├── git@R_I4SGYqLk5zze5I1zS_E.md │ │ │ │ ├── github@qmTVMJDsEhNIkiwE_UTYu.md │ │ │ │ ├── html@yWG2VUkaF5IJVVut6AiSy.md │ │ │ │ ├── javascript@ODcfFEorkfJNupoQygM53.md │ │ │ │ ├── npm@ib_FHinhrw8VuSet-xMF7.md │ │ │ │ ├── react@tG5v3O4lNIFc2uCnacPak.md │ │ │ │ ├── tailwind@eghnfG4p7i-EDWfp3CQXC.md │ │ │ │ └── vitest@hVQ89f6G0LXEgHIOKHDYq.md │ │ │ ├── full-stack/ │ │ │ │ ├── content/ │ │ │ │ │ ├── ansible@rFXupYpUFfp7vZO8zh614.md │ │ │ │ │ ├── basic-aws-services@cUOfvOlQ_0Uu1VX3i67kJ.md │ │ │ │ │ ├── checkpoint---collaborative-work@zFGWxgLPcZoW7KIzlnSV9.md │ │ │ │ │ ├── checkpoint---external-packages@R4aeJNOrfWyVp3ea-qF4H.md │ │ │ │ │ ├── checkpoint---frontend-apps@7JU1cVggMDoZUV-adGsf-.md │ │ │ │ │ ├── checkpoint---interactivity@2DFzoIUjKdAKGjfu_SCfa.md │ │ │ │ │ ├── checkpoint---static-webpages@WsdUAEaI7FX6DKKhPXUHp.md │ │ │ │ │ ├── checkpoint--automation@sO_9-l4FECbaqiaFnyeXO.md │ │ │ │ │ ├── checkpoint--ci--cd@liaY1GnlOateB_ZKBjNpY.md │ │ │ │ │ ├── checkpoint--cli-apps@JGu0TKwAw-ieiG92BytYI.md │ │ │ │ │ ├── checkpoint--complete-app@v4NF25lJElAtkU0Rm6Fob.md │ │ │ │ │ ├── checkpoint--deployment@J2_IWAb1s9zZcxOY3NXm2.md │ │ │ │ │ ├── checkpoint--infrastructure@YVMyHFSCVF-GgXydq-SFJ.md │ │ │ │ │ ├── checkpoint--monitoring@NQmEl27eBPYhivcXdOEz3.md │ │ │ │ │ ├── checkpoint--simple-crud-apps@3EtGLO6cwkLc1-o9gwFNk.md │ │ │ │ │ ├── css@dAJHWmGeiYdzZ1ZjrWz1S.md │ │ │ │ │ ├── ec2@6oBIxYj8WPcUHidQ99tus.md │ │ │ │ │ ├── git@We2APJpOPTr-VNfowG0kI.md │ │ │ │ │ ├── github-actions@863KMXcFJzInvTp_-Ldmz.md │ │ │ │ │ ├── github@8sPXL8iClpPqje03ksses.md │ │ │ │ │ ├── html@B0kARTODvCBi0iOF8iiqI.md │ │ │ │ │ ├── javascript@T9PB6WQf-Fa9NXKKvVOy_.md │ │ │ │ │ ├── jwt-auth@vHojhJYjiN0IwruEqi1Dv.md │ │ │ │ │ ├── linux-basics@SHTSvMDqI7X1_ZT7-m--n.md │ │ │ │ │ ├── monit@y1SFX7uvWaCy4OYBnECLu.md │ │ │ │ │ ├── nodejs@_aA6Hp4KkgJeptqo8oKTg.md │ │ │ │ │ ├── npm@mGgx_QTEPmVKf6AijX9fi.md │ │ │ │ │ ├── postgresql@HGhnbMg6jh6cAmUH4DtOx.md │ │ │ │ │ ├── react@khoUtTUxdf8udAzN9_CAb.md │ │ │ │ │ ├── redis@Onfd7Sl8LG2sjh2aQY7gb.md │ │ │ │ │ ├── restful-apis@vmHbWdmMHF53otXIrqzRV.md │ │ │ │ │ ├── route53@5zyYpu9cyuTFwQCjTbHpS.md │ │ │ │ │ ├── s3@n2Xp_ijJ2OS8xhE7xMWxk.md │ │ │ │ │ ├── ses@B-cphY7Imnv6JBMujVIF7.md │ │ │ │ │ ├── tailwind-css@CVCqdPkq_hGQfI8EEi5RC.md │ │ │ │ │ ├── terraform@2kKHuQZScu7hCDgQWxl5u.md │ │ │ │ │ └── vpc@QtL-bLKtWIdH00K6k_PdC.md │ │ │ │ ├── faqs.astro │ │ │ │ ├── full-stack.json │ │ │ │ ├── full-stack.md │ │ │ │ └── migration-mapping.json │ │ │ ├── game-developer/ │ │ │ │ ├── content/ │ │ │ │ │ ├── 2d@Wq8siopWTD7sylNi0575X.md │ │ │ │ │ ├── aabb@aTeYGd4JlPr5txNPyBezn.md │ │ │ │ │ ├── ab-pruning@KYCi4d475zZfNwlj6HZVD.md │ │ │ │ │ ├── acceleration@ejZMnxZ0QrN-jBqo9Vrj8.md │ │ │ │ │ ├── advanced-rendering@CDYszS1U4v95GozB_drbt.md │ │ │ │ │ ├── affine-space@r5TcXQsU9s4NlAQIPvZ3U.md │ │ │ │ │ ├── affine-transformation@SkCreb6g4i-OFtJWhRYqO.md │ │ │ │ │ ├── angular-velocity@Y7HYY5eq7OG42V9yQz0Q1.md │ │ │ │ │ ├── artificial-neural-network@AoH2r4EOHyZd8YaV24rBk.md │ │ │ │ │ ├── behavior-tree@ztoW8fBY73Es624A_tjd7.md │ │ │ │ │ ├── bezier@DUEEm9sAaZqSI-W-PFZ8f.md │ │ │ │ │ ├── board-game@eoK70YRCz73GmzbNhh5kg.md │ │ │ │ │ ├── bounding-volume@PLR_4yoRifoTzkOR4c7ym.md │ │ │ │ │ ├── broad-phase@AKd2UpITqBZV7cZszSRps.md │ │ │ │ │ ├── bump@r4UkMd5QURbvJ3Jlr_H9H.md │ │ │ │ │ ├── buoyancy@WzcmdW_fKHv3gwdBnvI0_.md │ │ │ │ │ ├── bvh@FCc5xwb_G3VsDRXOcg3hV.md │ │ │ │ │ ├── c@Ph3ZqmSnwwzUBUC-6dgf-.md │ │ │ │ │ ├── cascaded@Lu38SfZ38y89BffLRMmGk.md │ │ │ │ │ ├── catmull-rom@N9GoA3YvOaKwYjljj6NZv.md │ │ │ │ │ ├── cc@jsq0UXnIIC0Z_nbK2w48f.md │ │ │ │ │ ├── ccd@1yK8TH4Pn7Ag8VQoug54i.md │ │ │ │ │ ├── center-of-mass@HWtU4q-YPXxSi64t43VNF.md │ │ │ │ │ ├── client-side-development@rQArtuVKGVgLn_fw9yO3b.md │ │ │ │ │ ├── clipping@xP_VDMu1z9jiVnZaBFKJQ.md │ │ │ │ │ ├── collision-detection@AdOfOJtLtNgDwuABb6orE.md │ │ │ │ │ ├── color@WK6fLWJq9Vh2ySVrSqd-U.md │ │ │ │ │ ├── computer-animation@1RdyzTI_TXqmct2bIbNh9.md │ │ │ │ │ ├── computer-graphics@lIb5MeDoqVj6HycveOgTS.md │ │ │ │ │ ├── concave@jslk7Gy58VspO1uXGDgBp.md │ │ │ │ │ ├── conservation-of-energy@H3hkafXO9zqEnWuwHa38P.md │ │ │ │ │ ├── convex-decomposition@bgP9NpD0DJGqN4VCt65xP.md │ │ │ │ │ ├── convex-hull@jixffcPBELkhoG0e7Te8g.md │ │ │ │ │ ├── convex@pG_V12qhS4HevoP_KHTvh.md │ │ │ │ │ ├── convexity@YLusnwCba7BIdKOYUoY6F.md │ │ │ │ │ ├── cube@cv1-AwewuqJsZDBI3h84G.md │ │ │ │ │ ├── culling@1gdDeUPBRco10LpOxug4k.md │ │ │ │ │ ├── curve@YTkOF_33oL1ZkA-loc_DP.md │ │ │ │ │ ├── dbvt@XHFV4d6Ab4kWQ3-XcZTyT.md │ │ │ │ │ ├── decision-learning@ul5XnVwQCwr4ZaL4kBNpd.md │ │ │ │ │ ├── decision-making@Ky-95ipdgyPZGAIdqwMCk.md │ │ │ │ │ ├── decision-tree-learning@sz1047M8_kScjth84yPwU.md │ │ │ │ │ ├── decision-tree@rwGivalwv2ozdSlVMSc4U.md │ │ │ │ │ ├── deep-learning@ltkEyfuDxExs7knqs79ya.md │ │ │ │ │ ├── diffuse@0g1z5G2dsF4PTIfFAG984.md │ │ │ │ │ ├── directional@foD8K7V0yIxgeXwl687Bv.md │ │ │ │ │ ├── directx-ray-tracing@qoIkw9o8iMx7MzUyVYoR2.md │ │ │ │ │ ├── directx@bgWFV09AtDv1yJS5t0EaB.md │ │ │ │ │ ├── dynamics@0D7KQlF-9ylmILTBBVxot.md │ │ │ │ │ ├── epa@vWLKYK2KUzV1fO-vQunzW.md │ │ │ │ │ ├── euler-angle@L0J2kvveJNsmN9ueXhqKf.md │ │ │ │ │ ├── fog@2ocwC0P1-ZFmjA9EmA1lV.md │ │ │ │ │ ├── force@qduFRhmrzJ2sn0g7L-tza.md │ │ │ │ │ ├── friction@Hz9R4YGYtD0jAur8rYist.md │ │ │ │ │ ├── frustum@UcLGWYu41Ok2NYdLNIY5C.md │ │ │ │ │ ├── fuzzy-logic@4ZCVUpYrCT14d_JULulLe.md │ │ │ │ │ ├── game-ai@Hpf_CPmLpCSP8Qo07Kq1X.md │ │ │ │ │ ├── game-ai@Hpk8eOaOepERMmOvUgkxa.md │ │ │ │ │ ├── game-engine@fv5tivGad2P9GRZOodfn2.md │ │ │ │ │ ├── game-mathematics@m1wX27XBWKXZcTMH2U1xp.md │ │ │ │ │ ├── game-physics@UTBnrQiZ6Bf96yJYIUf3b.md │ │ │ │ │ ├── gdscript@AaRZiItRcn8fYb5R62vfT.md │ │ │ │ │ ├── geometry@XWxW2ZBw3LcQ4DRk4tgAG.md │ │ │ │ │ ├── gjk@lwd3Gz9bJEKCIwhXD6m-v.md │ │ │ │ │ ├── glsl@j8mWMFMQCEIPUzegDDsm1.md │ │ │ │ │ ├── goal-oriented-behavior@Cuc0xvCAkVyUtwOxO_Uua.md │ │ │ │ │ ├── godot@7OffO2mBmfBKqPBTZ9ngI.md │ │ │ │ │ ├── graphics-api@Kx7O7RLp7aPGtOvK8e314.md │ │ │ │ │ ├── graphics-pipeline@shSRnMf4NONuZ3TGPAoQc.md │ │ │ │ │ ├── hermite@m4AuHjEBnHS0wyATG-I1Z.md │ │ │ │ │ ├── hlsl@wYUDJb-q1rtM4w2QV3Wr1.md │ │ │ │ │ ├── horizon@9cBOfj58I4hBlxlQIyV9g.md │ │ │ │ │ ├── infinite@sC3omOmL2DOyTSvET5cDa.md │ │ │ │ │ ├── intersection@vmRYaXNVCe0N73xG8bsEK.md │ │ │ │ │ ├── joints@m2_wUW2VHMCXHnn5B91qr.md │ │ │ │ │ ├── learning@9_OcZ9rzedDFfwEYxAghh.md │ │ │ │ │ ├── light-source@VLrcBE1vb6N5fw5YESCge.md │ │ │ │ │ ├── light@_1LkU258hzizSIgXipE0b.md │ │ │ │ │ ├── lighting-and-shadow@DDN3mn0LTueBhjRzXFcbU.md │ │ │ │ │ ├── linear-algebra@grRf-MmaXimDB4iODOV47.md │ │ │ │ │ ├── linear-transformation@XABzEU9owCx9-zw1id9xU.md │ │ │ │ │ ├── linear-velocity@Z_U6abGV_wVkTGZ2LVkFK.md │ │ │ │ │ ├── mapping@THMmnx8p_P0X-dSPoHvst.md │ │ │ │ │ ├── markov-system@c6j-30p84vk3MZEF1R2hN.md │ │ │ │ │ ├── matrix@Kg6Mg9ieUUGXWX9Lai7B0.md │ │ │ │ │ ├── mcts@QD9TfZn3yhGPVwiyJ6d0V.md │ │ │ │ │ ├── metal@oEznLciLxZJaulMlBGgg4.md │ │ │ │ │ ├── metallicity@olY1ibR7kw1yJ58TfU-37.md │ │ │ │ │ ├── microsurface-scattering@YrQgfjsdLCIUxrwflpEHO.md │ │ │ │ │ ├── minimax@oOjGqicW3eqRwWyIwJdBA.md │ │ │ │ │ ├── moment-of-inertia@6E2mkXuAzoYnrT1SEIA16.md │ │ │ │ │ ├── movement@mUyzX-DXnIKDl-r9o8d38.md │ │ │ │ │ ├── naive-bayes-classifier@aw1BAGqrdBBmUwB6vMF_A.md │ │ │ │ │ ├── narrow-phase@SuemqQuiePab0Qpm2EGy9.md │ │ │ │ │ ├── native@CeAUEN233L4IoFSZtIvvl.md │ │ │ │ │ ├── obb@7nGtvbxoEAheiF4IPMfPf.md │ │ │ │ │ ├── occluder@MlLYqO_8JDNOwKRvaM-bf.md │ │ │ │ │ ├── opengl-es@EVOiWAeZsIvjLTt3EYu-6.md │ │ │ │ │ ├── opengl@ffa5-YxRhE3zhWg7KXQ4r.md │ │ │ │ │ ├── optix@GDLysy3__cbYidEaOmFze.md │ │ │ │ │ ├── orientation@iIWEjpkNFBj4R5wQ0mcWY.md │ │ │ │ │ ├── orthogonal@d6C1qFv-Tad3AtMBDLI6r.md │ │ │ │ │ ├── parallax@YGeGleEN203nokiZIYJN8.md │ │ │ │ │ ├── perspective@LEJymJ2EaAW5FM5LgKW38.md │ │ │ │ │ ├── physically-based-rendering@XvFtMHrYsBREmuerE7CGc.md │ │ │ │ │ ├── point@aNhyXWW2b7yKTv8y14zk9.md │ │ │ │ │ ├── polygon@-r15srXTBLnUGokpXKclH.md │ │ │ │ │ ├── polyhedron@GHfLMtgmc36OCvjQvW_Su.md │ │ │ │ │ ├── programming-languages@4YgbrXLXf5mfaL2tlYkzk.md │ │ │ │ │ ├── projection@5qfoD77wU4ETI7rUSy4Nc.md │ │ │ │ │ ├── python@AJp_QRLgSG5ETXDIjUjmm.md │ │ │ │ │ ├── quaternion@zPs_LlDvkfxvvCrk5fXB2.md │ │ │ │ │ ├── rasterization@vYNj9nzu90e9xlrzHULnP.md │ │ │ │ │ ├── ray-tracing@JW5c_0JEtO-OiBoXUia6A.md │ │ │ │ │ ├── real-time-ray-tracing@_i7BXZq-iLxQc3QZRMees.md │ │ │ │ │ ├── reflection@eI2jym4AAz3ani-lreSKE.md │ │ │ │ │ ├── reinforcements-learning@rGEHTfdNeBAX3_XqC-vvI.md │ │ │ │ │ ├── rendering-equation@WVgozaQPFbYthZLWMbNUg.md │ │ │ │ │ ├── restitution@egOcxFTQP7vPIGrxcieuk.md │ │ │ │ │ ├── rust@ts9pWxUimvFqfNJYCmNNw.md │ │ │ │ │ ├── sampling@rmtxybcavWV6A53R4ZWgc.md │ │ │ │ │ ├── sat@kSMz7mZ243qMKtT_YD3AD.md │ │ │ │ │ ├── shader@qIrePusMuvcUva9LMDmDx.md │ │ │ │ │ ├── shadow-map@ygtru6fqQ3gpFZRN_I8rP.md │ │ │ │ │ ├── shadow@lqfW8hkuN3vWtacrqBBtI.md │ │ │ │ │ ├── sort--sweep@STdvFYM9V0a36IkPXjvrB.md │ │ │ │ │ ├── spatial-partitioning@9Fk3XSINBr2NNdbMtwsIK.md │ │ │ │ │ ├── specular@odfZWKtPbb-lC35oeTCNV.md │ │ │ │ │ ├── spir-v@DvV32n3NoXNEej8Fsqqs2.md │ │ │ │ │ ├── spline@nTiHZXRh2j3_FsBotmlGf.md │ │ │ │ │ ├── spot@FetbhcK1RDt4izZ6NEUEP.md │ │ │ │ │ ├── state-machine@aJa_2xkZuSjQ5bt6Kj5oe.md │ │ │ │ │ ├── stencil-shadow@AEAVc8Ih4fctSGGVJG0Np.md │ │ │ │ │ ├── texture@iBZ1JsEWI0xuLgUvfWfl-.md │ │ │ │ │ ├── tone-reproduction@RgC9TOc0wbr2QSuvrpIDV.md │ │ │ │ │ ├── translucency--transparency@PuhXaRZ-Ql5PCqzMyz3en.md │ │ │ │ │ ├── unity-3d@rNeOti8DDyWTMP9FB9kJ_.md │ │ │ │ │ ├── unreal-engine@a6H-cZtp3A_fB8jnfMxBR.md │ │ │ │ │ ├── vector@yLEyh5XJ3sl8eHD-PoSvJ.md │ │ │ │ │ ├── visibility-and-occlusion@OcxesFnB5wO6VXrHYnhz-.md │ │ │ │ │ ├── visual-perception@1S1qPogijW2SQCiF7KLZe.md │ │ │ │ │ ├── vulkan-ray-tracing@tDGnV8dGIFr_diz4HcEjr.md │ │ │ │ │ ├── vulkan@yPfhJSTFS7a72UcqF1ROK.md │ │ │ │ │ └── webgl@CeydBMwckqKll-2AgOlyd.md │ │ │ │ ├── faqs.astro │ │ │ │ ├── game-developer.json │ │ │ │ ├── game-developer.md │ │ │ │ └── migration-mapping.json │ │ │ ├── git-github/ │ │ │ │ ├── content/ │ │ │ │ │ ├── --hard@V_joZNpQsS9G9PI-o-GmC.md │ │ │ │ │ ├── --mixed@qis7Z5VRxMcOmbesQlegZ.md │ │ │ │ │ ├── --soft@Uc7FyfAKpDFRGRNHwztFo.md │ │ │ │ │ ├── adding--updating@x4bnsPVTiX2xOCSyrgWpF.md │ │ │ │ │ ├── automations@TNBz5755PhI6iKxTQTqcS.md │ │ │ │ │ ├── basic-git-usage@PtU5Qwfzn3N1i3oRlCGoR.md │ │ │ │ │ ├── between-branches@O-zoAWkDvyn7B8_TmY257.md │ │ │ │ │ ├── between-commits@Rwpeltygwzcf6hnuZNURE.md │ │ │ │ │ ├── branch-naming@ks1Pip-RM-UWD6zuF2j4n.md │ │ │ │ │ ├── branching-basics@bXfCUG3h1TIFPgD4WUDph.md │ │ │ │ │ ├── caching-dependencies@HMNhzzV6ApTKj4I_FOmUB.md │ │ │ │ │ ├── campus-program@B1KiSOt2b8t8FYD7Jxw2A.md │ │ │ │ │ ├── checkout-branch@PtRo-wGiNAagZ6CykfvMr.md │ │ │ │ │ ├── checkout-tags@62E1tDMXB6K74OEN0WsS0.md │ │ │ │ │ ├── cherry-picking-commits@eFf2fesrs-1aVM5tH3ORQ.md │ │ │ │ │ ├── citation-files@Ddkss13_qDJTquDHbVTVs.md │ │ │ │ │ ├── clean-git-history@i3AbARgzQtxtlB-1AS8zv.md │ │ │ │ │ ├── client-vs-server-hooks@zsU6R2zvJKnYNU2ac4o4p.md │ │ │ │ │ ├── cloning-repositories@1Koej79yTv-OAswVZwgGq.md │ │ │ │ │ ├── code-reviews@xLB2fhsOm0Vu3xg_PusJB.md │ │ │ │ │ ├── collaboration-on-github@d_GNnB6PBINz1jxGNWAE-.md │ │ │ │ │ ├── collaboration@bXfCUG3h1TIFPgD4WUDph.md │ │ │ │ │ ├── collaborators--members@_ft-uvXt6s_xrcMT3fbSF.md │ │ │ │ │ ├── collaborators@r-u1vTpUyuvsB0revOU0C.md │ │ │ │ │ ├── commit-messages@7lRUYWNSpHvJ-QyIE8RMa.md │ │ │ │ │ ├── commit-msg@jzYjHx-gIKSP8dQUTqWVw.md │ │ │ │ │ ├── committing-changes@2_z3R7seCvQVj-Na4H1SV.md │ │ │ │ │ ├── contribution-guidelines@pJ-najh7dXhhYA_0bDiR5.md │ │ │ │ │ ├── creating-account@i7fIIHcBEk473te8bniJ5.md │ │ │ │ │ ├── creating-apps@5Oax1p7zIZ9HD2hmENPof.md │ │ │ │ │ ├── creating-branch@OegitQ5Ngjvd3ZfMpfrkM.md │ │ │ │ │ ├── creating-repositories@c_FO6xMixrrMo6iisfsvl.md │ │ │ │ │ ├── custom-domains@VdoxEWaU56-QCbHFRw649.md │ │ │ │ │ ├── deleting-branch@1uDenoQ6zu7CT69FR2iQB.md │ │ │ │ │ ├── deploying-static-websites@ZHplGidvhxEIC3HN8KqRa.md │ │ │ │ │ ├── detached-head@0cLf7FiI9CX--UX45sm2f.md │ │ │ │ │ ├── documentation@D2WIExwfSnkAPIa5O-Hp5.md │ │ │ │ │ ├── fast-forward-vs-non-ff@agtPWS8j6i6wQPk10cy8E.md │ │ │ │ │ ├── fetch-without-merge@Gybnekbd1rJKTOf4hJ4Sh.md │ │ │ │ │ ├── forking-vs-cloning@l1Wf7Pe_ah8ycCgslfSK4.md │ │ │ │ │ ├── git-attributes@CGj_UX5JMOOCKinedsNRc.md │ │ │ │ │ ├── git-bisect@ExXuwTQSI_lg4SRGW3Iu1.md │ │ │ │ │ ├── git-commit---amend@NjPnEXLf1Lt9qzgxccogv.md │ │ │ │ │ ├── git-config@NMCWgzhhfUvFOMO5GbF_u.md │ │ │ │ │ ├── git-filter-branch@BKVA6Q7DXemAYjyQOA0nh.md │ │ │ │ │ ├── git-hooks@pqBV7BMAs0z6qpfZeW2XP.md │ │ │ │ │ ├── git-init@1iOkbO5juk2LO-WZHx_W6.md │ │ │ │ │ ├── git-lfs@zdunaucVe8J1tKf_z-NQo.md │ │ │ │ │ ├── git-log-options@qFEonbCMLri8iA0yONwuf.md │ │ │ │ │ ├── git-patch@sFf1PdFfmEdQxsEntfeFq.md │ │ │ │ │ ├── git-push---force@OQOmxg9mCfcjt80hpvXkA.md │ │ │ │ │ ├── git-rebase@HMEfUFNu_Wp_Pac7VWHr-.md │ │ │ │ │ ├── git-reflog@hru0sL1-D4bJSQI1efEyU.md │ │ │ │ │ ├── git-remotes@aWx9WHUrgofcTr8B-fQYe.md │ │ │ │ │ ├── git-reset@igrR7LguU1jemg_mf_AD6.md │ │ │ │ │ ├── git-revert@dLr55Om7IOvI53c1DgTKc.md │ │ │ │ │ ├── git-stash-basics@X9K3PBpGsMoXkJsKdJPI7.md │ │ │ │ │ ├── git-vs-other-vcs@_jSTrYN9G8EsGHkbusKPU.md │ │ │ │ │ ├── git-worktree@4dxVN81rXWn6VZqK99yq0.md │ │ │ │ │ ├── github-actions@AmetdCURXXob5TUsikAab.md │ │ │ │ │ ├── github-api@NV2HAXLEN7tskfgyFrbaf.md │ │ │ │ │ ├── github-apps@560GJXFTt7DPdJjKtSDOo.md │ │ │ │ │ ├── github-classroom@Pg6G4fzYb_RUhANeRKlRX.md │ │ │ │ │ ├── github-cli@h9cf_dh_pwjialOXOlNW-.md │ │ │ │ │ ├── github-codespaces@NdfwgwMOewiyEAFyC2l7U.md │ │ │ │ │ ├── github-copilot@iWn3zDMOfLLjSp6f1jQoE.md │ │ │ │ │ ├── github-discussions@snWQHCQECZyUXHdn6ppIk.md │ │ │ │ │ ├── github-education@pFyMiyNQ16-kP7jKaKKEU.md │ │ │ │ │ ├── github-essentials@NeSvgS2yA5x8qbcJHrV__.md │ │ │ │ │ ├── github-gists@M2_hBvXou7cCNqsMnexCt.md │ │ │ │ │ ├── github-interface@qZFtRABvlBbVvsy6T00J2.md │ │ │ │ │ ├── github-marketplace@R20LXLLEzNn-SpyFDMRXj.md │ │ │ │ │ ├── github-models@4slyjdk2Eeg5VYY6gCDG6.md │ │ │ │ │ ├── github-organizations@RMrxQLhrINO5g4Mhxh5qS.md │ │ │ │ │ ├── github-packages@rqPCHh25xX_ROMr-ULpaw.md │ │ │ │ │ ├── github-pages@bnai6R6pOq_L5CPdbVwMW.md │ │ │ │ │ ├── github-projects@DzFJDdqnSy5GeGHWOpcVo.md │ │ │ │ │ ├── github-releases@YmnTrjJtqHPXbEVrP8vd7.md │ │ │ │ │ ├── github-security@f2PG4t6iVtfIH8BVe5H7f.md │ │ │ │ │ ├── github-sponsors@vhdGUhMAyre_Xya6IxZ-t.md │ │ │ │ │ ├── github-wikis@lONqOqD-4slxa9B5i9ADX.md │ │ │ │ │ ├── gitignore@oz2oRAhaEQb0Fm3aRJQG8.md │ │ │ │ │ ├── graphql-api@KlXPt-K6br8PtpLgELaCj.md │ │ │ │ │ ├── handling-conflicts@9Dt4Gyiiq5jteWSKxsRMK.md │ │ │ │ │ ├── head@V8nLIvddyOKTzEjOJX5GW.md │ │ │ │ │ ├── history@zen3RRdK9_nPAYgicRoHk.md │ │ │ │ │ ├── installation-and-setup@vHfpoVbOW0DHNtiy0VN4X.md │ │ │ │ │ ├── installing-git-locally@v7hCNbgPByi3YiLSs46BK.md │ │ │ │ │ ├── issue-management@kGnZifvXbHBf5zXIsfAQw.md │ │ │ │ │ ├── issues@crdllx5cH_seIpgVPvHg_.md │ │ │ │ │ ├── kanban-boards@RFJgfuxoVxt22QlwLI5mW.md │ │ │ │ │ ├── labelling-issues--prs@y4DkB5NvTh41IeT0G2gr-.md │ │ │ │ │ ├── learn-the-basics@HlUUGj3dOZ68t4gIjerXh.md │ │ │ │ │ ├── linear-vs-non-linear@lXC07j6dOa3rQixY1P-Ob.md │ │ │ │ │ ├── local-vs-global-config@tVvxC5JQgUb_B8kOqYpD8.md │ │ │ │ │ ├── managing-remotes@sBQOInoFBU9XfkPZ-JlyT.md │ │ │ │ │ ├── managing-tags@NeU38WPbEphJuJ_AMkH82.md │ │ │ │ │ ├── markdown@1Ulxl4VUvRSfyCPpi-iv8.md │ │ │ │ │ ├── marketplace-actions@SsogoCgJIbeTD6tk8UhTe.md │ │ │ │ │ ├── mentions@oWMaOWU06juoIuzXNe-wt.md │ │ │ │ │ ├── merge-strategies@0rHDUbAdXqH9zQW2VfJ8v.md │ │ │ │ │ ├── merging-basics@sNuy6NMjLOEkJlqdEjFPq.md │ │ │ │ │ ├── more-git@aZMVz6kc52vLGcZFD9Dgh.md │ │ │ │ │ ├── more-github@sti_TAgZvSpuFWtygAsKc.md │ │ │ │ │ ├── oauth-apps@qrdOARfqGPF9xhF6snbAn.md │ │ │ │ │ ├── post-checkout@SANEQI2rgOtsMQyn4qUCq.md │ │ │ │ │ ├── post-update@buxb5TpzQ-xxn0vqtGdS3.md │ │ │ │ │ ├── pr-from-a-fork@8lXXVFkgK6n5IHaYkYe3l.md │ │ │ │ │ ├── pr-guidelines@GwDNk2HBjASr_NWIL4G3-.md │ │ │ │ │ ├── pre-commit@HhpAIzYMlMiQ9msrYZyDB.md │ │ │ │ │ ├── pre-push@j5kWEUKwBFg5EMm8-61K9.md │ │ │ │ │ ├── private-vs-public@HEqBbw_A4ZbJI5zEy8ViN.md │ │ │ │ │ ├── profile-readme@KbVvFVQ4k77R2_ddsc7WT.md │ │ │ │ │ ├── project-planning@q0zy_hXav5iXw8LpGVJVd.md │ │ │ │ │ ├── project-readme@WIVr7JxO1AJTNObW8mtY3.md │ │ │ │ │ ├── pull-requests@s3MzDYFPMASqiS8UnvWzW.md │ │ │ │ │ ├── pull-requests@x6eILrLCQrVpz4j8uOuy6.md │ │ │ │ │ ├── pushing--pulling-changes@ZVMCh9om37ee1qsecFa-N.md │ │ │ │ │ ├── pushing-tags@E3HAGNM-kXLL4Oci5JzpQ.md │ │ │ │ │ ├── reactions@XstmIysIi_lWo6RzszLBt.md │ │ │ │ │ ├── rebase@99FVJ3Zs8n6lr8L95mG6g.md │ │ │ │ │ ├── renaming-branch@_dPOVUbxApx0pfKPH8fgr.md │ │ │ │ │ ├── repository-management@lw4zHuhtxIO4kDvbyiVfq.md │ │ │ │ │ ├── rest-api@lSCnKhmRr6xrKVYxO8idD.md │ │ │ │ │ ├── rewriting-history@sOoC-XxEoIvwKct00oKlX.md │ │ │ │ │ ├── roadmaps@sxvT2hGko2PDRBoBrCGWD.md │ │ │ │ │ ├── saved-replies@dQS1V0zZxeKhHhUo3STBK.md │ │ │ │ │ ├── scheduled-worfklows@uS1H9KoKGNONvETCuFBbz.md │ │ │ │ │ ├── secrets-and-env-vars@aflP7oWsQzAr4YPo2LLiQ.md │ │ │ │ │ ├── setting-up-profile@GS3f1FKFVKT0-GJQrgCm8.md │ │ │ │ │ ├── squash@Z-srOhYFGVEKDexlJ6cjt.md │ │ │ │ │ ├── staged-changes@mzjtCdpke1ayHcEuS-YUS.md │ │ │ │ │ ├── staging-area@h71Tx3nkfUrnhaqcHlDkQ.md │ │ │ │ │ ├── static-site-generators@iwfNYDlAgbA_rpWYcoHCC.md │ │ │ │ │ ├── storing-artifacts@alysXC4b1hGi9ZdQ5-40y.md │ │ │ │ │ ├── student-developer-pack@XRSVRl6iHncMmgSXoB7Lq.md │ │ │ │ │ ├── submodules@fjAFNjNNbPOzme9Uk_fDV.md │ │ │ │ │ ├── tagging@iFJBF-EEnLjQVsFSXjo_i.md │ │ │ │ │ ├── teams-within-organization@wydgCxR5VnieBpRolXt8i.md │ │ │ │ │ ├── undoing-changes@0Yi4cryT2v2SGBjouOas3.md │ │ │ │ │ ├── unstaged-changes@uxqJzQFRcALqatNRIWR0w.md │ │ │ │ │ ├── use-in-automation@Y0EWgPsS4kZxH3y53jNxY.md │ │ │ │ │ ├── usecases@PUnYNBrAZWoZiopjtNgnA.md │ │ │ │ │ ├── viewing-commit-history@IfUm5D_zNaUKMd4HX4Fi4.md │ │ │ │ │ ├── viewing-diffs@-0zQvCHG8jS_ghSjmTeIx.md │ │ │ │ │ ├── webhooks@MoG7D9kqPuA6o52-z_WDN.md │ │ │ │ │ ├── what-and-why-use@d0-u_-_vtPK8tnUpnj_NB.md │ │ │ │ │ ├── what-and-why@v7uabKuMQPOD_hBIaHOVT.md │ │ │ │ │ ├── what-are-these@Ni3HKVLanFvSrJ3u8i5I1.md │ │ │ │ │ ├── what-is-a-repository@PtU5Qwfzn3N1i3oRlCGoR.md │ │ │ │ │ ├── what-is-version-control@bY6b1GV2XQQ52NOx8gWFj.md │ │ │ │ │ ├── why-use-version-control@dhIx1GnynvbSUriqYLUt0.md │ │ │ │ │ ├── workflow-context@BnPiTu1Jw2kIW560a2A5T.md │ │ │ │ │ ├── workflow-runners@6QwlY3dEvjfAOPALcWKXQ.md │ │ │ │ │ ├── workflow-status@jc4R1zhd1YeCEbVuxwJWy.md │ │ │ │ │ ├── workflow-triggers@55uHPFNwYPVZx8Cy3c985.md │ │ │ │ │ ├── working-directory@Sv36oxTZwlUv-i1K28NeP.md │ │ │ │ │ ├── working-in-a-team@yMx3LdadPz4g25CL3N8da.md │ │ │ │ │ └── yaml-syntax@p6rq3lQ9YRrTqwcc31O23.md │ │ │ │ ├── faqs.astro │ │ │ │ ├── git-github-beginner.json │ │ │ │ ├── git-github.json │ │ │ │ └── git-github.md │ │ │ ├── git-github-beginner/ │ │ │ │ └── content/ │ │ │ │ ├── basic-git-usage@PtU5Qwfzn3N1i3oRlCGoR.md │ │ │ │ ├── collaboration@bXfCUG3h1TIFPgD4WUDph.md │ │ │ │ ├── dummy │ │ │ │ ├── learn-the-basics@HlUUGj3dOZ68t4gIjerXh.md │ │ │ │ ├── more-git@aZMVz6kc52vLGcZFD9Dgh.md │ │ │ │ └── more-github@sti_TAgZvSpuFWtygAsKc.md │ │ │ ├── golang/ │ │ │ │ ├── content/ │ │ │ │ │ ├── advanced-topics@expert-level.md │ │ │ │ │ ├── anonymous-functions@cEQ9NQX7ZkKLwz_hg9L_7.md │ │ │ │ │ ├── array-to-slice-conversion@s1E4PQVVSlBeyNn7xBikW.md │ │ │ │ │ ├── arrays@Eu8JV-_W-P_bCx_PglIW0.md │ │ │ │ │ ├── beego@p7yeYkbQKAjr2aA_eUno4.md │ │ │ │ │ ├── benchmarks@t9xOuLBrAzEvv2-bOU2hF.md │ │ │ │ │ ├── boolean@PRTou83_rD0u7p2elGG4s.md │ │ │ │ │ ├── break@IWdAJ1BXqJv8EMYvFWRaH.md │ │ │ │ │ ├── bubbletea@x9hDkF73rmvbewrgRgyOv.md │ │ │ │ │ ├── buffered-vs-unbuffered@4_nvU_YOs9Psey5TZLQFb.md │ │ │ │ │ ├── bufio@Z8j6Zkg1LYEYcoRgs23Ms.md │ │ │ │ │ ├── build-constraints--tags@zmBYvecc5zSoLCinH68gc.md │ │ │ │ │ ├── build-tags@Jxt4HD2iA6lRXNRJIVCLs.md │ │ │ │ │ ├── building-clis@2fk1ewM42WnFlDejVETys.md │ │ │ │ │ ├── building-executables@zCUmPIGVslLfECqfUgAr2.md │ │ │ │ │ ├── call-by-value@z8-8nt-3GA7uN-cvOI-Qn.md │ │ │ │ │ ├── capacity-and-growth@qUykEUH1-9Dzotc_ltV3g.md │ │ │ │ │ ├── centrifugo@LOl-7BtdmYrBS0PTtHI1I.md │ │ │ │ │ ├── cgo-basics@mxbs96wFJ5XGDoETA0fU_.md │ │ │ │ │ ├── channels@EgXagvLpJkXUI2od5K1FD.md │ │ │ │ │ ├── closures@ZSiNvYDTW2RYyPttls5iz.md │ │ │ │ │ ├── cobra@3frPZLeFXnHroY7_Uk5Dn.md │ │ │ │ │ ├── code-generation--build-tags@build-system.md │ │ │ │ │ ├── code-quality-and-analysis@core-quality-tools.md │ │ │ │ │ ├── comma-ok-idiom@dMdOz2kUc8If3LcLZEfYf.md │ │ │ │ │ ├── commands--docs@ywiNCAAvpSVXTwWwguxSZ.md │ │ │ │ │ ├── common-usecases@gChqUzY3SbPJH0H0jcoAp.md │ │ │ │ │ ├── compiler--linker-flags@xsjUeyxweN2GbcjknDjT8.md │ │ │ │ │ ├── complex-numbers@Mn-M7kxOKEublJGitgjNA.md │ │ │ │ │ ├── concurrency-patterns@2yKVKaCXrcv5X4o2d6oqm.md │ │ │ │ │ ├── conditionals@C7wzT161ytHsCpO2zfmXo.md │ │ │ │ │ ├── const-and-iota@-M-qrXwVt7HfJv0CSRNGS.md │ │ │ │ │ ├── context-package@vxB3aGreqWBrNhiu8hcPE.md │ │ │ │ │ ├── continue@BRKryB5HawXyXeBWM4QqU.md │ │ │ │ │ ├── coverage@27lhNAdKwRrc2S2ha3QNG.md │ │ │ │ │ ├── cross-compilation@mvcWcecHA_jyQY1txFgL_.md │ │ │ │ │ ├── data-types@0FJxELyk7_IiVHvZFFVm2.md │ │ │ │ │ ├── deadlines--cancellations@p5u2tWRmRtyfBgKcSUHFU.md │ │ │ │ │ ├── deployment--tooling@deploy-optimize.md │ │ │ │ │ ├── echo@1qhqEYf6wYf5sfXgTUnmi.md │ │ │ │ │ ├── embedding-interfaces@wK7GNTbOsMNs0N_1N4-dU.md │ │ │ │ │ ├── embedding-structs@XLj16RmCe4-nKHW52Ebhf.md │ │ │ │ │ ├── empty-interfaces@ueJ7ndK2SKniDVjN2aUlO.md │ │ │ │ │ ├── encodingjson@uB1fE15OprBcwN7p7ffJF.md │ │ │ │ │ ├── error-handling-basics@7EKUfKx7_7lZOs3d84iyL.md │ │ │ │ │ ├── error-interface@0mMP6QR0V-Zi25njD1TFT.md │ │ │ │ │ ├── errorsnew@dHk6Y0zFqxtCuDiQcHQsi.md │ │ │ │ │ ├── escape-analysis@ixoXVtRlrvTittqQq-Bgo.md │ │ │ │ │ ├── fan-in@8BrnnM7HM-bijbUDgnW49.md │ │ │ │ │ ├── fan-out@pN8EsuKUPDUKyskodu_sC.md │ │ │ │ │ ├── fiber@5lJPsJwgy0_T7Xl6eQxuB.md │ │ │ │ │ ├── flag@-8E79Ns4q-uAgcxtghPzf.md │ │ │ │ │ ├── floating-points@EzaH378F3kOdQbczhVjhA.md │ │ │ │ │ ├── fmterrorf@LVaWjZfij6-z_uwkAc0MK.md │ │ │ │ │ ├── for-loop@ijS-b400c9BldRO6PlrC1.md │ │ │ │ │ ├── for-range@j0w6e8Pksh30PKDvXj3yk.md │ │ │ │ │ ├── functions-basics@MBafBhpEV_7qgDNPOIBBs.md │ │ │ │ │ ├── functions@axhcEfCEoFkLey4AbA84A.md │ │ │ │ │ ├── garbage-collection@GG0j6MNVudvITHEOXUxim.md │ │ │ │ │ ├── generic-functions@p7L4EUsjMnJlrbb-oDvlf.md │ │ │ │ │ ├── generic-types--interfaces@eWZzradMaH57H4mI7Qw6n.md │ │ │ │ │ ├── generics@uEpTANOBHlFwCg5p44Lh0.md │ │ │ │ │ ├── gin@xM1uUCXNrJwfTgi9E75KV.md │ │ │ │ │ ├── go-build@LXqEJwGA_0cVUbF6DVwBG.md │ │ │ │ │ ├── go-clean@bxXzXM0zUm1vux1DKOLyf.md │ │ │ │ │ ├── go-command@_3_tFOpQisx6DSP4Yc2E2.md │ │ │ │ │ ├── go-doc@SoD0P5k4aSVRN96XxR5on.md │ │ │ │ │ ├── go-fmt@CPFiclXXVQCsbooA0iCEy.md │ │ │ │ │ ├── go-generate@TstTkc_-2RZMOqtSIklEM.md │ │ │ │ │ ├── go-install@k35Ogbvr9yTdJPo4RV4tM.md │ │ │ │ │ ├── go-mod-init@zWXJOXo8dRnuTvYlWOL6r.md │ │ │ │ │ ├── go-mod-tidy@6rwVq1bMSHoGatEfm9hkp.md │ │ │ │ │ ├── go-mod-vendor@jOiAk5coeDNVXP2QiwQis.md │ │ │ │ │ ├── go-mod@5hnaPrYSBzxEIxFeg5tCK.md │ │ │ │ │ ├── go-run@rW4QPWIS2TWzFY0Ljny2N.md │ │ │ │ │ ├── go-test@EskFmwCwOmZHcVzedPOJI.md │ │ │ │ │ ├── go-toolchain-and-tools@core-go-commands.md │ │ │ │ │ ├── go-version@LnhQJVsEaS_gSijCUqAMq.md │ │ │ │ │ ├── go-vet@qoQ6_5MgTu3ur1mkEgqG5.md │ │ │ │ │ ├── goembed-for-embedding@iIPk-jK1vBCG_rKI_MPiu.md │ │ │ │ │ ├── goimports@6RpfXYHnOGmM6pZ6ZBb29.md │ │ │ │ │ ├── golangci-lint@hgiNcGh3ggf8dBJ8C0HCL.md │ │ │ │ │ ├── gorm@fJdZIbAgOAB8nOEHQNsq6.md │ │ │ │ │ ├── goroutines@08QOxnF3rKEDekrkX7w1j.md │ │ │ │ │ ├── goto-discouraged@O29VoTfPiU8GZ_c16ZJIp.md │ │ │ │ │ ├── govulncheck@K__satcG2ETNRFBpPqrLw.md │ │ │ │ │ ├── grpc--protocol-buffers@tBY6UB3gWZAxHPCFHoU_d.md │ │ │ │ │ ├── hello-world-in-go@PHHviBSqhYDSNuHBFbw3l.md │ │ │ │ │ ├── history-of-go@2rlmLn_yQQV-7DpX1qT98.md │ │ │ │ │ ├── httptest--for-http-tests@Zt4FpqCEVlpMzclJeDiMs.md │ │ │ │ │ ├── if-else@2XaDvTJ5pyChgt1GFZF8W.md │ │ │ │ │ ├── if@dC-1LotbW29C4zZJv6ak6.md │ │ │ │ │ ├── integers-signed-unsigned@EAqL8Up3J63AWCZnqQph0.md │ │ │ │ │ ├── interfaces-basics@nkONsPlFYCMqzWHTm_EPB.md │ │ │ │ │ ├── interfaces@hIRMnPyHRGh8xCU8BTS2n.md │ │ │ │ │ ├── interpreted-string-literals@7h08RUNC_uAMI6vnGdcZ1.md │ │ │ │ │ ├── introduction-to-go@WwLLyHL5psm0GOI9bmOne.md │ │ │ │ │ ├── io--file-handling@7SYEXD5r9WKEDfecQdO5d.md │ │ │ │ │ ├── iterating-maps@Q6ic-AGG_gnXEOdmqom89.md │ │ │ │ │ ├── iterating-strings@PC-azlCZ6wDCn1_nRyhUn.md │ │ │ │ │ ├── json@uB1fE15OprBcwN7p7ffJF.md │ │ │ │ │ ├── linters@static-analysis.md │ │ │ │ │ ├── logging@mGia5cJ7HFVXM0Fx5xhQE.md │ │ │ │ │ ├── loops@orpxzKHFcf1BDQSefHl6O.md │ │ │ │ │ ├── make@PWrfmYnOJRlwgdFat91bC.md │ │ │ │ │ ├── maps@XupDuVRsM5VjdaNs7JaT5.md │ │ │ │ │ ├── melody@N0EG-7sU9lGFwgidXuPkV.md │ │ │ │ │ ├── memory-management@ItMgLOzaUCCdiTk221pAF.md │ │ │ │ │ ├── memory-mgmt-in-depth@_2JpTdzmXxszFCauJONCi.md │ │ │ │ │ ├── methods-vs-functions@jx1vln8hqRJqVZfJi6CST.md │ │ │ │ │ ├── mocks-and-stubs@LjLbm4JEZ19howOkju7zQ.md │ │ │ │ │ ├── modules--dependencies@kep_536v13aS1V9XwHKSr.md │ │ │ │ │ ├── multiple-return-values@ai2s1bwiTcPzrXQTxFDwV.md │ │ │ │ │ ├── mutexes@6ydgmac11Zu9Ithe0kKj9.md │ │ │ │ │ ├── named-return-values@HIvwT8Dcr6B2NjOjy9hFv.md │ │ │ │ │ ├── nethttp-standard@NMLmbKjfMSqz-Iz2CooCl.md │ │ │ │ │ ├── orms--db-access@VcHHuIZ4lGzTxOoTwxA3e.md │ │ │ │ │ ├── os@9S1gkzBvt32uLy0IFZjrg.md │ │ │ │ │ ├── package-import-rules@dA8SMhCev1NWNM1Tsxu57.md │ │ │ │ │ ├── packages@AcYzrGFrwmeVYFEfhEiSZ.md │ │ │ │ │ ├── panic-and-recover@2KyzUjcMiMgo_AvlPjYbx.md │ │ │ │ │ ├── performance-and-debugging@profiling-tools.md │ │ │ │ │ ├── pgx@cOj6klfBzTQQ8G75umLQZ.md │ │ │ │ │ ├── pipeline@loozcCzPzkni7BOdcvt1S.md │ │ │ │ │ ├── plugins--dynamic-loading@NlkrCAdUCJ7kU9meQJM5_.md │ │ │ │ │ ├── pointer-receivers@6NKgb-OjGdT3QsMrDU05b.md │ │ │ │ │ ├── pointers-basics@P0fUxEbb3bVYg35VWyg8R.md │ │ │ │ │ ├── pointers-with-structs@NfYlEY8f_YPITT6Exp3Iw.md │ │ │ │ │ ├── pointers@naBjKGrTBzlpapXzLHfvG.md │ │ │ │ │ ├── pprof@Blz9cpgKhuqtY75oUQw6I.md │ │ │ │ │ ├── publishing-modules@CysLmwRqmQzOGAKM01AKF.md │ │ │ │ │ ├── race-detection@GoV8yaQARJmO47e0_l_GY.md │ │ │ │ │ ├── race-detector@7aTYeCd915F3UHqb6j0Az.md │ │ │ │ │ ├── raw-string-literals@nzPe6XVqhtOZFbea6f2Hg.md │ │ │ │ │ ├── realtime-communication@o2EYfm1WSd8Eq_ZcXYreo.md │ │ │ │ │ ├── reflection@GO50AoBOjO-EaK3s36jSS.md │ │ │ │ │ ├── regexp@9K5ffACdKNPJiWPq4tUWD.md │ │ │ │ │ ├── revive@ksimJz7uvSh80ZIekSn_-.md │ │ │ │ │ ├── runes@IAXI7OAAAG4fU6JvVNSZI.md │ │ │ │ │ ├── scope-and-shadowing@xUKsD2eTP9-RszHvKYp9Y.md │ │ │ │ │ ├── security@vulnerability-scanning.md │ │ │ │ │ ├── select-statement@RBr1uAdngIsvSpIdHHOyV.md │ │ │ │ │ ├── sentinel-errors@vjfqq1XVS25FVe9smtel0.md │ │ │ │ │ ├── setting-up-the-environment@J5mU0v491qrm-mr1W3Msd.md │ │ │ │ │ ├── slice-to-array-conversion@j0zmfpaufr5TAZa_Bh8Vu.md │ │ │ │ │ ├── slices@3aoMFQXIh3Qdo04isHwe_.md │ │ │ │ │ ├── slog@hFlbSSBMcJtjXNL8jAcbc.md │ │ │ │ │ ├── stack-traces--debugging@rR_BIgiSR63rVlO2Igzin.md │ │ │ │ │ ├── standard-library@-Qy9DEWVYUNRHWiXXhIWU.md │ │ │ │ │ ├── staticcheck@954ffF8CmXYX-L36Lfl44.md │ │ │ │ │ ├── strings@ZxZpReGdPq8ziSlYmf2nj.md │ │ │ │ │ ├── struct-tags--json@SW2uMlhfC-dnQakShs2km.md │ │ │ │ │ ├── structs@wRwt9JHZPmq8uapxMjn0a.md │ │ │ │ │ ├── switch@ZmPhiTrB8EK0LDdaJOhc8.md │ │ │ │ │ ├── sync-package@nOI0juYhqJXNTiJBU4bKH.md │ │ │ │ │ ├── table-driven-tests@6-mr65JzXbRzIukE7jzoZ.md │ │ │ │ │ ├── testing-package-basics@nZkLFmm2GENL81y5LB0c1.md │ │ │ │ │ ├── time@aK9EQO1JR9hYIMkS3mdai.md │ │ │ │ │ ├── trace@RE2jfECHkWvy3ldDZL938.md │ │ │ │ │ ├── type-assertions@4EJ4WnH2HA3ci2uoqmNex.md │ │ │ │ │ ├── type-constraints@8o6A2kGnupGYaaTwgsTDp.md │ │ │ │ │ ├── type-conversion@2IFxz3sFqDvUvzWNVwlWC.md │ │ │ │ │ ├── type-inference@36gt0FmNDxuIIV47aqBeH.md │ │ │ │ │ ├── type-switch@6r9XbwlBtHmJrhviG2cTD.md │ │ │ │ │ ├── unsafe-package@tM-AAWqMJsYZ1i6DCfBeD.md │ │ │ │ │ ├── urfavecli@bmNLSk-XuK2EuLxPR1Sxh.md │ │ │ │ │ ├── using-3rd-party-packages@eBv3i2cNA7vc01jLAbB8m.md │ │ │ │ │ ├── value-receivers@99a4irV044ybZN-boMgHv.md │ │ │ │ │ ├── var-vs-@pJUkMcrUvcxuR_w89-eEq.md │ │ │ │ │ ├── var-vs@pJUkMcrUvcxuR_w89-eEq.md │ │ │ │ │ ├── variables--constants@BZKSsTgm28WV4nA74NYHO.md │ │ │ │ │ ├── variadic-functions@MUJfa0jIL_S_b2ndNpVVw.md │ │ │ │ │ ├── waitgroups@amqOwSgVFDymAsDIobwiK.md │ │ │ │ │ ├── web-development@CwGw3CDVLqErQGTwjzhmL.md │ │ │ │ │ ├── why-generics@9EdDI0vJaEmz3XxXMrpX9.md │ │ │ │ │ ├── why-use-go@4PrkkoZ5fY-oow0O-bVhu.md │ │ │ │ │ ├── with-maps--slices@oAvCO3GOKktkbmPahkPlT.md │ │ │ │ │ ├── worker-pools@z8ItWHAupaastLcXY3npY.md │ │ │ │ │ ├── wrappingunwrapping-errors@s2WlOMMKNXf6O2Qiqcm_m.md │ │ │ │ │ ├── zap@4D8QsZVAUB9vGbVFgRHt4.md │ │ │ │ │ ├── zero-values@QWixUXjC8YG-i1gsKVY1v.md │ │ │ │ │ └── zerolog@TR7N68_evDMu3qWHbGJcz.md │ │ │ │ ├── faqs.astro │ │ │ │ ├── golang.json │ │ │ │ └── golang.md │ │ │ ├── graphql/ │ │ │ │ ├── content/ │ │ │ │ │ ├── aliases@B77yLU4SuRChSjEbmYwc-.md │ │ │ │ │ ├── apollo-client@D5O7ky5eXwm_Ys1IcFNaq.md │ │ │ │ │ ├── apollo-server@o_VkyoN6DmUUkfl0u0cro.md │ │ │ │ │ ├── arguments@A54vi3Ao7fBHyTuqoH_it.md │ │ │ │ │ ├── arguments@hrpb108R8Gyu3hhzkMYzL.md │ │ │ │ │ ├── asynchronous@tbDvQBtLRAcD-xYX9V7Va.md │ │ │ │ │ ├── authorization@G50ZMlmP7Ru5LcFne5Rhu.md │ │ │ │ │ ├── authorization@GzwPvLybxTJM96fUhQUOi.md │ │ │ │ │ ├── authorization@i-zcfN6RNXhA_sb7DcIon.md │ │ │ │ │ ├── batching@v9gVexHfDkpG9z3NL5S-9.md │ │ │ │ │ ├── caching@UYwuUVTeurwODV4_Kdt_W.md │ │ │ │ │ ├── defer--stream-directives@t6XxFB_lx27kS4FE2_GMH.md │ │ │ │ │ ├── directives@MnmwccPahqPCzOhqjfbsY.md │ │ │ │ │ ├── enums@wfOsfb0zSAIdNkwFHfBcw.md │ │ │ │ │ ├── event-based-subscriptions@kJMyRhasBKfBypent3GxK.md │ │ │ │ │ ├── execution@72wGg6yP8WnEdmkeKL9vh.md │ │ │ │ │ ├── fields@HPdntdgTar1T34CZX8Y6y.md │ │ │ │ │ ├── fields@Pc9H7AcoqJQkWnuhbytyD.md │ │ │ │ │ ├── fragments@CehwjrCG_wbUU-TFNCuJn.md │ │ │ │ │ ├── graphql-go@9nVo95gRNGHGIbaJQPH1x.md │ │ │ │ │ ├── graphql-http@N-vsu-wvOikuoTbzdgX3X.md │ │ │ │ │ ├── graphql-http@datKo3vPDwXoyVskcrdkc.md │ │ │ │ │ ├── graphql-java@7szipojhVb2VoL3VcS619.md │ │ │ │ │ ├── graphql-on-backend@ODQ8zrHc2rsc8PN-APKvz.md │ │ │ │ │ ├── graphql-on-frontend@6r9XbwlBtHmJrhviG2cTD.md │ │ │ │ │ ├── graphql-over-http-spec@V3bgswBFr1xames3F8S_V.md │ │ │ │ │ ├── graphql-queries@W_Lg8086ZhrIqtck1sgnb.md │ │ │ │ │ ├── graphql-yoga@Gotb1xtxySCVC5MrnkPSs.md │ │ │ │ │ ├── graphqljs@jCzrMElTo-c9xGcpPOOPl.md │ │ │ │ │ ├── interfaces@tc_rjJZrr2x3bp8mcoQ0F.md │ │ │ │ │ ├── introduction@JfXwzkN29UGz17FYHHE3A.md │ │ │ │ │ ├── lists@d2ikbo4sZq7PmaCi5znkd.md │ │ │ │ │ ├── lists@sJ1_c3e08aehiqNMbIEEP.md │ │ │ │ │ ├── live-queries@CHdzww8_TNfeM6Bp1oTPI.md │ │ │ │ │ ├── mercurius@iTV2H8clmRTOksul4v38p.md │ │ │ │ │ ├── multiple-fields-in-mutation@AySlY8AyI6jE-cy-qKKOU.md │ │ │ │ │ ├── mutations@jy_91mhFWbpR6sYVbuX1x.md │ │ │ │ │ ├── objects@LX9vZpx7yKlf0iR6AtBWz.md │ │ │ │ │ ├── operation-name@q9TYEygvUyHourdZIvk8G.md │ │ │ │ │ ├── pagination@Uf8XxJPs7RzKVhlxiQdbB.md │ │ │ │ │ ├── problems-graphql-solves@2rlmLn_yQQV-7DpX1qT98.md │ │ │ │ │ ├── producing-the-result@zQHifboRreE4OgJ7GnUlp.md │ │ │ │ │ ├── realtime@2YLm_S1j_832pb1OGSNaM.md │ │ │ │ │ ├── relay@Ab_ngkf6bmejvcp9okuw6.md │ │ │ │ │ ├── resolvers@VDur5xYBC0LJtQgDrSEyj.md │ │ │ │ │ ├── root-fields@AlJlHZD3_SPoLNaqdM-pB.md │ │ │ │ │ ├── scalar-coercion@QFUOmJlPkkjpcl1vJxg9h.md │ │ │ │ │ ├── scalars@U-tLelmNQtR-pUq-sxU_2.md │ │ │ │ │ ├── schema@lj1WEh4WbfBsoZFYsi1Yz.md │ │ │ │ │ ├── serving-over-internet@inhjhH-7xJyX8o4DQqErF.md │ │ │ │ │ ├── specification@A-PQ3_FVuCK3Eud75hsdj.md │ │ │ │ │ ├── specification@O8k-m6s9B_uXkLsXKVFnL.md │ │ │ │ │ ├── subscriptions@IbEqXlGjsyNLKE9dZrPPk.md │ │ │ │ │ ├── synchronous@uPpsj2kCdgKsJpmTaw86u.md │ │ │ │ │ ├── thinking-in-graphs@J5mU0v491qrm-mr1W3Msd.md │ │ │ │ │ ├── type-system@jpu0_FAlxtD-H80mPcod5.md │ │ │ │ │ ├── unions@59COH3rerJJzKr6vrj4bF.md │ │ │ │ │ ├── urql@WP0Oo_YMfLBlXqDQQtKes.md │ │ │ │ │ ├── validation@I4wNBXV4xEZ0LWBhv5FwF.md │ │ │ │ │ ├── validation@iYkHCKTsjtvo40f3eZoet.md │ │ │ │ │ ├── variables@YZaFEK547FYricfOuANvH.md │ │ │ │ │ ├── what-are-mutations@9Q2pGidY-rfkltHq3vChp.md │ │ │ │ │ ├── what-are-queries@2SU4dcaz7zwGsF7g8FjmI.md │ │ │ │ │ ├── what-are-subscriptions@RlBc-hWEUOPaEQLTgJa-K.md │ │ │ │ │ └── what-is-graphql@cMfsRtvzvDZZJ0TqeUOxm.md │ │ │ │ ├── faqs.astro │ │ │ │ ├── graphql.json │ │ │ │ ├── graphql.md │ │ │ │ └── migration-mapping.json │ │ │ ├── html/ │ │ │ │ ├── content/ │ │ │ │ │ ├── abbr@aeovzlUV4oWwZCMcAoRVC.md │ │ │ │ │ ├── accesibility@YHoag7UR40OeIVUjfhQg_.md │ │ │ │ │ ├── address@PGKWhfXEd3Iv0AIhL7y4_.md │ │ │ │ │ ├── article@99wo0cNHe0sU63_aDBrxY.md │ │ │ │ │ ├── aside@VahoGEC6I3jX1916MsmUY.md │ │ │ │ │ ├── audio@k8FZPxFcDPVnXBONWUhME.md │ │ │ │ │ ├── b--strong@efddQv5AZqvGmIyuYuCr7.md │ │ │ │ │ ├── basic-tags@MjGfRzhVZRxu545TbJ1AJ.md │ │ │ │ │ ├── basics-of-seo@yEl77JIN5-ixN5Ay247qp.md │ │ │ │ │ ├── blockquote@B-Bv4aY_tGgWakyT8TgEe.md │ │ │ │ │ ├── body@93tSk4RwWfkfOyaA7I9Gn.md │ │ │ │ │ ├── br@cBKw3jiAvdXVwUryV1aJl.md │ │ │ │ │ ├── browsers@4gvPprSH7hRS4gtXNMcCF.md │ │ │ │ │ ├── case-insensitivity@qXcn_AGcGWjT8GgjaW5WN.md │ │ │ │ │ ├── cite@PE_WoH4nbGAJSJT14Qli0.md │ │ │ │ │ ├── class@R0mDuO5V5NJI8Yupc_i8i.md │ │ │ │ │ ├── csp@9FAlTHlRj_DVjbpuiGRzD.md │ │ │ │ │ ├── css@fX71CXA26cUxY5WX_zABi.md │ │ │ │ │ ├── data-attributes@7iDMmYQ-2Q6hrrFnUgRuP.md │ │ │ │ │ ├── definition-lists@pEcxDj3dSgAwxydwKWU7d.md │ │ │ │ │ ├── del@v3Uf4LTfCbyasNJ-2Vfj9.md │ │ │ │ │ ├── dfn@jfC0Og9340AK7b3Fhp4WI.md │ │ │ │ │ ├── div@ihP3FIRMr8iQTdOja_CxV.md │ │ │ │ │ ├── dns@0Q41Bm_TZqsC7X-MH8uFe.md │ │ │ │ │ ├── doctype@VscH3rVqpX29vaKmdCMop.md │ │ │ │ │ ├── domain-names@oRjacb1OqAlsP-YB16Nuy.md │ │ │ │ │ ├── embedding-media@UevJNi2HHNzpCAx7Icd0k.md │ │ │ │ │ ├── external-css@PhC4amuHcgxujOJisNsIr.md │ │ │ │ │ ├── file-uploads@-UlDLjC8VsrKB9yexMtlr.md │ │ │ │ │ ├── footer@rjE1yjFZ6KBWXgXDRIZc1.md │ │ │ │ │ ├── form-validation@6NvYDlYYLZzf4IHXu0dWs.md │ │ │ │ │ ├── frontend-development@Xy15NSxlS0QXYNzEvgocK.md │ │ │ │ │ ├── grouping-text@Wu3oW_gnjKTYV8QJHdNxi.md │ │ │ │ │ ├── h1-to-h6@AmIRWclu6IYViWHXnGA8U.md │ │ │ │ │ ├── head@Ufgy4-kC2drCov4MqEhjy.md │ │ │ │ │ ├── header@0AF0Xs2nWVZav9t5Eh9NX.md │ │ │ │ │ ├── hosting@t9KmPbRh6pkfouPi1mBqJ.md │ │ │ │ │ ├── how-the-web-works@0CHn_ubTBRWgrYGy0moZh.md │ │ │ │ │ ├── hr@Bdu0_AcAADs7YiCaHte1g.md │ │ │ │ │ ├── html-comments@-ME4w8Bm5krSH14Yno4E5.md │ │ │ │ │ ├── html-entities@Ego3XwBDgqlXOj6jSNvpy.md │ │ │ │ │ ├── html@b83npHc-R9M03hEGzA9Ha.md │ │ │ │ │ ├── html@fP2cPskF9KzppZUhfyB8U.md │ │ │ │ │ ├── i--em@9EGwQalXfVGpVcMpTeD4V.md │ │ │ │ │ ├── id@PikSDs0EZ93RauZc_GDEw.md │ │ │ │ │ ├── iframe@W0pWVr4cdxSan9Ceu5t7i.md │ │ │ │ │ ├── images@94HB2gvHgcEIeFQTlbVDu.md │ │ │ │ │ ├── img-vs-figure@f5O_U9dt0b73ZhLrWWz2L.md │ │ │ │ │ ├── including-javascript@5Ze6iqSnZLpQWnhUSGQOE.md │ │ │ │ │ ├── inline-css@ievbuvgPKo261hM-9F117.md │ │ │ │ │ ├── ins@G_hZBbIGOLn1-sh1jROL3.md │ │ │ │ │ ├── internal-css@1uhThwxjHgXPu_i1__1eE.md │ │ │ │ │ ├── introduction@JkLec2vSBMFAUc1Dzra-L.md │ │ │ │ │ ├── javascript@F-9uI39S9oYVGA8hi7aZI.md │ │ │ │ │ ├── labels-and-inputs@9R5WYPxlChmz6bevJUwsT.md │ │ │ │ │ ├── limitations@HxgDw9gh1vHiMIMyZW8H2.md │ │ │ │ │ ├── links@wmAps9IeAvOxcqBqgUAXN.md │ │ │ │ │ ├── lists-and-types@oHbzYpFInyr5aKCe-NWkC.md │ │ │ │ │ ├── main@InNY2DPYlnZaeBG9X_sMI.md │ │ │ │ │ ├── mark@9S2IUUWVv_Q7ZfD7VqfhH.md │ │ │ │ │ ├── meta@ceAHMWQeaqURKWy628QBH.md │ │ │ │ │ ├── nav@4uKQubirOgXz9ZvfR9cWa.md │ │ │ │ │ ├── nested-lists@wDBnbKni0SamOqNhnp87B.md │ │ │ │ │ ├── ordered-lists@ePOzN3Sh5tCYlAbsweWU0.md │ │ │ │ │ ├── p@czmIvZYONFDxB2UNpT8U1.md │ │ │ │ │ ├── pre@-2BvwJsqa5K8Tb8oSDUC8.md │ │ │ │ │ ├── priority-hints@znqYy9Tgfpe-qakjRr7KU.md │ │ │ │ │ ├── q@Xprekf2SY1fevcR2P5gRw.md │ │ │ │ │ ├── s@Hx8mfbfkvRrBqLypE_NL3.md │ │ │ │ │ ├── section@1WvHjkclwT-LUGdeuygzV.md │ │ │ │ │ ├── semantic-markup@aJTXstcrsINdov7yrH8cE.md │ │ │ │ │ ├── span@f7-umBvAzDZxHtHgJMCj6.md │ │ │ │ │ ├── standard-attributes@xgw2ux-2Poml1fjWxjFsu.md │ │ │ │ │ ├── style@GpaI2IDHDOZjyT3AZMbYD.md │ │ │ │ │ ├── styling-basics@51NlCt5pvWNfa70WaE2M4.md │ │ │ │ │ ├── sub@JU8Ff3DSCn_db0K7-P-Op.md │ │ │ │ │ ├── sup@o1rSXBsjhD-sN0FdOK_dm.md │ │ │ │ │ ├── table-tag@3P9p18a9EjbjjMtzpoVRN.md │ │ │ │ │ ├── tags-and-attributes@nOIijMH-3TvcO1KL6qzwf.md │ │ │ │ │ ├── textual-tags@ksKI4TDz4_9IcmNORczWo.md │ │ │ │ │ ├── title@SS7JmTrySRmRlzInvRJxw.md │ │ │ │ │ ├── unordered-lists@LKn40uz56vYrPnLG3I-CY.md │ │ │ │ │ ├── using-forms@P_wR4dwto2NKrvTRbdBIX.md │ │ │ │ │ ├── video@mWc4HuNQACXGpJjEPa79j.md │ │ │ │ │ ├── what-are-markup-languages@4gst44L8-ps9YFMHzucfN.md │ │ │ │ │ ├── what-is-http@nXRjahYSDqfEqY26yfLEt.md │ │ │ │ │ ├── what-is-seo@6vGbvRsmQgOpRh8JJ3RF_.md │ │ │ │ │ └── whitespaces@IUsaaRxiuOn3y9uYbpsJ0.md │ │ │ │ └── html.md │ │ │ ├── ios/ │ │ │ │ ├── content/ │ │ │ │ │ ├── accessibility-inspector@h34LaYQ3JYN2AZPMDqpmO.md │ │ │ │ │ ├── accessibility@1DZYPqvgY6GtwMCS7N2y-.md │ │ │ │ │ ├── alamofire@nJeBisdKtN43ntkXnPCVF.md │ │ │ │ │ ├── app-store-distribution@iZAXQKLe2LaIIifVFtFOL.md │ │ │ │ │ ├── app-store-optimization-aso@jZpH-T2hW-XBdprVqemGi.md │ │ │ │ │ ├── architectural-patterns@ajPGMwoaFb1UFWTtpi5kd.md │ │ │ │ │ ├── arkit@k3uHcF0CsyHr6PK95UwR1.md │ │ │ │ │ ├── async--await-in-swift@3GtrUXvLgvXK3G8cXRb-P.md │ │ │ │ │ ├── async--await@ysaBCl_TtWqelirptQp7P.md │ │ │ │ │ ├── auto-layout@j2BL0sf3WjnJZZWa7cCjy.md │ │ │ │ │ ├── avfoundation@UKgiSQvR9cryQT50t7riZ.md │ │ │ │ │ ├── azure-devops@r3fNx1Hk_TGlQSDtRnXqF.md │ │ │ │ │ ├── basic-interfaces@0o3V_zveN1xCIt7rayrCF.md │ │ │ │ │ ├── basics--creating-animations@w0i5Dxp40XS2HnF5nXeZI.md │ │ │ │ │ ├── benefits-over-objective-c@ZkNulHQAqhiFTO3CRC_mW.md │ │ │ │ │ ├── breakpoints@X0QavvwPVJU6sulafPVUK.md │ │ │ │ │ ├── building-interfaces@YvuYJceeNNfLBpq2-3iiL.md │ │ │ │ │ ├── callback-hell@WhOpzFvv21QQV3aS6XbXr.md │ │ │ │ │ ├── callbacks@qJEd7KU52xL_GRG3IQqhM.md │ │ │ │ │ ├── capturing-values--memory-mgmt@S-D-PnHA7COd2Dp6U2XO4.md │ │ │ │ │ ├── carthage@tIHjjNTXJWcNgkO6TB9ea.md │ │ │ │ │ ├── ci--cd@U4xE1enkZxUME0j0gutae.md │ │ │ │ │ ├── circleci@tWxuFh0xDugdplnHt_G0e.md │ │ │ │ │ ├── closures@M9UlalPL47GoqhcyGsAPV.md │ │ │ │ │ ├── cocoa-touch@leozxW-5fAOfkKbQM4FD1.md │ │ │ │ │ ├── cocoapods@epr1sOEZIAOwlgb8bre7r.md │ │ │ │ │ ├── code-quality-tools@DVe8S6TjKcQ8LT5G-aMVa.md │ │ │ │ │ ├── combine-and-mvvm@pY_zaMcFpeFDLgVk2W0Vy.md │ │ │ │ │ ├── combine@UzpdLLPs226N00c6weWRv.md │ │ │ │ │ ├── components@A1TFKVjGU5RbeTF_zxJlu.md │ │ │ │ │ ├── components@xkH7Llut6uP2-8iTMw76F.md │ │ │ │ │ ├── concurrency-and-multithreading@fbloF-u4XwdHLmBS9flZm.md │ │ │ │ │ ├── concurrency-gcd-asyncawait@aALIiAxKz4f7B_EYyhBCi.md │ │ │ │ │ ├── concurrency@-aLGB3cDXZHIhVU3t-Ve4.md │ │ │ │ │ ├── core-animation@KpcmuLWX0xAjz6ty4ebtB.md │ │ │ │ │ ├── core-animation@_mRs6ctH0IsSSi-cwV2b8.md │ │ │ │ │ ├── core-audio@4bAABCfTvxchS5C5NlAro.md │ │ │ │ │ ├── core-data@H4-Dp2WTA6HAZiFRQdLjx.md │ │ │ │ │ ├── core-graphics@kRE9xT3mT9Si4NwJr9yGi.md │ │ │ │ │ ├── core-image@6zE_M0_oVpwW0B9qFSRgP.md │ │ │ │ │ ├── core-ml@7s9Elv80TbZX_-NZpyutj.md │ │ │ │ │ ├── core-os@IdGdLNgJI3WmONEFsMq-d.md │ │ │ │ │ ├── core-programming-concepts@mk02yV7_XHkgp2xdNIxaU.md │ │ │ │ │ ├── core-services@LHM7gNgTtfn_QDW-oQskD.md │ │ │ │ │ ├── data-binding@yR94uHs0SiSScU4gPBzfr.md │ │ │ │ │ ├── data-persistence@6gfqFy3H6SLt06oJ1kt5A.md │ │ │ │ │ ├── debug-navigator@VuWUsg05WmOoP_RJ5AXJO.md │ │ │ │ │ ├── debugging-techniques@OZZ3UnWN2gFflbM_WaJ8H.md │ │ │ │ │ ├── declarative-syntax@QVg4_8EXeQBJbleryy8c1.md │ │ │ │ │ ├── delegate-pattern@BtPYKd7RedHOLRATDKkpg.md │ │ │ │ │ ├── dependency-manager@Tv8-WUcKiZMLHuunQwise.md │ │ │ │ │ ├── dynamic-library@Lrb4HZYrZU7SJlbedZp7U.md │ │ │ │ │ ├── dynamic-type@0nei6iwP4Pgi_j4vVi_Qt.md │ │ │ │ │ ├── editors@-4q7MFXaTmpR_39PTeWD8.md │ │ │ │ │ ├── error-handling@N5ojp6bqgH074MPKYjCHV.md │ │ │ │ │ ├── fastlane@_W3vb0b14FrWB2fH7DHC7.md │ │ │ │ │ ├── file-system@_bkRbqVXKNCnRvEFCM6mN.md │ │ │ │ │ ├── frameworks--library@pZVPsgvCpP3zUgBM4i0CF.md │ │ │ │ │ ├── frameworks@PdzCQXZIivw3zCYPtokJV.md │ │ │ │ │ ├── functional-programming@Pj-hqRZUmwx1WhmTbLoFD.md │ │ │ │ │ ├── gamekit@H5F9P5xeQiHhWhS6jEzp5.md │ │ │ │ │ ├── gcd@aROcI1RucAyu-gHn-tVnj.md │ │ │ │ │ ├── git@QifWR7WSJJTcTK2IfczxG.md │ │ │ │ │ ├── github-actions@LltERZaHsI-R_3O_3twpk.md │ │ │ │ │ ├── github@U_xXGSFF5iibQ4VkzPAWf.md │ │ │ │ │ ├── gitlab@VylaBSDAVFzveVfytI1Fz.md │ │ │ │ │ ├── graphql@9o7d3aN0YFfNNUeVoJrhs.md │ │ │ │ │ ├── groups@42sfiLKrVCcnMMjR7TFn1.md │ │ │ │ │ ├── healthkit@Jsu5f6QASpuvpky_W5q-O.md │ │ │ │ │ ├── hig@1I5eFKqFVBxWLAXfpgNXO.md │ │ │ │ │ ├── history-and-why-swift@z4-1Gc95JKYAn2RPFc7hw.md │ │ │ │ │ ├── http--https@GjY5qCU1rjB0D58qHQtAR.md │ │ │ │ │ ├── ibactions@FspN4yiBF9aEN7_SlXUe1.md │ │ │ │ │ ├── iboutlets@tuUuLInq0p-nhehe2AqPg.md │ │ │ │ │ ├── implementing-delegates@z3AUN9u7EEqeKOqvLxf7D.md │ │ │ │ │ ├── installing@R8LdFpfyS0MFYJuMLk8RG.md │ │ │ │ │ ├── interface-builder@iMzYd8KUFnk6zqr4KecgX.md │ │ │ │ │ ├── interface-overview@FwwqAchMC6qdnXbqg45he.md │ │ │ │ │ ├── interoperability-with-swift@IAPzuN51xvrZJ5TFB23Q9.md │ │ │ │ │ ├── ios-architecture@IduGSdUa2Fi7VFMLKgmsS.md │ │ │ │ │ ├── jenkins@TrblGyy81Oep2CBxoZkaf.md │ │ │ │ │ ├── json--xml@WYV4YG_sLvC4S5ptFFdrF.md │ │ │ │ │ ├── keeping-updated-with-wwdc@fOOQurIL1w3PwH5Mep9x1.md │ │ │ │ │ ├── keychain@8v_eP0j85TnB33XyYAzrT.md │ │ │ │ │ ├── latest-ios-sdk@SBlLNfyWzzhdFNtNtkLet.md │ │ │ │ │ ├── latest-swift-version@e7qVpQeu2iQL0c9MOMCVe.md │ │ │ │ │ ├── lottie@i-T6GTqS0FZ_Llt5v4SvR.md │ │ │ │ │ ├── mapkit@XOXsjaQ-YyuAMpVCqH8KG.md │ │ │ │ │ ├── media@nGCG74_Xp_Ngt0u7PZnZl.md │ │ │ │ │ ├── memory-management@tqbg8mBJfjuXacdMlIB_L.md │ │ │ │ │ ├── metal@5VguZoP4h40rTWkxWxaxU.md │ │ │ │ │ ├── modals-and-navigation@jb89kQxDhZND3vQo0EH7r.md │ │ │ │ │ ├── mvc@a-QDI7Ei-B5BRHbicFcfG.md │ │ │ │ │ ├── mvp@lVNrnUK6p4eifKRVSnOje.md │ │ │ │ │ ├── mvvm-c@iLT2jAkQg-Ex0zSLquNfl.md │ │ │ │ │ ├── mvvm@taTxZw2c3xS18JOwgkNHM.md │ │ │ │ │ ├── navigation-controllers-segues@tUbMr1pGlw4JwMuW311JJ.md │ │ │ │ │ ├── navigation-stacks@TLm70PlTI0K3Odn1iYxWX.md │ │ │ │ │ ├── navigation-stacks@mUMDZsgzCB6cs_K6pfUY1.md │ │ │ │ │ ├── navigation-view@IBr2P7dknWTnZ2a-fFCqN.md │ │ │ │ │ ├── navigation@02VAK4GMkN6nDHf1zqwPA.md │ │ │ │ │ ├── navigation@FXUrfyvuIIOH7VDnT_E0z.md │ │ │ │ │ ├── navigationlink@my77jLU2qxU7bQ7_Fx2iH.md │ │ │ │ │ ├── navigators@odKZx4SUULF1y4gmiJZdu.md │ │ │ │ │ ├── networking@JoNoM-utp8MaL1H0oXDta.md │ │ │ │ │ ├── new-feature-announcements@0dbdUmWvTIJ0fkUuLp9gR.md │ │ │ │ │ ├── new-project@BJgoAgH85U6S3RtXq7hHV.md │ │ │ │ │ ├── objective-c-basics@0BSX80W1TJ_Ia_Zh2zKyK.md │ │ │ │ │ ├── objective-c@oOaMz9A5DZvrjxovMztXz.md │ │ │ │ │ ├── observables--observers@k232wKg7XCb_ngjZ5Mwsy.md │ │ │ │ │ ├── oop@FoqlB7xBIrV4yUp4ReBkw.md │ │ │ │ │ ├── operation-queues@mdAV4JlF08q-ZQpb5C3q6.md │ │ │ │ │ ├── operators--pipelines@GAn12SsVR_mPxOaOVckdz.md │ │ │ │ │ ├── operators@t7IYTY8tVjC_xzM1n8wts.md │ │ │ │ │ ├── parsing@UTVh1RHRWb5eA-S7ayLp8.md │ │ │ │ │ ├── pick-a-language@MrdIb9F-wSEbUz7KRnH3t.md │ │ │ │ │ ├── preferences@SeGfULWFR7ufdv4U9Db3F.md │ │ │ │ │ ├── presenting--dismissing-views@4pmjLa7WvwV7D3RZlM6Hp.md │ │ │ │ │ ├── profiling-instruments@Y24WWPej0C7-FiBeXpvl3.md │ │ │ │ │ ├── project-files@YytdlQl41yrHSwlV-G3Pd.md │ │ │ │ │ ├── publishers--subscribers@noBaDV_PvCTzqPyw9eO4H.md │ │ │ │ │ ├── pushing-presenting@gqd6zjxP_qFj4Ru-6LARo.md │ │ │ │ │ ├── reactive-programming@28HMXXBJWd3n-ZPgeQRDa.md │ │ │ │ │ ├── rest@3Qw-qmy5iAE61mPbIY4Q2.md │ │ │ │ │ ├── rxswift-with-mvvm@g_1f5a6tIB5V_36NjgtL5.md │ │ │ │ │ ├── rxswift@0xwoWj9jek36p1AwU3WkK.md │ │ │ │ │ ├── schedulers@UqA01PT86_w_JzN6KZBku.md │ │ │ │ │ ├── serializing@8rYjSCgRiJMHTNxOU6vgG.md │ │ │ │ │ ├── sqlite@3qjQbrCUchJn1bJTBWrQF.md │ │ │ │ │ ├── state-management@RvyOkQelc-GChQGJyEx72.md │ │ │ │ │ ├── static-library@RuXuHQhMt2nywk43LgGeJ.md │ │ │ │ │ ├── stepping@hUHxlNa6iJJbDGdFNhynB.md │ │ │ │ │ ├── storyboards@a2CqrCJSxGfHq6_Y9f_re.md │ │ │ │ │ ├── subjects@1xYZdnlI6JSJzNvmz4-0v.md │ │ │ │ │ ├── swift-basics@fboebSmquyJyozsMRJDtK.md │ │ │ │ │ ├── swift-package-manager@KFkX8_Hv9SCFeCtZMZIQM.md │ │ │ │ │ ├── swift-recommended@KJ7fM-V0_azY_lzmhjJAN.md │ │ │ │ │ ├── swiftformat@TMFvfwG45Z00PzrzZIVhT.md │ │ │ │ │ ├── swiftlint@NnTC3R8goZQTXHmfHKHbM.md │ │ │ │ │ ├── swiftui@PvFp6aY7EUrYHn87RZAGj.md │ │ │ │ │ ├── swiftui@kAIKsDcDzwI1E0wSnC_uo.md │ │ │ │ │ ├── tailor@F5796wzm5Ar6sQt-1y8vH.md │ │ │ │ │ ├── tca@NhC0SBZgUFGjMLNICvbTI.md │ │ │ │ │ ├── test-plan--coverage@uczkyc30K_qqcarZCGTdF.md │ │ │ │ │ ├── testflight@KCJgCjMJGxIcf13XSEclO.md │ │ │ │ │ ├── toolbar@AxQ5gCjk136kXsbBFTUNp.md │ │ │ │ │ ├── ui-design@4fPgpGwNXmVoZoruBRb_B.md │ │ │ │ │ ├── uikit@-7OW2IgiMk1eot1PaYd7m.md │ │ │ │ │ ├── uikit@pNEE5C1E1wAjH_nTlzH6N.md │ │ │ │ │ ├── understanding-and-using-closures@5V7nxQKmmHWSMSBCRxkaF.md │ │ │ │ │ ├── unit--ui-testing@5589B1DKaCd-9l9DfKH3o.md │ │ │ │ │ ├── urlsession@WPJACNeI6jX9GGB1roeTp.md │ │ │ │ │ ├── user-defaults@ImS1FqVicQImMw-y1ze7y.md │ │ │ │ │ ├── user-interactions@GKuxilB0AwjcTgCSk3FeU.md │ │ │ │ │ ├── version-control@sGnDm2xuJxqfU3pwmlY7H.md │ │ │ │ │ ├── view-controllers@mfWdkUm1RhjygtMyInXiD.md │ │ │ │ │ ├── view-transitions@2tmR1yE5daz2HB4IV5qwI.md │ │ │ │ │ ├── view-transitions@cwVcNDTBBulBY2m4Wzn4G.md │ │ │ │ │ ├── viewcontroller-lifecycle@DZaY060-5D6PbfryOZH9H.md │ │ │ │ │ ├── views-and-modifiers@mgUCYztUpKINqIZikT4Bh.md │ │ │ │ │ ├── views-view-controllers@XX5rCd_yTHvOfYif4Kpbl.md │ │ │ │ │ ├── views@se9w7mT1XJLGlmWUhH4Uv.md │ │ │ │ │ ├── viper@mTdnDPGYSDupM9VBNdXRg.md │ │ │ │ │ ├── voice-over@trAMZVA4tDB7b_qAgiWNW.md │ │ │ │ │ ├── xcframework@MaHtZSIPxDzrnB33_9OdV.md │ │ │ │ │ ├── xcode-debugger@WxshXCloVDkVkQV0JvI1w.md │ │ │ │ │ ├── xcode@la5M4VoH79bhnN8qj5Izp.md │ │ │ │ │ ├── xctest@xZmBJVq5FHNdm1BDuZbbS.md │ │ │ │ │ ├── xcuitest@ZQSUKPbXZl5yKra2ap8JR.md │ │ │ │ │ └── xibs@RwvC4Pi18_1phcrJL-9iu.md │ │ │ │ ├── faqs.astro │ │ │ │ ├── ios.json │ │ │ │ └── ios.md │ │ │ ├── java/ │ │ │ │ ├── content/ │ │ │ │ │ ├── abstraction@qdA6bK9ZkP8p0_NH_wMuj.md │ │ │ │ │ ├── access-specifiers@KYndNwfQcwRCf3zCXOwd_.md │ │ │ │ │ ├── annotations@c--y6GcKj9am0CBdu_Hnt.md │ │ │ │ │ ├── array-vs-arraylist@a-EQiBUlSgdZba1mW36op.md │ │ │ │ │ ├── arrays@5khApwg1FZ-0qorsLyH-F.md │ │ │ │ │ ├── attributes-and-methods@xTwJYcA6ldgaw3yGmbDEd.md │ │ │ │ │ ├── basic-syntax@OlbQNB6YXZjO1J7D0lZU1.md │ │ │ │ │ ├── basics-of-oop@DZ4BX4NYeCQbjGSj56lng.md │ │ │ │ │ ├── bazel@6FMj9tMAQPii_1kLtHJLk.md │ │ │ │ │ ├── build-tools@81N1cZLue_Ii0uD5CV6kZ.md │ │ │ │ │ ├── classes-and-objects@LenPrQwxFsE1UVbXO_dE7.md │ │ │ │ │ ├── concurrency@shqS9-hg__mkOtnnl_I4l.md │ │ │ │ │ ├── conditionals@sG_3ZQIE1-FQXQkk-OduQ.md │ │ │ │ │ ├── cryptography@_wV2VQq6MIY1rVHjK8pfu.md │ │ │ │ │ ├── cucumber-jvm@UFDy19TNkykRsKv4vRsVJ.md │ │ │ │ │ ├── data-types@5g9mmi01WeZ4aDqNzwx_V.md │ │ │ │ │ ├── database-access@fV-gW51jhna2__Ln2HIIh.md │ │ │ │ │ ├── date-and-time@9h20XVRli7TDq0QIJwX2U.md │ │ │ │ │ ├── dependency-injection@zItXmuluDtl6HkTYQ7qMh.md │ │ │ │ │ ├── dequeue@DWO2-EPIUeKK5aQGiTuKc.md │ │ │ │ │ ├── ebean@X2rJ3BY1ytFKsbJqJETFu.md │ │ │ │ │ ├── encapsulation@iH9wSsOK4a77pS7U0Yu5z.md │ │ │ │ │ ├── enums@ey1f8IsdAlDv1O3E_tNog.md │ │ │ │ │ ├── exception-handling@g9P3548F38tYGjevBc42w.md │ │ │ │ │ ├── file-operations@NowpzyPVFcX082j5YS5i8.md │ │ │ │ │ ├── final-keyword@Ajuc_rHObqMQBXLqRIuxh.md │ │ │ │ │ ├── functional-composition@1Mk_zXxCCcUoX-gFxtlnf.md │ │ │ │ │ ├── functional-interfaces@SityDdjhhNZ9CO3Tg0VI9.md │ │ │ │ │ ├── generic-collections@eL4pc6SaNiKP48PzN7mNe.md │ │ │ │ │ ├── gradle@rmDIm5dqtdlNfPhvpqS7-.md │ │ │ │ │ ├── hibernate@UEiDzzodyEu5O1xFAFDly.md │ │ │ │ │ ├── high-order-functions@dz6bCmB4dgA7VVZ448cN6.md │ │ │ │ │ ├── inheritance@PXpPEmCEBUKRjwP3B5LzJ.md │ │ │ │ │ ├── initializer-block@dg_UpaO8TzIN7w_QZ1n-6.md │ │ │ │ │ ├── interfaces@6wTRN2PYC6zM_Txkekx53.md │ │ │ │ │ ├── io-operations@M0ybgK1JCycXhZ1dEpCFo.md │ │ │ │ │ ├── iterator@-17LFO72I8RKjJRMXct9k.md │ │ │ │ │ ├── java-memory-model@wEc7pSVU5G2c6Zqmtb_1k.md │ │ │ │ │ ├── javalin@OrkJa48HIDmrLOgCBpimA.md │ │ │ │ │ ├── jdbc@9UbRG752qxJdUwmqEAjN3.md │ │ │ │ │ ├── jmeter@U2BqOY49HaII6mKQB3SVt.md │ │ │ │ │ ├── junit@hY1-sEpTmpaj1PregdkFf.md │ │ │ │ │ ├── lambda-expressions@00_q6I95eO-PUUrKpPFY8.md │ │ │ │ │ ├── learn-the-basics@2TGq1y2QthnxxN-FfToSe.md │ │ │ │ │ ├── lifecycle-of-a-program@QgWalJLIb6Fw0HhN1wb02.md │ │ │ │ │ ├── log4j2@sFaNj_1MviaTc6UIfjXl6.md │ │ │ │ │ ├── logback@okC1uMdyfIJAhX_R9Npsw.md │ │ │ │ │ ├── logging-frameworks@d9F5Wt8onY125DLuzNULg.md │ │ │ │ │ ├── loops@JHUhVEjWFXTn6-wKcKevg.md │ │ │ │ │ ├── map@eKtdDtiJygKQ4PuEylFQY.md │ │ │ │ │ ├── math-operations@ziD_XwzJSFQP_3iLjq9pA.md │ │ │ │ │ ├── maven@VdL_fAHxmRbuF0J627beA.md │ │ │ │ │ ├── method-chaining@Ax2ouIZgN1DpPzKDy4fwp.md │ │ │ │ │ ├── method-overloading--overriding@y-i56f1P_mMdvyBr7J4XE.md │ │ │ │ │ ├── mocking--mockito@mLM1HJf6_pxrUDOmb45ew.md │ │ │ │ │ ├── modules@kdxy8Zssnc5lJjdmjUyMc.md │ │ │ │ │ ├── nested-classes@zDBW20W2XMCtNTG3emJ_A.md │ │ │ │ │ ├── networking@JeMG0gU8IVRBZgczjXmPi.md │ │ │ │ │ ├── object-lifecycle@3qowgj1pas1X7oRric9eU.md │ │ │ │ │ ├── optionals@l9fxK8K9fcUqR7hs5TkWU.md │ │ │ │ │ ├── packages@60POZOjwHSdKYL6rfkyEy.md │ │ │ │ │ ├── pass-by-value--pass-by-reference@3r0Er9XZHovIZz3gNyj4A.md │ │ │ │ │ ├── play-framework@kN-mXxqUPNJNsJGQ0U_7J.md │ │ │ │ │ ├── quarkus@w-kcKPh8U0P_jtT90_1Xy.md │ │ │ │ │ ├── queue@ThoWhXb4vUvNfE70_wMfa.md │ │ │ │ │ ├── record@VqLV7kolfRFnvOuJAvzlg.md │ │ │ │ │ ├── regular-expressions@C7rB3jkshHFN7TkHRJPlz.md │ │ │ │ │ ├── rest-assured@gB4XUR9nCdF1-dOEwGcHi.md │ │ │ │ │ ├── set@XjkNd5WJ9yxW48dwHQNkZ.md │ │ │ │ │ ├── slf4j@LGlZHKqyQ-aWtHnhklhgn.md │ │ │ │ │ ├── spring-data-jpa@WzWOxBUKKg6LeuBmVesc2.md │ │ │ │ │ ├── spring-spring-boot@xoryfi4SpJlkz-PV05ql6.md │ │ │ │ │ ├── stack@DzfE_9WLAp-BrG3C1-MwU.md │ │ │ │ │ ├── static-keyword@ZcNxO6qIXIg7RaWYnZj2e.md │ │ │ │ │ ├── static-vs-dynamic-binding@Kjdj862xnz8fqDYE3HKhC.md │ │ │ │ │ ├── stream-api@WHxAwfdKHQSOg0TLX05EG.md │ │ │ │ │ ├── strings-and-methods@aEaBobzFWv0mJHGAbgxKY.md │ │ │ │ │ ├── testing@LgpsnXV0CTvTspjnsd0Rd.md │ │ │ │ │ ├── testng@XU2C8bF9ICej8LS7ZGTTv.md │ │ │ │ │ ├── threads@u_YysD7Bpnq-xkFX5yJGz.md │ │ │ │ │ ├── tinylog@Fn7aAaGbwYsAp4xLuuFud.md │ │ │ │ │ ├── type-casting@yNDbk6r5wFqBi25xmIRF_.md │ │ │ │ │ ├── variables-and-scopes@VBNcAO0STaZJ1iV9A7utv.md │ │ │ │ │ ├── virtual-threads@vJSq1GJLIMQ6IIB8CMK8g.md │ │ │ │ │ ├── volatile-keyword@U4Wx3MH3LgJLa0n9Ne0Br.md │ │ │ │ │ └── web-frameworks@_W84u4UXMSY0zvy6RJvFi.md │ │ │ │ ├── faqs.astro │ │ │ │ ├── java.json │ │ │ │ ├── java.md │ │ │ │ └── migration-mapping.json │ │ │ ├── javascript/ │ │ │ │ ├── content/ │ │ │ │ │ ├── @RonBj1htt6jnBt3W7zoTA.md │ │ │ │ │ ├── @lJwcc6JoUIQoiQ6FkV2KW.md │ │ │ │ │ ├── all-about-variables@kvActjpU4FUJdrmuFoFEe.md │ │ │ │ │ ├── apply@-BtF34cEzI6J8sZCDRlRE.md │ │ │ │ │ ├── arguments-object@QLC7bW-qHskLH2HOA-Sko.md │ │ │ │ │ ├── arithmetic-operators@0PK1NwlgkNe2Vf-We4uLH.md │ │ │ │ │ ├── arrays@NZedBxG9B9TRVOf2QE2yL.md │ │ │ │ │ ├── arrow-functions@fr0NChxMXLpJizyMhXcXS.md │ │ │ │ │ ├── assignment-operators@IvBtUzIGnkgGXrJjqmjf4.md │ │ │ │ │ ├── asyncawait@Dn872mgexmxoLtbkIgIgz.md │ │ │ │ │ ├── asynchronous-javascript@sFOqx6_7poVIVuXhJVY0E.md │ │ │ │ │ ├── bigint-operators@udoz0DZi7f-vm30dSnYKu.md │ │ │ │ │ ├── bigint@6lUF0neW1piiP1RsaVxEX.md │ │ │ │ │ ├── bind@dbercnxXVTJXMpYSDNGb2.md │ │ │ │ │ ├── bitwise-operators@ghjNJW67Wj5L5QK46xwL-.md │ │ │ │ │ ├── block@uqEzHYx13Y2EpvTTRzykn.md │ │ │ │ │ ├── boolean@b1HvkoWA2t4kt8mS6FySm.md │ │ │ │ │ ├── break--continue@4oHFzn7R7xLxfuLpsJjr-.md │ │ │ │ │ ├── built-in-functions@s8wUJivWmetysJ8bt9FBC.md │ │ │ │ │ ├── built-in-objects@D95ndkkwmT5X_HqboEn6E.md │ │ │ │ │ ├── call@gsyY3Oa3Jf0W5K_lyqBYO.md │ │ │ │ │ ├── callback-hell@PJSdqvh5OBwPCNpn3q_S5.md │ │ │ │ │ ├── callbacks@D8oGY7pdviRByaz6c9sU6.md │ │ │ │ │ ├── classes@F_Lrj0F7UXriqJ0mhwxCy.md │ │ │ │ │ ├── closures@itS6B12I8I1KNCPvc0KCQ.md │ │ │ │ │ ├── comma-operators@6_8EwyZY2jBkZr7xnfRY3.md │ │ │ │ │ ├── commonjs@4EXeGkOpfAViB9Uo4zL6O.md │ │ │ │ │ ├── comparison-operators@-v4_V4UuoZSgUk2sqOCim.md │ │ │ │ │ ├── conditional-operators@640mk-m5mB90Mme-7jcXV.md │ │ │ │ │ ├── conditional-statements@ttCsd2_H2SuRivCjGv1OX.md │ │ │ │ │ ├── const@q85z6x1Lc-yLWepwtIT2_.md │ │ │ │ │ ├── control-flow@3tckJ2Sci7z-sNx9jx9eF.md │ │ │ │ │ ├── data-structures@ADarwihuI2nBq1C3U7-Zr.md │ │ │ │ │ ├── data-types@-jbPPuEXacBR0d0CWPHgd.md │ │ │ │ │ ├── debugging-issues@dhEtcgv7G9fNV-AUNJdWk.md │ │ │ │ │ ├── debugging-memory-leaks@BA_ArmZMnVMaL_zl3W3Pt.md │ │ │ │ │ ├── debugging-performance@ECxISKUAU7js_JsfSHzud.md │ │ │ │ │ ├── default-params@8X8mRl-puL0Lp43dO5mha.md │ │ │ │ │ ├── dom-apis@bhuGtcyqPFKu-900aESYz.md │ │ │ │ │ ├── dowhile@57lO_3uxJaWsFXS-0J1AK.md │ │ │ │ │ ├── equality-comparisons@23Xa6q5VvRVlzc6Dx8vST.md │ │ │ │ │ ├── error-objects@-z-4VTaC3tOThqChgyoMs.md │ │ │ │ │ ├── esm@jLNmYeo20Mbu4WRvVgvwU.md │ │ │ │ │ ├── event-loop@_bs5NNHVdHLWGBmpYwHMi.md │ │ │ │ │ ├── exceptional-handling@34TKGxV9YziOWMh9rT_KE.md │ │ │ │ │ ├── explicit-binding@p2NhSwPYMtRiPRHjPaqmX.md │ │ │ │ │ ├── explicit-type-casting@1xhjrRN-Rfekei2JwwU7Y.md │ │ │ │ │ ├── expressions--operators@_6vZa43gWjxO2OcD1iCCQ.md │ │ │ │ │ ├── fetch@kL5rfWxXe4J44ENru1uJS.md │ │ │ │ │ ├── for@2M211rcaPSWbZ-sPoSEVR.md │ │ │ │ │ ├── forin-loop@cq3vvFZoNnAAZJ6oEBUwb.md │ │ │ │ │ ├── forof-loop@FBz6h_AmTJBXoBN-a38a5.md │ │ │ │ │ ├── function-borrowing@EAN6DCiCfSq04R4vKgZ0q.md │ │ │ │ │ ├── function-parameters@R1D4fsZliHv7wIo8Tj-kp.md │ │ │ │ │ ├── function@YMT7O6lrMSMtNo0EnmsnQ.md │ │ │ │ │ ├── functions@k8bJH9qydZm8I9rhH7rXw.md │ │ │ │ │ ├── garbage-collection@KKyX8N4lTgN0w-Khm6Ztq.md │ │ │ │ │ ├── global@oC4o6GLEES_nUgCJu9Q6I.md │ │ │ │ │ ├── history-of-javascript@l-GKzcsBNA0r6Jax8hwnP.md │ │ │ │ │ ├── hoisting@Lb5jLF91WO5V5CWpifciW.md │ │ │ │ │ ├── how-to-run-javascript@uXsWIUUxtc4H_iRx3uZv0.md │ │ │ │ │ ├── ifelse@ndbDXAx6bL4lZmpXv16Y_.md │ │ │ │ │ ├── iifes@YZlCoPvZuX5MmpLOTj5d4.md │ │ │ │ │ ├── implicit-type-casting@pP42K_eH4RCdUdUS8BJlP.md │ │ │ │ │ ├── in-a-function@azsXq6Y5iCvQDgTWZpWQ3.md │ │ │ │ │ ├── in-a-method@3E5MuxPvEJU-dwgTrbQAR.md │ │ │ │ │ ├── in-arrow-functions@P0190rTm2wLQmCzWOKour.md │ │ │ │ │ ├── in-event-handlers@JVbEBtVrTTFnTF3_yUIAC.md │ │ │ │ │ ├── indexed-collections@lBOGoHZrmnIRatvryDwTm.md │ │ │ │ │ ├── introduction-to-javascript@6khAD6mzZ9S96JJuC5_j6.md │ │ │ │ │ ├── islooselyequal@PLallt_T33W6bUEn0Hc3W.md │ │ │ │ │ ├── isstrictlyequal@pcILon_Jjm2_XS10iUJ0E.md │ │ │ │ │ ├── iterators-and-generators@TZ8XGdykSJjKBjX6Nivwo.md │ │ │ │ │ ├── javascript-versions@SFPsWnVpZBAw3_re7op4h.md │ │ │ │ │ ├── json@bFNvtHp97OzKnPJgr7WaH.md │ │ │ │ │ ├── keyed-collections@rhJrrqkRqy2Qw_he4SPGz.md │ │ │ │ │ ├── let@kDRa9G3pMp0Cb0mqYUawM.md │ │ │ │ │ ├── lexical-scoping@q7b5iMJ1Lfka5A-K-YcaN.md │ │ │ │ │ ├── logical-operators@bo4SvzU4BrPl3c99zW7Y5.md │ │ │ │ │ ├── loops-and-iterations@YD-2l_amfqqqCdtc_Zdzo.md │ │ │ │ │ ├── map@Xc0jL4rafpI-ixIaAxo9O.md │ │ │ │ │ ├── memory-lifecycle@ZR2WfH1cerA-V_kaPwRvm.md │ │ │ │ │ ├── memory-management@MatU4SthAAhByJ40XdZQn.md │ │ │ │ │ ├── modules-in-javascript@hLnJlwnECFbVMeFpH0M5Q.md │ │ │ │ │ ├── null@CxyNyFMuTLS3owtRMgClD.md │ │ │ │ │ ├── number@GZ_SXsWmP7AsXRTc4WUMw.md │ │ │ │ │ ├── object-prototype@0I6dJE0ygXPGjeRAe8AtT.md │ │ │ │ │ ├── object@xe8HZ8Mt1fK8yJMcDPYHJ.md │ │ │ │ │ ├── objectis@ATma3bLKdmWY_WTsPIKxh.md │ │ │ │ │ ├── promises@yXSF5gGST7l2X-4z1g0d_.md │ │ │ │ │ ├── prototypal-inheritance@Xge6eru1hRGobnOEHLZqv.md │ │ │ │ │ ├── recursion@YJGhhFuWmFvhRKOg6nwON.md │ │ │ │ │ ├── rest@-_6q0bIjQrvAaCWrVkASO.md │ │ │ │ │ ├── samevalue@nfMrC0eoXZl72H4o3VFEP.md │ │ │ │ │ ├── samevaluezero@fL3B2hkTgMb0oEwMiWJtK.md │ │ │ │ │ ├── scope--function-stack@ISNzEYtrWe2v0R7Xfl5k-.md │ │ │ │ │ ├── set@sciU68E13mcfL577y6Vim.md │ │ │ │ │ ├── setinterval@jaC3XXudd7OBKwwCpoPFf.md │ │ │ │ │ ├── settimeout@wXypuqEmFLIubx-QQvDIr.md │ │ │ │ │ ├── strict-mode@Xw8lb0xCWKmNs4KZfhBUy.md │ │ │ │ │ ├── string-operators@c38b6t5f17Zg2O2yg3eFP.md │ │ │ │ │ ├── string@1RcwBHU3jzx0YxxUGZic4.md │ │ │ │ │ ├── structured-data@JwLGAuSOTyZ5BHSqeBDU6.md │ │ │ │ │ ├── subtopic-node@_JUZE26_bShEpWNjLXzga.md │ │ │ │ │ ├── switch@H_QlcUlavKKfcNK8CYAvb.md │ │ │ │ │ ├── symbol@R6ICrk6vjoBxx5nRGo4Jg.md │ │ │ │ │ ├── throw-statement@ReGIniyLYl5hGExchrJd2.md │ │ │ │ │ ├── trycatchfinally@rbjEZe5vxCJ8reI1oZ-jf.md │ │ │ │ │ ├── type-casting@XPmBieVCXvL3WbWkYRoKr.md │ │ │ │ │ ├── type-conversion-vs-coercion@_Bo2YZqZ_gY35SLPML4T6.md │ │ │ │ │ ├── typed-arrays@8X1mdQ3NDBVOZZWBbAFRE.md │ │ │ │ │ ├── typeof-operator@RRACLQ6-aopkxImIp3Toc.md │ │ │ │ │ ├── unary-operators@k9rSR-YQ8B_iRcXNm2btP.md │ │ │ │ │ ├── undefined@ZLs0NKM0lrnOy5ATDhlk0.md │ │ │ │ │ ├── using-browser-devtools@rc5WzBBOm2cus-rQl8EOE.md │ │ │ │ │ ├── using-it-alone@qps2Mdm-lwa4Wr0IxKm0C.md │ │ │ │ │ ├── using-this-keyword@fm2CuL1IZp3hnrLrPUX7U.md │ │ │ │ │ ├── var@JSjeM8qnBg4onXq9mn5gB.md │ │ │ │ │ ├── variable-declarations@BqbAWt--Guqex-rrb4ZUv.md │ │ │ │ │ ├── variable-naming-rules@HfieG3v3wnmpZDfNwEJvZ.md │ │ │ │ │ ├── variable-scopes@7iMJuaB7yKlSIbT4dBe5L.md │ │ │ │ │ ├── weak-map@6icsjC4aisDgPWasVuCOt.md │ │ │ │ │ ├── weak-set@DSFzj61N9ojz29mjExhVa.md │ │ │ │ │ ├── what-is-javascript@UBB-8hUcwo4Mfd0cmEcdA.md │ │ │ │ │ ├── while@9-MpHmzK_IiCi6IcvAlGM.md │ │ │ │ │ ├── working-with-apis@q6vciQb_Jk-Up16Pk5NeE.md │ │ │ │ │ └── xmlhttprequest@LiuhBE7dIlkoWkthSoCsa.md │ │ │ │ ├── faqs.astro │ │ │ │ ├── javascript.json │ │ │ │ ├── javascript.md │ │ │ │ └── migration-mapping.json │ │ │ ├── kotlin/ │ │ │ │ ├── content/ │ │ │ │ │ ├── abstract-class@8jkUleKbxXSxPHbeFUTGK.md │ │ │ │ │ ├── aggregate-operations@nRpmP5Nd2r4YKRNsmoscJ.md │ │ │ │ │ ├── ai-development@RSufL2bzKXZhz9M98oGTA.md │ │ │ │ │ ├── android-jetpack@3bzq_ZWCVoe3KiKJPTLGR.md │ │ │ │ │ ├── android-sdk@xpALRb8KUT-i4Lj0EjI7o.md │ │ │ │ │ ├── android-studio@SzGLbXgW6Z6UHPoTjI-pB.md │ │ │ │ │ ├── android-studio@dBn3sAg2sey3zQNRwdMq2.md │ │ │ │ │ ├── anonymous-functions@7BYTt5_wILzkbYmQW1Xny.md │ │ │ │ │ ├── arrays@eoV8P756JUNC87FhsA2DG.md │ │ │ │ │ ├── asynchronous-flow@e6h0Xi4ReqLa6VJc1VJYG.md │ │ │ │ │ ├── booleans@Z0NaGuewAo9QO-T4BGBr4.md │ │ │ │ │ ├── break--continue@yi0SCKL2sgqKlDGwT7Fmo.md │ │ │ │ │ ├── buffered-streams@xCfSwvrdrSOYdEIdsxEuw.md │ │ │ │ │ ├── build-tool-api@JP4S5PgiWS7_WF_JFWvas.md │ │ │ │ │ ├── build-tools@B1PAHsUITg5NtxllZ1OsR.md │ │ │ │ │ ├── c-interoperability@7ybzwy7g4HSQYPUGFTD4q.md │ │ │ │ │ ├── catching-exceptions@VKDnV_Xlmj3lurkN_ZirD.md │ │ │ │ │ ├── characters@vTAV9gzVDTJdnQ-BNktT_.md │ │ │ │ │ ├── cicd-tools@zlyP0oCA5I5x5fHphutmd.md │ │ │ │ │ ├── class-generics@yQx5zVNvsit5AnRlDJsZu.md │ │ │ │ │ ├── class-members@2DNh4oQet17AUQWvJ64fb.md │ │ │ │ │ ├── code-organization@Obf1lA3vl0F6HVMMQDeNz.md │ │ │ │ │ ├── collections@x7Ok7RObQOQPTS3fBTHaF.md │ │ │ │ │ ├── comments@G3SKq-A6CBSzY7kMJIkHk.md │ │ │ │ │ ├── competitive-programming@jzJNHdc4tamjjdRpj-tsH.md │ │ │ │ │ ├── compose-multiplatform@gwD16v8OnLvgfsn2zx780.md │ │ │ │ │ ├── conditional-expressions@-fp4xlFS4iAzRxXKIaiIO.md │ │ │ │ │ ├── constructors@xkT2UmeP9c37giF169aWD.md │ │ │ │ │ ├── coroutines-behavior@x5KaFoEEYNjR1a-4KlIcd.md │ │ │ │ │ ├── coroutines-best-practices@ftCSs-gbgOdzZ2QFbEpEF.md │ │ │ │ │ ├── coroutines-builders@hvApxzNV0ly2Ck7_UuX3J.md │ │ │ │ │ ├── coroutines@lV108QhOIYF_6CW-UKybx.md │ │ │ │ │ ├── coroutines@y14epi1_XqCPHJBZecq_M.md │ │ │ │ │ ├── creating-files@4xn_kz-HcOoXTFGNLTPgv.md │ │ │ │ │ ├── creating-instances@AW03C8g40fm5RUdVmAaZe.md │ │ │ │ │ ├── data-analysis@nNGeY4qnJfuK5xmmiY6La.md │ │ │ │ │ ├── data-classes@aCOWSt8oeJD7jxnmHggiN.md │ │ │ │ │ ├── data-types@0K0aFQPi3CnB8BAAA2pIs.md │ │ │ │ │ ├── date--time@bohaQpYQH9kMssn4kVDxA.md │ │ │ │ │ ├── default-imports@cPiTsuFCkMZciOr9Wp9ID.md │ │ │ │ │ ├── defining-classess@uiK2GDDnLzVbhq5erNxFL.md │ │ │ │ │ ├── documentation@wDBRLUYhlnkPr-rIpnY8G.md │ │ │ │ │ ├── dokka@vlMxe68Xp-YrC3gUXfzwr.md │ │ │ │ │ ├── enum-class@qsDphbFvDu7PEDKt7k0JC.md │ │ │ │ │ ├── exceptions@zYmuAlJVJbDEU9qJo-n8p.md │ │ │ │ │ ├── extension-functions@0bQsJ-CAOo7srxjSocc6Y.md │ │ │ │ │ ├── extension-functions@jpijY-Wbe6yNXZeNodpNt.md │ │ │ │ │ ├── filtering@kHebnqaFOWOPgycYJCdyL.md │ │ │ │ │ ├── floats@liEMxRi675sNpqf950GXS.md │ │ │ │ │ ├── for@-JmIDPedgVOw2RpIhYNv2.md │ │ │ │ │ ├── function-types@WoPaR-IylckAixqAAwkeg.md │ │ │ │ │ ├── gradle-pluggins@mkGY2gTa5_ykZnoRMEvnm.md │ │ │ │ │ ├── gradle@GC4hGG4v8F-8bHQTdlDWG.md │ │ │ │ │ ├── grouping@oVq4WYOC5U-uHMDeufN2L.md │ │ │ │ │ ├── higher-order-functions@Q9MQRfJuvXL3YluwJ1CfF.md │ │ │ │ │ ├── history-of-kotlin@SLF_-a7Uwsl-fEqYiCIvF.md │ │ │ │ │ ├── ides@Ee6XleWvK-v9fCxbz9a1n.md │ │ │ │ │ ├── if@2oS2FhszadxPm9eg2VTUV.md │ │ │ │ │ ├── importing-packages@sCmAS0uEg2rZbNITYII5i.md │ │ │ │ │ ├── inheritance@aDgV966VKxzN0_vZ_oxRW.md │ │ │ │ │ ├── inline-class@rCNP0MYQhLgYRMzu3JTxP.md │ │ │ │ │ ├── integers@uMTIONS6pAxrdh7zoDHIz.md │ │ │ │ │ ├── intellij-idea@2z9t6nLOZuiyGi6DAhNmI.md │ │ │ │ │ ├── interfaces@UYOkP-AYKf8aw92pGSXl_.md │ │ │ │ │ ├── introduction-to-kotlin@Lod4cyZLuaCMmQ3-GkH8Z.md │ │ │ │ │ ├── io-library@oTHsTW8zVcamI1DcqH2o9.md │ │ │ │ │ ├── io@If4Lv0M03ALLpQ88Vwp6i.md │ │ │ │ │ ├── iterators@H1794CAM_XqNJVT1LkXRG.md │ │ │ │ │ ├── java-from-kotlin@I_Ecet4Q1QQXHoIvt2OqK.md │ │ │ │ │ ├── java-interoperability@id1ai__oCcB32i2hsiesC.md │ │ │ │ │ ├── jvm-metadata@rvPHK5Je3y4hPUKeaO00Q.md │ │ │ │ │ ├── kandy@JIivSHQvSotmFIpqUc5rJ.md │ │ │ │ │ ├── kdoc@ipV1RoEkn9-yKD98nB4dC.md │ │ │ │ │ ├── koog@a5IDGzg8-FppJWCmhcq9q.md │ │ │ │ │ ├── kotlin-dataframe@AarV0h4U6Ol3auLGOW3iZ.md │ │ │ │ │ ├── kotlin-from-java@qBuo_kgC-0ugiRCvR5JwQ.md │ │ │ │ │ ├── kotlin-libraries@fln83FunYP4v_0jNfNtXx.md │ │ │ │ │ ├── kotlin-multiplatform@e24E1zTPdr6tNnlKitCys.md │ │ │ │ │ ├── kotlin-notebooks@n4AFoCcKqnGRRWuD0Ud-9.md │ │ │ │ │ ├── kotlin-scripting@_88wF-lAkqW41C6FRmCHO.md │ │ │ │ │ ├── kotline-notebook@PHHviBSqhYDSNuHBFbw3l.md │ │ │ │ │ ├── kotlinjava@E0ooAe-E-RQ6WRjFLuYK7.md │ │ │ │ │ ├── kotlinjavascript@IiWY4HhtDRj3N9D-o4fAd.md │ │ │ │ │ ├── kotlinnative@nCaPm0PSeS5rztRWiBL2s.md │ │ │ │ │ ├── kotlinwasm@naVzP9xVnnVu47DieEfBU.md │ │ │ │ │ ├── ktor@q546Dq42Z3-WN-FOll4K1.md │ │ │ │ │ ├── label-loops@Lfdvpef2gXVdqr4e1dCHw.md │ │ │ │ │ ├── lambda-functions@cFExAjlc_ATE8V9EWE5on.md │ │ │ │ │ ├── lists@0iZ9qfst8yw08cTW8d-Nx.md │ │ │ │ │ ├── lists@PfXvx1jxcuR31Nm1Pia5M.md │ │ │ │ │ ├── local-functions@HrjELmsiLAyxK6ru3ifgb.md │ │ │ │ │ ├── loops@hRcMw3NHSOy2TVympIYaf.md │ │ │ │ │ ├── main--function@oQaxtbqUb1jub9yfuyKTc.md │ │ │ │ │ ├── maps@KeZhyjPFuuBwWPLXgyGs2.md │ │ │ │ │ ├── maps@_4_NXfG-9jzLv9tNHP74E.md │ │ │ │ │ ├── maven@7j55MuqI7BqRtwvTAQU6D.md │ │ │ │ │ ├── member-functions@EXFJKm3FLX3OehSX8mBFO.md │ │ │ │ │ ├── methods@9tLiTYbNf9WnisvwBhObC.md │ │ │ │ │ ├── nested--inner-classes@tjCG72uQt87-fIoBBzy0s.md │ │ │ │ │ ├── nullability-check-operators@xId8W3jQNhGJJvXFCcXir.md │ │ │ │ │ ├── nullable-vs-non-nullable@7xmKy-sipKYv8k-WYTulA.md │ │ │ │ │ ├── object-declarations@migCYrzhAQ4keUk1MHPpZ.md │ │ │ │ │ ├── opt-in-requirements@s900IAqx50Pg7ngDmGLLG.md │ │ │ │ │ ├── ordering@95fcqMEswDxcIcdFjr81M.md │ │ │ │ │ ├── parameters@9IIvovotEnTiNzVovWOiW.md │ │ │ │ │ ├── plus--minus-operators@A0wxD3ih-r8w2NAd2dOgS.md │ │ │ │ │ ├── print--println@vk146kvcjWYdweOeJIM9h.md │ │ │ │ │ ├── printing-data@Yr7DSqmOAOe15574qBrIT.md │ │ │ │ │ ├── progressions@o-iGCtrwA3AVbrBJW_7u3.md │ │ │ │ │ ├── properties@2wbXYUOx1f4rmD5EHuzOw.md │ │ │ │ │ ├── property-delegates@rOpgM--1Q1mBYmK5AlYAY.md │ │ │ │ │ ├── quarkus@MzV6A_0Sa9LhgalNmhwq8.md │ │ │ │ │ ├── ranges@LZlkx9YYylodmjUXxnj7a.md │ │ │ │ │ ├── read-only-vs-mutable@D4G8DOX5b39Rxw2FtgnjQ.md │ │ │ │ │ ├── retrieving-collection-parts@l4-AiY4mfwstDzxIASESe.md │ │ │ │ │ ├── retrieving-single-elements@_L6O23eo-oYsxA3pNXhC-.md │ │ │ │ │ ├── return@gVXXMYVlZZ5CHPBwGlGmZ.md │ │ │ │ │ ├── safe-casts@QmfR2rJMP7o_meBR8wIpK.md │ │ │ │ │ ├── sealed-class@HIy-sN0veS5atkJI2ffSu.md │ │ │ │ │ ├── sequences@LLC--5n2K19hVvMuQ5nIO.md │ │ │ │ │ ├── serialization@TyuUD4479UXsbRY9nOGno.md │ │ │ │ │ ├── server-side-apps@aj_yIDgFpBOfoSs2kYBBT.md │ │ │ │ │ ├── sets@GKRPXFLWsnLIXw8OS_DlK.md │ │ │ │ │ ├── sets@XbsKQ7192Kvze-6Un_W2q.md │ │ │ │ │ ├── setting-up-the-environment@KbmJGmWEr_kxFYoFb-JC9.md │ │ │ │ │ ├── spring-boot@By2b4Ukz6QjAUPFvqBx6g.md │ │ │ │ │ ├── spring@uIYjaX5WlKooyK-i1lGz5.md │ │ │ │ │ ├── standard-functions@0lUpMxlIXOuze0-cOgyHp.md │ │ │ │ │ ├── standard-library@FhBQsozNCYTaWwCsDDVyq.md │ │ │ │ │ ├── string-templates@oQe1JVwYnLDNfvi-s7BQX.md │ │ │ │ │ ├── strings@mY6B8kIe6dGjHes-qm0jp.md │ │ │ │ │ ├── suspending-functions@kVHtQQGhgIdJcQO0yynqG.md │ │ │ │ │ ├── swiftobjective-c-interop@aEvbW7AtLvvtol4qEQofe.md │ │ │ │ │ ├── tail-recursive-functions@Ikv5K8lKG0vlA7WheGQHY.md │ │ │ │ │ ├── teamcity@aIG_7-igm_LSR3ybAPz0j.md │ │ │ │ │ ├── test-library@2_jmtc-zIQ7SuPNccHyXw.md │ │ │ │ │ ├── throwing-exceptions@8_u8eKhWHESek7pfpaOln.md │ │ │ │ │ ├── transformations@gR2pyEoMFPg6ha3YULRAR.md │ │ │ │ │ ├── type-aliases@d2KZMmwOG29uLnTP3tU_o.md │ │ │ │ │ ├── type-checks--casts@3ihCc-dNSKb_32qj0EF5j.md │ │ │ │ │ ├── type-inference@YX5BhDgJ5NjASPc7kYySG.md │ │ │ │ │ ├── understanding-packages@jcXt2Op2VDy6BbHzrqVyr.md │ │ │ │ │ ├── unsigned-integers@g0bGnHk9WoSF6GsHLSicv.md │ │ │ │ │ ├── val-vs-var@vDWwBv0KF_S88cQFtnDVB.md │ │ │ │ │ ├── varargs@B2cxzgsEpeSzGATX4WNeO.md │ │ │ │ │ ├── variables@s7hNf7C-IO-EoEtzbg3qb.md │ │ │ │ │ ├── vertx@MCZaiTrPBrIMouBdyBD0y.md │ │ │ │ │ ├── visibility-modifiers@yAT8zsAb-iJLFzTTYVJ4v.md │ │ │ │ │ ├── what-is-null-safety@Vh_rxz7BsX6ZB777fTkXz.md │ │ │ │ │ ├── when@zJT9KVWYIbDTsGp5tTJEh.md │ │ │ │ │ ├── while@qNupY4DnTFYZrGEQJPXcw.md │ │ │ │ │ ├── why-use-kotlin@4PrkkoZ5fY-oow0O-bVhu.md │ │ │ │ │ └── writing--reading-files@D56NrdWDFS-vQdALQOKXV.md │ │ │ │ └── kotlin.md │ │ │ ├── kubernetes/ │ │ │ │ ├── content/ │ │ │ │ │ ├── adding-and-managing-worker-nodes@2cQKTxln3dIk5IjX2UZdM.md │ │ │ │ │ ├── advanced-topics@t8SJbGVXsUDECxePLDk_w.md │ │ │ │ │ ├── assigning-quotas-to-namespaces@OHz4QMmA3lqL_C7aWL8Ga.md │ │ │ │ │ ├── autoscaling@03mGA5AyL7mpF6y3EMW7A.md │ │ │ │ │ ├── basics@70lTSIVh0AD6M8fMMuWzY.md │ │ │ │ │ ├── blue-green-deployments@9-oaTlzKmcxTfaRycz1w3.md │ │ │ │ │ ├── canary-deployments@88IGeC3dAopHLGtLozxdY.md │ │ │ │ │ ├── choosing-a-managed-provider@qSatCdBTDXPu-IFWzUI99.md │ │ │ │ │ ├── ci--cd-integration@Pymc9H-lRHVPy7M9eSaPD.md │ │ │ │ │ ├── cluster-autoscaling@RC5MoYtG2rom-d4FW5qD2.md │ │ │ │ │ ├── configuration-management@dj7Tb2XTX4kxRUYiTjlhM.md │ │ │ │ │ ├── container-and-pod-security@Nja7IFWcFTLsPcqbvRNm9.md │ │ │ │ │ ├── container-and-pod-security@i7qxaFhFHPfe3fGEgsbcE.md │ │ │ │ │ ├── containers@HGmeYvRf7_XusZl_K4x9k.md │ │ │ │ │ ├── creating-custom-controllers@L9rVPEEXFwisQOwT_LQ4v.md │ │ │ │ │ ├── csi-drivers@55RV9psPCmcg8G_P_zQo9.md │ │ │ │ │ ├── custom-resource-definitions-crds@9P7l-RBOkUxs3Z_UpKQO-.md │ │ │ │ │ ├── custom-schedulers-and-extenders@1-Nb8rCMJEZrYm20sEcRJ.md │ │ │ │ │ ├── deploying-your-first-application@zrbSJa3k7a3TE0aYbWi9c.md │ │ │ │ │ ├── deployment-patterns@0l0xpsabglvs_t6oAP-XG.md │ │ │ │ │ ├── deployments@TUGQX7y1gs-aKPge2F1NU.md │ │ │ │ │ ├── evictions@TRKzlDW2PQN9bWTyz3NWL.md │ │ │ │ │ ├── external-access-to-services@jUOlITLqnIvSu97I_3nBz.md │ │ │ │ │ ├── gitops@dATdEyNWlpDNKjedCXLyb.md │ │ │ │ │ ├── helm-charts@FAEFOhLdp7xrmctHFxiOM.md │ │ │ │ │ ├── horizontal-pod-autoscaler-hpa@044IUUCgZP4oQ9UxUG2iy.md │ │ │ │ │ ├── injecting-pod-config-with-configmaps@u24UlZKI86vaguj_VpMv1.md │ │ │ │ │ ├── installing-a-local-cluster@YaIs8lquWIe1D7RCUBZmC.md │ │ │ │ │ ├── installing-the-control-plane@M-iTb_7EWZIJ3JpdViICx.md │ │ │ │ │ ├── introduction@y7KjVfSI6CAduyHd4mBFT.md │ │ │ │ │ ├── jobs@r3fzAN5DzratAKnnT8hzb.md │ │ │ │ │ ├── key-concepts-and-terminologies@9oo2fxTM2_p0VYPBroqxa.md │ │ │ │ │ ├── kubernetes-alternatives@3fzuXKH7az_LVnmnoXB1p.md │ │ │ │ │ ├── kubernetes-extensions-and-apis@UeJcKv3jhenjNzHM-0R86.md │ │ │ │ │ ├── load-balancing@Qelo1YvAcUoX5PA-RYbNp.md │ │ │ │ │ ├── logs@-XxQtiLDAkXs7IFM_Ddw6.md │ │ │ │ │ ├── metrics@nqUBHBFUYFdYqCKZvfXBR.md │ │ │ │ │ ├── monitoring--optimizing-resource-usage@PP4ld_vvjpY3QltBBsXKD.md │ │ │ │ │ ├── monitoring-and-logging@AgsQnQjyTLUFhFpRdcE13.md │ │ │ │ │ ├── multi-cluster-management@auZgEQ6FC3nUjuyx0zANh.md │ │ │ │ │ ├── network-security@s0gHg8CqwrSylpSPu8arA.md │ │ │ │ │ ├── networking--pod-to-pod-communication@44rhdieUCWsGFC_1__9kk.md │ │ │ │ │ ├── observability-engines@FANswgUhUb5Iuah2fni3L.md │ │ │ │ │ ├── overview-of-kubernetes@qLeEEwBvlGt1fP5Qcreah.md │ │ │ │ │ ├── pod-priorities@_Gva1eGcYqpmZNPyV03lt.md │ │ │ │ │ ├── pods@-d2PIXm0V_Iehe8cws8zK.md │ │ │ │ │ ├── replicasets@IF09l0-pryGpMbDt__ocr.md │ │ │ │ │ ├── resource-health@pDjNsK5vI9FmKZbQm0lDP.md │ │ │ │ │ ├── resource-management@eWKkdiBhD5x2sGYajmHEs.md │ │ │ │ │ ├── role-based-access-control-rbac@jOq0WwLrq8tlmOgo64QDc.md │ │ │ │ │ ├── rolling-updates--rollbacks@yMSXdwDO36CLtp2TBC7aB.md │ │ │ │ │ ├── running-applications@1MdrzhktCWjpmxiYYBdz7.md │ │ │ │ │ ├── scheduling@xZDXM_8qb4VL15tNGG0ws.md │ │ │ │ │ ├── security@SG3wtV2rt9nmLEkgrp_zP.md │ │ │ │ │ ├── services-and-networking@aUJ_w2L8nxNq3DfAW97Gd.md │ │ │ │ │ ├── setting-resource-requests-and-limits@8RLR6gRjIyTn6GCugEfgk.md │ │ │ │ │ ├── setting-up-kubernetes@3OpGaQhyNtk1n1MLp-tlb.md │ │ │ │ │ ├── should-you-manage-your-own-cluster@ZrVhYTw63aVVIFAEJDG5r.md │ │ │ │ │ ├── stateful-applications@LJUJ1NIUsajb1AUdvJjqW.md │ │ │ │ │ ├── statefulsets@AJiRBEaKU8qYEm0fqN389.md │ │ │ │ │ ├── storage-and-volumes@URnYf9jMprFz-o26fbU2P.md │ │ │ │ │ ├── taints-and-tolerations@zXUsHAI1HFhcY2BFAcypv.md │ │ │ │ │ ├── topology-spread-constraints@CL0hKTcml40InmyVUXpY2.md │ │ │ │ │ ├── traces@ldYTEPt_hI4PXxr3tgJi5.md │ │ │ │ │ ├── using-secrets-for-sensitive-data@S0CwGC2gMG-SqnLNldqBD.md │ │ │ │ │ ├── vertical-pod-autoscaler-vpa@c1KVczGRjh9bhMpbPP6sA.md │ │ │ │ │ └── why-use-kubernetes@q-Ky0ietZGpyUcBQfh-BJ.md │ │ │ │ ├── faqs.astro │ │ │ │ ├── kubernetes.json │ │ │ │ ├── kubernetes.md │ │ │ │ └── migration-mapping.json │ │ │ ├── laravel/ │ │ │ │ ├── content/ │ │ │ │ │ ├── app@U9EVG_fIFy57WWPwJSXv6.md │ │ │ │ │ ├── artisan@mz4QuqdC_EXKuX3KLX8_S.md │ │ │ │ │ ├── authentication@SZY9d1QisyChz-Jmu82pC.md │ │ │ │ │ ├── authorization@PvSwwdBaYY32Sv5qfe9aB.md │ │ │ │ │ ├── basic-controllers@Xjt4YYR8zEzUfNY6D2JwU.md │ │ │ │ │ ├── basic-routes@LgHiEGflKuzsBEOMSX4i4.md │ │ │ │ │ ├── blade--livewire@rUKVDwwjP3pXswi-rWIj2.md │ │ │ │ │ ├── blade-directives@lG-7OBSjPCyxpYQsROA5C.md │ │ │ │ │ ├── blade-templating@L6uzrZ7z6ebnha3r-aHzb.md │ │ │ │ │ ├── bootstrap@BWl1EezIH8xHf0N4grruF.md │ │ │ │ │ ├── breeze@vI2qUCCDghYynHr2hUSkb.md │ │ │ │ │ ├── caching@eeWk2_ZYQUcYlITUzSly0.md │ │ │ │ │ ├── casts-accessors@lPuBSP-PNifc0jIWzn_Gd.md │ │ │ │ │ ├── components@bDM7WPrs8fW_V4KkIfbru.md │ │ │ │ │ ├── config@RfSXcTBYSX4_9YhsOdSQc.md │ │ │ │ │ ├── configuration@Luq5PQpmDJDpf8DAkpiJt.md │ │ │ │ │ ├── configuration@y6rsw2UrgUR0tm2Zzqhxk.md │ │ │ │ │ ├── cors@l14wSdac211BUDxKkGk9J.md │ │ │ │ │ ├── create-a-new-project@7NR5Dj24EFDsvea61_BTu.md │ │ │ │ │ ├── creating-responses@PWAlppGP7HNMD7y4I6LnJ.md │ │ │ │ │ ├── crud-operations@2VWPYrDyJSRy_SNysjK1P.md │ │ │ │ │ ├── database@QEapMmUt1VLeERQy8pOEn.md │ │ │ │ │ ├── debugbar@G_e9X1yp-SJ-pSOO1Knvq.md │ │ │ │ │ ├── debugging-basics@nvxpeUXdFs1elkG4FS8PR.md │ │ │ │ │ ├── dependency-injection@1icfSs9qyM4RB_RG2N9l6.md │ │ │ │ │ ├── displaying-data@SX0gVvrD0oNFUlhrfmPBV.md │ │ │ │ │ ├── eloquent-orm@xqXQsC_2EX4rnGAiKML9o.md │ │ │ │ │ ├── encryption--hashing@BXiM7ROYLZ7_a6x6c_wyd.md │ │ │ │ │ ├── error-messages@-H9JJ_DsGAjtwdki5LPo-.md │ │ │ │ │ ├── events--listeners@MRWdMXNwNyVgyNrx0qTdp.md │ │ │ │ │ ├── facades@182iKn3FXLZEKI47S7GIk.md │ │ │ │ │ ├── file-storage@oB20h3_6U41cVvoACb63y.md │ │ │ │ │ ├── files@PaAvakZ8NziU1mEAN6okm.md │ │ │ │ │ ├── forms@A07HwtMsmcaRB7gAruqOH.md │ │ │ │ │ ├── gates@YCDtdh7aZ7YPa_LFOZTLh.md │ │ │ │ │ ├── global-vs-route@jBPpf2X6oNXwPH5FuWHvt.md │ │ │ │ │ ├── handling-exceptions@ZlD6g0djdDH6ozwMJ5WIr.md │ │ │ │ │ ├── health-route@JLMf5OE1ggRMOabf8KDwp.md │ │ │ │ │ ├── http-exceptions@qetgYqhWAEHUfDIDkMGGX.md │ │ │ │ │ ├── if-else@m1mVsw_kF2GW50UM-6o3f.md │ │ │ │ │ ├── inertia@0B41E-UtzvCsXVDX5DUqY.md │ │ │ │ │ ├── installing-laravel@cmczkTxiNFtfnr5Wgznef.md │ │ │ │ │ ├── jetstream@lBpyPXS2zHbJ49bHpOyi5.md │ │ │ │ │ ├── json@pb7eSi-UQ7KTcdi8_pzya.md │ │ │ │ │ ├── laravel-cloud@UzhlPw7flQ9UHeia0o-uj.md │ │ │ │ │ ├── laravel-for-frontend@ns75IOfTHNmWsLm4q8sQx.md │ │ │ │ │ ├── laravel-for-full-stack@_Squ3npZfjfd_xYn__Qna.md │ │ │ │ │ ├── laravel-forge@teD9pAQ-dKKLg5kYOPN6c.md │ │ │ │ │ ├── laravel-herd@Kee5SXZbkwmoxAF8O6Y2f.md │ │ │ │ │ ├── layouts@NkxalJLKZxQPvTzecBrJa.md │ │ │ │ │ ├── livewire@5A0DGzGXXBHQTRuzWEkuW.md │ │ │ │ │ ├── localization@_y5s3ZGwvWR_RiQ0VnWYv.md │ │ │ │ │ ├── log-stacks--messages@JeJXr5g6pJY3za5E_ewEY.md │ │ │ │ │ ├── logging-basics@Wt_QP7R4DRUNOMQZSnMeI.md │ │ │ │ │ ├── loops@GTtgi4rShCn3AFwgBLuFc.md │ │ │ │ │ ├── manual-authentication@PBK-lqE3yWB2Mj1kHq4Rz.md │ │ │ │ │ ├── manual-validation@aY_sz_Nb-kX4NL0g_nXoA.md │ │ │ │ │ ├── message-customization@VvSn3Zqxi6HPBkDqxoqEE.md │ │ │ │ │ ├── middleware@SoHBSaHmds3C4uJ-vljhf.md │ │ │ │ │ ├── migrations-seeders@IxFi316xmxdP2ZZDVSE5f.md │ │ │ │ │ ├── named-routes@PAdXLppvU-X94gK5uCbf-.md │ │ │ │ │ ├── notifications@LZ8UiFvBT_rxirANh6XxZ.md │ │ │ │ │ ├── octane@h78y25Zlzoc2RrrCIGztf.md │ │ │ │ │ ├── optimization@jL-NldBPyDK_0SqvMBqVu.md │ │ │ │ │ ├── package-management@t3iEtiCHghB4S9gAQOQJM.md │ │ │ │ │ ├── pagination@zJf_ZQYXSGob24p9rrVfr.md │ │ │ │ │ ├── passport@2QZCHTZMP72sVuf97A59N.md │ │ │ │ │ ├── pest@3hluy0wKpsbWHpI1AwTfB.md │ │ │ │ │ ├── phpunit@pUJVZ6oUKVSixtxshwhqi.md │ │ │ │ │ ├── pint@8XZ3g4gW34k1sThHvb2cH.md │ │ │ │ │ ├── policies@mOxPpW0Ic9_ZAYYNrZlb9.md │ │ │ │ │ ├── public@ciVFg7PpqdBtSt0XaXNZL.md │ │ │ │ │ ├── pulse@M-x3UwacbhtaGyPS6tzu3.md │ │ │ │ │ ├── query-builder@OpRkcv-Qom47TALqcEsRc.md │ │ │ │ │ ├── query-scopes@d35_8oQcSQUBnDMiwzNfU.md │ │ │ │ │ ├── queues--jobs@kn3-JVSd_C_KKx3SzGx84.md │ │ │ │ │ ├── rate-limiting@_0QY_h0802wBAKEo2Hq9f.md │ │ │ │ │ ├── redirect-routes@LCCEkY9fZOUqNo1jIpy0D.md │ │ │ │ │ ├── redirects@j684EyDXKtd9QgcYQdtB4.md │ │ │ │ │ ├── relationships@NEbYfTpH0mnbPKPFI1x-B.md │ │ │ │ │ ├── requestresponse-flow@jARVkKaEkVAYIe8WSO0aY.md │ │ │ │ │ ├── resource-controllers@AAURmpEyp78p31GY0q3rV.md │ │ │ │ │ ├── resources@ieFd1B_Ntp1pK8ew47WyP.md │ │ │ │ │ ├── retrieving-data--files@wR92EYaAPILQRmtBiaoCX.md │ │ │ │ │ ├── route-groups@Pmw0OdtrsMIaHB9Y8v3An.md │ │ │ │ │ ├── route-model-binding@hC0-JDJtpgh4ELcFuhch1.md │ │ │ │ │ ├── route-parameters@6TkDx8eXb9nMU_OE3ArhJ.md │ │ │ │ │ ├── routes@eMVYQ1Q1o1IZmeHnrfBV7.md │ │ │ │ │ ├── sail@_hhgO69zAsDdtvIW0iM7a.md │ │ │ │ │ ├── sanctum@dGNOYhShoyT9ovSouI00l.md │ │ │ │ │ ├── single-action-controllers@1hS7qJ218Ud3et0E1JsfH.md │ │ │ │ │ ├── starter-kits@9YTtSeu4nY5A5AcFcZFto.md │ │ │ │ │ ├── storage@Q8IaWP-McT1x89_87fVUF.md │ │ │ │ │ ├── streamed-responses@mpfzIVmulV3sJthKxP_PV.md │ │ │ │ │ ├── task-schedulling@aWC-GXotQYf5e43Hgfaa9.md │ │ │ │ │ ├── telescope@j5giyFLzIm2wsOqkbjc4-.md │ │ │ │ │ ├── tests@6iTp6YFyfzg_7uyIKwu37.md │ │ │ │ │ ├── unit--feature-tests@69IAYj71d4L6XxwX0M_j4.md │ │ │ │ │ ├── vendor@-xOvjCCRwfkms2SRUvMaC.md │ │ │ │ │ ├── view-routes@5NMRzpig1p9SJaeA7Twmh.md │ │ │ │ │ ├── views@PipmRcDfvwRYNLe9VMbeU.md │ │ │ │ │ ├── what-is-laravel@QvWjQUrEYX9NRbzdm3Fvp.md │ │ │ │ │ ├── why-web-frameworks@8wOQ-Kmz3dBlOKMg-ui5D.md │ │ │ │ │ └── with-starter-kits@-yacHIWQ5Oylia9e0pJXT.md │ │ │ │ └── laravel.md │ │ │ ├── linux/ │ │ │ │ ├── content/ │ │ │ │ │ ├── adding-disks@4xBaZPk0eSsWG1vK3e2yW.md │ │ │ │ │ ├── archiving-and-compressing@iD073xTmpzvQFfXwcwXcY.md │ │ │ │ │ ├── archiving@iD073xTmpzvQFfXwcwXcY.md │ │ │ │ │ ├── auth-logs@WwybfdKuP9ogCGpT7d3NU.md │ │ │ │ │ ├── authentication-logs@WwybfdKuP9ogCGpT7d3NU.md │ │ │ │ │ ├── available-mem@tx0nh6cbBjVxwNlyrBNYm.md │ │ │ │ │ ├── available-memory--disk@tx0nh6cbBjVxwNlyrBNYm.md │ │ │ │ │ ├── awk@QTmECqpRVMjNgQU70uCF8.md │ │ │ │ │ ├── background--foreground-processes@mUKoiGUTpIaUgQNF3BND_.md │ │ │ │ │ ├── basic-commands@qLeEEwBvlGt1fP5Qcreah.md │ │ │ │ │ ├── bg-fg-processes@mUKoiGUTpIaUgQNF3BND_.md │ │ │ │ │ ├── boot-loaders@o5lSQFW-V_PqndGqo1mp3.md │ │ │ │ │ ├── booting-linux@DQEa8LrJ9TVW4ULBE4aHJ.md │ │ │ │ │ ├── cgroups@23lsrUw8ux6ZP9JlDNNu2.md │ │ │ │ │ ├── check-logs@DuEfJNrm4Jfmp8-8Pggrf.md │ │ │ │ │ ├── checking-service-logs@FStz-bftQBK0M6zz2Bxl4.md │ │ │ │ │ ├── checking-service-status@xk5Xgi797HlVjdZJRfwX1.md │ │ │ │ │ ├── command-help@KaMSsQnJzNqGHg0Oia4uy.md │ │ │ │ │ ├── command-path@moGMHNR58wFlzhS7je1wc.md │ │ │ │ │ ├── conditionals@rQxfp7UWqN72iqewZhOdc.md │ │ │ │ │ ├── container-runtime@bVCwRoFsYb3HD8X4xuKOo.md │ │ │ │ │ ├── containerization@3OpGaQhyNtk1n1MLp-tlb.md │ │ │ │ │ ├── copying-and-renaming@abKO6KuuIfl9ruVxBw6t_.md │ │ │ │ │ ├── copying-renaming@abKO6KuuIfl9ruVxBw6t_.md │ │ │ │ │ ├── create--delete--update@R9TZfkgVUQNLnMpDhovJa.md │ │ │ │ │ ├── create-update@R9TZfkgVUQNLnMpDhovJa.md │ │ │ │ │ ├── creating--deleting-files--dirs@9oo2fxTM2_p0VYPBroqxa.md │ │ │ │ │ ├── creating-files@9oo2fxTM2_p0VYPBroqxa.md │ │ │ │ │ ├── creating-new-services@34UUrc8Yjc_8lvTL8itc3.md │ │ │ │ │ ├── creating-services@xk5Xgi797HlVjdZJRfwX1.md │ │ │ │ │ ├── cut@Z5Mf_e5G24IkmxEHgYBe2.md │ │ │ │ │ ├── debugging@rOGnHbGIr3xPCFdpkqoeK.md │ │ │ │ │ ├── dhcp@X6Jw95kbyPgsDNRhvkQP9.md │ │ │ │ │ ├── directory-hierarchy-overview@3fzuXKH7az_LVnmnoXB1p.md │ │ │ │ │ ├── directory-hierarchy@3fzuXKH7az_LVnmnoXB1p.md │ │ │ │ │ ├── disks-and-filesystems@Fn_uYKigJRgb7r_iYGVBr.md │ │ │ │ │ ├── disks-filesystems@Fn_uYKigJRgb7r_iYGVBr.md │ │ │ │ │ ├── dns-resolution@f5oQYhmjNM2_FD7Qe1zGK.md │ │ │ │ │ ├── docker@MfengY3ouz6sSOx3PXYf8.md │ │ │ │ │ ├── editing-files@HGmeYvRf7_XusZl_K4x9k.md │ │ │ │ │ ├── environment-variables@zwXEmpPYjA7_msS43z7I0.md │ │ │ │ │ ├── ethernet--arprarp@4ees23q281J1DPVAc7iXd.md │ │ │ │ │ ├── ethernet-arp-rarp@4ees23q281J1DPVAc7iXd.md │ │ │ │ │ ├── expand@TZuDVFS7DZFBgaSYYXoGe.md │ │ │ │ │ ├── file-permissions@TnrT-cqMA8urew9nLv0Ns.md │ │ │ │ │ ├── file-transfer@tVrbVcNEfc11FbEUoO2Dk.md │ │ │ │ │ ├── filesystems@LFPhSHOhUqM98fUxMjQUw.md │ │ │ │ │ ├── finding--installing-packages@Z23eJZjmWoeXQuezR9AhG.md │ │ │ │ │ ├── finding-installing-packages@Z23eJZjmWoeXQuezR9AhG.md │ │ │ │ │ ├── grep@umlhxidsvtZG9k40Ca0Ac.md │ │ │ │ │ ├── head@6xdkFk_GT93MigeTSSGCp.md │ │ │ │ │ ├── icmp@Ymf3u_sG1dyt8ZR_LbwqJ.md │ │ │ │ │ ├── inodes@AwQJYL60NNbA5_z7iLcM7.md │ │ │ │ │ ├── install--remove--upgrade-packages@xEHiB-egkkcBuZmgMoqHT.md │ │ │ │ │ ├── install-remove-ugprade-packages@xEHiB-egkkcBuZmgMoqHT.md │ │ │ │ │ ├── ip-routing@D0yUzzaJsfhtdBWMtquAj.md │ │ │ │ │ ├── join@vfcCS1GoyKpU1rQaE8I5r.md │ │ │ │ │ ├── kill-processes@0FLUI9r7znMqi6YKReLzD.md │ │ │ │ │ ├── killing-processes@0FLUI9r7znMqi6YKReLzD.md │ │ │ │ │ ├── listing--finding-processes@lf3_CRyOI2ZXGzz5ff451.md │ │ │ │ │ ├── listing-finding-proc@lf3_CRyOI2ZXGzz5ff451.md │ │ │ │ │ ├── listing-installed-packages@48wAoAAlCNt3j5mBpKTWC.md │ │ │ │ │ ├── literals@-pW7R76yNIeGf7TQoX4QL.md │ │ │ │ │ ├── logs@ru7mpLQZKE1QxAdiA1sS3.md │ │ │ │ │ ├── loops@WJT-yrMq8cEI87RHWA2jY.md │ │ │ │ │ ├── lvm@I3LNa1cM_zRkBy8wKdz3g.md │ │ │ │ │ ├── managing-permissions@L6RMExeqi9501y-eCHDt1.md │ │ │ │ │ ├── mounts@zmb5lK_EGMAChPoPvP9E0.md │ │ │ │ │ ├── moving-files--directories@q-Ky0ietZGpyUcBQfh-BJ.md │ │ │ │ │ ├── moving-files@q-Ky0ietZGpyUcBQfh-BJ.md │ │ │ │ │ ├── nano@yqRwmcZThjQuqh2ao0dWK.md │ │ │ │ │ ├── navigation-basics@y7KjVfSI6CAduyHd4mBFT.md │ │ │ │ │ ├── netfilter@bZ8Yj6QfBeDdh8hRM_aZs.md │ │ │ │ │ ├── netstat@yrxNYMluJ9OAQCKuM5W1u.md │ │ │ │ │ ├── networking@Mb42VFjCzMZn_PovKIfKx.md │ │ │ │ │ ├── nl@YSfGrmT795miIeIZrtC3D.md │ │ │ │ │ ├── package-management@4eINX8jYMJxfYh7ZV47YI.md │ │ │ │ │ ├── package-repositories@2oQiuQ2j02SCt9t5eV6hg.md │ │ │ │ │ ├── packet-analysis@7seneb4TWts4v1_x8xlcZ.md │ │ │ │ │ ├── paste@5658kdqJw-pIOyyhll80a.md │ │ │ │ │ ├── permissions@L6RMExeqi9501y-eCHDt1.md │ │ │ │ │ ├── permissions@TnrT-cqMA8urew9nLv0Ns.md │ │ │ │ │ ├── ping@Uc36t92UAlILgM3_XxcMG.md │ │ │ │ │ ├── pipe@v32PJl4fzIFTOirOm6G44.md │ │ │ │ │ ├── proc-forking@Rib7h9lh_ndiXkwNbftz_.md │ │ │ │ │ ├── proc-priorities@5anSYRhaKIs3dCLWlvZfT.md │ │ │ │ │ ├── proc-signals@VkLWTvKnRXzvLGWza2v45.md │ │ │ │ │ ├── process-forking@Rib7h9lh_ndiXkwNbftz_.md │ │ │ │ │ ├── process-management@h01Y6dW09ChidlM2HYoav.md │ │ │ │ │ ├── process-priorities@5anSYRhaKIs3dCLWlvZfT.md │ │ │ │ │ ├── process-signals@VkLWTvKnRXzvLGWza2v45.md │ │ │ │ │ ├── redirects@JgoZzx4BfK7tmosgpZOsf.md │ │ │ │ │ ├── repositories@2oQiuQ2j02SCt9t5eV6hg.md │ │ │ │ │ ├── server-review@jSzfQf0MlnXtWHCc-HYvr.md │ │ │ │ │ ├── service-management-systemd@F1sU3O1ouxTOvpidDfN3k.md │ │ │ │ │ ├── service-management@F1sU3O1ouxTOvpidDfN3k.md │ │ │ │ │ ├── service-status@34UUrc8Yjc_8lvTL8itc3.md │ │ │ │ │ ├── services-running@ewUuI_x-YhOQIYd3MTgJJ.md │ │ │ │ │ ├── shell-and-other-basics@8QBMyL8D5jPovxN8jyZW9.md │ │ │ │ │ ├── shell-basics@8QBMyL8D5jPovxN8jyZW9.md │ │ │ │ │ ├── shell-programming@4tFZ1PLpz50bddf7zSFrW.md │ │ │ │ │ ├── snap@eKyMZn30UxQeBZQ7FxFbF.md │ │ │ │ │ ├── soft-hard-links@KaXHG_EKxI5PUXmcvlJt6.md │ │ │ │ │ ├── soft-links--hard-links@KaXHG_EKxI5PUXmcvlJt6.md │ │ │ │ │ ├── sort@1WRIy3xHtQfiQFZrprobP.md │ │ │ │ │ ├── split@Pl9s2ti25hsSEljXJvBTj.md │ │ │ │ │ ├── ssh@uk6UMuI8Uhf02TBAGVeLS.md │ │ │ │ │ ├── start-stop-service@FStz-bftQBK0M6zz2Bxl4.md │ │ │ │ │ ├── starting--stopping-services@DuEfJNrm4Jfmp8-8Pggrf.md │ │ │ │ │ ├── stdout--stdin--stderr@t3fxSgCgtxuMtHjclPHA6.md │ │ │ │ │ ├── stdout-in-err@t3fxSgCgtxuMtHjclPHA6.md │ │ │ │ │ ├── subnetting@Xszo9vXuwwXZo26seHehD.md │ │ │ │ │ ├── super-user@NIBSZGE9PskVrluJpdom0.md │ │ │ │ │ ├── swap@AWosNs2nvDGV8r6WvgBI1.md │ │ │ │ │ ├── tail@Yyk28H6TiteZEGv6Aps1h.md │ │ │ │ │ ├── tcp-ip@0pciSsiQqIGJh3x8465_s.md │ │ │ │ │ ├── tcpip-stack@0pciSsiQqIGJh3x8465_s.md │ │ │ │ │ ├── tee@Bo9CdrGJej-QcNmw46k9t.md │ │ │ │ │ ├── text-processing@-B2Dvz7160Er0OBHzS6ro.md │ │ │ │ │ ├── tr@O9Vci_WpUY-79AkA4HDx3.md │ │ │ │ │ ├── traceroute@BnB3Rirh4R7a7LW7-k-95.md │ │ │ │ │ ├── troubleshooting@bdQNcr1sj94aX_gjwf2Fa.md │ │ │ │ │ ├── ulimits@QgfenmhMc18cU_JngQ1n0.md │ │ │ │ │ ├── unexpand@sKduFaX6xZaUUBdXRMKCL.md │ │ │ │ │ ├── uniq@qnBbzphImflQbEbtFub9x.md │ │ │ │ │ ├── uptime-and-load@19lTWqAvZFT2CDlhLlPSq.md │ │ │ │ │ ├── uptime-load@19lTWqAvZFT2CDlhLlPSq.md │ │ │ │ │ ├── user-groups@h8wc8XEwWYHErna68w7Mg.md │ │ │ │ │ ├── user-management@g6n7f1Qi0BPr_BGvisWuz.md │ │ │ │ │ ├── users-and-groups@h8wc8XEwWYHErna68w7Mg.md │ │ │ │ │ ├── variables@JyxvZOb7iusOSUYSlniGl.md │ │ │ │ │ ├── vim@XiZz7EFIey1XKS292GN4t.md │ │ │ │ │ ├── wc@LIGOJwrXexnIcPyHVlhQ8.md │ │ │ │ │ └── working-with-files@RsOTPZPZGTEIt1Lk41bQV.md │ │ │ │ ├── faqs.astro │ │ │ │ ├── linux.json │ │ │ │ ├── linux.md │ │ │ │ └── migration-mapping.json │ │ │ ├── machine-learning/ │ │ │ │ ├── content/ │ │ │ │ │ ├── accuracy@3wib9UH0_OLhKjqKoZEMv.md │ │ │ │ │ ├── activation-functions@RXTci1N6i6D9HqTbsLYIy.md │ │ │ │ │ ├── actor-critic-methods@4Vy6lW9vF_SWwbKLU0qno.md │ │ │ │ │ ├── apis@s-wUPMaagyRupT2RdfHks.md │ │ │ │ │ ├── applications-of-cnns@gCGHtxqD4V_Ite_AXMspf.md │ │ │ │ │ ├── attention-mechanisms@-tzeA13f2jYDm4aO5JciT.md │ │ │ │ │ ├── attention-models@sChxcuQ2OruKVx8P4wAK_.md │ │ │ │ │ ├── autoencoders@kvf2CUKBe4qSbZla4Brh3.md │ │ │ │ │ ├── autoencoders@owSUO9Ut9sggd1OiWr3O7.md │ │ │ │ │ ├── back-propagation@0meihv22e11GwqnRdSJ9g.md │ │ │ │ │ ├── basic-concepts@P32Rmnln5NCFWz4LP0k05.md │ │ │ │ │ ├── basic-syntax@hWA7RtuqltMTmHdcCnmES.md │ │ │ │ │ ├── basics-of-probability@p8q1Gtt9x19jw5_-YjAGh.md │ │ │ │ │ ├── bayes-theorem@7o6g0wQxHH9i9MMCoDq2C.md │ │ │ │ │ ├── calculus@wHlEinHuRARp5OfSulpA-.md │ │ │ │ │ ├── chain-rule-of-derivation@jJukG4XxfFcID_VlQKqe-.md │ │ │ │ │ ├── classification@cffITx6oAcnvJlK1VLdi8.md │ │ │ │ │ ├── clustering@CBSGvGPoI53p7BezXNm6M.md │ │ │ │ │ ├── conditionals@NP1kjSk0ujU0Gx-ajNHlR.md │ │ │ │ │ ├── confusion-matrix@oyL0M2OP4NTNbIO3zq-Hz.md │ │ │ │ │ ├── convolution@MtoYStcZBduLSbjRuPjq0.md │ │ │ │ │ ├── convolutional-neural-network@BtO2wH7YYqE25HShI6sd9.md │ │ │ │ │ ├── csv@MWfdLCb_w06A0jqwUJUxl.md │ │ │ │ │ ├── data-cleaning@5v0jRBYrRuVXQC90IseRG.md │ │ │ │ │ ├── data-formats@U4LGIEE3igeE5Ed3EWzsu.md │ │ │ │ │ ├── data-loading@bIhGv4886V4RWJD3tX0a0.md │ │ │ │ │ ├── data-preparation@-W2uAccH7Y2XIwhfl9mDF.md │ │ │ │ │ ├── data-sources@-oRH7LgigHcfBkNF1xwxh.md │ │ │ │ │ ├── data-structures@R9DQNc0AyAQ2HLpP4HOk6.md │ │ │ │ │ ├── databases-sql-no-sql@VdMhrAi48V-JXw544YTKI.md │ │ │ │ │ ├── decision-trees-random-forest@arlmRF5pYglsbHb-HR-2x.md │ │ │ │ │ ├── deep-learning-architectures@_Z2miSW4PwILMRtBFajBn.md │ │ │ │ │ ├── deep-learning-libraries@A_Kx3pEj0jpnLJzdOpcQ9.md │ │ │ │ │ ├── deep-q-networks@9o-ZT9oZIE3hCXD6eWZI0.md │ │ │ │ │ ├── derivatives-partial-derivatives@GN6SnI7RXIeW8JeD-qORW.md │ │ │ │ │ ├── descriptive-statistics@ZaoZ2XxicKuTDn4uxe52L.md │ │ │ │ │ ├── determinants-inverse-of-matrix@XmnWnPE1sVXheuc-M_Ew7.md │ │ │ │ │ ├── dimensionality-reduction@vQI-4uFQJ6694nm1SCpDR.md │ │ │ │ │ ├── dimensionality-reduction@y3-nWiDjlY6ZwqmxBUvhd.md │ │ │ │ │ ├── discrete-mathematics@N_vLjBVdsGsoePtqlqh2w.md │ │ │ │ │ ├── eigenvalues-diagonalization@3p98Uwf8gyALDr-89lBEZ.md │ │ │ │ │ ├── elasticnet-regularization@0-6BV-MggAyD7g3JH45B7.md │ │ │ │ │ ├── embeddings@CaHbAXDIJQXcQ9DZqziod.md │ │ │ │ │ ├── essential-libraries@ybqwtlHG4HMm5lyUKW2SO.md │ │ │ │ │ ├── excel@K9Si7kJe946CcGWBGmDsZ.md │ │ │ │ │ ├── exceptions@fNTb9y3zs1HPYclAmu_Wv.md │ │ │ │ │ ├── exclusive@eErzKbR8sRNlrYcwNSRSh.md │ │ │ │ │ ├── explainable-ai@Tv3sZvus76dmu0X9AqCIU.md │ │ │ │ │ ├── f1-score@FdNY8QUbPPpeHFgD8TTaD.md │ │ │ │ │ ├── feature-engineering@UmGdV94afOIbAL8MaxOWv.md │ │ │ │ │ ├── feature-scaling--normalization@iBkTNbk8Xz626F_a3Bo5J.md │ │ │ │ │ ├── feature-selection@cigwKoltemM0q-M5O50Is.md │ │ │ │ │ ├── forward-propagation@LWLqa61GK5ukYzHpjinYi.md │ │ │ │ │ ├── functions-builtin-functions@-DJgS6l2qngfwurExlmmT.md │ │ │ │ │ ├── generative-adversarial-networks@IR0wVIcu1MxOOBiLBnn8S.md │ │ │ │ │ ├── gradient-boosting-machines@JuTTbL_pm1ltGvhUsIzQd.md │ │ │ │ │ ├── gradient-jacobian-hessian@3BxbkrBp8veZj38zdwN8s.md │ │ │ │ │ ├── graphs--charts@MYZUJ1uHIaRd1Gb4ORzwG.md │ │ │ │ │ ├── gru@ZWDSLqxmfg3aPBZFH479q.md │ │ │ │ │ ├── hierarchical@jJ8cXfHV2LG5PJGZRTHxB.md │ │ │ │ │ ├── image--video-recognition@jPvZdgye7cBf0bPMVGf7a.md │ │ │ │ │ ├── image-classification@E4k6WgNXdnNoApR675VKb.md │ │ │ │ │ ├── image-segmentation@iSX9YExs1gS4L2CBQux5w.md │ │ │ │ │ ├── inferential-statistics@DUIrJwuYHlhJvZJT2acaY.md │ │ │ │ │ ├── internet@cxTriSZvrmXP4axKynIZW.md │ │ │ │ │ ├── introduction@MEL6y3vwiqwAV6FQihF34.md │ │ │ │ │ ├── iot@KeGCHoJRHp-mBX-P5to4Y.md │ │ │ │ │ ├── json@kagKVPUyLtx8UPAFjRvbN.md │ │ │ │ │ ├── k-fold-cross-validation@vRS7DW2WUaXiHk9oJgg3z.md │ │ │ │ │ ├── k-nearest-neighbors-knn@x7vlCNAxfJzobj9HcTaJy.md │ │ │ │ │ ├── keras@zoXnXI4Wf5sxddHqYwQjP.md │ │ │ │ │ ├── lasso@EXogp25SPW1bBfb1gRDAe.md │ │ │ │ │ ├── lemmatization@pP0VeUSK9CDodgz-BQmrP.md │ │ │ │ │ ├── linear-algebra@83UDoO1vC0LjL-qpI0Jh-.md │ │ │ │ │ ├── linear-algebra@tP0oBkjvJC9hrtARkgLon.md │ │ │ │ │ ├── linear-regression@xGO1X9aZRgKcgzi6r1xq8.md │ │ │ │ │ ├── log-loss@7fOp3t283GeOn6Tf4kEuN.md │ │ │ │ │ ├── logistic-regression@aHOjajXwkDMOssqW1VGrm.md │ │ │ │ │ ├── loocv@GKMhIXEuSKdW75-24Zopb.md │ │ │ │ │ ├── loops@Dvy7BnNzK55qbh_SgOk8m.md │ │ │ │ │ ├── loss-functions@KcfFjpxFTFxI6HR6hBPrl.md │ │ │ │ │ ├── lsmt@LdUwTWfCIcowwC-e6q3ac.md │ │ │ │ │ ├── matplotlib@OXbATvlhBXTQ1iRGwPUfb.md │ │ │ │ │ ├── matrix--matrix-operations@1IhaXJxNREq2HA1nT-lMM.md │ │ │ │ │ ├── metrics-to-evaluate@5dKl6SUQhOsZfUtVR5hzw.md │ │ │ │ │ ├── ml-engineer-vs-ai-engineer@GHO6lN3GTiIRH1P70IRaZ.md │ │ │ │ │ ├── mobile-apps@dJZqe47kzRqYIG-4AZTlz.md │ │ │ │ │ ├── model-selection@Ddhph9saFgfMi-uUFGK75.md │ │ │ │ │ ├── multi-head-attention@J1aGPkZqDZfUwpVmC88AL.md │ │ │ │ │ ├── natural-language-processing@JVXe2QDQaqiJYPupIMhWe.md │ │ │ │ │ ├── neural-network-nn-basics@4dxZmLg0UEaaVEORupOOC.md │ │ │ │ │ ├── numpy@nKE9sO-f2fdMiuLu2xby1.md │ │ │ │ │ ├── object-oriented-programming@nN9BumBHi-c9HKFlgL2GH.md │ │ │ │ │ ├── other-data-formats@qRHeaD2udDaItAxmiIiUg.md │ │ │ │ │ ├── overlapping@BzUunjJrUMlh6K1NOOD87.md │ │ │ │ │ ├── padding@a2PGTDnXKp759vFZzkjSF.md │ │ │ │ │ ├── pandas@PnOoShqB3z4LuUvp0Gh2e.md │ │ │ │ │ ├── parquet@tq6WRwUpaCok9fX-0bY7m.md │ │ │ │ │ ├── perceptron-multi-layer-perceptrons@8425N_E43Dv5mcmEcXRIa.md │ │ │ │ │ ├── policy-gradient@PZ-WxKGTcWTrXmYI_inD_.md │ │ │ │ │ ├── polynomial-regression@hfr2MU8QkVt9KhVi1Okpv.md │ │ │ │ │ ├── pooling@I-GEE7PvpQmhQSfZmxqwA.md │ │ │ │ │ ├── precision@mja35tndhAT5z_ysv-hDe.md │ │ │ │ │ ├── prediction@vBnqnIh_xSn0OuY9oQ5e-.md │ │ │ │ │ ├── preprocessing-techniques@MdhfkuKWTDCE73hczzG3D.md │ │ │ │ │ ├── principal-component-analysis@K-x_L3z8JTSHwtTeHm4EG.md │ │ │ │ │ ├── probabilistic@VrLaUipVKWvwnFF0ZbIlo.md │ │ │ │ │ ├── probability@tP0oBkjvJC9hrtARkgLon.md │ │ │ │ │ ├── python@qDn1elMoPIBgQSCWiYkLI.md │ │ │ │ │ ├── pytorch@7RSW-Pypf3QpZp4O21AGl.md │ │ │ │ │ ├── q-learning@wxq5dkrpgvs3axmLmeHCk.md │ │ │ │ │ ├── random-variances-pdfs@P576TdYcbE6v3RpJntiKw.md │ │ │ │ │ ├── recall@DH33Na9zz_WGmbD-Dxvq1.md │ │ │ │ │ ├── recommendation-systems@_eKuBhCCwUHnEGwHNQY-g.md │ │ │ │ │ ├── recurrent-neural-networks@H0cscBaExZPNZuFubBUv7.md │ │ │ │ │ ├── regression@gKu6tnpTO2PhDDMYp2u7F.md │ │ │ │ │ ├── reinforcement-learning@NC1A2SQVyc1n-KEf6yl-4.md │ │ │ │ │ ├── ridge@1aX_vO5zxfTV8_kUIFHkR.md │ │ │ │ │ ├── rnn@LpggrF1MMvAxtO9EJe3wY.md │ │ │ │ │ ├── roc-auc@anEGWHVpcp75e3jQrj_LZ.md │ │ │ │ │ ├── scalars-vectors-tensors@d7J8GEkut61NDGRzROJoP.md │ │ │ │ │ ├── scikit-learn@ZVbnAF9I1r8qWFFYG6nXv.md │ │ │ │ │ ├── scikit-learn@yKtRmgwrJ75VVz7_txZ-S.md │ │ │ │ │ ├── seaborn@VYVLUxhp3XxxknNr5V966.md │ │ │ │ │ ├── self-attention@oTKC1o1OOnPiTh60a8yVc.md │ │ │ │ │ ├── self-supervised-learning@lgO7luG7-R_FY5nwFjRE0.md │ │ │ │ │ ├── semi-supervised-learning@Yho0zf9F-ROhEnTxRMq_M.md │ │ │ │ │ ├── singular-value-decomposition@yGs2h10gZcO4GMaWfI3uW.md │ │ │ │ │ ├── skills-and-responsibilities@BzZd-d5t63dY97SRSIb0J.md │ │ │ │ │ ├── statistics@5DiaZkljhHAGPi9DkaH3b.md │ │ │ │ │ ├── stemming@UO1GEUe8e22uRB6DAxfpe.md │ │ │ │ │ ├── strides@YWxSI45e5K_4YOrvmh6LV.md │ │ │ │ │ ├── supervised-learning@5MUwKGfSTKlam8KCG0A1U.md │ │ │ │ │ ├── support-vector-machines@_jS66rGAWecXH3zVF-5ds.md │ │ │ │ │ ├── tensorflow@Ru8_xMyFxye1hyzCUYvnj.md │ │ │ │ │ ├── tokenization@QbftToskhtBlTz1jyiRkb.md │ │ │ │ │ ├── train---test-data@5xxAg18h74pDAUPy6P8NQ.md │ │ │ │ │ ├── transformers@rDIg16eb6B6um1P8uMy51.md │ │ │ │ │ ├── tuning@m4vmnxRMBf7zwNnwrMEnk.md │ │ │ │ │ ├── types-of-distribution@WLlZE_vto-CYY5GLV_w7o.md │ │ │ │ │ ├── types-of-machine-learning@Ns2zKn8BL_kTEI6O65pCp.md │ │ │ │ │ ├── unsupervised-learning@36ryjK5isV1MD4MgZP2Jn.md │ │ │ │ │ ├── validation-techniques@0hi0LdCtj9Paimgfc-l1O.md │ │ │ │ │ ├── variables-and-data-types@dEFLBGpiH6nbSMeR7ecaT.md │ │ │ │ │ ├── what-is-an-ml-engineer@FgzPlLUfGdlZPvPku0-Xl.md │ │ │ │ │ ├── what-is-machine-learning@rzhVFzl5H5MWtcvr8ayRk.md │ │ │ │ │ ├── what-is-model-evaluation@99TI95HVGrXIYr-PIDxhC.md │ │ │ │ │ ├── what-is-reinforcement-learning@EtU_9MOklVBvnvyg30Yfx.md │ │ │ │ │ ├── what-is-supervised-learning@ajKU5CPlbn7BbWHEhUNaB.md │ │ │ │ │ ├── what-is-unsupervised-learning@9oWdnQd-vwVJi62JQLgJ5.md │ │ │ │ │ └── why-is-it-important@vmERbhRIevLLNc7Ny2pWp.md │ │ │ │ ├── faqs.astro │ │ │ │ ├── machine-learning.json │ │ │ │ └── machine-learning.md │ │ │ ├── mlops/ │ │ │ │ ├── content/ │ │ │ │ │ ├── airflow@AjZHJcxUY29WZbCvr3zrs.md │ │ │ │ │ ├── airflow@pVSlVHXIap0unFxLGM-lQ.md │ │ │ │ │ ├── ansible@-_obgPIUaZ4BVpg29xG_9.md │ │ │ │ │ ├── aws--azure--gcp@u3E7FGW4Iwdsu61KYFxCX.md │ │ │ │ │ ├── bash@mMzqJF2KQ49TDEk5F3VAI.md │ │ │ │ │ ├── cicd@a6vawajw7BpL6plH_nuAz.md │ │ │ │ │ ├── cicd@oUhlUoWQQ1txx_sepD5ev.md │ │ │ │ │ ├── cloud-computing@00GZcwe25QYi7rDzaOoMt.md │ │ │ │ │ ├── cloud-native-ml-services@kbfucfIO5KCsuv3jKbHTa.md │ │ │ │ │ ├── cml@MLob7b468ZgNX7-cURqmJ.md │ │ │ │ │ ├── containerization@tKeejLv8Q7QX40UtOjpav.md │ │ │ │ │ ├── data-engineering-fundamentals@VykbCu7LWIx8fQpqKzoA7.md │ │ │ │ │ ├── data-ingestion-architecture@Berd78HvnulNEGOsHCf8n.md │ │ │ │ │ ├── data-lakes--warehouses@wOogVDV4FIDLXVPwFqJ8C.md │ │ │ │ │ ├── data-lineage--feature-stores@6XgP_2NLuiw654zvTyueT.md │ │ │ │ │ ├── data-lineage@6XgP_2NLuiw654zvTyueT.md │ │ │ │ │ ├── data-pipelines@cOg3ejZRYE-u-M0c89IjM.md │ │ │ │ │ ├── deep-learning@1kk8KDWH-LrPt8SjkpTcX.md │ │ │ │ │ ├── docker@XIdCvT-4HyyglHJLRrHlz.md │ │ │ │ │ ├── dvc@qLKM1zGUhuyBwh_uXSyJJ.md │ │ │ │ │ ├── edge-ai@w8z91Hlqm0sPligYD3VCk.md │ │ │ │ │ ├── experiment-tracking--model-registry@fGGWKmAJ50Ke6wWJBEgby.md │ │ │ │ │ ├── experiment-tracking@fGGWKmAJ50Ke6wWJBEgby.md │ │ │ │ │ ├── explainable-ai@qy37ppIWDT_we-duuHwgT.md │ │ │ │ │ ├── flink@o6GQ3-8DgDtHzdX6yeg1w.md │ │ │ │ │ ├── git@06T5CbZAGJU6fJhCmqCC8.md │ │ │ │ │ ├── github-actions@SCn-6w1UEQwoLQ_dOPpL5.md │ │ │ │ │ ├── github@7t7jSb3YgyWlhgCe8Se1I.md │ │ │ │ │ ├── gitlab@mu56TlVkhhgVzzESDRobc.md │ │ │ │ │ ├── go@vdVq3RQvQF3mF8PQc6DMg.md │ │ │ │ │ ├── grafana@YmRN43yAFF97c7MgNaiqs.md │ │ │ │ │ ├── graphana@YmRN43yAFF97c7MgNaiqs.md │ │ │ │ │ ├── infrastructure-as-code@sf67bSL7HAx6iN7S6MYKs.md │ │ │ │ │ ├── jenkins@75mlW2JoUqSNFK2IDfqFP.md │ │ │ │ │ ├── jetson@Wpv_zRshtTFXNqp1S7m0F.md │ │ │ │ │ ├── kafka@fMNwzhgLgHlAZJ9NvKikR.md │ │ │ │ │ ├── kubeflow@QEayqA8zYsJn0rQYz-4zv.md │ │ │ │ │ ├── kubernetes@XQoK9l-xtN2J8ZV8dw53X.md │ │ │ │ │ ├── lime@pVSlVHXIap0unFxLGM-lQ.md │ │ │ │ │ ├── machine-learning-fundamentals@ulka7VEVjz6ls5SnI6a6z.md │ │ │ │ │ ├── machine-learning@6uGYeXZn5fW2qPfSb8GJb.md │ │ │ │ │ ├── maths--statistics@C4KbkZ7c8TspXa3RBOCug.md │ │ │ │ │ ├── mlflow@93MPXEulKgPnuRlp7F-Nj.md │ │ │ │ │ ├── mlops-components@l1xasxQy2vAY34NWaqKEe.md │ │ │ │ │ ├── mlops-principles@iTsEHVCo6KGq7H2HMgy5S.md │ │ │ │ │ ├── model-evaluation@nS4igSghzVFwamhVOwCjm.md │ │ │ │ │ ├── model-training--serving@zsW1NRb0dMgS-KzWsI0QU.md │ │ │ │ │ ├── monitoring--observability@fR4Qr_ifoBLTpxdkJ50rB.md │ │ │ │ │ ├── monitoring--observability@r4fbUwD83uYumEO1X8f09.md │ │ │ │ │ ├── orchestration--deployment@5VuCUCfb4DEi0HKW11PIX.md │ │ │ │ │ ├── orchestration@fes7M--Y8i08_zeP98tVV.md │ │ │ │ │ ├── programming-fundamentals@_7uvOebQUI4xaSwtMjpEd.md │ │ │ │ │ ├── prometheus@EIjo6iFrU8iDm36_ZtaW5.md │ │ │ │ │ ├── python@Vh81GnOUOZvDOlOyI5PwT.md │ │ │ │ │ ├── pytorch-mobile@qyNOEqp7hW_P7-Isz_v4o.md │ │ │ │ │ ├── pytorch@Zh7AfH6hJ6MMXiqSnQn7G.md │ │ │ │ │ ├── scikit-learn@T-pybEZVvvXopCTbDykR-.md │ │ │ │ │ ├── shap@JQKEWz0-vIJoLimLKvIzz.md │ │ │ │ │ ├── spark@UljuqA89_SlCSDWWMD_C_.md │ │ │ │ │ ├── sql@51x_5z0pHTE_yZoyvFUBy.md │ │ │ │ │ ├── tensorflow@so5IQDxKibaZlgoCh8tpQ.md │ │ │ │ │ ├── terraform@dA9AE-3lTB6lN-X-_Byd2.md │ │ │ │ │ ├── tflite@YFo3NnwVst5EBTtLR-cJ1.md │ │ │ │ │ ├── version-control-systems@_NPGsGEjcLekjGisdDFWt.md │ │ │ │ │ ├── version-control-systems@oUhlUoWQQ1txx_sepD5ev.md │ │ │ │ │ ├── version-control@kHDSwlSq8WkLey4EJIQSR.md │ │ │ │ │ └── what-is-mlops@IghGpwAFVB067uOosmoDC.md │ │ │ │ ├── faqs.astro │ │ │ │ ├── migration-mapping.json │ │ │ │ ├── mlops.json │ │ │ │ └── mlops.md │ │ │ ├── mongodb/ │ │ │ │ ├── content/ │ │ │ │ │ ├── aggregation@gpihoIJkzSS1WOvmH2ueo.md │ │ │ │ │ ├── all@hPPoO8ysGeEGEQhdveiDO.md │ │ │ │ │ ├── and@-62S4wRxHpIM2I59xjGun.md │ │ │ │ │ ├── array@q6ZKxFcSAQ8bgUdGaDpuu.md │ │ │ │ │ ├── atlas-search-indexes@YidhAuVk_VGukx_FfJSz2.md │ │ │ │ │ ├── binary-data@UM6jH6bAijYS0Hmw87UQ-.md │ │ │ │ │ ├── boolean@hmo7zCZ1jKgobS5R0eBSD.md │ │ │ │ │ ├── bson-vs-json@F4W9XBSbkpzWIrAhRBSRS.md │ │ │ │ │ ├── bulkwrite-and-relevant@yc2HqhjhIV6UU_2P-ykKB.md │ │ │ │ │ ├── client-side-field-level@YJiWemHO1l5q9WhgoHyYd.md │ │ │ │ │ ├── collections--methods@7SGYNo3oHlgm_1cwhWfw7.md │ │ │ │ │ ├── compound@eSb4WAfWxJu6R95pPX6wm.md │ │ │ │ │ ├── counting-documents@hC83jKoO_XFI83WpsdN_Z.md │ │ │ │ │ ├── creating-indexes@haA1ltV6VzgJVJcJNMK0W.md │ │ │ │ │ ├── cursors@K9x7yQP59cB764Q5PqAs_.md │ │ │ │ │ ├── data-model--data-types@_UIfRdlj6BeEESw1FW9RH.md │ │ │ │ │ ├── date@T6cq--pute6-8aG7z6QKN.md │ │ │ │ │ ├── decimal128@OGtR5D_DUCSci1lFBT83z.md │ │ │ │ │ ├── delete-and-relevant@qjoLxSkfKbzG1sZUXnyw9.md │ │ │ │ │ ├── developer-tools@6H2MMnEfS6uHGS-6pFo8u.md │ │ │ │ │ ├── double@4Cf_wcoByPqpOOpdbAJuq.md │ │ │ │ │ ├── elastic-search@kJJ-W6BV1ofIvuFT_PCcz.md │ │ │ │ │ ├── elemmatch@TJHVY8DRWbDKeT_pIPJay.md │ │ │ │ │ ├── embedded-objects--arrays@6MqhN-PTf1PRzYCTxC8pn.md │ │ │ │ │ ├── encryption-at-rest@iJjqlTgXxHWC-8bh6uCGQ.md │ │ │ │ │ ├── eq@2h8z2mrgRKSLKI-eBc3zM.md │ │ │ │ │ ├── exclude@nk0V3o3oKuIb8A0gDECFJ.md │ │ │ │ │ ├── exists@12kfpSapv2uNxpHzLkFSL.md │ │ │ │ │ ├── expiring@butGgZXGPTZI-sWx24bOr.md │ │ │ │ │ ├── find-and-relevant@iMpCEXRDXg0Kq9OFNywbI.md │ │ │ │ │ ├── geospatial-indexes@bqXlDnPuMQIKulD9cTvPf.md │ │ │ │ │ ├── group@nz048lC4Q4S7fMVbxLGEk.md │ │ │ │ │ ├── gt@wbZb0RwmANH4ssF07cAar.md │ │ │ │ │ ├── gte@kV5Tmu9ocDnuPQvkx2W0u.md │ │ │ │ │ ├── in@Wd20OKQYYuW_bT6U-yRxT.md │ │ │ │ │ ├── include@sxDyp3bP-YhgmDMVUFTaA.md │ │ │ │ │ ├── indexing@XjB0uOnsYl4edzZWpQ-nm.md │ │ │ │ │ ├── insert-and-relevant@mXdn4u5CiQRDE83qMiWZX.md │ │ │ │ │ ├── int32int@xKFZSKG2GPD-phY2HLMsx.md │ │ │ │ │ ├── int64--long@iJFDFdIN_N4-DlJwrFIiB.md │ │ │ │ │ ├── javascript@UXO5i6nPa5CRW1z7FAn_S.md │ │ │ │ │ ├── kafka@JAosQ9tFj7y70lGQ0vHzC.md │ │ │ │ │ ├── kerberos-authentication@YuzMOO7kf2tO6V6WehqF_.md │ │ │ │ │ ├── language-drivers@73REfcB_T0yBP-KQ0EYmF.md │ │ │ │ │ ├── ldap-proxy-auth@NoDNdno9UOlMrOC0Wga9E.md │ │ │ │ │ ├── limit@AzUVaGnGv9uypJ31alR9r.md │ │ │ │ │ ├── lookup@strw_oGTkZEH-o8zA4IRP.md │ │ │ │ │ ├── lt@5-MLEEigFPRloN7wLa05T.md │ │ │ │ │ ├── lte@eOfsrmOQI0dJW6HV_myVH.md │ │ │ │ │ ├── match@_c7itVw1R1_UB-NPtL-WI.md │ │ │ │ │ ├── max-key@QF7SL237FyBQdqvKUzop6.md │ │ │ │ │ ├── min-key@jQSMLd6gG158tJDzo1k_1.md │ │ │ │ │ ├── mongodb-audit@w1L-yFBM2AyeNBFyH5skW.md │ │ │ │ │ ├── mongodb-basics@z50iixpcCMe9sTh-gwTI3.md │ │ │ │ │ ├── mongodb-security@LC923iJhfiUDIs_0-9rc7.md │ │ │ │ │ ├── mongodb-terminology@1pCWjSvjvbox5OpyWJ8Kv.md │ │ │ │ │ ├── mongodump@xaWDHCkcGm4oovPPxVMB9.md │ │ │ │ │ ├── mongorestore@TKngxMNGMgrdO26D7eeSg.md │ │ │ │ │ ├── ne@Q8dr1JPEnLX0z4DiQwnAz.md │ │ │ │ │ ├── nin@ZKHUCskdKQf4IaMUTN_e7.md │ │ │ │ │ ├── nor@7xq_mdQOlUTuhfnogOl8h.md │ │ │ │ │ ├── not@qaUj9916Fh4BtiLz_pwQs.md │ │ │ │ │ ├── null@g6AKQiFcY_8lsWRbkbZSC.md │ │ │ │ │ ├── object-id@mxd3-l3-NtPw53dEvhqm4.md │ │ │ │ │ ├── object@QcdZKNcCtKls6P4YNXR2W.md │ │ │ │ │ ├── or@43BfjlUju-yJaGv-FaJty.md │ │ │ │ │ ├── performance-optimization@A9W2LsivDc0ialLp83fYP.md │ │ │ │ │ ├── pipelines-stages-and-operators@eDks8Jmsbq3_nHgLydyxP.md │ │ │ │ │ ├── project@dO2mJejkWBH903LG0dWgN.md │ │ │ │ │ ├── project@gakF5Zfgk7QIgg_UwqG_Y.md │ │ │ │ │ ├── query-operators@B8SFhoVV8ei1Yz6vl57l_.md │ │ │ │ │ ├── query-optimization@4L9UQ4oaaK3wZwOLIMa6T.md │ │ │ │ │ ├── query-optimization@kG0ZeGatgvC1azZKMQiA_.md │ │ │ │ │ ├── queryable-encryption@LpfuM6SuhlNNjBcHM68ee.md │ │ │ │ │ ├── read--write-concerns@thOckmrCJ45NVNPNxm4eg.md │ │ │ │ │ ├── regex@PmfjHFz-DW69pNh_t13Nm.md │ │ │ │ │ ├── regular-expression@z6I9XgIGQYWUd5l9DIZRX.md │ │ │ │ │ ├── replicasets@QrHT-H12AV4-V-y_nzmNk.md │ │ │ │ │ ├── retryable-reads--writes@s8El0Q22GD_rOZGlDtkgH.md │ │ │ │ │ ├── role-based-access-control@yRJ6jeysFXBpwLEqvrdKk.md │ │ │ │ │ ├── scaling-mongodb@cOKQQ7SaiawWF49MdCGTh.md │ │ │ │ │ ├── sharded-clusters@CijW3HCjVRZHQIBsQ9_0H.md │ │ │ │ │ ├── single-field@SjPzR6JjdBeiqFsrRJPfW.md │ │ │ │ │ ├── size@-VMIkV6S6H1blngxLXk7Y.md │ │ │ │ │ ├── skip@4CjjGPOy-385Bco_PeQwa.md │ │ │ │ │ ├── slice@9mmxYBtvPYZlvFjQvE-2N.md │ │ │ │ │ ├── sort@BCWS8uV2pSWe7CX-VlnTg.md │ │ │ │ │ ├── spark@K09-nD6xF5YJUQBBpFXMz.md │ │ │ │ │ ├── sql-vs-nosql@cMfsRtvzvDZZJ0TqeUOxm.md │ │ │ │ │ ├── string@eU4XCnrf27FO3KCda8QYw.md │ │ │ │ │ ├── sum@CfM0iyd2bNRIiDWTUkspd.md │ │ │ │ │ ├── symbol@XAS4jQlsHkttLDuSSsD2o.md │ │ │ │ │ ├── text@PV_3TEYdtVZ2VCDZEOsu_.md │ │ │ │ │ ├── timestamp@zbFH2NRHZEOv5eKLL_HR0.md │ │ │ │ │ ├── tls--ssl-encryption@5F7zAAnvnVTTnBzOB7TSu.md │ │ │ │ │ ├── transactions@aHcmsaqAfG5fC90VV-EHP.md │ │ │ │ │ ├── tuning-configuration@iVDxuERBjKMBHueEfqP0x.md │ │ │ │ │ ├── type@BxzMbF7cdvGPuy1EcRvWd.md │ │ │ │ │ ├── undefined@kx_GOr51UMpdUAnS5u9qZ.md │ │ │ │ │ ├── unwind@AY-8KJGA9ZA6ay3rbURt3.md │ │ │ │ │ ├── update-and-relevant@liGbnGyQaG-Vqt6cuB91N.md │ │ │ │ │ ├── validate@4h8NdcdXmNqJxLkVJqPtX.md │ │ │ │ │ ├── what-is-mongodb-atlas@1UXfFROvcunyhkx0zB_1S.md │ │ │ │ │ ├── what-is-mongodb@tJljSlb5S_tZLZhZHHd_I.md │ │ │ │ │ ├── when-to-use-mongodb@qh8MEbXKPVt8mqlarhUj0.md │ │ │ │ │ └── x509-certificate-auth@NV39oWwr7iB_dnlnD_Q6Y.md │ │ │ │ ├── faqs.astro │ │ │ │ ├── migration-mapping.json │ │ │ │ ├── mongodb.json │ │ │ │ └── mongodb.md │ │ │ ├── nextjs/ │ │ │ │ ├── content/ │ │ │ │ │ ├── adapters@fXXlJ6oN_YPWVr-fqEar3.md │ │ │ │ │ ├── analytics@a34ZmSk5VYVLq8wsEvOcI.md │ │ │ │ │ ├── api-endpoints@4H8aOVYsZiPbTQUYcZjb_.md │ │ │ │ │ ├── app@3VXKRDxDmqJObkoW8ndrz.md │ │ │ │ │ ├── caching-data@77i6HVsnX-uSDw8vz3afD.md │ │ │ │ │ ├── caching@0Rgs7jaFX1Gl5KDT6DKbX.md │ │ │ │ │ ├── client-rendered@HdSmD_nDV5BPO5JJqs1k8.md │ │ │ │ │ ├── client@jYSa7UMmjb51pGAyU4PoB.md │ │ │ │ │ ├── composition@6O9c3J-1JQtZTXXIDDXSM.md │ │ │ │ │ ├── create-next-app@3tTTKj6PWsRoRRXH5tXxS.md │ │ │ │ │ ├── csr@4CcK-BLP5NM3ZrCIEG4s8.md │ │ │ │ │ ├── css-in-js@j5jIZvz_bMZqmr_gl0pQF.md │ │ │ │ │ ├── css-modules@tlg5XMVcAHmhey-efjf3M.md │ │ │ │ │ ├── custom-server@Hj01UZuHkQppXTq6XV9Pn.md │ │ │ │ │ ├── cypress@KmOTgclnf-QYDYK0QwwVe.md │ │ │ │ │ ├── data-fetching-patterns@GAHFfQ8CviNxV7ITpt--q.md │ │ │ │ │ ├── deployment-options@BPStVqWV0660A-_fJSuM7.md │ │ │ │ │ ├── docker-container@y5_zX209AaHOf_wQibo12.md │ │ │ │ │ ├── edge@SYUKB1Afciqz7hA1n5yIx.md │ │ │ │ │ ├── environment-variables@iv6rWEqjh07d0n2kAQedO.md │ │ │ │ │ ├── error-states@pxltXOWgpbo95V4u2ryX7.md │ │ │ │ │ ├── eslint@CvrHzkxg7ndCvd_tbYnK4.md │ │ │ │ │ ├── fetching-locations@lkdBRzC8lAvRYKBt7E37V.md │ │ │ │ │ ├── fonts@ZptECTASMX97m5yCZ-XO8.md │ │ │ │ │ ├── global-css@BfNON3Vp3zSWBurSS4ZHo.md │ │ │ │ │ ├── handling-sensitive-data@Ti_Bl5NnRIY9UTNTH15xA.md │ │ │ │ │ ├── images@1t9iOcmrEmuwOxOZ0vlY7.md │ │ │ │ │ ├── instrumentation@DHqdXJFhVZWaNa5zSX8Wk.md │ │ │ │ │ ├── intercepting-routes@dP6cZkEZ6lxPsy5SjvuZA.md │ │ │ │ │ ├── internationalization@bSsM7VLZcJKYL5XXSG0r-.md │ │ │ │ │ ├── introduction@tcDL4OEbZplbjNa8VTLpv.md │ │ │ │ │ ├── javascript-basics@DlUQkDRPUcjC3pO4P5zCQ.md │ │ │ │ │ ├── jest@sc5Pliyq6bfeFXp0ca5yH.md │ │ │ │ │ ├── layouts-and-templates@zJXCS7U9NUsn7cuEx3YMs.md │ │ │ │ │ ├── lazy-loading@3_Mpvkxp9A7PMogxxMikQ.md │ │ │ │ │ ├── loading-and-streaming@b2LcPc5MfoyF0W9Y0aGpR.md │ │ │ │ │ ├── markdown-and-mdx@3GI0xHGG_qgpLfEjaLYxr.md │ │ │ │ │ ├── memoization-in-fetch@UZCMVpg5YIDxu-AMah3S-.md │ │ │ │ │ ├── memory-usage@SI7KzNSLP0ccH_P94StGL.md │ │ │ │ │ ├── metadata@45XMR5imHEDF_X8wcgjGW.md │ │ │ │ │ ├── middelware@gpZNwsh075wl5eH2gLKro.md │ │ │ │ │ ├── nextjs-routing-basics@xRZqBd5-QO8zh7ksHlRjK.md │ │ │ │ │ ├── nextjs@uJrOHRLmEBZtHJzAAusUe.md │ │ │ │ │ ├── nodejs-server@Okw_IjU2iRSvSQVdKeeCo.md │ │ │ │ │ ├── nodejs@0S37ka1K-TdYLnjCBrKSH.md │ │ │ │ │ ├── opentelemetry@mTh5PZNpzJNKPqpu5PVL6.md │ │ │ │ │ ├── package-bundling@qM_Za9NiCiCG5-kf5RCXF.md │ │ │ │ │ ├── pages@htuyzi5_N-fqnx_SsO_DS.md │ │ │ │ │ ├── parallel-routes@2N_hm9Zx_Lp-RFEMP9HFb.md │ │ │ │ │ ├── parallel-vs-sequential@SjJQ7ceU6vBhlhrN8hcvy.md │ │ │ │ │ ├── playwright@qFDdfOBdOlGMjTEOiiuTe.md │ │ │ │ │ ├── preloading-data@Ve1Pa7IhGHPZ_F-sCMcNb.md │ │ │ │ │ ├── preparing-for-production@-yiJSBIoczJHOW8YMdWFI.md │ │ │ │ │ ├── prettier@efMytbUmw44M8dPL4ItsX.md │ │ │ │ │ ├── react-cache@crBlqiS78n7yz28cT2GGz.md │ │ │ │ │ ├── react-frameworks@FdvaN6BOxUEJt7TarSDmo.md │ │ │ │ │ ├── reditects@K1wGmAy9L0VE6cwYE2pA6.md │ │ │ │ │ ├── remix@G_33yo1MshQbiaGTPtTdK.md │ │ │ │ │ ├── rendering-pages@IlWFMh44HtHDnIr7nqwtI.md │ │ │ │ │ ├── rendering-strategies@1ch6ZXZP46FP8q3HeCqWM.md │ │ │ │ │ ├── revalidating-cached-data@N5siOJO3dc9vJUTpbdm04.md │ │ │ │ │ ├── revalidation-errors@qMYuXOlr_c-6oQKVOdGci.md │ │ │ │ │ ├── route-matcher@Sn-8ztsjjtUxD_SP6w3cS.md │ │ │ │ │ ├── routing-patterns@09uWsmXOXU0Ox7F3qsjRx.md │ │ │ │ │ ├── routing-terminology@oFhmV5Xv0KJ-SjeYVZBpi.md │ │ │ │ │ ├── runtimes-and-types@LN7SHgcQp9gX_jfEN84YP.md │ │ │ │ │ ├── sass@5H7toz-DxtnwjozCgLuk6.md │ │ │ │ │ ├── scripts@JFrpy3dGt-UP9Weo1VBvN.md │ │ │ │ │ ├── server-actions@IuBZY-ISP1Sy_5OQ99jLY.md │ │ │ │ │ ├── server-rendered@m7eKlykOZCA3BLuBHioDj.md │ │ │ │ │ ├── server@QDxYlIyFOuGUIy_ZovHs0.md │ │ │ │ │ ├── setting-headers@XwDF-Kt9K5smm3ruxlkR2.md │ │ │ │ │ ├── setting-things-up@ThrO72opK7xGWpy0GG63T.md │ │ │ │ │ ├── spa-vs-ssr@ch5gUr8xeCIp-i48N5qew.md │ │ │ │ │ ├── spa@NC7s-EOLWhjXR70JFZxcg.md │ │ │ │ │ ├── ssg@CqPZHOs1Iew6PCIjwiqUt.md │ │ │ │ │ ├── ssr@7EYQnX3cEAjSL-iJSprEI.md │ │ │ │ │ ├── static-assets@iabbuLHqAiRkgj03t64x7.md │ │ │ │ │ ├── static-export@evmzZ6F7TWgYhdaahnZHY.md │ │ │ │ │ ├── static-vs-dynamic@hQHvu7MzNwA2lL9ADm5YQ.md │ │ │ │ │ ├── streaming@lR7oPh0DCY_BhzXH31N36.md │ │ │ │ │ ├── structuring-routes@9egFwmy-o7Fx-M7FcPXXy.md │ │ │ │ │ ├── tailwind-css@3IKXvlA9P06GiOi34zv5H.md │ │ │ │ │ ├── third-party-libraries@-j38AhG6LUCH5GupGiqUM.md │ │ │ │ │ ├── types-of-routers@km7dLVpl76c5EfWvhhbRh.md │ │ │ │ │ ├── typescript@ZFHkHmvjndPjDAB-MAtb7.md │ │ │ │ │ ├── use-cases@54Cc_GdL327tzkdYBA305.md │ │ │ │ │ ├── using-cookies@8kUhcd2-BlqOKInEuSI95.md │ │ │ │ │ ├── videos@1SJX-nGuhIxGH0ukfluoQ.md │ │ │ │ │ ├── vitest@KTZRo1Y_Z-7eMYzZ9W0Vl.md │ │ │ │ │ ├── why-frontend-frameworks@rJ3vuI58Z9u2SKTDgpTE2.md │ │ │ │ │ ├── why-nextjs@WxoMZRRiW9CGDZ9i80nbf.md │ │ │ │ │ ├── why-react@ey6z7Y4WtNtQJ50n-3j5P.md │ │ │ │ │ └── why-use-app-router@e_rwwlKsvyv9OMDDBXo_N.md │ │ │ │ ├── faqs.astro │ │ │ │ └── nextjs.md │ │ │ ├── nodejs/ │ │ │ │ ├── content/ │ │ │ │ │ ├── --watch@812bVEzxwTsYzLG_PmLqN.md │ │ │ │ │ ├── __dirname@1AaGG660rvZlNYMOA35qO.md │ │ │ │ │ ├── __filename@P2gdwx1qCxvg1Ppfw0aqQ.md │ │ │ │ │ ├── assertion-errors@do-tdCUfDtiZHBg4ZO3dC.md │ │ │ │ │ ├── async-programming@uE7fvHSTSdebMf5RsNyaY.md │ │ │ │ │ ├── asyncawait@a26qNCyMcT5GsVzxeNCLk.md │ │ │ │ │ ├── axios@BOLiZg8YDKADMwP01U5ph.md │ │ │ │ │ ├── building--consuming-apis@fFVCb6aZWRHdNDFt5C09R.md │ │ │ │ │ ├── callbacks@GwInWcbQn18PnzKGXzmln.md │ │ │ │ │ ├── callstack--stack-trace@wIieXdFtoZWJ-ht8qqWbp.md │ │ │ │ │ ├── chalk-package@V4OWIC1cnw8EFyu26Y_dA.md │ │ │ │ │ ├── child-process@lzPrWD3pxQmpbqgYPL-zW.md │ │ │ │ │ ├── chokidar@een1zhvgN_33Cu6OiWtyX.md │ │ │ │ │ ├── cli-progress@iW9je5Pq7bjxWZDERv_p5.md │ │ │ │ │ ├── cluster@PkQ_sQ0YFPCZGx4BRgG0t.md │ │ │ │ │ ├── command-line-apps@Ce-dP-OXu0mEm30rzp2hW.md │ │ │ │ │ ├── commander@BxxLQUI7JcQgF6TK3L5uU.md │ │ │ │ │ ├── common-built-in-modules@M62lAWBOrTe99TfpFOQ-Y.md │ │ │ │ │ ├── commonjs@mhjswf17nhq075NTYV5gE.md │ │ │ │ │ ├── creating--importing@EEnmOcDKPZzY_O1NwP_5j.md │ │ │ │ │ ├── creating-packages@Uh9hmEy7o1EJLg4E--ku2.md │ │ │ │ │ ├── cypress@3Fh3-V1kCZtlUTvEoloIO.md │ │ │ │ │ ├── debugging@ZLNUuDKhJ03Kw7xMVc7IR.md │ │ │ │ │ ├── dotenv-package@fE9C7Resn4EcL-hYHbsaZ.md │ │ │ │ │ ├── drizzle@JXQF9H4_N0rM7ZDKcCZNn.md │ │ │ │ │ ├── ejs@L-_N7OxxuHCXsdWYBgZGu.md │ │ │ │ │ ├── error-handling@t_kfKdNSKVBPYQ9zF9VqQ.md │ │ │ │ │ ├── esm@mKccfWOhC1Aj4VnaOqryA.md │ │ │ │ │ ├── event-emitter@bgEHTBYzRDJqZ6gLqLbsz.md │ │ │ │ │ ├── event-loop@b679H8gEBuvrHQ8ik7e96.md │ │ │ │ │ ├── exitting--exit-codes@XteNExIZN3_g95_dPCopY.md │ │ │ │ │ ├── expressjs@1vq_KcYR_pkfp1MtXaL75.md │ │ │ │ │ ├── fastify@WkU_rI4i-UmNSxb5F9TI-.md │ │ │ │ │ ├── fetch@B_3rTGQxJneMREXoi2gQn.md │ │ │ │ │ ├── figlet-package@PHLdJylzNZDJBGi8FFsfO.md │ │ │ │ │ ├── fs-extra@zDmWGRrgwq3Gjfkyk6crK.md │ │ │ │ │ ├── fs-module@b1r1X3XCoPSayQjDBcy54.md │ │ │ │ │ ├── garbage-collection@SJ01N7vMZkNiIuMYQhdpj.md │ │ │ │ │ ├── glob@CWH0ZsxJ8beLvwMYJyH52.md │ │ │ │ │ ├── global-installation@l24OMkPAEDnEDAVAMrMuG.md │ │ │ │ │ ├── global-keyword@PEGHvFT2Eg-1OyfhxYu22.md │ │ │ │ │ ├── globby@HYTw74rrd7kkOemCxfT9I.md │ │ │ │ │ ├── got-package@6stiDKubT6XVAOGiJ6wsx.md │ │ │ │ │ ├── handling-async-errors@3MpxV23lNpuKg0--e_9m7.md │ │ │ │ │ ├── history-of-nodejs@Vrcv5px-3fqmyJnQv3WBK.md │ │ │ │ │ ├── hono@Xa-lA1wbZ9JZ_XpXfhhw5.md │ │ │ │ │ ├── http-module@Sjc1YDtbzXyLQH711_3nj.md │ │ │ │ │ ├── inquirer-package@WFJJtIqVoBIhK10XY-d7l.md │ │ │ │ │ ├── introduction-to-nodejs@KDd40JOAvZ8O1mfhTYB3K.md │ │ │ │ │ ├── javascript-errors@Wg7KSpAPxjeFMxC6PBnHO.md │ │ │ │ │ ├── jest@5xrbKv2stKPJRv7Vzf9nM.md │ │ │ │ │ ├── jsonwebtoken@7u2WMxjLx3mMtn0cha4M7.md │ │ │ │ │ ├── keep-app-running@af7n-J7VvbdpZh9lwA773.md │ │ │ │ │ ├── knex@HDDnt79_PCB5JU-KnHKUh.md │ │ │ │ │ ├── ky@-_2letLUta5Ymc5eEOKhn.md │ │ │ │ │ ├── local-installation@oYeux7PbveYaVwXRzAg5x.md │ │ │ │ │ ├── logging@b7ZAEqo0ZU6TNf18Bo0mI.md │ │ │ │ │ ├── marko@f2DyjBIglAZ6NoHaRnlzt.md │ │ │ │ │ ├── memory-leaks@oU9I7KBZoTSXXFmYscEIq.md │ │ │ │ │ ├── modules@mbGFT6S7mL3bHHEZv0_s2.md │ │ │ │ │ ├── mongoose@NDf-o-WECK02mVnZ8IFxy.md │ │ │ │ │ ├── monitor-changes-dev@swp4wBgA7z-sd64VDkMrw.md │ │ │ │ │ ├── morgan@CTHFGgtXFpke4aPhh5vRY.md │ │ │ │ │ ├── native-drivers@5WqLm53CHDT5uBoMH-iPl.md │ │ │ │ │ ├── native-drivers@KpC-QYKalUp7VUvnMKBoW.md │ │ │ │ │ ├── nestjs@tGD8XLHnfspfv8CbguGwV.md │ │ │ │ │ ├── node---inspect@DcmGcVlEHL4IV7yPMDpVa.md │ │ │ │ │ ├── nodejs-vs-browser@ebVb0anYmbD1Y9ZTFXKFp.md │ │ │ │ │ ├── nodemon@2Ym2jMvov0lZ79aJFaw29.md │ │ │ │ │ ├── nodetest@oSLpy31XEcA2nRq9ks_LJ.md │ │ │ │ │ ├── npm-workspaces@WvxCGVKLvTUVEHeOcUQPg.md │ │ │ │ │ ├── npm@jQJ9aOKtg-O-GhWk5OgCK.md │ │ │ │ │ ├── npx@YdpJ-DUo8Q5ATRmF4s4YS.md │ │ │ │ │ ├── passportjs@mIyv6S9a5dCHkk-JhhjKV.md │ │ │ │ │ ├── path-module@Blzb-fdQZMu6Xq5JDJW0_.md │ │ │ │ │ ├── playwright@Ix-g9pgJjEI04bSfROvlq.md │ │ │ │ │ ├── pm2@7WAuMMyelUbgwEHtnMmJv.md │ │ │ │ │ ├── prisma@3Qxtf8n6gJYdnRsuqa52Q.md │ │ │ │ │ ├── prisma@O7Cy2g_GPxKU6vPfEmNyi.md │ │ │ │ │ ├── processargv@lT2DDRtbFfEjb_cmsQx8i.md │ │ │ │ │ ├── processcwd@QT2QE2FLkyUDpwMKYkFQL.md │ │ │ │ │ ├── processenv@wthXp2YGg3eTMbxsek77C.md │ │ │ │ │ ├── processnexttick@ATu9-29yJWcDOik5FTOgf.md │ │ │ │ │ ├── processstdin@betuntelnEMSHdatO6VPl.md │ │ │ │ │ ├── promises@QcOqhuKWOUUUBSiu5Oelv.md │ │ │ │ │ ├── prompts-package@xgsKrUdfB0g0DMQCLK3aY.md │ │ │ │ │ ├── pug@O67e2qyhxP5joR5LGyZ2N.md │ │ │ │ │ ├── running-nodejs-code@uPJqdMQQJRkTMMhNORDeH.md │ │ │ │ │ ├── running-scripts@64pgc7rcgboFcNYuOlX8e.md │ │ │ │ │ ├── semantic-versioning@dOlzIXBfAPmbY542lNOe6.md │ │ │ │ │ ├── sequelize@fOm-ktIaLqrmA0zln0Bga.md │ │ │ │ │ ├── setimmediate@YvTPpoIiSqjDYi0Q10kWh.md │ │ │ │ │ ├── setinterval@T5I-mFKK6bKzXrzkECI0P.md │ │ │ │ │ ├── settimeout@W2Dbj4Y78Bgdx7og5xkrg.md │ │ │ │ │ ├── stdout--stderr@N2vR1_NyDn4rYLXJzxWBZ.md │ │ │ │ │ ├── streams@WrnjjUDXQwwMXQjmgK72U.md │ │ │ │ │ ├── system-errors@05YY-AhLKzn4Ypr4eow5E.md │ │ │ │ │ ├── template-engines@J0ErCAZT5B97ZMogU2JHd.md │ │ │ │ │ ├── testing@90NIFfbWjTbyKZKwyJlfI.md │ │ │ │ │ ├── threads@KzUmXkwrmU_ssVBjSHAiY.md │ │ │ │ │ ├── topic-node@8ZC8r1PsBp4EyxWy_S0ko.md │ │ │ │ │ ├── typeorm@rk5FtAPDi1TpvWd0yBbtl.md │ │ │ │ │ ├── uncaught-exceptions@uzOmaTZrHhBxx5plb345Z.md │ │ │ │ │ ├── updating-packages@bYBz12FUiJ1qLgdQSGyGK.md │ │ │ │ │ ├── user-specified-errors@wQ4i6_a1EFk9HHc6Sll-3.md │ │ │ │ │ ├── using-apm@CvkjlOpT34lOHgzQHL40s.md │ │ │ │ │ ├── using-debugger@XEGTeGWw05xWYOfUo3POE.md │ │ │ │ │ ├── vitest@qjToBaMenW3SDtEfoCbQ6.md │ │ │ │ │ ├── what-is-nodejs@Mp056kNnwsRWeEXuhGPy-.md │ │ │ │ │ ├── why-use-nodejs@ex8FOKrUlbu4MuEq2czyW.md │ │ │ │ │ ├── winston@Oe9cQCz2lwSaot7miZOta.md │ │ │ │ │ ├── worker-threads@bH2Iv3BX0ZiWD3lOmC_m_.md │ │ │ │ │ ├── working-with-databases@5l-lZ8gwVLqqAF_n99vIO.md │ │ │ │ │ └── working-with-files@wEK77A6MPQBCBUSJKMiaY.md │ │ │ │ ├── faqs.astro │ │ │ │ ├── migration-mapping.json │ │ │ │ ├── nodejs.json │ │ │ │ └── nodejs.md │ │ │ ├── php/ │ │ │ │ ├── content/ │ │ │ │ │ ├── _get@GFYGFVfxkOoPI5mI4zSt1.md │ │ │ │ │ ├── _post@qNG-a4iIO-puZsMwAMzYC.md │ │ │ │ │ ├── _request@A6rfW4uJhyfAX2b18_EEC.md │ │ │ │ │ ├── _server@7Ja2at_N9tRTlvSGahrqn.md │ │ │ │ │ ├── abstract-classes@ub79EkMiOmPBwXLRuYFL8.md │ │ │ │ │ ├── access-specifiers@RD2RaBmA2XWkEa13PTCTX.md │ │ │ │ │ ├── anonymous-functions@Nr5m6wQLp7VyG3AucrSc8.md │ │ │ │ │ ├── apache@KMQqePqAjQ-ReDwHqeofx.md │ │ │ │ │ ├── arrays@IhKjvT6CjRz4dsSU7SNQo.md │ │ │ │ │ ├── arrow-functions@mP1BIkqbWVVTU-zZv1ZL6.md │ │ │ │ │ ├── associative-arrays@i_NRsOJNNp7AOqMgu5Jg8.md │ │ │ │ │ ├── auth-mechanisms@HJJzKYXdK4BWITLP4APLZ.md │ │ │ │ │ ├── autoloading@qFiTsf6Es-gwqe6J6bdL1.md │ │ │ │ │ ├── basic-php-syntax@hzBUHSuFwLYNooF_vEmrs.md │ │ │ │ │ ├── caching-strategies@Av-BMa57RvrLlAXLffOH0.md │ │ │ │ │ ├── callback-functions@x7hA2KAzJIjc-prgCEw6V.md │ │ │ │ │ ├── casting-data-types@pzReF4C0mcCWAnpfIJbwl.md │ │ │ │ │ ├── classes-and-objects@PIuplWreo7PFG3Mdn2t6W.md │ │ │ │ │ ├── composer@yVFDu2aTiEZ4PWMdKdW2P.md │ │ │ │ │ ├── conditionals@38YksjvhXCbgnHqkl57Cz.md │ │ │ │ │ ├── configuration-files@DTaAZaU1CwzW7esoDhj85.md │ │ │ │ │ ├── configuration-tuning@VpwwF8j5ZtXVSbzNfE7Sx.md │ │ │ │ │ ├── connection-pooling@txUyPR_tdC8iTJV3RtvBz.md │ │ │ │ │ ├── constants@VLRLymQmLfscrBfzXKvHi.md │ │ │ │ │ ├── constructor--destructor@oNUt1oT8pYBVvH0S2P6cb.md │ │ │ │ │ ├── cookies@so03-fK7E2WvTm6XsPq4i.md │ │ │ │ │ ├── csrf-protection@J9yIXZTtwbFzH2u4dI1ep.md │ │ │ │ │ ├── csv-processing@MRDjEjbkMpk7shcWAoPOF.md │ │ │ │ │ ├── curl@KC6D81-T-FwQc7Osw1rlY.md │ │ │ │ │ ├── data-types@srIHPZabaCGdB5VvUXaMa.md │ │ │ │ │ ├── database-migrations@meplwvmHMtI3Sb_fyodzZ.md │ │ │ │ │ ├── database-transactions@FY-F6n9j29hQrnFry3VGb.md │ │ │ │ │ ├── default--optional-params@RgVP99rJJ8FVecIA45w20.md │ │ │ │ │ ├── dependency-injection@KEE50C6lOS4eX8sAbfhYe.md │ │ │ │ │ ├── echo@2ykzBBdYhWuM-neGf0AWP.md │ │ │ │ │ ├── environment-variables@fitjnLYKLHJ2P5G7JAvzm.md │ │ │ │ │ ├── evolution-and-history@b2CuLrhsUNnb4OxI6RRAS.md │ │ │ │ │ ├── executing-system-commands@VhyYNGhOdKKrz_-uTkrjD.md │ │ │ │ │ ├── file-permissions@tgIyG6vHWpe9sz6lHmj5a.md │ │ │ │ │ ├── file-uploads@HNo8QO4aPbvgePiA4l6tq.md │ │ │ │ │ ├── form-processing@sYI7f1PYP7G30_Uj2mZRv.md │ │ │ │ │ ├── function-declaration@1nODJchgSuWbcvSlxnWeE.md │ │ │ │ │ ├── functions@WiGv7vi7Mtw-YqPMcnnyw.md │ │ │ │ │ ├── guzzle@_Al4NXKVQAnk8OikwvXCL.md │ │ │ │ │ ├── http-methods@tn_iIfaJZVtPK6vFds7FH.md │ │ │ │ │ ├── ifelse@-McOv-ZPTGayX7Mx2Thw1.md │ │ │ │ │ ├── include@hKfv7V6bl2LXssq9Ffi7C.md │ │ │ │ │ ├── include_once@SwtLDgyPmDry20qS4FBfH.md │ │ │ │ │ ├── indexed-arrays@j2S8dP3HlAOOoZdpj-7Dx.md │ │ │ │ │ ├── inheritance@c5q2e_jyMt8Pir5Od3lRi.md │ │ │ │ │ ├── input-validation@93oEIZttb85S23C1fLraP.md │ │ │ │ │ ├── installing-php@3_TuxOSzBuktBlBF05r_z.md │ │ │ │ │ ├── interfaces@vu0H-TsD7hkJgOQbSRj92.md │ │ │ │ │ ├── introduction-to-php@_hYN0gEi9BL24nptEtXWU.md │ │ │ │ │ ├── json-processing@DB2cxZE58WCCavW2PNwmf.md │ │ │ │ │ ├── lamp@7LjxtrmgJtTJc0_kP83Tr.md │ │ │ │ │ ├── laravel@zsscRQZIq5o0JZir9hlz-.md │ │ │ │ │ ├── loops@qwt8xN4vuTrY-D0czYITI.md │ │ │ │ │ ├── magic-methods@rSXsPWto7Jeyw3Szl9pvf.md │ │ │ │ │ ├── mamp@t7p7TU2khaxsZPYAdwFAA.md │ │ │ │ │ ├── match@3gNzX-bw2iqur7U7-_W38.md │ │ │ │ │ ├── memory-management@bt7dK2PcOZ72B9HXPyMwL.md │ │ │ │ │ ├── multi-dimensional-arrays@uARTOZ-ZwugSmbCJoRS5Y.md │ │ │ │ │ ├── mysqli@YLuo0oZJzTCoiZoOSG57z.md │ │ │ │ │ ├── named-arguments@RkNjYva8o_jXp9suz5YdG.md │ │ │ │ │ ├── namespaces@9raJ06lKRZITbjWeLil-F.md │ │ │ │ │ ├── nginx@aspZpACHEKOsi_Er5FYPY.md │ │ │ │ │ ├── null-coalescing-operator@w0ntgFBhgGd5RUFd-qlPK.md │ │ │ │ │ ├── null-safe-operator@1NXSk8VZDr89jQTTkOL7x.md │ │ │ │ │ ├── object-relational-mapping-orm@SeqGIfcLuveZ2z5ZSXcOd.md │ │ │ │ │ ├── oop-fundamentals@yTviiPFR5b_dr3WyxdxxQ.md │ │ │ │ │ ├── opcode-caching@NieqZd1juaNYoZOrB7e31.md │ │ │ │ │ ├── packagist@xZf2jjnCVHwYfDH2hs9kR.md │ │ │ │ │ ├── parameters--return-values@mpQKoBzsOa-5iWo08sOhQ.md │ │ │ │ │ ├── password-hashing@JbWFfJiCRrXDhnuIx_lqx.md │ │ │ │ │ ├── pdo@cJtPz1RMN1qDE4eRdv4N_.md │ │ │ │ │ ├── performance-optimization@M1nVsh_sCSFJRf6-7Ttsj.md │ │ │ │ │ ├── pest@d6MydchA52HIxfAUjmZui.md │ │ │ │ │ ├── phan@B45YVzov8X_iOtneiFEqa.md │ │ │ │ │ ├── php-cs-fixer@r07k_hT2z2EiIBH4q3F7-.md │ │ │ │ │ ├── php-fig@SD9k16UlVve9WtNMDA5Za.md │ │ │ │ │ ├── php-fpm@AoGS-5MSkp8gtJFQVPSBE.md │ │ │ │ │ ├── php-versions-and-features@6sHRQTcoKL3TlgNJlwyx8.md │ │ │ │ │ ├── phpcodesniffer@fSpvZ_4kGFMbFVCWhA8vn.md │ │ │ │ │ ├── phpstan@12k71gNfwAcT9K5aLWgbZ.md │ │ │ │ │ ├── phpunit@NfBKKwG2GGBPppOjoLLBg.md │ │ │ │ │ ├── polymorphism@gtq5KrghF28f5G8nuDcYQ.md │ │ │ │ │ ├── print@NQUmO90sqe7fnzod3Ia8H.md │ │ │ │ │ ├── print_r@wsC7OGXOyfCY4pLLNrR2v.md │ │ │ │ │ ├── process-control@NTKUMgsKGYISIyhgOJPQn.md │ │ │ │ │ ├── profiling-techniques@_Dh78x_tPLqZweg--qZFQ.md │ │ │ │ │ ├── properties-and-methods@MRAPXshy9RoYdReY6grf_.md │ │ │ │ │ ├── psalm@T1XD93j6Lkpl88JSmys9b.md │ │ │ │ │ ├── psr-standards@3tONibbRgK7HCwGTE2Gqw.md │ │ │ │ │ ├── reading-files@S9wTlkbv9-R6dohhZ47hs.md │ │ │ │ │ ├── recursion@D9ybK5INH5zSOcYMb5ZPi.md │ │ │ │ │ ├── require@Kaaqu-mN7xvHN6CbIn616.md │ │ │ │ │ ├── require_once@-CyJbsg2ho3RvfzKnJj5C.md │ │ │ │ │ ├── sanitization-techniques@tfC1tCrbvH5J43WUpG9Yb.md │ │ │ │ │ ├── sessions@qobzzgzArNHLLn9Oiqc6G.md │ │ │ │ │ ├── sql-injection@801vB_JMas4ucriUmfrLg.md │ │ │ │ │ ├── state-management@CGehmZjcgTWC7fQAvxmNW.md │ │ │ │ │ ├── static-analysis@PrG_5dyBblXsWYYRcOJMa.md │ │ │ │ │ ├── static-methods-and-properties@qlkpwXfOc1p7j37hrzffI.md │ │ │ │ │ ├── style-tools@6eWgZVLV479oQzl0fu-Od.md │ │ │ │ │ ├── switch@bgJ9-m6Fiu3VCc-NZlbpn.md │ │ │ │ │ ├── symfony@57VSMVePOr9qUD5x_LNdf.md │ │ │ │ │ ├── traits@GR09ns9B-0cONQaQ_uj-7.md │ │ │ │ │ ├── type-declarations@sPW-Ti2VyNYzxq6EYkbn7.md │ │ │ │ │ ├── var_dump@JCCeVC0hOrvIeyfg1ScKA.md │ │ │ │ │ ├── variables-and-scope@D0BtyxyjIBcpfn5wP23WC.md │ │ │ │ │ ├── variadic-functions@rtmytETfyyLdcXUC0QyzL.md │ │ │ │ │ ├── wamp@36Y1HkHxhuxh2qVQB8NVE.md │ │ │ │ │ ├── what-is-php@_LhLDVZjLt1DoAP1NuUES.md │ │ │ │ │ ├── writing-files@two4UycJaCfSp6jQqtTAb.md │ │ │ │ │ ├── xampp@-wniKEBwbF0Fi1fHpF-Gc.md │ │ │ │ │ ├── xdebug@lFoHoMRywCWa056ii5cKQ.md │ │ │ │ │ ├── xml-processing@ggkWo0DRSSDDkHpbiyUyf.md │ │ │ │ │ ├── xss-prevention@DxqQrToZSayWplKdCkTgT.md │ │ │ │ │ └── zend-debugger@KpQb5Zh3GUcbYUyXHvyu2.md │ │ │ │ ├── faqs.astro │ │ │ │ ├── php.json │ │ │ │ └── php.md │ │ │ ├── postgresql-dba/ │ │ │ │ ├── content/ │ │ │ │ │ ├── acid@9u7DPbfybqmldisiePq0m.md │ │ │ │ │ ├── adding-extra-extensions@VAf9VzPx70hUf4H6i3Z2t.md │ │ │ │ │ ├── advanced-topics@09QX_zjCUajxUqcNZKy0x.md │ │ │ │ │ ├── aggregate-and-window-functions@iQqEC1CnVAoM7x455jO_S.md │ │ │ │ │ ├── ansible@RqSfBR_RuvHrwHfPn1jwZ.md │ │ │ │ │ ├── any-programming-language@j5YeixkCKRv0sfq_gFVr9.md │ │ │ │ │ ├── attributes@XvZMSveMWqmAlXOxwWzdk.md │ │ │ │ │ ├── authentication-models@gb75xOcAr-q8TcA6_l1GZ.md │ │ │ │ │ ├── awk@HJCRntic0aGVvdmCN45aP.md │ │ │ │ │ ├── b-tree@jihXOJq9zYlDOpvJvpFO-.md │ │ │ │ │ ├── backup-validation-procedures@te4PZaqt6-5Qu8rU0w6a1.md │ │ │ │ │ ├── barman@-XhONB0FBA6UslbDWoTDv.md │ │ │ │ │ ├── basic-rdbms-concepts@-M9EFgiDSSAzj9ISk-aeh.md │ │ │ │ │ ├── brin@43oFhZuXjJd4QHbUoLtft.md │ │ │ │ │ ├── buffer-management@KeBUzfrkorgFWpR8A-xmJ.md │ │ │ │ │ ├── bulk-loading--processing-data@cc4S7ugIphyBZr-f6X0qi.md │ │ │ │ │ ├── check_pgactivity@WiOgUt5teG9UVRa6zo4h3.md │ │ │ │ │ ├── check_pgbackrest@DDPuDDUFxubWZmWXCmF7L.md │ │ │ │ │ ├── checkpoints--background-writer@3pLn1mhRnekG537ejHUYA.md │ │ │ │ │ ├── chef@7EHZ9YsNjCyTAN-LDWYMS.md │ │ │ │ │ ├── columns@cty2IjgS1BWltbYmuxxuV.md │ │ │ │ │ ├── configuring@T819BZ-CZgUX_BY7Gna0J.md │ │ │ │ │ ├── connect-using-psql@mMf2Mq9atIKk37IMWuoJs.md │ │ │ │ │ ├── constraints@j9ikSpCD3yM5pTRFuJjZs.md │ │ │ │ │ ├── consul@IkB28gO0LK1q1-KjdI9Oz.md │ │ │ │ │ ├── core-dumps@-CIezYPHTcXJF_p4T55-c.md │ │ │ │ │ ├── cte@fsZvmH210bC_3dBD_X8-z.md │ │ │ │ │ ├── data-partitioning@OiGRtLsc28Tv35vIut6B6.md │ │ │ │ │ ├── data-types@4Pw7udOMIsiaKr7w9CRxc.md │ │ │ │ │ ├── data-types@fvEgtFP7xvkq_D4hYw3gz.md │ │ │ │ │ ├── databases@DU-D3-j9h6i9Nj5ci8hlX.md │ │ │ │ │ ├── default-privileges@t18XjeHP4uRyERdqhHpl5.md │ │ │ │ │ ├── depesz@rVlncpLO20WK6mjyqLerL.md │ │ │ │ │ ├── deployment-in-cloud@6SCcxpkpLmmRe0rS8WAPZ.md │ │ │ │ │ ├── domains@-LuxJvI5IaOx6NqzK0d8S.md │ │ │ │ │ ├── ebpf@QarPFu_wU6-F9P5YHo6CO.md │ │ │ │ │ ├── etcd@kCw6oEVGdKokCz4wYizIT.md │ │ │ │ │ ├── explain@n2OjwxzIHnATraRWi5Ddl.md │ │ │ │ │ ├── explaindalibocom@UZ1vRFRjiQAVu6BygqwEL.md │ │ │ │ │ ├── filtering-data@dd2lTNsNzYdfB7rRFMNmC.md │ │ │ │ │ ├── for-schemas@KMdF9efNGULualk5o1W0_.md │ │ │ │ │ ├── fortables@ga8ZiuPc42XvZ3-iVh8T1.md │ │ │ │ │ ├── gdb@yIdUhfE2ZTQhDAdQsXrnH.md │ │ │ │ │ ├── get-involved-in-development@NhodBD8myUTljNdn3y40I.md │ │ │ │ │ ├── gin@FJhJyDWOj9w_Rd_uKcouT.md │ │ │ │ │ ├── gist@2chGkn5Y_WTjYllpgL0LJ.md │ │ │ │ │ ├── golden-signals@oX-bdPPjaHJnQKgUhDSF2.md │ │ │ │ │ ├── grant--revoke@o1WSsw-ZIaAb8JF3P0mfR.md │ │ │ │ │ ├── grep@cFtrSgboZRJ3Q63eaqEBf.md │ │ │ │ │ ├── grouping@uwd_CaeHQQ3ZWojbmtbPh.md │ │ │ │ │ ├── haproxy@V8_zJRwOX9664bUvAGgff.md │ │ │ │ │ ├── hash@2yWYyXt1uLOdQg4YsgdVq.md │ │ │ │ │ ├── helm@QHbdwiMQ8otxnVIUVV2NT.md │ │ │ │ │ ├── high-level-database-concepts@_BSR2mo1lyXEFXbKYb1ZG.md │ │ │ │ │ ├── htap@rHDlm78yroRrrAAcabEAl.md │ │ │ │ │ ├── import--export-using-copy@umNNMpJh4Al1dEpT6YkrA.md │ │ │ │ │ ├── indexes-and-their-usecases@Dhhyg23dBMyAKCFwZmu71.md │ │ │ │ │ ├── infrastructure-skills@zlqSX0tl7HD9C1yEGkvoM.md │ │ │ │ │ ├── installation-and-setup@FtPiBWMFhjakyXsmSL_CI.md │ │ │ │ │ ├── introduction@lDIy56RyC1XM7IfORsSLD.md │ │ │ │ │ ├── iotop@n8oHT7YwhHhFdU5_7DZ_F.md │ │ │ │ │ ├── joining-tables@Hura0LImG9pyPxaEIDo3X.md │ │ │ │ │ ├── keepalived@xk2G-HUS-dviNW3BAMmJv.md │ │ │ │ │ ├── lateral-join@fTsoMSLcXU1mgd5-vekbT.md │ │ │ │ │ ├── learn-sql@ANUgfkADLI_du7iRvnUdi.md │ │ │ │ │ ├── learn-to-automate@e5s7-JRqNy-OhfnjTScZI.md │ │ │ │ │ ├── lock-management@pOkafV7nDHme4jk-hA8Cn.md │ │ │ │ │ ├── logical-replication@rmsIw9CQa1qcQ_REw76NK.md │ │ │ │ │ ├── mailing-lists@8H7hJhGKxr1nrjkHv9Xao.md │ │ │ │ │ ├── migration-related-tools@3Lcy7kBKeV6hx9Ctp_20M.md │ │ │ │ │ ├── modifying-data@G2NKhjlZqAY9l32H0LPNQ.md │ │ │ │ │ ├── mvcc@-_ADJsTVGAgXq7_-8bdIO.md │ │ │ │ │ ├── normalization--normal-forms@Fcl7AD2M6WrMbxdvnl-ub.md │ │ │ │ │ ├── null@91eOGK8mtJulWRlhKyv0F.md │ │ │ │ │ ├── object-model@RoYP1tYw5dvhmkVTo1HS-.md │ │ │ │ │ ├── object-privileges@S20aJB-VuSpXYyd0-0S8c.md │ │ │ │ │ ├── olap@WI3-7hFAnJw5f7GIn-5kp.md │ │ │ │ │ ├── oltp@VekAMpcrugHGuvSbyPZVv.md │ │ │ │ │ ├── operators@nRJKfjW2UrmKmVUrGIfCC.md │ │ │ │ │ ├── package-managers@pEtQy1nuW98YUwrbfs7Np.md │ │ │ │ │ ├── patroni-alternatives@TZvZ_jNjWnM535ZktyhQN.md │ │ │ │ │ ├── patroni@mm0K_8TFicrYdZQvWFkH4.md │ │ │ │ │ ├── patterns--antipatterns@rnXcM62rgq3p6FQ9AWW1R.md │ │ │ │ │ ├── per-user-per-database-setting@msm4QCAA-MRVI1psf6tt3.md │ │ │ │ │ ├── perf-tools@wH447bS-csqmGbk-jaGqp.md │ │ │ │ │ ├── pev2@9RyMU36KEP__-RzTTz_eo.md │ │ │ │ │ ├── pg_basebackup@XYaVsj5_48CSnoTSGXBbN.md │ │ │ │ │ ├── pg_dump@XZ922juBJ8Om0WyGtSYT5.md │ │ │ │ │ ├── pg_dumpall@QmV-J6fPYQ5CcdGUkBs7y.md │ │ │ │ │ ├── pg_hbaconf@Y2W29M4piaQsTn2cpyR7Q.md │ │ │ │ │ ├── pg_probackup@Id_17Ya-NUvoXxijAZvmW.md │ │ │ │ │ ├── pg_restore@YSprRhPHkzV8SzDYpIVmp.md │ │ │ │ │ ├── pg_stat_activity@_NL5pGGTLNxCFx4axOqfu.md │ │ │ │ │ ├── pg_stat_statements@wLMGOUaULW7ZALRr-shTz.md │ │ │ │ │ ├── pgbackrest@5LLYxCj22RE6Nf0fVm8GO.md │ │ │ │ │ ├── pgbadger@V2iW8tJQXwsRknnZXoHGd.md │ │ │ │ │ ├── pgbouncer-alternatives@3V1PPIeB0i9qNUsT8-4O-.md │ │ │ │ │ ├── pgbouncer@aKQI7aX4bT_39bZgjmfoW.md │ │ │ │ │ ├── pgcenter@TytU0IpWgwhr4w4W4H3Vx.md │ │ │ │ │ ├── pgcluu@ISuU1lWH_zVDlCHnWXbf9.md │ │ │ │ │ ├── pgq@WCBWPubUS84r3tOXpnZT3.md │ │ │ │ │ ├── physical-storage-and-file-layout@gweDHAB58gKswdwfpnRQT.md │ │ │ │ │ ├── plpgsql@Ur23UVs_nXaltytF1WJD8.md │ │ │ │ │ ├── postgresql-anonymizer@Z2PuOmgOqScGFbhvrvrA1.md │ │ │ │ │ ├── postgresql-vs-nosql-databases@D0doJTtLu-1MmFOfavCXN.md │ │ │ │ │ ├── postgresql-vs-other-rdbms@IAKERTzTpTds5kZLMCapM.md │ │ │ │ │ ├── practical-patterns--antipatterns@AtZcMhy2Idmgonp5O8RSQ.md │ │ │ │ │ ├── procedures-and-functions@LiF2Yh818D-zEF58v5Fgr.md │ │ │ │ │ ├── processes--memory-architecture@v2J6PZT0fHvqA7GwlqBU7.md │ │ │ │ │ ├── prometheus@XmBeM01NAy-_nfyNdk9ZV.md │ │ │ │ │ ├── puppet@e39bceamU-lq3F2pmLz6v.md │ │ │ │ │ ├── queries@xVocG4LuFdtphwoOxiJTa.md │ │ │ │ │ ├── query-planner@hOPwVdIzesselbsI_rRxt.md │ │ │ │ │ ├── query-processing@Qk14b9WyeCp9RV9WAwojt.md │ │ │ │ │ ├── querying-data@BEJyz0ohCglDucxfyuAy4.md │ │ │ │ │ ├── rdbms-benefits-and-limitations@p3AmRr_y_ZBKzAU5eh7OU.md │ │ │ │ │ ├── recursive-cte@A1LGOqqaka0ILcYwybclP.md │ │ │ │ │ ├── red@qBkpTmfbyCv2L-OJW9pPI.md │ │ │ │ │ ├── relational-model@mDVbjdVN0spY7dI_8k1YW.md │ │ │ │ │ ├── relations@2hM2IPAnNYq-LlEbcFp2Z.md │ │ │ │ │ ├── replication@A3YTrZSUxNBq77iIrNdZ4.md │ │ │ │ │ ├── reporting-logging--statistics@507TY35b8iExakbBMrHgZ.md │ │ │ │ │ ├── resource-usage--provisioning--capacity-planning@SNnc8CIKuHUAEZaJ_qEar.md │ │ │ │ │ ├── resource-usage@yl3gxfQs4nOE0N7uGqR0d.md │ │ │ │ │ ├── reviewing-patches@Jy0G0ZnHPOM8hba_PbwuA.md │ │ │ │ │ ├── roles@l0lpaPy12JFCJ-RRYVSqz.md │ │ │ │ │ ├── row-level-security@bokFf6VNrLcilI9Hid386.md │ │ │ │ │ ├── rows@Rd3RLpyLMGQZzrxQrxDGo.md │ │ │ │ │ ├── salt@Q_B9dlXNMXZIRYQC74uIf.md │ │ │ │ │ ├── schema-design-patterns--anti-patterns@FDuiJyU1yWUQ9IsfS3CeZ.md │ │ │ │ │ ├── schemas@mF6qAlo2ULJ3lECG2m0h7.md │ │ │ │ │ ├── security@2Zg8R5gs9LMQOcOMZtoPk.md │ │ │ │ │ ├── sed@hVL6OtsXrE8BvjKpRjB-9.md │ │ │ │ │ ├── selinux@GvpIJF-eaGELwcpWq5_3r.md │ │ │ │ │ ├── set-operations@kOwhnSZBwIhIbIsoAXQ50.md │ │ │ │ │ ├── sharding-patterns@r6Blr7Q4wOnvJ-m6NvPyP.md │ │ │ │ │ ├── shell-scripts@-clI2RmfhK8F8beHULaIB.md │ │ │ │ │ ├── simple-stateful-setup@rNp3ZC6axkcKtAWYCPvdR.md │ │ │ │ │ ├── sp-gist@LT5qRETR3pAI8Tk6k5idg.md │ │ │ │ │ ├── sql-query-patterns--anti-patterns@G9DB1ZQjgXaHxJ4Lm6xGx.md │ │ │ │ │ ├── ssl-settings@EKwO6edtFnUw8cPCcVwKJ.md │ │ │ │ │ ├── storage-parameters@4VrT_K9cZZ0qE1EheSQy0.md │ │ │ │ │ ├── strace@C_cUfEufYeUlAdVfdUvsK.md │ │ │ │ │ ├── streaming-replication@MwLlVbqceQ-GTgPJlgoQY.md │ │ │ │ │ ├── subqueries@_Y-omKcWZOxto-xJka7su.md │ │ │ │ │ ├── sysstat@0hRQtRsteGDnKO5XgLF1R.md │ │ │ │ │ ├── system-catalog@lDuBFA7cEMnd7Cl9MDgnf.md │ │ │ │ │ ├── tables@W8NhR4SqteMLfso8AD6H8.md │ │ │ │ │ ├── temboard@aXG68inOu3trBWOmg9Yqx.md │ │ │ │ │ ├── tensor@xEu5n6U9-WKVxjlT5YUgx.md │ │ │ │ │ ├── top@pvj33qDiG3sSjtiW6sUra.md │ │ │ │ │ ├── transactions@ghgyAXJ72dZmF2JpDvu9U.md │ │ │ │ │ ├── transactions@yFG_hVD3dB_qK8yphrRY5.md │ │ │ │ │ ├── triggers@ps2KK88QA1n5udn2ochIn.md │ │ │ │ │ ├── tuples@vJhvgGwNV3JB-wWn_0gMb.md │ │ │ │ │ ├── use@QWi84EjdHw5ChYsuwUhPC.md │ │ │ │ │ ├── using-docker@5MjJIAcn5zABCK6JsFf4k.md │ │ │ │ │ ├── using-logical-replication@MVVWAf9Hk3Fom-wBhO64R.md │ │ │ │ │ ├── using-pg_ctl@a4j0Rs8Tl6-k9WP5zjaep.md │ │ │ │ │ ├── using-pg_ctlcluster@v3SoKmeCh6uxKW5GAAMje.md │ │ │ │ │ ├── using-pg_upgrade@cJYlZJ9f3kdptNrTlpMNU.md │ │ │ │ │ ├── using-systemd@P1Hm6ZlrhCRxbxOJkBHlL.md │ │ │ │ │ ├── vacuum-processing@dJzJP1uo4kVFThWgglPfk.md │ │ │ │ │ ├── vacuums@zoaqBP0Jbf0HpTH8Q3LkJ.md │ │ │ │ │ ├── wal-g@4gQSzH-WKFAvmkwlX_oyR.md │ │ │ │ │ ├── what-are-relational-databases@soar-NBWCr4xVKj7ttfnc.md │ │ │ │ │ ├── write-ahead-log@9VmQ-vN3nPyf1pTFIcj40.md │ │ │ │ │ ├── write-ahead-log@9sadNsbHLqejbRPHWhx-w.md │ │ │ │ │ ├── writing-patches@eQzMU_KyQmHJQ6gzyk0-1.md │ │ │ │ │ └── zabbix@z3VD68R2uyu1s-3giRxKr.md │ │ │ │ ├── faqs.astro │ │ │ │ ├── migration-mapping.json │ │ │ │ ├── postgresql-dba.json │ │ │ │ └── postgresql-dba.md │ │ │ ├── product-manager/ │ │ │ │ ├── content/ │ │ │ │ │ ├── ab-testing@V3yGVN7z_ihLkScO0_92_.md │ │ │ │ │ ├── ab-testing@Ws7IFrHQNoBjLE2Td2xIZ.md │ │ │ │ │ ├── active-listening@FwYc1942Z0_KYih0BQ1CL.md │ │ │ │ │ ├── advanced-analysis@9y_I41kJhkmyBJjiTw8Xd.md │ │ │ │ │ ├── agile-methodology@sAu4Gr1hg8S4jAV0bOSdY.md │ │ │ │ │ ├── aha@dr5BLjsZXk50R7vp3cMsu.md │ │ │ │ │ ├── ai-in-product-mgmt@H7sf23kwv73XjnFCdKHPi.md │ │ │ │ │ ├── alignment--buy-in@D5GXDeApGwjmLG2-KF2pr.md │ │ │ │ │ ├── amplitude@Z5oorppEJ0ydvwMXSlk1J.md │ │ │ │ │ ├── analytics-tools@lJ_7-oYaFWST8aBd5lIgM.md │ │ │ │ │ ├── backlog-management@lq5Hl1ZXBQRRI_4ywn7yA.md │ │ │ │ │ ├── baseline@GPRqshiha8Pi4a4ImW8-5.md │ │ │ │ │ ├── blue-ocean-strategy@gjdCSm_jZmG_q6YjG_8Qu.md │ │ │ │ │ ├── brainstorming-techniques@69IgqluiW9cVfezSIKInD.md │ │ │ │ │ ├── brainwriting@0emyqhl028_M6tdilfFC3.md │ │ │ │ │ ├── building-and-leading-teams@MP-jZtofXCufnvtSldxqU.md │ │ │ │ │ ├── business@LPiCtvd00hWsCAefTIUxy.md │ │ │ │ │ ├── cac-customer-acquisition-cost@kVd36zDyjLvVG2Nw9gsXi.md │ │ │ │ │ ├── capabilities@8srsCEv55zh1y4gsp-rCO.md │ │ │ │ │ ├── case-studies@JhhjMPTNb646aQKlS_cji.md │ │ │ │ │ ├── churn-rate@jRWVaNpTfBXVjpi4WNT7H.md │ │ │ │ │ ├── cohort-analysis@APdoU9kzHEqpUgKGKfyp9.md │ │ │ │ │ ├── communicating-the-roadmap@NjLt_B_kV7FdnkOomqayx.md │ │ │ │ │ ├── communication-skills@5-4MXlRjH-4PlF2giZpVL.md │ │ │ │ │ ├── communication-techniques@XGnJUxZu7_WnPkklvROon.md │ │ │ │ │ ├── communication-tools@IAta7OX7pAxUzkFdHibY9.md │ │ │ │ │ ├── competetive-advantage@tTUp4GQHvjLZYkySasQFE.md │ │ │ │ │ ├── competitive-analysis@PBDlYIyS8LAyPE6tV-kU7.md │ │ │ │ │ ├── competitive-strategy@qy_IXzenBOEVBMvVlXPaY.md │ │ │ │ │ ├── conflict-resolution@sQvkXvluZHgTIGS7W3Fj4.md │ │ │ │ │ ├── contingency-planning@ybq-zRDLvtTTl8X8GnRNf.md │ │ │ │ │ ├── continuous-roadmapping@qGvHqOSTPyVKll4mMVk7i.md │ │ │ │ │ ├── conversion-rate@avkgeNNVQOCE7dvEKFVZv.md │ │ │ │ │ ├── creating-a-roadmap@eiqV86PWizZPWsyqoBU5k.md │ │ │ │ │ ├── daily-standups@BzgGJbXIwQb0yR2ZMCmul.md │ │ │ │ │ ├── dark-launches@aCoVHIAZllwKckkkwExR7.md │ │ │ │ │ ├── data-driven-decision-making@eO7glnL0HixQYnoF3uvSW.md │ │ │ │ │ ├── dau-daily-active-users@g2EgVtqwQxLfjBjomUqcU.md │ │ │ │ │ ├── decline@yOve7g_05UMpXHcGpdZcW.md │ │ │ │ │ ├── defining-goals@n2AYdM2dlJfuZ97jXY49U.md │ │ │ │ │ ├── defining-value-proposition@1j2ZSo7UGnBgoLpYzsA5t.md │ │ │ │ │ ├── design-thinking@yPtxGBDEJkFBhF8ZgQUVH.md │ │ │ │ │ ├── development@5okUFVMuG6mjRki4fyCcF.md │ │ │ │ │ ├── difficult-conversations@iWCcvEEllfACoaXm5Ul5D.md │ │ │ │ │ ├── discord@e6gO1twjter9xWm14g9S9.md │ │ │ │ │ ├── discovery@vP4tfzP-hOiAsv4K4RsQy.md │ │ │ │ │ ├── emerging-market-trends@aDhSpLRZ6Sd8SnkcwtyLf.md │ │ │ │ │ ├── emotional-intelligence@gyNOziqf1VsfI2j-FaNZ_.md │ │ │ │ │ ├── ethnographic-research@VwI7plziVzwkp3KZd4466.md │ │ │ │ │ ├── execution@LhNgyNDeqCAD--dAzf6u8.md │ │ │ │ │ ├── feature-creep@GbFbURxIRD76kyR9vKfdg.md │ │ │ │ │ ├── feature-toggles@7BCnM9A9PwYqsLmcNVfvt.md │ │ │ │ │ ├── feedback-loops@kirIe5QsxruRUbWGfQtbD.md │ │ │ │ │ ├── finding-balance@xu8A_QKs6lXzKPMiifNF_.md │ │ │ │ │ ├── five-forces-analysis@8CW_clQsc6SC4piQ3__0I.md │ │ │ │ │ ├── future-constraints@wuqZntn1ivkr9AV_09zYX.md │ │ │ │ │ ├── go-to-market-strategy@53XS2zKdK6IDdOP07yiT7.md │ │ │ │ │ ├── grooming-sessions@sqxgqfxWMluhWtCWN8spG.md │ │ │ │ │ ├── growth-hacking@wWWcIfPDGB92ed-1kV-uj.md │ │ │ │ │ ├── growth-strategies@4-w4BpDh4dpmnU9qfjqbU.md │ │ │ │ │ ├── growth@ke5vl9p3ouupjVmgU5IKw.md │ │ │ │ │ ├── heap@xas-t2sAKmJNfb0-Zcpwy.md │ │ │ │ │ ├── identify-partners@1M6WpW1wbJcXMb3nf10U2.md │ │ │ │ │ ├── identifying-market-needs@LkDLk6DsEvbFXZPGOhD0C.md │ │ │ │ │ ├── identifying-risks@oO-ujKApmpoQdkPEkOQG7.md │ │ │ │ │ ├── identifying-stakeholders@Cryuk9pCI3y78HDGv6TMK.md │ │ │ │ │ ├── influencing-without-authority@CMge123Tm9DrZ31LvipLD.md │ │ │ │ │ ├── interaction-design@S_-9msr3vGZgOQ36zErnf.md │ │ │ │ │ ├── internationalization@lIdogd1DAzCo1ct7cdvYD.md │ │ │ │ │ ├── interpersonal@O5Ipa7PHeXUNEjQ6Mla7Y.md │ │ │ │ │ ├── introduction@9vy4uIoykk2zSSyIok4_S.md │ │ │ │ │ ├── introduction@GoYEAU_lZ186M3IJY48O6.md │ │ │ │ │ ├── iterative-process@1HytzY1KRYIQWoQa5FMwY.md │ │ │ │ │ ├── jira@EPQ4-cKr-RqJ457XniP6w.md │ │ │ │ │ ├── job-stories@B9fgJmzVViaq7dvSuEglb.md │ │ │ │ │ ├── kanban-basics@kJ2HQFEsnc5yISU8d9Lla.md │ │ │ │ │ ├── key-product-metrics@RfllpwFxWBeHF29oUwGo_.md │ │ │ │ │ ├── key-skills@5W-3jh1-4qSU5kagrWv9z.md │ │ │ │ │ ├── launch-planning@PbhuFKsVNO6xGJHqXCwFl.md │ │ │ │ │ ├── leadership-and-influence@WyKJxhfnbz6jx-Tvg40_j.md │ │ │ │ │ ├── linear@PIIGfDN6t8H6tXZuKuE04.md │ │ │ │ │ ├── looker@y8Ys_WfPXLVfJngOLryGR.md │ │ │ │ │ ├── ltv-lifetime-value@DB-dN0bfG29Xv_a8iV8Yg.md │ │ │ │ │ ├── managing-partnerships@vXnf1AcMidLww5EypChWk.md │ │ │ │ │ ├── managing-stakeholders@X-2mVBut_pn4o_fEGVrib.md │ │ │ │ │ ├── market-analysis@Eusp5p6gNIxtU_yVvOkmu.md │ │ │ │ │ ├── market-segmentation@3MYjrnd6h2ZlcfaXjUbkC.md │ │ │ │ │ ├── marketing-strategies@YYo_7lmTw7h74Y4J5pp-_.md │ │ │ │ │ ├── maturity@aUJTPvO9Eb1UOD0MIY4Mf.md │ │ │ │ │ ├── mau-monthly-active-users@Sbi5Y72nU_B1Jk6xNp17u.md │ │ │ │ │ ├── mind-mapping@beca7sTxYY06RwNn5jpZM.md │ │ │ │ │ ├── minimum-viable-product-mvp@mm5yvAaROsbwDgQUfnqyl.md │ │ │ │ │ ├── mitigation-strategies@4gV80Qrd08_Y8oZB_hahV.md │ │ │ │ │ ├── ml-in-product-mgmt@rzrxYqFENQ3d0WpZv9-0Q.md │ │ │ │ │ ├── monitoring-and-controlling-risks@zJGg20NPStLPkeL5LKoGm.md │ │ │ │ │ ├── narrative@zS_CjYSTOIkJZn-oUEvgh.md │ │ │ │ │ ├── north-star-metric@MYKZIDHSIXr-69BdtFcNR.md │ │ │ │ │ ├── notion@dk1YzX84UUe_es1x-dfp2.md │ │ │ │ │ ├── outcome-based-roadmaps@1uAfy3ISLKGmLirvIfzfE.md │ │ │ │ │ ├── phased-rollouts@8_VCWpSZkRWmsD1_thMYS.md │ │ │ │ │ ├── platform-thinking@EEi56Ww04QbuF2I7B7xW8.md │ │ │ │ │ ├── portfolio-management@BGtxI9CHtJfhRMdUEIfWa.md │ │ │ │ │ ├── positioning@YPqdrZguH0ArEFSe-VwKS.md │ │ │ │ │ ├── predictive-analytics@YsDt5I0prvYeaFfn4_lpx.md │ │ │ │ │ ├── predictive-analytics@h5N51_YgjaTHhPUHxkqQR.md │ │ │ │ │ ├── principles-of-ux-design@TwL-EqDorSgUpBYr4O4rf.md │ │ │ │ │ ├── prioritising-features@k7Zv7IS9y-jkI_zGrBQG3.md │ │ │ │ │ ├── prioritization-techniques@Slb0P_LVdl7-GzUqbO33c.md │ │ │ │ │ ├── problem-framing@aBJUQvgXmvpLPOhpDTn7l.md │ │ │ │ │ ├── product-board@70yvt_oKcadnjZgg8FtAh.md │ │ │ │ │ ├── product-development-lifecycle@kB8e26BUm8BpTY1_O3N3_.md │ │ │ │ │ ├── product-identification@fmpJB_14CYn7PVuoGZdoz.md │ │ │ │ │ ├── product-requirements@0tJ7zlgOIaioCMmVavfqz.md │ │ │ │ │ ├── product-roadmap@gS3ofDrqDRKbecIskIyGi.md │ │ │ │ │ ├── product-vs-project-management@V-IeFB9S2tToxANHIzpMs.md │ │ │ │ │ ├── project-management-tools@Yjxk2gUi5jQONeLzBaeJz.md │ │ │ │ │ ├── proposition@ZCTSbMHAMSaOxlqaJImzr.md │ │ │ │ │ ├── qualitative-risk-assessment@KXadmIkKJM0XLV4Qz0Stj.md │ │ │ │ │ ├── quantitative-risk-assessment@g0sBLcG8kEfeHHtsJSb4i.md │ │ │ │ │ ├── reference-materials@uXseNTJlteD6Fgi1bzQB4.md │ │ │ │ │ ├── release-strategies@VqNK1rNAnr_yvi_a0YZEs.md │ │ │ │ │ ├── remote-stakeholders@QGAb7dQM052XPA0Ll-R1P.md │ │ │ │ │ ├── remote-user-testing@5fze1aw1in3Gp3K31bvin.md │ │ │ │ │ ├── retention-rate@mfG1UheUwzO8dbS4oglgo.md │ │ │ │ │ ├── retrospectives@AkKl7PrIPrIqXnss88v18.md │ │ │ │ │ ├── risk-assessment@0uRTNYMwTU9JzvIWSvDSm.md │ │ │ │ │ ├── risk-audits@ao2uUq_UZWtB-LRKH1x40.md │ │ │ │ │ ├── risk-identification-techniques@0zRGIArMUe9xVDSKfnoHZ.md │ │ │ │ │ ├── risk-mitigation@A-srndVB0olGq0qkApnwi.md │ │ │ │ │ ├── risk-monitoring-tools@S2w72SRx-9QvRO7RNBlKZ.md │ │ │ │ │ ├── risk-register@WBnLicFo9p2zm57pyXciI.md │ │ │ │ │ ├── roadmapping-tools@XG-QBb--HXL-1r-jInYDN.md │ │ │ │ │ ├── roles-and-responsibilities@Dx6ee8P_Agpw1MLKlAPGI.md │ │ │ │ │ ├── scaling-products@4i_kX9oZunMBFYevu7lyi.md │ │ │ │ │ ├── scamper@uLSPKcypF06AhzoeNVtDk.md │ │ │ │ │ ├── scrum-basics@WNCVmFrpHW7rMaIzlLaXl.md │ │ │ │ │ ├── selection@toc34xxsB_tnHtekk1UmN.md │ │ │ │ │ ├── service-design@lxU25qxxgxnNF3c3kdZxz.md │ │ │ │ │ ├── showing-impact@XxeB3t8MjTbUzZj2hdKF3.md │ │ │ │ │ ├── slack@UdOJDzkDP_R3E5f_IltYh.md │ │ │ │ │ ├── solved-constraints@eKJ2XfDxu0NAKA932tbzy.md │ │ │ │ │ ├── sprint-planning@bu-xm-L1XJgIPAFs2PieE.md │ │ │ │ │ ├── stakeholder-engagement@rvqZRvbt73BY5X98dA3Sq.md │ │ │ │ │ ├── stakeholder-mapping@bHA-9gQhvjh40Cy8jbI9u.md │ │ │ │ │ ├── statement@DnKHDm0TZ7QQUyrhPdqkV.md │ │ │ │ │ ├── strategic-partners@jWU_odHoQYk3GKCPoRV2n.md │ │ │ │ │ ├── strategic-thinking@m46lX4dUHik_BSHQwaU2l.md │ │ │ │ │ ├── surveys-and-questionnaires@a_5AyOKAgcg0rArZfapA_.md │ │ │ │ │ ├── target@tmlFCmEuYpcUnt8VvVP9R.md │ │ │ │ │ ├── teams@z72akk5E5XjEuLraS9Gug.md │ │ │ │ │ ├── timeframe@E1yPzEhssJWMDLeSiL4cj.md │ │ │ │ │ ├── trello@SD98_s1ET_j2eIIKmcKRc.md │ │ │ │ │ ├── trend@s8mK1llA32B69_rzOwcwN.md │ │ │ │ │ ├── triz-theory-of-inventive-problem-solving@DEwte-c-jxAFpiaBXAPSO.md │ │ │ │ │ ├── usability-testing@1uXjKKvOKqpO50m1pM627.md │ │ │ │ │ ├── user-interviews@5kt8AkCsdAdlBmsKOkKFH.md │ │ │ │ │ ├── user-personas@0y8F9x6MhApQkS1VhS8Dx.md │ │ │ │ │ ├── user-research@8LAy6uBfrdtrjF8ygAGoo.md │ │ │ │ │ ├── user-stories@kN-UfAbQ8j7g0jDdqWK55.md │ │ │ │ │ ├── user-story-mapping@3JY85Tu40ABy9XfoliaqE.md │ │ │ │ │ ├── user-testing@v3hKowLMBVq9eCXkUhrDZ.md │ │ │ │ │ ├── usp-unique-selling-point@tKDlfVvNym_OIqkommiJ8.md │ │ │ │ │ ├── ux--ui-design@-lFYy5W1YqWuTiM3QRF4k.md │ │ │ │ │ ├── validation@fK3ZaX7Amna1oa_T5axVk.md │ │ │ │ │ ├── value-proposition-canvas@kjKUrKdtCM95VinlluKDS.md │ │ │ │ │ ├── value-proposition@6OjKcLbUZVJdUDC7if0Uy.md │ │ │ │ │ ├── value-vs-features@0AQj2F1n8VKHBwuF4ywrp.md │ │ │ │ │ ├── vision--mission@l-KrmCOKEfpLHq4j-9SoY.md │ │ │ │ │ ├── what-is-product-management@luk1vnpy0duneVjen8WzO.md │ │ │ │ │ ├── wireframing-and-prototyping@zwrmh-djneZ8HIqbaBOkN.md │ │ │ │ │ ├── working-with-engineering-teams@2r-NPGcROFmw-pd4rvsAJ.md │ │ │ │ │ └── writing-prds@0FqpBfvnkGN_oE2KSC-_8.md │ │ │ │ ├── faqs.astro │ │ │ │ ├── product-manager.json │ │ │ │ └── product-manager.md │ │ │ ├── prompt-engineering/ │ │ │ │ ├── content/ │ │ │ │ │ ├── agents@Pw5LWA9vNRY0N2M0FW16f.md │ │ │ │ │ ├── ai-red-teaming@Wvu9Q_kNhH1_JlOgxAjP6.md │ │ │ │ │ ├── ai-vs-agi@Sj1CMZzZp8kF-LuHcd_UU.md │ │ │ │ │ ├── anthropic@V8pDOwrRKKcHBTd4qlSsH.md │ │ │ │ │ ├── automatic-prompt-engineering@diHNCiuKHeMVgvJ4OMwVh.md │ │ │ │ │ ├── calibrating-llms@P5nDyQbME53DOEfSkcY6I.md │ │ │ │ │ ├── chain-of-thought-cot-prompting@weRaJxEplhKDyFWSMeoyI.md │ │ │ │ │ ├── context-window@b-Xtkv6rt8QgzJXSShOX-.md │ │ │ │ │ ├── contextual-prompting@5TNK1KcSzh9GTKiEJnM-y.md │ │ │ │ │ ├── fine-tuning-vs-prompt-engg@Ke5GT163k_ek9SzbcbBGE.md │ │ │ │ │ ├── frequency-penalty@YIVNjkmTOY61VmL0md9Pj.md │ │ │ │ │ ├── google@o-6UKLZ6oCRbAKgRjH2uI.md │ │ │ │ │ ├── hallucination@SWDa3Su3VS815WQbvvNsa.md │ │ │ │ │ ├── introduction@jrH1qE6EnFXL4fTyYU8gR.md │ │ │ │ │ ├── llm-self-evaluation@CvV3GIvQhsTvE-TQjTpIQ.md │ │ │ │ │ ├── llm@pamV5Z8DRKk2ioZbg6QVK.md │ │ │ │ │ ├── llms-and-how-they-work@74JxgfJ_1qmVNZ_QRp9Ne.md │ │ │ │ │ ├── max-tokens@vK9Gf8dGu2UvvJJhhuHG9.md │ │ │ │ │ ├── meta@Td2YzDFT4LPGDw8JMmQSQ.md │ │ │ │ │ ├── model-weights--parameters@yfsjW1eze8mWT0iHxv078.md │ │ │ │ │ ├── one-shot--few-shot-prompting@Iufv_LsgUNls-Alx_Btlh.md │ │ │ │ │ ├── openai@Yb5cQiV2ETxPbBYCLOpt2.md │ │ │ │ │ ├── output-control@wSf7Zr8ZYBuKWX0GQX6J3.md │ │ │ │ │ ├── presence-penalty@WpO8V5caudySVehOcuDvK.md │ │ │ │ │ ├── prompt-debiasing@0H2keZYD8iTNyBgmNVhto.md │ │ │ │ │ ├── prompt-ensembling@HOqWHqAkxLX8f2ImSmZE7.md │ │ │ │ │ ├── prompt-injection@6W_ONYREbXHwPigoDx1cW.md │ │ │ │ │ ├── rag@gxydtFKmnXNY9I5kpTwjP.md │ │ │ │ │ ├── react-prompting@8Ks6txRSUfMK7VotSQ4sC.md │ │ │ │ │ ├── repetition-penalties@g8ylIg4Zh567u-E3yVVY4.md │ │ │ │ │ ├── role-prompting@XHWKGaSRBYT4MsCHwV-iR.md │ │ │ │ │ ├── sampling-parameters@JgigM7HvmNOuKnp60v1Ce.md │ │ │ │ │ ├── self-consistency-prompting@1EzqCoplXPiHjp9Z-vqn-.md │ │ │ │ │ ├── step-back-prompting@2MboHh8ugkoH8dSd9d4Mk.md │ │ │ │ │ ├── stop-sequences@v3CylRlojeltcwnE76j8Q.md │ │ │ │ │ ├── structured-outputs@j-PWO-ZmF9Oi9A5bwMRto.md │ │ │ │ │ ├── system-prompting@fWo39-hehRgwmx7CF36mM.md │ │ │ │ │ ├── temperature@iMwg-I76-Tg5dhu8DGO6U.md │ │ │ │ │ ├── tokens@NPcaSEteeEA5g22wQ7nL_.md │ │ │ │ │ ├── top-k@FF8ai1v5GDzxXLQhpwuPj.md │ │ │ │ │ ├── top-p@-G1U1jDN5st1fTUtQmMl1.md │ │ │ │ │ ├── tree-of-thoughts-tot-prompting@ob9D0W9B9145Da64nbi1M.md │ │ │ │ │ ├── what-is-a-prompt@i4ijY3T5gLgNz0XqRipXe.md │ │ │ │ │ ├── what-is-prompt-engineering@43drPbTwPqJQPyzwYUdBT.md │ │ │ │ │ ├── xai@3wshuH7_DXgbhxsLzzI4D.md │ │ │ │ │ └── zero-shot-prompting@GRerL9UXN73TwpCW2eTIE.md │ │ │ │ ├── faqs.astro │ │ │ │ ├── prompt-engineering.json │ │ │ │ └── prompt-engineering.md │ │ │ ├── python/ │ │ │ │ ├── content/ │ │ │ │ │ ├── aiohttp@IBVAvFtN4mnIPbIuyUvEb.md │ │ │ │ │ ├── arrays-and-linked-lists@OPD4WdMO7q4gRZMcRCQh1.md │ │ │ │ │ ├── arrays-and-linked-lists@kIuns7FOwapwtFLKo1phQ.md │ │ │ │ │ ├── asynchrony@Mow7RvropbC4ZGDpcGZmw.md │ │ │ │ │ ├── basic-syntax@6xRncUs3_vxVbDur567QA.md │ │ │ │ │ ├── binary-search-tree@7NZlydjm4432vLY1InBS7.md │ │ │ │ │ ├── binary-search-tree@uJIqgsqUbE62Tyo3K75Qx.md │ │ │ │ │ ├── black@DS6nuAUhUYcqiJDmQisKM.md │ │ │ │ │ ├── builtin@08XifLQ20c4FKI_4AWNBQ.md │ │ │ │ │ ├── classes@AqwzR8dZKLQIoj_6KKZ3t.md │ │ │ │ │ ├── code-formatting@0F0ppU_ClIUKZ23Q6BVZp.md │ │ │ │ │ ├── common-packages@_94NrQ3quc4t_PPOsFSN0.md │ │ │ │ │ ├── concurrency@u4nRzWQ4zhDFMOrZ2I_uJ.md │ │ │ │ │ ├── conda@uh67D1u-Iv5cZamRgFEJg.md │ │ │ │ │ ├── conditionals@NP1kjSk0ujU0Gx-ajNHlR.md │ │ │ │ │ ├── context-manager@KAXF2kUAOvtBZhY8G9rkI.md │ │ │ │ │ ├── custom@l7k0qTYe42wYBTlT2-1cy.md │ │ │ │ │ ├── data-structures--algorithms@VJSIbYJcy2MC6MOFBrqXi.md │ │ │ │ │ ├── decorators@pIluLJkySqn_gI_GykV6G.md │ │ │ │ │ ├── dictionaries@bc9CL_HMT-R6nXO1eR-gP.md │ │ │ │ │ ├── django@x1V8GjdjANTnhP6YXMbgC.md │ │ │ │ │ ├── doctest@aVclygxoA9ePU5IxaORSH.md │ │ │ │ │ ├── encapsulation@3dC2o3WXdx4plFhDP2Vqk.md │ │ │ │ │ ├── exceptions@fNTb9y3zs1HPYclAmu_Wv.md │ │ │ │ │ ├── fast-api@XeQSmvAsGSTi8dd7QVHxn.md │ │ │ │ │ ├── file-handling@Nf3kRDSl_vas6QPXG7eVa.md │ │ │ │ │ ├── flask@HKsGyRzntjh1UbRZSWh_4.md │ │ │ │ │ ├── functions-builtin-functions@-DJgS6l2qngfwurExlmmT.md │ │ │ │ │ ├── generator-expressions@jnLIVRrWxcX3yq3Op91Vr.md │ │ │ │ │ ├── gevent@InUJIGmTnf0X4cSoLuCEQ.md │ │ │ │ │ ├── gil@bS7WeVKm2kEElu3sBKcIC.md │ │ │ │ │ ├── hash-tables@0-m8jVuDKE8hX1QorKGTM.md │ │ │ │ │ ├── hash-tables@DG4fi1e5ec2BVckPLsTJS.md │ │ │ │ │ ├── hashmaps@DG4fi1e5ec2BVckPLsTJS.md │ │ │ │ │ ├── heaps-stacks-and-queues@0NlRczh6ZEaFLlT6LORWz.md │ │ │ │ │ ├── heaps-stacks-and-queues@rSfg5M65LyZldhrdWOr90.md │ │ │ │ │ ├── inheritance@S0FLE70szSVUPI0CDEQK7.md │ │ │ │ │ ├── iterators@aB1LSQjDEQb_BxueOcnxU.md │ │ │ │ │ ├── lambdas@aWHgAk959DPUZL46CeRiI.md │ │ │ │ │ ├── learn-a-framework@0-ShORjGnQlAdcwjtxdEB.md │ │ │ │ │ ├── learn-the-basics@GISOFMKvnBys0O0IMpz2J.md │ │ │ │ │ ├── learn-the-basics@JDDG4KfhtIlw1rkNCzUli.md │ │ │ │ │ ├── list-comprehensions@4gtmtYWYRWqwLdZRL0XMg.md │ │ │ │ │ ├── lists@UT_SR7G-LYtzqooWrEtF1.md │ │ │ │ │ ├── loops@Dvy7BnNzK55qbh_SgOk8m.md │ │ │ │ │ ├── methods-dunder@zAS4YiEJ6VPsyABrkIG8i.md │ │ │ │ │ ├── methods@zAS4YiEJ6VPsyABrkIG8i.md │ │ │ │ │ ├── modules@274uk28wzxn6EKWQzLpHs.md │ │ │ │ │ ├── multiprocessing@HSY5OUc_M5S6OcFXPRtkx.md │ │ │ │ │ ├── mypy@gIcJ3bUVQXqO1Wx4gUKd5.md │ │ │ │ │ ├── nose@SSnzpijHLO5_l7DNEoMfx.md │ │ │ │ │ ├── object-oriented-programming@P_Di-XPSDITmU3xKQew8G.md │ │ │ │ │ ├── package-managers@qeCMw-sJ2FR4UxvU9DDzv.md │ │ │ │ │ ├── paradigms@4GU5HNi3W8yFkImVY9ZpW.md │ │ │ │ │ ├── pdm@xDgXISgVUMRHh9hu4h6Hl.md │ │ │ │ │ ├── pip@iVhQnp6hpgVZDNJ0XoVra.md │ │ │ │ │ ├── pipenv@IWq-tfkz-pSC1ztZl60vM.md │ │ │ │ │ ├── plotly-dash@7zcpXN3krnS3tMRWVNIVe.md │ │ │ │ │ ├── poetry@uXd2B01GVBEQNXQE8RATT.md │ │ │ │ │ ├── pydantic@W3VALz5evFo1qqkQbMN1R.md │ │ │ │ │ ├── pyenv@N5VaKMbgQ0V_BC5tadV65.md │ │ │ │ │ ├── pypi@1dfOTOGsOk5XE3bnZs8Ht.md │ │ │ │ │ ├── pyprojecttoml@GHKAY9gOykEbxkEeR30wL.md │ │ │ │ │ ├── pyramid@DHtskqATeAVKgaazdhXKD.md │ │ │ │ │ ├── pyre@9mFR_ueXbIB2IrkqU2s85.md │ │ │ │ │ ├── pyright@1q9HWgu9jDTK757hTNOmE.md │ │ │ │ │ ├── pytest@3FDwJpesfelEyJrNWtm0V.md │ │ │ │ │ ├── recursion@94KnPMQdNTOwQkUv37tAk.md │ │ │ │ │ ├── recursion@kLBgy_nxxjE8SxdVi04bq.md │ │ │ │ │ ├── regular-expressions@7t6mJBsaFMWPi7o9fbhhq.md │ │ │ │ │ ├── ruff@6cB0pvUO1-gvCtgqozP-Q.md │ │ │ │ │ ├── sanic@9RGpqsj9jHz0_-r7EvRcw.md │ │ │ │ │ ├── sets@soZFqivM3YBuljeX6PoaX.md │ │ │ │ │ ├── sorting-algorithms@YNptpfK9qv2ovmkUXLkJT.md │ │ │ │ │ ├── sorting-algorithms@vvTmjcWCVclOPY4f_5uB0.md │ │ │ │ │ ├── sphinx@maYNuTKYyZndxk1z29-UY.md │ │ │ │ │ ├── static-typing@1PXApuUpPmJjgi12cmWo4.md │ │ │ │ │ ├── testing@WQOYjuwKIWB2meea4JnsV.md │ │ │ │ │ ├── threading@UIx0XYaOgXXlYbbQtjiPq.md │ │ │ │ │ ├── topic-node@Iwr_DtqGn9kQTUBPJpplf.md │ │ │ │ │ ├── tornado@zey2C6BdzsHJAlb_K3qrP.md │ │ │ │ │ ├── tox@jPFOiwbqfaGshaGDBWb5x.md │ │ │ │ │ ├── tuples@i7xIGiXU-k5UIKHIhQPjE.md │ │ │ │ │ ├── type-casting@R9DQNc0AyAQ2HLpP4HOk6.md │ │ │ │ │ ├── typing@o1wi39VnjnFfWIC8XcuAK.md │ │ │ │ │ ├── unittest--pyunit@b4he_RO17C3ScNeUd6v2b.md │ │ │ │ │ ├── uv@p3Frfs6oxpuciUzeCEsvb.md │ │ │ │ │ ├── variable-scope@3RNy7Sp28d-NMx0Yh4bdx.md │ │ │ │ │ ├── variables-and-data-types@dEFLBGpiH6nbSMeR7ecaT.md │ │ │ │ │ ├── virtualenv@_IXXTSwQOgYzYIUuKVWNE.md │ │ │ │ │ ├── working-with-strings@Sg5w8zO2Ji-uDJKEoWey9.md │ │ │ │ │ └── yapf@tsh_vbhzKz1-H9Vh69tsK.md │ │ │ │ ├── faqs.astro │ │ │ │ ├── migration-mapping.json │ │ │ │ ├── python.json │ │ │ │ └── python.md │ │ │ ├── qa/ │ │ │ │ ├── content/ │ │ │ │ │ ├── accessibility-testing@zGzpjxz3nvVH9Eu3NOPbk.md │ │ │ │ │ ├── accessibility-tests@mmDIqSD6MU3ZhWREGI5E2.md │ │ │ │ │ ├── agile-model@47NXgbc1OTGE06qXxlQoh.md │ │ │ │ │ ├── ajax@jn02FD5hjhZFVWaJjjNN3.md │ │ │ │ │ ├── allure@jaHOo-vZGjTnABxQKMT3_.md │ │ │ │ │ ├── appium@UIKUiCfSw5MkrRJZ3Ah3x.md │ │ │ │ │ ├── artillery@j1DYOQbIUT1tw_9WIPBkE.md │ │ │ │ │ ├── assembla@xLPE9CqqiYz0miMFI3ThY.md │ │ │ │ │ ├── atdd@isNJ0To1bBJvn899DITei.md │ │ │ │ │ ├── atlassian@wVqbs8Rh0WjLQqJZ0XiF0.md │ │ │ │ │ ├── attack-vectors@x3HEti8-xF9Mxe5ELBM9T.md │ │ │ │ │ ├── authentication--authorization@75-XdVA4BL6UrcvpC9grx.md │ │ │ │ │ ├── axe@_4jJ8YQeLcaT-z38kxRRR.md │ │ │ │ │ ├── azure-devops-services@u0tKd7HZVN2gGv9Cz3jHz.md │ │ │ │ │ ├── backend-automation@mPaMQ5h8ZcXKOfcuSwB2-.md │ │ │ │ │ ├── bamboo@j4J5OhHEf7t-LVNkNVW3M.md │ │ │ │ │ ├── bdd@VQOrMKGC-dBJ7CzLclviT.md │ │ │ │ │ ├── bitbucket@4xlbvY7NS3cemSZsEQAkD.md │ │ │ │ │ ├── black-box-testing@2zfwE6uzGYc2qnvOZ47LB.md │ │ │ │ │ ├── browser--dev-tools@cHI05cf8fLh3XB1Bt6jNP.md │ │ │ │ │ ├── bugbug@wUq-qEIh-tazYhgQQUqGG.md │ │ │ │ │ ├── caching@qvlA7iIOvoWMXm5MCAysZ.md │ │ │ │ │ ├── chrome-devtools@Xadg2WZTz6Cc_Ir9FsbgY.md │ │ │ │ │ ├── ci--cd@-n2yAprKdWg3YVi2vp25d.md │ │ │ │ │ ├── circle-ci@z1kZkWTL_RRPZY59aWylU.md │ │ │ │ │ ├── compatibility@RD0vRC-OL2ReYLT1leJMs.md │ │ │ │ │ ├── csr-vs-ssr@-2RU50LUPwCQ8XRaMslY-.md │ │ │ │ │ ├── cypress@5cMhZ-7YMQ6ccs-AaIi-0.md │ │ │ │ │ ├── cypress@D7zGshmgwqWluF-W7OTWe.md │ │ │ │ │ ├── cypress@iQ7xwiA6xmbLyRIkI7tXM.md │ │ │ │ │ ├── datadog@Y2I_dcVZb4xZremXoajjx.md │ │ │ │ │ ├── delphix@V54fh772XfHHIFQoyMCOo.md │ │ │ │ │ ├── detox@gZnNHDjFMI003Od7u2RNa.md │ │ │ │ │ ├── drone@3oDyxhhbCCqxuCh1sT9VC.md │ │ │ │ │ ├── email-testing@G-F6jQTOAZ2kQ36F-VrBB.md │ │ │ │ │ ├── espresso@stMeB1U3SfuefZ-yS8wGF.md │ │ │ │ │ ├── exploratory-testing@2h6mJeIFCU72J7aggTvnQ.md │ │ │ │ │ ├── frontend-automation@hU5OCnEe3tG206xuGsVFd.md │ │ │ │ │ ├── functional-testing@o4xmFhw_ilWdhpCiEotck.md │ │ │ │ │ ├── gatling@J1Yx1VcO20Lc3r3PdGpUW.md │ │ │ │ │ ├── ghost-inspector@mX7bNNP7WjFdlsRK6qIgy.md │ │ │ │ │ ├── git@WrqKdOTRUiOnc1aIhTZeB.md │ │ │ │ │ ├── github@v4gjV1qolrFXdESrY9bzG.md │ │ │ │ │ ├── gitlab-ci@iW3oaTl7c3a1kNlCKy-13.md │ │ │ │ │ ├── gitlab@RfwyTgwfb_xu5H9N-8_s9.md │ │ │ │ │ ├── gmail-tester@mIM9ausl_tSUNPUerIfEr.md │ │ │ │ │ ├── grafana@8CztIu0BOPZZRZsqR9asW.md │ │ │ │ │ ├── gray-box-testing@ZmWEG7Wu-h7bZe6pGxqDg.md │ │ │ │ │ ├── headless-chrome@JO--NVMs3saUNjh3mcd7z.md │ │ │ │ │ ├── headless-fox@ryoSezFNeiunCAZygCbaQ.md │ │ │ │ │ ├── headless-testing@Pm-Wx7Z3jCUFcafetsQYi.md │ │ │ │ │ ├── html-css-javascript@pYkfl-4gMHRj9wIeH8RTP.md │ │ │ │ │ ├── html-unit@-Sf7DLr8Ywoorrmsx3bfd.md │ │ │ │ │ ├── integration-testing@a_vwz-onn6QEoc27N6oBc.md │ │ │ │ │ ├── jasmine@HP55XWH18THmCNjCq-gBl.md │ │ │ │ │ ├── jenkins@3l2dkN1vBy9johFhAgZhT.md │ │ │ │ │ ├── jest@ZeJSeYs8fkZLQ-Pc3TqEM.md │ │ │ │ │ ├── jmeter@UeeDNUPZ61_HHgcaF9-__.md │ │ │ │ │ ├── junit@5bNdrymdzqL0VbTqWt8r2.md │ │ │ │ │ ├── k6@Jcp29_ASj9QZ_DjDBIapJ.md │ │ │ │ │ ├── kanban@cJyQx-LBcOL11nkK-P2JH.md │ │ │ │ │ ├── karateframework@8zXn8R9OGWTmreBpstj03.md │ │ │ │ │ ├── kibana@DCZyXcx8H2MTPcyKOhn2_.md │ │ │ │ │ ├── learn-the-fundamentals@m1wX27XBWKXZcTMH2U1xp.md │ │ │ │ │ ├── lighthouse@fkUxhrP3LhtIVgIP9Dxar.md │ │ │ │ │ ├── load--performance-testing@wTfvbS62eyitDT8pLsVhj.md │ │ │ │ │ ├── load-testing@wmMIL-0ytz7a3JygyB-wc.md │ │ │ │ │ ├── locust@QjAJIfSQe7WjbyYdGWSP8.md │ │ │ │ │ ├── mailinator@rFjtp3-cnaUmHiKfjPZBn.md │ │ │ │ │ ├── manage-your-testing@pH9h2tjO6raO_g4W8EgKq.md │ │ │ │ │ ├── manual-testing@daUEq4xlh4PIltSdiD4F2.md │ │ │ │ │ ├── mobile-automation@ITtBvrJ8dsW-5LQV8tWgO.md │ │ │ │ │ ├── mocking@Rj7bQRZZ5CGVO_b1Wwy8X.md │ │ │ │ │ ├── monitoring--logs@pJvijtG-a0vOq16EFu3Gr.md │ │ │ │ │ ├── new-relic@QnNUZQlQ2Jhv34daeIuW8.md │ │ │ │ │ ├── nightwatch@Ta1leBdu-Y9LryB-0U-CT.md │ │ │ │ │ ├── non-functional-testing@vYIEsjTKoO1ciypGIDlil.md │ │ │ │ │ ├── owasp-10@JR-MkszNvv96-S3DpyLeX.md │ │ │ │ │ ├── pager-duty@DJDegO78Elo83eHjq8IHN.md │ │ │ │ │ ├── performance-testing@bapKhjye4oWQxTEZ4fl_c.md │ │ │ │ │ ├── playwright@0TUq4KRbWTLsLuYI9sgi0.md │ │ │ │ │ ├── playwright@CHqfXjRRdS_c6XMnfVVx-.md │ │ │ │ │ ├── playwright@ZKOU7dWcrkKzTdt0wxwuO.md │ │ │ │ │ ├── postman--newman@X_nLwzc1QmShivEjfy6v9.md │ │ │ │ │ ├── project-management@ZqgeqqZTGA-y7jVNyPCt4.md │ │ │ │ │ ├── puppeteer@YKHlLKIlL-Y4ZtHTLfApu.md │ │ │ │ │ ├── puppeteer@sHyFCf7XQKxGxchaYxp2B.md │ │ │ │ │ ├── qa-mindset@vZv4Ow5bg_PbKoF557G9S.md │ │ │ │ │ ├── qa-wolf@414xO4PX9rU0f39aC7awu.md │ │ │ │ │ ├── qtest@FE_Wp2RPWFDHNaQIBLqH6.md │ │ │ │ │ ├── rca@BnZDIWW4rl_N1BhWhhTpO.md │ │ │ │ │ ├── regression-testing@XCeXiKvBblmDArfbWjDvw.md │ │ │ │ │ ├── repo-hosting-services@XoYsStVqfMeCHkGBlbRhD.md │ │ │ │ │ ├── reporting@MyAAsHteSr4JCPEpqjsy9.md │ │ │ │ │ ├── responsive-vs-adaptive@6cGPxfJ9ipij40hnmckxV.md │ │ │ │ │ ├── rest-assured@gECIgOii7C5MzilSbQP9t.md │ │ │ │ │ ├── robot@nf76o_NYm0-pSIVBFm7IH.md │ │ │ │ │ ├── runscope@iceaqeXRYXoGtagWn_B7b.md │ │ │ │ │ ├── safe@Tdj051ANlwwpo03X1hjbF.md │ │ │ │ │ ├── sanity-testing@Lve3xpC1FU91TQqoDOYv7.md │ │ │ │ │ ├── scrum@k3xPwDzA1WUEAwJ6-Q8PW.md │ │ │ │ │ ├── sdlc-delivery-model@Pb3QkhSCgRByJHuPxVAlU.md │ │ │ │ │ ├── secrets-management@YV6ST78AH4J0i2Rw9zhZj.md │ │ │ │ │ ├── security-testing@MahtxMJD3ETHfgk_PQabQ.md │ │ │ │ │ ├── security-testing@wsJXMvRbOTh_VXKhmhPmQ.md │ │ │ │ │ ├── selenium-ide@_3HfVT8IDlcgvUM4h6A0_.md │ │ │ │ │ ├── selenium@s3HMrqNEVogftCIOZYO61.md │ │ │ │ │ ├── sentry@H-2wWlKxD_Q1xVv99GlBj.md │ │ │ │ │ ├── smoke-testing@MVShii4LZiWW_gPTJzkty.md │ │ │ │ │ ├── soap-ui@eE9F3YviSpmgor6V5NMj5.md │ │ │ │ │ ├── stress-testing@skrOrieK1T0hHj_mJBNsW.md │ │ │ │ │ ├── swas-pwas-jamstack@_2IwBNhB5SqbPRxGhZyhq.md │ │ │ │ │ ├── swifttesting@Q6eNkuRI6dPa9X44pwrea.md │ │ │ │ │ ├── tdd@M78baCVYpsk7C6j-VPvPZ.md │ │ │ │ │ ├── teamcity@k3TBVtepeQEGzKGceDkPJ.md │ │ │ │ │ ├── test-cases-and-scenarios@ELnCFVRkO_s5qI_3Yzf5U.md │ │ │ │ │ ├── test-oracles@Zja25damM2vXMOYCyRZiq.md │ │ │ │ │ ├── test-planning@2U8WRKkuF-YCEWtpgTspF.md │ │ │ │ │ ├── test-prioritization@1976f2-opqLqV4ImPJlt0.md │ │ │ │ │ ├── testing-approaches@uFOVuenPyOKZGgoJXkwRZ.md │ │ │ │ │ ├── testing-data-management@3Ngw17hkW2HPs-OOaHzv-.md │ │ │ │ │ ├── testing-methodologies@7xGXlwgkcGV6BrDDDN71R.md │ │ │ │ │ ├── testing-techniques@gQLbDFP00itL260i1BiDe.md │ │ │ │ │ ├── testlink@leiCCxLJgXCpk1a--mE83.md │ │ │ │ │ ├── testrail@5Tn6Wtw8QE56LZ9BlRAmW.md │ │ │ │ │ ├── testrail@o4nkmhEDGwi8yE6DSwZi5.md │ │ │ │ │ ├── travis-ci@Rz1E97EQCxESu44dTQd5t.md │ │ │ │ │ ├── trello@dmfMp6ydjtHo6oKv97AzB.md │ │ │ │ │ ├── uat@Ls_pezva7_ZW2HHn7RvO4.md │ │ │ │ │ ├── unit-testing@PMO3M33U6RuvNdINvqIAA.md │ │ │ │ │ ├── v-model@zELjfWwfEYSc1YO8JLoJn.md │ │ │ │ │ ├── vegeta@LGZlOPNYQp0O_vapnciEI.md │ │ │ │ │ ├── verification-and-validation@vP76hqx-8Pri7sxdJDGV5.md │ │ │ │ │ ├── version-control-system@s8o5fXu3XHrMduh8snLwu.md │ │ │ │ │ ├── vulnerability-scanning@mKM27KrX1CEViOwz1EDtQ.md │ │ │ │ │ ├── waterfall@7h-Xfp2Foiyn7-pI0w7ft.md │ │ │ │ │ ├── wave@Lb1ctvpMcKIvsC0WQ5q43.md │ │ │ │ │ ├── webdriverio@cFhOYHgq1_MUSXjDI_fFN.md │ │ │ │ │ ├── webpage-test@igbQfUpmMSKYyAOVkSCLM.md │ │ │ │ │ ├── what-is-quality-assurance@JInFH3JRvAxjvpIFKjUiP.md │ │ │ │ │ ├── white-box-testing@y4QnZ2xQyc4x6Kr-eGBer.md │ │ │ │ │ ├── xp@4SLrNPD_No05CKeAVDFn5.md │ │ │ │ │ ├── youtrack@6bS1YjGJHARAUKTywYMU9.md │ │ │ │ │ ├── zephyr@aGvbxmZCHbbt9PgXL1ooJ.md │ │ │ │ │ └── zombiejs@m0gT774b59xsSJKrrjTxq.md │ │ │ │ ├── faqs.astro │ │ │ │ ├── migration-mapping.json │ │ │ │ ├── qa.json │ │ │ │ └── qa.md │ │ │ ├── react/ │ │ │ │ ├── content/ │ │ │ │ │ ├── animation@bRpeoo9zXrnZ2IHSI7JX4.md │ │ │ │ │ ├── api-calls@b4AP2OggxFAwsQtUwiUJJ.md │ │ │ │ │ ├── apollo@8nMbfGxe3STMbrAVcqHHh.md │ │ │ │ │ ├── ark-ui@kiCTo0U6VgNON8rv_Ktlj.md │ │ │ │ │ ├── astro@_HoZkE7FH-v3wI_722ZTF.md │ │ │ │ │ ├── axios@ElqWQClryfSYdL7P_mgYK.md │ │ │ │ │ ├── chakra-ui@uqphqAnlcJOLnwHZs5jWu.md │ │ │ │ │ ├── cli-tools@tU4Umtnfu01t9gLlnlK6b.md │ │ │ │ │ ├── component--libraries@thfnymb_UIiKxakKfiua5.md │ │ │ │ │ ├── component-lifecycle@8OBlgDRUg-CTgDXY-QHyO.md │ │ │ │ │ ├── components@79K4xgljcoSHkCYI1D55O.md │ │ │ │ │ ├── composition@4T59gdcwdXqj9kCuK7cfp.md │ │ │ │ │ ├── conditional-rendering@aE6XBgH23135_9QmD4ff2.md │ │ │ │ │ ├── context@10uL0r388lKh8pWYWqRZD.md │ │ │ │ │ ├── creating-custom-hooks@HX75SExuzR5AP7TQ94qid.md │ │ │ │ │ ├── css-modules@awoEhwPKjUcR84XGL6Som.md │ │ │ │ │ ├── cypress@zN7Ps1puD-YpHbKi1pHH8.md │ │ │ │ │ ├── error-boundaries@gMHMjsh0i8paLZUH5mDX3.md │ │ │ │ │ ├── events@Nex2HcTOYIbfqUzXyxSMY.md │ │ │ │ │ ├── formik@gr1CaLvL7tFOkIRywSsID.md │ │ │ │ │ ├── forms@KHcC5pFN3qLnsbPPKpYd2.md │ │ │ │ │ ├── framer-motion@H6-XGDjs4f-qbv13v5av0.md │ │ │ │ │ ├── frameworks@W-atg_Msa9uPLr6RXAKSb.md │ │ │ │ │ ├── functional-components@8mw4TxlLN4ZKAlLl-_NVV.md │ │ │ │ │ ├── gsock@y2dI1DVLWKAkv6VRpgaQa.md │ │ │ │ │ ├── headless-component-libraries@MnDgQq9Vcxsu3wDqv5uh2.md │ │ │ │ │ ├── high-order-components@zOENl96GUZRw2PP2KxIck.md │ │ │ │ │ ├── hooks-best-practices@mkyU0ug8MXxV4biHuOity.md │ │ │ │ │ ├── hooks@LbLQhonBqzxHU6B-L--Vq.md │ │ │ │ │ ├── jest@opa61u9gYgSpoPtxp58wu.md │ │ │ │ │ ├── jotai@yI6XiNW04EL78UL4lkVgd.md │ │ │ │ │ ├── jsx@WREBxWSNQDD_6fzpHL6CE.md │ │ │ │ │ ├── lists-and-keys@HeWVCPHqVnnbOn6zIim4K.md │ │ │ │ │ ├── material-ui@gy7eBxPOlwG8BvxHVLDQ9.md │ │ │ │ │ ├── mobile-applications@txARr3lgTvy-vJCj5zAb1.md │ │ │ │ │ ├── mobx@1kbrCI5JS0c9wbzxXpgFU.md │ │ │ │ │ ├── nextjs@HdWq9ue0JdwmwqSIN2OD_.md │ │ │ │ │ ├── panda-css@akVNUPOqaTXaSHoQFlkP_.md │ │ │ │ │ ├── playwright@g39P0c6M2sHNoUPs0m8tr.md │ │ │ │ │ ├── portals@DcDggX4OmmwvJGHwuV86t.md │ │ │ │ │ ├── props-vs-state@RFuy3Eho3mnW1GpP08BVw.md │ │ │ │ │ ├── radix-ui@XL9XOV2h0BAuA5cFcM5L_.md │ │ │ │ │ ├── react-aria@RvDfKoa_HIW3QDBfkPv3m.md │ │ │ │ │ ├── react-hook-form@_5ht0PAdVOJWPzTRS1mVg.md │ │ │ │ │ ├── react-native@NvXAq1vN2wpncdW-yTL4c.md │ │ │ │ │ ├── react-query@5EPmbiNdP_vhIXclv_GjV.md │ │ │ │ │ ├── react-router@-WjJBYCmRRj08n_9HxohY.md │ │ │ │ │ ├── react-router@jvp43wFkKlGQX2y7IxkbM.md │ │ │ │ │ ├── react-spring@WzoB5B6SdOI4Mzv6U51nY.md │ │ │ │ │ ├── react-testing-library@cQllxv7qGbRtM9O5llgN6.md │ │ │ │ │ ├── refs@_zNAOhFWMcWqP4oxNPCXF.md │ │ │ │ │ ├── relay@cLfM342sZfsCwmPPxQpEI.md │ │ │ │ │ ├── render-props@vdumdIglnouf1KyGIGZnc.md │ │ │ │ │ ├── rendering@0uiGsC5SWavNdlFqizkKe.md │ │ │ │ │ ├── routers@NStw6bi_pPB49K41BFSgo.md │ │ │ │ │ ├── rtk-query@h49-tjEkKcq7d7ikRHIOx.md │ │ │ │ │ ├── server-apis@SUeXDkmOLipdRP4fSrZOH.md │ │ │ │ │ ├── shadcn-ui@njKsYNkwTXPQ1NjlGKXab.md │ │ │ │ │ ├── state-management@I7_mX4h-Yywp1YyTJRKXI.md │ │ │ │ │ ├── suspense@_F3WMxhzaK9F8_-zHDDMF.md │ │ │ │ │ ├── swr@-ea1KsXEyz-4voHXklG_J.md │ │ │ │ │ ├── tailwind-css@KO3viVIJJREtxXxsocN7j.md │ │ │ │ │ ├── tanstack-query@5EPmbiNdP_vhIXclv_GjV.md │ │ │ │ │ ├── tanstack-router@zWL8VLx_g0SWubavJDs6i.md │ │ │ │ │ ├── testing@e_lwZ-a72-tAan2KDX6k3.md │ │ │ │ │ ├── topic-node@L7ySAxVypdIk3Mij_u3ch.md │ │ │ │ │ ├── types--validation@UNlvRp6k3_RDoTAAIEfJ1.md │ │ │ │ │ ├── typescript@ElgRwv5LSVg5FXGx-2K2s.md │ │ │ │ │ ├── urql@9M5jRu0pj8KMvg9f-2oqZ.md │ │ │ │ │ ├── usecallback@dgoDNDtW2_q9R9yhkXrcz.md │ │ │ │ │ ├── usecontext@D5_O-uElftYGQr_bTU_se.md │ │ │ │ │ ├── useeffect@8OnzX03hkZ9K9i__tjmFX.md │ │ │ │ │ ├── usememo@w3bNp7OkehI1gjx8NzlC8.md │ │ │ │ │ ├── usereducer@v48Mv0wQqjXbvy8x6gDjQ.md │ │ │ │ │ ├── useref@t_laNdMmdLApYszqXRdWg.md │ │ │ │ │ ├── usestate@FK59Zsm5ENA9g11XWCan_.md │ │ │ │ │ ├── usestate@YEpkbNzEMzS6wAKg85J_N.md │ │ │ │ │ ├── vite@y9ToYDix-koRbR6FLydFw.md │ │ │ │ │ ├── vitest@LULjhsPNONyI5912DKzPw.md │ │ │ │ │ ├── writing-css@DfrCkbD-HEHwLymv10zb5.md │ │ │ │ │ ├── zod@K3RZ8ESxWCpLKHePF87Hy.md │ │ │ │ │ └── zustand@nl5imPsdY2oEWlg-9TTuk.md │ │ │ │ ├── faqs.astro │ │ │ │ ├── migration-mapping.json │ │ │ │ ├── react.json │ │ │ │ └── react.md │ │ │ ├── react-native/ │ │ │ │ ├── content/ │ │ │ │ │ ├── accessibility@KoXTwQUqPt_ZhOFuaelny.md │ │ │ │ │ ├── activityindicator@hHFR59RrdMIWxcQe72qCs.md │ │ │ │ │ ├── animations@3NLcPO-hqQV1EacoPLVrv.md │ │ │ │ │ ├── appium@spTzJMS7cE0cNa7tVQhVQ.md │ │ │ │ │ ├── apple-app-store@1s9Y1dUtjpW9pu74ipX99.md │ │ │ │ │ ├── authentication@LRBHwYiT0Yyi18PwR49rc.md │ │ │ │ │ ├── button@kkH9H9Qh1FD7sLItoWw69.md │ │ │ │ │ ├── common-problem-sources@afwB90L-q2hIwrA0LtWbG.md │ │ │ │ │ ├── components@k9_hVOBd9ZmC4HLuAf46v.md │ │ │ │ │ ├── connectivity-status@k7uVPyhbPgvO6HxAfxxYZ.md │ │ │ │ │ ├── core-components@fnujIq6QAFB6bmTisuZ3T.md │ │ │ │ │ ├── create-expo-app@uLH9eo2G09wGO80XtFI5x.md │ │ │ │ │ ├── css-basics@SnF3xtzBh-x4Z_qUQUg7H.md │ │ │ │ │ ├── deeplinking@dckRzKDKj-mLB3-OxwjPh.md │ │ │ │ │ ├── detox@3m7ANLJvtx3zie4y86MNU.md │ │ │ │ │ ├── development-workflow@T4AhL9Zls2iNZMituGdtl.md │ │ │ │ │ ├── devtools@HHx3VSfV7xf6RqACrxjBf.md │ │ │ │ │ ├── enabling-fast-refresh@wWwaEdnvBsvj6jD9LJ4Jj.md │ │ │ │ │ ├── environment-setup@lNmddXrT8IHVtWobh3-oq.md │ │ │ │ │ ├── expo-file-system@9pvrXH5Drdsa1cr93UBdc.md │ │ │ │ │ ├── expo-secure-store@JgBfwmOgcVi_a96L5NGwr.md │ │ │ │ │ ├── expo-snack@9eOwhh2k59nvH-ztuDNjg.md │ │ │ │ │ ├── expo-sqlite@oK8z23a_CjcDjBJ843_Jn.md │ │ │ │ │ ├── expo-tradeoffs@zzOyoDcAQYkNNv07TIKeZ.md │ │ │ │ │ ├── expo@yW7nDDJbjmm8XKJI0hq3Q.md │ │ │ │ │ ├── fetch@f7KFPFS2-EA90pumYHM9T.md │ │ │ │ │ ├── file-extensions@LLANnVosxOUCPTtuBfNgu.md │ │ │ │ │ ├── flatlist@CYqLNGyOe9f9hVhbyUnTX.md │ │ │ │ │ ├── for-android@wMxTB8WgU6e-oYMtQFCDY.md │ │ │ │ │ ├── for-ios@b-1-JcwLSGMyH3gXS59lY.md │ │ │ │ │ ├── gesture-handling@xf7L5J42yQq3LE7lG2plp.md │ │ │ │ │ ├── google-play-store@D8T9cZ5zKi_KZDr9tDpCf.md │ │ │ │ │ ├── image@E7N8tSg2amZW-vc-X46JU.md │ │ │ │ │ ├── imagebackground@GFGhnx5xUer2DdRI-SO4D.md │ │ │ │ │ ├── in-app-developer-menu@tOt_vvmnBtOUbgokmVa5P.md │ │ │ │ │ ├── interactions@GYdz9a1yLiewAeMRSyfLr.md │ │ │ │ │ ├── introduction@JfXwzkN29UGz17FYHHE3A.md │ │ │ │ │ ├── javascript-basics@1oUJXtHGQ29ZZU9sxwGo2.md │ │ │ │ │ ├── jest@06gsRokwjxVa2xyLY4qAb.md │ │ │ │ │ ├── jsx@s5YKenJY2Xv_PZBSxegEm.md │ │ │ │ │ ├── keyboardavoidingview@8bn1PFd9h0ek6_T-cl1cS.md │ │ │ │ │ ├── layouts--flexbox@e-r3tuRZ3PzhFegES0oOm.md │ │ │ │ │ ├── learn-the-pre-requisites@cSXsu17F1Oy34Wp6J-N3C.md │ │ │ │ │ ├── listings@x-OZCZcX6uhN3Yr5BAATn.md │ │ │ │ │ ├── listviews@h3ypxGxeHDCTxURHg6D2d.md │ │ │ │ │ ├── logbox@Tz-bRjQVkZedphelhAlWM.md │ │ │ │ │ ├── metro-bundler@VhSEH_RoWFt1z2lial7xZ.md │ │ │ │ │ ├── modal@V34mZCkpoT49o-74XoATS.md │ │ │ │ │ ├── networking@7GBV5sfOaGxHwpkNUvFWE.md │ │ │ │ │ ├── networking@ee4QqFTosXNcTgoQIok8i.md │ │ │ │ │ ├── optimizing-flatlist-config@PyPjHnKIWpnFHal8RuSmX.md │ │ │ │ │ ├── other-storage-options@vZMsm-MtsqmQMD-MG6zJY.md │ │ │ │ │ ├── performance@NIJzKzWlsciAjxUpm4K2v.md │ │ │ │ │ ├── platform-module@KZIrRSYq_I-YzpFaYLuWi.md │ │ │ │ │ ├── pressable@4BgVq-cZYEXgqktvlNnet.md │ │ │ │ │ ├── profiling@apXv-E6LvOuOMj3EpzwuA.md │ │ │ │ │ ├── props@0gH7vI_Hy7s9hO2TF6hR3.md │ │ │ │ │ ├── publishing-apps@4U-HZQGH7kaWCB94Xy8Mh.md │ │ │ │ │ ├── push-notifications@CAQJaGs24wx1SqKOU44aB.md │ │ │ │ │ ├── ram-bundles--inline-requires@u5I-EOnA_yt6AQsRX-qr0.md │ │ │ │ │ ├── react-native-alternatives@ODQ8zrHc2rsc8PN-APKvz.md │ │ │ │ │ ├── react-native-async-storage@WsJGiMjHSQ6MpPd5wuP9h.md │ │ │ │ │ ├── react-native-cli@bxWLf0RDAl9Zaczkon9Rl.md │ │ │ │ │ ├── react-native-testing-library@-b4LfjCjkSZ6ZsSv3eFm6.md │ │ │ │ │ ├── react-native-web@UQpyXrC2cs_jDXxVTlQOu.md │ │ │ │ │ ├── react-test-renderer@81tmis0km2h1zsjS2HsP5.md │ │ │ │ │ ├── refreshcontrol@m8Nu71Y61Ha_fLxdtWTkn.md │ │ │ │ │ ├── running-on-device@KyKMZ8Aa5XUAIWelGTiSt.md │ │ │ │ │ ├── safeareaview@UqCpoPzYio3ng3RFlbvZ7.md │ │ │ │ │ ├── screen-navigation@Jr2iuQqyCbx6CyTJj4Qz2.md │ │ │ │ │ ├── scrolling--swiping@nk6zdVNRz_xE71mVUOFsi.md │ │ │ │ │ ├── scrollview@yN283SRWoALOEZh9iTn-L.md │ │ │ │ │ ├── sectionlist@gLJMD9X7chy8OxdALht8g.md │ │ │ │ │ ├── security@CGtVwhVGc8Vea5RfzJvQG.md │ │ │ │ │ ├── sourcemaps@Dq490IqEJXoFZRnBFJI8N.md │ │ │ │ │ ├── speeding-up-builds@LL2ZkB7BuELyY2mPQhkAj.md │ │ │ │ │ ├── state@V7r1Hqk9IXTfjkjAg7-BT.md │ │ │ │ │ ├── statusbar@QOOZs9qtz49agfZwi6k1B.md │ │ │ │ │ ├── storage@NdjmP1bZNYriV08vb-iRw.md │ │ │ │ │ ├── storage@w0WW1kg_0BEMeLa1l2gb5.md │ │ │ │ │ ├── stylesheets@wB0D9koC6jpt1rzX8F07F.md │ │ │ │ │ ├── styling@ervpuL89myBW3oR9r-4lH.md │ │ │ │ │ ├── switch@ouNTekf4VpZv-Vja8_bfM.md │ │ │ │ │ ├── testing@G15Aey-Spax_iUHpm1v38.md │ │ │ │ │ ├── text-input@Frz1RYp3y9OwRb-3t2e85.md │ │ │ │ │ ├── text@OFhyYyxtrCBy_UUb5YBv5.md │ │ │ │ │ ├── touchables@A7ZIe8nlQnHU5g3LM3Eif.md │ │ │ │ │ ├── understand-frame-rates@1U3AiCDWEVEKsofWtqavi.md │ │ │ │ │ ├── using-native-modules@0BMpZDc-1rSvETwX82zON.md │ │ │ │ │ ├── view@GrFL32pZ_eOmdJRzSlH8b.md │ │ │ │ │ ├── websockets@aSCgax1M4wlmzkJSZV_fv.md │ │ │ │ │ ├── what-is-react-native@cMfsRtvzvDZZJ0TqeUOxm.md │ │ │ │ │ ├── why-use-react-native@2rlmLn_yQQV-7DpX1qT98.md │ │ │ │ │ └── writing-platform-specific-code@HiUbRfOv8OttFd85pDUHN.md │ │ │ │ ├── faqs.astro │ │ │ │ ├── migration-mapping.json │ │ │ │ ├── react-native.json │ │ │ │ └── react-native.md │ │ │ ├── redis/ │ │ │ │ ├── content/ │ │ │ │ │ ├── active-active-geo-distribution@cybF72wlJyJbHLUjitLvn.md │ │ │ │ │ ├── aof-rewrite--compaction@ibaZ34-laQtUyxAsERi7o.md │ │ │ │ │ ├── append@cPWd53BO6tm-uy4gqLdtZ.md │ │ │ │ │ ├── atomicity-in-redis@jrgaoDnt_RxTu79hk4hCD.md │ │ │ │ │ ├── authentication@Qy42paiTUsO8HIwbWTMui.md │ │ │ │ │ ├── backup-and-recovery@wXRDsNGFckXV_CSiit5sN.md │ │ │ │ │ ├── basic-commands--set-get@NhcZM4nUQoSBBf_1qXi6l.md │ │ │ │ │ ├── batch-operations@7JzeyTrkZ_1_yxMVrqvZU.md │ │ │ │ │ ├── bitcount@jpcyXSSib7q4WBPmpgnXA.md │ │ │ │ │ ├── bitmaps@0Q3AkE8leWAyYsww3-BHX.md │ │ │ │ │ ├── bitop@tkrxArg_oYH0aQfM8NkD2.md │ │ │ │ │ ├── bitpos@Df1Eu7CuA-ARYii9JVvnm.md │ │ │ │ │ ├── cache@eHuBz_zSZK3rubn7nkd7g.md │ │ │ │ │ ├── caching@-TjnSOY8txYrhhxRV1OIl.md │ │ │ │ │ ├── clustering@AQiCcHS6dBAAAPloxiXub.md │ │ │ │ │ ├── configuring-save-interval@_pb2DPrFUUZabKxWsuFUo.md │ │ │ │ │ ├── connecting-using-redis-cli@BOGXTjmCLo6WI6mYDsqRu.md │ │ │ │ │ ├── data-persistence-options@8uRpPJ0iD4XnQPKruQc8P.md │ │ │ │ │ ├── decr@t4BXPofF8OCqH5KHwdYVh.md │ │ │ │ │ ├── del@lV_MnUNTB2h925idX0YWk.md │ │ │ │ │ ├── disaster-recovery@nUIfTkgm3PlSiqgun1BS7.md │ │ │ │ │ ├── eval@rjeq3i9oX8IGyQzo--L3c.md │ │ │ │ │ ├── evalsha@3X0x_PcJGWBVPL-LSVAln.md │ │ │ │ │ ├── exec@Ljy-Mc0EBBX4_vXfYZ5-4.md │ │ │ │ │ ├── expiration@OSIYDYPGz8Vgo9SU9GGH9.md │ │ │ │ │ ├── expire@nS0DHhfy4wxHItgOFhulA.md │ │ │ │ │ ├── geoadd@U3N1EgHFs1-YUaB_VrJfw.md │ │ │ │ │ ├── geosearch@OWWDLuGTbdNwME7v2jxVP.md │ │ │ │ │ ├── geospatial-indexes@_NiUdVQ85qnvryI38k_vQ.md │ │ │ │ │ ├── get@mQc4H2ZMMSVjh33LJY8mK.md │ │ │ │ │ ├── getbit@0HFLJfcrcSnAVTecG3P8W.md │ │ │ │ │ ├── hashes@wY46Qj5Inw_ClBNI9PB_2.md │ │ │ │ │ ├── hdel@E7xFZkqqbzokD5KGTn9zJ.md │ │ │ │ │ ├── hexists@adhLMuSmfYMRyWTwIgnyE.md │ │ │ │ │ ├── hget@MsKg9m5jFwHM2Bzjf-vdu.md │ │ │ │ │ ├── hgetall@TpR33sJ-tAjeG3jpGTvYR.md │ │ │ │ │ ├── high-performance-and-scalability@5-3pd4rLDqRzMzSRVLdXh.md │ │ │ │ │ ├── how-aof-works@PTj6oxvpw8vP295WvAI80.md │ │ │ │ │ ├── how-rdb-works@D3pZdAjwPFMRxX1-iyu5-.md │ │ │ │ │ ├── hset@BOJzn9SWad9oRRdY_ub01.md │ │ │ │ │ ├── hybrid-persistence@S5Y26m1oHCQpB-oLCdtac.md │ │ │ │ │ ├── hyperloglog@cszjT3YK8oyhGpqLTQzwX.md │ │ │ │ │ ├── in-memory-data-structure-store@M-EXrTDeAEMz_IkEi-ab4.md │ │ │ │ │ ├── incr@5K9qyC4mrhXYWOC8WSq8C.md │ │ │ │ │ ├── info@q2Jw49QUWCUGIfcEC1bZI.md │ │ │ │ │ ├── key-value-database@l2aXyO3STnhbFjvUXPpm2.md │ │ │ │ │ ├── leaderboards-and-counters@Fv1iGX22sApIEifM2IpJz.md │ │ │ │ │ ├── lindex@hBFEUXtuzUTzWZKp2qWaZ.md │ │ │ │ │ ├── lists@4-C4XqACUp4nvcMIj6djF.md │ │ │ │ │ ├── llen@4oCcP9FxDJSDMHCEVBCNa.md │ │ │ │ │ ├── lmove@9KvHcS5F4Jj5ZXgIAdOQY.md │ │ │ │ │ ├── lpop@voa61RTWMJD3Sk8DNJoVQ.md │ │ │ │ │ ├── lpush@Kq7G89KaZZMFkrH-9WZoS.md │ │ │ │ │ ├── lrange@8JTtBy6oD2wFYDizVkcVa.md │ │ │ │ │ ├── lua-scripting@Veb30QrPYNjUn13dtGbUr.md │ │ │ │ │ ├── max-memory-policy@Sd1ENOXSFCz1YqccXjr2A.md │ │ │ │ │ ├── memory-management@xF0wQYmtwXYkrzvWg5gOO.md │ │ │ │ │ ├── message-broker@mgGJTBU8ofvOzl9gYWhnG.md │ │ │ │ │ ├── monitor@jBtEiylcedtaE6E20Uk4V.md │ │ │ │ │ ├── monitoring@2p5RF4lVYfRvYTo1Ofm-a.md │ │ │ │ │ ├── more-commands@0v8uLWRCbAqEmKKdYaRQW.md │ │ │ │ │ ├── more-commands@4-z4hDKm86qQatYnmE21R.md │ │ │ │ │ ├── more-commands@FCbdKnkI1ZHGekT6yiGua.md │ │ │ │ │ ├── more-commands@P6TDUCroLlEI7qePBFHIH.md │ │ │ │ │ ├── more-commands@V-d6q-3Sf0dl5v8xiCQwl.md │ │ │ │ │ ├── more-commands@b48EUyFGUeSjtT5fOa_m6.md │ │ │ │ │ ├── more-commands@eBeEUYY-IL_CMkcm31lUL.md │ │ │ │ │ ├── more-commands@o6e_CwxfPoU6qkfWkwKwj.md │ │ │ │ │ ├── multi@U6hST1MkS16T2CHV3-Ise.md │ │ │ │ │ ├── naming-conventions@jCaVx5wvsvuyqtwh6m8si.md │ │ │ │ │ ├── network-security@wsuKH7YwGDV6GYQbdhA4o.md │ │ │ │ │ ├── no-persistence-option@80035BzcB-fKCvD_3N8zE.md │ │ │ │ │ ├── optimistic-locking@msW0Wd2H-6FFNDnjC64t-.md │ │ │ │ │ ├── overview-of-data-types@U84XgBFPyIbY0W5afH4cx.md │ │ │ │ │ ├── persistence-options@bQaek7f3dAaZfSUhwovm1.md │ │ │ │ │ ├── pfadd@8a4DmPZrX2xGZ7zdWxS63.md │ │ │ │ │ ├── pfcount@JWT30KIJQHVw0MXI5sGR6.md │ │ │ │ │ ├── pfmerge@s50jr_XOUcxh65-tGCKf5.md │ │ │ │ │ ├── pipelining@LHlwjN3WHYUBUafzzwsWQ.md │ │ │ │ │ ├── pre-compiled-binaries@yBZ79s6mzGdj5AnX2H_Hy.md │ │ │ │ │ ├── publish@gIPo-2CNqE1BsOaDzmkCU.md │ │ │ │ │ ├── pubsub-messaging@ZCyId3aIoLv3duxoJdk2P.md │ │ │ │ │ ├── pubsub@9W_jaK1DSEZHRKdPcUM7h.md │ │ │ │ │ ├── rdb-vs-aof-tradeoffs@3S-qqOlfr60HR4VvDr4He.md │ │ │ │ │ ├── real-time-analytics@bVJASI7bfSYqYnNhX83ng.md │ │ │ │ │ ├── redis-benchmark@kgHwK4N-sfh6dHjd_D_me.md │ │ │ │ │ ├── redis-enterprise@8lyXDuZJ-KHl4v2_8Ew1h.md │ │ │ │ │ ├── redis-modules@hLIT00Iz7rV56ZBIUhWYn.md │ │ │ │ │ ├── redis-on-flash@sWOFnbh2EyaHRzquz1UeF.md │ │ │ │ │ ├── redis-sentinel@nci3OB1NE1zJHUPfZCOpT.md │ │ │ │ │ ├── redis-vs-sqlnosql-dbs@EvWiEx_AoxAht6sKxzW2l.md │ │ │ │ │ ├── redisbloom@GwVL5CvbnHsiWb1hVh7lK.md │ │ │ │ │ ├── rediscommander@y5FPSAi6T-5X9SUfR58_-.md │ │ │ │ │ ├── redisconf@giyKPtQ-pziA064P8OQD-.md │ │ │ │ │ ├── redisinsight@XBPwHgIsXupMsyoOFkJZ0.md │ │ │ │ │ ├── redisjson@jicsfYw56VrbRUt7M8c85.md │ │ │ │ │ ├── redistimeseries@RBr8opWSh2TKXC8Fmdg0j.md │ │ │ │ │ ├── replication-basics@rSD8nJ-uNpHJVe5Hn66h7.md │ │ │ │ │ ├── retrieval-by-pattern@UlQHqw1dbxZnAKbsWsOgU.md │ │ │ │ │ ├── rich-data-structures@uVewcyaFi1Pt2Gs0KrkfA.md │ │ │ │ │ ├── rpop@brUGqWZ287EWtvl9uUbNt.md │ │ │ │ │ ├── rpush@jC8G1o7yFj7D_PGmOIgcD.md │ │ │ │ │ ├── sadd@xUKoQps69FFQrJeuhD1pz.md │ │ │ │ │ ├── scard@2gZL4a9aWGKWLa89iyHTc.md │ │ │ │ │ ├── sdiff@JX5ajmcUmkshTO-mLF8lH.md │ │ │ │ │ ├── search@_GdTXcJO8uJlhPdfrmeXG.md │ │ │ │ │ ├── security-and-compliance@ujs77bV8g8-FOm5hBtZFd.md │ │ │ │ │ ├── session-management@URxGmhZHr0Y8nyrYj0gJl.md │ │ │ │ │ ├── set@ltF4vCT9ZA2XuUuHnuGnN.md │ │ │ │ │ ├── setbit@B-YUFhPQNdr1KZNupmR5N.md │ │ │ │ │ ├── sets@Qgkpr9vf9d6-vUg1o8XFj.md │ │ │ │ │ ├── setting-and-getting-keys@DOdNkTY1yIMipWA2CD9xH.md │ │ │ │ │ ├── sinter@5aLfNBewK4Dx017qVNO3T.md │ │ │ │ │ ├── sismember@Ji5ghlcGJtlmErHFqVf3d.md │ │ │ │ │ ├── slow-log-analysis@yaCWw2KjX58SaPajUAb0d.md │ │ │ │ │ ├── smembers@mQ0ILns53n1By0Tq6xSZI.md │ │ │ │ │ ├── sorted-sets@QTbkWZ7BpqYmBhUivccPu.md │ │ │ │ │ ├── srem@WQWVL5GT_scHdgfCtI7WT.md │ │ │ │ │ ├── ssltls-encryption@gdiWwTQg6A-BFHdQBmgmH.md │ │ │ │ │ ├── starting-the-server@43LvShQhmoWQ8Nye7fLkz.md │ │ │ │ │ ├── streams@zXs_9n2yEb_eVi0WuOQKH.md │ │ │ │ │ ├── strings@Wl23Jh-ASJOQ850yjaTIU.md │ │ │ │ │ ├── strlen@eJQW986HM4Wf1o1i2FnXs.md │ │ │ │ │ ├── subscribe@55BCntuWlaQiLPqNtb-2i.md │ │ │ │ │ ├── sunion@6QoYa-N2BKNBaRtvNeVNm.md │ │ │ │ │ ├── transactions@YHbWlKrQqptUDbaQVy0_A.md │ │ │ │ │ ├── truncation--corruption@9ToKTUqbi-NV5Wcwb21PT.md │ │ │ │ │ ├── ttl@Vll7VMmGWSI5XGZ9JpHyl.md │ │ │ │ │ ├── unsubscribe@5gkZzm2F4vu6IxUoJLYbK.md │ │ │ │ │ ├── upgrading-redis@Cb-KazR4PuR86VX5oT0zi.md │ │ │ │ │ ├── usecases--best-practices@vzp7DUpjklzIA0E9WxJQA.md │ │ │ │ │ ├── usecases@2_E2VwbjTgk4xxTFWfHuV.md │ │ │ │ │ ├── usecases@3hayYoSZepw7pppBubotg.md │ │ │ │ │ ├── usecases@GNMjrLPkpTphneoQ0GoZF.md │ │ │ │ │ ├── usecases@MvyE_JUJej0UB9xe8Anfj.md │ │ │ │ │ ├── usecases@VvOQUO22ZF8VvDSqHENNU.md │ │ │ │ │ ├── usecases@XPeCvikPuu6EJ8UcOLGPh.md │ │ │ │ │ ├── usecases@XTwNCCtzXvZMdaex4gZEh.md │ │ │ │ │ ├── usecases@jtVnUD-na-WffMaS8qYfu.md │ │ │ │ │ ├── usecases@kF_nGo845XDwLkwcQt008.md │ │ │ │ │ ├── usecases@lxevY15ZyP43s_JrEqMX7.md │ │ │ │ │ ├── usecases@s7PEr-5TAm5EGJm0RSjPJ.md │ │ │ │ │ ├── usecases@zXlSBfa-Gi9_GhSYEzre3.md │ │ │ │ │ ├── using-docker@TDxv0q7jlZ26uZYYlneem.md │ │ │ │ │ ├── using-package-managers@Bf_kLfmy7_uflqC9N0-jt.md │ │ │ │ │ ├── watch@c-y5Eck8VtSyIf8RAW9p7.md │ │ │ │ │ ├── what-is-redis@-3pADOHMDQ0H6ZKNjURyn.md │ │ │ │ │ ├── when-to-choose-redis@1Af5H0BgdAsRdBCNdHz5v.md │ │ │ │ │ ├── when-to-consider-enterprise@JlLwy69eQ1bPHAOOJNqjo.md │ │ │ │ │ ├── xadd@7isWhgrUA6M5IGM2U2tm4.md │ │ │ │ │ ├── xlen@DQJCMEw13lELcw_AwLfrT.md │ │ │ │ │ ├── xrange@CiYFuYE8XudZkR6AW2NQ7.md │ │ │ │ │ ├── xread@4sKiAtX5aIL4NDsQkilNC.md │ │ │ │ │ ├── zadd@0swsBD0sOY-o5lzibT999.md │ │ │ │ │ ├── zcount@O-fZM_U-tW0pYtNzN_8Ax.md │ │ │ │ │ ├── zincrby@W4v7FIQr2k-Vbm-HdfKog.md │ │ │ │ │ ├── zrange@3pFChX6YIItrBz9lxu4XM.md │ │ │ │ │ ├── zrangebyscore@OlbixGa5RmdqEt7snY04j.md │ │ │ │ │ ├── zrank@AF_kWM4V8n5Ux06IgEVTl.md │ │ │ │ │ └── zrem@m0FZDPwNE71zcwM_gUwz0.md │ │ │ │ ├── faqs.astro │ │ │ │ ├── redis.json │ │ │ │ └── redis.md │ │ │ ├── ruby/ │ │ │ │ └── content/ │ │ │ │ ├── arithmetic@I708SVAEVSpdHzwxoHhgD.md │ │ │ │ ├── arrays@2QHXNKV0tETI5FroFNylt.md │ │ │ │ ├── assignment@NpHLz4I9wwwXX-KBrjdgU.md │ │ │ │ ├── attributes-accessors@I9dIFxsUrysgrcqUSBNsW.md │ │ │ │ ├── begin-rescue-ensure@-2BSGoXGMMP50en_NnQ97.md │ │ │ │ ├── blocks@DzolktV1UUCdSWqmqWgV3.md │ │ │ │ ├── booleans@Ze02ApxTvyQqtB3VYv3d4.md │ │ │ │ ├── break@0gjDinuRDgPV9iTm39ZnS.md │ │ │ │ ├── bundler@Y6yFuFfcdlcupQUFHV3cg.md │ │ │ │ ├── byebug@2y9U11vXpTXHwkIGogzaf.md │ │ │ │ ├── case@BiUeOOd9E7V4Gpmu3PWj7.md │ │ │ │ ├── chaining-methods@CIV4Ph1B-kUcYv_EqVw2I.md │ │ │ │ ├── closures@yaC-XKRT0dWDFmDqpCvUw.md │ │ │ │ ├── comments@PqSnJOOQm3lRoBUs9Fan6.md │ │ │ │ ├── comparison@HiDx1OWbSDJJb7APHwG34.md │ │ │ │ ├── concurrency@oM4ezZoguNFOALXH3Sl6E.md │ │ │ │ ├── concurrent-ruby@toevE0eM7c5f_zeSaVjdr.md │ │ │ │ ├── conditional-statements@FIALdP3ZhOlzW-OIlJoT2.md │ │ │ │ ├── conditional-statements@jw218cE_PQDRnOTzCXpXr.md │ │ │ │ ├── constants--variables@FfM3pPbyP1VsvWousb3YK.md │ │ │ │ ├── data-types@wsnjdnZZohQsVBfM1uN8H.md │ │ │ │ ├── date--time@RGo3VGXftLx877w0Cxhwb.md │ │ │ │ ├── debug@JSauSDvDotwrWZiyLuWks.md │ │ │ │ ├── define_method@iwLZktEcLmnahj4o-IgWB.md │ │ │ │ ├── defining-classes@lPPdaW7EEyUCxV41ljvPY.md │ │ │ │ ├── defining-methods@CkYLHSGH8dmfS5fK2JLfH.md │ │ │ │ ├── dowhile@OwRukUn8ypko_hPUHkxv_.md │ │ │ │ ├── each@iJ7e3-VJV6l-Qe-b5yAgC.md │ │ │ │ ├── enumerable@7lMZv3oRfC1UWAOfRvvwC.md │ │ │ │ ├── enumerable@jw218cE_PQDRnOTzCXpXr.md │ │ │ │ ├── everything-is-an-object@vnDB786JPJGLIEbaQuXn2.md │ │ │ │ ├── fetching@PQX6c9h1O_p-ExDvC88zl.md │ │ │ │ ├── fibers@ZSBRUhjgQNJNbCuLYEiJJ.md │ │ │ │ ├── fibers@_ruCDzzaSuoE_8tRacTeK.md │ │ │ │ ├── file-io@UQeCaogH4IJg4_Inxsjg1.md │ │ │ │ ├── floats@aLIXcqB258WNrdASuN_7G.md │ │ │ │ ├── for@VlhY73X3c0PnA1uYjbfZH.md │ │ │ │ ├── handling-exceptions@aZYZcRlB1Azm4N_jox0Ow.md │ │ │ │ ├── hashes@mpsx0lr9ljlMEzuU5cZD6.md │ │ │ │ ├── if-elsif-else@cVSN9992bpxZwZ9JC1HHg.md │ │ │ │ ├── inheritance@7HSJh15ice_CG3FtfQ5x6.md │ │ │ │ ├── installers@zY4gsqXOOT3yp9ad9-T5a.md │ │ │ │ ├── installing-ruby@Av5hlCtE-ZoeKpS0k3kLA.md │ │ │ │ ├── instance-variables@dbdllih50mNFBrP9huQz9.md │ │ │ │ ├── integers@_-bUq5jtewDmsmnzYw1-q.md │ │ │ │ ├── interactive-ruby-irb@uvPvcmhaO6WbkE9Xs5hsJ.md │ │ │ │ ├── introduction@A_ftl-42mIGBk-9S5LgCv.md │ │ │ │ ├── irb@_TyiwnXJ7kQI8Z02ooAIy.md │ │ │ │ ├── iterating@frFY2AeO2BQF6I0CmTLkV.md │ │ │ │ ├── lambdas@Tb5DcDuAZNyuIPepJ_yy4.md │ │ │ │ ├── logical@vLgIRI5GD9ANBjYJoZmid.md │ │ │ │ ├── loops--enumerations@dRfPXHrI5CHCELySKLZuQ.md │ │ │ │ ├── managers@RnKFjcscp8nqwesQ06YWU.md │ │ │ │ ├── metaprogramming@ufLdyKM3iya8zuMD1_sIj.md │ │ │ │ ├── method-lookup@ihUJHaZ1gu3Fb7MiybXCj.md │ │ │ │ ├── method-parameters@m4QhKH7mVhxRqnJOF5Xc2.md │ │ │ │ ├── method_missing@pBbtuN36wqgXz4Oua0ukX.md │ │ │ │ ├── minitest@C7Dy0rqAo-HotIVlCBa1G.md │ │ │ │ ├── modules--mixins@8OF85n6CRQ3u3GFxlJlc8.md │ │ │ │ ├── monkey-patching@6mCtbDW5pkFQdLSjsr_Ad.md │ │ │ │ ├── mutex@toevE0eM7c5f_zeSaVjdr.md │ │ │ │ ├── naming-conventions@tRGKIfQG9IiPJGuO8DUX4.md │ │ │ │ ├── naming-conventions@wsnjdnZZohQsVBfM1uN8H.md │ │ │ │ ├── next@ueQ4bgcEXEgEDGhfVPjH8.md │ │ │ │ ├── nil@WMa8k6sbhow-TXNibFj0a.md │ │ │ │ ├── operators@5ThpsSMnFZUxWV1Y2Z75A.md │ │ │ │ ├── package-managers@cRQjwGKIG7CmbDOwj7dfU.md │ │ │ │ ├── procs@DD3TQAEl2JD0TIPDNZXXl.md │ │ │ │ ├── pry@Voz_H9SBIeOndzl3gmuS7.md │ │ │ │ ├── puts-print-p@DKA6AJR1kz6Ox90MmN5Tl.md │ │ │ │ ├── querying@ZQuUDWqbNUxOYc-Fkk2pI.md │ │ │ │ ├── rack@qvg65UaeythwvO38wn8Gc.md │ │ │ │ ├── ractors@H4Cz_4xcMJmU0UwvEhNIn.md │ │ │ │ ├── ranges@OHq_172eTWaVlxES7Ccfc.md │ │ │ │ ├── rbenv@VaRe4VrB7hjGp2UUFxtGf.md │ │ │ │ ├── rdoc@QFkREObmZZebsCwXM3ML0.md │ │ │ │ ├── recursion@yqsXD8ugaAHPnLJsd5XDQ.md │ │ │ │ ├── redo@gUa4S-_xZhClyiit_MSkQ.md │ │ │ │ ├── refinements@aNf0-Yhwl98L_oNfipvj3.md │ │ │ │ ├── regex@B5T4d3FYTvydh4DOcTFFR.md │ │ │ │ ├── rspec@E6k00oTuohQOBkPNyuKAA.md │ │ │ │ ├── rubocop@gHn3q_539Ia31Kviem8lK.md │ │ │ │ ├── ruby-dsl@aU4XniRWyGKQxGnrxYKyE.md │ │ │ │ ├── ruby-on-rails@AE7YB3XH70HJWCf51i5YH.md │ │ │ │ ├── rubygems@iwXBPrnuwPvNRbOIDxWvq.md │ │ │ │ ├── rubymine@WQQuaLnCCzy48uDPJ-sDb.md │ │ │ │ ├── running-ruby@cfT4N5gu00Gz1ST9c3o8-.md │ │ │ │ ├── rvm@0c_0zyh1LQA80gmriWOT3.md │ │ │ │ ├── scope@SB_IzxfilaHBVL1fe5aYG.md │ │ │ │ ├── search-algorithms@EPNxjJqcP10c1__q1KKea.md │ │ │ │ ├── searching--filtering@Zil-9cf_-g1H5VUF52bxo.md │ │ │ │ ├── send@5uayAWgKAYW_mJiMxuXmK.md │ │ │ │ ├── setting-things-up@Av5hlCtE-ZoeKpS0k3kLA.md │ │ │ │ ├── sinatra@XI-1114QVFgALBF9VAb99.md │ │ │ │ ├── singleton-classes@WNiD4Tllt2uDncEVPg8Pm.md │ │ │ │ ├── sorting-algorithms@hD6uldPLaedTvUwAWKFYY.md │ │ │ │ ├── sorting@knmTmlDbyRwZKxuIIVbwn.md │ │ │ │ ├── stacks---queues@wcw4QurFUczUKnyBPpnr5.md │ │ │ │ ├── standard@Wf6AYAz8gTpaj6ZfOxoZM.md │ │ │ │ ├── strings@F-0Rxwu_RcNF_NOoFHoo7.md │ │ │ │ ├── symbols@U-V-MNSnIL17Imug_iFvE.md │ │ │ │ ├── testunit@Tzf1uJDIeIjPAVleVe_yx.md │ │ │ │ ├── threads@H4Cz_4xcMJmU0UwvEhNIn.md │ │ │ │ ├── threads@xJ_F95dKmaRKE42yQ2R-r.md │ │ │ │ ├── times@1NIxWfLiaXKNZJSmrudPv.md │ │ │ │ ├── type-casting@5ThpsSMnFZUxWV1Y2Z75A.md │ │ │ │ ├── type-casting@NjCor7ePiZapd4f6bMZlV.md │ │ │ │ ├── unless@MrPUYjPaz2F7c77GoPmue.md │ │ │ │ ├── until@OVPm4SgT7wvapUNWKQOdH.md │ │ │ │ ├── vs-code@9_KhHCWRDTNl1nroot_Ri.md │ │ │ │ ├── while@xO2RCVIxZprDgEW4-O9n9.md │ │ │ │ └── yard@EDfqLvVxq-PIqb1eGYL20.md │ │ │ ├── ruby-on-rails/ │ │ │ │ └── content/ │ │ │ │ ├── accessibility@dvL7HRXMqs2NOuTtfHeXM.md │ │ │ │ ├── action-views@NyByCB4J4hk7rN7nrp1dv.md │ │ │ │ ├── active-record@ig8gCcieQF923NKhNyaNA.md │ │ │ │ ├── advanced-asset-management@8Jbs2XpIL-Nd-tr2f0AJ8.md │ │ │ │ ├── aggregations@C8A-30h1xJBFLhD182H89.md │ │ │ │ ├── app@BiVYxjVr2OhmnglHz_kVZ.md │ │ │ │ ├── assets-pipeline@EcGyLolDRJJra4PDWlQjJ.md │ │ │ │ ├── authentication@WqjcBTzbU4iFpYVp1-ptv.md │ │ │ │ ├── authorization@xz-xEwqyvJgTKvjpmXeOH.md │ │ │ │ ├── background-jobs@Mj4SxEsrQZz6zIKos1hyk.md │ │ │ │ ├── basic-queries@Ddikj7KylZSoqsdAsd380.md │ │ │ │ ├── better-errors@yUwMPqnV5ZqV7eCL0bkfs.md │ │ │ │ ├── bin@6HV1KoHTSeEE1-f6IeWB4.md │ │ │ │ ├── byebug@SFGRkOuEMFxOJ4UU_Ti8L.md │ │ │ │ ├── caching@fjROKLDD5h6Vp0zXgJ5Y0.md │ │ │ │ ├── callbacks@xgJCbwDNWPbYV2bCILRo0.md │ │ │ │ ├── cancancan@0dPBO4cZFWvE3rSHEW1OJ.md │ │ │ │ ├── cancancan@3fA4RoDm2NFUK0EWFy-eP.md │ │ │ │ ├── capybara@JCQT_3B9hu8QkJaoDQK_V.md │ │ │ │ ├── conditions@NgMAdAtdJFd3Pha4nwiLE.md │ │ │ │ ├── config@Vr0UKX1C3DSVxZjj-Ls6L.md │ │ │ │ ├── constraints@H2lhyWJ2aErIC6UsIag_p.md │ │ │ │ ├── controller-actions@Cm0tEnjeqQzQORowsdEjk.md │ │ │ │ ├── controller-callbacks-filters@oHdgQvPSEs-l3EzNRd8q2.md │ │ │ │ ├── controllers@HDt5AAg9H4n8wh3uACudP.md │ │ │ │ ├── cookies@JAfp4HnSEfxZ33qhVrNvk.md │ │ │ │ ├── create-an-app@4SiV-sW-zg_HtL2tPc90-.md │ │ │ │ ├── creating-controllers@tSdMmh2SG1Qul5PWCaCKa.md │ │ │ │ ├── creating-models@oxEooPuoRqxLreJSA4QIh.md │ │ │ │ ├── csrf-protection@VlQis-Wkahd1E1aM1ZP2E.md │ │ │ │ ├── customizing-routes@3NTsftFbqkG5s4xoU_q6E.md │ │ │ │ ├── data-types@6aukVg4KBYPW0FVtdAvS5.md │ │ │ │ ├── databases@QdWCXUAfVXiP6RQ6VyDkX.md │ │ │ │ ├── db@N2pXb4eqXrBdR495zMqGY.md │ │ │ │ ├── debug@SFGRkOuEMFxOJ4UU_Ti8L.md │ │ │ │ ├── debugging@ELvMdjJZGl_k_0Qsi_vtm.md │ │ │ │ ├── deployment@Ia5mN1j_lMCg0vt2z1_jI.md │ │ │ │ ├── devise@deKkp0TGU3Dj0zxUn9VI4.md │ │ │ │ ├── dynamic-finders@p8bkCtZkgdkh3G_d7fvmt.md │ │ │ │ ├── engines@D_LyvlDwKSzvnSWCpR00D.md │ │ │ │ ├── erb-templates@CX-9Ii3e9rrokUTF0_hI5.md │ │ │ │ ├── factory-bot@OLdWSGSwYnggN14BdH9nN.md │ │ │ │ ├── form-elements@GGR8jAQNggJc92FcvtL4O.md │ │ │ │ ├── form-validation@rg-48lLxIaKdjIb9icB72.md │ │ │ │ ├── form_for@EctqfKE5AAqByipGIv0Wa.md │ │ │ │ ├── form_with@EWMC98NdSnblHBD0U3Ty2.md │ │ │ │ ├── gemfile@t8yTDpN4kNuW6ZhHnum2X.md │ │ │ │ ├── helpers@lnr8HfS8mIcE4Ef-bXQbO.md │ │ │ │ ├── hotwire@2IEdP3YjzCf150UpGao42.md │ │ │ │ ├── how-the-web-works@3YcOhdk9w24f5x0WattyB.md │ │ │ │ ├── inspecting-routes@lLYISr_j0NsE7wkBVvnbM.md │ │ │ │ ├── introduction@0MKuq69yhj8q6suTQ7fY7.md │ │ │ │ ├── joins@Uz5WseVkPoDJfnKw1FH9a.md │ │ │ │ ├── kamal@ih8oOhO49tg1wUUiusIA-.md │ │ │ │ ├── kaminari@6P7GM12isuv5A_SA3tqNA.md │ │ │ │ ├── layouts--yield@-bX4iPTO1dt3wLAcFI7nL.md │ │ │ │ ├── log-levels@1KGuLLxZ-2ghim7ge2ACN.md │ │ │ │ ├── logging@Un4rFrxtto4WLG9YNaAMK.md │ │ │ │ ├── mailbox--mailer@rhs6_Zg9PuY2Oost0vc_o.md │ │ │ │ ├── mariadb@Jf7W0Sw5azZZ6VGb9oaYq.md │ │ │ │ ├── migrations@gJYuVgBvJeXL72NsRubLm.md │ │ │ │ ├── minitest@9evL0EqA6aBGczrfsRkV7.md │ │ │ │ ├── model-methods@ca3Ik5pl-XmecZ3Ztx0YV.md │ │ │ │ ├── model-relationships@lWsJL135U-N5xIBnXqTYx.md │ │ │ │ ├── models@NtiePD28NjaDtsC3oEbYf.md │ │ │ │ ├── mvc-architecture@wHKlT_wCIrpSvULvXCufr.md │ │ │ │ ├── mysql@vIOmb6qGA0ZbPyqEQ9Bb4.md │ │ │ │ ├── named-routes@KlEgfzfkPu0O43tJIsU3H.md │ │ │ │ ├── nested-forms@p0JHL8iAcV5tRLX9DPhx6.md │ │ │ │ ├── nested-routes@DbJ1BIOoerkCH4P95Z7wD.md │ │ │ │ ├── non-restful-routes@3qImaY9Hs3Cvatw1X96Ns.md │ │ │ │ ├── omniauth@mRdKPWMxzEacPOA8j-SoH.md │ │ │ │ ├── ordering@NwzKYGKVyLF_hiHSZ01Yq.md │ │ │ │ ├── pagination@jTrvSb4eN9Hna0YooHapb.md │ │ │ │ ├── pagination@txrWW1OlBZP-uiUKSMupo.md │ │ │ │ ├── pagy@BFmYL2UyuCXdFCeMKtDZk.md │ │ │ │ ├── partials@9qNdqb_Y95_Hjm-7GYA-o.md │ │ │ │ ├── phlex@G3HHrElODg0Js0WY-VYkL.md │ │ │ │ ├── plugins--engines@nh6d9XbtvwBUtVDmEk0i_.md │ │ │ │ ├── plugins@nh6d9XbtvwBUtVDmEk0i_.md │ │ │ │ ├── postgresql@TRTR2JyyfqICTm3kbyIgu.md │ │ │ │ ├── pry@eyeSECF8-wu8EMr5gD7VJ.md │ │ │ │ ├── public@rHzhzrwsguJx3Hg5szucY.md │ │ │ │ ├── pundit@dTU2RPkJcZaPRuSHPod71.md │ │ │ │ ├── query-optimization@8EwNQFoZbzf5WtvP4OA4G.md │ │ │ │ ├── rails--frontend@jKADWbGXSL5yGzsLqSJG9.md │ │ │ │ ├── rails-command-line@DyrNnHUm4Ws5Ku7AlVnWg.md │ │ │ │ ├── rails-generators@okQl2NFVACbZJPgh3sD5I.md │ │ │ │ ├── rails-internationalization@IjEF4T0vuFNUlA9O0wOFw.md │ │ │ │ ├── rails-logger@PDxKuQbWhbg0_AewOw9Mm.md │ │ │ │ ├── raw-sql@wszshSvhqtfN829f5InuL.md │ │ │ │ ├── redirects@pSdqdRPlLfmIl5X9XF76r.md │ │ │ │ ├── rendering-views@WJmDAayQ6SMNuUWsMzhnJ.md │ │ │ │ ├── request-reponse-flow@eYaayU92hNbri3YTdSAbG.md │ │ │ │ ├── restful-routes@NB50RuNBT5Oja2Ry6p892.md │ │ │ │ ├── routing-fundamentals@ftFF3oFfqpKvjQhXk3bWw.md │ │ │ │ ├── rspec@Xs9gIVdO9TuZabUapgubJ.md │ │ │ │ ├── scopes@x4MkSkbLK7aHWUoKuq1j4.md │ │ │ │ ├── security@YyBmT5CzL-lspStC8aZ_t.md │ │ │ │ ├── sessions@mJ5wZPg770fDlJ-V9x75t.md │ │ │ │ ├── setting-up-ruby-on-rails@4nyrB8-xmd35S6ZNjPX8d.md │ │ │ │ ├── sqlite@J7eIUewbviWck-lVJ1hre.md │ │ │ │ ├── storage@JyARA-iMMw2uEuB_ljFrs.md │ │ │ │ ├── strong-parameters@cUYKqkqvg2u3Z4KOtAE9m.md │ │ │ │ ├── testing@qtzX0ZzmWjs-CkHQDhsD1.md │ │ │ │ ├── transactions@yrW99MwJNCBMinYUXm1B_.md │ │ │ │ ├── validations@UD5BpSz2CRK1_Sl2z67AL.md │ │ │ │ ├── viewcomponent@e7tcUrtjEcFvQNL6PCYE1.md │ │ │ │ └── why-web-frameworks@VCufea-9vs4DfzB815IT5.md │ │ │ ├── rust/ │ │ │ │ ├── content/ │ │ │ │ │ ├── actix@3Y90v2ysoMcyjDL24H7mC.md │ │ │ │ │ ├── arc@yYmV5qkldu0FkDhOhWOXs.md │ │ │ │ │ ├── array@2DbdHCjFzGHwCUETakaGh.md │ │ │ │ │ ├── async-std@_2uQInXPdOY-DpYTO1Prt.md │ │ │ │ │ ├── asynchronous-programming@yu0f5gALho0e8wzV10yow.md │ │ │ │ │ ├── atomic-operations--memory-barriers@n1Epl_nBuoXW2OE0IKYVR.md │ │ │ │ │ ├── axum@duQ1RO1lqq793mfb5w31P.md │ │ │ │ │ ├── bevy@uyrGki0jB7DXQ0HJe2-vY.md │ │ │ │ │ ├── binary-heap@jdndHBzmdgI6uYql6bO4W.md │ │ │ │ │ ├── boolean@bjwJCGMx5ZfrH7vz3eLS7.md │ │ │ │ │ ├── borrowing-references-and-slices@-onH5vPffdcZFjjVcnEpk.md │ │ │ │ │ ├── box@WjpkWH7f38y-bHUJ6ruGG.md │ │ │ │ │ ├── btreemap@LWgaZWTJVWLDes3HzflRh.md │ │ │ │ │ ├── btreeset@FsyLYRQP_rs4qL7IAj9Mo.md │ │ │ │ │ ├── channels@3nXJg5Y4SUug_dEAj0eQm.md │ │ │ │ │ ├── character@dXMJb2wDmmh2jie1AnPoK.md │ │ │ │ │ ├── clap@AId80IokM7NvGBVutmuGC.md │ │ │ │ │ ├── cli-utilities@2Zyyf9q_CxmOW-z2pipL.md │ │ │ │ │ ├── cli-utilities@2Zyyf9q_CxmOW-z2pipL8.md │ │ │ │ │ ├── code-organization--namespacing@c_SdccEXEJyh4ymWzvCeX.md │ │ │ │ │ ├── concurrency--parallelism@pehYc_xLrs6BFUbcpPTiJ.md │ │ │ │ │ ├── control-flow-and-constructs@u2wlnmE1uLaTqWw35UF0a.md │ │ │ │ │ ├── covariant--contravariant-lifetimes@7yVvMnvCvLbFa51pESx0j.md │ │ │ │ │ ├── criterionrs@clQ26LFV_9AdQ4evnaxUK.md │ │ │ │ │ ├── cryptography@Rv_Z-rbtELPZ1Nv0PZQmV.md │ │ │ │ │ ├── custom-error-types-and-traits@LwqOxYY9E9MUDgz2M40uV.md │ │ │ │ │ ├── database-and-orm@_n7emeqzf5UTxVB5-385G.md │ │ │ │ │ ├── debugging@7YKWYxogJq6X35IAUwcZF.md │ │ │ │ │ ├── declarative-macros-with-macro_rules@AXWXXsww7Xkl3BYgtThNe.md │ │ │ │ │ ├── deep-dive-stack-vs-heap@UdXq0H8599cDTKXaIlPqt.md │ │ │ │ │ ├── dependency-management-with-cargo@PkePVzV-b1pgFJP5xID5_.md │ │ │ │ │ ├── diesel@UAXpBK3lfnq0Q4RcBehZ1.md │ │ │ │ │ ├── documenting-with-rustdoc@65nbahPj9qAb9y8dF8Jnd.md │ │ │ │ │ ├── domain-specific-languages-dsls@Kb7KF7JCMaWFz-GuaQmQV.md │ │ │ │ │ ├── embedded-and-systems@RKXljexmLAceMYwg4D_uP.md │ │ │ │ │ ├── embedded-hal@LzaO2cpDajXERqEYDjMl_.md │ │ │ │ │ ├── enums@FswpjWqqt8-BzUTsDDjel.md │ │ │ │ │ ├── error-handling@X2gB0m-ZKSC4TJyIcwsMx.md │ │ │ │ │ ├── explicit-lifetime-annotations@R5HIVS-lyCp9b46aXqx2m.md │ │ │ │ │ ├── floats@rNHHp1GgmRnKIYlZayi59.md │ │ │ │ │ ├── functions-and-method-syntax@5hKJaMKpeFEUi3S1Hpiyk.md │ │ │ │ │ ├── futures-and-asyncawait-paradigm@kVfBbsOHoixvqb4dYTG3Q.md │ │ │ │ │ ├── fyrox@x9bmK_cLYpX0ebwjZUn4R.md │ │ │ │ │ ├── game-development@uG-EmZVZ-jc3mswOT4-7l.md │ │ │ │ │ ├── generics--type-level-programming@_hxwo_iAdOwlWBltv7i6i.md │ │ │ │ │ ├── ggez@qquYnrrzUlyd8738jzj1D.md │ │ │ │ │ ├── gtk-rs@2Zp3m3Y7j6R1hK3DIVdkH.md │ │ │ │ │ ├── gui-development@T1LlJz5m5wnwBvKAEuGnP.md │ │ │ │ │ ├── hashmap@JAgjrf5WDXiorZ6gFRzTc.md │ │ │ │ │ ├── hashset@b1iYy4Hvkj47Q13V2HE4i.md │ │ │ │ │ ├── hyper@-MiN5ytI43EjgmWV55BhU.md │ │ │ │ │ ├── ides-and-rust-toolchains@oyP1ZyOgDC4nYEQXHwdVQ.md │ │ │ │ │ ├── impl-blocks@HzWHDQZjA9OgVZEWrmhKf.md │ │ │ │ │ ├── installing-rust-and-cargo@-IqA02ObYvXPW1ot6t_b9.md │ │ │ │ │ ├── integers@FHZSxSiOZYNBEz6tu8wuF.md │ │ │ │ │ ├── introduction@4U-HZQGH7kaWCB94Xy8Mh.md │ │ │ │ │ ├── json-rust@ZXMKY0f7mqqlsvyH9u-LM.md │ │ │ │ │ ├── language-basics@6E4pGifNfSAq6SbzfzFNT.md │ │ │ │ │ ├── leptos@n5t3MUqmvrcr36VIIOw0u.md │ │ │ │ │ ├── lifetime-elision-rules@qJI8GObmsxyc_tTtUEOAd.md │ │ │ │ │ ├── lifetimes--borrow-checker@UZ56NKloehcxUFNuSeO19.md │ │ │ │ │ ├── linkedlist@iR0ewc2yURqS7bfMWfoBi.md │ │ │ │ │ ├── loco@GnSBtZoN9mAehRf5Eczng.md │ │ │ │ │ ├── macroquad@EtKhe3lgK3NoiBOjXRb2O.md │ │ │ │ │ ├── macros--metaprogramming@eTpZXd8E2jVBmk_aSLZYV.md │ │ │ │ │ ├── mocking--property-based-testing@HEqfA6An6ZeT3z4R610en.md │ │ │ │ │ ├── modules--crates@Zpowr_NGd-E2DC3g-oW9h.md │ │ │ │ │ ├── mutex@GbbeV3r27IBEKHyiyLqs6.md │ │ │ │ │ ├── networking@3pL0ARqk8uRNimopHSalW.md │ │ │ │ │ ├── nrf-hal@ETYrk0s5Wn80XyntNG_t1.md │ │ │ │ │ ├── option-and-result-enumerations@wQHkBydWsiGEOZMdKmz40.md │ │ │ │ │ ├── ownership-rules--memory-safety@2UQ3AuGkDbT0-54l0rOGM.md │ │ │ │ │ ├── ownsership-rules--memory-safety@2UQ3AuGkDbT0-54l0rOGM.md │ │ │ │ │ ├── pattern-matching--destructuring@yqp3UePmSlGyOYpxITis4.md │ │ │ │ │ ├── performance-and-profiling@WduD9VIcYSs_JTnuMNyxk.md │ │ │ │ │ ├── procedural-macros--custom-derive@bkVM1OIbv4XUpY6FQb8x_.md │ │ │ │ │ ├── propagating-errors-and--operator@pTC1ucmErVnMbNFnYLJK7.md │ │ │ │ │ ├── publishing-on-cratesio@Op0-bdMV3kE9Be6Ot1aC6.md │ │ │ │ │ ├── queue@fq2NMV-QV9ayJl82ZWzov.md │ │ │ │ │ ├── quinn@qi1pmsY8bPk8nbHiBIGha.md │ │ │ │ │ ├── rc@U9Bd-GO0QwYVLvESR4PTb.md │ │ │ │ │ ├── relm@QbdGnUoTLgMHO1NCQINIi.md │ │ │ │ │ ├── reqwest@TtajUXZpyNx9AmdUawm-8.md │ │ │ │ │ ├── ring@w8nxQDxmfoUHkFV66TKiq.md │ │ │ │ │ ├── rocket@ApjwY_70OGG_dNIC85oBD.md │ │ │ │ │ ├── rppal@L01rVq2_H4rWzlKygW5kA.md │ │ │ │ │ ├── rusqlite@a2MLN7f-FvsgdmvP9ixlv.md │ │ │ │ │ ├── rust-crypto@f68x7r-qzaQfrzXnjOI2q.md │ │ │ │ │ ├── rust-gdb@UkHXsAolmbk-MsJFfqObC.md │ │ │ │ │ ├── rust-lldb@p1w1iljGABgHoJjIRJYLY.md │ │ │ │ │ ├── rust-repl-rust-playground@eYCNYtwXBjZwcPUe7QYZ-.md │ │ │ │ │ ├── rwlock@WzGl4DkANjUu7VC1AIWI-.md │ │ │ │ │ ├── serde@EHErECEYws05oi59OsZpC.md │ │ │ │ │ ├── serialization--deserialization@gcmKSLWfBqx4aPZOmyQsg.md │ │ │ │ │ ├── smol@3C9gCBAq3OQVb583S72D4.md │ │ │ │ │ ├── sodiumoxide@hzzRFb5cyXkgUdLZxaozB.md │ │ │ │ │ ├── sqlx@r2KembNZ2WIzLe87EB91K.md │ │ │ │ │ ├── stack@B-S1hE-ofNTutnkc2hJBf.md │ │ │ │ │ ├── string@Hu1jf46OpX44nam_UvYqc.md │ │ │ │ │ ├── structopt@_43912wPdXgLL8v-IMHX_.md │ │ │ │ │ ├── structs@Mi9mQ-8gyDPd8Mbu1zuHt.md │ │ │ │ │ ├── tauri@Q71MnFDQBkZF1c2hj13pU.md │ │ │ │ │ ├── termion@YS0igALDqSanGDWva_vls.md │ │ │ │ │ ├── testing@08qKtgnhJ3tlb5JKfTDf5.md │ │ │ │ │ ├── threads-channels-and-message-passing@pJN260pWQVO0gHxi1-_3U.md │ │ │ │ │ ├── tokio@H0mctp3Bj2OYfIGFDWGfz.md │ │ │ │ │ ├── toml-rust@LmFog_qXrS9e5ARhV6OD_.md │ │ │ │ │ ├── trait-bounds-and-associated-types@pRDgDtRIVpNM2CdhSOS3Q.md │ │ │ │ │ ├── trait-definitions--implementations@_EicstELZcdesHiXFWJGu.md │ │ │ │ │ ├── traits--generics@zLKbYX0nnbfD5n3P_JRaS.md │ │ │ │ │ ├── traits@SJMuIEuHp8X6nfLb0k0TU.md │ │ │ │ │ ├── tuple@81_J7CwtUUjYPvKV_prg3.md │ │ │ │ │ ├── unit--integration-testing@w9coeW9-crDxu0KC-9gEU.md │ │ │ │ │ ├── variables-datatypes-and-constants@Gw5E21W5zis-RUIgNSEV2.md │ │ │ │ │ ├── vector@PskCueCc9pSxfnSzfdX-u.md │ │ │ │ │ ├── wasm-bindgen@SUtBBqqDeR_yAkr669ZvE.md │ │ │ │ │ ├── wasm-pack@TSlj7mMUB5CDTy8uMFzKV.md │ │ │ │ │ ├── wasmer@iyFHvZj_ntr_dX6WlL4E1.md │ │ │ │ │ ├── web-development@KomYBYxj0FTrJDYB3nU5B.md │ │ │ │ │ ├── webassembly-wasm@fusu4ZHH4-cjoouLr4F9U.md │ │ │ │ │ ├── wgpu-rs@6wGShK9WEnXiby_Jm8sTO.md │ │ │ │ │ ├── what-is-rust@cMfsRtvzvDZZJ0TqeUOxm.md │ │ │ │ │ └── why-use-rust@VhSEH_RoWFt1z2lial7xZ.md │ │ │ │ ├── faqs.astro │ │ │ │ ├── migration-mapping.json │ │ │ │ ├── rust.json │ │ │ │ └── rust.md │ │ │ ├── scala/ │ │ │ │ └── content/ │ │ │ │ ├── akka--pekko@vsfwt3tvLDhJoRyA82bM1.md │ │ │ │ ├── akka--peko-streams@g1CpD832hLdZruCtNf7SX.md │ │ │ │ ├── akka@bXliqiEXUKvqlJ391hHE1.md │ │ │ │ ├── akkahttp@82TpZ2W8LJBEEEjTo8_kD.md │ │ │ │ ├── anonymous-func--lambda@jkV_FWlv79nxyNiT_WFOr.md │ │ │ │ ├── apply-method@v6KrScCfuNH8i1aTBGVI4.md │ │ │ │ ├── array@D_2hxCGaYnaQf1Tu0Y-ty.md │ │ │ │ ├── backend@RpAAmXmhMgIhuzgRBFcPj.md │ │ │ │ ├── books@kXP-YrnwQ1zPuBuTHA35l.md │ │ │ │ ├── booleans@bOSckrStDRgoLAGWi6QfZ.md │ │ │ │ ├── build-tools@TYW3j_DfD6DsrHE6MjJ8N.md │ │ │ │ ├── by-name-parameters@_GMHFAt8BulTAb9msdUb9.md │ │ │ │ ├── calico@tMM4YlW3c3e8HYW16SOqS.md │ │ │ │ ├── capabilities@kRM_HTRUvZ7xXjffu53Aw.md │ │ │ │ ├── capture-checking@kbO0eO3UhUzPGaPvZKc_N.md │ │ │ │ ├── case-classes@EnTEDC1dzHf6H7P73Tlv5.md │ │ │ │ ├── case-objects@0dptTJpHmNf_Nyo-ib20m.md │ │ │ │ ├── category-theory@1mSU2_4W0bAMAph5jf7KC.md │ │ │ │ ├── cats-effect@GJVtKkllXuiMqUb3K7mUc.md │ │ │ │ ├── cats@5A-62SFAXUd4OAEGd_RRz.md │ │ │ │ ├── chimney@ISX09NZJh4HhKb5_d42sQ.md │ │ │ │ ├── circe@J5RuMesa74X122XHVgnFY.md │ │ │ │ ├── class@UmX7kymkWSROjDZjnoEFg.md │ │ │ │ ├── collect--collectfirst@nCPJKbcDfc4w4c4TroBRe.md │ │ │ │ ├── concurrency@MAsfpdZSMpl9P3ulQbl4i.md │ │ │ │ ├── conditionals@PDoJZATYO9SmMfebmvORn.md │ │ │ │ ├── context-bounds@96F_G2PY8VG_Et9g4DFX2.md │ │ │ │ ├── conversions@OdcjkyWs3s86CqtUnAdxx.md │ │ │ │ ├── cosplay@Rz9OCeWj0y2cwfLrGuXqR.md │ │ │ │ ├── courses@yzVo7NtvU5HdGqg7T7XAh.md │ │ │ │ ├── data-handling@STbiR-fcScKwFwkGDoTh8.md │ │ │ │ ├── data-structures@ACR-ncVRUYN0LXm5x6NhS.md │ │ │ │ ├── distributed-computing@QaJAFu-xHUAGK7fjncQJB.md │ │ │ │ ├── docs@I_Bs6mryYyEAnwT_oPQ5A.md │ │ │ │ ├── doobie@SYZPgKGQUqX729Yo54eZk.md │ │ │ │ ├── early-returns@votWwsha27Bt9i5GhHRvA.md │ │ │ │ ├── ecosystems@BIeOReaWlfP0SkFl1B44M.md │ │ │ │ ├── effect-systems@JuFghXpaI3uHtTckgmYeb.md │ │ │ │ ├── either@P0Vo-2ShpFVfBxIrupLll.md │ │ │ │ ├── emacs@JSzlu4UNQA016AtE5xxml.md │ │ │ │ ├── enums@bSZbsqY1yzq9uKbFlgwkF.md │ │ │ │ ├── error-handling@1T7yhzZMoFKUvgS4ZWiPc.md │ │ │ │ ├── filter@hK_E1meVZkK6ICUs5qmIP.md │ │ │ │ ├── find@qU8svc-H5L2-QeBSXgp_8.md │ │ │ │ ├── flatmap@zEJeNsQcCz4hk7t7fDuVL.md │ │ │ │ ├── float@3MO2hkUs5wh1Xkcs1Yr7s.md │ │ │ │ ├── foldleft@GUvy5sUdY32NJ_9aIzMr9.md │ │ │ │ ├── for-comprehension@pk6KQObR5AhAXj0wf5a3p.md │ │ │ │ ├── foreach@MEwfeQ3yolH5bLVtHocaA.md │ │ │ │ ├── fs2@ERnBDDZA1VjdRryqQ-iOy.md │ │ │ │ ├── funcs-returning-funcs@eSzfUe1nYv7TA3Nl9h2aN.md │ │ │ │ ├── functions--methods@e1dvY1Wd6ZYw2ULKETc49.md │ │ │ │ ├── gatling@55CbOuD2qX3oWzSIfBRlu.md │ │ │ │ ├── gears@0d5OXgNaqc1_iwcGYiYmw.md │ │ │ │ ├── graalvm-native-image@Mp7N98NLWQptk6w5totGR.md │ │ │ │ ├── gradle@tYMRMVFon8V--pXLeye0U.md │ │ │ │ ├── gui@Jf3fxng9tN6PCycXyy5PE.md │ │ │ │ ├── http4s@LATumtt9T5nfP6-jSoM6i.md │ │ │ │ ├── implicit-parameter@9PiyO8DlNgas10ZjZJCkA.md │ │ │ │ ├── indigo@XUg4x7MQTvXzmDkgkET7S.md │ │ │ │ ├── integers@xNMXubCcKuaSkYIgz0YVk.md │ │ │ │ ├── intellij-idea@zDXDdfzObrUlrIkgxCouq.md │ │ │ │ ├── introduction@ojvTMCBlgUf6ywgsgCQM1.md │ │ │ │ ├── iterators@jMqwWE2Aebd7wT4iogIIW.md │ │ │ │ ├── javafx@V0CMqxJh3IZ3Npvp2z7Af.md │ │ │ │ ├── jsoniter@kyYPX8_vvnjixMeZQTPqA.md │ │ │ │ ├── junit@qKy9u6fJoMfRAMlnTv816.md │ │ │ │ ├── jvm@Gy7AaiqSL_38yB73C5W5B.md │ │ │ │ ├── kyo@AhgoqMHyHn4lX6eMJuxZt.md │ │ │ │ ├── laminar@ZH55uB8H48i9mKBtCDciZ.md │ │ │ │ ├── laziness@YqAClVg7U1mb-Be_rnv-L.md │ │ │ │ ├── lazy-collections@kRdh-HUAWJi7d8gdynGUS.md │ │ │ │ ├── lazy-vals@iMe2czy5d7uNpB2Uv2KTK.md │ │ │ │ ├── lazylist@zk07chk34XuM1mac4oe4-.md │ │ │ │ ├── li-haoyi@OYiz0dgiVjYilNRSjh9la.md │ │ │ │ ├── libgdx-w-scala@yogv_RewIk12S8Rh_FEtJ.md │ │ │ │ ├── list@HCXshB5qPYlYmyg3ufA4a.md │ │ │ │ ├── loops@VVO1Cmn0HwVKeMZNJiixa.md │ │ │ │ ├── macros--the-type-system@sWzy6blDheaOBOpwg5lou.md │ │ │ │ ├── macros@mq3uKXW57PdAkbuSBsznD.md │ │ │ │ ├── magnolia@YWog0o_t3XWQgGpjkzsnd.md │ │ │ │ ├── map@i4gSxrJSki5um_6dfLUYK.md │ │ │ │ ├── map@zhRrfAotX8wq6HjR3s13B.md │ │ │ │ ├── maven@6D5cj3ekHNkZPy1Z8ONaQ.md │ │ │ │ ├── method-calls@w_GDO8UjtaM-XTbyQOBsQ.md │ │ │ │ ├── mill@SY6uRGxuo_sXA_R0t8uLJ.md │ │ │ │ ├── monads@PEQNPOy-j2BdL_NQYoq7g.md │ │ │ │ ├── monocle@DHdpzJxOlUnRRx5WhhWHi.md │ │ │ │ ├── munit@Oel8HKCRp5AlaDrsVMRu4.md │ │ │ │ ├── mutable-collections@Dfrh1gTS7CiCSqXGW-APm.md │ │ │ │ ├── no-ecosystem@1pq3RFK0DokxqYAuwfdF8.md │ │ │ │ ├── nothing@MVNwvGwzYyse8YUc9fwnL.md │ │ │ │ ├── object@_Ggnf67Ye0kFvroqqSg_D.md │ │ │ │ ├── operators@9sYmBVtJhOegHWE8mgs5c.md │ │ │ │ ├── option@PPrcoA800FmTFT48H789J.md │ │ │ │ ├── ox@eHbMh_KO2ezvMm-LyhkCR.md │ │ │ │ ├── package@RVwd5ZY4e_RUhsIi1NZFu.md │ │ │ │ ├── pattern-matching@5BGQb1CZQwDwYxDA9bvn4.md │ │ │ │ ├── pekko@dS2USmMlQb4EjY9hvG_by.md │ │ │ │ ├── platforms@pYZHgxBvh3Au3bCFuLWn2.md │ │ │ │ ├── play@VDbh6YkcPssmp2hcZdOt1.md │ │ │ │ ├── playjson@gT46TnxsNzWOIfBvxPb5n.md │ │ │ │ ├── private--protected@mHdNAYbL4yCZZYv0Z_s1w.md │ │ │ │ ├── pure-functions@glMo7kvwKxS3M6pBrGhNn.md │ │ │ │ ├── quill@Fa8GRqxvzE5dq-nD4heEI.md │ │ │ │ ├── range@IN_mRFxfaDiW2_iNDdrHk.md │ │ │ │ ├── reactjs@A9CpbbZ_Q9zIkVX5Rgyp6.md │ │ │ │ ├── recursion@Hrl2L3vdhAub1jnQVuTRF.md │ │ │ │ ├── referencial-transparency@Qm2AQa8AJtmMo_eidqCrz.md │ │ │ │ ├── regex@P607jVa4002JaBDku4V4O.md │ │ │ │ ├── sbt@V0zIDfz8b2LBrNwz81xlR.md │ │ │ │ ├── scala-android-plugin@vsG9D5ZmCMvPaTRmVgYyn.md │ │ │ │ ├── scala-native@4_gOylCtzBT6n1_GBzZdD.md │ │ │ │ ├── scala-on-android@LWum40Gr36CMuCgoTCNHM.md │ │ │ │ ├── scalacli@AleJKnVNfSoksZxhR-oXc.md │ │ │ │ ├── scalafx@pU1ELrp98okX5IOW8sNiX.md │ │ │ │ ├── scalajs@phv4IeRtLcWcLJuiradiv.md │ │ │ │ ├── scalameta@sJqixwq4_tCCRBE3XKNuw.md │ │ │ │ ├── scalatest@9JxLFMiWH7YAINTpoMhCA.md │ │ │ │ ├── scalatest@iD1fWHJi5mS38R5mQ7g3_.md │ │ │ │ ├── scalatra@mGxkqA78ZW3oV79RPWz5J.md │ │ │ │ ├── scalikejdbc@Qc8YYIBFQb2JzHRTPVn86.md │ │ │ │ ├── scope--visibility@w59GmNK0wHo6tADDTaaQS.md │ │ │ │ ├── sealed-traits@-5hM5DFinTWjkzlubUclR.md │ │ │ │ ├── seq@IBkdiusI08JFfHDS6VKsO.md │ │ │ │ ├── set@4yYOxlOkQgkxZS6_94CT-.md │ │ │ │ ├── setting-up-scala@D5djqvuGs8v__c9DrfOIT.md │ │ │ │ ├── shapeless@TwS5Ms3BlAsR6E9aI81aF.md │ │ │ │ ├── slick@L8g7EogMi61pF7Rxv5Srn.md │ │ │ │ ├── slinky@rG1Xfa4gmO_U61MTW_QPd.md │ │ │ │ ├── spark@z6TGywyQRmvbZaHnF_-eQ.md │ │ │ │ ├── specs2@99N6zSHIiXLnSWroEpZZm.md │ │ │ │ ├── strings@cwhAAcKtzUKcXBSEUdIAQ.md │ │ │ │ ├── sttp@Igr2iwZBn3qO6X5ol3YMt.md │ │ │ │ ├── sublime@RXBh4SW__eVXjiTP8v07G.md │ │ │ │ ├── tail-recursion@qEdusMVJk68GRdH-vP6ts.md │ │ │ │ ├── tapir@2esx4ofgIGIGmdwHyDQg2.md │ │ │ │ ├── testing@B-akazRqoFzc1EOuF7qQx.md │ │ │ │ ├── totalpartial-funcs@eje4CLMuZobVwd0EBwwim.md │ │ │ │ ├── trait@vKPb5IZgfciKwUZismkHJ.md │ │ │ │ ├── trampolines@VV-Drj_JlIppItHq4PRFc.md │ │ │ │ ├── try@y4sElb6dWw0vpGNPgRrvC.md │ │ │ │ ├── trycatch@4NPM4TQawMx6-uD0E2blP.md │ │ │ │ ├── type-hierarchy@3zKEn33pENf2eNDGvjEAP.md │ │ │ │ ├── type-parameters@_6s7NV9qbJj_Y4z4_ge4f.md │ │ │ │ ├── type-system@pvYS9XusP0WPCMvrOtHgr.md │ │ │ │ ├── typeclasses@RNBawkn6jQsX4fAjMBfo2.md │ │ │ │ ├── unapply-method@NcGlkEvp1t46EmX5GQRkD.md │ │ │ │ ├── unit@nvUwMAiZdkKbMsFzc2h3r.md │ │ │ │ ├── upickle@4GXTv2Rq2oyp5fZ5EqaMz.md │ │ │ │ ├── utest@Ja0keWOyCECHo-dXgwFK8.md │ │ │ │ ├── variables--constants@-qLeSRC44_V-c8hoHyMqA.md │ │ │ │ ├── variance@upZK3qxWKokNL3tlFKhK6.md │ │ │ │ ├── vector@p3FdTk1pqQoBK3_NKmLDb.md │ │ │ │ ├── video-game-engines@vwvykjlIYXiNi2yfWZcrq.md │ │ │ │ ├── views@52RX2tDml7raPbQpZCbnx.md │ │ │ │ ├── vim@ZmrehlOEUkjVJXiejyWt7.md │ │ │ │ ├── vs-code@kK2gLsPax0kj_cUlfwaYm.md │ │ │ │ ├── working-with-strings@Z_cGu1NZ6wh7qkEw2Knyf.md │ │ │ │ ├── youtube@ToGJzk3ZpvQsUwOFicxW2.md │ │ │ │ ├── zed@uvw1H2RybuU979G7yZWy6.md │ │ │ │ ├── zio-streams@jkWYgSLimg3O7ddN_8rb-.md │ │ │ │ ├── zio-test@7ki2PYRU5cJqwqMbC4wOz.md │ │ │ │ ├── zio@e7zcJd-SAYV_LGAZPCnSa.md │ │ │ │ └── zio@y4ulspoL7KKUilPG98KWd.md │ │ │ ├── server-side-game-developer/ │ │ │ │ ├── content/ │ │ │ │ │ ├── actor-model@KUQEgHldZPOLwFoXqQ2vM.md │ │ │ │ │ ├── address-conversion@SBA7pa9o0AM0ZEBepd7UM.md │ │ │ │ │ ├── ai@dkCVwuy8GKeEi3VJar_Zo.md │ │ │ │ │ ├── akka-java@eAEpEUVZcSKO9uCIlMN5y.md │ │ │ │ │ ├── akknet-c@SsOz9Pj6Jc_55PgpmziL6.md │ │ │ │ │ ├── amazon-ml@U0RlO_puezQPZP0-iBXgW.md │ │ │ │ │ ├── apache-kafka@gL7hubTh3qiMyUWeAZNwI.md │ │ │ │ │ ├── apache-spark@yrWiWJMSyTWxDakJbqacu.md │ │ │ │ │ ├── api@a2pcxVTGdAPw8aLvdr19M.md │ │ │ │ │ ├── arp@JI_wUdT2hjsrvbIhLvHcT.md │ │ │ │ │ ├── asnc-await-c@mAXMpUDmhGOncnCRrENJv.md │ │ │ │ │ ├── asynchronous@ThBxS9xIMt9OrXfnto3rW.md │ │ │ │ │ ├── aws@Rkx2A6oWsddlCTseZlpRU.md │ │ │ │ │ ├── azure-ml@vBqwmlzoT5XVEhV9IeGso.md │ │ │ │ │ ├── azure@73uoFNGcCALxIuRNbebav.md │ │ │ │ │ ├── barrier@6k25amPkU9lnZ7FMNn_T6.md │ │ │ │ │ ├── bsd-socket@U_tZFM80W3xJx8jj4skCr.md │ │ │ │ │ ├── byte-manipulation@H21PanCggDfQt34-JzgfO.md │ │ │ │ │ ├── c@DuyUc9a-47Uz03yr4aeyg.md │ │ │ │ │ ├── capability@5kF1fqr-mn5-15e3aMa9k.md │ │ │ │ │ ├── cassandra@1jqSxk1nwByiQa1De81F3.md │ │ │ │ │ ├── category@NH2eQ1_nij1icTgoO027b.md │ │ │ │ │ ├── cc@E4H3hniIW6hKpH3Qr--N5.md │ │ │ │ │ ├── channel@SXOEMkcVYBsRza6BPmmwy.md │ │ │ │ │ ├── checksum@XxBl-zO7CF6DpOZ2bMDxJ.md │ │ │ │ │ ├── checksum@tBOvBpDi3SOKZjAmkxdM0.md │ │ │ │ │ ├── cipher@1788KFqsQBkYARqA0T5GX.md │ │ │ │ │ ├── cloud-ml@XvvlvDKfYRCcYtTdWohsd.md │ │ │ │ │ ├── cloud@hhtqvFfTCuVPT0OPu4Y1a.md │ │ │ │ │ ├── concurrency-java@RT9XvlxvIM_hHTtNmbva3.md │ │ │ │ │ ├── condition-variable@xR6pERldq4wPl9GVLHAhT.md │ │ │ │ │ ├── congestion-control@1GML0Jsfdb1Fn-0PNryiQ.md │ │ │ │ │ ├── congestion-control@jsNsyrGzegVnjIF2l52vI.md │ │ │ │ │ ├── connection-hijacking@ubRiY3jdh3iS3diN482IU.md │ │ │ │ │ ├── connection@5sI3RHaLudq4TfpjoYeOp.md │ │ │ │ │ ├── containerization@k3FJY26SVxdZx4MLLE25h.md │ │ │ │ │ ├── coroutine@o0Y_hM0KXUApfsXG4PvOY.md │ │ │ │ │ ├── couchbase@6KTj_giX2k9l2lPd_Fp-d.md │ │ │ │ │ ├── dal@dt_SmZuwklLimhupvjxC1.md │ │ │ │ │ ├── data-clustering@XCJvgUSS7-oDR-XGdDY33.md │ │ │ │ │ ├── data-transfer@5bJUcx3v4dpdlIsx7bFvK.md │ │ │ │ │ ├── databases@FLFaGZDg2MSG6_YHnWETM.md │ │ │ │ │ ├── datagram-construction@jnQAzUUnwpJgoRuRIFtSe.md │ │ │ │ │ ├── datagram@wD_HWc9YxPhlkilt585pg.md │ │ │ │ │ ├── deep-learning@jkWvfp4GqckYPQ48GtjlR.md │ │ │ │ │ ├── denial-of-service@TbXJO__4xSnzK1fvvJK86.md │ │ │ │ │ ├── dependency-injection@uTlxyDOtvt_Qp0gXLWO-j.md │ │ │ │ │ ├── descriptor@OAyMj6uLSv1yJ87YAjyZu.md │ │ │ │ │ ├── design-patterns@gB-TYpgUDV47bxznNJhYn.md │ │ │ │ │ ├── determinism@zFx1jjt1hKgCpYHFTzbZZ.md │ │ │ │ │ ├── dhcp@aTHJh-xw8soCxC1bIDdXm.md │ │ │ │ │ ├── dns@yNytLrQAMKBw4t73YRL3J.md │ │ │ │ │ ├── docker-compose@yAf7VDX7dyaT5AdlNnuKD.md │ │ │ │ │ ├── docker@zW_7VLeEHQp8fp_f5N__0.md │ │ │ │ │ ├── dump-analysis@1c6EqGv1g-d8M1i0vKImb.md │ │ │ │ │ ├── dynamodb@9vc7sFE_XakYXtKRMxLXi.md │ │ │ │ │ ├── epoll@qaWv4gxnnj3uX8lEm9KQ4.md │ │ │ │ │ ├── erlang@QGtGx5LBEWa1DD3Y7ztUy.md │ │ │ │ │ ├── error-detection@vFM311xSa5OqNVove2f6j.md │ │ │ │ │ ├── fiber@TVJrlUsg30YIM1yjsZfJI.md │ │ │ │ │ ├── flow-control@lDVD-3i64Mk7-KPJrXmFH.md │ │ │ │ │ ├── frp@xDYOvIbXc-iJ2zOKqe0YL.md │ │ │ │ │ ├── function@YPvm8XD_FaFYCQ-b7-KsH.md │ │ │ │ │ ├── functional-programming@HXSWvhgT4L5w6xgOO-3kj.md │ │ │ │ │ ├── future--promises@zbIbPlqTNSbJUkqH9iLQv.md │ │ │ │ │ ├── gcp@wD6dUrS-tP2gpCHPghFp5.md │ │ │ │ │ ├── go@d5iQYn97vuoxJnCFGPdOa.md │ │ │ │ │ ├── goroutine-go@f-L_eaZd0EjBW9-n9Pllt.md │ │ │ │ │ ├── grpc@_uqTTBUYAzDHbEUkDzmzg.md │ │ │ │ │ ├── heavy-vs-lightweight@OYXKtl4A-vaK6yGO6hS6n.md │ │ │ │ │ ├── io_uring@YH7u1FKh85wz78J0stuzS.md │ │ │ │ │ ├── iocp@7pgdOZomhGilBTwfJLMbm.md │ │ │ │ │ ├── ip-addressing@3ZcJNDCHw2pFzewmoB-03.md │ │ │ │ │ ├── ip@tg94V7K0mgYhpkUMp_Scv.md │ │ │ │ │ ├── ipv4@pHVB0K8Vtk3ToD6n_f1wv.md │ │ │ │ │ ├── ipv6@TqBlAMfhARhlJed6xD7eg.md │ │ │ │ │ ├── java@LG8JPL1po-gEs1V5JyC8F.md │ │ │ │ │ ├── javascript@ufufnULqsglE5VhEIAdSI.md │ │ │ │ │ ├── json@y0ZJQQfi8Qx6sB4WnZlP5.md │ │ │ │ │ ├── kqueue@caK32NMMrn-3BGAXZoPPr.md │ │ │ │ │ ├── kubernetes@lUBUUoETjfADmM4OPtwwX.md │ │ │ │ │ ├── link-capacity@OzY-LPcfj1sBm_0F0WbIJ.md │ │ │ │ │ ├── max-segment-scaling@1l5dhQWYPhUSg-cy5pSlK.md │ │ │ │ │ ├── max-segment-size@w6ysmcsBn9jJ8xMvg7hcD.md │ │ │ │ │ ├── memcached@ayeezKxQkXAPJMTShsOBU.md │ │ │ │ │ ├── message-queues@cw7WdFfL5HpeZ_n8wYk2t.md │ │ │ │ │ ├── mongodb@HYxtPW401-J6aYcTuiGnx.md │ │ │ │ │ ├── ms-sql@QMNUAKAuRI9lyf2_jUPsj.md │ │ │ │ │ ├── multithreading@3QSLUMKD0G08N3MIb1cG7.md │ │ │ │ │ ├── multithreading@_jd91rrAXGbJI9RhXlSx8.md │ │ │ │ │ ├── mutex@G_BEJKkJ1_Nc43aosy_iS.md │ │ │ │ │ ├── mysql@HsBqd08Ro0VJnx0FlumMQ.md │ │ │ │ │ ├── oorp@yWj70LpF4LKB8J6GbYvsq.md │ │ │ │ │ ├── ordered-vs-unordered@WMdCDmFsytsF2AWQXfzC8.md │ │ │ │ │ ├── orm@OyxWMFy8s7Lxko_K89fjo.md │ │ │ │ │ ├── out-of-band-data@3OMu3RM-6pMjqY1jAmC2-.md │ │ │ │ │ ├── packet-structure@CCxVnrGDKa1EROXgF_OAm.md │ │ │ │ │ ├── packet-vs-datagram@JE3uZ5U6oe6dVzsmglTl2.md │ │ │ │ │ ├── postgresql@dAiEwN7phwMyaitvM5kRl.md │ │ │ │ │ ├── proactor@Tvxe2NemcH21y-eB4bosv.md │ │ │ │ │ ├── programming-languages@6ilqzjvI4J1pUCmTJ33PA.md │ │ │ │ │ ├── programming-techniques@tGQu18PWDatW7HvkTP-uh.md │ │ │ │ │ ├── protobuf@w2zbab_6Gxw6AWS0N759U.md │ │ │ │ │ ├── pthread@HU0yUyl89WD8WnR9PJn7l.md │ │ │ │ │ ├── pytorch@LTSIfq10qDJMTCnIIyqvb.md │ │ │ │ │ ├── rabbitmq@UESjGrFyUbNf4pQamaBoy.md │ │ │ │ │ ├── reactive-approach@LVwGXmZhMewGQy61qwNyu.md │ │ │ │ │ ├── reactive-approach@Vl-WW0LThrQTOO_tFl51B.md │ │ │ │ │ ├── reactive-model@p0P3ZGq_QTCop0vMwe7P3.md │ │ │ │ │ ├── reactor@7mYpgn2gr-5vAYW-UR7_x.md │ │ │ │ │ ├── redis@7YNaELVcoV7DV1Fa06USi.md │ │ │ │ │ ├── registered-io@94hJX1iGifDzIuaU3zU5j.md │ │ │ │ │ ├── reliability@2jDV-ovvrkBbTTLk5VbR9.md │ │ │ │ │ ├── reliability@Vh81GnOUOZvDOlOyI5PwT.md │ │ │ │ │ ├── reliable-transmission@X2KHWgQZDHSVDsTRMUwSj.md │ │ │ │ │ ├── reliable-vs-unreliable@MoyBGT9bscUe8vMN4J0bG.md │ │ │ │ │ ├── resource-usage@LkGI0VpJ3WkpPHkJhJgWk.md │ │ │ │ │ ├── rest@Oq3GQ5gBUxIl1Qe8NB3LB.md │ │ │ │ │ ├── routing@bYb7nA-Vn9e6VtdbUT3tq.md │ │ │ │ │ ├── rpc--rest@YxaroYL_Az0vKRCeu2jsp.md │ │ │ │ │ ├── security@qkO0s9zR0sAnjTRWcrLQY.md │ │ │ │ │ ├── segment-structure@zTCmPUp9j5P1wpGgiboMa.md │ │ │ │ │ ├── select@5-5toy2CblZPCV9d5QPEo.md │ │ │ │ │ ├── selective-ack@SPpOO25b7wpajWDIrKi1u.md │ │ │ │ │ ├── semaphore@DYvzGc_r0SlOArPPc1gNI.md │ │ │ │ │ ├── serialization@TS6dz61rUSxm-SqmK6JKe.md │ │ │ │ │ ├── server-side-development@rQArtuVKGVgLn_fw9yO3b.md │ │ │ │ │ ├── serverless@DOmbRRK_RRPElOuTB7AAK.md │ │ │ │ │ ├── sharding@3use5vuLBJTk40wOg9S-X.md │ │ │ │ │ ├── socket-programming@HvpuFTCknHPhnFkhmhRc4.md │ │ │ │ │ ├── spinlock@lVXfA_oZr82mFfBvLnnRK.md │ │ │ │ │ ├── ssl@PSvPjaVtko71BeIA-hYqf.md │ │ │ │ │ ├── streaming-vs-broadcast@pJw8fN1dt3BABtZVz7wGE.md │ │ │ │ │ ├── synchronization@idmrgKgVWVLZYANbXiZnS.md │ │ │ │ │ ├── synchrony@l5QTk408Ubagw8XzRAfoZ.md │ │ │ │ │ ├── task-based@LKPcEeqBOPhQOztD3cM3T.md │ │ │ │ │ ├── tcp-vs-udp@RfTcTUjaXyp49FnUf44MK.md │ │ │ │ │ ├── tcp@mUCidjOsVLMAVDf2jmV5F.md │ │ │ │ │ ├── tdd@FKOhe21PVlaKIoZI4hd49.md │ │ │ │ │ ├── tensorflow@iJE9RnKC8QjPnsFeZAbtl.md │ │ │ │ │ ├── thread-building-block-c@tiG0mZpLJ2zUr2IPYyhnv.md │ │ │ │ │ ├── thread-local-storage@IeD-oQ1bkwlKNC-R0lJjZ.md │ │ │ │ │ ├── timestamp@6KAYNPLEFMp6Jha8FLMAU.md │ │ │ │ │ ├── tls@FX8ASd-QzTUFDHzBB93WK.md │ │ │ │ │ ├── toml@l8iEC3g0ICSfmIE1MxcUl.md │ │ │ │ │ ├── transactions@r2OeI7YC1BLLfctC8q69W.md │ │ │ │ │ ├── udp@IMyHwnXxJK6oFxzOMLxjS.md │ │ │ │ │ ├── update-process@3Eat22rFjUl4eTtGz8u4N.md │ │ │ │ │ ├── veto@ZLTfpRZ0rF-mtd7Z0R2WF.md │ │ │ │ │ ├── vulnerability@MwLWDlciJOq_0n5S3GoF-.md │ │ │ │ │ ├── window-scaling@zvBKjceXRSfEe_3MDCEL5.md │ │ │ │ │ ├── windows@mW2L_9NckgPRH7g5W9NHq.md │ │ │ │ │ ├── winsock@GfTXffisLyQgp66zcQ7Py.md │ │ │ │ │ ├── wsa-poll@D9Yeyn8phDhB1ohMWccgr.md │ │ │ │ │ ├── xml@v43K6srds7m5SQFqNaY0T.md │ │ │ │ │ └── yaml@uHcUSVLz_2-Usk6ckSvwr.md │ │ │ │ ├── faqs.astro │ │ │ │ ├── migration-mapping.json │ │ │ │ ├── server-side-game-developer.json │ │ │ │ └── server-side-game-developer.md │ │ │ ├── shell-bash/ │ │ │ │ ├── content/ │ │ │ │ │ ├── 0@pgZIDDxAP9mOtEI0HL3l-.md │ │ │ │ │ ├── 1-2-3@DiYuY3M3eD1WKO5w16Swa.md │ │ │ │ │ ├── @2Fh0NFuNxuc-wU3VXv8Zj.md │ │ │ │ │ ├── @Pr8XdVGYBIuCyRW4w45sa.md │ │ │ │ │ ├── @VLzMSaoVA46PTLHwZtDUx.md │ │ │ │ │ ├── @X6aVYPapBn-EC9Dw6LMDB.md │ │ │ │ │ ├── @hoRtqMV7B23bBJFI-RWRB.md │ │ │ │ │ ├── @hxjqlxolS_ahtro4T0EKG.md │ │ │ │ │ ├── @mYg9d8e0_XjtXBqBYtaaL.md │ │ │ │ │ ├── @qG71FX6DwRm1rdtjtN78u.md │ │ │ │ │ ├── apt@nfyh2co43xfR9DJbNnM_Y.md │ │ │ │ │ ├── arithmetic-expansion@LHoR6krZTuJW5BGiKf_AT.md │ │ │ │ │ ├── arithmetic@60ika3rjs42VIk-3AcOdq.md │ │ │ │ │ ├── arrays@4WFWrrcvLgU8Fz8RjQ4lf.md │ │ │ │ │ ├── associative-arrays@YM7wA4MgeailSoXR_03Qx.md │ │ │ │ │ ├── at@Wny7lCxP2M1FaoUYDD7Gf.md │ │ │ │ │ ├── awk@GXF6SSkYtVyGYB_LFSIpe.md │ │ │ │ │ ├── awk@Jh1gVJvhe-H22VB4hnbuU.md │ │ │ │ │ ├── background-jobs@Zjn5u1IUWqyyya4c2cHiP.md │ │ │ │ │ ├── bash--n@_UDEyH6hECoOoXcbcXTLy.md │ │ │ │ │ ├── bash-alias@LlxpR2LiAr9uKMXEXTk0H.md │ │ │ │ │ ├── bash-data-types@vM0Y4fao-pNjNjWYCJve3.md │ │ │ │ │ ├── bash-debug@6hXvAV0R7FlJ8UkQzRzMZ.md │ │ │ │ │ ├── bash-operators@Co0k7A7MyQoELnPwPU10m.md │ │ │ │ │ ├── bash-script-anatomy@nMFXyeZ8I5jAPfs16Jixn.md │ │ │ │ │ ├── bash@EqgAG1t05RuiAO1TXRq4Y.md │ │ │ │ │ ├── basic-editor-ops@WbZu0zM2d56LiGauOp8ub.md │ │ │ │ │ ├── basic-regex-syntax@qNsNJrqwsGtumOM2STB8u.md │ │ │ │ │ ├── bc@B2g_optsVEtw-5vRYIpgb.md │ │ │ │ │ ├── break-continue@Wl39zpLh6alsMkn0YZ9-N.md │ │ │ │ │ ├── brew@d8jGE833q0Wf6gB3DZil4.md │ │ │ │ │ ├── bzip2-xz@qedrcO4QA2ZxV24l0Q6Or.md │ │ │ │ │ ├── case-conversion@cBJbM6nl0Dy9Ru5hruzpK.md │ │ │ │ │ ├── case@SSSVVAve99X8FZX9vtHlo.md │ │ │ │ │ ├── cat@Zom0OpBLi153i8hkoYLj5.md │ │ │ │ │ ├── cd@9A6SE89by-1I2HmpGarLj.md │ │ │ │ │ ├── chgrp@zaXwK7xPsrULce1yJwhB_.md │ │ │ │ │ ├── chmod@qrqPo-pgzupCK0IxlGn7S.md │ │ │ │ │ ├── chown@w95b7f3-7Q8qtTpyJih6B.md │ │ │ │ │ ├── cli-vs-gui@86QR-PVqgvvyvJvgTIer-.md │ │ │ │ │ ├── cmd@C7HE5jpaSIUqm6L8b9orY.md │ │ │ │ │ ├── command-substitution@BuOM-A5110MPv8325EQnM.md │ │ │ │ │ ├── comments@sYzelzBxQUcz5bK1HVWam.md │ │ │ │ │ ├── comparison@XUDkgfURAsI_A3v3EPZA_.md │ │ │ │ │ ├── conditionals@tEaYnBeI5tO8NT-a1PG3B.md │ │ │ │ │ ├── cp@gCPCTm96RrFeNM_Ok4TAY.md │ │ │ │ │ ├── create-print-modify@4leZS9_-GAbx5ycMQosOX.md │ │ │ │ │ ├── cron-crontab@QGDwieDblgpS6U0n_Ivt8.md │ │ │ │ │ ├── curl@ZWMGvUxnohv6-dzsaSHuB.md │ │ │ │ │ ├── cut-paste@EU-UAaRVY2s_PLZHJWf9z.md │ │ │ │ │ ├── dash@BP7hfSSD13DM2np0zaGBB.md │ │ │ │ │ ├── debugging@fR3sok0EJTGHELbPO6MAW.md │ │ │ │ │ ├── df-du@rmSSz2ka9e1nQwx18Ofy8.md │ │ │ │ │ ├── direct-execution@9xn7KfHZYPseAixtw_dtG.md │ │ │ │ │ ├── disown@Qs07iAbFbJk97xHpo10dO.md │ │ │ │ │ ├── dnf@iE263510iTgm3OEeB9b77.md │ │ │ │ │ ├── echo@k45FWrNrRuIp6HEN3ysTd.md │ │ │ │ │ ├── emacs@AiDr7sOJkSN6p346jcDpJ.md │ │ │ │ │ ├── environment-vs-shell-vars@1mBAGIrg4ohvJcJ-y8Kbl.md │ │ │ │ │ ├── error-handling@aNpvGNnV0q-7emxJVJow2.md │ │ │ │ │ ├── error-logging@Qs5jcx6d643cJDdhkPPxD.md │ │ │ │ │ ├── error-redirection@zu0hsOt8GVlARhbepjQ1A.md │ │ │ │ │ ├── exit-codes@fG4D7iuiCDlV1PFwMfAdM.md │ │ │ │ │ ├── exit@JB_FThjpxO-7G01XrKDPi.md │ │ │ │ │ ├── expr@VOYYJUqKqkTRaxqUip8yr.md │ │ │ │ │ ├── extended-regex@6IzuWNaMVjjyQV-KLqRlX.md │ │ │ │ │ ├── fg-bg@Ey38pCn0vlhZXLrJChtIW.md │ │ │ │ │ ├── file-permissions@zxdwDMOVAoP8IgUqrggKq.md │ │ │ │ │ ├── file-test@PuV5XtaeKgb9vdFIKta5M.md │ │ │ │ │ ├── files--directories@DUUstDjzKKAXN1IXzbqjt.md │ │ │ │ │ ├── find@pAb3O3Isca9u6yK5mqWQ2.md │ │ │ │ │ ├── find@ud8fTxgvvbhCyyAxJA6lc.md │ │ │ │ │ ├── fish@LjkmfTYWMrOKLSqtpyKGk.md │ │ │ │ │ ├── for@zE7sS5VNUbEbt1y2iSvEi.md │ │ │ │ │ ├── free@8Ll6sByPqMnjVms5J1ns5.md │ │ │ │ │ ├── function-scopes@lil5vo78g474F1yomar9y.md │ │ │ │ │ ├── functions@peZDR615PgGw7TQalyG_2.md │ │ │ │ │ ├── grep@ZqAwAme_yvasmYHEZID1G.md │ │ │ │ │ ├── gzip-gunzip@b8ph0RGUpVWrgEQ05Wvgy.md │ │ │ │ │ ├── head-tail@WSxairrSGlV0LEps2xeIC.md │ │ │ │ │ ├── help-commands@4yRwCKzvCctFpMD2mYiky.md │ │ │ │ │ ├── here-documents@WOoTpi1vAZpktjtQgG9GK.md │ │ │ │ │ ├── here-strings@D0VV5UpW2X4mMghpp2fdo.md │ │ │ │ │ ├── if@fz9XJLGkMPpq6TRJn3Hsh.md │ │ │ │ │ ├── ifconfig-ip@q-41zNMAJ-BYwrz_fZP60.md │ │ │ │ │ ├── input-redirection@Chfv9Fyy-Mk2zpOrYNbjV.md │ │ │ │ │ ├── inputoutput@n0sesqABTmbGYmcqlpH4b.md │ │ │ │ │ ├── introduction@lzzQWCFqpOnN2J_3Jck_3.md │ │ │ │ │ ├── iostat-vmstat@lwul2wUhhCnXxKO6-ysX2.md │ │ │ │ │ ├── jobs@Sn7RlXc5dgD1gqDGikco-.md │ │ │ │ │ ├── join-split@rtzApgTlDTfC_rdCnU6xx.md │ │ │ │ │ ├── ksh@BnblV98Tul3QlyA1nIB63.md │ │ │ │ │ ├── less-more@kW_sjWK-rtGokfL_OByhM.md │ │ │ │ │ ├── let@oI019HqH9UO_tQRe2xebi.md │ │ │ │ │ ├── literals@Bj0lEgFXJtG_7y6YssOcj.md │ │ │ │ │ ├── logical@tRwO9DC_ZUD4g5iSVC40u.md │ │ │ │ │ ├── loops@1rIFm5ROQ8b1rsWeD9h4x.md │ │ │ │ │ ├── ls@Kn_EQciiD_Fjj308aF_j0.md │ │ │ │ │ ├── mkdir@pwP3U4zz9Jtpnp2ZRgajh.md │ │ │ │ │ ├── mv@zN32jR8SNm5P1txqQsyCv.md │ │ │ │ │ ├── nano@NtjrVcEHf8wuh771U2AMI.md │ │ │ │ │ ├── navigate-between-dirs@QnC0gCoBj_559CgaTQgr4.md │ │ │ │ │ ├── netstat-ss@bX48eoEWdUFeL2rYXuzG5.md │ │ │ │ │ ├── nl@TZEmlwTGBWAZ6w8jZ-p8U.md │ │ │ │ │ ├── nohup@7-4WglSAbhBZUpP8HS6xY.md │ │ │ │ │ ├── numeric@a5cz3ZGg-JQKzdJdihCtO.md │ │ │ │ │ ├── output-redirection@MpSnq-W8z4QA8-oU_tbRC.md │ │ │ │ │ ├── package-management@Kwr37_gNDhkwSkg49bg35.md │ │ │ │ │ ├── pattern-replacement@aYQlgbgFt250MW1nLYvFK.md │ │ │ │ │ ├── ping@D-sgMFB-IhNw41hNJsSF6.md │ │ │ │ │ ├── pipes@YyCvxYgFzobwF_vMQXunZ.md │ │ │ │ │ ├── popular-shells@IYlYUnQh2iZrdpyUsMxg0.md │ │ │ │ │ ├── powershell@y4mIT9yer85CrU_KlRxGk.md │ │ │ │ │ ├── printf-formatting@XCCuDzGE-5LPhHEPGvVMj.md │ │ │ │ │ ├── process-management@ZTJrnx12KSrcyUfd0RfPu.md │ │ │ │ │ ├── process-substitution@Oc80VSBDYTHkGOV4Jqo19.md │ │ │ │ │ ├── process-substitution@uk7TEHUqTIjmH4MJToxPe.md │ │ │ │ │ ├── ps@gOdW5k4fRu9P-3D3ze8aA.md │ │ │ │ │ ├── pwd@ng5ySgj1HQmD_gfQ4TSPI.md │ │ │ │ │ ├── read-user-input@o2vQXl9WDOO4NAsLjYv_4.md │ │ │ │ │ ├── recursive-functions@X4-kdfaVimq5VP_gPTWR0.md │ │ │ │ │ ├── redirects--pipelines@reLvp_PnKqpyWWtnuICPj.md │ │ │ │ │ ├── regex--grep-sed-awk@jg-aCpStgHiyt7edHHg7G.md │ │ │ │ │ ├── regular-expressions@W7NlQoj0EDxvuMVj4MKXc.md │ │ │ │ │ ├── repeat-commands@tu3NFc76-j6VVysFdk8Kd.md │ │ │ │ │ ├── rm@uS5HS_4a-lk3AtXaMyAlp.md │ │ │ │ │ ├── rmdir@cqZP-2xfil-1Zq3TD7qiN.md │ │ │ │ │ ├── rsync@mImvR0TfLjDqj_Td4G7Gy.md │ │ │ │ │ ├── running-shell-scripts@dj3KiBtPjRK2DF5HeuoYZ.md │ │ │ │ │ ├── running-with-bash@aZ7WGLUZyejFRbfWtSyhB.md │ │ │ │ │ ├── running-with-source@ZBYzPltaUePoOldJ6zRj8.md │ │ │ │ │ ├── rwx@M27BJ6fgVdaBxyWE-OdNl.md │ │ │ │ │ ├── scp@PzRwOkhukRE1cTHXOXUTu.md │ │ │ │ │ ├── script-arguments@BCkD0b9unC1lfjUThU3hX.md │ │ │ │ │ ├── sed@4XfvvrFQoV0X7dfaKYFlv.md │ │ │ │ │ ├── set--e@I-N9SM8ZVcOTVQs8_vtJm.md │ │ │ │ │ ├── set--o@OOskpOLWFe1rN0XMuabAS.md │ │ │ │ │ ├── set--u@HrzalKXWVmqD-8SfdQJVu.md │ │ │ │ │ ├── set--x@8Q1FCxKYYl-HnMGkwdK6h.md │ │ │ │ │ ├── setting-up-bash@6SR4c75dEKoFxZ88sDtfi.md │ │ │ │ │ ├── shellcheck@r_G62Mx-S8wBcxduFbPMh.md │ │ │ │ │ ├── shift@u_kpVb3V8Xp-0fex_5-yG.md │ │ │ │ │ ├── sort@P9pwqBvPDhcvVIj8fNhGX.md │ │ │ │ │ ├── special-variables@_BzADQXji4lVY620U4cZa.md │ │ │ │ │ ├── ssh@eVbx1WsfeHcVaFs-vXpwF.md │ │ │ │ │ ├── stdin-stdout-stderr@3VulHH-Y-VdMRM6VBVWar.md │ │ │ │ │ ├── stop-execution@Ydqpp_YYujdHyYraNEt4h.md │ │ │ │ │ ├── string-length@sBI1aCY7XmXBwqTrokt9F.md │ │ │ │ │ ├── string-manipulation@PS9R8AX-_dgeqYL2Y67Ff.md │ │ │ │ │ ├── string-operators@ryZ2MI4blZCwfuNC_TeUe.md │ │ │ │ │ ├── strings@Sz2F519WqEhkKZE0NBveH.md │ │ │ │ │ ├── substring-extraction@6TonvFzr_nmoFsATwuZK7.md │ │ │ │ │ ├── success-vs-failure@wKMq5G8cmqo3JnHG4Z-c1.md │ │ │ │ │ ├── systemd-timers@ResodrV_p7zK1dJbqT0us.md │ │ │ │ │ ├── tab-completion@HESaq3OyuouEqjpZITYUd.md │ │ │ │ │ ├── tar@ESjj2b8Hk0Irj4E2Gmj6w.md │ │ │ │ │ ├── tcsh@SHD2pc0D5QjDpEwzsFWz-.md │ │ │ │ │ ├── text-editors@it421LC-vLFNmTcWxrsX6.md │ │ │ │ │ ├── top-htop@M2afRR6yY8iq85_MnfGKV.md │ │ │ │ │ ├── touch@fssn0pz6ooqG-EE8rZl-L.md │ │ │ │ │ ├── tr@YJblaz_GKC5sH7ntFe5ls.md │ │ │ │ │ ├── trap@c0F44DSG7eVcqwaOfk2Z-.md │ │ │ │ │ ├── uniq@4pygQshD_WdP0i6xq3Kc8.md │ │ │ │ │ ├── until@51xww3YG_O8O7y8CUum83.md │ │ │ │ │ ├── uptime@R57tdCBI0rLmzWEuJeBTW.md │ │ │ │ │ ├── variable-scopes@ivcDgpa1kMPxcOt1OCjba.md │ │ │ │ │ ├── variables-best-practices@9-PPCJDdGh5SWKT4jT6Zs.md │ │ │ │ │ ├── vi@QZXUYcr1vvbvxRmPSsK53.md │ │ │ │ │ ├── vim@jPAHVLBC87n4TIyiAZJue.md │ │ │ │ │ ├── wc@mg5f-DAezgwmwflmncSsO.md │ │ │ │ │ ├── wget@F5w3pYH5Z58NAJ81p5q8n.md │ │ │ │ │ ├── what-is-a-shell@YD3FMyy1Wma0gXc8G612A.md │ │ │ │ │ ├── what-is-bash@GdSViKr5r3uHxzihSjdYV.md │ │ │ │ │ ├── what-is-scripting@LloORF-pz-sbfuzNj1WjG.md │ │ │ │ │ ├── while@yX-SskrRyFAUFpyIYG7BU.md │ │ │ │ │ ├── yum@_p6LP0uvp9QpBISr1t4KX.md │ │ │ │ │ ├── zip-unzip@hOtzJ9tH4OcB2uI2T_si5.md │ │ │ │ │ └── zsh@m-sOOaGyhQg3bgmWsXtOH.md │ │ │ │ └── shell-bash.md │ │ │ ├── software-architect/ │ │ │ │ ├── content/ │ │ │ │ │ ├── acid-cap-theorem@bbKEEk7dvfFZBBJaIjm0j.md │ │ │ │ │ ├── actors@AoWO2BIKG5X4JWir6kh5r.md │ │ │ │ │ ├── apache-spark@a0baFv7hVWZGvS5VLh5ig.md │ │ │ │ │ ├── apis--integrations@Ocn7-ctpnl71ZCZ_uV-uD.md │ │ │ │ │ ├── application-architecture@Lqe47l4j-C4OwkbkwPYry.md │ │ │ │ │ ├── architecture@OaLmlfkZid7hKqJ9G8oNV.md │ │ │ │ │ ├── atlassian-tools@3bpd0iZTd3G-H8A7yrExY.md │ │ │ │ │ ├── auth-strategies@KiwFXB6yd0go30zAFMTJt.md │ │ │ │ │ ├── babok@LQlzVxUxM3haWRwbhYHKY.md │ │ │ │ │ ├── balance@otHQ6ye1xgkI1qb4tEHVF.md │ │ │ │ │ ├── bpm-bpel@DwNda95-fE7LWnDA6u1LU.md │ │ │ │ │ ├── ci--cd@isavRe4ANVn77ZX6gNSLH.md │ │ │ │ │ ├── client--server@mka_DwiboH5sGFhXhk6ez.md │ │ │ │ │ ├── cloud-design-patterns@CxceVdaNCyKDhs0huDtcL.md │ │ │ │ │ ├── cloud-providers@C0rKd5Rr27Z1_GleoEZxF.md │ │ │ │ │ ├── communication@Ac49sOlQKblYK4FZuFHDR.md │ │ │ │ │ ├── consult--coach@LSWlk9A3b6hco9Il_elao.md │ │ │ │ │ ├── containers@l3oeo65FyV5HHvw5n_1wa.md │ │ │ │ │ ├── cqrs-eventual-consistency@RsnN5bt8OhSMjSFmVgw-X.md │ │ │ │ │ ├── datawarehouse-principles@B5YtP8C1A0jB3MOdg0c_q.md │ │ │ │ │ ├── ddd@IIelzs8XYMPnXabFKRI51.md │ │ │ │ │ ├── decision-making@MSDo0nPk_ghRYkZS4MAQ_.md │ │ │ │ │ ├── design--architecture@fBd2m8tMJmhuNSaakrpg4.md │ │ │ │ │ ├── distributed-systems@j7OP6RD_IAU6HsyiGaynx.md │ │ │ │ │ ├── documentation@5D-kbQ520k1D3fCtD01T7.md │ │ │ │ │ ├── emc-dms@YfYviOXqGVp9C6DuhqBrn.md │ │ │ │ │ ├── enterprise-architecture@vlW07sc-FQnxPMjDMn8_F.md │ │ │ │ │ ├── enterprise-software@8yALyPVUZPtd7LX3GrO1e.md │ │ │ │ │ ├── esb-soap@fELnBA0eOoE-d9rSmDJ8l.md │ │ │ │ │ ├── estimate-and-evaluate@m0ZYdqPFDoHOPo18wKyvV.md │ │ │ │ │ ├── etl-datawarehouses@JUFE4OQhnXOt1J_MG-Sjf.md │ │ │ │ │ ├── firewalls@Hqk_GGsFi14SI5fgPSoGV.md │ │ │ │ │ ├── frameworks@hjlkxYZS7Zf9En3IUS-Wm.md │ │ │ │ │ ├── functional-programming@6FDGecsHbqY-cm32yTZJa.md │ │ │ │ │ ├── git@ZEzYb-i55hBe9kK3bla94.md │ │ │ │ │ ├── github@PyTuVs08_z4EhLwhTYzFu.md │ │ │ │ │ ├── go@nKlM9k4qAh4wBFXqM-2kC.md │ │ │ │ │ ├── graphql@Sp3FdPT4F9YnTGvlE_vyq.md │ │ │ │ │ ├── grpc@priDGksAvJ05YzakkTFtM.md │ │ │ │ │ ├── hadoop-spark-mapreduce@92GG4IRZ3FijumC94aL-T.md │ │ │ │ │ ├── hadoop@I_VjjmMK52_tS8qjQUspN.md │ │ │ │ │ ├── hashing-algorithms@7tBAD0ox9hTK4D483GTRo.md │ │ │ │ │ ├── how-to-code@77KvWCA1oHSGgDKBTwjv7.md │ │ │ │ │ ├── http-https@Nq6o6Ty8VyNRsvg-UWp7D.md │ │ │ │ │ ├── iaf@wFu9VO48EYbIQrsM8YUCj.md │ │ │ │ │ ├── ibm-bpm@5EVecZmvor09LjD7WR_Y9.md │ │ │ │ │ ├── important-skills-to-learn@lBtlDFPEQvQ_xtLtehU0S.md │ │ │ │ │ ├── infrastructure-as-code@igf9yp1lRdAlN5gyQ8HHC.md │ │ │ │ │ ├── itil@Rq1Wi-cHjS54SYo-Btp-e.md │ │ │ │ │ ├── java--kotlin--scala@a5DB_hsD4bAf8BtHNFNPo.md │ │ │ │ │ ├── javascript--typescript@bhP5gMpRVebSFpCeHVXBj.md │ │ │ │ │ ├── kanban@O7H6dt3Z7EKohxfJzwbPM.md │ │ │ │ │ ├── layered@05hLO2_A8Tr6cLJGFRhOh.md │ │ │ │ │ ├── less@qwpsGRFgzAYstM7bJA2ZJ.md │ │ │ │ │ ├── levels-of-architecture@2sR4KULvAUUoOtopvsEBs.md │ │ │ │ │ ├── linux--unix@XnvlRrOhdoMsiGwGEhBro.md │ │ │ │ │ ├── management@UyIwiIiKaa6LTQaqzbCam.md │ │ │ │ │ ├── marketing-skills@YW6j3Sg511dXToTcwSnOS.md │ │ │ │ │ ├── messaging-queues@4NVdEbmpQVHpBc7582S6E.md │ │ │ │ │ ├── microfrontends@vpko5Kyf6BZ5MHpxXOKaf.md │ │ │ │ │ ├── microservices@b6lCGw82qKpUmsxe1r1f5.md │ │ │ │ │ ├── ms-dynamics@gdtI0H_PzzTj_aFQn_NeA.md │ │ │ │ │ ├── mvc-mvp-mvvm@jj5otph6mEYiR-oU5WVtT.md │ │ │ │ │ ├── net-framework-based@D1IXOBUrrXf5bXhVu9cmI.md │ │ │ │ │ ├── networks@cBWJ6Duw99tSKr7U6OW3A.md │ │ │ │ │ ├── nosql-databases@57liQPaPyVpE-mdLnsbi0.md │ │ │ │ │ ├── oop@AMDLJ_Bup-AY1chl_taV3.md │ │ │ │ │ ├── operations-knowledge@EdJhuNhMSWjeVxGW-RZtL.md │ │ │ │ │ ├── osi@Mt5W1IvuHevNXVRlh7z26.md │ │ │ │ │ ├── owasp@KhqUK-7jdClu9M2Pq7x--.md │ │ │ │ │ ├── patterns--design-principles@_U0VoTkqM1d6NR13p5azS.md │ │ │ │ │ ├── pki@OpL2EqvHbUmFgnpuhtZPr.md │ │ │ │ │ ├── pmi@hRug9yJKYacB9X_2cUalR.md │ │ │ │ │ ├── prince2@SJ5lrlvyXgtAwOx4wvT2W.md │ │ │ │ │ ├── programming-languages@uoDtVFThaV6OMK2wXGfP5.md │ │ │ │ │ ├── proxies@6_EOmU5GYGDGzmNoLY8cB.md │ │ │ │ │ ├── python@j2Ph2QcKwmKlbaMHz1l_i.md │ │ │ │ │ ├── react-vue-angular@mCiYCbKIOVU34qil_q7Hg.md │ │ │ │ │ ├── reactive-programming@C0g_kQFlte5siHMHwlHQb.md │ │ │ │ │ ├── responsibilities@rUxbG2S2nJuA1YVY6sjiX.md │ │ │ │ │ ├── rest@Ss43xwK1ydEToj6XmmCt7.md │ │ │ │ │ ├── ruby@U_Hmzfjjs1jVtu2CZ0TlG.md │ │ │ │ │ ├── rup@7rudOREGG-TTkCosU0hNw.md │ │ │ │ │ ├── safe@Bg7ru1q1j6pNB43HGxnHT.md │ │ │ │ │ ├── salesforce@mOXyzdNn8W-9R99ffcnor.md │ │ │ │ │ ├── sap-erp-hana-business-objects@TxWAznp1tUtZ1MvThf9M1.md │ │ │ │ │ ├── scrum@PKqwKvoffm0unwcFwpojk.md │ │ │ │ │ ├── security@IzFTn5-tQuF_Z0cG_w6CW.md │ │ │ │ │ ├── serverless-concepts@WoXoVwkSqXTP5U8HtyJOL.md │ │ │ │ │ ├── serverless@FAXKxl3fWUFShYmoCsInZ.md │ │ │ │ │ ├── service-mesh@OErbfM-H3laFm47GCHNPI.md │ │ │ │ │ ├── service-oriented@6uvmMgvOwGyuLC5TOhjFu.md │ │ │ │ │ ├── simplifying-things@lrtgF1RTaS4TCKww0aY6C.md │ │ │ │ │ ├── slack@CYnUg_okOcRrD7fSllxLW.md │ │ │ │ │ ├── solid@QNG-KP01WQnq8o1-In1-n.md │ │ │ │ │ ├── solution-architecture@uGs-9xE3DMJxKhenltbFK.md │ │ │ │ │ ├── spa-ssr-ssg@ulwgDCQi_BYx5lmll7pzU.md │ │ │ │ │ ├── sql-databases@n5AcBt_u8qtTe3PP9svPZ.md │ │ │ │ │ ├── tcpip-model@UCCT7-E_QUKPg3jAsjobx.md │ │ │ │ │ ├── tdd@DnP66pjK3b8tCtYr05n2G.md │ │ │ │ │ ├── technical-skills@hFx3mLqh5omNxqI9lfaAQ.md │ │ │ │ │ ├── togaf@5TDTU22Fla2mRr6JeOcaY.md │ │ │ │ │ ├── tools@SuMhTyaBS9vwASxAt39DH.md │ │ │ │ │ ├── trello@a6joS9WXg-rbw29_KfBd9.md │ │ │ │ │ ├── uml@8FTKnAKNL9LnZBrw9YXqK.md │ │ │ │ │ ├── understand-the-basics@4zicbh7Wg2lmKSRhb6E-L.md │ │ │ │ │ ├── w3c-and-whatwg@s0RvufK2PLMXtlsn2KAUN.md │ │ │ │ │ ├── web-mobile@j9Y2YbBKi3clO_sZ2L_hQ.md │ │ │ │ │ ├── what-is-a-software-architect@eG38hT0rotYJ3G-t9df9R.md │ │ │ │ │ ├── what-is-software-architecture@EGG99VA-PEdWdVxNDLtG_.md │ │ │ │ │ ├── working-with-data@YCJYRA3b-YSm8vKmGUFk5.md │ │ │ │ │ └── xp@7fL9lSu4BD1wRjnZy9tM9.md │ │ │ │ ├── faqs.astro │ │ │ │ ├── migration-mapping.json │ │ │ │ ├── software-architect.json │ │ │ │ └── software-architect.md │ │ │ ├── software-design-architecture/ │ │ │ │ ├── content/ │ │ │ │ │ ├── abstract-classes@RMkEE7c0jdVFqZ4fmjL6Y.md │ │ │ │ │ ├── abstraction@VA8FMrhF4non9x-J3urY8.md │ │ │ │ │ ├── anemic-models@nVaoI4IDPVEsdtFcjGNRw.md │ │ │ │ │ ├── architectural-patterns@gJYff_qD6XS3dg3I-jJFK.md │ │ │ │ │ ├── architectural-patterns@jq916t7svaMw5sFOcqZSi.md │ │ │ │ │ ├── architectural-principles@XBCxWdpvQyK2iIG2eEA1K.md │ │ │ │ │ ├── architectural-principles@dBq7ni-of5v1kxpdmh227.md │ │ │ │ │ ├── architectural-styles@37xWxG2D9lVuDsHUgLfzP.md │ │ │ │ │ ├── architectural-styles@En_hvwRvY6k_itsNCQBYE.md │ │ │ │ │ ├── avoid-hasty-abstractions@9naCfoHF1LW1OEsVZGi8v.md │ │ │ │ │ ├── avoid-passing-nulls-booleans@yyKvmutbxu3iVHTuqr5q4.md │ │ │ │ │ ├── be-consistent@2SOZvuEcy8Cy8ymN7x4L-.md │ │ │ │ │ ├── blackboard-pattern@Kk7u2B67Fdg2sU8E_PGqr.md │ │ │ │ │ ├── boundaries@-Kw8hJhgQH2qInUFj2TUe.md │ │ │ │ │ ├── class-invariants@c6n-wOHylTbzpxqgoXtdw.md │ │ │ │ │ ├── class-variants@c6n-wOHylTbzpxqgoXtdw.md │ │ │ │ │ ├── clean-code-principles@08qKtgnhJ3tlb5JKfTDf5.md │ │ │ │ │ ├── clean-code-principles@TJZgsxpfOmltUUChMzlEM.md │ │ │ │ │ ├── clean-code@TJZgsxpfOmltUUChMzlEM.md │ │ │ │ │ ├── client-server@ZGIMUaNfBwE5b6O1yexSz.md │ │ │ │ │ ├── code-by-actor@kp86Vc3uue3IxTN9B9p59.md │ │ │ │ │ ├── command-query-separation@tLbckKmfVxgn59j_dlh8b.md │ │ │ │ │ ├── commands--queries@j_SUD3SxpKYZstN9LSP82.md │ │ │ │ │ ├── commands-queries@j_SUD3SxpKYZstN9LSP82.md │ │ │ │ │ ├── component-based@a0geFJWl-vi3mYytTjYdb.md │ │ │ │ │ ├── component-principles@8Bm0sRhUg6wZtnvtTmpgY.md │ │ │ │ │ ├── composition-over-inheritance@Izno7xX7wDvwPEg7f_d1Y.md │ │ │ │ │ ├── concrete-classes@hd6GJ-H4p9I4aaiRTni57.md │ │ │ │ │ ├── coupling-and-cohesion@TXus3R5vVQDBeBag6B5qs.md │ │ │ │ │ ├── cqrs@IU86cGkLPMXUJKvTBywPu.md │ │ │ │ │ ├── design-patterns@Jd79KXxZavpnp3mtE1q0n.md │ │ │ │ │ ├── design-patterns@gyQw885dvupmkohzJPg3a.md │ │ │ │ │ ├── design-principles@9dMbo4Q1_Sd9wW6-HSCA9.md │ │ │ │ │ ├── design-principles@p96fNXv0Z4rEEXJR9hAYX.md │ │ │ │ │ ├── distributed@3V74lLPlcOXFB-QRTUA5j.md │ │ │ │ │ ├── domain-driven-design@CD20zA6k9FxUpMgHnNYRJ.md │ │ │ │ │ ├── domain-language@kWNQd3paQrhMHMJzM35w8.md │ │ │ │ │ ├── domain-models@I25ghe8xYWpZ-9pRcHfOh.md │ │ │ │ │ ├── domain-models@NpSfbzYtGebmfrifkKsUf.md │ │ │ │ │ ├── dry@ltBnVWZ3UMAuUvDkU6o4P.md │ │ │ │ │ ├── dtos@y_Qj7KITSB8aUWHwiZ2It.md │ │ │ │ │ ├── encapsulate-what-varies@DlefJ9JuJ1LdQYC4WSx6y.md │ │ │ │ │ ├── encapsulation@GJxfVjhiLuuc36hatx9dP.md │ │ │ │ │ ├── enterprise-patterns@WrzsvLgo7cf2KjvJhtJEC.md │ │ │ │ │ ├── enterprise-patterns@h0aeBhQRkDxNeFwDxT4Tf.md │ │ │ │ │ ├── entities@VnW_7dl5G0IFL9W3YF_W3.md │ │ │ │ │ ├── event-driven@KtzcJBb6-EcIoXnwYvE7a.md │ │ │ │ │ ├── event-sourcing@K8X_-bsiy7gboInPzbiEb.md │ │ │ │ │ ├── functional-programming@YswaOqZNYcmDwly2IXrTT.md │ │ │ │ │ ├── gof-design-patterns@hlHl00ELlK9YdnzHDGnEW.md │ │ │ │ │ ├── hollywood-principle@WzUhKlmFB9alTlAyV-MWJ.md │ │ │ │ │ ├── identity-maps@tb0X1HtuiGwz7YhQ5xPsV.md │ │ │ │ │ ├── indentation-and-code-style@81WOL1nxb56ZbAOvxJ7NK.md │ │ │ │ │ ├── inheritance@Dj36yLBShoazj7SAw6a_A.md │ │ │ │ │ ├── interfaces@SrcPhS4F7aT80qNjbv54f.md │ │ │ │ │ ├── keep-framework-code-distant@OoCCy-3W5y7bUcKz_iyBw.md │ │ │ │ │ ├── keep-it-simple-and-refactor-often@9naCfoHF1LW1OEsVZGi8v.md │ │ │ │ │ ├── keep-it-small@XEwC6Fyf2DNNHQsoGTrQj.md │ │ │ │ │ ├── keep-methods--classes--files-small@XEwC6Fyf2DNNHQsoGTrQj.md │ │ │ │ │ ├── keep-tests-independent@mzt7fvx6ab3tmG1R1NcLO.md │ │ │ │ │ ├── law-of-demeter@vnLhItObDgp_XaDmplBsJ.md │ │ │ │ │ ├── layered-architectures@HN160YgryBBtVGjnWxNie.md │ │ │ │ │ ├── layered@IELEJcKYdZ6VN-UIq-Wln.md │ │ │ │ │ ├── mappers@ndUTgl2YBzOdu1MQKJocu.md │ │ │ │ │ ├── meaningful-names-over-comments@6Cd1BbGsmPJs_5jKhumyV.md │ │ │ │ │ ├── meaningful-names@6Cd1BbGsmPJs_5jKhumyV.md │ │ │ │ │ ├── message-queues--streams@GAs6NHBkUgxan3hyPvVs7.md │ │ │ │ │ ├── message-queues-streams@GAs6NHBkUgxan3hyPvVs7.md │ │ │ │ │ ├── messaging@j9j45Auf60kIskyEMUGE3.md │ │ │ │ │ ├── microkernel@r-Yeca-gpdFM8iq7f0lYQ.md │ │ │ │ │ ├── microservices@eJsCCURZAURCKnOK-XeQe.md │ │ │ │ │ ├── minimize-cyclomatic-complexity@qZzl0hAD2LkShsPql1IlZ.md │ │ │ │ │ ├── model-driven-design@0VO_-1g-TS29y0Ji2yCjc.md │ │ │ │ │ ├── model-view-controller@-arChRC9zG2DBmuSTHW0J.md │ │ │ │ │ ├── monolithic@xYPR_X1KhBwdpqYzNJiuT.md │ │ │ │ │ ├── object-oriented-programming@HhYdURE4X-a9GVwJhAyE0.md │ │ │ │ │ ├── object-oriented-programming@VZrERRRYhmqDx4slnZtdc.md │ │ │ │ │ ├── object-oriented-programming@qZQDOe2MHBh8wNcmvkLQm.md │ │ │ │ │ ├── organize-code-by-actor-it-belongs-to@kp86Vc3uue3IxTN9B9p59.md │ │ │ │ │ ├── orms@SYYulHfDceIyDkDT5fcqj.md │ │ │ │ │ ├── peer-to-peer@Cf9Z2wxBcbnNg_q9PA6xA.md │ │ │ │ │ ├── policy-vs-detail@b_PvjjL2ZpEKETa5_bd0v.md │ │ │ │ │ ├── polymorphism@4DVW4teisMz8-58XttMGt.md │ │ │ │ │ ├── posa-patterns@6VoDGFOPHj5p_gvaZ8kTt.md │ │ │ │ │ ├── program-against-abstractions@UZeY36dABmULhsHPhlzn_.md │ │ │ │ │ ├── programming-paradigms@RgYq3YOJhPGSf5in1Rcdp.md │ │ │ │ │ ├── programming-paradigms@TDhTYdEyBuOnDKcQJzTAk.md │ │ │ │ │ ├── publish-subscribe@SX4vOVJY9slOXGwX_q1au.md │ │ │ │ │ ├── pure-functions@5S5A5wCJUCNPLlHJ5fRjU.md │ │ │ │ │ ├── repositories@8y0ot5sbplUIUyXe9gvc8.md │ │ │ │ │ ├── scope--visibility@b-YIbw-r-nESVt_PUFQeq.md │ │ │ │ │ ├── scope-visibility@b-YIbw-r-nESVt_PUFQeq.md │ │ │ │ │ ├── serverless-architecture@5WSvAA3h3lmelL53UJSMy.md │ │ │ │ │ ├── soa@FysFru2FJN4d4gj11gv--.md │ │ │ │ │ ├── software-design-principles@p96fNXv0Z4rEEXJR9hAYX.md │ │ │ │ │ ├── solid@3XckqZA--knUb8IYKOeVy.md │ │ │ │ │ ├── structural@86Jw9kMBD7YP5nTV5jTz-.md │ │ │ │ │ ├── structured-programming@VhSEH_RoWFt1z2lial7xZ.md │ │ │ │ │ ├── tell-dont-ask@0rGdh72HjqPZa2bCbY9Gz.md │ │ │ │ │ ├── tests-should-be-fast-and-independent@mzt7fvx6ab3tmG1R1NcLO.md │ │ │ │ │ ├── transaction-script@tyReIY4iO8kmyc_LPafp1.md │ │ │ │ │ ├── use-cases@gQ7Xj8tsl6IlCcyJgSz46.md │ │ │ │ │ ├── use-correct-constructs@S1m7ty7Qrzu1rr4Jl-WgM.md │ │ │ │ │ ├── use-meaningful-names@JKK6bli3P_cqJ128wPnot.md │ │ │ │ │ ├── usecases@gQ7Xj8tsl6IlCcyJgSz46.md │ │ │ │ │ ├── value-objects@Ks6njbfxOHiZ_TrJDnVtk.md │ │ │ │ │ └── yagni@eEO-WeNIyjErBE53n8JsD.md │ │ │ │ ├── faqs.astro │ │ │ │ ├── migration-mapping.json │ │ │ │ ├── software-design-architecture.json │ │ │ │ └── software-design-architecture.md │ │ │ ├── spring-boot/ │ │ │ │ ├── content/ │ │ │ │ │ ├── actuators@N7hd3d_XQtvOgnCqdCFt3.md │ │ │ │ │ ├── annotations@HdCpfGMrMaXxk5QrtYn3X.md │ │ │ │ │ ├── architecture@_vS_zdJZegZS6MIKAFyg8.md │ │ │ │ │ ├── architecture@yuXN-rD4AyyPYUYOR50L_.md │ │ │ │ │ ├── authentication@ssdk2iAt4avhc8B5tnIzQ.md │ │ │ │ │ ├── authorization@c7w7Z3Coa81FKa_yAKTse.md │ │ │ │ │ ├── autoconfiguration@88-h3d7kb-VmUBsnUUXW_.md │ │ │ │ │ ├── cloud-config@9hG3CB8r41bUb_s8-0u73.md │ │ │ │ │ ├── components@sgA06Tu9Y4cEHtfI8CyLL.md │ │ │ │ │ ├── configuration@OB--nMudscm0p6RqqfA7T.md │ │ │ │ │ ├── dependency-injection@C2EQ5J1aJYF9e9Rr2KysT.md │ │ │ │ │ ├── embedded-server@ONb0VnSUMY8JBeW3G2mTp.md │ │ │ │ │ ├── entity-lifecycle@Ijmy0J3VyaeTGXtu2VkkQ.md │ │ │ │ │ ├── eurkea@6sLE6gb5Y477SmO2GhQIG.md │ │ │ │ │ ├── hibernate@h5-HnycxfbJgwalSdXTAz.md │ │ │ │ │ ├── introduction@jy2heDVZuM6ASCXlI1TDn.md │ │ │ │ │ ├── jpa-test@Nhx2QiSD_4pVWD17lsCbu.md │ │ │ │ │ ├── jsp-files@Lz0GPMiYzb30iFJdv1dL6.md │ │ │ │ │ ├── jwt-authentication@1My7mbdwAbRcJoiA50pWW.md │ │ │ │ │ ├── micrometer@GsmBGRohWbJ6XOaALFZ8o.md │ │ │ │ │ ├── microservices@jU_KHoPUSU_HoIKk0ZpRF.md │ │ │ │ │ ├── mock-mvc@5d1BERqTKNJMKiBcqa8Ie.md │ │ │ │ │ ├── mockbean-annotation@i77NTa0hpGGBjmql9u_CT.md │ │ │ │ │ ├── oauth2@p7t3RlIIm9U08GFC6azff.md │ │ │ │ │ ├── relationships@D4ybyh0ydvl9W2_xUcvZ_.md │ │ │ │ │ ├── servlet@35NTx2eO1j02sjy4m6DPq.md │ │ │ │ │ ├── spring-aop@wV1_I_4czMIxpBionvLs4.md │ │ │ │ │ ├── spring-bean-scope@KdN62IpNgPFMndXfLaYa1.md │ │ │ │ │ ├── spring-boot-starters@JrH2hiu27PhIO1VtrArMa.md │ │ │ │ │ ├── spring-cloud-circuit-breaker@kqpSlO--X9-xYxfq1KFVe.md │ │ │ │ │ ├── spring-cloud-gateway@f-i0NX2KOzCh3JwkaSPFo.md │ │ │ │ │ ├── spring-cloud-open-feign@EKSXTMSN2xdaleJ4wOV1A.md │ │ │ │ │ ├── spring-cloud@VWNDYSw83Vzi2UPQprJ5z.md │ │ │ │ │ ├── spring-data-jdbc@dd1A-MyzBs_kNOtVG7f1D.md │ │ │ │ │ ├── spring-data-jpa@6u08QN-pUeFm3o0h5Scfm.md │ │ │ │ │ ├── spring-data-mongodb@fy-TphbqkLpR1zvFcr7dg.md │ │ │ │ │ ├── spring-data@pvVLbFQoT50vz_VRK4VbJ.md │ │ │ │ │ ├── spring-ioc@PlUU_vzFQ3Xx6Z5XREIYP.md │ │ │ │ │ ├── spring-mvc@QiNWE4sMTao3cVzjt3yPp.md │ │ │ │ │ ├── spring-mvc@S-BbOoRD7anvoJrprjoKF.md │ │ │ │ │ ├── spring-security@KaUdyVWEiZa6lUDRBlOKt.md │ │ │ │ │ ├── springboottest-annotation@p91CaVPh5GMzFU0yEU_hl.md │ │ │ │ │ ├── terminology@WrUCyVfFNUpHB8jyjjKna.md │ │ │ │ │ ├── testing@7Qqrh_Rz_7uAD49g9sDzi.md │ │ │ │ │ ├── transactions@H9Z0EvKT_148vD0mR-dUf.md │ │ │ │ │ └── why-use-spring@WGf3W6bdWL0rK0o6O28G2.md │ │ │ │ ├── faqs.astro │ │ │ │ ├── migration-mapping.json │ │ │ │ ├── spring-boot.json │ │ │ │ └── spring-boot.md │ │ │ ├── sql/ │ │ │ │ ├── content/ │ │ │ │ │ ├── abs@6vYFb_D1N_-tLWZftL-Az.md │ │ │ │ │ ├── acid@igg34gLPl3HYVAmRNFGcV.md │ │ │ │ │ ├── advanced-functions@vTMd0bqz4eTgLnhfgY61h.md │ │ │ │ │ ├── advanced-sql@UDqbT1y-YzBrljfKSz_RG.md │ │ │ │ │ ├── aggregate-queries@LX9nzJ4uqznHN4SksoDvr.md │ │ │ │ │ ├── alter-table@WjXlO42WL9saDS7RIGapt.md │ │ │ │ │ ├── avg@Wou6YXLYUgomvcELh851L.md │ │ │ │ │ ├── basic-sql-syntax@JDDG4KfhtIlw1rkNCzUli.md │ │ │ │ │ ├── begin@7sTW1vwUhCFOMXYjScVEt.md │ │ │ │ │ ├── case@W2ePJHdfEiEJ3ZKoRQKt_.md │ │ │ │ │ ├── ceiling@BAqJQvcguhIhzyII5LRH6.md │ │ │ │ │ ├── check@Q0h9Wfnl_W9ThOkv7Q17A.md │ │ │ │ │ ├── coalesce@k7lZe4QRt9q4InUImFmvx.md │ │ │ │ │ ├── column@wmtt-3auWLdQWuVdwZLPd.md │ │ │ │ │ ├── commit@3cMECz5QPVDOFrk5duObs.md │ │ │ │ │ ├── common-table-expressions@tedQynR0xicVKhuR1oahw.md │ │ │ │ │ ├── concat@5inpEqafeVCfqsURHzQQg.md │ │ │ │ │ ├── correlated-subqueries@JZqS3Xapw6mfSPVgFW7av.md │ │ │ │ │ ├── count@9aHYrOQDkA84tlxcVK5aD.md │ │ │ │ │ ├── create-table@epEpBxRosLhuAuKwp823r.md │ │ │ │ │ ├── creating-views@PcsGK4VBh0zNQIPZvNES4.md │ │ │ │ │ ├── cross-join@7ow6tiSSCnTpv_GYQU017.md │ │ │ │ │ ├── data-constraints@qBios3sZVhcJMpXmj9f7B.md │ │ │ │ │ ├── data-definition-language-ddl@xPOeXK1EPBNG56vgfG-VV.md │ │ │ │ │ ├── data-integrity--security@R1ktDJpXOz0PTllAcBrdu.md │ │ │ │ │ ├── data-integrity-constraints@mBQ3Z8GlFcpIena3IB7D_.md │ │ │ │ │ ├── data-manipulation-language-dml@WMSXi-eez_hHGDM8kUdWz.md │ │ │ │ │ ├── data-types@tBzMDfCMh6MIagNaxCzin.md │ │ │ │ │ ├── date@Ivqo2wa-_NhGU3vGd0pUI.md │ │ │ │ │ ├── dateadd@1E1WdWOyqxbbdiIbw26dZ.md │ │ │ │ │ ├── datepart@BJ4fQvagTO0B5UtXblyx8.md │ │ │ │ │ ├── db-security-best-practices@vhBZqqmUcEon6-Vwvla4q.md │ │ │ │ │ ├── delete@ddtVaA4Ls6qRj-7OtTSIH.md │ │ │ │ │ ├── delete@zWnvuHJLHr03PWkrW1wZZ.md │ │ │ │ │ ├── dense_rank@QM0ltgPu8lLLYc2MsTLj-.md │ │ │ │ │ ├── drop-table@YzJ6QmY2arMfRzMAPaI0T.md │ │ │ │ │ ├── dropping-views@MIOuWWcCjLAmgzog2DBC3.md │ │ │ │ │ ├── dynamic-sql@z5Sf0VU14ZCQ80kL1qOqc.md │ │ │ │ │ ├── floor@o2SH4iQn1Ap2yDZ7cVYLO.md │ │ │ │ │ ├── foreign-key@DHz6sRLYhFeCbAcNJS8hm.md │ │ │ │ │ ├── from@N1Racr3ZpU320gS545We8.md │ │ │ │ │ ├── full-outer-join@aS5zCyJRA779yHF0G2pje.md │ │ │ │ │ ├── grant-and-revoke@03qMopxzjx_-dZbYw9b7J.md │ │ │ │ │ ├── group-by@14TKE6KhrH1yFtHcSZSXq.md │ │ │ │ │ ├── group-by@Zw8IHfCCMSxmVjx5Ho5ff.md │ │ │ │ │ ├── having@HhICJpCK5__b-itUoEBES.md │ │ │ │ │ ├── having@ytwCkSMTiTuemE0KVfAfy.md │ │ │ │ │ ├── indexes@LcljR70T-OnzSrJJDqOWf.md │ │ │ │ │ ├── inner-join@aaua13CkTxLOYXr8cAgPm.md │ │ │ │ │ ├── insert@-Hew0y53ziZK3epQnGA0O.md │ │ │ │ │ ├── insert@mPj6BiK5FKKkIQ9WsWEo6.md │ │ │ │ │ ├── join-queries@8V6yw7kLaow-VVcv_K_pL.md │ │ │ │ │ ├── joins@4UQQYbjzwVxZOAxBuXKQS.md │ │ │ │ │ ├── lag@BcXdxY6bld5c0YNFSKkh-.md │ │ │ │ │ ├── lead@aJJjaGunRrwyh9MjQfJt-.md │ │ │ │ │ ├── learn-the-basics@nhUKKWyBH80nyKfGT8ErC.md │ │ │ │ │ ├── left-join@X9cJJ8zLZCF2cOoqxwFfY.md │ │ │ │ │ ├── length@RH8DLiQpDUWqw3U1522q5.md │ │ │ │ │ ├── lower@knTG6pAq2mYP24WMa29xI.md │ │ │ │ │ ├── managing-indexes@NtxGd6Vx-REBclry7lZuE.md │ │ │ │ │ ├── max@YqDJq3fPxUZlwsdq0kJg7.md │ │ │ │ │ ├── min@bFEYMlqPZtTUYtDQxqHzT.md │ │ │ │ │ ├── mod@OUw--8zEq6lk5-6oySVHe.md │ │ │ │ │ ├── modifying-views@3eE-l-P93nOXoWfLr8PSW.md │ │ │ │ │ ├── nested-subqueries@xkPJ2MYiXmzC4yqQWyB_7.md │ │ │ │ │ ├── not-null@M4M_-vjM9GNy0NmXZneDA.md │ │ │ │ │ ├── nullif@KI6vngoYcHsnpIk8ErhhS.md │ │ │ │ │ ├── operators@ffwniprGJHZzJ7t3lQcXz.md │ │ │ │ │ ├── optimizing-joins@C0dhS6uLf4TUSfvcWyXhv.md │ │ │ │ │ ├── order-by@NfCiSPrL4upMssukcw3Kh.md │ │ │ │ │ ├── performance-optimization@4rqCPpTb0dAgpheBKshRG.md │ │ │ │ │ ├── pivot--unpivot-operations@nwFaz9i-1s0WVrVaFsoqb.md │ │ │ │ │ ├── primary-key@Jlwmyq6CUQeDAlL4dazOP.md │ │ │ │ │ ├── query-analysis-techniques@C6P69YiFdS-ioPXMNfX07.md │ │ │ │ │ ├── query-optimization@Ps9Yv2s-bKvEegGAbPsiA.md │ │ │ │ │ ├── rank@cucCPw3KfetAP2OMFUs0X.md │ │ │ │ │ ├── rdbms-benefits-and-limitations@fNTb9y3zs1HPYclAmu_Wv.md │ │ │ │ │ ├── recursive-queries@TjgwabhEtaSoYMLNr6q9l.md │ │ │ │ │ ├── reducing-subqueries@UVTgbZrqpbYl1bQvQejcF.md │ │ │ │ │ ├── replace@VNbb3YPc0FtrROylRns8h.md │ │ │ │ │ ├── right-join@shpgZkh1CLqUwjOaRtAFy.md │ │ │ │ │ ├── rollback@xbD67KVlt3UhHpKh8HLx8.md │ │ │ │ │ ├── round@9DntFiZV1AyaRPhYP5q6u.md │ │ │ │ │ ├── row@aLDl75i8gtLRA2Ud-fMmQ.md │ │ │ │ │ ├── row_number@zW27ZHdLwQY-85iqbBKQZ.md │ │ │ │ │ ├── savepoint@pJtYvXUo81aZfPuRjIbMq.md │ │ │ │ │ ├── scalar@eXQ-TrTlqL5p2AdGnozkL.md │ │ │ │ │ ├── select@i8u8E_sne6XiKJo2FXDog.md │ │ │ │ │ ├── select@rmqXH29n1oXtZ8tvmcRFn.md │ │ │ │ │ ├── selective-projection@w53CSY53nAAN0ux-XeJ4c.md │ │ │ │ │ ├── self-join@6qG0AVYd6Y1B8LOSDoMX9.md │ │ │ │ │ ├── sql-keywords@6yoo7qC6X2jYDIjd3HIm7.md │ │ │ │ │ ├── sql-vs-nosql-databases@gx4KaFqKgJX9n9_ZGMqlZ.md │ │ │ │ │ ├── stored-procedures--functions@w7FNjdwqjY7X69aJqqBy4.md │ │ │ │ │ ├── subqueries@86iZ8s8EdhSuYwgwAM_EO.md │ │ │ │ │ ├── substring@PnG_5D6q66NAKxXVOwA6N.md │ │ │ │ │ ├── sum@w4T3jFb0ilf1KNw-AvRXG.md │ │ │ │ │ ├── table@R9WDMRd-3wxsKH97-sT3n.md │ │ │ │ │ ├── time@88KlrMqSza9_YaD7Dv61p.md │ │ │ │ │ ├── timestamp@7hEqkoxkdAWmakGZsMJx-.md │ │ │ │ │ ├── transaction-isolation-levels@ujeq8EIFcrqkBjoFizsJM.md │ │ │ │ │ ├── transactions@OdaBXz2XBAVLsQ-m7xtAM.md │ │ │ │ │ ├── truncate-table@K5vhqTJrdPK08Txv8zaEj.md │ │ │ │ │ ├── unique@5yGo8i7eplxtXOD_qfzOs.md │ │ │ │ │ ├── update@KJJ6PYjTnr_3yU2mNPL9v.md │ │ │ │ │ ├── update@eu9dJFi6gBPMBdy08Y5Bb.md │ │ │ │ │ ├── upper@Othfo7NvTVzfyL906PLM1.md │ │ │ │ │ ├── using-indexes@9wOgP0i9G4HSeZGn2Gm7r.md │ │ │ │ │ ├── views@2tyezwOIxV6O84N-Q3Awh.md │ │ │ │ │ ├── what-are-relational-databases@R9DQNc0AyAQ2HLpP4HOk6.md │ │ │ │ │ ├── where@WhYAy6f7Euk3E49-ot644.md │ │ │ │ │ └── window-functions@tBvXLLp5FKeSSN35Kj1X4.md │ │ │ │ ├── faqs.astro │ │ │ │ ├── migration-mapping.json │ │ │ │ ├── sql.json │ │ │ │ └── sql.md │ │ │ ├── swift-ui/ │ │ │ │ ├── content/ │ │ │ │ │ ├── access-control@SRZfkrqxU2UxFif4v4t3o.md │ │ │ │ │ ├── accessibility@-u5-uN2x0uuvkLieoq7Nr.md │ │ │ │ │ ├── actors@sZeSwx_Rb0H81oA7KUw9m.md │ │ │ │ │ ├── alamofire@47Sc0VzbRMKYb-3ivhNG3.md │ │ │ │ │ ├── animatable-protocol@gktNK5eNvTJ3vqmPdHYCC.md │ │ │ │ │ ├── animations@Ui6hCqvVwf61wXBOxYG6Q.md │ │ │ │ │ ├── app-architecture@UCv-FDzB1O-zRH700Im8i.md │ │ │ │ │ ├── app-lifecycle@FfREh4vs6KqWEUQ44pDmA.md │ │ │ │ │ ├── arc@HBd_J1jUMW-a0Z_Hk9BSL.md │ │ │ │ │ ├── arithmetic@Q44dJaEA7aHG_ClMwO9Wv.md │ │ │ │ │ ├── asynchronous-functions@60_LHnRY7FVwLziq7VBkz.md │ │ │ │ │ ├── asynchronous-sequences@xu2GOHaW721Gi0b1ua3Kh.md │ │ │ │ │ ├── background@QK0trIIACmUHEuoLEBKs4.md │ │ │ │ │ ├── basic-functions@MXlCVXs2fEyV_UmV-w8hB.md │ │ │ │ │ ├── binding@k7mMeSXQjY0fygLJj7Gr-.md │ │ │ │ │ ├── booleans@xn2iNnrxx-jhIMLpfU5Mi.md │ │ │ │ │ ├── button@BceTgMv9rsRu4j5M7JQRk.md │ │ │ │ │ ├── catching@AWAf49r8RNMkYPOayx2LC.md │ │ │ │ │ ├── clean-architecture@jmr8IaAd2391FlqyOuFP8.md │ │ │ │ │ ├── clipshape@GZN34c2OGkMFO_fM-XQou.md │ │ │ │ │ ├── closures@gD9JTNSkjxcwnpyzmxrZM.md │ │ │ │ │ ├── cloudkit@t2S_cttRJLpC__YTf1nAa.md │ │ │ │ │ ├── cocoalumberjack@XgF8ecga95g7wapmPrk0w.md │ │ │ │ │ ├── comments@pNyGRFQbPH2tLc-mrsGLU.md │ │ │ │ │ ├── comparison@03HZvlAne_Uq7uyuP4kdc.md │ │ │ │ │ ├── computed@aZVvq-jhpvsQxZvhuB9xf.md │ │ │ │ │ ├── constants--variables@fdMCoxX_YjtgUReIGh1nn.md │ │ │ │ │ ├── continue--break@z84nzijt2F7zR4prl1Juh.md │ │ │ │ │ ├── core-data@J8Aq24_1yHj4UowvK0AkH.md │ │ │ │ │ ├── creating-packages@03OPOqR5K4H-oy2KBx744.md │ │ │ │ │ ├── data-flow@nkXaoMWBSSYxELuA9lJD8.md │ │ │ │ │ ├── data-persistance@R7ILNzMmAKQXwTyrvFaul.md │ │ │ │ │ ├── databases@tB8bNFuB0NetMLQVDd2hj.md │ │ │ │ │ ├── dependency-injection@7XjAReXi1WWOFRVfBVoN0.md │ │ │ │ │ ├── docc@MMdjsS4ltdP7E4ih7URdd.md │ │ │ │ │ ├── drag--drop@iZlsMU1NtEPkosxNxNZWq.md │ │ │ │ │ ├── emacs@1EsTqJ17eoz-zznnrNwvW.md │ │ │ │ │ ├── enumerations@BURfkXkKdPf1yMTB9neh9.md │ │ │ │ │ ├── environmentobject@-u2enh8vI9ynjTv1H8nVL.md │ │ │ │ │ ├── error-handling@62FM5cEvtDZwHvL9uOjhz.md │ │ │ │ │ ├── explicit-animations@jYpugTP_5rF26pn0kUKhG.md │ │ │ │ │ ├── extensions@WcxA4zrP084D0x-NtfHgP.md │ │ │ │ │ ├── filemanager@IUKUp_QQ2BcESvVS8VhVh.md │ │ │ │ │ ├── firabase@wwVfkhkibsFvIP_amh2Y9.md │ │ │ │ │ ├── floats--doubles@2fA97do5FFkT6ggC0ThZa.md │ │ │ │ │ ├── font@61lcF5utl8qO-MxpWPMnU.md │ │ │ │ │ ├── for@PVSWiOw5jJf5GFqFA-ld9.md │ │ │ │ │ ├── form@hZswz-G-20SU__1b0s6eq.md │ │ │ │ │ ├── function-types@1j6Lz3AjJeNulzsSN0fsu.md │ │ │ │ │ ├── generics@_uO1_qHfBkN6YQ02zEFdW.md │ │ │ │ │ ├── geometryreader@9y9HLynnw9d0349CbByvF.md │ │ │ │ │ ├── gestures@xSl3mD95BbIhpf41d3QVV.md │ │ │ │ │ ├── grdb@ie_fUA2ZuqmtY7gX14rjo.md │ │ │ │ │ ├── grid@elOwuO5ktRapvuX2UTmPK.md │ │ │ │ │ ├── hstack@8oJVx9Y-NAW2fXtnHfMXB.md │ │ │ │ │ ├── hummingbird@5nwb4xOiJ4odx1NXXRflI.md │ │ │ │ │ ├── ides@ofDokn4mAgUSL-pOy-MVb.md │ │ │ │ │ ├── if--else@7XtwAhFQH7uNlvvtE9-qX.md │ │ │ │ │ ├── image@-COipcnjNA-BV5PnYj_o-.md │ │ │ │ │ ├── implicit-animations@3-3r9psIaF-dQSjIFCsKS.md │ │ │ │ │ ├── inheritance@P1IUtZi9_41zPn4nar6Ov.md │ │ │ │ │ ├── initialization@DsGqB_mLppVESbQeczWh4.md │ │ │ │ │ ├── installing-swift@l8BWjmxhHaO0uDmFFFBoI.md │ │ │ │ │ ├── integers@Kih96pA1xsogmvrmbIFX6.md │ │ │ │ │ ├── introduction@vnbgQBHdyv0tE-y7ngAOV.md │ │ │ │ │ ├── list@ZR0b32xTb0WbqZeoojyIg.md │ │ │ │ │ ├── localization@yRVNTN2eJEtT5uX4jrRS6.md │ │ │ │ │ ├── logging--debugging@O5libf2fha4pyKxQDCQka.md │ │ │ │ │ ├── logical@ND7oiPW66fhJVZuhNqAnj.md │ │ │ │ │ ├── loops@N_9K-sVmpCMD_Ug_3qX7h.md │ │ │ │ │ ├── macros@GlLHFLypw3eTMs7h43Lys.md │ │ │ │ │ ├── memory-safety@B1mbKaKaxvT82PPKQoMm5.md │ │ │ │ │ ├── methods@8fpk7cpMluKMGOiOLGxLW.md │ │ │ │ │ ├── mongokitten@htRKwjBD1NkKZZG5Cd9bx.md │ │ │ │ │ ├── moya@gKW619QYNxtSoeld_jNs7.md │ │ │ │ │ ├── mvvm@l-E5ZN3xarJ69o26-yvAn.md │ │ │ │ │ ├── navigationlink@6EpvayoacyBX8wXPJ_CZ5.md │ │ │ │ │ ├── navigationpath@W5HvjGbPFFmrIdzwg_WvM.md │ │ │ │ │ ├── navigationstack@kh8PovQUi61HDBeHD2G4x.md │ │ │ │ │ ├── neovim@IuQG4c_0KpNlTds7W7Gzn.md │ │ │ │ │ ├── nested-functions@tSBt4WCd-v96Ux-INWdj1.md │ │ │ │ │ ├── networking-libraries@NCwJq7Rv2H4m5_oxIWinV.md │ │ │ │ │ ├── nil-coalescing@cCi3MutPRV-L1rrW5McQH.md │ │ │ │ │ ├── observedobject@eZI02ZYjGUACbpM0T7_LR.md │ │ │ │ │ ├── observers@n1n7-fTnzS2QaEM0L7IZL.md │ │ │ │ │ ├── operators@4EBdMshXiAylkgoG9FqlB.md │ │ │ │ │ ├── optional-chaining@3CcmKsX4Yuej9MrAXh-4P.md │ │ │ │ │ ├── optionals--nil@pPXG2vtWu_vgGymawe5-u.md │ │ │ │ │ ├── padding@TQQ8b8y3KYNeASrki0YMy.md │ │ │ │ │ ├── parameters@FaWFpl-nZlU7Qo_824-NE.md │ │ │ │ │ ├── plugins@ygVGffnYXG6j6JzM5q9mO.md │ │ │ │ │ ├── print--string-interpolation@2RkpY7Oq_Z-6YY4hZuc7q.md │ │ │ │ │ ├── propagating@09Ue-KMoTFypYKThhJMw9.md │ │ │ │ │ ├── properties@lYQNVpMqaVOSMI18uEnJZ.md │ │ │ │ │ ├── protocols@ZXmYD2gwgdkve12GpdP7Y.md │ │ │ │ │ ├── realm@RvR35apiPT5L4xD2PUKAO.md │ │ │ │ │ ├── repeatwhile@RCpClnQ3bwce4vLpG9zCa.md │ │ │ │ │ ├── result-builders@f0Nvu2IcZsCJXkK1kMfwa.md │ │ │ │ │ ├── return-types@AWhYlhCzP0V3rvYVDeb6A.md │ │ │ │ │ ├── sdks-for-wasm@M3ctRye03DqCwivmdnQ4u.md │ │ │ │ │ ├── semicolons@rGThKnBd0EXyx8Fh6QoX6.md │ │ │ │ │ ├── server-frameworks@gYcrVzB740nrRn3Tan6Gt.md │ │ │ │ │ ├── state@UJEyJwuTiLeea6q0H9tIW.md │ │ │ │ │ ├── stateobject@pKVxtzPgA_88wyGF3dK-7.md │ │ │ │ │ ├── static-linux-sdk@vVcCHY2iq2f-qdIDBWJ5O.md │ │ │ │ │ ├── stored@r-jFJSdOVbCVLosImofac.md │ │ │ │ │ ├── strict-concurrency-checking@GWh98EbRBe2xGEAYrCA30.md │ │ │ │ │ ├── strings@llXPXjYS801GhnNPdsApZ.md │ │ │ │ │ ├── structures--classes@thS85PP8famziViKq49Tq.md │ │ │ │ │ ├── subscripts@ABT037yTlXpAenBK9Mknt.md │ │ │ │ │ ├── swift-charts@VT6nRTnNsEKLWrKsghKFR.md │ │ │ │ │ ├── swift-for-server-apps@CYnuCu6jRa6ExrSBwQF_a.md │ │ │ │ │ ├── swift-log@v6FKxFW0SMaH_hXCIAnyA.md │ │ │ │ │ ├── swift-nio@vpV45shc5onmenUP_tIpb.md │ │ │ │ │ ├── swift-package-index@dajwi7gUyB3Jyyl2QbazS.md │ │ │ │ │ ├── swift-package-manager@YNfVAMdAK9vI0bUkvdVyc.md │ │ │ │ │ ├── swift-playgrounds@ewhk18ChvKJM9U_ziZ8Iq.md │ │ │ │ │ ├── swift-testing@EBvuWsdwRLiMe5feESXgZ.md │ │ │ │ │ ├── swift-vs-objective-c@oPz8e_X_LaiowAZYavVgY.md │ │ │ │ │ ├── swiftdata@QPBuLcgz4GNd94bJsv6LU.md │ │ │ │ │ ├── swiftui-inspector@ORk-aG_KxdVcyRwFyZFp1.md │ │ │ │ │ ├── swiftui-with-asyncawait@gaQqVwxVK7_sYTHCCRBvc.md │ │ │ │ │ ├── switch--case@hODKmqbFLKIulHgXqhh6B.md │ │ │ │ │ ├── tabview@AE6CX6Gp7GtK0YAfdI_gb.md │ │ │ │ │ ├── tasks--task-groups@D9muzTnim2h7VSWmLeCFW.md │ │ │ │ │ ├── testing@H3-EwjQukBJJL1agH-giQ.md │ │ │ │ │ ├── text@RI0iYd7ZI7L3yk4Wf2JES.md │ │ │ │ │ ├── throwing@E0nBPRzPkzx9BKaCfweSb.md │ │ │ │ │ ├── trailing-closures@0onr5oXzArGN5Oqc4K2rp.md │ │ │ │ │ ├── transitions@hZYzZntkSsx89c4jesxEo.md │ │ │ │ │ ├── tuples@s7sdqYwqbXaF6Wli79l8e.md │ │ │ │ │ ├── type-annotations@E-kALuBRAX3C06SfcD1Sk.md │ │ │ │ │ ├── type-casting@Yvc5PFi1CZQcf8qVnaF7q.md │ │ │ │ │ ├── type-inference@8nk8GhZH3t-rq6g47rspD.md │ │ │ │ │ ├── type-safety@FndEtBUVfWAYs01gFLKG_.md │ │ │ │ │ ├── ui-controls@MEe088TqkeHxF7q0hiAUM.md │ │ │ │ │ ├── uikit-vs-swiftui@rx9ZSMBFErvFfZgSZo_u2.md │ │ │ │ │ ├── unstructured-concurrency@jEWHNFLdcrvLQEOXr3ll6.md │ │ │ │ │ ├── user-interaction@3g4AN-pIHAMJ5PKwE4SlY.md │ │ │ │ │ ├── userdefaults-appstorage@OC5GZ2fy4FaV0Nq7dykRh.md │ │ │ │ │ ├── using-packages@NGyvq-w9rGEqjkxoWYoqA.md │ │ │ │ │ ├── vapor@4CN0ACAfdHtFjL_arnQvi.md │ │ │ │ │ ├── viewbuilder@KHtizt-en2bWHDNmBmIqp.md │ │ │ │ │ ├── views@0kwf3brDiHhnsQ45708M0.md │ │ │ │ │ ├── vscode@50KaK9mRCVf8zOwHPiW4w.md │ │ │ │ │ ├── vstack@_iTFfnpZBy3GLVsidUAzk.md │ │ │ │ │ ├── what-is-swift@zvELiSGcoLpRyphJuFME9.md │ │ │ │ │ ├── what-is-swiftui@jRbmmPKkJ2xHbUL18A8oe.md │ │ │ │ │ ├── where-swift-is-used@mkKOv4UX94r8ijD_FPJ0f.md │ │ │ │ │ ├── while@FdHaF5ZM3WjRD_yCOZCXx.md │ │ │ │ │ ├── why-use-swift@25OMS3jP0rtZXc697FENP.md │ │ │ │ │ ├── wrappers@5cHzfAOmFxR_gB9LvwLYj.md │ │ │ │ │ ├── xcode-debugging@LrMTrEV-oQVFUro2k6mpT.md │ │ │ │ │ ├── xcode@48dieYUTz5fSXipndwKce.md │ │ │ │ │ ├── xctest@moORQvblmG3x7kaAXHPat.md │ │ │ │ │ └── zstack@_suK9choLayT05wAZ3UCz.md │ │ │ │ └── swift-ui.md │ │ │ ├── system-design/ │ │ │ │ ├── content/ │ │ │ │ │ ├── ambassador@Hja4YF3JcgM6CPwB1mxmo.md │ │ │ │ │ ├── anti-corruption-layer@4hi7LvjLcv8eR6m-uk8XQ.md │ │ │ │ │ ├── application-caching@5Ux_JBDOkflCaIm4tVBgO.md │ │ │ │ │ ├── application-layer@XXuzTrP5UNVwSpAk-tAGr.md │ │ │ │ │ ├── async-request-reply@eNFNXPsFiryVxFe4unVxk.md │ │ │ │ │ ├── asynchronism@84N4XY31PwXRntXX1sdCU.md │ │ │ │ │ ├── availability-in-numbers@uHdrZllrZFAnVkwIB3y5-.md │ │ │ │ │ ├── availability-monitoring@rVrwaioGURvrqNBufF2dj.md │ │ │ │ │ ├── availability-patterns@ezptoTqeaepByegxS5kHL.md │ │ │ │ │ ├── availability-vs-consistency@uJc27BNAuP321HQNbjftn.md │ │ │ │ │ ├── availability@Xzkvf4naveszLGV9b-8ih.md │ │ │ │ │ ├── back-pressure@YiYRZFE_zwPMiCZxz9FnP.md │ │ │ │ │ ├── backends-for-frontend@n4It-lr7FFtSY83DcGydX.md │ │ │ │ │ ├── background-jobs@DOESIlBThd_wp2uOSd_CS.md │ │ │ │ │ ├── bulkhead@IR2_kgs2U9rnAJiDBmpqK.md │ │ │ │ │ ├── bulkhead@PLn9TF9GYnPcbpTdDMQbG.md │ │ │ │ │ ├── busy-database@hxiV2uF7tvhZKe4K-4fTn.md │ │ │ │ │ ├── busy-frontend@i_2M3VloG-xTgWDWp4ngt.md │ │ │ │ │ ├── cache-aside@PK4V9OWNVi8StdA2N13X2.md │ │ │ │ │ ├── cache-aside@bffJlvoLHFldS0CluWifP.md │ │ │ │ │ ├── caching@-X4g8kljgVBOBcf1DDzgi.md │ │ │ │ │ ├── cap-theorem@tcGdVQsCEobdV9hgOq3eG.md │ │ │ │ │ ├── cdn-caching@Kisvxlrjb7XnKFCOdxRtb.md │ │ │ │ │ ├── chatty-io@0IzQwuYi_E00bJwxDuw2B.md │ │ │ │ │ ├── choreography@aCzRgUkVBvtHUeLU6p5ZH.md │ │ │ │ │ ├── circuit-breaker@D1OmCoqvd3-_af3u0ciHr.md │ │ │ │ │ ├── circuit-breaker@O4zYDqvVWD7sMI27k_0Nl.md │ │ │ │ │ ├── claim-check@kl4upCnnZvJSf2uII1Pa0.md │ │ │ │ │ ├── client-caching@RHNRb6QWiGvCK3KQOPK3u.md │ │ │ │ │ ├── cloud-design-patterns@THlzcZTNnPGLRiHPWT-Jv.md │ │ │ │ │ ├── communication@uQFzD_ryd-8Dr1ppjorYJ.md │ │ │ │ │ ├── compensating-transaction@MNlWNjrG8eh5OzPVlbb9t.md │ │ │ │ │ ├── competing-consumers@9Ld07KLOqP0ICtXEjngYM.md │ │ │ │ │ ├── compute-resource-consolidation@ODjVoXnvJasPvCS2A5iMO.md │ │ │ │ │ ├── consistency-patterns@GHe8V-REu1loRpDnHbyUn.md │ │ │ │ │ ├── content-delivery-networks@O730v5Ww3ByAiBSs6fwyM.md │ │ │ │ │ ├── cqrs@LTD3dn05c0ruUJW0IQO7z.md │ │ │ │ │ ├── cqrs@ivr3mh0OES5n86FI1PN4N.md │ │ │ │ │ ├── data-management@W0cUCrhiwH_Nrzxw50x3L.md │ │ │ │ │ ├── database-caching@BeIg4jzbij2cwc_a_VpYG.md │ │ │ │ │ ├── databases@5FXwwRMNBhG7LT5ub6t2L.md │ │ │ │ │ ├── denormalization@Zp9D4--DgtlAjE2nIfaO_.md │ │ │ │ │ ├── deployment-stamps@FPPJw-I1cw8OxKwmDh0dT.md │ │ │ │ │ ├── deployment-stamps@Ze471tPbAwlwZyU4oIzH9.md │ │ │ │ │ ├── design--implementation@PtJ7-v1VCLsyaWWYHYujV.md │ │ │ │ │ ├── document-store@didEznSlVHqqlijtyOSr3.md │ │ │ │ │ ├── domain-name-system@Uk6J8JRcKVEFz4_8rLfnQ.md │ │ │ │ │ ├── event-driven@NEsPjQifNDlZJE-2YLVl1.md │ │ │ │ │ ├── event-sourcing@7OgRKlwFqrk3XO2z49EI1.md │ │ │ │ │ ├── eventual-consistency@rRDGVynX43inSeQ9lR_FS.md │ │ │ │ │ ├── external-config-store@BrgXwf7g2F-6Rqfjryvpj.md │ │ │ │ │ ├── extraneous-fetching@6u3XmtJFWyJnyZUnJcGYb.md │ │ │ │ │ ├── fail-over@L_jRfjvMGjFbHEbozeVQl.md │ │ │ │ │ ├── federated-identity@lHPl-kr1ArblR7bJeQEB9.md │ │ │ │ │ ├── federation@DGmVRI7oWdSOeIUn_g0rI.md │ │ │ │ │ ├── gatekeeper@DTQJu0AvgWOhMFcOYqzTD.md │ │ │ │ │ ├── gateway-aggregation@bANGLm_5zR9mqMd6Oox8s.md │ │ │ │ │ ├── gateway-offloading@0SOWAA8hrLM-WsG5k66fd.md │ │ │ │ │ ├── gateway-routing@LXH_mDlILqcyIKtMYTWqy.md │ │ │ │ │ ├── geodes@6hOSEZJZ7yezVN67h5gmS.md │ │ │ │ │ ├── geodes@Ml9lPDGjRAJTHkBnX51Un.md │ │ │ │ │ ├── graph-databases@6RLgnL8qLBzYkllHeaI-Z.md │ │ │ │ │ ├── graphql@jwv2g2Yeq-6Xv5zSd746R.md │ │ │ │ │ ├── grpc@Hw2v1rCYn24qxBhhmdc28.md │ │ │ │ │ ├── health-endpoint-monitoring@CKCNk3obx4u43rBqUj2Yf.md │ │ │ │ │ ├── health-endpoint-monitoring@cNJQoMNZmxNygWAJIA8HI.md │ │ │ │ │ ├── health-endpoint-monitoring@uK5o7NgDvr2pV0ulF0Fh9.md │ │ │ │ │ ├── health-monitoring@hkjYvLoVt9xKDzubm0Jy3.md │ │ │ │ │ ├── high-availability@wPe7Xlwqws7tEpTAVvYjr.md │ │ │ │ │ ├── horizontal-scaling@IkUCfSWNY-02wg2WCo1c6.md │ │ │ │ │ ├── how-to-approach-system-design@os3Pa6W9SSNEzgmlBbglQ.md │ │ │ │ │ ├── http@I_nR6EwjNXSG7_hw-_VhX.md │ │ │ │ │ ├── idempotent-operations@3pRi8M4xQXsehkdfUNtYL.md │ │ │ │ │ ├── improper-instantiation@lwMs4yiUHF3nQwcvauers.md │ │ │ │ │ ├── index-table@AH0nVeVsfYOjcI3vZvcdz.md │ │ │ │ │ ├── instrumentation@Q0fKphqmPwjTD0dhqiP6K.md │ │ │ │ │ ├── introduction@_hYN0gEi9BL24nptEtXWU.md │ │ │ │ │ ├── key-value-store@KFtdmmce4bRkDyvFXZzLN.md │ │ │ │ │ ├── latency-vs-throughput@O3wAHLnzrkvLWr4afHDdr.md │ │ │ │ │ ├── layer-4-load-balancing@MpM9rT1-_LGD7YbnBjqOk.md │ │ │ │ │ ├── layer-7-load-balancing@e69-JVbDj7dqV_p1j1kML.md │ │ │ │ │ ├── lb-vs-reverse-proxy@ocdcbhHrwjJX0KWgmsOL6.md │ │ │ │ │ ├── leader-election@AJLBFyAsEdQYF6ygO0MmQ.md │ │ │ │ │ ├── leader-election@beWKUIB6Za27yhxQwEYe3.md │ │ │ │ │ ├── load-balancers@14KqLKgh090Rb3MDwelWY.md │ │ │ │ │ ├── load-balancing-algorithms@urSjLyLTE5IIz0TFxMBWL.md │ │ │ │ │ ├── materialized-view@WB7vQ4IJ0TPh2MbZvxP6V.md │ │ │ │ │ ├── message-queues@37X1_9eCmkZkz5RDudE5N.md │ │ │ │ │ ├── messaging@dsWpta3WIBvv2K9pNVPo0.md │ │ │ │ │ ├── microservices@UKTiaHCzYXnrNw31lHriv.md │ │ │ │ │ ├── monitoring@hDFYlGFYwcwWXLmrxodFX.md │ │ │ │ │ ├── monolithic-persistence@p1QhCptnwzTGUXVMnz_Oz.md │ │ │ │ │ ├── no-caching@klvHk1_e03Jarn5T46QNi.md │ │ │ │ │ ├── noisy-neighbor@r7uQxmurvfsYtTCieHqly.md │ │ │ │ │ ├── performance-antipatterns@p--uEm6klLx_hKxKJiXE5.md │ │ │ │ │ ├── performance-monitoring@x1i3qWFtNNjd00-kAvFHw.md │ │ │ │ │ ├── performance-vs-scalability@e_15lymUjFc6VWqzPnKxG.md │ │ │ │ │ ├── pipes--filters@WkoFezOXLf1H2XI9AtBtv.md │ │ │ │ │ ├── pipes-and-filters@siXdR3TB9-4wx_qWieJ5w.md │ │ │ │ │ ├── priority-queue@DZcZEOi7h3u0744YhASet.md │ │ │ │ │ ├── publishersubscriber@2ryzJhRDTo98gGgn9mAxR.md │ │ │ │ │ ├── pull-cdns@HkXiEMLqxJoQyAHav3ccL.md │ │ │ │ │ ├── push-cdns@uIerrf_oziiLg-KEyz8WM.md │ │ │ │ │ ├── queu-based-load-leveling@LncTxPg-wx8loy55r5NmV.md │ │ │ │ │ ├── queue-based-load-leveling@-M3Zd8w79sKBAY6_aJRE8.md │ │ │ │ │ ├── queue-based-load-leveling@LncTxPg-wx8loy55r5NmV.md │ │ │ │ │ ├── queue-based-load-leveling@NybkOwl1lgaglZPRJQJ_Z.md │ │ │ │ │ ├── refresh-ahead@Bgqgl67FK56ioLNFivIsc.md │ │ │ │ │ ├── reliability-patterns@DYkdM_L7T2GcTPAoZNnUR.md │ │ │ │ │ ├── replication@0RQ5jzZKdadYY0h_QZ0Bb.md │ │ │ │ │ ├── replication@dc-aIbBwUdlwgwQKGrq49.md │ │ │ │ │ ├── resiliency@wlAWMjxZF6yav3ZXOScxH.md │ │ │ │ │ ├── rest@6-bgmfDTAQ9zABhpmVoHV.md │ │ │ │ │ ├── retry-storm@LNmAJmh2ndFtOQIpvX_ga.md │ │ │ │ │ ├── retry@xX_9VGUaOkBYFH3jPjnww.md │ │ │ │ │ ├── returning-results@2gRIstNT-fTkv5GZ692gx.md │ │ │ │ │ ├── rpc@ixqucoAkgnphWYAFnsMe-.md │ │ │ │ │ ├── schedule-driven@zoViI4kzpKIxpU20T89K_.md │ │ │ │ │ ├── scheduler-agent-supervisor@RTEJHZ26znfBLrpQPtNvn.md │ │ │ │ │ ├── scheduling-agent-supervisor@uR1fU6pm7zTtdBcNgSRi4.md │ │ │ │ │ ├── security-monitoring@I_NfmDcBph8-oyFVFTknL.md │ │ │ │ │ ├── security@ZvYpE6-N5dAtRDIwqcAu6.md │ │ │ │ │ ├── sequential-convoy@VgvUWAC6JYFyPZKBRoEqf.md │ │ │ │ │ ├── service-discovery@Nt0HUWLOl4O77elF8Is1S.md │ │ │ │ │ ├── sharding@FX6dcV_93zOfbZMdM_-li.md │ │ │ │ │ ├── sharding@R6YehzA3X6DDo6oGBoBAx.md │ │ │ │ │ ├── sidecar@AAgOGrra5Yz3_eG6tD2Fx.md │ │ │ │ │ ├── sql-tuning@fY8zgbB13wxZ1CFtMSdZZ.md │ │ │ │ │ ├── sql-vs-nosql@KLnpMR2FxlQkCHZP6-tZm.md │ │ │ │ │ ├── static-content-hosting@-lKq-LT7EPK7r3xbXLgwS.md │ │ │ │ │ ├── static-content-hosting@izPT8NfJy1JC6h3i7GJYl.md │ │ │ │ │ ├── strangler-fig@VIbXf7Jh9PbQ9L-g6pHUG.md │ │ │ │ │ ├── strong-consistency@JjB7eB8gdRCAYf5M0RcT7.md │ │ │ │ │ ├── synchronous-io@Ihnmxo_bVgZABDwg1QGGk.md │ │ │ │ │ ├── task-queues@a9wGW_H1HpvvdYCXoS-Rf.md │ │ │ │ │ ├── tcp@2nF5uC6fYKbf0RFgGNHiP.md │ │ │ │ │ ├── throttling@6YVkguDOtwveyeP4Z1NL3.md │ │ │ │ │ ├── udp@LC5aTmUKNiw9RuSUt3fSE.md │ │ │ │ │ ├── usage-monitoring@eSZq74lROh5lllLyTBK5a.md │ │ │ │ │ ├── valet-key@VltZgIrApHOwZ8YHvdmHB.md │ │ │ │ │ ├── valet-key@stZOcr8EUBOK_ZB48uToj.md │ │ │ │ │ ├── visualization--alerts@IwMOTpsYHApdvHZOhXtIw.md │ │ │ │ │ ├── weak-consistency@EKD5AikZtwjtsEYRPJhQ2.md │ │ │ │ │ ├── web-server-caching@o532nPnL-d2vXJn9k6vMl.md │ │ │ │ │ ├── what-is-system-design@idLHBxhvcIqZTqmh_E8Az.md │ │ │ │ │ ├── wide-column-store@WHq1AdISkcgthaugE9uY7.md │ │ │ │ │ ├── write-behind@vNndJ-MWetcbaF2d-3-JP.md │ │ │ │ │ └── write-through@RNITLR1FUQWkRbSBXTD_z.md │ │ │ │ ├── faqs.astro │ │ │ │ ├── migration-mapping.json │ │ │ │ ├── system-design.json │ │ │ │ └── system-design.md │ │ │ ├── technical-writer/ │ │ │ │ ├── content/ │ │ │ │ │ ├── api-definitions@co-35BsWMrD6PXohpFqba.md │ │ │ │ │ ├── api-reference@z5_73Q7dWbBd4m_OrdZlH.md │ │ │ │ │ ├── awareness-blog-posts@7S2lymeBZSMBZSsmei7us.md │ │ │ │ │ ├── backlinking@UphVii3y4T_PkRMqFJ4r_.md │ │ │ │ │ ├── best-practices@yYLsG2LuPaNUuhXSVev_0.md │ │ │ │ │ ├── blogging-platforms@sdoFe4A3y_-Zp3mlrJ5r8.md │ │ │ │ │ ├── bottom-funnel-content@vo1udIIRpxNZCpA3g32F3.md │ │ │ │ │ ├── buyer-journey--content-funnel@EhhKxYPtoLztZXBXl3ZGl.md │ │ │ │ │ ├── call-to-actions@a1ChwDwztjZBi79y38AGa.md │ │ │ │ │ ├── canonical-link@NIxIhMEOxrUR8nbjbF_Fp.md │ │ │ │ │ ├── communities--forums@QMehC1tmWPVWaTsiV9sFC.md │ │ │ │ │ ├── comparative-posts@2wjRA_pQ9cCG9Ww994FEM.md │ │ │ │ │ ├── content-aging--timelines@JgdrXG7MX1gGuNG9uyubA.md │ │ │ │ │ ├── content-analysis@TbSBCITdLswhVB82fErTP.md │ │ │ │ │ ├── content-distribution-amplification-strategies@_cAGbAswDhOqpoiiikPbD.md │ │ │ │ │ ├── content-distribution-channels@m9-DqsQfeukmhjhIfCph-.md │ │ │ │ │ ├── content-distribution@mrqBxsNRl1CQEKtuYSy9F.md │ │ │ │ │ ├── content-objectives--intent@7FGMPztd6ouvqemcGhIol.md │ │ │ │ │ ├── content-optimization@XyFEYDJvJpGZ7qSdoSZeI.md │ │ │ │ │ ├── content-research@O-dZEkmU0tP3dUIUPM6YJ.md │ │ │ │ │ ├── content-seo@-IBL9S4DelIi07w_fmrX3.md │ │ │ │ │ ├── content-structure@Ezz2e4lYLD_bdNNwvsV_y.md │ │ │ │ │ ├── conversion-tracking@UiXn-CnPcLWAflKJzaJ2a.md │ │ │ │ │ ├── crafting-great-titles@WmOvQYlnedX0QgC5Adeen.md │ │ │ │ │ ├── customer-case-studies@W44q1iEj7RKM55-9jabMJ.md │ │ │ │ │ ├── developer-docs@e8oNoXw1KLY4jDzojIXyk.md │ │ │ │ │ ├── developer-journey@2pNW7wDGih_m73lhGZRg6.md │ │ │ │ │ ├── developer-support@7w1SjK-LV9SBZJ673eAUd.md │ │ │ │ │ ├── docs-generation-tools@iBBeZopD8SNo7sWTohMim.md │ │ │ │ │ ├── docs-structure@jYhfx6RETFgDulyNqdTBy.md │ │ │ │ │ ├── ebook@5zQpravkqwafvwXVOuNPX.md │ │ │ │ │ ├── editing-tools@Am_ocP3r0HM45LYfMcQxM.md │ │ │ │ │ ├── forms-of-technical-writing@cNeT1dJDfgn0ndPzSxhSL.md │ │ │ │ │ ├── frequently-asked-questions@pgrKfp1trcIxhDdvLk95g.md │ │ │ │ │ ├── general-product-prose@UFuMiHtWq1M8dS8547lOp.md │ │ │ │ │ ├── generic-gated-content@XDX2QxMUkUok2fcS3tFki.md │ │ │ │ │ ├── git--version-control@ffJyulu9GPB_TDqjeJYyV.md │ │ │ │ │ ├── growth-as-a-technical-writer@FVxNjbDBxgf6vkZWw1Awt.md │ │ │ │ │ ├── help-content@e_bsYrZ0eQqduURg2ybX4.md │ │ │ │ │ ├── how-to-guides@C-eVVtF6Yabp2a6XvMeh_.md │ │ │ │ │ ├── icp--buyer-persona@O1apL6I_g9DQl8VbL3X4W.md │ │ │ │ │ ├── introduction@HlUUGj3dOZ68t4gIjerXh.md │ │ │ │ │ ├── keyword-volume@JtFLW5WwH5Ixmnb0qikia.md │ │ │ │ │ ├── language-proficiency@kNIiAJrvrNoOAllUbRtUB.md │ │ │ │ │ ├── link-shorteners--tracking@qpOfqbgLy5TzlNQEyt6DG.md │ │ │ │ │ ├── long-tail-keywords@2LAvq7W11WMIubSprlK_l.md │ │ │ │ │ ├── markdown@TJ1iuzQ9u_WbrllRQkgm_.md │ │ │ │ │ ├── mid-funnel-content@Q2KD70IKwBXAH3UQgeZpp.md │ │ │ │ │ ├── opengraph-data@AarJ887P-SFRnKaOOv9yw.md │ │ │ │ │ ├── pillar-content@wBDjGa2PgdmeXxHnILFjY.md │ │ │ │ │ ├── plagiarism-checker@cSZbTOB0FPPOlGzy-MkSi.md │ │ │ │ │ ├── platform-support@How-4Re1NhxPLDoshUM-G.md │ │ │ │ │ ├── platform-tracking-and-metrics@hlhBgI3SvU3tMtNaHtu8k.md │ │ │ │ │ ├── product-content@d9mTdwqx6QWKYO5PA_rDH.md │ │ │ │ │ ├── publishing-tools@jC3ZrpskBqzxiV6SKf4Uf.md │ │ │ │ │ ├── references@8qSL2esjsA3YYuB4d7B9z.md │ │ │ │ │ ├── release-notes--product-announcements@-GZXLc9RjY6eWkKC1K_Rg.md │ │ │ │ │ ├── required-skills@8rjUZ9NZPGwVRGmk6Dlyb.md │ │ │ │ │ ├── research-reports@HoNQSWy82ybT0YmejCzRb.md │ │ │ │ │ ├── research-tools@0XWiraeoicNBbaGYQnNZr.md │ │ │ │ │ ├── role-of-technical-writers-in-organizations@j69erqfosSZMDlmKcnnn0.md │ │ │ │ │ ├── search-trends@IZqyEqkrBoEfLBwIQwJl6.md │ │ │ │ │ ├── seo-keywords@IA6TuXmOZr_-Y3HLHqxp0.md │ │ │ │ │ ├── seo-tools@FD-8LQ_g2_O_i2Qwp-Gpv.md │ │ │ │ │ ├── short-tail-keywords@eAioe6b7w8pV2Dvawl_fw.md │ │ │ │ │ ├── story-telling@27muFD1Ld1gF6hhIh22sG.md │ │ │ │ │ ├── subtle-selling@lxSSjgtqJk-PtRp4hARDw.md │ │ │ │ │ ├── support-request-evaluation@xFMsHYYxC0hLueY9xxART.md │ │ │ │ │ ├── technical-content-marketing@mJ1s5-SGd_tj8y0LLZxYg.md │ │ │ │ │ ├── technical-website-copy@tAFenZA0MFhMPE5cevNuD.md │ │ │ │ │ ├── technology-expertise@DubLTESNn3wvEH_bKQZbP.md │ │ │ │ │ ├── tooling@_5xFbl2BHx0f2u9HmSVS8.md │ │ │ │ │ ├── top-funnel-content@5dnZe0oCIzb5qGwgI6pwH.md │ │ │ │ │ ├── topic-score@SX4vL_JEHrwqHdThyqKKO.md │ │ │ │ │ ├── troubleshooting@8fJcJi96Ige6z2PBuTquC.md │ │ │ │ │ ├── tutorials@K459CcDrcPMJCimIcCzM6.md │ │ │ │ │ ├── types-of-technical-content@xV8mox1WnSbl2jAGqQpeg.md │ │ │ │ │ ├── user-goals@FgyBWRtE34VNqBt_5QhAf.md │ │ │ │ │ ├── user-persona@UuV51vM2JT_LFFXORSwru.md │ │ │ │ │ ├── what-is-technical-writing@jl1FsQ5-WGKeFyaILNt_p.md │ │ │ │ │ ├── white-papers@Xa7yBWcbP2aPs4u0C4cLJ.md │ │ │ │ │ ├── who-is-a-technical-writer@ZRGsokU313Ky-anWbWK6q.md │ │ │ │ │ ├── writing-style-guides@cnEVPsqZqs9ZdyqmOuLGA.md │ │ │ │ │ └── written-communication-proficiency@7-3tqRUpntoQP4nK_nul5.md │ │ │ │ ├── faqs.astro │ │ │ │ ├── migration-mapping.json │ │ │ │ ├── technical-writer.json │ │ │ │ └── technical-writer.md │ │ │ ├── terraform/ │ │ │ │ ├── content/ │ │ │ │ │ ├── -replace-option-in-apply@jvHtSRLuCXJrGIiesgbE-.md │ │ │ │ │ ├── authentication@RPcsyhIG027uP7KF0hwaY.md │ │ │ │ │ ├── basic-syntax@LaD0H7XhoEEaXbcwjxAbw.md │ │ │ │ │ ├── best-practices-for-state@jas0XILqCUXjWRk3ZoSEO.md │ │ │ │ │ ├── best-practices@q1I5X_UBGH9LyF7UKHl_u.md │ │ │ │ │ ├── cac-vs-iac@UsINvx84pBF1hp8XoLF4c.md │ │ │ │ │ ├── checkov@ljj7ngl1N4ezCXQ0o6Y8x.md │ │ │ │ │ ├── ci--cd-integration@O194eWh529jj4VDhKxNSj.md │ │ │ │ │ ├── circle-ci@6OoAdvikyp0byMH2oZhyQ.md │ │ │ │ │ ├── clean-up@inbTto9Qukdj6egRJ0Zh9.md │ │ │ │ │ ├── compliance--sentinel@z0PcbgpHbR6Fm07-On4P8.md │ │ │ │ │ ├── configuring-providers@JJ-QhLWqT0luis_kVDVHW.md │ │ │ │ │ ├── contract-testing@bjozhkpOI9UjjNfmT5HhY.md │ │ │ │ │ ├── count@kyScfijEntX9H1mp7tmej.md │ │ │ │ │ ├── creating-local-modules@wQN1QrK9VB_fHlXrBzDoU.md │ │ │ │ │ ├── creation--destroy-time@CJfCpRN_oVf6n_EfLNJSV.md │ │ │ │ │ ├── custom-provisioners@HEr-BBxE3jRKTqRnguds1.md │ │ │ │ │ ├── data-sources@huXZz55P7kVJwTn5BS_Wk.md │ │ │ │ │ ├── depends_on@EIsex6gNHDRYHn0o2spzi.md │ │ │ │ │ ├── deployment-workflow@wL3WWhjPEgFmumOmCPRDf.md │ │ │ │ │ ├── deployment@pjmOK1MEMnIV_zAlaOF01.md │ │ │ │ │ ├── end-to-end-testing@QqwlAtz7VfrMtNEGpT5Sa.md │ │ │ │ │ ├── enterprise-features@elW7IMBSF0ydmlb7rtI1o.md │ │ │ │ │ ├── environment-variables@fm8oUyNvfdGWTgLsYANUr.md │ │ │ │ │ ├── file-provisioner@Qch8k6e4pS8OlmG_sI0hH.md │ │ │ │ │ ├── for_each@gcdg_GhAacIWzv19ITTE_.md │ │ │ │ │ ├── format--validate@Xes24SqkwSaO844kLbClj.md │ │ │ │ │ ├── github-actions@weIlGqGN15U8BH1yE9moA.md │ │ │ │ │ ├── gitlab-ci@fH27mGrdnkDQCrGGDFU6p.md │ │ │ │ │ ├── graph@vAFFgKSthyj_3Lxt-Z6pg.md │ │ │ │ │ ├── hashicorp-config-language-hcl@qhO7CY-1_vuh2BVJYQCzh.md │ │ │ │ │ ├── hcp@erxow5xNRj01WepdFOhVf.md │ │ │ │ │ ├── import-existing-resources@L7wAMGi_yU-Bbc9fXlmxZ.md │ │ │ │ │ ├── infracost@oANePqjkwtNMwvV-_W0B7.md │ │ │ │ │ ├── input-variables@VxMse1VTZAUtVhpKv1OHS.md │ │ │ │ │ ├── inputs--outputs@NsBJTYH9KXvjJuhPzjE_L.md │ │ │ │ │ ├── inspect--modify-state@KXlLlaR0_S7gE_ZB1hNEd.md │ │ │ │ │ ├── installing-terraform@AYtBLFU1nowEq-EVlXrEZ.md │ │ │ │ │ ├── integration-testing@ENkLj3z6hR2cKT7rBhYp5.md │ │ │ │ │ ├── introduction@h6qRrUe-bn25s0UkxU600.md │ │ │ │ │ ├── jenkins@qFpaqOSoefTyKxmI-FRZt.md │ │ │ │ │ ├── kics@MUkbLTMzmaVWbAJj6G3aj.md │ │ │ │ │ ├── lifecycle@0A8zTuCXVmcruJdfH3cNu.md │ │ │ │ │ ├── list@Y-mgCkDpawt5NrMwDH9Ki.md │ │ │ │ │ ├── local-exec-provisioner@g2F5-nX4Aw-xWZiypNbnL.md │ │ │ │ │ ├── local-values@1mFih8uFs3Lc-1PLgwiAU.md │ │ │ │ │ ├── meta-arguments@TPd00dRndj1P8674KTTrm.md │ │ │ │ │ ├── modules-best-practices@gTMPK0tfs2JYgoL7SAGW6.md │ │ │ │ │ ├── modules@R2AORYmc1NgGTqLZY5Fu-.md │ │ │ │ │ ├── mv@0xVXwjWPFXDGRw_3p6th6.md │ │ │ │ │ ├── output-syntax@31fa8kBzCEn-uCrTSoPM4.md │ │ │ │ │ ├── output@kw32gb4HSeCEoBwkeziS_.md │ │ │ │ │ ├── outputs@7GK4fQf1FRKrZgZkxNahj.md │ │ │ │ │ ├── parallelism@RtwZy60ruRpskmgr1qYYf.md │ │ │ │ │ ├── preconditions@DB-p_S4Ce4tDWF4wDiGSt.md │ │ │ │ │ ├── project-initialization@GlIXmCuvR_C81RMeMM1Kz.md │ │ │ │ │ ├── provider@5FLOFTP_nCa3qi1wbV4qE.md │ │ │ │ │ ├── providers@ZRVv9onD7KGz1cJLcsnwy.md │ │ │ │ │ ├── provisioners@6vs1VvjeILgAPLL6g7dfy.md │ │ │ │ │ ├── published-modules-usage@AAg_iFggkEZNL12-6nkgK.md │ │ │ │ │ ├── remote-exec-provisioner@JQE3_KakBXZdMVP_pPFNS.md │ │ │ │ │ ├── remote-state@pDm08NBVwGf9rAIZC_ZIR.md │ │ │ │ │ ├── resource-behavior@BgZu7Xao5GjR8StVL7qhM.md │ │ │ │ │ ├── resource-lifecycle@76kp98rvph_8UOXZR-PBC.md │ │ │ │ │ ├── resources@BYydmFc2e-YPCC4MCWmh2.md │ │ │ │ │ ├── rm@uR6Vjm8cek9JRzZV0iTXh.md │ │ │ │ │ ├── root-vs-child-modules@6W4_akHG9YtvN6dpbZnG-.md │ │ │ │ │ ├── run-tasks@nU1WoRtxRF9KeNhzuwNUB.md │ │ │ │ │ ├── scaling-terraform@ECcHo0KTDN27MuVTC-Fwy.md │ │ │ │ │ ├── secret-management@uVz9WwVAgMu1ZU0qjqVnc.md │ │ │ │ │ ├── security@3MnZK2V5KhBhw67SyUVPk.md │ │ │ │ │ ├── sensitive-data@16vLOPP9lTCuBh0q-UVMk.md │ │ │ │ │ ├── sensitive-outputs@8giL6H5944M2L0rwxjPso.md │ │ │ │ │ ├── show@7DZB2VeyuouFXOdFEfeZt.md │ │ │ │ │ ├── splitting-large-state@zCU02_5Pide5BZiuMuqEU.md │ │ │ │ │ ├── splitting-state-files@a0rUMnYluVUGhyhlDK5S8.md │ │ │ │ │ ├── state-force-unlock@Trpi2ZlnXZVYJCibE2bQ8.md │ │ │ │ │ ├── state-locking@GseYuG9wT8H9R_enxWzuQ.md │ │ │ │ │ ├── state-pull--push@wSh7bbPswcFAzOicX8VPx.md │ │ │ │ │ ├── state-replace-provider@Os6AOXp1CVI_Bh3NYnX17.md │ │ │ │ │ ├── state@5xAE-9viD7DP_ugQ6NE_C.md │ │ │ │ │ ├── template-files@tB4zfwY4E3GmXo-XQwS-l.md │ │ │ │ │ ├── terraform-apply@LDpj-LY_SOXzno04D-Y25.md │ │ │ │ │ ├── terraform-destroy@LPI13FILvkD55hWcWbPrV.md │ │ │ │ │ ├── terraform-fmt@78bGm8J5Y1I8H4qioOvWb.md │ │ │ │ │ ├── terraform-plan@LDxAXmTKyvogvgUpvN5pT.md │ │ │ │ │ ├── terraform-registry@iIjUG_N_mQtLHG25v4-xg.md │ │ │ │ │ ├── terraform-validate@wdYLjB-tKg76B7YcnhevQ.md │ │ │ │ │ ├── terragrunt@AEtW6j2GcfZz7IXk4sM6c.md │ │ │ │ │ ├── terrascan@NSWG79dEygyl6pb54wLrE.md │ │ │ │ │ ├── testing-modules@H3_So6qX-s2131WHGR_GO.md │ │ │ │ │ ├── testing@QSftI21seX6I_xPonlfmU.md │ │ │ │ │ ├── tflint@YftsQYpcqJqBKPjy5tWOq.md │ │ │ │ │ ├── trivy@Vxo_gNdFl3CZXV7GLPqjD.md │ │ │ │ │ ├── type-constraints@HUiodBFIp_rsQDkf3WgbI.md │ │ │ │ │ ├── unit-testing@V7_NnDIY1MefV_xjCCsnI.md │ │ │ │ │ ├── usecases-and-benefits@hRIDJHIxWc5Iav7tsu8l-.md │ │ │ │ │ ├── validation-rules@U2n2BtyUrOFLnw9SZYV_w.md │ │ │ │ │ ├── variable-definition-file@rdphcVd-Vq972y4H8CxIj.md │ │ │ │ │ ├── variables@AY7_xUeCl6ilqZzg1YFoP.md │ │ │ │ │ ├── vcs-integration@Z6dG92afC8SGwCFNTx4ac.md │ │ │ │ │ ├── version-management@6zFuSNOfbPaYIE_t--2nr.md │ │ │ │ │ ├── versioning@1T35eNO18qoyXcX7S-Jox.md │ │ │ │ │ ├── versions@bnQ2YLHd7E-vRxX3PnUEX.md │ │ │ │ │ ├── what-and-when-to-use-hcp@K_7dB-5cCYzGbwYXXaoiY.md │ │ │ │ │ ├── what-is-hcl@Hma2IgatFME8STHPwpeMG.md │ │ │ │ │ ├── what-is-infrastructure-as-code@twR3k9D-qDr1CbyW6K0Fs.md │ │ │ │ │ ├── what-is-terraform@CU9V3iRdssamsG-xMouXT.md │ │ │ │ │ ├── when-to-use@CmmoshFC1dKE4y3SMN2bl.md │ │ │ │ │ ├── workspaces@JoUWF6AQoreELxFHNi9oo.md │ │ │ │ │ └── workspaces@nFq-64JQoYAKjN9YkmOfO.md │ │ │ │ ├── faqs.astro │ │ │ │ ├── terraform.json │ │ │ │ └── terraform.md │ │ │ ├── typescript/ │ │ │ │ ├── content/ │ │ │ │ │ ├── abstract-classes@tZFWeWHdOUJcCEtHfXH9p.md │ │ │ │ │ ├── access-modifiers@RJ7on8WoxrKcXrR3qY5Rs.md │ │ │ │ │ ├── advanced-types@2F7vOL__v9dLBohA263aj.md │ │ │ │ │ ├── ambient-modules@k_5y77k8ZZ9_O2WpWXWTY.md │ │ │ │ │ ├── any@yXiLegSlL7SveU8rBGj8U.md │ │ │ │ │ ├── array@YbDuIo1BbZKEAZwmXlCdZ.md │ │ │ │ │ ├── as-any@afTNr36VqeXoJpHxm2IoS.md │ │ │ │ │ ├── as-const@pGFnTqi0-RSj0YRmNA5iy.md │ │ │ │ │ ├── as-type@Ba0baUbomrW9td_K8U-5L.md │ │ │ │ │ ├── awaited@aEhI_9mFWXRIZh1ZxTuzu.md │ │ │ │ │ ├── boolean@hfIHxa5i_5rEpjtzqEsic.md │ │ │ │ │ ├── build-tools@I5uwfej5XMwR2N2gpBILh.md │ │ │ │ │ ├── class@tTSITP1W1ymS-njbFb8Ts.md │ │ │ │ │ ├── classes@ib0jfZzukYOZ42AdJqt_W.md │ │ │ │ │ ├── combining-types@qefnsugcveizVq2TORRgn.md │ │ │ │ │ ├── compiler-options@RrExVb7l2gd0s_TlNdLeD.md │ │ │ │ │ ├── conditional-types@ubGIhi-WLE0EopTYXzmPL.md │ │ │ │ │ ├── constructor-overloading@oxzcYXxy2I7GI7nbvFYVa.md │ │ │ │ │ ├── constructor-params@3XrKbK5Od2eoM0BLaS4kU.md │ │ │ │ │ ├── decorators@TRx3wvWnRdJJf5eL-GBG4.md │ │ │ │ │ ├── ecosystem@RqZaWGxxNRItBhVwWKysc.md │ │ │ │ │ ├── enum@bfZIXHceDKDGQl-24kQpT.md │ │ │ │ │ ├── equality@Wy2yIK5vgLjEcc9VjuQK5.md │ │ │ │ │ ├── exclude@0fvOXi9gJbEc7etqTggNE.md │ │ │ │ │ ├── extending-interfaces@O-9WQqidujLIEOTcOfy4n.md │ │ │ │ │ ├── external-modules@egQWk1n3p8Pep83yIwCtI.md │ │ │ │ │ ├── extract@IIAbAzXiVQm1JEi2MTMZN.md │ │ │ │ │ ├── formatting@fU8Vnw1DobM4iXl1Tq6EK.md │ │ │ │ │ ├── function-overloading@-0Zp6b8NjDyz9MAQE3HfS.md │ │ │ │ │ ├── generic-constraints@0NXHAOUYGIwuPwlN7r_B3.md │ │ │ │ │ ├── generic-types@T2-VAVfntouJOoWHpHZ3n.md │ │ │ │ │ ├── generics@4gaKqNtGLFqpk9WVKZl0v.md │ │ │ │ │ ├── global-augmentation@JQwWeB1gkANSYfQmH69Bs.md │ │ │ │ │ ├── hybrid-types@lvtTSHH9yBTCiLng8btnI.md │ │ │ │ │ ├── inheritance-vs-polymorphism@8P0-vb9nlnmz7iC4UvyJZ.md │ │ │ │ │ ├── installation-and-configuration@dA8CNQOgJRDa0T7rmyS7f.md │ │ │ │ │ ├── instanceof@EDOU5a7UK17yp3PdFBJMc.md │ │ │ │ │ ├── instancetype@izGAjNtrh3BzQt3KiZX0W.md │ │ │ │ │ ├── interface-declaration@fY40W8prpgiNqRL50w7ub.md │ │ │ │ │ ├── interface@mVKsM7R4Ivpdhnbwt1aRb.md │ │ │ │ │ ├── intersection-types@RWYXEZMODUrqwRWf_Lqi9.md │ │ │ │ │ ├── introduction-to-typescript@KDd40JOAvZ8O1mfhTYB3K.md │ │ │ │ │ ├── keyof-operator@t1Tcesfq7bV2TkHcfD6lU.md │ │ │ │ │ ├── linting@8PcAPOrKisKRYPWamz4nV.md │ │ │ │ │ ├── literal-types@CWzGwvl6NwYCaLYSLIjqQ.md │ │ │ │ │ ├── mapped-types@VQ-V9qIdKgnpSJg2UnpuB.md │ │ │ │ │ ├── method-overriding@aknqutxN2WDQ4RFcT-szM.md │ │ │ │ │ ├── namespace-augmentation@16TT8R4N-9tCfWmPetqMP.md │ │ │ │ │ ├── namespaces@EtVwQ4lnWi3IIFHGb2Qib.md │ │ │ │ │ ├── never@0pi9VTbngcAIswuu5LIYg.md │ │ │ │ │ ├── non-null-assertion@mjaL5ocLnM8VQlhUxW6KU.md │ │ │ │ │ ├── nonnullable@_BAZlBEzE7ddr315OeHvl.md │ │ │ │ │ ├── null@cjAwawhZLo1qVQ93XIdm2.md │ │ │ │ │ ├── number@UH9d3cvGy_e67WFNFwCyf.md │ │ │ │ │ ├── object@vnqvm_WiaKqpdxrW4wRGa.md │ │ │ │ │ ├── omit@yjlxygHl8QONNUrdx-Q0A.md │ │ │ │ │ ├── parameters@a7hl0iMZ-jcUACxqIYVqv.md │ │ │ │ │ ├── partial@gBTem9Dp3IQLAkqGX4fOF.md │ │ │ │ │ ├── pick@E88tHQvARkHURZwGaO02l.md │ │ │ │ │ ├── readonly@IuO9-O_DQdDYuAbdGWdgb.md │ │ │ │ │ ├── record@DRdBmF5Dt_r09LoPOxOuq.md │ │ │ │ │ ├── recursive-types@N8xBTJ74xv1E5hSLYZtze.md │ │ │ │ │ ├── returntype@On75JR_UkiIlha0_qaSeu.md │ │ │ │ │ ├── running-typescript@qdy4ZIY2EKgmPNdu_ndcg.md │ │ │ │ │ ├── satisfies-keyword@HD1UGOidp7JGKdW6CEdQ_.md │ │ │ │ │ ├── string@d8iV-IBZ6cSnH8Z5_HRmc.md │ │ │ │ │ ├── template-literal-types@xP25nGw42VqdfZ_9pDMXd.md │ │ │ │ │ ├── truthiness@Xonbxc7MvMEonKBvbkCAH.md │ │ │ │ │ ├── ts-and-js-interoperability@dcLaEU_lb0z_QypL1ZhpX.md │ │ │ │ │ ├── ts-node@ZCM2_X4BiKh5FTCizrr-E.md │ │ │ │ │ ├── ts-playground@_bZ71i36haWgHQTY0yMOx.md │ │ │ │ │ ├── tsc@Iv_t13PSVzet5VPKFtAp1.md │ │ │ │ │ ├── tsconfigjson@DmqrX56d9KnBcOSwlJR2q.md │ │ │ │ │ ├── tuple@jq-GD0DLyzrEXQKUmt5kv.md │ │ │ │ │ ├── type-aliases@M_3O21zjppgWptIT5dtu8.md │ │ │ │ │ ├── type-compatibility@alMJCEyUZ90xz-2_g3YRj.md │ │ │ │ │ ├── type-guards--narrowing@cFZsxpYHDxm7IWwergb3r.md │ │ │ │ │ ├── type-inference@KUur-gfOBQodTS-irFet7.md │ │ │ │ │ ├── type-predicates@1DOSAieOmWUNNsQQrqf2m.md │ │ │ │ │ ├── typeof@ZiOcFZy85p7tLzUkyKDei.md │ │ │ │ │ ├── types-vs-interfaces@TxkEpoOiuUm-fXJuFVKcH.md │ │ │ │ │ ├── typescript-functions@qOynVkDi1gFz0mxyJHjfJ.md │ │ │ │ │ ├── typescript-interfaces@aH1DxiG5xrdNlKutJ_gTz.md │ │ │ │ │ ├── typescript-modules@sE9lqkkqwnsVJxTJv37YZ.md │ │ │ │ │ ├── typescript-types@qcrGApxNzkGYxgcd7o45d.md │ │ │ │ │ ├── typescript-vs-javascript@MQWzN_kXxVJMOYbRXSGJc.md │ │ │ │ │ ├── typing-functions@9FIhHwDNzyKpb42NmSv3K.md │ │ │ │ │ ├── undefined@Sa6IZtM4XJstultz-pbh0.md │ │ │ │ │ ├── union-types@5z5w3yv1HbOpMlzEd4Iot.md │ │ │ │ │ ├── unknown@O2TYbd9i_OQwQk2dKh-ly.md │ │ │ │ │ ├── useful-packages@PCX3KcvMUW3mmQEepLTXp.md │ │ │ │ │ ├── utility-types@LSwUHfalnk5MgHt21PANb.md │ │ │ │ │ └── void@yLlQg7BF--ZwRHbXBWfOi.md │ │ │ │ ├── faqs.astro │ │ │ │ ├── migration-mapping.json │ │ │ │ ├── typescript.json │ │ │ │ └── typescript.md │ │ │ ├── ux-design/ │ │ │ │ ├── content/ │ │ │ │ │ ├── adobe-xd@HI_urBhPqT0m3AeBQJIej.md │ │ │ │ │ ├── automate-the-act-of-repetition@ZufrLRNkMoJ4e2T-vWxCR.md │ │ │ │ │ ├── avoid-choice-overload@8wxlu4KA2iu9CJa1UAUll.md │ │ │ │ │ ├── avoid-cognitive-overhead@4AzPOKXUN32CkgchRMrRY.md │ │ │ │ │ ├── avoid-direct-payments@iQNvKhwhvbis4Yn1ZxQua.md │ │ │ │ │ ├── balsamiq@fZkARg6kPXPemYW1vDMTe.md │ │ │ │ │ ├── be-authentic-and-personal@m30ePaw_qa36m9Rv9NSFf.md │ │ │ │ │ ├── behavior-change-games@JSBiw0C6aq1LhA33y79PM.md │ │ │ │ │ ├── behavior-change-strategies@w_QWN80zCf1tsVROeyuvo.md │ │ │ │ │ ├── behavior-design@zYCBEUqZVlvjlAKnh5cPQ.md │ │ │ │ │ ├── behavioral-economics@_lv6GJ0wlMfhJ7PHRGQ_V.md │ │ │ │ │ ├── behavioral-science@D553-nVELaB5gdxtoKSVc.md │ │ │ │ │ ├── bj-foggs-behavior-grid@lRBC8VYJPsR65LHDuuIsL.md │ │ │ │ │ ├── bj-foggs-behavior-model@2NlgbLeLBYwZX2u2rKkIO.md │ │ │ │ │ ├── business-model-canvas@SGO9hHju49_py0n0ASGBe.md │ │ │ │ │ ├── business-model-inspirator@GI06-DbGyJlQXq5Tyi-aH.md │ │ │ │ │ ├── business-process-model--notation-bpmn@jy5jtSEyNE8iJpad27rPX.md │ │ │ │ │ ├── call-to-action@U4ZEFUcghr9XjSyf-0Np7.md │ │ │ │ │ ├── cheating@zVXJPpqZvUFIxTGVrr0rN.md │ │ │ │ │ ├── clear-the-page-of-distractions@IjqH_Ev2fDWG0QDQ9c9eN.md │ │ │ │ │ ├── competitor-analysis@HUZ5n2MRHzQPyjwX2h6Q4.md │ │ │ │ │ ├── conceptual-design@r6D07cN0Mg4YXsiRSrl1_.md │ │ │ │ │ ├── create-action-funnel@kcG4IpneJzA6di0uqTiwb.md │ │ │ │ │ ├── create-user-personas@s2KJ5kNv9UcnsP0QKIKQ7.md │ │ │ │ │ ├── crowd-out-old-habit-with-new-behavior@B0gg7Z5JL9m9Srb89KcN5.md │ │ │ │ │ ├── cue-routine-reward-model@X1AroUI8Fge_lRpKab4A9.md │ │ │ │ │ ├── customer-experience-map-by-mel-edwards@0KEqAjHFBjfmGA1bKzXuD.md │ │ │ │ │ ├── decision-making-support@9vA3ZWMiKG6NiEqGDvcFR.md │ │ │ │ │ ├── default-everything@wE5gt1vMgbF3csA61VO2-.md │ │ │ │ │ ├── defaulting@IpKCXqf_PkxIllwmiIZsq.md │ │ │ │ │ ├── deploy-peer-comparisons@gqOnzmiLQHmIXuEe4jG2e.md │ │ │ │ │ ├── deploy-social-proof@C1NwA0Pivoo73GANoOaPi.md │ │ │ │ │ ├── deploy-strong-authority-on-subject@C5dKHIIgBzxtBpFgDs-hB.md │ │ │ │ │ ├── dual-process-theory@kWA8CvocP1pkom2N7O4gb.md │ │ │ │ │ ├── educate--encourage-user@SLXjoYL-lhPef8s9V3jpf.md │ │ │ │ │ ├── elicit-implementation-intentions@EmDgiwaknBz5lXr1rwalE.md │ │ │ │ │ ├── event-driven-process-chain-model-epc@nccToz_0FUvHMJytpDpM0.md │ │ │ │ │ ├── figma@t46s6Piyd8MoJYzdDTsjr.md │ │ │ │ │ ├── five-forces-model@F9gpGTRwXq08jNo5pPKm6.md │ │ │ │ │ ├── frame-text-to-avoid-temporal-myopia@S9rJr8pc-Ln8BxG0suBWa.md │ │ │ │ │ ├── gamification@fbIur1tEIdNDE6gls4Bru.md │ │ │ │ │ ├── gather-lessons-prioritize--integrate@Emby09Nsm_j6uNreT58r6.md │ │ │ │ │ ├── goal-trackers@g-bcan_JnjJfg0_fMOb64.md │ │ │ │ │ ├── good-layout-rules@90_M5qABC1vZ1nsXVyqFJ.md │ │ │ │ │ ├── help-user-avoiding-the-cue@S2TgqNDjvmcJTaXncM09u.md │ │ │ │ │ ├── help-user-think-about-their-action@e9n9an1PGxDPGkLCOHIwz.md │ │ │ │ │ ├── how-to-tips@mzWd-xSr7sO2RgfPbKy4T.md │ │ │ │ │ ├── human-decision-making@liUKYf7UghuPk25xMPPYj.md │ │ │ │ │ ├── in-general-keep-it-short-and-simple@QNJ-LxfYtR8lbnmuy2Qm9.md │ │ │ │ │ ├── incremental-ab-testing@Q4xBz9f3yyZi2F_aZ5ixL.md │ │ │ │ │ ├── lean-canvas@sc8jJ_77CrkQuxIJYk28Q.md │ │ │ │ │ ├── lessen-the-burden-of-action--info@gf7et64xCqkYBrP9HwWs_.md │ │ │ │ │ ├── leverage-loss-aversion@zXinWCEH4LlYvXekLK0Ju.md │ │ │ │ │ ├── make-commitment-to-friends@dOL2z6ULpmzRD5N3MrYCy.md │ │ │ │ │ ├── make-it-clear-where-to-act@hDj3HaYAM7K1UJmP_T52n.md │ │ │ │ │ ├── make-it-easy-to-understand-and-complete@vAu2c45c7DgoRydHR2tvD.md │ │ │ │ │ ├── make-or-change-habits@y6CqgqTvOt-LrvTnPJkQQ.md │ │ │ │ │ ├── make-progress-meaningful-to-reward-user@D3LVYuCDHD6-kU8GhXokf.md │ │ │ │ │ ├── make-progress-visible-to-user@8YePym3cQtoVY0DJQLllK.md │ │ │ │ │ ├── make-reward-scarce@1pzONoWafLAeX8eWbH-Dz.md │ │ │ │ │ ├── make-successful-completion-clearly-visible@94V3wUtZ0NMm_0Vb1pBju.md │ │ │ │ │ ├── make-ui-professional-and-beautiful@ahhffBkmd-feroleBrhJm.md │ │ │ │ │ ├── making-it-incidental@Ix5Fll_dAINWLxVF2DXFI.md │ │ │ │ │ ├── measuring-the-impact@GgBazWfF2OvOqkuo3DO2L.md │ │ │ │ │ ├── mindfulness-to-avoid-acting-on-the-cue@d1dXGCHmMF2EFpL5yKVJA.md │ │ │ │ │ ├── multivariate-testing@-_T2nzp1vV1jUcpsC5DI3.md │ │ │ │ │ ├── nir-eyals-hook-model@PLLTcrHkhd1KYaMSRKALp.md │ │ │ │ │ ├── nudge-theory@6ffY5wO-XhkiDJJ5YcI0x.md │ │ │ │ │ ├── persuasive-technology@K22gvF9DLt0Ikc80yZLCb.md │ │ │ │ │ ├── planners@eYZf67rnhOksfh44hnzHg.md │ │ │ │ │ ├── prime-user-relevant-associations@jBQtuiHGl3eyCTZG85Vz5.md │ │ │ │ │ ├── prototyping@6yCBFwntQ_KxFmmGTJ8iR.md │ │ │ │ │ ├── remind-of-prior-commitment-to-act@kR-UbUFdELVeiPJqT0GlZ.md │ │ │ │ │ ├── reminders--planning-prompts@wFWidrOZ5EHPgo9uuUclK.md │ │ │ │ │ ├── reminders@esWGzYUJwv7_xGjq6kpVE.md │ │ │ │ │ ├── replace-the-routine@_C-55tciBzc6_Kyk6272k.md │ │ │ │ │ ├── simple-flowchart@JCP5_jyvh9u7hxp379iW2.md │ │ │ │ │ ├── sketch@nb7Ql1gvxqEucsGnIWTyY.md │ │ │ │ │ ├── social-sharing@FoKtBRuTuMD2SZDHLWS-5.md │ │ │ │ │ ├── spectrum-of-thinking-interventions@0Df110GZcDw5wbAe1eKoA.md │ │ │ │ │ ├── status-reports@G4Ap91NgZfkV-54EuWe-Z.md │ │ │ │ │ ├── support-conscious-action@PTZROvpPtEvu06szwmt4K.md │ │ │ │ │ ├── swot-analysis@XiEn1OGFY1bMCoB0Pk8N_.md │ │ │ │ │ ├── target-action@AXn-N15U_z4OagClNoXrW.md │ │ │ │ │ ├── target-actor@FRn2MaR0-ehSD3zmwXcCI.md │ │ │ │ │ ├── target-outcome@7J8F9dn1jGaVlhLVVRPrG.md │ │ │ │ │ ├── tell-user-what-the-action-is-and-ask-for-it@FXJpJDIp-JBc0-0z4PIRo.md │ │ │ │ │ ├── tutorials@f0n2JKxpcuP0JW-h4CvwN.md │ │ │ │ │ ├── understanding-the-product@q1WX2Cp4k4-o1T1vgL8FH.md │ │ │ │ │ ├── use-competition@6Mvm8SrISyTT99AJ-VFaW.md │ │ │ │ │ ├── use-consciousness-to-intefere@0MbrHG-VDrdZqQ0jWtiDo.md │ │ │ │ │ ├── use-peer-comparisons@iKHU0O0z6gCunCgv_aZye.md │ │ │ │ │ ├── user-stories@tkbkpvHlWQeOnReanR8J7.md │ │ │ │ │ └── ux-best-practices@VUf72i5hYaLR_8ul9EzmM.md │ │ │ │ ├── faqs.astro │ │ │ │ ├── migration-mapping.json │ │ │ │ ├── ux-design.json │ │ │ │ └── ux-design.md │ │ │ ├── vibe-coding/ │ │ │ │ └── content/ │ │ │ │ ├── ask-ai-to-handle-your-git-and-github-cli-tasks@vDSSzh5TwZ8zzY0rWRXu4.md │ │ │ │ ├── ask-ai-to-keep-the-code-modular-and-aim-for-smaller-modulesfiles@FoQ15wo0cV2Tntru6jV-1.md │ │ │ │ ├── ask-ai-to-use-subagents-if-possible@n5JxUpashrHKai2XESdd-.md │ │ │ │ ├── ask-ai-to-write-tests-e2e-tests-can-help-build-a-stable-product@WLOx62vbIhIlv73jcT8zM.md │ │ │ │ ├── ask-for-one-task-at-a-time-rather-than-five-different-items@HpbG5bcOEIZxYlVl9pwod.md │ │ │ │ ├── based-on-your-previous-coding-sessions-tell-ai-what-not-to-do@3lHMW2Uje5tQawetE4I21.md │ │ │ │ ├── be-specific-about-what-you-want-rather-than-high-level-vague-instructions@JXtLbQ1JUQOPZorFy1ctF.md │ │ │ │ ├── chatgpt@XY2l96sry3WyLzzo3KUeU.md │ │ │ │ ├── claude-code@wr5ddjutC-fX_ixysTHaT.md │ │ │ │ ├── codex@XY2l96sry3WyLzzo3KUeU.md │ │ │ │ ├── consider-test-driven-development-tdd@Gr9WJ0tNmSsVHSA0Cx3xY.md │ │ │ │ ├── context@0ZJrFxKo5HyD9OgzG5LWp.md │ │ │ │ ├── copilot@Ubk4GN0Z4XlDJ3EbRXdxg.md │ │ │ │ ├── cursor@MWhoqhNnBaoeCdN_8i15k.md │ │ │ │ ├── debugging@mHChjJd39ofwPBS-v_sQY.md │ │ │ │ ├── explicitly-ask-ai-to-perform-a-security-audit-of-the-application@8VL5XHFrQUjin1pdAi7WZ.md │ │ │ │ ├── explicitly-tell-ai-to-think-or-brainstorm-before-complex-problems@17nFgML7zVjQYiHIOSLlK.md │ │ │ │ ├── for-unrelated-tasks-proactively-clean-and-start-new-sessions@phtVEKzIUv9E1abazort0.md │ │ │ │ ├── gemini@hzeEo8COf2l07iu5EdlFo.md │ │ │ │ ├── give-ai-mockups-reference-files-and-material-that-can-help-it@6kVVt2lihBW8tPGV-ll3_.md │ │ │ │ ├── if-ai-fails-after-3-prompts-stop-and-start-a-fresh-chat@ikp1O_sss_6hDGl6p8LNJ.md │ │ │ │ ├── if-errors-persist-ask-al-to-create-a-list-of-possible-causes@cz--AlEn0cc2-keXeuk9g.md │ │ │ │ ├── if-you-have-stylecoding-preferences-document-them-for-ai@QBeh16mppfb2s4OGt4aPy.md │ │ │ │ ├── if-you-need-to-revert-use-git-rather-than-ai-native-revert-functionality@upZAMDEtzq1VklqTKG5mV.md │ │ │ │ ├── illustrate-ai-with-examples-mockups-code-samples-images@ODqMzOAN1je004chwATTl.md │ │ │ │ ├── implement-spec-driven-development-sdd@O9W3d1q1yJmfRJHnfognN.md │ │ │ │ ├── install-and-ask-ai-to-use-mcp-eg-playwright-for-browser-when-possible@KVb_TAsSD8Kgafij4iEXc.md │ │ │ │ ├── leverage-long-context-window-when-available-and-necessary@CMnz6UFUGbxIGSH06ZdgH.md │ │ │ │ ├── lovable@5WogJrcXhNXewsXzSAME7.md │ │ │ │ ├── master-version-control@q5lkCO_uGmkcJopjltg8j.md │ │ │ │ ├── never-hardcode-or-credentials-use-env-variables-instead@aRnpJbSUg_rr9Z00RafYt.md │ │ │ │ ├── once-tests-are-in-place-refactor-regularly@9BSermDg6ODL2MSRQiDZo.md │ │ │ │ ├── pick-a-popular-tech-stack-rather-than-newniche-ones@7mAZMKyiuZiEpKhrydp8J.md │ │ │ │ ├── plan-before-you-code@pfgsxuQ-D7dTMPNWKG9OY.md │ │ │ │ ├── plan-what-you-need-to-develop-mvp-different-phases@OPHuAD0L-GZ6zRhIhbmPL.md │ │ │ │ ├── prompt-the-error-message-and-let-ai-do-the-rest@GW5I1z7D1945AxqYHbW6F.md │ │ │ │ ├── prompting-best-practices@6GvIXEzWbSD8q6Qt-BsHP.md │ │ │ │ ├── regularly-ask-the-ai-to-review-and-refactor-the-codebase@NtQDPno95SYo5E88ls4v1.md │ │ │ │ ├── regularly-update-your-context-document-eg-claudemd@WypEm84Rr0t-IzCZiU92q.md │ │ │ │ ├── replit@Ubk4GN0Z4XlDJ3EbRXdxg.md │ │ │ │ ├── security-best-practices@2omItZjkVFW9kMiNXdt-h.md │ │ │ │ ├── start-each-new-feature-with-a-clean-git-slate@ScizaxaDFQ_OBiFZ540Xs.md │ │ │ │ ├── tech-stack-and-coding@GC4vVcOcFWE1RByD-sd4G.md │ │ │ │ ├── tell-ai-to-add-logs-to-find-the-error-faster@vnm51qAe2C1cszHfh-o6P.md │ │ │ │ ├── testing@4bJRhuZzVc32x2Y0gGGrh.md │ │ │ │ ├── the-vibe-coder-mindset@LkLQ8GjBXDuw1XsrE4Cjj.md │ │ │ │ ├── use-act-as-framing-when-helpful-eg-act-as-a-ux-researcher@h2oehkZSKfMqlVBAgt46P.md │ │ │ │ ├── use-git-commit-regularly-eg-after-every-successful-ai-task@wWs2PxN7T2-gDZNJJ1vTq.md │ │ │ │ ├── use-skills-created-by-others@bnpY9GX1BGjDPJXwTFWTX.md │ │ │ │ ├── v0@eX9-1I_hC2zwJNiBYXFu6.md │ │ │ │ ├── what-is-vibe-coding@lzHnwx_3gftRZbstk6INB.md │ │ │ │ ├── when-you-find-a-bug-ask-ai-to-write-a-breaking-test-and-then-fix@r-LrA1cGR1XMu1p2xIsN0.md │ │ │ │ ├── windsurf@Xsl8mx6J182TxPPtNP471.md │ │ │ │ └── work-step-by-step-rather-than-trying-to-build-everything-at-once@CJV5OV_Whoz4_7L8yhDG1.md │ │ │ ├── vue/ │ │ │ │ ├── content/ │ │ │ │ │ ├── api-calls@ZLlz0Azfze-8k3z8HnVvE.md │ │ │ │ │ ├── api-styles@OpJ2NMKCGXQezpzURE45R.md │ │ │ │ │ ├── apollo@l2Rl6OQbL7kYvPlpYCZ0Z.md │ │ │ │ │ ├── app-configurations@qRm08uDZW-D8QDc-9sPX8.md │ │ │ │ │ ├── async-components@Re7tv1U0LxYqE5ShFxQSf.md │ │ │ │ │ ├── attribute-inheritance@4S5fVFsFDMbq05ld7n0sF.md │ │ │ │ │ ├── axios@n5IlN-wv4k0r16CvhoSpD.md │ │ │ │ │ ├── binding-events@b7iXwtUnELg_ShbCyTrNA.md │ │ │ │ │ ├── capacitor@IsNzCdS05tbAK0D1zz0Sf.md │ │ │ │ │ ├── component-registration@2HhKifjuDcP3eKpanRMEQ.md │ │ │ │ │ ├── components@0EevuyZiyty3X3Jzpjl4y.md │ │ │ │ │ ├── composition-api@a0qwdQTunxEjQ9A5wpF-q.md │ │ │ │ │ ├── computed-properties@Bx1Atxcf15AEaA1BiSIc6.md │ │ │ │ │ ├── conditional-rendering@tU4Umtnfu01t9gLlnlK6b.md │ │ │ │ │ ├── create-vue@y9ToYDix-koRbR6FLydFw.md │ │ │ │ │ ├── custom-directives@br1r8KIf5KInY5mk2xhA6.md │ │ │ │ │ ├── cypress@JbMKUVDMUygjXXmhndHVs.md │ │ │ │ │ ├── debugging@dxwKfBxd5KYVkfEPMdHp-.md │ │ │ │ │ ├── directives@CGdw3PqLRb9OqFU5SqmE1.md │ │ │ │ │ ├── element-ui@NMIh8rqLM5P-Uk65uHATn.md │ │ │ │ │ ├── error--warn-handler@1oIt_5OK-t2WaCgaYt9A8.md │ │ │ │ │ ├── event-handling@4p6Gh2fMPA8hls_mWa5HR.md │ │ │ │ │ ├── event-modifiers@Aaf7eA-5sbAD5Cs1MbdTQ.md │ │ │ │ │ ├── events@X0J3ogH3W8EQe68tLfcGL.md │ │ │ │ │ ├── fetch@ufnt87swK61kxShLuVc1-.md │ │ │ │ │ ├── formkit@BXz1utB_2eYzFvzSbFKx0.md │ │ │ │ │ ├── forms-handling@PQu4TyJOfCEaafW5th0e4.md │ │ │ │ │ ├── forms@izGdctxP_OvQNvaMwVIrh.md │ │ │ │ │ ├── global-properties@gihxGgt177BK_EYsAfpx9.md │ │ │ │ │ ├── inline--method-handlers@gVahaZNPktQuqdukFEbQH.md │ │ │ │ │ ├── input-bindings@NfB3HlZ3uwYK5xszvV50b.md │ │ │ │ │ ├── key-modifiers@BXw36wqhmi3gExXwFCIBd.md │ │ │ │ │ ├── lifecycle-hooks@WiGG9_4G5y-AVA9byw6_g.md │ │ │ │ │ ├── mobile-apps@3RwIO-S8-xOYKNmfwk0pf.md │ │ │ │ │ ├── modifiers@dSfrFLr8wKkLAOMJwtCTr.md │ │ │ │ │ ├── mouse-button-modifiers@x0wl2Qz2LTP4Q2tThKAt3.md │ │ │ │ │ ├── nuxtjs@8xZxTLYq5m5_nkGh2lfUt.md │ │ │ │ │ ├── optimizing-renders@RRPhAxIqvAcjZIcLe_N8-.md │ │ │ │ │ ├── options-api@PPUU3Rb73aCpT4zcyvlJE.md │ │ │ │ │ ├── performance@f7N4pAp_jBlT8_8owAcbG.md │ │ │ │ │ ├── pinia@NIvjyhtTFC1gomtGQT_2t.md │ │ │ │ │ ├── playwright@zqcE3bTnymdepV-Yc8qBl.md │ │ │ │ │ ├── plugins@_Nc8ivQrdpKuf8MwaV-K7.md │ │ │ │ │ ├── props@raEfI4GLMW2fOucka07VE.md │ │ │ │ │ ├── provide--inject@xwVbhOpQMPPB4G-lhro0B.md │ │ │ │ │ ├── quasar@f2udJnT2q5eDmBZ_OKtmi.md │ │ │ │ │ ├── rendering-lists@ftqDoGpwqqWQnu4NQSsMk.md │ │ │ │ │ ├── routing@ixRG0xfEp4BmyvCR0mtoR.md │ │ │ │ │ ├── single-file-components@VNBRlJkdH6NOOzGXUrbZK.md │ │ │ │ │ ├── slots@jkX66izOHVWqtyd6KZ0K6.md │ │ │ │ │ ├── ssg@822tGnM9jOkYh9aNlosPr.md │ │ │ │ │ ├── ssr@Cm6mqXYp-G4mGfPxuU73_.md │ │ │ │ │ ├── state-management@9AwVtwIv6TfP9F4ulz2F0.md │ │ │ │ │ ├── tailwind-css@TkzlmJ85O-e-KfMhTBwry.md │ │ │ │ │ ├── tanstack-query@WSq_cDKQPZa_qmQlIdGXg.md │ │ │ │ │ ├── teleport-components@SGsd08ZTu4H76s8cfbCKe.md │ │ │ │ │ ├── templates@VlcYnTHW5d4J_zLYupvu5.md │ │ │ │ │ ├── topic-node@B36yB4jsgSbTrf8g-R5Z1.md │ │ │ │ │ ├── transition-group@HjzOYjS-7ZEBvElRJ8uN2.md │ │ │ │ │ ├── transition@SWpWg5J5N9ZfY_DaIigA5.md │ │ │ │ │ ├── v-bind@cuM9q9vYy8JpZPGeBffd1.md │ │ │ │ │ ├── v-cloak@RrSekP8Ub01coegMwLP6a.md │ │ │ │ │ ├── v-else-if@a9caVhderJaVo0v14w8WB.md │ │ │ │ │ ├── v-else@0CtAZQcFJexMiJfZ-mofv.md │ │ │ │ │ ├── v-for@3ftwRjQ9e1-qDT9BV53zr.md │ │ │ │ │ ├── v-html@bZxtIBeIfeUcR32LZWrPW.md │ │ │ │ │ ├── v-if@xHj3W9Ig3MVuVlGyXchaP.md │ │ │ │ │ ├── v-model@cxu2Wbt306SxM4JKQQqnL.md │ │ │ │ │ ├── v-model@gMFndBcrTC6FtGryqN6dX.md │ │ │ │ │ ├── v-model@swpyZFUO4UO3mW8Bvf1Te.md │ │ │ │ │ ├── v-on@hVuRmhXVP65IPtuHTORjJ.md │ │ │ │ │ ├── v-once@5k9CrbzhNy9iiS6ez2UE6.md │ │ │ │ │ ├── v-pre@mlsrhioiEkqnRIL6O3hNa.md │ │ │ │ │ ├── v-show@_TlbGTKFCMO0wdLbC6xHX.md │ │ │ │ │ ├── v-slot@m9pQ3daR3KiwRATcQysHA.md │ │ │ │ │ ├── v-text@NCIzs3jbQTv1xXhAaGfZN.md │ │ │ │ │ ├── vee-validate@_Fmp8_z4SKWfKUE80_fqb.md │ │ │ │ │ ├── vitepress@_46COO0FGaFuCYwqaRRWy.md │ │ │ │ │ ├── vitest@LjEAviRMtPLwUUlfcof1h.md │ │ │ │ │ ├── vue-router@COxkmvqe9jFtV9WtGjfbh.md │ │ │ │ │ ├── vue-testing-library@p5bUvgr_3H-A55ZnEExk8.md │ │ │ │ │ ├── vuelidate@6U_CAhAY_jyj_4Mzj_HL_.md │ │ │ │ │ ├── vuetify@VNclt_QQthWb2u4xWI_uY.md │ │ │ │ │ ├── vueuse@Z9szBPFXfqK_KsvzkR-rf.md │ │ │ │ │ └── watchers@kdlXhbw_a81xdZtyK-pVa.md │ │ │ │ ├── faqs.astro │ │ │ │ ├── migration-mapping.json │ │ │ │ ├── vue.json │ │ │ │ └── vue.md │ │ │ └── wordpress/ │ │ │ ├── content/ │ │ │ │ ├── accessibility@bfFSH7alQ8IZZJ5gUed-T.md │ │ │ │ ├── acf@JTWl8rqTwaD2YulcOnwu9.md │ │ │ │ ├── actions@zAV29-MTFNLLVPu3rlRFv.md │ │ │ │ ├── activity-logging@KBHvwgqRRRg-amfGTUAL3.md │ │ │ │ ├── admin-menu@nTuHbvhf6OgM6ZekXqGSa.md │ │ │ │ ├── advanced-php--architecture@aI9yJGnzztuVayUhgIxAw.md │ │ │ │ ├── ajax-in-wordpress@BS0poxbCfYfBvvnZzODH0.md │ │ │ │ ├── assets@TX8dzu0k2sgXUnUOldhmZ.md │ │ │ │ ├── automated-deployments@UDQ3VQCllviOq8wI806Wk.md │ │ │ │ ├── backend-fundamentals@Xy15NSxlS0QXYNzEvgocK.md │ │ │ │ ├── backups--recovery@4fIWzIY2720UME6qjLdhS.md │ │ │ │ ├── basics-of-seo@CLQwjime3I2HKRzLLnSL3.md │ │ │ │ ├── bedrock@ND0sr6SbdQYcEHic8mOxL.md │ │ │ │ ├── block-editor@YbzkrzDYtja8rhYvzkQU8.md │ │ │ │ ├── block-patterns@lDuJRUjKyie7PbdU12d7r.md │ │ │ │ ├── block@65zlrIkArzxRwVU_fTzhi.md │ │ │ │ ├── boost-your-wordpress-career@dGHHlz26kn14_o7emPcFV.md │ │ │ │ ├── caching@zEogtBBsOALQegh5QTy14.md │ │ │ │ ├── cdn-integration@PREVV_dtO35j4Vi1FwQjk.md │ │ │ │ ├── child-themes@GG6uE_p44ybIxez--igF1.md │ │ │ │ ├── classic-vs-block-themes@1rfPHsFNlnCCmk5gLPBoD.md │ │ │ │ ├── classic@_X1752swPqlH51enlkg2u.md │ │ │ │ ├── classic@sNJTLbzuzNIoezVmZt89M.md │ │ │ │ ├── coding-standards@yZ5sglhcY2--dT-JyPQFd.md │ │ │ │ ├── composer--autoloading@DGUKyNG_gTUWqmPRZNOpz.md │ │ │ │ ├── composer@SG0_5ZaQcDdnu4Th75Pje.md │ │ │ │ ├── contribute-to-wordpress@IJ_aNI71Z0H5CMLIDRvqR.md │ │ │ │ ├── core-web-vitals@ktqvYkk7d680p2eRteAvR.md │ │ │ │ ├── cron-jobs@tdJQiJJ47fdlyEk1Ze1P4.md │ │ │ │ ├── css@qNr6gKBcxYoUJSOc4O3nn.md │ │ │ │ ├── custom-fields@6rmwfUecLKrhxOXQIRszK.md │ │ │ │ ├── custom-post-types@zOQLL3hD8NzAb-287CifD.md │ │ │ │ ├── custom-tables@_ijMALSgk7NpDQnuo15sB.md │ │ │ │ ├── customizer@fh4oAQsCeAisrxUEqDbqu.md │ │ │ │ ├── database-tuning@5nd9YdT871IZF2Ry35bdh.md │ │ │ │ ├── design-patterns@sXDr-m69q3b7HTEwAx4Oe.md │ │ │ │ ├── docker@2W-s3ugsrRpkFj0WQFDKe.md │ │ │ │ ├── external-api-integrations@TY_lQuXU5RkvnYxi-JsT6.md │ │ │ │ ├── file-structure@BYoMY5a7j-X5tAUB9N3-y.md │ │ │ │ ├── file-structure@KmGbX5xFuap5EUUjQiJtK.md │ │ │ │ ├── filters@k7JT0NaGrBd9OS3VhOsEM.md │ │ │ │ ├── firewall--malware-scanning@bDzltzHlI7p-0UqJg2N68.md │ │ │ │ ├── frontend-fundamentals@8ZMCYeqiy5fzoIWUk1XK5.md │ │ │ │ ├── full-site-editing-fse@r3hcgBKcIIuTuqqVIvpC9.md │ │ │ │ ├── functionsphp@28RlVJKJinaFBCjROCYu-.md │ │ │ │ ├── gutenberg@sNJTLbzuzNIoezVmZt89M.md │ │ │ │ ├── headless-wordpress@1FG5pAtfZjpQH6Mn-B1Nv.md │ │ │ │ ├── hooks@p2zuReNEeVSNKNqxDAVAt.md │ │ │ │ ├── how-the-web-works@r1_DTSDTbijMxtUEqpEm2.md │ │ │ │ ├── html@oWXYF_l401eQLlkCT3rn6.md │ │ │ │ ├── hybrid@YcwvhxKuYYL8xd3Sx-fY_.md │ │ │ │ ├── images@_Z0jfQot6JP9o2WocoPyx.md │ │ │ │ ├── installation--setup@0X6ry0jNhMwd9ksFSlFYx.md │ │ │ │ ├── introduction@moyU0BmFtCW6IVq_wKKGo.md │ │ │ │ ├── javascript@soF98LgnxSW3o5y9PEY0t.md │ │ │ │ ├── licensing--updates@oT5yJrNY2Q5IjqpFiTUW5.md │ │ │ │ ├── localization@dyZC4MVm-TqclSnTVznPo.md │ │ │ │ ├── localwp@dDmT2tDd7_3SktXDqGMa1.md │ │ │ │ ├── log-files@N_M4ICk29TBAmDX-xokG4.md │ │ │ │ ├── managed@Y7a4TRYbgUOO2F_gO877f.md │ │ │ │ ├── menus@_pPBxAMteOviyqkrCi2TM.md │ │ │ │ ├── metabox@uozpsemLlAJWS-uQkdy6X.md │ │ │ │ ├── migrations@CLqqdBm5yQ85UabxPvlPw.md │ │ │ │ ├── multisite@yfkZv_REsq-ttyeiW9c8y.md │ │ │ │ ├── oop-in-php@Pg83mKnN_q2OPWZoSUeIw.md │ │ │ │ ├── options-api@bvmPbWarEJjJWYbIeuo50.md │ │ │ │ ├── overrides@xAVlAoI_aSSfDxyW5fUkC.md │ │ │ │ ├── page-editors@WvQNMj6wTKVEDq9ro3NWp.md │ │ │ │ ├── performance-monitoring@sWgjddp7yGITFu_sYIVA7.md │ │ │ │ ├── php@fX71CXA26cUxY5WX_zABi.md │ │ │ │ ├── phpunit@lW3g0UO-UeyjddzF0lpup.md │ │ │ │ ├── plugin-basics@CrD4HH8mht1KZ0_m1MUsm.md │ │ │ │ ├── plugins@9vUEteBwtAyEFZsVXzKTl.md │ │ │ │ ├── query-editor@e5DY4WPJmaKzuj1KncBuY.md │ │ │ │ ├── query-monitor@e5DY4WPJmaKzuj1KncBuY.md │ │ │ │ ├── rest-api@VVgrD8RFghqwZ9ISWKmus.md │ │ │ │ ├── sage@eshQkhtAGQZYR-4YRQoFC.md │ │ │ │ ├── security--hardening@E559_d1l7iIMDb6QobOsh.md │ │ │ │ ├── security-best-practices@9jEQivDC8PpTGTJXMkD6t.md │ │ │ │ ├── settings-api@1dOm-BAhGXVxhRu-xin25.md │ │ │ │ ├── settings-page@PlWlAn7qFY5qxYXjQkFrw.md │ │ │ │ ├── shared@r-1Dz77W-afY3PARBR5LI.md │ │ │ │ ├── shortcodes@-YkWyPuFOn8n9l9UjJje9.md │ │ │ │ ├── sql@F-9uI39S9oYVGA8hi7aZI.md │ │ │ │ ├── style--script-enqueueing@5BNtWkac37Bydp6pFzHuP.md │ │ │ │ ├── stylecss@1BtXLjHOINLx9SJ1Y9gyd.md │ │ │ │ ├── styles@rl-8l8nhjNLtVglNM_Aaw.md │ │ │ │ ├── sytles@rl-8l8nhjNLtVglNM_Aaw.md │ │ │ │ ├── taxonomies@x4mnKW7I-du18ybY3Pb0r.md │ │ │ │ ├── template-files@47mdVZFZl1CF-_mgG3qHF.md │ │ │ │ ├── template-hierarchy@dPgcKkbULFFdx3po8Ijgf.md │ │ │ │ ├── template-parts@SyKVTUomX-UB3zUnCfrdA.md │ │ │ │ ├── template-tags@Gr68jNPdHq19bLDpx17aU.md │ │ │ │ ├── the-loop@d8QcGVn2NoHxJlDxH_n_R.md │ │ │ │ ├── theme-structure@HGczCcVcLru6ac76YdcZW.md │ │ │ │ ├── themes@z7gh1lLCcgpwjK9Q9hJB0.md │ │ │ │ ├── third-party-page-builders@OAb9tYljyN-Xo1RRx4TED.md │ │ │ │ ├── third-party@bM7grwJzuauC3ap7MNwuN.md │ │ │ │ ├── transients-api@WXTnOWylTg4aLn8r1mdwS.md │ │ │ │ ├── universal@wlFxhJTD3VZBhRTWKHaT6.md │ │ │ │ ├── update-strategies@AGQ9uXMYuYQ5d6w56gJBP.md │ │ │ │ ├── user--login-security@1737UjumNSgI4woESMn49.md │ │ │ │ ├── user-roles@KR9cp-nDEGTab4vmz0XBZ.md │ │ │ │ ├── virtual-patching@GkaZLnXVhHqn2sQfChor7.md │ │ │ │ ├── vps@7p44mAXvgrxoeJU1h0sP1.md │ │ │ │ ├── vulnerability-monitoring@pdoRrBaVwVTGCaJH4kY60.md │ │ │ │ ├── vvv@4z0UM3vkE2m01G5vfH2rv.md │ │ │ │ ├── what-is-a-cms@zc99eitvwwv7EmMRjhOSE.md │ │ │ │ ├── what-is-http@LmEWD_XxAfoGvFqvmcT7Q.md │ │ │ │ ├── widgets@DzXBl8O1uwq_DgyD88qRq.md │ │ │ │ ├── wordpress-credit-program@0FtAQxN7lVZcTOVjbffvW.md │ │ │ │ ├── wordpress-rest-api@gpO6iYnsepFTjbYzUEET0.md │ │ │ │ ├── wordpresscom--wordpressorg@k9-YjpBsN8ID0haGR6ucq.md │ │ │ │ ├── workflows--automation@5IJERQdGXAGLi7GDDBBUP.md │ │ │ │ ├── working-with-databases@GzR7xWWm3m1laoQrQmbDZ.md │ │ │ │ ├── wp-cli@CNWRqhsaWK6xrIDvN564O.md │ │ │ │ ├── wp_debug@InInDsldD3V7MHYCV7c89.md │ │ │ │ └── xampp@Giqhdf6bmqsgEkCZ-aa65.md │ │ │ └── wordpress.md │ │ └── videos/ │ │ ├── acid-explained.md │ │ ├── all-about-http-caching.md │ │ ├── array-structure.md │ │ ├── arrays-and-objects-in-javascript.md │ │ ├── async-javascript.md │ │ ├── basic-authentication.md │ │ ├── basics-of-authentication.md │ │ ├── big-o-notation.md │ │ ├── content-delivery-networks.md │ │ ├── dns-explained.md │ │ ├── dns-records.md │ │ ├── floating-point-arithmetic.md │ │ ├── freeze-and-seal-objects-in-javascript.md │ │ ├── frontend-explaination.md │ │ ├── graph-data-structure.md │ │ ├── hash-table-data-structure.md │ │ ├── heap-data-structure.md │ │ ├── how-to-use-css-variables.md │ │ ├── how-to-use-github-actions.md │ │ ├── javascript-fetch-api.md │ │ ├── linked-list-data-structure.md │ │ ├── load-balancers-101.md │ │ ├── osi-model.md │ │ ├── practical-intro-to-react.md │ │ ├── promises-in-javascript.md │ │ ├── queue-data-structure.md │ │ ├── random-number-generators.md │ │ ├── scaling-the-unscalable.md │ │ ├── session-based-authentication.md │ │ ├── ssh-ssl-tls.md │ │ ├── stack-data-structure.md │ │ ├── system-design-101.md │ │ ├── tcp-ip-model.md │ │ ├── transport-protocols-tcp-vs-udp.md │ │ ├── tree-data-structure.md │ │ ├── what-are-data-structures.md │ │ ├── what-is-cap-theorem.md │ │ ├── what-is-dependency-injection.md │ │ ├── what-is-dom-shadow-dom-virtual-dom.md │ │ ├── what-is-eventual-consistency.md │ │ └── yaml-in-depth.md │ ├── directives/ │ │ └── client-authenticated.mjs │ ├── env.d.ts │ ├── helper/ │ │ ├── download-image.ts │ │ ├── generate-ai-course.ts │ │ ├── generate-ai-guide.ts │ │ ├── grouping.ts │ │ └── shuffle.ts │ ├── hooks/ │ │ ├── use-ai-chat-scroll.tsx │ │ ├── use-auth.ts │ │ ├── use-chat.ts │ │ ├── use-client-mount.ts │ │ ├── use-completion.ts │ │ ├── use-copy-text.ts │ │ ├── use-custom-roadmap.ts │ │ ├── use-debounce.ts │ │ ├── use-is-mounted.ts │ │ ├── use-is-thinking.ts │ │ ├── use-keydown.ts │ │ ├── use-load-topic.ts │ │ ├── use-outside-click.ts │ │ ├── use-pagination.ts │ │ ├── use-params.ts │ │ ├── use-personalized-roadmap.ts │ │ ├── use-roadmap-ai-chat.tsx │ │ ├── use-scroll-position.ts │ │ ├── use-sticky-stuck.tsx │ │ ├── use-team-id.ts │ │ ├── use-toast.ts │ │ ├── use-toggle-topic.ts │ │ └── use-verify-answer.ts │ ├── layouts/ │ │ ├── AccountLayout.astro │ │ ├── BaseLayout.astro │ │ ├── MarkdownLayout.astro │ │ └── SkeletonLayout.astro │ ├── lib/ │ │ ├── ai-questions.ts │ │ ├── ai.ts │ │ ├── auth.ts │ │ ├── author.ts │ │ ├── best-practice-topic.ts │ │ ├── best-practice.ts │ │ ├── browser.ts │ │ ├── chat.ts │ │ ├── classname.ts │ │ ├── config.ts │ │ ├── date.ts │ │ ├── discord.ts │ │ ├── dom.ts │ │ ├── file.ts │ │ ├── github.ts │ │ ├── guide-renderer.tsx │ │ ├── guide.ts │ │ ├── html.ts │ │ ├── http.ts │ │ ├── image.ts │ │ ├── is-mobile.ts │ │ ├── jsonld-schema.ts │ │ ├── jwt.ts │ │ ├── markdown-renderer.tsx │ │ ├── markdown.ts │ │ ├── message-part.ts │ │ ├── number.ts │ │ ├── open-graph.ts │ │ ├── path.ts │ │ ├── popup.ts │ │ ├── promise.ts │ │ ├── query-http.ts │ │ ├── question-group.ts │ │ ├── render-chat-message.tsx │ │ ├── resource-progress.ts │ │ ├── road-card.ts │ │ ├── roadmap.ts │ │ ├── slugger.ts │ │ ├── stream.ts │ │ └── video.ts │ ├── pages/ │ │ ├── 404.astro │ │ ├── [roadmapId]/ │ │ │ ├── [...topicId].astro │ │ │ ├── courses.astro │ │ │ ├── index.astro │ │ │ ├── projects.astro │ │ │ └── svg.astro │ │ ├── [roadmapId].json.ts │ │ ├── about.astro │ │ ├── advertise.astro │ │ ├── ai-roadmaps/ │ │ │ ├── [aiRoadmapSlug].astro │ │ │ ├── explore.astro │ │ │ └── index.astro │ │ ├── befriend.astro │ │ ├── best-practices/ │ │ │ ├── [bestPracticeId]/ │ │ │ │ ├── [...topicId].astro │ │ │ │ └── index.astro │ │ │ ├── [bestPracticeId].json.ts │ │ │ └── index.astro │ │ ├── card/ │ │ │ └── [version]/ │ │ │ └── [userId].ts │ │ ├── changelog.astro │ │ ├── community.astro │ │ ├── courses/ │ │ │ ├── master-sql.astro │ │ │ └── sql.astro │ │ ├── dashboard.astro │ │ ├── discord.astro │ │ ├── forgot-password.astro │ │ ├── get-started.astro │ │ ├── github.astro │ │ ├── index.astro │ │ ├── leaderboard.astro │ │ ├── login.astro │ │ ├── og/ │ │ │ ├── best-practice/ │ │ │ │ └── [slug].ts │ │ │ ├── guide/ │ │ │ │ └── [slug].ts │ │ │ ├── roadmap/ │ │ │ │ └── [slug].ts │ │ │ └── user/ │ │ │ └── [username].ts │ │ ├── pages.json.ts │ │ ├── premium.astro │ │ ├── privacy.md │ │ ├── projects/ │ │ │ ├── [projectId]/ │ │ │ │ ├── index.astro │ │ │ │ └── solutions.astro │ │ │ └── index.astro │ │ ├── r/ │ │ │ ├── [customRoadmapSlug].astro │ │ │ ├── embed.astro │ │ │ └── index.astro │ │ ├── reset-password.astro │ │ ├── respond-invite.astro │ │ ├── roadmaps.astro │ │ ├── signup.astro │ │ ├── teams.astro │ │ ├── terms-of-sale.md │ │ ├── terms.md │ │ ├── thank-you.astro │ │ ├── twitter.astro │ │ ├── u/ │ │ │ └── [username].astro │ │ ├── v1-health.ts │ │ ├── v1-stats.json.ts │ │ ├── verification-pending.astro │ │ ├── verify-account.astro │ │ ├── verify-email.astro │ │ ├── videos/ │ │ │ ├── [videoId].astro │ │ │ └── index.astro │ │ ├── x.astro │ │ └── youtube.astro │ ├── queries/ │ │ ├── ai-course.ts │ │ ├── ai-guide.ts │ │ ├── ai-quiz.ts │ │ ├── ai-roadmap.ts │ │ ├── billing.ts │ │ ├── changelog.ts │ │ ├── chat-history.ts │ │ ├── course-progress.ts │ │ ├── official-guide.ts │ │ ├── official-project.ts │ │ ├── official-roadmap-topic.ts │ │ ├── official-roadmap.ts │ │ ├── project.ts │ │ ├── resource-progress.ts │ │ ├── roadmap-questions.ts │ │ ├── roadmap-tree.ts │ │ ├── roadmap.ts │ │ ├── user-ai-session.ts │ │ ├── user-persona.ts │ │ └── user-resume.ts │ ├── stores/ │ │ ├── page.ts │ │ ├── query-client.ts │ │ ├── roadmap.ts │ │ ├── streak.ts │ │ ├── subscription.ts │ │ ├── team.ts │ │ └── toast.ts │ └── styles/ │ └── global.css ├── tailwind.config.cjs ├── tests/ │ ├── guides.spec.ts │ ├── index.spec.ts │ ├── roadmap.spec.ts │ └── videos.spec.ts └── tsconfig.json ================================================ 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 [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 --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 [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 --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: 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 (":" 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 "" --state merged LEARN MORE Use `gh --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 [ | | ] [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 --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 [ | | ] [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 --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 [ | | ] [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 --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 [ | | ] [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 --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 { | | } [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 --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 [ | | ] [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 --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<> $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 . 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 -

Please don't use the project for self-promotion!
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! -

Adding everything available out there is not the goal!
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.

-

Do not add things you have not evaluated personally!
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?

-

Create a Single PR for Content Additions

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. -

Write meaningful commit messages
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.

-

Look at the existing issues/pull requests before opening new ones

## Good vs. Not So Good Contributions Good - 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). Not So Good - 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 ================================================ 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 ================================================

roadmap.sh

Community driven roadmaps, articles and resources for developers

roadmaps best practices videos roadmaps


![](https://i.imgur.com/waxVImv.png) 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) ![](https://i.imgur.com/waxVImv.png) 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) ![](https://i.imgur.com/waxVImv.png) ## Share with the community Please consider sharing a post about [roadmap.sh](https://roadmap.sh) and the value it provides. It really does help! [![GitHub Repo stars](https://img.shields.io/badge/share%20on-reddit-red?logo=reddit)](https://reddit.com/submit?url=https://roadmap.sh&title=Interactive%20roadmaps,%20guides%20and%20other%20educational%20content%20for%20Developers) [![GitHub Repo stars](https://img.shields.io/badge/share%20on-hacker%20news-orange?logo=ycombinator)](https://news.ycombinator.com/submitlink?u=https://roadmap.sh) [![GitHub Repo stars](https://img.shields.io/badge/share%20on-twitter-03A9F4?logo=twitter)](https://twitter.com/share?url=https://roadmap.sh&text=Interactive%20roadmaps,%20guides%20and%20other%20educational%20content%20for%20Developers) [![GitHub Repo stars](https://img.shields.io/badge/share%20on-facebook-1976D2?logo=facebook)](https://www.facebook.com/sharer/sharer.php?u=https://roadmap.sh) [![GitHub Repo stars](https://img.shields.io/badge/share%20on-linkedin-3949AB?logo=linkedin)](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 ❤ ## 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='); 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 { 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 { 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 { 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(); const nodeIdToExpectedSlug = new Map(); 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(); 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(); 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 { 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 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(); 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 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 // 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+? { const imageName = image.match(/\[(.+?)\]/)[1]; const imageExtension = image.match(/ 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`
${title}
${description}
7th most starred GitHub project
Created and maintained by community
Up-to-date roadmap
`; } function getRoadmapImageTemplate({ title, description, image, height, width }) { return html`
${title?.replace('&', `{"&"}`)}
${description}
`; } function getGuideTemplate({ title, description, authorName, authorAvatar }) { return html`
${authorName}
${title}
${description}
`; } 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 = new Map(); export async function fetchRoadmapJson( roadmapId: string, ): Promise { 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(); 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(); 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 { 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 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} */ 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: 'AI Agents > Agent Memory > Short Term Memory', }, { id: 'Ue633fz6Xu2wa2-KOAtdP', text: 'AI Agents > Agent Memory > What is Agent Memory? > Long Term Memory', }, { id: 'EfCCNqLMJpWKKtamUa5gK', text: 'AI Agents > Agent Memory > What is Agent Memory? > Episodic vs Semantic Memory', }, { id: 'wkS4yOJ3JdZQE_yBID8K7', text: 'AI Agents > Agent Memory > What is Agent Memory? > Maintaining Memory > RAG and Vector Databases', }, { id: 'QJqXHV8VHPTnfYfmKPzW7', text: 'AI Agents > Agent Memory > What is Agent Memory? > Maintaining Memory > User Profile Storage', }, { id: 'jTDC19BTWCqxqMizrIJHr', text: 'AI Agents > Agent Memory > Maintaining Memory > Summarization / Compression', }, { id: 'm-97m7SI0XpBnhEE8-_1S', text: 'AI Agents > Agent Memory > Maintaining Memory > Forgetting / Aging Strategies', }, { id: 'cW8O4vLLKEG-Q0dE8E5Zp', text: 'AI Agents > Agent Architectures > Common Architectures > RAG Agent', }, { id: '53xDks6JQ33fHMa3XcuCd', text: 'AI Agents > Agent Architectures > Common Architectures > ReAct (Reason + Act)', }, { id: 'qwdh5pkBbrF8LKPxbZp4F', text: 'AI Agents > Agent Architectures > Common Architectures > Chain of Thought (CoT)', }, { id: '6YLCMWzystao6byCYCTPO', text: 'AI Agents > Agent Architectures > Common Architectures > Planner Executor', }, { id: 'Ep8RoZSy_Iq_zWXlGQLZo', text: 'AI Agents > Agent Architectures > Common Architectures > DAG Agents', }, { id: 'Nmy1PoB32DcWZnPM8l8jT', text: 'AI Agents > Agent Architectures > Common Architectures > Tree-of-Thought', }, { id: 'hj1adjkG9nalXKZ-Youn0', text: 'AI Agents > Agent Architectures > Common Architectures > Tree-of-Thought', }, { id: 'US6T5dXM8IY9V2qZnTOFW', text: 'AI Agents > Building Agents > Manual (from scratch)', }, { id: 'aafZxtjxiwzJH1lwHBODi', text: 'AI Agents > Building Agents > LLM Native "Function Calling"', }, { id: 'AQtxTTxmBpfl8BMgJbGzc', text: 'AI Agents > Building Agents > LLM Native "Function Calling" > OpenAI Functions Calling', }, { id: '37GBFVZ2J2d5r8bd1ViHq', text: 'AI Agents > Building Agents > LLM Native "Function Calling" > OpenAI Assistant API', }, { id: '_iIsBJTVS6OBf_dsdmbVO', text: 'AI Agents > Building Agents > LLM Native "Function Calling" > Gemini Function Calling', }, { id: '1EZFbDHA5J5_5BPMLMxXb', text: 'AI Agents > Building Agents > LLM Native "Function Calling" > Anthropic Tool Use', }, { id: 'Ka6VpCEnqABvwiF9vba7t', text: 'AI Agents > Building Agents > Building Using Frameworks > Langchain', }, { id: 'iEHF-Jm3ck-Iu85EbCoDi', text: 'AI Agents > Building Agents > Building Using Frameworks > LlamaIndex', }, { id: 'XS-FsvtrXGZ8DPrwOsnlI', text: 'AI Agents > Building Agents > Building Using Frameworks > Haystack', }, { id: '7YtnQ9-KIvGPSpDzEDexl', text: 'AI Agents > Building Agents > Building Using Frameworks > AutoGen', }, { id: 'uFPJqgU4qGvZyxTv-osZA', text: 'AI Agents > Building Agents > Building Using Frameworks > CrewAI', }, { id: 'eWxQiBrxIUG2JNcrdfIHS', text: 'AI Agents > Building Agents > Building Using Frameworks > Smol Depot', }, { id: 'v8qLnyFRnEumodBYxQSXQ', text: 'AI Agents > Building Agents > Evaluation and Testing > Metrics to Track', }, { id: 'qo_O4YAe4-MTP_ZJoXJHR', text: 'AI Agents > Evaluation and Testing > Unit Testing for Individual Tools', }, { id: 'P9-SiIda3TSjHsfkI5OUV', text: 'AI Agents > Evaluation and Testing > Integration Testing for Flows', }, { id: 'rHxdxN97ZcU7MPl8L1jzN', text: 'AI Agents > Evaluation and Testing > Human in the Loop Evaluation', }, { id: 'xp7TCTRE9HP60_rGzTUF6', text: 'AI Agents > Evaluation and Testing > Frameworks > LangSmith', }, { id: '0924QUH1wV7Mp-Xu0FAhF', text: 'AI Agents > Evaluation and Testing > Frameworks > DeepEval', }, { id: 'YzEDtGEaMaMWVt0W03HRt', text: 'AI Agents > Evaluation and Testing > Frameworks > Ragas', }, { id: 'zs6LM8WEnb0ERWpiaQCgc', text: 'AI Agents > Debugging and Monitoring > Structured logging & tracing', }, { id: 'zs6LM8WEnb0ERWpiaQCgc', text: 'AI Agents > Debugging and Monitoring > Structured logging & tracing', }, { id: 'SS8mGqf9wfrNqenIWvN8Z', text: 'AI Agents > Observability Tools > LangSmith', }, { id: 'MLxP5N0Vrmwh-kyvNeGXn', text: 'AI Agents > Observability Tools > Helicone', }, { id: 'UoIheaJlShiceafrWALEH', text: 'AI Agents > Observability Tools > LangFuse', }, { id: '7UqPXUzqKYXklnB3x-tsv', text: 'AI Agents > Observability Tools > openllmetry', }, { id: 'SU2RuicMUo8tiAsQtDI1k', text: 'AI Agents > Security & Ethics > Prompt Injection / Jailbreaks', }, { id: 'UVzLGXG6K7HQVHmw8ZAv2', text: 'AI Agents > Security & Ethics > Tool sandboxing / Permissioning', }, { id: 'rdlYBJNNyZUshzsJawME4', text: 'AI Agents > Security & Ethics > Data Privacy + PII Redaction', }, { id: 'EyLo2j8IQsIK91SKaXkmK', text: 'AI Agents > Security & Ethics > Bias & Toxicity Guardrails', }, { id: '63nsfJFO1BwjLX_ZVaPFC', text: 'AI Agents > Security & Ethics > Safety + Red Team Testing', }, ]; const OPENAI_API_KEY = process.env.OPENAI_API_KEY; if (!OPENAI_API_KEY) { console.error('OPENAI_API_KEY is not set'); process.exit(1); } const openai = new OpenAI({ apiKey: OPENAI_API_KEY, }); const prompt = ` You are a helpful assistant that can help me generate content for a roadmap tree. You will be given a roadmap topic in the form of "Parent > Child > Leaf". You need to generate a single paragraph explaining the topic. Also, I hate it when you say "In the realm of..." or "In the context of..." or "..in the context of..." or "when we talk about..." or something similar. IMPORTANT: Use simple and clear English. Avoid complex words and jargon when possible. Write in a way that is easy to understand. Use short sentences and common words. `; /** * Generates content for a given node using OpenAI's GPT model * @param {Node} node - The node to generate content for * @returns {Promise} The generated content */ const generateContent = async (node) => { try { const content = await openai.chat.completions.create({ model: 'o3', messages: [ { role: 'system', content: prompt }, { role: 'user', content: `Node: ${node.text}`, }, ], }); return content.choices[0].message.content; } catch (error) { console.error( `Error generating content for node ${node.id}:`, error.message, ); throw error; } }; const roadmapContentDir = path.join( __dirname, `../src/data/roadmaps/${roadmapId}/content`, ); const contentFiles = fs.readdirSync(roadmapContentDir); /** * Processes a single node by generating content and writing to file * @param {Node} node - The node to process * @param {string} roadmapContentDir - Directory path for content files * @param {string[]} contentFiles - List of existing content files * @returns {Promise} */ const processNode = async (node, roadmapContentDir, contentFiles) => { try { const nodeId = node.id; const relevantFileName = contentFiles.find((file) => file.endsWith(`${nodeId}.md`), ); if (!relevantFileName) { console.warn(`No matching file found for node ${nodeId}`); return; } const fileTitle = node.text .replace(/\s+>\s+/g, '>') .split('>') .pop(); const content = await generateContent(node); const filePath = path.join(roadmapContentDir, relevantFileName); await fs.promises.writeFile(filePath, `# ${fileTitle}\n\n${content}`); console.log(`Successfully processed node ${nodeId}`); } catch (error) { console.error(`Failed to process node ${node.id}:`, error.message); } }; /** * Main function to run the content generation * @returns {Promise} */ const main = async () => { try { // Process nodes in parallel with concurrency limit const BATCH_SIZE = 20; // Adjust based on API rate limits for (let i = 0; i < nodes.length; i += BATCH_SIZE) { const batch = nodes.slice(i, i + BATCH_SIZE); const promises = batch.map((node) => processNode(node, roadmapContentDir, contentFiles), ); await Promise.allSettled(promises); // Add a small delay between batches to avoid rate limiting if (i + BATCH_SIZE < nodes.length) { await new Promise((resolve) => setTimeout(resolve, 1000)); } } console.log('Content generation completed'); } catch (error) { console.error('Fatal error in main process:', error); process.exit(1); } }; // Add error handling for uncaught exceptions process.on('uncaughtException', (error) => { console.error('Uncaught Exception:', error); process.exit(1); }); process.on('unhandledRejection', (error) => { console.error('Unhandled Rejection:', error); process.exit(1); }); main(); ================================================ FILE: scripts/sync-content-to-repo.ts ================================================ import fs from 'node:fs/promises'; import path from 'node:path'; import { fileURLToPath } from 'node:url'; import { slugify } from '../src/lib/slugger'; import type { OfficialRoadmapDocument } from '../src/queries/official-roadmap'; import type { OfficialRoadmapTopicContentDocument } from '../src/queries/official-roadmap-topic'; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); const args = process.argv.slice(2); const roadmapSlug = args?.[0]?.replace('--roadmap-slug=', ''); const secret = args?.[1]?.replace('--secret=', ''); if (!secret) { throw new Error('Secret is required'); } if (!roadmapSlug || roadmapSlug === '__default__') { throw new Error('Roadmap slug is required'); } console.log(`🚀 Starting ${roadmapSlug}`); export async function roadmapTopics( roadmapId: string, secret: string, ): Promise { const path = `https://roadmap.sh/api/v1-list-official-roadmap-topics/${roadmapId}?secret=${secret}`; const response = await fetch(path); if (!response.ok) { throw new Error(`Failed to fetch roadmap topics: ${response.statusText}`); } const data = await response.json(); if (data.error) { throw new Error(`Failed to fetch roadmap topics: ${data.error}`); } return data; } export async function fetchRoadmapJson( roadmapId: string, ): Promise { 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', roadmapSlug, ); const allTopics = await roadmapTopics(roadmapSlug, secret); const roadmap = await fetchRoadmapJson(roadmapSlug); const { nodes } = roadmap; for (const topic of allTopics) { const { nodeId } = topic; const node = nodes.find((node) => node.id === nodeId); if (!node) { console.error(`Node not found: ${nodeId}`); continue; } const label = node?.data?.label as string; if (!label) { console.error(`Label not found: ${nodeId}`); continue; } const topicSlug = `${slugify(label)}@${nodeId}.md`; const topicPath = path.join(ROADMAP_CONTENT_DIR, 'content', topicSlug); const topicDir = path.dirname(topicPath); const topicDirExists = await fs .stat(topicDir) .then(() => true) .catch(() => false); if (!topicDirExists) { await fs.mkdir(topicDir, { recursive: true }); } const topicContent = prepareTopicContent(topic); await fs.writeFile(topicPath, topicContent); console.log(`✅ Synced ${topicSlug}`); } function prepareTopicContent(topic: OfficialRoadmapTopicContentDocument) { const { description, resources = [] } = topic; let content = description; if (resources.length > 0) { content += `\n\nVisit the following resources to learn more:\n\n${resources.map((resource) => `- [@${resource.type}@${resource.title}](${resource.url})`).join('\n')}`; } return content; } ================================================ FILE: scripts/sync-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 { 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 allFiles = args .find((arg) => arg.startsWith('--files=')) ?.replace('--files=', ''); const secret = args .find((arg) => arg.startsWith('--secret=')) ?.replace('--secret=', ''); if (!secret) { throw new Error('Secret is required'); } let roadmapJsonCache: Map = new Map(); export async function fetchRoadmapJson( roadmapId: string, ): Promise { if (roadmapJsonCache.has(roadmapId)) { return roadmapJsonCache.get(roadmapId)!; } const response = await fetch( `https://roadmap.sh/api/v1-official-roadmap/${roadmapId}`, { headers: { 'User-Agent': 'Mozilla/5.0 (compatible; roadmap-sync/1.0)', }, }, ); 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', 'User-Agent': 'Mozilla/5.0 (compatible; roadmap-sync/1.0)', }, body: JSON.stringify({ topics, secret, }), }, ); const responseText = await response.text(); if (!response.ok) { throw new Error( `Failed to sync content to database: ${response.status} ${response.statusText}\n${responseText}`, ); } try { return JSON.parse(responseText); } catch { throw new Error( `Failed to parse response as JSON: ${responseText.substring(0, 500)}`, ); } } const files = allFiles ?.split(',') .map((file) => file.trim()) .filter(Boolean) || []; if (files.length === 0) { console.log('No files to sync'); process.exit(0); } console.log(`🚀 Starting ${files.length} files`); const ROADMAP_CONTENT_DIR = path.join(__dirname, '../src/data/roadmaps'); try { const topics: SyncToDatabaseTopicContent[] = []; for (const file of files) { const isContentFile = file.endsWith('.md') && file.includes('content/'); if (!isContentFile) { console.log(`🚨 Skipping ${file} because it is not a content file`); continue; } const pathParts = file.replace('src/data/roadmaps/', '').split('/'); const roadmapSlug = pathParts?.[0]; if (!roadmapSlug) { console.error(`🚨 Roadmap slug is required: ${file}`); continue; } const nodeSlug = pathParts?.[2]?.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 roadmap = await fetchRoadmapJson(roadmapSlug); 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, roadmapSlug, '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, ''); return { title: linkText, url: linkHref, type: linkType as AllowedOfficialRoadmapTopicResourceType, }; }) .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, nodeId, description: updatedDescription, resources: listLinks, }); } console.log(`📤 Syncing ${topics.length} topics to database...`); await syncContentToDatabase(topics); console.log(`✅ Successfully synced ${topics.length} topics`); } catch (error) { console.error('❌ Sync failed with error:'); console.error(error); if (error instanceof Error) { console.error('\nError message:', error.message); console.error('\nStack trace:', error.stack); } process.exit(1); } ================================================ FILE: scripts/sync-roadmap-to-database.ts ================================================ import { execSync } from 'node:child_process'; import fs from 'node:fs'; import path from 'node:path'; import { fileURLToPath } from 'node:url'; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); const args = process.argv.slice(2); const roadmapSlug = args .find((arg) => arg.startsWith('--roadmap=')) ?.replace('--roadmap=', ''); const secret = args .find((arg) => arg.startsWith('--secret=')) ?.replace('--secret=', ''); if (!roadmapSlug) { console.error('❌ Roadmap slug is required. Use --roadmap='); console.error(' Example: npm run sync:roadmap -- --roadmap=frontend --secret='); process.exit(1); } if (!secret) { console.error('❌ Secret is required. Use --secret='); console.error(' Example: npm run sync:roadmap -- --roadmap=frontend --secret='); process.exit(1); } const roadmapDir = path.join(__dirname, '../src/data/roadmaps', roadmapSlug); if (!fs.existsSync(roadmapDir)) { console.error(`❌ Roadmap directory not found: ${roadmapDir}`); process.exit(1); } console.log(`🔍 Finding all content files in: ${roadmapDir}`); function getAllFiles(dir: string): string[] { const files: string[] = []; const entries = fs.readdirSync(dir, { withFileTypes: true }); for (const entry of entries) { const fullPath = path.join(dir, entry.name); if (entry.isDirectory()) { files.push(...getAllFiles(fullPath)); } else { files.push(fullPath); } } return files; } const allFiles = getAllFiles(roadmapDir); const relativeFiles = allFiles.map((file) => file.replace(path.join(__dirname, '../'), ''), ); console.log(`📁 Found ${relativeFiles.length} files`); if (relativeFiles.length === 0) { console.log('⚠️ No files found to sync'); process.exit(0); } const filesArg = relativeFiles.join(','); console.log(`🚀 Syncing roadmap "${roadmapSlug}" to database...`); try { execSync( `npx tsx ./scripts/sync-repo-to-database.ts --files="${filesArg}" --secret=${secret}`, { cwd: path.join(__dirname, '..'), stdio: 'inherit', }, ); console.log(`✅ Successfully synced roadmap "${roadmapSlug}" to database`); } catch (error) { console.error(`❌ Failed to sync roadmap "${roadmapSlug}" to database`); process.exit(1); } ================================================ FILE: scripts/update-sponsors.cjs ================================================ const path = require('path'); const fs = require('fs'); const yaml = require('js-yaml'); const apiKey = process.env.SPONSOR_SHEET_API_KEY; const sheetId = process.env.SPONSOR_SHEET_ID; if (!apiKey || !sheetId) { console.error('Missing API key or sheet ID'); process.exit(1); } const sheetRange = 'A3:I1001'; const sheetUrl = `https://sheets.googleapis.com/v4/spreadsheets/${sheetId}/values/${sheetRange}?key=${apiKey}`; function removeAllSponsors(baseContentDir) { console.log('------------------------'); console.log('Removing sponsors from: ', baseContentDir); console.log('------------------------'); const dataDirPath = path.join(__dirname, '../src/data'); const contentDirPath = path.join(dataDirPath, baseContentDir); const contentDir = fs.readdirSync(contentDirPath); contentDir.forEach((content) => { console.log('Removing sponsors from: ', content); const pageFilePath = path.join(contentDirPath, content, `${content}.md`); const pageFileContent = fs.readFileSync(pageFilePath, 'utf8'); const frontMatterRegex = /---\n([\s\S]*?)\n---/; const existingFrontmatter = pageFileContent.match(frontMatterRegex)[1]; const contentWithoutFrontmatter = pageFileContent .replace(frontMatterRegex, ``) .trim(); let frontmatterObj = yaml.load(existingFrontmatter); delete frontmatterObj.sponsors; const newFrontmatter = yaml.dump(frontmatterObj, { lineWidth: 10000, forceQuotes: true, quotingType: "'", }); const newContent = `---\n${newFrontmatter}---\n${contentWithoutFrontmatter}`; fs.writeFileSync(pageFilePath, newContent, 'utf8'); }); } function addPageSponsor({ pageUrl, company, redirectUrl, imageUrl, adTitle, adDescription, }) { const urlPart = pageUrl .replace('https://roadmap.sh/', '') .replace(/\?.+?$/, ''); const parentDir = urlPart.startsWith('best-practices/') ? 'best-practices' : 'roadmaps'; const pageId = urlPart.replace(`${parentDir}/`, ''); const pageFilePath = path.join( __dirname, `../src/data/${parentDir}`, `${pageId}/${pageId}.md` ); if (!fs.existsSync(pageFilePath)) { console.error(`Page file not found: ${pageFilePath}`); process.exit(1); } console.log(`Updating page: ${urlPart}`); const pageFileContent = fs.readFileSync(pageFilePath, 'utf8'); const frontMatterRegex = /---\n([\s\S]*?)\n---/; const existingFrontmatter = pageFileContent.match(frontMatterRegex)[1]; const contentWithoutFrontmatter = pageFileContent .replace(frontMatterRegex, ``) .trim(); let frontmatterObj = yaml.load(existingFrontmatter); const sponsors = frontmatterObj.sponsors || []; const frontmatterValues = Object.entries(frontmatterObj); const roadmapLabel = frontmatterObj.briefTitle; sponsors.push({ url: redirectUrl, title: adTitle, imageUrl, description: adDescription, page: roadmapLabel, company, }); // Insert sponsor data at 10 index i.e. after // roadmap dimensions in the frontmatter frontmatterValues.splice(10, 0, ['sponsors', sponsors]); frontmatterObj = Object.fromEntries(frontmatterValues); const newFrontmatter = yaml.dump(frontmatterObj, { lineWidth: 10000, forceQuotes: true, quotingType: "'", }); const newContent = `---\n${newFrontmatter}---\n\n${contentWithoutFrontmatter}`; fs.writeFileSync(pageFilePath, newContent, 'utf8'); } // Remove sponsors from all roadmaps removeAllSponsors('roadmaps'); removeAllSponsors('best-practices'); console.log('------------------------'); console.log('Adding sponsors'); console.log('------------------------'); fetch(sheetUrl) .then((res) => res.json()) .then((rawData) => { const rows = rawData.values; rows.map((row) => { // prettier-ignore const [ pageUrl, company, redirectUrl, imageUrl, adTitle, adDescription, startDate, endDate, isActive, ] = row; const isConfiguredActive = isActive?.toLowerCase() === 'yes'; const currentDate = new Date(); const isDateInRange = currentDate >= new Date(startDate) && currentDate <= new Date(endDate); if (!isConfiguredActive || !isDateInRange) { return; } addPageSponsor({ pageUrl, company, redirectUrl, imageUrl, adTitle, adDescription, startDate, endDate, isActive, }); }); }); ================================================ FILE: scripts/warm-urls.sh ================================================ #!/usr/bin/env bash # Usage: warm-urls.sh # Example: warm-urls.sh https://www.example.com/sitemap.xml # Check if sitemap url is provided if [ -z "$1" ]; then echo "Please provide sitemap URL" >&2 exit 1 fi # Get all URLs from sitemap urls=$(curl -s "$1" | grep -o "[^<]*" | sed 's#\(.*\)#\1#') failed_urls=() # Warm up URLs for url in $urls; do # Fetch the og:image URL from the meta tags og_image_url=$(curl -s "$url" | grep -o " /dev/null; then failed_urls+=("$url") fi # Warm up the og:image URL if [ -n "$og_image_url" ]; then echo "Warming up OG: $og_image_url" if ! curl -s -I "$og_image_url" > /dev/null; then failed_urls+=("$og_image_url") fi else echo "No og:image found for $url" fi done # Print failed URLs if [ ${#failed_urls[@]} -gt 0 ]; then echo "Failed to warm up the following URLs:" >&2 for failed_url in "${failed_urls[@]}"; do echo "$failed_url" >&2 done fi ================================================ FILE: sitemap.mjs ================================================ import path from 'node:path'; import fs from 'node:fs/promises'; async function getRoadmapIds() { return fs.readdir(path.join(process.cwd(), 'src/data/roadmaps')); } async function getBestPracticesIds() { return fs.readdir(path.join(process.cwd(), 'src/data/best-practices')); } export function shouldIndexPage(pageUrl) { return ![ 'https://roadmap.sh/404', 'https://roadmap.sh/terms', 'https://roadmap.sh/privacy', 'https://roadmap.sh/pdfs', 'https://roadmap.sh/g', ].includes(pageUrl); } export async function serializeSitemap(item) { const highPriorityPages = [ 'https://roadmap.sh', 'https://roadmap.sh/about', 'https://roadmap.sh/roadmaps', 'https://roadmap.sh/best-practices', 'https://roadmap.sh/guides', 'https://roadmap.sh/videos', ...(await getRoadmapIds()).flatMap((id) => [ `https://roadmap.sh/${id}`, `https://roadmap.sh/${id}/topics`, ]), ...(await getBestPracticesIds()).map( (id) => `https://roadmap.sh/best-practices/${id}` ), ]; // Roadmaps and other high priority pages for (let pageUrl of highPriorityPages) { if (item.url === pageUrl) { return { ...item, // @ts-ignore changefreq: 'monthly', priority: 1, }; } } // Guide and video pages if ( item.url.startsWith('https://roadmap.sh/guides') || item.url.startsWith('https://roadmap.sh/videos') ) { return { ...item, // @ts-ignore changefreq: 'monthly', priority: 0.9, }; } return undefined; } ================================================ FILE: src/api/ai-roadmap.ts ================================================ import { type APIContext } from 'astro'; import { api } from './api.ts'; export type GetAIRoadmapBySlugResponse = { id: string; term: string; title: string; data: string; isAuthenticatedUser: boolean; }; export function aiRoadmapApi(context: APIContext) { return { getAIRoadmapBySlug: async function (roadmapSlug: string) { return api(context).get( `${import.meta.env.PUBLIC_API_URL}/v1-get-ai-roadmap-by-slug/${roadmapSlug}`, ); }, }; } export interface AICourseDocument { _id: string; userId: string; title: string; slug?: string; keyword: string; difficulty: string; data: string; viewCount: number; createdAt: Date; updatedAt: Date; } ================================================ FILE: src/api/api.ts ================================================ import { TOKEN_COOKIE_NAME } from '../lib/jwt.ts'; import type { APIContext } from 'astro'; type HttpOptionsType = RequestInit | { headers: Record }; type AppResponse = Record; export type FetchError = { status: number; message: string; }; export type AppError = { status: number; message: string; errors?: { message: string; location: string }[]; }; export type ApiReturn = { response?: ResponseType; error?: ErrorType | FetchError; }; export function api(context: APIContext) { const token = context.cookies.get(TOKEN_COOKIE_NAME)?.value; async function apiCall( url: string, options?: HttpOptionsType, ): Promise> { try { const response = await fetch(url, { credentials: 'include', ...options, headers: new Headers({ 'Content-Type': 'application/json', Accept: 'application/json', ...(token ? { Authorization: `Bearer ${token}` } : {}), ...(options?.headers ?? {}), }), }); // @ts-ignore const doesAcceptHtml = options?.headers?.['Accept'] === 'text/html'; const data = doesAcceptHtml ? await response.text() : await response.json(); if (response.ok) { return { response: data as ResponseType, error: undefined, }; } // Logout user if token is invalid if (data.status === 401) { context.cookies.delete(TOKEN_COOKIE_NAME); context.redirect(context.request.url); return { response: undefined, error: data as ErrorType }; } if (data.status === 403) { return { response: undefined, error: data as ErrorType }; } return { response: undefined, error: data as ErrorType, }; } catch (error: any) { return { response: undefined, error: { status: 0, message: error.message, }, }; } } return { get: function apiGet( url: string, queryParams?: Record, options?: HttpOptionsType, ): Promise> { const searchParams = new URLSearchParams(queryParams).toString(); const queryUrl = searchParams ? `${url}?${searchParams}` : url; return apiCall(queryUrl, { ...options, method: 'GET', }); }, post: async function apiPost< ResponseType = AppResponse, ErrorType = AppError, >( url: string, body: Record, options?: HttpOptionsType, ): Promise> { return apiCall(url, { ...options, method: 'POST', body: JSON.stringify(body), }); }, patch: async function apiPatch< ResponseType = AppResponse, ErrorType = AppError, >( url: string, body: Record, options?: HttpOptionsType, ): Promise> { return apiCall(url, { ...options, method: 'PATCH', body: JSON.stringify(body), }); }, put: async function apiPut< ResponseType = AppResponse, ErrorType = AppError, >( url: string, body: Record, options?: HttpOptionsType, ): Promise> { return apiCall(url, { ...options, method: 'PUT', body: JSON.stringify(body), }); }, delete: async function apiDelete< ResponseType = AppResponse, ErrorType = AppError, >( url: string, options?: HttpOptionsType, ): Promise> { return apiCall(url, { ...options, method: 'DELETE', }); }, }; } ================================================ FILE: src/api/leaderboard.ts ================================================ import { type APIContext } from 'astro'; import { api } from './api.ts'; export type LeaderboardUserDetails = { id: string; name: string; avatar?: string; count: number; }; export type ListLeaderboardStatsResponse = { streaks: { active: LeaderboardUserDetails[]; lifetime: LeaderboardUserDetails[]; }; projectSubmissions: { currentMonth: LeaderboardUserDetails[]; lifetime: LeaderboardUserDetails[]; }; githubContributors: { currentMonth: LeaderboardUserDetails[]; }; referrals: { currentMonth: LeaderboardUserDetails[]; lifetime: LeaderboardUserDetails[]; }; }; export function leaderboardApi(context: APIContext) { return { listLeaderboardStats: async function () { return api(context).get( `${import.meta.env.PUBLIC_API_URL}/v1-list-leaderboard-stats`, {}, ); }, }; } ================================================ FILE: src/api/project.ts ================================================ import { type APIContext } from 'astro'; import { api } from './api.ts'; export function projectApi(context: APIContext) { return { listProjectsUserCount: async function (projectIds: string[]) { return api(context).post>( `${import.meta.env.PUBLIC_API_URL}/v1-list-projects-user-count`, { projectIds, }, ); }, }; } ================================================ FILE: src/api/roadmap.ts ================================================ import { type APIContext } from 'astro'; import { api } from './api.ts'; import type { RoadmapDocument } from '../components/CustomRoadmap/CreateRoadmap/CreateRoadmapModal.tsx'; import type { PageType } from '../components/CommandMenu/CommandMenu.tsx'; export type ListShowcaseRoadmapResponse = { data: Pick< RoadmapDocument, | '_id' | 'title' | 'description' | 'slug' | 'creatorId' | 'visibility' | 'createdAt' | 'topicCount' | 'ratings' >[]; totalCount: number; totalPages: number; currPage: number; perPage: number; }; export function roadmapApi(context: APIContext) { return { listShowcaseRoadmap: async function () { const searchParams = new URLSearchParams(context.url.searchParams); return api(context).get( `${import.meta.env.PUBLIC_API_URL}/v1-list-showcase-roadmap`, searchParams, ); }, isShowcaseRoadmap: async function (slug: string) { return api(context).get<{ isShowcase: boolean; }>(`${import.meta.env.PUBLIC_API_URL}/v1-is-showcase-roadmap/${slug}`); }, }; } export type ProjectPageType = { id: string; title: string; url: string; }; export async function getProjectList() { const baseUrl = import.meta.env.DEV ? 'http://localhost:3000' : 'https://roadmap.sh'; const pages = await fetch(`${baseUrl}/pages.json`).catch((err) => { console.error(err); return []; }); const pagesJson = await (pages as any).json(); const projects: ProjectPageType[] = pagesJson .filter((page: any) => page?.group?.toLowerCase() === 'projects') .map((page: any) => ({ id: page.id, title: page.title, url: page.url, })); return projects; } ================================================ FILE: src/api/user.ts ================================================ import { type APIContext } from 'astro'; import { api } from './api.ts'; import type { ResourceType } from '../lib/resource-progress.ts'; import type { ProjectStatusDocument } from '../components/Projects/ListProjectSolutions.tsx'; export const allowedRoadmapVisibility = ['all', 'none', 'selected'] as const; export type AllowedRoadmapVisibility = (typeof allowedRoadmapVisibility)[number]; export const allowedCustomRoadmapVisibility = [ 'all', 'none', 'selected', ] as const; export type AllowedCustomRoadmapVisibility = (typeof allowedCustomRoadmapVisibility)[number]; export const allowedProfileVisibility = ['public', 'private'] as const; export type AllowedProfileVisibility = (typeof allowedProfileVisibility)[number]; export const allowedOnboardingStatus = ['done', 'pending', 'ignored'] as const; export type AllowedOnboardingStatus = (typeof allowedOnboardingStatus)[number]; export interface UserDocument { _id?: string; name: string; email: string; avatar?: string; password: string; isEnabled: boolean; authProvider: 'github' | 'google' | 'email' | 'linkedin'; metadata: Record; calculatedStats: { activityCount: number; totalVisitCount: number; longestVisitStreak: number; currentVisitStreak: number; updatedAt: Date; }; verificationCode: string; resetPasswordCode: string; isSyncedWithSendy: boolean; links?: { github?: string; linkedin?: string; twitter?: string; dailydev?: string; website?: string; }; username?: string; profileVisibility: AllowedProfileVisibility; publicConfig?: { isAvailableForHire: boolean; isEmailVisible: boolean; headline: string; roadmaps: string[]; customRoadmaps: string[]; roadmapVisibility: AllowedRoadmapVisibility; customRoadmapVisibility: AllowedCustomRoadmapVisibility; }; resetPasswordCodeAt: string; verifiedAt: string; // Onboarding fields onboardingStatus?: AllowedOnboardingStatus; onboarding?: { updateProgress: AllowedOnboardingStatus; publishProfile: AllowedOnboardingStatus; customRoadmap: AllowedOnboardingStatus; addFriends: AllowedOnboardingStatus; roadCard: AllowedOnboardingStatus; inviteTeam: AllowedOnboardingStatus; }; createdAt: string; updatedAt: string; } export type UserActivityCount = { activityCount: Record; totalActivityCount: number; }; type ProgressResponse = { updatedAt: string; title: string; id: string; learning: number; skipped: number; done: number; total: number; isCustomResource?: boolean; roadmapSlug?: string; }; export type GetPublicProfileResponse = Omit< UserDocument, 'password' | 'verificationCode' | 'resetPasswordCode' | 'resetPasswordCodeAt' > & { activity: UserActivityCount; roadmaps: ProgressResponse[]; projects: ProjectStatusDocument[]; isOwnProfile: boolean; }; export type GetUserProfileRoadmapResponse = { title: string; topicCount: number; roadmapSlug?: string; isCustomResource?: boolean; done: string[]; learning: string[]; skipped: string[]; nodes: any[]; edges: any[]; }; export function userApi(context: APIContext) { return { getPublicProfile: async function (username: string) { return api(context).get( `${import.meta.env.PUBLIC_API_URL}/v1-get-public-profile/${username}`, ); }, getUserProfileRoadmap: async function ( username: string, resourceId: string, resourceType: ResourceType = 'roadmap', ) { return api(context).get( `${ import.meta.env.PUBLIC_API_URL }/v1-get-user-profile-roadmap/${username}`, { resourceId, resourceType, }, ); }, }; } ================================================ FILE: src/components/AIChat/AIChat.css ================================================ .ai-chat .prose ul li > code, .ai-chat .prose ol li > code, .ai-chat p code, .ai-chat a > code, .ai-chat strong > code, .ai-chat em > code, .ai-chat h1 > code, .ai-chat h2 > code, .ai-chat h3 > code { background: #ebebeb !important; color: currentColor !important; font-size: 14px; font-weight: normal !important; } .ai-chat .course-ai-content.course-content.prose ul li > code, .ai-chat .course-ai-content.course-content.prose ol li > code, .ai-chat .course-ai-content.course-content.prose p code, .ai-chat .course-ai-content.course-content.prose a > code, .ai-chat .course-ai-content.course-content.prose strong > code, .ai-chat .course-ai-content.course-content.prose em > code, .ai-chat .course-ai-content.course-content.prose h1 > code, .ai-chat .course-ai-content.course-content.prose h2 > code, .ai-chat .course-ai-content.course-content.prose h3 > code, .ai-chat .course-notes-content.prose ul li > code, .ai-chat .course-notes-content.prose ol li > code, .ai-chat .course-notes-content.prose p code, .ai-chat .course-notes-content.prose a > code, .ai-chat .course-notes-content.prose strong > code, .ai-chat .course-notes-content.prose em > code, .ai-chat .course-notes-content.prose h1 > code, .ai-chat .course-notes-content.prose h2 > code, .ai-chat .course-notes-content.prose h3 > code { font-size: 12px !important; } .ai-chat .course-ai-content pre { -ms-overflow-style: none; scrollbar-width: none; } .ai-chat .course-ai-content pre::-webkit-scrollbar { display: none; } .ai-chat .course-ai-content pre, .ai-chat .course-notes-content pre { overflow: scroll; font-size: 15px; margin: 10px 0; } .ai-chat .prose ul li > code:before, .ai-chat p > code:before, .ai-chat .prose ul li > code:after, .prose ol li > code:before, p > code:before, .ai-chat .prose ol li > code:after, .ai-chat .course-content h1 > code:after, .ai-chat .course-content h1 > code:before, .ai-chat .course-content h2 > code:after, .ai-chat .course-content h2 > code:before, .ai-chat .course-content h3 > code:after, .ai-chat .course-content h3 > code:before, .ai-chat .course-content h4 > code:after, .ai-chat .course-content h4 > code:before, .ai-chat p > code:after, .ai-chat a > code:after, .ai-chat a > code:before { content: '' !important; } .ai-chat .course-content.prose ul li > code, .ai-chat .course-content.prose ol li > code, .ai-chat .course-content p code, .ai-chat .course-content a > code, .ai-chat .course-content strong > code, .ai-chat .course-content em > code, .ai-chat .course-content h1 > code, .ai-chat .course-content h2 > code, .ai-chat .course-content h3 > code, .ai-chat .course-content table code { background: #f4f4f5 !important; border: 1px solid #282a36 !important; color: #282a36 !important; padding: 2px 4px; border-radius: 5px; font-size: 16px !important; white-space: pre; font-weight: normal; } .ai-chat .course-content blockquote { font-style: normal; } .ai-chat .course-content.prose blockquote h1, .ai-chat .course-content.prose blockquote h2, .ai-chat .course-content.prose blockquote h3, .ai-chat .course-content.prose blockquote h4 { font-style: normal; margin-bottom: 8px; } .ai-chat .course-content.prose ul li > code:before, .ai-chat .course-content p > code:before, .ai-chat .course-content.prose ul li > code:after, .ai-chat .course-content p > code:after, .ai-chat .course-content h2 > code:after, .ai-chat .course-content h2 > code:before, .ai-chat .course-content table code:before, .ai-chat .course-content table code:after, .ai-chat .course-content a > code:after, .ai-chat .course-content a > code:before, .ai-chat .course-content h2 code:after, .ai-chat .course-content h2 code:before, .ai-chat .course-content h2 code:after, .ai-chat .course-content h2 code:before { content: '' !important; } .ai-chat .course-content table { border-collapse: collapse; border: 1px solid black; border-radius: 5px; } .ai-chat .course-content table td, .ai-chat .course-content table th { padding: 5px 10px; } ================================================ FILE: src/components/AIChat/AIChat.tsx ================================================ import './AIChat.css'; import { ArrowDownIcon, FileUpIcon, LockIcon, PersonStandingIcon, SendIcon, TrashIcon, } from 'lucide-react'; import { useCallback, useEffect, useRef, useState } from 'react'; import { flushSync } from 'react-dom'; import AutogrowTextarea from 'react-textarea-autosize'; import { QuickHelpPrompts } from './QuickHelpPrompts'; import { QuickActionButton } from './QuickActionButton'; import { aiLimitOptions } from '../../queries/ai-course'; import { isLoggedIn, removeAuthToken } from '../../lib/jwt'; import { useMutation, useQuery } from '@tanstack/react-query'; import { queryClient } from '../../stores/query-client'; import { billingDetailsOptions } from '../../queries/billing'; import { useToast } from '../../hooks/use-toast'; import { markdownToHtml } from '../../lib/markdown'; import { ChatHistory } from './ChatHistory'; import { PersonalizedResponseForm } from './PersonalizedResponseForm'; import { userPersonaOptions } from '../../queries/user-persona'; import { UploadResumeModal } from './UploadResumeModal'; import { userResumeOptions } from '../../queries/user-resume'; import { httpPost } from '../../lib/query-http'; import { renderMessage, type MessagePartRenderer, } from '../../lib/render-chat-message'; import { RoadmapRecommendations } from '../RoadmapAIChat/RoadmapRecommendations'; import { AIChatCourse } from './AIChatCouse'; import { showLoginPopup } from '../../lib/popup'; import { readChatStream } from '../../lib/chat'; import { chatHistoryOptions } from '../../queries/chat-history'; import { cn } from '../../lib/classname'; import type { RoadmapAIChatHistoryType } from '../../hooks/use-roadmap-ai-chat'; export const aiChatRenderer: Record = { 'roadmap-recommendations': (options) => { return ; }, 'generate-course': (options) => { return ; }, }; type AIChatProps = { messages?: RoadmapAIChatHistoryType[]; chatHistoryId?: string; setChatHistoryId?: (chatHistoryId: string) => void; onUpgrade?: () => void; }; export function AIChat(props: AIChatProps) { const { messages: defaultMessages, chatHistoryId: defaultChatHistoryId, setChatHistoryId: setDefaultChatHistoryId, onUpgrade, } = props; const toast = useToast(); const [message, setMessage] = useState(''); const [isStreamingMessage, setIsStreamingMessage] = useState(false); const [streamedMessage, setStreamedMessage] = useState(null); const [aiChatHistory, setAiChatHistory] = useState< RoadmapAIChatHistoryType[] >(defaultMessages ?? []); const [isPersonalizedResponseFormOpen, setIsPersonalizedResponseFormOpen] = useState(false); const [isUploadResumeModalOpen, setIsUploadResumeModalOpen] = useState(false); const [showScrollToBottomButton, setShowScrollToBottomButton] = useState(false); const scrollableContainerRef = useRef(null); const chatContainerRef = useRef(null); const textareaMessageRef = useRef(null); const { data: tokenUsage, isLoading } = useQuery( aiLimitOptions(), queryClient, ); const { data: userBillingDetails, isLoading: isBillingDetailsLoading } = useQuery(billingDetailsOptions(), queryClient); const { data: userPersona, isLoading: isUserPersonaLoading } = useQuery( userPersonaOptions(), queryClient, ); const { data: userResume, isLoading: isUserResumeLoading } = useQuery( userResumeOptions(), queryClient, ); const { mutate: deleteChatMessage, isPending: isDeletingChatMessage } = useMutation( { mutationFn: (messages: RoadmapAIChatHistoryType[]) => { if (!defaultChatHistoryId) { return Promise.resolve({ status: 200, message: 'Chat history not found', }); } return httpPost(`/v1-delete-chat-message/${defaultChatHistoryId}`, { messages, }); }, onSuccess: () => { textareaMessageRef.current?.focus(); queryClient.invalidateQueries( chatHistoryOptions(defaultChatHistoryId), ); }, onError: (error) => { toast.error(error?.message || 'Failed to delete message'); }, }, queryClient, ); const isLimitExceeded = (tokenUsage?.used || 0) >= (tokenUsage?.limit || 0); const isPaidUser = userBillingDetails?.status === 'active'; const handleChatSubmit = () => { if (!isLoggedIn()) { showLoginPopup(); return; } if (isLimitExceeded) { if (!isPaidUser) { onUpgrade?.(); } toast.error('Limit reached for today. Please wait until tomorrow.'); return; } const trimmedMessage = message.trim(); if (!trimmedMessage || isStreamingMessage) { return; } const newMessages: RoadmapAIChatHistoryType[] = [ ...aiChatHistory, { role: 'user', content: trimmedMessage, // it's just a simple message, so we can use markdownToHtml html: markdownToHtml(trimmedMessage), }, ]; flushSync(() => { setAiChatHistory(newMessages); setMessage(''); }); setTimeout(() => { scrollToBottom(); }, 0); textareaMessageRef.current?.focus(); completeAIChat(newMessages); }; const canScrollToBottom = useCallback(() => { const scrollableContainer = scrollableContainerRef?.current; if (!scrollableContainer) { return false; } const paddingBottom = parseInt( getComputedStyle(scrollableContainer).paddingBottom, ); const distanceFromBottom = scrollableContainer.scrollHeight - (scrollableContainer.scrollTop + scrollableContainer.clientHeight) - paddingBottom; return distanceFromBottom > -(paddingBottom - 80); }, []); const scrollToBottom = useCallback( (behavior: 'instant' | 'smooth' = 'smooth') => { const scrollableContainer = scrollableContainerRef?.current; if (!scrollableContainer) { return; } scrollableContainer.scrollTo({ top: scrollableContainer.scrollHeight, behavior: behavior === 'instant' ? 'instant' : 'smooth', }); }, [scrollableContainerRef], ); const completeAIChat = async ( messages: RoadmapAIChatHistoryType[], force: boolean = false, ) => { setIsStreamingMessage(true); const response = await fetch(`${import.meta.env.PUBLIC_API_URL}/v1-chat`, { method: 'POST', headers: { 'Content-Type': 'application/json', }, credentials: 'include', body: JSON.stringify({ chatHistoryId: defaultChatHistoryId, messages, force, }), }); if (!response.ok) { const data = await response.json(); toast.error(data?.message || 'Something went wrong'); setAiChatHistory([...messages].slice(0, messages.length - 1)); setIsStreamingMessage(false); if (data.status === 401) { removeAuthToken(); window.location.reload(); } } const stream = response.body; if (!stream) { setIsStreamingMessage(false); toast.error('Something went wrong'); return; } await readChatStream(stream, { onMessage: async (content) => { const jsx = await renderMessage(content, aiChatRenderer, { isLoading: true, }); flushSync(() => { setStreamedMessage(jsx); }); setShowScrollToBottomButton(canScrollToBottom()); }, onMessageEnd: async (content) => { const jsx = await renderMessage(content, aiChatRenderer, { isLoading: false, }); const newMessages: RoadmapAIChatHistoryType[] = [ ...messages, { role: 'assistant', content, jsx, }, ]; flushSync(() => { setStreamedMessage(null); setIsStreamingMessage(false); setAiChatHistory(newMessages); }); queryClient.invalidateQueries(aiLimitOptions()); queryClient.invalidateQueries({ predicate: (query) => { return query.queryKey[0] === 'list-chat-history'; }, }); }, onDetails: (details) => { const chatHistoryId = details?.chatHistoryId; if (!chatHistoryId) { return; } setDefaultChatHistoryId?.(chatHistoryId); }, }); setIsStreamingMessage(false); }; const { mutate: uploadResume, isPending: isUploading } = useMutation( { mutationFn: (formData: FormData) => { return httpPost('/v1-upload-resume', formData); }, onSuccess: () => { toast.success('Resume uploaded successfully'); setIsUploadResumeModalOpen(false); queryClient.invalidateQueries(userResumeOptions()); }, onError: (error) => { toast.error(error?.message || 'Failed to upload resume'); }, onMutate: () => { setIsUploadResumeModalOpen(false); }, }, queryClient, ); useEffect(() => { const scrollableContainer = scrollableContainerRef.current; if (!scrollableContainer) { return; } const abortController = new AbortController(); let timeoutId: NodeJS.Timeout; const debouncedHandleScroll = () => { if (timeoutId) { clearTimeout(timeoutId); } timeoutId = setTimeout(() => { setShowScrollToBottomButton(canScrollToBottom()); }, 100); }; debouncedHandleScroll(); scrollableContainer.addEventListener('scroll', debouncedHandleScroll, { signal: abortController.signal, }); return () => { if (timeoutId) { clearTimeout(timeoutId); } abortController.abort(); }; }, [aiChatHistory]); const handleRegenerate = useCallback( (index: number) => { if (isLimitExceeded) { if (!isPaidUser) { onUpgrade?.(); } toast.error('Limit reached for today. Please wait until tomorrow.'); return; } const filteredChatHistory = aiChatHistory.slice(0, index); flushSync(() => { setAiChatHistory(filteredChatHistory); }); scrollToBottom(); completeAIChat(filteredChatHistory, true); }, [aiChatHistory], ); const handleDelete = useCallback( (index: number) => { const filteredChatHistory = aiChatHistory.filter((_, i) => i !== index); setAiChatHistory(filteredChatHistory); deleteChatMessage(filteredChatHistory); }, [aiChatHistory], ); const shouldShowQuickHelpPrompts = message.length === 0 && aiChatHistory.length === 0; const isDataLoading = isLoading || isBillingDetailsLoading || isUserPersonaLoading || isUserResumeLoading; useEffect(() => { scrollToBottom('instant'); }, []); const shouldShowUpgradeBanner = !isPaidUser && aiChatHistory.length > 0; return (
{shouldShowQuickHelpPrompts && ( { textareaMessageRef.current?.focus(); setMessage(question); }} /> )} {!shouldShowQuickHelpPrompts && ( )}
{isPersonalizedResponseFormOpen && ( setIsPersonalizedResponseFormOpen(false)} /> )} {isUploadResumeModalOpen && ( setIsUploadResumeModalOpen(false)} userResume={userResume} isUploading={isUploading} uploadResume={uploadResume} /> )}
{ if (!isLoggedIn()) { showLoginPopup(); return; } setIsPersonalizedResponseFormOpen(true); }} /> { if (!isLoggedIn()) { showLoginPopup(); return; } setIsUploadResumeModalOpen(true); }} isLoading={isUploading} />
{showScrollToBottomButton && ( )} {aiChatHistory.length > 0 && !isPaidUser && ( { setAiChatHistory([]); deleteChatMessage([]); }} /> )}
{ e.preventDefault(); if (isDataLoading) { return; } handleChatSubmit(); }} > setMessage(e.target.value)} className="min-h-10 w-full resize-none bg-transparent text-sm focus:outline-none" placeholder="Ask me anything..." disabled={isStreamingMessage} autoFocus onKeyDown={(e) => { if (e.key === 'Enter' && !e.shiftKey) { if (isDataLoading) { return; } e.preventDefault(); handleChatSubmit(); } }} /> {isLimitExceeded && isLoggedIn() && !isDataLoading && (

Limit reached for today {isPaidUser ? '. Please wait until tomorrow.' : ''}

{!isPaidUser && ( )}
)}
); } ================================================ FILE: src/components/AIChat/AIChatCouse.tsx ================================================ import { Book } from 'lucide-react'; type AIChatCourseType = { keyword: string; difficulty: string; }; function parseAIChatCourse(content: string): AIChatCourseType | null { const courseKeywordRegex = /(.*?)<\/keyword>/; const courseKeyword = content.match(courseKeywordRegex)?.[1]?.trim(); if (!courseKeyword) { return null; } const courseDifficultyRegex = /(.*?)<\/difficulty>/; const courseDifficulty = content.match(courseDifficultyRegex)?.[1]?.trim(); if (!courseDifficulty) { return null; } return { keyword: courseKeyword, difficulty: courseDifficulty || 'beginner' }; } type AIChatCourseProps = { content: string; }; export function AIChatCourse(props: AIChatCourseProps) { const { content } = props; const course = parseAIChatCourse(content); if (!course) { return null; } const courseSearchUrl = `/ai/course?term=${course?.keyword}&difficulty=${course?.difficulty}`; return ( ); } ================================================ FILE: src/components/AIChat/ChatHistory.tsx ================================================ import { Fragment, memo } from 'react'; import { cn } from '../../lib/classname'; import { CopyIcon, CheckIcon, TrashIcon, type LucideIcon, RotateCwIcon, } from 'lucide-react'; import { useCopyText } from '../../hooks/use-copy-text'; import { Tooltip } from '../Tooltip'; import type { RoadmapAIChatHistoryType } from '../../hooks/use-roadmap-ai-chat'; type ChatHistoryProps = { chatHistory: RoadmapAIChatHistoryType[]; onDelete?: (index: number) => void; onRegenerate?: (index: number) => void; isStreamingMessage: boolean; streamedMessage: React.ReactNode; }; export const ChatHistory = memo((props: ChatHistoryProps) => { const { chatHistory, onDelete, isStreamingMessage, streamedMessage, onRegenerate, } = props; return (
{chatHistory.map((chat, index) => { return ( { onDelete?.(index); }} onRegenerate={() => { onRegenerate?.(index); }} /> ); })} {isStreamingMessage && !streamedMessage && ( )} {streamedMessage && ( )}
); }); type AIChatCardProps = RoadmapAIChatHistoryType & { onDelete?: () => void; onRegenerate?: () => void; showActions?: boolean; }; export const AIChatCard = memo((props: AIChatCardProps) => { const { role, content, jsx, html, showActions = true, onDelete, onRegenerate, } = props; const { copyText, isCopied } = useCopyText(); return (
{!!jsx && jsx} {!!html && (
)}
{showActions && (
copyText(content ?? '')} tooltip={isCopied ? 'Copied' : 'Copy'} /> {role === 'assistant' && onRegenerate && ( )} {onDelete && ( )}
)}
); }); type ActionButtonProps = { icon: LucideIcon; tooltip?: string; onClick: () => void; }; function ActionButton(props: ActionButtonProps) { const { icon: Icon, onClick, tooltip } = props; return (
{tooltip && ( {tooltip} )}
); } ================================================ FILE: src/components/AIChat/PersonalizedResponseForm.tsx ================================================ import { Loader2Icon } from 'lucide-react'; import { MessageCircle } from 'lucide-react'; import { memo, useId, useRef, useState } from 'react'; import { Modal } from '../Modal'; import { cn } from '../../lib/classname'; import { SelectNative } from '../SelectNative'; import { useMutation } from '@tanstack/react-query'; import { queryClient } from '../../stores/query-client'; import { httpPost } from '../../lib/query-http'; import { userPersonaOptions } from '../../queries/user-persona'; import { useToast } from '../../hooks/use-toast'; import { isLoggedIn } from '../../lib/jwt'; import { showLoginPopup } from '../../lib/popup'; export type ChatPreferencesFormData = { expertise: string; goal: string; about: string; specialInstructions?: string; }; type PersonalizedResponseFormProps = { defaultValues?: ChatPreferencesFormData; onClose: () => void; }; export const PersonalizedResponseForm = memo( (props: PersonalizedResponseFormProps) => { const { defaultValues, onClose } = props; const toast = useToast(); const [expertise, setExpertise] = useState(defaultValues?.expertise ?? ''); const [about, setAbout] = useState(defaultValues?.about ?? ''); const [specialInstructions, setSpecialInstructions] = useState( defaultValues?.specialInstructions ?? '' ); const goalOptions = [ 'Finding a job', 'Learning for fun', 'Building a side project', 'Switching careers', 'Getting a promotion', 'Filling knowledge gaps', 'Other', ]; const getInitialGoalSelection = () => { if (!defaultValues?.goal) { return ''; } for (const option of goalOptions.slice(0, -1)) { if (defaultValues.goal.startsWith(option)) { return option; } } return 'Other'; }; const [selectedGoal, setSelectedGoal] = useState(getInitialGoalSelection()); const [goal, setGoal] = useState(defaultValues?.goal ?? ''); const expertiseFieldId = useId(); const goalFieldId = useId(); const goalSelectId = useId(); const aboutFieldId = useId(); const specialInstructionsFieldId = useId(); const goalRef = useRef(null); const handleGoalSelectionChange = (value: string) => { setSelectedGoal(value); if (value === 'Other') { setGoal(''); setTimeout(() => { goalRef.current?.focus(); }, 0); } else { setGoal(value); } }; const { mutate: setChatPreferences, isPending } = useMutation( { mutationFn: (data: ChatPreferencesFormData) => { return httpPost('/v1-set-chat-preferences', data); }, onSuccess: () => { onClose(); queryClient.invalidateQueries(userPersonaOptions()); }, onError: (error) => { toast.error(error?.message ?? 'Something went wrong'); }, }, queryClient ); const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); if (!isLoggedIn()) { showLoginPopup(); return; } setChatPreferences({ expertise, goal, about, specialInstructions, }); }; const hasFormCompleted = !!expertise && !!goal && !!about; return (
setExpertise(e.target.value)} className="h-[40px] border-gray-300 text-sm focus:border-gray-500 focus:ring-1 focus:ring-gray-500" > {[ 'No experience (just starting out)', 'Beginner (less than 1 year of experience)', 'Intermediate (1-3 years of experience)', 'Expert (3-5 years of experience)', 'Master (5+ years of experience)', ].map((expertise) => ( ))}
handleGoalSelectionChange(e.target.value)} className="h-[40px] border-gray-300 text-sm focus:border-gray-500 focus:ring-1 focus:ring-gray-500" > {goalOptions.map((goalOption) => ( ))} {selectedGoal === 'Other' && ( ) : ( )}
); } export function AdvertiseForm() { const [status, setStatus] = useState<'submitting' | 'submitted'>(); const [error, setError] = useState(null); const [formData, setFormData] = useState({ firstName: '', lastName: '', title: '', company: '', email: '', phone: '', message: '', updates: false, }); const handleInputChange = ( e: React.ChangeEvent, ) => { const { name, value, type, checked } = e.target as any; setFormData({ ...formData, [name]: type === 'checkbox' ? checked : value, }); }; async function handleSubmit(e: React.FormEvent) { e.preventDefault(); pageProgressMessage.set('Please wait'); const { response, error } = await httpPost( `${import.meta.env.PUBLIC_API_URL}/v1-advertise`, formData, ); if (!response || error) { pageProgressMessage.set(''); setError(error?.message || 'Something went wrong. Please try again.'); return; } setStatus('submitted'); pageProgressMessage.set(''); } if (status === 'submitted') { return (

Thank you for your interest in advertising with roadmap.sh

We will get back to you soon.

); } return ( <>

Ready to learn more? Fill out the form below to get started!

{error && (
{error}
)}
); } ================================================ FILE: src/components/Analytics/Analytics.astro ================================================ --- --- ================================================ FILE: src/components/Analytics/Bluconic.astro ================================================ ================================================ FILE: src/components/Analytics/Clarity.astro ================================================ ================================================ FILE: src/components/Analytics/GoogleAd.astro ================================================ ================================================ FILE: src/components/Analytics/GoogleAdSlot.astro ================================================
================================================ FILE: src/components/Analytics/Hubspot.astro ================================================ ================================================ FILE: src/components/Analytics/LinkedIn.astro ================================================ --- // LinkedIn Analytics component --- ================================================ FILE: src/components/Analytics/OneTrust.astro ================================================ ================================================ FILE: src/components/Analytics/RedditPixel.astro ================================================ ================================================ FILE: src/components/Analytics/analytics.ts ================================================ import { httpPost } from '../../lib/query-http'; import { getPageTrackingData } from '../../lib/browser'; declare global { interface Window { gtag: any; fireEvent: (props: { action: string; category: string; label?: string; value?: string; callback?: () => void; }) => void; } } /** * Tracks the event on google analytics * @see https://developers.google.com/analytics/devguides/collection/gtagjs/events * @param props Event properties * @returns void */ window.fireEvent = (props) => { const { action, category, label, value, callback } = props; const eventId = `${Date.now()}-${Math.random().toString(36).slice(2, 8)}`; if (['course', 'ai_tutor'].includes(category)) { const trackingData = getPageTrackingData(); const url = new URL(import.meta.env.PUBLIC_API_URL); url.pathname = '/api/_t'; url.searchParams.set('action', action); url.searchParams.set('category', category); url.searchParams.set('label', label ?? ''); url.searchParams.set('value', value ?? ''); url.searchParams.set('event_id', eventId); httpPost(url.toString(), { page_location: trackingData.page_location, page_path: trackingData.page_path, page_referrer: trackingData.page_referrer, page_title: trackingData.page_title, user_agent: trackingData.user_agent, screen_resolution: trackingData.screen_resolution, viewport_size: trackingData.viewport_size, session_id: trackingData.session_id, gclid: trackingData.gclid, utm_source: trackingData.utm_source, utm_medium: trackingData.utm_medium, utm_campaign: trackingData.utm_campaign, utm_content: trackingData.utm_content, utm_term: trackingData.utm_term, }).catch(console.error); return; } if (!window.gtag) { console.warn('Missing GTAG - Analytics disabled'); return; } if (import.meta.env.DEV) { console.log('Analytics event fired', props); callback?.(); return; } const trackingData = getPageTrackingData(); window.gtag('event', action, { event_category: category, event_label: label, value: value, event_id: eventId, source: 'client', page_location: trackingData.page_location, page_path: trackingData.page_path, page_referrer: trackingData.page_referrer, page_title: trackingData.page_title, session_id: trackingData.session_id, gclid: trackingData.gclid, utm_source: trackingData.utm_source, utm_medium: trackingData.utm_medium, utm_campaign: trackingData.utm_campaign, utm_content: trackingData.utm_content, utm_term: trackingData.utm_term, ...(callback ? { event_callback: callback } : {}), }); }; export {}; ================================================ FILE: src/components/AppChecklist.tsx ================================================ import { PartyPopper } from 'lucide-react'; export function AppChecklist() { return ( ); } ================================================ FILE: src/components/AstroIcon.astro ================================================ --- import { parse } from 'node-html-parser'; export interface Props { icon: string; class?: string; } async function getSVG(name: string) { const filepath = `/src/icons/${name}.svg`; const files = import.meta.glob('/src/icons/**/*.svg', { query: '?raw', eager: true, }); if (!(filepath in files)) { throw new Error(`${filepath} not found`); } const root = parse((files[filepath] as any).default as string); const svg = root.querySelector('svg'); return { attributes: svg?.attributes, innerHTML: svg?.innerHTML, }; } const { icon, ...attributes } = Astro.props as Props; const { attributes: baseAttributes, innerHTML } = await getSVG(icon); const svgAttributes = { ...baseAttributes, ...attributes }; --- ================================================ FILE: src/components/AuthenticationFlow/AuthenticationForm.tsx ================================================ import { useState } from 'react'; import { GitHubButton } from './GitHubButton'; import { GoogleButton } from './GoogleButton'; import { LinkedInButton } from './LinkedInButton'; import { EmailLoginForm } from './EmailLoginForm'; import { EmailSignupForm } from './EmailSignupForm'; type AuthenticationFormProps = { type?: 'login' | 'signup'; }; export function AuthenticationForm(props: AuthenticationFormProps) { const { type = 'login' } = props; const [isDisabled, setIsDisabled] = useState(false); return ( <>
OR
{type === 'login' ? ( ) : ( )} ); } ================================================ FILE: src/components/AuthenticationFlow/CourseLoginPopup.tsx ================================================ import { useEffect, useState } from 'react'; import { Modal } from '../Modal'; import { GitHubButton } from './GitHubButton'; import { GoogleButton } from './GoogleButton'; import { LinkedInButton } from './LinkedInButton'; import { EmailLoginForm } from './EmailLoginForm'; import { EmailSignupForm } from './EmailSignupForm'; type CourseLoginPopupProps = { onClose: () => void; checkoutAfterLogin?: boolean; }; export const CHECKOUT_AFTER_LOGIN_KEY = 'checkoutAfterLogin'; export const SAMPLE_AFTER_LOGIN_KEY = 'sampleAfterLogin'; export function CourseLoginPopup(props: CourseLoginPopupProps) { const { onClose: parentOnClose, checkoutAfterLogin = true } = props; const [isDisabled, setIsDisabled] = useState(false); const [isUsingEmail, setIsUsingEmail] = useState(false); const [emailNature, setEmailNature] = useState<'login' | 'signup' | null>( null, ); function onClose() { // if user didn't login and closed the popup, we remove the checkoutAfterLogin flag // so that login from other buttons on course page will trigger purchase localStorage.removeItem(CHECKOUT_AFTER_LOGIN_KEY); localStorage.removeItem(SAMPLE_AFTER_LOGIN_KEY); parentOnClose(); } useEffect(() => { localStorage.setItem( CHECKOUT_AFTER_LOGIN_KEY, checkoutAfterLogin ? '1' : '0', ); }, [checkoutAfterLogin]); if (emailNature) { const emailHeader = (

{emailNature === 'login' ? 'Login to your account' : 'Create an account'}

Fill in the details below to continue

); return ( {emailHeader} {emailNature === 'login' && ( )} {emailNature === 'signup' && ( )} ); } return (

Create or login to Enroll

Login or sign up for an account to start learning

OR
{!isUsingEmail && ( )} {isUsingEmail && ( <> )}
); } ================================================ FILE: src/components/AuthenticationFlow/Divider.astro ================================================
OR
================================================ FILE: src/components/AuthenticationFlow/EmailLoginForm.tsx ================================================ import type { FormEvent } from 'react'; import { useId, useState } from 'react'; import { httpPost } from '../../lib/http'; import { COURSE_PURCHASE_PARAM, FIRST_LOGIN_PARAM, setAuthToken, } from '../../lib/jwt'; type EmailLoginFormProps = { isDisabled?: boolean; setIsDisabled?: (isDisabled: boolean) => void; }; export function EmailLoginForm(props: EmailLoginFormProps) { const { isDisabled, setIsDisabled } = props; const [email, setEmail] = useState(''); const [password, setPassword] = useState(''); const [error, setError] = useState(''); const [isLoading, setIsLoading] = useState(false); const handleFormSubmit = async (e: FormEvent) => { e.preventDefault(); setIsLoading(true); setIsDisabled?.(true); setError(''); const { response, error } = await httpPost<{ token: string; isNewUser: boolean; }>(`${import.meta.env.PUBLIC_API_URL}/v1-login`, { email, password, }); // Log the user in and reload the page if (response?.token) { setAuthToken(response.token); const currentLocation = window.location.href; const url = new URL(currentLocation, window.location.origin); url.searchParams.set(FIRST_LOGIN_PARAM, response?.isNewUser ? '1' : '0'); url.searchParams.set(COURSE_PURCHASE_PARAM, '1'); window.location.href = url.toString(); return; } // @todo use proper types if ((error as any).type === 'user_not_verified') { window.location.href = `/verification-pending?email=${encodeURIComponent( email, )}`; return; } setIsLoading(false); setIsDisabled?.(false); setError(error?.message || 'Something went wrong. Please try again later.'); }; const emailFieldId = `form:${useId()}`; const passwordFieldId = `form:${useId()}`; return (
setEmail(String((e.target as any).value))} /> setPassword(String((e.target as any).value))} />

Reset your password?

{error && (

{error}

)}
); } ================================================ FILE: src/components/AuthenticationFlow/EmailSignupForm.tsx ================================================ import { type FormEvent, useEffect, useState } from 'react'; import { httpPost } from '../../lib/http'; import { deleteUrlParam, getLastPath, getUrlParams, urlToId, } from '../../lib/browser'; import { isLoggedIn, setAIReferralCode } from '../../lib/jwt'; type EmailSignupFormProps = { isDisabled?: boolean; setIsDisabled?: (isDisabled: boolean) => void; }; export function EmailSignupForm(props: EmailSignupFormProps) { const { isDisabled, setIsDisabled } = props; const { rc: referralCode } = getUrlParams() as { rc?: string; }; const [email, setEmail] = useState(''); const [password, setPassword] = useState(''); const [name, setName] = useState(''); const [error, setError] = useState(''); const [isLoading, setIsLoading] = useState(false); const onSubmit = async (e: FormEvent) => { e.preventDefault(); setIsLoading(true); setIsDisabled?.(true); setError(''); const { response, error } = await httpPost<{ status: 'ok' }>( `${import.meta.env.PUBLIC_API_URL}/v1-register`, { email, password, name, src: urlToId(getLastPath() || window.location.pathname), }, ); if (error || response?.status !== 'ok') { setIsLoading(false); setIsDisabled?.(false); setError( error?.message || 'Something went wrong. Please try again later.', ); return; } window.location.href = `/verification-pending?email=${encodeURIComponent( email, )}`; }; useEffect(() => { if (!referralCode || isLoggedIn()) { deleteUrlParam('rc'); return; } setAIReferralCode(referralCode); deleteUrlParam('rc'); }, []); return (
setName(String((e.target as any).value))} /> setEmail(String((e.target as any).value))} /> setPassword(String((e.target as any).value))} /> {error && (

{error}.

)}
); } ================================================ FILE: src/components/AuthenticationFlow/ForgotPasswordForm.tsx ================================================ import { type FormEvent, useState } from 'react'; import { httpPost } from '../../lib/http'; export function ForgotPasswordForm() { const [email, setEmail] = useState(''); const [isLoading, setIsLoading] = useState(false); const [error, setError] = useState(''); const [success, setSuccess] = useState(''); const handleSubmit = async (e: FormEvent) => { e.preventDefault(); setIsLoading(true); setError(''); const { response, error } = await httpPost( `${import.meta.env.PUBLIC_API_URL}/v1-forgot-password`, { email, } ); setIsLoading(false); if (error) { setError(error.message); } else { setEmail(''); setSuccess('Check your email for a link to reset your password.'); } }; return (
setEmail((e.target as HTMLInputElement).value)} /> {error && (

{error}

)} {success && (

{success}

)}
); } ================================================ FILE: src/components/AuthenticationFlow/GitHubButton.tsx ================================================ import { useEffect, useState } from 'react'; import { GitHubIcon } from '../ReactIcons/GitHubIcon.tsx'; import { FIRST_LOGIN_PARAM, COURSE_PURCHASE_PARAM, setAuthToken, } from '../../lib/jwt'; import { cn } from '../../lib/classname.ts'; import { httpGet } from '../../lib/http'; import { Spinner } from '../ReactIcons/Spinner.tsx'; import { CHECKOUT_AFTER_LOGIN_KEY } from './CourseLoginPopup.tsx'; import { getLastPath, triggerUtmRegistration, urlToId } from '../../lib/browser.ts'; type GitHubButtonProps = { isDisabled?: boolean; setIsDisabled?: (isDisabled: boolean) => void; className?: string; }; const GITHUB_REDIRECT_AT = 'githubRedirectAt'; const GITHUB_LAST_PAGE = 'githubLastPage'; export function GitHubButton(props: GitHubButtonProps) { const { isDisabled, setIsDisabled, className } = props; const [isLoading, setIsLoading] = useState(false); const [error, setError] = useState(''); useEffect(() => { const urlParams = new URLSearchParams(window.location.search); const code = urlParams.get('code'); const state = urlParams.get('state'); const provider = urlParams.get('provider'); if (!code || !state || provider !== 'github') { return; } setIsLoading(true); setIsDisabled?.(true); const lastPageBeforeGithub = localStorage.getItem(GITHUB_LAST_PAGE); httpGet<{ token: string; isNewUser: boolean }>( `${import.meta.env.PUBLIC_API_URL}/v1-github-callback${ window.location.search }&src=${urlToId(lastPageBeforeGithub || getLastPath() || window.location.pathname)}`, ) .then(({ response, error }) => { if (!response?.token) { const errMessage = error?.message || 'Something went wrong.'; setError(errMessage); setIsLoading(false); setIsDisabled?.(false); return; } triggerUtmRegistration(); let redirectUrl = new URL('/', window.location.origin); const gitHubRedirectAt = localStorage.getItem(GITHUB_REDIRECT_AT); // If the social redirect is there and less than 30 seconds old // redirect to the page that user was on before they clicked the github login button if (gitHubRedirectAt && lastPageBeforeGithub) { const socialRedirectAtTime = parseInt(gitHubRedirectAt, 10); const now = Date.now(); const timeSinceRedirect = now - socialRedirectAtTime; if (timeSinceRedirect < 30 * 1000) { redirectUrl = new URL(lastPageBeforeGithub, window.location.origin); } } const authRedirectUrl = localStorage.getItem('authRedirect'); if (authRedirectUrl) { localStorage.removeItem('authRedirect'); redirectUrl = new URL(authRedirectUrl, window.location.origin); } localStorage.removeItem(GITHUB_REDIRECT_AT); localStorage.removeItem(GITHUB_LAST_PAGE); setAuthToken(response.token); redirectUrl.searchParams.set( FIRST_LOGIN_PARAM, response?.isNewUser ? '1' : '0', ); const shouldTriggerPurchase = localStorage.getItem(CHECKOUT_AFTER_LOGIN_KEY) !== '0'; if ( redirectUrl.pathname.includes('/courses/sql') && shouldTriggerPurchase ) { redirectUrl.searchParams.set(COURSE_PURCHASE_PARAM, '1'); localStorage.removeItem(CHECKOUT_AFTER_LOGIN_KEY); } window.location.href = redirectUrl.toString(); }) .catch((err) => { setError('Something went wrong. Please try again later.'); setIsLoading(false); setIsDisabled?.(false); }); }, []); const handleClick = async () => { setIsLoading(true); setIsDisabled?.(true); const { response, error } = await httpGet<{ loginUrl: string }>( `${import.meta.env.PUBLIC_API_URL}/v1-github-login`, ); if (error || !response?.loginUrl) { setError( error?.message || 'Something went wrong. Please try again later.', ); setIsLoading(false); setIsDisabled?.(false); return; } // For non authentication pages, we want to redirect back to the page // the user was on before they clicked the social login button if (!['/login', '/signup'].includes(window.location.pathname)) { const pagePath = [ '/respond-invite', '/befriend', '/r', '/ai-roadmaps', ].includes(window.location.pathname) ? window.location.pathname + window.location.search : window.location.pathname; localStorage.setItem(GITHUB_REDIRECT_AT, Date.now().toString()); localStorage.setItem(GITHUB_LAST_PAGE, pagePath); } window.location.href = response.loginUrl; }; return ( <> {error && (

{error}

)} ); } ================================================ FILE: src/components/AuthenticationFlow/GoogleButton.tsx ================================================ import { useEffect, useState } from 'react'; import { FIRST_LOGIN_PARAM, setAuthToken } from '../../lib/jwt'; import { httpGet } from '../../lib/http'; import { COURSE_PURCHASE_PARAM } from '../../lib/jwt'; import { GoogleIcon } from '../ReactIcons/GoogleIcon.tsx'; import { Spinner } from '../ReactIcons/Spinner.tsx'; import { CHECKOUT_AFTER_LOGIN_KEY } from './CourseLoginPopup.tsx'; import { triggerUtmRegistration, urlToId, getLastPath } from '../../lib/browser.ts'; import { cn } from '../../lib/classname.ts'; type GoogleButtonProps = { isDisabled?: boolean; setIsDisabled?: (isDisabled: boolean) => void; className?: string; }; const GOOGLE_REDIRECT_AT = 'googleRedirectAt'; const GOOGLE_LAST_PAGE = 'googleLastPage'; export function GoogleButton(props: GoogleButtonProps) { const { isDisabled, setIsDisabled, className } = props; const [isLoading, setIsLoading] = useState(false); const [error, setError] = useState(''); useEffect(() => { const urlParams = new URLSearchParams(window.location.search); const code = urlParams.get('code'); const state = urlParams.get('state'); const provider = urlParams.get('provider'); if (!code || !state || provider !== 'google') { return; } setIsLoading(true); setIsDisabled?.(true); const lastPageBeforeGoogle = localStorage.getItem(GOOGLE_LAST_PAGE); httpGet<{ token: string; isNewUser: boolean }>( `${import.meta.env.PUBLIC_API_URL}/v1-google-callback${ window.location.search }&src=${urlToId(lastPageBeforeGoogle || getLastPath() || window.location.pathname)}`, ) .then(({ response, error }) => { if (!response?.token) { setError(error?.message || 'Something went wrong.'); setIsLoading(false); setIsDisabled?.(false); return; } triggerUtmRegistration(); let redirectUrl = new URL('/', window.location.origin); const googleRedirectAt = localStorage.getItem(GOOGLE_REDIRECT_AT); // If the social redirect is there and less than 30 seconds old // redirect to the page that user was on before they clicked the github login button if (googleRedirectAt && lastPageBeforeGoogle) { const socialRedirectAtTime = parseInt(googleRedirectAt, 10); const now = Date.now(); const timeSinceRedirect = now - socialRedirectAtTime; if (timeSinceRedirect < 30 * 1000) { redirectUrl = new URL(lastPageBeforeGoogle, window.location.origin); } } const authRedirectUrl = localStorage.getItem('authRedirect'); if (authRedirectUrl) { localStorage.removeItem('authRedirect'); redirectUrl = new URL(authRedirectUrl, window.location.origin); } redirectUrl.searchParams.set( FIRST_LOGIN_PARAM, response?.isNewUser ? '1' : '0', ); const shouldTriggerPurchase = localStorage.getItem(CHECKOUT_AFTER_LOGIN_KEY) !== '0'; if ( redirectUrl.pathname.includes('/courses/sql') && shouldTriggerPurchase ) { redirectUrl.searchParams.set(COURSE_PURCHASE_PARAM, '1'); localStorage.removeItem(CHECKOUT_AFTER_LOGIN_KEY); } localStorage.removeItem(GOOGLE_REDIRECT_AT); localStorage.removeItem(GOOGLE_LAST_PAGE); setAuthToken(response.token); window.location.href = redirectUrl.toString(); }) .catch((err) => { setError('Something went wrong. Please try again later.'); setIsLoading(false); setIsDisabled?.(false); }); }, []); const handleClick = () => { setIsLoading(true); setIsDisabled?.(true); httpGet<{ loginUrl: string }>( `${import.meta.env.PUBLIC_API_URL}/v1-google-login`, ) .then(({ response, error }) => { if (!response?.loginUrl) { setError(error?.message || 'Something went wrong.'); setIsLoading(false); setIsDisabled?.(false); return; } // For non authentication pages, we want to redirect back to the page // the user was on before they clicked the social login button if (!['/login', '/signup'].includes(window.location.pathname)) { const pagePath = [ '/respond-invite', '/befriend', '/r', '/ai-roadmaps', ].includes(window.location.pathname) ? window.location.pathname + window.location.search : window.location.pathname; localStorage.setItem(GOOGLE_REDIRECT_AT, Date.now().toString()); localStorage.setItem(GOOGLE_LAST_PAGE, pagePath); } window.location.href = response.loginUrl; }) .catch((err) => { setError('Something went wrong. Please try again later.'); setIsLoading(false); setIsDisabled?.(false); }); }; return ( <> {error && (

{error}

)} ); } ================================================ FILE: src/components/AuthenticationFlow/LinkedInButton.tsx ================================================ import { useEffect, useState } from 'react'; import { FIRST_LOGIN_PARAM, COURSE_PURCHASE_PARAM, setAuthToken, } from '../../lib/jwt'; import { cn } from '../../lib/classname.ts'; import { httpGet } from '../../lib/http'; import { LinkedInIcon } from '../ReactIcons/LinkedInIcon.tsx'; import { Spinner } from '../ReactIcons/Spinner.tsx'; import { CHECKOUT_AFTER_LOGIN_KEY } from './CourseLoginPopup.tsx'; import { getLastPath, triggerUtmRegistration, urlToId } from '../../lib/browser.ts'; type LinkedInButtonProps = { isDisabled?: boolean; setIsDisabled?: (isDisabled: boolean) => void; className?: string; }; const LINKEDIN_REDIRECT_AT = 'linkedInRedirectAt'; const LINKEDIN_LAST_PAGE = 'linkedInLastPage'; export function LinkedInButton(props: LinkedInButtonProps) { const { isDisabled, setIsDisabled, className } = props; const [isLoading, setIsLoading] = useState(false); const [error, setError] = useState(''); useEffect(() => { const urlParams = new URLSearchParams(window.location.search); const code = urlParams.get('code'); const state = urlParams.get('state'); const provider = urlParams.get('provider'); if (!code || !state || provider !== 'linkedin') { return; } setIsLoading(true); setIsDisabled?.(true); const lastPageBeforeLinkedIn = localStorage.getItem(LINKEDIN_LAST_PAGE); httpGet<{ token: string; isNewUser: boolean }>( `${import.meta.env.PUBLIC_API_URL}/v1-linkedin-callback${ window.location.search }&src=${urlToId(lastPageBeforeLinkedIn || getLastPath() || window.location.pathname)}`, ) .then(({ response, error }) => { if (!response?.token) { setError(error?.message || 'Something went wrong.'); setIsLoading(false); setIsDisabled?.(false); return; } triggerUtmRegistration(); let redirectUrl = new URL('/', window.location.origin); const linkedInRedirectAt = localStorage.getItem(LINKEDIN_REDIRECT_AT); // If the social redirect is there and less than 30 seconds old // redirect to the page that user was on before they clicked the github login button if (linkedInRedirectAt && lastPageBeforeLinkedIn) { const socialRedirectAtTime = parseInt(linkedInRedirectAt, 10); const now = Date.now(); const timeSinceRedirect = now - socialRedirectAtTime; if (timeSinceRedirect < 30 * 1000) { redirectUrl = new URL( lastPageBeforeLinkedIn, window.location.origin, ); } } const authRedirectUrl = localStorage.getItem('authRedirect'); if (authRedirectUrl) { localStorage.removeItem('authRedirect'); redirectUrl = new URL(authRedirectUrl, window.location.origin); } redirectUrl.searchParams.set( FIRST_LOGIN_PARAM, response?.isNewUser ? '1' : '0', ); const shouldTriggerPurchase = localStorage.getItem(CHECKOUT_AFTER_LOGIN_KEY) !== '0'; if ( redirectUrl.pathname.includes('/courses/sql') && shouldTriggerPurchase ) { redirectUrl.searchParams.set(COURSE_PURCHASE_PARAM, '1'); localStorage.removeItem(CHECKOUT_AFTER_LOGIN_KEY); } localStorage.removeItem(LINKEDIN_REDIRECT_AT); localStorage.removeItem(LINKEDIN_LAST_PAGE); setAuthToken(response.token); window.location.href = redirectUrl.toString(); }) .catch((err) => { setError('Something went wrong. Please try again later.'); setIsLoading(false); setIsDisabled?.(false); }); }, []); const handleClick = () => { setIsLoading(true); setIsDisabled?.(true); httpGet<{ loginUrl: string }>( `${import.meta.env.PUBLIC_API_URL}/v1-linkedin-login`, ) .then(({ response, error }) => { if (!response?.loginUrl) { setError(error?.message || 'Something went wrong.'); setIsLoading(false); setIsDisabled?.(false); return; } // For non authentication pages, we want to redirect back to the page // the user was on before they clicked the social login button if (!['/login', '/signup'].includes(window.location.pathname)) { const pagePath = [ '/respond-invite', '/befriend', '/r', '/ai-roadmaps', ].includes(window.location.pathname) ? window.location.pathname + window.location.search : window.location.pathname; localStorage.setItem(LINKEDIN_REDIRECT_AT, Date.now().toString()); localStorage.setItem(LINKEDIN_LAST_PAGE, pagePath); } window.location.href = response.loginUrl; }) .catch((err) => { setError('Something went wrong. Please try again later.'); setIsLoading(false); setIsDisabled?.(false); }); }; return ( <> {error && (

{error}

)} ); } ================================================ FILE: src/components/AuthenticationFlow/LoginPopup.astro ================================================ --- import Popup from '../Popup/Popup.astro'; import { AccountTerms } from '../AccountTerms'; import { AuthenticationForm } from './AuthenticationForm'; ---

Login or Signup

You must be logged in to perform this action.

Don't have an account?{' '} Sign up
================================================ FILE: src/components/AuthenticationFlow/ResetPasswordForm.tsx ================================================ import { type FormEvent, useEffect, useState } from 'react'; import { httpPost } from '../../lib/http'; import Cookies from 'js-cookie'; import { TOKEN_COOKIE_NAME, setAuthToken } from '../../lib/jwt'; export function ResetPasswordForm() { const [code, setCode] = useState(''); const [password, setPassword] = useState(''); const [passwordConfirm, setPasswordConfirm] = useState(''); const [isLoading, setIsLoading] = useState(false); const [error, setError] = useState(''); useEffect(() => { const urlParams = new URLSearchParams(window.location.search); const code = urlParams.get('code'); if (!code) { window.location.href = '/login'; } else { setCode(code); } }, []); const handleSubmit = async (e: FormEvent) => { e.preventDefault(); setIsLoading(true); if (password !== passwordConfirm) { setIsLoading(false); setError('Passwords do not match.'); return; } const { response, error } = await httpPost( `${import.meta.env.PUBLIC_API_URL}/v1-reset-forgotten-password`, { newPassword: password, confirmPassword: passwordConfirm, code, }, ); if (error?.message) { setIsLoading(false); setError(error.message); return; } if (!response?.token) { setIsLoading(false); setError('Something went wrong. Please try again later.'); return; } const token = response.token; setAuthToken(response.token); window.location.href = '/'; }; return (
setPassword((e.target as HTMLInputElement).value)} /> setPasswordConfirm((e.target as HTMLInputElement).value) } /> {error && (

{error}

)}
); } ================================================ FILE: src/components/AuthenticationFlow/TriggerVerifyAccount.tsx ================================================ import { useEffect, useState } from 'react'; import Cookies from 'js-cookie'; import { httpPost } from '../../lib/http'; import { FIRST_LOGIN_PARAM, TOKEN_COOKIE_NAME, setAuthToken, } from '../../lib/jwt'; import { Spinner } from '../ReactIcons/Spinner'; import { ErrorIcon2 } from '../ReactIcons/ErrorIcon2'; import { triggerUtmRegistration } from '../../lib/browser.ts'; export function TriggerVerifyAccount() { const [isLoading, setIsLoading] = useState(true); const [error, setError] = useState(''); const triggerVerify = (code: string) => { setIsLoading(true); httpPost<{ token: string; isNewUser: boolean }>( `${import.meta.env.PUBLIC_API_URL}/v1-verify-account`, { code, }, ) .then(({ response, error }) => { if (!response?.token) { setError(error?.message || 'Something went wrong. Please try again.'); setIsLoading(false); return; } triggerUtmRegistration(); setAuthToken(response.token); const url = new URL('/', window.location.origin); url.searchParams.set( FIRST_LOGIN_PARAM, response?.isNewUser ? '1' : '0', ); window.location.href = url.toString(); }) .catch((err) => { setIsLoading(false); setError('Something went wrong. Please try again.'); }); }; useEffect(() => { const urlParams = new URLSearchParams(window.location.search); const code = urlParams.get('code')!; if (!code) { setIsLoading(false); setError('Something went wrong. Please try again later.'); return; } triggerVerify(code); }, []); return (
{isLoading && } {error && }

Verifying your account

{isLoading &&

Please wait while we verify your account..

} {error &&

{error}

}
); } ================================================ FILE: src/components/AuthenticationFlow/TriggerVerifyEmail.tsx ================================================ import { useEffect, useState } from 'react'; import { httpPatch } from '../../lib/http'; import { setAuthToken } from '../../lib/jwt'; import { Spinner } from '../ReactIcons/Spinner'; import { ErrorIcon2 } from '../ReactIcons/ErrorIcon2'; import { getUrlParams } from '../../lib/browser'; import { CheckIcon } from '../ReactIcons/CheckIcon'; export function TriggerVerifyEmail() { const { code } = getUrlParams() as { code: string }; // const [isLoading, setIsLoading] = useState(true); const [status, setStatus] = useState<'loading' | 'error' | 'success'>( 'loading', ); const [error, setError] = useState(''); const triggerVerify = (code: string) => { setStatus('loading'); httpPatch<{ token: string }>( `${import.meta.env.PUBLIC_API_URL}/v1-verify-new-email/${code}`, {}, ) .then(({ response, error }) => { if (!response?.token) { setError(error?.message || 'Something went wrong. Please try again.'); setStatus('error'); return; } setAuthToken(response.token); setStatus('success'); }) .catch((err) => { setStatus('error'); setError('Something went wrong. Please try again.'); }); }; useEffect(() => { if (!code) { setStatus('error'); setError('Something went wrong. Please try again later.'); return; } triggerVerify(code); }, [code]); const isLoading = status === 'loading'; if (status === 'success') { return (

Email Update Successful

Your email has been changed successfully. Happy learning!

); } return (
{isLoading && } {error && }

Verifying your new Email

{isLoading &&

Please wait while we verify your new Email.

} {error &&

{error}

}
); } ================================================ FILE: src/components/AuthenticationFlow/VerificationEmailMessage.tsx ================================================ import { useEffect, useState } from 'react'; import { httpPost } from '../../lib/http'; import { VerifyLetterIcon } from '../ReactIcons/VerifyLetterIcon'; export function VerificationEmailMessage() { const [email, setEmail] = useState('..'); const [error, setError] = useState(''); const [isLoading, setIsLoading] = useState(false); const [isEmailResent, setIsEmailResent] = useState(false); useEffect(() => { const urlParams = new URLSearchParams(window.location.search); setEmail(urlParams.get('email')!); }, []); const resendVerificationEmail = () => { httpPost(`${import.meta.env.PUBLIC_API_URL}/v1-send-verification-email`, { email, }) .then(({ response, error }) => { if (error) { setIsEmailResent(false); setError(error?.message || 'Something went wrong.'); setIsLoading(false); return; } setIsEmailResent(true); }) .catch(() => { setIsEmailResent(false); setIsLoading(false); setError('Something went wrong. Please try again later.'); }); }; return (

Verify your email address

We have sent you an email at{' '} {email}. Please click the link to verify your account. This link will expire shortly, so please verify soon!


{!isEmailResent && ( <> {isLoading &&

Sending the email ..

} {!isLoading && !error && (

Please make sure to check your spam folder. If you still don't have the email click to{' '}

)} {error &&

{error}

} )} {isEmailResent && (

Verification email has been sent!

)}
); } ================================================ FILE: src/components/Authenticator/Authenticator.astro ================================================ --- --- ================================================ FILE: src/components/Authenticator/authenticator.ts ================================================ import Cookies from 'js-cookie'; import { TOKEN_COOKIE_NAME } from '../../lib/jwt'; import { REDIRECT_PAGE_AFTER_AUTH } from '../../lib/auth'; function easeInElement(el: Element) { el.classList.add('opacity-0', 'transition-opacity', 'duration-300'); el.classList.remove('hidden', 'hidden!'); setTimeout(() => { el.classList.remove('opacity-0'); }); } function showHideAuthElements(hideOrShow: 'hide' | 'show' = 'hide') { document.querySelectorAll('[data-auth-required]').forEach((el) => { if (hideOrShow === 'hide') { el.classList.add('hidden'); } else { easeInElement(el); } }); } function showHideGuestElements(hideOrShow: 'hide' | 'show' = 'hide') { document.querySelectorAll('[data-guest-required]').forEach((el) => { if (hideOrShow === 'hide') { el.classList.add('hidden'); } else { easeInElement(el); } }); } // Prepares the UI for the user who is logged in function handleGuest() { const authenticatedRoutes = [ '/account/update-profile', '/account/notification', '/account/update-password', '/account/settings', '/account/roadmaps', '/account/road-card', '/account/friends', '/account', '/team', '/team/progress', '/team/activity', '/team/roadmaps', '/team/new', '/team/members', '/team/member', '/team/settings', '/dashboard', ]; showHideAuthElements('hide'); showHideGuestElements('show'); // If the user is on an authenticated route, redirect them to the home page if (authenticatedRoutes.includes(window.location.pathname)) { localStorage.setItem(REDIRECT_PAGE_AFTER_AUTH, window.location.pathname); window.location.href = '/login'; } } // Prepares the UI for the user who is logged out function handleAuthenticated() { const guestRoutes = [ '/login', '/signup', '/verify-account', '/verification-pending', '/reset-password', '/forgot-password', ]; showHideGuestElements('hide'); showHideAuthElements('show'); // If the user is on a guest route, redirect them to the home page if (guestRoutes.includes(window.location.pathname)) { const authRedirect = window.localStorage.getItem('authRedirect') || '/'; window.localStorage.removeItem('authRedirect'); window.location.href = authRedirect; } } export function handleAuthRequired() { const token = Cookies.get(TOKEN_COOKIE_NAME); if (token) { const pageAfterAuth = localStorage.getItem(REDIRECT_PAGE_AFTER_AUTH); if (pageAfterAuth) { localStorage.removeItem(REDIRECT_PAGE_AFTER_AUTH); window.location.href = pageAfterAuth; return; } handleAuthenticated(); } else { handleGuest(); } } window.setTimeout(() => { handleAuthRequired(); }, 0); ================================================ FILE: src/components/Badge.tsx ================================================ type BadgeProps = { variant: 'blue' | 'green' | 'red' | 'yellow' | 'grey' | 'white'; text: string; }; export function Badge(type: BadgeProps) { const { variant, text } = type; const colors = { blue: 'bg-blue-100 text-blue-700 border-blue-200', green: 'bg-green-100 text-green-700 border-green-200', red: 'bg-red-100 text-red-700 border-red-200', yellow: 'bg-yellow-100 text-yellow-700 border-yellow-200', grey: 'bg-gray-100 text-gray-700 border-gray-200', white: 'bg-white text-black border-gray-200', teal: 'bg-teal-100 text-teal-700 border-teal-200', black: 'bg-gray-500 text-white border-gray-500', }; return ( {text} ); } ================================================ FILE: src/components/Befriend.tsx ================================================ import { useEffect, useState } from 'react'; import { httpDelete, httpGet, httpPost } from '../lib/http'; import { pageProgressMessage } from '../stores/page'; import { isLoggedIn } from '../lib/jwt'; import { showLoginPopup } from '../lib/popup'; import { getUrlParams } from '../lib/browser'; import { CheckIcon } from './ReactIcons/CheckIcon'; import { DeleteUserIcon } from './ReactIcons/DeleteUserIcon'; import { useToast } from '../hooks/use-toast'; import { useAuth } from '../hooks/use-auth'; import { AddedUserIcon } from './ReactIcons/AddedUserIcon'; import { StopIcon } from './ReactIcons/StopIcon'; import { ErrorIcon } from './ReactIcons/ErrorIcon'; export type FriendshipStatus = | 'none' | 'sent' | 'received' | 'accepted' | 'rejected' | 'got_rejected'; type UserResponse = { id: string; links: Record; avatar: string; name: string; status: FriendshipStatus; }; export function Befriend() { const { u: inviteId } = getUrlParams(); const toast = useToast(); const currentUser = useAuth(); const [isConfirming, setIsConfirming] = useState(false); const [isLoading, setIsLoading] = useState(true); const [error, setError] = useState(''); const [user, setUser] = useState(); const isAuthenticated = isLoggedIn(); async function loadUser(userId: string) { const { response, error } = await httpGet( `${import.meta.env.PUBLIC_API_URL}/v1-get-friend/${userId}` ); if (error || !response) { setError(error?.message || 'Something went wrong'); return; } if (response.status === 'accepted') { window.location.href = '/account/friends?c=fa'; return; } setUser(response); } useEffect(() => { if (inviteId) { loadUser(inviteId).finally(() => { pageProgressMessage.set(''); setIsLoading(false); }); } else { setIsLoading(false); setError('Missing invite ID in URL'); pageProgressMessage.set(''); } }, [inviteId]); async function addFriend(userId: string, successMessage: string) { pageProgressMessage.set('Please wait...'); setError(''); const { response, error } = await httpPost( `${import.meta.env.PUBLIC_API_URL}/v1-add-friend/${userId}`, {} ); if (error || !response) { setError(error?.message || 'Something went wrong'); return; } if (response.status === 'accepted') { window.location.href = '/account/friends?c=fa'; return; } setUser(response); } async function deleteFriend(userId: string, successMessage: string) { pageProgressMessage.set('Please wait...'); setError(''); const { response, error } = await httpDelete( `${import.meta.env.PUBLIC_API_URL}/v1-delete-friend/${userId}`, {} ); if (error || !response) { setError(error?.message || 'Something went wrong'); return; } setUser(response); toast.success(successMessage); } if (isLoading) { return null; } if (!user) { return (

Error

{error || 'There was a problem, please try again.'}

); } const userAvatar = user.avatar ? `${import.meta.env.PUBLIC_AVATAR_BASE_URL}/${user.avatar}` : '/img/default-avatar.png'; const isMe = currentUser?.id === user.id; return (
{'join

{user.name}

After you add {user.name} as a friend, you will be able to view each other's skills and progress.

{user.status === 'none' && ( )} {user.status === 'sent' && ( <> Request Sent {!isConfirming && ( )} {isConfirming && ( Are you sure?{' '} {' '} )} )} {user.status === 'accepted' && ( <> You are friends {!isConfirming && ( )} {isConfirming && ( Are you sure?{' '} {' '} )} )} {user.status === 'rejected' && ( <> Request Rejected Changed your mind?{' '} )} {user.status === 'got_rejected' && ( <> Request Rejected )} {user.status === 'received' && ( <> {!isConfirming && ( )} {isConfirming && ( Are you sure?{' '} {' '} )} )}
{error && (

{error}

)}
); } ================================================ FILE: src/components/BestPracticeHeader.astro ================================================ --- import Icon from './AstroIcon.astro'; import LoginPopup from './AuthenticationFlow/LoginPopup.astro'; import BestPracticeHint from './BestPracticeHint.astro'; import { MarkFavorite } from './FeaturedItems/MarkFavorite'; import ProgressHelpPopup from './ProgressHelpPopup.astro'; export interface Props { title: string; description: string; bestPracticeId: string; isUpcoming?: boolean; } const { title, description, bestPracticeId, isUpcoming = false } = Astro.props; const isBestPracticeReady = !isUpcoming; ---

{title}

{description}

{ isBestPracticeReady && ( ) } { isBestPracticeReady && ( ) }
{ isBestPracticeReady && ( Suggest ) }
================================================ FILE: src/components/BestPracticeHint.astro ================================================ --- import ResourceProgressStats from './ResourceProgressStats.astro'; export interface Props { bestPracticeId: string; } const { bestPracticeId } = Astro.props; ---
================================================ FILE: src/components/Billing/BillingPage.tsx ================================================ import { useEffect, useState } from 'react'; import { pageProgressMessage } from '../../stores/page'; import { useToast } from '../../hooks/use-toast'; import { useMutation, useQuery } from '@tanstack/react-query'; import { billingDetailsOptions, USER_SUBSCRIPTION_PLAN_PRICES, } from '../../queries/billing'; import { queryClient } from '../../stores/query-client'; import { httpPost } from '../../lib/query-http'; import { UpgradeAccountModal } from './UpgradeAccountModal'; import { getUrlParams } from '../../lib/browser'; import { VerifyUpgrade } from './VerifyUpgrade'; import { EmptyBillingScreen } from './EmptyBillingScreen'; import { Calendar, RefreshCw, Loader2, CreditCard, ArrowRightLeft, CircleX, AlertCircle, } from 'lucide-react'; import { BillingWarning } from './BillingWarning'; import { cn } from '../../lib/classname'; export type CreateCustomerPortalBody = {}; export type CreateCustomerPortalResponse = { url: string; }; export function BillingPage() { const toast = useToast(); const [showUpgradeModal, setShowUpgradeModal] = useState(false); const [showVerifyUpgradeModal, setShowVerifyUpgradeModal] = useState(false); const { data: billingDetails, isPending: isLoadingBillingDetails } = useQuery( billingDetailsOptions(), queryClient, ); const willBeCanceled = billingDetails?.cancelAtPeriodEnd; const isCanceled = billingDetails?.status === 'canceled'; const isPastDue = billingDetails?.status === 'past_due'; const isIncomplete = billingDetails?.status === 'incomplete'; const isIncompleteExpired = billingDetails?.status === 'incomplete_expired'; const { mutate: createCustomerPortal, isSuccess: isCreatingCustomerPortalSuccess, isPending: isCreatingCustomerPortal, } = useMutation( { mutationFn: (body: CreateCustomerPortalBody) => { return httpPost( '/v1-create-customer-portal', body, ); }, onSuccess: (data) => { window.location.href = data.url; }, onError: (error) => { console.error(error); toast.error(error?.message || 'Failed to Create Customer Portal'); }, }, queryClient, ); useEffect(() => { if (isLoadingBillingDetails) { return; } pageProgressMessage.set(''); const shouldVerifyUpgrade = getUrlParams()?.s === '1'; if (shouldVerifyUpgrade) { setShowVerifyUpgradeModal(true); } }, [isLoadingBillingDetails]); if (isLoadingBillingDetails || !billingDetails) { return null; } const selectedPlanDetails = USER_SUBSCRIPTION_PLAN_PRICES.find( (plan) => plan.priceId === billingDetails?.priceId, ); const priceDetails = selectedPlanDetails; const formattedNextBillDate = new Date( billingDetails?.currentPeriodEnd || '', ).toLocaleDateString('en-US', { year: 'numeric', month: 'long', day: 'numeric', }); const modals = ( <> {showUpgradeModal && ( { setShowUpgradeModal(false); }} /> )} {showVerifyUpgradeModal && } ); if (billingDetails?.status === 'none' || isIncompleteExpired) { return ( <> {modals} setShowUpgradeModal(true)} /> ); } if (isCanceled) { return ( <> {modals} { if (willBeCanceled) { createCustomerPortal({}); } else { setShowUpgradeModal(true); } }} isLoading={ isCreatingCustomerPortal || isCreatingCustomerPortalSuccess } /> setShowUpgradeModal(true)} /> ); } if (isIncomplete) { return ( <> {modals} { createCustomerPortal({}); }} isLoading={ isCreatingCustomerPortal || isCreatingCustomerPortalSuccess } /> setShowUpgradeModal(true)} /> ); } if (!priceDetails) { return (

Uh oh!

We couldn't find your subscription details. Please contact support at info@roadmap.sh .

); } return ( <> {modals}
{isPastDue && ( { createCustomerPortal({}); }} isLoading={ isCreatingCustomerPortal || isCreatingCustomerPortalSuccess } /> )} {willBeCanceled && ( { createCustomerPortal({}); }} isLoading={ isCreatingCustomerPortal || isCreatingCustomerPortalSuccess } /> )}

Current Subscription

Thank you for being a pro member. Your plan details are below.

Payment

${priceDetails.amount} / {priceDetails.interval}

{willBeCanceled ? 'Expires On' : 'Renews On'}

{formattedNextBillDate}

{!willBeCanceled && ( )}
); } ================================================ FILE: src/components/Billing/BillingWarning.tsx ================================================ import { AlertTriangle, type LucideIcon } from 'lucide-react'; export type BillingWarningProps = { icon?: LucideIcon; message: string; onButtonClick?: () => void; buttonText?: string; isLoading?: boolean; }; export function BillingWarning(props: BillingWarningProps) { const { message, onButtonClick, buttonText, isLoading, icon: Icon = AlertTriangle, } = props; return (
{message} {buttonText && ( )}
); } ================================================ FILE: src/components/Billing/CheckSubscriptionVerification.tsx ================================================ import { useEffect, useState } from 'react'; import { getUrlParams } from '../../lib/browser'; import { VerifyUpgrade } from "./VerifyUpgrade"; export function CheckSubscriptionVerification() { const [shouldVerifyUpgrade, setShouldVerifyUpgrade] = useState(false); useEffect(() => { const params = getUrlParams(); if (params.s !== '1') { return; } setShouldVerifyUpgrade(true); }, []); if (!shouldVerifyUpgrade) { return null; } return ; } ================================================ FILE: src/components/Billing/EmptyBillingScreen.tsx ================================================ import { CreditCard, Ellipsis, HeartHandshake, MessageCircleIcon, SparklesIcon, Zap, } from 'lucide-react'; type EmptyBillingScreenProps = { onUpgrade: () => void; }; const perks = [ { icon: Zap, text: 'Unlimited AI course generations', }, { icon: MessageCircleIcon, text: 'Unlimited AI Chat feature usage', }, { icon: SparklesIcon, text: 'Early access to new features', }, { icon: HeartHandshake, text: 'Support the development of platform', }, { icon: Ellipsis, text: 'more perks coming soon!', }, ]; export function EmptyBillingScreen(props: EmptyBillingScreenProps) { const { onUpgrade } = props; return (

No Active Subscription

Unlock pro benefits by upgrading to a subscription

{perks.map((perk) => (

{perk.text}

))}
); } ================================================ FILE: src/components/Billing/GlobalUpgradeModal.tsx ================================================ import { useStore } from '@nanostores/react'; import { hideUpgradeModal, isUpgradeModalOpen, } from '../../stores/subscription'; import { UpgradeAccountModal } from './UpgradeAccountModal'; export function GlobalUpgradeModal() { const isOpen = useStore(isUpgradeModalOpen); if (!isOpen) { return null; } return ; } ================================================ FILE: src/components/Billing/UpdatePlanConfirmation.tsx ================================================ import { useMutation } from '@tanstack/react-query'; import type { USER_SUBSCRIPTION_PLAN_PRICES } from '../../queries/billing'; import { Modal } from '../Modal'; import { queryClient } from '../../stores/query-client'; import { useToast } from '../../hooks/use-toast'; import { VerifyUpgrade } from './VerifyUpgrade'; import { Loader2Icon } from 'lucide-react'; import { httpPost } from '../../lib/query-http'; type UpdatePlanBody = { priceId: string; }; type UpdatePlanResponse = { status: 'ok'; }; type UpdatePlanConfirmationProps = { planDetails: (typeof USER_SUBSCRIPTION_PLAN_PRICES)[number]; onClose: () => void; onCancel: () => void; }; export function UpdatePlanConfirmation(props: UpdatePlanConfirmationProps) { const { planDetails, onClose, onCancel } = props; const toast = useToast(); const { mutate: updatePlan, isPending, status, } = useMutation( { mutationFn: (body: UpdatePlanBody) => { return httpPost( '/v1-update-subscription-plan', body, ); }, onError: (error) => { console.error(error); toast.error(error?.message || 'Failed to Create Customer Portal'); }, }, queryClient, ); if (!planDetails) { return null; } const selectedPrice = planDetails; if (status === 'success') { return ; } return ( {} : onClose} bodyClassName="rounded-xl bg-white p-6" >

Subscription Update

Your plan will be updated to the{' '} {planDetails.interval} plan, and will be charged{' '} ${selectedPrice.amount}/{selectedPrice.interval} .

); } ================================================ FILE: src/components/Billing/UpgradeAccountModal.tsx ================================================ import { useMutation, useQuery } from '@tanstack/react-query'; import type { LucideIcon } from 'lucide-react'; import { Archive, Crown, Loader2, Map, MessageCircleIcon, X, Zap, } from 'lucide-react'; import { useEffect, useState } from 'react'; import { useToast } from '../../hooks/use-toast'; import { getUser } from '../../lib/jwt'; import { httpPost } from '../../lib/query-http'; import { billingDetailsOptions, USER_SUBSCRIPTION_PLAN_PRICES, type AllowedSubscriptionInterval, } from '../../queries/billing'; import { queryClient } from '../../stores/query-client'; import { Modal } from '../Modal'; import { UpdatePlanConfirmation } from './UpdatePlanConfirmation'; type Perk = { icon: LucideIcon; title: string; description: string; highlight?: boolean; }; const PREMIUM_PERKS: Perk[] = [ { icon: Zap, title: 'Unlimited Courses and Guides', description: 'No limits on number of courses, guides, and quizzes', highlight: true, }, { icon: MessageCircleIcon, title: 'Extended Chat Limits', description: 'Chat with AI Tutor and Roadmaps without limits', }, { icon: Archive, title: 'Chat History', description: 'Access your AI Tutor and roadmap chats later', }, { icon: Map, title: 'Custom Roadmaps', description: 'Create upto 100 custom roadmaps', }, ]; type CreateSubscriptionCheckoutSessionBody = { priceId: string; success?: string; cancel?: string; }; type CreateSubscriptionCheckoutSessionResponse = { checkoutUrl: string; }; type UpgradeAccountModalProps = { onClose: () => void; success?: string; cancel?: string; }; export function UpgradeAccountModal(props: UpgradeAccountModalProps) { const { onClose, success, cancel } = props; const [selectedPlan, setSelectedPlan] = useState('year'); const [isUpdatingPlan, setIsUpdatingPlan] = useState(false); const user = getUser(); const { data: userBillingDetails, isLoading, error: billingError, } = useQuery(billingDetailsOptions(), queryClient); const toast = useToast(); const { mutate: createCheckoutSession, isPending: isCreatingCheckoutSession, } = useMutation( { mutationFn: (body: CreateSubscriptionCheckoutSessionBody) => { return httpPost( '/v1-create-subscription-checkout-session', body, ); }, onSuccess: (data) => { window.location.href = data.checkoutUrl; }, onError: (error) => { console.error(error); toast.error(error?.message || 'Failed to create checkout session'); }, }, queryClient, ); const isCanceled = ['canceled', 'incomplete_expired'].includes( userBillingDetails?.status || '', ); const selectedPlanDetails = USER_SUBSCRIPTION_PLAN_PRICES.find( (plan) => plan.interval === selectedPlan, ); const currentPlanPriceId = isCanceled ? null : userBillingDetails?.priceId; const currentPlan = USER_SUBSCRIPTION_PLAN_PRICES.find( (plan) => plan.priceId === currentPlanPriceId, ); const monthlyPlan = USER_SUBSCRIPTION_PLAN_PRICES.find( (p) => p.interval === 'month', ); const yearlyPlan = USER_SUBSCRIPTION_PLAN_PRICES.find( (p) => p.interval === 'year', ); useEffect(() => { if (!currentPlan) { return; } setSelectedPlan(currentPlan.interval); }, [currentPlan]); useEffect(() => { window?.fireEvent({ action: 'tutor_pricing', category: 'ai_tutor', label: 'Clicked Upgrade to Pro', }); }, []); if (!user) { return null; } if (isLoading) { return (
); } if (billingError) { return (

Error

{billingError?.message || 'An error occurred while loading billing details.'}

); } if (isUpdatingPlan && selectedPlanDetails) { return ( setIsUpdatingPlan(false)} onCancel={() => setIsUpdatingPlan(false)} /> ); } const handlePlanSelect = (plan: typeof selectedPlanDetails) => { if (!plan) return; setSelectedPlan(plan.interval); if (!currentPlanPriceId) { const currentUrlPath = window.location.pathname; const encodedCurrentUrlPath = encodeURIComponent(currentUrlPath); const successPage = `/thank-you?next=${encodedCurrentUrlPath}&s=1`; window?.fireEvent({ action: 'tutor_checkout', category: 'ai_tutor', label: 'Checkout Started', }); createCheckoutSession( { priceId: plan.priceId, success: success || successPage, cancel: cancel || `${currentUrlPath}?s=0`, }, { onSuccess: () => { window?.fireEvent({ action: `tutor_checkout_${plan.interval === 'month' ? 'mo' : 'an'}`, category: 'ai_tutor', label: `${plan.interval} Plan Checkout Started`, }); }, }, ); return; } setIsUpdatingPlan(true); }; return (
{/* Close button */} {/* Header */}

Upgrade to Premium

Unlock all features and supercharge your learning

{/* Features List */}
{PREMIUM_PERKS.map((perk, index) => { const Icon = perk.icon; return (

{perk.title}

{perk.description}

); })}
{/* Buttons */}
{/* Yearly Button */} {yearlyPlan && ( )} {/* Monthly Button */} {monthlyPlan && ( )}
{/* Trust indicators */}

By upgrading you agree to our{' '} terms and conditions

); } ================================================ FILE: src/components/Billing/VerifyUpgrade.tsx ================================================ import { useEffect } from 'react'; import { Loader2, CheckCircle } from 'lucide-react'; import { useQuery } from '@tanstack/react-query'; import { billingDetailsOptions } from '../../queries/billing'; import { queryClient } from '../../stores/query-client'; import { Modal } from '../Modal'; import { deleteUrlParam } from '../../lib/browser'; type VerifyUpgradeProps = { newPriceId?: string; }; export function VerifyUpgrade(props: VerifyUpgradeProps) { const { newPriceId } = props; const { data: userBillingDetails } = useQuery( { ...billingDetailsOptions(), refetchInterval: 1000, }, queryClient, ); useEffect(() => { if (!userBillingDetails) { return; } if ( userBillingDetails.status === 'active' && (newPriceId ? userBillingDetails.priceId === newPriceId : true) ) { if (!newPriceId) { // it means that the user is subscribing for the first time // not changing the plan window?.fireEvent({ action: `tutor_purchase_${userBillingDetails.interval === 'month' ? 'mo' : 'an'}`, category: 'ai_tutor', label: `${userBillingDetails.interval} Plan Purchased`, }); } deleteUrlParam('s'); window.location.reload(); } }, [userBillingDetails]); useEffect(() => { // it means that the user is changing the plan // not subscribing for the first time if (newPriceId) { return; } window?.fireEvent({ action: 'tutor_purchase', category: 'ai_tutor', label: 'Subscription Activated', }); window?.fireEvent({ action: 'tutor_ty', category: 'ai_tutor', label: 'Thank You Page Visited', }); }, [newPriceId]); return ( {}} bodyClassName="rounded-xl bg-white p-6" >

Subscription Activated

Your subscription has been activated successfully.

It might take a minute for the changes to reflect. We will{' '} reload the page for you.

Please wait...

If it takes longer than expected, please email us at{' '} info@roadmap.sh .

); } ================================================ FILE: src/components/Changelog/ChangelogItem.astro ================================================ --- import { DateTime } from 'luxon'; import ChangelogImages from '../ChangelogImages'; import type { ChangelogDocument } from '../../queries/changelog'; interface Props { changelog: ChangelogDocument; } const { changelog } = Astro.props; const formattedDate = DateTime.fromISO(changelog.createdAt).toFormat( 'dd LLL, yyyy', ); ---
{formattedDate} {changelog.title}
{ changelog.images && ( ) }
================================================ FILE: src/components/Changelog/ChangelogLaunch.astro ================================================ --- import { DateTime } from 'luxon'; const formattedDate = DateTime.fromISO('2024-09-13').toFormat('dd LLL, yyyy'); ---
{formattedDate} Changelog page is launched

Changelog page is launched

We will be sharing a selected list of updates, improvements, and fixes made to the website. Stay tuned!

================================================ FILE: src/components/ChangelogBanner.astro ================================================ --- import { listChangelog } from '../queries/changelog'; import { DateTime } from 'luxon'; import AstroIcon from './AstroIcon.astro'; const changelogs = await listChangelog({ limit: 10 }); ---

Actively Maintained

We are always improving our content, adding new resources and adding features to enhance your learning experience.

    { changelogs.map((changelog) => { const formattedDate = DateTime.fromISO( changelog.createdAt, ).toFormat('dd LLL, yyyy'); return (
  • {formattedDate}
  • ); }) }
View Full Changelog
================================================ FILE: src/components/ChangelogImages.tsx ================================================ import { ChevronLeft, ChevronRight } from 'lucide-react'; import React, { useState, useEffect, useCallback } from 'react'; import type { ChangelogImage } from '../queries/changelog'; interface ChangelogImagesProps { images: ChangelogImage[]; } const ChangelogImages: React.FC = ({ images }) => { const [enlargedImage, setEnlargedImage] = useState(null); const imageArray = images.map((image) => [image.title, image.url]); const handleImageClick = (src: string) => { setEnlargedImage(src); }; const handleCloseEnlarged = () => { setEnlargedImage(null); }; const handleNavigation = useCallback( (direction: 'prev' | 'next') => { if (!enlargedImage) return; const currentIndex = imageArray.findIndex( ([_, src]) => src === enlargedImage, ); let newIndex; if (direction === 'prev') { newIndex = currentIndex > 0 ? currentIndex - 1 : imageArray.length - 1; } else { newIndex = currentIndex < imageArray.length - 1 ? currentIndex + 1 : 0; } setEnlargedImage(imageArray[newIndex][1]); }, [enlargedImage, imageArray], ); useEffect(() => { const handleKeyDown = (event: KeyboardEvent) => { if (event.key === 'Escape') { handleCloseEnlarged(); } else if (event.key === 'ArrowLeft') { handleNavigation('prev'); } else if (event.key === 'ArrowRight') { handleNavigation('next'); } }; window.addEventListener('keydown', handleKeyDown); return () => window.removeEventListener('keydown', handleKeyDown); }, [handleNavigation]); return ( <>
{imageArray.map(([title, src]) => (
handleImageClick(src)} > {title}
{title}
))}
{enlargedImage && (
Enlarged view
)} ); }; export default ChangelogImages; ================================================ FILE: src/components/ChatEditor/ChatEditor.css ================================================ .chat-editor .tiptap p.is-editor-empty:first-child::before { color: #adb5bd; content: attr(data-placeholder); float: left; height: 0; pointer-events: none; } .chat-editor .tiptap p:first-child.is-empty::before { color: #adb5bd; content: attr(data-placeholder); float: left; height: 0; pointer-events: none; } .chat-editor .tiptap [data-type='variable'] { font-size: 12px; font-weight: 500; line-height: 1.5; padding: 2px 4px; border-radius: 8px; background-color: #f0f5ff; color: #2c5df1; } ================================================ FILE: src/components/ChatEditor/ChatEditor.tsx ================================================ import './ChatEditor.css'; import { Editor, EditorContent, useEditor, type JSONContent, } from '@tiptap/react'; import DocumentExtension from '@tiptap/extension-document'; import ParagraphExtension from '@tiptap/extension-paragraph'; import TextExtension from '@tiptap/extension-text'; import Placeholder from '@tiptap/extension-placeholder'; import { VariableExtension } from './VariableExtension/VariableExtension'; import { variableSuggestion } from './VariableExtension/VariableSuggestion'; import { queryClient } from '../../stores/query-client'; import { roadmapTreeMappingOptions } from '../../queries/roadmap-tree'; import { useQuery } from '@tanstack/react-query'; import { useEffect, type RefObject } from 'react'; import { roadmapDetailsOptions } from '../../queries/roadmap'; const extensions = [ DocumentExtension, ParagraphExtension, TextExtension, Placeholder.configure({ placeholder: 'Ask AI anything about the roadmap...', }), VariableExtension.configure({ suggestion: variableSuggestion(), }), ]; const content = '

'; type ChatEditorProps = { editorRef: RefObject; roadmapId: string; onSubmit: (content: JSONContent) => void; }; export function ChatEditor(props: ChatEditorProps) { const { roadmapId, onSubmit, editorRef } = props; const { data: roadmapTreeData } = useQuery( roadmapTreeMappingOptions(roadmapId), queryClient, ); const { data: roadmapDetailsData } = useQuery( roadmapDetailsOptions(roadmapId), queryClient, ); const editor = useEditor({ extensions, content, editorProps: { attributes: { class: 'focus:outline-none w-full px-4 py-2 min-h-[40px]', }, handleKeyDown(_, event) { if (!editor) { return false; } if (event.key === 'Enter' && !event.shiftKey) { // check if the variable suggestion list is focused // if it is, return false so the default behavior is not triggered const variableSuggestionList = document.getElementById( 'variable-suggestion-list', ); if (variableSuggestionList) { return false; } event.preventDefault(); onSubmit(editor.getJSON()); return true; } if (event.key === 'Enter' && event.shiftKey) { event.preventDefault(); editor.commands.insertContent([ { type: 'text', text: ' ' }, { type: 'paragraph' }, ]); return true; } return false; }, }, onUpdate: ({ editor }) => { editorRef.current = editor; }, onDestroy: () => { editorRef.current = null; }, }); useEffect(() => { if (!editor || !roadmapTreeData || !roadmapDetailsData) { return; } editor.storage.variable.variables = roadmapTreeData.map((mapping) => { return { id: mapping.nodeId, // to remove the title of the roadmap // and only keep the path // e.g. "Roadmap > Topic > Subtopic" -> "Topic > Subtopic" label: mapping.text.split(' > ').slice(1).join(' > '), }; }); }, [editor, roadmapTreeData, roadmapDetailsData]); return (
); } ================================================ FILE: src/components/ChatEditor/VariableExtension/VariableExtension.tsx ================================================ import { mergeAttributes, Node } from '@tiptap/core'; import { type DOMOutputSpec, Node as ProseMirrorNode } from '@tiptap/pm/model'; import { PluginKey } from '@tiptap/pm/state'; import Suggestion, { type SuggestionOptions } from '@tiptap/suggestion'; // See `addAttributes` below export interface VariableNodeAttrs { /** * The identifier for the selected item that was mentioned, stored as a `data-id` * attribute. */ id: string | null; /** * The label to be rendered by the editor as the displayed text for this mentioned * item, if provided. Stored as a `data-label` attribute. See `renderLabel`. */ label?: string | null; } export type VariableOptions< SuggestionItem = any, Attrs extends Record = VariableNodeAttrs, > = { /** * The HTML attributes for a mention node. * @default {} * @example { class: 'foo' } */ HTMLAttributes: Record; /** * A function to render the label of a mention. * @deprecated use renderText and renderHTML instead * @param props The render props * @returns The label * @example ({ options, node }) => `${options.suggestion.char}${node.attrs.label ?? node.attrs.id}` */ renderLabel?: (props: { options: VariableOptions; node: ProseMirrorNode; }) => string; /** * A function to render the text of a mention. * @param props The render props * @returns The text * @example ({ options, node }) => `${options.suggestion.char}${node.attrs.label ?? node.attrs.id}` */ renderText: (props: { options: VariableOptions; node: ProseMirrorNode; }) => string; /** * A function to render the HTML of a mention. * @param props The render props * @returns The HTML as a ProseMirror DOM Output Spec * @example ({ options, node }) => ['span', { 'data-type': 'mention' }, `${options.suggestion.char}${node.attrs.label ?? node.attrs.id}`] */ renderHTML: (props: { options: VariableOptions; node: ProseMirrorNode; }) => DOMOutputSpec; /** * Whether to delete the trigger character with backspace. * @default false */ deleteTriggerWithBackspace: boolean; /** * The suggestion options. * @default {} * @example { char: '@', pluginKey: MentionPluginKey, command: ({ editor, range, props }) => { ... } } */ suggestion: Omit, 'editor'>; }; export type VariableType = { id: string; label: string; }; export type VariableStorage = { variables: VariableType[]; }; /** * The plugin key for the variable plugin. * @default 'variable' */ export const VariablePluginKey = new PluginKey('variable'); export const VariableExtension = Node.create({ name: 'variable', priority: 101, addStorage() { return { variables: [], }; }, addOptions() { return { HTMLAttributes: {}, renderText({ options, node }) { return `${options.suggestion.char}${node.attrs.label ?? node.attrs.id}`; }, deleteTriggerWithBackspace: false, renderHTML({ options, node }) { return [ 'span', mergeAttributes(this.HTMLAttributes, options.HTMLAttributes), `${options.suggestion.char}${node.attrs.label ?? node.attrs.id}`, ]; }, suggestion: { char: '@', pluginKey: VariablePluginKey, command: ({ editor, range, props }) => { // increase range.to by one when the next node is of type "text" // and starts with a space character const nodeAfter = editor.view.state.selection.$to.nodeAfter; const overrideSpace = nodeAfter?.text?.startsWith(' '); if (overrideSpace) { range.to += 1; } editor .chain() .focus() .insertContentAt(range, [ { type: this.name, attrs: props, }, { type: 'text', text: ' ', }, ]) .run(); // get reference to `window` object from editor element, to support cross-frame JS usage editor.view.dom.ownerDocument.defaultView ?.getSelection() ?.collapseToEnd(); }, allow: ({ state, range }) => { const $from = state.doc.resolve(range.from); const type = state.schema.nodes[this.name]; const allow = !!$from.parent.type.contentMatch.matchType(type); return allow; }, }, }; }, group: 'inline', inline: true, selectable: false, atom: true, addAttributes() { return { id: { default: null, parseHTML: (element) => element.getAttribute('data-id'), renderHTML: (attributes) => { if (!attributes.id) { return {}; } return { 'data-id': attributes.id, }; }, }, label: { default: null, parseHTML: (element) => element.getAttribute('data-label'), renderHTML: (attributes) => { if (!attributes.label) { return {}; } return { 'data-label': attributes.label, }; }, }, }; }, parseHTML() { return [ { tag: `span[data-type="${this.name}"]`, }, ]; }, renderHTML({ node, HTMLAttributes }) { if (this.options.renderLabel !== undefined) { console.warn( 'renderLabel is deprecated use renderText and renderHTML instead', ); return [ 'span', mergeAttributes( { 'data-type': this.name }, this.options.HTMLAttributes, HTMLAttributes, ), this.options.renderLabel({ options: this.options, node, }), ]; } const mergedOptions = { ...this.options }; mergedOptions.HTMLAttributes = mergeAttributes( { 'data-type': this.name }, this.options.HTMLAttributes, HTMLAttributes, ); const html = this.options.renderHTML({ options: mergedOptions, node, }); if (typeof html === 'string') { return [ 'span', mergeAttributes( { 'data-type': this.name }, this.options.HTMLAttributes, HTMLAttributes, ), html, ]; } return html; }, renderText({ node }) { if (this.options.renderLabel !== undefined) { console.warn( 'renderLabel is deprecated use renderText and renderHTML instead', ); return this.options.renderLabel({ options: this.options, node, }); } return this.options.renderText({ options: this.options, node, }); }, addKeyboardShortcuts() { return { Backspace: () => this.editor.commands.command(({ tr, state }) => { let isVariable = false; const { selection } = state; const { empty, anchor } = selection; if (!empty) { return false; } state.doc.nodesBetween(anchor - 1, anchor, (node, pos) => { if (node.type.name === this.name) { isVariable = true; tr.insertText( this.options.deleteTriggerWithBackspace ? '' : this.options.suggestion.char || '', pos, pos + node.nodeSize, ); return false; } }); return isVariable; }), }; }, addProseMirrorPlugins() { return [ Suggestion({ editor: this.editor, ...this.options.suggestion, }), ]; }, }); ================================================ FILE: src/components/ChatEditor/VariableExtension/VariableSuggestion.tsx ================================================ import { ReactRenderer } from '@tiptap/react'; import type { SuggestionOptions } from '@tiptap/suggestion'; import tippy, { type GetReferenceClientRect } from 'tippy.js'; import { forwardRef, Fragment, useEffect, useImperativeHandle, useState, } from 'react'; import { cn } from '../../../lib/classname'; import type { VariableStorage, VariableType } from './VariableExtension'; import { ChevronRight } from 'lucide-react'; export type VariableListProps = { command: (variable: VariableType) => void; items: VariableType[]; } & SuggestionOptions; export const VariableList = forwardRef((props: VariableListProps, ref) => { const { items, command } = props; const [selectedIndex, setSelectedIndex] = useState(0); const selectItem = (index: number) => { const item = props.items[index]; if (!item) { return; } command(item); }; useEffect(() => { setSelectedIndex(0); }, [items]); useImperativeHandle(ref, () => ({ onKeyDown: ({ event }: { event: KeyboardEvent }) => { if (event.key === 'ArrowUp') { setSelectedIndex((selectedIndex + items.length - 1) % items.length); return true; } if (event.key === 'ArrowDown') { setSelectedIndex((selectedIndex + 1) % items.length); return true; } if (event.key === 'Enter') { selectItem(selectedIndex); return true; } return false; }, })); return (
{items.length ? ( items.map((item, index) => { const labelParts = item?.label.split('>'); return ( ); }) ) : (
No result
)}
); }); VariableList.displayName = 'VariableList'; export function variableSuggestion(): Omit { return { items: ({ editor, query }) => { const storage = editor.storage.variable as VariableStorage; return storage.variables .filter((variable) => variable?.label?.toLowerCase().includes(query.toLowerCase()), ) .slice(0, 5); }, render: () => { let component: ReactRenderer; let popup: InstanceType | null = null; return { onStart: (props) => { component = new ReactRenderer(VariableList, { props, editor: props.editor, }); if (!props.clientRect) { return; } popup = tippy('body', { getReferenceClientRect: props.clientRect as GetReferenceClientRect, appendTo: () => document.body, content: component.element, showOnCreate: true, interactive: true, trigger: 'manual', placement: 'top-start', }); }, onUpdate(props) { component.updateProps(props); if (!props.clientRect) { return; } popup[0].setProps({ getReferenceClientRect: props.clientRect, }); }, onKeyDown(props) { if (props.event.key === 'Escape') { popup[0].hide(); return true; } return component.ref?.onKeyDown(props); }, onExit() { popup[0].destroy(); component.destroy(); }, }; }, }; } ================================================ FILE: src/components/ChatMessages/AIChat.css ================================================ .ai-chat { .prose ul li > code, .prose ol li > code, p code, a > code, strong > code, em > code, h1 > code, h2 > code, h3 > code { background: #ebebeb !important; color: currentColor !important; font-size: 14px; font-weight: normal !important; } .message-markdown.prose ul li > code, .message-markdown.prose ol li > code, .message-markdown.prose p code, .message-markdown.prose a > code, .message-markdown.prose strong > code, .message-markdown.prose em > code, .message-markdown.prose h1 > code, .message-markdown.prose h2 > code, .message-markdown.prose h3 > code { font-size: 12px !important; } .message-markdown pre { -ms-overflow-style: none; scrollbar-width: none; } .message-markdown pre::-webkit-scrollbar { display: none; } .message-markdown pre, .message-markdown pre { overflow: scroll; } .prose ul li > code:before, p > code:before, .prose ul li > code:after, .prose ol li > code:before, p > code:before, .prose ol li > code:after, .message-markdown h1 > code:after, .message-markdown h1 > code:before, .message-markdown h2 > code:after, .message-markdown h2 > code:before, .message-markdown h3 > code:after, .message-markdown h3 > code:before, .message-markdown h4 > code:after, .message-markdown h4 > code:before, p > code:after, a > code:after, a > code:before { content: '' !important; } .message-markdown.prose ul li > code, .message-markdown.prose ol li > code, .message-markdown p code, .message-markdown a > code, .message-markdown strong > code, .message-markdown em > code, .message-markdown h1 > code, .message-markdown h2 > code, .message-markdown h3 > code, .message-markdown table code { background: #f4f4f5 !important; border: 1px solid #282a36 !important; color: #282a36 !important; padding: 2px 4px; border-radius: 5px; white-space: pre; font-weight: normal; } .message-markdown blockquote { font-style: normal; } .message-markdown.prose blockquote h1, .message-markdown.prose blockquote h2, .message-markdown.prose blockquote h3, .message-markdown.prose blockquote h4 { font-style: normal; margin-bottom: 8px; } .message-markdown.prose ul li > code:before, .message-markdown p > code:before, .message-markdown.prose ul li > code:after, .message-markdown p > code:after, .message-markdown h2 > code:after, .message-markdown h2 > code:before, .message-markdown table code:before, .message-markdown table code:after, .message-markdown a > code:after, .message-markdown a > code:before, .message-markdown h2 code:after, .message-markdown h2 code:before, .message-markdown h2 code:after, .message-markdown h2 code:before { content: '' !important; } .message-markdown table { border-collapse: collapse; border: 1px solid black; border-radius: 5px; } .message-markdown table td, .message-markdown table th { padding: 5px 10px; } .chat-variable { font-size: 12px; font-weight: 500; line-height: 1.5; padding: 2px 4px; border-radius: 8px; background-color: #f0f5ff; color: #2c5df1; } } ================================================ FILE: src/components/ChatMessages/RoadmapChatIntroMessage.tsx ================================================ import { useQuery } from '@tanstack/react-query'; import { officialRoadmapOptions } from '../../queries/official-roadmap'; import { queryClient } from '../../stores/query-client'; type RoadmapChatIntroMessageProps = { roadmapId: string; }; export function RoadmapChatIntroMessage(props: RoadmapChatIntroMessageProps) { const { roadmapId } = props; const { data: roadmapDetail } = useQuery( officialRoadmapOptions(roadmapId), queryClient, ); const topicNodes = roadmapDetail?.nodes?.filter( (node) => node.type === 'topic', ); const firstTopicNode = topicNodes?.[0]; const firstTopicTitle = firstTopicNode?.data?.label || 'XYZ'; const secondTopicNode = topicNodes?.[1]; const secondTopicTitle = secondTopicNode?.data?.label || 'XYZ'; const capabilities = [ { icon: '📚', title: 'Learn concepts:', description: 'Ask me about any topics on the roadmap', examples: '"Explain what React hooks are" or "How does async/await work?"', }, { icon: '📊', title: 'Track progress:', description: 'Mark topics as done, learning, or skipped', examples: `"Mark ${firstTopicTitle} as done" or "Show my overall progress"`, }, { icon: '🎯', title: 'Recommendations:', description: 'Find what to learn next or explore other roadmaps', examples: `"What should I learn next?" or "Recommend roadmaps for backend development"`, }, { icon: '🔍', title: 'Find resources:', description: 'Get learning materials for specific topics', examples: `"Show me resources for learning ${secondTopicTitle}"`, }, { icon: '🔗', title: 'Share progress:', description: 'Get a link to share your learning progress', examples: '"Give me my shareable progress link"', }, ]; return (

Hi! I'm your AI learning assistant 👋

I'm here to guide you through your learning journey on this roadmap. I can help you understand concepts, track your progress, and provide personalized learning advice.

Here's what I can help you with:

{capabilities.map((capability, index) => (
{capability.icon}
{capability.title} {' '} {capability.description}
Try: {capability.examples}
))}

Tip: I can see your current progress on the roadmap, so my advice will be personalized to your learning journey. Just ask me anything about the topics you see on the roadmap!

); } ================================================ FILE: src/components/ChatMessages/RoadmapChatMessage.tsx ================================================ import { Markdown } from '../Global/Markdown'; import { BotIcon, User2Icon } from 'lucide-react'; import type { UIMessage } from 'ai'; import { parseMessageParts } from '../../lib/message-part'; import { RoadmapChatUserProgressList } from './UserProgressList'; import { parseUserProgress, UserProgressActionList, } from './UserPrgressActionList'; import { parseTopicList, RoadmapTopicList } from './RoadmapTopicList'; import { ShareResourceLink } from './ShareResourceLink'; import { parseRoadmapSlugList, RoadmapRecommendations, } from './RoadmapRecommendations'; import { cn } from '../../lib/classname'; type RoadmapMessageProps = { roadmapId: string; message: UIMessage; isStreaming: boolean; children?: React.ReactNode; onTopicClick?: (topicId: string, topicTitle: string) => void; }; export function RoadmapChatMessage(props: RoadmapMessageProps) { const { roadmapId, message, isStreaming, children, onTopicClick } = props; const { role } = message; return (
{role === 'user' ? ( ) : ( )}
{children || (
{message.parts.map((part) => { const { type } = part; if (role === 'user' && type === 'text') { return (
); } if (type === 'text') { const text = part.text; const parts = parseMessageParts(text, { 'user-progress': () => { return {}; }, 'update-progress': (opts) => { return parseUserProgress(opts.content); }, 'roadmap-topics': (opts) => { return parseTopicList(opts.content); }, 'resource-progress-link': () => { return {}; }, 'roadmap-recommendations': (opts) => { return parseRoadmapSlugList(opts.content); }, }); return parts.map((part, index) => { const { type } = part; const key = `message-${message.id}-part-${type}-${index}`; if (type === 'text') { return ( {part.text ?? ''} ); } else if (type === 'user-progress') { return ( ); } else if (type === 'update-progress') { return ( ); } else if (type === 'roadmap-topics') { return ( ); } else if (type === 'resource-progress-link') { return ( ); } else if (type === 'roadmap-recommendations') { return ( ); } return null; }); } })}
)}
); } ================================================ FILE: src/components/ChatMessages/RoadmapChatMessages.tsx ================================================ import type { ChatStatus, UIMessage } from 'ai'; import { memo } from 'react'; import { RoadmapChatMessage } from './RoadmapChatMessage'; import { useIsThinking } from '../../hooks/use-is-thinking'; type MessagesProps = { messages: UIMessage[]; status: ChatStatus; roadmapId: string; onTopicClick?: (topicId: string, topicTitle: string) => void; defaultQuestions?: string[]; onDefaultQuestionClick?: (question: string) => void; }; function _RoadmapChatMessages(props: MessagesProps) { const { messages, status, roadmapId, defaultQuestions, onTopicClick, onDefaultQuestionClick, } = props; const isStreaming = status === 'streaming'; const isThinking = useIsThinking(messages, status); return (
{messages.length === 0 && defaultQuestions && defaultQuestions.length > 0 && (

Some questions you might have about this roadmap:

{defaultQuestions.map((question, index) => ( ))}
)} {messages.map((message, index) => { const isLastMessage = index === messages.length - 1; // otherwise it will add an extra space at the end of the message // because the last message is not rendered if (isThinking && isLastMessage && message.role === 'assistant') { return null; } return ( ); })} {isThinking && ( )}
); } export const RoadmapChatMessages = memo(_RoadmapChatMessages); ================================================ FILE: src/components/ChatMessages/RoadmapRecommendations.tsx ================================================ import { useQuery } from '@tanstack/react-query'; import { useMemo } from 'react'; import { Loader2Icon, SquareArrowOutUpRightIcon } from 'lucide-react'; import { listBuiltInRoadmaps } from '../../queries/roadmap'; import { queryClient } from '../../stores/query-client'; type RoadmapSlugListType = { roadmapSlug: string; }; export function parseRoadmapSlugList(content: string): RoadmapSlugListType[] { const items: RoadmapSlugListType[] = []; const roadmapSlugListRegex = /.*?<\/roadmap-slug>/gs; const roadmapSlugListItems = content.match(roadmapSlugListRegex); if (!roadmapSlugListItems) { return items; } for (const roadmapSlugListItem of roadmapSlugListItems) { const roadmapSlugRegex = /(.*?)<\/roadmap-slug>/; const roadmapSlug = roadmapSlugListItem .match(roadmapSlugRegex)?.[1] ?.trim(); if (!roadmapSlug) { continue; } items.push({ roadmapSlug, }); } return items; } type RoadmapRecommendationsProps = { roadmapSlugs: RoadmapSlugListType[]; }; export function RoadmapRecommendations(props: RoadmapRecommendationsProps) { const { roadmapSlugs } = props; const { data: roadmaps, isLoading } = useQuery( listBuiltInRoadmaps(), queryClient, ); const progressItemWithText = useMemo(() => { return roadmapSlugs.map((item) => { const roadmap = roadmaps?.find( (mapping) => mapping.id === item.roadmapSlug, ); return { ...item, title: roadmap?.title, }; }); }, [roadmapSlugs, roadmaps]); return (
{progressItemWithText.map((item) => ( {item.title} {isLoading && ( )} {!isLoading && ( )} ))}
); } ================================================ FILE: src/components/ChatMessages/RoadmapTopicList.tsx ================================================ import { useQuery } from '@tanstack/react-query'; import { Fragment, useMemo } from 'react'; import { ChevronRightIcon } from 'lucide-react'; import { roadmapTreeMappingOptions } from '../../queries/roadmap-tree'; import { queryClient } from '../../stores/query-client'; type TopicListType = { topicId: string; }; export function parseTopicList(content: string): TopicListType[] { const items: TopicListType[] = []; const topicListRegex = /.*?<\/topic-id>/gs; const topicListItems = content.match(topicListRegex); if (!topicListItems) { return items; } for (const topicListItem of topicListItems) { const topicIdRegex = /(.*?)<\/topic-id>/; const topicId = topicListItem.match(topicIdRegex)?.[1]?.trim(); if (!topicId) { continue; } items.push({ topicId, }); } return items; } type RoadmapTopicListProps = { roadmapId: string; onTopicClick?: (topicId: string, topicTitle: string) => void; topics: TopicListType[]; }; export function RoadmapTopicList(props: RoadmapTopicListProps) { const { roadmapId, topics: topicListItems, onTopicClick } = props; const { data: roadmapTreeData } = useQuery( roadmapTreeMappingOptions(roadmapId), queryClient, ); const progressItemWithText = useMemo(() => { return topicListItems.map((item) => { const roadmapTreeItem = roadmapTreeData?.find( (mapping) => mapping.nodeId === item.topicId, ); return { ...item, text: (roadmapTreeItem?.text || item.topicId) ?.split(' > ') .slice(1) .join(' > '), }; }); }, [topicListItems, roadmapTreeData]); return (
{progressItemWithText.map((item) => { const labelParts = item.text.split(' > ').slice(-2); const labelPartCount = labelParts.length; const title = item.text.split(' > ').pop(); if (!title) { return; } return ( ); })}
); } ================================================ FILE: src/components/ChatMessages/ShareResourceLink.tsx ================================================ import { ShareIcon } from 'lucide-react'; import { useCopyText } from '../../hooks/use-copy-text'; import { cn } from '../../lib/classname'; import { useAuth } from '../../hooks/use-auth'; import { CheckIcon } from '../ReactIcons/CheckIcon'; type ShareResourceLinkProps = { roadmapId: string; }; export function ShareResourceLink(props: ShareResourceLinkProps) { const { roadmapId } = props; const currentUser = useAuth(); const { copyText, isCopied } = useCopyText(); const handleShareResourceLink = () => { const url = `${import.meta.env.VITE_ASTRO_APP_URL}/${roadmapId}?s=${currentUser?.id}`; copyText(url); }; return (
); } ================================================ FILE: src/components/ChatMessages/TopicChatMessage.tsx ================================================ import { cn } from '../../lib/classname'; import { Markdown } from '../Global/Markdown'; import { BotIcon, User2Icon } from 'lucide-react'; import type { UIMessage } from 'ai'; import { promptLabelMapping } from '../TopicDetail/PredefinedActions'; type TopicChatMessageProps = { message: UIMessage; }; export function TopicChatMessage(props: TopicChatMessageProps) { const { message } = props; const { role } = message; return (
{role === 'user' ? ( ) : ( )}
{message.parts.map((part) => { const { type } = part; const key = `message-${message.id}-part-${type}`; if (type === 'text') { let content = part.text; if (role === 'user' && promptLabelMapping[content]) { content = promptLabelMapping[content]; } return ( {content} ); } })}
); } ================================================ FILE: src/components/ChatMessages/TopicChatMessages.tsx ================================================ import type { ChatStatus, UIMessage } from 'ai'; import { TopicChatMessage } from './TopicChatMessage'; import { useIsThinking } from '../../hooks/use-is-thinking'; type TopicChatMessagesProps = { messages: UIMessage[]; status: ChatStatus; }; export function TopicChatMessages(props: TopicChatMessagesProps) { const { messages, status } = props; const isThinking = useIsThinking(messages, status); return (
{messages.map((message, index) => { const isLastMessage = index === messages.length - 1; // otherwise it will add an extra space at the end of the message // because the last message is not rendered if (isThinking && isLastMessage && message.role === 'assistant') { return null; } return ; })} {isThinking && ( )}
); } ================================================ FILE: src/components/ChatMessages/UserPrgressActionList.tsx ================================================ import { useMutation, useQuery } from '@tanstack/react-query'; import { ChevronRightIcon, Loader2Icon } from 'lucide-react'; import { CheckIcon } from '../ReactIcons/CheckIcon'; import { Fragment, useMemo, useState } from 'react'; import { roadmapTreeMappingOptions } from '../../queries/roadmap-tree'; import { queryClient } from '../../stores/query-client'; import { httpPost } from '../../lib/query-http'; import { renderTopicProgress, updateResourceProgress, type ResourceProgressType, } from '../../lib/resource-progress'; import { userResourceProgressOptions } from '../../queries/resource-progress'; import { useToast } from '../../hooks/use-toast'; import { cn } from '../../lib/classname'; type UpdateUserProgress = { id: string; action: 'done' | 'learning' | 'skipped' | 'pending'; }; export function parseUserProgress(content: string): UpdateUserProgress[] { const items: UpdateUserProgress[] = []; const progressRegex = /.*?<\/update-progress-item>/gs; const progressItems = content.match(progressRegex); if (!progressItems) { return items; } for (const progressItem of progressItems) { const progressItemRegex = /(.*?)<\/topic-id>/; const topicId = progressItem.match(progressItemRegex)?.[1]?.trim(); const topicActionRegex = /(.*?)<\/topic-action>/; const topicAction = progressItem .match(topicActionRegex)?.[1] .trim() ?.toLowerCase(); if (!topicId || !topicAction) { continue; } items.push({ id: topicId, action: topicAction as UpdateUserProgress['action'], }); } return items; } type BulkUpdateResourceProgressBody = { done: string[]; learning: string[]; skipped: string[]; pending: string[]; }; type BulkUpdateResourceProgressResponse = { done: string[]; learning: string[]; skipped: string[]; }; type UserProgressActionListProps = { roadmapId: string; isLoading?: boolean; updateUserProgress: UpdateUserProgress[]; }; export function UserProgressActionList(props: UserProgressActionListProps) { const { roadmapId, updateUserProgress, isLoading = false } = props; const toast = useToast(); const { data: roadmapTreeData } = useQuery( roadmapTreeMappingOptions(roadmapId), queryClient, ); const { mutate: bulkUpdateResourceProgress, isPending: isBulkUpdating, isSuccess: isBulkUpdateSuccess, } = useMutation( { mutationFn: (body: BulkUpdateResourceProgressBody) => { return httpPost( `/v1-bulk-update-resource-progress/${roadmapId}`, body, ); }, onSuccess: () => { updateUserProgress.forEach((item) => { renderTopicProgress(item.id, item.action); }); return queryClient.invalidateQueries( userResourceProgressOptions('roadmap', roadmapId), ); }, onError: (error) => { toast.error( error?.message ?? 'Something went wrong, please try again.', ); }, }, queryClient, ); const progressItemWithText = useMemo(() => { return updateUserProgress.map((item) => { const roadmapTreeItem = roadmapTreeData?.find( (mapping) => mapping.nodeId === item.id, ); return { ...item, text: (roadmapTreeItem?.text || item.id) ?.split(' > ') .slice(1) .join(' > '), }; }); }, [updateUserProgress, roadmapTreeData]); const [showAll, setShowAll] = useState(false); const itemCountToShow = 4; const itemsToShow = showAll ? progressItemWithText : progressItemWithText.slice(0, itemCountToShow); const hasMoreItemsToShow = progressItemWithText.length > itemCountToShow; return (
{itemsToShow.map((item) => ( ))} {hasMoreItemsToShow && (
)}
); } type ProgressItemProps = { roadmapId: string; topicId: string; text: string; action: UpdateUserProgress['action']; isStreaming: boolean; isBulkUpdating: boolean; isBulkUpdateSuccess: boolean; }; function ProgressItem(props: ProgressItemProps) { const { roadmapId, topicId, text, action, isStreaming, isBulkUpdating, isBulkUpdateSuccess, } = props; const toast = useToast(); const { mutate: updateTopicStatus, isSuccess, isPending: isUpdating, } = useMutation( { mutationFn: (action: ResourceProgressType) => { return updateResourceProgress( { resourceId: roadmapId, resourceType: 'roadmap', topicId, }, action, ); }, onMutate: () => {}, onSuccess: () => { renderTopicProgress(topicId, action); }, onError: () => { toast.error('Something went wrong, please try again.'); }, onSettled: () => { return queryClient.invalidateQueries( userResourceProgressOptions('roadmap', roadmapId), ); }, }, queryClient, ); const textParts = text.split(' > '); const lastIndex = textParts.length - 1; return (
{textParts.map((part, index) => { return ( {part} {index !== lastIndex && ( {' '} )} ); })} {!isSuccess && !isBulkUpdateSuccess && ( <> {!isStreaming && ( )} {isStreaming && ( )} )} {(isSuccess || isBulkUpdateSuccess) && ( )}
); } ================================================ FILE: src/components/ChatMessages/UserProgressList.tsx ================================================ import { useQuery } from '@tanstack/react-query'; import { getPercentage } from '../../lib/number'; import { userResourceProgressOptions } from '../../queries/resource-progress'; import { queryClient } from '../../stores/query-client'; type RoadmapChatUserProgressListProps = { roadmapId: string; }; export function RoadmapChatUserProgressList( props: RoadmapChatUserProgressListProps, ) { const { roadmapId } = props; const { data: userResourceProgressData } = useQuery( userResourceProgressOptions('roadmap', roadmapId), queryClient, ); const doneCount = userResourceProgressData?.done?.length ?? 0; const skippedCount = userResourceProgressData?.skipped?.length ?? 0; const totalTopicCount = userResourceProgressData?.totalTopicCount ?? 0; const totalFinished = doneCount + skippedCount; const progressPercentage = getPercentage(totalFinished, totalTopicCount); return (
Progress {progressPercentage}%
{totalFinished} / {totalTopicCount} topics
Completed: {doneCount}
Skipped: {skippedCount}
); } ================================================ FILE: src/components/CommandMenu/CommandMenu.tsx ================================================ import { Fragment, type ReactElement, useEffect, useRef, useState, } from 'react'; import { useKeydown } from '../../hooks/use-keydown'; import { useOutsideClick } from '../../hooks/use-outside-click'; import { httpGet } from '../../lib/http'; import { isLoggedIn } from '../../lib/jwt'; import { BestPracticesIcon } from '../ReactIcons/BestPracticesIcon.tsx'; import { UserIcon } from '../ReactIcons/UserIcon.tsx'; import { GroupIcon } from '../ReactIcons/GroupIcon.tsx'; import { RoadmapIcon } from '../ReactIcons/RoadmapIcon.tsx'; import { ClipboardIcon } from '../ReactIcons/ClipboardIcon.tsx'; import { GuideIcon } from '../ReactIcons/GuideIcon.tsx'; import { HomeIcon } from '../ReactIcons/HomeIcon.tsx'; import { VideoIcon } from '../ReactIcons/VideoIcon.tsx'; import { cn } from '../../lib/classname.ts'; import type { AllowedRoadmapRenderer } from '../../lib/roadmap.ts'; export type PageType = { id: string; url: string; title: string; group: string; icon?: ReactElement; isProtected?: boolean; metadata?: Record; renderer?: AllowedRoadmapRenderer; }; const defaultPages: PageType[] = [ { id: 'home', url: '/', title: 'Home', group: 'Pages', icon: , }, { id: 'account', url: '/account', title: 'Account', group: 'Pages', icon: , isProtected: true, }, { id: 'team', url: '/team', title: 'Teams', group: 'Pages', icon: , isProtected: true, }, { id: 'friends', url: '/account/friends', title: 'Friends', group: 'Pages', icon: , isProtected: true, }, { id: 'roadmaps', url: '/roadmaps', title: 'Roadmaps', group: 'Pages', icon: , }, { id: 'account-roadmaps', url: '/account/roadmaps', title: 'Custom Roadmaps', group: 'Pages', icon: , isProtected: true, }, { id: 'questions', url: '/questions', title: 'Questions', group: 'Pages', icon: , }, { id: 'guides', url: '/guides', title: 'Guides', group: 'Pages', icon: , }, { id: 'videos', url: '/videos', title: 'Videos', group: 'Pages', icon: , }, ]; function shouldShowPage(page: PageType) { const isUser = isLoggedIn(); return !page.isProtected || isUser; } export function CommandMenu() { const inputRef = useRef(null); const modalRef = useRef(null); const [isActive, setIsActive] = useState(false); const [allPages, setAllPages] = useState([]); const [searchResults, setSearchResults] = useState(defaultPages); const [searchedText, setSearchedText] = useState(''); const [activeCounter, setActiveCounter] = useState(0); useKeydown('mod_k', () => { setIsActive(true); }); useOutsideClick(modalRef, () => { setSearchedText(''); setIsActive(false); }); useEffect(() => { function handleToggleTopic(e: any) { setIsActive(true); } getAllPages(); window.addEventListener(`command.k`, handleToggleTopic); return () => { window.removeEventListener(`command.k`, handleToggleTopic); }; }, []); useEffect(() => { if (!isActive || !inputRef.current) { return; } inputRef.current.focus(); }, [isActive]); async function getAllPages() { if (allPages.length > 0) { return allPages; } const { error, response } = await httpGet(`/pages.json`); if (!response) { return defaultPages.filter(shouldShowPage); } setAllPages([...defaultPages, ...response].filter(shouldShowPage)); return response; } useEffect(() => { if (!searchedText) { setSearchResults(defaultPages.filter(shouldShowPage)); return; } const normalizedSearchText = searchedText.trim().toLowerCase(); getAllPages().then((unfilteredPages = defaultPages) => { const filteredPages = unfilteredPages .filter((currPage: PageType) => { return ( currPage.title.toLowerCase().indexOf(normalizedSearchText) !== -1 ); }) .slice(0, 10); setActiveCounter(0); setSearchResults(filteredPages); }); }, [searchedText]); if (!isActive) { return null; } return (
{ const value = (e.target as HTMLInputElement).value.trim(); setSearchedText(value); }} onKeyDown={(e) => { if (e.key === 'ArrowDown') { const canGoNext = activeCounter < searchResults.length - 1; setActiveCounter(canGoNext ? activeCounter + 1 : 0); } else if (e.key === 'ArrowUp') { const canGoPrev = activeCounter > 0; setActiveCounter( canGoPrev ? activeCounter - 1 : searchResults.length - 1, ); } else if (e.key === 'Tab') { e.preventDefault(); } else if (e.key === 'Escape') { setSearchedText(''); setIsActive(false); } else if (e.key === 'Enter') { const activePage = searchResults[activeCounter]; if (activePage) { window.location.href = activePage.url; } } }} />
{searchResults.length === 0 && (
No results found
)} {searchResults.map((page: PageType, counter: number) => { const prevPage = searchResults[counter - 1]; const groupChanged = prevPage && prevPage.group !== page.group; return ( {groupChanged && (
)} setActiveCounter(counter)} href={page.url} > {!page.icon && ( {page.group} )} {page.icon && page.icon} {page.title}
); })}
); } ================================================ FILE: src/components/Confetti.tsx ================================================ import { useEffect, useState } from 'react'; import ReactConfetti from 'react-confetti'; type ConfettiPosition = { x: number; y: number; w: number; h: number; }; type ConfettiProps = { pieces?: number; element?: HTMLElement | null; onDone?: () => void; }; export function Confetti(props: ConfettiProps) { const { element = document.body, onDone = () => null, pieces = 40 } = props; const [confettiPos, setConfettiPos] = useState< undefined | ConfettiPosition >(); function populateConfettiPosition(element: HTMLElement) { const elRect = element.getBoundingClientRect(); // set confetti position, keeping in mind the scroll values setConfettiPos({ x: elRect?.x || 0, y: (elRect?.y || 0) + window.scrollY, w: elRect?.width || 0, h: elRect?.height || 0, }); } useEffect(() => { if (!element) { setConfettiPos(undefined); return; } populateConfettiPosition(element); }, [element]); if (!confettiPos) { return null; } return ( { setConfettiPos(undefined); onDone(); }} initialVelocityX={4} initialVelocityY={8} tweenDuration={10} confettiSource={{ x: confettiPos.x, y: confettiPos.y, w: confettiPos.w, h: confettiPos.h, }} /> ); } ================================================ FILE: src/components/ContentGenerator/ContentGenerator.tsx ================================================ import { BookOpenIcon, FileTextIcon, MapIcon, SparklesIcon, type LucideIcon, } from 'lucide-react'; import { useEffect, useId, useState } from 'react'; import { FormatItem } from './FormatItem'; import { isLoggedIn } from '../../lib/jwt'; import { showLoginPopup } from '../../lib/popup'; import { UpgradeAccountModal } from '../Billing/UpgradeAccountModal'; import { useIsPaidUser } from '../../queries/billing'; import { clearQuestionAnswerChatMessages, storeQuestionAnswerChatMessages, } from '../../lib/ai-questions'; import { QuestionAnswerChat, type QuestionAnswerChatMessage, } from './QuestionAnswerChat'; import { useToast } from '../../hooks/use-toast'; import { cn } from '../../lib/classname'; import { getUrlParams, setUrlParams } from '../../lib/browser'; import { useParams } from '../../hooks/use-params'; import { useQuery } from '@tanstack/react-query'; import { aiLimitOptions } from '../../queries/ai-course'; import { queryClient } from '../../stores/query-client'; import { showUpgradeModal } from '../../stores/subscription'; const allowedFormats = ['course', 'guide', 'roadmap'] as const; export type AllowedFormat = (typeof allowedFormats)[number]; export function ContentGenerator() { const [isUpgradeModalOpen, setIsUpgradeModalOpen] = useState(false); const { isPaidUser, isLoading: isPaidUserLoading } = useIsPaidUser(); const params = useParams<{ format: AllowedFormat }>(); const toast = useToast(); const [title, setTitle] = useState(''); const [selectedFormat, setSelectedFormat] = useState('course'); const { data: limits, isLoading: isLimitLoading } = useQuery( aiLimitOptions(), queryClient, ); useEffect(() => { const isValidFormat = allowedFormats.find( (format) => format.value === params.format, ); if (isValidFormat) { setSelectedFormat(isValidFormat.value); } else { setSelectedFormat('course'); } }, [params.format]); const [showFineTuneOptions, setShowFineTuneOptions] = useState(false); const [questionAnswerChatMessages, setQuestionAnswerChatMessages] = useState< QuestionAnswerChatMessage[] >([]); const titleFieldId = useId(); const fineTuneOptionsId = useId(); useEffect(() => { const params = getUrlParams(); const format = params.format as AllowedFormat; if (format && allowedFormats.find((f) => f.value === format)) { setSelectedFormat(format); } }, []); const allowedFormats: { label: string; icon: LucideIcon; value: AllowedFormat; }[] = [ { label: 'Course', icon: BookOpenIcon, value: 'course', }, { label: 'Guide', icon: FileTextIcon, value: 'guide', }, { label: 'Roadmap', icon: MapIcon, value: 'roadmap', }, ]; const selectedLimit = limits?.[selectedFormat]; const showLimitWarning = !isPaidUser && !isPaidUserLoading && !isLimitLoading && isLoggedIn(); const handleSubmit = () => { if (!isLoggedIn()) { showLoginPopup(); return; } if ( !isPaidUser && selectedLimit && selectedLimit?.used >= selectedLimit?.limit ) { showUpgradeModal(); return; } let sessionId = ''; if (showFineTuneOptions) { clearQuestionAnswerChatMessages(); sessionId = storeQuestionAnswerChatMessages(questionAnswerChatMessages); } const trimmedTitle = title.trim(); if (selectedFormat === 'course') { window.location.href = `/ai/course?term=${encodeURIComponent(trimmedTitle)}&id=${sessionId}&format=${selectedFormat}`; } else if (selectedFormat === 'guide') { window.location.href = `/ai/guide?term=${encodeURIComponent(trimmedTitle)}&id=${sessionId}&format=${selectedFormat}`; } else if (selectedFormat === 'roadmap') { window.location.href = `/ai/roadmap?term=${encodeURIComponent(trimmedTitle)}&id=${sessionId}&format=${selectedFormat}`; } }; useEffect(() => { window?.fireEvent({ action: 'tutor_user', category: 'ai_tutor', label: 'Visited AI Course Page', }); }, []); const trimmedTitle = title.trim(); const canGenerate = trimmedTitle && trimmedTitle.length >= 3; return (
{isUpgradeModalOpen && ( setIsUpgradeModalOpen(false)} /> )} {showLimitWarning && (
{selectedLimit?.used} of {selectedLimit?.limit} {selectedFormat}s
)}

What can I help you learn?

Enter a topic below to generate a personalized course for it

{ e.preventDefault(); handleSubmit(); }} >
{ setTitle(e.target.value); setShowFineTuneOptions(false); }} className="block w-full rounded-xl border border-gray-200 bg-white p-4 outline-none placeholder:text-gray-500 focus:border-gray-500" required minLength={3} data-clarity-unmask="true" />
{allowedFormats.map((format) => { const isSelected = format.value === selectedFormat; return ( { setSelectedFormat(format.value); setUrlParams({ format: format.value }); }} icon={format.icon} isSelected={isSelected} /> ); })}
{showFineTuneOptions && ( )}
); } ================================================ FILE: src/components/ContentGenerator/FormatItem.tsx ================================================ import { type LucideIcon } from 'lucide-react'; import { cn } from '../../lib/classname'; type FormatItemProps = { label: string; onClick: () => void; icon: LucideIcon; isSelected: boolean; }; export function FormatItem(props: FormatItemProps) { const { label, onClick, icon: Icon, isSelected } = props; return ( ); } ================================================ FILE: src/components/ContentGenerator/QuestionAnswerChat.tsx ================================================ import { useQuery } from '@tanstack/react-query'; import { queryClient } from '../../stores/query-client'; import { aiQuestionSuggestionsOptions, type AIQuestionSuggestionsResponse, } from '../../queries/user-ai-session'; import type { AllowedFormat } from './ContentGenerator'; import { Loader2Icon, RefreshCcwIcon, SendIcon, Trash2 } from 'lucide-react'; import { useEffect, useRef, useState } from 'react'; import { cn } from '../../lib/classname'; import { flushSync } from 'react-dom'; import { CheckIcon } from '../ReactIcons/CheckIcon'; import { Tooltip } from '../Tooltip'; export type QuestionAnswerChatMessage = | { role: 'user'; answer: string } | { role: 'assistant'; question: string; possibleAnswers: string[]; }; type QuestionAnswerChatProps = { term: string; format: AllowedFormat | (string & {}); questionAnswerChatMessages: QuestionAnswerChatMessage[]; setQuestionAnswerChatMessages: ( messages: QuestionAnswerChatMessage[], ) => void; defaultQuestions?: AIQuestionSuggestionsResponse['questions']; type?: 'create' | 'update'; from?: 'content' | 'quiz'; className?: string; }; export function QuestionAnswerChat(props: QuestionAnswerChatProps) { const { term, format, defaultQuestions, questionAnswerChatMessages, setQuestionAnswerChatMessages, type = 'create', className = '', from = 'content', } = props; const [activeMessageIndex, setActiveMessageIndex] = useState( defaultQuestions?.length ?? 0, ); const [message, setMessage] = useState(''); const [status, setStatus] = useState<'answering' | 'done'>('answering'); const scrollAreaRef = useRef(null); const inputRef = useRef(null); const { data: aiQuestionSuggestions, isLoading: isLoadingAiQuestionSuggestions, } = useQuery( aiQuestionSuggestionsOptions({ term, format, from }, defaultQuestions), queryClient, ); const activeMessage = aiQuestionSuggestions?.questions[activeMessageIndex]; const scrollToBottom = () => { if (!scrollAreaRef.current) { return; } scrollAreaRef.current.scrollTo({ top: scrollAreaRef.current.scrollHeight, behavior: 'instant', }); }; const handleAnswerSelect = (answer: string) => { const trimmedAnswer = answer.trim(); if (!activeMessage || !trimmedAnswer) { return; } const newMessages: QuestionAnswerChatMessage[] = [ ...questionAnswerChatMessages, { role: 'assistant', ...activeMessage, }, { role: 'user', answer: trimmedAnswer, }, ]; setQuestionAnswerChatMessages(newMessages); setMessage(''); const hasMoreMessages = activeMessageIndex < aiQuestionSuggestions.questions.length - 1; if (!hasMoreMessages) { setStatus('done'); return; } flushSync(() => { setActiveMessageIndex(activeMessageIndex + 1); setStatus('answering'); // focus the input inputRef.current?.focus(); }); scrollToBottom(); }; const handleReset = () => { setQuestionAnswerChatMessages([]); setActiveMessageIndex(0); setStatus('answering'); }; const handleEditMessage = (messageIndex: number) => { // Remove the assistant question and user answer pair // Since user messages are at odd indices, we want to remove both // the assistant message (at messageIndex - 1) and the user message (at messageIndex) const assistantMessageIndex = messageIndex - 1; const newMessages = questionAnswerChatMessages.slice( 0, assistantMessageIndex, ); setQuestionAnswerChatMessages(newMessages); // Calculate which question should be active // Since we removed both assistant and user messages, the question index // is simply assistantMessageIndex / 2 const questionIndex = Math.floor(assistantMessageIndex / 2); setActiveMessageIndex(questionIndex); setStatus('answering'); setMessage(''); setTimeout(() => { inputRef.current?.focus(); }, 0); }; useEffect(() => { scrollToBottom(); }, [defaultQuestions, type]); return ( <>
{isLoadingAiQuestionSuggestions && (
Generating personalized questions...
)} {!isLoadingAiQuestionSuggestions && status === 'done' && (

Preferences saved

You can now start generating {format}

)} {!isLoadingAiQuestionSuggestions && status === 'answering' && ( <>
{questionAnswerChatMessages.map((message, index) => ( handleEditMessage(index) : undefined } /> ))} {activeMessage && ( )}
{!activeMessage && type === 'update' && (
)} {activeMessage && (
setMessage(e.target.value)} className="w-full bg-transparent text-sm focus:outline-none" placeholder={ activeMessage.possibleAnswers ? 'Type your answer...' : 'Or type your own answer...' } data-clarity-unmask="true" autoFocus onKeyDown={(e) => { if (e.key === 'Enter' && !e.shiftKey) { e.preventDefault(); handleAnswerSelect(message); setMessage(''); } }} />
)}
)}
); } type QuestionAnswerChatMessageProps = { role: 'user' | 'assistant'; question?: string; answer?: string; possibleAnswers?: string[]; onAnswerSelect?: (answer: string) => void; onEdit?: () => void; }; function QuestionAnswerChatMessage(props: QuestionAnswerChatMessageProps) { const { role, question, answer, possibleAnswers, onAnswerSelect, onEdit } = props; const hasAnswers = possibleAnswers && possibleAnswers.length > 0; return (
{role === 'assistant' && (
{question}
{hasAnswers && onAnswerSelect && (
{possibleAnswers.map((answer) => ( ))}
)}
)} {role === 'user' && (
{answer}
{onEdit && (
Reanswer after this point
)}
)}
); } ================================================ FILE: src/components/CookieSettingsButton.tsx ================================================ import { cn } from '../lib/classname'; import { Cookie } from 'lucide-react'; export function CookieSettingsButton() { return (
); } ================================================ FILE: src/components/CreateTeam/ContentConfirmationModal.tsx ================================================ import { Modal } from '../Modal'; type ContentConfirmationModalProps = { onClose: () => void; onClick: (shouldCopy: boolean) => void; }; export function ContentConfirmationModal(props: ContentConfirmationModalProps) { const { onClose, onClick } = props; return (

Copy Node Details and Resources?

This will just copy the roadmap in your team. Would you like to copy the resource links and node details as well?

); } ================================================ FILE: src/components/CreateTeam/CreateTeamForm.tsx ================================================ import { useEffect, useState } from 'react'; import { Stepper } from '../Stepper'; import { Step0, type ValidTeamType } from './Step0'; import { Step1, type ValidTeamSize } from './Step1'; import { Step2 } from './Step2'; import { httpGet } from '../../lib/http'; import { getUrlParams, setUrlParams } from '../../lib/browser'; import { pageProgressMessage } from '../../stores/page'; import type { TeamResourceConfig } from './RoadmapSelector'; import { Step3 } from './Step3'; import { Step4 } from './Step4'; import { useToast } from '../../hooks/use-toast'; export interface TeamDocument { _id?: string; name: string; avatar?: string; creatorId: string; links: { website?: string; github?: string; linkedIn?: string; }; type: ValidTeamType; personalProgressOnly?: boolean; canMemberSendInvite: boolean; teamSize?: ValidTeamSize; createdAt: Date; updatedAt: Date; } export function CreateTeamForm() { // Can't use hook `useParams` because it runs asynchronously const { s: queryStepIndex, t: teamId } = getUrlParams(); const toast = useToast(); const [team, setTeam] = useState(); const [loadingTeam, setLoadingTeam] = useState(!!teamId && !team?._id); const [stepIndex, setStepIndex] = useState(0); async function loadTeam( teamIdToFetch: string, requiredStepIndex: number | string, ) { const { response, error } = await httpGet( `${import.meta.env.PUBLIC_API_URL}/v1-get-team/${teamIdToFetch}`, ); if (error || !response) { toast.error(error?.message || 'Error loading team'); window.location.href = '/account'; return; } const requiredStepIndexNumber = parseInt(requiredStepIndex as string, 10); const completedSteps = Array(requiredStepIndexNumber) .fill(1) .map((_, counter) => counter); setTeam(response); setSelectedTeamType(response.type); setCompletedSteps(completedSteps); setStepIndex(requiredStepIndexNumber); await loadTeamResourceConfig(teamIdToFetch); } const [teamResourceConfig, setTeamResourceConfig] = useState([]); async function loadTeamResourceConfig(teamId: string) { const { error, response } = await httpGet( `${import.meta.env.PUBLIC_API_URL}/v1-get-team-resource-config/${teamId}`, ); if (error || !Array.isArray(response)) { console.error(error); return; } setTeamResourceConfig(response); } useEffect(() => { if (!teamId || !queryStepIndex || team) { return; } pageProgressMessage.set('Fetching team'); setLoadingTeam(true); loadTeam(teamId, queryStepIndex).finally(() => { setLoadingTeam(false); pageProgressMessage.set(''); }); // fetch team and move to step }, [teamId, queryStepIndex]); const [selectedTeamType, setSelectedTeamType] = useState( team?.type || 'company', ); const [completedSteps, setCompletedSteps] = useState([0]); if (loadingTeam) { return null; } let stepForm = null; if (stepIndex === 0) { stepForm = ( { if (team?._id) { setUrlParams({ t: team._id, s: '1' }); } setCompletedSteps([0]); setStepIndex(1); }} /> ); } else if (stepIndex === 1) { stepForm = ( { if (team?._id) { setUrlParams({ t: team._id, s: '0' }); } setStepIndex(0); }} onStepComplete={(team: TeamDocument) => { const createdTeamId = team._id!; setUrlParams({ t: createdTeamId, s: '2' }); setCompletedSteps([0, 1]); setStepIndex(2); setTeam(team); }} selectedTeamType={selectedTeamType} /> ); } else if (stepIndex === 2) { stepForm = ( { if (team) { setUrlParams({ t: team._id!, s: '1' }); } setStepIndex(1); }} onNext={() => { setUrlParams({ t: teamId!, s: '3' }); setCompletedSteps([0, 1, 2]); setStepIndex(3); }} /> ); } else if (stepIndex === 3) { stepForm = ( { if (team) { setUrlParams({ t: team._id!, s: '2' }); } setStepIndex(2); }} onNext={() => { if (team) { setUrlParams({ t: team._id!, s: '4' }); } setCompletedSteps([0, 1, 2, 3]); setStepIndex(4); }} /> ); } else if (stepIndex === 4) { stepForm = ; } return (

Create Team

Complete the steps below to create your team

{stepForm}
); } ================================================ FILE: src/components/CreateTeam/NextButton.tsx ================================================ import { Spinner } from '../ReactIcons/Spinner'; type NextButtonProps = { isLoading?: boolean; loadingMessage?: string; text: string; hasNextArrow?: boolean; onClick?: () => void; type?: string; }; export function NextButton(props: NextButtonProps) { const { isLoading = false, text = 'Next Step', type = 'button', loadingMessage = 'Please wait ..', onClick = () => null, hasNextArrow = true, } = props; return ( ); } ================================================ FILE: src/components/CreateTeam/RoadmapSelector.tsx ================================================ import { useEffect, useState } from 'react'; import { httpGet, httpPut } from '../../lib/http'; import type { PageType } from '../CommandMenu/CommandMenu'; import { pageProgressMessage } from '../../stores/page'; import { UpdateTeamResourceModal } from './UpdateTeamResourceModal'; import { SelectRoadmapModal } from './SelectRoadmapModal'; import { Map, Shapes } from 'lucide-react'; import type { AllowedRoadmapVisibility, RoadmapDocument, } from '../CustomRoadmap/CreateRoadmap/CreateRoadmapModal'; import { CreateRoadmapModal } from '../CustomRoadmap/CreateRoadmap/CreateRoadmapModal'; import { useToast } from '../../hooks/use-toast'; import { ContentConfirmationModal } from './ContentConfirmationModal'; export type TeamResourceConfig = { isCustomResource: boolean; roadmapSlug?: string; title: string; description?: string; visibility?: AllowedRoadmapVisibility; resourceId: string; resourceType: string; removed: string[]; topics?: number; sharedTeamMemberIds: string[]; sharedFriendIds: string[]; defaultRoadmapId?: string; }[]; type RoadmapSelectorProps = { teamId: string; teamResources: TeamResourceConfig; setTeamResources: (config: TeamResourceConfig) => void; }; export function RoadmapSelector(props: RoadmapSelectorProps) { const { teamId, teamResources = [], setTeamResources } = props; const toast = useToast(); const [removingRoadmapId, setRemovingRoadmapId] = useState(''); const [showSelectRoadmapModal, setShowSelectRoadmapModal] = useState(false); const [allRoadmaps, setAllRoadmaps] = useState([]); const [changingRoadmapId, setChangingRoadmapId] = useState(''); const [isCreatingRoadmap, setIsCreatingRoadmap] = useState(false); const [error, setError] = useState(''); const [confirmationContentId, setConfirmationContentId] = useState(); async function loadAllRoadmaps() { const { error, response } = await httpGet(`/pages.json`); if (error) { toast.error(error.message || 'Something went wrong. Please try again!'); setError(error.message || 'Something went wrong. Please try again!'); return; } if (!response) { return []; } const allRoadmaps = response .filter((page) => page.group === 'Roadmaps') .sort((a, b) => { if (a.title === 'Android') return 1; return a.title.localeCompare(b.title); }); setAllRoadmaps(allRoadmaps); return response; } async function deleteResource(roadmapId: string) { if (!teamId) { return; } pageProgressMessage.set(`Deleting resource`); const { error, response } = await httpPut( `${ import.meta.env.PUBLIC_API_URL }/v1-delete-team-resource-config/${teamId}`, { resourceId: roadmapId, resourceType: 'roadmap', }, ); if (error || !response) { setError(error?.message || 'Error deleting roadmap'); return; } setTeamResources(response); } async function onRemove(resourceId: string) { pageProgressMessage.set('Removing roadmap'); deleteResource(resourceId).finally(() => { pageProgressMessage.set(''); }); } async function addTeamResource(roadmapId: string, shouldCopyContent = false) { if (!teamId) { return; } pageProgressMessage.set(`Adding roadmap to team`); const renderer = allRoadmaps.find((r) => r.id === roadmapId)?.renderer; const { error, response } = await httpPut( `${ import.meta.env.PUBLIC_API_URL }/v1-update-team-resource-config/${teamId}`, { teamId: teamId, resourceId: roadmapId, resourceType: 'roadmap', removed: [], renderer: renderer || 'balsamiq', shouldCopyContent, }, ); if (error || !response) { setError(error?.message || 'Error adding roadmap'); return; } setTeamResources(response); if (renderer === 'editor') { setShowSelectRoadmapModal(false); } } useEffect(() => { loadAllRoadmaps().finally(() => {}); }, []); function handleCustomRoadmapCreated(roadmap: RoadmapDocument) { const { _id: roadmapId } = roadmap; if (!roadmapId) { return; } loadAllRoadmaps().finally(() => {}); addTeamResource(roadmapId).finally(() => { pageProgressMessage.set(''); }); } const confirmationContentIdModal = confirmationContentId && ( { setConfirmationContentId(''); }} onClick={(shouldCopy) => { addTeamResource(confirmationContentId, shouldCopy).finally(() => { pageProgressMessage.set(''); setConfirmationContentId(''); }); }} /> ); return (
{confirmationContentIdModal} {changingRoadmapId && ( setChangingRoadmapId('')} resourceId={changingRoadmapId} resourceType={'roadmap'} teamId={teamId} setTeamResourceConfig={setTeamResources} defaultRemovedItems={ teamResources.find((c) => c.resourceId === changingRoadmapId) ?.removed || [] } /> )} {showSelectRoadmapModal && ( setShowSelectRoadmapModal(false)} teamResourceConfig={teamResources.map((r) => r.resourceId)} allRoadmaps={allRoadmaps.filter((r) => r.renderer === 'editor')} teamId={teamId} onRoadmapAdd={(roadmapId) => { const isEditorRoadmap = allRoadmaps.find( (r) => r.id === roadmapId && r.renderer === 'editor', ); if (!isEditorRoadmap) { addTeamResource(roadmapId).finally(() => { pageProgressMessage.set(''); }); return; } setShowSelectRoadmapModal(false); setConfirmationContentId(roadmapId); }} onRoadmapRemove={(roadmapId) => { onRemove(roadmapId).finally(() => {}); }} /> )}
{isCreatingRoadmap && ( setIsCreatingRoadmap(false)} onCreated={(roadmap: RoadmapDocument) => { handleCustomRoadmapCreated(roadmap); setIsCreatingRoadmap(false); }} /> )} or
{!teamResources.length && (

No roadmaps selected.

Pick from{' '} setShowSelectRoadmapModal(true)} className="cursor-pointer underline" > our roadmaps {' '} or{' '} { setIsCreatingRoadmap(true); }} className="cursor-pointer underline" > create a new one .

)} {teamResources.length > 0 && (
{teamResources.map( ({ isCustomResource, title: roadmapTitle, resourceId, removed: removedTopics, topics, }) => { return (
{roadmapTitle} {removedTopics.length > 0 || (topics && topics > 0) ? ( {isCustomResource ? ( <> Custom · {topics} topic {topics && topics > 1 ? 's' : ''} ) : ( <> {removedTopics.length} topic {removedTopics.length > 1 ? 's' : ''} removed )} ) : ( {isCustomResource ? 'Placeholder roadmap.' : 'No changes made ..'} )}
{removingRoadmapId === resourceId && (
Are you sure?{' '} {' '}
)} {(!removingRoadmapId || removingRoadmapId !== resourceId) && (
)}
); }, )}
)}
); } ================================================ FILE: src/components/CreateTeam/RoleDropdown.tsx ================================================ import { ChevronDownIcon } from '../ReactIcons/ChevronDownIcon'; import { useRef, useState } from 'react'; import { useOutsideClick } from '../../hooks/use-outside-click'; const allowedRoles = [ { name: 'Admin', value: 'admin', description: 'Can do everything', }, { name: 'Manager', value: 'manager', description: 'Can manage team and skills', }, { name: 'Member', value: 'member', description: 'Can view team and skills', }, ] as const; export type AllowedRoles = (typeof allowedRoles)[number]['value']; type RoleDropdownProps = { className?: string; selectedRole: string; setSelectedRole: (role: AllowedRoles) => void; }; export function RoleDropdown(props: RoleDropdownProps) { const { selectedRole, setSelectedRole, className = 'w-[120px]' } = props; const dropdownRef = useRef(null); const [activeRoleIndex, setActiveRoleIndex] = useState(0); const [isMenuOpen, setIsMenuOpen] = useState(false); useOutsideClick(dropdownRef, () => { setIsMenuOpen(false); }); return (
{isMenuOpen && (
{allowedRoles.map((allowedRole, roleCounter) => ( ))}
)}
); } ================================================ FILE: src/components/CreateTeam/SelectRoadmapModal.tsx ================================================ import { useEffect, useRef, useState } from 'react'; import { useKeydown } from '../../hooks/use-keydown'; import { useOutsideClick } from '../../hooks/use-outside-click'; import type { PageType } from '../CommandMenu/CommandMenu'; import type { TeamResourceConfig } from './RoadmapSelector'; import { SelectRoadmapModalItem } from './SelectRoadmapModalItem'; import { XIcon } from 'lucide-react'; export type SelectRoadmapModalProps = { teamId: string; allRoadmaps: PageType[]; onClose: () => void; teamResourceConfig: string[]; onRoadmapAdd: (roadmapId: string) => void; onRoadmapRemove: (roadmapId: string) => void; }; export function SelectRoadmapModal(props: SelectRoadmapModalProps) { const { onClose, allRoadmaps, onRoadmapAdd, onRoadmapRemove, teamResourceConfig, } = props; const popupBodyEl = useRef(null); const searchInputEl = useRef(null); const [searchResults, setSearchResults] = useState(allRoadmaps); const [searchText, setSearchText] = useState(''); useKeydown('Escape', () => { onClose(); }); useOutsideClick(popupBodyEl, () => { onClose(); }); useEffect(() => { if (!searchInputEl.current) { return; } searchInputEl.current.focus(); }, [searchInputEl]); useEffect(() => { if (searchText.length === 0) { setSearchResults(allRoadmaps); return; } const searchResults = allRoadmaps.filter((roadmap) => { return ( roadmap.title.toLowerCase().includes(searchText.toLowerCase()) || roadmap.id.toLowerCase().includes(searchText.toLowerCase()) ); }); setSearchResults(searchResults); }, [searchText, allRoadmaps]); const roleBasedRoadmaps = searchResults.filter((roadmap) => roadmap?.metadata?.tags?.includes('role-roadmap'), ); const skillBasedRoadmaps = searchResults.filter((roadmap) => roadmap?.metadata?.tags?.includes('skill-roadmap'), ); return (
setSearchText((e.target as HTMLInputElement).value)} />
Role Based Roadmaps {roleBasedRoadmaps.length === 0 && (

)} {roleBasedRoadmaps.length > 0 && (
{roleBasedRoadmaps.map((roadmap) => { const isSelected = teamResourceConfig.includes(roadmap.id); return ( { if (isSelected) { onRoadmapRemove(roadmap.id); } else { onRoadmapAdd(roadmap.id); } }} /> ); })}
)} Skill Based Roadmaps
{skillBasedRoadmaps.map((roadmap) => { const isSelected = teamResourceConfig.includes(roadmap.id); return ( { if (isSelected) { onRoadmapRemove(roadmap.id); } else { onRoadmapAdd(roadmap.id); } }} /> ); })}

More Official Roadmaps Coming Soon

We are currently adding more of our official roadmaps to this list. If you don't see the roadmap you are looking for, please check back later.

); } ================================================ FILE: src/components/CreateTeam/SelectRoadmapModalItem.tsx ================================================ import type { SelectRoadmapModalProps } from './SelectRoadmapModal'; type SelectRoadmapModalItemProps = { title: string; isSelected: boolean; onClick: () => void; }; export function SelectRoadmapModalItem(props: SelectRoadmapModalItemProps) { const { isSelected, onClick, title } = props; return ( ); } ================================================ FILE: src/components/CreateTeam/Step0.tsx ================================================ import type { TeamDocument } from './CreateTeamForm'; import { httpPut } from '../../lib/http'; import { useState } from 'react'; import { NextButton } from './NextButton'; import { BuildingIcon } from '../ReactIcons/BuildingIcon.tsx'; import { UsersIcon } from '../ReactIcons/UsersIcon.tsx'; export const validTeamTypes = [ { value: 'company', label: 'Company', icon: BuildingIcon, description: 'Track the skills and learning progress of the tech team at your company', }, { value: 'study_group', label: 'Study Group', icon: UsersIcon, description: 'Invite your friends or course-mates and track your learning progress together', }, ] as const; export type ValidTeamType = (typeof validTeamTypes)[number]['value']; type Step0Props = { team?: TeamDocument; selectedTeamType: ValidTeamType; setSelectedTeamType: (teamType: ValidTeamType) => void; onStepComplete: () => void; }; export function Step0(props: Step0Props) { const { team, selectedTeamType, onStepComplete, setSelectedTeamType } = props; const [isLoading, setIsLoading] = useState(false); const [error, setError] = useState(); async function onNextClick() { if (!team) { onStepComplete(); return; } setIsLoading(true); setError(''); const { response, error } = await httpPut( `${import.meta.env.PUBLIC_API_URL}/v1-update-team/${team._id}`, { name: team.name, website: team?.links?.website || undefined, type: selectedTeamType, gitHubUrl: team?.links?.github || undefined, ...(selectedTeamType === 'company' && { teamSize: team.teamSize, linkedInUrl: team?.links?.linkedIn || undefined, }), }, ); if (error || !response) { setIsLoading(false); setError(error?.message || 'Something went wrong'); return; } setIsLoading(false); setError(''); onStepComplete(); } return ( <>
{validTeamTypes.map((validTeamType) => ( ))}
{/*Error message*/} {error &&
{error}
} ); } ================================================ FILE: src/components/CreateTeam/Step1.tsx ================================================ import { type FormEvent, useEffect, useRef, useState } from 'react'; import { type AppError, httpPost, httpPut } from '../../lib/http'; import type { ValidTeamType } from './Step0'; import type { TeamDocument } from './CreateTeamForm'; import { NextButton } from './NextButton'; export const validTeamSizes = [ '1-5', '6-10', '11-25', '26-50', '51-100', '101-200', '201-500', '501-1000', '1000+', ] as const; export type ValidTeamSize = (typeof validTeamSizes)[number]; type Step1Props = { team?: TeamDocument; selectedTeamType: ValidTeamType; onStepComplete: (team: TeamDocument) => void; onBack: () => void; }; export function Step1(props: Step1Props) { const { team, selectedTeamType, onBack, onStepComplete } = props; const [error, setError] = useState(''); const nameRef = useRef(null); useEffect(() => { if (!nameRef.current) { return; } nameRef.current.focus(); }, [nameRef]); const [isLoading, setIsLoading] = useState(false); const [name, setName] = useState(team?.name || ''); const [website, setWebsite] = useState(team?.links?.website || ''); const [linkedInUrl, setLinkedInUrl] = useState(team?.links?.linkedIn || ''); const [gitHubUrl, setGitHubUrl] = useState(team?.links?.github || ''); const [teamSize, setTeamSize] = useState( team?.teamSize || ('' as any), ); const handleSubmit = async (e: FormEvent) => { e.preventDefault(); setIsLoading(true); if (!name || !selectedTeamType) { setIsLoading(false); return; } let response: TeamDocument | undefined; let error: AppError | undefined; if (!team?._id) { ({ response, error } = await httpPost( `${import.meta.env.PUBLIC_API_URL}/v1-create-team`, { name, website: website || undefined, type: selectedTeamType, gitHubUrl: gitHubUrl || undefined, ...(selectedTeamType === 'company' && { teamSize, linkedInUrl: linkedInUrl || undefined, }), roadmapIds: [], bestPracticeIds: [], }, )); if (error || !response?._id) { setError(error?.message || 'Something went wrong. Please try again.'); setIsLoading(false); return; } onStepComplete(response as TeamDocument); } else { ({ response, error } = await httpPut( `${import.meta.env.PUBLIC_API_URL}/v1-update-team/${team._id}`, { name, website: website || undefined, type: selectedTeamType, gitHubUrl: gitHubUrl || undefined, ...(selectedTeamType === 'company' && { teamSize, linkedInUrl: linkedInUrl || undefined, }), }, )); if (error || (response as any)?.status !== 'ok') { setError(error?.message || 'Something went wrong. Please try again.'); setIsLoading(false); return; } onStepComplete({ ...team, name, _id: team._id, links: { website: website || team?.links?.website, linkedIn: linkedInUrl || team?.links?.linkedIn, github: gitHubUrl || team?.links?.github, }, type: selectedTeamType, teamSize: teamSize!, }); } }; return (
setName((e.target as HTMLInputElement).value)} />
{selectedTeamType === 'company' && (
setWebsite((e.target as HTMLInputElement).value)} />
)} {selectedTeamType === 'company' && (
setLinkedInUrl((e.target as HTMLInputElement).value) } />
)}
setGitHubUrl((e.target as HTMLInputElement).value)} />
{selectedTeamType === 'company' && (
)} {error && (
{error}
)}
); } ================================================ FILE: src/components/CreateTeam/Step2.tsx ================================================ import { RoadmapSelector, type TeamResourceConfig } from './RoadmapSelector'; import type { TeamDocument } from './CreateTeamForm'; type Step2Props = { team: TeamDocument; teamResourceConfig: TeamResourceConfig; setTeamResourceConfig: (config: TeamResourceConfig) => void; onBack: () => void; onNext: () => void; }; export function Step2(props: Step2Props) { const { team, onBack, onNext, teamResourceConfig, setTeamResourceConfig } = props; return ( <>

Select Roadmaps

You can always add and customize your roadmaps later.

); } ================================================ FILE: src/components/CreateTeam/Step3.tsx ================================================ import type { TeamDocument } from './CreateTeamForm'; import { NextButton } from './NextButton'; import { TrashIcon } from '../ReactIcons/TrashIcon'; import { type AllowedRoles, RoleDropdown } from './RoleDropdown'; import { useEffect, useRef, useState } from 'react'; import { httpPost } from '../../lib/http'; type Step3Props = { team?: TeamDocument; onNext: () => void; onBack: () => void; }; type InviteType = { id: string; email: string; role: AllowedRoles; }; function generateId() { return `${new Date().getTime()}`; } export function Step3(props: Step3Props) { const { onNext, onBack, team } = props; const [error, setError] = useState(''); const [invitingTeam, setInvitingTeam] = useState(false); const emailInputRef = useRef(null); const [users, setUsers] = useState([ { id: generateId(), email: '', role: 'member', }, ]); async function inviteTeam() { setInvitingTeam(true); const { error, response } = await httpPost( `${import.meta.env.PUBLIC_API_URL}/v1-invite-team/${team?._id}`, { members: users, } ); if (error || !response) { setError(error?.message || 'Something went wrong'); setInvitingTeam(false); return; } onNext(); } function focusLastEmailInput() { if (!emailInputRef.current) { return; } (emailInputRef.current as HTMLInputElement).focus(); } function onSubmit(e: any) { e.preventDefault(); inviteTeam().finally(() => null); } useEffect(() => { focusLastEmailInput(); }, [users.length]); return (

Invite your Team

Use the form below to invite your team members to your team. You can also invite them later.

{users.map((user, userCounter) => { return (
{ const newUsers = users.map((u) => { if (u.id === user.id) { return { ...u, email: (e.target as HTMLInputElement)?.value, }; } return u; }); setUsers(newUsers); }} className="grow rounded-md border border-gray-200 bg-white px-4 py-2 text-gray-900" /> { const newUsers = users.map((u) => { if (u.id === user.id) { return { ...u, role, }; } return u; }); setUsers(newUsers); }} />
); })}
{users.length <= 30 && ( )} {error && (
{error}
)}
); } ================================================ FILE: src/components/CreateTeam/Step4.tsx ================================================ import { CheckIcon } from '../ReactIcons/CheckIcon'; import type { TeamDocument } from './CreateTeamForm'; type Step4Props = { team: TeamDocument; }; export function Step4({ team }: Step4Props) { return (

Team Created

Your team has been created. Happy learning!

View Team
); } ================================================ FILE: src/components/CreateTeam/UpdateTeamResourceModal.tsx ================================================ import { useEffect, useRef, useState } from 'react'; import { wireframeJSONToSVG } from 'roadmap-renderer'; import { Spinner } from '../ReactIcons/Spinner'; import { httpPut } from '../../lib/http'; import { renderTopicProgress } from '../../lib/resource-progress'; import '../FrameRenderer/FrameRenderer.css'; import { useOutsideClick } from '../../hooks/use-outside-click'; import { useKeydown } from '../../hooks/use-keydown'; import type { TeamResourceConfig } from './RoadmapSelector'; import { useToast } from '../../hooks/use-toast'; import {replaceChildren} from "../../lib/dom.ts"; export type ProgressMapProps = { teamId: string; resourceId: string; resourceType: 'roadmap' | 'best-practice'; defaultRemovedItems?: string[]; setTeamResourceConfig: (config: TeamResourceConfig) => void; onClose: () => void; }; export function UpdateTeamResourceModal(props: ProgressMapProps) { const { defaultRemovedItems = [], resourceId, resourceType, teamId, setTeamResourceConfig, onClose, } = props; const containerEl = useRef(null); const popupBodyEl = useRef(null); const toast = useToast(); const [isLoading, setIsLoading] = useState(true); const [isUpdating, setIsUpdating] = useState(false); const [removedItems, setRemovedItems] = useState(defaultRemovedItems); useEffect(() => { function onTopicClick(e: any) { const groupEl = e.target.closest('.clickable-group'); const groupId = groupEl?.dataset?.groupId; if (!groupId) { return; } const normalizedGroupId = groupId.replace(/^\d+-/, ''); if (removedItems.includes(normalizedGroupId)) { setRemovedItems((prev) => prev.filter((id) => id !== normalizedGroupId) ); renderTopicProgress(normalizedGroupId, 'reset' as any); } else { setRemovedItems((prev) => [...prev, normalizedGroupId]); renderTopicProgress(normalizedGroupId, 'removed'); } } document.addEventListener('click', onTopicClick); return () => { document.removeEventListener('click', onTopicClick); }; }, [removedItems]); let resourceJsonUrl = import.meta.env.DEV ? 'http://localhost:3000' : 'https://roadmap.sh'; if (resourceType === 'roadmap') { resourceJsonUrl += `/${resourceId}.json`; } else { resourceJsonUrl += `/best-practices/${resourceId}.json`; } async function renderResource(jsonUrl: string) { const res = await fetch(jsonUrl); const json = await res.json(); const svg = await wireframeJSONToSVG(json, { fontURL: '/fonts/balsamiq.woff2', }); replaceChildren(containerEl.current!, svg); // containerEl.current?.replaceChildren(svg); // Render team configuration removedItems.forEach((topicId: string) => { renderTopicProgress(topicId, 'removed'); }); } useKeydown('Escape', () => { onClose(); }); useOutsideClick(popupBodyEl, () => { onClose(); }); async function onSaveChanges() { if (removedItems.length === 0) { return; } setIsUpdating(true); const { error, response } = await httpPut( `${ import.meta.env.PUBLIC_API_URL }/v1-update-team-resource-config/${teamId}`, { teamId: teamId, resourceId: resourceId, resourceType: resourceType, removed: removedItems, } ); if (error || !response) { toast.error(error?.message || 'Error adding roadmap'); return; } setTeamResourceConfig(response); onClose(); } useEffect(() => { if ( !containerEl.current || !resourceJsonUrl || !resourceId || !resourceType || !teamId ) { return; } renderResource(resourceJsonUrl) .catch((err) => { console.error(err); toast.error('Something went wrong. Please try again!'); }) .finally(() => { setIsLoading(false); }); }, []); return (

Click and select the items to remove from the roadmap.

{isLoading && (
)}
); } ================================================ FILE: src/components/CustomRoadmap/CreateRoadmap/CreateRoadmapButton.tsx ================================================ import { Plus } from 'lucide-react'; import { isLoggedIn } from '../../../lib/jwt'; import { showLoginPopup } from '../../../lib/popup'; import { cn } from '../../../lib/classname'; import { CreateRoadmapModal } from './CreateRoadmapModal'; import { useState } from 'react'; import { useIsPaidUser } from '../../../queries/billing'; import { UpgradeAccountModal } from '../../Billing/UpgradeAccountModal'; import { MAX_ROADMAP_LIMIT } from '../RoadmapListPage'; type CreateRoadmapButtonProps = { className?: string; existingRoadmapCount?: number; text?: string; teamId?: string; }; export function CreateRoadmapButton(props: CreateRoadmapButtonProps) { const { teamId, className, text = 'Create your own Roadmap', existingRoadmapCount = 0, } = props; const [isCreatingRoadmap, setIsCreatingRoadmap] = useState(false); const [showUpgradeModal, setShowUpgradeModal] = useState(false); const { isPaidUser, isLoading: isPaidUserLoading } = useIsPaidUser(); function toggleCreateRoadmapHandler() { if (!isLoggedIn()) { return showLoginPopup(); } const hasExceededLimit = !isPaidUser && existingRoadmapCount > 0 && existingRoadmapCount >= MAX_ROADMAP_LIMIT; if (hasExceededLimit) { setShowUpgradeModal(true); return; } setIsCreatingRoadmap(true); } return ( <> {showUpgradeModal && ( setShowUpgradeModal(false)} /> )} {isCreatingRoadmap && ( { setIsCreatingRoadmap(false); }} /> )} ); } ================================================ FILE: src/components/CustomRoadmap/CreateRoadmap/CreateRoadmapModal.tsx ================================================ import { type FormEvent, type MouseEvent, useEffect, useRef, useState, } from 'react'; import { Loader2 } from 'lucide-react'; import { Modal } from '../../Modal'; import { useToast } from '../../../hooks/use-toast'; import { httpPost } from '../../../lib/http'; import { cn } from '../../../lib/classname'; export const allowedRoadmapVisibility = [ 'me', 'friends', 'team', 'public', ] as const; export type AllowedRoadmapVisibility = (typeof allowedRoadmapVisibility)[number]; export const allowedCustomRoadmapType = ['role', 'skill'] as const; export type AllowedCustomRoadmapType = (typeof allowedCustomRoadmapType)[number]; export const allowedShowcaseStatus = [ 'submitted', 'approved', 'rejected', 'rejected_with_reason', ] as const; export type AllowedShowcaseStatus = (typeof allowedShowcaseStatus)[number]; export interface RoadmapDocument { _id: string; title: string; description?: string; slug?: string; creatorId: string; aiRoadmapId?: string; teamId?: string; topicCount: number; visibility: AllowedRoadmapVisibility; sharedFriendIds?: string[]; sharedTeamMemberIds?: string[]; feedbacks?: { userId: string; email: string; feedback: string; }[]; metadata?: { originalRoadmapId?: string; defaultRoadmapId?: string; }; nodes: any[]; edges: any[]; isDiscoverable?: boolean; ratings: { average: number; totalCount: number; breakdown: { [key: number]: number; }; }; showcaseStatus?: AllowedShowcaseStatus; showcaseRejectedReason?: string; showcaseRejectedAt?: Date; showcaseSubmittedAt?: Date; showcaseApprovedAt?: Date; hasMigratedContent?: boolean; createdAt: Date; updatedAt: Date; } interface CreateRoadmapModalProps { onClose: () => void; onCreated?: (roadmap: RoadmapDocument) => void; teamId?: string; visibility?: AllowedRoadmapVisibility; } export function CreateRoadmapModal(props: CreateRoadmapModalProps) { const { onClose, onCreated, teamId } = props; const titleRef = useRef(null); const toast = useToast(); const [isLoading, setIsLoading] = useState(false); const [title, setTitle] = useState(''); const [description, setDescription] = useState(''); const isInvalidDescription = description?.trim().length > 80; async function handleSubmit( e: FormEvent | MouseEvent, redirect: boolean = true, ) { e.preventDefault(); if (isLoading) { return; } if (title.trim() === '' || isInvalidDescription) { toast.error('Please fill all the fields'); return; } setIsLoading(true); const { response, error } = await httpPost( `${import.meta.env.PUBLIC_API_URL}/v1-create-roadmap`, { title, description, ...(teamId && { teamId, }), nodes: [], edges: [], }, ); if (error) { setIsLoading(false); toast.error(error?.message || 'Something went wrong, please try again'); return; } toast.success('Roadmap created successfully'); if (redirect) { window.location.href = `${ import.meta.env.PUBLIC_EDITOR_APP_URL }/${response?._id}`; return; } if (onCreated) { onCreated(response as RoadmapDocument); return; } onClose(); setTitle(''); setDescription(''); setIsLoading(false); } useEffect(() => { titleRef.current?.focus(); }, []); return (

Create Roadmap

Add a title and description to your roadmap.

setTitle(e.target.value)} />